Barebone MQTT server that can run on any stream server.
To install aedes, simply use npm:
npm install aedes --save
var aedes = require('aedes')()
var server = require('net').createServer(aedes.handle)
var port = 1883
server.listen(port, function () {
console.log('server listening on port', port)
})aedes()instance.handle()instance.subscribe()instance.publish()instance.unsubscribe()instance.authenticate()instance.authorizePublish()instance.authorizeSubscribe()instance.published()instance.close()Clientclient.idclient.cleanclient.publish()client.subscribe()client.close()
Creates a new instance of Aedes.
Options:
mq: an instance of MQEmitter.persistence: an instance of AedesPersistence.concurrency: the max number of messages delivered concurrently, defaults to100.heartbeatInterval: the interval at which the broker heartbeat is emitted, it used by other broker in the cluster, the default is60000milliseconds.connectTimeout: the max number of milliseconds to wait for the CONNECT packet to arrive, defaults to30000milliseconds.
Events:
client: when a new Client connects, arguments:client
clientDisconnect: when a Client disconnects, arguments:client
clientError: when a Client errors, arguments:clienterr
publish: when a new packet is published, arguments:packetclient, it will be null if the message is published usingpublish.
subscribe: when a client sends a SUBSCRIBE, arguments:subscriptions, as defined in thesubscriptionsproperty of the SUBSCRIBE packet.client
unsubscribe: when a client sends a UNSUBSCRIBE, arguments:unsubscriptions, as defined in thesubscriptionsproperty of the UNSUBSCRIBE packet.client
Handle the given duplex as a MQTT connection.
var aedes = require('./aedes')()
var server = require('net').createServer(aedes.handle)After done is called, every time publish is invoked on the
instance (and on any other connected instances) with a matching topic the func function will be called.
func needs to call cb after receiving the message.
It supports backpressure.
Publish the given packet to subscribed clients and functions. A packet must be valid for mqtt-packet.
It supports backpressure.
The reverse of subscribe.
It will be called when a new client connects. Ovverride to supply custom authentication logic.
instance.authenticate = function (client, username, password, callback) {
callback(null, username === 'matteo')
}It will be called when a client publishes a message. Override to supply custom authorization logic.
instance.authorizePublish = function (client, packet, callback) {
if (packet.topic === 'aaaa') {
return callback(new Error('wrong topic'))
}
if (packet.topic === 'bbb') {
packet.payload = new Buffer('overwrite packet payload')
}
callback(null)
}It will be called when a client publishes a message. Override to supply custom authorization logic.
instance.authorizeSubscribe = function (client, sub, cb) {
if (sub.topic === 'aaaa') {
return cb(new Error('wrong topic'))
}
if (sub.topic === 'bbb') {
// overwrites subscription
sub.qos = sub.qos + 128
}
callback(null, sub)
}It will be after a message is published.
client will be null for internal messages.
Ovverride to supply custom authorization logic.
Disconnects all clients.
Classes for all connected clients.
Events:
error, in case something bad happended
The id of the client, as specified by the CONNECT packet.
true if the client connected (CONNECT) with clean: true, false
otherwise. Check the MQTT spec for what this means.
Publish the given message to this client. QoS 1 and 2 are fully
respected, while the retained flag is not.
message is a PUBLISH packet.
callback will be called when the message has been sent, but not acked.
Subscribe the client to the list of topics.
subscription can be:
- a single object in the format
{ topic: topic, qos: qos } - an array of the above
- a full subscribe
packet,
specifying a
messageIdwill send suback to the client.
callback will be called when the subscription is completed.
Disconnects the client
- QoS 0 support
- Retain messages support
- QoS 1 support
- QoS 2 support
- clean=false support
- Keep alive support
- Will messages must survive crash
- Authentication
- Events
- Wait a CONNECT packet only for X seconds
- Support a CONNECT packet without a clientId
- Disconnect other clients with the same client.id
- Write docs
- Support counting the number of offline clients and subscriptions
- Performance optimizations for QoS 1 and Qos 2
- Add
client#publish()andclient#subscribe() - move the persistence in a separate module
- mongo persistence (external module)
- redis persistence (external module)
- leveldb persistence (external module)
- cluster support (external module)
This library is born after a lot of discussion with all Mosca users, and how that was deployed in production. This addresses your concerns about performance and stability.
MIT