# HG changeset patch # User Matthew Wild # Date 1679597792 0 # Node ID c9a144591649b404ab9e5f2b1fa8c55b716288a7 # Parent 5e2978489c95b039fa89747c6daa48a33507e179 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. diff -r 5e2978489c95 -r c9a144591649 component.lua --- a/component.lua Thu Mar 23 18:54:13 2023 +0000 +++ b/component.lua Thu Mar 23 18:56:32 2023 +0000 @@ -1,8 +1,7 @@ local verse = require "verse"; -local stream = verse.stream_mt; +local stream_mt = verse.stream_mt; local jid_split = require "util.jid".split; -local lxp = require "lxp"; local st = require "util.stanza"; local sha1 = require "util.hashes".sha1; @@ -42,20 +41,48 @@ return stream:event("stanza", stanza); end -function stream:reset() - if self.stream then - self.stream:reset(); - else - self.stream = new_xmpp_stream(self, stream_callbacks); - end - self.notopen = true; - return true; -end - -function stream:connect_component(jid, pass) +function stream_mt:connect_component(jid, pass) self.jid, self.password = jid, pass; self.username, self.host, self.resource = jid_split(jid); + -- Component stream methods + function self:reset() + if self.stream then + self.stream:reset(); + else + self.stream = new_xmpp_stream(self, stream_callbacks); + end + self.notopen = true; + return true; + end + + function self:reopen() + self:reset(); + self:send(st.stanza("stream:stream", { to = self.jid, ["xmlns:stream"]='http://etherx.jabber.org/streams', + xmlns = xmlns_component, version = "1.0" }):top_tag()); + end + + function self:close(reason) + if not self.notopen then + self:send(""); + end + local on_disconnect = self.conn.disconnect(); + self.conn:close(); + on_disconnect(conn, reason); + end + + function self:send_iq(iq, callback) + local id = self:new_id(); + self.tracked_iqs[id] = callback; + iq.attr.id = id; + self:send(iq); + end + + function self:new_id() + self.curr_id = self.curr_id + 1; + return tostring(self.curr_id); + end + function self.data(conn, data) local ok, err = self.stream:feed(data); if ok then return; end @@ -121,29 +148,3 @@ self:reopen(); end -function stream:reopen() - self:reset(); - self:send(st.stanza("stream:stream", { to = self.jid, ["xmlns:stream"]='http://etherx.jabber.org/streams', - xmlns = xmlns_component, version = "1.0" }):top_tag()); -end - -function stream:close(reason) - if not self.notopen then - self:send(""); - end - local on_disconnect = self.conn.disconnect(); - self.conn:close(); - on_disconnect(conn, reason); -end - -function stream:send_iq(iq, callback) - local id = self:new_id(); - self.tracked_iqs[id] = callback; - iq.attr.id = id; - self:send(iq); -end - -function stream:new_id() - self.curr_id = self.curr_id + 1; - return tostring(self.curr_id); -end