@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.
Files changed (542) hide show
  1. package/README.md +99 -40
  2. package/bin/conformanceServer.ts +45 -13
  3. package/bin/demoServer.ts +38 -13
  4. package/bin/mqtt.ts +2 -2
  5. package/client/ConnectionState.ts +3 -1
  6. package/client/client.ts +88 -47
  7. package/client/context.ts +79 -27
  8. package/client/deps.ts +10 -3
  9. package/client/handlers/handleAuth.test.ts +193 -0
  10. package/client/handlers/handleAuth.ts +89 -0
  11. package/client/handlers/handleConnack.test.ts +173 -0
  12. package/client/handlers/handleConnack.ts +18 -8
  13. package/client/handlers/handleDisconnect.test.ts +22 -0
  14. package/client/handlers/handleDisconnect.ts +17 -0
  15. package/client/handlers/handlePacket.test.ts +242 -0
  16. package/client/handlers/handlePacket.ts +19 -5
  17. package/client/handlers/handlePuback.test.ts +99 -0
  18. package/client/handlers/handlePuback.ts +6 -0
  19. package/client/handlers/handlePubcomp.test.ts +112 -0
  20. package/client/handlers/handlePubcomp.ts +5 -0
  21. package/client/handlers/handlePublish.test.ts +188 -0
  22. package/client/handlers/handlePubrec.test.ts +119 -0
  23. package/client/handlers/handlePubrec.ts +5 -1
  24. package/client/handlers/handlePubrel.test.ts +136 -0
  25. package/client/handlers/handleSuback.test.ts +122 -0
  26. package/client/handlers/handleSuback.ts +3 -0
  27. package/client/handlers/handleUnsuback.test.ts +101 -0
  28. package/client/mod.ts +13 -2
  29. package/client/store/memoryStore.ts +12 -11
  30. package/client/store/store.ts +4 -2
  31. package/deno/README.md +1 -2
  32. package/deno/tcpClient.test.ts +75 -0
  33. package/deno/tcpClient.ts +36 -18
  34. package/deno/tcpServer.test.ts +22 -21
  35. package/deno/tcpServer.ts +26 -4
  36. package/deno/tlsServer.test.ts +97 -0
  37. package/deno/tlsServer.ts +58 -0
  38. package/deno/wsServer.test.ts +93 -0
  39. package/deno/wsServer.ts +96 -0
  40. package/dev_utils/generateCert.ts +95 -0
  41. package/dev_utils/mockConn.ts +36 -0
  42. package/dev_utils/mockServer.ts +28 -0
  43. package/dev_utils/mod.ts +30 -3
  44. package/dev_utils/packetHelpers.ts +404 -0
  45. package/dev_utils/test-handlers.ts +98 -0
  46. package/dev_utils/timers.ts +14 -0
  47. package/dev_utils/webStreamPair.test.ts +171 -0
  48. package/dev_utils/webStreamPair.ts +143 -0
  49. package/dist/bin/conformanceServer.js +17 -12
  50. package/dist/bin/conformanceServer.js.map +1 -1
  51. package/dist/bin/demoServer.js +16 -12
  52. package/dist/bin/demoServer.js.map +1 -1
  53. package/dist/bin/mqtt.js +2 -2
  54. package/dist/bin/mqtt.js.map +1 -1
  55. package/dist/client/ConnectionState.d.ts +3 -1
  56. package/dist/client/ConnectionState.d.ts.map +1 -1
  57. package/dist/client/ConnectionState.js +2 -0
  58. package/dist/client/ConnectionState.js.map +1 -1
  59. package/dist/client/client.d.ts +47 -21
  60. package/dist/client/client.d.ts.map +1 -1
  61. package/dist/client/client.js +57 -20
  62. package/dist/client/client.js.map +1 -1
  63. package/dist/client/context.d.ts +15 -7
  64. package/dist/client/context.d.ts.map +1 -1
  65. package/dist/client/context.js +44 -12
  66. package/dist/client/context.js.map +1 -1
  67. package/dist/client/deps.d.ts +4 -3
  68. package/dist/client/deps.d.ts.map +1 -1
  69. package/dist/client/deps.js +1 -1
  70. package/dist/client/deps.js.map +1 -1
  71. package/dist/client/handlers/handleAuth.d.ts +9 -0
  72. package/dist/client/handlers/handleAuth.d.ts.map +1 -0
  73. package/dist/client/handlers/handleAuth.js +66 -0
  74. package/dist/client/handlers/handleAuth.js.map +1 -0
  75. package/dist/client/handlers/handleConnack.d.ts +2 -2
  76. package/dist/client/handlers/handleConnack.d.ts.map +1 -1
  77. package/dist/client/handlers/handleConnack.js +16 -6
  78. package/dist/client/handlers/handleConnack.js.map +1 -1
  79. package/dist/client/handlers/handleDisconnect.d.ts +11 -0
  80. package/dist/client/handlers/handleDisconnect.d.ts.map +1 -0
  81. package/dist/client/handlers/handleDisconnect.js +15 -0
  82. package/dist/client/handlers/handleDisconnect.js.map +1 -0
  83. package/dist/client/handlers/handlePacket.d.ts.map +1 -1
  84. package/dist/client/handlers/handlePacket.js +14 -3
  85. package/dist/client/handlers/handlePacket.js.map +1 -1
  86. package/dist/client/handlers/handlePuback.d.ts.map +1 -1
  87. package/dist/client/handlers/handlePuback.js +5 -0
  88. package/dist/client/handlers/handlePuback.js.map +1 -1
  89. package/dist/client/handlers/handlePubcomp.d.ts.map +1 -1
  90. package/dist/client/handlers/handlePubcomp.js +5 -0
  91. package/dist/client/handlers/handlePubcomp.js.map +1 -1
  92. package/dist/client/handlers/handlePubrec.d.ts.map +1 -1
  93. package/dist/client/handlers/handlePubrec.js +5 -1
  94. package/dist/client/handlers/handlePubrec.js.map +1 -1
  95. package/dist/client/handlers/handleSuback.d.ts +1 -0
  96. package/dist/client/handlers/handleSuback.d.ts.map +1 -1
  97. package/dist/client/handlers/handleSuback.js +3 -0
  98. package/dist/client/handlers/handleSuback.js.map +1 -1
  99. package/dist/client/mod.d.ts +3 -2
  100. package/dist/client/mod.d.ts.map +1 -1
  101. package/dist/client/mod.js +1 -1
  102. package/dist/client/mod.js.map +1 -1
  103. package/dist/client/store/memoryStore.d.ts +3 -3
  104. package/dist/client/store/memoryStore.d.ts.map +1 -1
  105. package/dist/client/store/memoryStore.js +3 -3
  106. package/dist/client/store/memoryStore.js.map +1 -1
  107. package/dist/client/store/store.d.ts +3 -2
  108. package/dist/client/store/store.d.ts.map +1 -1
  109. package/dist/client/store/store.js +1 -1
  110. package/dist/client/store/store.js.map +1 -1
  111. package/dist/dev_utils/generateCert.d.ts +11 -0
  112. package/dist/dev_utils/generateCert.d.ts.map +1 -0
  113. package/dist/dev_utils/generateCert.js +76 -0
  114. package/dist/dev_utils/generateCert.js.map +1 -0
  115. package/dist/examples/authHandler.test.d.ts +2 -0
  116. package/dist/examples/authHandler.test.d.ts.map +1 -0
  117. package/dist/examples/authHandler.test.js +123 -0
  118. package/dist/examples/authHandler.test.js.map +1 -0
  119. package/dist/examples/mqtt.test.d.ts +2 -0
  120. package/dist/examples/mqtt.test.d.ts.map +1 -0
  121. package/dist/examples/mqtt.test.js +70 -0
  122. package/dist/examples/mqtt.test.js.map +1 -0
  123. package/dist/examples/mqtts.test.d.ts +2 -0
  124. package/dist/examples/mqtts.test.d.ts.map +1 -0
  125. package/dist/examples/mqtts.test.js +81 -0
  126. package/dist/examples/mqtts.test.js.map +1 -0
  127. package/dist/mqttConn/mqttConn.d.ts +24 -31
  128. package/dist/mqttConn/mqttConn.d.ts.map +1 -1
  129. package/dist/mqttConn/mqttConn.js +57 -36
  130. package/dist/mqttConn/mqttConn.js.map +1 -1
  131. package/dist/mqttPacket/AuthenticationResult.d.ts +4 -0
  132. package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -1
  133. package/dist/mqttPacket/AuthenticationResult.js.map +1 -1
  134. package/dist/mqttPacket/BitMask.d.ts.map +1 -1
  135. package/dist/mqttPacket/PacketType.d.ts +4 -0
  136. package/dist/mqttPacket/PacketType.d.ts.map +1 -1
  137. package/dist/mqttPacket/Properties.d.ts +4 -4
  138. package/dist/mqttPacket/Properties.d.ts.map +1 -1
  139. package/dist/mqttPacket/Properties.js.map +1 -1
  140. package/dist/mqttPacket/ReasonCode.d.ts +4 -5
  141. package/dist/mqttPacket/ReasonCode.d.ts.map +1 -1
  142. package/dist/mqttPacket/ReasonCode.js +1 -0
  143. package/dist/mqttPacket/ReasonCode.js.map +1 -1
  144. package/dist/mqttPacket/RetainHandling.d.ts +4 -0
  145. package/dist/mqttPacket/RetainHandling.d.ts.map +1 -1
  146. package/dist/mqttPacket/auth.d.ts +7 -8
  147. package/dist/mqttPacket/auth.d.ts.map +1 -1
  148. package/dist/mqttPacket/auth.js +31 -30
  149. package/dist/mqttPacket/auth.js.map +1 -1
  150. package/dist/mqttPacket/codec.d.ts +48 -0
  151. package/dist/mqttPacket/codec.d.ts.map +1 -0
  152. package/dist/mqttPacket/codec.js +93 -0
  153. package/dist/mqttPacket/codec.js.map +1 -0
  154. package/dist/mqttPacket/connack.d.ts +11 -10
  155. package/dist/mqttPacket/connack.d.ts.map +1 -1
  156. package/dist/mqttPacket/connack.js +43 -45
  157. package/dist/mqttPacket/connack.js.map +1 -1
  158. package/dist/mqttPacket/connect.d.ts +7 -7
  159. package/dist/mqttPacket/connect.d.ts.map +1 -1
  160. package/dist/mqttPacket/connect.js +156 -157
  161. package/dist/mqttPacket/connect.js.map +1 -1
  162. package/dist/mqttPacket/decoder.d.ts +6 -16
  163. package/dist/mqttPacket/decoder.d.ts.map +1 -1
  164. package/dist/mqttPacket/decoder.js +7 -28
  165. package/dist/mqttPacket/decoder.js.map +1 -1
  166. package/dist/mqttPacket/disconnect.d.ts +9 -8
  167. package/dist/mqttPacket/disconnect.d.ts.map +1 -1
  168. package/dist/mqttPacket/disconnect.js +41 -43
  169. package/dist/mqttPacket/disconnect.js.map +1 -1
  170. package/dist/mqttPacket/encoder.d.ts +7 -19
  171. package/dist/mqttPacket/encoder.d.ts.map +1 -1
  172. package/dist/mqttPacket/encoder.js +5 -28
  173. package/dist/mqttPacket/encoder.js.map +1 -1
  174. package/dist/mqttPacket/mod.d.ts +21 -103
  175. package/dist/mqttPacket/mod.d.ts.map +1 -1
  176. package/dist/mqttPacket/mod.js +5 -94
  177. package/dist/mqttPacket/mod.js.map +1 -1
  178. package/dist/mqttPacket/pingreq.d.ts +6 -6
  179. package/dist/mqttPacket/pingreq.d.ts.map +1 -1
  180. package/dist/mqttPacket/pingreq.js +11 -13
  181. package/dist/mqttPacket/pingreq.js.map +1 -1
  182. package/dist/mqttPacket/pingres.d.ts +6 -6
  183. package/dist/mqttPacket/pingres.d.ts.map +1 -1
  184. package/dist/mqttPacket/pingres.js +11 -13
  185. package/dist/mqttPacket/pingres.js.map +1 -1
  186. package/dist/mqttPacket/protocolLevels.d.ts +11 -6
  187. package/dist/mqttPacket/protocolLevels.d.ts.map +1 -1
  188. package/dist/mqttPacket/protocolLevels.js +5 -1
  189. package/dist/mqttPacket/protocolLevels.js.map +1 -1
  190. package/dist/mqttPacket/pubblishAcks.d.ts +9 -10
  191. package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -1
  192. package/dist/mqttPacket/pubblishAcks.js +43 -45
  193. package/dist/mqttPacket/pubblishAcks.js.map +1 -1
  194. package/dist/mqttPacket/publish.d.ts +8 -7
  195. package/dist/mqttPacket/publish.d.ts.map +1 -1
  196. package/dist/mqttPacket/publish.js +53 -55
  197. package/dist/mqttPacket/publish.js.map +1 -1
  198. package/dist/mqttPacket/suback.d.ts +9 -8
  199. package/dist/mqttPacket/suback.d.ts.map +1 -1
  200. package/dist/mqttPacket/suback.js +38 -40
  201. package/dist/mqttPacket/suback.js.map +1 -1
  202. package/dist/mqttPacket/subscribe.d.ts +41 -10
  203. package/dist/mqttPacket/subscribe.d.ts.map +1 -1
  204. package/dist/mqttPacket/subscribe.js +90 -89
  205. package/dist/mqttPacket/subscribe.js.map +1 -1
  206. package/dist/mqttPacket/types.d.ts +2 -29
  207. package/dist/mqttPacket/types.d.ts.map +1 -1
  208. package/dist/mqttPacket/unsuback.d.ts +9 -8
  209. package/dist/mqttPacket/unsuback.d.ts.map +1 -1
  210. package/dist/mqttPacket/unsuback.js +32 -34
  211. package/dist/mqttPacket/unsuback.js.map +1 -1
  212. package/dist/mqttPacket/unsubscribe.d.ts +26 -8
  213. package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
  214. package/dist/mqttPacket/unsubscribe.js +45 -44
  215. package/dist/mqttPacket/unsubscribe.js.map +1 -1
  216. package/dist/mqttPacket/validators.d.ts +4 -16
  217. package/dist/mqttPacket/validators.d.ts.map +1 -1
  218. package/dist/mqttPacket/validators.js +5 -26
  219. package/dist/mqttPacket/validators.js.map +1 -1
  220. package/dist/node/tcpClient.d.ts +22 -2
  221. package/dist/node/tcpClient.d.ts.map +1 -1
  222. package/dist/node/tcpClient.js +29 -10
  223. package/dist/node/tcpClient.js.map +1 -1
  224. package/dist/node/tcpServer.d.ts +18 -0
  225. package/dist/node/tcpServer.d.ts.map +1 -1
  226. package/dist/node/tcpServer.js +21 -2
  227. package/dist/node/tcpServer.js.map +1 -1
  228. package/dist/node/tlsServer.d.ts +37 -0
  229. package/dist/node/tlsServer.d.ts.map +1 -0
  230. package/dist/node/tlsServer.js +73 -0
  231. package/dist/node/tlsServer.js.map +1 -0
  232. package/dist/node/wrapNodeSocket.d.ts.map +1 -1
  233. package/dist/node/wrapNodeSocket.js +6 -28
  234. package/dist/node/wrapNodeSocket.js.map +1 -1
  235. package/dist/persistence/basicPersistence.d.ts +36 -0
  236. package/dist/persistence/basicPersistence.d.ts.map +1 -0
  237. package/dist/persistence/basicPersistence.js +306 -0
  238. package/dist/persistence/basicPersistence.js.map +1 -0
  239. package/dist/persistence/deps.d.ts +3 -2
  240. package/dist/persistence/deps.d.ts.map +1 -1
  241. package/dist/persistence/deps.js +2 -1
  242. package/dist/persistence/deps.js.map +1 -1
  243. package/dist/persistence/memory/memoryPersistence.d.ts +6 -23
  244. package/dist/persistence/memory/memoryPersistence.d.ts.map +1 -1
  245. package/dist/persistence/memory/memoryPersistence.js +12 -115
  246. package/dist/persistence/memory/memoryPersistence.js.map +1 -1
  247. package/dist/persistence/memory/memoryStorage.d.ts +45 -0
  248. package/dist/persistence/memory/memoryStorage.d.ts.map +1 -0
  249. package/dist/persistence/memory/memoryStorage.js +143 -0
  250. package/dist/persistence/memory/memoryStorage.js.map +1 -0
  251. package/dist/persistence/mod.d.ts +3 -3
  252. package/dist/persistence/mod.d.ts.map +1 -1
  253. package/dist/persistence/mod.js +6 -1
  254. package/dist/persistence/mod.js.map +1 -1
  255. package/dist/persistence/persistence.d.ts +45 -70
  256. package/dist/persistence/persistence.d.ts.map +1 -1
  257. package/dist/persistence/persistence.js +1 -2
  258. package/dist/persistence/persistence.js.map +1 -1
  259. package/dist/persistence/sqlite/sqliteDatabase.d.ts +46 -0
  260. package/dist/persistence/sqlite/sqliteDatabase.d.ts.map +1 -0
  261. package/dist/persistence/sqlite/sqliteDatabase.js +215 -0
  262. package/dist/persistence/sqlite/sqliteDatabase.js.map +1 -0
  263. package/dist/persistence/sqlite/sqlitePersistence.d.ts +16 -0
  264. package/dist/persistence/sqlite/sqlitePersistence.d.ts.map +1 -0
  265. package/dist/persistence/sqlite/sqlitePersistence.js +29 -0
  266. package/dist/persistence/sqlite/sqlitePersistence.js.map +1 -0
  267. package/dist/persistence/sqlite/sqliteStorage.d.ts +36 -0
  268. package/dist/persistence/sqlite/sqliteStorage.d.ts.map +1 -0
  269. package/dist/persistence/sqlite/sqliteStorage.js +194 -0
  270. package/dist/persistence/sqlite/sqliteStorage.js.map +1 -0
  271. package/dist/persistence/storage.d.ts +38 -0
  272. package/dist/persistence/storage.d.ts.map +1 -0
  273. package/dist/persistence/storage.js +5 -0
  274. package/dist/persistence/storage.js.map +1 -0
  275. package/dist/server/config.d.ts +47 -0
  276. package/dist/server/config.d.ts.map +1 -0
  277. package/dist/server/config.js +41 -0
  278. package/dist/server/config.js.map +1 -0
  279. package/dist/server/context.d.ts +199 -25
  280. package/dist/server/context.d.ts.map +1 -1
  281. package/dist/server/context.js +432 -53
  282. package/dist/server/context.js.map +1 -1
  283. package/dist/server/deps.d.ts +5 -6
  284. package/dist/server/deps.d.ts.map +1 -1
  285. package/dist/server/deps.js +2 -2
  286. package/dist/server/deps.js.map +1 -1
  287. package/dist/server/handlers/completeConnect.d.ts +9 -0
  288. package/dist/server/handlers/completeConnect.d.ts.map +1 -0
  289. package/dist/server/handlers/completeConnect.js +74 -0
  290. package/dist/server/handlers/completeConnect.js.map +1 -0
  291. package/dist/server/handlers/handleAuth.d.ts +9 -0
  292. package/dist/server/handlers/handleAuth.d.ts.map +1 -0
  293. package/dist/server/handlers/handleAuth.js +69 -0
  294. package/dist/server/handlers/handleAuth.js.map +1 -0
  295. package/dist/server/handlers/handleConnect.d.ts +2 -4
  296. package/dist/server/handlers/handleConnect.d.ts.map +1 -1
  297. package/dist/server/handlers/handleConnect.js +140 -67
  298. package/dist/server/handlers/handleConnect.js.map +1 -1
  299. package/dist/server/handlers/handleDisconnect.d.ts +1 -1
  300. package/dist/server/handlers/handleDisconnect.d.ts.map +1 -1
  301. package/dist/server/handlers/handleDisconnect.js +3 -3
  302. package/dist/server/handlers/handleDisconnect.js.map +1 -1
  303. package/dist/server/handlers/handlePacket.d.ts.map +1 -1
  304. package/dist/server/handlers/handlePacket.js +19 -6
  305. package/dist/server/handlers/handlePacket.js.map +1 -1
  306. package/dist/server/handlers/handlePuback.d.ts +1 -3
  307. package/dist/server/handlers/handlePuback.d.ts.map +1 -1
  308. package/dist/server/handlers/handlePuback.js +2 -8
  309. package/dist/server/handlers/handlePuback.js.map +1 -1
  310. package/dist/server/handlers/handlePubcomp.d.ts +1 -1
  311. package/dist/server/handlers/handlePubcomp.d.ts.map +1 -1
  312. package/dist/server/handlers/handlePubcomp.js +2 -4
  313. package/dist/server/handlers/handlePubcomp.js.map +1 -1
  314. package/dist/server/handlers/handlePublish.d.ts +1 -1
  315. package/dist/server/handlers/handlePublish.d.ts.map +1 -1
  316. package/dist/server/handlers/handlePublish.js +149 -45
  317. package/dist/server/handlers/handlePublish.js.map +1 -1
  318. package/dist/server/handlers/handlePubrec.d.ts.map +1 -1
  319. package/dist/server/handlers/handlePubrec.js +2 -3
  320. package/dist/server/handlers/handlePubrec.js.map +1 -1
  321. package/dist/server/handlers/handlePubrel.d.ts.map +1 -1
  322. package/dist/server/handlers/handlePubrel.js +6 -2
  323. package/dist/server/handlers/handlePubrel.js.map +1 -1
  324. package/dist/server/handlers/handleSubscribe.d.ts +1 -6
  325. package/dist/server/handlers/handleSubscribe.d.ts.map +1 -1
  326. package/dist/server/handlers/handleSubscribe.js +99 -38
  327. package/dist/server/handlers/handleSubscribe.js.map +1 -1
  328. package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -1
  329. package/dist/server/handlers/handleUnsubscribe.js +19 -4
  330. package/dist/server/handlers/handleUnsubscribe.js.map +1 -1
  331. package/dist/server/mod.d.ts +3 -3
  332. package/dist/server/mod.d.ts.map +1 -1
  333. package/dist/server/mod.js +1 -1
  334. package/dist/server/mod.js.map +1 -1
  335. package/dist/server/server.d.ts +32 -9
  336. package/dist/server/server.d.ts.map +1 -1
  337. package/dist/server/server.js +84 -15
  338. package/dist/server/server.js.map +1 -1
  339. package/dist/socket/socket.d.ts +15 -9
  340. package/dist/socket/socket.d.ts.map +1 -1
  341. package/dist/socket/socket.js +66 -18
  342. package/dist/socket/socket.js.map +1 -1
  343. package/dist/timer/timer.d.ts +32 -0
  344. package/dist/timer/timer.d.ts.map +1 -1
  345. package/dist/timer/timer.js +32 -0
  346. package/dist/timer/timer.js.map +1 -1
  347. package/dist/trie/trie.d.ts +10 -5
  348. package/dist/trie/trie.d.ts.map +1 -1
  349. package/dist/trie/trie.js +61 -41
  350. package/dist/trie/trie.js.map +1 -1
  351. package/dist/utils/assert.d.ts.map +1 -1
  352. package/dist/utils/{BufferedAsyncIterable.d.ts → bufferedAsyncIterable.d.ts} +1 -1
  353. package/dist/utils/bufferedAsyncIterable.d.ts.map +1 -0
  354. package/dist/utils/{BufferedAsyncIterable.js → bufferedAsyncIterable.js} +1 -1
  355. package/dist/utils/bufferedAsyncIterable.js.map +1 -0
  356. package/dist/utils/deferred.d.ts.map +1 -1
  357. package/dist/utils/deferred.js.map +1 -1
  358. package/dist/utils/getOrInsertPolyFill.d.ts +2 -0
  359. package/dist/utils/getOrInsertPolyFill.d.ts.map +1 -0
  360. package/dist/utils/getOrInsertPolyFill.js +12 -0
  361. package/dist/utils/getOrInsertPolyFill.js.map +1 -0
  362. package/dist/utils/logger.d.ts +42 -5
  363. package/dist/utils/logger.d.ts.map +1 -1
  364. package/dist/utils/logger.js +53 -7
  365. package/dist/utils/logger.js.map +1 -1
  366. package/dist/utils/mod.d.ts +6 -1
  367. package/dist/utils/mod.d.ts.map +1 -1
  368. package/dist/utils/mod.js +5 -1
  369. package/dist/utils/mod.js.map +1 -1
  370. package/dist/utils/outboundTopicAliasManager.d.ts +52 -0
  371. package/dist/utils/outboundTopicAliasManager.d.ts.map +1 -0
  372. package/dist/utils/outboundTopicAliasManager.js +74 -0
  373. package/dist/utils/outboundTopicAliasManager.js.map +1 -0
  374. package/dist/utils/queue.d.ts.map +1 -1
  375. package/dist/utils/topicFilter.d.ts +32 -0
  376. package/dist/utils/topicFilter.d.ts.map +1 -0
  377. package/dist/utils/topicFilter.js +52 -0
  378. package/dist/utils/topicFilter.js.map +1 -0
  379. package/dist/utils/utils.d.ts +2 -0
  380. package/dist/utils/utils.d.ts.map +1 -1
  381. package/dist/utils/utils.js +2 -0
  382. package/dist/utils/utils.js.map +1 -1
  383. package/dist/utils/validators.d.ts +34 -0
  384. package/dist/utils/validators.d.ts.map +1 -0
  385. package/dist/utils/validators.js +61 -0
  386. package/dist/utils/validators.js.map +1 -0
  387. package/dist/web/webSocketStream.d.ts +29 -0
  388. package/dist/web/webSocketStream.d.ts.map +1 -0
  389. package/dist/web/webSocketStream.js +69 -0
  390. package/dist/web/webSocketStream.js.map +1 -0
  391. package/dist/web/wrapWebSocket.d.ts +12 -0
  392. package/dist/web/wrapWebSocket.d.ts.map +1 -0
  393. package/dist/web/wrapWebSocket.js +41 -0
  394. package/dist/web/wrapWebSocket.js.map +1 -0
  395. package/dist/web/wsClient.d.ts +14 -0
  396. package/dist/web/wsClient.d.ts.map +1 -0
  397. package/dist/web/wsClient.js +33 -0
  398. package/dist/web/wsClient.js.map +1 -0
  399. package/dist/web/wsClient.test.d.ts +2 -0
  400. package/dist/web/wsClient.test.d.ts.map +1 -0
  401. package/dist/web/wsClient.test.js +20 -0
  402. package/dist/web/wsClient.test.js.map +1 -0
  403. package/examples/authHandler.test.ts +164 -0
  404. package/examples/mqtt.test.ts +89 -0
  405. package/examples/mqtts.test.ts +100 -0
  406. package/examples/webSocket.test.ts +94 -0
  407. package/mqttConn/mqttConn.test.ts +9 -9
  408. package/mqttConn/mqttConn.ts +76 -60
  409. package/mqttPacket/AuthenticationResult.ts +6 -0
  410. package/mqttPacket/PacketType.ts +5 -0
  411. package/mqttPacket/Properties.ts +8 -5
  412. package/mqttPacket/ReasonCode.ts +8 -9
  413. package/mqttPacket/RetainHandling.ts +5 -0
  414. package/mqttPacket/auth.test.ts +1 -1
  415. package/mqttPacket/auth.ts +44 -51
  416. package/mqttPacket/codec.ts +147 -0
  417. package/mqttPacket/connack.ts +63 -73
  418. package/mqttPacket/connect.test.ts +2 -2
  419. package/mqttPacket/connect.ts +178 -192
  420. package/mqttPacket/decoder.test.ts +0 -39
  421. package/mqttPacket/decoder.ts +17 -46
  422. package/mqttPacket/disconnect.ts +60 -71
  423. package/mqttPacket/encoder.test.ts +2 -2
  424. package/mqttPacket/encoder.ts +13 -46
  425. package/mqttPacket/mod.ts +48 -204
  426. package/mqttPacket/pingreq.ts +22 -28
  427. package/mqttPacket/pingres.ts +22 -28
  428. package/mqttPacket/protocolLevels.ts +12 -7
  429. package/mqttPacket/pubblishAcks.ts +61 -75
  430. package/mqttPacket/publish.ts +70 -84
  431. package/mqttPacket/publishAcks.test.ts +3 -3
  432. package/mqttPacket/suback.ts +53 -68
  433. package/mqttPacket/subscribe.ts +146 -128
  434. package/mqttPacket/types.ts +2 -35
  435. package/mqttPacket/unsuback.ts +50 -61
  436. package/mqttPacket/unsubscribe.ts +77 -72
  437. package/mqttPacket/validators.ts +5 -31
  438. package/node/socket-node-stream.test.ts +322 -0
  439. package/node/socket-node-stream.ts +174 -0
  440. package/node/tcpClient.test.ts +70 -0
  441. package/node/tcpClient.ts +33 -17
  442. package/node/tcpServer.test.ts +24 -20
  443. package/node/tcpServer.ts +29 -6
  444. package/node/tlsServer.test.ts +94 -0
  445. package/node/tlsServer.ts +97 -0
  446. package/node/wrapNodeSocket.ts +7 -30
  447. package/package.json +72 -44
  448. package/persistence/basicPersistence.ts +495 -0
  449. package/persistence/deps.ts +11 -1
  450. package/persistence/memory/memoryPersistence.ts +12 -153
  451. package/persistence/memory/memoryStorage.ts +232 -0
  452. package/persistence/mod.ts +5 -10
  453. package/persistence/persistence.test.ts +24 -0
  454. package/persistence/persistence.testing.ts +1324 -0
  455. package/persistence/persistence.ts +112 -68
  456. package/persistence/sqlite/sqliteDatabase.ts +294 -0
  457. package/persistence/sqlite/sqlitePersistence.test.ts +48 -0
  458. package/persistence/sqlite/sqlitePersistence.ts +36 -0
  459. package/persistence/sqlite/sqliteStorage.ts +324 -0
  460. package/persistence/storage.ts +84 -0
  461. package/server/config.ts +65 -0
  462. package/server/context.ts +660 -76
  463. package/server/deps.ts +24 -5
  464. package/server/handlers/completeConnect.ts +93 -0
  465. package/server/handlers/duplicate.test.ts +196 -0
  466. package/server/handlers/handleAuth.test.ts +225 -0
  467. package/server/handlers/handleAuth.ts +88 -0
  468. package/server/handlers/handleConnect.test.ts +589 -0
  469. package/server/handlers/handleConnect.ts +201 -86
  470. package/server/handlers/handleConnect.version.test.ts +108 -0
  471. package/server/handlers/handleDisconnect.test.ts +56 -0
  472. package/server/handlers/handleDisconnect.ts +3 -3
  473. package/server/handlers/handlePacket.test.ts +24 -0
  474. package/server/handlers/handlePacket.ts +30 -8
  475. package/server/handlers/handlePingreq.test.ts +29 -0
  476. package/server/handlers/handlePuback.test.ts +28 -0
  477. package/server/handlers/handlePuback.ts +5 -8
  478. package/server/handlers/handlePubcomp.test.ts +28 -0
  479. package/server/handlers/handlePubcomp.ts +5 -4
  480. package/server/handlers/handlePublish.test.ts +471 -0
  481. package/server/handlers/handlePublish.ts +188 -35
  482. package/server/handlers/handlePubrec.test.ts +28 -0
  483. package/server/handlers/handlePubrec.ts +2 -3
  484. package/server/handlers/handlePubrel.test.ts +74 -0
  485. package/server/handlers/handlePubrel.ts +12 -2
  486. package/server/handlers/handleSubscribe.test.ts +971 -0
  487. package/server/handlers/handleSubscribe.ts +157 -39
  488. package/server/handlers/handleUnsubscribe.test.ts +79 -0
  489. package/server/handlers/handleUnsubscribe.ts +28 -4
  490. package/server/handlers/keepalive.test.ts +132 -0
  491. package/server/handlers/session.persistence.test.ts +194 -0
  492. package/server/handlers/will.delivery.test.ts +221 -0
  493. package/server/mod.ts +5 -4
  494. package/server/preconnect.test.ts +151 -0
  495. package/server/server.ts +117 -19
  496. package/socket/socket.test.ts +91 -0
  497. package/socket/socket.ts +85 -34
  498. package/timer/timer.test.ts +4 -7
  499. package/timer/timer.ts +36 -0
  500. package/tools/benchmarks/receiver.ts +51 -0
  501. package/tools/benchmarks/sender.ts +48 -0
  502. package/tools/benchmarks/utils.ts +31 -0
  503. package/tools/mqtt-compat/README.md +130 -0
  504. package/tools/mqtt-compat/broker.ts +52 -0
  505. package/tools/mqtt-compat/paho-mqtt4.test.ts +379 -0
  506. package/tools/mqtt-compat/paho-mqtt5.tests.ts +887 -0
  507. package/trie/trie.test.ts +9 -1
  508. package/trie/trie.ts +70 -45
  509. package/utils/bufferedAsyncIterable.test.ts +92 -0
  510. package/utils/deferred.test.ts +36 -0
  511. package/utils/deferred.ts +0 -1
  512. package/utils/getOrInsertPolyFill.ts +12 -0
  513. package/utils/logger.test.ts +189 -0
  514. package/utils/logger.ts +64 -9
  515. package/utils/mod.ts +15 -1
  516. package/utils/outboundTopicAliasManager.ts +100 -0
  517. package/utils/queue.test.ts +61 -0
  518. package/utils/topicFilter.test.ts +63 -0
  519. package/utils/topicFilter.ts +61 -0
  520. package/utils/utils.ts +3 -0
  521. package/utils/validators.ts +67 -0
  522. package/web/webSocketStream.ts +97 -0
  523. package/web/wrapWebSocket.ts +52 -0
  524. package/web/wsClient.test.ts +26 -0
  525. package/web/wsClient.ts +37 -0
  526. package/benchmarks/receiver.ts +0 -35
  527. package/benchmarks/sender.ts +0 -32
  528. package/benchmarks/utils.ts +0 -9
  529. package/dev_utils/dummyConn.ts +0 -110
  530. package/dev_utils/socketPair.ts +0 -85
  531. package/dist/persistence/store.d.ts +0 -14
  532. package/dist/persistence/store.d.ts.map +0 -1
  533. package/dist/persistence/store.js +0 -2
  534. package/dist/persistence/store.js.map +0 -1
  535. package/dist/utils/BufferedAsyncIterable.d.ts.map +0 -1
  536. package/dist/utils/BufferedAsyncIterable.js.map +0 -1
  537. package/examples/tcpServer.test.ts +0 -148
  538. package/persistence/memory/memoryPersistence.test.ts +0 -156
  539. package/persistence/store.ts +0 -16
  540. package/server/test/handleConnect.test.ts +0 -122
  541. package/server/test/test-handlers.ts +0 -53
  542. /package/utils/{BufferedAsyncIterable.ts → bufferedAsyncIterable.ts} +0 -0
