cc-libs/programs/router.lua

70 lines
2.1 KiB
Lua

local firstArg = ...;
if firstArg == '-version' or firstArg == '--version' then
print('v' .. require('/apis/libversion')().forSelf());
return;
end
if firstArg == '-help' or firstArg == '--help' then
print('Usage: router [-silent|--silent]');
print('Enables routing on this machine. Registers handlers on the boot eventloop.');
return;
end
local silent = (firstArg == '-silent' or firstArg == '--silent');
local printVerbose = silent and function() end or print;
local createEventLoop = require('/apis/eventloop');
local createNet = require('/apis/net');
local createRouter = require('/apis/librouter');
local ownsLoop = false;
if not _G.bootEventLoop then
_G.bootEventLoop = createEventLoop();
ownsLoop = true;
end
local net = createNet();
net.setRouter(true);
local router = createRouter();
net.listen('router.register', function(payload, packet)
if type(payload) ~= 'table' or type(payload.label) ~= 'string' then return end
local ok = router.register(payload.label, packet.sourceId);
if ok then
printVerbose("router: registered '" .. payload.label .. "' -> " .. tostring(packet.sourceId));
else
printVerbose("router: duplicate label '" .. payload.label .. "' from id " .. tostring(packet.sourceId));
end
end);
net.onUnrouted(function(packet)
if type(packet.destId) == 'string' then
local id = router.resolve(packet.destId);
if id then
packet.destId = id;
else
printVerbose("router: unknown label '" .. tostring(packet.destId) .. "' (dropping)");
return;
end
end
if packet.destId then
printVerbose("router: " .. tostring(packet.sourceId) .. " -> " .. tostring(packet.destId)
.. " [" .. tostring(packet.service) .. "/" .. tostring(packet.kind) .. "]");
else
printVerbose("router: " .. tostring(packet.sourceId) .. " broadcast"
.. " [" .. tostring(packet.service) .. "/" .. tostring(packet.kind) .. "]");
end
net.rebroadcast(packet);
end);
printVerbose('router v' .. require('/apis/libversion')().forSelf()
.. ' started on bus channel ' .. tostring(net.BUS_CHANNEL));
if ownsLoop then
_G.bootEventLoop.startLoop();
end