Skip to content

Commit 62afd00

Browse files
committed
feat: 🎸 add pubrel packet
1 parent 7628d48 commit 62afd00

File tree

3 files changed

+84
-1
lines changed

3 files changed

+84
-1
lines changed

‎src/MqttDecoder.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {PacketConnect, parseConnect} from './packets/connect';
55
import {PacketPublish, parsePublish} from './packets/publish';
66
import {PacketPuback, parsePuback} from './packets/puback';
77
import {PacketPubrec, parsePubrec} from './packets/pubrec';
8+
import {PacketPubrel, parsePubrel} from './packets/pubrel';
89

910
export class MqttDecoder {
1011
public state: DECODER_STATE = DECODER_STATE.HEADER;
@@ -32,7 +33,7 @@ export class MqttDecoder {
3233
this.list = new BufferList();
3334
}
3435

35-
public parse(): null | PacketConnect | PacketConnack | PacketPublish | PacketPuback | PacketPubrec {
36+
public parse(): null | PacketConnect | PacketConnack | PacketPublish | PacketPuback | PacketPubrec | PacketPubrel {
3637
this.parseFixedHeader();
3738
const data = this.parseVariableData();
3839
if (!data) return null;
@@ -62,6 +63,10 @@ export class MqttDecoder {
6263
const packet = parsePubrec(b, l, data, this.version);
6364
return packet;
6465
}
66+
case PACKET_TYPE.PUBREL: {
67+
const packet = parsePubrel(b, l, data, this.version);
68+
return packet;
69+
}
6570
default: {
6671
return null;
6772
}

‎src/__tests__/MqttDecoder.spec.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,3 +246,43 @@ describe('PUBREC', () => {
246246
});
247247
});
248248
});
249+
250+
describe('PUBREL', () => {
251+
it('parses MQTT 3.1.1 packet', () => {
252+
const decoder = new MqttDecoder();
253+
decoder.push(Buffer.from([
254+
98, 2, // Header
255+
0, 2 // Message ID
256+
]));
257+
const packet: PacketPubrec = decoder.parse() as PacketPubrec;
258+
expect(packet.b).toBe(98);
259+
expect(packet.l).toBe(2);
260+
expect(packet.i).toBe(2);
261+
expect(packet.c).toBe(0);
262+
expect(packet.p).toEqual({});
263+
});
264+
265+
it('parses MQTT 5 properties', () => {
266+
const decoder = new MqttDecoder();
267+
decoder.version = 5;
268+
decoder.push(Buffer.from([
269+
98, 24, // Header
270+
0, 2, // Message ID
271+
16, // reason code
272+
20, // properties length
273+
31, 0, 4, 116, 101, 115, 116, // reasonString
274+
38, 0, 4, 116, 101, 115, 116, 0, 4, 116, 101, 115, 116 // userProperties
275+
]));
276+
const packet: PacketPubrec = decoder.parse() as PacketPubrec;
277+
expect(packet.b).toBe(98);
278+
expect(packet.l).toBe(24);
279+
expect(packet.i).toBe(2);
280+
expect(packet.c).toBe(16);
281+
expect(packet.p).toEqual({
282+
[PROPERTY.ReasonString]: 'test',
283+
[PROPERTY.UserProperty]: [
284+
['test', 'test'],
285+
],
286+
});
287+
});
288+
});

‎src/packets/pubrel.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import BufferList from 'bl';
2+
import {Packet, PacketHeaderData} from '../packet';
3+
import {Properties} from '../types';
4+
import {parseProps} from '../util/parse';
5+
6+
export interface PacketPubrelData extends PacketHeaderData {
7+
/** Packet Identifier. */
8+
i: number;
9+
/** PUBREL Reason Code. */
10+
c: number;
11+
/** Properties. */
12+
p: Properties;
13+
}
14+
15+
export class PacketPubrel extends Packet implements PacketPubrelData {
16+
constructor(
17+
b: number,
18+
l: number,
19+
public i: number,
20+
public c: number,
21+
public p: Properties,
22+
) {
23+
super(b, l);
24+
}
25+
}
26+
27+
export const parsePubrel = (b: number, l: number, data: BufferList, version: number): PacketPubrel => {
28+
const i = data.readUInt16BE(0);
29+
let c: number = 0;
30+
let p: Properties = {};
31+
if (version === 5) {
32+
c = data.readUInt8(2);
33+
if (l > 3) {
34+
[p] = parseProps(data, 3);
35+
}
36+
}
37+
return new PacketPubrel(b, l, i, c, p);
38+
};

0 commit comments

Comments
 (0)