@seriousme/opifex 1.9.3 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -26
- package/bin/conformanceServer.ts +3 -2
- package/bin/demoServer.ts +3 -2
- package/bin/mqtt.ts +126 -117
- package/client/client.ts +35 -15
- package/client/context.ts +42 -22
- package/client/deps.ts +5 -0
- package/client/handlers/handleConnack.ts +17 -5
- package/client/handlers/handlePublish.ts +4 -1
- package/client/handlers/handlePubrec.ts +3 -1
- package/client/handlers/handlePubrel.ts +3 -1
- package/client/handlers/handleSuback.ts +3 -1
- package/client/mod.ts +8 -1
- package/client/store/memoryStore.ts +2 -1
- package/dev_utils/dummyConn.ts +17 -2
- package/dist/bin/conformanceServer.js +3 -2
- package/dist/bin/conformanceServer.js.map +1 -1
- package/dist/bin/demoServer.js +3 -2
- package/dist/bin/demoServer.js.map +1 -1
- package/dist/bin/mqtt.d.ts +29 -0
- package/dist/bin/mqtt.d.ts.map +1 -1
- package/dist/bin/mqtt.js +101 -96
- package/dist/bin/mqtt.js.map +1 -1
- package/dist/client/client.d.ts +7 -4
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +17 -9
- package/dist/client/client.js.map +1 -1
- package/dist/client/context.d.ts +3 -1
- package/dist/client/context.d.ts.map +1 -1
- package/dist/client/context.js +27 -13
- package/dist/client/context.js.map +1 -1
- package/dist/client/deps.d.ts +3 -2
- package/dist/client/deps.d.ts.map +1 -1
- package/dist/client/deps.js +2 -1
- package/dist/client/deps.js.map +1 -1
- package/dist/client/handlers/handleConnack.d.ts +1 -1
- package/dist/client/handlers/handleConnack.d.ts.map +1 -1
- package/dist/client/handlers/handleConnack.js +14 -5
- package/dist/client/handlers/handleConnack.js.map +1 -1
- package/dist/client/handlers/handlePublish.d.ts +1 -1
- package/dist/client/handlers/handlePublish.d.ts.map +1 -1
- package/dist/client/handlers/handlePublish.js +2 -0
- package/dist/client/handlers/handlePublish.js.map +1 -1
- package/dist/client/handlers/handlePubrec.d.ts +1 -1
- package/dist/client/handlers/handlePubrec.d.ts.map +1 -1
- package/dist/client/handlers/handlePubrec.js +1 -0
- package/dist/client/handlers/handlePubrec.js.map +1 -1
- package/dist/client/handlers/handlePubrel.d.ts +1 -1
- package/dist/client/handlers/handlePubrel.d.ts.map +1 -1
- package/dist/client/handlers/handlePubrel.js +1 -0
- package/dist/client/handlers/handlePubrel.js.map +1 -1
- package/dist/client/handlers/handleSuback.d.ts.map +1 -1
- package/dist/client/handlers/handleSuback.js +3 -1
- package/dist/client/handlers/handleSuback.js.map +1 -1
- package/dist/client/mod.d.ts +3 -1
- package/dist/client/mod.d.ts.map +1 -1
- package/dist/client/mod.js +2 -1
- package/dist/client/mod.js.map +1 -1
- package/dist/client/store/memoryStore.d.ts +1 -1
- package/dist/client/store/memoryStore.d.ts.map +1 -1
- package/dist/client/store/memoryStore.js.map +1 -1
- package/dist/mqttConn/mqttConn.d.ts +13 -8
- package/dist/mqttConn/mqttConn.d.ts.map +1 -1
- package/dist/mqttConn/mqttConn.js +27 -12
- package/dist/mqttConn/mqttConn.js.map +1 -1
- package/dist/mqttPacket/PacketType.d.ts +1 -0
- package/dist/mqttPacket/PacketType.d.ts.map +1 -1
- package/dist/mqttPacket/PacketType.js +1 -0
- package/dist/mqttPacket/PacketType.js.map +1 -1
- package/dist/mqttPacket/Properties.d.ts +157 -0
- package/dist/mqttPacket/Properties.d.ts.map +1 -0
- package/dist/mqttPacket/Properties.js +177 -0
- package/dist/mqttPacket/Properties.js.map +1 -0
- package/dist/mqttPacket/ReasonCode.d.ts +74 -0
- package/dist/mqttPacket/ReasonCode.d.ts.map +1 -0
- package/dist/mqttPacket/ReasonCode.js +230 -0
- package/dist/mqttPacket/ReasonCode.js.map +1 -0
- package/dist/mqttPacket/RetainHandling.d.ts +12 -0
- package/dist/mqttPacket/RetainHandling.d.ts.map +1 -0
- package/dist/mqttPacket/RetainHandling.js +12 -0
- package/dist/mqttPacket/RetainHandling.js.map +1 -0
- package/dist/mqttPacket/auth.d.ts +21 -0
- package/dist/mqttPacket/auth.d.ts.map +1 -0
- package/dist/mqttPacket/auth.js +34 -0
- package/dist/mqttPacket/auth.js.map +1 -0
- package/dist/mqttPacket/connack.d.ts +15 -7
- package/dist/mqttPacket/connack.d.ts.map +1 -1
- package/dist/mqttPacket/connack.js +43 -15
- package/dist/mqttPacket/connack.js.map +1 -1
- package/dist/mqttPacket/connect.d.ts +27 -8
- package/dist/mqttPacket/connect.d.ts.map +1 -1
- package/dist/mqttPacket/connect.js +106 -30
- package/dist/mqttPacket/connect.js.map +1 -1
- package/dist/mqttPacket/decoder.d.ts +42 -3
- package/dist/mqttPacket/decoder.d.ts.map +1 -1
- package/dist/mqttPacket/decoder.js +135 -4
- package/dist/mqttPacket/decoder.js.map +1 -1
- package/dist/mqttPacket/disconnect.d.ts +13 -7
- package/dist/mqttPacket/disconnect.d.ts.map +1 -1
- package/dist/mqttPacket/disconnect.js +45 -6
- package/dist/mqttPacket/disconnect.js.map +1 -1
- package/dist/mqttPacket/encoder.d.ts +57 -8
- package/dist/mqttPacket/encoder.d.ts.map +1 -1
- package/dist/mqttPacket/encoder.js +185 -13
- package/dist/mqttPacket/encoder.js.map +1 -1
- package/dist/mqttPacket/length.d.ts.map +1 -1
- package/dist/mqttPacket/length.js +3 -2
- package/dist/mqttPacket/length.js.map +1 -1
- package/dist/mqttPacket/mod.d.ts +56 -91
- package/dist/mqttPacket/mod.d.ts.map +1 -1
- package/dist/mqttPacket/mod.js +22 -22
- package/dist/mqttPacket/mod.js.map +1 -1
- package/dist/mqttPacket/pingreq.d.ts +4 -6
- package/dist/mqttPacket/pingreq.d.ts.map +1 -1
- package/dist/mqttPacket/pingreq.js +5 -4
- package/dist/mqttPacket/pingreq.js.map +1 -1
- package/dist/mqttPacket/pingres.d.ts +4 -6
- package/dist/mqttPacket/pingres.d.ts.map +1 -1
- package/dist/mqttPacket/pingres.js +7 -5
- package/dist/mqttPacket/pingres.js.map +1 -1
- package/dist/mqttPacket/protocolLevels.d.ts +11 -0
- package/dist/mqttPacket/protocolLevels.d.ts.map +1 -0
- package/dist/mqttPacket/protocolLevels.js +11 -0
- package/dist/mqttPacket/protocolLevels.js.map +1 -0
- package/dist/mqttPacket/pubblishAcks.d.ts +35 -0
- package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -0
- package/dist/mqttPacket/pubblishAcks.js +56 -0
- package/dist/mqttPacket/pubblishAcks.js.map +1 -0
- package/dist/mqttPacket/publish.d.ts +19 -8
- package/dist/mqttPacket/publish.d.ts.map +1 -1
- package/dist/mqttPacket/publish.js +26 -7
- package/dist/mqttPacket/publish.js.map +1 -1
- package/dist/mqttPacket/suback.d.ts +14 -7
- package/dist/mqttPacket/suback.d.ts.map +1 -1
- package/dist/mqttPacket/suback.js +41 -20
- package/dist/mqttPacket/suback.js.map +1 -1
- package/dist/mqttPacket/subscribe.d.ts +24 -9
- package/dist/mqttPacket/subscribe.d.ts.map +1 -1
- package/dist/mqttPacket/subscribe.js +71 -15
- package/dist/mqttPacket/subscribe.js.map +1 -1
- package/dist/mqttPacket/types.d.ts +33 -0
- package/dist/mqttPacket/types.d.ts.map +1 -1
- package/dist/mqttPacket/unsuback.d.ts +14 -7
- package/dist/mqttPacket/unsuback.d.ts.map +1 -1
- package/dist/mqttPacket/unsuback.js +29 -6
- package/dist/mqttPacket/unsuback.js.map +1 -1
- package/dist/mqttPacket/unsubscribe.d.ts +14 -7
- package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
- package/dist/mqttPacket/unsubscribe.js +24 -8
- package/dist/mqttPacket/unsubscribe.js.map +1 -1
- package/dist/node/wrapNodeSocket.d.ts.map +1 -1
- package/dist/node/wrapNodeSocket.js.map +1 -1
- package/dist/persistence/deps.d.ts +1 -1
- package/dist/persistence/deps.d.ts.map +1 -1
- package/dist/persistence/deps.js +1 -1
- package/dist/persistence/deps.js.map +1 -1
- package/dist/server/context.d.ts +3 -1
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +8 -2
- package/dist/server/context.js.map +1 -1
- package/dist/server/deps.d.ts +2 -2
- package/dist/server/deps.d.ts.map +1 -1
- package/dist/server/deps.js +1 -1
- package/dist/server/deps.js.map +1 -1
- package/dist/server/handlers/handleConnect.d.ts +1 -1
- package/dist/server/handlers/handleConnect.d.ts.map +1 -1
- package/dist/server/handlers/handleConnect.js +9 -1
- package/dist/server/handlers/handleConnect.js.map +1 -1
- package/dist/server/handlers/handlePacket.d.ts +1 -1
- package/dist/server/handlers/handlePacket.d.ts.map +1 -1
- package/dist/server/handlers/handlePacket.js +1 -1
- package/dist/server/handlers/handlePacket.js.map +1 -1
- package/dist/server/handlers/handlePingreq.d.ts.map +1 -1
- package/dist/server/handlers/handlePingreq.js +1 -0
- package/dist/server/handlers/handlePingreq.js.map +1 -1
- package/dist/server/handlers/handlePublish.d.ts +2 -2
- package/dist/server/handlers/handlePublish.d.ts.map +1 -1
- package/dist/server/handlers/handlePublish.js +2 -0
- package/dist/server/handlers/handlePublish.js.map +1 -1
- package/dist/server/handlers/handlePubrec.d.ts +1 -1
- package/dist/server/handlers/handlePubrec.d.ts.map +1 -1
- package/dist/server/handlers/handlePubrec.js +1 -0
- package/dist/server/handlers/handlePubrec.js.map +1 -1
- package/dist/server/handlers/handlePubrel.d.ts +1 -1
- package/dist/server/handlers/handlePubrel.d.ts.map +1 -1
- package/dist/server/handlers/handlePubrel.js +1 -0
- package/dist/server/handlers/handlePubrel.js.map +1 -1
- package/dist/server/handlers/handleSubscribe.d.ts +1 -1
- package/dist/server/handlers/handleSubscribe.d.ts.map +1 -1
- package/dist/server/handlers/handleSubscribe.js +2 -1
- package/dist/server/handlers/handleSubscribe.js.map +1 -1
- package/dist/server/handlers/handleUnsubscribe.d.ts +1 -1
- package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -1
- package/dist/server/handlers/handleUnsubscribe.js +1 -0
- package/dist/server/handlers/handleUnsubscribe.js.map +1 -1
- package/dist/server/server.d.ts +2 -2
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +5 -3
- package/dist/server/server.js.map +1 -1
- package/dist/socket/socket.d.ts.map +1 -1
- package/dist/socket/socket.js +6 -1
- package/dist/socket/socket.js.map +1 -1
- package/dist/utils/assert.d.ts +0 -3
- package/dist/utils/assert.d.ts.map +1 -1
- package/dist/utils/assert.js +0 -7
- package/dist/utils/assert.js.map +1 -1
- package/dist/utils/mod.d.ts +0 -3
- package/dist/utils/mod.d.ts.map +1 -1
- package/dist/utils/mod.js +0 -2
- package/dist/utils/mod.js.map +1 -1
- package/mqttConn/mqttConn.test.ts +27 -12
- package/mqttConn/mqttConn.ts +45 -14
- package/mqttPacket/PacketType.ts +1 -0
- package/mqttPacket/Properties.ts +276 -0
- package/mqttPacket/ReasonCode.test.ts +22 -0
- package/mqttPacket/ReasonCode.ts +256 -0
- package/mqttPacket/RetainHandling.ts +11 -0
- package/mqttPacket/auth.test.ts +112 -0
- package/mqttPacket/auth.ts +72 -0
- package/mqttPacket/connack.test.ts +84 -64
- package/mqttPacket/connack.ts +84 -20
- package/mqttPacket/connect.test.ts +497 -18
- package/mqttPacket/connect.ts +167 -36
- package/mqttPacket/decoder.test.ts +33 -16
- package/mqttPacket/decoder.ts +173 -5
- package/mqttPacket/disconnect.test.ts +97 -18
- package/mqttPacket/disconnect.ts +82 -10
- package/mqttPacket/encoder.test.ts +32 -8
- package/mqttPacket/encoder.ts +236 -11
- package/mqttPacket/length.ts +3 -2
- package/mqttPacket/mod.ts +75 -32
- package/mqttPacket/pingreq.test.ts +52 -4
- package/mqttPacket/pingreq.ts +20 -7
- package/mqttPacket/pingres.test.ts +52 -4
- package/mqttPacket/pingres.ts +22 -8
- package/mqttPacket/properties.test.ts +193 -0
- package/mqttPacket/protocolLevels.ts +13 -0
- package/mqttPacket/pubblishAcks.ts +117 -0
- package/mqttPacket/publish.test.ts +212 -133
- package/mqttPacket/publish.ts +69 -14
- package/mqttPacket/publishAcks.test.ts +128 -0
- package/mqttPacket/suback.test.ts +71 -27
- package/mqttPacket/suback.ts +78 -26
- package/mqttPacket/subscribe.test.ts +132 -43
- package/mqttPacket/subscribe.ts +125 -22
- package/mqttPacket/types.ts +40 -0
- package/mqttPacket/unsuback.test.ts +80 -30
- package/mqttPacket/unsuback.ts +65 -10
- package/mqttPacket/unsubscribe.test.ts +59 -34
- package/mqttPacket/unsubscribe.ts +61 -14
- package/node/wrapNodeSocket.ts +2 -1
- package/package.json +2 -2
- package/persistence/deps.ts +1 -1
- package/persistence/memory/memoryPersistence.test.ts +5 -1
- package/server/context.ts +23 -10
- package/server/deps.ts +2 -0
- package/server/handlers/handleConnect.ts +12 -9
- package/server/handlers/handlePacket.ts +10 -11
- package/server/handlers/handlePingreq.ts +1 -0
- package/server/handlers/handlePublish.ts +6 -2
- package/server/handlers/handlePubrec.ts +3 -1
- package/server/handlers/handlePubrel.ts +3 -1
- package/server/handlers/handleSubscribe.ts +3 -6
- package/server/handlers/handleUnsubscribe.ts +3 -1
- package/server/server.ts +8 -12
- package/server/test/handleConnect.test.ts +2 -1
- package/server/test/test-handlers.ts +2 -1
- package/socket/socket.ts +5 -1
- package/utils/assert.ts +0 -18
- package/utils/mod.ts +0 -3
- package/dist/mqttPacket/puback.d.ts +0 -16
- package/dist/mqttPacket/puback.d.ts.map +0 -1
- package/dist/mqttPacket/puback.js +0 -21
- package/dist/mqttPacket/puback.js.map +0 -1
- package/dist/mqttPacket/pubcomp.d.ts +0 -17
- package/dist/mqttPacket/pubcomp.d.ts.map +0 -1
- package/dist/mqttPacket/pubcomp.js +0 -21
- package/dist/mqttPacket/pubcomp.js.map +0 -1
- package/dist/mqttPacket/pubrec.d.ts +0 -17
- package/dist/mqttPacket/pubrec.d.ts.map +0 -1
- package/dist/mqttPacket/pubrec.js +0 -21
- package/dist/mqttPacket/pubrec.js.map +0 -1
- package/dist/mqttPacket/pubrel.d.ts +0 -17
- package/dist/mqttPacket/pubrel.d.ts.map +0 -1
- package/dist/mqttPacket/pubrel.js +0 -21
- package/dist/mqttPacket/pubrel.js.map +0 -1
- package/dist/utils/args.d.ts +0 -28
- package/dist/utils/args.d.ts.map +0 -1
- package/dist/utils/args.js +0 -76
- package/dist/utils/args.js.map +0 -1
- package/dist/utils/platform.d.ts +0 -5
- package/dist/utils/platform.d.ts.map +0 -1
- package/dist/utils/platform.js +0 -8
- package/dist/utils/platform.js.map +0 -1
- package/mqttPacket/puback.test.ts +0 -55
- package/mqttPacket/puback.ts +0 -34
- package/mqttPacket/pubcomp.test.ts +0 -55
- package/mqttPacket/pubcomp.ts +0 -35
- package/mqttPacket/pubrec.test.ts +0 -55
- package/mqttPacket/pubrec.ts +0 -35
- package/mqttPacket/pubrel.test.ts +0 -55
- package/mqttPacket/pubrel.ts +0 -35
- package/utils/args.ts +0 -103
- package/utils/platform.ts +0 -8
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*RetainHandling
|
|
3
|
+
0 = Send retained messages at the time of the subscribe
|
|
4
|
+
1 = Send retained messages at subscribe only if the subscription does not currently exist
|
|
5
|
+
2 = Do not send retained messages at the time of the subscribe
|
|
6
|
+
*/
|
|
7
|
+
export const RetainHandling = {
|
|
8
|
+
sendRetained: 0,
|
|
9
|
+
ifSubscriptionNotExists: 1,
|
|
10
|
+
noRetain: 2,
|
|
11
|
+
} as const;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { decode, encode, MQTTLevel, PacketType, ReasonCode } from "./mod.ts";
|
|
4
|
+
import type { AuthPacket, CodecOpts } from "./mod.ts";
|
|
5
|
+
|
|
6
|
+
const codecOptsV5: CodecOpts = {
|
|
7
|
+
protocolLevel: MQTTLevel.v5,
|
|
8
|
+
maxIncomingPacketSize: 0xffff,
|
|
9
|
+
maxOutgoingPacketSize: 0xffff,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const codecOptsV4: CodecOpts = {
|
|
13
|
+
protocolLevel: MQTTLevel.v4,
|
|
14
|
+
maxIncomingPacketSize: 0xffff,
|
|
15
|
+
maxOutgoingPacketSize: 0xffff,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
test("decode Auth V5 with invalid reasonCode", () => {
|
|
19
|
+
assert.throws(
|
|
20
|
+
() =>
|
|
21
|
+
decode(
|
|
22
|
+
Uint8Array.from([
|
|
23
|
+
// fixedHeader
|
|
24
|
+
0x20, // packetType + flags
|
|
25
|
+
2, // remainingLength
|
|
26
|
+
// variableHeader
|
|
27
|
+
0, // reason code
|
|
28
|
+
64, // (reserved)
|
|
29
|
+
]),
|
|
30
|
+
codecOptsV5,
|
|
31
|
+
),
|
|
32
|
+
/Invalid reason code/,
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("decode Auth V5 as V4", () => {
|
|
37
|
+
assert.throws(
|
|
38
|
+
() =>
|
|
39
|
+
decode(
|
|
40
|
+
Uint8Array.from([
|
|
41
|
+
// fixedHeader
|
|
42
|
+
0xf0, // packetType + flags
|
|
43
|
+
2, // remainingLength
|
|
44
|
+
// variableHeader
|
|
45
|
+
0, // reason code
|
|
46
|
+
0, // properties length
|
|
47
|
+
]),
|
|
48
|
+
codecOptsV4,
|
|
49
|
+
),
|
|
50
|
+
/Invalid protocol level/,
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("encode/decode minimal auth V5", () => {
|
|
55
|
+
const packet = {
|
|
56
|
+
protocolLevel: MQTTLevel.v5,
|
|
57
|
+
type: PacketType.auth,
|
|
58
|
+
reasonCode: ReasonCode.success,
|
|
59
|
+
};
|
|
60
|
+
const encoded = encode(packet, codecOptsV5);
|
|
61
|
+
assert.deepStrictEqual(
|
|
62
|
+
encoded,
|
|
63
|
+
Uint8Array.from([
|
|
64
|
+
// fixedHeader
|
|
65
|
+
|
|
66
|
+
0xf0, // auth packet + flags
|
|
67
|
+
2, // remaining length
|
|
68
|
+
0, // reason code
|
|
69
|
+
0, // property length
|
|
70
|
+
]),
|
|
71
|
+
);
|
|
72
|
+
const decoded = decode(encoded, codecOptsV5);
|
|
73
|
+
assert.deepStrictEqual(decoded, { ...packet, properties: {} });
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("encode/decode auth V5", () => {
|
|
77
|
+
const packet: AuthPacket = {
|
|
78
|
+
protocolLevel: 5,
|
|
79
|
+
type: PacketType.auth,
|
|
80
|
+
reasonCode: ReasonCode.continueAuthentication,
|
|
81
|
+
properties: {
|
|
82
|
+
userProperty: [["key", "value"]],
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
const encoded = encode(packet, codecOptsV5);
|
|
86
|
+
assert.deepStrictEqual(
|
|
87
|
+
encoded,
|
|
88
|
+
Uint8Array.from([
|
|
89
|
+
// fixedHeader
|
|
90
|
+
|
|
91
|
+
0xf0, // auth packet + flags
|
|
92
|
+
15, // remaining length
|
|
93
|
+
24, // reason code
|
|
94
|
+
13, // property length
|
|
95
|
+
38, // user property
|
|
96
|
+
0, // string MSB
|
|
97
|
+
3, // string LSB
|
|
98
|
+
107, // k
|
|
99
|
+
101, // e
|
|
100
|
+
121, // y
|
|
101
|
+
0, // string MSB
|
|
102
|
+
5, // string LSB
|
|
103
|
+
118, // v
|
|
104
|
+
97, // a
|
|
105
|
+
108, // l
|
|
106
|
+
117, // u
|
|
107
|
+
101, // e
|
|
108
|
+
]),
|
|
109
|
+
);
|
|
110
|
+
const decoded = decode(encoded, codecOptsV5);
|
|
111
|
+
assert.deepStrictEqual(decoded, packet);
|
|
112
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { CodecOpts, TPacketType } from "./types.ts";
|
|
2
|
+
import { PacketType } from "./PacketType.ts";
|
|
3
|
+
import { Encoder, EncoderError } from "./encoder.ts";
|
|
4
|
+
import { Decoder, DecoderError, hasEmptyFlags } from "./decoder.ts";
|
|
5
|
+
import type { TReasonCode } from "./ReasonCode.ts";
|
|
6
|
+
import type { AuthProperties } from "./Properties.ts";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* An AUTH packet is sent from Client to Server or Server to Client as part of an extended
|
|
10
|
+
* authentication exchange, such as challenge / response authentication.
|
|
11
|
+
* It is a Protocol Error for the Client or Server to send an AUTH packet
|
|
12
|
+
* if the CONNECT packet did not contain the same Authentication Method.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
// AuthPacket does not exist on protocol levels < 5
|
|
16
|
+
export type AuthPacketV5 = {
|
|
17
|
+
type: TPacketType;
|
|
18
|
+
protocolLevel: 5;
|
|
19
|
+
reasonCode: TReasonCode;
|
|
20
|
+
properties?: AuthProperties;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type AuthPacket = AuthPacketV5;
|
|
24
|
+
|
|
25
|
+
export const auth: {
|
|
26
|
+
encode(packet: AuthPacket, codecOpts: CodecOpts): Uint8Array;
|
|
27
|
+
decode(
|
|
28
|
+
buffer: Uint8Array,
|
|
29
|
+
flags: number,
|
|
30
|
+
codecOpts: CodecOpts,
|
|
31
|
+
packetType: TPacketType,
|
|
32
|
+
): AuthPacket;
|
|
33
|
+
} = {
|
|
34
|
+
encode(packet: AuthPacket, codecOpts: CodecOpts): Uint8Array {
|
|
35
|
+
if (packet.protocolLevel !== 5) {
|
|
36
|
+
throw new EncoderError("Invalid protocol level");
|
|
37
|
+
}
|
|
38
|
+
const encoder = new Encoder(packet.type);
|
|
39
|
+
encoder
|
|
40
|
+
.setReasonCode(packet.reasonCode || 0)
|
|
41
|
+
.setProperties(
|
|
42
|
+
packet.properties || {},
|
|
43
|
+
packet.type,
|
|
44
|
+
codecOpts.maxOutgoingPacketSize,
|
|
45
|
+
);
|
|
46
|
+
return encoder.done(0);
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
decode(
|
|
50
|
+
buffer: Uint8Array,
|
|
51
|
+
flags: number,
|
|
52
|
+
codecOpts: CodecOpts,
|
|
53
|
+
packetType: TPacketType,
|
|
54
|
+
): AuthPacket {
|
|
55
|
+
// Bits 3,2,1 and 0 of the Fixed Header of the AUTH packet are reserved and MUST all be set to 0.
|
|
56
|
+
// The Client or Server MUST treat any other value as malformed and close the Network Connection [MQTT-3.15.1-1].
|
|
57
|
+
hasEmptyFlags(flags);
|
|
58
|
+
if (codecOpts.protocolLevel !== 5) {
|
|
59
|
+
throw new DecoderError("Invalid protocol level");
|
|
60
|
+
}
|
|
61
|
+
const decoder = new Decoder(packetType, buffer);
|
|
62
|
+
const reasonCode = decoder.getReasonCode();
|
|
63
|
+
const properties = decoder.getProperties(PacketType.auth);
|
|
64
|
+
decoder.done();
|
|
65
|
+
return {
|
|
66
|
+
type: PacketType.auth,
|
|
67
|
+
protocolLevel: 5,
|
|
68
|
+
reasonCode,
|
|
69
|
+
properties,
|
|
70
|
+
};
|
|
71
|
+
},
|
|
72
|
+
};
|
|
@@ -1,53 +1,53 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import { test } from "node:test";
|
|
3
|
-
import { decode, encode } from "./mod.ts";
|
|
4
|
-
import {
|
|
3
|
+
import { decode, encode, MQTTLevel, PacketType, ReasonCode } from "./mod.ts";
|
|
4
|
+
import type { CodecOpts, ConnackPacket } from "./mod.ts";
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
const codecOptsV4: CodecOpts = {
|
|
7
|
+
protocolLevel: MQTTLevel.v4,
|
|
8
|
+
maxIncomingPacketSize: 0xffff,
|
|
9
|
+
maxOutgoingPacketSize: 0xffff,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const codecOptsV5: CodecOpts = {
|
|
13
|
+
protocolLevel: MQTTLevel.v5,
|
|
14
|
+
maxIncomingPacketSize: 0xffff,
|
|
15
|
+
maxOutgoingPacketSize: 0xffff,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
test("encode/decode Connack packet v4", () => {
|
|
19
|
+
const packet = {
|
|
20
|
+
type: PacketType.connack,
|
|
21
|
+
protocolLevel: MQTTLevel.v4,
|
|
22
|
+
sessionPresent: false,
|
|
23
|
+
returnCode: 0,
|
|
24
|
+
};
|
|
25
|
+
const encoded = encode(packet, codecOptsV4);
|
|
7
26
|
assert.deepStrictEqual(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
sessionPresent: false,
|
|
11
|
-
returnCode: 0,
|
|
12
|
-
}),
|
|
13
|
-
Uint8Array.from([
|
|
27
|
+
encoded,
|
|
28
|
+
Uint8Array.from(Uint8Array.from([
|
|
14
29
|
// fixedHeader
|
|
15
30
|
0x20, // packetType + flags
|
|
16
31
|
2, // remainingLength
|
|
17
32
|
// variableHeader
|
|
18
33
|
0, // connack flags
|
|
19
34
|
0, // return code
|
|
20
|
-
]),
|
|
21
|
-
);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
test("decode Connack packet", () => {
|
|
25
|
-
assert.deepStrictEqual(
|
|
26
|
-
decode(
|
|
27
|
-
Uint8Array.from([
|
|
28
|
-
// fixedHeader
|
|
29
|
-
0x20, // packetType + flags
|
|
30
|
-
2, // remainingLength
|
|
31
|
-
// variableHeader
|
|
32
|
-
0, // connack flags
|
|
33
|
-
0, // return code
|
|
34
|
-
]),
|
|
35
|
-
),
|
|
36
|
-
{
|
|
37
|
-
type: PacketType.connack,
|
|
38
|
-
sessionPresent: false,
|
|
39
|
-
returnCode: 0,
|
|
40
|
-
},
|
|
35
|
+
])),
|
|
41
36
|
);
|
|
37
|
+
const decoded = decode(encoded, codecOptsV4);
|
|
38
|
+
assert.deepStrictEqual(decoded, packet);
|
|
42
39
|
});
|
|
43
40
|
|
|
44
|
-
test("encode Connack with session present", () => {
|
|
41
|
+
test("encode/decode Connack with session present v4", () => {
|
|
42
|
+
const packet = {
|
|
43
|
+
type: PacketType.connack,
|
|
44
|
+
protocolLevel: MQTTLevel.v4,
|
|
45
|
+
sessionPresent: true,
|
|
46
|
+
returnCode: 0,
|
|
47
|
+
};
|
|
48
|
+
const encoded = encode(packet, codecOptsV4);
|
|
45
49
|
assert.deepStrictEqual(
|
|
46
|
-
|
|
47
|
-
type: PacketType.connack,
|
|
48
|
-
sessionPresent: true,
|
|
49
|
-
returnCode: 0,
|
|
50
|
-
}),
|
|
50
|
+
encoded,
|
|
51
51
|
Uint8Array.from([
|
|
52
52
|
// fixedHeader
|
|
53
53
|
0x20, // packetType + flags
|
|
@@ -57,27 +57,8 @@ test("encode Connack with session present", () => {
|
|
|
57
57
|
0, // return code
|
|
58
58
|
]),
|
|
59
59
|
);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
test("decode Connack with session present", () => {
|
|
63
|
-
assert
|
|
64
|
-
.deepStrictEqual(
|
|
65
|
-
decode(
|
|
66
|
-
Uint8Array.from([
|
|
67
|
-
// fixedHeader
|
|
68
|
-
0x20, // packetType + flags
|
|
69
|
-
2, // remainingLength
|
|
70
|
-
// variableHeader
|
|
71
|
-
1, // connack flags (sessionPresent)
|
|
72
|
-
0, // return code
|
|
73
|
-
]),
|
|
74
|
-
),
|
|
75
|
-
{
|
|
76
|
-
type: PacketType.connack,
|
|
77
|
-
sessionPresent: true,
|
|
78
|
-
returnCode: 0,
|
|
79
|
-
},
|
|
80
|
-
);
|
|
60
|
+
const decoded = decode(encoded, codecOptsV4);
|
|
61
|
+
assert.deepStrictEqual(decoded, packet);
|
|
81
62
|
});
|
|
82
63
|
|
|
83
64
|
test("decode Connack with non-zero returnCode", () => {
|
|
@@ -91,8 +72,10 @@ test("decode Connack with non-zero returnCode", () => {
|
|
|
91
72
|
0, // connack flags
|
|
92
73
|
4, // return code (bad username or password)
|
|
93
74
|
]),
|
|
75
|
+
codecOptsV4,
|
|
94
76
|
),
|
|
95
77
|
{
|
|
78
|
+
protocolLevel: 4,
|
|
96
79
|
type: PacketType.connack,
|
|
97
80
|
sessionPresent: false,
|
|
98
81
|
returnCode: 4,
|
|
@@ -112,18 +95,55 @@ test("decode Connack with invalid returnCode", () => {
|
|
|
112
95
|
0, // connack flags
|
|
113
96
|
64, // return code (reserved)
|
|
114
97
|
]),
|
|
98
|
+
codecOptsV4,
|
|
115
99
|
),
|
|
116
|
-
|
|
117
|
-
"Invalid return code",
|
|
100
|
+
/Invalid return code/,
|
|
118
101
|
);
|
|
119
102
|
});
|
|
120
103
|
|
|
121
104
|
test("decode short Connack packets", () => {
|
|
122
105
|
assert.throws(
|
|
123
|
-
() => decode(Uint8Array.from([0x20])),
|
|
124
|
-
|
|
125
|
-
|
|
106
|
+
() => decode(Uint8Array.from([0x20]), codecOptsV4),
|
|
107
|
+
/decoding failed/,
|
|
108
|
+
);
|
|
109
|
+
assert.throws(
|
|
110
|
+
() => decode(Uint8Array.from([0x20, 2]), codecOptsV4),
|
|
111
|
+
/Packet too short/,
|
|
112
|
+
);
|
|
113
|
+
assert.throws(
|
|
114
|
+
() => decode(Uint8Array.from([0x20, 2, 0]), codecOptsV4),
|
|
115
|
+
/Packet too long/,
|
|
116
|
+
);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test("encode/decode connack v5", () => {
|
|
120
|
+
const packet: ConnackPacket = {
|
|
121
|
+
protocolLevel: 5,
|
|
122
|
+
type: PacketType.connack,
|
|
123
|
+
sessionPresent: false,
|
|
124
|
+
reasonCode: ReasonCode.badUserNameOrPassword,
|
|
125
|
+
properties: {
|
|
126
|
+
userProperty: [["key", "value"]],
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
const encoded = encode(packet, codecOptsV5);
|
|
130
|
+
const decoded = decode(encoded, codecOptsV5);
|
|
131
|
+
assert.deepStrictEqual(decoded, packet);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("encode/decode connack v5 as v4", () => {
|
|
135
|
+
const packet: ConnackPacket = {
|
|
136
|
+
protocolLevel: 5,
|
|
137
|
+
type: PacketType.connack,
|
|
138
|
+
sessionPresent: false,
|
|
139
|
+
reasonCode: ReasonCode.banned,
|
|
140
|
+
properties: {
|
|
141
|
+
userProperty: [["key", "value"]],
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
const encoded = encode(packet, codecOptsV4);
|
|
145
|
+
assert.throws(
|
|
146
|
+
() => decode(encoded, codecOptsV4),
|
|
147
|
+
/Packet too long/,
|
|
126
148
|
);
|
|
127
|
-
assert.throws(() => decode(Uint8Array.from([0x20, 2])), Error, "too short");
|
|
128
|
-
assert.throws(() => decode(Uint8Array.from([0x20, 2, 0])), Error, "too long");
|
|
129
149
|
});
|
package/mqttPacket/connack.ts
CHANGED
|
@@ -1,44 +1,108 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
CodecOpts,
|
|
3
|
+
ProtocolLevelNoV5,
|
|
4
|
+
TAuthenticationResult,
|
|
5
|
+
TPacketType,
|
|
6
|
+
} from "./types.ts";
|
|
2
7
|
import { PacketType } from "./PacketType.ts";
|
|
3
8
|
import { BitMask } from "./BitMask.ts";
|
|
4
|
-
import {
|
|
9
|
+
import { Encoder } from "./encoder.ts";
|
|
10
|
+
import {
|
|
11
|
+
booleanFlag,
|
|
12
|
+
Decoder,
|
|
13
|
+
DecoderError,
|
|
14
|
+
hasEmptyFlags,
|
|
15
|
+
} from "./decoder.ts";
|
|
5
16
|
import { AuthenticationResultByNumber } from "./AuthenticationResult.ts";
|
|
17
|
+
import type { TReasonCode } from "./ReasonCode.ts";
|
|
18
|
+
import type { ConnackProperties } from "./Properties.ts";
|
|
6
19
|
|
|
7
20
|
/**
|
|
8
21
|
* ConnackPacket is sent from the server to the client in response to a connect packet.
|
|
9
22
|
* It indicates that the connect is accepted.
|
|
10
23
|
*/
|
|
11
|
-
export type
|
|
24
|
+
export type ConnackPacketV4 = {
|
|
12
25
|
type: TPacketType;
|
|
26
|
+
protocolLevel: ProtocolLevelNoV5;
|
|
13
27
|
sessionPresent: boolean;
|
|
14
28
|
returnCode: TAuthenticationResult;
|
|
15
29
|
};
|
|
16
30
|
|
|
31
|
+
export type ConnackPacketV5 = {
|
|
32
|
+
type: TPacketType;
|
|
33
|
+
protocolLevel: 5;
|
|
34
|
+
sessionPresent: boolean;
|
|
35
|
+
reasonCode: TReasonCode;
|
|
36
|
+
properties?: ConnackProperties;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type ConnackPacket = ConnackPacketV4 | ConnackPacketV5;
|
|
40
|
+
|
|
17
41
|
export const connack: {
|
|
18
|
-
encode(packet: ConnackPacket
|
|
19
|
-
decode(
|
|
42
|
+
encode(packet: ConnackPacket, codecOpts: CodecOpts): Uint8Array;
|
|
43
|
+
decode(
|
|
44
|
+
buffer: Uint8Array,
|
|
45
|
+
flags: number,
|
|
46
|
+
codecOpts: CodecOpts,
|
|
47
|
+
packetType: TPacketType,
|
|
48
|
+
): ConnackPacket;
|
|
20
49
|
} = {
|
|
21
|
-
encode(packet: ConnackPacket
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
50
|
+
encode(packet: ConnackPacket, codecOpts: CodecOpts): Uint8Array {
|
|
51
|
+
if (packet.protocolLevel !== 5) {
|
|
52
|
+
return new Uint8Array([
|
|
53
|
+
packet.type << 4,
|
|
54
|
+
2,
|
|
55
|
+
packet.sessionPresent ? 1 : 0,
|
|
56
|
+
packet.returnCode || 0,
|
|
57
|
+
]);
|
|
58
|
+
}
|
|
59
|
+
const encoder = new Encoder(packet.type);
|
|
60
|
+
encoder
|
|
61
|
+
.setByte(packet.sessionPresent ? 1 : 0)
|
|
62
|
+
.setReasonCode(packet.reasonCode || 0)
|
|
63
|
+
.setProperties(
|
|
64
|
+
packet.properties || {},
|
|
65
|
+
packet.type,
|
|
66
|
+
codecOpts.maxOutgoingPacketSize,
|
|
67
|
+
);
|
|
68
|
+
return encoder.done(0);
|
|
27
69
|
},
|
|
28
70
|
|
|
29
|
-
decode(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
71
|
+
decode(
|
|
72
|
+
buffer: Uint8Array,
|
|
73
|
+
flags: number,
|
|
74
|
+
codecOpts: CodecOpts,
|
|
75
|
+
packetType: TPacketType,
|
|
76
|
+
): ConnackPacket {
|
|
77
|
+
const decoder = new Decoder(packetType, buffer);
|
|
78
|
+
hasEmptyFlags(flags);
|
|
79
|
+
const ackflags = decoder.getByte();
|
|
80
|
+
if (ackflags > 1) {
|
|
81
|
+
throw new DecoderError("Invalid Connect Acknowledge flags");
|
|
82
|
+
}
|
|
83
|
+
const sessionPresent = booleanFlag(ackflags, BitMask.bit0);
|
|
84
|
+
if (codecOpts.protocolLevel !== 5) {
|
|
85
|
+
const returnCode = decoder.getByte() as TAuthenticationResult;
|
|
86
|
+
decoder.done();
|
|
87
|
+
if (!AuthenticationResultByNumber[returnCode]) {
|
|
88
|
+
throw new DecoderError("Invalid return code");
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
type: PacketType.connack,
|
|
92
|
+
protocolLevel: codecOpts.protocolLevel,
|
|
93
|
+
sessionPresent,
|
|
94
|
+
returnCode,
|
|
95
|
+
};
|
|
37
96
|
}
|
|
97
|
+
const reasonCode = decoder.getReasonCode();
|
|
98
|
+
const properties = decoder.getProperties(PacketType.connack);
|
|
99
|
+
decoder.done();
|
|
38
100
|
return {
|
|
39
101
|
type: PacketType.connack,
|
|
102
|
+
protocolLevel: 5,
|
|
40
103
|
sessionPresent,
|
|
41
|
-
|
|
104
|
+
reasonCode,
|
|
105
|
+
properties,
|
|
42
106
|
};
|
|
43
107
|
},
|
|
44
108
|
};
|