@seriousme/opifex 1.11.3 → 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/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 +2 -0
- package/client/client.ts +51 -41
- package/client/context.ts +75 -21
- package/client/deps.ts +4 -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 +1 -1
- 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 -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 +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 +13 -16
- 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 +1 -1
- 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 +23 -15
- package/dist/mqttConn/mqttConn.d.ts.map +1 -1
- package/dist/mqttConn/mqttConn.js +56 -35
- package/dist/mqttConn/mqttConn.js.map +1 -1
- package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -1
- package/dist/mqttPacket/BitMask.d.ts.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 +4 -5
- 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 +6 -27
- 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/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 +4 -5
- 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 +5 -5
- 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 +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 +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 +76 -44
- 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 +175 -182
- package/mqttPacket/decoder.test.ts +0 -39
- package/mqttPacket/decoder.ts +8 -35
- package/mqttPacket/disconnect.ts +57 -68
- package/mqttPacket/encoder.ts +5 -40
- 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 +56 -70
- package/mqttPacket/publish.ts +67 -74
- 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 +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 +4 -9
- 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 -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 +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/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,379 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { MQTTLevel, PacketType } from "../../server/deps.ts";
|
|
4
|
+
import type {
|
|
5
|
+
AnyPacket,
|
|
6
|
+
ConnectPacket,
|
|
7
|
+
PublishPacket,
|
|
8
|
+
ShareName,
|
|
9
|
+
} from "../../server/deps.ts";
|
|
10
|
+
import {
|
|
11
|
+
addMockClient,
|
|
12
|
+
connect,
|
|
13
|
+
delay,
|
|
14
|
+
disconnect,
|
|
15
|
+
isAuthenticatedBroker,
|
|
16
|
+
ping,
|
|
17
|
+
publish,
|
|
18
|
+
receiveMessages,
|
|
19
|
+
startMockServer,
|
|
20
|
+
subscribe,
|
|
21
|
+
unsubscribe,
|
|
22
|
+
} from "../../dev_utils/mod.ts";
|
|
23
|
+
|
|
24
|
+
const txtEncoder = new TextEncoder();
|
|
25
|
+
|
|
26
|
+
const NO_SUBSCRIBE_TOPIC = "test/nosubscribe";
|
|
27
|
+
|
|
28
|
+
// Test configurations matching client_test.py global parameters
|
|
29
|
+
const topics = ["TopicA", "TopicA/B", "Topic/C", "TopicA/C", "/TopicA"];
|
|
30
|
+
const wildtopics = ["TopicA/+", "+/C", "#", "/#", "/+", "+/+", "TopicA/#"];
|
|
31
|
+
const nosubscribeTopics = ["test/nosubscribe"];
|
|
32
|
+
|
|
33
|
+
// --- Tests ---
|
|
34
|
+
|
|
35
|
+
test("Basic test: Connect, Subscribe, and Publish", async () => {
|
|
36
|
+
const { mqttConn, mqttServer } = startMockServer();
|
|
37
|
+
|
|
38
|
+
// Initial clean connect sequence
|
|
39
|
+
await connect(mqttConn, { clientId: "myclientid", clean: true });
|
|
40
|
+
await disconnect(mqttConn);
|
|
41
|
+
|
|
42
|
+
// Reconnect and issue subscription + messages
|
|
43
|
+
const mqttConn2 = addMockClient(mqttServer);
|
|
44
|
+
await connect(mqttConn2, { clientId: "myclientid", clean: false });
|
|
45
|
+
await subscribe(mqttConn2, [{ topicFilter: topics[0], qos: 2 }]);
|
|
46
|
+
|
|
47
|
+
const mqttConn3 = addMockClient(mqttServer);
|
|
48
|
+
await connect(mqttConn3, { clientId: "publisher" });
|
|
49
|
+
await publish(mqttConn3, topics[0], 0, { payload: "qos 0" });
|
|
50
|
+
await publish(mqttConn3, topics[0], 1, { payload: "qos 1", id: 1 });
|
|
51
|
+
await publish(mqttConn3, topics[0], 2, { payload: "qos 2", id: 2 });
|
|
52
|
+
await disconnect(mqttConn3);
|
|
53
|
+
const packets = await receiveMessages(mqttConn2);
|
|
54
|
+
assert.equal(packets.length, 3);
|
|
55
|
+
assert.equal(
|
|
56
|
+
packets.filter((p: AnyPacket) => p.type === PacketType.publish).length,
|
|
57
|
+
3,
|
|
58
|
+
);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("Retained messages verification and clearance", async () => {
|
|
62
|
+
const { mqttConn, mqttServer } = startMockServer();
|
|
63
|
+
await connect(mqttConn, { clientId: "myclientid", clean: true });
|
|
64
|
+
|
|
65
|
+
// Publish retained messages
|
|
66
|
+
await publish(mqttConn, topics[1], 0, { retain: true, payload: "qos 0" });
|
|
67
|
+
await publish(mqttConn, topics[2], 1, {
|
|
68
|
+
retain: true,
|
|
69
|
+
payload: "qos 1",
|
|
70
|
+
id: 3,
|
|
71
|
+
});
|
|
72
|
+
await publish(mqttConn, topics[3], 2, {
|
|
73
|
+
retain: true,
|
|
74
|
+
payload: "qos 2",
|
|
75
|
+
id: 4,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
await delay(50);
|
|
79
|
+
|
|
80
|
+
// Bring a secondary client online to assert the retained packets deliver on subscription
|
|
81
|
+
const bConn = addMockClient(mqttServer);
|
|
82
|
+
await connect(bConn, { clientId: "myclientid2", clean: true });
|
|
83
|
+
await subscribe(bConn, [{ topicFilter: wildtopics[5], qos: 2 }]);
|
|
84
|
+
|
|
85
|
+
const packets = await receiveMessages(bConn);
|
|
86
|
+
assert.strictEqual(packets.length, 3);
|
|
87
|
+
assert.equal(
|
|
88
|
+
packets.filter((p: AnyPacket) => p.type === PacketType.publish).length,
|
|
89
|
+
3,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
// Clear retained messages by publishing empty payloads
|
|
93
|
+
await publish(mqttConn, topics[1], 0, { retain: true, payload: "" });
|
|
94
|
+
await publish(mqttConn, topics[2], 1, { retain: true, payload: "", id: 5 });
|
|
95
|
+
await publish(mqttConn, topics[3], 2, { retain: true, payload: "", id: 6 });
|
|
96
|
+
|
|
97
|
+
await disconnect(mqttConn);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test("Will message execution upon un-clean termination", async () => {
|
|
101
|
+
const { mqttConn: aConn, mqttServer } = startMockServer();
|
|
102
|
+
|
|
103
|
+
const payload = txtEncoder.encode("client not disconnected");
|
|
104
|
+
await connect(aConn, {
|
|
105
|
+
clientId: "myclientid",
|
|
106
|
+
clean: true,
|
|
107
|
+
keepAlive: 2,
|
|
108
|
+
will: {
|
|
109
|
+
topic: topics[2],
|
|
110
|
+
payload,
|
|
111
|
+
qos: 2,
|
|
112
|
+
retain: false,
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// Setup client B to monitor the Will topic
|
|
117
|
+
const bConn = addMockClient(mqttServer);
|
|
118
|
+
await connect(bConn, { clientId: "myclientid2", clean: false });
|
|
119
|
+
await subscribe(bConn, [{ topicFilter: topics[2], qos: 2 }]);
|
|
120
|
+
|
|
121
|
+
// Kill Connection A abruptly (no DISCONNECT packet sent)
|
|
122
|
+
await aConn.close();
|
|
123
|
+
|
|
124
|
+
// Connection B picks up the system-dispatched Will publication
|
|
125
|
+
const { value: willPacket } = await bConn.next();
|
|
126
|
+
assert.strictEqual(willPacket.type, PacketType.publish);
|
|
127
|
+
assert.strictEqual(willPacket.topic, topics[2]);
|
|
128
|
+
|
|
129
|
+
await disconnect(bConn);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test("Zero length Client ID rules under MQTT 3.1.1", async () => {
|
|
133
|
+
const { mqttConn: mqttConn1, mqttServer } = startMockServer();
|
|
134
|
+
|
|
135
|
+
const invalidZeroIdPacket: ConnectPacket = {
|
|
136
|
+
type: PacketType.connect,
|
|
137
|
+
protocolName: "MQTT",
|
|
138
|
+
protocolLevel: MQTTLevel.v4,
|
|
139
|
+
clientId: "",
|
|
140
|
+
clean: false, // Disallowed for zero-length IDs in 3.1.1
|
|
141
|
+
keepAlive: 0,
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// 1. Clean = false must fail/be rejected
|
|
145
|
+
await mqttConn1.send(invalidZeroIdPacket);
|
|
146
|
+
const response1 = await mqttConn1.next();
|
|
147
|
+
// Server will either return an error Connack code or shut down connection
|
|
148
|
+
if (response1.value) {
|
|
149
|
+
assert.notStrictEqual(response1.value.returnCode, 0);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// 2. Clean = true must succeed
|
|
153
|
+
const mqttConn2 = addMockClient(mqttServer);
|
|
154
|
+
invalidZeroIdPacket.clean = true;
|
|
155
|
+
await mqttConn2.send(invalidZeroIdPacket);
|
|
156
|
+
const { value: connack } = await mqttConn2.next();
|
|
157
|
+
assert.strictEqual(connack.type, PacketType.connack);
|
|
158
|
+
|
|
159
|
+
await disconnect(mqttConn2);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test("Offline message queueing across clean=false reconnects", async () => {
|
|
163
|
+
const { mqttConn: aConn, mqttServer } = startMockServer();
|
|
164
|
+
|
|
165
|
+
// Connect and subscribe to topic with clean=false
|
|
166
|
+
await connect(aConn, { clientId: "offlineClient", clean: false });
|
|
167
|
+
await subscribe(aConn, [{ topicFilter: wildtopics[5], qos: 2 }]);
|
|
168
|
+
await disconnect(aConn);
|
|
169
|
+
|
|
170
|
+
// Bring on a publisher while target is offline
|
|
171
|
+
const bConn = addMockClient(mqttServer);
|
|
172
|
+
await connect(bConn, { clientId: "publisher", clean: true });
|
|
173
|
+
await publish(bConn, topics[1], 0, { payload: "qos 0" });
|
|
174
|
+
await publish(bConn, topics[2], 1, { payload: "qos 1", id: 10 });
|
|
175
|
+
await publish(bConn, topics[3], 2, { payload: "qos 2", id: 11 });
|
|
176
|
+
await disconnect(bConn);
|
|
177
|
+
|
|
178
|
+
// Re-establish offline target client session
|
|
179
|
+
const aReconnect = addMockClient(mqttServer);
|
|
180
|
+
await connect(aReconnect, { clientId: "offlineClient", clean: false });
|
|
181
|
+
|
|
182
|
+
// Confirm persistent QoS 1 & QoS 2 flights get pushed to consumer
|
|
183
|
+
const msg1 = await aReconnect.next();
|
|
184
|
+
const msg2 = await aReconnect.next();
|
|
185
|
+
assert.strictEqual(msg1.value.type, PacketType.publish);
|
|
186
|
+
assert.strictEqual(msg2.value.type, PacketType.publish);
|
|
187
|
+
|
|
188
|
+
await disconnect(aReconnect);
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
test("Subscribe failure validation returns 0x80", async () => {
|
|
192
|
+
function isAuthorizedToSubscribe(
|
|
193
|
+
_ctx: never,
|
|
194
|
+
topic: string,
|
|
195
|
+
_shareName: ShareName,
|
|
196
|
+
): boolean {
|
|
197
|
+
return topic !== NO_SUBSCRIBE_TOPIC;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const { mqttConn } = startMockServer({
|
|
201
|
+
handlers: { isAuthorizedToSubscribe },
|
|
202
|
+
});
|
|
203
|
+
await connect(mqttConn);
|
|
204
|
+
|
|
205
|
+
const suback = await subscribe(
|
|
206
|
+
mqttConn,
|
|
207
|
+
[{
|
|
208
|
+
topicFilter: nosubscribeTopics[0],
|
|
209
|
+
qos: 2,
|
|
210
|
+
}],
|
|
211
|
+
{ id: 1, checkAcks: false },
|
|
212
|
+
);
|
|
213
|
+
assert.deepStrictEqual(suback.returnCodes || [suback.status], [0x80]);
|
|
214
|
+
await disconnect(mqttConn);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
test("Unsubscribe removes specific active topic metrics", async () => {
|
|
218
|
+
const { mqttConn } = startMockServer();
|
|
219
|
+
await connect(mqttConn);
|
|
220
|
+
|
|
221
|
+
// Register multiple topic patterns
|
|
222
|
+
await subscribe(mqttConn, [
|
|
223
|
+
{ topicFilter: topics[0], qos: 2 },
|
|
224
|
+
{ topicFilter: topics[1], qos: 2 },
|
|
225
|
+
]);
|
|
226
|
+
|
|
227
|
+
// Issue UNSUBSCRIBE to single item
|
|
228
|
+
await unsubscribe(mqttConn, [topics[0]], { id: 2 });
|
|
229
|
+
await disconnect(mqttConn);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test("Overlapping subscriptions routing behavior", async () => {
|
|
233
|
+
const { mqttConn: aConn, mqttServer } = startMockServer();
|
|
234
|
+
await connect(aConn, { clientId: "overlappingClient" });
|
|
235
|
+
|
|
236
|
+
// Subscribe to multiple overlapping filters matching the same topic
|
|
237
|
+
await subscribe(aConn, [
|
|
238
|
+
{ topicFilter: wildtopics[6], qos: 2 }, // TopicA/#
|
|
239
|
+
{ topicFilter: wildtopics[0], qos: 1 }, // TopicA/+
|
|
240
|
+
]);
|
|
241
|
+
|
|
242
|
+
// Publish from a secondary context
|
|
243
|
+
const publisherConn = addMockClient(mqttServer);
|
|
244
|
+
await connect(publisherConn, { clientId: "overlappingPub" });
|
|
245
|
+
await publish(publisherConn, topics[3], 2, {
|
|
246
|
+
payload: "overlapping topic filters",
|
|
247
|
+
}); // TopicA/C
|
|
248
|
+
await disconnect(publisherConn);
|
|
249
|
+
|
|
250
|
+
await delay(50);
|
|
251
|
+
|
|
252
|
+
// Consume incoming payloads sent to the client
|
|
253
|
+
const messages = await receiveMessages(aConn);
|
|
254
|
+
const qos = [];
|
|
255
|
+
for (const mesg of messages) {
|
|
256
|
+
assert.strictEqual(
|
|
257
|
+
mesg.type,
|
|
258
|
+
PacketType.publish,
|
|
259
|
+
"Expecting a PUBLISH packet",
|
|
260
|
+
);
|
|
261
|
+
const packet = mesg as PublishPacket;
|
|
262
|
+
qos.push(packet.qos);
|
|
263
|
+
}
|
|
264
|
+
// The server may send back 1 message with the highest QoS, or 1 message for each matching filter
|
|
265
|
+
assert.ok(
|
|
266
|
+
messages.length === 1 || messages.length === 2,
|
|
267
|
+
"Should receive 1 or 2 messages",
|
|
268
|
+
);
|
|
269
|
+
if (messages.length === 1) {
|
|
270
|
+
assert.strictEqual(
|
|
271
|
+
qos[0],
|
|
272
|
+
2,
|
|
273
|
+
"Single delivered packet must inherit highest QoS",
|
|
274
|
+
);
|
|
275
|
+
} else {
|
|
276
|
+
const qosLevels = qos.sort();
|
|
277
|
+
assert.deepStrictEqual(
|
|
278
|
+
qosLevels,
|
|
279
|
+
[1, 2],
|
|
280
|
+
"Delivered packets must match both matching subscription QoS layers",
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
await disconnect(aConn);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
test("Keepalive termination triggers Will dispatching", async () => {
|
|
287
|
+
const { mqttConn: aConn, mqttServer } = startMockServer();
|
|
288
|
+
|
|
289
|
+
// Connect Client A with a tight 1 second keepAlive and a Will payload
|
|
290
|
+
await connect(aConn, {
|
|
291
|
+
clientId: "willClient",
|
|
292
|
+
keepAlive: 1,
|
|
293
|
+
will: {
|
|
294
|
+
topic: topics[4], // /TopicA
|
|
295
|
+
payload: txtEncoder.encode("keepalive expiry"),
|
|
296
|
+
qos: 2,
|
|
297
|
+
retain: false,
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
// Client B sits to watch for the dispatching of that Will topic
|
|
302
|
+
const bConn = addMockClient(mqttServer);
|
|
303
|
+
await connect(bConn, { clientId: "observerClient" });
|
|
304
|
+
await subscribe(bConn, [{ topicFilter: topics[4], qos: 2 }]);
|
|
305
|
+
|
|
306
|
+
// We explicitly intentionally idle Client A so that the mock server drops it via timeout rules
|
|
307
|
+
await delay(1600);
|
|
308
|
+
|
|
309
|
+
// Client B should pick up the server-sent Will publication
|
|
310
|
+
const { value: willMsg } = await bConn.next();
|
|
311
|
+
assert.ok(willMsg, "Will publication message should arrive at observer");
|
|
312
|
+
assert.strictEqual(willMsg.type, PacketType.publish);
|
|
313
|
+
assert.strictEqual(willMsg.topic, topics[4]);
|
|
314
|
+
|
|
315
|
+
await disconnect(bConn);
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
test("Redelivery of uncompleted QoS 1 and QoS 2 packets on un-clean reconnect", async () => {
|
|
319
|
+
const { mqttConn: bConn, mqttServer } = startMockServer();
|
|
320
|
+
|
|
321
|
+
// Join session with clean: false
|
|
322
|
+
await connect(bConn, { clientId: "redeliveryClient", clean: false });
|
|
323
|
+
await subscribe(bConn, [{ topicFilter: wildtopics[6], qos: 2 }]); // TopicA/#
|
|
324
|
+
|
|
325
|
+
// Simulate an absolute, sudden transport break (close socket abruptly without a regular DISCONNECT)
|
|
326
|
+
await bConn.close();
|
|
327
|
+
|
|
328
|
+
// Create an unrelated context to pass packets into the offline client's targets
|
|
329
|
+
const publisherConn = addMockClient(mqttServer);
|
|
330
|
+
await connect(publisherConn, { clientId: "redeliveryPub" });
|
|
331
|
+
await publish(publisherConn, topics[1], 1, {
|
|
332
|
+
payload: "qos 1 packet",
|
|
333
|
+
id: 20,
|
|
334
|
+
}); // TopicA/B
|
|
335
|
+
await publish(publisherConn, topics[3], 2, {
|
|
336
|
+
payload: "qos 2 packet",
|
|
337
|
+
id: 21,
|
|
338
|
+
}); // TopicA/C
|
|
339
|
+
await disconnect(publisherConn);
|
|
340
|
+
|
|
341
|
+
await delay(50);
|
|
342
|
+
|
|
343
|
+
// Re-establish our session with clean: false
|
|
344
|
+
const bReconnectConn = addMockClient(mqttServer);
|
|
345
|
+
await connect(bReconnectConn, { clientId: "redeliveryClient", clean: false });
|
|
346
|
+
|
|
347
|
+
// Assert that both messages get safely pushed immediately onto the reconnected line
|
|
348
|
+
const msg1 = await bReconnectConn.next();
|
|
349
|
+
const msg2 = await bReconnectConn.next();
|
|
350
|
+
|
|
351
|
+
assert.strictEqual(msg1.value?.type, PacketType.publish);
|
|
352
|
+
assert.strictEqual(msg2.value?.type, PacketType.publish);
|
|
353
|
+
|
|
354
|
+
await disconnect(bReconnectConn);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
test("$ dollar-sign topics isolation from wildcard tracking", async () => {
|
|
358
|
+
const { mqttConn: bConn, mqttServer } = startMockServer({
|
|
359
|
+
handlers: {
|
|
360
|
+
isAuthenticated: isAuthenticatedBroker,
|
|
361
|
+
},
|
|
362
|
+
});
|
|
363
|
+
await connect(bConn, { clientId: "dollarClient", clean: true });
|
|
364
|
+
|
|
365
|
+
// Subscribing to broad wildcard '#' should not match hidden system '$' topics
|
|
366
|
+
await subscribe(bConn, [{ topicFilter: wildtopics[5], qos: 2 }]); // '#'
|
|
367
|
+
|
|
368
|
+
// Publish explicitly to a system target structure string
|
|
369
|
+
const publisherConn = addMockClient(mqttServer);
|
|
370
|
+
await connect(publisherConn, { clientId: "dollarPub" });
|
|
371
|
+
await publish(publisherConn, "$" + topics[1], 1, {
|
|
372
|
+
payload: "hidden system info",
|
|
373
|
+
});
|
|
374
|
+
await disconnect(publisherConn);
|
|
375
|
+
|
|
376
|
+
// make sure we didn't get any publish
|
|
377
|
+
await ping(bConn);
|
|
378
|
+
await disconnect(bConn);
|
|
379
|
+
});
|