@seriousme/opifex 1.9.4 → 1.11.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 +37 -26
- package/bin/conformanceServer.ts +3 -2
- package/bin/demoServer.ts +3 -2
- package/bin/mqtt.ts +127 -118
- package/client/client.ts +61 -21
- package/client/context.ts +71 -30
- 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/deno/tcpClient.ts +1 -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 +102 -97
- package/dist/bin/mqtt.js.map +1 -1
- package/dist/client/client.d.ts +16 -5
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +36 -15
- package/dist/client/client.js.map +1 -1
- package/dist/client/context.d.ts +8 -3
- package/dist/client/context.d.ts.map +1 -1
- package/dist/client/context.js +51 -21
- 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 +19 -11
- 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 +30 -11
- 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 +15 -9
- 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 +57 -91
- package/dist/mqttPacket/mod.d.ts.map +1 -1
- package/dist/mqttPacket/mod.js +23 -29
- 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 +12 -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 +42 -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 +18 -11
- 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 +27 -12
- 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 +36 -0
- package/dist/mqttPacket/types.d.ts.map +1 -1
- package/dist/mqttPacket/unsuback.d.ts +17 -10
- 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 +17 -10
- 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/mqttPacket/validators.d.ts +15 -0
- package/dist/mqttPacket/validators.d.ts.map +1 -1
- package/dist/mqttPacket/validators.js +15 -0
- package/dist/mqttPacket/validators.js.map +1 -1
- package/dist/node/tcpClient.js +1 -1
- package/dist/node/tcpClient.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/persistence/memory/memoryPersistence.js +1 -1
- package/dist/persistence/memory/memoryPersistence.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/asyncQueue.d.ts +1 -3
- package/dist/utils/asyncQueue.d.ts.map +1 -1
- package/dist/utils/asyncQueue.js +16 -21
- package/dist/utils/asyncQueue.js.map +1 -1
- package/dist/utils/logger.d.ts +5 -15
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +7 -8
- package/dist/utils/logger.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/dist/utils/utils.d.ts +2 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +6 -0
- package/dist/utils/utils.js.map +1 -0
- 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 +71 -0
- package/mqttPacket/connack.test.ts +84 -64
- package/mqttPacket/connack.ts +88 -24
- package/mqttPacket/connect.test.ts +497 -18
- package/mqttPacket/connect.ts +170 -39
- package/mqttPacket/decoder.test.ts +33 -16
- package/mqttPacket/decoder.ts +173 -5
- package/mqttPacket/disconnect.test.ts +97 -18
- package/mqttPacket/disconnect.ts +84 -12
- package/mqttPacket/encoder.test.ts +32 -8
- package/mqttPacket/encoder.ts +236 -11
- package/mqttPacket/length.ts +3 -2
- package/mqttPacket/mod.ts +76 -39
- 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 +123 -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 +82 -30
- package/mqttPacket/subscribe.test.ts +132 -43
- package/mqttPacket/subscribe.ts +128 -25
- package/mqttPacket/types.ts +43 -0
- package/mqttPacket/unsuback.test.ts +80 -30
- package/mqttPacket/unsuback.ts +68 -13
- package/mqttPacket/unsubscribe.test.ts +59 -34
- package/mqttPacket/unsubscribe.ts +64 -17
- package/mqttPacket/validators.ts +15 -0
- package/node/tcpClient.ts +1 -1
- 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/persistence/memory/memoryPersistence.ts +1 -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/asyncQueue.ts +17 -21
- package/utils/logger.ts +12 -11
- package/utils/mod.ts +0 -3
- package/utils/utils.ts +6 -0
- 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
package/README.md
CHANGED
|
@@ -1,15 +1,49 @@
|
|
|
1
|
+
[](https://github.com/seriousme/opifex/actions/workflows/nodejs-ci.yml)
|
|
1
2
|
[](https://github.com/seriousme/opifex/actions/workflows/deno-ci.yml)
|
|
2
3
|
[](https://github.com/seriousme/opifex/actions/workflows/codeql-analysis.yml)
|
|
3
4
|
|
|
4
5
|
# Opifex
|
|
5
6
|
|
|
6
7
|
Opifex aims to provide a MQTT server and MQTT client in Typescript to be used
|
|
7
|
-
with [
|
|
8
|
+
with [NodeJS](https://nodejs.org), [Deno](https://deno.land) or
|
|
8
9
|
[Bun](https://bun.sh) It has _no_ third party dependencies, it only relies on
|
|
9
10
|
built in modules.
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
# Compatibility
|
|
13
|
+
|
|
14
|
+
The following MQTT versions are supported:
|
|
15
|
+
|
|
16
|
+
| | MQTT 3.1 (v3) | MQTT 3.11 (v4) | MQTT 5.0 (v5) |
|
|
17
|
+
| -------------- | ------------- | -------------- | ------------- |
|
|
18
|
+
| Packet/encoder | ✅ | ✅ | ✅ |
|
|
19
|
+
| Client | ✅ | ✅ | ✅ partially |
|
|
20
|
+
| Server | ❌ | ✅ | ❌ |
|
|
21
|
+
|
|
22
|
+
Client and server currently only have memory based persistence, but one can
|
|
23
|
+
provide its own persistence. (see [#Architecture] )
|
|
24
|
+
|
|
25
|
+
## Usage
|
|
26
|
+
|
|
27
|
+
The most easy way to use this project is to just use the demo server
|
|
28
|
+
(demoServer) and/or the demo client (mqtt).
|
|
29
|
+
|
|
30
|
+
- [NodeJS/Bun](node/README.md)
|
|
31
|
+
- [Deno](deno/README.md)
|
|
32
|
+
|
|
33
|
+
If you want to change the behaviour of the server and/or the client beyond what
|
|
34
|
+
can be done with CLI options then the next step is to clone the demo server
|
|
35
|
+
and/or the client scripts and modify them to your liking.
|
|
36
|
+
|
|
37
|
+
If you want to port the platform independent client and server libs to other
|
|
38
|
+
types of transport (e.g. Unix sockets or websocketstream) then its recommended
|
|
39
|
+
to clone and modify the platform specific code in `/node` or `/deno` as well.
|
|
40
|
+
|
|
41
|
+
If you want to port the platform independent client and server libs to another
|
|
42
|
+
platform then the platform specific code in `/node` or `/deno` might serve as
|
|
43
|
+
inspiration.
|
|
44
|
+
|
|
45
|
+
Bun (as of version 1.2) and Deno are both capable of running the NodeJS version,
|
|
46
|
+
but for historic reasons `/deno` still exists.
|
|
13
47
|
|
|
14
48
|
## Example
|
|
15
49
|
|
|
@@ -65,29 +99,6 @@ A more elaborate example including client and server can be found in the
|
|
|
65
99
|
7. The demo client opens a platform specific socket and passes the resulting
|
|
66
100
|
platform independent streams to the client module.
|
|
67
101
|
|
|
68
|
-
## Usage
|
|
69
|
-
|
|
70
|
-
The most easy way to use this project is to just use the demo server
|
|
71
|
-
(demoServer) and/or the demo client (mqtt). There are separate usage
|
|
72
|
-
instructions for:
|
|
73
|
-
|
|
74
|
-
- [Deno](deno/README.md)
|
|
75
|
-
- [NodeJS](node/README.md)
|
|
76
|
-
|
|
77
|
-
If you want to change the behaviour of the server and/or the client beyond what
|
|
78
|
-
can be done with CLI options then the next step is to clone the demo server
|
|
79
|
-
and/or the client scripts and modify them to your liking.
|
|
80
|
-
|
|
81
|
-
If you want to port the platform independent client and server libs to other
|
|
82
|
-
types of transport (e.g. Unix sockets or websocketstream) then its recommended
|
|
83
|
-
to clone and modify the platform specific code in `/node` or `/deno` as well.
|
|
84
|
-
|
|
85
|
-
If you want to port the platform independent client and server libs to another
|
|
86
|
-
platform then the platform specific code in `/node` or `/deno` might serve as
|
|
87
|
-
inspiration.
|
|
88
|
-
|
|
89
|
-
Bun (as of version 1.2) is capable of running the NodeJS version.
|
|
90
|
-
|
|
91
102
|
## Exports
|
|
92
103
|
|
|
93
104
|
| Export | Description |
|
package/bin/conformanceServer.ts
CHANGED
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
* MQTT Server implementation with authentication and authorization
|
|
6
6
|
* @module mqttServer
|
|
7
7
|
*/
|
|
8
|
+
import { parseArgs } from "node:util";
|
|
8
9
|
import { TcpServer } from "../node/tcpServer.ts";
|
|
9
10
|
import type { Context, TAuthenticationResult, Topic } from "../server/mod.ts";
|
|
10
11
|
import { AuthenticationResult } from "../server/mod.ts";
|
|
11
|
-
import {
|
|
12
|
+
import { logger, LogLevel } from "../utils/mod.ts";
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* UTF-8 decoder for parsing passwords
|
|
@@ -101,7 +102,7 @@ function isAuthorizedToSubscribe(ctx: Context, topic: Topic): boolean {
|
|
|
101
102
|
/**
|
|
102
103
|
* Parse command line arguments and start server
|
|
103
104
|
*/
|
|
104
|
-
const {
|
|
105
|
+
const { positionals: [portNum] } = parseArgs({ allowPositionals: true });
|
|
105
106
|
const port = Number(portNum ?? 1883);
|
|
106
107
|
const hostname = "::";
|
|
107
108
|
logger.level(LogLevel.info);
|
package/bin/demoServer.ts
CHANGED
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
* MQTT Server implementation with authentication and authorization
|
|
5
5
|
* @module mqttServer
|
|
6
6
|
*/
|
|
7
|
+
import { parseArgs } from "node:util";
|
|
7
8
|
import { TcpServer } from "../node/tcpServer.ts";
|
|
8
9
|
import type { Context, TAuthenticationResult, Topic } from "../server/mod.ts";
|
|
9
10
|
import { AuthenticationResult } from "../server/mod.ts";
|
|
10
|
-
import {
|
|
11
|
+
import { logger, LogLevel } from "../utils/mod.ts";
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* UTF-8 decoder for parsing passwords
|
|
@@ -100,7 +101,7 @@ function isAuthorizedToSubscribe(ctx: Context, topic: Topic): boolean {
|
|
|
100
101
|
/**
|
|
101
102
|
* Parse command line arguments and start server
|
|
102
103
|
*/
|
|
103
|
-
const {
|
|
104
|
+
const { positionals: [portNum] } = parseArgs({ allowPositionals: true });
|
|
104
105
|
const port = Number(portNum ?? 1883);
|
|
105
106
|
const hostname = "::";
|
|
106
107
|
logger.level(LogLevel.info);
|
package/bin/mqtt.ts
CHANGED
|
@@ -24,16 +24,24 @@
|
|
|
24
24
|
* # Subscribe to a topic
|
|
25
25
|
* mqtt subscribe -t topic
|
|
26
26
|
*
|
|
27
|
-
* @requires node
|
|
27
|
+
* @requires node:util
|
|
28
28
|
* @requires ../client/mod.ts
|
|
29
29
|
* @requires ../node/tcpClient.ts
|
|
30
30
|
* @requires ../utils/mod.ts
|
|
31
31
|
*/
|
|
32
|
-
|
|
32
|
+
|
|
33
|
+
import { parseArgs } from "node:util";
|
|
34
|
+
import type { ParseArgsConfig } from "node:util";
|
|
35
|
+
import {
|
|
36
|
+
DEFAULT_KEEPALIVE,
|
|
37
|
+
DEFAULT_PROTOCOLLEVEL,
|
|
38
|
+
DEFAULT_URL,
|
|
39
|
+
} from "../client/mod.ts";
|
|
40
|
+
import type { ProtocolLevel } from "../client/mod.ts";
|
|
33
41
|
import { getFileData, TcpClient } from "../node/tcpClient.ts";
|
|
34
|
-
import {
|
|
35
|
-
import type { Args } from "../utils/mod.ts";
|
|
42
|
+
import { logger, LogLevel } from "../utils/mod.ts";
|
|
36
43
|
|
|
44
|
+
type Args = Record<string, string | boolean>;
|
|
37
45
|
const client = new TcpClient();
|
|
38
46
|
const encoder = new TextEncoder();
|
|
39
47
|
const decoder = new TextDecoder();
|
|
@@ -52,59 +60,64 @@ const ConnectHelp = `
|
|
|
52
60
|
-U/--username the username to connect to the server
|
|
53
61
|
-P/--password the password to connect to the server
|
|
54
62
|
-C/--caFile the path to a CA certificate file
|
|
63
|
+
-V/--mqttVersion the MQTT version to use (3,4 or 5): default is ${DEFAULT_PROTOCOLLEVEL}
|
|
55
64
|
-c/--certFile the path to a certificate file
|
|
56
65
|
-k/--keyFile the path to a key file
|
|
66
|
+
-K/--keepAlive the keep alive of the client (in seconds): default is ${DEFAULT_KEEPALIVE}
|
|
57
67
|
-n/--noClean try to resume a previous session
|
|
58
68
|
-h/--help this text
|
|
59
69
|
`;
|
|
60
70
|
|
|
61
71
|
const connectOpts = {
|
|
62
|
-
string:
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
u: "url",
|
|
73
|
-
U: "username",
|
|
74
|
-
P: "password",
|
|
75
|
-
C: "caFile",
|
|
76
|
-
c: "certFile",
|
|
77
|
-
k: "keyFile",
|
|
78
|
-
i: "clientId",
|
|
79
|
-
n: "noClean",
|
|
80
|
-
h: "help",
|
|
81
|
-
},
|
|
82
|
-
boolean: ["noClean", "help"],
|
|
83
|
-
default: {
|
|
84
|
-
noClean: false,
|
|
85
|
-
clientId: `Opifex-${crypto.randomUUID()}`,
|
|
72
|
+
url: { type: "string", short: "u", default: DEFAULT_URL },
|
|
73
|
+
username: { type: "string", short: "U" },
|
|
74
|
+
password: { type: "string", short: "P" },
|
|
75
|
+
caFile: { type: "string", short: "C" },
|
|
76
|
+
certFile: { type: "string", short: "c" },
|
|
77
|
+
keyFile: { type: "string", short: "k" },
|
|
78
|
+
keepAlive: {
|
|
79
|
+
type: "string",
|
|
80
|
+
short: "K",
|
|
81
|
+
default: DEFAULT_KEEPALIVE.toString(),
|
|
86
82
|
},
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
Where options are:
|
|
92
|
-
-t/--topic the topic to use
|
|
93
|
-
-q/--qos the QoS (0/1/2) to use, default is 0
|
|
94
|
-
${ConnectHelp}
|
|
95
|
-
Example: mqtt subscribe -t hello`;
|
|
96
|
-
|
|
97
|
-
const subscribeOpts = {
|
|
98
|
-
string: ["topic"],
|
|
99
|
-
alias: {
|
|
100
|
-
t: "topic",
|
|
101
|
-
q: "qos",
|
|
83
|
+
clientId: {
|
|
84
|
+
type: "string",
|
|
85
|
+
short: "i",
|
|
86
|
+
default: `Opifex-${crypto.randomUUID()}`,
|
|
102
87
|
},
|
|
103
|
-
default:
|
|
104
|
-
|
|
105
|
-
|
|
88
|
+
noClean: { type: "boolean", short: "n", default: false },
|
|
89
|
+
mqttVersion: {
|
|
90
|
+
type: "string",
|
|
91
|
+
short: "V",
|
|
92
|
+
default: DEFAULT_PROTOCOLLEVEL?.toString(),
|
|
106
93
|
},
|
|
107
|
-
}
|
|
94
|
+
help: { type: "boolean", short: "h", default: false },
|
|
95
|
+
} as const;
|
|
96
|
+
|
|
97
|
+
async function connect(connectArgs: Args) {
|
|
98
|
+
const {
|
|
99
|
+
caCerts,
|
|
100
|
+
cert,
|
|
101
|
+
key,
|
|
102
|
+
} = await getTLSdata(connectArgs);
|
|
103
|
+
await client.connect({
|
|
104
|
+
url: new URL(connectArgs.url as string),
|
|
105
|
+
caCerts,
|
|
106
|
+
cert,
|
|
107
|
+
key,
|
|
108
|
+
options: {
|
|
109
|
+
username: connectArgs.username as string,
|
|
110
|
+
password: encodePwd(connectArgs.password as string),
|
|
111
|
+
clientId: connectArgs.clientId as string,
|
|
112
|
+
clean: !connectArgs.noClean,
|
|
113
|
+
keepAlive: Number(connectArgs.keepAlive),
|
|
114
|
+
protocolLevel: parseInt(
|
|
115
|
+
connectArgs.mqttVersion as string,
|
|
116
|
+
) as ProtocolLevel,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
logger.debug("Connected !");
|
|
120
|
+
}
|
|
108
121
|
|
|
109
122
|
function parseQos(qosArg: string | number) {
|
|
110
123
|
const qos = Number(qosArg);
|
|
@@ -122,11 +135,21 @@ function parseQos(qosArg: string | number) {
|
|
|
122
135
|
return 0;
|
|
123
136
|
}
|
|
124
137
|
|
|
138
|
+
function safeParseArgs(config: ParseArgsConfig) {
|
|
139
|
+
try {
|
|
140
|
+
return parseArgs(config);
|
|
141
|
+
} catch (err: unknown) {
|
|
142
|
+
if (err instanceof Error) {
|
|
143
|
+
console.error(err.message);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
125
148
|
async function getTLSdata(connectArgs: Args) {
|
|
126
|
-
const caFileData = await getFileData(connectArgs.caFile);
|
|
149
|
+
const caFileData = await getFileData(connectArgs.caFile as string);
|
|
127
150
|
const caCerts = caFileData ? [caFileData] : undefined;
|
|
128
|
-
const cert = await getFileData(connectArgs.certFile);
|
|
129
|
-
const key = await getFileData(connectArgs.keyFile);
|
|
151
|
+
const cert = await getFileData(connectArgs.certFile as string);
|
|
152
|
+
const key = await getFileData(connectArgs.keyFile as string);
|
|
130
153
|
return {
|
|
131
154
|
caCerts,
|
|
132
155
|
cert,
|
|
@@ -134,43 +157,48 @@ async function getTLSdata(connectArgs: Args) {
|
|
|
134
157
|
};
|
|
135
158
|
}
|
|
136
159
|
|
|
160
|
+
function encodePwd(password: string | undefined) {
|
|
161
|
+
if (typeof password === "string") {
|
|
162
|
+
return encoder.encode(password);
|
|
163
|
+
}
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const SubscribeHelp = `Usage: mqtt subscribe <options>
|
|
168
|
+
|
|
169
|
+
Where options are:
|
|
170
|
+
-t/--topic the topic to use
|
|
171
|
+
-q/--qos the QoS (0/1/2) to use, default is 0
|
|
172
|
+
${ConnectHelp}
|
|
173
|
+
Example: mqtt subscribe -t hello`;
|
|
174
|
+
|
|
175
|
+
const subscribeOpts = {
|
|
176
|
+
topic: { type: "string", short: "t" },
|
|
177
|
+
qos: { type: "string", short: "q", default: "0" },
|
|
178
|
+
} as const;
|
|
179
|
+
|
|
137
180
|
async function subscribe() {
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (connectArgs.help) {
|
|
181
|
+
const res = safeParseArgs({
|
|
182
|
+
options: { ...connectOpts, ...subscribeOpts },
|
|
183
|
+
allowPositionals: true,
|
|
184
|
+
});
|
|
185
|
+
if (!res) return;
|
|
186
|
+
const subscribeArgs = res.values as Record<string, string | boolean>;
|
|
187
|
+
if (subscribeArgs.help) {
|
|
146
188
|
console.log(SubscribeHelp);
|
|
147
189
|
return;
|
|
148
190
|
}
|
|
149
|
-
if (subscribeArgs.topic
|
|
191
|
+
if (typeof subscribeArgs.topic !== "string") {
|
|
150
192
|
console.log("Missing `topic`");
|
|
151
193
|
return;
|
|
152
194
|
}
|
|
153
195
|
try {
|
|
154
|
-
await
|
|
155
|
-
|
|
156
|
-
caCerts,
|
|
157
|
-
cert,
|
|
158
|
-
key,
|
|
159
|
-
options: {
|
|
160
|
-
username: connectArgs.username,
|
|
161
|
-
password: encoder.encode(connectArgs.password),
|
|
162
|
-
clientId: connectArgs.clientId,
|
|
163
|
-
clean: !connectArgs.noClean,
|
|
164
|
-
keepAlive: 60,
|
|
165
|
-
},
|
|
166
|
-
});
|
|
167
|
-
logger.debug("Connected !");
|
|
168
|
-
|
|
169
|
-
client.subscribe({
|
|
196
|
+
await connect(subscribeArgs);
|
|
197
|
+
await client.subscribe({
|
|
170
198
|
subscriptions: [
|
|
171
199
|
{
|
|
172
200
|
topicFilter: subscribeArgs.topic,
|
|
173
|
-
qos: parseQos(subscribeArgs.qos),
|
|
201
|
+
qos: parseQos(subscribeArgs.qos as string),
|
|
174
202
|
},
|
|
175
203
|
],
|
|
176
204
|
});
|
|
@@ -198,58 +226,34 @@ ${ConnectHelp}
|
|
|
198
226
|
Example: mqtt publish -t hello -m world`;
|
|
199
227
|
|
|
200
228
|
const publishOpts = {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
q: "qos",
|
|
207
|
-
r: "retain",
|
|
208
|
-
},
|
|
209
|
-
default: {
|
|
210
|
-
qos: 0,
|
|
211
|
-
dup: false,
|
|
212
|
-
retain: false,
|
|
213
|
-
topic: undefined,
|
|
214
|
-
message: "",
|
|
215
|
-
},
|
|
216
|
-
};
|
|
229
|
+
topic: { type: "string", short: "t" },
|
|
230
|
+
message: { type: "string", short: "m" },
|
|
231
|
+
qos: { type: "string", short: "q", default: "0" },
|
|
232
|
+
retain: { type: "boolean", short: "r", default: false },
|
|
233
|
+
} as const;
|
|
217
234
|
|
|
218
235
|
async function publish() {
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
if (connectArgs.help) {
|
|
236
|
+
const res = safeParseArgs({
|
|
237
|
+
options: { ...connectOpts, ...publishOpts },
|
|
238
|
+
allowPositionals: true,
|
|
239
|
+
});
|
|
240
|
+
if (!res) return;
|
|
241
|
+
const publishArgs = res.values as Record<string, string | boolean>;
|
|
242
|
+
if (publishArgs.help) {
|
|
227
243
|
console.log(PublishHelp);
|
|
228
244
|
return;
|
|
229
245
|
}
|
|
230
|
-
if (publishArgs.topic
|
|
246
|
+
if (typeof publishArgs.topic !== "string") {
|
|
231
247
|
console.log("Missing `topic`");
|
|
232
248
|
return;
|
|
233
249
|
}
|
|
234
250
|
try {
|
|
235
|
-
await
|
|
236
|
-
url: connectArgs.url,
|
|
237
|
-
caCerts,
|
|
238
|
-
cert,
|
|
239
|
-
key,
|
|
240
|
-
options: {
|
|
241
|
-
username: connectArgs.username,
|
|
242
|
-
password: encoder.encode(connectArgs.password),
|
|
243
|
-
clientId: connectArgs.clientId,
|
|
244
|
-
clean: !connectArgs.noClean,
|
|
245
|
-
},
|
|
246
|
-
});
|
|
247
|
-
logger.debug("Connected !");
|
|
251
|
+
await connect(publishArgs);
|
|
248
252
|
await client.publish({
|
|
249
253
|
topic: publishArgs.topic,
|
|
250
|
-
payload: encoder.encode(publishArgs.message),
|
|
251
|
-
retain: publishArgs.retain,
|
|
252
|
-
qos: parseQos(publishArgs.qos),
|
|
254
|
+
payload: encoder.encode(publishArgs.message as string),
|
|
255
|
+
retain: publishArgs.retain as boolean,
|
|
256
|
+
qos: parseQos(publishArgs.qos as string),
|
|
253
257
|
});
|
|
254
258
|
logger.debug("Published!");
|
|
255
259
|
client.disconnect();
|
|
@@ -263,7 +267,12 @@ async function publish() {
|
|
|
263
267
|
}
|
|
264
268
|
|
|
265
269
|
function processArgs() {
|
|
266
|
-
const
|
|
270
|
+
const res = safeParseArgs({
|
|
271
|
+
strict: false,
|
|
272
|
+
allowPositionals: true,
|
|
273
|
+
});
|
|
274
|
+
const positionals = res !== undefined ? res.positionals : [];
|
|
275
|
+
const cmd = positionals[0];
|
|
267
276
|
switch (cmd) {
|
|
268
277
|
case "publish":
|
|
269
278
|
publish();
|
package/client/client.ts
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
import {
|
|
2
|
-
type ConnectPacket,
|
|
3
2
|
Deferred,
|
|
4
3
|
logger,
|
|
5
4
|
MemoryStore,
|
|
5
|
+
MQTTLevel,
|
|
6
6
|
PacketType,
|
|
7
|
-
type PublishPacket,
|
|
8
|
-
type SockConn,
|
|
9
|
-
type SubscribePacket,
|
|
10
|
-
type TAuthenticationResult,
|
|
11
7
|
} from "./deps.ts";
|
|
12
8
|
|
|
9
|
+
import type {
|
|
10
|
+
ConnectPacket,
|
|
11
|
+
PublishPacket,
|
|
12
|
+
SockConn,
|
|
13
|
+
SubscribePacket,
|
|
14
|
+
TAuthenticationResult,
|
|
15
|
+
} from "./deps.ts";
|
|
16
|
+
|
|
17
|
+
import { noop } from "../utils/utils.ts";
|
|
18
|
+
|
|
13
19
|
import { Context } from "./context.ts";
|
|
20
|
+
import type { TConnectionState } from "./ConnectionState.ts";
|
|
21
|
+
import { assert } from "../utils/assert.ts";
|
|
14
22
|
|
|
15
23
|
/**
|
|
16
24
|
* Generates a random client ID with the given prefix
|
|
@@ -23,7 +31,7 @@ function generateClientId(prefix: string): string {
|
|
|
23
31
|
|
|
24
32
|
type ConnectOptions = Omit<
|
|
25
33
|
ConnectPacket,
|
|
26
|
-
"type" | "protocolName"
|
|
34
|
+
"type" | "protocolName"
|
|
27
35
|
>;
|
|
28
36
|
|
|
29
37
|
/** ConnectParameters define how to connect */
|
|
@@ -37,9 +45,15 @@ export type ConnectParameters = {
|
|
|
37
45
|
};
|
|
38
46
|
|
|
39
47
|
/** PublishParameters define how a message should be published */
|
|
40
|
-
export type PublishParameters = Omit<
|
|
48
|
+
export type PublishParameters = Omit<
|
|
49
|
+
PublishPacket,
|
|
50
|
+
"type" | "id" | "protocolLevel"
|
|
51
|
+
>;
|
|
41
52
|
/** SubscribeParameters define how to subscribe to a topic */
|
|
42
|
-
export type SubscribeParameters = Omit<
|
|
53
|
+
export type SubscribeParameters = Omit<
|
|
54
|
+
SubscribePacket,
|
|
55
|
+
"type" | "id" | "protocolLevel"
|
|
56
|
+
>;
|
|
43
57
|
|
|
44
58
|
/**
|
|
45
59
|
* Implements exponential backoff sleep with optional randomization
|
|
@@ -60,9 +74,12 @@ function backOffSleep(random: boolean, attempt: number): Promise<void> {
|
|
|
60
74
|
return new Promise((resolve) => setTimeout(resolve, delay));
|
|
61
75
|
}
|
|
62
76
|
|
|
63
|
-
/**
|
|
77
|
+
/** the default MQTT URL to connect to */
|
|
64
78
|
export const DEFAULT_URL = "mqtt://localhost:1883/";
|
|
65
|
-
|
|
79
|
+
/** the default protocol level to connect with*/
|
|
80
|
+
export const DEFAULT_PROTOCOLLEVEL = MQTTLevel.v4;
|
|
81
|
+
/** the default keepalive time */
|
|
82
|
+
export const DEFAULT_KEEPALIVE = 60; // 60 seconds
|
|
66
83
|
const DEFAULT_RETRIES = 3; // on first connect
|
|
67
84
|
const CLIENTID_PREFIX = "opifex"; // on first connect
|
|
68
85
|
|
|
@@ -76,26 +93,37 @@ const CLIENTID_PREFIX = "opifex"; // on first connect
|
|
|
76
93
|
* connection type that is supported by the subclass.
|
|
77
94
|
*/
|
|
78
95
|
export class Client {
|
|
96
|
+
public onError: (err: Error) => void = noop;
|
|
97
|
+
public onConnected: () => void = noop;
|
|
98
|
+
public onDisconnected: () => void = noop;
|
|
99
|
+
public onReconnecting: () => void = noop;
|
|
100
|
+
|
|
79
101
|
protected clientIdPrefix = CLIENTID_PREFIX;
|
|
80
102
|
protected numberOfRetries = DEFAULT_RETRIES;
|
|
81
103
|
protected url: URL = new URL(DEFAULT_URL);
|
|
82
104
|
protected keepAlive = DEFAULT_KEEPALIVE;
|
|
105
|
+
protected protocolLevel = DEFAULT_PROTOCOLLEVEL;
|
|
83
106
|
protected autoReconnect = true;
|
|
84
107
|
private caCerts?: string[];
|
|
85
108
|
private cert?: string;
|
|
86
109
|
private key?: string;
|
|
87
110
|
private clientId: string;
|
|
88
|
-
private ctx
|
|
111
|
+
private ctx: Context;
|
|
89
112
|
private connectPacket?: ConnectPacket;
|
|
90
113
|
|
|
91
114
|
/**
|
|
92
115
|
* Creates a new MQTT client instance
|
|
93
116
|
*/
|
|
94
117
|
constructor() {
|
|
118
|
+
this.ctx = new Context(new MemoryStore(), this);
|
|
95
119
|
this.clientId = generateClientId(this.clientIdPrefix);
|
|
96
120
|
this.numberOfRetries = DEFAULT_RETRIES;
|
|
97
121
|
}
|
|
98
122
|
|
|
123
|
+
get connectionState(): TConnectionState {
|
|
124
|
+
return this.ctx.connectionState;
|
|
125
|
+
}
|
|
126
|
+
|
|
99
127
|
/**
|
|
100
128
|
* Creates a new connection to the MQTT broker
|
|
101
129
|
* @param protocol - The protocol to use (mqtt, mqtts, etc)
|
|
@@ -116,7 +144,7 @@ export class Client {
|
|
|
116
144
|
): Promise<SockConn> {
|
|
117
145
|
// if you need to support alternative connection types just
|
|
118
146
|
// overload this method in your subclass
|
|
119
|
-
throw `Unsupported protocol: ${protocol}
|
|
147
|
+
throw new Error(`Unsupported protocol: ${protocol}`);
|
|
120
148
|
}
|
|
121
149
|
|
|
122
150
|
/**
|
|
@@ -127,12 +155,13 @@ export class Client {
|
|
|
127
155
|
if (!this.connectPacket) {
|
|
128
156
|
return;
|
|
129
157
|
}
|
|
158
|
+
|
|
130
159
|
let isReconnect = false;
|
|
131
160
|
let attempt = 1;
|
|
132
161
|
let lastMessage = new Error();
|
|
133
162
|
let tryConnect = true;
|
|
134
163
|
while (tryConnect) {
|
|
135
|
-
logger.debug(`${isReconnect ? "re" : ""}connecting`);
|
|
164
|
+
logger.debug(`${isReconnect ? "re" : ""}connecting, attempt ${attempt}`);
|
|
136
165
|
try {
|
|
137
166
|
const conn = await this.createConn(
|
|
138
167
|
this.url.protocol,
|
|
@@ -151,15 +180,23 @@ export class Client {
|
|
|
151
180
|
this.connectPacket.clean = false;
|
|
152
181
|
this.ctx.close();
|
|
153
182
|
} catch (err) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
183
|
+
assert(
|
|
184
|
+
err instanceof Error,
|
|
185
|
+
`Caught something that is not an instance of Error: ${err}`,
|
|
186
|
+
);
|
|
187
|
+
queueMicrotask(() => this.onError(err));
|
|
188
|
+
lastMessage = err;
|
|
189
|
+
logger.debug({ lastMessage });
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (tryConnect && (isReconnect || attempt < this.numberOfRetries)) {
|
|
193
|
+
await backOffSleep(true, attempt);
|
|
194
|
+
if (!isReconnect) {
|
|
195
|
+
attempt++;
|
|
162
196
|
}
|
|
197
|
+
queueMicrotask(this.onReconnecting);
|
|
198
|
+
} else {
|
|
199
|
+
tryConnect = false;
|
|
163
200
|
}
|
|
164
201
|
}
|
|
165
202
|
|
|
@@ -183,6 +220,7 @@ export class Client {
|
|
|
183
220
|
{
|
|
184
221
|
keepAlive: this.keepAlive,
|
|
185
222
|
clientId: this.clientId,
|
|
223
|
+
protocolLevel: this.protocolLevel,
|
|
186
224
|
},
|
|
187
225
|
params?.options,
|
|
188
226
|
);
|
|
@@ -212,6 +250,7 @@ export class Client {
|
|
|
212
250
|
async publish(params: PublishParameters): Promise<void> {
|
|
213
251
|
const packet: PublishPacket = {
|
|
214
252
|
type: PacketType.publish,
|
|
253
|
+
protocolLevel: this.ctx.protocolLevel,
|
|
215
254
|
...params,
|
|
216
255
|
};
|
|
217
256
|
await this.ctx.publish(packet);
|
|
@@ -226,6 +265,7 @@ export class Client {
|
|
|
226
265
|
const packet: SubscribePacket = {
|
|
227
266
|
type: PacketType.subscribe,
|
|
228
267
|
id: 0, //placeholder
|
|
268
|
+
protocolLevel: this.ctx.protocolLevel,
|
|
229
269
|
...params,
|
|
230
270
|
};
|
|
231
271
|
await this.ctx.subscribe(packet);
|