@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 @@
|
|
|
1
|
+
{"version":3,"file":"deferred.d.ts","sourceRoot":"","sources":["../../utils/deferred.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,OAAO,EAAG,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC3B,MAAM,EAAG,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;;CAQ/B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a promise that can be resolved/rejected later
|
|
3
|
+
*/
|
|
4
|
+
export class Deferred {
|
|
5
|
+
promise;
|
|
6
|
+
resolve;
|
|
7
|
+
reject;
|
|
8
|
+
constructor() {
|
|
9
|
+
this.promise = new Promise((resolve, reject) => {
|
|
10
|
+
this.resolve = resolve;
|
|
11
|
+
this.reject = reject;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=deferred.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferred.js","sourceRoot":"","sources":["../../utils/deferred.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,QAAQ;IACnB,OAAO,CAAa;IACpB,OAAO,CAAoB;IAC3B,MAAM,CAAwB;IAE9B;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The available log levels
|
|
3
|
+
*/
|
|
4
|
+
export declare const LogLevel: {
|
|
5
|
+
readonly error: 0;
|
|
6
|
+
readonly warn: 1;
|
|
7
|
+
readonly info: 2;
|
|
8
|
+
readonly verbose: 3;
|
|
9
|
+
readonly debug: 4;
|
|
10
|
+
};
|
|
11
|
+
export type TLogLevel = typeof LogLevel[keyof typeof LogLevel];
|
|
12
|
+
/**
|
|
13
|
+
* Simple logger class
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const logger = new Logger();
|
|
17
|
+
* logger.level(LogLevel.debug);
|
|
18
|
+
* logger.debug("debug message");
|
|
19
|
+
* logger.verbose("verbose message");
|
|
20
|
+
* logger.info("info message");
|
|
21
|
+
* logger.warn("warn message");
|
|
22
|
+
* logger.error("error message");
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare class Logger {
|
|
26
|
+
private defaultError;
|
|
27
|
+
private defaultWarn;
|
|
28
|
+
private defaultInfo;
|
|
29
|
+
private defaultVerbose;
|
|
30
|
+
private defaultDebug;
|
|
31
|
+
private noop;
|
|
32
|
+
error: {
|
|
33
|
+
(...data: any[]): void;
|
|
34
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
35
|
+
};
|
|
36
|
+
warn: {
|
|
37
|
+
(...data: any[]): void;
|
|
38
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
39
|
+
};
|
|
40
|
+
info: {
|
|
41
|
+
(...data: any[]): void;
|
|
42
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
43
|
+
};
|
|
44
|
+
verbose: (..._data: any[]) => void;
|
|
45
|
+
debug: (..._data: any[]) => void;
|
|
46
|
+
constructor();
|
|
47
|
+
level(logLevel: TLogLevel): void;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* logger provides a singleton logger instance
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* import { logger } from "./utils/logger.ts";
|
|
54
|
+
* logger.level(LogLevel.debug);
|
|
55
|
+
* logger.debug("debug message");
|
|
56
|
+
* logger.verbose("verbose message");
|
|
57
|
+
* logger.info("info message");
|
|
58
|
+
* logger.warn("warn message");
|
|
59
|
+
* logger.error("error message");
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare const logger: Logger;
|
|
63
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;;CAMX,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,QAAQ,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAE/D;;;;;;;;;;;;GAYG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,YAAY,CAAe;IAEnC,OAAO,CAAC,IAAI,CAA2B;IACvC,KAAK;;;MAAqB;IAC1B,IAAI;;;MAAoB;IACxB,IAAI;;;MAAoB;IACxB,OAAO,aAJmB,GAAG,EAAE,UAIX;IACpB,KAAK,aALqB,GAAG,EAAE,UAKb;;IAIlB,KAAK,CAAC,QAAQ,EAAE,SAAS;CAM1B;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,MAAM,EAAE,MAAqB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The available log levels
|
|
3
|
+
*/
|
|
4
|
+
export const LogLevel = {
|
|
5
|
+
error: 0,
|
|
6
|
+
warn: 1,
|
|
7
|
+
info: 2,
|
|
8
|
+
verbose: 3,
|
|
9
|
+
debug: 4,
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Simple logger class
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const logger = new Logger();
|
|
16
|
+
* logger.level(LogLevel.debug);
|
|
17
|
+
* logger.debug("debug message");
|
|
18
|
+
* logger.verbose("verbose message");
|
|
19
|
+
* logger.info("info message");
|
|
20
|
+
* logger.warn("warn message");
|
|
21
|
+
* logger.error("error message");
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export class Logger {
|
|
25
|
+
defaultError = console.error;
|
|
26
|
+
defaultWarn = console.warn;
|
|
27
|
+
defaultInfo = console.info;
|
|
28
|
+
defaultVerbose = console.log;
|
|
29
|
+
defaultDebug = console.log;
|
|
30
|
+
// deno-lint-ignore no-explicit-any
|
|
31
|
+
noop = (..._data) => { };
|
|
32
|
+
error = this.defaultError;
|
|
33
|
+
warn = this.defaultWarn;
|
|
34
|
+
info = this.defaultInfo;
|
|
35
|
+
verbose = this.noop;
|
|
36
|
+
debug = this.noop;
|
|
37
|
+
constructor() { }
|
|
38
|
+
level(logLevel) {
|
|
39
|
+
this.warn = logLevel > 0 ? this.defaultWarn : this.noop;
|
|
40
|
+
this.info = logLevel > 1 ? this.defaultInfo : this.noop;
|
|
41
|
+
this.verbose = logLevel > 2 ? this.defaultVerbose : this.noop;
|
|
42
|
+
this.debug = logLevel > 3 ? this.defaultDebug : this.noop;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* logger provides a singleton logger instance
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* import { logger } from "./utils/logger.ts";
|
|
50
|
+
* logger.level(LogLevel.debug);
|
|
51
|
+
* logger.debug("debug message");
|
|
52
|
+
* logger.verbose("verbose message");
|
|
53
|
+
* logger.info("info message");
|
|
54
|
+
* logger.warn("warn message");
|
|
55
|
+
* logger.error("error message");
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export const logger = new Logger();
|
|
59
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;CACA,CAAC;AAIX;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,MAAM;IACT,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC;IAC7B,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;IACnC,mCAAmC;IAC3B,IAAI,GAAG,CAAC,GAAG,KAAY,EAAE,EAAE,GAAE,CAAC,CAAC;IACvC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;IAC1B,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IACxB,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IACxB,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;IACpB,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;IAElB,gBAAe,CAAC;IAEhB,KAAK,CAAC,QAAmB;QACvB,IAAI,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACxD,IAAI,CAAC,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9D,IAAI,CAAC,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5D,CAAC;CACF;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,MAAM,GAAW,IAAI,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module provides various utilities
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
export { assert } from "./assert.ts";
|
|
6
|
+
export { Deferred } from "./deferred.ts";
|
|
7
|
+
export { Logger, logger, LogLevel } from "./logger.ts";
|
|
8
|
+
export { AsyncQueue } from "./asyncQueue.ts";
|
|
9
|
+
export { nextTick } from "./nextTick.ts";
|
|
10
|
+
export { parseArgs } from "./args.ts";
|
|
11
|
+
export type { Args } from "./args.ts";
|
|
12
|
+
export { getArgs } from "./platform.ts";
|
|
13
|
+
//# sourceMappingURL=mod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../utils/mod.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module provides various utilities
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
export { assert } from "./assert.js";
|
|
6
|
+
export { Deferred } from "./deferred.js";
|
|
7
|
+
export { Logger, logger, LogLevel } from "./logger.js";
|
|
8
|
+
export { AsyncQueue } from "./asyncQueue.js";
|
|
9
|
+
export { nextTick } from "./nextTick.js";
|
|
10
|
+
export { parseArgs } from "./args.js";
|
|
11
|
+
export { getArgs } from "./platform.js";
|
|
12
|
+
//# sourceMappingURL=mod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../utils/mod.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns a promise that resolves on the next tick of the Node.js event loop.
|
|
3
|
+
* This is useful for deferring execution of code until after the current call stack is cleared.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* async function example() {
|
|
8
|
+
* console.log('Before nextTick');
|
|
9
|
+
* await nextTick();
|
|
10
|
+
* console.log('After nextTick');
|
|
11
|
+
* }
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @returns {Promise<void>} A promise that resolves on the next tick of the event loop
|
|
15
|
+
*/
|
|
16
|
+
export declare function nextTick(): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=nextTick.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextTick.d.ts","sourceRoot":"","sources":["../../utils/nextTick.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAExC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns a promise that resolves on the next tick of the Node.js event loop.
|
|
3
|
+
* This is useful for deferring execution of code until after the current call stack is cleared.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* async function example() {
|
|
8
|
+
* console.log('Before nextTick');
|
|
9
|
+
* await nextTick();
|
|
10
|
+
* console.log('After nextTick');
|
|
11
|
+
* }
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @returns {Promise<void>} A promise that resolves on the next tick of the event loop
|
|
15
|
+
*/
|
|
16
|
+
export function nextTick() {
|
|
17
|
+
return new Promise((resolve) => setTimeout(resolve, 0));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=nextTick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextTick.js","sourceRoot":"","sources":["../../utils/nextTick.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../utils/platform.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,OAAO,IAAI,MAAM,EAAE,CAElC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../utils/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { TcpClient } from "@seriousme/opifex/tcpClient";
|
|
4
|
+
import { TcpServer } from "@seriousme/opifex/tcpServer";
|
|
5
|
+
import { logger, LogLevel } from "@seriousme/opifex/utils";
|
|
6
|
+
import type { PublishPacket, QoS } from "@seriousme/opifex/mqttPacket";
|
|
7
|
+
|
|
8
|
+
logger.level(LogLevel.info);
|
|
9
|
+
export function sleep(ms: number): Promise<unknown> {
|
|
10
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
test("Test pubSub using client and server", async function () {
|
|
14
|
+
const server = new TcpServer({ port: 0 }, {});
|
|
15
|
+
server.start();
|
|
16
|
+
|
|
17
|
+
assert.deepStrictEqual(
|
|
18
|
+
server.port !== undefined,
|
|
19
|
+
true,
|
|
20
|
+
"server runs a a random port",
|
|
21
|
+
);
|
|
22
|
+
logger.verbose({ port: server.port, address: server.address });
|
|
23
|
+
|
|
24
|
+
const params = {
|
|
25
|
+
url: new URL(`mqtt://${server.address}:${server.port}`),
|
|
26
|
+
numberOfRetries: 0,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const client = new TcpClient();
|
|
30
|
+
|
|
31
|
+
await client.connect(params);
|
|
32
|
+
assert(true, "Client connected to server");
|
|
33
|
+
|
|
34
|
+
const publishSet: { topic: string; qos: QoS }[] = [
|
|
35
|
+
{ topic: "t0@q0", qos: 0 },
|
|
36
|
+
{ topic: "t1@q0", qos: 0 },
|
|
37
|
+
{ topic: "t2@q0", qos: 0 },
|
|
38
|
+
{ topic: "t0@q1", qos: 1 },
|
|
39
|
+
{ topic: "t1@q1", qos: 1 },
|
|
40
|
+
{ topic: "t2@q1", qos: 1 },
|
|
41
|
+
{ topic: "t0@q2", qos: 2 },
|
|
42
|
+
{ topic: "t1@q2", qos: 2 },
|
|
43
|
+
{ topic: "t2@q2", qos: 2 },
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
const subscriptions = publishSet.map((item) => ({
|
|
47
|
+
topicFilter: item.topic,
|
|
48
|
+
qos: item.qos,
|
|
49
|
+
}));
|
|
50
|
+
await client.subscribe({
|
|
51
|
+
subscriptions,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// the IIFE ensures message reception runs in parallel
|
|
55
|
+
logger.verbose(`Start receiving`);
|
|
56
|
+
const received: PublishPacket[] = [];
|
|
57
|
+
(async function () {
|
|
58
|
+
for await (const item of client.messages()) {
|
|
59
|
+
logger.verbose(`Receiving: ${item.topic} -- ${item.qos}`);
|
|
60
|
+
received.push(item);
|
|
61
|
+
}
|
|
62
|
+
})();
|
|
63
|
+
// end of IIFE
|
|
64
|
+
for (const item of publishSet) {
|
|
65
|
+
logger.verbose(`Publishing: ${item.topic} -- ${item.qos}`);
|
|
66
|
+
await client.publish({
|
|
67
|
+
topic: item.topic,
|
|
68
|
+
qos: item.qos,
|
|
69
|
+
payload: new Uint8Array([0x01]),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
await sleep(100);
|
|
74
|
+
logger.verbose(`Disconnect client`);
|
|
75
|
+
//client.closeMessages();
|
|
76
|
+
await client.disconnect();
|
|
77
|
+
|
|
78
|
+
logger.verbose(`Check completeness`);
|
|
79
|
+
for (const item of publishSet) {
|
|
80
|
+
const found = received.find((f) =>
|
|
81
|
+
f.topic == item.topic && f.qos === item.qos
|
|
82
|
+
);
|
|
83
|
+
logger.verbose(`Found: ${item.topic} -- ${item.qos}`);
|
|
84
|
+
assert(found, `${item.topic} -- ${item.qos}`);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
logger.verbose(`Stop server`);
|
|
88
|
+
server.stop();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("Test subscription persistence after reconnect", async function () {
|
|
92
|
+
// Start server
|
|
93
|
+
const server = new TcpServer({ port: 0 }, {});
|
|
94
|
+
server.start();
|
|
95
|
+
|
|
96
|
+
const params = {
|
|
97
|
+
url: new URL(`mqtt://${server.address}:${server.port}`),
|
|
98
|
+
numberOfRetries: 0,
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const client = new TcpClient();
|
|
102
|
+
const testTopic = "test/topic";
|
|
103
|
+
const received: PublishPacket[] = [];
|
|
104
|
+
|
|
105
|
+
// First connection and subscription
|
|
106
|
+
await client.connect(params);
|
|
107
|
+
await client.subscribe({
|
|
108
|
+
subscriptions: [{
|
|
109
|
+
topicFilter: testTopic,
|
|
110
|
+
qos: 0,
|
|
111
|
+
}],
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Start receiving messages
|
|
115
|
+
(async function () {
|
|
116
|
+
for await (const item of client.messages()) {
|
|
117
|
+
received.push(item);
|
|
118
|
+
}
|
|
119
|
+
})();
|
|
120
|
+
|
|
121
|
+
// Disconnect client
|
|
122
|
+
await client.disconnect();
|
|
123
|
+
await sleep(100);
|
|
124
|
+
|
|
125
|
+
// Reconnect client
|
|
126
|
+
await client.connect(params);
|
|
127
|
+
await sleep(100);
|
|
128
|
+
|
|
129
|
+
// Publish test message
|
|
130
|
+
await client.publish({
|
|
131
|
+
topic: testTopic,
|
|
132
|
+
qos: 0,
|
|
133
|
+
payload: new Uint8Array([0x01]),
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
await sleep(100);
|
|
137
|
+
logger.verbose(`Disconnect client`);
|
|
138
|
+
await client.disconnect();
|
|
139
|
+
|
|
140
|
+
// Verify message was received
|
|
141
|
+
assert.equal(received.length, 1, "Should receive one message");
|
|
142
|
+
assert.equal(
|
|
143
|
+
received[0].topic,
|
|
144
|
+
testTopic,
|
|
145
|
+
"Should receive message on subscribed topic",
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
server.stop();
|
|
149
|
+
});
|
package/mqttConn/mqttConn.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module mqttConn
|
|
3
|
+
*/
|
|
4
|
+
|
|
1
5
|
import {
|
|
2
6
|
type AnyPacket,
|
|
3
7
|
decodePayload,
|
|
@@ -10,21 +14,39 @@ import { assert } from "../utils/mod.ts";
|
|
|
10
14
|
import type { SockConn } from "../socket/socket.ts";
|
|
11
15
|
import { Conn } from "../socket/socket.ts";
|
|
12
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Common MQTT connection error messages
|
|
19
|
+
*/
|
|
13
20
|
export const MqttConnError = {
|
|
14
21
|
invalidPacket: "Invalid Packet",
|
|
15
22
|
packetTooLarge: "Packet too large",
|
|
16
23
|
UnexpectedEof: "Unexpected EOF",
|
|
17
24
|
} as const;
|
|
18
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Interface for MQTT connection handling
|
|
28
|
+
*/
|
|
19
29
|
export interface IMqttConn extends AsyncIterable<AnyPacket> {
|
|
30
|
+
/** Underlying connection */
|
|
20
31
|
readonly conn: Conn;
|
|
32
|
+
/** Whether connection is closed */
|
|
21
33
|
readonly isClosed: boolean;
|
|
34
|
+
/** Reason for connection closure if any */
|
|
22
35
|
readonly reason: string | undefined;
|
|
36
|
+
/** Async iterator for receiving packets */
|
|
23
37
|
[Symbol.asyncIterator](): AsyncIterableIterator<AnyPacket>;
|
|
38
|
+
/** Send an MQTT packet */
|
|
24
39
|
send(data: AnyPacket): Promise<void>;
|
|
40
|
+
/** Close the connection */
|
|
25
41
|
close(): void;
|
|
26
42
|
}
|
|
27
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Read a single byte from the connection
|
|
46
|
+
* @param conn Connection to read from
|
|
47
|
+
* @returns Single byte as number
|
|
48
|
+
* @throws Error if EOF reached unexpectedly
|
|
49
|
+
*/
|
|
28
50
|
async function readByte(conn: Conn): Promise<number> {
|
|
29
51
|
const buf = new Uint8Array(1);
|
|
30
52
|
const bytesRead = await conn.read(buf);
|
|
@@ -33,6 +55,12 @@ async function readByte(conn: Conn): Promise<number> {
|
|
|
33
55
|
return buf[0];
|
|
34
56
|
}
|
|
35
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Read exact number of bytes into buffer
|
|
60
|
+
* @param conn Connection to read from
|
|
61
|
+
* @param buf Buffer to read into
|
|
62
|
+
* @throws Error if EOF reached unexpectedly
|
|
63
|
+
*/
|
|
36
64
|
async function readFull(conn: Conn, buf: Uint8Array): Promise<void> {
|
|
37
65
|
let bytesRead = 0;
|
|
38
66
|
while (bytesRead < buf.length) {
|
|
@@ -43,8 +71,12 @@ async function readFull(conn: Conn, buf: Uint8Array): Promise<void> {
|
|
|
43
71
|
}
|
|
44
72
|
}
|
|
45
73
|
|
|
46
|
-
/**
|
|
47
|
-
*
|
|
74
|
+
/**
|
|
75
|
+
* Read a complete MQTT packet from the connection
|
|
76
|
+
* @param conn Connection to read from
|
|
77
|
+
* @param maxPacketSize Maximum allowed packet size
|
|
78
|
+
* @returns Decoded MQTT packet
|
|
79
|
+
* @throws Error if packet is invalid or too large
|
|
48
80
|
*/
|
|
49
81
|
export async function readPacket(
|
|
50
82
|
conn: Conn,
|
|
@@ -70,12 +102,25 @@ export async function readPacket(
|
|
|
70
102
|
return packet;
|
|
71
103
|
}
|
|
72
104
|
|
|
105
|
+
/**
|
|
106
|
+
* MQTT Connection class implementing IMqttConn interface
|
|
107
|
+
*/
|
|
73
108
|
export class MqttConn implements IMqttConn {
|
|
109
|
+
/** Underlying connection */
|
|
74
110
|
readonly conn: Conn;
|
|
111
|
+
/** Maximum allowed packet size */
|
|
75
112
|
private readonly maxPacketSize: number;
|
|
113
|
+
/** Reason for connection closure if any */
|
|
76
114
|
private _reason: string | undefined = undefined;
|
|
115
|
+
/** Whether connection is closed */
|
|
77
116
|
private _isClosed = false;
|
|
78
117
|
|
|
118
|
+
/**
|
|
119
|
+
* Create new MQTT connection
|
|
120
|
+
* @param options Connection options
|
|
121
|
+
* @param options.conn Underlying socket connection
|
|
122
|
+
* @param options.maxPacketSize Maximum allowed packet size (default 2MB)
|
|
123
|
+
*/
|
|
79
124
|
constructor({
|
|
80
125
|
conn,
|
|
81
126
|
maxPacketSize,
|
|
@@ -87,10 +132,15 @@ export class MqttConn implements IMqttConn {
|
|
|
87
132
|
this.maxPacketSize = maxPacketSize || 2 * 1024 * 1024;
|
|
88
133
|
}
|
|
89
134
|
|
|
135
|
+
/** Get reason for connection closure */
|
|
90
136
|
get reason(): string | undefined {
|
|
91
137
|
return this._reason;
|
|
92
138
|
}
|
|
93
139
|
|
|
140
|
+
/**
|
|
141
|
+
* Async iterator for receiving packets
|
|
142
|
+
* @yields MQTT packets
|
|
143
|
+
*/
|
|
94
144
|
async *[Symbol.asyncIterator](): AsyncIterableIterator<AnyPacket> {
|
|
95
145
|
while (!this._isClosed) {
|
|
96
146
|
try {
|
|
@@ -109,6 +159,10 @@ export class MqttConn implements IMqttConn {
|
|
|
109
159
|
}
|
|
110
160
|
}
|
|
111
161
|
|
|
162
|
+
/**
|
|
163
|
+
* Send an MQTT packet
|
|
164
|
+
* @param data Packet to send
|
|
165
|
+
*/
|
|
112
166
|
async send(data: AnyPacket): Promise<void> {
|
|
113
167
|
try {
|
|
114
168
|
await this.conn.write(encode(data));
|
|
@@ -120,10 +174,12 @@ export class MqttConn implements IMqttConn {
|
|
|
120
174
|
}
|
|
121
175
|
}
|
|
122
176
|
|
|
177
|
+
/** Whether connection is closed */
|
|
123
178
|
get isClosed(): boolean {
|
|
124
179
|
return this._isClosed;
|
|
125
180
|
}
|
|
126
181
|
|
|
182
|
+
/** Close the connection */
|
|
127
183
|
close(): void {
|
|
128
184
|
if (this.isClosed) return;
|
|
129
185
|
try {
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seriousme/opifex",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "MQTT client & server for Deno & NodeJS",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"test": "node --experimental-strip-types --test --test-skip-pattern='/^Deno/'",
|
|
8
8
|
"prebuild": "rm -rf dist",
|
|
9
9
|
"build": "npx -p typescript tsc --build",
|
|
10
|
-
"
|
|
10
|
+
"format": "deno fmt",
|
|
11
11
|
"preversion": "npm run test",
|
|
12
|
-
"
|
|
13
|
-
"
|
|
12
|
+
"postversion": "jq '( { name:.name , version:.version, license:.license } + .deno)' package.json > deno.json",
|
|
13
|
+
"postpostversion": "deno install"
|
|
14
14
|
},
|
|
15
15
|
"keywords": [
|
|
16
16
|
"MQTT",
|
|
@@ -32,21 +32,25 @@
|
|
|
32
32
|
"dist/**/*.d.ts.map"
|
|
33
33
|
],
|
|
34
34
|
"exports": {
|
|
35
|
+
"./tcpClient": "./dist/node/tcpClient.js",
|
|
36
|
+
"./tcpServer": "./dist/node/tcpServer.js",
|
|
35
37
|
"./server": "./dist/server/mod.js",
|
|
36
38
|
"./client": "./dist/client/mod.js",
|
|
39
|
+
"./persistence": "./dist/persistence/persistence.js",
|
|
40
|
+
"./mqttConn": "./dist/mqttConn/mod.js",
|
|
37
41
|
"./mqttPacket": "./dist/mqttPacket/mod.js",
|
|
38
|
-
"./utils": "./dist/utils/mod.js"
|
|
39
|
-
"./tcpClient": "./dist/node/tcpClient.js",
|
|
40
|
-
"./tcpServer": "./dist/node/tcpServer.js"
|
|
42
|
+
"./utils": "./dist/utils/mod.js"
|
|
41
43
|
},
|
|
42
44
|
"deno": {
|
|
43
45
|
"exports": {
|
|
46
|
+
"./tcpClient": "./deno/tcpClient.ts",
|
|
47
|
+
"./tcpServer": "./deno/tcpServer.ts",
|
|
44
48
|
"./server": "./server/mod.ts",
|
|
45
49
|
"./client": "./client/mod.ts",
|
|
50
|
+
"./persistence": "./persistence/persistence.ts",
|
|
51
|
+
"./mqttConn": "./mqttConn/mod.ts",
|
|
46
52
|
"./mqttPacket": "./mqttPacket/mod.ts",
|
|
47
|
-
"./utils": "./utils/mod.ts"
|
|
48
|
-
"./tcpClient": "./deno/tcpClient.ts",
|
|
49
|
-
"./tcpServer": "./deno/tcpServer.ts"
|
|
53
|
+
"./utils": "./utils/mod.ts"
|
|
50
54
|
},
|
|
51
55
|
"exclude": [
|
|
52
56
|
"dist"
|