Software / code / verse
Comparison
component.lua @ 485:c9a144591649
component: Avoid adding to the global stream metatable
This allows component and client connections to be made side-by-side.
Previous to this change, loading this connection module would break the
ability to make client connections, due to overriding stream methods such as
:reopen() and :reset().
A next step would be to share the methods that the two connection modules have
in common.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Thu, 23 Mar 2023 18:56:32 +0000 |
| parent | 411:db462d4feb44 |
| child | 490:6b2f31da9610 |
comparison
equal
deleted
inserted
replaced
| 484:5e2978489c95 | 485:c9a144591649 |
|---|---|
| 1 local verse = require "verse"; | 1 local verse = require "verse"; |
| 2 local stream = verse.stream_mt; | 2 local stream_mt = verse.stream_mt; |
| 3 | 3 |
| 4 local jid_split = require "util.jid".split; | 4 local jid_split = require "util.jid".split; |
| 5 local lxp = require "lxp"; | |
| 6 local st = require "util.stanza"; | 5 local st = require "util.stanza"; |
| 7 local sha1 = require "util.hashes".sha1; | 6 local sha1 = require "util.hashes".sha1; |
| 8 | 7 |
| 9 -- Shortcuts to save having to load util.stanza | 8 -- Shortcuts to save having to load util.stanza |
| 10 verse.message, verse.presence, verse.iq, verse.stanza, verse.reply, verse.error_reply = | 9 verse.message, verse.presence, verse.iq, verse.stanza, verse.reply, verse.error_reply = |
| 40 end | 39 end |
| 41 | 40 |
| 42 return stream:event("stanza", stanza); | 41 return stream:event("stanza", stanza); |
| 43 end | 42 end |
| 44 | 43 |
| 45 function stream:reset() | 44 function stream_mt:connect_component(jid, pass) |
| 46 if self.stream then | |
| 47 self.stream:reset(); | |
| 48 else | |
| 49 self.stream = new_xmpp_stream(self, stream_callbacks); | |
| 50 end | |
| 51 self.notopen = true; | |
| 52 return true; | |
| 53 end | |
| 54 | |
| 55 function stream:connect_component(jid, pass) | |
| 56 self.jid, self.password = jid, pass; | 45 self.jid, self.password = jid, pass; |
| 57 self.username, self.host, self.resource = jid_split(jid); | 46 self.username, self.host, self.resource = jid_split(jid); |
| 47 | |
| 48 -- Component stream methods | |
| 49 function self:reset() | |
| 50 if self.stream then | |
| 51 self.stream:reset(); | |
| 52 else | |
| 53 self.stream = new_xmpp_stream(self, stream_callbacks); | |
| 54 end | |
| 55 self.notopen = true; | |
| 56 return true; | |
| 57 end | |
| 58 | |
| 59 function self:reopen() | |
| 60 self:reset(); | |
| 61 self:send(st.stanza("stream:stream", { to = self.jid, ["xmlns:stream"]='http://etherx.jabber.org/streams', | |
| 62 xmlns = xmlns_component, version = "1.0" }):top_tag()); | |
| 63 end | |
| 64 | |
| 65 function self:close(reason) | |
| 66 if not self.notopen then | |
| 67 self:send("</stream:stream>"); | |
| 68 end | |
| 69 local on_disconnect = self.conn.disconnect(); | |
| 70 self.conn:close(); | |
| 71 on_disconnect(conn, reason); | |
| 72 end | |
| 73 | |
| 74 function self:send_iq(iq, callback) | |
| 75 local id = self:new_id(); | |
| 76 self.tracked_iqs[id] = callback; | |
| 77 iq.attr.id = id; | |
| 78 self:send(iq); | |
| 79 end | |
| 80 | |
| 81 function self:new_id() | |
| 82 self.curr_id = self.curr_id + 1; | |
| 83 return tostring(self.curr_id); | |
| 84 end | |
| 58 | 85 |
| 59 function self.data(conn, data) | 86 function self.data(conn, data) |
| 60 local ok, err = self.stream:feed(data); | 87 local ok, err = self.stream:feed(data); |
| 61 if ok then return; end | 88 if ok then return; end |
| 62 stream:debug("Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " ")); | 89 stream:debug("Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " ")); |
| 119 -- Initialise connection | 146 -- Initialise connection |
| 120 self:connect(self.connect_host or self.host, self.connect_port or 5347); | 147 self:connect(self.connect_host or self.host, self.connect_port or 5347); |
| 121 self:reopen(); | 148 self:reopen(); |
| 122 end | 149 end |
| 123 | 150 |
| 124 function stream:reopen() | |
| 125 self:reset(); | |
| 126 self:send(st.stanza("stream:stream", { to = self.jid, ["xmlns:stream"]='http://etherx.jabber.org/streams', | |
| 127 xmlns = xmlns_component, version = "1.0" }):top_tag()); | |
| 128 end | |
| 129 | |
| 130 function stream:close(reason) | |
| 131 if not self.notopen then | |
| 132 self:send("</stream:stream>"); | |
| 133 end | |
| 134 local on_disconnect = self.conn.disconnect(); | |
| 135 self.conn:close(); | |
| 136 on_disconnect(conn, reason); | |
| 137 end | |
| 138 | |
| 139 function stream:send_iq(iq, callback) | |
| 140 local id = self:new_id(); | |
| 141 self.tracked_iqs[id] = callback; | |
| 142 iq.attr.id = id; | |
| 143 self:send(iq); | |
| 144 end | |
| 145 | |
| 146 function stream:new_id() | |
| 147 self.curr_id = self.curr_id + 1; | |
| 148 return tostring(self.curr_id); | |
| 149 end |