@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,143 @@
|
|
|
1
|
+
import { PacketDirection } from "../storage.js";
|
|
2
|
+
import { getOrInsert, joinTopicFilter, topicFilterToRegExp } from "../deps.js";
|
|
3
|
+
export class MemoryStorage {
|
|
4
|
+
seqId = 1;
|
|
5
|
+
sessionTable = new Map();
|
|
6
|
+
subscriptionTable = new Map();
|
|
7
|
+
pendingIncomingTable = new Map();
|
|
8
|
+
pendingOutgoingTable = new Map();
|
|
9
|
+
pendingAckOutgoingTable = new Map();
|
|
10
|
+
retainedTable = new Map();
|
|
11
|
+
initialize() {
|
|
12
|
+
return Promise.resolve();
|
|
13
|
+
}
|
|
14
|
+
// --- Sessions ---
|
|
15
|
+
saveSession(clientId, session) {
|
|
16
|
+
this.sessionTable.set(clientId, session);
|
|
17
|
+
return Promise.resolve();
|
|
18
|
+
}
|
|
19
|
+
getSession(clientId) {
|
|
20
|
+
return Promise.resolve(this.sessionTable.get(clientId) ?? null);
|
|
21
|
+
}
|
|
22
|
+
deleteSession(clientId) {
|
|
23
|
+
this.sessionTable.delete(clientId);
|
|
24
|
+
this.pendingIncomingTable.delete(clientId);
|
|
25
|
+
this.pendingOutgoingTable.delete(clientId);
|
|
26
|
+
this.pendingAckOutgoingTable.delete(clientId);
|
|
27
|
+
this.subscriptionTable.delete(clientId);
|
|
28
|
+
return Promise.resolve();
|
|
29
|
+
}
|
|
30
|
+
async *listAllSessions() {
|
|
31
|
+
for (const [clientId, session] of this.sessionTable.entries()) {
|
|
32
|
+
yield { clientId, session };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// --- Subscriptions ---
|
|
36
|
+
saveSubscription(clientId, sub) {
|
|
37
|
+
const key = joinTopicFilter(sub.topicFilter, sub.shareName);
|
|
38
|
+
const clientSubs = getOrInsert(this.subscriptionTable, clientId, new Map());
|
|
39
|
+
clientSubs.set(key, sub);
|
|
40
|
+
return Promise.resolve();
|
|
41
|
+
}
|
|
42
|
+
deleteSubscription(clientId, topicFilter, shareName) {
|
|
43
|
+
const key = joinTopicFilter(topicFilter, shareName);
|
|
44
|
+
this.subscriptionTable.get(clientId)?.delete(key);
|
|
45
|
+
return Promise.resolve();
|
|
46
|
+
}
|
|
47
|
+
async *listSubscriptions(clientId) {
|
|
48
|
+
const clientSubs = this.subscriptionTable.get(clientId);
|
|
49
|
+
if (clientSubs) {
|
|
50
|
+
for (const sub of clientSubs.values()) {
|
|
51
|
+
yield sub;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async *listAllSubscriptions() {
|
|
56
|
+
for (const [clientId, clientSubs] of this.subscriptionTable.entries()) {
|
|
57
|
+
for (const sub of clientSubs.values()) {
|
|
58
|
+
yield { ...sub, clientId };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// --- Pending Packets (Incoming & Outgoing) ---
|
|
63
|
+
getPacketTable(clientId, direction) {
|
|
64
|
+
const table = direction === PacketDirection.Incoming
|
|
65
|
+
? this.pendingIncomingTable
|
|
66
|
+
: this.pendingOutgoingTable;
|
|
67
|
+
return getOrInsert(table, clientId, new Map());
|
|
68
|
+
}
|
|
69
|
+
savePendingPacket(clientId, direction, packet) {
|
|
70
|
+
const createdAtMs = Date.now();
|
|
71
|
+
if (packet.id !== undefined) {
|
|
72
|
+
this.getPacketTable(clientId, direction).set(packet.id, {
|
|
73
|
+
seqId: this.seqId++,
|
|
74
|
+
packet,
|
|
75
|
+
createdAtMs,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return Promise.resolve();
|
|
79
|
+
}
|
|
80
|
+
getPendingPacket(clientId, direction, packetId) {
|
|
81
|
+
const entry = this.getPacketTable(clientId, direction).get(packetId);
|
|
82
|
+
return Promise.resolve(entry?.packet ?? null);
|
|
83
|
+
}
|
|
84
|
+
updatePendingPacket(clientId, direction, packetId, dup) {
|
|
85
|
+
const entry = this.getPacketTable(clientId, direction).get(packetId);
|
|
86
|
+
if (entry !== undefined) {
|
|
87
|
+
entry.packet.dup = dup;
|
|
88
|
+
}
|
|
89
|
+
return Promise.resolve(entry !== undefined);
|
|
90
|
+
}
|
|
91
|
+
deletePendingPacket(clientId, direction, packetId) {
|
|
92
|
+
const deleted = this.getPacketTable(clientId, direction).delete(packetId);
|
|
93
|
+
return Promise.resolve(deleted);
|
|
94
|
+
}
|
|
95
|
+
async *listPendingPackets(clientId, direction) {
|
|
96
|
+
const queue = this.getPacketTable(clientId, direction);
|
|
97
|
+
if (!queue)
|
|
98
|
+
return;
|
|
99
|
+
for (const entry of queue.values()) {
|
|
100
|
+
yield entry.packet;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// --- ACKs ---
|
|
104
|
+
getAckSet(clientId) {
|
|
105
|
+
return getOrInsert(this.pendingAckOutgoingTable, clientId, new Set());
|
|
106
|
+
}
|
|
107
|
+
savePendingAck(clientId, packetId) {
|
|
108
|
+
this.getAckSet(clientId).add(packetId);
|
|
109
|
+
return Promise.resolve();
|
|
110
|
+
}
|
|
111
|
+
hasPendingAck(clientId, packetId) {
|
|
112
|
+
const hasAck = this.getAckSet(clientId).has(packetId);
|
|
113
|
+
return Promise.resolve(hasAck);
|
|
114
|
+
}
|
|
115
|
+
deletePendingAck(clientId, packetId) {
|
|
116
|
+
const deleted = this.getAckSet(clientId).delete(packetId);
|
|
117
|
+
return Promise.resolve(deleted);
|
|
118
|
+
}
|
|
119
|
+
async *listPendingAcks(clientId) {
|
|
120
|
+
const ackSet = this.getAckSet(clientId);
|
|
121
|
+
for (const packetId of ackSet) {
|
|
122
|
+
yield packetId;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// --- Retained Messages ---
|
|
126
|
+
saveRetained(topic, packet) {
|
|
127
|
+
this.retainedTable.set(topic, packet);
|
|
128
|
+
return Promise.resolve();
|
|
129
|
+
}
|
|
130
|
+
deleteRetained(topic) {
|
|
131
|
+
this.retainedTable.delete(topic);
|
|
132
|
+
return Promise.resolve();
|
|
133
|
+
}
|
|
134
|
+
async *listRetainedMatches(topicFilter) {
|
|
135
|
+
const regex = topicFilterToRegExp(topicFilter);
|
|
136
|
+
for (const [topic, packet] of this.retainedTable.entries()) {
|
|
137
|
+
if (regex.test(topic)) {
|
|
138
|
+
yield packet;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=memoryStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryStorage.js","sourceRoot":"","sources":["../../../persistence/memory/memoryStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* @module persistence
|
|
3
3
|
* @description Module for handling MQTT message persistence and client management
|
|
4
4
|
*/
|
|
5
|
-
export type { IStore, PacketIdStore, PacketStore, SubscriptionStore, } from "./store.ts";
|
|
6
5
|
export type { ClientId, PacketId, PublishPacket, QoS, Topic, TopicFilter, } from "./deps.ts";
|
|
7
|
-
export type {
|
|
8
|
-
export {
|
|
6
|
+
export type { ClientRegistrationResult, Handler, Persistence, } from "./persistence.ts";
|
|
7
|
+
export { MAX_PACKET_ID } from "./persistence.ts";
|
|
8
|
+
export { SqlitePersistence } from "./sqlite/sqlitePersistence.ts";
|
|
9
9
|
//# sourceMappingURL=mod.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../persistence/mod.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../persistence/mod.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,GAAG,EACH,KAAK,EACL,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,wBAAwB,EACxB,OAAO,EACP,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC"}
|
package/dist/persistence/mod.js
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @module persistence
|
|
3
|
+
* @description Module for handling MQTT message persistence and client management
|
|
4
|
+
*/
|
|
5
|
+
export { MAX_PACKET_ID } from "./persistence.js";
|
|
6
|
+
export { SqlitePersistence } from "./sqlite/sqlitePersistence.js";
|
|
2
7
|
//# sourceMappingURL=mod.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../persistence/mod.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../persistence/mod.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -2,85 +2,60 @@
|
|
|
2
2
|
* @module persistence
|
|
3
3
|
* @description Module for handling MQTT message persistence and client management
|
|
4
4
|
*/
|
|
5
|
-
import type { ClientId,
|
|
6
|
-
import type { IStore } from "./store.ts";
|
|
5
|
+
import type { ClientId, PacketId, PublishPacketV5, QoS, RetainHandling, TopicFilter } from "./deps.ts";
|
|
7
6
|
/**
|
|
8
|
-
*
|
|
9
|
-
* @constant {number}
|
|
10
|
-
*/
|
|
11
|
-
export declare const maxPacketId = 65535;
|
|
12
|
-
/**
|
|
13
|
-
* Handler function type for processing publish packets
|
|
14
|
-
* @callback Handler
|
|
15
|
-
* @param {PublishPacket} packet - The MQTT publish packet to handle
|
|
7
|
+
* extended publish packet also contains meta data
|
|
16
8
|
*/
|
|
17
|
-
export type
|
|
9
|
+
export type ExtPublishPacket = PublishPacketV5 & {
|
|
10
|
+
expiresAtMs?: number;
|
|
11
|
+
};
|
|
18
12
|
/**
|
|
19
|
-
*
|
|
20
|
-
* @typedef {Map<Topic, PublishPacket>} RetainStore
|
|
13
|
+
* The MQTT topic share to subscribe/unsubscribe to
|
|
21
14
|
*/
|
|
22
|
-
export type
|
|
15
|
+
export type ShareName = string;
|
|
16
|
+
export type ClientSubscription = {
|
|
17
|
+
topicFilter: TopicFilter;
|
|
18
|
+
shareName: ShareName;
|
|
19
|
+
qos: QoS;
|
|
20
|
+
noLocal?: boolean;
|
|
21
|
+
retainAsPublished?: boolean;
|
|
22
|
+
retainHandling?: RetainHandling;
|
|
23
|
+
subscriptionIdentifier?: number;
|
|
24
|
+
};
|
|
23
25
|
/**
|
|
24
|
-
*
|
|
25
|
-
* @typedef {Object} Client
|
|
26
|
-
* @property {IStore} store - The client's message store
|
|
27
|
-
* @property {Handler} handler - The client's packet handler function
|
|
26
|
+
* Maximum packet ID value for MQTT messages (0xffff/65535)
|
|
28
27
|
*/
|
|
29
|
-
export
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
export declare const MAX_PACKET_ID = 65535;
|
|
29
|
+
export type Handler = (packet: ExtPublishPacket) => void | Promise<void>;
|
|
30
|
+
export type ClientRegistrationResult = {
|
|
31
|
+
existingSession: boolean;
|
|
32
32
|
};
|
|
33
33
|
/**
|
|
34
34
|
* Interface for persistence implementations to store messages and subscriptions
|
|
35
|
-
* @interface IPersistence
|
|
36
35
|
*/
|
|
37
|
-
export interface
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Publish a message to all subscribed clients
|
|
63
|
-
* @param {Topic} topic - Topic to publish to
|
|
64
|
-
* @param {PublishPacket} packet - Packet containing the message
|
|
65
|
-
*/
|
|
66
|
-
publish(topic: Topic, packet: PublishPacket): void;
|
|
67
|
-
/**
|
|
68
|
-
* Subscribe a client to a topic
|
|
69
|
-
* @param {IStore} store - Client's message store
|
|
70
|
-
* @param {Topic} topic - Topic to subscribe to
|
|
71
|
-
* @param {QoS} qos - Quality of Service level
|
|
72
|
-
*/
|
|
73
|
-
subscribe(store: IStore, topic: Topic, qos: QoS): void;
|
|
74
|
-
/**
|
|
75
|
-
* Unsubscribe a client from a topic
|
|
76
|
-
* @param {IStore} store - Client's message store
|
|
77
|
-
* @param {Topic} topic - Topic to unsubscribe from
|
|
78
|
-
*/
|
|
79
|
-
unsubscribe(store: IStore, topic: Topic): void;
|
|
80
|
-
/**
|
|
81
|
-
* Send retained messages to a client
|
|
82
|
-
* @param {ClientId} clientId - ID of client to send retained messages to
|
|
83
|
-
*/
|
|
84
|
-
handleRetained(clientId: ClientId): void;
|
|
36
|
+
export interface Persistence {
|
|
37
|
+
initialize(): Promise<void>;
|
|
38
|
+
registerClient(clientId: ClientId, handler: Handler): Promise<ClientRegistrationResult>;
|
|
39
|
+
deregisterClient(clientId: ClientId): Promise<void>;
|
|
40
|
+
disconnectClient(clientId: ClientId): Promise<void>;
|
|
41
|
+
subscribe(clientId: ClientId, subscription: ClientSubscription): Promise<void>;
|
|
42
|
+
unsubscribe(clientId: ClientId, topicFilter: TopicFilter, shareName: ShareName): Promise<void>;
|
|
43
|
+
listSubscriptions(clientId: ClientId): AsyncIterableIterator<ClientSubscription>;
|
|
44
|
+
addPendingIncomingPacket(clientId: ClientId, packet: ExtPublishPacket): Promise<void>;
|
|
45
|
+
getPendingIncomingPacket(clientId: ClientId, packetId: PacketId): Promise<ExtPublishPacket | null>;
|
|
46
|
+
listPendingIncomingPackets(clientId: ClientId): AsyncIterableIterator<ExtPublishPacket>;
|
|
47
|
+
deletePendingIncomingPacket(clientId: ClientId, packetId: PacketId): Promise<boolean>;
|
|
48
|
+
addPendingOutgoingPacket(clientId: ClientId, packet: ExtPublishPacket): Promise<void>;
|
|
49
|
+
getPendingOutgoingPacket(clientId: ClientId, packetId: PacketId): Promise<ExtPublishPacket | null>;
|
|
50
|
+
updatePendingOutgoingPacket(clientId: ClientId, packetId: PacketId, dup: boolean): Promise<boolean>;
|
|
51
|
+
listPendingOutgoingPackets(clientId: ClientId): AsyncIterableIterator<ExtPublishPacket>;
|
|
52
|
+
deletePendingOutgoingPacket(clientId: ClientId, packetId: PacketId): Promise<boolean>;
|
|
53
|
+
addPendingAck(clientId: ClientId, packetId: PacketId): Promise<void>;
|
|
54
|
+
hasPendingAck(clientId: ClientId, packetId: PacketId): Promise<boolean>;
|
|
55
|
+
deletePendingAck(clientId: ClientId, packetId: PacketId): Promise<boolean>;
|
|
56
|
+
listPendingAcks(clientId: ClientId): AsyncIterableIterator<PacketId>;
|
|
57
|
+
publish(clientId: ClientId, packet: ExtPublishPacket): Promise<void>;
|
|
58
|
+
handleRetained(clientId: ClientId, subscriptions: ClientSubscription[]): Promise<void>;
|
|
59
|
+
nextPacketId(clientId: ClientId): Promise<PacketId>;
|
|
85
60
|
}
|
|
86
61
|
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../persistence/persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../persistence/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../persistence/persistence.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../persistence/persistence.ts"],"names":[],"mappings":"AAmCA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import sqlite from "node:sqlite";
|
|
2
|
+
import type { ClientId } from "../../mqttPacket/types.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Instantiates the physical relational structures and schemas required by the persistence engine.
|
|
5
|
+
* @param filename Filepath location or memory target specifier.
|
|
6
|
+
*/
|
|
7
|
+
export declare function initializeDatabase(filename: string): sqlite.DatabaseSync;
|
|
8
|
+
export type AllStatements = {
|
|
9
|
+
saveSession: sqlite.StatementSync;
|
|
10
|
+
getSession: sqlite.StatementSync;
|
|
11
|
+
listAllSessions: sqlite.StatementSync;
|
|
12
|
+
saveSubscription: sqlite.StatementSync;
|
|
13
|
+
deleteSubscription: sqlite.StatementSync;
|
|
14
|
+
listSubscriptions: sqlite.StatementSync;
|
|
15
|
+
listAllSubscriptions: sqlite.StatementSync;
|
|
16
|
+
saveIncoming: sqlite.StatementSync;
|
|
17
|
+
getIncoming: sqlite.StatementSync;
|
|
18
|
+
updateIncomingDup: sqlite.StatementSync;
|
|
19
|
+
deleteIncoming: sqlite.StatementSync;
|
|
20
|
+
listIncoming: sqlite.StatementSync;
|
|
21
|
+
saveOutgoing: sqlite.StatementSync;
|
|
22
|
+
getOutgoing: sqlite.StatementSync;
|
|
23
|
+
updateOutgoingDup: sqlite.StatementSync;
|
|
24
|
+
deleteOutgoing: sqlite.StatementSync;
|
|
25
|
+
listOutgoing: sqlite.StatementSync;
|
|
26
|
+
saveAck: sqlite.StatementSync;
|
|
27
|
+
hasAck: sqlite.StatementSync;
|
|
28
|
+
deleteAck: sqlite.StatementSync;
|
|
29
|
+
listAcks: sqlite.StatementSync;
|
|
30
|
+
saveRetained: sqlite.StatementSync;
|
|
31
|
+
deleteRetained: sqlite.StatementSync;
|
|
32
|
+
getRetainedExact: sqlite.StatementSync;
|
|
33
|
+
listRetainedLike: sqlite.StatementSync;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Instantiates the physical relational structures and schemas required by the persistence engine.
|
|
37
|
+
* @param db the database for which to prepare the statements
|
|
38
|
+
*/
|
|
39
|
+
export declare function prepareAllStatements(db: sqlite.DatabaseSync): AllStatements;
|
|
40
|
+
/**
|
|
41
|
+
* Truncates and drops relational state assignments under targeted clients inside atomic scopes.
|
|
42
|
+
* @param db Connection reference context.
|
|
43
|
+
* @param clientId Specific target client ID tracking token.
|
|
44
|
+
*/
|
|
45
|
+
export declare function deleteClientState(db: sqlite.DatabaseSync, clientId: ClientId): void;
|
|
46
|
+
//# sourceMappingURL=sqliteDatabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqliteDatabase.d.ts","sourceRoot":"","sources":["../../../persistence/sqlite/sqliteDatabase.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,YAAY,CAoDxE;AAED,MAAM,MAAM,aAAa,GAAG;IAE1B,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC;IAGtC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC;IACvC,kBAAkB,EAAE,MAAM,CAAC,aAAa,CAAC;IACzC,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC;IACxC,oBAAoB,EAAE,MAAM,CAAC,aAAa,CAAC;IAG3C,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC;IAClC,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC;IACxC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC;IAGnC,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC;IAClC,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC;IACxC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC;IAGnC,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC;IAG/B,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC;IACrC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC;IACvC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,CAAC,YAAY,GAAG,aAAa,CAiK3E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,CAAC,YAAY,EACvB,QAAQ,EAAE,QAAQ,GACjB,IAAI,CAkBN"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import sqlite from "node:sqlite";
|
|
2
|
+
/**
|
|
3
|
+
* Instantiates the physical relational structures and schemas required by the persistence engine.
|
|
4
|
+
* @param filename Filepath location or memory target specifier.
|
|
5
|
+
*/
|
|
6
|
+
export function initializeDatabase(filename) {
|
|
7
|
+
const db = new sqlite.DatabaseSync(filename);
|
|
8
|
+
db.exec(`
|
|
9
|
+
PRAGMA journal_mode = WAL;
|
|
10
|
+
PRAGMA synchronous = NORMAL;
|
|
11
|
+
|
|
12
|
+
CREATE TABLE IF NOT EXISTS client_sessions (
|
|
13
|
+
client_id TEXT PRIMARY KEY,
|
|
14
|
+
session_data TEXT NOT NULL
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
CREATE TABLE IF NOT EXISTS subscriptions (
|
|
18
|
+
client_id TEXT NOT NULL,
|
|
19
|
+
topic TEXT NOT NULL,
|
|
20
|
+
share_name TEXT NOT NULL,
|
|
21
|
+
subscription_data TEXT NOT NULL,
|
|
22
|
+
PRIMARY KEY (client_id, topic, share_name)
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
CREATE TABLE IF NOT EXISTS pending_incoming (
|
|
26
|
+
seq_id INTEGER PRIMARY KEY AUTOINCREMENT, -- Guarantees absolute insertion order
|
|
27
|
+
client_id TEXT NOT NULL,
|
|
28
|
+
packet_id INTEGER NOT NULL,
|
|
29
|
+
packet TEXT NOT NULL,
|
|
30
|
+
payload BLOB,
|
|
31
|
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
32
|
+
UNIQUE (client_id, packet_id)
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
CREATE TABLE IF NOT EXISTS pending_outgoing (
|
|
36
|
+
seq_id INTEGER PRIMARY KEY AUTOINCREMENT, -- Guarantees absolute insertion order
|
|
37
|
+
client_id TEXT NOT NULL,
|
|
38
|
+
packet_id INTEGER NOT NULL,
|
|
39
|
+
packet TEXT NOT NULL,
|
|
40
|
+
payload BLOB,
|
|
41
|
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
42
|
+
UNIQUE (client_id, packet_id)
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
CREATE TABLE IF NOT EXISTS pending_ack_outgoing (
|
|
46
|
+
client_id TEXT NOT NULL,
|
|
47
|
+
packet_id INTEGER NOT NULL,
|
|
48
|
+
PRIMARY KEY (client_id, packet_id)
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
CREATE TABLE IF NOT EXISTS retained (
|
|
52
|
+
topic TEXT PRIMARY KEY,
|
|
53
|
+
packet TEXT NOT NULL,
|
|
54
|
+
payload BLOB
|
|
55
|
+
);
|
|
56
|
+
`);
|
|
57
|
+
return db;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Instantiates the physical relational structures and schemas required by the persistence engine.
|
|
61
|
+
* @param db the database for which to prepare the statements
|
|
62
|
+
*/
|
|
63
|
+
export function prepareAllStatements(db) {
|
|
64
|
+
return {
|
|
65
|
+
// Sessions
|
|
66
|
+
saveSession: db.prepare(`
|
|
67
|
+
INSERT INTO client_sessions (client_id, session_data)
|
|
68
|
+
VALUES (?, ?)
|
|
69
|
+
ON CONFLICT(client_id) DO UPDATE SET
|
|
70
|
+
session_data = excluded.session_data
|
|
71
|
+
`),
|
|
72
|
+
getSession: db.prepare(`
|
|
73
|
+
SELECT session_data
|
|
74
|
+
FROM client_sessions
|
|
75
|
+
WHERE client_id = ?
|
|
76
|
+
`),
|
|
77
|
+
listAllSessions: db.prepare(`
|
|
78
|
+
SELECT client_id, session_data
|
|
79
|
+
FROM client_sessions
|
|
80
|
+
`),
|
|
81
|
+
// Subscriptions
|
|
82
|
+
saveSubscription: db.prepare(`
|
|
83
|
+
INSERT INTO subscriptions (client_id, topic, share_name, subscription_data)
|
|
84
|
+
VALUES (?, ?, ?, ?)
|
|
85
|
+
ON CONFLICT(client_id, topic, share_name) DO UPDATE SET
|
|
86
|
+
subscription_data = excluded.subscription_data
|
|
87
|
+
`),
|
|
88
|
+
deleteSubscription: db.prepare(`
|
|
89
|
+
DELETE FROM subscriptions
|
|
90
|
+
WHERE client_id = ? AND topic = ? AND share_name = ?
|
|
91
|
+
`),
|
|
92
|
+
listSubscriptions: db.prepare(`
|
|
93
|
+
SELECT topic, share_name, subscription_data
|
|
94
|
+
FROM subscriptions
|
|
95
|
+
WHERE client_id = ?
|
|
96
|
+
`),
|
|
97
|
+
listAllSubscriptions: db.prepare(`
|
|
98
|
+
SELECT client_id, topic, share_name, subscription_data
|
|
99
|
+
FROM subscriptions
|
|
100
|
+
`),
|
|
101
|
+
// Pending Incoming Packets
|
|
102
|
+
saveIncoming: db.prepare(`
|
|
103
|
+
INSERT INTO pending_incoming (client_id, packet_id, packet, payload)
|
|
104
|
+
VALUES (?, ?, ?, ?)
|
|
105
|
+
ON CONFLICT(client_id, packet_id) DO UPDATE SET
|
|
106
|
+
packet = excluded.packet,
|
|
107
|
+
payload = excluded.payload
|
|
108
|
+
`),
|
|
109
|
+
getIncoming: db.prepare(`
|
|
110
|
+
SELECT packet, payload
|
|
111
|
+
FROM pending_incoming
|
|
112
|
+
WHERE client_id = ? AND packet_id = ?
|
|
113
|
+
`),
|
|
114
|
+
updateIncomingDup: db.prepare(`
|
|
115
|
+
UPDATE pending_incoming
|
|
116
|
+
SET packet = json_set(packet, '$.dup', json(?))
|
|
117
|
+
WHERE client_id = ? AND packet_id = ?
|
|
118
|
+
`),
|
|
119
|
+
deleteIncoming: db.prepare(`
|
|
120
|
+
DELETE FROM pending_incoming
|
|
121
|
+
WHERE client_id = ? AND packet_id = ?
|
|
122
|
+
`),
|
|
123
|
+
listIncoming: db.prepare(`
|
|
124
|
+
SELECT packet, payload
|
|
125
|
+
FROM pending_incoming
|
|
126
|
+
WHERE client_id = ?
|
|
127
|
+
ORDER BY seq_id ASC
|
|
128
|
+
`),
|
|
129
|
+
// Pending Outgoing Packets
|
|
130
|
+
saveOutgoing: db.prepare(`
|
|
131
|
+
INSERT INTO pending_outgoing (client_id, packet_id, packet, payload)
|
|
132
|
+
VALUES (?, ?, ?, ?)
|
|
133
|
+
ON CONFLICT(client_id, packet_id) DO UPDATE SET
|
|
134
|
+
packet = excluded.packet,
|
|
135
|
+
payload = excluded.payload
|
|
136
|
+
`),
|
|
137
|
+
getOutgoing: db.prepare(`
|
|
138
|
+
SELECT packet, payload
|
|
139
|
+
FROM pending_outgoing
|
|
140
|
+
WHERE client_id = ? AND packet_id = ?
|
|
141
|
+
`),
|
|
142
|
+
updateOutgoingDup: db.prepare(`
|
|
143
|
+
UPDATE pending_outgoing
|
|
144
|
+
SET packet = json_set(packet, '$.dup', json(?))
|
|
145
|
+
WHERE client_id = ? AND packet_id = ?
|
|
146
|
+
`),
|
|
147
|
+
deleteOutgoing: db.prepare(`
|
|
148
|
+
DELETE FROM pending_outgoing
|
|
149
|
+
WHERE client_id = ? AND packet_id = ?
|
|
150
|
+
`),
|
|
151
|
+
listOutgoing: db.prepare(`
|
|
152
|
+
SELECT packet, payload
|
|
153
|
+
FROM pending_outgoing
|
|
154
|
+
WHERE client_id = ?
|
|
155
|
+
ORDER BY seq_id ASC
|
|
156
|
+
`),
|
|
157
|
+
// ACKs
|
|
158
|
+
saveAck: db.prepare(`
|
|
159
|
+
INSERT INTO pending_ack_outgoing (client_id, packet_id)
|
|
160
|
+
VALUES (?, ?)
|
|
161
|
+
ON CONFLICT(client_id, packet_id) DO NOTHING
|
|
162
|
+
`),
|
|
163
|
+
hasAck: db.prepare(`
|
|
164
|
+
SELECT 1
|
|
165
|
+
FROM pending_ack_outgoing
|
|
166
|
+
WHERE client_id = ? AND packet_id = ?
|
|
167
|
+
`),
|
|
168
|
+
deleteAck: db.prepare(`
|
|
169
|
+
DELETE FROM pending_ack_outgoing
|
|
170
|
+
WHERE client_id = ? AND packet_id = ?
|
|
171
|
+
`),
|
|
172
|
+
listAcks: db.prepare(`
|
|
173
|
+
SELECT packet_id
|
|
174
|
+
FROM pending_ack_outgoing
|
|
175
|
+
WHERE client_id = ?
|
|
176
|
+
`),
|
|
177
|
+
// Retained Messages
|
|
178
|
+
saveRetained: db.prepare(`
|
|
179
|
+
INSERT INTO retained (topic, packet, payload)
|
|
180
|
+
VALUES (?, ?, ?)
|
|
181
|
+
ON CONFLICT(topic) DO UPDATE SET
|
|
182
|
+
packet = excluded.packet,
|
|
183
|
+
payload = excluded.payload
|
|
184
|
+
`),
|
|
185
|
+
deleteRetained: db.prepare(`
|
|
186
|
+
DELETE FROM retained
|
|
187
|
+
WHERE topic = ?
|
|
188
|
+
`),
|
|
189
|
+
getRetainedExact: db.prepare(`
|
|
190
|
+
SELECT packet, payload
|
|
191
|
+
FROM retained
|
|
192
|
+
WHERE topic = ?
|
|
193
|
+
`),
|
|
194
|
+
listRetainedLike: db.prepare(`
|
|
195
|
+
SELECT topic, packet, payload
|
|
196
|
+
FROM retained
|
|
197
|
+
WHERE topic LIKE ?
|
|
198
|
+
`),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Truncates and drops relational state assignments under targeted clients inside atomic scopes.
|
|
203
|
+
* @param db Connection reference context.
|
|
204
|
+
* @param clientId Specific target client ID tracking token.
|
|
205
|
+
*/
|
|
206
|
+
export function deleteClientState(db, clientId) {
|
|
207
|
+
db.exec("begin;");
|
|
208
|
+
db.prepare("delete from subscriptions where client_id = ?").run(clientId);
|
|
209
|
+
db.prepare("delete from pending_incoming where client_id = ?").run(clientId);
|
|
210
|
+
db.prepare("delete from pending_outgoing where client_id = ?").run(clientId);
|
|
211
|
+
db.prepare("delete from pending_ack_outgoing where client_id = ?").run(clientId);
|
|
212
|
+
db.prepare("delete from client_sessions where client_id = ?").run(clientId);
|
|
213
|
+
db.exec("commit;");
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=sqliteDatabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqliteDatabase.js","sourceRoot":"","sources":["../../../persistence/sqlite/sqliteDatabase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MqttPersistence } from "../basicPersistence.ts";
|
|
2
|
+
import type sqlite from "node:sqlite";
|
|
3
|
+
export declare class SqlitePersistence extends MqttPersistence {
|
|
4
|
+
private storageInstance;
|
|
5
|
+
constructor(db?: string | sqlite.DatabaseSync);
|
|
6
|
+
/**
|
|
7
|
+
* Convenient lifecycle method combining instance creation and initialization.
|
|
8
|
+
*/
|
|
9
|
+
static start(db?: string | sqlite.DatabaseSync): Promise<SqlitePersistence>;
|
|
10
|
+
/**
|
|
11
|
+
* Overrides close to make sure the underlying database file
|
|
12
|
+
* handle is cleaned up correctly when the persistence is halted.
|
|
13
|
+
*/
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=sqlitePersistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlitePersistence.d.ts","sourceRoot":"","sources":["../../../persistence/sqlite/sqlitePersistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAItC,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,OAAO,CAAC,eAAe,CAAgB;IAEvC,YAAY,EAAE,GAAE,MAAM,GAAG,MAAM,CAAC,YAAkC,EAIjE;IAED;;OAEG;IACH,OAAa,KAAK,CAChB,EAAE,GAAE,MAAM,GAAG,MAAM,CAAC,YAAkC,GACrD,OAAO,CAAC,iBAAiB,CAAC,CAI5B;IAED;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3B;CACF"}
|