Software /
code /
verse
Annotate
init.lua @ 498:50d0bd035bb7
util.sasl.oauthbearer: Don't send authzid
It's not needed and not recommended in XMPP unless we want to act as
someone other than who we authenticate as. We find out the JID during
resource binding.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 23 Jun 2023 12:09:49 +0200 |
parent | 492:22844ac3be4e |
child | 505:289c866d7fb0 |
rev | line source |
---|---|
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 |
492
22844ac3be4e
server: Import one of Prosodys net.server implementations
Kim Alvefur <zash@zash.se>
parents:
490
diff
changeset
|
10 local server = require "verse.server"; |
490
6b2f31da9610
Update for new Prosody module namespace
Kim Alvefur <zash@zash.se>
parents:
465
diff
changeset
|
11 package.loaded["prosody.net.server"] = server; -- XXX |
6b2f31da9610
Update for new Prosody module namespace
Kim Alvefur <zash@zash.se>
parents:
465
diff
changeset
|
12 local events = require "prosody.util.events"; |
6b2f31da9610
Update for new Prosody module namespace
Kim Alvefur <zash@zash.se>
parents:
465
diff
changeset
|
13 local logger = require "prosody.util.logger"; |
0 | 14 |
490
6b2f31da9610
Update for new Prosody module namespace
Kim Alvefur <zash@zash.se>
parents:
465
diff
changeset
|
15 local format = require "prosody.util.format".format; |
461
fa5c40e5e079
Use util.format for logging
Matthew Wild <mwild1@gmail.com>
parents:
444
diff
changeset
|
16 |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
17 local verse = {}; |
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
18 verse.server = server; |
0 | 19 |
20 local stream = {}; | |
21 stream.__index = stream; | |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
22 verse.stream_mt = stream; |
0 | 23 |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
24 verse.plugins = {}; |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
25 |
257
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
26 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
|
27 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
|
28 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
|
29 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
|
30 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
|
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 end |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
33 return verse; |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
34 end |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
35 |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
36 |
239
65a0d3fcbbad
verse: Switch connection ids to be a simple incrementing integer
Matthew Wild <mwild1@gmail.com>
parents:
238
diff
changeset
|
37 local max_id = 0; |
65a0d3fcbbad
verse: Switch connection ids to be a simple incrementing integer
Matthew Wild <mwild1@gmail.com>
parents:
238
diff
changeset
|
38 |
44
37396504de5f
verse: Multiple changes to allow controlling logging for both verse and streams
Matthew Wild <mwild1@gmail.com>
parents:
42
diff
changeset
|
39 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
|
40 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
|
41 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
|
42 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
|
43 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
|
44 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
|
45 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
|
46 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
|
47 return t; |
0 | 48 end |
49 | |
490
6b2f31da9610
Update for new Prosody module namespace
Kim Alvefur <zash@zash.se>
parents:
465
diff
changeset
|
50 verse.add_task = require "prosody.util.timer".add_task; |
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
|
51 |
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
|
52 verse.logger = logger.init; -- COMPAT: Deprecated |
236
d75a209e57fc
verse: verse.logger() -> verse.new_logger()
Matthew Wild <mwild1@gmail.com>
parents:
234
diff
changeset
|
53 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
|
54 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
|
55 |
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
|
56 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
|
57 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
|
58 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
|
59 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
|
60 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
|
61 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
|
62 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
|
63 end |
241
931bf313c691
verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents:
240
diff
changeset
|
64 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
|
65 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
|
66 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
|
67 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
|
68 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
|
69 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
|
70 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
|
71 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
|
72 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
|
73 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
|
74 |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
75 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
|
76 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
|
77 end |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
78 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
|
79 |
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
|
80 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
|
81 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
|
82 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
|
83 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
|
84 |
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 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
|
86 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
|
87 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
|
88 |
0 | 89 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
|
90 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
|
91 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
|
92 |
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 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
|
94 return xpcall(server.step, error_handler); |
0 | 95 end |
96 | |
45
50a2e4fb0a16
verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
97 function verse.quit() |
424
eaaaf4495e06
verse: Ensure verse.quit() only quits the loop once
Matthew Wild <mwild1@gmail.com>
parents:
417
diff
changeset
|
98 return server.setquitting("once"); |
45
50a2e4fb0a16
verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
99 end |
50a2e4fb0a16
verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
100 |
463
98fe3ed54639
Update to new tls_builder() API in net.server upstream
Matthew Wild <mwild1@gmail.com>
parents:
461
diff
changeset
|
101 function verse.tls_builder(...) |
98fe3ed54639
Update to new tls_builder() API in net.server upstream
Matthew Wild <mwild1@gmail.com>
parents:
461
diff
changeset
|
102 return server.tls_builder(...); |
98fe3ed54639
Update to new tls_builder() API in net.server upstream
Matthew Wild <mwild1@gmail.com>
parents:
461
diff
changeset
|
103 end |
98fe3ed54639
Update to new tls_builder() API in net.server upstream
Matthew Wild <mwild1@gmail.com>
parents:
461
diff
changeset
|
104 |
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
|
105 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
|
106 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
|
107 port = port or 0; |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
108 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
|
109 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
|
110 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
|
111 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
|
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 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
|
114 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
|
115 |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
116 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
|
117 connect_host = connect_host or "localhost"; |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
118 connect_port = tonumber(connect_port) or 5222; |
411 | 119 |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
120 -- Create and initiate connection |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
121 local conn = socket.tcp() |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
122 conn:settimeout(0); |
382 | 123 conn:setoption("keepalive", true); |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
124 local success, err = conn:connect(connect_host, connect_port); |
411 | 125 |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
126 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
|
127 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
|
128 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
|
129 end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
130 |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
131 local conn = server.wrapclient(conn, connect_host, connect_port, verse.new_listener(self), "*a"); |
0 | 132 if not conn then |
124
3659ba3b8dfa
verse: Log error when connection fails instantly
Matthew Wild <mwild1@gmail.com>
parents:
98
diff
changeset
|
133 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
|
134 return self:event("disconnected", { reason = err }) or false, err; |
0 | 135 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
|
136 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
|
137 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
|
138 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
|
139 |
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
|
140 function stream:set_conn(conn) |
0 | 141 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
|
142 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
|
143 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
|
144 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
|
145 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
|
146 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
|
147 end; |
96
f0aec10023aa
verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents:
95
diff
changeset
|
148 end |
f0aec10023aa
verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents:
95
diff
changeset
|
149 |
322
819b35b8fcf6
verse: Add missing 'reason' argument to stream:close()
Kim Alvefur <zash@zash.se>
parents:
281
diff
changeset
|
150 function stream:close(reason) |
411 | 151 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
|
152 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
|
153 return; |
b38397163737
verse: Log error and return when trying to close a closed connection
Matthew Wild <mwild1@gmail.com>
parents:
126
diff
changeset
|
154 end |
96
f0aec10023aa
verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents:
95
diff
changeset
|
155 local on_disconnect = self.conn.disconnect(); |
465
6707e3a47f71
Add 'shutdown' event for a self-initiated disconnect
Matthew Wild <mwild1@gmail.com>
parents:
464
diff
changeset
|
156 self:event("shutdown"); |
96
f0aec10023aa
verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents:
95
diff
changeset
|
157 self.conn:close(); |
330 | 158 on_disconnect(self.conn, reason); |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
159 end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
160 |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
161 -- Logging functions |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
162 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
|
163 return self.logger("debug", ...); |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
164 end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
165 |
258
94b1d9863dd9
verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents:
247
diff
changeset
|
166 function stream:info(...) |
94b1d9863dd9
verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents:
247
diff
changeset
|
167 return self.logger("info", ...); |
94b1d9863dd9
verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents:
247
diff
changeset
|
168 end |
94b1d9863dd9
verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents:
247
diff
changeset
|
169 |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
170 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
|
171 return self.logger("warn", ...); |
0 | 172 end |
173 | |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
174 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
|
175 return self.logger("error", ...); |
94
b40465267fb5
verse: Add stream:set_loglevels()
Matthew Wild <mwild1@gmail.com>
parents:
64
diff
changeset
|
176 end |
b40465267fb5
verse: Add stream:set_loglevels()
Matthew Wild <mwild1@gmail.com>
parents:
64
diff
changeset
|
177 |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
178 -- Event handling |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
179 function stream:event(name, ...) |
4
0ef21511c7ff
Log debug message when firing an event
Matthew Wild <mwild1@gmail.com>
parents:
3
diff
changeset
|
180 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
|
181 return self.events.fire_event(name, ...); |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
182 end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
183 |
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
|
184 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
|
185 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
|
186 end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
187 |
53
091ff10eb51c
verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents:
45
diff
changeset
|
188 function stream:unhook(name, handler) |
091ff10eb51c
verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents:
45
diff
changeset
|
189 return self.events.remove_handler(name, handler); |
091ff10eb51c
verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents:
45
diff
changeset
|
190 end |
091ff10eb51c
verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents:
45
diff
changeset
|
191 |
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
|
192 function verse.eventable(object) |
464 | 193 object.events = events.new(); |
194 object.hook, object.unhook = stream.hook, stream.unhook; | |
195 local fire_event = object.events.fire_event; | |
196 function object:event(name, ...) return fire_event(name, ...); end | |
197 return object; | |
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
|
198 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
|
199 |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
200 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
|
201 if self.plugins[name] then return true; end |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
202 if require("verse.plugins."..name) then |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
203 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
|
204 if ok ~= false then |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
205 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
|
206 self.plugins[name] = true; |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
207 else |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
208 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
|
209 end |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
210 end |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
211 return self; |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
212 end |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
213 |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
214 -- Listener factory |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
215 function verse.new_listener(stream) |
0 | 216 local conn_listener = {}; |
411 | 217 |
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
|
218 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
|
219 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
|
220 local client = verse.new(); |
417
d46a502955c0
verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents:
411
diff
changeset
|
221 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
|
222 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
|
223 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
|
224 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
|
225 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
|
226 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
|
227 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
|
228 end |
411 | 229 |
20
972066e06f4c
verse: Update for new server connection API
Matthew Wild <mwild1@gmail.com>
parents:
17
diff
changeset
|
230 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
|
231 stream:event("incoming-raw", data); |
0 | 232 end |
411 | 233 |
20
972066e06f4c
verse: Update for new server connection API
Matthew Wild <mwild1@gmail.com>
parents:
17
diff
changeset
|
234 function conn_listener.ondisconnect(conn, err) |
331
d23bb21668a7
verse: Fix disconnected event for unassociated connections
Kim Alvefur <zash@zash.se>
parents:
330
diff
changeset
|
235 if conn ~= stream.conn then return end |
0 | 236 stream.connected = false; |
237 stream:event("disconnected", { reason = err }); | |
238 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
|
239 |
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 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
|
241 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
|
242 end |
411 | 243 |
60
1f47ddab3499
verse: Fire "status" event for connection status changes (notably SSL handshake complete)
Matthew Wild <mwild1@gmail.com>
parents:
59
diff
changeset
|
244 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
|
245 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
|
246 end |
411 | 247 |
444
12c1be0044c6
client: Send whitespace keeplives
Kim Alvefur <zash@zash.se>
parents:
424
diff
changeset
|
248 function conn_listener.onreadtimeout(conn) |
12c1be0044c6
client: Send whitespace keeplives
Kim Alvefur <zash@zash.se>
parents:
424
diff
changeset
|
249 return stream:event("read-timeout"); |
12c1be0044c6
client: Send whitespace keeplives
Kim Alvefur <zash@zash.se>
parents:
424
diff
changeset
|
250 end |
0 | 251 return conn_listener; |
252 end | |
253 | |
254 return verse; |