core/sessionmanager.lua

changeset 53
14ea0fe6ca86
parent 49
1cd2a8db392d
child 57
126b25079399
equal deleted inserted replaced
52:93e468eb2ffb 53:14ea0fe6ca86
1 1
2 local tonumber, tostring = tonumber, tostring; 2 local tonumber, tostring = tonumber, tostring;
3 local ipairs, print= ipairs, print; 3 local ipairs, pairs, print= ipairs, pairs, print;
4 4 local collectgarbage = collectgarbage;
5 local m_random = import("math", "random"); 5 local m_random = import("math", "random");
6 local format = import("string", "format"); 6 local format = import("string", "format");
7 7
8 local hosts = hosts; 8 local hosts = hosts;
9 local sessions = sessions;
9 10
10 local modulemanager = require "core.modulemanager"; 11 local modulemanager = require "core.modulemanager";
11 local log = require "util.logger".init("sessionmanager"); 12 local log = require "util.logger".init("sessionmanager");
12 local error = error; 13 local error = error;
13 local uuid_generate = require "util.uuid".uuid_generate; 14 local uuid_generate = require "util.uuid".uuid_generate;
15
16 local newproxy = newproxy;
17 local getmetatable = getmetatable;
18
14 module "sessionmanager" 19 module "sessionmanager"
15 20
16 function new_session(conn) 21 function new_session(conn)
17 local session = { conn = conn, notopen = true, priority = 0, type = "c2s_unauthed" }; 22 local session = { conn = conn, notopen = true, priority = 0, type = "c2s_unauthed" };
23 if true then
24 session.trace = newproxy(true);
25 getmetatable(session.trace).__gc = function () print("Session got collected") end;
26 end
18 local w = conn.write; 27 local w = conn.write;
19 session.send = function (t) w(tostring(t)); end 28 session.send = function (t) w(tostring(t)); end
20 return session; 29 return session;
21 end 30 end
22 31
23 function destroy_session(session) 32 function destroy_session(session)
33 if not (session and session.disconnect) then return; end
34 log("debug", "Destroying session...");
35 session.disconnect();
36 if session.username then
37 if session.resource then
38 hosts[session.host].sessions[session.username].sessions[session.resource] = nil;
39 end
40 local nomore = true;
41 for res, ssn in pairs(hosts[session.host].sessions[session.username]) do
42 nomore = false;
43 end
44 if nomore then
45 hosts[session.host].sessions[session.username] = nil;
46 end
47 end
48 session.conn = nil;
49 session.disconnect = nil;
50 for k in pairs(session) do
51 if k ~= "trace" then
52 session[k] = nil;
53 end
54 end
55 collectgarbage("collect");
56 collectgarbage("collect");
57 collectgarbage("collect");
58 collectgarbage("collect");
59 collectgarbage("collect");
24 end 60 end
25 61
26 function send_to_session(session, data) 62 function send_to_session(session, data)
27 log("debug", "Sending: %s", tostring(data)); 63 log("debug", "Sending: %s", tostring(data));
28 session.conn.write(tostring(data)); 64 session.conn.write(tostring(data));
32 session.username = username; 68 session.username = username;
33 session.resource = resource; 69 session.resource = resource;
34 if session.type == "c2s_unauthed" then 70 if session.type == "c2s_unauthed" then
35 session.type = "c2s"; 71 session.type = "c2s";
36 end 72 end
73 return true;
37 end 74 end
38 75
39 function bind_resource(session, resource) 76 function bind_resource(session, resource)
40 if not session.username then return false, "auth"; end 77 if not session.username then return false, "auth"; end
41 if session.resource then return false, "constraint"; end -- We don't support binding multiple resources 78 if session.resource then return false, "constraint"; end -- We don't support binding multiple resources

mercurial