init.lua

Thu, 10 Jun 2021 11:58:23 +0200

author
Kim Alvefur <zash@zash.se>
date
Thu, 10 Jun 2021 11:58:23 +0200
changeset 445
b119dc4d8bc2
parent 444
12c1be0044c6
child 461
fa5c40e5e079
permissions
-rw-r--r--

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
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
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 local stream = {};
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 end
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 end
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 399
diff changeset
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
479b856a910f verse: Enable TCP keepalives
Kim Alvefur <zash@zash.se>
parents: 368
diff changeset
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
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 399
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 399
diff changeset
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
44d2bd1cee46 Backout 55e3fd7b9731
Kim Alvefur <zash@zash.se>
parents: 328
diff changeset
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
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 end
caf260adc453 Beginning of new verse
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
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;

mercurial