import type { CodecOpts, PacketId } from "./types.ts"; import type { ProtocolLevelNoV5 } from "./protocolLevels.ts"; import type { UnsubackProperties } from "./Properties.ts"; import type { ReasonCode } from "./ReasonCode.ts"; import { PacketType } from "./PacketType.ts"; import { Decoder, hasEmptyFlags } from "./decoder.ts"; import { Encoder } from "./encoder.ts"; export type UnsubackPacketV4 = { type: PacketType; protocolLevel: ProtocolLevelNoV5; id: PacketId; }; export type UnsubackPacketV5 = { type: PacketType; protocolLevel: 5; id: PacketId; properties: UnsubackProperties; reasonCodes: Array; }; /** * UnsubackPacket is sent by the server to the client to confirm receipt * of an UnsubscribePacket. */ export type UnsubackPacket = UnsubackPacketV4 | UnsubackPacketV5; export function encode( packet: UnsubackPacket, codecOpts: CodecOpts, ): Uint8Array { const flags = 0; const encoder = new Encoder(packet.type); encoder.setInt16(packet.id); if (packet.protocolLevel === 5) { encoder.setProperties( packet.properties || {}, PacketType.unsuback, codecOpts.maxOutgoingPacketSize, ); for (const reasonCode of packet.reasonCodes) { encoder.setByte(reasonCode); } } return encoder.done(flags); } export function decode( buffer: Uint8Array, flags: number, codecOpts: CodecOpts, packetType: PacketType, ): UnsubackPacket { hasEmptyFlags(flags); const decoder = new Decoder(packetType, buffer); const id = decoder.getInt16(); if (codecOpts.protocolLevel === 5) { const properties = decoder.getProperties(PacketType.unsuback); const reasonCodes = []; while (!decoder.atEnd()) { const reasonCode = decoder.geReasonCode(); reasonCodes.push(reasonCode); } return { type: PacketType.unsuback, protocolLevel: 5, id, properties, reasonCodes: reasonCodes as Array, }; } decoder.done(); return { type: PacketType.unsuback, protocolLevel: codecOpts.protocolLevel, id, }; }