|
|
|
|
@ -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")
|
|
|
|
|
|