]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | timerID = "timeout" |
2 | --timerID = "interval" | |
3 | ||
4 | function trace(text) | |
5 | local f = io.open("websocket.trace", "a") | |
6 | f:write(os.date() .. " - " .. text .. "\n") | |
7 | f:close() | |
8 | end | |
9 | ||
10 | function iswebsocket() | |
11 | return mg.lua_type == "websocket" | |
12 | --return pcall(function() | |
13 | -- if (string.upper(mg.request_info.http_headers.Upgrade)~="WEBSOCKET") then error("") end | |
14 | --end) | |
15 | end | |
16 | ||
17 | trace("called with Lua type " .. tostring(mg.lua_type)) | |
18 | ||
19 | if not iswebsocket() then | |
20 | trace("no websocket") | |
21 | mg.write("HTTP/1.0 403 Forbidden\r\n") | |
22 | mg.write("Connection: close\r\n") | |
23 | mg.write("\r\n") | |
24 | mg.write("forbidden") | |
25 | return | |
26 | end | |
27 | ||
28 | ||
29 | -- Serialize table to string | |
30 | function ser(val) | |
31 | local t | |
32 | if type(val) == "table" then | |
33 | for k,v in pairs(val) do | |
34 | if t then | |
35 | t = t .. ", " .. ser(k) .. "=" .. ser(v) | |
36 | else | |
37 | t = "{" .. ser(k) .. "=" .. ser(v) | |
38 | end | |
39 | end | |
40 | t = t .. "}" | |
41 | else | |
42 | t = tostring(val) | |
43 | end | |
44 | return t | |
45 | end | |
46 | ||
47 | -- table of all active connection | |
48 | allConnections = {} | |
49 | ||
50 | -- function to get a client identification string | |
51 | function who(tab) | |
52 | local ri = allConnections[tab.client].request_info | |
53 | return ri.remote_addr .. ":" .. ri.remote_port | |
54 | end | |
55 | ||
56 | -- Callback to accept or reject a connection | |
57 | function open(tab) | |
58 | allConnections[tab.client] = tab | |
59 | trace("open[" .. who(tab) .. "]: " .. ser(tab)) | |
60 | return true -- return true to accept the connection | |
61 | end | |
62 | ||
63 | -- Callback for "Websocket ready" | |
64 | function ready(tab) | |
65 | trace("ready[" .. who(tab) .. "]: " .. ser(tab)) | |
66 | mg.write(tab.client, "text", "Websocket ready") | |
67 | mg.write(tab.client, 1, "-->h 180"); | |
68 | mg.write(tab.client, "-->m 180"); | |
69 | senddata() | |
70 | if timerID == "timeout" then | |
71 | mg.set_timeout("timer()", 1) | |
72 | elseif timerID == "interval" then | |
73 | mg.set_interval("timer()", 1) | |
74 | end | |
75 | return true -- return true to keep the connection open | |
76 | end | |
77 | ||
78 | -- Callback for "Websocket received data" | |
79 | function data(tab) | |
80 | trace("data[" .. who(tab) .. "]: " .. ser(tab)) | |
81 | senddata() | |
82 | return true -- return true to keep the connection open | |
83 | end | |
84 | ||
85 | -- Callback for "Websocket is closing" | |
86 | function close(tab) | |
87 | trace("close[" .. who(tab) .. "]: " .. ser(tab)) | |
88 | mg.write("text", "end") | |
89 | allConnections[tab.client] = nil | |
90 | end | |
91 | ||
92 | function senddata() | |
93 | local date = os.date('*t'); | |
94 | local hand = (date.hour%12)*60+date.min; | |
95 | ||
96 | mg.write("text", string.format("%u:%02u:%02u", date.hour, date.min, date.sec)); | |
97 | ||
98 | if (hand ~= lasthand) then | |
99 | mg.write(1, string.format("-->h %u", hand*360/(12*60))); | |
100 | mg.write( string.format("-->m %u", date.min*360/60)); | |
101 | lasthand = hand; | |
102 | end | |
103 | ||
104 | if bits and content then | |
105 | data(bits, content) | |
106 | end | |
107 | end | |
108 | ||
109 | function timer() | |
110 | trace("timer") | |
111 | senddata() | |
112 | if timerID == "timeout" then | |
113 | mg.set_timeout("timer()", 1) | |
114 | else | |
115 | return true -- return true to keep an interval timer running | |
116 | end | |
117 | end | |
118 |