@seriousme/opifex 1.11.2 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +1 -1
- package/README.md +102 -43
- package/bin/conformanceServer.ts +45 -13
- package/bin/demoServer.ts +38 -13
- package/bin/mqtt.ts +52 -30
- package/client/ConnectionState.ts +2 -0
- package/client/client.ts +57 -47
- package/client/context.ts +75 -21
- package/client/deps.ts +5 -0
- package/client/handlers/handleAuth.test.ts +193 -0
- package/client/handlers/handleAuth.ts +89 -0
- package/client/handlers/handleConnack.test.ts +173 -0
- package/client/handlers/handleConnack.ts +16 -6
- package/client/handlers/handleDisconnect.test.ts +22 -0
- package/client/handlers/handleDisconnect.ts +17 -0
- package/client/handlers/handlePacket.test.ts +242 -0
- package/client/handlers/handlePacket.ts +19 -5
- package/client/handlers/handlePuback.test.ts +99 -0
- package/client/handlers/handlePuback.ts +6 -0
- package/client/handlers/handlePubcomp.test.ts +112 -0
- package/client/handlers/handlePubcomp.ts +5 -0
- package/client/handlers/handlePublish.test.ts +188 -0
- package/client/handlers/handlePubrec.test.ts +119 -0
- package/client/handlers/handlePubrec.ts +5 -1
- package/client/handlers/handlePubrel.test.ts +136 -0
- package/client/handlers/handleSuback.test.ts +122 -0
- package/client/handlers/handleSuback.ts +3 -0
- package/client/handlers/handleUnsuback.test.ts +101 -0
- package/client/mod.ts +2 -2
- package/client/store/memoryStore.ts +2 -2
- package/client/store/store.ts +3 -1
- package/deno/README.md +1 -2
- package/deno/tcpClient.test.ts +75 -0
- package/deno/tcpClient.ts +16 -11
- package/deno/tcpServer.test.ts +22 -21
- package/deno/tcpServer.ts +5 -0
- package/deno/tlsServer.test.ts +97 -0
- package/deno/tlsServer.ts +42 -0
- package/deno/wsServer.test.ts +93 -0
- package/deno/wsServer.ts +73 -0
- package/dev_utils/generateCert.ts +95 -0
- package/dev_utils/mockConn.ts +36 -0
- package/dev_utils/mockServer.ts +28 -0
- package/dev_utils/mod.ts +30 -2
- package/dev_utils/packetHelpers.ts +404 -0
- package/dev_utils/test-handlers.ts +98 -0
- package/dev_utils/timers.ts +14 -0
- package/dev_utils/webStreamPair.test.ts +171 -0
- package/dev_utils/webStreamPair.ts +143 -0
- package/dist/bin/conformanceServer.js +17 -12
- package/dist/bin/conformanceServer.js.map +1 -1
- package/dist/bin/demoServer.js +16 -12
- package/dist/bin/demoServer.js.map +1 -1
- package/dist/bin/mqtt.js +19 -16
- package/dist/bin/mqtt.js.map +1 -1
- package/dist/client/ConnectionState.d.ts +2 -0
- package/dist/client/ConnectionState.d.ts.map +1 -1
- package/dist/client/ConnectionState.js +2 -0
- package/dist/client/ConnectionState.js.map +1 -1
- package/dist/client/client.d.ts +19 -22
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +34 -20
- package/dist/client/client.js.map +1 -1
- package/dist/client/context.d.ts +11 -3
- package/dist/client/context.d.ts.map +1 -1
- package/dist/client/context.js +44 -12
- package/dist/client/context.js.map +1 -1
- package/dist/client/deps.d.ts +3 -2
- package/dist/client/deps.d.ts.map +1 -1
- package/dist/client/deps.js +1 -1
- package/dist/client/deps.js.map +1 -1
- package/dist/client/handlers/handleAuth.d.ts +9 -0
- package/dist/client/handlers/handleAuth.d.ts.map +1 -0
- package/dist/client/handlers/handleAuth.js +66 -0
- package/dist/client/handlers/handleAuth.js.map +1 -0
- package/dist/client/handlers/handleConnack.d.ts +2 -2
- package/dist/client/handlers/handleConnack.d.ts.map +1 -1
- package/dist/client/handlers/handleConnack.js +16 -6
- package/dist/client/handlers/handleConnack.js.map +1 -1
- package/dist/client/handlers/handleDisconnect.d.ts +11 -0
- package/dist/client/handlers/handleDisconnect.d.ts.map +1 -0
- package/dist/client/handlers/handleDisconnect.js +15 -0
- package/dist/client/handlers/handleDisconnect.js.map +1 -0
- package/dist/client/handlers/handlePacket.d.ts.map +1 -1
- package/dist/client/handlers/handlePacket.js +14 -3
- package/dist/client/handlers/handlePacket.js.map +1 -1
- package/dist/client/handlers/handlePuback.d.ts.map +1 -1
- package/dist/client/handlers/handlePuback.js +5 -0
- package/dist/client/handlers/handlePuback.js.map +1 -1
- package/dist/client/handlers/handlePubcomp.d.ts.map +1 -1
- package/dist/client/handlers/handlePubcomp.js +5 -0
- package/dist/client/handlers/handlePubcomp.js.map +1 -1
- package/dist/client/handlers/handlePubrec.d.ts.map +1 -1
- package/dist/client/handlers/handlePubrec.js +5 -1
- package/dist/client/handlers/handlePubrec.js.map +1 -1
- package/dist/client/handlers/handleSuback.d.ts +1 -0
- package/dist/client/handlers/handleSuback.d.ts.map +1 -1
- package/dist/client/handlers/handleSuback.js +3 -0
- package/dist/client/handlers/handleSuback.js.map +1 -1
- package/dist/client/mod.d.ts +2 -2
- package/dist/client/mod.d.ts.map +1 -1
- package/dist/client/mod.js +1 -1
- package/dist/client/mod.js.map +1 -1
- package/dist/client/store/memoryStore.d.ts.map +1 -1
- package/dist/client/store/memoryStore.js +2 -2
- package/dist/client/store/memoryStore.js.map +1 -1
- package/dist/client/store/store.d.ts +2 -1
- package/dist/client/store/store.d.ts.map +1 -1
- package/dist/client/store/store.js +1 -1
- package/dist/client/store/store.js.map +1 -1
- package/dist/dev_utils/generateCert.d.ts +11 -0
- package/dist/dev_utils/generateCert.d.ts.map +1 -0
- package/dist/dev_utils/generateCert.js +76 -0
- package/dist/dev_utils/generateCert.js.map +1 -0
- package/dist/examples/authHandler.test.d.ts +2 -0
- package/dist/examples/authHandler.test.d.ts.map +1 -0
- package/dist/examples/authHandler.test.js +123 -0
- package/dist/examples/authHandler.test.js.map +1 -0
- package/dist/examples/mqtt.test.d.ts +2 -0
- package/dist/examples/mqtt.test.d.ts.map +1 -0
- package/dist/examples/mqtt.test.js +70 -0
- package/dist/examples/mqtt.test.js.map +1 -0
- package/dist/examples/mqtts.test.d.ts +2 -0
- package/dist/examples/mqtts.test.d.ts.map +1 -0
- package/dist/examples/mqtts.test.js +81 -0
- package/dist/examples/mqtts.test.js.map +1 -0
- package/dist/mqttConn/mqttConn.d.ts +25 -16
- package/dist/mqttConn/mqttConn.d.ts.map +1 -1
- package/dist/mqttConn/mqttConn.js +69 -40
- package/dist/mqttConn/mqttConn.js.map +1 -1
- package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -1
- package/dist/mqttPacket/BitMask.d.ts +12 -11
- package/dist/mqttPacket/BitMask.d.ts.map +1 -1
- package/dist/mqttPacket/BitMask.js +10 -18
- package/dist/mqttPacket/BitMask.js.map +1 -1
- package/dist/mqttPacket/PacketType.d.ts.map +1 -1
- package/dist/mqttPacket/Properties.d.ts +2 -2
- package/dist/mqttPacket/Properties.d.ts.map +1 -1
- package/dist/mqttPacket/Properties.js.map +1 -1
- package/dist/mqttPacket/ReasonCode.d.ts +1 -0
- package/dist/mqttPacket/ReasonCode.d.ts.map +1 -1
- package/dist/mqttPacket/ReasonCode.js +1 -0
- package/dist/mqttPacket/ReasonCode.js.map +1 -1
- package/dist/mqttPacket/RetainHandling.d.ts.map +1 -1
- package/dist/mqttPacket/auth.d.ts +3 -5
- package/dist/mqttPacket/auth.d.ts.map +1 -1
- package/dist/mqttPacket/auth.js +31 -30
- package/dist/mqttPacket/auth.js.map +1 -1
- package/dist/mqttPacket/codec.d.ts +48 -0
- package/dist/mqttPacket/codec.d.ts.map +1 -0
- package/dist/mqttPacket/codec.js +93 -0
- package/dist/mqttPacket/codec.js.map +1 -0
- package/dist/mqttPacket/connack.d.ts +4 -5
- package/dist/mqttPacket/connack.d.ts.map +1 -1
- package/dist/mqttPacket/connack.js +43 -45
- package/dist/mqttPacket/connack.js.map +1 -1
- package/dist/mqttPacket/connect.d.ts +26 -27
- package/dist/mqttPacket/connect.d.ts.map +1 -1
- package/dist/mqttPacket/connect.js +156 -157
- package/dist/mqttPacket/connect.js.map +1 -1
- package/dist/mqttPacket/decoder.d.ts +1 -13
- package/dist/mqttPacket/decoder.d.ts.map +1 -1
- package/dist/mqttPacket/decoder.js +7 -28
- package/dist/mqttPacket/decoder.js.map +1 -1
- package/dist/mqttPacket/disconnect.d.ts +4 -5
- package/dist/mqttPacket/disconnect.d.ts.map +1 -1
- package/dist/mqttPacket/disconnect.js +41 -43
- package/dist/mqttPacket/disconnect.js.map +1 -1
- package/dist/mqttPacket/encoder.d.ts +1 -15
- package/dist/mqttPacket/encoder.d.ts.map +1 -1
- package/dist/mqttPacket/encoder.js +4 -27
- package/dist/mqttPacket/encoder.js.map +1 -1
- package/dist/mqttPacket/length.js +1 -1
- package/dist/mqttPacket/length.js.map +1 -1
- package/dist/mqttPacket/mod.d.ts +21 -103
- package/dist/mqttPacket/mod.d.ts.map +1 -1
- package/dist/mqttPacket/mod.js +5 -94
- package/dist/mqttPacket/mod.js.map +1 -1
- package/dist/mqttPacket/pingreq.d.ts +4 -5
- package/dist/mqttPacket/pingreq.d.ts.map +1 -1
- package/dist/mqttPacket/pingreq.js +11 -13
- package/dist/mqttPacket/pingreq.js.map +1 -1
- package/dist/mqttPacket/pingres.d.ts +4 -5
- package/dist/mqttPacket/pingres.d.ts.map +1 -1
- package/dist/mqttPacket/pingres.js +11 -13
- package/dist/mqttPacket/pingres.js.map +1 -1
- package/dist/mqttPacket/protocolLevels.d.ts +11 -6
- package/dist/mqttPacket/protocolLevels.d.ts.map +1 -1
- package/dist/mqttPacket/protocolLevels.js +5 -1
- package/dist/mqttPacket/protocolLevels.js.map +1 -1
- package/dist/mqttPacket/pubblishAcks.d.ts +9 -10
- package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -1
- package/dist/mqttPacket/pubblishAcks.js +43 -45
- package/dist/mqttPacket/pubblishAcks.js.map +1 -1
- package/dist/mqttPacket/publish.d.ts +14 -14
- package/dist/mqttPacket/publish.d.ts.map +1 -1
- package/dist/mqttPacket/publish.js +53 -55
- package/dist/mqttPacket/publish.js.map +1 -1
- package/dist/mqttPacket/suback.d.ts +4 -5
- package/dist/mqttPacket/suback.d.ts.map +1 -1
- package/dist/mqttPacket/suback.js +38 -40
- package/dist/mqttPacket/suback.js.map +1 -1
- package/dist/mqttPacket/subscribe.d.ts +36 -7
- package/dist/mqttPacket/subscribe.d.ts.map +1 -1
- package/dist/mqttPacket/subscribe.js +90 -89
- package/dist/mqttPacket/subscribe.js.map +1 -1
- package/dist/mqttPacket/types.d.ts +1 -8
- package/dist/mqttPacket/types.d.ts.map +1 -1
- package/dist/mqttPacket/unsuback.d.ts +4 -5
- package/dist/mqttPacket/unsuback.d.ts.map +1 -1
- package/dist/mqttPacket/unsuback.js +32 -34
- package/dist/mqttPacket/unsuback.js.map +1 -1
- package/dist/mqttPacket/unsubscribe.d.ts +23 -6
- package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
- package/dist/mqttPacket/unsubscribe.js +45 -44
- package/dist/mqttPacket/unsubscribe.js.map +1 -1
- package/dist/mqttPacket/validators.d.ts +4 -16
- package/dist/mqttPacket/validators.d.ts.map +1 -1
- package/dist/mqttPacket/validators.js +5 -26
- package/dist/mqttPacket/validators.js.map +1 -1
- package/dist/node/tcpClient.d.ts +1 -1
- package/dist/node/tcpClient.d.ts.map +1 -1
- package/dist/node/tcpClient.js +12 -7
- package/dist/node/tcpClient.js.map +1 -1
- package/dist/node/tcpServer.d.ts.map +1 -1
- package/dist/node/tcpServer.js +4 -0
- package/dist/node/tcpServer.js.map +1 -1
- package/dist/node/tlsServer.d.ts +19 -0
- package/dist/node/tlsServer.d.ts.map +1 -0
- package/dist/node/tlsServer.js +58 -0
- package/dist/node/tlsServer.js.map +1 -0
- package/dist/node/wrapNodeSocket.d.ts.map +1 -1
- package/dist/node/wrapNodeSocket.js +6 -28
- package/dist/node/wrapNodeSocket.js.map +1 -1
- package/dist/persistence/basicPersistence.d.ts +36 -0
- package/dist/persistence/basicPersistence.d.ts.map +1 -0
- package/dist/persistence/basicPersistence.js +306 -0
- package/dist/persistence/basicPersistence.js.map +1 -0
- package/dist/persistence/deps.d.ts +3 -2
- package/dist/persistence/deps.d.ts.map +1 -1
- package/dist/persistence/deps.js +2 -1
- package/dist/persistence/deps.js.map +1 -1
- package/dist/persistence/memory/memoryPersistence.d.ts +6 -23
- package/dist/persistence/memory/memoryPersistence.d.ts.map +1 -1
- package/dist/persistence/memory/memoryPersistence.js +12 -115
- package/dist/persistence/memory/memoryPersistence.js.map +1 -1
- package/dist/persistence/memory/memoryStorage.d.ts +45 -0
- package/dist/persistence/memory/memoryStorage.d.ts.map +1 -0
- package/dist/persistence/memory/memoryStorage.js +143 -0
- package/dist/persistence/memory/memoryStorage.js.map +1 -0
- package/dist/persistence/mod.d.ts +3 -3
- package/dist/persistence/mod.d.ts.map +1 -1
- package/dist/persistence/mod.js +6 -1
- package/dist/persistence/mod.js.map +1 -1
- package/dist/persistence/persistence.d.ts +44 -69
- package/dist/persistence/persistence.d.ts.map +1 -1
- package/dist/persistence/persistence.js +1 -2
- package/dist/persistence/persistence.js.map +1 -1
- package/dist/persistence/sqlite/sqliteDatabase.d.ts +46 -0
- package/dist/persistence/sqlite/sqliteDatabase.d.ts.map +1 -0
- package/dist/persistence/sqlite/sqliteDatabase.js +215 -0
- package/dist/persistence/sqlite/sqliteDatabase.js.map +1 -0
- package/dist/persistence/sqlite/sqlitePersistence.d.ts +16 -0
- package/dist/persistence/sqlite/sqlitePersistence.d.ts.map +1 -0
- package/dist/persistence/sqlite/sqlitePersistence.js +29 -0
- package/dist/persistence/sqlite/sqlitePersistence.js.map +1 -0
- package/dist/persistence/sqlite/sqliteStorage.d.ts +36 -0
- package/dist/persistence/sqlite/sqliteStorage.d.ts.map +1 -0
- package/dist/persistence/sqlite/sqliteStorage.js +194 -0
- package/dist/persistence/sqlite/sqliteStorage.js.map +1 -0
- package/dist/persistence/storage.d.ts +38 -0
- package/dist/persistence/storage.d.ts.map +1 -0
- package/dist/persistence/storage.js +5 -0
- package/dist/persistence/storage.js.map +1 -0
- package/dist/server/config.d.ts +47 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +41 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/context.d.ts +198 -24
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +432 -53
- package/dist/server/context.js.map +1 -1
- package/dist/server/deps.d.ts +5 -6
- package/dist/server/deps.d.ts.map +1 -1
- package/dist/server/deps.js +2 -2
- package/dist/server/deps.js.map +1 -1
- package/dist/server/handlers/completeConnect.d.ts +8 -0
- package/dist/server/handlers/completeConnect.d.ts.map +1 -0
- package/dist/server/handlers/completeConnect.js +74 -0
- package/dist/server/handlers/completeConnect.js.map +1 -0
- package/dist/server/handlers/handleAuth.d.ts +9 -0
- package/dist/server/handlers/handleAuth.d.ts.map +1 -0
- package/dist/server/handlers/handleAuth.js +69 -0
- package/dist/server/handlers/handleAuth.js.map +1 -0
- package/dist/server/handlers/handleConnect.d.ts +2 -4
- package/dist/server/handlers/handleConnect.d.ts.map +1 -1
- package/dist/server/handlers/handleConnect.js +140 -67
- package/dist/server/handlers/handleConnect.js.map +1 -1
- package/dist/server/handlers/handleDisconnect.d.ts +1 -1
- package/dist/server/handlers/handleDisconnect.d.ts.map +1 -1
- package/dist/server/handlers/handleDisconnect.js +3 -3
- package/dist/server/handlers/handleDisconnect.js.map +1 -1
- package/dist/server/handlers/handlePacket.d.ts.map +1 -1
- package/dist/server/handlers/handlePacket.js +19 -6
- package/dist/server/handlers/handlePacket.js.map +1 -1
- package/dist/server/handlers/handlePuback.d.ts +1 -3
- package/dist/server/handlers/handlePuback.d.ts.map +1 -1
- package/dist/server/handlers/handlePuback.js +2 -8
- package/dist/server/handlers/handlePuback.js.map +1 -1
- package/dist/server/handlers/handlePubcomp.d.ts +1 -1
- package/dist/server/handlers/handlePubcomp.d.ts.map +1 -1
- package/dist/server/handlers/handlePubcomp.js +2 -4
- package/dist/server/handlers/handlePubcomp.js.map +1 -1
- package/dist/server/handlers/handlePublish.d.ts +1 -1
- package/dist/server/handlers/handlePublish.d.ts.map +1 -1
- package/dist/server/handlers/handlePublish.js +149 -45
- package/dist/server/handlers/handlePublish.js.map +1 -1
- package/dist/server/handlers/handlePubrec.d.ts.map +1 -1
- package/dist/server/handlers/handlePubrec.js +2 -3
- package/dist/server/handlers/handlePubrec.js.map +1 -1
- package/dist/server/handlers/handlePubrel.d.ts.map +1 -1
- package/dist/server/handlers/handlePubrel.js +6 -2
- package/dist/server/handlers/handlePubrel.js.map +1 -1
- package/dist/server/handlers/handleSubscribe.d.ts +1 -6
- package/dist/server/handlers/handleSubscribe.d.ts.map +1 -1
- package/dist/server/handlers/handleSubscribe.js +99 -38
- package/dist/server/handlers/handleSubscribe.js.map +1 -1
- package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -1
- package/dist/server/handlers/handleUnsubscribe.js +19 -4
- package/dist/server/handlers/handleUnsubscribe.js.map +1 -1
- package/dist/server/mod.d.ts +3 -3
- package/dist/server/mod.d.ts.map +1 -1
- package/dist/server/mod.js +1 -1
- package/dist/server/mod.js.map +1 -1
- package/dist/server/server.d.ts +29 -6
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +84 -15
- package/dist/server/server.js.map +1 -1
- package/dist/socket/socket.d.ts +11 -9
- package/dist/socket/socket.d.ts.map +1 -1
- package/dist/socket/socket.js +67 -15
- package/dist/socket/socket.js.map +1 -1
- package/dist/timer/timer.d.ts +32 -0
- package/dist/timer/timer.d.ts.map +1 -1
- package/dist/timer/timer.js +32 -0
- package/dist/timer/timer.js.map +1 -1
- package/dist/trie/trie.d.ts +10 -5
- package/dist/trie/trie.d.ts.map +1 -1
- package/dist/trie/trie.js +47 -17
- package/dist/trie/trie.js.map +1 -1
- package/dist/utils/assert.d.ts.map +1 -1
- package/dist/utils/{BufferedAsyncIterable.d.ts → bufferedAsyncIterable.d.ts} +1 -1
- package/dist/utils/bufferedAsyncIterable.d.ts.map +1 -0
- package/dist/utils/{BufferedAsyncIterable.js → bufferedAsyncIterable.js} +1 -1
- package/dist/utils/bufferedAsyncIterable.js.map +1 -0
- package/dist/utils/deferred.d.ts.map +1 -1
- package/dist/utils/deferred.js.map +1 -1
- package/dist/utils/getOrInsertPolyFill.d.ts +2 -0
- package/dist/utils/getOrInsertPolyFill.d.ts.map +1 -0
- package/dist/utils/getOrInsertPolyFill.js +12 -0
- package/dist/utils/getOrInsertPolyFill.js.map +1 -0
- package/dist/utils/logger.d.ts +40 -3
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +53 -7
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/mod.d.ts +6 -1
- package/dist/utils/mod.d.ts.map +1 -1
- package/dist/utils/mod.js +5 -1
- package/dist/utils/mod.js.map +1 -1
- package/dist/utils/outboundTopicAliasManager.d.ts +52 -0
- package/dist/utils/outboundTopicAliasManager.d.ts.map +1 -0
- package/dist/utils/outboundTopicAliasManager.js +74 -0
- package/dist/utils/outboundTopicAliasManager.js.map +1 -0
- package/dist/utils/queue.d.ts.map +1 -1
- package/dist/utils/topicFilter.d.ts +32 -0
- package/dist/utils/topicFilter.d.ts.map +1 -0
- package/dist/utils/topicFilter.js +52 -0
- package/dist/utils/topicFilter.js.map +1 -0
- package/dist/utils/utils.d.ts +2 -0
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +2 -0
- package/dist/utils/utils.js.map +1 -1
- package/dist/utils/validators.d.ts +34 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +61 -0
- package/dist/utils/validators.js.map +1 -0
- package/dist/web/webSocketStream.d.ts +29 -0
- package/dist/web/webSocketStream.d.ts.map +1 -0
- package/dist/web/webSocketStream.js +69 -0
- package/dist/web/webSocketStream.js.map +1 -0
- package/dist/web/wrapWebSocket.d.ts +12 -0
- package/dist/web/wrapWebSocket.d.ts.map +1 -0
- package/dist/web/wrapWebSocket.js +41 -0
- package/dist/web/wrapWebSocket.js.map +1 -0
- package/dist/web/wsClient.d.ts +7 -0
- package/dist/web/wsClient.d.ts.map +1 -0
- package/dist/web/wsClient.js +22 -0
- package/dist/web/wsClient.js.map +1 -0
- package/dist/web/wsClient.test.d.ts +2 -0
- package/dist/web/wsClient.test.d.ts.map +1 -0
- package/dist/web/wsClient.test.js +20 -0
- package/dist/web/wsClient.test.js.map +1 -0
- package/examples/authHandler.test.ts +164 -0
- package/examples/mqtt.test.ts +89 -0
- package/examples/mqtts.test.ts +100 -0
- package/examples/webSocket.test.ts +94 -0
- package/mqttConn/mqttConn.test.ts +9 -9
- package/mqttConn/mqttConn.ts +91 -49
- package/mqttPacket/BitMask.ts +11 -19
- package/mqttPacket/Properties.ts +6 -3
- package/mqttPacket/ReasonCode.ts +2 -1
- package/mqttPacket/auth.test.ts +1 -1
- package/mqttPacket/auth.ts +41 -48
- package/mqttPacket/codec.ts +146 -0
- package/mqttPacket/connack.ts +57 -68
- package/mqttPacket/connect.test.ts +2 -2
- package/mqttPacket/connect.ts +197 -204
- package/mqttPacket/decoder.test.ts +0 -39
- package/mqttPacket/decoder.ts +9 -36
- package/mqttPacket/disconnect.ts +57 -68
- package/mqttPacket/encoder.ts +5 -40
- package/mqttPacket/length.ts +1 -1
- package/mqttPacket/mod.ts +48 -200
- package/mqttPacket/pingreq.ts +21 -27
- package/mqttPacket/pingres.ts +21 -27
- package/mqttPacket/protocolLevels.ts +12 -7
- package/mqttPacket/pubblishAcks.ts +68 -77
- package/mqttPacket/publish.ts +76 -83
- package/mqttPacket/suback.ts +48 -58
- package/mqttPacket/subscribe.ts +141 -117
- package/mqttPacket/types.ts +1 -9
- package/mqttPacket/unsuback.ts +46 -58
- package/mqttPacket/unsubscribe.ts +74 -63
- package/mqttPacket/validators.ts +5 -31
- package/node/socket-node-stream.test.ts +322 -0
- package/node/socket-node-stream.ts +174 -0
- package/node/tcpClient.test.ts +70 -0
- package/node/tcpClient.ts +13 -12
- package/node/tcpServer.test.ts +24 -20
- package/node/tcpServer.ts +6 -0
- package/node/tlsServer.test.ts +94 -0
- package/node/tlsServer.ts +81 -0
- package/node/wrapNodeSocket.ts +7 -30
- package/package.json +73 -45
- package/persistence/basicPersistence.ts +495 -0
- package/persistence/deps.ts +11 -1
- package/persistence/memory/memoryPersistence.ts +12 -152
- package/persistence/memory/memoryStorage.ts +232 -0
- package/persistence/mod.ts +4 -4
- package/persistence/persistence.test.ts +24 -0
- package/persistence/persistence.testing.ts +1324 -0
- package/persistence/persistence.ts +111 -67
- package/persistence/sqlite/sqliteDatabase.ts +294 -0
- package/persistence/sqlite/sqlitePersistence.test.ts +48 -0
- package/persistence/sqlite/sqlitePersistence.ts +36 -0
- package/persistence/sqlite/sqliteStorage.ts +324 -0
- package/persistence/storage.ts +84 -0
- package/server/config.ts +65 -0
- package/server/context.ts +658 -74
- package/server/deps.ts +25 -5
- package/server/handlers/completeConnect.ts +93 -0
- package/server/handlers/duplicate.test.ts +196 -0
- package/server/handlers/handleAuth.test.ts +225 -0
- package/server/handlers/handleAuth.ts +88 -0
- package/server/handlers/handleConnect.test.ts +589 -0
- package/server/handlers/handleConnect.ts +201 -86
- package/server/handlers/handleConnect.version.test.ts +108 -0
- package/server/handlers/handleDisconnect.test.ts +56 -0
- package/server/handlers/handleDisconnect.ts +3 -3
- package/server/handlers/handlePacket.test.ts +24 -0
- package/server/handlers/handlePacket.ts +30 -8
- package/server/handlers/handlePingreq.test.ts +29 -0
- package/server/handlers/handlePuback.test.ts +28 -0
- package/server/handlers/handlePuback.ts +5 -8
- package/server/handlers/handlePubcomp.test.ts +28 -0
- package/server/handlers/handlePubcomp.ts +5 -4
- package/server/handlers/handlePublish.test.ts +471 -0
- package/server/handlers/handlePublish.ts +189 -35
- package/server/handlers/handlePubrec.test.ts +28 -0
- package/server/handlers/handlePubrec.ts +2 -3
- package/server/handlers/handlePubrel.test.ts +74 -0
- package/server/handlers/handlePubrel.ts +12 -2
- package/server/handlers/handleSubscribe.test.ts +971 -0
- package/server/handlers/handleSubscribe.ts +158 -39
- package/server/handlers/handleUnsubscribe.test.ts +79 -0
- package/server/handlers/handleUnsubscribe.ts +29 -5
- package/server/handlers/keepalive.test.ts +132 -0
- package/server/handlers/session.persistence.test.ts +194 -0
- package/server/handlers/will.delivery.test.ts +221 -0
- package/server/mod.ts +4 -3
- package/server/preconnect.test.ts +151 -0
- package/server/server.ts +115 -17
- package/socket/socket.test.ts +91 -0
- package/socket/socket.ts +81 -31
- package/timer/timer.test.ts +4 -7
- package/timer/timer.ts +36 -0
- package/tools/benchmarks/receiver.ts +51 -0
- package/tools/benchmarks/sender.ts +48 -0
- package/tools/benchmarks/utils.ts +31 -0
- package/tools/mqtt-compat/README.md +130 -0
- package/tools/mqtt-compat/broker.ts +52 -0
- package/tools/mqtt-compat/paho-mqtt4.test.ts +379 -0
- package/tools/mqtt-compat/paho-mqtt5.tests.ts +887 -0
- package/trie/trie.test.ts +9 -1
- package/trie/trie.ts +57 -22
- package/utils/bufferedAsyncIterable.test.ts +92 -0
- package/utils/{BufferedAsyncIterable.ts → bufferedAsyncIterable.ts} +1 -1
- package/utils/deferred.test.ts +36 -0
- package/utils/deferred.ts +0 -1
- package/utils/getOrInsertPolyFill.ts +12 -0
- package/utils/logger.test.ts +189 -0
- package/utils/logger.ts +62 -7
- package/utils/mod.ts +15 -1
- package/utils/outboundTopicAliasManager.ts +100 -0
- package/utils/queue.test.ts +61 -0
- package/utils/topicFilter.test.ts +63 -0
- package/utils/topicFilter.ts +61 -0
- package/utils/utils.ts +3 -0
- package/utils/validators.ts +67 -0
- package/web/webSocketStream.ts +97 -0
- package/web/wrapWebSocket.ts +52 -0
- package/web/wsClient.test.ts +26 -0
- package/web/wsClient.ts +25 -0
- package/benchmarks/receiver.ts +0 -35
- package/benchmarks/sender.ts +0 -32
- package/benchmarks/utils.ts +0 -9
- package/dev_utils/dummyConn.ts +0 -110
- package/dist/persistence/store.d.ts +0 -13
- package/dist/persistence/store.d.ts.map +0 -1
- package/dist/persistence/store.js +0 -2
- package/dist/persistence/store.js.map +0 -1
- package/dist/utils/BufferedAsyncIterable.d.ts.map +0 -1
- package/dist/utils/BufferedAsyncIterable.js.map +0 -1
- package/examples/tcpServer.test.ts +0 -148
- package/persistence/memory/memoryPersistence.test.ts +0 -156
- package/persistence/store.ts +0 -15
- package/server/test/handleConnect.test.ts +0 -130
- package/server/test/test-handlers.ts +0 -53
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlePubcomp.js","sourceRoot":"","sources":["../../../server/handlers/handlePubcomp.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,
|
|
1
|
+
{"version":3,"file":"handlePubcomp.js","sourceRoot":"","sources":["../../../server/handlers/handlePubcomp.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAY,EACZ,MAAqB;IAErB,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;IACrB,MAAM,GAAG,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAS,EAAE,EAAE,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -3,7 +3,7 @@ import type { PublishPacket } from "../deps.ts";
|
|
|
3
3
|
/**
|
|
4
4
|
* Handles MQTT PUBLISH packets
|
|
5
5
|
* @param ctx - The connection context
|
|
6
|
-
* @param
|
|
6
|
+
* @param extPacket - The PUBLISH packet to process
|
|
7
7
|
* @returns Promise that resolves when packet is processed
|
|
8
8
|
* @throws Error if packet processing fails
|
|
9
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlePublish.d.ts","sourceRoot":"","sources":["../../../server/handlers/handlePublish.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handlePublish.d.ts","sourceRoot":"","sources":["../../../server/handlers/handlePublish.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAGV,aAAa,EAId,MAAM,YAAY,CAAC;AAuIpB;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAyEf"}
|
|
@@ -1,72 +1,176 @@
|
|
|
1
|
-
import { SysPrefix } from "../context.js";
|
|
2
|
-
import { PacketType } from "../deps.js";
|
|
1
|
+
import { SessionState, SysPrefix } from "../context.js";
|
|
2
|
+
import { invalidmaxTopicLevels, invalidTopic, logger, PacketType, ReasonCode, } from "../deps.js";
|
|
3
|
+
const reasonsToDisconnect = [
|
|
4
|
+
ReasonCode.topicAliasInvalid,
|
|
5
|
+
];
|
|
6
|
+
async function handlePublishError(ctx, id, qos, reasonCode, reasonString) {
|
|
7
|
+
// in v4 we can only close the connection
|
|
8
|
+
if (ctx.protocolLevel === 4) {
|
|
9
|
+
// in V4 we can only close the connection
|
|
10
|
+
await ctx.close(false);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
// in v5 we can message the client
|
|
14
|
+
//
|
|
15
|
+
if (reasonsToDisconnect.includes(reasonCode)) {
|
|
16
|
+
await ctx.send({
|
|
17
|
+
type: PacketType.disconnect,
|
|
18
|
+
protocolLevel: ctx.protocolLevel,
|
|
19
|
+
reasonCode,
|
|
20
|
+
properties: {
|
|
21
|
+
reasonString,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
await ctx.close(false);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (qos === 0) {
|
|
28
|
+
// no message for QoS 0
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// QoS 1 and 2 get a nice message
|
|
32
|
+
const pType = qos === 1 ? PacketType.puback : PacketType.pubrec;
|
|
33
|
+
await ctx.send({
|
|
34
|
+
type: pType,
|
|
35
|
+
protocolLevel: ctx.protocolLevel,
|
|
36
|
+
id,
|
|
37
|
+
reasonCode,
|
|
38
|
+
properties: {
|
|
39
|
+
reasonString,
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
3
44
|
/**
|
|
4
45
|
* Checks if a client is authorized to publish to a given topic
|
|
5
46
|
* @param ctx - The connection context
|
|
6
47
|
* @param topic - The topic to check authorization for
|
|
7
48
|
* @returns boolean indicating if client is authorized to publish
|
|
8
49
|
*/
|
|
9
|
-
function authorizedToPublish(ctx, topic) {
|
|
10
|
-
if (topic.startsWith(SysPrefix)) {
|
|
50
|
+
async function authorizedToPublish(ctx, topic) {
|
|
51
|
+
if (topic.startsWith(SysPrefix) && !ctx.isBroker) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
if (ctx.state === SessionState.authenticating) {
|
|
11
55
|
return false;
|
|
12
56
|
}
|
|
13
57
|
if (ctx.handlers.isAuthorizedToPublish) {
|
|
14
|
-
|
|
58
|
+
try {
|
|
59
|
+
return await ctx.handlers.isAuthorizedToPublish(ctx, topic);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
let message = "unknown error";
|
|
63
|
+
if (err instanceof Error) {
|
|
64
|
+
message = err.message;
|
|
65
|
+
}
|
|
66
|
+
logger.error("isAuthorizedToPublish failed with error", message);
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
15
69
|
}
|
|
16
70
|
return true;
|
|
17
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Validates incoming PUBLISH packet rules prior to processing.
|
|
74
|
+
* Returns an error object if invalid, or null if valid.
|
|
75
|
+
*/
|
|
76
|
+
function validatePublishPacket(ctx, packet) {
|
|
77
|
+
const cfg = ctx.config.context;
|
|
78
|
+
const isProtocolV5 = packet.protocolLevel === 5;
|
|
79
|
+
const hasTopicAlias = isProtocolV5 &&
|
|
80
|
+
packet.properties?.topicAlias !== undefined;
|
|
81
|
+
if (!cfg.retainAvailable && packet.retain) {
|
|
82
|
+
return {
|
|
83
|
+
reasonCode: ReasonCode.unspecifiedError,
|
|
84
|
+
message: "Server does not support retain",
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const isInvalidTopic = (packet.topic.length === 0 && !hasTopicAlias) ||
|
|
88
|
+
invalidTopic(packet.topic) ||
|
|
89
|
+
invalidmaxTopicLevels(packet.topic, cfg.maxTopicLevels);
|
|
90
|
+
if (isInvalidTopic) {
|
|
91
|
+
return {
|
|
92
|
+
reasonCode: ReasonCode.topicNameInvalid,
|
|
93
|
+
message: "Invalid topic name",
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (hasTopicAlias) {
|
|
97
|
+
const topicAlias = packet.properties?.topicAlias;
|
|
98
|
+
const aliasedTopic = ctx.incomingTopicAliases.get(topicAlias);
|
|
99
|
+
if ((topicAlias === 0 || topicAlias > cfg.topicAliasMaximum) ||
|
|
100
|
+
(packet.topic === "" && aliasedTopic === undefined)) {
|
|
101
|
+
return {
|
|
102
|
+
reasonCode: ReasonCode.topicAliasInvalid,
|
|
103
|
+
message: "Invalid topic alias",
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (packet.topic !== "") {
|
|
107
|
+
ctx.incomingTopicAliases.set(topicAlias, packet.topic);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
packet.topic = aliasedTopic;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
18
115
|
/**
|
|
19
116
|
* Handles MQTT PUBLISH packets
|
|
20
117
|
* @param ctx - The connection context
|
|
21
|
-
* @param
|
|
118
|
+
* @param extPacket - The PUBLISH packet to process
|
|
22
119
|
* @returns Promise that resolves when packet is processed
|
|
23
120
|
* @throws Error if packet processing fails
|
|
24
121
|
*/
|
|
25
122
|
export async function handlePublish(ctx, packet) {
|
|
26
|
-
|
|
123
|
+
const extPacket = packet;
|
|
124
|
+
const qos = extPacket.qos || 0;
|
|
125
|
+
const id = extPacket.id;
|
|
126
|
+
const validationError = validatePublishPacket(ctx, extPacket);
|
|
127
|
+
if (validationError) {
|
|
128
|
+
return await handlePublishError(ctx, id, qos, validationError.reasonCode, validationError.message);
|
|
129
|
+
}
|
|
130
|
+
if (!await authorizedToPublish(ctx, extPacket.topic)) {
|
|
131
|
+
await handlePublishError(ctx, id, qos, ReasonCode.notAuthorized, `Client not authorized to publish to ${extPacket.topic}`);
|
|
27
132
|
return;
|
|
28
133
|
}
|
|
29
|
-
|
|
134
|
+
if ((extPacket.protocolLevel === 5) &&
|
|
135
|
+
extPacket.properties?.messageExpiryInterval) {
|
|
136
|
+
extPacket.expiresAtMs = Date.now() +
|
|
137
|
+
extPacket.properties.messageExpiryInterval * 1000;
|
|
138
|
+
}
|
|
30
139
|
if (qos === 0) {
|
|
31
|
-
ctx.
|
|
140
|
+
await ctx.publish(extPacket);
|
|
32
141
|
return;
|
|
33
142
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
/*
|
|
47
|
-
In the QoS 2 delivery protocol, the Receiver
|
|
48
|
-
|
|
49
|
-
- MUST respond with a PUBREC containing the Packet Identifier from the incoming PUBLISH Packet,
|
|
50
|
-
having accepted ownership of the Application Message.
|
|
51
|
-
- Until it has received the corresponding PUBREL packet, the Receiver MUST acknowledge any subsequent
|
|
52
|
-
PUBLISH packet with the same Packet Identifier by sending a PUBREC. It MUST NOT cause duplicate
|
|
53
|
-
messages to be delivered to any onward recipients in this case.
|
|
54
|
-
- MUST respond to a PUBREL packet by sending a PUBCOMP packet containing the same Packet Identifier as the PUBREL.
|
|
55
|
-
- After it has sent a PUBCOMP, the receiver MUST treat any subsequent PUBLISH packet that contains that Packet
|
|
56
|
-
Identifier as being a new publication.
|
|
57
|
-
[MQTT-4.3.3-2].
|
|
58
|
-
*/
|
|
59
|
-
if (ctx.store) {
|
|
60
|
-
if (!ctx.store.pendingIncoming.has(packet.id)) {
|
|
61
|
-
ctx.store.pendingIncoming.set(packet.id, packet);
|
|
62
|
-
ctx.persistence.publish(packet.topic, packet);
|
|
63
|
-
}
|
|
64
|
-
await ctx.send({
|
|
65
|
-
type: PacketType.pubrec,
|
|
66
|
-
protocolLevel: ctx.protocolLevel,
|
|
67
|
-
id: packet.id,
|
|
68
|
-
});
|
|
69
|
-
}
|
|
143
|
+
// qos 1
|
|
144
|
+
if (qos === 1) {
|
|
145
|
+
// publish the packet
|
|
146
|
+
await ctx.publish(extPacket);
|
|
147
|
+
// send the pubAck
|
|
148
|
+
await ctx.send({
|
|
149
|
+
type: PacketType.puback,
|
|
150
|
+
protocolLevel: ctx.protocolLevel,
|
|
151
|
+
id: id,
|
|
152
|
+
});
|
|
153
|
+
return;
|
|
70
154
|
}
|
|
155
|
+
/*
|
|
156
|
+
In the QoS 2 delivery protocol, the Receiver
|
|
157
|
+
|
|
158
|
+
- MUST respond with a PUBREC containing the Packet Identifier from the incoming PUBLISH Packet,
|
|
159
|
+
having accepted ownership of the Application Message.
|
|
160
|
+
- Until it has received the corresponding PUBREL packet, the Receiver MUST acknowledge any subsequent
|
|
161
|
+
PUBLISH packet with the same Packet Identifier by sending a PUBREC. It MUST NOT cause duplicate
|
|
162
|
+
messages to be delivered to any onward recipients in this case.
|
|
163
|
+
- MUST respond to a PUBREL packet by sending a PUBCOMP packet containing the same Packet Identifier as the PUBREL.
|
|
164
|
+
- After it has sent a PUBCOMP, the receiver MUST treat any subsequent PUBLISH packet that contains that Packet
|
|
165
|
+
Identifier as being a new publication.
|
|
166
|
+
[MQTT-4.3.3-2].
|
|
167
|
+
*/
|
|
168
|
+
// we take responsibility for the packet
|
|
169
|
+
await ctx.persistence.addPendingIncomingPacket(ctx.clientId, extPacket);
|
|
170
|
+
await ctx.send({
|
|
171
|
+
type: PacketType.pubrec,
|
|
172
|
+
protocolLevel: ctx.protocolLevel,
|
|
173
|
+
id: id,
|
|
174
|
+
});
|
|
71
175
|
}
|
|
72
176
|
//# sourceMappingURL=handlePublish.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlePublish.js","sourceRoot":"","sources":["../../../server/handlers/handlePublish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"handlePublish.js","sourceRoot":"","sources":["../../../server/handlers/handlePublish.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlePubrec.d.ts","sourceRoot":"","sources":["../../../server/handlers/handlePubrec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"handlePubrec.d.ts","sourceRoot":"","sources":["../../../server/handlers/handlePubrec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -12,9 +12,8 @@ import { PacketType } from "../deps.js";
|
|
|
12
12
|
*/
|
|
13
13
|
export async function handlePubrec(ctx, packet) {
|
|
14
14
|
const id = packet.id;
|
|
15
|
-
if (ctx.
|
|
16
|
-
ctx.
|
|
17
|
-
ctx.store.pendingAckOutgoing.add(id);
|
|
15
|
+
if (await ctx.processAck(id)) {
|
|
16
|
+
await ctx.persistence.addPendingAck(ctx.clientId, id);
|
|
18
17
|
await ctx.send({
|
|
19
18
|
type: PacketType.pubrel,
|
|
20
19
|
protocolLevel: ctx.protocolLevel,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlePubrec.js","sourceRoot":"","sources":["../../../server/handlers/handlePubrec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIxC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAY,EACZ,MAAoB;IAEpB,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;IACrB,IAAI,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"handlePubrec.js","sourceRoot":"","sources":["../../../server/handlers/handlePubrec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIxC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAY,EACZ,MAAoB;IAEpB,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;IACrB,IAAI,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7B,MAAM,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,QAAS,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,GAAG,CAAC,IAAI,CAAC;YACb,IAAI,EAAE,UAAU,CAAC,MAAM;YACvB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,EAAE;SACH,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlePubrel.d.ts","sourceRoot":"","sources":["../../../server/handlers/handlePubrel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"handlePubrel.d.ts","sourceRoot":"","sources":["../../../server/handlers/handlePubrel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
|
@@ -13,8 +13,12 @@ import { PacketType } from "../deps.js";
|
|
|
13
13
|
*/
|
|
14
14
|
export async function handlePubrel(ctx, packet) {
|
|
15
15
|
const id = packet.id;
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const storedPacket = await ctx.persistence.getPendingIncomingPacket(ctx.clientId, id);
|
|
17
|
+
if (storedPacket) {
|
|
18
|
+
// packet is in store
|
|
19
|
+
// publish the packet
|
|
20
|
+
await ctx.publish(storedPacket);
|
|
21
|
+
await ctx.persistence.deletePendingIncomingPacket(ctx.clientId, id);
|
|
18
22
|
}
|
|
19
23
|
await ctx.send({
|
|
20
24
|
type: PacketType.pubcomp,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlePubrel.js","sourceRoot":"","sources":["../../../server/handlers/handlePubrel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIxC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAY,EACZ,MAAoB;IAEpB,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"handlePubrel.js","sourceRoot":"","sources":["../../../server/handlers/handlePubrel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIxC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAY,EACZ,MAAoB;IAEpB,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;IAErB,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,wBAAwB,CACjE,GAAG,CAAC,QAAS,EACb,EAAE,CACH,CAAC;IAEF,IAAI,YAAY,EAAE,CAAC;QACjB,qBAAqB;QACrB,qBAAqB;QACrB,MAAM,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAChC,MAAM,GAAG,CAAC,WAAW,CAAC,2BAA2B,CAAC,GAAG,CAAC,QAAS,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,GAAG,CAAC,IAAI,CAAC;QACb,IAAI,EAAE,UAAU,CAAC,OAAO;QACxB,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,EAAE;KACH,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import type { Context } from "../context.ts";
|
|
2
2
|
import type { SubscribePacket } from "../deps.ts";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
* @description Processes an MQTT SUBSCRIBE packet
|
|
6
|
-
* @param {Context} ctx - The connection context
|
|
7
|
-
* @param {SubscribePacket} packet - The SUBSCRIBE packet received from the client
|
|
8
|
-
* @returns {Promise<void>}
|
|
9
|
-
* @throws {Error} If subscription processing fails
|
|
4
|
+
* Processes an MQTT SUBSCRIBE packet.
|
|
10
5
|
* @remarks The order of return codes in the SUBACK Packet MUST match the order of Topic Filters in the SUBSCRIBE Packet [MQTT-3.9.3-1]
|
|
11
6
|
*/
|
|
12
7
|
export declare function handleSubscribe(ctx: Context, packet: SubscribePacket): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleSubscribe.d.ts","sourceRoot":"","sources":["../../../server/handlers/handleSubscribe.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handleSubscribe.d.ts","sourceRoot":"","sources":["../../../server/handlers/handleSubscribe.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAW7C,OAAO,KAAK,EAGV,eAAe,EAGhB,MAAM,YAAY,CAAC;AAsEpB;;;GAGG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CA0Ff"}
|
|
@@ -1,58 +1,119 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SessionState } from "../context.js";
|
|
2
|
+
import { hasWildcards, invalidmaxTopicLevels, invalidTopicFilter, joinTopicFilter, logger, PacketType, parseTopicFilter, ReasonCode, } from "../deps.js";
|
|
3
|
+
// V4 Subscription Failure
|
|
4
|
+
const V4SubscriptionFailure = 0x80;
|
|
2
5
|
/**
|
|
3
|
-
*
|
|
4
|
-
* @description Code indicating a failed subscription attempt
|
|
6
|
+
* Checks if a client is authorized to subscribe to a topic.
|
|
5
7
|
*/
|
|
6
|
-
|
|
8
|
+
async function authorizedToSubscribe(ctx, topicFilter, shareName) {
|
|
9
|
+
if (ctx.state === SessionState.authenticating) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
if (ctx.handlers.isAuthorizedToSubscribe) {
|
|
14
|
+
return await ctx.handlers.isAuthorizedToSubscribe(ctx, topicFilter, shareName);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
let message = "unknown error";
|
|
19
|
+
if (err instanceof Error) {
|
|
20
|
+
message = err.message;
|
|
21
|
+
}
|
|
22
|
+
logger.error("isAuthorizedToSubscribe failed with error", message);
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
7
27
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* @param topicFilter - The topic filter to check authorization for
|
|
11
|
-
* @returns True if authorized, false otherwise
|
|
28
|
+
* Validates a single subscription topic filter against server configuration.
|
|
29
|
+
* Returns an error ReasonCode if invalid, or null if valid.
|
|
12
30
|
*/
|
|
13
|
-
function
|
|
14
|
-
if (
|
|
15
|
-
return
|
|
31
|
+
function validateSubscription(isProtocolV5, sub, cfg) {
|
|
32
|
+
if (cfg.wildcardSubscriptionAvailable === false && hasWildcards(sub.topicFilter)) {
|
|
33
|
+
return ReasonCode.wildcardSubscriptionsNotSupported;
|
|
16
34
|
}
|
|
17
|
-
|
|
35
|
+
if (sub.shareName !== "") {
|
|
36
|
+
if (cfg.sharedSubscriptionAvailable === false || !isProtocolV5) {
|
|
37
|
+
return ReasonCode.sharedSubscriptionsNotSupported;
|
|
38
|
+
}
|
|
39
|
+
// noLocal is not allowed on shared subscriptions
|
|
40
|
+
if (sub.noLocal) {
|
|
41
|
+
return ReasonCode.topicFilterInvalid;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (sub.topicFilter.length === 0 ||
|
|
45
|
+
invalidTopicFilter(sub.topicFilter) ||
|
|
46
|
+
invalidmaxTopicLevels(sub.topicFilter, cfg.maxTopicLevels)) {
|
|
47
|
+
return ReasonCode.topicFilterInvalid;
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
18
50
|
}
|
|
19
51
|
/**
|
|
20
|
-
*
|
|
21
|
-
* @description Processes an MQTT SUBSCRIBE packet
|
|
22
|
-
* @param {Context} ctx - The connection context
|
|
23
|
-
* @param {SubscribePacket} packet - The SUBSCRIBE packet received from the client
|
|
24
|
-
* @returns {Promise<void>}
|
|
25
|
-
* @throws {Error} If subscription processing fails
|
|
52
|
+
* Processes an MQTT SUBSCRIBE packet.
|
|
26
53
|
* @remarks The order of return codes in the SUBACK Packet MUST match the order of Topic Filters in the SUBSCRIBE Packet [MQTT-3.9.3-1]
|
|
27
54
|
*/
|
|
28
55
|
export async function handleSubscribe(ctx, packet) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
56
|
+
const cfg = ctx.config.context;
|
|
57
|
+
const isProtocolV5 = packet.protocolLevel === 5;
|
|
58
|
+
const subscriptionIdentifier = isProtocolV5
|
|
59
|
+
? packet.properties?.subscriptionIdentifier
|
|
60
|
+
: undefined;
|
|
61
|
+
// Pre-fetch existing subscriptions to evaluate Retain Handling logic (retainHandling === 1)
|
|
62
|
+
const existingTopicFilters = new Set();
|
|
63
|
+
for await (const sub of ctx.persistence.listSubscriptions(ctx.clientId)) {
|
|
64
|
+
existingTopicFilters.add(joinTopicFilter(sub.topicFilter, sub.shareName));
|
|
65
|
+
}
|
|
66
|
+
const retainedSubscriptions = [];
|
|
67
|
+
const results = [];
|
|
68
|
+
for (const sub of packet.subscriptions) {
|
|
69
|
+
const clientSub = sub;
|
|
70
|
+
// split topicFilter into topicFilter and shareName
|
|
71
|
+
const { topicFilter, shareName } = parseTopicFilter(sub.topicFilter);
|
|
72
|
+
clientSub.topicFilter = topicFilter;
|
|
73
|
+
clientSub.shareName = shareName;
|
|
74
|
+
// TopicFilter Validation
|
|
75
|
+
const validationError = validateSubscription(isProtocolV5, clientSub, cfg);
|
|
76
|
+
if (validationError !== null) {
|
|
77
|
+
if (!isProtocolV5) {
|
|
78
|
+
await ctx.close(false);
|
|
79
|
+
return;
|
|
38
80
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return sub.qos;
|
|
81
|
+
results.push(validationError);
|
|
82
|
+
continue;
|
|
42
83
|
}
|
|
43
|
-
|
|
44
|
-
|
|
84
|
+
// Authorization Check
|
|
85
|
+
if (!await authorizedToSubscribe(ctx, clientSub.topicFilter, clientSub.shareName)) {
|
|
86
|
+
results.push(isProtocolV5 ? ReasonCode.notAuthorized : V4SubscriptionFailure);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// Register Subscription
|
|
90
|
+
const filterKey = sub.topicFilter;
|
|
91
|
+
const isNewSubscription = !existingTopicFilters.has(filterKey);
|
|
92
|
+
if (subscriptionIdentifier) {
|
|
93
|
+
clientSub.subscriptionIdentifier = subscriptionIdentifier;
|
|
94
|
+
}
|
|
95
|
+
await ctx.persistence.subscribe(ctx.clientId, clientSub);
|
|
96
|
+
existingTopicFilters.add(filterKey);
|
|
97
|
+
// Collect Subscriptions Requiring Retained Messages
|
|
98
|
+
if (clientSub.retainHandling !== 2 &&
|
|
99
|
+
(clientSub.retainHandling !== 1 || isNewSubscription)) {
|
|
100
|
+
retainedSubscriptions.push(clientSub);
|
|
101
|
+
}
|
|
102
|
+
// Success code (Granted QoS)
|
|
103
|
+
results.push(sub.qos);
|
|
104
|
+
}
|
|
105
|
+
// Send SUBACK response
|
|
45
106
|
await ctx.send({
|
|
46
107
|
type: PacketType.suback,
|
|
47
108
|
protocolLevel: ctx.protocolLevel,
|
|
48
109
|
id: packet.id,
|
|
49
|
-
|
|
110
|
+
...(isProtocolV5
|
|
111
|
+
? { reasonCodes: results }
|
|
112
|
+
: { returnCodes: results }),
|
|
50
113
|
});
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (ctx.store) {
|
|
55
|
-
ctx.persistence.handleRetained(ctx.store.clientId);
|
|
114
|
+
// Dispatch matching retained messages
|
|
115
|
+
if (retainedSubscriptions.length > 0) {
|
|
116
|
+
await ctx.persistence.handleRetained(ctx.clientId, retainedSubscriptions);
|
|
56
117
|
}
|
|
57
118
|
}
|
|
58
119
|
//# sourceMappingURL=handleSubscribe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleSubscribe.js","sourceRoot":"","sources":["../../../server/handlers/handleSubscribe.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handleSubscribe.js","sourceRoot":"","sources":["../../../server/handlers/handleSubscribe.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleUnsubscribe.d.ts","sourceRoot":"","sources":["../../../server/handlers/handleUnsubscribe.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handleUnsubscribe.d.ts","sourceRoot":"","sources":["../../../server/handlers/handleUnsubscribe.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAe,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { PacketType } from "../deps.js";
|
|
1
|
+
import { joinTopicFilter, PacketType, parseTopicFilter, ReasonCode, } from "../deps.js";
|
|
2
|
+
import { SessionState } from "../context.js";
|
|
2
3
|
/**
|
|
3
4
|
* Handles MQTT unsubscribe packets by removing subscriptions and sending acknowledgement
|
|
4
5
|
* @param ctx - The connection context containing client information and methods
|
|
@@ -6,15 +7,29 @@ import { PacketType } from "../deps.js";
|
|
|
6
7
|
* @returns Promise that resolves when unsubscribe is complete and acknowledged
|
|
7
8
|
*/
|
|
8
9
|
export async function handleUnsubscribe(ctx, packet) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
// this is v5 only, no unsubscriptions while reauthenticating
|
|
11
|
+
const isAuthenticating = ctx.state === SessionState.authenticating;
|
|
12
|
+
const subscriptions = new Set();
|
|
13
|
+
for await (const sub of ctx.persistence.listSubscriptions(ctx.clientId)) {
|
|
14
|
+
subscriptions.add(joinTopicFilter(sub.topicFilter, sub.shareName));
|
|
15
|
+
}
|
|
16
|
+
const reasonCodes = [];
|
|
17
|
+
for (const packetTopicFilter of packet.topicFilters) {
|
|
18
|
+
// split topicFilter into topicFilter and shareName
|
|
19
|
+
const { topicFilter, shareName } = parseTopicFilter(packetTopicFilter);
|
|
20
|
+
if (subscriptions.has(packetTopicFilter) && !isAuthenticating) {
|
|
21
|
+
reasonCodes.push(ReasonCode.success);
|
|
22
|
+
await ctx.persistence.unsubscribe(ctx.clientId, topicFilter, shareName);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
reasonCodes.push(ReasonCode.noSubscriptionExisted);
|
|
12
26
|
}
|
|
13
27
|
}
|
|
14
28
|
await ctx.send({
|
|
15
29
|
type: PacketType.unsuback,
|
|
16
30
|
id: packet.id,
|
|
17
31
|
protocolLevel: ctx.protocolLevel,
|
|
32
|
+
reasonCodes,
|
|
18
33
|
});
|
|
19
34
|
}
|
|
20
35
|
//# sourceMappingURL=handleUnsubscribe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleUnsubscribe.js","sourceRoot":"","sources":["../../../server/handlers/handleUnsubscribe.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"handleUnsubscribe.js","sourceRoot":"","sources":["../../../server/handlers/handleUnsubscribe.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAY,EACZ,MAAyB;IAEzB,6DAA6D;IAC7D,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,KAAK,YAAY,CAAC,cAAc,CAAC;IAEnE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;IAChC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAS,CAAC,EAAE,CAAC;QACzE,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,WAAW,GAAkB,EAAE,CAAC;IAEtC,KAAK,MAAM,iBAAiB,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACpD,mDAAmD;QACnD,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,gBAAgB,CACjD,iBAAiB,CAClB,CAAC;QACF,IAAI,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9D,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,QAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,MAAM,GAAG,CAAC,IAAI,CAAC;QACb,IAAI,EAAE,UAAU,CAAC,QAAQ;QACzB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,WAAW;KACZ,CAAC,CAAC;AACL,CAAC"}
|
package/dist/server/mod.d.ts
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* This module provides an MQTT Server interface see the /bin folder for examples
|
|
3
3
|
* @module
|
|
4
4
|
*/
|
|
5
|
-
export {
|
|
6
|
-
export type { IPersistence,
|
|
5
|
+
export { ReasonCode } from "./deps.ts";
|
|
6
|
+
export type { ConnectPacket, IPersistence, ShareName, SockConn, Topic, } from "./deps.ts";
|
|
7
7
|
export { MqttServer } from "./server.ts";
|
|
8
8
|
export type { MqttServerOptions } from "./server.ts";
|
|
9
9
|
export { Context } from "./context.ts";
|
|
10
|
-
export type { Handlers } from "./context.ts";
|
|
10
|
+
export type { AuthenticatedResult, Handlers } from "./context.ts";
|
|
11
11
|
//# sourceMappingURL=mod.d.ts.map
|
package/dist/server/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../server/mod.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../server/mod.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EACV,aAAa,EACb,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,KAAK,GACN,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/server/mod.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* This module provides an MQTT Server interface see the /bin folder for examples
|
|
3
3
|
* @module
|
|
4
4
|
*/
|
|
5
|
-
export {
|
|
5
|
+
export { ReasonCode } from "./deps.js";
|
|
6
6
|
export { MqttServer } from "./server.js";
|
|
7
7
|
export { Context } from "./context.js";
|
|
8
8
|
//# sourceMappingURL=mod.js.map
|
package/dist/server/mod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../server/mod.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../server/mod.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAQvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
|