@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
@@ -0,0 +1,174 @@
1
+ import type { Duplex } from "node:stream";
2
+
3
+ export type SockAddr = NetAddr | UnixAddr | VsockAddr;
4
+ export interface NetAddr {
5
+ transport: "tcp" | "udp";
6
+ hostname: string;
7
+ port: number;
8
+ }
9
+ export interface UnixAddr {
10
+ transport: "unix" | "unixpacket";
11
+ path: string;
12
+ }
13
+ export interface VsockAddr {
14
+ transport: "vsock";
15
+ cid: number;
16
+ port: number;
17
+ }
18
+
19
+ export type SockConn = {
20
+ stream: Duplex;
21
+ close: () => void;
22
+ localAddr?: SockAddr;
23
+ remoteAddr?: SockAddr;
24
+ };
25
+
26
+ export class Conn {
27
+ private stream: Duplex;
28
+ private closed: boolean;
29
+ private closer: () => void;
30
+ public remoteAddr: SockAddr | undefined;
31
+ private leftover: Uint8Array = new Uint8Array(0);
32
+
33
+ // Store bound event listeners so we can cleanly remove them later
34
+ private onStreamClose = () => {
35
+ this.closed = true;
36
+ };
37
+ private onStreamError = () => {
38
+ this.closed = true;
39
+ };
40
+
41
+ constructor(sockConn: SockConn) {
42
+ this.stream = sockConn.stream;
43
+ this.closed = false;
44
+ this.closer = sockConn.close;
45
+ this.remoteAddr = sockConn.remoteAddr;
46
+
47
+ // Attach listeners to update internal state on stream termination
48
+ this.stream.on("close", this.onStreamClose);
49
+ this.stream.on("error", this.onStreamError);
50
+ }
51
+
52
+ async read(length: number): Promise<Uint8Array | null> {
53
+ if (this.closed || length < 0) {
54
+ return null;
55
+ }
56
+
57
+ if (length === 0) {
58
+ return new Uint8Array(0);
59
+ }
60
+
61
+ const result = new Uint8Array(length);
62
+ let bytesAccumulated = 0;
63
+
64
+ // 1. Process leftover data from the previous read operation
65
+ if (this.leftover.byteLength > 0) {
66
+ const take = Math.min(this.leftover.byteLength, length);
67
+ result.set(this.leftover.subarray(0, take), bytesAccumulated);
68
+ bytesAccumulated += take;
69
+ this.leftover = this.leftover.subarray(take);
70
+ }
71
+
72
+ // 2. Loop until the requested number of bytes is accumulated
73
+ while (bytesAccumulated < length) {
74
+ if (this.closed || !this.stream.readable) {
75
+ break;
76
+ }
77
+
78
+ const chunk = this.stream.read();
79
+ if (chunk === null) {
80
+ await new Promise<void>((resolve) => {
81
+ const cleanup = () => {
82
+ this.stream.off("readable", onEvent);
83
+ this.stream.off("end", onEvent);
84
+ this.stream.off("error", onEvent);
85
+ this.stream.off("close", onEvent);
86
+ };
87
+ const onEvent = () => {
88
+ cleanup();
89
+ resolve();
90
+ };
91
+
92
+ this.stream.on("readable", onEvent);
93
+ this.stream.on("end", onEvent);
94
+ this.stream.on("error", onEvent);
95
+ this.stream.on("close", onEvent);
96
+ });
97
+
98
+ continue;
99
+ }
100
+
101
+ // 3. Process the retrieved chunk
102
+ const chunkLength = chunk.byteLength;
103
+ const needed = length - bytesAccumulated;
104
+
105
+ if (chunkLength <= needed) {
106
+ result.set(chunk, bytesAccumulated);
107
+ bytesAccumulated += chunkLength;
108
+ } else {
109
+ result.set(chunk.subarray(0, needed), bytesAccumulated);
110
+ bytesAccumulated += needed;
111
+ this.leftover = chunk.subarray(needed);
112
+ }
113
+ }
114
+
115
+ if (bytesAccumulated < length) {
116
+ return null;
117
+ }
118
+
119
+ return result;
120
+ }
121
+
122
+ write(data: Uint8Array): Promise<number> {
123
+ if (this.closed || !this.stream.writable) {
124
+ return Promise.reject(new Error("Stream is closed or not writable"));
125
+ }
126
+
127
+ return new Promise((resolve, reject) => {
128
+ // 1. Fire the write command and catch any immediate/async errors via the callback
129
+ const canWriteMore = this.stream.write(data, (err) => {
130
+ if (err) {
131
+ reject(err);
132
+ }
133
+ });
134
+
135
+ // 2. Determine when to resolve based on the return value of write()
136
+ if (canWriteMore) {
137
+ // If the buffer is not full, we can resolve immediately
138
+ resolve(data.length);
139
+ } else {
140
+ // If backpressure is triggered, we must wait for the 'drain' event
141
+ this.stream.once("drain", () => {
142
+ resolve(data.length);
143
+ });
144
+ }
145
+ });
146
+ }
147
+
148
+ close() {
149
+ if (!this.closed) {
150
+ this.closed = true;
151
+
152
+ // Clean up permanent event listeners to prevent memory leaks
153
+ this.stream.off("close", this.onStreamClose);
154
+ this.stream.off("error", this.onStreamError);
155
+
156
+ // Safely destroy the stream first, then trigger the closer callback
157
+ try {
158
+ this.stream.destroy();
159
+ // deno-coverage-ignore
160
+ } catch (_) {
161
+ // Suppress stream destruction errors
162
+ // deno-coverage-ignore
163
+ }
164
+
165
+ try {
166
+ this.closer();
167
+ // deno-coverage-ignore
168
+ } catch (_) {
169
+ // Prevent closer failures from crashing the thread
170
+ // deno-coverage-ignore
171
+ }
172
+ }
173
+ }
174
+ }
@@ -0,0 +1,70 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtemp, rm, writeFile } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ import { getFileData, TcpClient } from "./tcpClient.ts";
7
+
8
+ // most client testing is already done in tcpServer.test.ts
9
+
10
+ test("Test getFileData - valid file, empty file and undefined", async () => {
11
+ // Create a unique temporary directory using native NodeJS path/fs utilities
12
+ const tempDir = await mkdtemp(join(tmpdir(), "mqtt-client-test-"));
13
+
14
+ const validFilePath = join(tempDir, "valid.txt");
15
+ const emptyFilePath = join(tempDir, "empty.txt");
16
+ const testContent = "Hello MQTT World!";
17
+
18
+ try {
19
+ // 1. Test with a valid file containing data
20
+ await writeFile(validFilePath, testContent, "utf-8");
21
+ const result = await getFileData(validFilePath);
22
+ assert.strictEqual(
23
+ result,
24
+ testContent,
25
+ "Should return the correct content of the file",
26
+ );
27
+
28
+ // 2. Test with an empty file
29
+ await writeFile(emptyFilePath, "", "utf-8");
30
+ const emptyResult = await getFileData(emptyFilePath);
31
+ assert.strictEqual(
32
+ emptyResult,
33
+ undefined,
34
+ "Should return undefined if the file is empty",
35
+ );
36
+ } finally {
37
+ // Clean up the temporary directory and all its contents
38
+ await rm(tempDir, { recursive: true, force: true });
39
+ }
40
+
41
+ // 3. Test with undefined filename
42
+ const undefinedResult = await getFileData(undefined);
43
+ assert.strictEqual(
44
+ undefinedResult,
45
+ undefined,
46
+ "Should return undefined immediately if filename is undefined",
47
+ );
48
+ });
49
+
50
+ test("Test createConn - unsupported protocol", async () => {
51
+ const client = new TcpClient();
52
+
53
+ // Use an unsupported protocol like 'ftp://' to trigger the throw in createConn
54
+ const invalidParams = {
55
+ url: new URL("ftp://localhost:1883"),
56
+ numberOfRetries: 0,
57
+ };
58
+
59
+ // Assert that connect rejects with the specific "Unsupported protocol" error
60
+ await assert.rejects(
61
+ async () => {
62
+ await client.connect(invalidParams);
63
+ },
64
+ {
65
+ name: "Error",
66
+ message: "Unsupported protocol: ftp:",
67
+ },
68
+ "Should throw an error when an unsupported protocol is provided",
69
+ );
70
+ });
package/node/tcpClient.ts CHANGED
@@ -12,7 +12,8 @@ import type { SockConn } from "../socket/socket.ts";
12
12
  import { wrapNodeSocket } from "./wrapNodeSocket.ts";
