Thu, 10 Jun 2021 11:58:23 +0200
plugins.smacks: Don't warn about zero stanzas acked
It's only if the count somehow goes backwards that something is really
wrong. An ack for zero stanzas is fine and we don't need to do anything.
0 | 1 | |
17
ec6b0b94826c
verse: Include LuaRocks packages if we can
Matthew Wild <mwild1@gmail.com>
parents:
16
diff
changeset
|
2 | -- Use LuaRocks if available |
ec6b0b94826c
verse: Include LuaRocks packages if we can
Matthew Wild <mwild1@gmail.com>
parents:
16
diff
changeset
|
3 | pcall(require, "luarocks.require"); |
0 | 4 | |
368
154c2f04d73b
init: Restore loading of LuaSec (must be loaded before net.server) (thanks ?)
Kim Alvefur <zash@zash.se>
parents:
361
diff
changeset
|
5 | local socket = require"socket"; |
154c2f04d73b
init: Restore loading of LuaSec (must be loaded before net.server) (thanks ?)
Kim Alvefur <zash@zash.se>
parents:
361
diff
changeset
|
6 | |
64
a28540d4117a
verse: Load LuaSec if possible
Matthew Wild <mwild1@gmail.com>
parents:
60
diff
changeset
|
7 | -- Load LuaSec if available |
368
154c2f04d73b
init: Restore loading of LuaSec (must be loaded before net.server) (thanks ?)
Kim Alvefur <zash@zash.se>
parents:
361
diff
changeset
|
8 | pcall(require, "ssl"); |
64
a28540d4117a
verse: Load LuaSec if possible
Matthew Wild <mwild1@gmail.com>
parents:
60
diff
changeset
|
9 | |
30
9c96318913f7
Revert module names throughout to their Prosody equivalents
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
10 | local server = require "net.server"; |
9c96318913f7
Revert module names throughout to their Prosody equivalents
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
11 | local events = require "util.events"; |
237
d158c97556b4
verse: require('util.logger') (besides being correct, also fixes a silly bug when loading verse twice)
Matthew Wild <mwild1@gmail.com>
parents:
236
diff
changeset
|
12 | local logger = require "util.logger"; |
0 | 13 | |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
14 | local verse = {}; |
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
15 | verse.server = server; |
0 | 16 | |
17 | local stream = {}; | |
18 | stream.__index = stream; | |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
19 | verse.stream_mt = stream; |
0 | 20 | |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
21 | verse.plugins = {}; |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
22 | |
257
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
23 | function verse.init(...) |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
24 | for i=1,select("#", ...) do |
385
e6bf19ad5c19
verse: Pass on error from trying to require verse connection module
Kim Alvefur <zash@zash.se>
parents:
382
diff
changeset
|
25 | local ok, err = pcall(require, "verse."..select(i,...)); |
257
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
26 | if not ok then |
385
e6bf19ad5c19
verse: Pass on error from trying to require verse connection module
Kim Alvefur <zash@zash.se>
parents:
382
diff
changeset
|
27 | error("Verse connection module not found: verse."..select(i,...)..err); |
257
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
28 | end |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
29 | end |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
30 | return verse; |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
31 | end |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
32 | |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
33 | |
239
65a0d3fcbbad
verse: Switch connection ids to be a simple incrementing integer
Matthew Wild <mwild1@gmail.com>
parents:
238
diff
changeset
|
34 | local max_id = 0; |
65a0d3fcbbad
verse: Switch connection ids to be a simple incrementing integer
Matthew Wild <mwild1@gmail.com>
parents:
238
diff
changeset
|
35 | |
44
37396504de5f
verse: Multiple changes to allow controlling logging for both verse and streams
Matthew Wild <mwild1@gmail.com>
parents:
42
diff
changeset
|
36 | function verse.new(logger, base) |
37396504de5f
verse: Multiple changes to allow controlling logging for both verse and streams
Matthew Wild <mwild1@gmail.com>
parents:
42
diff
changeset
|
37 | local t = setmetatable(base or {}, stream); |
239
65a0d3fcbbad
verse: Switch connection ids to be a simple incrementing integer
Matthew Wild <mwild1@gmail.com>
parents:
238
diff
changeset
|
38 | max_id = max_id + 1; |
65a0d3fcbbad
verse: Switch connection ids to be a simple incrementing integer
Matthew Wild <mwild1@gmail.com>
parents:
238
diff
changeset
|
39 | t.id = tostring(max_id); |
238
9b6fca5d9a02
verse, squishy: Port to Prosody's util.logger. Adds new function, verse.set_log_handler(handler, levels).
Matthew Wild <mwild1@gmail.com>
parents:
237
diff
changeset
|
40 | t.logger = logger or verse.new_logger("stream"..t.id); |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
41 | t.events = events.new(); |
173
3112a9e450ac
verse: Make add_plugin only load a plugin once per stream
Matthew Wild <mwild1@gmail.com>
parents:
163
diff
changeset
|
42 | t.plugins = {}; |
247
7c58c16efa3e
verse: Remove silly logger line I just noticed at the end of the file
Matthew Wild <mwild1@gmail.com>
parents:
242
diff
changeset
|
43 | t.verse = verse; |
44
37396504de5f
verse: Multiple changes to allow controlling logging for both verse and streams
Matthew Wild <mwild1@gmail.com>
parents:
42
diff
changeset
|
44 | return t; |
0 | 45 | end |
46 | ||
42
6006e6bb1c28
verse: Add verse.add_task(delay, callback) to add timer functions using util.timer
Matthew Wild <mwild1@gmail.com>
parents:
30
diff
changeset
|
47 | verse.add_task = require "util.timer".add_task; |
6006e6bb1c28
verse: Add verse.add_task(delay, callback) to add timer functions using util.timer
Matthew Wild <mwild1@gmail.com>
parents:
30
diff
changeset
|
48 | |
238
9b6fca5d9a02
verse, squishy: Port to Prosody's util.logger. Adds new function, verse.set_log_handler(handler, levels).
Matthew Wild <mwild1@gmail.com>
parents:
237
diff
changeset
|
49 | verse.logger = logger.init; -- COMPAT: Deprecated |
236
d75a209e57fc
verse: verse.logger() -> verse.new_logger()
Matthew Wild <mwild1@gmail.com>
parents:
234
diff
changeset
|
50 | verse.new_logger = logger.init; |
125
b46921de1e03
verse: Add verse.log() to log a message using the default logger. Also add verse.set_error_handler() to, er, set an error handler.
Matthew Wild <mwild1@gmail.com>
parents:
124
diff
changeset
|
51 | verse.log = verse.logger("verse"); |
b46921de1e03
verse: Add verse.log() to log a message using the default logger. Also add verse.set_error_handler() to, er, set an error handler.
Matthew Wild <mwild1@gmail.com>
parents:
124
diff
changeset
|
52 | |
241
931bf313c691
verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents:
240
diff
changeset
|
53 | local function format(format, ...) |
931bf313c691
verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents:
240
diff
changeset
|
54 | local n, arg, maxn = 0, { ... }, select('#', ...); |
931bf313c691
verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents:
240
diff
changeset
|
55 | return (format:gsub("%%(.)", function (c) if n <= maxn then n = n + 1; return tostring(arg[n]); end end)); |
931bf313c691
verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents:
240
diff
changeset
|
56 | end |
931bf313c691
verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents:
240
diff
changeset
|
57 | |
238
9b6fca5d9a02
verse, squishy: Port to Prosody's util.logger. Adds new function, verse.set_log_handler(handler, levels).
Matthew Wild <mwild1@gmail.com>
parents:
237
diff
changeset
|
58 | function verse.set_log_handler(log_handler, levels) |
9b6fca5d9a02
verse, squishy: Port to Prosody's util.logger. Adds new function, verse.set_log_handler(handler, levels).
Matthew Wild <mwild1@gmail.com>
parents:
237
diff
changeset
|
59 | levels = levels or { "debug", "info", "warn", "error" }; |
9b6fca5d9a02
verse, squishy: Port to Prosody's util.logger. Adds new function, verse.set_log_handler(handler, levels).
Matthew Wild <mwild1@gmail.com>
parents:
237
diff
changeset
|
60 | logger.reset(); |
279
7a0aa3d055f4
verse: Accept a file object as a log handler, and automatically call :write() on it with a formatted message
Matthew Wild <mwild1@gmail.com>
parents:
259
diff
changeset
|
61 | if io.type(log_handler) == "file" then |
7a0aa3d055f4
verse: Accept a file object as a log handler, and automatically call :write() on it with a formatted message
Matthew Wild <mwild1@gmail.com>
parents:
259
diff
changeset
|
62 | local f = log_handler; |
7a0aa3d055f4
verse: Accept a file object as a log handler, and automatically call :write() on it with a formatted message
Matthew Wild <mwild1@gmail.com>
parents:
259
diff
changeset
|
63 | function log_handler(name, level, message) |
7a0aa3d055f4
verse: Accept a file object as a log handler, and automatically call :write() on it with a formatted message
Matthew Wild <mwild1@gmail.com>
parents:
259
diff
changeset
|
64 | f:write(name, "\t", level, "\t", message, "\n"); |
7a0aa3d055f4
verse: Accept a file object as a log handler, and automatically call :write() on it with a formatted message
Matthew Wild <mwild1@gmail.com>
parents:
259
diff
changeset
|
65 | end |
241
931bf313c691
verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents:
240
diff
changeset
|
66 | end |
240
e27bf761bea6
verse: set_log_handler(): Allow nil to be passed for log_handler to disable logging (the default).
Matthew Wild <mwild1@gmail.com>
parents:
239
diff
changeset
|
67 | if log_handler then |
279
7a0aa3d055f4
verse: Accept a file object as a log handler, and automatically call :write() on it with a formatted message
Matthew Wild <mwild1@gmail.com>
parents:
259
diff
changeset
|
68 | local function _log_handler(name, level, message, ...) |
7a0aa3d055f4
verse: Accept a file object as a log handler, and automatically call :write() on it with a formatted message
Matthew Wild <mwild1@gmail.com>
parents:
259
diff
changeset
|
69 | return log_handler(name, level, format(message, ...)); |
7a0aa3d055f4
verse: Accept a file object as a log handler, and automatically call :write() on it with a formatted message
Matthew Wild <mwild1@gmail.com>
parents:
259
diff
changeset
|
70 | end |
240
e27bf761bea6
verse: set_log_handler(): Allow nil to be passed for log_handler to disable logging (the default).
Matthew Wild <mwild1@gmail.com>
parents:
239
diff
changeset
|
71 | for i, level in ipairs(levels) do |
241
931bf313c691
verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents:
240
diff
changeset
|
72 | logger.add_level_sink(level, _log_handler); |
240
e27bf761bea6
verse: set_log_handler(): Allow nil to be passed for log_handler to disable logging (the default).
Matthew Wild <mwild1@gmail.com>
parents:
239
diff
changeset
|
73 | end |
142
ea753bc81a33
verse: Add verse.filter_log(levels, logger) to filter a logger for certain levels
Matthew Wild <mwild1@gmail.com>
parents:
141
diff
changeset
|
74 | end |
ea753bc81a33
verse: Add verse.filter_log(levels, logger) to filter a logger for certain levels
Matthew Wild <mwild1@gmail.com>
parents:
141
diff
changeset
|
75 | end |
ea753bc81a33
verse: Add verse.filter_log(levels, logger) to filter a logger for certain levels
Matthew Wild <mwild1@gmail.com>
parents:
141
diff
changeset
|
76 | |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
77 | function verse._default_log_handler(name, level, message) |
242
ab4773b0ef5e
verse: Add default log handler for errors
Matthew Wild <mwild1@gmail.com>
parents:
241
diff
changeset
|
78 | return io.stderr:write(name, "\t", level, "\t", message, "\n"); |
ab4773b0ef5e
verse: Add default log handler for errors
Matthew Wild <mwild1@gmail.com>
parents:
241
diff
changeset
|
79 | end |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
80 | verse.set_log_handler(verse._default_log_handler, { "error" }); |
242
ab4773b0ef5e
verse: Add default log handler for errors
Matthew Wild <mwild1@gmail.com>
parents:
241
diff
changeset
|
81 | |
125
b46921de1e03
verse: Add verse.log() to log a message using the default logger. Also add verse.set_error_handler() to, er, set an error handler.
Matthew Wild <mwild1@gmail.com>
parents:
124
diff
changeset
|
82 | local function error_handler(err) |
b46921de1e03
verse: Add verse.log() to log a message using the default logger. Also add verse.set_error_handler() to, er, set an error handler.
Matthew Wild <mwild1@gmail.com>
parents:
124
diff
changeset
|
83 | verse.log("error", "Error: %s", err); |
b46921de1e03
verse: Add verse.log() to log a message using the default logger. Also add verse.set_error_handler() to, er, set an error handler.
Matthew Wild <mwild1@gmail.com>
parents:
124
diff
changeset
|
84 | verse.log("error", "Traceback: %s", debug.traceback()); |
b46921de1e03
verse: Add verse.log() to log a message using the default logger. Also add verse.set_error_handler() to, er, set an error handler.
Matthew Wild <mwild1@gmail.com>
parents:
124
diff
changeset
|
85 | end |
b46921de1e03
verse: Add verse.log() to log a message using the default logger. Also add verse.set_error_handler() to, er, set an error handler.
Matthew Wild <mwild1@gmail.com>
parents:
124
diff
changeset
|
86 | |
b46921de1e03
verse: Add verse.log() to log a message using the default logger. Also add verse.set_error_handler() to, er, set an error handler.
Matthew Wild <mwild1@gmail.com>
parents:
124
diff
changeset
|
87 | function verse.set_error_handler(new_error_handler) |
b46921de1e03
verse: Add verse.log() to log a message using the default logger. Also add verse.set_error_handler() to, er, set an error handler.
Matthew Wild <mwild1@gmail.com>
parents:
124
diff
changeset
|
88 | error_handler = new_error_handler; |
b46921de1e03
verse: Add verse.log() to log a message using the default logger. Also add verse.set_error_handler() to, er, set an error handler.
Matthew Wild <mwild1@gmail.com>
parents:
124
diff
changeset
|
89 | end |
b46921de1e03
verse: Add verse.log() to log a message using the default logger. Also add verse.set_error_handler() to, er, set an error handler.
Matthew Wild <mwild1@gmail.com>
parents:
124
diff
changeset
|
90 | |
0 | 91 | function verse.loop() |
126
fa3ddadb8364
verse: verse.loop() and new verse.step() use the new error handler to, er, handle errors.
Matthew Wild <mwild1@gmail.com>
parents:
125
diff
changeset
|
92 | return xpcall(server.loop, error_handler); |
fa3ddadb8364
verse: verse.loop() and new verse.step() use the new error handler to, er, handle errors.
Matthew Wild <mwild1@gmail.com>
parents:
125
diff
changeset
|
93 | end |
fa3ddadb8364
verse: verse.loop() and new verse.step() use the new error handler to, er, handle errors.
Matthew Wild <mwild1@gmail.com>
parents:
125
diff
changeset
|
94 | |
fa3ddadb8364
verse: verse.loop() and new verse.step() use the new error handler to, er, handle errors.
Matthew Wild <mwild1@gmail.com>
parents:
125
diff
changeset
|
95 | function verse.step() |
fa3ddadb8364
verse: verse.loop() and new verse.step() use the new error handler to, er, handle errors.
Matthew Wild <mwild1@gmail.com>
parents:
125
diff
changeset
|
96 | return xpcall(server.step, error_handler); |
0 | 97 | end |
98 | ||
45
50a2e4fb0a16
verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
99 | function verse.quit() |
424
eaaaf4495e06
verse: Ensure verse.quit() only quits the loop once
Matthew Wild <mwild1@gmail.com>
parents:
417
diff
changeset
|
100 | return server.setquitting("once"); |
45
50a2e4fb0a16
verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
101 | end |
50a2e4fb0a16
verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
102 | |
280
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
103 | function stream:listen(host, port) |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
104 | host = host or "localhost"; |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
105 | port = port or 0; |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
106 | local conn, err = server.addserver(host, port, verse.new_listener(self, "server"), "*a"); |
280
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
107 | if conn then |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
108 | self:debug("Bound to %s:%s", host, port); |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
109 | self.server = conn; |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
110 | end |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
111 | return conn, err; |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
112 | end |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
113 | |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
114 | function stream:connect(connect_host, connect_port) |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
115 | connect_host = connect_host or "localhost"; |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
116 | connect_port = tonumber(connect_port) or 5222; |
411 | 117 | |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
118 | -- Create and initiate connection |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
119 | local conn = socket.tcp() |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
120 | conn:settimeout(0); |
382 | 121 | conn:setoption("keepalive", true); |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
122 | local success, err = conn:connect(connect_host, connect_port); |
411 | 123 | |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
124 | if not success and err ~= "timeout" then |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
125 | self:warn("connect() to %s:%d failed: %s", connect_host, connect_port, err); |
135
8adf5fb27ce3
verse: Fire disconnected event even if connection fails instantly
Matthew Wild <mwild1@gmail.com>
parents:
132
diff
changeset
|
126 | return self:event("disconnected", { reason = err }) or false, err; |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
127 | end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
128 | |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
129 | local conn = server.wrapclient(conn, connect_host, connect_port, verse.new_listener(self), "*a"); |
0 | 130 | if not conn then |
124
3659ba3b8dfa
verse: Log error when connection fails instantly
Matthew Wild <mwild1@gmail.com>
parents:
98
diff
changeset
|
131 | self:warn("connection initialisation failed: %s", err); |
135
8adf5fb27ce3
verse: Fire disconnected event even if connection fails instantly
Matthew Wild <mwild1@gmail.com>
parents:
132
diff
changeset
|
132 | return self:event("disconnected", { reason = err }) or false, err; |
0 | 133 | end |
280
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
134 | self:set_conn(conn); |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
135 | return true; |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
136 | end |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
137 | |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
138 | function stream:set_conn(conn) |
0 | 139 | self.conn = conn; |
163
48a47bca9a63
verse: Change to set conn:send in only one place, and fire new events 'outgoing' and 'outgoing-raw'
Matthew Wild <mwild1@gmail.com>
parents:
162
diff
changeset
|
140 | self.send = function (stream, data) |
48a47bca9a63
verse: Change to set conn:send in only one place, and fire new events 'outgoing' and 'outgoing-raw'
Matthew Wild <mwild1@gmail.com>
parents:
162
diff
changeset
|
141 | self:event("outgoing", data); |
48a47bca9a63
verse: Change to set conn:send in only one place, and fire new events 'outgoing' and 'outgoing-raw'
Matthew Wild <mwild1@gmail.com>
parents:
162
diff
changeset
|
142 | data = tostring(data); |
48a47bca9a63
verse: Change to set conn:send in only one place, and fire new events 'outgoing' and 'outgoing-raw'
Matthew Wild <mwild1@gmail.com>
parents:
162
diff
changeset
|
143 | self:event("outgoing-raw", data); |
48a47bca9a63
verse: Change to set conn:send in only one place, and fire new events 'outgoing' and 'outgoing-raw'
Matthew Wild <mwild1@gmail.com>
parents:
162
diff
changeset
|
144 | return conn:write(data); |
48a47bca9a63
verse: Change to set conn:send in only one place, and fire new events 'outgoing' and 'outgoing-raw'
Matthew Wild <mwild1@gmail.com>
parents:
162
diff
changeset
|
145 | end; |
96
f0aec10023aa
verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents:
95
diff
changeset
|
146 | end |
f0aec10023aa
verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents:
95
diff
changeset
|
147 | |
322
819b35b8fcf6
verse: Add missing 'reason' argument to stream:close()
Kim Alvefur <zash@zash.se>
parents:
281
diff
changeset
|
148 | function stream:close(reason) |
411 | 149 | if not self.conn then |
132
b38397163737
verse: Log error and return when trying to close a closed connection
Matthew Wild <mwild1@gmail.com>
parents:
126
diff
changeset
|
150 | verse.log("error", "Attempt to close disconnected connection - possibly a bug"); |
b38397163737
verse: Log error and return when trying to close a closed connection
Matthew Wild <mwild1@gmail.com>
parents:
126
diff
changeset
|
151 | return; |
b38397163737
verse: Log error and return when trying to close a closed connection
Matthew Wild <mwild1@gmail.com>
parents:
126
diff
changeset
|
152 | end |
96
f0aec10023aa
verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents:
95
diff
changeset
|
153 | local on_disconnect = self.conn.disconnect(); |
f0aec10023aa
verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents:
95
diff
changeset
|
154 | self.conn:close(); |
330 | 155 | on_disconnect(self.conn, reason); |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
156 | end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
157 | |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
158 | -- Logging functions |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
159 | function stream:debug(...) |
238
9b6fca5d9a02
verse, squishy: Port to Prosody's util.logger. Adds new function, verse.set_log_handler(handler, levels).
Matthew Wild <mwild1@gmail.com>
parents:
237
diff
changeset
|
160 | return self.logger("debug", ...); |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
161 | end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
162 | |
258
94b1d9863dd9
verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents:
247
diff
changeset
|
163 | function stream:info(...) |
94b1d9863dd9
verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents:
247
diff
changeset
|
164 | return self.logger("info", ...); |
94b1d9863dd9
verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents:
247
diff
changeset
|
165 | end |
94b1d9863dd9
verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents:
247
diff
changeset
|
166 | |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
167 | function stream:warn(...) |
238
9b6fca5d9a02
verse, squishy: Port to Prosody's util.logger. Adds new function, verse.set_log_handler(handler, levels).
Matthew Wild <mwild1@gmail.com>
parents:
237
diff
changeset
|
168 | return self.logger("warn", ...); |
0 | 169 | end |
170 | ||
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
171 | function stream:error(...) |
238
9b6fca5d9a02
verse, squishy: Port to Prosody's util.logger. Adds new function, verse.set_log_handler(handler, levels).
Matthew Wild <mwild1@gmail.com>
parents:
237
diff
changeset
|
172 | return self.logger("error", ...); |
94
b40465267fb5
verse: Add stream:set_loglevels()
Matthew Wild <mwild1@gmail.com>
parents:
64
diff
changeset
|
173 | end |
b40465267fb5
verse: Add stream:set_loglevels()
Matthew Wild <mwild1@gmail.com>
parents:
64
diff
changeset
|
174 | |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
175 | -- Event handling |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
176 | function stream:event(name, ...) |
4
0ef21511c7ff
Log debug message when firing an event
Matthew Wild <mwild1@gmail.com>
parents:
3
diff
changeset
|
177 | self:debug("Firing event: "..tostring(name)); |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
178 | return self.events.fire_event(name, ...); |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
179 | end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
180 | |
16
13444ae6e3c4
verse: Fix stream:hook() to pass additional parameters to the underlying hook(), so we don't strip priority
Matthew Wild <mwild1@gmail.com>
parents:
4
diff
changeset
|
181 | function stream:hook(name, ...) |
13444ae6e3c4
verse: Fix stream:hook() to pass additional parameters to the underlying hook(), so we don't strip priority
Matthew Wild <mwild1@gmail.com>
parents:
4
diff
changeset
|
182 | return self.events.add_handler(name, ...); |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
183 | end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
184 | |
53
091ff10eb51c
verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents:
45
diff
changeset
|
185 | function stream:unhook(name, handler) |
091ff10eb51c
verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents:
45
diff
changeset
|
186 | return self.events.remove_handler(name, handler); |
091ff10eb51c
verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents:
45
diff
changeset
|
187 | end |
091ff10eb51c
verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents:
45
diff
changeset
|
188 | |
98
1dccff7df2d5
verse: Add verse.eventable() to give a passed object :event() and :hook()/:unhook() methods and return it again
Matthew Wild <mwild1@gmail.com>
parents:
96
diff
changeset
|
189 | function verse.eventable(object) |
1dccff7df2d5
verse: Add verse.eventable() to give a passed object :event() and :hook()/:unhook() methods and return it again
Matthew Wild <mwild1@gmail.com>
parents:
96
diff
changeset
|
190 | object.events = events.new(); |
1dccff7df2d5
verse: Add verse.eventable() to give a passed object :event() and :hook()/:unhook() methods and return it again
Matthew Wild <mwild1@gmail.com>
parents:
96
diff
changeset
|
191 | object.hook, object.unhook = stream.hook, stream.unhook; |
1dccff7df2d5
verse: Add verse.eventable() to give a passed object :event() and :hook()/:unhook() methods and return it again
Matthew Wild <mwild1@gmail.com>
parents:
96
diff
changeset
|
192 | local fire_event = object.events.fire_event; |
1dccff7df2d5
verse: Add verse.eventable() to give a passed object :event() and :hook()/:unhook() methods and return it again
Matthew Wild <mwild1@gmail.com>
parents:
96
diff
changeset
|
193 | function object:event(name, ...) |
1dccff7df2d5
verse: Add verse.eventable() to give a passed object :event() and :hook()/:unhook() methods and return it again
Matthew Wild <mwild1@gmail.com>
parents:
96
diff
changeset
|
194 | return fire_event(name, ...); |
1dccff7df2d5
verse: Add verse.eventable() to give a passed object :event() and :hook()/:unhook() methods and return it again
Matthew Wild <mwild1@gmail.com>
parents:
96
diff
changeset
|
195 | end |
1dccff7df2d5
verse: Add verse.eventable() to give a passed object :event() and :hook()/:unhook() methods and return it again
Matthew Wild <mwild1@gmail.com>
parents:
96
diff
changeset
|
196 | return object; |
1dccff7df2d5
verse: Add verse.eventable() to give a passed object :event() and :hook()/:unhook() methods and return it again
Matthew Wild <mwild1@gmail.com>
parents:
96
diff
changeset
|
197 | end |
1dccff7df2d5
verse: Add verse.eventable() to give a passed object :event() and :hook()/:unhook() methods and return it again
Matthew Wild <mwild1@gmail.com>
parents:
96
diff
changeset
|
198 | |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
199 | function stream:add_plugin(name) |
173
3112a9e450ac
verse: Make add_plugin only load a plugin once per stream
Matthew Wild <mwild1@gmail.com>
parents:
163
diff
changeset
|
200 | if self.plugins[name] then return true; end |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
201 | if require("verse.plugins."..name) then |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
202 | local ok, err = verse.plugins[name](self); |
162
2950079d4319
verse: Consider a plugin as failed to load only if it returns false
Matthew Wild <mwild1@gmail.com>
parents:
142
diff
changeset
|
203 | if ok ~= false then |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
204 | self:debug("Loaded %s plugin", name); |
173
3112a9e450ac
verse: Make add_plugin only load a plugin once per stream
Matthew Wild <mwild1@gmail.com>
parents:
163
diff
changeset
|
205 | self.plugins[name] = true; |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
206 | else |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
207 | self:warn("Failed to load %s plugin: %s", name, err); |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
208 | end |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
209 | end |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
210 | return self; |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
211 | end |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
212 | |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
213 | -- Listener factory |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
214 | function verse.new_listener(stream) |
0 | 215 | local conn_listener = {}; |
411 | 216 | |
54
1a2a3d598254
verse: Take advantage of server.lua's new onconnect callback for a more robust "connected" event
Matthew Wild <mwild1@gmail.com>
parents:
53
diff
changeset
|
217 | function conn_listener.onconnect(conn) |
280
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
218 | if stream.server then |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
219 | local client = verse.new(); |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
220 | conn:setlistener(verse.new_listener(client)); |
280
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
221 | client:set_conn(conn); |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
222 | stream:event("connected", { client = client }); |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
223 | else |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
224 | stream.connected = true; |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
225 | stream:event("connected"); |
981c8867f1fb
verse: Add :listen(host, port) to Verse objects ("connected" event is fired with new clients)
Matthew Wild <mwild1@gmail.com>
parents:
279
diff
changeset
|
226 | end |
54
1a2a3d598254
verse: Take advantage of server.lua's new onconnect callback for a more robust "connected" event
Matthew Wild <mwild1@gmail.com>
parents:
53
diff
changeset
|
227 | end |
411 | 228 | |
20
972066e06f4c
verse: Update for new server connection API
Matthew Wild <mwild1@gmail.com>
parents:
17
diff
changeset
|
229 | function conn_listener.onincoming(conn, data) |
54
1a2a3d598254
verse: Take advantage of server.lua's new onconnect callback for a more robust "connected" event
Matthew Wild <mwild1@gmail.com>
parents:
53
diff
changeset
|
230 | stream:event("incoming-raw", data); |
0 | 231 | end |
411 | 232 | |
20
972066e06f4c
verse: Update for new server connection API
Matthew Wild <mwild1@gmail.com>
parents:
17
diff
changeset
|
233 | function conn_listener.ondisconnect(conn, err) |
331
d23bb21668a7
verse: Fix disconnected event for unassociated connections
Kim Alvefur <zash@zash.se>
parents:
330
diff
changeset
|
234 | if conn ~= stream.conn then return end |
0 | 235 | stream.connected = false; |
236 | stream:event("disconnected", { reason = err }); | |
237 | end | |
55
163beb198646
verse: Add "drained" event to signal when send buffer is empty (new server.lua feature)
Matthew Wild <mwild1@gmail.com>
parents:
54
diff
changeset
|
238 | |
163beb198646
verse: Add "drained" event to signal when send buffer is empty (new server.lua feature)
Matthew Wild <mwild1@gmail.com>
parents:
54
diff
changeset
|
239 | function conn_listener.ondrain(conn) |
163beb198646
verse: Add "drained" event to signal when send buffer is empty (new server.lua feature)
Matthew Wild <mwild1@gmail.com>
parents:
54
diff
changeset
|
240 | stream:event("drained"); |
163beb198646
verse: Add "drained" event to signal when send buffer is empty (new server.lua feature)
Matthew Wild <mwild1@gmail.com>
parents:
54
diff
changeset
|
241 | end |
411 | 242 | |
60
1f47ddab3499
verse: Fire "status" event for connection status changes (notably SSL handshake complete)
Matthew Wild <mwild1@gmail.com>
parents:
59
diff
changeset
|
243 | function conn_listener.onstatus(conn, new_status) |
1f47ddab3499
verse: Fire "status" event for connection status changes (notably SSL handshake complete)
Matthew Wild <mwild1@gmail.com>
parents:
59
diff
changeset
|
244 | stream:event("status", new_status); |
1f47ddab3499
verse: Fire "status" event for connection status changes (notably SSL handshake complete)
Matthew Wild <mwild1@gmail.com>
parents:
59
diff
changeset
|
245 | end |
411 | 246 | |
444
12c1be0044c6
client: Send whitespace keeplives
Kim Alvefur <zash@zash.se>
parents:
424
diff
changeset
|
247 | function conn_listener.onreadtimeout(conn) |
12c1be0044c6
client: Send whitespace keeplives
Kim Alvefur <zash@zash.se>
parents:
424
diff
changeset
|
248 | return stream:event("read-timeout"); |
12c1be0044c6
client: Send whitespace keeplives
Kim Alvefur <zash@zash.se>
parents:
424
diff
changeset
|
249 | end |
0 | 250 | return conn_listener; |
251 | end | |
252 | ||
253 | return verse; |