59 lines
1.1 KiB
Lua
59 lines
1.1 KiB
Lua
function lua_async.yield()
|
|
await(Promise(function(resolve)
|
|
setImmediate(resolve)
|
|
end))
|
|
end
|
|
|
|
function lua_async.sleep(ms)
|
|
await(Promise(function(resolve)
|
|
setTimeout(resolve, ms)
|
|
end))
|
|
end
|
|
|
|
function lua_async.kill_thread()
|
|
coroutine.yield(true)
|
|
end
|
|
|
|
function lua_async.resume(co)
|
|
local status, err = coroutine.resume(co)
|
|
|
|
if coroutine.status(co) == "dead" or err then
|
|
lua_async.limiting.unset_limit(co)
|
|
end
|
|
|
|
if not status then
|
|
error("Error (in async function): " .. err)
|
|
end
|
|
end
|
|
|
|
function lua_async.run()
|
|
assert(lua_async.socket)
|
|
local last_time = lua_async.clock()
|
|
|
|
while true do
|
|
local current_time = lua_async.clock()
|
|
local dtime = current_time - last_time
|
|
last_time = current_time
|
|
|
|
lua_async.step(dtime)
|
|
|
|
local next = math.huge
|
|
|
|
for _, timeout in pairs(lua_async.timeouts.pool) do
|
|
next = math.min(next, timeout.time_left)
|
|
end
|
|
|
|
for _, interval in pairs(lua_async.intervals.pool) do
|
|
next = math.min(next, interval.time_left)
|
|
end
|
|
|
|
if next == math.huge then
|
|
return
|
|
end
|
|
|
|
if next > dtime then
|
|
lua_async.socket.sleep(next - dtime)
|
|
end
|
|
end
|
|
end
|