import { ReasonCodes } from './ack' import TopicAliasSend from '../topic-alias-send' import { ErrorWithReasonCode, PacketHandler } from '../shared' import { IConnackPacket } from 'mqtt-packet' const handleConnack: PacketHandler = (client, packet: IConnackPacket) => { client.log('_handleConnack') const { options } = client const version = options.protocolVersion const rc = version === 5 ? packet.reasonCode : packet.returnCode clearTimeout(client['connackTimer']) delete client['topicAliasSend'] if (packet.properties) { if (packet.properties.topicAliasMaximum) { if (packet.properties.topicAliasMaximum > 0xffff) { client.emit( 'error', new Error('topicAliasMaximum from broker is out of range'), ) return } if (packet.properties.topicAliasMaximum > 0) { client['topicAliasSend'] = new TopicAliasSend( packet.properties.topicAliasMaximum, ) } } if (packet.properties.serverKeepAlive && options.keepalive) { options.keepalive = packet.properties.serverKeepAlive } if (packet.properties.maximumPacketSize) { if (!options.properties) { options.properties = {} } options.properties.maximumPacketSize = packet.properties.maximumPacketSize } } if (rc === 0) { client.reconnecting = false client['_onConnect'](packet) } else if (rc > 0) { const err = new ErrorWithReasonCode( `Connection refused: ${ReasonCodes[rc]}`, rc, ) client.emit('error', err) if (client.options.reconnectOnConnackError) { client['_cleanUp'](true) } } } export default handleConnack