64 lines
1.7 KiB
Lua
64 lines
1.7 KiB
Lua
|
|
collectgarbage("setmemlimit", 4)
|
|
websocket.createServer(80, function (socket)
|
|
local data
|
|
node.output(function (msg)
|
|
return socket.send(msg, 1)
|
|
end, 1)
|
|
print("New websocket client connected")
|
|
|
|
function socket.onmessage(payload, opcode)
|
|
if opcode == 1 then
|
|
if payload == "ls" then
|
|
local list = file.list()
|
|
local lines = {}
|
|
for k, v in pairs(list) do
|
|
lines[#lines + 1] = k .. "\0" .. v
|
|
end
|
|
socket.send(table.concat(lines, "\0"), 2)
|
|
return
|
|
-- standard js websockets do not support ping/pong opcodes so we have to
|
|
-- fake it
|
|
elseif payload == "ping" then
|
|
socket.send("pong", 2)
|
|
return
|
|
end
|
|
local command, name = payload:match("^([a-z]+):(.*)$")
|
|
if command == "load" then
|
|
file.open(name, "r")
|
|
socket.send(file.read(), 2)
|
|
file.close()
|
|
elseif command == "save" then
|
|
file.open(name, "w")
|
|
file.write(data)
|
|
data = nil
|
|
file.close()
|
|
print("saved:"..name)
|
|
elseif command == "compile" then
|
|
node.compile(name)
|
|
print("compiled:"..name)
|
|
elseif command == "run" then
|
|
dofile(name)
|
|
elseif command == "eval" then
|
|
local fn, success, err
|
|
fn, err = loadstring(data, name)
|
|
if not fn then
|
|
fn = loadstring("print(" .. data .. ")", name)
|
|
end
|
|
data = nil
|
|
if fn then
|
|
success, err = pcall(fn)
|
|
end
|
|
if not success then
|
|
print(err)
|
|
end
|
|
else
|
|
print("Invalid command: " .. command)
|
|
end
|
|
elseif opcode == 2 then
|
|
data = payload
|
|
end
|
|
collectgarbage("setmemlimit", 4)
|
|
end
|
|
end)
|