@@ -1,110 +0,0 @@
1
- import type { BufferedAsyncIterable } from "../utils/mod.ts";
2
-
3
- class Uint8Writer implements WritableStreamDefaultWriter {
4
- private buff: Uint8Array;
5
- private pos: number;
6
- closed = Promise.resolve(undefined);
7
- close = () => Promise.resolve();
8
- abort = () => Promise.resolve();
9
- ready = Promise.resolve(undefined);
10
- releaseLock = () => {};
11
- desiredSize = 20;
12
-
13
- constructor(
14
- buff: Uint8Array,
15
- ) {
16
- this.buff = buff;
17
- this.pos = 0;
18
- }
19
- write(chunk: Uint8Array): Promise<void> {
20
- this.buff.set(chunk, this.pos);
21
- this.pos += chunk.length;
22
- return Promise.resolve();
23
- }
24
- }
25
-
26
- class Uint8QueuedWriter implements WritableStreamDefaultWriter {
27
- private queue: BufferedAsyncIterable<Uint8Array>;
28
- closed = Promise.resolve(undefined);
29
- close = () => Promise.resolve();
30
- abort = () => Promise.resolve();
31
- ready = Promise.resolve(undefined);
32
- releaseLock = () => {};
33
- desiredSize = 20;
34
-
35
- constructor(
36
- queue: BufferedAsyncIterable<Uint8Array>,
37
- ) {
38
- this.queue = queue;
39
- }
40
- write(chunk: Uint8Array): Promise<void> {
41
- this.queue.push(chunk);
42
- return Promise.resolve();
43
- }
44
- }
45
-
46
- function readableByteStreamFromArray(readerBuffs: Array<Uint8Array>) {
47
- let i = 0;
48
- return new ReadableStream({
49
- type: "bytes",
50
- pull(controller) {
51
- if (i === readerBuffs.length) {
52
- controller.close();
53
- controller.byobRequest?.respond(0);
54
- return;
55
- }
56
- controller.enqueue(readerBuffs[i++]);
57
- },
58
- });
59
- }
60
-
61
- function ReadableStreamFrom(
62
- iterable: AsyncIterable<Uint8Array>,
63
- ): ReadableStream {
64
- if (!iterable || !(Symbol.asyncIterator in iterable)) {
65
- throw new TypeError("Argument must be an asyncIterable");
66
- }
67
-
68
- return new ReadableStream({
69
- type: "bytes",
70
- async pull(controller) {
71
- const iterator = iterable[Symbol.asyncIterator]();
72
- const next = await iterator.next();
73
-
74
- if (next.done) {
75
- controller.close();
76
- controller.byobRequest?.respond(0);
77
- return;
78
- }
79
- controller.enqueue(next.value);
80
- },
81
- });
82
- }
83
-
84
- export function makeDummySockConn(
85
- readerBuffs: Uint8Array[],
86
- writerBuf: Uint8Array,
87
- close = () => {},
88
- ) {
89
- const readable = readableByteStreamFromArray(readerBuffs);
90
- const writable = new WritableStream(new Uint8Writer(writerBuf));
91
- return {
92
- readable,
93
- writable,
94
- close,
95
- };
96
- }
97
-
98
- export function makeDummyQueueSockConn(
99
- r: BufferedAsyncIterable<Uint8Array>,
100
- w: BufferedAsyncIterable<Uint8Array>,
101
- close = () => {},
102
- ) {
103
- const readable = ReadableStreamFrom(r);
104
- const writable = new WritableStream(new Uint8QueuedWriter(w));
105
- return {
106
- readable,
107
- writable,
108
- close,
109
- };
110
- }
@@ -1,85 +0,0 @@
1
- // web-socketpair.ts
2
-
3
- export interface WebSocketEndpoint {
4
- readable: ReadableStream<Uint8Array>;
5
- writable: WritableStream<Uint8Array>;
6
- close: () => void;
7
- }
8
-
9
- /**
10
- * Create two interconnected endpoints.
11
- * Writing to input.writable is readable from output.readable and vice versa.
12
- */
13
- export function createWebSocketPair(): {
14
- input: WebSocketEndpoint;
15
- output: WebSocketEndpoint;
16
- } {
17
- // Controllers are captured in start() so we can enqueue from the opposite side.
18
- let aController: ReadableByteStreamController;
19
- let bController: ReadableByteStreamController;
20
-
21
- const endpointAReadable = new ReadableStream<Uint8Array>({
22
- type: "bytes",
23
- start(controller) {
24
- aController = controller as ReadableByteStreamController;
25
- },
26
- });
27
-
28
- const endpointBReadable = new ReadableStream<Uint8Array>({
29
- type: "bytes",
30
- start(controller) {
31
- bController = controller as ReadableByteStreamController;
32
- },
33
- });
34
-
35
- const endpointAWritable = new WritableStream<Uint8Array>({
36
- write(chunk) {
37
- // Data written by A becomes readable by B
38
- if (chunk.byteLength > 0) {
39
- bController.enqueue(chunk);
40
- }
41
- },
42
- close() {
43
- bController.close();
44
- },
45
- abort(reason) {
46
- bController.error(reason);
47
- },
48
- });
49
-
50
- const endpointBWritable = new WritableStream<Uint8Array>({
51
- write(chunk) {
52
- // Data written by B becomes readable by A
53
- if (chunk.byteLength > 0) {
54
- aController.enqueue(chunk);
55
- }
56
- },
57
- close() {
58
- aController.close();
59
- },
60
- abort(reason) {
61
- aController.error(reason);
62
- },
63
- });
64
-
65
- return {
66
- input: {
67
- readable: endpointAReadable,
68
- writable: endpointAWritable,
69
- close: () => {
70
- if (!endpointAWritable.locked) {
71
- endpointAWritable.abort();
72
- }
73
- },
74
- },
75
- output: {
76
- readable: endpointBReadable,
77
- writable: endpointBWritable,
78
- close: () => {
79
- if (!endpointBWritable.locked) {
80
- endpointBWritable.abort();
81
- }
82
- },
83
- },
84
- };
85
- }
@@ -1,14 +0,0 @@
1
- import type { ClientId, PacketId, PublishPacket, QoS, Topic } from "./deps.ts";
2
- export type PacketStore = Map<PacketId, PublishPacket>;
3
- export type PacketIdStore = Set<PacketId>;
4
- export type SubscriptionStore = Map<Topic, QoS>;
5
- export interface IStore {
6
- existingSession: boolean;
7
- clientId: ClientId;
8
- pendingIncoming: PacketIdStore;
9
- pendingOutgoing: PacketStore;
10
- pendingAckOutgoing: PacketIdStore;
11
- subscriptions: SubscriptionStore;
12
- nextId(): PacketId;
13
- }
14
- //# sourceMappingURL=store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../persistence/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAE/E,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACvD,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAEhD,MAAM,WAAW,MAAM;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,aAAa,CAAC;IAC/B,eAAe,EAAE,WAAW,CAAC;IAC7B,kBAAkB,EAAE,aAAa,CAAC;IAClC,aAAa,EAAE,iBAAiB,CAAC;IACjC,MAAM,IAAI,QAAQ,CAAC;CACpB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../persistence/store.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BufferedAsyncIterable.d.ts","sourceRoot":"","sources":["../../utils/BufferedAsyncIterable.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,qBAAa,qBAAqB,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;;IAC/D,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,IAAI,CAAS;gBAIT,UAAU,GAAE,MAAa;IAK9B,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC;IAM1E,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAYtB,KAAK,CAAC,MAAM,SAAW,GAAG,IAAI;IAO9B,QAAQ,CAAC,IAAI,GAAI,MAAM,CAAC,KAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB7C;IAEF,IAAI,MAAM,IAAI,OAAO,CAEpB;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BufferedAsyncIterable.js","sourceRoot":"","sources":["../../utils/BufferedAsyncIterable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,qBAAqB;IACxB,MAAM,CAAgB;IACtB,UAAU,CAAS;IAEnB,IAAI,GAAG,KAAK,CAAC;IAErB,KAAK,CAA2B;IAEhC,YAAY,aAAqB,IAAI;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI;QACF,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAG,CAAC;QAChC,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,EAAK,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,GAAG,QAAQ;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEQ,IAAI,GAAG,CAAC,IAAO,EAAwB,EAAE;QAChD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACzC,8EAA8E;YAC9E,6EAA6E;YAC7E,6EAA6E;YAC7E,2EAA2E;YAC3E,+EAA+E;YAC/E,oCAAoC;YACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -1,148 +0,0 @@
1
- import { test } from "node:test";
2
- import assert from "node:assert/strict";
3
- import { TcpClient } from "@seriousme/opifex/tcpClient";
4
- import { TcpServer } from "@seriousme/opifex/tcpServer";
5
- import { logger, LogLevel } from "@seriousme/opifex/utils";
6
- import type { PublishPacket, QoS } from "@seriousme/opifex/mqttPacket";
7
-
8
- logger.level(LogLevel.info);
9
- export function sleep(ms: number): Promise<unknown> {
10
- return new Promise((r) => setTimeout(r, ms));
11
- }
12
-
13
- test("Test pubSub using client and server", async function () {
14
- const server = new TcpServer({ port: 0 }, {});
15
- server.start();
16
-
17
- assert.deepStrictEqual(
18
- server.port !== undefined,
19
- true,
20
- "server runs a a random port",
21
- );
22
- logger.verbose({ port: server.port, address: server.address });
23
-
24
- const params = {
25
- url: new URL(`mqtt://${server.address}:${server.port}`),
26
- numberOfRetries: 0,
27
- };
28
-
29
- const client = new TcpClient();
30
-
31
- await client.connect(params);
32
- assert(true, "Client connected to server");
33
-
34
- const publishSet: { topic: string; qos: QoS }[] = [
35
- { topic: "t0@q0", qos: 0 },
36
- { topic: "t1@q0", qos: 0 },
37
- { topic: "t2@q0", qos: 0 },
38
- { topic: "t0@q1", qos: 1 },
39
- { topic: "t1@q1", qos: 1 },
40
- { topic: "t2@q1", qos: 1 },
41
- { topic: "t0@q2", qos: 2 },
42
- { topic: "t1@q2", qos: 2 },
43
- { topic: "t2@q2", qos: 2 },
44
- ];
45
-
46
- const subscriptions = publishSet.map((item) => ({
47
- topicFilter: item.topic,
48
- qos: item.qos,
49
- }));
50
- await client.subscribe({
51
- subscriptions,
52
- });
53
-
54
- // the IIFE ensures message reception runs in parallel
55
- logger.verbose(`Start receiving`);
56
- const received: PublishPacket[] = [];
57
- (async function () {
58
- for await (const item of client.messages()) {
59
- logger.verbose(`Receiving: ${item.topic} -- ${item.qos}`);
60
- received.push(item);
61
- }
62
- })();
63
- // end of IIFE
64
- for (const item of publishSet) {
65
- logger.verbose(`Publishing: ${item.topic} -- ${item.qos}`);
66
- await client.publish({
67
- topic: item.topic,
68
- qos: item.qos,
69
- payload: new Uint8Array([0x01]),
70
- });
71
- }
72
-
73
- await sleep(100);
74
- logger.verbose(`Disconnect client`);
75
- await client.disconnect();
76
-
77
- logger.verbose(`Check completeness`);
78
- for (const item of publishSet) {
79
- const found = received.find((f) =>
80
- f.topic == item.topic && f.qos === item.qos
81
- );
82
- logger.verbose(`Found: ${item.topic} -- ${item.qos}`);
83
- assert(found, `${item.topic} -- ${item.qos}`);
84
- }
85
-
86
- logger.verbose(`Stop server`);
87
- server.stop();
88
- });
89
-
90
- test("Test subscription persistence after reconnect", async function () {
91
- // Start server
92
- const server = new TcpServer({ port: 0 }, {});
93
- server.start();
94
-
95
- const params = {
96
- url: new URL(`mqtt://${server.address}:${server.port}`),
97
- numberOfRetries: 0,
98
- };
99
-
100
- const client = new TcpClient();
101
- const testTopic = "test/topic";
102
- const received: PublishPacket[] = [];
103
-
104
- // First connection and subscription
105
- await client.connect(params);
106
- await client.subscribe({
107
- subscriptions: [{
108
- topicFilter: testTopic,
109
- qos: 0,
110
- }],
111
- });
112
-
113
- // Start receiving messages
114
- (async function () {
115
- for await (const item of client.messages()) {
116
- received.push(item);
117
- }
118
- })();
119
-
120
- // Disconnect client
121
- await client.disconnect();
122
- await sleep(100);
123
-
124
- // Reconnect client
125
- await client.connect(params);
126
- await sleep(100);
127
-
128
- // Publish test message
129
- await client.publish({
130
- topic: testTopic,
131
- qos: 0,
132
- payload: new Uint8Array([0x01]),
133
- });
134
-
135
- await sleep(100);
136
- logger.verbose(`Disconnect client`);
137
- await client.disconnect();
138
-
139
- // Verify message was received
140
- assert.equal(received.length, 1, "Should receive one message");
141
- assert.equal(
142
- received[0].topic,
143
- testTopic,
144
- "Should receive message on subscribed topic",
145
- );
146
-
147
- server.stop();
148
- });
@@ -1,156 +0,0 @@
1
- import {
2
- MemoryPersistence as Persistence,
3
- MemoryStore as Store,
4
- } from "./memoryPersistence.ts";
5
-
6
- import assert from "node:assert/strict";
7
- import { test } from "node:test";
8
- import { MQTTLevel, PacketType } from "../deps.ts";
9
- import type { PublishPacket } from "../deps.ts";
10
-
11
- const payloadAny = new TextEncoder().encode("any");
12
- const qos = 1;
13
-
14
- function delay(ms: number): Promise<unknown> {
15
- return new Promise((resolve) => setTimeout(resolve, ms));
16
- }
17
-
18
- test("new should create new Persistence object", () => {
19
- const persistence = new Persistence();
20
- assert.deepStrictEqual(typeof persistence, "object");
21
- assert.deepStrictEqual(persistence instanceof Persistence, true);
22
- });
23
-
24
- test(
25
- "Registering a client should register the client and return a Store Object",
26
- () => {
27
- const persistence = new Persistence();
28
- const clientId = "myClient";
29
- const client = persistence.registerClient(clientId, () => {}, false);
30
- assert.deepStrictEqual(persistence.clientList.has(clientId), true);
31
- assert.deepStrictEqual(typeof client, "object");
32
- assert.deepStrictEqual(client instanceof Store, true);
33
- assert.deepStrictEqual(client.existingSession, false);
34
- },
35
- );
36
-
37
- test("pub/sub should work", async () => {
38
- const persistence = new Persistence();
39
- const clientId = "myClient";
40
- const topic = "/myTopic";
41
- const publishPacket: PublishPacket = {
42
- type: PacketType.publish,
43
- protocolLevel: MQTTLevel.v4,
44
- id: 1,
45
- topic,
46
- payload: payloadAny,
47
- };
48
-
49
- function makePacket(id: number | undefined) {
50
- publishPacket.id = id;
51
- return publishPacket;
52
- }
53
- const seen = new Set();
54
-
55
- function handler(packet: PublishPacket): void {
56
- seen.add(packet.id);
57
- }
58
-
59
- const store = persistence.registerClient(clientId, handler, false);
60
-
61
- persistence.subscribe(store, topic, qos);
62
- assert.deepStrictEqual(
63
- store.subscriptions.has(topic),
64
- true,
65
- "topic is registered as subscription",
66
- );
67
- persistence.publish(topic, makePacket(25));
68
- persistence.publish(topic, makePacket(27));
69
- persistence.publish(topic, makePacket(undefined));
70
- persistence.publish("noTopic", makePacket(undefined));
71
- await delay(10);
72
- assert.deepStrictEqual(seen.size, 3, `received ${seen.size} messages`);
73
- });
74
-
75
- test("many packets should work", async () => {
76
- const persistence = new Persistence();
77
- const clientId = "myClient";
78
- const topic = "/myTopic";
79
- const numMessages = 1000;
80
- const publishPacket: PublishPacket = {
81
- type: PacketType.publish,
82
- protocolLevel: MQTTLevel.v4,
83
- id: 1,
84
- topic,
85
- payload: payloadAny,
86
- };
87
-
88
- function makePacket(id: number | undefined) {
89
- const newPacket = Object.assign({}, publishPacket);
90
- newPacket.id = id;
91
- return newPacket;
92
- }
93
- const seen = new Set();
94
-
95
- function handler(packet: PublishPacket): void {
96
- assert.deepStrictEqual(
97
- seen.has(packet.id),
98
- false,
99
- `Not seen ${packet.id} before`,
100
- );
101
- seen.add(packet.id);
102
- }
103
-
104
- const store = persistence.registerClient(clientId, handler, false);
105
-
106
- persistence.subscribe(store, topic, qos);
107
- assert.deepStrictEqual(
108
- store.subscriptions.has(topic),
109
- true,
110
- "topic is registered as subscription",
111
- );
112
- for (let i = 0; i < numMessages; i++) {
113
- persistence.publish(topic, makePacket(i));
114
- }
115
- await delay(10);
116
- assert.deepStrictEqual(
117
- seen.size,
118
- numMessages,
119
- `received all ${numMessages} messages`,
120
- );
121
- });
122
-
123
- test("unsubscribe should work", () => {
124
- const persistence = new Persistence();
125
- const clientId = "myClient";
126
- const topic = "/myTopic";
127
- const publishPacket: PublishPacket = {
128
- type: PacketType.publish,
129
- protocolLevel: MQTTLevel.v4,
130
- id: 1,
131
- topic,
132
- payload: payloadAny,
133
- };
134
-
135
- const seen = new Set();
136
- function handler(packet: PublishPacket): void {
137
- assert.deepStrictEqual(
138
- seen.has(packet.id),
139
- false,
140
- `Not seen ${packet.id} before`,
141
- );
142
- seen.add(packet.id);
143
- }
144
-
145
- const store = persistence.registerClient(clientId, handler, false);
146
- persistence.subscribe(store, topic, qos);
147
- persistence.unsubscribe(store, topic);
148
-
149
- assert.deepStrictEqual(
150
- store.subscriptions.has(topic),
151
- false,
152
- "topic is still registered as subscription after unsubscription",
153
- );
154
- persistence.publish(topic, publishPacket);
155
- assert.deepStrictEqual(seen.size, 0);
156
- });
@@ -1,16 +0,0 @@
1
- import type { ClientId, PacketId, PublishPacket, QoS, Topic } from "./deps.ts";
2
-
3
- export type PacketStore = Map<PacketId, PublishPacket>;
4
- export type PacketIdStore = Set<PacketId>;
5
-
6
- export type SubscriptionStore = Map<Topic, QoS>;
7
-
8
- export interface IStore {
9
- existingSession: boolean;
10
- clientId: ClientId;
11
- pendingIncoming: PacketIdStore;
12
- pendingOutgoing: PacketStore;
13
- pendingAckOutgoing: PacketIdStore;
14
- subscriptions: SubscriptionStore;
15
- nextId(): PacketId;
16
- }
@@ -1,122 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import { test } from "node:test";
3
- import { createWebSocketPair, resolveNextTick } from "../../dev_utils/mod.ts";
4
- import {
5
- type AnyPacket,
6
- AuthenticationResult,
7
- PacketType,
8
- } from "../../mqttPacket/mod.ts";
9
- import { MqttConn, MQTTLevel } from "../deps.ts";
10
- import { MqttServer } from "../mod.ts";
11
- import { handlers } from "./test-handlers.ts";
12
-
13
- const txtEncoder = new TextEncoder();
14
- // logger.level(LogLevel.debug);
15
-
16
- const connectPacket: AnyPacket = {
17
- type: PacketType.connect,
18
- protocolName: "MQTT",
19
- protocolLevel: 4,
20
- clientId: "testClient",
21
- clean: true,
22
- keepAlive: 0,
23
- username: "IoTester_1",
24
- password: txtEncoder.encode("strong_password"),
25
- will: undefined,
26
- };
27
-
28
- const disconnectPacket: AnyPacket = {
29
- type: PacketType.disconnect,
30
- protocolLevel: MQTTLevel.v4,
31
- };
32
-
33
- const mqttServer = new MqttServer({ handlers });
34
-
35
- function startServer(): {
36
- mqttConn: MqttConn;
37
- } {
38
- const { input, output } = createWebSocketPair();
39
- const mqttConn = new MqttConn({ conn: output });
40
- input.close = () => {
41
- mqttConn.close();
42
- };
43
- mqttServer.serve(input);
44
- return { mqttConn };
45
- }
46
-
47
- test("Authentication with valid username and password works", async () => {
48
- const { mqttConn } = startServer();
49
- mqttConn.send(connectPacket);
50
- const { value: connack } = await mqttConn.next();
51
- assert.deepStrictEqual(
52
- connack.type,
53
- PacketType.connack,
54
- "Expect Connack packet",
55
- );
56
- if (connack.type === PacketType.connack) {
57
- assert.deepStrictEqual(
58
- connack.returnCode,
59
- AuthenticationResult.ok,
60
- "Expected OK",
61
- );
62
- }
63
- mqttConn.send(disconnectPacket);
64
- await resolveNextTick();
65
- assert.deepStrictEqual(
66
- mqttConn.isClosed,
67
- true,
68
- "Expected connection to be closed",
69
- );
70
- });
71
-
72
- test("Authentication with invalid username fails", async () => {
73
- const newPacket = Object.assign({}, connectPacket);
74
- newPacket.username = "wrong";
75
- const { mqttConn } = startServer();
76
- mqttConn.send(newPacket);
77
- const { value: connack } = await mqttConn.next();
78
- assert.deepStrictEqual(
79
- connack.type,
80
- PacketType.connack,
81
- "Expected Connack packet",
82
- );
83
- if (connack.type === PacketType.connack) {
84
- assert.deepStrictEqual(
85
- connack.returnCode,
86
- AuthenticationResult.badUsernameOrPassword,
87
- "Expected badUsernameOrPassword",
88
- );
89
- }
90
- await resolveNextTick();
91
- assert.deepStrictEqual(
92
- mqttConn.isClosed,
93
- true,
94
- "Expected connection to be closed",
95
- );
96
- });
97
-
98
- test("Authentication with invalid password fails", async () => {
99
- const newPacket = Object.assign({}, connectPacket);
100
- newPacket.password = undefined;
101
- const { mqttConn } = startServer();
102
- mqttConn.send(newPacket);
103
- const { value: connack } = await mqttConn.next();
104
- assert.deepStrictEqual(
105
- connack.type,
106
- PacketType.connack,
107
- "Expected Connack packet",
108
- );
109
- if (connack.type === PacketType.connack) {
110
- assert.deepStrictEqual(
111
- connack.returnCode,
112
- AuthenticationResult.badUsernameOrPassword,
113
- "Expected badUsernameOrPassword",
114
- );
115
- }
116
- await resolveNextTick();
117
- assert.deepStrictEqual(
118
- mqttConn.isClosed,
119
- true,
120
- "Expected connection to be closed",
121
- );
122
- });