@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,122 @@
1
+ import assert from "node:assert/strict";
2
+ import { test } from "node:test";
3
+ import { handleSuback } from "./handleSuback.ts";
4
+ import { PacketType } from "../deps.ts";
5
+ import type { SubackPacket } from "../deps.ts";
6
+
7
+ function createMockContext() {
8
+ const receivedSubacks: Array<{ id: number; returnCodes: number[] }> = [];
9
+ return {
10
+ protocolLevel: 4 as const,
11
+ store: {
12
+ pendingOutgoing: new Map<number, unknown>(),
13
+ pendingIncoming: new Map(),
14
+ pendingAckOutgoing: new Map(),
15
+ },
16
+ receiveSuback: (id: number, returnCodes: number[]) => {
17
+ receivedSubacks.push({ id, returnCodes });
18
+ return true;
19
+ },
20
+ receivedSubacks,
21
+ };
22
+ }
23
+
24
+ test("handleSuback removes from pending and notifies context", () => {
25
+ const ctx = createMockContext();
26
+ ctx.store.pendingOutgoing.set(1, { type: PacketType.subscribe, id: 1 });
27
+
28
+ const packet = {
29
+ type: PacketType.suback,
30
+ protocolLevel: 4 as const,
31
+ id: 1,
32
+ returnCodes: [0],
33
+ } as SubackPacket;
34
+
35
+ handleSuback(ctx as never, packet);
36
+
37
+ assert.deepStrictEqual(
38
+ ctx.store.pendingOutgoing.has(1),
39
+ false,
40
+ "Should remove from pending",
41
+ );
42
+ assert.deepStrictEqual(
43
+ ctx.receivedSubacks.length,
44
+ 1,
45
+ "Should notify context",
46
+ );
47
+ assert.deepStrictEqual(
48
+ ctx.receivedSubacks[0].id,
49
+ 1,
50
+ "Should have correct ID",
51
+ );
52
+ assert.deepStrictEqual(
53
+ ctx.receivedSubacks[0].returnCodes,
54
+ [0],
55
+ "Should pass return codes",
56
+ );
57
+ });
58
+
59
+ test("handleSuback handles multiple return codes", () => {
60
+ const ctx = createMockContext();
61
+ ctx.store.pendingOutgoing.set(2, { type: PacketType.subscribe, id: 2 });
62
+
63
+ const packet = {
64
+ type: PacketType.suback,
65
+ protocolLevel: 4 as const,
66
+ id: 2,
67
+ returnCodes: [0, 1, 2],
68
+ } as SubackPacket;
69
+
70
+ handleSuback(ctx as never, packet);
71
+
72
+ assert.deepStrictEqual(
73
+ ctx.receivedSubacks[0].returnCodes,
74
+ [0, 1, 2],
75
+ );
76
+ });
77
+
78
+ test("handleSuback handles subscription failure code", () => {
79
+ const ctx = createMockContext();
80
+ ctx.store.pendingOutgoing.set(3, { type: PacketType.subscribe, id: 3 });
81
+
82
+ const SUBSCRIPTION_FAILURE = 0x80;
83
+ const packet = {
84
+ type: PacketType.suback,
85
+ protocolLevel: 4 as const,
86
+ id: 3,
87
+ returnCodes: [0, SUBSCRIPTION_FAILURE],
88
+ } as SubackPacket;
89
+
90
+ handleSuback(ctx as never, packet);
91
+
92
+ assert.deepStrictEqual(
93
+ ctx.receivedSubacks[0].returnCodes,
94
+ [0, SUBSCRIPTION_FAILURE],
95
+ );
96
+ });
97
+
98
+ test("handleSuback handles notification for MQTT v5", () => {
99
+ const ctx = createMockContext();
100
+ ctx.store.pendingOutgoing.set(4, { type: PacketType.subscribe, id: 4 });
101
+
102
+ const packet = {
103
+ type: PacketType.suback,
104
+ protocolLevel: 5 as const,
105
+ id: 4,
106
+ reasonCodes: [0],
107
+ } as SubackPacket;
108
+
109
+ handleSuback(ctx as never, packet);
110
+
111
+ assert.deepStrictEqual(
112
+ ctx.store.pendingOutgoing.has(4),
113
+ false,
114
+ "Should remove from pending",
115
+ );
116
+
117
+ assert.deepStrictEqual(
118
+ ctx.receivedSubacks.length,
119
+ 1,
120
+ "Should notify for v5",
121
+ );
122
+ });
@@ -9,11 +9,14 @@ import type { SubackPacket } from "../deps.ts";
9
9
  * - Processes SUBACK packets sent by server to confirm SUBSCRIBE requests
