@seriousme/opifex 1.11.2 → 2.0.3
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/LICENSE.txt +1 -1
- package/README.md +102 -43
- package/bin/conformanceServer.ts +45 -13
- package/bin/demoServer.ts +38 -13
- package/bin/mqtt.ts +52 -30
- package/client/ConnectionState.ts +2 -0
- package/client/client.ts +57 -47
- package/client/context.ts +75 -21
- package/client/deps.ts +5 -0
- package/client/handlers/handleAuth.test.ts +193 -0
- package/client/handlers/handleAuth.ts +89 -0
- package/client/handlers/handleConnack.test.ts +173 -0
- package/client/handlers/handleConnack.ts +16 -6
- package/client/handlers/handleDisconnect.test.ts +22 -0
- package/client/handlers/handleDisconnect.ts +17 -0
- package/client/handlers/handlePacket.test.ts +242 -0
- package/client/handlers/handlePacket.ts +19 -5
- package/client/handlers/handlePuback.test.ts +99 -0
- package/client/handlers/handlePuback.ts +6 -0
- package/client/handlers/handlePubcomp.test.ts +112 -0
- package/client/handlers/handlePubcomp.ts +5 -0
- package/client/handlers/handlePublish.test.ts +188 -0
- package/client/handlers/handlePubrec.test.ts +119 -0
- package/client/handlers/handlePubrec.ts +5 -1
- package/client/handlers/handlePubrel.test.ts +136 -0
- package/client/handlers/handleSuback.test.ts +122 -0
- package/client/handlers/handleSuback.ts +3 -0
- package/client/handlers/handleUnsuback.test.ts +101 -0
- package/client/mod.ts +2 -2
- package/client/store/memoryStore.ts +2 -2
- package/client/store/store.ts +3 -1
- package/deno/README.md +1 -2
- package/deno/tcpClient.test.ts +75 -0
- package/deno/tcpClient.ts +16 -11
- package/deno/tcpServer.test.ts +22 -21
- package/deno/tcpServer.ts +5 -0
- package/deno/tlsServer.test.ts +97 -0
- package/deno/tlsServer.ts +42 -0
- package/deno/wsServer.test.ts +93 -0
- package/deno/wsServer.ts +73 -0
- package/dev_utils/generateCert.ts +95 -0
- package/dev_utils/mockConn.ts +36 -0
- package/dev_utils/mockServer.ts +28 -0
- package/dev_utils/mod.ts +30 -2
- package/dev_utils/packetHelpers.ts +404 -0
- package/dev_utils/test-handlers.ts +98 -0
- package/dev_utils/timers.ts +14 -0
- package/dev_utils/webStreamPair.test.ts +171 -0
- package/dev_utils/webStreamPair.ts +143 -0
- package/dist/bin/conformanceServer.js +17 -12
- package/dist/bin/conformanceServer.js.map +1 -1
- package/dist/bin/demoServer.js +16 -12
- package/dist/bin/demoServer.js.map +1 -1
- package/dist/bin/mqtt.js +19 -16
- package/dist/bin/mqtt.js.map +1 -1
- package/dist/client/ConnectionState.d.ts +2 -0
- package/dist/client/ConnectionState.d.ts.map +1 -1
- package/dist/client/ConnectionState.js +2 -0
- package/dist/client/ConnectionState.js.map +1 -1
- package/dist/client/client.d.ts +19 -22
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +34 -20
- package/dist/client/client.js.map +1 -1
- package/dist/client/context.d.ts +11 -3
- package/dist/client/context.d.ts.map +1 -1
- package/dist/client/context.js +44 -12
- 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 +1 -1
- package/dist/client/deps.js.map +1 -1
- package/dist/client/handlers/handleAuth.d.ts +9 -0
- package/dist/client/handlers/handleAuth.d.ts.map +1 -0
- package/dist/client/handlers/handleAuth.js +66 -0
- package/dist/client/handlers/handleAuth.js.map +1 -0
- package/dist/client/handlers/handleConnack.d.ts +2 -2
- package/dist/client/handlers/handleConnack.d.ts.map +1 -1
- package/dist/client/handlers/handleConnack.js +16 -6
- package/dist/client/handlers/handleConnack.js.map +1 -1
- package/dist/client/handlers/handleDisconnect.d.ts +11 -0
- package/dist/client/handlers/handleDisconnect.d.ts.map +1 -0
- package/dist/client/handlers/handleDisconnect.js +15 -0
- package/dist/client/handlers/handleDisconnect.js.map +1 -0
- package/dist/client/handlers/handlePacket.d.ts.map +1 -1
- package/dist/client/handlers/handlePacket.js +14 -3
- package/dist/client/handlers/handlePacket.js.map +1 -1
- package/dist/client/handlers/handlePuback.d.ts.map +1 -1
- package/dist/client/handlers/handlePuback.js +5 -0
- package/dist/client/handlers/handlePuback.js.map +1 -1
- package/dist/client/handlers/handlePubcomp.d.ts.map +1 -1
- package/dist/client/handlers/handlePubcomp.js +5 -0
- package/dist/client/handlers/handlePubcomp.js.map +1 -1
- package/dist/client/handlers/handlePubrec.d.ts.map +1 -1
- package/dist/client/handlers/handlePubrec.js +5 -1
- package/dist/client/handlers/handlePubrec.js.map +1 -1
- package/dist/client/handlers/handleSuback.d.ts +1 -0
- package/dist/client/handlers/handleSuback.d.ts.map +1 -1
- package/dist/client/handlers/handleSuback.js +3 -0
- package/dist/client/handlers/handleSuback.js.map +1 -1
- package/dist/client/mod.d.ts +2 -2
- package/dist/client/mod.d.ts.map +1 -1
- package/dist/client/mod.js +1 -1
- package/dist/client/mod.js.map +1 -1
- package/dist/client/store/memoryStore.d.ts.map +1 -1
- package/dist/client/store/memoryStore.js +2 -2
- package/dist/client/store/memoryStore.js.map +1 -1
- package/dist/client/store/store.d.ts +2 -1
- package/dist/client/store/store.d.ts.map +1 -1
- package/dist/client/store/store.js +1 -1
- package/dist/client/store/store.js.map +1 -1
- package/dist/dev_utils/generateCert.d.ts +11 -0
- package/dist/dev_utils/generateCert.d.ts.map +1 -0
- package/dist/dev_utils/generateCert.js +76 -0
- package/dist/dev_utils/generateCert.js.map +1 -0
- package/dist/examples/authHandler.test.d.ts +2 -0
- package/dist/examples/authHandler.test.d.ts.map +1 -0
- package/dist/examples/authHandler.test.js +123 -0
- package/dist/examples/authHandler.test.js.map +1 -0
- package/dist/examples/mqtt.test.d.ts +2 -0
- package/dist/examples/mqtt.test.d.ts.map +1 -0
- package/dist/examples/mqtt.test.js +70 -0
- package/dist/examples/mqtt.test.js.map +1 -0
- package/dist/examples/mqtts.test.d.ts +2 -0
- package/dist/examples/mqtts.test.d.ts.map +1 -0
- package/dist/examples/mqtts.test.js +81 -0
- package/dist/examples/mqtts.test.js.map +1 -0
- package/dist/mqttConn/mqttConn.d.ts +25 -16
- package/dist/mqttConn/mqttConn.d.ts.map +1 -1
- package/dist/mqttConn/mqttConn.js +69 -40
- package/dist/mqttConn/mqttConn.js.map +1 -1
- package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -1
- package/dist/mqttPacket/BitMask.d.ts +12 -11
- package/dist/mqttPacket/BitMask.d.ts.map +1 -1
- package/dist/mqttPacket/BitMask.js +10 -18
- package/dist/mqttPacket/BitMask.js.map +1 -1
- package/dist/mqttPacket/PacketType.d.ts.map +1 -1
- package/dist/mqttPacket/Properties.d.ts +2 -2
- package/dist/mqttPacket/Properties.d.ts.map +1 -1
- package/dist/mqttPacket/Properties.js.map +1 -1
- package/dist/mqttPacket/ReasonCode.d.ts +1 -0
- package/dist/mqttPacket/ReasonCode.d.ts.map +1 -1
- package/dist/mqttPacket/ReasonCode.js +1 -0
- package/dist/mqttPacket/ReasonCode.js.map +1 -1
- package/dist/mqttPacket/RetainHandling.d.ts.map +1 -1
- package/dist/mqttPacket/auth.d.ts +3 -5
- package/dist/mqttPacket/auth.d.ts.map +1 -1
- package/dist/mqttPacket/auth.js +31 -30
- package/dist/mqttPacket/auth.js.map +1 -1
- package/dist/mqttPacket/codec.d.ts +48 -0
- package/dist/mqttPacket/codec.d.ts.map +1 -0
- package/dist/mqttPacket/codec.js +93 -0
- package/dist/mqttPacket/codec.js.map +1 -0
- package/dist/mqttPacket/connack.d.ts +4 -5
- package/dist/mqttPacket/connack.d.ts.map +1 -1
- package/dist/mqttPacket/connack.js +43 -45
- package/dist/mqttPacket/connack.js.map +1 -1
- package/dist/mqttPacket/connect.d.ts +26 -27
- package/dist/mqttPacket/connect.d.ts.map +1 -1
- package/dist/mqttPacket/connect.js +156 -157
- package/dist/mqttPacket/connect.js.map +1 -1
- package/dist/mqttPacket/decoder.d.ts +1 -13
- package/dist/mqttPacket/decoder.d.ts.map +1 -1
- package/dist/mqttPacket/decoder.js +7 -28
- package/dist/mqttPacket/decoder.js.map +1 -1
- package/dist/mqttPacket/disconnect.d.ts +4 -5
- package/dist/mqttPacket/disconnect.d.ts.map +1 -1
- package/dist/mqttPacket/disconnect.js +41 -43
- package/dist/mqttPacket/disconnect.js.map +1 -1
- package/dist/mqttPacket/encoder.d.ts +1 -15
- package/dist/mqttPacket/encoder.d.ts.map +1 -1
- package/dist/mqttPacket/encoder.js +4 -27
- package/dist/mqttPacket/encoder.js.map +1 -1
- package/dist/mqttPacket/length.js +1 -1
- package/dist/mqttPacket/length.js.map +1 -1
- package/dist/mqttPacket/mod.d.ts +21 -103
- package/dist/mqttPacket/mod.d.ts.map +1 -1
- package/dist/mqttPacket/mod.js +5 -94
- package/dist/mqttPacket/mod.js.map +1 -1
- package/dist/mqttPacket/pingreq.d.ts +4 -5
- package/dist/mqttPacket/pingreq.d.ts.map +1 -1
- package/dist/mqttPacket/pingreq.js +11 -13
- package/dist/mqttPacket/pingreq.js.map +1 -1
- package/dist/mqttPacket/pingres.d.ts +4 -5
- package/dist/mqttPacket/pingres.d.ts.map +1 -1
- package/dist/mqttPacket/pingres.js +11 -13
- package/dist/mqttPacket/pingres.js.map +1 -1
- package/dist/mqttPacket/protocolLevels.d.ts +11 -6
- package/dist/mqttPacket/protocolLevels.d.ts.map +1 -1
- package/dist/mqttPacket/protocolLevels.js +5 -1
- package/dist/mqttPacket/protocolLevels.js.map +1 -1
- package/dist/mqttPacket/pubblishAcks.d.ts +9 -10
- package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -1
- package/dist/mqttPacket/pubblishAcks.js +43 -45
- package/dist/mqttPacket/pubblishAcks.js.map +1 -1
- package/dist/mqttPacket/publish.d.ts +14 -14
- package/dist/mqttPacket/publish.d.ts.map +1 -1
- package/dist/mqttPacket/publish.js +53 -55
- package/dist/mqttPacket/publish.js.map +1 -1
- package/dist/mqttPacket/suback.d.ts +4 -5
- package/dist/mqttPacket/suback.d.ts.map +1 -1
- package/dist/mqttPacket/suback.js +38 -40
- package/dist/mqttPacket/suback.js.map +1 -1
- package/dist/mqttPacket/subscribe.d.ts +36 -7
- package/dist/mqttPacket/subscribe.d.ts.map +1 -1
- package/dist/mqttPacket/subscribe.js +90 -89
- package/dist/mqttPacket/subscribe.js.map +1 -1
- package/dist/mqttPacket/types.d.ts +1 -8
- package/dist/mqttPacket/types.d.ts.map +1 -1
- package/dist/mqttPacket/unsuback.d.ts +4 -5
- package/dist/mqttPacket/unsuback.d.ts.map +1 -1
- package/dist/mqttPacket/unsuback.js +32 -34
- package/dist/mqttPacket/unsuback.js.map +1 -1
- package/dist/mqttPacket/unsubscribe.d.ts +23 -6
- package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
- package/dist/mqttPacket/unsubscribe.js +45 -44
- package/dist/mqttPacket/unsubscribe.js.map +1 -1
- package/dist/mqttPacket/validators.d.ts +4 -16
- package/dist/mqttPacket/validators.d.ts.map +1 -1
- package/dist/mqttPacket/validators.js +5 -26
- package/dist/mqttPacket/validators.js.map +1 -1
- package/dist/node/tcpClient.d.ts +1 -1
- package/dist/node/tcpClient.d.ts.map +1 -1
- package/dist/node/tcpClient.js +12 -7
- package/dist/node/tcpClient.js.map +1 -1
- package/dist/node/tcpServer.d.ts.map +1 -1
- package/dist/node/tcpServer.js +4 -0
- package/dist/node/tcpServer.js.map +1 -1
- package/dist/node/tlsServer.d.ts +19 -0
- package/dist/node/tlsServer.d.ts.map +1 -0
- package/dist/node/tlsServer.js +58 -0
- package/dist/node/tlsServer.js.map +1 -0
- package/dist/node/wrapNodeSocket.d.ts.map +1 -1
- package/dist/node/wrapNodeSocket.js +6 -28
- package/dist/node/wrapNodeSocket.js.map +1 -1
- package/dist/persistence/basicPersistence.d.ts +36 -0
- package/dist/persistence/basicPersistence.d.ts.map +1 -0
- package/dist/persistence/basicPersistence.js +306 -0
- package/dist/persistence/basicPersistence.js.map +1 -0
- package/dist/persistence/deps.d.ts +3 -2
- package/dist/persistence/deps.d.ts.map +1 -1
- package/dist/persistence/deps.js +2 -1
- package/dist/persistence/deps.js.map +1 -1
- package/dist/persistence/memory/memoryPersistence.d.ts +6 -23
- package/dist/persistence/memory/memoryPersistence.d.ts.map +1 -1
- package/dist/persistence/memory/memoryPersistence.js +12 -115
- package/dist/persistence/memory/memoryPersistence.js.map +1 -1
- package/dist/persistence/memory/memoryStorage.d.ts +45 -0
- package/dist/persistence/memory/memoryStorage.d.ts.map +1 -0
- package/dist/persistence/memory/memoryStorage.js +143 -0
- package/dist/persistence/memory/memoryStorage.js.map +1 -0
- package/dist/persistence/mod.d.ts +3 -3
- package/dist/persistence/mod.d.ts.map +1 -1
- package/dist/persistence/mod.js +6 -1
- package/dist/persistence/mod.js.map +1 -1
- package/dist/persistence/persistence.d.ts +44 -69
- package/dist/persistence/persistence.d.ts.map +1 -1
- package/dist/persistence/persistence.js +1 -2
- package/dist/persistence/persistence.js.map +1 -1
- package/dist/persistence/sqlite/sqliteDatabase.d.ts +46 -0
- package/dist/persistence/sqlite/sqliteDatabase.d.ts.map +1 -0
- package/dist/persistence/sqlite/sqliteDatabase.js +215 -0
- package/dist/persistence/sqlite/sqliteDatabase.js.map +1 -0
- package/dist/persistence/sqlite/sqlitePersistence.d.ts +16 -0
- package/dist/persistence/sqlite/sqlitePersistence.d.ts.map +1 -0
- package/dist/persistence/sqlite/sqlitePersistence.js +29 -0
- package/dist/persistence/sqlite/sqlitePersistence.js.map +1 -0
- package/dist/persistence/sqlite/sqliteStorage.d.ts +36 -0
- package/dist/persistence/sqlite/sqliteStorage.d.ts.map +1 -0
- package/dist/persistence/sqlite/sqliteStorage.js +194 -0
- package/dist/persistence/sqlite/sqliteStorage.js.map +1 -0
- package/dist/persistence/storage.d.ts +38 -0
- package/dist/persistence/storage.d.ts.map +1 -0
- package/dist/persistence/storage.js +5 -0
- package/dist/persistence/storage.js.map +1 -0
- package/dist/server/config.d.ts +47 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +41 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/context.d.ts +198 -24
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +432 -53
- package/dist/server/context.js.map +1 -1
- package/dist/server/deps.d.ts +5 -6
- package/dist/server/deps.d.ts.map +1 -1
- package/dist/server/deps.js +2 -2
- package/dist/server/deps.js.map +1 -1
- package/dist/server/handlers/completeConnect.d.ts +8 -0
- package/dist/server/handlers/completeConnect.d.ts.map +1 -0
- package/dist/server/handlers/completeConnect.js +74 -0
- package/dist/server/handlers/completeConnect.js.map +1 -0
- package/dist/server/handlers/handleAuth.d.ts +9 -0
- package/dist/server/handlers/handleAuth.d.ts.map +1 -0
- package/dist/server/handlers/handleAuth.js +69 -0
- package/dist/server/handlers/handleAuth.js.map +1 -0
- package/dist/server/handlers/handleConnect.d.ts +2 -4
- package/dist/server/handlers/handleConnect.d.ts.map +1 -1
- package/dist/server/handlers/handleConnect.js +140 -67
- package/dist/server/handlers/handleConnect.js.map +1 -1
- package/dist/server/handlers/handleDisconnect.d.ts +1 -1
- package/dist/server/handlers/handleDisconnect.d.ts.map +1 -1
- package/dist/server/handlers/handleDisconnect.js +3 -3
- package/dist/server/handlers/handleDisconnect.js.map +1 -1
- package/dist/server/handlers/handlePacket.d.ts.map +1 -1
- package/dist/server/handlers/handlePacket.js +19 -6
- package/dist/server/handlers/handlePacket.js.map +1 -1
- package/dist/server/handlers/handlePuback.d.ts +1 -3
- package/dist/server/handlers/handlePuback.d.ts.map +1 -1
- package/dist/server/handlers/handlePuback.js +2 -8
- package/dist/server/handlers/handlePuback.js.map +1 -1
- package/dist/server/handlers/handlePubcomp.d.ts +1 -1
- package/dist/server/handlers/handlePubcomp.d.ts.map +1 -1
- package/dist/server/handlers/handlePubcomp.js +2 -4
- package/dist/server/handlers/handlePubcomp.js.map +1 -1
- package/dist/server/handlers/handlePublish.d.ts +1 -1
- package/dist/server/handlers/handlePublish.d.ts.map +1 -1
- package/dist/server/handlers/handlePublish.js +149 -45
- package/dist/server/handlers/handlePublish.js.map +1 -1
- package/dist/server/handlers/handlePubrec.d.ts.map +1 -1
- package/dist/server/handlers/handlePubrec.js +2 -3
- package/dist/server/handlers/handlePubrec.js.map +1 -1
- package/dist/server/handlers/handlePubrel.d.ts.map +1 -1
- package/dist/server/handlers/handlePubrel.js +6 -2
- package/dist/server/handlers/handlePubrel.js.map +1 -1
- package/dist/server/handlers/handleSubscribe.d.ts +1 -6
- package/dist/server/handlers/handleSubscribe.d.ts.map +1 -1
- package/dist/server/handlers/handleSubscribe.js +99 -38
- package/dist/server/handlers/handleSubscribe.js.map +1 -1
- package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -1
- package/dist/server/handlers/handleUnsubscribe.js +19 -4
- package/dist/server/handlers/handleUnsubscribe.js.map +1 -1
- package/dist/server/mod.d.ts +3 -3
- package/dist/server/mod.d.ts.map +1 -1
- package/dist/server/mod.js +1 -1
- package/dist/server/mod.js.map +1 -1
- package/dist/server/server.d.ts +29 -6
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +84 -15
- package/dist/server/server.js.map +1 -1
- package/dist/socket/socket.d.ts +11 -9
- package/dist/socket/socket.d.ts.map +1 -1
- package/dist/socket/socket.js +67 -15
- package/dist/socket/socket.js.map +1 -1
- package/dist/timer/timer.d.ts +32 -0
- package/dist/timer/timer.d.ts.map +1 -1
- package/dist/timer/timer.js +32 -0
- package/dist/timer/timer.js.map +1 -1
- package/dist/trie/trie.d.ts +10 -5
- package/dist/trie/trie.d.ts.map +1 -1
- package/dist/trie/trie.js +47 -17
- package/dist/trie/trie.js.map +1 -1
- package/dist/utils/assert.d.ts.map +1 -1
- package/dist/utils/{BufferedAsyncIterable.d.ts → bufferedAsyncIterable.d.ts} +1 -1
- package/dist/utils/bufferedAsyncIterable.d.ts.map +1 -0
- package/dist/utils/{BufferedAsyncIterable.js → bufferedAsyncIterable.js} +1 -1
- package/dist/utils/bufferedAsyncIterable.js.map +1 -0
- package/dist/utils/deferred.d.ts.map +1 -1
- package/dist/utils/deferred.js.map +1 -1
- package/dist/utils/getOrInsertPolyFill.d.ts +2 -0
- package/dist/utils/getOrInsertPolyFill.d.ts.map +1 -0
- package/dist/utils/getOrInsertPolyFill.js +12 -0
- package/dist/utils/getOrInsertPolyFill.js.map +1 -0
- package/dist/utils/logger.d.ts +40 -3
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +53 -7
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/mod.d.ts +6 -1
- package/dist/utils/mod.d.ts.map +1 -1
- package/dist/utils/mod.js +5 -1
- package/dist/utils/mod.js.map +1 -1
- package/dist/utils/outboundTopicAliasManager.d.ts +52 -0
- package/dist/utils/outboundTopicAliasManager.d.ts.map +1 -0
- package/dist/utils/outboundTopicAliasManager.js +74 -0
- package/dist/utils/outboundTopicAliasManager.js.map +1 -0
- package/dist/utils/queue.d.ts.map +1 -1
- package/dist/utils/topicFilter.d.ts +32 -0
- package/dist/utils/topicFilter.d.ts.map +1 -0
- package/dist/utils/topicFilter.js +52 -0
- package/dist/utils/topicFilter.js.map +1 -0
- package/dist/utils/utils.d.ts +2 -0
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +2 -0
- package/dist/utils/utils.js.map +1 -1
- package/dist/utils/validators.d.ts +34 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +61 -0
- package/dist/utils/validators.js.map +1 -0
- package/dist/web/webSocketStream.d.ts +29 -0
- package/dist/web/webSocketStream.d.ts.map +1 -0
- package/dist/web/webSocketStream.js +69 -0
- package/dist/web/webSocketStream.js.map +1 -0
- package/dist/web/wrapWebSocket.d.ts +12 -0
- package/dist/web/wrapWebSocket.d.ts.map +1 -0
- package/dist/web/wrapWebSocket.js +41 -0
- package/dist/web/wrapWebSocket.js.map +1 -0
- package/dist/web/wsClient.d.ts +7 -0
- package/dist/web/wsClient.d.ts.map +1 -0
- package/dist/web/wsClient.js +22 -0
- package/dist/web/wsClient.js.map +1 -0
- package/dist/web/wsClient.test.d.ts +2 -0
- package/dist/web/wsClient.test.d.ts.map +1 -0
- package/dist/web/wsClient.test.js +20 -0
- package/dist/web/wsClient.test.js.map +1 -0
- package/examples/authHandler.test.ts +164 -0
- package/examples/mqtt.test.ts +89 -0
- package/examples/mqtts.test.ts +100 -0
- package/examples/webSocket.test.ts +94 -0
- package/mqttConn/mqttConn.test.ts +9 -9
- package/mqttConn/mqttConn.ts +91 -49
- package/mqttPacket/BitMask.ts +11 -19
- package/mqttPacket/Properties.ts +6 -3
- package/mqttPacket/ReasonCode.ts +2 -1
- package/mqttPacket/auth.test.ts +1 -1
- package/mqttPacket/auth.ts +41 -48
- package/mqttPacket/codec.ts +146 -0
- package/mqttPacket/connack.ts +57 -68
- package/mqttPacket/connect.test.ts +2 -2
- package/mqttPacket/connect.ts +197 -204
- package/mqttPacket/decoder.test.ts +0 -39
- package/mqttPacket/decoder.ts +9 -36
- package/mqttPacket/disconnect.ts +57 -68
- package/mqttPacket/encoder.ts +5 -40
- package/mqttPacket/length.ts +1 -1
- package/mqttPacket/mod.ts +48 -200
- package/mqttPacket/pingreq.ts +21 -27
- package/mqttPacket/pingres.ts +21 -27
- package/mqttPacket/protocolLevels.ts +12 -7
- package/mqttPacket/pubblishAcks.ts +68 -77
- package/mqttPacket/publish.ts +76 -83
- package/mqttPacket/suback.ts +48 -58
- package/mqttPacket/subscribe.ts +141 -117
- package/mqttPacket/types.ts +1 -9
- package/mqttPacket/unsuback.ts +46 -58
- package/mqttPacket/unsubscribe.ts +74 -63
- package/mqttPacket/validators.ts +5 -31
- package/node/socket-node-stream.test.ts +322 -0
- package/node/socket-node-stream.ts +174 -0
- package/node/tcpClient.test.ts +70 -0
- package/node/tcpClient.ts +13 -12
- package/node/tcpServer.test.ts +24 -20
- package/node/tcpServer.ts +6 -0
- package/node/tlsServer.test.ts +94 -0
- package/node/tlsServer.ts +81 -0
- package/node/wrapNodeSocket.ts +7 -30
- package/package.json +73 -45
- package/persistence/basicPersistence.ts +495 -0
- package/persistence/deps.ts +11 -1
- package/persistence/memory/memoryPersistence.ts +12 -152
- package/persistence/memory/memoryStorage.ts +232 -0
- package/persistence/mod.ts +4 -4
- package/persistence/persistence.test.ts +24 -0
- package/persistence/persistence.testing.ts +1324 -0
- package/persistence/persistence.ts +111 -67
- package/persistence/sqlite/sqliteDatabase.ts +294 -0
- package/persistence/sqlite/sqlitePersistence.test.ts +48 -0
- package/persistence/sqlite/sqlitePersistence.ts +36 -0
- package/persistence/sqlite/sqliteStorage.ts +324 -0
- package/persistence/storage.ts +84 -0
- package/server/config.ts +65 -0
- package/server/context.ts +658 -74
- package/server/deps.ts +25 -5
- package/server/handlers/completeConnect.ts +93 -0
- package/server/handlers/duplicate.test.ts +196 -0
- package/server/handlers/handleAuth.test.ts +225 -0
- package/server/handlers/handleAuth.ts +88 -0
- package/server/handlers/handleConnect.test.ts +589 -0
- package/server/handlers/handleConnect.ts +201 -86
- package/server/handlers/handleConnect.version.test.ts +108 -0
- package/server/handlers/handleDisconnect.test.ts +56 -0
- package/server/handlers/handleDisconnect.ts +3 -3
- package/server/handlers/handlePacket.test.ts +24 -0
- package/server/handlers/handlePacket.ts +30 -8
- package/server/handlers/handlePingreq.test.ts +29 -0
- package/server/handlers/handlePuback.test.ts +28 -0
- package/server/handlers/handlePuback.ts +5 -8
- package/server/handlers/handlePubcomp.test.ts +28 -0
- package/server/handlers/handlePubcomp.ts +5 -4
- package/server/handlers/handlePublish.test.ts +471 -0
- package/server/handlers/handlePublish.ts +189 -35
- package/server/handlers/handlePubrec.test.ts +28 -0
- package/server/handlers/handlePubrec.ts +2 -3
- package/server/handlers/handlePubrel.test.ts +74 -0
- package/server/handlers/handlePubrel.ts +12 -2
- package/server/handlers/handleSubscribe.test.ts +971 -0
- package/server/handlers/handleSubscribe.ts +158 -39
- package/server/handlers/handleUnsubscribe.test.ts +79 -0
- package/server/handlers/handleUnsubscribe.ts +29 -5
- package/server/handlers/keepalive.test.ts +132 -0
- package/server/handlers/session.persistence.test.ts +194 -0
- package/server/handlers/will.delivery.test.ts +221 -0
- package/server/mod.ts +4 -3
- package/server/preconnect.test.ts +151 -0
- package/server/server.ts +115 -17
- package/socket/socket.test.ts +91 -0
- package/socket/socket.ts +81 -31
- package/timer/timer.test.ts +4 -7
- package/timer/timer.ts +36 -0
- package/tools/benchmarks/receiver.ts +51 -0
- package/tools/benchmarks/sender.ts +48 -0
- package/tools/benchmarks/utils.ts +31 -0
- package/tools/mqtt-compat/README.md +130 -0
- package/tools/mqtt-compat/broker.ts +52 -0
- package/tools/mqtt-compat/paho-mqtt4.test.ts +379 -0
- package/tools/mqtt-compat/paho-mqtt5.tests.ts +887 -0
- package/trie/trie.test.ts +9 -1
- package/trie/trie.ts +57 -22
- package/utils/bufferedAsyncIterable.test.ts +92 -0
- package/utils/{BufferedAsyncIterable.ts → bufferedAsyncIterable.ts} +1 -1
- package/utils/deferred.test.ts +36 -0
- package/utils/deferred.ts +0 -1
- package/utils/getOrInsertPolyFill.ts +12 -0
- package/utils/logger.test.ts +189 -0
- package/utils/logger.ts +62 -7
- package/utils/mod.ts +15 -1
- package/utils/outboundTopicAliasManager.ts +100 -0
- package/utils/queue.test.ts +61 -0
- package/utils/topicFilter.test.ts +63 -0
- package/utils/topicFilter.ts +61 -0
- package/utils/utils.ts +3 -0
- package/utils/validators.ts +67 -0
- package/web/webSocketStream.ts +97 -0
- package/web/wrapWebSocket.ts +52 -0
- package/web/wsClient.test.ts +26 -0
- package/web/wsClient.ts +25 -0
- package/benchmarks/receiver.ts +0 -35
- package/benchmarks/sender.ts +0 -32
- package/benchmarks/utils.ts +0 -9
- package/dev_utils/dummyConn.ts +0 -110
- package/dist/persistence/store.d.ts +0 -13
- package/dist/persistence/store.d.ts.map +0 -1
- package/dist/persistence/store.js +0 -2
- package/dist/persistence/store.js.map +0 -1
- package/dist/utils/BufferedAsyncIterable.d.ts.map +0 -1
- package/dist/utils/BufferedAsyncIterable.js.map +0 -1
- package/examples/tcpServer.test.ts +0 -148
- package/persistence/memory/memoryPersistence.test.ts +0 -156
- package/persistence/store.ts +0 -15
- package/server/test/handleConnect.test.ts +0 -130
- package/server/test/test-handlers.ts +0 -53
|
@@ -9,11 +9,14 @@ import type { SubackPacket } from "../deps.ts";
|
|
|
9
9
|
* - Processes SUBACK packets sent by server to confirm SUBSCRIBE requests
|
|
10
10
|
* - Removes the packet ID from pending outgoing messages
|
|
11
11
|
* - Notifies the client about granted QoS levels for each subscription
|
|
12
|
+
* - in V5 the reason codes could carry various errors
|
|
12
13
|
*/
|
|
13
14
|
export function handleSuback(ctx: Context, packet: SubackPacket): void {
|
|
14
15
|
const id = packet.id;
|
|
15
16
|
ctx.store.pendingOutgoing.delete(id);
|
|
16
17
|
if (packet.protocolLevel !== 5) {
|
|
17
18
|
ctx.receiveSuback(id, packet.returnCodes);
|
|
19
|
+
return;
|
|
18
20
|
}
|
|
21
|
+
ctx.receiveSuback(id, packet.reasonCodes);
|
|
19
22
|
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { handleUnsuback } from "./handleUnsuback.ts";
|
|
4
|
+
import { PacketType } from "../deps.ts";
|
|
5
|
+
import type { UnsubackPacket } from "../deps.ts";
|
|
6
|
+
|
|
7
|
+
function createMockContext() {
|
|
8
|
+
const receivedIds: number[] = [];
|
|
9
|
+
return {
|
|
10
|
+
protocolLevel: 4 as const,
|
|
11
|
+
store: {
|
|
12
|
+
pendingOutgoing: new Map<number, unknown>(),
|
|
13
|
+
pendingIncoming: new Map(),
|
|
14
|
+
pendingAckOutgoing: new Map(),
|
|
15
|
+
},
|
|
16
|
+
receiveUnsuback: (id: number) => {
|
|
17
|
+
receivedIds.push(id);
|
|
18
|
+
return true;
|
|
19
|
+
},
|
|
20
|
+
receivedIds,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
test("handleUnsuback removes from pending and notifies context", () => {
|
|
25
|
+
const ctx = createMockContext();
|
|
26
|
+
ctx.store.pendingOutgoing.set(1, { type: PacketType.unsubscribe, id: 1 });
|
|
27
|
+
|
|
28
|
+
const packet = {
|
|
29
|
+
type: PacketType.unsuback,
|
|
30
|
+
protocolLevel: 4 as const,
|
|
31
|
+
id: 1,
|
|
32
|
+
} as UnsubackPacket;
|
|
33
|
+
|
|
34
|
+
handleUnsuback(ctx as never, packet);
|
|
35
|
+
|
|
36
|
+
assert.deepStrictEqual(
|
|
37
|
+
ctx.store.pendingOutgoing.has(1),
|
|
38
|
+
false,
|
|
39
|
+
"Should remove from pending",
|
|
40
|
+
);
|
|
41
|
+
assert.deepStrictEqual(
|
|
42
|
+
ctx.receivedIds,
|
|
43
|
+
[1],
|
|
44
|
+
"Should notify context of unsuback",
|
|
45
|
+
);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("handleUnsuback handles non-existent packet ID gracefully", () => {
|
|
49
|
+
const ctx = createMockContext();
|
|
50
|
+
|
|
51
|
+
const packet = {
|
|
52
|
+
type: PacketType.unsuback,
|
|
53
|
+
protocolLevel: 4 as const,
|
|
54
|
+
id: 999,
|
|
55
|
+
} as UnsubackPacket;
|
|
56
|
+
|
|
57
|
+
// Should not throw
|
|
58
|
+
handleUnsuback(ctx as never, packet);
|
|
59
|
+
|
|
60
|
+
assert.deepStrictEqual(
|
|
61
|
+
ctx.receivedIds,
|
|
62
|
+
[999],
|
|
63
|
+
"Should still notify context",
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("handleUnsuback processes multiple UNSUBACKs correctly", () => {
|
|
68
|
+
const ctx = createMockContext();
|
|
69
|
+
ctx.store.pendingOutgoing.set(1, { type: PacketType.unsubscribe, id: 1 });
|
|
70
|
+
ctx.store.pendingOutgoing.set(2, { type: PacketType.unsubscribe, id: 2 });
|
|
71
|
+
ctx.store.pendingOutgoing.set(3, { type: PacketType.unsubscribe, id: 3 });
|
|
72
|
+
|
|
73
|
+
handleUnsuback(ctx as never, {
|
|
74
|
+
type: PacketType.unsuback,
|
|
75
|
+
protocolLevel: 4,
|
|
76
|
+
id: 2,
|
|
77
|
+
} as UnsubackPacket);
|
|
78
|
+
|
|
79
|
+
assert.deepStrictEqual(ctx.store.pendingOutgoing.has(1), true);
|
|
80
|
+
assert.deepStrictEqual(ctx.store.pendingOutgoing.has(2), false);
|
|
81
|
+
assert.deepStrictEqual(ctx.store.pendingOutgoing.has(3), true);
|
|
82
|
+
assert.deepStrictEqual(ctx.receivedIds, [2]);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("handleUnsuback works with MQTT v5", () => {
|
|
86
|
+
const ctx = createMockContext();
|
|
87
|
+
ctx.store.pendingOutgoing.set(5, { type: PacketType.unsubscribe, id: 5 });
|
|
88
|
+
|
|
89
|
+
const packet = {
|
|
90
|
+
type: PacketType.unsuback,
|
|
91
|
+
protocolLevel: 5 as const,
|
|
92
|
+
id: 5,
|
|
93
|
+
reasonCodes: [0],
|
|
94
|
+
properties: {},
|
|
95
|
+
} as UnsubackPacket;
|
|
96
|
+
|
|
97
|
+
handleUnsuback(ctx as never, packet);
|
|
98
|
+
|
|
99
|
+
assert.deepStrictEqual(ctx.store.pendingOutgoing.has(5), false);
|
|
100
|
+
assert.deepStrictEqual(ctx.receivedIds, [5]);
|
|
101
|
+
});
|
package/client/mod.ts
CHANGED
|
@@ -8,8 +8,8 @@ export {
|
|
|
8
8
|
DEFAULT_PROTOCOLLEVEL,
|
|
9
9
|
DEFAULT_URL,
|
|
10
10
|
} from "./client.ts";
|
|
11
|
-
export { MQTTLevel } from "./deps.ts";
|
|
12
|
-
export type { ProtocolLevel } from "./deps.ts";
|
|
11
|
+
export { MQTTLevel, ReasonCode } from "./deps.ts";
|
|
12
|
+
export type { ProtocolLevel, QoS } from "./deps.ts";
|
|
13
13
|
export type {
|
|
14
14
|
ConnectParameters,
|
|
15
15
|
PublishParameters,
|
|
@@ -7,7 +7,7 @@ import type { PacketId } from "./deps.ts";
|
|
|
7
7
|
|
|
8
8
|
import {
|
|
9
9
|
type IStore,
|
|
10
|
-
|
|
10
|
+
MAX_PACKET_ID,
|
|
11
11
|
type PacketStore,
|
|
12
12
|
type PendingAckOutgoing,
|
|
13
13
|
type pendingIncoming,
|
|
@@ -50,7 +50,7 @@ export class MemoryStore implements IStore {
|
|
|
50
50
|
const currentId = this.packetId;
|
|
51
51
|
do {
|
|
52
52
|
this.packetId++;
|
|
53
|
-
if (this.packetId >
|
|
53
|
+
if (this.packetId > MAX_PACKET_ID) {
|
|
54
54
|
this.packetId = 1;
|
|
55
55
|
}
|
|
56
56
|
} while (
|
package/client/store/store.ts
CHANGED
|
@@ -12,7 +12,7 @@ import type {
|
|
|
12
12
|
/**
|
|
13
13
|
* Maximum value for MQTT packet IDs (65535)
|
|
14
14
|
*/
|
|
15
|
-
export const
|
|
15
|
+
export const MAX_PACKET_ID = 0xffff;
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* Generic type for storing MQTT packets by their packet ID
|
|
@@ -65,4 +65,6 @@ export interface IStore {
|
|
|
65
65
|
void,
|
|
66
66
|
unknown
|
|
67
67
|
>;
|
|
68
|
+
// generate the next packet ID, wrapping around at MAX_PACKET_ID
|
|
69
|
+
nextId(): PacketId;
|
|
68
70
|
}
|
package/deno/README.md
CHANGED
|
@@ -62,5 +62,4 @@ Opifex is also available on [JSR.io](https://jsr.io/@seriousme/opifex).
|
|
|
62
62
|
# Platform Native
|
|
63
63
|
|
|
64
64
|
This folder also contains code to run the server using Deno sockets instead of
|
|
65
|
-
NodeJS sockets.
|
|
66
|
-
use these instead.
|
|
65
|
+
NodeJS sockets. It also contains an implementation that uses Websockets
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { getFileData, TcpClient } from "./tcpClient.ts";
|
|
4
|
+
|
|
5
|
+
// most client testing is already done in tcpServer.test.ts
|
|
6
|
+
|
|
7
|
+
test("Deno: Test getFileData - valid file, empty file and undefined", async () => {
|
|
8
|
+
// 1. Test with a valid file containing data
|
|
9
|
+
const tempFile = await Deno.makeTempFile({
|
|
10
|
+
prefix: "test_get_file_data_",
|
|
11
|
+
suffix: ".txt",
|
|
12
|
+
});
|
|
13
|
+
const testContent = "Hello MQTT World!";
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
await Deno.writeTextFile(tempFile, testContent);
|
|
17
|
+
|
|
18
|
+
const result = await getFileData(tempFile);
|
|
19
|
+
assert.strictEqual(
|
|
20
|
+
result,
|
|
21
|
+
testContent,
|
|
22
|
+
"Should return the correct content of the file",
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
// 2. Test with an empty file
|
|
26
|
+
const emptyTempFile = await Deno.makeTempFile({
|
|
27
|
+
prefix: "test_empty_",
|
|
28
|
+
suffix: ".txt",
|
|
29
|
+
});
|
|
30
|
+
try {
|
|
31
|
+
const emptyResult = await getFileData(emptyTempFile);
|
|
32
|
+
assert.strictEqual(
|
|
33
|
+
emptyResult,
|
|
34
|
+
undefined,
|
|
35
|
+
"Should return undefined if the file is empty",
|
|
36
|
+
);
|
|
37
|
+
} finally {
|
|
38
|
+
// Clean up the empty temporary file
|
|
39
|
+
await Deno.remove(emptyTempFile);
|
|
40
|
+
}
|
|
41
|
+
} finally {
|
|
42
|
+
// Clean up the valid temporary file even if assertions fail
|
|
43
|
+
await Deno.remove(tempFile);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// 3. Test with undefined filename
|
|
47
|
+
const undefinedResult = await getFileData(undefined);
|
|
48
|
+
assert.strictEqual(
|
|
49
|
+
undefinedResult,
|
|
50
|
+
undefined,
|
|
51
|
+
"Should return undefined immediately if filename is undefined",
|
|
52
|
+
);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("Test createConn - unsupported protocol", async () => {
|
|
56
|
+
const client = new TcpClient();
|
|
57
|
+
|
|
58
|
+
// Use an unsupported protocol like 'ftp://' to trigger the throw in createConn
|
|
59
|
+
const invalidParams = {
|
|
60
|
+
url: new URL("ftp://localhost:1883"),
|
|
61
|
+
numberOfRetries: 0,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// Assert that connect rejects with the specific "Unsupported protocol" error
|
|
65
|
+
await assert.rejects(
|
|
66
|
+
async () => {
|
|
67
|
+
await client.connect(invalidParams);
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: "Error",
|
|
71
|
+
message: "Unsupported protocol: ftp:",
|
|
72
|
+
},
|
|
73
|
+
"Should throw an error when an unsupported protocol is provided",
|
|
74
|
+
);
|
|
75
|
+
});
|
package/deno/tcpClient.ts
CHANGED
|
@@ -51,19 +51,24 @@ export class TcpClient extends Client {
|
|
|
51
51
|
key?: string,
|
|
52
52
|
): Promise<Deno.TlsConn> {
|
|
53
53
|
logger.debug({ hostname, port, caCerts, cert });
|
|
54
|
-
|
|
54
|
+
const connectOpts = {
|
|
55
|
+
hostname,
|
|
56
|
+
port,
|
|
57
|
+
...(caCerts !== undefined && { caCerts }),
|
|
58
|
+
...(cert !== undefined && { cert }),
|
|
59
|
+
...(key !== undefined && { key }),
|
|
60
|
+
};
|
|
61
|
+
return await Deno.connectTls(connectOpts);
|
|
55
62
|
}
|
|
56
63
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
hostname:
|
|
60
|
-
port
|
|
61
|
-
caCerts
|
|
62
|
-
cert
|
|
63
|
-
key
|
|
64
|
-
|
|
65
|
-
// if you need to support alternative connection types just
|
|
66
|
-
// overload this method in your subclass
|
|
64
|
+
// overload createConn from the base client class
|
|
65
|
+
protected override createConn(): Promise<SockConn> {
|
|
66
|
+
const { protocol, hostname, port: portStr } = this.connectUrl;
|
|
67
|
+
const port = Number(portStr);
|
|
68
|
+
const caCerts = this.caCerts;
|
|
69
|
+
const cert = this.cert;
|
|
70
|
+
const key = this.key;
|
|
71
|
+
|
|
67
72
|
if (protocol === "mqtts:") {
|
|
68
73
|
return this.connectMQTTS(hostname, port, caCerts, cert, key);
|
|
69
74
|
}
|
package/deno/tcpServer.test.ts
CHANGED
|
@@ -2,15 +2,12 @@ import { test } from "node:test";
|
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
3
|
import { TcpClient } from "./tcpClient.ts";
|
|
4
4
|
import { TcpServer } from "./tcpServer.ts";
|
|
5
|
-
import { logger, LogLevel } from "../utils/mod.ts";
|
|
6
|
-
import type { PublishPacket, QoS } from "../mqttPacket/mod.ts";
|
|
5
|
+
import { delay, logger, LogLevel } from "../utils/mod.ts";
|
|
6
|
+
import type { ProtocolLevel, PublishPacket, QoS } from "../mqttPacket/mod.ts";
|
|
7
7
|
|
|
8
8
|
logger.level(LogLevel.info);
|
|
9
|
-
export function sleep(ms: number): Promise<unknown> {
|
|
10
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
11
|
-
}
|
|
12
9
|
|
|
13
|
-
test("Deno Test pubSub using client and server", async
|
|
10
|
+
test("Deno: Test pubSub using client and server", async () => {
|
|
14
11
|
const server = new TcpServer({ port: 0 }, {});
|
|
15
12
|
server.start();
|
|
16
13
|
|
|
@@ -52,17 +49,17 @@ test("Deno Test pubSub using client and server", async function () {
|
|
|
52
49
|
});
|
|
53
50
|
|
|
54
51
|
// the IIFE ensures message reception runs in parallel
|
|
55
|
-
logger.verbose(
|
|
52
|
+
logger.verbose("Start receiving");
|
|
56
53
|
const received: PublishPacket[] = [];
|
|
57
|
-
(async
|
|
54
|
+
(async () => {
|
|
58
55
|
for await (const item of client.messages()) {
|
|
59
|
-
logger.verbose(
|
|
56
|
+
logger.verbose("Receiving:", item.topic, "--", item.qos);
|
|
60
57
|
received.push(item);
|
|
61
58
|
}
|
|
62
59
|
})();
|
|
63
60
|
// end of IIFE
|
|
64
61
|
for (const item of publishSet) {
|
|
65
|
-
logger.verbose(
|
|
62
|
+
logger.verbose("Publishing:", item.topic, "--", item.qos);
|
|
66
63
|
await client.publish({
|
|
67
64
|
topic: item.topic,
|
|
68
65
|
qos: item.qos,
|
|
@@ -70,24 +67,24 @@ test("Deno Test pubSub using client and server", async function () {
|
|
|
70
67
|
});
|
|
71
68
|
}
|
|
72
69
|
|
|
73
|
-
await
|
|
74
|
-
logger.verbose(
|
|
70
|
+
await delay(100);
|
|
71
|
+
logger.verbose("Disconnect client");
|
|
75
72
|
await client.disconnect();
|
|
76
73
|
|
|
77
|
-
logger.verbose(
|
|
74
|
+
logger.verbose("Check completeness");
|
|
78
75
|
for (const item of publishSet) {
|
|
79
76
|
const found = received.find((f) =>
|
|
80
77
|
f.topic == item.topic && f.qos === item.qos
|
|
81
78
|
);
|
|
82
|
-
logger.verbose(
|
|
79
|
+
logger.verbose("Found:", item.topic, "--", item.qos);
|
|
83
80
|
assert(found, `${item.topic} -- ${item.qos}`);
|
|
84
81
|
}
|
|
85
82
|
|
|
86
|
-
logger.verbose(
|
|
83
|
+
logger.verbose("Stop server");
|
|
87
84
|
server.stop();
|
|
88
85
|
});
|
|
89
86
|
|
|
90
|
-
test("Deno Test subscription persistence after reconnect", async
|
|
87
|
+
test("Deno: Test subscription persistence after reconnect", async () => {
|
|
91
88
|
// Start server
|
|
92
89
|
const server = new TcpServer({ port: 0 }, {});
|
|
93
90
|
server.start();
|
|
@@ -95,6 +92,10 @@ test("Deno Test subscription persistence after reconnect", async function () {
|
|
|
95
92
|
const params = {
|
|
96
93
|
url: new URL(`mqtt://${server.address}:${server.port}`),
|
|
97
94
|
numberOfRetries: 0,
|
|
95
|
+
options: {
|
|
96
|
+
protocolLevel: 4 as ProtocolLevel,
|
|
97
|
+
clean: false,
|
|
98
|
+
},
|
|
98
99
|
};
|
|
99
100
|
|
|
100
101
|
const client = new TcpClient();
|
|
@@ -111,7 +112,7 @@ test("Deno Test subscription persistence after reconnect", async function () {
|
|
|
111
112
|
});
|
|
112
113
|
|
|
113
114
|
// Start receiving messages
|
|
114
|
-
(async
|
|
115
|
+
(async () => {
|
|
115
116
|
for await (const item of client.messages()) {
|
|
116
117
|
received.push(item);
|
|
117
118
|
}
|
|
@@ -119,11 +120,11 @@ test("Deno Test subscription persistence after reconnect", async function () {
|
|
|
119
120
|
|
|
120
121
|
// Disconnect client
|
|
121
122
|
await client.disconnect();
|
|
122
|
-
await
|
|
123
|
+
await delay(100);
|
|
123
124
|
|
|
124
125
|
// Reconnect client
|
|
125
126
|
await client.connect(params);
|
|
126
|
-
await
|
|
127
|
+
await delay(100);
|
|
127
128
|
|
|
128
129
|
// Publish test message
|
|
129
130
|
await client.publish({
|
|
@@ -132,8 +133,8 @@ test("Deno Test subscription persistence after reconnect", async function () {
|
|
|
132
133
|
payload: new Uint8Array([0x01]),
|
|
133
134
|
});
|
|
134
135
|
|
|
135
|
-
await
|
|
136
|
-
logger.verbose(
|
|
136
|
+
await delay(100);
|
|
137
|
+
logger.verbose("Disconnect client");
|
|
137
138
|
await client.disconnect();
|
|
138
139
|
|
|
139
140
|
// Verify message was received
|
package/deno/tcpServer.ts
CHANGED
|
@@ -27,20 +27,25 @@ export class TcpServer {
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
stop() {
|
|
30
|
+
this.mqttServer.close(true);
|
|
30
31
|
this.listener.close();
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
get port(): number | undefined {
|
|
35
|
+
// deno-coverage-ignore-start
|
|
34
36
|
if (this.listener.addr.transport === "tcp") {
|
|
35
37
|
return this.listener.addr.port;
|
|
36
38
|
}
|
|
37
39
|
return undefined;
|
|
40
|
+
// deno-coverage-ignore-stop
|
|
38
41
|
}
|
|
39
42
|
|
|
40
43
|
get address(): string | undefined {
|
|
44
|
+
// deno-coverage-ignore-start
|
|
41
45
|
if (this.listener.addr.transport === "tcp") {
|
|
42
46
|
return this.listener.addr.hostname;
|
|
43
47
|
}
|
|
44
48
|
return undefined;
|
|
49
|
+
// deno-coverage-ignore-stop
|
|
45
50
|
}
|
|
46
51
|
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { TcpClient } from "./tcpClient.ts";
|
|
4
|
+
import { TlsServer } from "./tlsServer.ts";
|
|
5
|
+
import { logger, LogLevel } from "../utils/mod.ts";
|
|
6
|
+
import type { PublishPacket, QoS } from "../mqttPacket/mod.ts";
|
|
7
|
+
import { delay, generateLocalhostCerts } from "../dev_utils/mod.ts";
|
|
8
|
+
|
|
9
|
+
logger.level(LogLevel.info);
|
|
10
|
+
|
|
11
|
+
const { key, cert, caCert } = generateLocalhostCerts();
|
|
12
|
+
|
|
13
|
+
test("Deno: Test pubSub using client and server", async () => {
|
|
14
|
+
const server = new TlsServer(
|
|
15
|
+
{ hostname: "localhost", port: 0, key, cert },
|
|
16
|
+
{},
|
|
17
|
+
);
|
|
18
|
+
server.start();
|
|
19
|
+
|
|
20
|
+
assert.deepStrictEqual(
|
|
21
|
+
server.port !== undefined,
|
|
22
|
+
true,
|
|
23
|
+
"server runs a a random port",
|
|
24
|
+
);
|
|
25
|
+
logger.verbose("server running on: ", {
|
|
26
|
+
port: server.port,
|
|
27
|
+
address: server.address,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const params = {
|
|
31
|
+
url: new URL(`mqtts://localhost:${server.port}`),
|
|
32
|
+
numberOfRetries: 0,
|
|
33
|
+
caCerts: [caCert],
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
logger.verbose("client parameters: ", params);
|
|
37
|
+
|
|
38
|
+
const client = new TcpClient();
|
|
39
|
+
|
|
40
|
+
await client.connect(params);
|
|
41
|
+
assert(true, "Client connected to server");
|
|
42
|
+
|
|
43
|
+
const publishSet: { topic: string; qos: QoS }[] = [
|
|
44
|
+
{ topic: "t0@q0", qos: 0 },
|
|
45
|
+
{ topic: "t1@q0", qos: 0 },
|
|
46
|
+
{ topic: "t2@q0", qos: 0 },
|
|
47
|
+
{ topic: "t0@q1", qos: 1 },
|
|
48
|
+
{ topic: "t1@q1", qos: 1 },
|
|
49
|
+
{ topic: "t2@q1", qos: 1 },
|
|
50
|
+
{ topic: "t0@q2", qos: 2 },
|
|
51
|
+
{ topic: "t1@q2", qos: 2 },
|
|
52
|
+
{ topic: "t2@q2", qos: 2 },
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
const subscriptions = publishSet.map((item) => ({
|
|
56
|
+
topicFilter: item.topic,
|
|
57
|
+
qos: item.qos,
|
|
58
|
+
}));
|
|
59
|
+
await client.subscribe({
|
|
60
|
+
subscriptions,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// the IIFE ensures message reception runs in parallel
|
|
64
|
+
logger.verbose("Start receiving");
|
|
65
|
+
const received: PublishPacket[] = [];
|
|
66
|
+
(async () => {
|
|
67
|
+
for await (const item of client.messages()) {
|
|
68
|
+
logger.verbose("Receiving:", item.topic, "--", item.qos);
|
|
69
|
+
received.push(item);
|
|
70
|
+
}
|
|
71
|
+
})();
|
|
72
|
+
// end of IIFE
|
|
73
|
+
for (const item of publishSet) {
|
|
74
|
+
logger.verbose("Publishing:", item.topic, "--", item.qos);
|
|
75
|
+
await client.publish({
|
|
76
|
+
topic: item.topic,
|
|
77
|
+
qos: item.qos,
|
|
78
|
+
payload: new Uint8Array([0x01]),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
await delay(100);
|
|
83
|
+
logger.verbose("Disconnect client");
|
|
84
|
+
await client.disconnect();
|
|
85
|
+
|
|
86
|
+
logger.verbose("Check completeness");
|
|
87
|
+
for (const item of publishSet) {
|
|
88
|
+
const found = received.find((f) =>
|
|
89
|
+
f.topic == item.topic && f.qos === item.qos
|
|
90
|
+
);
|
|
91
|
+
logger.verbose("Found:", item.topic, "--", item.qos);
|
|
92
|
+
assert(found, `${item.topic} -- ${item.qos}`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
logger.verbose("Stop server");
|
|
96
|
+
server.stop();
|
|
97
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module provides a Deno specific implementation of a TCP socket listener
|
|
3
|
+
* it uses the platform agnostic MqttServer class
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { MqttServer } from "../server/mod.ts";
|
|
8
|
+
import type { MqttServerOptions } from "../server/mod.ts";
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* TCP server that wraps a MqttServer, see demoServer.ts in the /bin folder
|
|
12
|
+
*/
|
|
13
|
+
export class TlsServer {
|
|
14
|
+
private listener: Deno.TlsListener;
|
|
15
|
+
private mqttServer: MqttServer;
|
|
16
|
+
constructor(
|
|
17
|
+
serverOptions: Deno.ListenTlsOptions & Deno.TlsCertifiedKeyPem,
|
|
18
|
+
mqttOptions: MqttServerOptions,
|
|
19
|
+
) {
|
|
20
|
+
this.listener = Deno.listenTls(serverOptions);
|
|
21
|
+
this.mqttServer = new MqttServer(mqttOptions);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async start() {
|
|
25
|
+
for await (const conn of this.listener) {
|
|
26
|
+
this.mqttServer.serve(conn);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
stop() {
|
|
30
|
+
this.mqttServer.close();
|
|
31
|
+
this.listener.close();
|
|
32
|
+
}
|
|
33
|
+
// deno-coverage-ignore-start
|
|
34
|
+
get port(): number | undefined {
|
|
35
|
+
return this.listener.addr.port;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
get address(): string | undefined {
|
|
39
|
+
return this.listener.addr.hostname;
|
|
40
|
+
}
|
|
41
|
+
// deno-coverage-ignore-stop
|
|
42
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { WsClient } from "../web/wsClient.ts";
|
|
4
|
+
import { WsServer } from "./wsServer.ts";
|
|
5
|
+
import { delay, logger, LogLevel } from "../utils/mod.ts";
|
|
6
|
+
import type { PublishPacket, QoS } from "../mqttPacket/mod.ts";
|
|
7
|
+
|
|
8
|
+
logger.level(LogLevel.info);
|
|
9
|
+
|
|
10
|
+
test("Deno: Test pubSub using client and server over webSockets", async () => {
|
|
11
|
+
const server = new WsServer(
|
|
12
|
+
{ hostname: "localhost", port: 0 },
|
|
13
|
+
{},
|
|
14
|
+
);
|
|
15
|
+
server.start();
|
|
16
|
+
|
|
17
|
+
assert.deepStrictEqual(
|
|
18
|
+
server.port !== undefined,
|
|
19
|
+
true,
|
|
20
|
+
"Http server runs a a random port",
|
|
21
|
+
);
|
|
22
|
+
logger.verbose("server running on: ", {
|
|
23
|
+
port: server.port,
|
|
24
|
+
address: server.address,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const params = {
|
|
28
|
+
url: new URL(`ws://localhost:${server.port}`),
|
|
29
|
+
numberOfRetries: 0,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
logger.verbose("client parameters: ", params);
|
|
33
|
+
|
|
34
|
+
const client = new WsClient();
|
|
35
|
+
client.onConnected = () => logger.verbose("Client connected to server");
|
|
36
|
+
|
|
37
|
+
await client.connect(params);
|
|
38
|
+
|
|
39
|
+
const publishSet: { topic: string; qos: QoS }[] = [
|
|
40
|
+
{ topic: "t0@q0", qos: 0 },
|
|
41
|
+
{ topic: "t1@q0", qos: 0 },
|
|
42
|
+
{ topic: "t2@q0", qos: 0 },
|
|
43
|
+
{ topic: "t0@q1", qos: 1 },
|
|
44
|
+
{ topic: "t1@q1", qos: 1 },
|
|
45
|
+
{ topic: "t2@q1", qos: 1 },
|
|
46
|
+
{ topic: "t0@q2", qos: 2 },
|
|
47
|
+
{ topic: "t1@q2", qos: 2 },
|
|
48
|
+
{ topic: "t2@q2", qos: 2 },
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
const subscriptions = publishSet.map((item) => ({
|
|
52
|
+
topicFilter: item.topic,
|
|
53
|
+
qos: item.qos,
|
|
54
|
+
}));
|
|
55
|
+
await client.subscribe({
|
|
56
|
+
subscriptions,
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// the IIFE ensures message reception runs in parallel
|
|
60
|
+
logger.verbose("Start receiving");
|
|
61
|
+
const received: PublishPacket[] = [];
|
|
62
|
+
(async () => {
|
|
63
|
+
for await (const item of client.messages()) {
|
|
64
|
+
logger.verbose("Receiving:", item.topic, "--", item.qos);
|
|
65
|
+
received.push(item);
|
|
66
|
+
}
|
|
67
|
+
})();
|
|
68
|
+
// end of IIFE
|
|
69
|
+
for (const item of publishSet) {
|
|
70
|
+
logger.verbose("Publishing:", item.topic, "--", item.qos);
|
|
71
|
+
await client.publish({
|
|
72
|
+
topic: item.topic,
|
|
73
|
+
qos: item.qos,
|
|
74
|
+
payload: new Uint8Array([0x01]),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
await delay(100);
|
|
79
|
+
logger.verbose("Disconnect client");
|
|
80
|
+
await client.disconnect();
|
|
81
|
+
|
|
82
|
+
logger.verbose("Check completeness");
|
|
83
|
+
for (const item of publishSet) {
|
|
84
|
+
const found = received.find((f) =>
|
|
85
|
+
f.topic == item.topic && f.qos === item.qos
|
|
86
|
+
);
|
|
87
|
+
logger.verbose("Found:", item.topic, "--", item.qos);
|
|
88
|
+
assert(found, `${item.topic} -- ${item.qos}`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
logger.verbose("Stop server");
|
|
92
|
+
server.stop();
|
|
93
|
+
});
|