Annotate

init.lua @ 481:6fc84e9bd03e

squishy: Add browsing plugin
author Matthew Wild <mwild1@gmail.com>
date Fri, 17 Mar 2023 12:31:02 +0000
parent 465:6707e3a47f71
child 490:6b2f31da9610
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13
461
fa5c40e5e079 Use util.format for logging
Matthew Wild <mwild1@gmail.com>
parents: 444
diff changeset
14 local format = require "util.format".format;
fa5c40e5e079 Use util.format for logging
Matthew Wild <mwild1@gmail.com>
parents: 444
diff changeset
15
417
d46a502955c0 verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents: 411
diff changeset
16 local verse = {};
d46a502955c0 verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents: 411
diff changeset
17 verse.server = server;
0
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 local stream = {};
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 stream.__index = stream;
417
d46a502955c0 verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents: 411
diff changeset
21 verse.stream_mt = stream;
0
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22
3
372ddb5900d3 verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents: 2
diff changeset
23 verse.plugins = {};
372ddb5900d3 verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents: 2
diff changeset
24
257
816b8ccb3082 verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 247
diff changeset
25 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
26 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
27 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
28 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
29 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
30 end
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 return verse;
816b8ccb3082 verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 247
diff changeset
33 end
816b8ccb3082 verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 247
diff changeset
34
816b8ccb3082 verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 247
diff changeset
35
239
65a0d3fcbbad verse: Switch connection ids to be a simple incrementing integer
Matthew Wild <mwild1@gmail.com>
parents: 238
diff changeset
36 local max_id = 0;
65a0d3fcbbad verse: Switch connection ids to be a simple incrementing integer
Matthew Wild <mwild1@gmail.com>
parents: 238
diff changeset
37
44
37396504de5f verse: Multiple changes to allow controlling logging for both verse and streams
Matthew Wild <mwild1@gmail.com>
parents: 42
diff changeset
38 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
39 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
40 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
41 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
42 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
43 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
44 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
45 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
46 return t;
0
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 end
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48
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
49 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
50
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
51 verse.logger = logger.init; -- COMPAT: Deprecated
236
d75a209e57fc verse: verse.logger() -> verse.new_logger()
Matthew Wild <mwild1@gmail.com>
parents: 234
diff changeset
52 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
53 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
54
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
55 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
56 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
57 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
58 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
59 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
60 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
61 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
62 end
241
931bf313c691 verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents: 240
diff changeset
63 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
64 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
65 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
66 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
67 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
68 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
69 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
70 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
71 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
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
417
d46a502955c0 verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents: 411
diff changeset
74 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
75 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
76 end
417
d46a502955c0 verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents: 411
diff changeset
77 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
78
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
79 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
80 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
81 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
82 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
83
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 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
85 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 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
87
0
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 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
89 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
90 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
91
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 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
93 return xpcall(server.step, error_handler);
0
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 end
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95
45
50a2e4fb0a16 verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents: 44
diff changeset
96 function verse.quit()
424
eaaaf4495e06 verse: Ensure verse.quit() only quits the loop once
Matthew Wild <mwild1@gmail.com>
parents: 417
diff changeset
97 return server.setquitting("once");
45
50a2e4fb0a16 verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents: 44
diff changeset
98 end
50a2e4fb0a16 verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents: 44
diff changeset
99
463
98fe3ed54639 Update to new tls_builder() API in net.server upstream
Matthew Wild <mwild1@gmail.com>
parents: 461
diff changeset
100 function verse.tls_builder(...)
98fe3ed54639 Update to new tls_builder() API in net.server upstream
Matthew Wild <mwild1@gmail.com>
parents: 461
diff changeset
101 return server.tls_builder(...);
98fe3ed54639 Update to new tls_builder() API in net.server upstream
Matthew Wild <mwild1@gmail.com>
parents: 461
diff changeset
102 end
98fe3ed54639 Update to new tls_builder() API in net.server upstream
Matthew Wild <mwild1@gmail.com>
parents: 461
diff changeset
103
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
104 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
105 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
106 port = port or 0;
417
d46a502955c0 verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents: 411
diff changeset
107 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
108 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
109 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
110 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
111 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
112 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
113 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
114
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
115 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
116 connect_host = connect_host or "localhost";
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
117 connect_port = tonumber(connect_port) or 5222;
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 399
diff changeset
118
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
119 -- Create and initiate connection
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
120 local conn = socket.tcp()
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
121 conn:settimeout(0);
382
479b856a910f verse: Enable TCP keepalives
Kim Alvefur <zash@zash.se>
parents: 368
diff changeset
122 conn:setoption("keepalive", true);
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
123 local success, err = conn:connect(connect_host, connect_port);
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 399
diff changeset
124
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
125 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
126 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
127 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
128 end
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
129
417
d46a502955c0 verse: Remove use of deprecated module() function
Kim Alvefur <zash@zash.se>
parents: 411
diff changeset
130 local conn = server.wrapclient(conn, connect_host, connect_port, verse.new_listener(self), "*a");
0
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131 if not conn then
124
3659ba3b8dfa verse: Log error when connection fails instantly
Matthew Wild <mwild1@gmail.com>
parents: 98
diff changeset
132 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
133 return self:event("disconnected", { reason = err }) or false, err;
0
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 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
135 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
136 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
137 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
138
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 function stream:set_conn(conn)
0
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 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
141 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
142 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
143 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
144 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
145 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
146 end;
96
f0aec10023aa verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents: 95
diff changeset
147 end
f0aec10023aa verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents: 95
diff changeset
148
322
819b35b8fcf6 verse: Add missing 'reason' argument to stream:close()
Kim Alvefur <zash@zash.se>
parents: 281
diff changeset
149 function stream:close(reason)
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 399
diff changeset
150 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
151 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
152 return;
b38397163737 verse: Log error and return when trying to close a closed connection
Matthew Wild <mwild1@gmail.com>
parents: 126
diff changeset
153 end
96
f0aec10023aa verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents: 95
diff changeset
154 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
155 self:event("shutdown");
96
f0aec10023aa verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents: 95
diff changeset
156 self.conn:close();
330
44d2bd1cee46 Backout 55e3fd7b9731
Kim Alvefur <zash@zash.se>
parents: 328
diff changeset
157 on_disconnect(self.conn, reason);
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
158 end
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
159
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
160 -- Logging functions
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
161 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
162 return self.logger("debug", ...);
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
163 end
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
164
258
94b1d9863dd9 verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents: 247
diff changeset
165 function stream:info(...)
94b1d9863dd9 verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents: 247
diff changeset
166 return self.logger("info", ...);
94b1d9863dd9 verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents: 247
diff changeset
167 end
94b1d9863dd9 verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents: 247
diff changeset
168
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
169 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
170 return self.logger("warn", ...);
0
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 end
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
173 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
174 return self.logger("error", ...);
94
b40465267fb5 verse: Add stream:set_loglevels()
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
175 end
b40465267fb5 verse: Add stream:set_loglevels()
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
176
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
177 -- Event handling
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
178 function stream:event(name, ...)
4
0ef21511c7ff Log debug message when firing an event
Matthew Wild <mwild1@gmail.com>
parents: 3
diff changeset
179 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
180 return self.events.fire_event(name, ...);
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
181 end
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
182
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
183 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
184 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
185 end
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
186
53
091ff10eb51c verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents: 45
diff changeset
187 function stream:unhook(name, handler)
091ff10eb51c verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents: 45
diff changeset
188 return self.events.remove_handler(name, handler);
091ff10eb51c verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents: 45
diff changeset
189 end
091ff10eb51c verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents: 45
diff changeset
190
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
191 function verse.eventable(object)
464
dc05a8d6dbfb Fix whitespace
Matthew Wild <mwild1@gmail.com>
parents: 463
diff changeset
192 object.events = events.new();
dc05a8d6dbfb Fix whitespace
Matthew Wild <mwild1@gmail.com>
parents: 463
diff changeset
193 object.hook, object.unhook = stream.hook, stream.unhook;
dc05a8d6dbfb Fix whitespace
Matthew Wild <mwild1@gmail.com>
parents: 463
diff changeset
194 local fire_event = object.events.fire_event;
dc05a8d6dbfb Fix whitespace
Matthew Wild <mwild1@gmail.com>
parents: 463
diff changeset
195 function object:event(name, ...) return fire_event(name, ...); end
dc05a8d6dbfb Fix whitespace
Matthew Wild <mwild1@gmail.com>
parents: 463
diff changeset
196 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
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215 local conn_listener = {};
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 399
diff changeset
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
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 399
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 end
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 399
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235 stream.connected = false;
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 stream:event("disconnected", { reason = err });
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 399
diff changeset
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
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 399
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 return conn_listener;
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251 end
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
252
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
253 return verse;