msgflo
Version:
Polyglot FBP runtime based on message queues
104 lines (86 loc) • 2.84 kB
text/coffeescript
debug = require('debug')('msgflo:mqtt')
mqtt = require 'mqtt'
interfaces = require './interfaces'
routing = require './routing'
class Client
constructor: (, ) ->
= null
= {} # queueName -> [handler1, ...]
## Broker connection management
connect: (callback) ->
= mqtt.connect
onConnected = (err) =>
debug 'connected'
.on 'message', (topic, message) =>
topic, message
return callback err
.once 'connect', onConnected
disconnect: (callback) ->
.removeAllListeners 'message'
.removeAllListeners 'connect'
= {}
.end (err) =>
debug 'disconnected'
= null
return callback err
## Manipulating queues
createQueue: (type, queueName, callback) ->
# Noop, in MQTT one can send messages on 'topics' at any time
return callback null
removeQueue: (type, queueName, callback) ->
# Noop, in MQTT one can send messages on 'topics' at any time
return callback null
## Sending/Receiving messages
sendToQueue: (queueName, message, callback) ->
published = (err, granted) =>
debug 'published', err, granted
return callback err if err
return callback null
data = JSON.stringify message
debug 'publishing', queueName, data
.publish queueName, data, published
subscribeToQueue: (queueName, handler, callback) ->
debug 'subscribing', queueName
.subscribe queueName, (err) =>
debug 'subscribed', queueName, err
return callback err if err
subs = [queueName]
if subs then subs.push handler else [queueName] = [ handler ]
return callback null
## ACK/NACK messages
ackMessage: (message) ->
return
nackMessage: (message) ->
return
_onMessage: (topic, message) ->
return if not
return if not Object.keys().length > 0
msg = null
try
msg = JSON.parse message.toString()
catch e
debug 'JSON parse exception:', e
handlers = [topic]
debug 'message', handlers.length, msg != null
return if not msg or not handlers
out =
data: msg
mqtt: message
for handler in handlers
handler out
registerParticipant: (part, callback) ->
msg =
protocol: 'discovery'
command: 'participant'
payload: part
'fbp', msg, callback
class MessageBroker extends Client
constructor: (address, options) ->
super address, options
routing.binderMixin this
# Participant registration
subscribeParticipantChange: (handler) ->
'', 'fbp', (err) =>
'fbp', handler, () ->
exports.Client = Client
exports.MessageBroker = MessageBroker