Signed-off-by: Rahix <rahix@rahix.de>
dev
rahix 7 years ago
parent c3ce5b0ac8
commit 3c4920489a
Signed by: rahix
GPG Key ID: E3435E19257D6FCB

@ -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,
modem.send(remoteAddress, port, serializer.serialize({
ty=message_type.noun_response,
noun=message.noun,
value=o.local_nouns[message.noun]
}
modem.send(remoteAddress, port, serializer.serialize(msg))
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")

Loading…
Cancel
Save