HomeServer/lualib/skynet/service.lua

45 lines
933 B
Lua
Raw Normal View History

2024-11-20 15:41:09 +08:00
local skynet = require "skynet"
local service = {}
local cache = {}
local provider
local function get_provider()
provider = provider or skynet.uniqueservice "service_provider"
return provider
end
local function check(func)
local info = debug.getinfo(func, "u")
assert(info.nups == 1)
assert(debug.getupvalue(func,1) == "_ENV")
end
function service.new(name, mainfunc, ...)
local p = get_provider()
local addr, booting = skynet.call(p, "lua", "test", name)
local address
if addr then
address = addr
else
if booting then
address = skynet.call(p, "lua", "query", name)
else
check(mainfunc)
local code = string.dump(mainfunc)
address = skynet.call(p, "lua", "launch", name, code, ...)
end
end
cache[name] = address
return address
end
function service.query(name)
if not cache[name] then
cache[name] = skynet.call(get_provider(), "lua", "query", name)
end
return cache[name]
end
return service