10
10
  * - Removes the packet ID from pending outgoing messages
11
11
  * - Notifies the client about granted QoS levels for each subscription
12
+ * - in V5 the reason codes could carry various errors
12
13
  */
13
14
  export function handleSuback(ctx: Context, packet: SubackPacket): void {
14
15
  const id = packet.id;
15
16
  ctx.store.pendingOutgoing.delete(id);
16
17
  if (packet.protocolLevel !== 5) {
17
18
  ctx.receiveSuback(id, packet.returnCodes);
19
+ return;
18
20
  }
21
+ ctx.receiveSuback(id, packet.reasonCodes);
19
22
  }
@@ -0,0 +1,101 @@
1
+ import assert from "node:assert/strict";
2
+ import { test } from "node:test";
3
+ import { handleUnsuback } from "./handleUnsuback.ts";
4
+ import { PacketType } from "../deps.ts";
5
+ import type { UnsubackPacket } from "../deps.ts";
6
+
7
+ function createMockContext() {
8
+ const receivedIds: number[] = [];
9
+ return {
10
+ protocolLevel: 4 as const,
11
+ store: {
12
+ pendingOutgoing: new Map<number, unknown>(),
13
+ pendingIncoming: new Map(),
14
+ pendingAckOutgoing: new Map(),
15
+ },
16
+ receiveUnsuback: (id: number) => {
17
+ receivedIds.push(id);
18
+ return true;
19
+ },
20
+ receivedIds,
21
+ };
22
+ }
23
+
24
+ test("handleUnsuback removes from pending and notifies context", () => {
25
+ const ctx = createMockContext();
26
+ ctx.store.pendingOutgoing.set(1, { type: PacketType.unsubscribe, id: 1 });
27
+
28
+ const packet = {
29
+ type: PacketType.unsuback,
30
+ protocolLevel: 4 as const,
31
+ id: 1,
32
+ } as UnsubackPacket;
33
+
34
+ handleUnsuback(ctx as never, packet);
35
+
36
+ assert.deepStrictEqual(
37
+ ctx.store.pendingOutgoing.has(1),
38
+ false,
39
+ "Should remove from pending",
40
+ );
41
+ assert.deepStrictEqual(
42
+ ctx.receivedIds,
43
+ [1],
44
+ "Should notify context of unsuback",
45
+ );
46
+ });
47
+
48
+ test("handleUnsuback handles non-existent packet ID gracefully", () => {
49
+ const ctx = createMockContext();
50
+
51
+ const packet = {
52
+ type: PacketType.unsuback,
53
+ protocolLevel: 4 as const,
54
+ id: 999,
55
+ } as UnsubackPacket;
56
+
57
+ // Should not throw
58
+ handleUnsuback(ctx as never, packet);
59
+
60
+ assert.deepStrictEqual(
61
+ ctx.receivedIds,
62
+ [999],
63
+ "Should still notify context",
64
+ );
65
+ });
66
+
67
+ test("handleUnsuback processes multiple UNSUBACKs correctly", () => {
68
+ const ctx = createMockContext();
69
+ ctx.store.pendingOutgoing.set(1, { type: PacketType.unsubscribe, id: 1 });
70
+ ctx.store.pendingOutgoing.set(2, { type: PacketType.unsubscribe, id: 2 });
71
+ ctx.store.pendingOutgoing.set(3, { type: PacketType.unsubscribe, id: 3 });
72
+
73
+ handleUnsuback(ctx as never, {
74
+ type: PacketType.unsuback,
75
+ protocolLevel: 4,
76
+ id: 2,
77
+ } as UnsubackPacket);
78
+
79
+ assert.deepStrictEqual(ctx.store.pendingOutgoing.has(1), true);
80
+ assert.deepStrictEqual(ctx.store.pendingOutgoing.has(2), false);
81
+ assert.deepStrictEqual(ctx.store.pendingOutgoing.has(3), true);
82
+ assert.deepStrictEqual(ctx.receivedIds, [2]);
83
+ });
84
+
85
+ test("handleUnsuback works with MQTT v5", () => {
86
+ const ctx = createMockContext();
87
+ ctx.store.pendingOutgoing.set(5, { type: PacketType.unsubscribe, id: 5 });
88
+
89
+ const packet = {
90
+ type: PacketType.unsuback,
91
+ protocolLevel: 5 as const,
92
+ id: 5,
93
+ reasonCodes: [0],
94
+ properties: {},
95
+ } as UnsubackPacket;
96
+
97
+ handleUnsuback(ctx as never, packet);
98
+
99
+ assert.deepStrictEqual(ctx.store.pendingOutgoing.has(5), false);
100
+ assert.deepStrictEqual(ctx.receivedIds, [5]);
101
+ });
package/client/mod.ts CHANGED
@@ -8,10 +8,21 @@ export {
8
8
  DEFAULT_PROTOCOLLEVEL,
9
9
  DEFAULT_URL,
10
10
  } from "./client.ts";
