| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- 'use strict'
-
- var Buffer = require('safe-buffer').Buffer
-
- /* Protocol - protocol constants */
- var protocol = module.exports
-
- /* Command code => mnemonic */
- protocol.types = {
- 0: 'reserved',
- 1: 'connect',
- 2: 'connack',
- 3: 'publish',
- 4: 'puback',
- 5: 'pubrec',
- 6: 'pubrel',
- 7: 'pubcomp',
- 8: 'subscribe',
- 9: 'suback',
- 10: 'unsubscribe',
- 11: 'unsuback',
- 12: 'pingreq',
- 13: 'pingresp',
- 14: 'disconnect',
- 15: 'reserved'
- }
-
- /* Mnemonic => Command code */
- protocol.codes = {}
- for (var k in protocol.types) {
- var v = protocol.types[k]
- protocol.codes[v] = k
- }
-
- /* Header */
- protocol.CMD_SHIFT = 4
- protocol.CMD_MASK = 0xF0
- protocol.DUP_MASK = 0x08
- protocol.QOS_MASK = 0x03
- protocol.QOS_SHIFT = 1
- protocol.RETAIN_MASK = 0x01
-
- /* Length */
- protocol.LENGTH_MASK = 0x7F
- protocol.LENGTH_FIN_MASK = 0x80
-
- /* Connack */
- protocol.SESSIONPRESENT_MASK = 0x01
- protocol.SESSIONPRESENT_HEADER = Buffer.from([protocol.SESSIONPRESENT_MASK])
- protocol.CONNACK_HEADER = Buffer.from([protocol.codes['connack'] << protocol.CMD_SHIFT])
-
- /* Connect */
- protocol.USERNAME_MASK = 0x80
- protocol.PASSWORD_MASK = 0x40
- protocol.WILL_RETAIN_MASK = 0x20
- protocol.WILL_QOS_MASK = 0x18
- protocol.WILL_QOS_SHIFT = 3
- protocol.WILL_FLAG_MASK = 0x04
- protocol.CLEAN_SESSION_MASK = 0x02
- protocol.CONNECT_HEADER = Buffer.from([protocol.codes['connect'] << protocol.CMD_SHIFT])
-
- function genHeader (type) {
- return [0, 1, 2].map(function (qos) {
- return [0, 1].map(function (dup) {
- return [0, 1].map(function (retain) {
- var buf = new Buffer(1)
- buf.writeUInt8(
- protocol.codes[type] << protocol.CMD_SHIFT |
- (dup ? protocol.DUP_MASK : 0) |
- qos << protocol.QOS_SHIFT | retain, 0, true)
- return buf
- })
- })
- })
- }
-
- /* Publish */
- protocol.PUBLISH_HEADER = genHeader('publish')
-
- /* Subscribe */
- protocol.SUBSCRIBE_HEADER = genHeader('subscribe')
-
- /* Unsubscribe */
- protocol.UNSUBSCRIBE_HEADER = genHeader('unsubscribe')
-
- /* Confirmations */
- protocol.ACKS = {
- unsuback: genHeader('unsuback'),
- puback: genHeader('puback'),
- pubcomp: genHeader('pubcomp'),
- pubrel: genHeader('pubrel'),
- pubrec: genHeader('pubrec')
- }
-
- protocol.SUBACK_HEADER = Buffer.from([protocol.codes['suback'] << protocol.CMD_SHIFT])
-
- /* Protocol versions */
- protocol.VERSION3 = Buffer.from([3])
- protocol.VERSION4 = Buffer.from([4])
-
- /* QoS */
- protocol.QOS = [0, 1, 2].map(function (qos) {
- return Buffer.from([qos])
- })
-
- /* Empty packets */
- protocol.EMPTY = {
- pingreq: Buffer.from([protocol.codes['pingreq'] << 4, 0]),
- pingresp: Buffer.from([protocol.codes['pingresp'] << 4, 0]),
- disconnect: Buffer.from([protocol.codes['disconnect'] << 4, 0])
- }
|