Description
After digging a little bit on the library, found what it seems a bug, or at least a miss-documentation. It has mainly affectations on 5.0.
const client = mqttCon(stream, {
protocolVersion: 5,
protocolId: 'MQTT',
});
console.log(client.options);
Outputs undefined
.
const client = mqttCon(stream);
client.setOptions({
protocolVersion: 5,
protocolId: 'MQTT',
});
console.log(client.options);
Outputs { protocolVersion: 5, protocolId: 'MQTT' }
.
const client = mqttCon(stream);
client.setOptions({
protocolVersion: 5,
protocolId: 'MQTT',
});
client.on('connect', () => {
console.log(client.options);
});
Outputs:
Packet {
cmd: 'connect',
retain: false,
qos: 0,
...
const client = mqttCon(stream);
client.setOptions({
protocolVersion: 5,
protocolId: 'MQTT',
});
client.on('connack', () => {
console.log(client.options);
});
Outputs:
Packet {
cmd: 'connack',
retain: false,
qos: 0,
...
This has a big implication, as it causes errors on subscriptions (cannot subscribe as topic cannot be decoded) and also on publish events receives payloads with extra 00 byte at the begining, corresponding to undecoded properties:
Server is sending the content with the space for properties but client is not consuming them, so there are some bytes not being consumed and being left in payload.
Also on the contrary, the client sends a packet with properties bytes codified, and then server is not consuming the properties so they remain in payload, making payload to be displaced so cannot be correctly decoded:
from parser.js:
// Properties mqtt 5
if (this.settings.protocolVersion === 5) {
var properties = this._parseProperties()
if (Object.getOwnPropertyNames(properties).length) {
packet.properties = properties
}
}
The other point is that options are being overridden by connectPacket
in connection.js