Software /
code /
verse
Annotate
init.lua @ 353:8cd05c3d0f1f
plugins.archive: Update to MAM version 0.3
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 08 Sep 2014 12:10:21 +0200 |
parent | 331:d23bb21668a7 |
child | 361:451dbad2a8e6 |
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 |
64
a28540d4117a
verse: Load LuaSec if possible
Matthew Wild <mwild1@gmail.com>
parents:
60
diff
changeset
|
5 -- Load LuaSec if available |
a28540d4117a
verse: Load LuaSec if possible
Matthew Wild <mwild1@gmail.com>
parents:
60
diff
changeset
|
6 pcall(require, "ssl"); |
a28540d4117a
verse: Load LuaSec if possible
Matthew Wild <mwild1@gmail.com>
parents:
60
diff
changeset
|
7 |
30
9c96318913f7
Revert module names throughout to their Prosody equivalents
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
8 local server = require "net.server"; |
9c96318913f7
Revert module names throughout to their Prosody equivalents
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
9 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
|
10 local logger = require "util.logger"; |
0 | 11 |
12 module("verse", package.seeall); | |
13 local verse = _M; | |
205
cbcd45be11a8
verse: Expose net.server as verse.server
Matthew Wild <mwild1@gmail.com>
parents:
173
diff
changeset
|
14 _M.server = server; |
0 | 15 |
16 local stream = {}; | |
17 stream.__index = stream; | |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
18 stream_mt = stream; |
0 | 19 |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
20 verse.plugins = {}; |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
21 |
257
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
22 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
|
23 for i=1,select("#", ...) do |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
24 local ok = pcall(require, "verse."..select(i,...)); |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
25 if not ok then |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
26 error("Verse connection module not found: verse."..select(i,...)); |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
27 end |
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 return verse; |
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 |
816b8ccb3082
verse: Add init(...) method to load connection modules (client, component, bosh, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
247
diff
changeset
|
32 |
239
65a0d3fcbbad
verse: Switch connection ids to be a simple incrementing integer
Matthew Wild <mwild1@gmail.com>
parents:
238
diff
changeset
|
33 local max_id = 0; |
65a0d3fcbbad
verse: Switch connection ids to be a simple incrementing integer
Matthew Wild <mwild1@gmail.com>
parents:
238
diff
changeset
|
34 |
44
37396504de5f
verse: Multiple changes to allow controlling logging for both verse and streams
Matthew Wild <mwild1@gmail.com>
parents:
42
diff
changeset
|
35 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
|
36 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
|
37 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
|
38 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
|
39 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
|
40 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
|
41 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
|
42 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
|
43 return t; |
0 | 44 end |
45 | |
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
|
46 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
|
47 |
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
|
48 verse.logger = logger.init; -- COMPAT: Deprecated |
236
d75a209e57fc
verse: verse.logger() -> verse.new_logger()
Matthew Wild <mwild1@gmail.com>
parents:
234
diff
changeset
|
49 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
|
50 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
|
51 |
241
931bf313c691
verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents:
240
diff
changeset
|
52 local function format(format, ...) |
931bf313c691
verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents:
240
diff
changeset
|
53 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
|
54 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
|
55 end |
931bf313c691
verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents:
240
diff
changeset
|
56 |
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
|
57 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
|
58 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
|
59 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
|
60 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
|
61 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
|
62 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
|
63 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
|
64 end |
241
931bf313c691
verse: Format messages before passing them to custom log handler
Matthew Wild <mwild1@gmail.com>
parents:
240
diff
changeset
|
65 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
|
66 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
|
67 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
|
68 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
|
69 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
|
70 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
|
71 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
|
72 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
|
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 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 |
242
ab4773b0ef5e
verse: Add default log handler for errors
Matthew Wild <mwild1@gmail.com>
parents:
241
diff
changeset
|
76 function _default_log_handler(name, level, message) |
ab4773b0ef5e
verse: Add default log handler for errors
Matthew Wild <mwild1@gmail.com>
parents:
241
diff
changeset
|
77 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
|
78 end |
ab4773b0ef5e
verse: Add default log handler for errors
Matthew Wild <mwild1@gmail.com>
parents:
241
diff
changeset
|
79 verse.set_log_handler(_default_log_handler, { "error" }); |
ab4773b0ef5e
verse: Add default log handler for errors
Matthew Wild <mwild1@gmail.com>
parents:
241
diff
changeset
|
80 |
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
|
81 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
|
82 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
|
83 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
|
84 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
|
85 |
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 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
|
87 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 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
|
89 |
0 | 90 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
|
91 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
|
92 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
|
93 |
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 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
|
95 return xpcall(server.step, error_handler); |
0 | 96 end |
97 | |
45
50a2e4fb0a16
verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
98 function verse.quit() |
50a2e4fb0a16
verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
99 return server.setquitting(true); |
50a2e4fb0a16
verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
100 end |
50a2e4fb0a16
verse: Add verse.quit() to exit the event loop
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
101 |
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
|
102 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
|
103 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
|
104 port = port or 0; |
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 local conn, err = server.addserver(host, port, new_listener(self, "server"), "*a"); |
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 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
|
107 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
|
108 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
|
109 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
|
110 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
|
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 |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
113 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
|
114 connect_host = connect_host or "localhost"; |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
115 connect_port = tonumber(connect_port) or 5222; |
0 | 116 |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
117 -- Create and initiate connection |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
118 local conn = socket.tcp() |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
119 conn:settimeout(0); |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
120 local success, err = conn:connect(connect_host, connect_port); |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
121 |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
122 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
|
123 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
|
124 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
|
125 end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
126 |
59
829a0a495dd1
verse: Remove some useless comments
Matthew Wild <mwild1@gmail.com>
parents:
55
diff
changeset
|
127 local conn = server.wrapclient(conn, connect_host, connect_port, new_listener(self), "*a"); |
0 | 128 if not conn then |
124
3659ba3b8dfa
verse: Log error when connection fails instantly
Matthew Wild <mwild1@gmail.com>
parents:
98
diff
changeset
|
129 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
|
130 return self:event("disconnected", { reason = err }) or false, err; |
0 | 131 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
|
132 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
|
133 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
|
134 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
|
135 |
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 function stream:set_conn(conn) |
0 | 137 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
|
138 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
|
139 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
|
140 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
|
141 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
|
142 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
|
143 end; |
96
f0aec10023aa
verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents:
95
diff
changeset
|
144 end |
f0aec10023aa
verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents:
95
diff
changeset
|
145 |
322
819b35b8fcf6
verse: Add missing 'reason' argument to stream:close()
Kim Alvefur <zash@zash.se>
parents:
281
diff
changeset
|
146 function stream:close(reason) |
132
b38397163737
verse: Log error and return when trying to close a closed connection
Matthew Wild <mwild1@gmail.com>
parents:
126
diff
changeset
|
147 if not self.conn then |
b38397163737
verse: Log error and return when trying to close a closed connection
Matthew Wild <mwild1@gmail.com>
parents:
126
diff
changeset
|
148 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
|
149 return; |
b38397163737
verse: Log error and return when trying to close a closed connection
Matthew Wild <mwild1@gmail.com>
parents:
126
diff
changeset
|
150 end |
96
f0aec10023aa
verse: Return true from connect() on success, add stream:close()
Matthew Wild <mwild1@gmail.com>
parents:
95
diff
changeset
|
151 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
|
152 self.conn:close(); |
330 | 153 on_disconnect(self.conn, reason); |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
154 end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
155 |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
156 -- Logging functions |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
157 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
|
158 return self.logger("debug", ...); |
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 |
258
94b1d9863dd9
verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents:
247
diff
changeset
|
161 function stream:info(...) |
94b1d9863dd9
verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents:
247
diff
changeset
|
162 return self.logger("info", ...); |
94b1d9863dd9
verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents:
247
diff
changeset
|
163 end |
94b1d9863dd9
verse: Add stream:info() for emitting info-level log message.
Kim Alvefur <zash@zash.se>
parents:
247
diff
changeset
|
164 |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
165 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
|
166 return self.logger("warn", ...); |
0 | 167 end |
168 | |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
169 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
|
170 return self.logger("error", ...); |
94
b40465267fb5
verse: Add stream:set_loglevels()
Matthew Wild <mwild1@gmail.com>
parents:
64
diff
changeset
|
171 end |
b40465267fb5
verse: Add stream:set_loglevels()
Matthew Wild <mwild1@gmail.com>
parents:
64
diff
changeset
|
172 |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
173 -- Event handling |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
174 function stream:event(name, ...) |
4
0ef21511c7ff
Log debug message when firing an event
Matthew Wild <mwild1@gmail.com>
parents:
3
diff
changeset
|
175 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
|
176 return self.events.fire_event(name, ...); |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
177 end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
178 |
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
|
179 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
|
180 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
|
181 end |
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
182 |
53
091ff10eb51c
verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents:
45
diff
changeset
|
183 function stream:unhook(name, handler) |
091ff10eb51c
verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents:
45
diff
changeset
|
184 return self.events.remove_handler(name, handler); |
091ff10eb51c
verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents:
45
diff
changeset
|
185 end |
091ff10eb51c
verse: Add stream:unhook(event_name, handler)
Matthew Wild <mwild1@gmail.com>
parents:
45
diff
changeset
|
186 |
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
|
187 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
|
188 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
|
189 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
|
190 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
|
191 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
|
192 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
|
193 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
|
194 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
|
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 |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
197 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
|
198 if self.plugins[name] then return true; end |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
199 if require("verse.plugins."..name) then |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
200 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
|
201 if ok ~= false then |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
202 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
|
203 self.plugins[name] = true; |
3
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
204 else |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
205 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
|
206 end |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
207 end |
372ddb5900d3
verse: Support for loading plugins
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
208 return self; |
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 |
1
7c8d0a2fc004
Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
211 -- Listener factory |
0 | 212 function new_listener(stream) |
213 local conn_listener = {}; | |
214 | |
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
|
215 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
|
216 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
|
217 local client = verse.new(); |
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 conn:setlistener(new_listener(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
|
219 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
|
220 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
|
221 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
|
222 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
|
223 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
|
224 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
|
225 end |
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
|
226 |
20
972066e06f4c
verse: Update for new server connection API
Matthew Wild <mwild1@gmail.com>
parents:
17
diff
changeset
|
227 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
|
228 stream:event("incoming-raw", data); |
0 | 229 end |
230 | |
20
972066e06f4c
verse: Update for new server connection API
Matthew Wild <mwild1@gmail.com>
parents:
17
diff
changeset
|
231 function conn_listener.ondisconnect(conn, err) |
331
d23bb21668a7
verse: Fix disconnected event for unassociated connections
Kim Alvefur <zash@zash.se>
parents:
330
diff
changeset
|
232 if conn ~= stream.conn then return end |
0 | 233 stream.connected = false; |
234 stream:event("disconnected", { reason = err }); | |
235 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
|
236 |
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
|
237 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
|
238 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
|
239 end |
0 | 240 |
60
1f47ddab3499
verse: Fire "status" event for connection status changes (notably SSL handshake complete)
Matthew Wild <mwild1@gmail.com>
parents:
59
diff
changeset
|
241 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
|
242 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
|
243 end |
1f47ddab3499
verse: Fire "status" event for connection status changes (notably SSL handshake complete)
Matthew Wild <mwild1@gmail.com>
parents:
59
diff
changeset
|
244 |
0 | 245 return conn_listener; |
246 end | |
247 | |
248 return verse; |