MCP 3D Printer Server
by DMontgomery40
Verified
- node_modules
- mqtt
- src
- lib
- handlers
import { IPublishPacket } from 'mqtt-packet'
import { PacketHandler } from '../shared'
const validReasonCodes = [0, 16, 128, 131, 135, 144, 145, 151, 153]
/*
those late 2 case should be rewrite to comply with coding style:
case 1:
case 0:
// do not wait sending a puback
// no callback passed
if (1 === qos) {
this._sendPacket({
cmd: 'puback',
messageId: messageId
});
}
// emit the message event for both qos 1 and 0
this.emit('message', topic, message, packet);
this.handleMessage(packet, done);
break;
default:
// do nothing but every switch mus have a default
// log or throw an error about unknown qos
break;
for now i just suppressed the warnings
*/
const handlePublish: PacketHandler = (client, packet: IPublishPacket, done) => {
client.log('handlePublish: packet %o', packet)
done = typeof done !== 'undefined' ? done : client.noop
let topic = packet.topic.toString()
const message = packet.payload
const { qos } = packet
const { messageId } = packet
const { options } = client
if (client.options.protocolVersion === 5) {
let alias: number
if (packet.properties) {
alias = packet.properties.topicAlias
}
if (typeof alias !== 'undefined') {
if (topic.length === 0) {
if (alias > 0 && alias <= 0xffff) {
const gotTopic =
client['topicAliasRecv'].getTopicByAlias(alias)
if (gotTopic) {
topic = gotTopic
client.log(
'handlePublish :: topic complemented by alias. topic: %s - alias: %d',
topic,
alias,
)
} else {
client.log(
'handlePublish :: unregistered topic alias. alias: %d',
alias,
)
client.emit(
'error',
new Error('Received unregistered Topic Alias'),
)
return
}
} else {
client.log(
'handlePublish :: topic alias out of range. alias: %d',
alias,
)
client.emit(
'error',
new Error('Received Topic Alias is out of range'),
)
return
}
} else if (client['topicAliasRecv'].put(topic, alias)) {
client.log(
'handlePublish :: registered topic: %s - alias: %d',
topic,
alias,
)
} else {
client.log(
'handlePublish :: topic alias out of range. alias: %d',
alias,
)
client.emit(
'error',
new Error('Received Topic Alias is out of range'),
)
return
}
}
}
client.log('handlePublish: qos %d', qos)
switch (qos) {
case 2: {
options.customHandleAcks(
topic,
message as Buffer,
packet,
(error, code) => {
if (typeof error === 'number') {
code = error
error = null
}
if (error) {
return client.emit('error', error as Error)
}
if (validReasonCodes.indexOf(code) === -1) {
return client.emit(
'error',
new Error('Wrong reason code for pubrec'),
)
}
if (code) {
client['_sendPacket'](
{ cmd: 'pubrec', messageId, reasonCode: code },
done,
)
} else {
client.incomingStore.put(packet, () => {
client['_sendPacket'](
{ cmd: 'pubrec', messageId },
done,
)
})
}
},
)
break
}
case 1: {
// emit the message event
options.customHandleAcks(
topic,
message as Buffer,
packet,
(error, code) => {
if (typeof error === 'number') {
code = error
error = null
}
if (error) {
return client.emit('error', error as Error)
}
if (validReasonCodes.indexOf(code) === -1) {
return client.emit(
'error',
new Error('Wrong reason code for puback'),
)
}
if (!code) {
client.emit('message', topic, message as Buffer, packet)
}
client.handleMessage(packet, (err) => {
if (err) {
return done && done(err)
}
client['_sendPacket'](
{ cmd: 'puback', messageId, reasonCode: code },
done,
)
})
},
)
break
}
case 0:
// emit the message event
client.emit('message', topic, message as Buffer, packet)
client.handleMessage(packet, done)
break
default:
// do nothing
client.log('handlePublish: unknown QoS. Doing nothing.')
// log or throw an error about unknown qos
break
}
}
export default handlePublish