@seriousme/opifex 1.11.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. package/LICENSE.txt +1 -1
  2. package/README.md +102 -43
  3. package/bin/conformanceServer.ts +45 -13
  4. package/bin/demoServer.ts +38 -13
  5. package/bin/mqtt.ts +52 -30
  6. package/client/ConnectionState.ts +2 -0
  7. package/client/client.ts +57 -47
  8. package/client/context.ts +75 -21
  9. package/client/deps.ts +5 -0
  10. package/client/handlers/handleAuth.test.ts +193 -0
  11. package/client/handlers/handleAuth.ts +89 -0
  12. package/client/handlers/handleConnack.test.ts +173 -0
  13. package/client/handlers/handleConnack.ts +16 -6
  14. package/client/handlers/handleDisconnect.test.ts +22 -0
  15. package/client/handlers/handleDisconnect.ts +17 -0
  16. package/client/handlers/handlePacket.test.ts +242 -0
  17. package/client/handlers/handlePacket.ts +19 -5
  18. package/client/handlers/handlePuback.test.ts +99 -0
  19. package/client/handlers/handlePuback.ts +6 -0
  20. package/client/handlers/handlePubcomp.test.ts +112 -0
  21. package/client/handlers/handlePubcomp.ts +5 -0
  22. package/client/handlers/handlePublish.test.ts +188 -0
  23. package/client/handlers/handlePubrec.test.ts +119 -0
  24. package/client/handlers/handlePubrec.ts +5 -1
  25. package/client/handlers/handlePubrel.test.ts +136 -0
  26. package/client/handlers/handleSuback.test.ts +122 -0
  27. package/client/handlers/handleSuback.ts +3 -0
  28. package/client/handlers/handleUnsuback.test.ts +101 -0
  29. package/client/mod.ts +2 -2
  30. package/client/store/memoryStore.ts +2 -2
  31. package/client/store/store.ts +3 -1
  32. package/deno/README.md +1 -2
  33. package/deno/tcpClient.test.ts +75 -0
  34. package/deno/tcpClient.ts +16 -11
  35. package/deno/tcpServer.test.ts +22 -21
  36. package/deno/tcpServer.ts +5 -0
  37. package/deno/tlsServer.test.ts +97 -0
  38. package/deno/tlsServer.ts +42 -0
  39. package/deno/wsServer.test.ts +93 -0
  40. package/deno/wsServer.ts +73 -0
  41. package/dev_utils/generateCert.ts +95 -0
  42. package/dev_utils/mockConn.ts +36 -0
  43. package/dev_utils/mockServer.ts +28 -0
  44. package/dev_utils/mod.ts +30 -2
  45. package/dev_utils/packetHelpers.ts +404 -0
  46. package/dev_utils/test-handlers.ts +98 -0
  47. package/dev_utils/timers.ts +14 -0
  48. package/dev_utils/webStreamPair.test.ts +171 -0
  49. package/dev_utils/webStreamPair.ts +143 -0
  50. package/dist/bin/conformanceServer.js +17 -12
  51. package/dist/bin/conformanceServer.js.map +1 -1
  52. package/dist/bin/demoServer.js +16 -12
  53. package/dist/bin/demoServer.js.map +1 -1
  54. package/dist/bin/mqtt.js +19 -16
  55. package/dist/bin/mqtt.js.map +1 -1
  56. package/dist/client/ConnectionState.d.ts +2 -0
  57. package/dist/client/ConnectionState.d.ts.map +1 -1
  58. package/dist/client/ConnectionState.js +2 -0
  59. package/dist/client/ConnectionState.js.map +1 -1
  60. package/dist/client/client.d.ts +19 -22
  61. package/dist/client/client.d.ts.map +1 -1
  62. package/dist/client/client.js +34 -20
  63. package/dist/client/client.js.map +1 -1
  64. package/dist/client/context.d.ts +11 -3
  65. package/dist/client/context.d.ts.map +1 -1
  66. package/dist/client/context.js +44 -12
  67. package/dist/client/context.js.map +1 -1
  68. package/dist/client/deps.d.ts +3 -2
  69. package/dist/client/deps.d.ts.map +1 -1
  70. package/dist/client/deps.js +1 -1
  71. package/dist/client/deps.js.map +1 -1
  72. package/dist/client/handlers/handleAuth.d.ts +9 -0
  73. package/dist/client/handlers/handleAuth.d.ts.map +1 -0
  74. package/dist/client/handlers/handleAuth.js +66 -0
  75. package/dist/client/handlers/handleAuth.js.map +1 -0
  76. package/dist/client/handlers/handleConnack.d.ts +2 -2
  77. package/dist/client/handlers/handleConnack.d.ts.map +1 -1
  78. package/dist/client/handlers/handleConnack.js +16 -6
  79. package/dist/client/handlers/handleConnack.js.map +1 -1
  80. package/dist/client/handlers/handleDisconnect.d.ts +11 -0
  81. package/dist/client/handlers/handleDisconnect.d.ts.map +1 -0
  82. package/dist/client/handlers/handleDisconnect.js +15 -0
  83. package/dist/client/handlers/handleDisconnect.js.map +1 -0
  84. package/dist/client/handlers/handlePacket.d.ts.map +1 -1
  85. package/dist/client/handlers/handlePacket.js +14 -3
  86. package/dist/client/handlers/handlePacket.js.map +1 -1
  87. package/dist/client/handlers/handlePuback.d.ts.map +1 -1
  88. package/dist/client/handlers/handlePuback.js +5 -0
  89. package/dist/client/handlers/handlePuback.js.map +1 -1
  90. package/dist/client/handlers/handlePubcomp.d.ts.map +1 -1
  91. package/dist/client/handlers/handlePubcomp.js +5 -0
  92. package/dist/client/handlers/handlePubcomp.js.map +1 -1
  93. package/dist/client/handlers/handlePubrec.d.ts.map +1 -1
  94. package/dist/client/handlers/handlePubrec.js +5 -1
  95. package/dist/client/handlers/handlePubrec.js.map +1 -1
  96. package/dist/client/handlers/handleSuback.d.ts +1 -0
  97. package/dist/client/handlers/handleSuback.d.ts.map +1 -1
  98. package/dist/client/handlers/handleSuback.js +3 -0
  99. package/dist/client/handlers/handleSuback.js.map +1 -1
  100. package/dist/client/mod.d.ts +2 -2
  101. package/dist/client/mod.d.ts.map +1 -1
  102. package/dist/client/mod.js +1 -1
  103. package/dist/client/mod.js.map +1 -1
  104. package/dist/client/store/memoryStore.d.ts.map +1 -1
  105. package/dist/client/store/memoryStore.js +2 -2
  106. package/dist/client/store/memoryStore.js.map +1 -1
  107. package/dist/client/store/store.d.ts +2 -1
  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 +25 -16
  128. package/dist/mqttConn/mqttConn.d.ts.map +1 -1
  129. package/dist/mqttConn/mqttConn.js +69 -40
  130. package/dist/mqttConn/mqttConn.js.map +1 -1
  131. package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -1
  132. package/dist/mqttPacket/BitMask.d.ts +12 -11
  133. package/dist/mqttPacket/BitMask.d.ts.map +1 -1
  134. package/dist/mqttPacket/BitMask.js +10 -18
  135. package/dist/mqttPacket/BitMask.js.map +1 -1
  136. package/dist/mqttPacket/PacketType.d.ts.map +1 -1
  137. package/dist/mqttPacket/Properties.d.ts +2 -2
  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 +1 -0
  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.map +1 -1
  145. package/dist/mqttPacket/auth.d.ts +3 -5
  146. package/dist/mqttPacket/auth.d.ts.map +1 -1
  147. package/dist/mqttPacket/auth.js +31 -30
  148. package/dist/mqttPacket/auth.js.map +1 -1
  149. package/dist/mqttPacket/codec.d.ts +48 -0
  150. package/dist/mqttPacket/codec.d.ts.map +1 -0
  151. package/dist/mqttPacket/codec.js +93 -0
  152. package/dist/mqttPacket/codec.js.map +1 -0
  153. package/dist/mqttPacket/connack.d.ts +4 -5
  154. package/dist/mqttPacket/connack.d.ts.map +1 -1
  155. package/dist/mqttPacket/connack.js +43 -45
  156. package/dist/mqttPacket/connack.js.map +1 -1
  157. package/dist/mqttPacket/connect.d.ts +26 -27
  158. package/dist/mqttPacket/connect.d.ts.map +1 -1
  159. package/dist/mqttPacket/connect.js +156 -157
  160. package/dist/mqttPacket/connect.js.map +1 -1
  161. package/dist/mqttPacket/decoder.d.ts +1 -13
  162. package/dist/mqttPacket/decoder.d.ts.map +1 -1
  163. package/dist/mqttPacket/decoder.js +7 -28
  164. package/dist/mqttPacket/decoder.js.map +1 -1
  165. package/dist/mqttPacket/disconnect.d.ts +4 -5
  166. package/dist/mqttPacket/disconnect.d.ts.map +1 -1
  167. package/dist/mqttPacket/disconnect.js +41 -43
  168. package/dist/mqttPacket/disconnect.js.map +1 -1
  169. package/dist/mqttPacket/encoder.d.ts +1 -15
  170. package/dist/mqttPacket/encoder.d.ts.map +1 -1
  171. package/dist/mqttPacket/encoder.js +4 -27
  172. package/dist/mqttPacket/encoder.js.map +1 -1
  173. package/dist/mqttPacket/length.js +1 -1
  174. package/dist/mqttPacket/length.js.map +1 -1
  175. package/dist/mqttPacket/mod.d.ts +21 -103
  176. package/dist/mqttPacket/mod.d.ts.map +1 -1
  177. package/dist/mqttPacket/mod.js +5 -94
  178. package/dist/mqttPacket/mod.js.map +1 -1
  179. package/dist/mqttPacket/pingreq.d.ts +4 -5
  180. package/dist/mqttPacket/pingreq.d.ts.map +1 -1
  181. package/dist/mqttPacket/pingreq.js +11 -13
  182. package/dist/mqttPacket/pingreq.js.map +1 -1
  183. package/dist/mqttPacket/pingres.d.ts +4 -5
  184. package/dist/mqttPacket/pingres.d.ts.map +1 -1
  185. package/dist/mqttPacket/pingres.js +11 -13
  186. package/dist/mqttPacket/pingres.js.map +1 -1
  187. package/dist/mqttPacket/protocolLevels.d.ts +11 -6
  188. package/dist/mqttPacket/protocolLevels.d.ts.map +1 -1
  189. package/dist/mqttPacket/protocolLevels.js +5 -1
  190. package/dist/mqttPacket/protocolLevels.js.map +1 -1
  191. package/dist/mqttPacket/pubblishAcks.d.ts +9 -10
  192. package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -1
  193. package/dist/mqttPacket/pubblishAcks.js +43 -45
  194. package/dist/mqttPacket/pubblishAcks.js.map +1 -1
  195. package/dist/mqttPacket/publish.d.ts +14 -14
  196. package/dist/mqttPacket/publish.d.ts.map +1 -1
  197. package/dist/mqttPacket/publish.js +53 -55
  198. package/dist/mqttPacket/publish.js.map +1 -1
  199. package/dist/mqttPacket/suback.d.ts +4 -5
  200. package/dist/mqttPacket/suback.d.ts.map +1 -1
  201. package/dist/mqttPacket/suback.js +38 -40
  202. package/dist/mqttPacket/suback.js.map +1 -1
  203. package/dist/mqttPacket/subscribe.d.ts +36 -7
  204. package/dist/mqttPacket/subscribe.d.ts.map +1 -1
  205. package/dist/mqttPacket/subscribe.js +90 -89
  206. package/dist/mqttPacket/subscribe.js.map +1 -1
  207. package/dist/mqttPacket/types.d.ts +1 -8
  208. package/dist/mqttPacket/types.d.ts.map +1 -1
  209. package/dist/mqttPacket/unsuback.d.ts +4 -5
  210. package/dist/mqttPacket/unsuback.d.ts.map +1 -1
  211. package/dist/mqttPacket/unsuback.js +32 -34
  212. package/dist/mqttPacket/unsuback.js.map +1 -1
  213. package/dist/mqttPacket/unsubscribe.d.ts +23 -6
  214. package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
  215. package/dist/mqttPacket/unsubscribe.js +45 -44
  216. package/dist/mqttPacket/unsubscribe.js.map +1 -1
  217. package/dist/mqttPacket/validators.d.ts +4 -16
  218. package/dist/mqttPacket/validators.d.ts.map +1 -1
  219. package/dist/mqttPacket/validators.js +5 -26
  220. package/dist/mqttPacket/validators.js.map +1 -1
  221. package/dist/node/tcpClient.d.ts +1 -1
  222. package/dist/node/tcpClient.d.ts.map +1 -1
  223. package/dist/node/tcpClient.js +12 -7
  224. package/dist/node/tcpClient.js.map +1 -1
  225. package/dist/node/tcpServer.d.ts.map +1 -1
  226. package/dist/node/tcpServer.js +4 -0
  227. package/dist/node/tcpServer.js.map +1 -1
  228. package/dist/node/tlsServer.d.ts +19 -0
  229. package/dist/node/tlsServer.d.ts.map +1 -0
  230. package/dist/node/tlsServer.js +58 -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 +44 -69
  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 +198 -24
  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 +8 -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 +29 -6
  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 +11 -9
  340. package/dist/socket/socket.d.ts.map +1 -1
  341. package/dist/socket/socket.js +67 -15
  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 +47 -17
  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 +40 -3
  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 +7 -0
  396. package/dist/web/wsClient.d.ts.map +1 -0
  397. package/dist/web/wsClient.js +22 -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 +91 -49
  409. package/mqttPacket/BitMask.ts +11 -19
  410. package/mqttPacket/Properties.ts +6 -3
  411. package/mqttPacket/ReasonCode.ts +2 -1
  412. package/mqttPacket/auth.test.ts +1 -1
  413. package/mqttPacket/auth.ts +41 -48
  414. package/mqttPacket/codec.ts +146 -0
  415. package/mqttPacket/connack.ts +57 -68
  416. package/mqttPacket/connect.test.ts +2 -2
  417. package/mqttPacket/connect.ts +197 -204
  418. package/mqttPacket/decoder.test.ts +0 -39
  419. package/mqttPacket/decoder.ts +9 -36
  420. package/mqttPacket/disconnect.ts +57 -68
  421. package/mqttPacket/encoder.ts +5 -40
  422. package/mqttPacket/length.ts +1 -1
  423. package/mqttPacket/mod.ts +48 -200
  424. package/mqttPacket/pingreq.ts +21 -27
  425. package/mqttPacket/pingres.ts +21 -27
  426. package/mqttPacket/protocolLevels.ts +12 -7
  427. package/mqttPacket/pubblishAcks.ts +68 -77
  428. package/mqttPacket/publish.ts +76 -83
  429. package/mqttPacket/suback.ts +48 -58
  430. package/mqttPacket/subscribe.ts +141 -117
  431. package/mqttPacket/types.ts +1 -9
  432. package/mqttPacket/unsuback.ts +46 -58
  433. package/mqttPacket/unsubscribe.ts +74 -63
  434. package/mqttPacket/validators.ts +5 -31
  435. package/node/socket-node-stream.test.ts +322 -0
  436. package/node/socket-node-stream.ts +174 -0
  437. package/node/tcpClient.test.ts +70 -0
  438. package/node/tcpClient.ts +13 -12
  439. package/node/tcpServer.test.ts +24 -20
  440. package/node/tcpServer.ts +6 -0
  441. package/node/tlsServer.test.ts +94 -0
  442. package/node/tlsServer.ts +81 -0
  443. package/node/wrapNodeSocket.ts +7 -30
  444. package/package.json +73 -45
  445. package/persistence/basicPersistence.ts +495 -0
  446. package/persistence/deps.ts +11 -1
  447. package/persistence/memory/memoryPersistence.ts +12 -152
  448. package/persistence/memory/memoryStorage.ts +232 -0
  449. package/persistence/mod.ts +4 -4
  450. package/persistence/persistence.test.ts +24 -0
  451. package/persistence/persistence.testing.ts +1324 -0
  452. package/persistence/persistence.ts +111 -67
  453. package/persistence/sqlite/sqliteDatabase.ts +294 -0
  454. package/persistence/sqlite/sqlitePersistence.test.ts +48 -0
  455. package/persistence/sqlite/sqlitePersistence.ts +36 -0
  456. package/persistence/sqlite/sqliteStorage.ts +324 -0
  457. package/persistence/storage.ts +84 -0
  458. package/server/config.ts +65 -0
  459. package/server/context.ts +658 -74
  460. package/server/deps.ts +25 -5
  461. package/server/handlers/completeConnect.ts +93 -0
  462. package/server/handlers/duplicate.test.ts +196 -0
  463. package/server/handlers/handleAuth.test.ts +225 -0
  464. package/server/handlers/handleAuth.ts +88 -0
  465. package/server/handlers/handleConnect.test.ts +589 -0
  466. package/server/handlers/handleConnect.ts +201 -86
  467. package/server/handlers/handleConnect.version.test.ts +108 -0
  468. package/server/handlers/handleDisconnect.test.ts +56 -0
  469. package/server/handlers/handleDisconnect.ts +3 -3
  470. package/server/handlers/handlePacket.test.ts +24 -0
  471. package/server/handlers/handlePacket.ts +30 -8
  472. package/server/handlers/handlePingreq.test.ts +29 -0
  473. package/server/handlers/handlePuback.test.ts +28 -0
  474. package/server/handlers/handlePuback.ts +5 -8
  475. package/server/handlers/handlePubcomp.test.ts +28 -0
  476. package/server/handlers/handlePubcomp.ts +5 -4
  477. package/server/handlers/handlePublish.test.ts +471 -0
  478. package/server/handlers/handlePublish.ts +189 -35
  479. package/server/handlers/handlePubrec.test.ts +28 -0
  480. package/server/handlers/handlePubrec.ts +2 -3
  481. package/server/handlers/handlePubrel.test.ts +74 -0
  482. package/server/handlers/handlePubrel.ts +12 -2
  483. package/server/handlers/handleSubscribe.test.ts +971 -0
  484. package/server/handlers/handleSubscribe.ts +158 -39
  485. package/server/handlers/handleUnsubscribe.test.ts +79 -0
  486. package/server/handlers/handleUnsubscribe.ts +29 -5
  487. package/server/handlers/keepalive.test.ts +132 -0
  488. package/server/handlers/session.persistence.test.ts +194 -0
  489. package/server/handlers/will.delivery.test.ts +221 -0
  490. package/server/mod.ts +4 -3
  491. package/server/preconnect.test.ts +151 -0
  492. package/server/server.ts +115 -17
  493. package/socket/socket.test.ts +91 -0
  494. package/socket/socket.ts +81 -31
  495. package/timer/timer.test.ts +4 -7
  496. package/timer/timer.ts +36 -0
  497. package/tools/benchmarks/receiver.ts +51 -0
  498. package/tools/benchmarks/sender.ts +48 -0
  499. package/tools/benchmarks/utils.ts +31 -0
  500. package/tools/mqtt-compat/README.md +130 -0
  501. package/tools/mqtt-compat/broker.ts +52 -0
  502. package/tools/mqtt-compat/paho-mqtt4.test.ts +379 -0
  503. package/tools/mqtt-compat/paho-mqtt5.tests.ts +887 -0
  504. package/trie/trie.test.ts +9 -1
  505. package/trie/trie.ts +57 -22
  506. package/utils/bufferedAsyncIterable.test.ts +92 -0
  507. package/utils/{BufferedAsyncIterable.ts → bufferedAsyncIterable.ts} +1 -1
  508. package/utils/deferred.test.ts +36 -0
  509. package/utils/deferred.ts +0 -1
  510. package/utils/getOrInsertPolyFill.ts +12 -0
  511. package/utils/logger.test.ts +189 -0
  512. package/utils/logger.ts +62 -7
  513. package/utils/mod.ts +15 -1
  514. package/utils/outboundTopicAliasManager.ts +100 -0
  515. package/utils/queue.test.ts +61 -0
  516. package/utils/topicFilter.test.ts +63 -0
  517. package/utils/topicFilter.ts +61 -0
  518. package/utils/utils.ts +3 -0
  519. package/utils/validators.ts +67 -0
  520. package/web/webSocketStream.ts +97 -0
  521. package/web/wrapWebSocket.ts +52 -0
  522. package/web/wsClient.test.ts +26 -0
  523. package/web/wsClient.ts +25 -0
  524. package/benchmarks/receiver.ts +0 -35
  525. package/benchmarks/sender.ts +0 -32
  526. package/benchmarks/utils.ts +0 -9
  527. package/dev_utils/dummyConn.ts +0 -110
  528. package/dist/persistence/store.d.ts +0 -13
  529. package/dist/persistence/store.d.ts.map +0 -1
  530. package/dist/persistence/store.js +0 -2
  531. package/dist/persistence/store.js.map +0 -1
  532. package/dist/utils/BufferedAsyncIterable.d.ts.map +0 -1
  533. package/dist/utils/BufferedAsyncIterable.js.map +0 -1
  534. package/examples/tcpServer.test.ts +0 -148
  535. package/persistence/memory/memoryPersistence.test.ts +0 -156
  536. package/persistence/store.ts +0 -15
  537. package/server/test/handleConnect.test.ts +0 -130
  538. package/server/test/test-handlers.ts +0 -53