13
13
 
14
14
  /**
15
- * @function getFileData
15
+ * Fetches data from a file and returns it as a string
16
+ *
16
17
  * @param filename
17
18
  * @returns Promise
18
19
  *
@@ -20,7 +21,9 @@ import { wrapNodeSocket } from "./wrapNodeSocket.ts";
20
21
  * @example
21
22
  * const data = await getFileData("data.txt");
22
23
  */
23
- export async function getFileData(filename: string | undefined) {
24
+ export async function getFileData(
25
+ filename: string | undefined,
26
+ ): Promise<string | undefined> {
24
27
  if (!filename) {
25
28
  return;
26
29
  }
@@ -31,13 +34,16 @@ export async function getFileData(filename: string | undefined) {
31
34
  return data;
32
35
  }
33
36
 
34
- /*
35
- * TCPclient extends the Client class to provide TCP based clients
37
+ /**
38
+ * TcpClient extends the Client class to provide TCP based clients
36
39
  * it is used by the MQTTclient to connect to the broker
37
40
  * see mqtt.ts in the /bin folder as an example
38
41
  */
39
-
40
42
  export class TcpClient extends Client {
43
+ /** Connect using MQTT over TCP
44
+ * @param hostname the name of the host to connect to
45
+ * @param port the port number
46
+ */
41
47
  protected connectMQTT(hostname: string, port = 1883): Promise<SockConn> {
42
48
  logger.debug({ hostname, port });
43
49
  return new Promise((resolve, reject) => {
@@ -55,6 +61,15 @@ export class TcpClient extends Client {
55
61
  });
56
62
  }
57
63
 
64
+ /**
65
+ * Connect using MQTT over TLS
66
+ * @param hostname the name of the host to connect to
67
+ * @param port the port number
68
+ * @param caCerts the CA certificates to trust
69
+ * @param cert the clients certificate
70
+ * @param key the clients private key
71
+ * @returns a SockConn object
72
+ */
58
73
  protected connectMQTTS(
59
74
  hostname: string,
60
75
  port = 8883,
@@ -65,9 +80,10 @@ export class TcpClient extends Client {
65
80
  const opts = {
66
81
  host: hostname,
67
82
  port,
68
- secureContext: (ca || key || cert)
69
- ? tls.createSecureContext({ ca, cert, key })
70
- : undefined,
83
+ ca,
84
+ key,
85
+ cert,
86
+ minVersion: "TLSv1.3" as const,
71
87
  };
72
88
  logger.debug({ hostname, port, ca, cert });
73
89
  return new Promise((resolve, reject) => {
@@ -82,16 +98,16 @@ export class TcpClient extends Client {
82
98
  });
83
99
  }
84
100
 
85
- protected override createConn(
86
- protocol: string,
87
- hostname: string,
88
- port?: number,
89
- caCerts?: string[],
90
- ): Promise<SockConn> {
91
- // if you need to support alternative connection types just
92
- // overload this method in your subclass
101
+ /** createConn is used by the base client class */
102
+ protected override createConn(): Promise<SockConn> {
103
+ const { protocol, hostname, port: portStr } = this.connectUrl;
104
+ const port = Number(portStr);
105
+ const caCerts = this.caCerts;
106
+ const cert = this.cert;
107
+ const key = this.key;
108
+
93
109
  if (protocol === "mqtts:") {
94
- return this.connectMQTTS(hostname, port, caCerts);
110
+ return this.connectMQTTS(hostname, port, caCerts, cert, key);
95
111
  }
96
112
  if (protocol === "mqtt:") {
97
113
  return this.connectMQTT(hostname, port);
@@ -3,14 +3,12 @@ import assert from "node:assert/strict";
3
3
  import { TcpClient } from "./tcpClient.ts";
4
4
  import { TcpServer } from "./tcpServer.ts";
5
5
  import { logger, LogLevel } from "../utils/mod.ts";
6
- import type { PublishPacket, QoS } from "../mqttPacket/mod.ts";
6
+ import { delay } from "../dev_utils/mod.ts";
7
+ import type { ProtocolLevel, PublishPacket, QoS } from "../mqttPacket/mod.ts";
7
8
 
8
9
  logger.level(LogLevel.info);
9
- export function sleep(ms: number): Promise<unknown> {
10
- return new Promise((r) => setTimeout(r, ms));
11
- }
12
10
 
13
- test("Test pubSub using client and server", async function () {
11
+ test("Test pubSub using client and server", async () => {
14
12
  const server = new TcpServer({ port: 0 }, {});
15
13
  server.start();
16
14
 
@@ -52,17 +50,17 @@ test("Test pubSub using client and server", async function () {
52
50
  });
53
51
 
54
52
  // the IIFE ensures message reception runs in parallel
55
- logger.verbose(`Start receiving`);
53
+ logger.verbose("Start receiving");
56
54
  const received: PublishPacket[] = [];
57
- (async function () {
55
+ (async () => {
58
56
  for await (const item of client.messages()) {
59
- logger.verbose(`Receiving: ${item.topic} -- ${item.qos}`);
57
+ logger.verbose("Receiving:", item.topic, "--", item.qos);
60
58
  received.push(item);
61
59
  }
62
60
  })();
63
61
  // end of IIFE
64
62
  for (const item of publishSet) {
65
- logger.verbose(`Publishing: ${item.topic} -- ${item.qos}`);
63
+ logger.verbose("Publishing:", item.topic, "--", item.qos);
66
64
  await client.publish({
67
65
  topic: item.topic,
68
66
  qos: item.qos,
@@ -70,24 +68,24 @@ test("Test pubSub using client and server", async function () {
70
68
  });
71
69
  }
72
70
 
73
- await sleep(100);
74
- logger.verbose(`Disconnect client`);
71
+ await delay(100);
72
+ logger.verbose("Disconnect client");
75
73
  await client.disconnect();
76
74
 
77
- logger.verbose(`Check completeness`);
75
+ logger.verbose("Check completeness");
78
76
  for (const item of publishSet) {
79
77
  const found = received.find((f) =>
80
78
  f.topic == item.topic && f.qos === item.qos
81
79
  );
82
- logger.verbose(`Found: ${item.topic} -- ${item.qos}`);
80
+ logger.verbose("Found:", item.topic, "--", item.qos);
83
81
  assert(found, `${item.topic} -- ${item.qos}`);
84
82
  }
85
83
 
86
- logger.verbose(`Stop server`);
84
+ logger.verbose("Stop server");
87
85
  server.stop();
88
86
  });
89
87
 
90
- test("Test subscription persistence after reconnect", async function () {
88
+ test("Test subscription persistence after reconnect", async () => {
91
89
  // Start server
92
90
  const server = new TcpServer({ port: 0 }, {});
93
91
  server.start();
@@ -95,8 +93,14 @@ test("Test subscription persistence after reconnect", async function () {
95
93
  const params = {
96
94
  url: new URL(`mqtt://${server.address}:${server.port}`),
97
95
  numberOfRetries: 0,
96
+ options: {
97
+ protocolLevel: 4 as ProtocolLevel,
98
+ clean: false,
99
+ },
98
100
  };
99
101
 
102
+ logger.verbose("client parameters: ", params);
103
+
100
104
  const client = new TcpClient();
101
105
  const testTopic = "test/topic";
102
106
  const received: PublishPacket[] = [];
@@ -111,7 +115,7 @@ test("Test subscription persistence after reconnect", async function () {
111
115
  });
112
116
 
113
117
  // Start receiving messages
114
- (async function () {
118
+ (async () => {
115
119
  for await (const item of client.messages()) {
116
120
  received.push(item);
117
121
  }
@@ -119,11 +123,11 @@ test("Test subscription persistence after reconnect", async function () {
119
123
 
120
124
  // Disconnect client
121
125
  await client.disconnect();
122
- await sleep(100);
126
+ await delay(100);
123
127
 
124
128
  // Reconnect client
125
129
  await client.connect(params);
126
- await sleep(100);
130
+ await delay(100);
127
131
 
128
132
  // Publish test message
129
133
  await client.publish({
@@ -132,8 +136,8 @@ test("Test subscription persistence after reconnect", async function () {
132
136
  payload: new Uint8Array([0x01]),
133
137
  });
134
138
 
135
- await sleep(100);
136
- logger.verbose(`Disconnect client`);
139
+ await delay(100);
140
+ logger.verbose("Disconnect client");
137
141
  await client.disconnect();
138
142
 
139
143
  // Verify message was received
package/node/tcpServer.ts CHANGED
@@ -14,19 +14,26 @@ type ServerOptions = {
14
14
  port?: number;
15
15
  };
16
16
 
17
- /*
18
- * TCP server that wraps a MqttServer, see demoServer.ts in the /bin folder
17
+ /**
18
+ * TCP server that wraps a MqttServer, see the /examples folder
19
19
  */
20
20
  export class TcpServer {
21
21
  private mqttServer: MqttServer;
22
22
  private server?: Server;
23
23
  private serverOptions;
24
+
25
+ /**
26
+ * Create a new TCP server
27
+ */
24
28
  constructor(serverOptions: ServerOptions, mqttOptions: MqttServerOptions) {
25
29
  this.mqttServer = new MqttServer(mqttOptions);
26
30
  this.serverOptions = serverOptions;
27
31
  }
28
32
 
29
- async start() {
33
+ /**
34
+ * Start listening
35
+ */
36
+ async start(): Promise<void> {
30
37
  this.server = createServer((sock) =>
31
38
  this.mqttServer.serve(wrapNodeSocket(sock))
32
39
  );
@@ -39,22 +46,37 @@ export class TcpServer {
39
46
  await isListening;
40
47
  return;
41
48
  }
42
- stop() {
49
+
50
+ /**
51
+ * Stop listening
52
+ */
53
+ stop(): void {
54
+ this.mqttServer.close();
43
55
  this.server?.close();
44
56
  }
45
57
 
46
- get port() {
58
+ /**
59
+ * The port number the server is listening on
60
+ */
61
+ get port(): number | undefined {
47
62
  const address = this.server?.address();
63
+ // deno-coverage-ignore-start
48
64
  if (typeof address === "object" && address !== null) {
49
65
  return address?.port;
50
66
  }
51
67
  return this.serverOptions?.port;
68
+ // deno-coverage-ignore-stop
52
69
  }
53
70
 
54
- get address() {
71
+ /**
72
+ * The address the server is listening on
73
+ */
74
+ get address(): string | undefined {
55
75
  const addressResult = this.server?.address();
76
+ // deno-coverage-ignore-start
56
77
  if (typeof addressResult === "object") {
57
78
  const address = addressResult?.address;
79
+
58
80
  if (address === "::") {
59
81
  return "localhost";
60
82
  }
@@ -65,4 +87,5 @@ export class TcpServer {
65
87
  }
66
88
  return addressResult;
67
89
  }
90
+ // deno-coverage-ignore-stop
68
91
  }
@@ -0,0 +1,94 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { TcpClient } from "./tcpClient.ts";
4
+ import { TlsServer } from "./tlsServer.ts";
5
+ import { logger, LogLevel } from "../utils/mod.ts";
6
+ import type { PublishPacket, QoS } from "../mqttPacket/mod.ts";
7
+ import { delay, generateLocalhostCerts } from "../dev_utils/mod.ts";
8
+
9
+ logger.level(LogLevel.info);
10
+
11
+ const { key, cert, caCert } = generateLocalhostCerts();
12
+
13
+ test("Test pubSub using client and server", async () => {
14
+ const server = new TlsServer({ port: 0, key, cert }, {});
15
+ server.start();
16
+
17
+ assert.deepStrictEqual(
18
+ server.port !== undefined,
19
+ true,
20
+ "server runs a a random port",
21
+ );
22
+ logger.verbose("server running on: ", {
23
+ port: server.port,
24
+ address: server.address,
25
+ });
26
+
27
+ const params = {
28
+ url: new URL(`mqtts://${server.address}:${server.port}`),
29
+ numberOfRetries: 0,
30
+ caCerts: [caCert],
31
+ };
32
+
33
+ logger.verbose("client parameters: ", params);
34
+
35
+ const client = new TcpClient();
36
+
37
+ await client.connect(params);
38
+ assert(true, "Client connected to server");
39
+
40
+ const publishSet: { topic: string; qos: QoS }[] = [
41
+ { topic: "t0@q0", qos: 0 },
42
+ { topic: "t1@q0", qos: 0 },
43
+ { topic: "t2@q0", qos: 0 },
44
+ { topic: "t0@q1", qos: 1 },
45
+ { topic: "t1@q1", qos: 1 },
46
+ { topic: "t2@q1", qos: 1 },
47
+ { topic: "t0@q2", qos: 2 },
48
+ { topic: "t1@q2", qos: 2 },
49
+ { topic: "t2@q2", qos: 2 },
50
+ ];
51
+
52
+ const subscriptions = publishSet.map((item) => ({
53
+ topicFilter: item.topic,
54
+ qos: item.qos,
55
+ }));
56
+ await client.subscribe({
57
+ subscriptions,
58
+ });
59
+
60
+ // the IIFE ensures message reception runs in parallel
61
+ logger.verbose("Start receiving");
62
+ const received: PublishPacket[] = [];
63
+ (async () => {
64
+ for await (const item of client.messages()) {
65
+ logger.verbose("Receiving:", item.topic, "--", item.qos);
66
+ received.push(item);
67
+ }
68
+ })();
69
+ // end of IIFE
70
+ for (const item of publishSet) {
71
+ logger.verbose("Publishing:", item.topic, "--", item.qos);
72
+ await client.publish({
73
+ topic: item.topic,
74
+ qos: item.qos,
75
+ payload: new Uint8Array([0x01]),
76
+ });
77
+ }
78
+
79
+ await delay(100);
80
+ logger.verbose("Disconnect client");
81
+ await client.disconnect();
82
+
83
+ logger.verbose("Check completeness");
84
+ for (const item of publishSet) {
85
+ const found = received.find((f) =>
86
+ f.topic == item.topic && f.qos === item.qos
87
+ );
88
+ logger.verbose("Found:", item.topic, "--", item.qos);
89
+ assert(found, `${item.topic} -- ${item.qos}`);
90
+ }
91
+
92
+ logger.verbose("Stop server");
93
+ server.stop();
94
+ });