import handlePublish from './publish' import handleAuth from './auth' import handleConnack from './connack' import handleAck from './ack' import handlePubrel from './pubrel' import { PacketHandler } from '../shared' const handle: PacketHandler = (client, packet, done) => { const { options } = client if ( options.protocolVersion === 5 && options.properties && options.properties.maximumPacketSize && options.properties.maximumPacketSize < packet.length ) { client.emit('error', new Error(`exceeding packets size ${packet.cmd}`)) client.end({ reasonCode: 149, properties: { reasonString: 'Maximum packet size was exceeded' }, }) return client } client.log('_handlePacket :: emitting packetreceive') client.emit('packetreceive', packet) switch (packet.cmd) { case 'publish': // DO NOT SHIFT PING HERE, this would lead to https://github.com/mqttjs/MQTT.js/issues/1861 handlePublish(client, packet, done) break case 'puback': case 'pubrec': case 'pubcomp': case 'suback': case 'unsuback': client.reschedulePing() handleAck(client, packet) done() break case 'pubrel': client.reschedulePing() handlePubrel(client, packet, done) break case 'connack': // no need to reschedule ping here as keepalive manager is created after successll connect // (when onConnect is called at the end of handleConnack) handleConnack(client, packet) done() break case 'auth': client.reschedulePing() handleAuth(client, packet) done() break case 'pingresp': client.log('_handlePacket :: received pingresp') client.reschedulePing(true) done() break case 'disconnect': client.emit('disconnect', packet) done() break default: // TODO: unknown packet received. Should we emit an error? client.log('_handlePacket :: unknown command') done() break } } export default handle