@@ -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,8 +8,8 @@ export {
8
8
  DEFAULT_PROTOCOLLEVEL,
9
9
  DEFAULT_URL,
10
10
  } from "./client.ts";
11
- export { MQTTLevel } from "./deps.ts";
12
- export type { ProtocolLevel } from "./deps.ts";
11
+ export { MQTTLevel, ReasonCode } from "./deps.ts";
12
+ export type { ProtocolLevel, QoS } from "./deps.ts";
13
13
  export type {
14
14
  ConnectParameters,
15
15
  PublishParameters,
@@ -7,7 +7,7 @@ import type { PacketId } from "./deps.ts";
7
7
 
8
8
  import {
9
9
  type IStore,
10
- maxPacketId,
10
+ MAX_PACKET_ID,
11
11
  type PacketStore,
12
12
  type PendingAckOutgoing,
13
13
  type pendingIncoming,
@@ -50,7 +50,7 @@ export class MemoryStore implements IStore {
50
50
  const currentId = this.packetId;
51
51
  do {
52
52
  this.packetId++;
53
- if (this.packetId > maxPacketId) {
53
+ if (this.packetId > MAX_PACKET_ID) {
54
54
  this.packetId = 1;
55
55
  }
56
56
  } 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
@@ -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
@@ -51,19 +51,24 @@ export class TcpClient extends Client {
51
51
  key?: string,
52
52
  ): Promise<Deno.TlsConn> {
53
53
  logger.debug({ hostname, port, caCerts, cert });
54
- return await Deno.connectTls({ hostname, port, caCerts, cert, key });
54
+ const connectOpts = {
55
+ hostname,
56
+ port,
57
+ ...(caCerts !== undefined && { caCerts }),
58
+ ...(cert !== undefined && { cert }),
59
+ ...(key !== undefined && { key }),
60
+ };
61
+ return await Deno.connectTls(connectOpts);
55
62
  }
56
63
 
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
64
+ // overload createConn from the base client class
65
+ protected override createConn(): Promise<SockConn> {
66
+ const { protocol, hostname, port: portStr } = this.connectUrl;
67
+ const port = Number(portStr);
68
+ const caCerts = this.caCerts;
69
+ const cert = this.cert;
70
+ const key = this.key;
71
+
67
72
  if (protocol === "mqtts:") {
68
73
  return this.connectMQTTS(hostname, port, caCerts, cert, key);
69
74
  }
@@ -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
@@ -27,20 +27,25 @@ export class TcpServer {
27
27
  }
28
28
  }
29
29
  stop() {
30
+ this.mqttServer.close(true);
30
31
  this.listener.close();
31
32
  }
32
33
 
33
34
  get port(): number | undefined {
35
+ // deno-coverage-ignore-start
34
36
  if (this.listener.addr.transport === "tcp") {
35
37
  return this.listener.addr.port;
36
38
  }
37
39
  return undefined;
40
+ // deno-coverage-ignore-stop
38
41
  }
39
42
 
40
43
  get address(): string | undefined {
44
+ // deno-coverage-ignore-start
41
45
  if (this.listener.addr.transport === "tcp") {
42
46
  return this.listener.addr.hostname;
43
47
  }
44
48
  return undefined;
49
+ // deno-coverage-ignore-stop
45
50
  }
46
51
  }
@@ -0,0 +1,97 @@
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("Deno: Test pubSub using client and server", async () => {
14
+ const server = new TlsServer(
15
+ { hostname: "localhost", port: 0, key, cert },
16
+ {},
17
+ );
18
+ server.start();
19
+
20
+ assert.deepStrictEqual(
21
+ server.port !== undefined,
22
+ true,
23
+ "server runs a a random port",
24
+ );
25
+ logger.verbose("server running on: ", {
26
+ port: server.port,
27
+ address: server.address,
28
+ });
29
+
30
+ const params = {
31
+ url: new URL(`mqtts://localhost:${server.port}`),
32
+ numberOfRetries: 0,
33
+ caCerts: [caCert],
34
+ };
35
+
36
+ logger.verbose("client parameters: ", params);
37
+
38
+ const client = new TcpClient();
39
+
40
+ await client.connect(params);
41
+ assert(true, "Client connected to server");
42
+
43
+ const publishSet: { topic: string; qos: QoS }[] = [
44
+ { topic: "t0@q0", qos: 0 },
45
+ { topic: "t1@q0", qos: 0 },
46
+ { topic: "t2@q0", qos: 0 },
47
+ { topic: "t0@q1", qos: 1 },
48
+ { topic: "t1@q1", qos: 1 },
49
+ { topic: "t2@q1", qos: 1 },
50
+ { topic: "t0@q2", qos: 2 },
51
+ { topic: "t1@q2", qos: 2 },
52
+ { topic: "t2@q2", qos: 2 },
53
+ ];
54
+
55
+ const subscriptions = publishSet.map((item) => ({
56
+ topicFilter: item.topic,
57
+ qos: item.qos,
58
+ }));
59
+ await client.subscribe({
60
+ subscriptions,
61
+ });
62
+
63
+ // the IIFE ensures message reception runs in parallel
64
+ logger.verbose("Start receiving");
65
+ const received: PublishPacket[] = [];
66
+ (async () => {
67
+ for await (const item of client.messages()) {
68
+ logger.verbose("Receiving:", item.topic, "--", item.qos);
69
+ received.push(item);
70
+ }
71
+ })();
72
+ // end of IIFE
73
+ for (const item of publishSet) {
74
+ logger.verbose("Publishing:", item.topic, "--", item.qos);
75
+ await client.publish({
76
+ topic: item.topic,
77
+ qos: item.qos,
78
+ payload: new Uint8Array([0x01]),
79
+ });
80
+ }
81
+
82
+ await delay(100);
83
+ logger.verbose("Disconnect client");
84
+ await client.disconnect();
85
+
86
+ logger.verbose("Check completeness");
87
+ for (const item of publishSet) {
88
+ const found = received.find((f) =>
89
+ f.topic == item.topic && f.qos === item.qos
90
+ );
91
+ logger.verbose("Found:", item.topic, "--", item.qos);
92
+ assert(found, `${item.topic} -- ${item.qos}`);
93
+ }
94
+
95
+ logger.verbose("Stop server");
96
+ server.stop();
97
+ });
@@ -0,0 +1,42 @@
1
+ /**
2
+ * This module provides a Deno specific implementation of a TCP socket listener
3
+ * it uses the platform agnostic MqttServer class
4
+ * @module
5
+ */
6
+
7
+ import { MqttServer } from "../server/mod.ts";
8
+ import type { MqttServerOptions } from "../server/mod.ts";
9
+
10
+ /*
11
+ * TCP server that wraps a MqttServer, see demoServer.ts in the /bin folder
12
+ */
13
+ export class TlsServer {
14
+ private listener: Deno.TlsListener;
15
+ private mqttServer: MqttServer;
16
+ constructor(
17
+ serverOptions: Deno.ListenTlsOptions & Deno.TlsCertifiedKeyPem,
18
+ mqttOptions: MqttServerOptions,
19
+ ) {
20
+ this.listener = Deno.listenTls(serverOptions);
21
+ this.mqttServer = new MqttServer(mqttOptions);
22
+ }
23
+
24
+ async start() {
25
+ for await (const conn of this.listener) {
26
+ this.mqttServer.serve(conn);
27
+ }
28
+ }
29
+ stop() {
30
+ this.mqttServer.close();
31
+ this.listener.close();
32
+ }
33
+ // deno-coverage-ignore-start
34
+ get port(): number | undefined {
35
+ return this.listener.addr.port;
36
+ }
37
+
38
+ get address(): string | undefined {
39
+ return this.listener.addr.hostname;
40
+ }
41
+ // deno-coverage-ignore-stop
42
+ }
@@ -0,0 +1,93 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { WsClient } from "../web/wsClient.ts";
4
+ import { WsServer } from "./wsServer.ts";
5
+ import { delay, logger, LogLevel } from "../utils/mod.ts";
6
+ import type { PublishPacket, QoS } from "../mqttPacket/mod.ts";
7
+
8
+ logger.level(LogLevel.info);
9
+
10
+ test("Deno: Test pubSub using client and server over webSockets", async () => {
11
+ const server = new WsServer(
12
+ { hostname: "localhost", port: 0 },
13
+ {},
14
+ );
15
+ server.start();
16
+
17
+ assert.deepStrictEqual(
18
+ server.port !== undefined,
19
+ true,
20
+ "Http 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(`ws://localhost:${server.port}`),
29
+ numberOfRetries: 0,
30
+ };
31
+
32
+ logger.verbose("client parameters: ", params);
33
+
34
+ const client = new WsClient();
35
+ client.onConnected = () => logger.verbose("Client connected to server");
36
+
37
+ await client.connect(params);
38
+
39
+ const publishSet: { topic: string; qos: QoS }[] = [
40
+ { topic: "t0@q0", qos: 0 },
41
+ { topic: "t1@q0", qos: 0 },
42
+ { topic: "t2@q0", qos: 0 },
43
+ { topic: "t0@q1", qos: 1 },
44
+ { topic: "t1@q1", qos: 1 },
45
+ { topic: "t2@q1", qos: 1 },
46
+ { topic: "t0@q2", qos: 2 },
47
+ { topic: "t1@q2", qos: 2 },
48
+ { topic: "t2@q2", qos: 2 },
49
+ ];
50
+
51
+ const subscriptions = publishSet.map((item) => ({
52
+ topicFilter: item.topic,
53
+ qos: item.qos,
54
+ }));
55
+ await client.subscribe({
56
+ subscriptions,
57
+ });
58
+
59
+ // the IIFE ensures message reception runs in parallel
60
+ logger.verbose("Start receiving");
61
+ const received: PublishPacket[] = [];
62
+ (async () => {
63
+ for await (const item of client.messages()) {
64
+ logger.verbose("Receiving:", item.topic, "--", item.qos);
65
+ received.push(item);
66
+ }
67
+ })();
68
+ // end of IIFE
69
+ for (const item of publishSet) {
70
+ logger.verbose("Publishing:", item.topic, "--", item.qos);
71
+ await client.publish({
72
+ topic: item.topic,
73
+ qos: item.qos,
74
+ payload: new Uint8Array([0x01]),
75
+ });
76
+ }
77
+
78
+ await delay(100);
79
+ logger.verbose("Disconnect client");
80
+ await client.disconnect();
81
+
82
+ logger.verbose("Check completeness");
83
+ for (const item of publishSet) {
84
+ const found = received.find((f) =>
85
+ f.topic == item.topic && f.qos === item.qos
86
+ );
87
+ logger.verbose("Found:", item.topic, "--", item.qos);
88
+ assert(found, `${item.topic} -- ${item.qos}`);
89
+ }
90
+
91
+ logger.verbose("Stop server");
92
+ server.stop();
93
+ });