70 lines
2.1 KiB
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
|