@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
package/mqttPacket/connect.ts
CHANGED
|
@@ -1,13 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
CodecOpts,
|
|
4
|
-
Payload,
|
|
5
|
-
ProtocolLevel,
|
|
6
|
-
ProtocolLevelNoV5,
|
|
7
|
-
QoS,
|
|
8
|
-
Topic,
|
|
9
|
-
TPacketType,
|
|
10
|
-
} from "./types.ts";
|
|
1
|
+
import type { ClientId, CodecOpts, Payload, QoS, Topic } from "./types.ts";
|
|
2
|
+
import type { ProtocolLevel, ProtocolLevelNoV5 } from "./protocolLevels.ts";
|
|
11
3
|
import type { ConnectProperties, WillProperties } from "./Properties.ts";
|
|
12
4
|
import { PropertySetType } from "./Properties.ts";
|
|
13
5
|
import { PacketType } from "./PacketType.ts";
|
|
@@ -21,7 +13,7 @@ import {
|
|
|
21
13
|
} from "./decoder.ts";
|
|
22
14
|
|
|
23
15
|
export type ConnectPacketV4 = {
|
|
24
|
-
type:
|
|
16
|
+
type: PacketType;
|
|
25
17
|
protocolName?: string | undefined;
|
|
26
18
|
protocolLevel: ProtocolLevelNoV5;
|
|
27
19
|
clientId?: ClientId | undefined;
|
|
@@ -39,7 +31,7 @@ export type ConnectPacketV4 = {
|
|
|
39
31
|
};
|
|
40
32
|
|
|
41
33
|
export type ConnectPacketV5 = {
|
|
42
|
-
type:
|
|
34
|
+
type: PacketType;
|
|
43
35
|
protocolName?: string | undefined;
|
|
44
36
|
protocolLevel: 5;
|
|
45
37
|
clientId?: ClientId | undefined;
|
|
@@ -76,221 +68,215 @@ function invalidProtocolName(version: number, name: string): boolean {
|
|
|
76
68
|
return true;
|
|
77
69
|
}
|
|
78
70
|
|
|
79
|
-
export
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
codecOpts: CodecOpts,
|
|
85
|
-
packetType: TPacketType,
|
|
86
|
-
): ConnectPacket;
|
|
87
|
-
} = {
|
|
88
|
-
encode(packet: ConnectPacket, codecOpts: CodecOpts): Uint8Array {
|
|
89
|
-
const flags = 0;
|
|
71
|
+
export function encode(
|
|
72
|
+
packet: ConnectPacket,
|
|
73
|
+
codecOpts: CodecOpts,
|
|
74
|
+
): Uint8Array {
|
|
75
|
+
const flags = 0;
|
|
90
76
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
throw new EncoderError("Will payload must be defined");
|
|
114
|
-
}
|
|
77
|
+
// deno-coverage-ignore-start
|
|
78
|
+
if (typeof packet.protocolLevel !== "number") {
|
|
79
|
+
throw new EncoderError("Protocol level must be a number");
|
|
80
|
+
}
|
|
81
|
+
const protocolLevel = packet.protocolLevel || 4;
|
|
82
|
+
if (protocolLevel < 3 || protocolLevel > 5) {
|
|
83
|
+
throw new EncoderError("Unsupported protocol level");
|
|
84
|
+
}
|
|
85
|
+
// deno-coverage-ignore-stop
|
|
86
|
+
const protocolName = protocolLevel > 3 ? "MQTT" : "MQIsdp";
|
|
87
|
+
const clientId = packet.clientId || "";
|
|
88
|
+
const usernameFlag = packet.username !== undefined;
|
|
89
|
+
if (protocolLevel === 3 && clientId === "") {
|
|
90
|
+
throw new EncoderError("Client id required for protocol level 3");
|
|
91
|
+
}
|
|
92
|
+
const passwordFlag = usernameFlag && packet.password !== undefined;
|
|
93
|
+
const willRetain = !!packet.will?.retain;
|
|
94
|
+
const willQoS = packet.will?.qos || 0;
|
|
95
|
+
const willFlag = packet.will !== undefined;
|
|
96
|
+
if (willFlag) {
|
|
97
|
+
if (packet.will?.topic === undefined) {
|
|
98
|
+
throw new EncoderError("Will topic must be defined");
|
|
115
99
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
throw new EncoderError("Client id required for clean session");
|
|
100
|
+
if (packet.will?.payload === undefined) {
|
|
101
|
+
throw new EncoderError("Will payload must be defined");
|
|
119
102
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
103
|
+
}
|
|
104
|
+
const cleanSession = packet.clean !== false;
|
|
105
|
+
if (!cleanSession && (clientId === "")) {
|
|
106
|
+
throw new EncoderError("Client id required for non-clean session");
|
|
107
|
+
}
|
|
108
|
+
const connectFlags = (usernameFlag ? BitMask.bit7 : 0) +
|
|
109
|
+
(passwordFlag ? BitMask.bit6 : 0) +
|
|
110
|
+
(willRetain ? BitMask.bit5 : 0) +
|
|
111
|
+
(willQoS & 2 ? BitMask.bit4 : 0) +
|
|
112
|
+
(willQoS & 1 ? BitMask.bit3 : 0) +
|
|
113
|
+
(willFlag ? BitMask.bit2 : 0) +
|
|
114
|
+
(cleanSession ? BitMask.bit1 : 0);
|
|
115
|
+
const keepAlive = packet.keepAlive || 0;
|
|
116
|
+
const bridgeMode = !!packet.bridgeMode;
|
|
117
|
+
const rawProtocolLevel = bridgeMode ? protocolLevel + 128 : protocolLevel;
|
|
130
118
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
119
|
+
const encoder = new Encoder(packet.type);
|
|
120
|
+
encoder
|
|
121
|
+
.setUtf8String(protocolName)
|
|
122
|
+
.setByte(rawProtocolLevel)
|
|
123
|
+
.setByte(connectFlags)
|
|
124
|
+
.setInt16(keepAlive);
|
|
125
|
+
if (packet.protocolLevel === 5) {
|
|
126
|
+
encoder.setProperties(
|
|
127
|
+
packet.properties || {},
|
|
128
|
+
PropertySetType.connect,
|
|
129
|
+
codecOpts.maxOutgoingPacketSize,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
encoder.setUtf8String(clientId);
|
|
133
|
+
|
|
134
|
+
if (
|
|
135
|
+
packet.will !== undefined && packet.will.topic !== undefined &&
|
|
136
|
+
packet.will.payload !== undefined
|
|
137
|
+
) {
|
|
137
138
|
if (packet.protocolLevel === 5) {
|
|
138
139
|
encoder.setProperties(
|
|
139
|
-
packet.properties || {},
|
|
140
|
-
PropertySetType.
|
|
140
|
+
packet.will?.properties || {},
|
|
141
|
+
PropertySetType.will,
|
|
141
142
|
codecOpts.maxOutgoingPacketSize,
|
|
142
143
|
);
|
|
143
144
|
}
|
|
144
|
-
encoder.setUtf8String(
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
packet.will !== undefined && packet.will.topic !== undefined &&
|
|
148
|
-
packet.will.payload !== undefined
|
|
149
|
-
) {
|
|
150
|
-
if (packet.protocolLevel === 5) {
|
|
151
|
-
encoder.setProperties(
|
|
152
|
-
packet.will?.properties || {},
|
|
153
|
-
PropertySetType.will,
|
|
154
|
-
codecOpts.maxOutgoingPacketSize,
|
|
155
|
-
);
|
|
156
|
-
}
|
|
157
|
-
encoder.setTopic(packet.will.topic).setByteArray(packet.will.payload);
|
|
158
|
-
}
|
|
145
|
+
encoder.setUtf8String(packet.will.topic);
|
|
146
|
+
encoder.setByteArray(packet.will.payload);
|
|
147
|
+
}
|
|
159
148
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
149
|
+
if (packet.username !== undefined) {
|
|
150
|
+
encoder.setUtf8String(packet.username);
|
|
151
|
+
}
|
|
163
152
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
153
|
+
if (passwordFlag && packet.password !== undefined) {
|
|
154
|
+
encoder.setByteArray(packet.password);
|
|
155
|
+
}
|
|
156
|
+
return encoder.done(flags);
|
|
157
|
+
}
|
|
169
158
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
? rawProtocolLevel - 128
|
|
182
|
-
: rawProtocolLevel;
|
|
159
|
+
export function decode(
|
|
160
|
+
buffer: Uint8Array,
|
|
161
|
+
flags: number,
|
|
162
|
+
_codecOpts: CodecOpts,
|
|
163
|
+
packetType: PacketType,
|
|
164
|
+
): ConnectPacket {
|
|
165
|
+
const decoder = new Decoder(packetType, buffer);
|
|
166
|
+
const protocolName = decoder.getUTF8String();
|
|
167
|
+
const rawProtocolLevel = decoder.getByte();
|
|
168
|
+
const bridgeMode = rawProtocolLevel > 128;
|
|
169
|
+
const protocolLevel = bridgeMode ? rawProtocolLevel - 128 : rawProtocolLevel;
|
|
183
170
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
171
|
+
if (invalidProtocolName(protocolLevel, protocolName)) {
|
|
172
|
+
throw new DecoderError("Invalid protocol name or level");
|
|
173
|
+
}
|
|
187
174
|
|
|
188
|
-
|
|
175
|
+
const connectFlags = decoder.getByte();
|
|
189
176
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
177
|
+
const usernameFlag = booleanFlag(connectFlags, BitMask.bit7);
|
|
178
|
+
const passwordFlag = booleanFlag(connectFlags, BitMask.bit6);
|
|
179
|
+
const willRetain = booleanFlag(connectFlags, BitMask.bit5);
|
|
180
|
+
const willQoS = (connectFlags & (BitMask.bit4 + BitMask.bit3)) >> 3;
|
|
181
|
+
const willFlag = booleanFlag(connectFlags, BitMask.bit2);
|
|
182
|
+
const cleanSession = booleanFlag(connectFlags, BitMask.bit1);
|
|
183
|
+
const reservedBit = booleanFlag(connectFlags, BitMask.bit0);
|
|
197
184
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
185
|
+
hasEmptyFlags(flags);
|
|
186
|
+
// The Server MUST validate that the reserved flag in the CONNECT Control Packet
|
|
187
|
+
// is set to zero and disconnect the Client if it is not zero [MQTT-3.1.2-3].
|
|
188
|
+
if (reservedBit) {
|
|
189
|
+
throw new DecoderError("Invalid reserved bit");
|
|
190
|
+
}
|
|
204
191
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
192
|
+
if (willQoS !== 0 && willQoS !== 1 && willQoS !== 2) {
|
|
193
|
+
throw new DecoderError("Invalid will qos");
|
|
194
|
+
}
|
|
208
195
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
196
|
+
if (!usernameFlag && passwordFlag) {
|
|
197
|
+
throw new DecoderError("Password without username");
|
|
198
|
+
}
|
|
212
199
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
200
|
+
const keepAlive = decoder.getInt16();
|
|
201
|
+
const isV5 = protocolLevel === 5;
|
|
202
|
+
let properties;
|
|
203
|
+
if (isV5) {
|
|
204
|
+
properties = decoder.getProperties(PropertySetType.connect);
|
|
205
|
+
}
|
|
206
|
+
const clientId = decoder.getUTF8String();
|
|
207
|
+
let willProperties;
|
|
208
|
+
let willTopic;
|
|
209
|
+
let willPayload;
|
|
210
|
+
if (willFlag) {
|
|
216
211
|
if (isV5) {
|
|
217
|
-
|
|
218
|
-
}
|
|
219
|
-
const clientId = decoder.getUTF8String();
|
|
220
|
-
let willProperties;
|
|
221
|
-
let willTopic;
|
|
222
|
-
let willPayload;
|
|
223
|
-
if (willFlag) {
|
|
224
|
-
if (isV5) {
|
|
225
|
-
willProperties = decoder.getProperties(PropertySetType.will);
|
|
226
|
-
}
|
|
227
|
-
willTopic = decoder.getTopic();
|
|
228
|
-
willPayload = decoder.getByteArray();
|
|
212
|
+
willProperties = decoder.getProperties(PropertySetType.will);
|
|
229
213
|
}
|
|
214
|
+
willTopic = decoder.getUTF8String();
|
|
215
|
+
willPayload = decoder.getByteArray();
|
|
216
|
+
}
|
|
230
217
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
218
|
+
let username;
|
|
219
|
+
let password;
|
|
220
|
+
if (usernameFlag) {
|
|
221
|
+
username = decoder.getUTF8String();
|
|
222
|
+
}
|
|
236
223
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
224
|
+
if (passwordFlag) {
|
|
225
|
+
password = decoder.getByteArray();
|
|
226
|
+
}
|
|
240
227
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
228
|
+
decoder.done();
|
|
229
|
+
if (!willFlag && (willQoS !== 0 || willRetain === true)) {
|
|
230
|
+
throw new DecoderError(
|
|
231
|
+
"Will QoS must be 0 and Will retain to false when Will flag is false",
|
|
232
|
+
);
|
|
233
|
+
}
|
|
247
234
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
235
|
+
if (clientId.length === 0 && cleanSession === false) {
|
|
236
|
+
throw new DecoderError("Clean session must be true if clientID is empty");
|
|
237
|
+
}
|
|
251
238
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
239
|
+
let bridgeModeProp = {};
|
|
240
|
+
if (bridgeMode) {
|
|
241
|
+
bridgeModeProp = { bridgeMode };
|
|
242
|
+
}
|
|
243
|
+
const commonProps = {
|
|
244
|
+
type: PacketType.connect,
|
|
245
|
+
protocolName: protocolName,
|
|
246
|
+
clientId: clientId,
|
|
247
|
+
username,
|
|
248
|
+
password: password ? password : undefined,
|
|
249
|
+
clean: cleanSession,
|
|
250
|
+
keepAlive,
|
|
251
|
+
...bridgeModeProp,
|
|
252
|
+
};
|
|
266
253
|
|
|
267
|
-
|
|
268
|
-
return {
|
|
269
|
-
...commonProps,
|
|
270
|
-
protocolLevel: 5,
|
|
271
|
-
will: willFlag
|
|
272
|
-
? {
|
|
273
|
-
topic: willTopic || "",
|
|
274
|
-
payload: willPayload || Uint8Array.from([0]),
|
|
275
|
-
retain: willRetain,
|
|
276
|
-
qos: willQoS,
|
|
277
|
-
properties: willProperties,
|
|
278
|
-
}
|
|
279
|
-
: undefined,
|
|
280
|
-
properties,
|
|
281
|
-
};
|
|
282
|
-
}
|
|
254
|
+
if (isV5) {
|
|
283
255
|
return {
|
|
284
256
|
...commonProps,
|
|
285
|
-
protocolLevel:
|
|
257
|
+
protocolLevel: 5,
|
|
286
258
|
will: willFlag
|
|
287
259
|
? {
|
|
288
260
|
topic: willTopic || "",
|
|
289
261
|
payload: willPayload || Uint8Array.from([0]),
|
|
290
262
|
retain: willRetain,
|
|
291
263
|
qos: willQoS,
|
|
264
|
+
properties: willProperties,
|
|
292
265
|
}
|
|
293
266
|
: undefined,
|
|
267
|
+
properties,
|
|
294
268
|
};
|
|
295
|
-
}
|
|
296
|
-
|
|
269
|
+
}
|
|
270
|
+
return {
|
|
271
|
+
...commonProps,
|
|
272
|
+
protocolLevel: protocolLevel as ProtocolLevel,
|
|
273
|
+
will: willFlag
|
|
274
|
+
? {
|
|
275
|
+
topic: willTopic || "",
|
|
276
|
+
payload: willPayload || Uint8Array.from([0]),
|
|
277
|
+
retain: willRetain,
|
|
278
|
+
qos: willQoS,
|
|
279
|
+
}
|
|
280
|
+
: undefined,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
@@ -77,45 +77,6 @@ test("decode string", () => {
|
|
|
77
77
|
assert.deepStrictEqual(decoder.done(), true);
|
|
78
78
|
});
|
|
79
79
|
|
|
80
|
-
test("decode topic", () => {
|
|
81
|
-
const str = "hello world";
|
|
82
|
-
const byteArray = utf8encoder.encode(str);
|
|
83
|
-
const len = byteArray.length;
|
|
84
|
-
const decoder = new Decoder(
|
|
85
|
-
packetType,
|
|
86
|
-
Uint8Array.from([0x00, len, ...byteArray]),
|
|
87
|
-
);
|
|
88
|
-
assert.deepStrictEqual(decoder.getTopic(), str);
|
|
89
|
-
assert.deepStrictEqual(decoder.done(), true);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
test("Topic too short", () => {
|
|
93
|
-
const decoder = new Decoder(packetType, Uint8Array.from([0x00, 0]));
|
|
94
|
-
assert.throws(
|
|
95
|
-
() => decoder.getTopic(),
|
|
96
|
-
Error,
|
|
97
|
-
"Topic must contain valid UTF-8 and contain more than 1 byte and no wildcards",
|
|
98
|
-
);
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
test("Invalid topic", () => {
|
|
102
|
-
const decoder = new Decoder(packetType, Uint8Array.from([0x00, 0x01, 0x00]));
|
|
103
|
-
assert.throws(
|
|
104
|
-
() => decoder.getTopic(),
|
|
105
|
-
Error,
|
|
106
|
-
"Topic must contain valid UTF-8 and contain more than 1 byte and no wildcards",
|
|
107
|
-
);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
test("Invalid topicFilter", () => {
|
|
111
|
-
const decoder = new Decoder(packetType, Uint8Array.from([0x00, 0x01, 0x00]));
|
|
112
|
-
assert.throws(
|
|
113
|
-
() => decoder.getTopic(),
|
|
114
|
-
Error,
|
|
115
|
-
"Topic must contain valid UTF-8 and contain more than 1 byte and no wildcards",
|
|
116
|
-
);
|
|
117
|
-
});
|
|
118
|
-
|
|
119
80
|
test("Buffer too short", () => {
|
|
120
81
|
const str = "hello world";
|
|
121
82
|
const byteArray = utf8encoder.encode(str);
|
package/mqttPacket/decoder.ts
CHANGED
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
Topic,
|
|
4
|
-
TopicFilter,
|
|
5
|
-
TPacketType,
|
|
6
|
-
TReasonCode,
|
|
7
|
-
UTF8StringPair,
|
|
8
|
-
} from "./types.ts";
|
|
9
|
-
import { invalidTopic, invalidTopicFilter } from "./validators.ts";
|
|
1
|
+
import type { BitMask, UTF8StringPair } from "./types.ts";
|
|
2
|
+
import { invalidUTF8 } from "./validators.ts";
|
|
10
3
|
import { isValidReasonCode } from "./ReasonCode.ts";
|
|
11
4
|
import type {
|
|
12
5
|
Mqttv5PropertyTypesNoUser,
|
|
@@ -23,6 +16,9 @@ import {
|
|
|
23
16
|
propertyToKind,
|
|
24
17
|
} from "./Properties.ts";
|
|
25
18
|
|
|
19
|
+
import type { PacketType } from "./PacketType.ts";
|
|
20
|
+
import type { ReasonCode } from "./ReasonCode.ts";
|
|
21
|
+
|
|
26
22
|
const utf8Decoder = new TextDecoder("utf-8");
|
|
27
23
|
const userPropID = propertyToId.userProperty;
|
|
28
24
|
const subIdentID = propertyToId.subscriptionIdentifier;
|
|
@@ -33,7 +29,7 @@ const subIdentsID = propertyToId.subscriptionIdentifiers;
|
|
|
33
29
|
* @param mask - The bitmask to apply
|
|
34
30
|
* @returns True if the flag is set, false otherwise
|
|
35
31
|
*/
|
|
36
|
-
export function booleanFlag(byte: number, mask:
|
|
32
|
+
export function booleanFlag(byte: number, mask: BitMask): boolean {
|
|
37
33
|
return !!(byte & mask);
|
|
38
34
|
}
|
|
39
35
|
|
|
@@ -73,7 +69,7 @@ export class DecoderError extends Error {
|
|
|
73
69
|
* Decoder class for parsing MQTT packets
|
|
74
70
|
*/
|
|
75
71
|
export class Decoder {
|
|
76
|
-
private packetType:
|
|
72
|
+
private packetType: PacketType;
|
|
77
73
|
private buf: Uint8Array;
|
|
78
74
|
private pos: number;
|
|
79
75
|
private len: number;
|
|
@@ -83,7 +79,7 @@ export class Decoder {
|
|
|
83
79
|
* @param buf - The buffer to decode
|
|
84
80
|
* @param pos - Starting position in the buffer (default: 0)
|
|
85
81
|
*/
|
|
86
|
-
constructor(packetType:
|
|
82
|
+
constructor(packetType: PacketType, buf: Uint8Array, pos: number = 0) {
|
|
87
83
|
this.packetType = packetType;
|
|
88
84
|
this.buf = buf;
|
|
89
85
|
this.pos = pos;
|
|
@@ -170,6 +166,11 @@ export class Decoder {
|
|
|
170
166
|
*/
|
|
171
167
|
getUTF8String(): string {
|
|
172
168
|
const str = utf8Decoder.decode(this.getByteArray());
|
|
169
|
+
if (invalidUTF8(str)) {
|
|
170
|
+
throw new DecoderError(
|
|
171
|
+
"String must contain valid UTF-8",
|
|
172
|
+
);
|
|
173
|
+
}
|
|
173
174
|
return str;
|
|
174
175
|
}
|
|
175
176
|
|
|
@@ -178,41 +179,11 @@ export class Decoder {
|
|
|
178
179
|
* @returns The decoded UTF-8 pair as [name,value]
|
|
179
180
|
*/
|
|
180
181
|
getUTF8StringPair(): UTF8StringPair {
|
|
181
|
-
const name =
|
|
182
|
-
const value =
|
|
182
|
+
const name = this.getUTF8String();
|
|
183
|
+
const value = this.getUTF8String();
|
|
183
184
|
return [name, value];
|
|
184
185
|
}
|
|
185
186
|
|
|
186
|
-
/**
|
|
187
|
-
* Gets a topic from the buffer
|
|
188
|
-
* @returns The decoded topic
|
|
189
|
-
* @throws {DecoderError} If topic is invalid
|
|
190
|
-
*/
|
|
191
|
-
getTopic(): Topic {
|
|
192
|
-
const topic = this.getUTF8String();
|
|
193
|
-
if (invalidTopic(topic)) {
|
|
194
|
-
throw new DecoderError(
|
|
195
|
-
"Topic must contain valid UTF-8 and contain more than 1 byte and no wildcards",
|
|
196
|
-
);
|
|
197
|
-
}
|
|
198
|
-
return topic;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Gets a topic filter from the buffer
|
|
203
|
-
* @returns The decoded topic filter
|
|
204
|
-
* @throws {DecoderError} If topic filter is invalid
|
|
205
|
-
*/
|
|
206
|
-
getTopicFilter(): TopicFilter {
|
|
207
|
-
const topicFilter = this.getUTF8String();
|
|
208
|
-
if (invalidTopicFilter(topicFilter)) {
|
|
209
|
-
throw new DecoderError(
|
|
210
|
-
"Topicfilter must contain valid UTF-8 and contain more than 1 byte and valid wildcards",
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
return topicFilter;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
187
|
/**
|
|
217
188
|
* Gets the remaining bytes from the current position to the end
|
|
218
189
|
* @returns The remaining bytes as a subarray
|
|
@@ -316,12 +287,12 @@ export class Decoder {
|
|
|
316
287
|
* @returns The decoded reason code
|
|
317
288
|
* @throws {DecoderError} If reason code is invalid
|
|
318
289
|
*/
|
|
319
|
-
|
|
290
|
+
geReasonCode(): ReasonCode {
|
|
320
291
|
const reasonCode = this.getByte();
|
|
321
292
|
if (!isValidReasonCode(this.packetType, reasonCode)) {
|
|
322
293
|
throw new DecoderError("Invalid reason code");
|
|
323
294
|
}
|
|
324
|
-
return reasonCode as
|
|
295
|
+
return reasonCode as ReasonCode;
|
|
325
296
|
}
|
|
326
297
|
|
|
327
298
|
/**
|