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 |