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