aboutsummaryrefslogtreecommitdiff
path: root/util.lua
blob: 3af0ffdb69aeda81dee1e18bb18160f7e8ee11a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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