snax : a simple skynet auxliliary framework

This commit is contained in:
Cloud Wu
2014-04-16 20:12:17 +08:00
parent a420fe498f
commit df5c619a29
6 changed files with 235 additions and 22 deletions

98
lualib/snax.lua Normal file
View File

@@ -0,0 +1,98 @@
local skynet = require "skynet"
local snax_interface = require "snax_interface"
local snax = {}
local typeclass = {}
local G = { require = function() end }
function snax.interface(name)
if typeclass[name] then
return typeclass[name]
end
local si = snax_interface(name, G)
local ret = {
subscribe = {},
response = {},
system = {},
}
for _,v in ipairs(si) do
local id, group, name, f = table.unpack(v)
if group == "system" then
if f then
ret.system[name] = id
end
else
ret[group][name] = id
end
end
typeclass[name] = ret
return ret
end
local meta = { __tostring = function(v) return string.format("[%s:%x]", v.type, v.handle) end}
local skynet_send = skynet.send
local skynet_call = skynet.call
local function gen_pub(type, handle)
return setmetatable({} , {
__index = function( t, k )
local id = assert(type.subscribe[k] , string.format("publish %s no exist", k))
return function(...)
skynet_send(handle, "lua", id, ...)
end
end })
end
local function gen_req(type, handle)
return setmetatable({} , {
__index = function( t, k )
local id = assert(type.response[k] , string.format("request %s no exist", k))
return function(...)
return skynet_call(handle, "lua", id, ...)
end
end })
end
local function wrapper(handle, name, type)
return setmetatable ({
pub = gen_pub(type, handle),
req = gen_req(type, handle),
type = name,
handle = handle,
kill = function(...) return skynet_call(handle, "lua", type.system.exit, ...) end,
}, meta)
end
local handle_cache = setmetatable( {} , { __mode = "kv" } )
function snax.newservice(name, ...)
local t = snax.interface(name)
local handle = skynet.newservice("snaxd", name)
assert(handle_cache[handle] == nil)
if t.system.init then
skynet.call(handle, "lua", t.system.init, ...)
end
local ret = wrapper(handle, name, t)
handle_cache[handle] = ret
return ret
end
function snax.bind(handle, type)
local ret = handle_cache[handle]
if ret then
assert(ret.type == type)
return ret
end
local t = snax.interface(type)
ret = wrapper(handle, type, t)
handle_cache[handle] = ret
return ret
end
return snax