11
- export { MQTTLevel } from "./deps.ts";
12
- export type { ProtocolLevel, QoS } from "./deps.ts";
11
+ export { logger, MQTTLevel, ReasonCode } from "./deps.ts";
12
+ export type {
13
+ AuthenticationResult,
14
+ NetAddr,
15
+ ProtocolLevel,
16
+ QoS,
17
+ SockAddr,
18
+ SockConn,
19
+ UnixAddr,
20
+ VsockAddr,
21
+ } from "./deps.ts";
13
22
  export type {
14
23
  ConnectParameters,
15
24
  PublishParameters,
16
25
  SubscribeParameters,
17
26
  } from "./client.ts";
27
+
28
+ export type { ConnectionState } from "./ConnectionState.ts";
@@ -5,20 +5,21 @@
5
5
  import { assert } from "./deps.ts";
6
6
  import type { PacketId } from "./deps.ts";
7
7
 
8
- import {
9
- type IStore,
10
- maxPacketId,
11
- type PacketStore,
12
- type PendingAckOutgoing,
13
- type pendingIncoming,
14
- type PendingOutgoing,
15
- type PendingOutgoingPackets,
8
+ import { MAX_PACKET_ID } from "./store.ts";
9
+
10
+ import type {
11
+ PacketStore,
12
+ PendingAckOutgoing,
13
+ pendingIncoming,
14
+ PendingOutgoing,
15
+ PendingOutgoingPackets,
16
+ Store,
16
17
  } from "./store.ts";
17
18
 
18
19
  /**
19
- * In-memory implementation of the IStore interface for managing MQTT packet storage
20
+ * In-memory implementation of the Store interface for managing MQTT packet storage
20
21
  */
21
- export class MemoryStore implements IStore {
22
+ export class MemoryStore implements Store {
22
23
  /** Current packet ID counter */
23
24
  private packetId: PacketId;
24
25
 
@@ -50,7 +51,7 @@ export class MemoryStore implements IStore {
50
51
  const currentId = this.packetId;
51
52
  do {
52
53
  this.packetId++;
53
- if (this.packetId > maxPacketId) {
54
+ if (this.packetId > MAX_PACKET_ID) {
54
55
  this.packetId = 1;
55
56
  }
56
57
  } while (
@@ -12,7 +12,7 @@ import type {
12
12
  /**
13
13
  * Maximum value for MQTT packet IDs (65535)
14
14
  */
15
- export const maxPacketId = 0xffff;
15
+ export const MAX_PACKET_ID = 0xffff;
16
16
 
17
17
  /**
18
18
  * Generic type for storing MQTT packets by their packet ID
@@ -46,7 +46,7 @@ export type PendingOutgoingPackets = PendingAckOutgoing | PendingOutgoing;
46
46
  /**
47
47
  * Interface defining the storage requirements for MQTT packet state management
48
48
  */
49
- export interface IStore {
49
+ export interface Store {
50
50
  /** Store for incoming packets pending processing */
51
51
  pendingIncoming: PacketStore<pendingIncoming>;
52
52
 
@@ -65,4 +65,6 @@ export interface IStore {
65
65
  void,
66
66
  unknown
67
67
  >;
68
+ // generate the next packet ID, wrapping around at MAX_PACKET_ID
69
+ nextId(): PacketId;
68
70
  }
package/deno/README.md CHANGED
@@ -62,5 +62,4 @@ Opifex is also available on [JSR.io](https://jsr.io/@seriousme/opifex).
62
62
  # Platform Native
63
63
 
64
64
  This folder also contains code to run the server using Deno sockets instead of
65
- NodeJS sockets. You can modify the import statements in the demoServer/client to
66
- use these instead.
65
+ NodeJS sockets. It also contains an implementation that uses Websockets
@@ -0,0 +1,75 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { getFileData, TcpClient } from "./tcpClient.ts";
4
+
5
+ // most client testing is already done in tcpServer.test.ts
6
+
7
+ test("Deno: Test getFileData - valid file, empty file and undefined", async () => {
8
+ // 1. Test with a valid file containing data
9
+ const tempFile = await Deno.makeTempFile({
10
+ prefix: "test_get_file_data_",
11
+ suffix: ".txt",
12
+ });
13
+ const testContent = "Hello MQTT World!";
14
+
15
+ try {
16
+ await Deno.writeTextFile(tempFile, testContent);
17
+
18
+ const result = await getFileData(tempFile);
19
+ assert.strictEqual(
20
+ result,
21
+ testContent,
22
+ "Should return the correct content of the file",
23
+ );
24
+
25
+ // 2. Test with an empty file
26
+ const emptyTempFile = await Deno.makeTempFile({
27
+ prefix: "test_empty_",
28
+ suffix: ".txt",
29
+ });
30
+ try {
31
+ const emptyResult = await getFileData(emptyTempFile);
32
+ assert.strictEqual(
33
+ emptyResult,
34
+ undefined,
35
+ "Should return undefined if the file is empty",
36
+ );
37
+ } finally {
38
+ // Clean up the empty temporary file
39
+ await Deno.remove(emptyTempFile);
40
+ }
41
+ } finally {
42
+ // Clean up the valid temporary file even if assertions fail
43
+ await Deno.remove(tempFile);
44
+ }
45
+
46
+ // 3. Test with undefined filename
47
+ const undefinedResult = await getFileData(undefined);
48
+ assert.strictEqual(
49
+ undefinedResult,
50
+ undefined,
51
+ "Should return undefined immediately if filename is undefined",
52
+ );
53
+ });
54
+
55
+ test("Test createConn - unsupported protocol", async () => {
56
+ const client = new TcpClient();
57
+
58
+ // Use an unsupported protocol like 'ftp://' to trigger the throw in createConn
59
+ const invalidParams = {
60
+ url: new URL("ftp://localhost:1883"),
61
+ numberOfRetries: 0,
62
+ };
63
+
64
+ // Assert that connect rejects with the specific "Unsupported protocol" error
65
+ await assert.rejects(
66
+ async () => {
67
+ await client.connect(invalidParams);
68
+ },
69
+ {
70
+ name: "Error",
71
+ message: "Unsupported protocol: ftp:",
72
+ },
73
+ "Should throw an error when an unsupported protocol is provided",
74
+ );
75
+ });
package/deno/tcpClient.ts CHANGED
@@ -3,16 +3,16 @@
3
3
  * it extends the platform agnostic Client class
4
4
  * @module
5
5
  */
6
- import { Client } from "../client/client.ts";
7
- import { logger } from "../client/deps.ts";
8
- import type { SockConn } from "../client/deps.ts";
6
+
7
+ import { Client, logger } from "../client/mod.ts";
8
+ import type { SockConn } from "../client/mod.ts";
9
9
 
10
10
  /**
11
- * @function getFileData
11
+ * Fetches data from a file and returns it as a string
12
+ *
12
13
  * @param filename
13
14
  * @returns Promise
14
15
  *
15
- * Fetches data from a file and returns it as a string
16
16
  * @example
17
17
  * const data = await getFileData("data.txt");
18
18
  */
@@ -29,12 +29,16 @@ export async function getFileData(
29
29
  return data;
30
30
  }
31
31
 
32
- /*
33
- * TCPclient extends the Client class to provide TCP based clients
32
+ /**
33
+ * TcpClient extends the Client class to provide TCP based clients
34
34
  * it is used by the MQTTclient to connect to the broker
35
35
  * see mqtt.ts in the /bin folder as an example
36
36
  */
37
37
  export class TcpClient extends Client {
38
+ /** Connect using MQTT over TCP
39
+ * @param hostname the name of the host to connect to
40
+ * @param port the port number
41
+ */
38
42
  protected async connectMQTT(
39
43
  hostname: string,
40
44
  port = 1883,
@@ -43,6 +47,15 @@ export class TcpClient extends Client {
43
47
  return await Deno.connect({ hostname, port });
44
48
  }
45
49
 
50
+ /**
51
+ * Connect using MQTT over TLS
52
+ * @param hostname the name of the host to connect to
53
+ * @param port the port number
54
+ * @param caCerts the CA certificates to trust
55
+ * @param cert the clients certificate
56
+ * @param key the clients private key
57
+ * @returns a Deno.TlsConn object
58
+ */
46
59
  protected async connectMQTTS(
47
60
  hostname: string,
48
61
  port = 8883,
@@ -51,19 +64,24 @@ export class TcpClient extends Client {
51
64
  key?: string,
52
65
  ): Promise<Deno.TlsConn> {
53
66
  logger.debug({ hostname, port, caCerts, cert });
54
- return await Deno.connectTls({ hostname, port, caCerts, cert, key });
67
+ const connectOpts = {
68
+ hostname,
69
+ port,
70
+ ...(caCerts !== undefined && { caCerts }),
71
+ ...(cert !== undefined && { cert }),
72
+ ...(key !== undefined && { key }),
73
+ };
74
+ return await Deno.connectTls(connectOpts);
55
75
  }
56
76
 
57
- protected override createConn(
58
- protocol: string,
59
- hostname: string,
60
- port?: number,
61
- caCerts?: string[],
62
- cert?: string,
63
- key?: string,
64
- ): Promise<SockConn> {
65
- // if you need to support alternative connection types just
66
- // overload this method in your subclass
77
+ /** createConn is used by the base client class */
78
+ protected override createConn(): Promise<SockConn> {
79
+ const { protocol, hostname, port: portStr } = this.connectUrl;
80
+ const port = Number(portStr);
81
+ const caCerts = this.caCerts;
82
+ const cert = this.cert;
83
+ const key = this.key;
84
+
67
85
  if (protocol === "mqtts:") {
68
86
  return this.connectMQTTS(hostname, port, caCerts, cert, key);
69
87
  }
@@ -2,15 +2,12 @@ import { test } from "node:test";
2
2
  import assert from "node:assert/strict";
3
3
  import { TcpClient } from "./tcpClient.ts";
4
4
  import { TcpServer } from "./tcpServer.ts";
5
- import { logger, LogLevel } from "../utils/mod.ts";
6
- import type { PublishPacket, QoS } from "../mqttPacket/mod.ts";
5
+ import { delay, logger, LogLevel } from "../utils/mod.ts";
6
+ import type { ProtocolLevel, PublishPacket, QoS } from "../mqttPacket/mod.ts";
7
7
 
8
8
  logger.level(LogLevel.info);
9
- export function sleep(ms: number): Promise<unknown> {
10
- return new Promise((r) => setTimeout(r, ms));
11
- }
12
9
 
13
- test("Deno Test pubSub using client and server", async function () {
10
+ test("Deno: Test pubSub using client and server", async () => {
14
11
  const server = new TcpServer({ port: 0 }, {});
15
12
  server.start();
16
13
 
@@ -52,17 +49,17 @@ test("Deno Test pubSub using client and server", async function () {
52
49
  });
53
50
 
54
51
  // the IIFE ensures message reception runs in parallel
55
- logger.verbose(`Start receiving`);
52
+ logger.verbose("Start receiving");
56
53
  const received: PublishPacket[] = [];
57
- (async function () {
54
+ (async () => {
58
55
  for await (const item of client.messages()) {
59
- logger.verbose(`Receiving: ${item.topic} -- ${item.qos}`);
56
+ logger.verbose("Receiving:", item.topic, "--", item.qos);
60
57
  received.push(item);
61
58
  }
62
59
  })();
63
60
  // end of IIFE
64
61
  for (const item of publishSet) {
65
- logger.verbose(`Publishing: ${item.topic} -- ${item.qos}`);
62
+ logger.verbose("Publishing:", item.topic, "--", item.qos);
66
63
  await client.publish({
67
64
  topic: item.topic,
68
65
  qos: item.qos,
@@ -70,24 +67,24 @@ test("Deno Test pubSub using client and server", async function () {
70
67
  });
71
68
  }
72
69
 
73
- await sleep(100);
74
- logger.verbose(`Disconnect client`);
70
+ await delay(100);
71
+ logger.verbose("Disconnect client");
75
72
  await client.disconnect();
76
73
 
77
- logger.verbose(`Check completeness`);
74
+ logger.verbose("Check completeness");
78
75
  for (const item of publishSet) {
79
76
  const found = received.find((f) =>
80
77
  f.topic == item.topic && f.qos === item.qos
81
78
  );
82
- logger.verbose(`Found: ${item.topic} -- ${item.qos}`);
79
+ logger.verbose("Found:", item.topic, "--", item.qos);
83
80
  assert(found, `${item.topic} -- ${item.qos}`);
84
81
  }
85
82
 
86
- logger.verbose(`Stop server`);
83
+ logger.verbose("Stop server");
87
84
  server.stop();
88
85
  });
89
86
 
90
- test("Deno Test subscription persistence after reconnect", async function () {
87
+ test("Deno: Test subscription persistence after reconnect", async () => {
91
88
  // Start server
92
89
  const server = new TcpServer({ port: 0 }, {});
93
90
  server.start();
@@ -95,6 +92,10 @@ test("Deno Test subscription persistence after reconnect", async function () {
95
92
  const params = {
96
93
  url: new URL(`mqtt://${server.address}:${server.port}`),
97
94
  numberOfRetries: 0,
95
+ options: {
96
+ protocolLevel: 4 as ProtocolLevel,
97
+ clean: false,
98
+ },
98
99
  };
99
100
 
100
101
  const client = new TcpClient();
@@ -111,7 +112,7 @@ test("Deno Test subscription persistence after reconnect", async function () {
111
112
  });
112
113
 
113
114
  // Start receiving messages
114
- (async function () {
115
+ (async () => {
115
116
  for await (const item of client.messages()) {
116
117
  received.push(item);
117
118
  }
@@ -119,11 +120,11 @@ test("Deno Test subscription persistence after reconnect", async function () {
119
120
 
120
121
  // Disconnect client
121
122
  await client.disconnect();
122
- await sleep(100);
123
+ await delay(100);
123
124
 
124
125
  // Reconnect client
125
126
  await client.connect(params);
126
- await sleep(100);
127
+ await delay(100);
127
128
 
128
129
  // Publish test message
129
130
  await client.publish({
@@ -132,8 +133,8 @@ test("Deno Test subscription persistence after reconnect", async function () {
132
133
  payload: new Uint8Array([0x01]),
133
134
  });
134
135
 
135
- await sleep(100);
136
- logger.verbose(`Disconnect client`);
136
+ await delay(100);
137
+ logger.verbose("Disconnect client");
137
138
  await client.disconnect();
138
139
 
139
140
  // Verify message was received
package/deno/tcpServer.ts CHANGED
@@ -7,12 +7,16 @@
7
7
  import { MqttServer } from "../server/mod.ts";
8
8
  import type { MqttServerOptions } from "../server/mod.ts";
9
9
 
10
- /*
11
- * TCP server that wraps a MqttServer, see demoServer.ts in the /bin folder
10
+ /**
11
+ * TCP server that wraps a MqttServer, see the /examples folder
12
12
  */
13
13
  export class TcpServer {
14
14
  private listener: Deno.Listener<Deno.Conn>;
15
15
  private mqttServer: MqttServer;
16
+
17
+ /**
18
+ * Create a new TCP server
19
+ */
16
20
  constructor(
17
21
  serverOptions: Deno.TcpListenOptions,
18
22
  mqttOptions: MqttServerOptions,
@@ -21,26 +25,44 @@ export class TcpServer {
21
25
  this.mqttServer = new MqttServer(mqttOptions);
22
26
  }
23
27
 
24
- async start() {
28
+ /**
29
+ * Start listening
30
+ */
31
+ async start(): Promise<void> {
25
32
  for await (const conn of this.listener) {
26
33
  this.mqttServer.serve(conn);
27
34
  }
28
35
  }
29
- stop() {
36
+
37
+ /**
38
+ * Stop listening
39
+ */
40
+ stop(): void {
41
+ this.mqttServer.close(true);
30
42
  this.listener.close();
31
43
  }
32
44
 
45
+ /**
46
+ * The port number the server is listening on
47
+ */
33
48
  get port(): number | undefined {
49
+ // deno-coverage-ignore-start
34
50
  if (this.listener.addr.transport === "tcp") {
35
51
  return this.listener.addr.port;
36
52
  }
37
53
  return undefined;
54
+ // deno-coverage-ignore-stop
38
55
  }
39
56
 
57
+ /**
58
+ * The address the server is listening on
59
+ */
40
60
  get address(): string | undefined {
61
+ // deno-coverage-ignore-start
41
62
  if (this.listener.addr.transport === "tcp") {
42
63
  return this.listener.addr.hostname;
43
64
  }
44
65
  return undefined;
66
+ // deno-coverage-ignore-stop
45
67
  }
46
68
  }