@seriousme/opifex 1.7.0 → 1.8.0
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 +17 -2
- package/dist/bin/conformanceServer.d.ts +3 -0
- package/dist/bin/conformanceServer.d.ts.map +1 -0
- package/dist/bin/conformanceServer.js +98 -0
- package/dist/bin/conformanceServer.js.map +1 -0
- package/dist/bin/demoServer.d.ts +3 -0
- package/dist/bin/demoServer.d.ts.map +1 -0
- package/dist/bin/demoServer.js +97 -0
- package/dist/bin/demoServer.js.map +1 -0
- package/dist/bin/mqtt.d.ts +3 -0
- package/dist/bin/mqtt.d.ts.map +1 -0
- package/dist/bin/mqtt.js +257 -0
- package/dist/bin/mqtt.js.map +1 -0
- package/dist/client/ConnectionState.d.ts +21 -0
- package/dist/client/ConnectionState.d.ts.map +1 -0
- package/dist/client/ConnectionState.js +17 -0
- package/dist/client/ConnectionState.js.map +1 -0
- package/dist/client/client.d.ts +94 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +188 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/context.d.ts +29 -0
- package/dist/client/context.d.ts.map +1 -0
- package/dist/client/context.js +153 -0
- package/dist/client/context.js.map +1 -0
- package/dist/client/deps.d.ts +8 -0
- package/dist/client/deps.d.ts.map +1 -0
- package/dist/client/deps.js +6 -0
- package/dist/client/deps.js.map +1 -0
- package/dist/client/handlers/handleConnack.d.ts +10 -0
- package/dist/client/handlers/handleConnack.d.ts.map +1 -0
- package/dist/client/handlers/handleConnack.js +25 -0
- package/dist/client/handlers/handleConnack.js.map +1 -0
- package/dist/client/handlers/handlePacket.d.ts +11 -0
- package/dist/client/handlers/handlePacket.d.ts.map +1 -0
- package/dist/client/handlers/handlePacket.js +58 -0
- package/dist/client/handlers/handlePacket.js.map +1 -0
- package/dist/client/handlers/handlePuback.d.ts +12 -0
- package/dist/client/handlers/handlePuback.d.ts.map +1 -0
- package/dist/client/handlers/handlePuback.js +14 -0
- package/dist/client/handlers/handlePuback.js.map +1 -0
- package/dist/client/handlers/handlePubcomp.d.ts +13 -0
- package/dist/client/handlers/handlePubcomp.d.ts.map +1 -0
- package/dist/client/handlers/handlePubcomp.js +17 -0
- package/dist/client/handlers/handlePubcomp.js.map +1 -0
- package/dist/client/handlers/handlePublish.d.ts +10 -0
- package/dist/client/handlers/handlePublish.d.ts.map +1 -0
- package/dist/client/handlers/handlePublish.js +34 -0
- package/dist/client/handlers/handlePublish.js.map +1 -0
- package/dist/client/handlers/handlePubrec.d.ts +17 -0
- package/dist/client/handlers/handlePubrec.d.ts.map +1 -0
- package/dist/client/handlers/handlePubrec.js +27 -0
- package/dist/client/handlers/handlePubrec.js.map +1 -0
- package/dist/client/handlers/handlePubrel.d.ts +20 -0
- package/dist/client/handlers/handlePubrel.d.ts.map +1 -0
- package/dist/client/handlers/handlePubrel.js +32 -0
- package/dist/client/handlers/handlePubrel.js.map +1 -0
- package/dist/client/handlers/handleSuback.d.ts +13 -0
- package/dist/client/handlers/handleSuback.d.ts.map +1 -0
- package/dist/client/handlers/handleSuback.js +15 -0
- package/dist/client/handlers/handleSuback.js.map +1 -0
- package/dist/client/handlers/handleUnsuback.d.ts +14 -0
- package/dist/client/handlers/handleUnsuback.d.ts.map +1 -0
- package/dist/client/handlers/handleUnsuback.js +16 -0
- package/dist/client/handlers/handleUnsuback.js.map +1 -0
- package/dist/client/mod.d.ts +7 -0
- package/dist/client/mod.d.ts.map +1 -0
- package/dist/client/mod.js +6 -0
- package/dist/client/mod.js.map +1 -0
- package/dist/client/store/deps.d.ts +3 -0
- package/dist/client/store/deps.d.ts.map +1 -0
- package/dist/client/store/deps.js +2 -0
- package/dist/client/store/deps.js.map +1 -0
- package/dist/client/store/memoryStore.d.ts +34 -0
- package/dist/client/store/memoryStore.d.ts.map +1 -0
- package/dist/client/store/memoryStore.js +59 -0
- package/dist/client/store/memoryStore.js.map +1 -0
- package/dist/client/store/store.d.ts +46 -0
- package/dist/client/store/store.d.ts.map +1 -0
- package/dist/client/store/store.js +5 -0
- package/dist/client/store/store.js.map +1 -0
- package/dist/mqttConn/mqttConn.d.ts +79 -0
- package/dist/mqttConn/mqttConn.d.ts.map +1 -0
- package/dist/mqttConn/mqttConn.js +151 -0
- package/dist/mqttConn/mqttConn.js.map +1 -0
- package/dist/mqttPacket/AuthenticationResult.d.ts +16 -0
- package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -0
- package/dist/mqttPacket/AuthenticationResult.js +17 -0
- package/dist/mqttPacket/AuthenticationResult.js.map +1 -0
- package/dist/mqttPacket/BitMask.d.ts +11 -0
- package/dist/mqttPacket/BitMask.d.ts.map +1 -0
- package/dist/mqttPacket/BitMask.js +11 -0
- package/dist/mqttPacket/BitMask.js.map +1 -0
- package/dist/mqttPacket/PacketType.d.ts +19 -0
- package/dist/mqttPacket/PacketType.d.ts.map +1 -0
- package/dist/mqttPacket/PacketType.js +19 -0
- package/dist/mqttPacket/PacketType.js.map +1 -0
- package/dist/mqttPacket/connack.d.ts +18 -0
- package/dist/mqttPacket/connack.d.ts.map +1 -0
- package/dist/mqttPacket/connack.js +28 -0
- package/dist/mqttPacket/connack.js.map +1 -0
- package/dist/mqttPacket/connect.d.ts +28 -0
- package/dist/mqttPacket/connect.d.ts.map +1 -0
- package/dist/mqttPacket/connect.js +116 -0
- package/dist/mqttPacket/connect.js.map +1 -0
- package/dist/mqttPacket/decoder.d.ts +24 -0
- package/dist/mqttPacket/decoder.d.ts.map +1 -0
- package/dist/mqttPacket/decoder.js +90 -0
- package/dist/mqttPacket/decoder.js.map +1 -0
- package/dist/mqttPacket/disconnect.d.ts +16 -0
- package/dist/mqttPacket/disconnect.d.ts.map +1 -0
- package/dist/mqttPacket/disconnect.js +15 -0
- package/dist/mqttPacket/disconnect.js.map +1 -0
- package/dist/mqttPacket/encoder.d.ts +17 -0
- package/dist/mqttPacket/encoder.d.ts.map +1 -0
- package/dist/mqttPacket/encoder.js +57 -0
- package/dist/mqttPacket/encoder.js.map +1 -0
- package/dist/mqttPacket/length.d.ts +12 -0
- package/dist/mqttPacket/length.d.ts.map +1 -0
- package/dist/mqttPacket/length.js +44 -0
- package/dist/mqttPacket/length.js.map +1 -0
- package/dist/mqttPacket/mod.d.ts +122 -0
- package/dist/mqttPacket/mod.d.ts.map +1 -0
- package/dist/mqttPacket/mod.js +77 -0
- package/dist/mqttPacket/mod.js.map +1 -0
- package/dist/mqttPacket/pingreq.d.ts +15 -0
- package/dist/mqttPacket/pingreq.d.ts.map +1 -0
- package/dist/mqttPacket/pingreq.js +16 -0
- package/dist/mqttPacket/pingreq.js.map +1 -0
- package/dist/mqttPacket/pingres.d.ts +16 -0
- package/dist/mqttPacket/pingres.d.ts.map +1 -0
- package/dist/mqttPacket/pingres.js +15 -0
- package/dist/mqttPacket/pingres.js.map +1 -0
- package/dist/mqttPacket/puback.d.ts +16 -0
- package/dist/mqttPacket/puback.d.ts.map +1 -0
- package/dist/mqttPacket/puback.js +21 -0
- package/dist/mqttPacket/puback.js.map +1 -0
- package/dist/mqttPacket/pubcomp.d.ts +17 -0
- package/dist/mqttPacket/pubcomp.d.ts.map +1 -0
- package/dist/mqttPacket/pubcomp.js +21 -0
- package/dist/mqttPacket/pubcomp.js.map +1 -0
- package/dist/mqttPacket/publish.d.ts +22 -0
- package/dist/mqttPacket/publish.d.ts.map +1 -0
- package/dist/mqttPacket/publish.js +52 -0
- package/dist/mqttPacket/publish.js.map +1 -0
- package/dist/mqttPacket/pubrec.d.ts +17 -0
- package/dist/mqttPacket/pubrec.d.ts.map +1 -0
- package/dist/mqttPacket/pubrec.js +21 -0
- package/dist/mqttPacket/pubrec.js.map +1 -0
- package/dist/mqttPacket/pubrel.d.ts +17 -0
- package/dist/mqttPacket/pubrel.d.ts.map +1 -0
- package/dist/mqttPacket/pubrel.js +21 -0
- package/dist/mqttPacket/pubrel.js.map +1 -0
- package/dist/mqttPacket/suback.d.ts +18 -0
- package/dist/mqttPacket/suback.d.ts.map +1 -0
- package/dist/mqttPacket/suback.js +30 -0
- package/dist/mqttPacket/suback.js.map +1 -0
- package/dist/mqttPacket/subscribe.d.ts +24 -0
- package/dist/mqttPacket/subscribe.d.ts.map +1 -0
- package/dist/mqttPacket/subscribe.js +53 -0
- package/dist/mqttPacket/subscribe.js.map +1 -0
- package/dist/mqttPacket/types.d.ts +48 -0
- package/dist/mqttPacket/types.d.ts.map +1 -0
- package/dist/mqttPacket/types.js +2 -0
- package/dist/mqttPacket/types.js.map +1 -0
- package/dist/mqttPacket/unsuback.d.ts +17 -0
- package/dist/mqttPacket/unsuback.d.ts.map +1 -0
- package/dist/mqttPacket/unsuback.js +21 -0
- package/dist/mqttPacket/unsuback.js.map +1 -0
- package/dist/mqttPacket/unsubscribe.d.ts +17 -0
- package/dist/mqttPacket/unsubscribe.d.ts.map +1 -0
- package/dist/mqttPacket/unsubscribe.js +37 -0
- package/dist/mqttPacket/unsubscribe.js.map +1 -0
- package/dist/mqttPacket/validators.d.ts +5 -0
- package/dist/mqttPacket/validators.d.ts.map +1 -0
- package/dist/mqttPacket/validators.js +16 -0
- package/dist/mqttPacket/validators.js.map +1 -0
- package/dist/node/tcpClient.d.ts +18 -0
- package/dist/node/tcpClient.d.ts.map +1 -0
- package/dist/node/tcpClient.js +82 -0
- package/dist/node/tcpClient.js.map +1 -0
- package/dist/node/tcpServer.d.ts +17 -0
- package/dist/node/tcpServer.d.ts.map +1 -0
- package/dist/node/tcpServer.js +51 -0
- package/dist/node/tcpServer.js.map +1 -0
- package/dist/node/wrapNodeSocket.d.ts +12 -0
- package/dist/node/wrapNodeSocket.d.ts.map +1 -0
- package/dist/node/wrapNodeSocket.js +57 -0
- package/dist/node/wrapNodeSocket.js.map +1 -0
- package/dist/persistence/deps.d.ts +5 -0
- package/dist/persistence/deps.d.ts.map +1 -0
- package/dist/persistence/deps.js +4 -0
- package/dist/persistence/deps.js.map +1 -0
- package/dist/persistence/memory/memoryPersistence.d.ts +28 -0
- package/dist/persistence/memory/memoryPersistence.d.ts.map +1 -0
- package/dist/persistence/memory/memoryPersistence.js +119 -0
- package/dist/persistence/memory/memoryPersistence.js.map +1 -0
- package/dist/persistence/persistence.d.ts +81 -0
- package/dist/persistence/persistence.d.ts.map +1 -0
- package/dist/persistence/persistence.js +2 -0
- package/dist/persistence/persistence.js.map +1 -0
- package/dist/persistence/store.d.ts +13 -0
- package/dist/persistence/store.d.ts.map +1 -0
- package/dist/persistence/store.js +2 -0
- package/dist/persistence/store.js.map +1 -0
- package/dist/server/context.d.ts +45 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +101 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/deps.d.ts +10 -0
- package/dist/server/deps.d.ts.map +1 -0
- package/dist/server/deps.js +6 -0
- package/dist/server/deps.js.map +1 -0
- package/dist/server/handlers/handleConnect.d.ts +9 -0
- package/dist/server/handlers/handleConnect.d.ts.map +1 -0
- package/dist/server/handlers/handleConnect.js +81 -0
- package/dist/server/handlers/handleConnect.js.map +1 -0
- package/dist/server/handlers/handleDisconnect.d.ts +8 -0
- package/dist/server/handlers/handleDisconnect.d.ts.map +1 -0
- package/dist/server/handlers/handleDisconnect.js +10 -0
- package/dist/server/handlers/handleDisconnect.js.map +1 -0
- package/dist/server/handlers/handlePacket.d.ts +11 -0
- package/dist/server/handlers/handlePacket.d.ts.map +1 -0
- package/dist/server/handlers/handlePacket.js +66 -0
- package/dist/server/handlers/handlePacket.js.map +1 -0
- package/dist/server/handlers/handlePingreq.d.ts +8 -0
- package/dist/server/handlers/handlePingreq.d.ts.map +1 -0
- package/dist/server/handlers/handlePingreq.js +12 -0
- package/dist/server/handlers/handlePingreq.js.map +1 -0
- package/dist/server/handlers/handlePuback.d.ts +13 -0
- package/dist/server/handlers/handlePuback.d.ts.map +1 -0
- package/dist/server/handlers/handlePuback.js +17 -0
- package/dist/server/handlers/handlePuback.js.map +1 -0
- package/dist/server/handlers/handlePubcomp.d.ts +12 -0
- package/dist/server/handlers/handlePubcomp.d.ts.map +1 -0
- package/dist/server/handlers/handlePubcomp.js +15 -0
- package/dist/server/handlers/handlePubcomp.js.map +1 -0
- package/dist/server/handlers/handlePublish.d.ts +11 -0
- package/dist/server/handlers/handlePublish.d.ts.map +1 -0
- package/dist/server/handlers/handlePublish.js +55 -0
- package/dist/server/handlers/handlePublish.js.map +1 -0
- package/dist/server/handlers/handlePubrec.d.ts +15 -0
- package/dist/server/handlers/handlePubrec.d.ts.map +1 -0
- package/dist/server/handlers/handlePubrec.js +24 -0
- package/dist/server/handlers/handlePubrec.js.map +1 -0
- package/dist/server/handlers/handlePubrel.d.ts +16 -0
- package/dist/server/handlers/handlePubrel.d.ts.map +1 -0
- package/dist/server/handlers/handlePubrel.js +28 -0
- package/dist/server/handlers/handlePubrel.js.map +1 -0
- package/dist/server/handlers/handleSubscribe.d.ts +13 -0
- package/dist/server/handlers/handleSubscribe.d.ts.map +1 -0
- package/dist/server/handlers/handleSubscribe.js +57 -0
- package/dist/server/handlers/handleSubscribe.js.map +1 -0
- package/dist/server/handlers/handleUnsubscribe.d.ts +10 -0
- package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -0
- package/dist/server/handlers/handleUnsubscribe.js +19 -0
- package/dist/server/handlers/handleUnsubscribe.js.map +1 -0
- package/dist/server/mod.d.ts +11 -0
- package/dist/server/mod.d.ts.map +1 -0
- package/dist/server/mod.js +8 -0
- package/dist/server/mod.js.map +1 -0
- package/dist/server/server.d.ts +27 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +48 -0
- package/dist/server/server.js.map +1 -0
- package/dist/socket/socket.d.ts +29 -0
- package/dist/socket/socket.d.ts.map +1 -0
- package/dist/socket/socket.js +37 -0
- package/dist/socket/socket.js.map +1 -0
- package/dist/timer/timer.d.ts +13 -0
- package/dist/timer/timer.d.ts.map +1 -0
- package/dist/timer/timer.js +41 -0
- package/dist/timer/timer.js.map +1 -0
- package/dist/trie/trie.d.ts +21 -0
- package/dist/trie/trie.d.ts.map +1 -0
- package/dist/trie/trie.js +96 -0
- package/dist/trie/trie.js.map +1 -0
- package/dist/utils/args.d.ts +28 -0
- package/dist/utils/args.d.ts.map +1 -0
- package/dist/utils/args.js +76 -0
- package/dist/utils/args.js.map +1 -0
- package/dist/utils/assert.d.ts +10 -0
- package/dist/utils/assert.d.ts.map +1 -0
- package/dist/utils/assert.js +21 -0
- package/dist/utils/assert.js.map +1 -0
- package/dist/utils/asyncQueue.d.ts +28 -0
- package/dist/utils/asyncQueue.d.ts.map +1 -0
- package/dist/utils/asyncQueue.js +70 -0
- package/dist/utils/asyncQueue.js.map +1 -0
- package/dist/utils/deferred.d.ts +10 -0
- package/dist/utils/deferred.d.ts.map +1 -0
- package/dist/utils/deferred.js +15 -0
- package/dist/utils/deferred.js.map +1 -0
- package/dist/utils/logger.d.ts +63 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +59 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mod.d.ts +13 -0
- package/dist/utils/mod.d.ts.map +1 -0
- package/dist/utils/mod.js +12 -0
- package/dist/utils/mod.js.map +1 -0
- package/dist/utils/nextTick.d.ts +17 -0
- package/dist/utils/nextTick.d.ts.map +1 -0
- package/dist/utils/nextTick.js +19 -0
- package/dist/utils/nextTick.js.map +1 -0
- package/dist/utils/platform.d.ts +5 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +8 -0
- package/dist/utils/platform.js.map +1 -0
- package/examples/tcpServer.test.ts +149 -0
- package/mqttConn/mqttConn.ts +58 -2
- package/package.json +14 -10
- package/persistence/persistence.ts +66 -2
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module mqttConn
|
|
3
|
+
*/
|
|
4
|
+
import { decodePayload, encode, getLengthDecoder, } from "../mqttPacket/mod.js";
|
|
5
|
+
import { assert } from "../utils/mod.js";
|
|
6
|
+
import { Conn } from "../socket/socket.js";
|
|
7
|
+
/**
|
|
8
|
+
* Common MQTT connection error messages
|
|
9
|
+
*/
|
|
10
|
+
export const MqttConnError = {
|
|
11
|
+
invalidPacket: "Invalid Packet",
|
|
12
|
+
packetTooLarge: "Packet too large",
|
|
13
|
+
UnexpectedEof: "Unexpected EOF",
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Read a single byte from the connection
|
|
17
|
+
* @param conn Connection to read from
|
|
18
|
+
* @returns Single byte as number
|
|
19
|
+
* @throws Error if EOF reached unexpectedly
|
|
20
|
+
*/
|
|
21
|
+
async function readByte(conn) {
|
|
22
|
+
const buf = new Uint8Array(1);
|
|
23
|
+
const bytesRead = await conn.read(buf);
|
|
24
|
+
assert(bytesRead !== null, MqttConnError.UnexpectedEof);
|
|
25
|
+
assert(bytesRead !== 0, MqttConnError.UnexpectedEof);
|
|
26
|
+
return buf[0];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Read exact number of bytes into buffer
|
|
30
|
+
* @param conn Connection to read from
|
|
31
|
+
* @param buf Buffer to read into
|
|
32
|
+
* @throws Error if EOF reached unexpectedly
|
|
33
|
+
*/
|
|
34
|
+
async function readFull(conn, buf) {
|
|
35
|
+
let bytesRead = 0;
|
|
36
|
+
while (bytesRead < buf.length) {
|
|
37
|
+
const read = await conn.read(buf.subarray(bytesRead));
|
|
38
|
+
assert(read !== null, MqttConnError.UnexpectedEof);
|
|
39
|
+
assert(read !== 0, MqttConnError.UnexpectedEof);
|
|
40
|
+
bytesRead += read;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Read a complete MQTT packet from the connection
|
|
45
|
+
* @param conn Connection to read from
|
|
46
|
+
* @param maxPacketSize Maximum allowed packet size
|
|
47
|
+
* @returns Decoded MQTT packet
|
|
48
|
+
* @throws Error if packet is invalid or too large
|
|
49
|
+
*/
|
|
50
|
+
export async function readPacket(conn, maxPacketSize) {
|
|
51
|
+
// fixed header is 1 byte of type + flags
|
|
52
|
+
// + a maximum of 4 bytes to encode the remaining length
|
|
53
|
+
const decodeLength = getLengthDecoder();
|
|
54
|
+
const firstByte = await readByte(conn);
|
|
55
|
+
let result;
|
|
56
|
+
do {
|
|
57
|
+
const byte = await readByte(conn);
|
|
58
|
+
result = decodeLength(byte);
|
|
59
|
+
} while (!result.done);
|
|
60
|
+
const remainingLength = result.length;
|
|
61
|
+
assert(remainingLength < maxPacketSize - 1, MqttConnError.packetTooLarge);
|
|
62
|
+
const packetBuf = new Uint8Array(remainingLength);
|
|
63
|
+
// read the rest of the packet
|
|
64
|
+
await readFull(conn, packetBuf);
|
|
65
|
+
const packet = decodePayload(firstByte, packetBuf);
|
|
66
|
+
assert(packet !== null, MqttConnError.UnexpectedEof);
|
|
67
|
+
return packet;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* MQTT Connection class implementing IMqttConn interface
|
|
71
|
+
*/
|
|
72
|
+
export class MqttConn {
|
|
73
|
+
/** Underlying connection */
|
|
74
|
+
conn;
|
|
75
|
+
/** Maximum allowed packet size */
|
|
76
|
+
maxPacketSize;
|
|
77
|
+
/** Reason for connection closure if any */
|
|
78
|
+
_reason = undefined;
|
|
79
|
+
/** Whether connection is closed */
|
|
80
|
+
_isClosed = false;
|
|
81
|
+
/**
|
|
82
|
+
* Create new MQTT connection
|
|
83
|
+
* @param options Connection options
|
|
84
|
+
* @param options.conn Underlying socket connection
|
|
85
|
+
* @param options.maxPacketSize Maximum allowed packet size (default 2MB)
|
|
86
|
+
*/
|
|
87
|
+
constructor({ conn, maxPacketSize, }) {
|
|
88
|
+
this.conn = new Conn(conn);
|
|
89
|
+
this.maxPacketSize = maxPacketSize || 2 * 1024 * 1024;
|
|
90
|
+
}
|
|
91
|
+
/** Get reason for connection closure */
|
|
92
|
+
get reason() {
|
|
93
|
+
return this._reason;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Async iterator for receiving packets
|
|
97
|
+
* @yields MQTT packets
|
|
98
|
+
*/
|
|
99
|
+
async *[Symbol.asyncIterator]() {
|
|
100
|
+
while (!this._isClosed) {
|
|
101
|
+
try {
|
|
102
|
+
yield await readPacket(this.conn, this.maxPacketSize);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
if (err instanceof Error) {
|
|
106
|
+
if (err.name === "PartialReadError") {
|
|
107
|
+
err.message = MqttConnError.UnexpectedEof;
|
|
108
|
+
}
|
|
109
|
+
this._reason = err.message;
|
|
110
|
+
}
|
|
111
|
+
// packet too large, malformed packet or connection closed
|
|
112
|
+
this.close();
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Send an MQTT packet
|
|
119
|
+
* @param data Packet to send
|
|
120
|
+
*/
|
|
121
|
+
async send(data) {
|
|
122
|
+
try {
|
|
123
|
+
await this.conn.write(encode(data));
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
if (err instanceof Error) {
|
|
127
|
+
this._reason = err.message;
|
|
128
|
+
}
|
|
129
|
+
this.close();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** Whether connection is closed */
|
|
133
|
+
get isClosed() {
|
|
134
|
+
return this._isClosed;
|
|
135
|
+
}
|
|
136
|
+
/** Close the connection */
|
|
137
|
+
close() {
|
|
138
|
+
if (this.isClosed)
|
|
139
|
+
return;
|
|
140
|
+
try {
|
|
141
|
+
this.conn.close();
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
console.error(e);
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
this._isClosed = true;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=mqttConn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mqttConn.js","sourceRoot":"","sources":["../../mqttConn/mqttConn.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAEL,aAAa,EACb,MAAM,EACN,gBAAgB,GAEjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,aAAa,EAAE,gBAAgB;IAC/B,cAAc,EAAE,kBAAkB;IAClC,aAAa,EAAE,gBAAgB;CACvB,CAAC;AAoBX;;;;;GAKG;AACH,KAAK,UAAU,QAAQ,CAAC,IAAU;IAChC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,CAAC,SAAS,KAAK,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IACrD,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,QAAQ,CAAC,IAAU,EAAE,GAAe;IACjD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;QAChD,SAAS,IAAI,IAAI,CAAC;IACpB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAU,EACV,aAAqB;IAErB,yCAAyC;IACzC,wDAAwD;IACxD,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,MAA2B,CAAC;IAChC,GAAG,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;IAEvB,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IACtC,MAAM,CAAC,eAAe,GAAG,aAAa,GAAG,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC;IAClD,8BAA8B;IAC9B,MAAM,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,QAAQ;IACnB,4BAA4B;IACnB,IAAI,CAAO;IACpB,kCAAkC;IACjB,aAAa,CAAS;IACvC,2CAA2C;IACnC,OAAO,GAAuB,SAAS,CAAC;IAChD,mCAAmC;IAC3B,SAAS,GAAG,KAAK,CAAC;IAE1B;;;;;OAKG;IACH,YAAY,EACV,IAAI,EACJ,aAAa,GAId;QACC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IACxD,CAAC;IAED,wCAAwC;IACxC,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;oBACzB,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;wBACpC,GAAG,CAAC,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC;oBAC5C,CAAC;oBACD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;gBAC7B,CAAC;gBACD,0DAA0D;gBAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,IAAe;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAC7B,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,2BAA2B;IAC3B,KAAK;QACH,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Possible MQTT authentication results
|
|
3
|
+
*/
|
|
4
|
+
export declare const AuthenticationResult: {
|
|
5
|
+
readonly ok: 0;
|
|
6
|
+
readonly unacceptableProtocol: 1;
|
|
7
|
+
readonly rejectedUsername: 2;
|
|
8
|
+
readonly serverUnavailable: 3;
|
|
9
|
+
readonly badUsernameOrPassword: 4;
|
|
10
|
+
readonly notAuthorized: 5;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Reverse lookup for AuthenticationResult
|
|
14
|
+
*/
|
|
15
|
+
export declare const AuthenticationResultByNumber: Record<number, string>;
|
|
16
|
+
//# sourceMappingURL=AuthenticationResult.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthenticationResult.d.ts","sourceRoot":"","sources":["../../mqttPacket/AuthenticationResult.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;CAOvB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAG7D,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Possible MQTT authentication results
|
|
3
|
+
*/
|
|
4
|
+
export const AuthenticationResult = {
|
|
5
|
+
ok: 0,
|
|
6
|
+
unacceptableProtocol: 1,
|
|
7
|
+
rejectedUsername: 2,
|
|
8
|
+
serverUnavailable: 3,
|
|
9
|
+
badUsernameOrPassword: 4,
|
|
10
|
+
notAuthorized: 5,
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Reverse lookup for AuthenticationResult
|
|
14
|
+
*/
|
|
15
|
+
export const AuthenticationResultByNumber = Object
|
|
16
|
+
.fromEntries(Object.entries(AuthenticationResult).map(([k, v]) => [v, k]));
|
|
17
|
+
//# sourceMappingURL=AuthenticationResult.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthenticationResult.js","sourceRoot":"","sources":["../../mqttPacket/AuthenticationResult.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,EAAE,EAAE,CAAC;IACL,oBAAoB,EAAE,CAAC;IACvB,gBAAgB,EAAE,CAAC;IACnB,iBAAiB,EAAE,CAAC;IACpB,qBAAqB,EAAE,CAAC;IACxB,aAAa,EAAE,CAAC;CACR,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAA2B,MAAM;KACvE,WAAW,CACV,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAC7D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const BitMask: {
|
|
2
|
+
readonly bit0: number;
|
|
3
|
+
readonly bit1: number;
|
|
4
|
+
readonly bit2: number;
|
|
5
|
+
readonly bit3: number;
|
|
6
|
+
readonly bit4: number;
|
|
7
|
+
readonly bit5: number;
|
|
8
|
+
readonly bit6: number;
|
|
9
|
+
readonly bit7: number;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=BitMask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitMask.d.ts","sourceRoot":"","sources":["../../mqttPacket/BitMask.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO;;;;;;;;;CASV,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitMask.js","sourceRoot":"","sources":["../../mqttPacket/BitMask.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,CAAC,IAAI,CAAC;IACZ,IAAI,EAAE,CAAC,IAAI,CAAC;IACZ,IAAI,EAAE,CAAC,IAAI,CAAC;IACZ,IAAI,EAAE,CAAC,IAAI,CAAC;IACZ,IAAI,EAAE,CAAC,IAAI,CAAC;IACZ,IAAI,EAAE,CAAC,IAAI,CAAC;IACZ,IAAI,EAAE,CAAC,IAAI,CAAC;IACZ,IAAI,EAAE,CAAC,IAAI,CAAC;CACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const PacketType: {
|
|
2
|
+
readonly reserved: 0;
|
|
3
|
+
readonly connect: 1;
|
|
4
|
+
readonly connack: 2;
|
|
5
|
+
readonly publish: 3;
|
|
6
|
+
readonly puback: 4;
|
|
7
|
+
readonly pubrec: 5;
|
|
8
|
+
readonly pubrel: 6;
|
|
9
|
+
readonly pubcomp: 7;
|
|
10
|
+
readonly subscribe: 8;
|
|
11
|
+
readonly suback: 9;
|
|
12
|
+
readonly unsubscribe: 10;
|
|
13
|
+
readonly unsuback: 11;
|
|
14
|
+
readonly pingreq: 12;
|
|
15
|
+
readonly pingres: 13;
|
|
16
|
+
readonly disconnect: 14;
|
|
17
|
+
};
|
|
18
|
+
export declare const PacketNameByType: Record<number, string>;
|
|
19
|
+
//# sourceMappingURL=PacketType.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PacketType.d.ts","sourceRoot":"","sources":["../../mqttPacket/PacketType.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;CAgBb,CAAC;AAEX,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEnD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const PacketType = {
|
|
2
|
+
reserved: 0,
|
|
3
|
+
connect: 1,
|
|
4
|
+
connack: 2,
|
|
5
|
+
publish: 3,
|
|
6
|
+
puback: 4,
|
|
7
|
+
pubrec: 5,
|
|
8
|
+
pubrel: 6,
|
|
9
|
+
pubcomp: 7,
|
|
10
|
+
subscribe: 8,
|
|
11
|
+
suback: 9,
|
|
12
|
+
unsubscribe: 10,
|
|
13
|
+
unsuback: 11,
|
|
14
|
+
pingreq: 12,
|
|
15
|
+
pingres: 13,
|
|
16
|
+
disconnect: 14,
|
|
17
|
+
};
|
|
18
|
+
export const PacketNameByType = Object.fromEntries(Object.entries(PacketType).map(([k, v]) => [v, k]));
|
|
19
|
+
//# sourceMappingURL=PacketType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PacketType.js","sourceRoot":"","sources":["../../mqttPacket/PacketType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;IACZ,MAAM,EAAE,CAAC;IACT,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,EAAE;CACN,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAA2B,MAAM,CAAC,WAAW,CACxE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CACnD,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TAuthenticationResult, TPacketType } from "./types.ts";
|
|
2
|
+
/**
|
|
3
|
+
* ConnackPacket is sent from the server to the client in response to a connect packet.
|
|
4
|
+
* It indicates that the connect is accepted.
|
|
5
|
+
*/
|
|
6
|
+
export type ConnackPacket = {
|
|
7
|
+
type: TPacketType;
|
|
8
|
+
sessionPresent: boolean;
|
|
9
|
+
returnCode: TAuthenticationResult;
|
|
10
|
+
};
|
|
11
|
+
export declare const connack: {
|
|
12
|
+
encode(packet: ConnackPacket): {
|
|
13
|
+
flags: number;
|
|
14
|
+
bytes: number[];
|
|
15
|
+
};
|
|
16
|
+
decode(buffer: Uint8Array, _flags: number): ConnackPacket | undefined;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=connack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connack.d.ts","sourceRoot":"","sources":["../../mqttPacket/connack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMrE;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,qBAAqB,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE;IACpB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAClE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;CAyBvE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { PacketType } from "./PacketType.js";
|
|
2
|
+
import { BitMask } from "./BitMask.js";
|
|
3
|
+
import { booleanFlag, Decoder, DecoderError } from "./decoder.js";
|
|
4
|
+
import { AuthenticationResultByNumber } from "./AuthenticationResult.js";
|
|
5
|
+
export const connack = {
|
|
6
|
+
encode(packet) {
|
|
7
|
+
const flags = 0;
|
|
8
|
+
return {
|
|
9
|
+
flags,
|
|
10
|
+
bytes: [packet.sessionPresent ? 1 : 0, packet.returnCode || 0],
|
|
11
|
+
};
|
|
12
|
+
},
|
|
13
|
+
decode(buffer, _flags) {
|
|
14
|
+
const decoder = new Decoder(buffer);
|
|
15
|
+
const sessionPresent = booleanFlag(decoder.getByte(), BitMask.bit0);
|
|
16
|
+
const returnCode = decoder.getByte();
|
|
17
|
+
decoder.done();
|
|
18
|
+
if (!AuthenticationResultByNumber[returnCode]) {
|
|
19
|
+
throw new DecoderError("Invalid return code");
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
type: PacketType.connack,
|
|
23
|
+
sessionPresent,
|
|
24
|
+
returnCode,
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=connack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connack.js","sourceRoot":"","sources":["../../mqttPacket/connack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAYzE,MAAM,CAAC,MAAM,OAAO,GAGhB;IACF,MAAM,CAAC,MAAqB;QAC1B,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,OAAO;YACL,KAAK;YACL,KAAK,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;SAC/D,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,MAAkB,EAAE,MAAc;QACvC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QAEpC,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAA2B,CAAC;QAC9D,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,CAAC,4BAA4B,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,YAAY,CAAC,qBAAqB,CAAC,CAAC;QAChD,CAAC;QACD,OAAO;YACL,IAAI,EAAE,UAAU,CAAC,OAAO;YACxB,cAAc;YACd,UAAU;SACX,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ClientId, Payload, QoS, Topic, TPacketType } from "./types.ts";
|
|
2
|
+
/**
|
|
3
|
+
* ConnectPacket is sent from the client to the server to initiate a connection.
|
|
4
|
+
*/
|
|
5
|
+
export type ConnectPacket = {
|
|
6
|
+
type: TPacketType;
|
|
7
|
+
protocolName?: string;
|
|
8
|
+
protocolLevel?: number;
|
|
9
|
+
clientId?: ClientId;
|
|
10
|
+
username?: string;
|
|
11
|
+
password?: Uint8Array;
|
|
12
|
+
will?: {
|
|
13
|
+
topic: Topic;
|
|
14
|
+
payload: Payload;
|
|
15
|
+
retain?: boolean;
|
|
16
|
+
qos?: QoS;
|
|
17
|
+
};
|
|
18
|
+
clean?: boolean;
|
|
19
|
+
keepAlive?: number;
|
|
20
|
+
};
|
|
21
|
+
export declare const connect: {
|
|
22
|
+
encode(packet: ConnectPacket): {
|
|
23
|
+
flags: number;
|
|
24
|
+
bytes: number[];
|
|
25
|
+
};
|
|
26
|
+
decode(buffer: Uint8Array, flags: number): ConnectPacket;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../mqttPacket/connect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAW7E;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,IAAI,CAAC,EAAE;QACL,KAAK,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,GAAG,CAAC,EAAE,GAAG,CAAC;KACX,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AASF,eAAO,MAAM,OAAO,EAAE;IACpB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAClE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC;CA4H1D,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { PacketType } from "./PacketType.js";
|
|
2
|
+
import { BitMask } from "./BitMask.js";
|
|
3
|
+
import { Encoder } from "./encoder.js";
|
|
4
|
+
import { booleanFlag, Decoder, DecoderError, hasEmptyFlags, } from "./decoder.js";
|
|
5
|
+
function invalidProtocolName(version, name) {
|
|
6
|
+
if (version === 4 && name !== "MQTT") {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
export const connect = {
|
|
12
|
+
encode(packet) {
|
|
13
|
+
const flags = 0;
|
|
14
|
+
const protocolLevel = 4;
|
|
15
|
+
const protocolName = protocolLevel === 4 ? "MQTT" : "MQIsdp";
|
|
16
|
+
const clientId = packet.clientId || "";
|
|
17
|
+
const usernameFlag = !!packet.username;
|
|
18
|
+
const passwordFlag = !!packet.password;
|
|
19
|
+
const willRetain = !!packet.will?.retain;
|
|
20
|
+
const willQoS = packet.will?.qos || 0;
|
|
21
|
+
const willFlag = !!packet.will;
|
|
22
|
+
const cleanSession = packet.clean !== false;
|
|
23
|
+
const connectFlags = (usernameFlag ? BitMask.bit7 : 0) +
|
|
24
|
+
(passwordFlag ? BitMask.bit6 : 0) +
|
|
25
|
+
(willRetain ? BitMask.bit5 : 0) +
|
|
26
|
+
(willQoS & 2 ? BitMask.bit4 : 0) +
|
|
27
|
+
(willQoS & 1 ? BitMask.bit3 : 0) +
|
|
28
|
+
(willFlag ? BitMask.bit2 : 0) +
|
|
29
|
+
(cleanSession ? BitMask.bit1 : 0);
|
|
30
|
+
const keepAlive = packet.keepAlive || 0;
|
|
31
|
+
const encoder = new Encoder();
|
|
32
|
+
encoder
|
|
33
|
+
.setUtf8String(protocolName)
|
|
34
|
+
.setByte(protocolLevel)
|
|
35
|
+
.setByte(connectFlags)
|
|
36
|
+
.setInt16(keepAlive)
|
|
37
|
+
.setUtf8String(clientId);
|
|
38
|
+
if (packet.will) {
|
|
39
|
+
encoder.setTopic(packet.will.topic).setByteArray(packet.will.payload);
|
|
40
|
+
}
|
|
41
|
+
if (packet.username) {
|
|
42
|
+
encoder.setUtf8String(packet.username);
|
|
43
|
+
}
|
|
44
|
+
if (packet.password) {
|
|
45
|
+
encoder.setByteArray(packet.password);
|
|
46
|
+
}
|
|
47
|
+
return { flags, bytes: encoder.done() };
|
|
48
|
+
},
|
|
49
|
+
decode(buffer, flags) {
|
|
50
|
+
const decoder = new Decoder(buffer);
|
|
51
|
+
const protocolName = decoder.getUtf8String();
|
|
52
|
+
const protocolLevel = decoder.getByte();
|
|
53
|
+
if (invalidProtocolName(protocolLevel, protocolName)) {
|
|
54
|
+
throw new DecoderError("Invalid protocol name");
|
|
55
|
+
}
|
|
56
|
+
const connectFlags = decoder.getByte();
|
|
57
|
+
const usernameFlag = booleanFlag(connectFlags, BitMask.bit7);
|
|
58
|
+
const passwordFlag = booleanFlag(connectFlags, BitMask.bit6);
|
|
59
|
+
const willRetain = booleanFlag(connectFlags, BitMask.bit5);
|
|
60
|
+
const willQoS = (connectFlags & (BitMask.bit4 + BitMask.bit3)) >> 3;
|
|
61
|
+
const willFlag = booleanFlag(connectFlags, BitMask.bit2);
|
|
62
|
+
const cleanSession = booleanFlag(connectFlags, BitMask.bit1);
|
|
63
|
+
const reservedBit = booleanFlag(connectFlags, BitMask.bit0);
|
|
64
|
+
hasEmptyFlags(flags);
|
|
65
|
+
// The Server MUST validate that the reserved flag in the CONNECT Control Packet
|
|
66
|
+
// is set to zero and disconnect the Client if it is not zero [MQTT-3.1.2-3].
|
|
67
|
+
if (reservedBit) {
|
|
68
|
+
throw new DecoderError("Invalid reserved bit");
|
|
69
|
+
}
|
|
70
|
+
if (willQoS !== 0 && willQoS !== 1 && willQoS !== 2) {
|
|
71
|
+
throw new DecoderError("Invalid will qos");
|
|
72
|
+
}
|
|
73
|
+
const keepAlive = decoder.getInt16();
|
|
74
|
+
const clientId = decoder.getUtf8String();
|
|
75
|
+
let willTopic;
|
|
76
|
+
let willPayload;
|
|
77
|
+
if (willFlag) {
|
|
78
|
+
willTopic = decoder.getTopic();
|
|
79
|
+
willPayload = decoder.getByteArray();
|
|
80
|
+
}
|
|
81
|
+
let username;
|
|
82
|
+
let password;
|
|
83
|
+
if (usernameFlag) {
|
|
84
|
+
username = decoder.getUtf8String();
|
|
85
|
+
}
|
|
86
|
+
if (passwordFlag) {
|
|
87
|
+
password = decoder.getByteArray();
|
|
88
|
+
}
|
|
89
|
+
decoder.done();
|
|
90
|
+
if (!willFlag && (willQoS !== 0 || willRetain === true)) {
|
|
91
|
+
throw new DecoderError("Will QoS must be 0 and Will retain to false when Will flag is false");
|
|
92
|
+
}
|
|
93
|
+
if (clientId.length === 0 && cleanSession === false) {
|
|
94
|
+
throw new DecoderError("Clean session must be true if clientID is empty");
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
type: PacketType.connect,
|
|
98
|
+
protocolName: protocolName,
|
|
99
|
+
protocolLevel,
|
|
100
|
+
clientId: clientId,
|
|
101
|
+
username: username ? username : undefined,
|
|
102
|
+
password: password ? password : undefined,
|
|
103
|
+
will: willFlag
|
|
104
|
+
? {
|
|
105
|
+
topic: willTopic || "",
|
|
106
|
+
payload: willPayload || Uint8Array.from([0]),
|
|
107
|
+
retain: willRetain,
|
|
108
|
+
qos: willQoS,
|
|
109
|
+
}
|
|
110
|
+
: undefined,
|
|
111
|
+
clean: cleanSession,
|
|
112
|
+
keepAlive,
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../mqttPacket/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { TBitMask, Topic, TopicFilter } from "./types.ts";
|
|
2
|
+
export declare function booleanFlag(byte: number, mask: TBitMask): boolean;
|
|
3
|
+
export declare function isEmptyBuf(buf: Uint8Array): void;
|
|
4
|
+
export declare function hasEmptyFlags(flags: number): void;
|
|
5
|
+
export declare class DecoderError extends Error {
|
|
6
|
+
constructor(message: string);
|
|
7
|
+
}
|
|
8
|
+
export declare class Decoder {
|
|
9
|
+
private buf;
|
|
10
|
+
private pos;
|
|
11
|
+
private len;
|
|
12
|
+
constructor(buf: Uint8Array, pos?: number);
|
|
13
|
+
checkpos(pos: number): void;
|
|
14
|
+
getByte(): number;
|
|
15
|
+
getInt16(): number;
|
|
16
|
+
getByteArray(): Uint8Array;
|
|
17
|
+
getUtf8String(): string;
|
|
18
|
+
getTopic(): Topic;
|
|
19
|
+
getTopicFilter(): TopicFilter;
|
|
20
|
+
getRemainder(): Uint8Array<ArrayBufferLike>;
|
|
21
|
+
atEnd(): boolean;
|
|
22
|
+
done(): boolean;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=decoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../mqttPacket/decoder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK/D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAEjE;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAIhD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIjD;AAED,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,GAAG,CAAS;gBAER,GAAG,EAAE,UAAU,EAAE,GAAG,GAAE,MAAU;IAK5C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM3B,OAAO,IAAI,MAAM;IAKjB,QAAQ,IAAI,MAAM;IAMlB,YAAY,IAAI,UAAU;IAS1B,aAAa,IAAI,MAAM;IAKvB,QAAQ,IAAI,KAAK;IAUjB,cAAc,IAAI,WAAW;IAU7B,YAAY;IAOZ,KAAK,IAAI,OAAO;IAMhB,IAAI,IAAI,OAAO;CAMhB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { invalidTopic, invalidTopicFilter } from "./validators.js";
|
|
2
|
+
const utf8Decoder = new TextDecoder("utf-8");
|
|
3
|
+
export function booleanFlag(byte, mask) {
|
|
4
|
+
return !!(byte & mask);
|
|
5
|
+
}
|
|
6
|
+
export function isEmptyBuf(buf) {
|
|
7
|
+
if (buf.length > 0) {
|
|
8
|
+
throw new DecoderError("Packet too long");
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function hasEmptyFlags(flags) {
|
|
12
|
+
if (flags !== 0) {
|
|
13
|
+
throw new DecoderError("Invalid fixed header flags");
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class DecoderError extends Error {
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "DecoderError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class Decoder {
|
|
23
|
+
buf;
|
|
24
|
+
pos;
|
|
25
|
+
len;
|
|
26
|
+
constructor(buf, pos = 0) {
|
|
27
|
+
this.buf = buf;
|
|
28
|
+
this.pos = pos;
|
|
29
|
+
this.len = buf.length;
|
|
30
|
+
}
|
|
31
|
+
checkpos(pos) {
|
|
32
|
+
if (pos > this.len) {
|
|
33
|
+
throw new DecoderError("Packet too short");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
getByte() {
|
|
37
|
+
this.checkpos(this.pos);
|
|
38
|
+
return this.buf[this.pos++];
|
|
39
|
+
}
|
|
40
|
+
getInt16() {
|
|
41
|
+
const msb = this.getByte();
|
|
42
|
+
const lsb = this.getByte();
|
|
43
|
+
return (msb << 8) | lsb;
|
|
44
|
+
}
|
|
45
|
+
getByteArray() {
|
|
46
|
+
const len = this.getInt16();
|
|
47
|
+
const start = this.pos;
|
|
48
|
+
const end = this.pos + len;
|
|
49
|
+
this.pos = end;
|
|
50
|
+
this.checkpos(end);
|
|
51
|
+
return this.buf.subarray(start, end);
|
|
52
|
+
}
|
|
53
|
+
getUtf8String() {
|
|
54
|
+
const str = utf8Decoder.decode(this.getByteArray());
|
|
55
|
+
return str;
|
|
56
|
+
}
|
|
57
|
+
getTopic() {
|
|
58
|
+
const topic = this.getUtf8String();
|
|
59
|
+
if (invalidTopic(topic)) {
|
|
60
|
+
throw new DecoderError("Topic must contain valid UTF-8 and contain more than 1 byte and no wildcards");
|
|
61
|
+
}
|
|
62
|
+
return topic;
|
|
63
|
+
}
|
|
64
|
+
getTopicFilter() {
|
|
65
|
+
const topicFilter = this.getUtf8String();
|
|
66
|
+
if (invalidTopicFilter(topicFilter)) {
|
|
67
|
+
throw new DecoderError("Topicfilter must contain valid UTF-8 and contain more than 1 byte and valid wildcards");
|
|
68
|
+
}
|
|
69
|
+
return topicFilter;
|
|
70
|
+
}
|
|
71
|
+
getRemainder() {
|
|
72
|
+
const start = this.pos;
|
|
73
|
+
const end = this.len;
|
|
74
|
+
this.pos = end;
|
|
75
|
+
return this.buf.subarray(start, end);
|
|
76
|
+
}
|
|
77
|
+
atEnd() {
|
|
78
|
+
if (this.len === this.pos) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
done() {
|
|
84
|
+
if (this.atEnd()) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
throw new DecoderError("Packet too long");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=decoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decoder.js","sourceRoot":"","sources":["../../mqttPacket/decoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TPacketType } from "./types.ts";
|
|
2
|
+
/**
|
|
3
|
+
* DisconnectPacket is the final control packet sent from the client to the server.
|
|
4
|
+
* It indicates that the client is disconnecting cleanly.
|
|
5
|
+
*/
|
|
6
|
+
export type DisconnectPacket = {
|
|
7
|
+
type: TPacketType;
|
|
8
|
+
};
|
|
9
|
+
export declare const disconnect: {
|
|
10
|
+
encode(_packet: DisconnectPacket): {
|
|
11
|
+
flags: number;
|
|
12
|
+
bytes: number[];
|
|
13
|
+
};
|
|
14
|
+
decode(buffer: Uint8Array, _flags: number): DisconnectPacket;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=disconnect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disconnect.d.ts","sourceRoot":"","sources":["../../mqttPacket/disconnect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE;IACvB,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACtE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC;CAa9D,CAAC"}
|