You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
3.6 KiB
144 lines
3.6 KiB
'use strict' |
|
|
|
var http = require('http') |
|
var websocket = require('websocket-stream') |
|
var WebSocketServer = require('ws').Server |
|
var Connection = require('mqtt-connection') |
|
var abstractClientTests = require('./abstract_client') |
|
var mqtt = require('../') |
|
var xtend = require('xtend') |
|
var assert = require('assert') |
|
var port = 9999 |
|
var server = http.createServer() |
|
|
|
function attachWebsocketServer (wsServer) { |
|
var wss = new WebSocketServer({server: wsServer, perMessageDeflate: false}) |
|
|
|
wss.on('connection', function (ws) { |
|
var stream = websocket(ws) |
|
var connection = new Connection(stream) |
|
|
|
wsServer.emit('client', connection) |
|
stream.on('error', function () {}) |
|
connection.on('error', function () {}) |
|
}) |
|
|
|
return wsServer |
|
} |
|
|
|
attachWebsocketServer(server) |
|
|
|
server.on('client', function (client) { |
|
client.on('connect', function (packet) { |
|
if (packet.clientId === 'invalid') { |
|
client.connack({ returnCode: 2 }) |
|
} else { |
|
server.emit('connect', client) |
|
client.connack({returnCode: 0}) |
|
} |
|
}) |
|
|
|
client.on('publish', function (packet) { |
|
setImmediate(function () { |
|
switch (packet.qos) { |
|
case 0: |
|
break |
|
case 1: |
|
client.puback(packet) |
|
break |
|
case 2: |
|
client.pubrec(packet) |
|
break |
|
} |
|
}) |
|
}) |
|
|
|
client.on('pubrel', function (packet) { |
|
client.pubcomp(packet) |
|
}) |
|
|
|
client.on('pubrec', function (packet) { |
|
client.pubrel(packet) |
|
}) |
|
|
|
client.on('pubcomp', function () { |
|
// Nothing to be done |
|
}) |
|
|
|
client.on('subscribe', function (packet) { |
|
client.suback({ |
|
messageId: packet.messageId, |
|
granted: packet.subscriptions.map(function (e) { |
|
return e.qos |
|
}) |
|
}) |
|
}) |
|
|
|
client.on('unsubscribe', function (packet) { |
|
client.unsuback(packet) |
|
}) |
|
|
|
client.on('pingreq', function () { |
|
client.pingresp() |
|
}) |
|
}).listen(port) |
|
|
|
describe('Websocket Client', function () { |
|
var baseConfig = { protocol: 'ws', port: port } |
|
|
|
function makeOptions (custom) { |
|
// xtend returns a new object. Does not mutate arguments |
|
return xtend(baseConfig, custom || {}) |
|
} |
|
|
|
it('should use mqtt as the protocol by default', function (done) { |
|
server.once('client', function (client) { |
|
client.stream.socket.protocol.should.equal('mqtt') |
|
}) |
|
mqtt.connect(makeOptions()).on('connect', function () { |
|
this.end(true, done) |
|
}) |
|
}) |
|
|
|
it('should be able transform the url (for e.g. to sign it)', function (done) { |
|
var baseUrl = 'ws://localhost:9999/mqtt' |
|
var sig = '?AUTH=token' |
|
var expected = baseUrl + sig |
|
var actual |
|
var opts = makeOptions({ |
|
path: '/mqtt', |
|
transformWsUrl: function (url, opt, client) { |
|
assert.equal(url, baseUrl) |
|
assert.strictEqual(opt, opts) |
|
assert.strictEqual(client.options, opts) |
|
assert.strictEqual(typeof opt.transformWsUrl, 'function') |
|
assert(client instanceof mqtt.MqttClient) |
|
url += sig |
|
actual = url |
|
return url |
|
}}) |
|
mqtt.connect(opts) |
|
.on('connect', function () { |
|
assert.equal(this.stream.socket.url, expected) |
|
assert.equal(actual, expected) |
|
this.end(true, done) |
|
}) |
|
}) |
|
|
|
it('should use mqttv3.1 as the protocol if using v3.1', function (done) { |
|
server.once('client', function (client) { |
|
client.stream.socket.protocol.should.equal('mqttv3.1') |
|
}) |
|
|
|
var opts = makeOptions({ |
|
protocolId: 'MQIsdp', |
|
protocolVersion: 3 |
|
}) |
|
|
|
mqtt.connect(opts).on('connect', function () { |
|
this.end(true, done) |
|
}) |
|
}) |
|
|
|
abstractClientTests(server, makeOptions()) |
|
})
|
|
|