diff --git a/bc.lua b/bc.lua index 52d9af579aec..2c5f3f0565c2 100644 --- a/bc.lua +++ b/bc.lua @@ -59,26 +59,30 @@ local CFG_PORT = 1234 local bc = {} function bc:init(local_nouns, local_verbs) - local local_nouns = local_nouns or {} - local local_verbs = local_verbs or {} - local o = {} + local o = { + local_nouns = local_nouns or {}, + local_verbs = local_verbs or {}, + + remote_verbs = {}, + remote_nouns = {}, + + local_listeners = {}, + remote_listeners = {}, + listening_remotes = {}, + } setmetatable(o, self) self.__index = self - o.remote_verbs = {} - o.remote_nouns = {} - o.local_listeners = {} - o.remote_listeners = {} - o.listening_remotes = {} + -- Modem listener function modem_listener(moden_msg, localAddress, remoteAddress, port, dist, message) local message = serializer.unserialize(message) if port == CFG_PORT then if message.ty == message_type.request_noun then - local msg = {ty=message_type.noun_response, - noun=message.noun, - value=o.local_nouns[message.noun] - } - modem.send(remoteAddress, port, serializer.serialize(msg)) + modem.send(remoteAddress, port, serializer.serialize({ + ty=message_type.noun_response, + noun=message.noun, + value=o.local_nouns[message.noun], + })) elseif message.ty == message_type.noun_response then -- Ignore, this is handled via pull elseif message.ty == message_type.call_verb then @@ -87,6 +91,7 @@ function bc:init(local_nouns, local_verbs) for i,verb in ipairs(message.verbs) do o.remote_verbs[verb] = remoteAddress end + for i,noun in ipairs(message.nouns) do o.remote_nouns[noun] = remoteAddress -- Check for potential dormant listeners @@ -111,7 +116,12 @@ function bc:init(local_nouns, local_verbs) for verb in pairs(o.local_verbs) do table.insert(myverbs, verb) end - modem.send(remoteAddress, port, serializer.serialize({ty=message_type.hello_response, verbs=myverbs, nouns=mynouns})) + + modem.send(remoteAddress, port, serializer.serialize({ + ty=message_type.hello_response, + verbs=myverbs, + nouns=mynouns, + })) elseif message.ty == message_type.hello_response then for i,verb in ipairs(message.verbs) do o.remote_verbs[verb] = remoteAddress @@ -130,24 +140,29 @@ function bc:init(local_nouns, local_verbs) end end end + -- Setup connections modem.open(CFG_PORT) event.listen("modem_message", modem_listener) + -- Save listener function for deinit o.modem_cb = modem_listener - -- Init local stuff - o.local_verbs = local_verbs - o.local_nouns = local_nouns + -- Send own nouns and verbs and request all remotes to send theirs local mynouns = {} - for noun in pairs(local_nouns) do + for noun in pairs(o.local_nouns) do table.insert(mynouns, noun) end local myverbs = {} - for verb in pairs(local_verbs) do + for verb in pairs(o.local_verbs) do table.insert(myverbs, verb) end - modem.broadcast(CFG_PORT, serializer.serialize({ty=message_type.hello, verbs=myverbs, nouns=mynouns})) + modem.broadcast(CFG_PORT, serializer.serialize({ + ty=message_type.hello, + verbs=myverbs, + nouns=mynouns, + })) + return o end @@ -155,7 +170,10 @@ function bc:get_noun(n) if self.local_nouns[n] ~= nil then -- This noun is local, makes it easy return self.local_nouns[n] elseif self.remote_nouns[n] ~= nil then -- This noun is remote - modem.send(self.remote_nouns[n], CFG_PORT, serializer.serialize({ty=message_type.request_noun, noun=n})) + modem.send(self.remote_nouns[n], CFG_PORT, serializer.serialize({ + ty=message_type.request_noun, + noun=n, + })) local i = 0 while i < 5 do local _, _, remoteAddr, port, _, msg = event.pull("modem_message") @@ -226,7 +244,11 @@ function bc:call_verb(v, param) self.local_verbs[v](self, param) return true elseif self.remote_verbs[v] ~= nil then - modem.send(self.remote_verbs[v], CFG_PORT, serializer.serialize({ty=message_type.call_verb, verb=v, param=param})) + modem.send(self.remote_verbs[v], CFG_PORT, serializer.serialize({ + ty=message_type.call_verb, + verb=v, + param=param, + })) return true else return false @@ -240,18 +262,36 @@ end function bc:listen_noun(n, query, qparam, callback) if self.local_nouns[n] ~= nil then -- Local listening self.local_listeners[n] = self.local_listeners[n] or List:new() - local id = self.local_listeners[n]:insert({query=query, qparam=qparam, callback=callback}) + local id = self.local_listeners[n]:insert({ + query=query, + qparam=qparam, + callback=callback, + }) return id elseif self.remote_nouns[n] ~= nil then -- Remote listening self.remote_listeners[n] = self.remote_listeners[n] or List:new() - local id = self.remote_listeners[n]:insert({query=query, qparam=qparam, callback=callback}) + local id = self.remote_listeners[n]:insert({ + query=query, + qparam=qparam, + callback=callback, + }) -- Request remote listening - modem.send(self.remote_nouns[n], CFG_PORT, serializer.serialize({ty=message_type.request_listening, noun=n, query=query, qparam=qparam, id=id})) + modem.send(self.remote_nouns[n], CFG_PORT, serializer.serialize({ + ty=message_type.request_listening, + noun=n, + query=query, + qparam=qparam, + id=id, + })) return id else -- Install it, with hope, that the node will come online later self.remote_listeners[n] = self.remote_listeners[n] or List:new() - local id = self.remote_listeners[n]:insert({query=query, qparam=qparam, callback=callback}) + local id = self.remote_listeners[n]:insert({ + query=query, + qparam=qparam, + callback=callback, + }) return id end end @@ -264,7 +304,11 @@ function bc:listen_cancel(n, id) elseif self.remote_nouns[n] ~= nil then -- Remote listening if self.remote_listeners[n] ~= nil then self.remote_listeners[n]:remove(id) - modem.send(self.remote_nouns[n], CFG_PORT, serializer.serialize({ty=message_type.request_stop_listening, noun=n, id=id})) + modem.send(self.remote_nouns[n], CFG_PORT, serializer.serialize({ + ty=message_type.request_stop_listening, + noun=n, + id=id, + })) end else error("Trying to cancel non existing listener")