@seriousme/opifex 1.11.3 → 2.1.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 +99 -40
- package/bin/conformanceServer.ts +45 -13
- package/bin/demoServer.ts +38 -13
- package/bin/mqtt.ts +2 -2
- package/client/ConnectionState.ts +3 -1
- package/client/client.ts +88 -47
- package/client/context.ts +79 -27
- package/client/deps.ts +10 -3
- 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 +18 -8
- 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 +13 -2
- package/client/store/memoryStore.ts +12 -11
- package/client/store/store.ts +4 -2
- package/deno/README.md +1 -2
- package/deno/tcpClient.test.ts +75 -0
- package/deno/tcpClient.ts +36 -18
- package/deno/tcpServer.test.ts +22 -21
- package/deno/tcpServer.ts +26 -4
- package/deno/tlsServer.test.ts +97 -0
- package/deno/tlsServer.ts +58 -0
- package/deno/wsServer.test.ts +93 -0
- package/deno/wsServer.ts +96 -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 -3
- 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 +2 -2
- package/dist/bin/mqtt.js.map +1 -1
- package/dist/client/ConnectionState.d.ts +3 -1
- 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 +47 -21
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +57 -20
- package/dist/client/client.js.map +1 -1
- package/dist/client/context.d.ts +15 -7
- 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 +4 -3
- 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 +3 -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 +3 -3
- package/dist/client/store/memoryStore.d.ts.map +1 -1
- package/dist/client/store/memoryStore.js +3 -3
- package/dist/client/store/memoryStore.js.map +1 -1
- package/dist/client/store/store.d.ts +3 -2
- 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 +24 -31
- package/dist/mqttConn/mqttConn.d.ts.map +1 -1
- package/dist/mqttConn/mqttConn.js +57 -36
- package/dist/mqttConn/mqttConn.js.map +1 -1
- package/dist/mqttPacket/AuthenticationResult.d.ts +4 -0
- package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -1
- package/dist/mqttPacket/AuthenticationResult.js.map +1 -1
- package/dist/mqttPacket/BitMask.d.ts.map +1 -1
- package/dist/mqttPacket/PacketType.d.ts +4 -0
- package/dist/mqttPacket/PacketType.d.ts.map +1 -1
- package/dist/mqttPacket/Properties.d.ts +4 -4
- package/dist/mqttPacket/Properties.d.ts.map +1 -1
- package/dist/mqttPacket/Properties.js.map +1 -1
- package/dist/mqttPacket/ReasonCode.d.ts +4 -5
- 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 +4 -0
- package/dist/mqttPacket/RetainHandling.d.ts.map +1 -1
- package/dist/mqttPacket/auth.d.ts +7 -8
- 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 +11 -10
- 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 +7 -7
- 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 +6 -16
- 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 +9 -8
- 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 +7 -19
- package/dist/mqttPacket/encoder.d.ts.map +1 -1
- package/dist/mqttPacket/encoder.js +5 -28
- package/dist/mqttPacket/encoder.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 +6 -6
- 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 +6 -6
- 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 +8 -7
- 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 +9 -8
- 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 +41 -10
- 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 +2 -29
- package/dist/mqttPacket/types.d.ts.map +1 -1
- package/dist/mqttPacket/unsuback.d.ts +9 -8
- 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 +26 -8
- 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 +22 -2
- package/dist/node/tcpClient.d.ts.map +1 -1
- package/dist/node/tcpClient.js +29 -10
- package/dist/node/tcpClient.js.map +1 -1
- package/dist/node/tcpServer.d.ts +18 -0
- package/dist/node/tcpServer.d.ts.map +1 -1
- package/dist/node/tcpServer.js +21 -2
- package/dist/node/tcpServer.js.map +1 -1
- package/dist/node/tlsServer.d.ts +37 -0
- package/dist/node/tlsServer.d.ts.map +1 -0
- package/dist/node/tlsServer.js +73 -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 +45 -70
- 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 +199 -25
- 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 +9 -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 +32 -9
- 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 +15 -9
- package/dist/socket/socket.d.ts.map +1 -1
- package/dist/socket/socket.js +66 -18
- 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 +61 -41
- 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 +42 -5
- 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 +14 -0
- package/dist/web/wsClient.d.ts.map +1 -0
- package/dist/web/wsClient.js +33 -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 +76 -60
- package/mqttPacket/AuthenticationResult.ts +6 -0
- package/mqttPacket/PacketType.ts +5 -0
- package/mqttPacket/Properties.ts +8 -5
- package/mqttPacket/ReasonCode.ts +8 -9
- package/mqttPacket/RetainHandling.ts +5 -0
- package/mqttPacket/auth.test.ts +1 -1
- package/mqttPacket/auth.ts +44 -51
- package/mqttPacket/codec.ts +147 -0
- package/mqttPacket/connack.ts +63 -73
- package/mqttPacket/connect.test.ts +2 -2
- package/mqttPacket/connect.ts +178 -192
- package/mqttPacket/decoder.test.ts +0 -39
- package/mqttPacket/decoder.ts +17 -46
- package/mqttPacket/disconnect.ts +60 -71
- package/mqttPacket/encoder.test.ts +2 -2
- package/mqttPacket/encoder.ts +13 -46
- package/mqttPacket/mod.ts +48 -204
- package/mqttPacket/pingreq.ts +22 -28
- package/mqttPacket/pingres.ts +22 -28
- package/mqttPacket/protocolLevels.ts +12 -7
- package/mqttPacket/pubblishAcks.ts +61 -75
- package/mqttPacket/publish.ts +70 -84
- package/mqttPacket/publishAcks.test.ts +3 -3
- package/mqttPacket/suback.ts +53 -68
- package/mqttPacket/subscribe.ts +146 -128
- package/mqttPacket/types.ts +2 -35
- package/mqttPacket/unsuback.ts +50 -61
- package/mqttPacket/unsubscribe.ts +77 -72
- 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 +33 -17
- package/node/tcpServer.test.ts +24 -20
- package/node/tcpServer.ts +29 -6
- package/node/tlsServer.test.ts +94 -0
- package/node/tlsServer.ts +97 -0
- package/node/wrapNodeSocket.ts +7 -30
- package/package.json +72 -44
- package/persistence/basicPersistence.ts +495 -0
- package/persistence/deps.ts +11 -1
- package/persistence/memory/memoryPersistence.ts +12 -153
- package/persistence/memory/memoryStorage.ts +232 -0
- package/persistence/mod.ts +5 -10
- package/persistence/persistence.test.ts +24 -0
- package/persistence/persistence.testing.ts +1324 -0
- package/persistence/persistence.ts +112 -68
- 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 +660 -76
- package/server/deps.ts +24 -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 +188 -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 +157 -39
- package/server/handlers/handleUnsubscribe.test.ts +79 -0
- package/server/handlers/handleUnsubscribe.ts +28 -4
- 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 +5 -4
- package/server/preconnect.test.ts +151 -0
- package/server/server.ts +117 -19
- package/socket/socket.test.ts +91 -0
- package/socket/socket.ts +85 -34
- 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 +70 -45
- package/utils/bufferedAsyncIterable.test.ts +92 -0
- 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 +64 -9
- 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 +37 -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/dev_utils/socketPair.ts +0 -85
- package/dist/persistence/store.d.ts +0 -14
- 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 -16
- package/server/test/handleConnect.test.ts +0 -122
- package/server/test/test-handlers.ts +0 -53
- /package/utils/{BufferedAsyncIterable.ts → bufferedAsyncIterable.ts} +0 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { handleSuback } from "./handleSuback.ts";
|
|
4
|
+
import { PacketType } from "../deps.ts";
|
|
5
|
+
import type { SubackPacket } from "../deps.ts";
|
|
6
|
+
|
|
7
|
+
function createMockContext() {
|
|
8
|
+
const receivedSubacks: Array<{ id: number; returnCodes: 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
|
+
receiveSuback: (id: number, returnCodes: number[]) => {
|
|
17
|
+
receivedSubacks.push({ id, returnCodes });
|
|
18
|
+
return true;
|
|
19
|
+
},
|
|
20
|
+
receivedSubacks,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
test("handleSuback removes from pending and notifies context", () => {
|
|
25
|
+
const ctx = createMockContext();
|
|
26
|
+
ctx.store.pendingOutgoing.set(1, { type: PacketType.subscribe, id: 1 });
|
|
27
|
+
|
|
28
|
+
const packet = {
|
|
29
|
+
type: PacketType.suback,
|
|
30
|
+
protocolLevel: 4 as const,
|
|
31
|
+
id: 1,
|
|
32
|
+
returnCodes: [0],
|
|
33
|
+
} as SubackPacket;
|
|
34
|
+
|
|
35
|
+
handleSuback(ctx as never, packet);
|
|
36
|
+
|
|
37
|
+
assert.deepStrictEqual(
|
|
38
|
+
ctx.store.pendingOutgoing.has(1),
|
|
39
|
+
false,
|
|
40
|
+
"Should remove from pending",
|
|
41
|
+
);
|
|
42
|
+
assert.deepStrictEqual(
|
|
43
|
+
ctx.receivedSubacks.length,
|
|
44
|
+
1,
|
|
45
|
+
"Should notify context",
|
|
46
|
+
);
|
|
47
|
+
assert.deepStrictEqual(
|
|
48
|
+
ctx.receivedSubacks[0].id,
|
|
49
|
+
1,
|
|
50
|
+
"Should have correct ID",
|
|
51
|
+
);
|
|
52
|
+
assert.deepStrictEqual(
|
|
53
|
+
ctx.receivedSubacks[0].returnCodes,
|
|
54
|
+
[0],
|
|
55
|
+
"Should pass return codes",
|
|
56
|
+
);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("handleSuback handles multiple return codes", () => {
|
|
60
|
+
const ctx = createMockContext();
|
|
61
|
+
ctx.store.pendingOutgoing.set(2, { type: PacketType.subscribe, id: 2 });
|
|
62
|
+
|
|
63
|
+
const packet = {
|
|
64
|
+
type: PacketType.suback,
|
|
65
|
+
protocolLevel: 4 as const,
|
|
66
|
+
id: 2,
|
|
67
|
+
returnCodes: [0, 1, 2],
|
|
68
|
+
} as SubackPacket;
|
|
69
|
+
|
|
70
|
+
handleSuback(ctx as never, packet);
|
|
71
|
+
|
|
72
|
+
assert.deepStrictEqual(
|
|
73
|
+
ctx.receivedSubacks[0].returnCodes,
|
|
74
|
+
[0, 1, 2],
|
|
75
|
+
);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("handleSuback handles subscription failure code", () => {
|
|
79
|
+
const ctx = createMockContext();
|
|
80
|
+
ctx.store.pendingOutgoing.set(3, { type: PacketType.subscribe, id: 3 });
|
|
81
|
+
|
|
82
|
+
const SUBSCRIPTION_FAILURE = 0x80;
|
|
83
|
+
const packet = {
|
|
84
|
+
type: PacketType.suback,
|
|
85
|
+
protocolLevel: 4 as const,
|
|
86
|
+
id: 3,
|
|
87
|
+
returnCodes: [0, SUBSCRIPTION_FAILURE],
|
|
88
|
+
} as SubackPacket;
|
|
89
|
+
|
|
90
|
+
handleSuback(ctx as never, packet);
|
|
91
|
+
|
|
92
|
+
assert.deepStrictEqual(
|
|
93
|
+
ctx.receivedSubacks[0].returnCodes,
|
|
94
|
+
[0, SUBSCRIPTION_FAILURE],
|
|
95
|
+
);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test("handleSuback handles notification for MQTT v5", () => {
|
|
99
|
+
const ctx = createMockContext();
|
|
100
|
+
ctx.store.pendingOutgoing.set(4, { type: PacketType.subscribe, id: 4 });
|
|
101
|
+
|
|
102
|
+
const packet = {
|
|
103
|
+
type: PacketType.suback,
|
|
104
|
+
protocolLevel: 5 as const,
|
|
105
|
+
id: 4,
|
|
106
|
+
reasonCodes: [0],
|
|
107
|
+
} as SubackPacket;
|
|
108
|
+
|
|
109
|
+
handleSuback(ctx as never, packet);
|
|
110
|
+
|
|
111
|
+
assert.deepStrictEqual(
|
|
112
|
+
ctx.store.pendingOutgoing.has(4),
|
|
113
|
+
false,
|
|
114
|
+
"Should remove from pending",
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
assert.deepStrictEqual(
|
|
118
|
+
ctx.receivedSubacks.length,
|
|
119
|
+
1,
|
|
120
|
+
"Should notify for v5",
|
|
121
|
+
);
|
|
122
|
+
});
|
|
@@ -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,10 +8,21 @@ export {
|
|
|
8
8
|
DEFAULT_PROTOCOLLEVEL,
|
|
9
9
|
DEFAULT_URL,
|
|
10
10
|
} from "./client.ts";
|
|
11
|
-
export { MQTTLevel } from "./deps.ts";
|
|
12
|
-
export type {
|
|
11
|
+
export { logger, MQTTLevel, ReasonCode } from "./deps.ts";
|
|
12
|
+
export type {
|
|
13
|
+
AuthenticationResult,
|
|
14
|
+
NetAddr,
|
|
15
|
+
ProtocolLevel,
|
|
16
|
+
QoS,
|
|
17
|
+
SockAddr,
|
|
18
|
+
SockConn,
|
|
19
|
+
UnixAddr,
|
|
20
|
+
VsockAddr,
|
|
21
|
+
} from "./deps.ts";
|
|
13
22
|
export type {
|
|
14
23
|
ConnectParameters,
|
|
15
24
|
PublishParameters,
|
|
16
25
|
SubscribeParameters,
|
|
17
26
|
} from "./client.ts";
|
|
27
|
+
|
|
28
|
+
export type { ConnectionState } from "./ConnectionState.ts";
|
|
@@ -5,20 +5,21 @@
|
|
|
5
5
|
import { assert } from "./deps.ts";
|
|
6
6
|
import type { PacketId } from "./deps.ts";
|
|
7
7
|
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
import { MAX_PACKET_ID } from "./store.ts";
|
|
9
|
+
|
|
10
|
+
import type {
|
|
11
|
+
PacketStore,
|
|
12
|
+
PendingAckOutgoing,
|
|
13
|
+
pendingIncoming,
|
|
14
|
+
PendingOutgoing,
|
|
15
|
+
PendingOutgoingPackets,
|
|
16
|
+
Store,
|
|
16
17
|
} from "./store.ts";
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
|
-
* In-memory implementation of the
|
|
20
|
+
* In-memory implementation of the Store interface for managing MQTT packet storage
|
|
20
21
|
*/
|
|
21
|
-
export class MemoryStore implements
|
|
22
|
+
export class MemoryStore implements Store {
|
|
22
23
|
/** Current packet ID counter */
|
|
23
24
|
private packetId: PacketId;
|
|
24
25
|
|
|
@@ -50,7 +51,7 @@ export class MemoryStore implements IStore {
|
|
|
50
51
|
const currentId = this.packetId;
|
|
51
52
|
do {
|
|
52
53
|
this.packetId++;
|
|
53
|
-
if (this.packetId >
|
|
54
|
+
if (this.packetId > MAX_PACKET_ID) {
|
|
54
55
|
this.packetId = 1;
|
|
55
56
|
}
|
|
56
57
|
} 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
|
|
@@ -46,7 +46,7 @@ export type PendingOutgoingPackets = PendingAckOutgoing | PendingOutgoing;
|
|
|
46
46
|
/**
|
|
47
47
|
* Interface defining the storage requirements for MQTT packet state management
|
|
48
48
|
*/
|
|
49
|
-
export interface
|
|
49
|
+
export interface Store {
|
|
50
50
|
/** Store for incoming packets pending processing */
|
|
51
51
|
pendingIncoming: PacketStore<pendingIncoming>;
|
|
52
52
|
|
|
@@ -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
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
* it extends the platform agnostic Client class
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { logger } from "../client/
|
|
8
|
-
import type { SockConn } from "../client/
|
|
6
|
+
|
|
7
|
+
import { Client, logger } from "../client/mod.ts";
|
|
8
|
+
import type { SockConn } from "../client/mod.ts";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Fetches data from a file and returns it as a string
|
|
12
|
+
*
|
|
12
13
|
* @param filename
|
|
13
14
|
* @returns Promise
|
|
14
15
|
*
|
|
15
|
-
* Fetches data from a file and returns it as a string
|
|
16
16
|
* @example
|
|
17
17
|
* const data = await getFileData("data.txt");
|
|
18
18
|
*/
|
|
@@ -29,12 +29,16 @@ export async function getFileData(
|
|
|
29
29
|
return data;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
*
|
|
32
|
+
/**
|
|
33
|
+
* TcpClient extends the Client class to provide TCP based clients
|
|
34
34
|
* it is used by the MQTTclient to connect to the broker
|
|
35
35
|
* see mqtt.ts in the /bin folder as an example
|
|
36
36
|
*/
|
|
37
37
|
export class TcpClient extends Client {
|
|
38
|
+
/** Connect using MQTT over TCP
|
|
39
|
+
* @param hostname the name of the host to connect to
|
|
40
|
+
* @param port the port number
|
|
41
|
+
*/
|
|
38
42
|
protected async connectMQTT(
|
|
39
43
|
hostname: string,
|
|
40
44
|
port = 1883,
|
|
@@ -43,6 +47,15 @@ export class TcpClient extends Client {
|
|
|
43
47
|
return await Deno.connect({ hostname, port });
|
|
44
48
|
}
|
|
45
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Connect using MQTT over TLS
|
|
52
|
+
* @param hostname the name of the host to connect to
|
|
53
|
+
* @param port the port number
|
|
54
|
+
* @param caCerts the CA certificates to trust
|
|
55
|
+
* @param cert the clients certificate
|
|
56
|
+
* @param key the clients private key
|
|
57
|
+
* @returns a Deno.TlsConn object
|
|
58
|
+
*/
|
|
46
59
|
protected async connectMQTTS(
|
|
47
60
|
hostname: string,
|
|
48
61
|
port = 8883,
|
|
@@ -51,19 +64,24 @@ export class TcpClient extends Client {
|
|
|
51
64
|
key?: string,
|
|
52
65
|
): Promise<Deno.TlsConn> {
|
|
53
66
|
logger.debug({ hostname, port, caCerts, cert });
|
|
54
|
-
|
|
67
|
+
const connectOpts = {
|
|
68
|
+
hostname,
|
|
69
|
+
port,
|
|
70
|
+
...(caCerts !== undefined && { caCerts }),
|
|
71
|
+
...(cert !== undefined && { cert }),
|
|
72
|
+
...(key !== undefined && { key }),
|
|
73
|
+
};
|
|
74
|
+
return await Deno.connectTls(connectOpts);
|
|
55
75
|
}
|
|
56
76
|
|
|
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
|
|
77
|
+
/** createConn is used by the base client class */
|
|
78
|
+
protected override createConn(): Promise<SockConn> {
|
|
79
|
+
const { protocol, hostname, port: portStr } = this.connectUrl;
|
|
80
|
+
const port = Number(portStr);
|
|
81
|
+
const caCerts = this.caCerts;
|
|
82
|
+
const cert = this.cert;
|
|
83
|
+
const key = this.key;
|
|
84
|
+
|
|
67
85
|
if (protocol === "mqtts:") {
|
|
68
86
|
return this.connectMQTTS(hostname, port, caCerts, cert, key);
|
|
69
87
|
}
|
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
|
@@ -7,12 +7,16 @@
|
|
|
7
7
|
import { MqttServer } from "../server/mod.ts";
|
|
8
8
|
import type { MqttServerOptions } from "../server/mod.ts";
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
* TCP server that wraps a MqttServer, see
|
|
10
|
+
/**
|
|
11
|
+
* TCP server that wraps a MqttServer, see the /examples folder
|
|
12
12
|
*/
|
|
13
13
|
export class TcpServer {
|
|
14
14
|
private listener: Deno.Listener<Deno.Conn>;
|
|
15
15
|
private mqttServer: MqttServer;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Create a new TCP server
|
|
19
|
+
*/
|
|
16
20
|
constructor(
|
|
17
21
|
serverOptions: Deno.TcpListenOptions,
|
|
18
22
|
mqttOptions: MqttServerOptions,
|
|
@@ -21,26 +25,44 @@ export class TcpServer {
|
|
|
21
25
|
this.mqttServer = new MqttServer(mqttOptions);
|
|
22
26
|
}
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Start listening
|
|
30
|
+
*/
|
|
31
|
+
async start(): Promise<void> {
|
|
25
32
|
for await (const conn of this.listener) {
|
|
26
33
|
this.mqttServer.serve(conn);
|
|
27
34
|
}
|
|
28
35
|
}
|
|
29
|
-
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Stop listening
|
|
39
|
+
*/
|
|
40
|
+
stop(): void {
|
|
41
|
+
this.mqttServer.close(true);
|
|
30
42
|
this.listener.close();
|
|
31
43
|
}
|
|
32
44
|
|
|
45
|
+
/**
|
|
46
|
+
* The port number the server is listening on
|
|
47
|
+
*/
|
|
33
48
|
get port(): number | undefined {
|
|
49
|
+
// deno-coverage-ignore-start
|
|
34
50
|
if (this.listener.addr.transport === "tcp") {
|
|
35
51
|
return this.listener.addr.port;
|
|
36
52
|
}
|
|
37
53
|
return undefined;
|
|
54
|
+
// deno-coverage-ignore-stop
|
|
38
55
|
}
|
|
39
56
|
|
|
57
|
+
/**
|
|
58
|
+
* The address the server is listening on
|
|
59
|
+
*/
|
|
40
60
|
get address(): string | undefined {
|
|
61
|
+
// deno-coverage-ignore-start
|
|
41
62
|
if (this.listener.addr.transport === "tcp") {
|
|
42
63
|
return this.listener.addr.hostname;
|
|
43
64
|
}
|
|
44
65
|
return undefined;
|
|
66
|
+
// deno-coverage-ignore-stop
|
|
45
67
|
}
|
|
46
68
|
}
|