@seriousme/opifex 1.11.3 → 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 (531) 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 +2 -0
  6. package/client/client.ts +51 -41
  7. package/client/context.ts +75 -21
  8. package/client/deps.ts +4 -0
  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 +16 -6
  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 +1 -1
  29. package/client/store/memoryStore.ts +2 -2
  30. package/client/store/store.ts +3 -1
  31. package/deno/README.md +1 -2
  32. package/deno/tcpClient.test.ts +75 -0
  33. package/deno/tcpClient.ts +16 -11
  34. package/deno/tcpServer.test.ts +22 -21
  35. package/deno/tcpServer.ts +5 -0
  36. package/deno/tlsServer.test.ts +97 -0
  37. package/deno/tlsServer.ts +42 -0
  38. package/deno/wsServer.test.ts +93 -0
  39. package/deno/wsServer.ts +73 -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 +2 -0
  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 +13 -16
  60. package/dist/client/client.d.ts.map +1 -1
  61. package/dist/client/client.js +34 -20
  62. package/dist/client/client.js.map +1 -1
  63. package/dist/client/context.d.ts +11 -3
  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 +3 -2
  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 +1 -1
  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.map +1 -1
  104. package/dist/client/store/memoryStore.js +2 -2
  105. package/dist/client/store/memoryStore.js.map +1 -1
  106. package/dist/client/store/store.d.ts +2 -1
  107. package/dist/client/store/store.d.ts.map +1 -1
  108. package/dist/client/store/store.js +1 -1
  109. package/dist/client/store/store.js.map +1 -1
  110. package/dist/dev_utils/generateCert.d.ts +11 -0
  111. package/dist/dev_utils/generateCert.d.ts.map +1 -0
  112. package/dist/dev_utils/generateCert.js +76 -0
  113. package/dist/dev_utils/generateCert.js.map +1 -0
  114. package/dist/examples/authHandler.test.d.ts +2 -0
  115. package/dist/examples/authHandler.test.d.ts.map +1 -0
  116. package/dist/examples/authHandler.test.js +123 -0
  117. package/dist/examples/authHandler.test.js.map +1 -0
  118. package/dist/examples/mqtt.test.d.ts +2 -0
  119. package/dist/examples/mqtt.test.d.ts.map +1 -0
  120. package/dist/examples/mqtt.test.js +70 -0
  121. package/dist/examples/mqtt.test.js.map +1 -0
  122. package/dist/examples/mqtts.test.d.ts +2 -0
  123. package/dist/examples/mqtts.test.d.ts.map +1 -0
  124. package/dist/examples/mqtts.test.js +81 -0
  125. package/dist/examples/mqtts.test.js.map +1 -0
  126. package/dist/mqttConn/mqttConn.d.ts +23 -15
  127. package/dist/mqttConn/mqttConn.d.ts.map +1 -1
  128. package/dist/mqttConn/mqttConn.js +56 -35
  129. package/dist/mqttConn/mqttConn.js.map +1 -1
  130. package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -1
  131. package/dist/mqttPacket/BitMask.d.ts.map +1 -1
  132. package/dist/mqttPacket/PacketType.d.ts.map +1 -1
  133. package/dist/mqttPacket/Properties.d.ts +2 -2
  134. package/dist/mqttPacket/Properties.d.ts.map +1 -1
  135. package/dist/mqttPacket/Properties.js.map +1 -1
  136. package/dist/mqttPacket/ReasonCode.d.ts +1 -0
  137. package/dist/mqttPacket/ReasonCode.d.ts.map +1 -1
  138. package/dist/mqttPacket/ReasonCode.js +1 -0
  139. package/dist/mqttPacket/ReasonCode.js.map +1 -1
  140. package/dist/mqttPacket/RetainHandling.d.ts.map +1 -1
  141. package/dist/mqttPacket/auth.d.ts +3 -5
  142. package/dist/mqttPacket/auth.d.ts.map +1 -1
  143. package/dist/mqttPacket/auth.js +31 -30
  144. package/dist/mqttPacket/auth.js.map +1 -1
  145. package/dist/mqttPacket/codec.d.ts +48 -0
  146. package/dist/mqttPacket/codec.d.ts.map +1 -0
  147. package/dist/mqttPacket/codec.js +93 -0
  148. package/dist/mqttPacket/codec.js.map +1 -0
  149. package/dist/mqttPacket/connack.d.ts +4 -5
  150. package/dist/mqttPacket/connack.d.ts.map +1 -1
  151. package/dist/mqttPacket/connack.js +43 -45
  152. package/dist/mqttPacket/connack.js.map +1 -1
  153. package/dist/mqttPacket/connect.d.ts +4 -5
  154. package/dist/mqttPacket/connect.d.ts.map +1 -1
  155. package/dist/mqttPacket/connect.js +156 -157
  156. package/dist/mqttPacket/connect.js.map +1 -1
  157. package/dist/mqttPacket/decoder.d.ts +1 -13
  158. package/dist/mqttPacket/decoder.d.ts.map +1 -1
  159. package/dist/mqttPacket/decoder.js +6 -27
  160. package/dist/mqttPacket/decoder.js.map +1 -1
  161. package/dist/mqttPacket/disconnect.d.ts +4 -5
  162. package/dist/mqttPacket/disconnect.d.ts.map +1 -1
  163. package/dist/mqttPacket/disconnect.js +41 -43
  164. package/dist/mqttPacket/disconnect.js.map +1 -1
  165. package/dist/mqttPacket/encoder.d.ts +1 -15
  166. package/dist/mqttPacket/encoder.d.ts.map +1 -1
  167. package/dist/mqttPacket/encoder.js +4 -27
  168. package/dist/mqttPacket/encoder.js.map +1 -1
  169. package/dist/mqttPacket/mod.d.ts +21 -103
  170. package/dist/mqttPacket/mod.d.ts.map +1 -1
  171. package/dist/mqttPacket/mod.js +5 -94
  172. package/dist/mqttPacket/mod.js.map +1 -1
  173. package/dist/mqttPacket/pingreq.d.ts +4 -5
  174. package/dist/mqttPacket/pingreq.d.ts.map +1 -1
  175. package/dist/mqttPacket/pingreq.js +11 -13
  176. package/dist/mqttPacket/pingreq.js.map +1 -1
  177. package/dist/mqttPacket/pingres.d.ts +4 -5
  178. package/dist/mqttPacket/pingres.d.ts.map +1 -1
  179. package/dist/mqttPacket/pingres.js +11 -13
  180. package/dist/mqttPacket/pingres.js.map +1 -1
  181. package/dist/mqttPacket/protocolLevels.d.ts +11 -6
  182. package/dist/mqttPacket/protocolLevels.d.ts.map +1 -1
  183. package/dist/mqttPacket/protocolLevels.js +5 -1
  184. package/dist/mqttPacket/protocolLevels.js.map +1 -1
  185. package/dist/mqttPacket/pubblishAcks.d.ts +4 -5
  186. package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -1
  187. package/dist/mqttPacket/pubblishAcks.js +43 -45
  188. package/dist/mqttPacket/pubblishAcks.js.map +1 -1
  189. package/dist/mqttPacket/publish.d.ts +5 -5
  190. package/dist/mqttPacket/publish.d.ts.map +1 -1
  191. package/dist/mqttPacket/publish.js +53 -55
  192. package/dist/mqttPacket/publish.js.map +1 -1
  193. package/dist/mqttPacket/suback.d.ts +4 -5
  194. package/dist/mqttPacket/suback.d.ts.map +1 -1
  195. package/dist/mqttPacket/suback.js +38 -40
  196. package/dist/mqttPacket/suback.js.map +1 -1
  197. package/dist/mqttPacket/subscribe.d.ts +36 -7
  198. package/dist/mqttPacket/subscribe.d.ts.map +1 -1
  199. package/dist/mqttPacket/subscribe.js +90 -89
  200. package/dist/mqttPacket/subscribe.js.map +1 -1
  201. package/dist/mqttPacket/types.d.ts +1 -8
  202. package/dist/mqttPacket/types.d.ts.map +1 -1
  203. package/dist/mqttPacket/unsuback.d.ts +4 -5
  204. package/dist/mqttPacket/unsuback.d.ts.map +1 -1
  205. package/dist/mqttPacket/unsuback.js +32 -34
  206. package/dist/mqttPacket/unsuback.js.map +1 -1
  207. package/dist/mqttPacket/unsubscribe.d.ts +23 -6
  208. package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
  209. package/dist/mqttPacket/unsubscribe.js +45 -44
  210. package/dist/mqttPacket/unsubscribe.js.map +1 -1
  211. package/dist/mqttPacket/validators.d.ts +4 -16
  212. package/dist/mqttPacket/validators.d.ts.map +1 -1
  213. package/dist/mqttPacket/validators.js +5 -26
  214. package/dist/mqttPacket/validators.js.map +1 -1
  215. package/dist/node/tcpClient.d.ts +1 -1
  216. package/dist/node/tcpClient.d.ts.map +1 -1
  217. package/dist/node/tcpClient.js +12 -7
  218. package/dist/node/tcpClient.js.map +1 -1
  219. package/dist/node/tcpServer.d.ts.map +1 -1
  220. package/dist/node/tcpServer.js +4 -0
  221. package/dist/node/tcpServer.js.map +1 -1
  222. package/dist/node/tlsServer.d.ts +19 -0
  223. package/dist/node/tlsServer.d.ts.map +1 -0
  224. package/dist/node/tlsServer.js +58 -0
  225. package/dist/node/tlsServer.js.map +1 -0
  226. package/dist/node/wrapNodeSocket.d.ts.map +1 -1
  227. package/dist/node/wrapNodeSocket.js +6 -28
  228. package/dist/node/wrapNodeSocket.js.map +1 -1
  229. package/dist/persistence/basicPersistence.d.ts +36 -0
  230. package/dist/persistence/basicPersistence.d.ts.map +1 -0
  231. package/dist/persistence/basicPersistence.js +306 -0
  232. package/dist/persistence/basicPersistence.js.map +1 -0
  233. package/dist/persistence/deps.d.ts +3 -2
  234. package/dist/persistence/deps.d.ts.map +1 -1
  235. package/dist/persistence/deps.js +2 -1
  236. package/dist/persistence/deps.js.map +1 -1
  237. package/dist/persistence/memory/memoryPersistence.d.ts +6 -23
  238. package/dist/persistence/memory/memoryPersistence.d.ts.map +1 -1
  239. package/dist/persistence/memory/memoryPersistence.js +12 -115
  240. package/dist/persistence/memory/memoryPersistence.js.map +1 -1
  241. package/dist/persistence/memory/memoryStorage.d.ts +45 -0
  242. package/dist/persistence/memory/memoryStorage.d.ts.map +1 -0
  243. package/dist/persistence/memory/memoryStorage.js +143 -0
  244. package/dist/persistence/memory/memoryStorage.js.map +1 -0
  245. package/dist/persistence/mod.d.ts +3 -3
  246. package/dist/persistence/mod.d.ts.map +1 -1
  247. package/dist/persistence/mod.js +6 -1
  248. package/dist/persistence/mod.js.map +1 -1
  249. package/dist/persistence/persistence.d.ts +44 -69
  250. package/dist/persistence/persistence.d.ts.map +1 -1
  251. package/dist/persistence/persistence.js +1 -2
  252. package/dist/persistence/persistence.js.map +1 -1
  253. package/dist/persistence/sqlite/sqliteDatabase.d.ts +46 -0
  254. package/dist/persistence/sqlite/sqliteDatabase.d.ts.map +1 -0
  255. package/dist/persistence/sqlite/sqliteDatabase.js +215 -0
  256. package/dist/persistence/sqlite/sqliteDatabase.js.map +1 -0
  257. package/dist/persistence/sqlite/sqlitePersistence.d.ts +16 -0
  258. package/dist/persistence/sqlite/sqlitePersistence.d.ts.map +1 -0
  259. package/dist/persistence/sqlite/sqlitePersistence.js +29 -0
  260. package/dist/persistence/sqlite/sqlitePersistence.js.map +1 -0
  261. package/dist/persistence/sqlite/sqliteStorage.d.ts +36 -0
  262. package/dist/persistence/sqlite/sqliteStorage.d.ts.map +1 -0
  263. package/dist/persistence/sqlite/sqliteStorage.js +194 -0
  264. package/dist/persistence/sqlite/sqliteStorage.js.map +1 -0
  265. package/dist/persistence/storage.d.ts +38 -0
  266. package/dist/persistence/storage.d.ts.map +1 -0
  267. package/dist/persistence/storage.js +5 -0
  268. package/dist/persistence/storage.js.map +1 -0
  269. package/dist/server/config.d.ts +47 -0
  270. package/dist/server/config.d.ts.map +1 -0
  271. package/dist/server/config.js +41 -0
  272. package/dist/server/config.js.map +1 -0
  273. package/dist/server/context.d.ts +198 -24
  274. package/dist/server/context.d.ts.map +1 -1
  275. package/dist/server/context.js +432 -53
  276. package/dist/server/context.js.map +1 -1
  277. package/dist/server/deps.d.ts +5 -6
  278. package/dist/server/deps.d.ts.map +1 -1
  279. package/dist/server/deps.js +2 -2
  280. package/dist/server/deps.js.map +1 -1
  281. package/dist/server/handlers/completeConnect.d.ts +8 -0
  282. package/dist/server/handlers/completeConnect.d.ts.map +1 -0
  283. package/dist/server/handlers/completeConnect.js +74 -0
  284. package/dist/server/handlers/completeConnect.js.map +1 -0
  285. package/dist/server/handlers/handleAuth.d.ts +9 -0
  286. package/dist/server/handlers/handleAuth.d.ts.map +1 -0
  287. package/dist/server/handlers/handleAuth.js +69 -0
  288. package/dist/server/handlers/handleAuth.js.map +1 -0
  289. package/dist/server/handlers/handleConnect.d.ts +2 -4
  290. package/dist/server/handlers/handleConnect.d.ts.map +1 -1
  291. package/dist/server/handlers/handleConnect.js +140 -67
  292. package/dist/server/handlers/handleConnect.js.map +1 -1
  293. package/dist/server/handlers/handleDisconnect.d.ts +1 -1
  294. package/dist/server/handlers/handleDisconnect.d.ts.map +1 -1
  295. package/dist/server/handlers/handleDisconnect.js +3 -3
  296. package/dist/server/handlers/handleDisconnect.js.map +1 -1
  297. package/dist/server/handlers/handlePacket.d.ts.map +1 -1
  298. package/dist/server/handlers/handlePacket.js +19 -6
  299. package/dist/server/handlers/handlePacket.js.map +1 -1
  300. package/dist/server/handlers/handlePuback.d.ts +1 -3
  301. package/dist/server/handlers/handlePuback.d.ts.map +1 -1
  302. package/dist/server/handlers/handlePuback.js +2 -8
  303. package/dist/server/handlers/handlePuback.js.map +1 -1
  304. package/dist/server/handlers/handlePubcomp.d.ts +1 -1
  305. package/dist/server/handlers/handlePubcomp.d.ts.map +1 -1
  306. package/dist/server/handlers/handlePubcomp.js +2 -4
  307. package/dist/server/handlers/handlePubcomp.js.map +1 -1
  308. package/dist/server/handlers/handlePublish.d.ts +1 -1
  309. package/dist/server/handlers/handlePublish.d.ts.map +1 -1
  310. package/dist/server/handlers/handlePublish.js +149 -45
  311. package/dist/server/handlers/handlePublish.js.map +1 -1
  312. package/dist/server/handlers/handlePubrec.d.ts.map +1 -1
  313. package/dist/server/handlers/handlePubrec.js +2 -3
  314. package/dist/server/handlers/handlePubrec.js.map +1 -1
  315. package/dist/server/handlers/handlePubrel.d.ts.map +1 -1
  316. package/dist/server/handlers/handlePubrel.js +6 -2
  317. package/dist/server/handlers/handlePubrel.js.map +1 -1
  318. package/dist/server/handlers/handleSubscribe.d.ts +1 -6
  319. package/dist/server/handlers/handleSubscribe.d.ts.map +1 -1
  320. package/dist/server/handlers/handleSubscribe.js +99 -38
  321. package/dist/server/handlers/handleSubscribe.js.map +1 -1
  322. package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -1
  323. package/dist/server/handlers/handleUnsubscribe.js +19 -4
  324. package/dist/server/handlers/handleUnsubscribe.js.map +1 -1
  325. package/dist/server/mod.d.ts +3 -3
  326. package/dist/server/mod.d.ts.map +1 -1
  327. package/dist/server/mod.js +1 -1
  328. package/dist/server/mod.js.map +1 -1
  329. package/dist/server/server.d.ts +29 -6
  330. package/dist/server/server.d.ts.map +1 -1
  331. package/dist/server/server.js +84 -15
  332. package/dist/server/server.js.map +1 -1
  333. package/dist/socket/socket.d.ts +11 -9
  334. package/dist/socket/socket.d.ts.map +1 -1
  335. package/dist/socket/socket.js +66 -18
  336. package/dist/socket/socket.js.map +1 -1
  337. package/dist/timer/timer.d.ts +32 -0
  338. package/dist/timer/timer.d.ts.map +1 -1
  339. package/dist/timer/timer.js +32 -0
  340. package/dist/timer/timer.js.map +1 -1
  341. package/dist/trie/trie.d.ts +10 -5
  342. package/dist/trie/trie.d.ts.map +1 -1
  343. package/dist/trie/trie.js +61 -41
  344. package/dist/trie/trie.js.map +1 -1
  345. package/dist/utils/assert.d.ts.map +1 -1
  346. package/dist/utils/{BufferedAsyncIterable.d.ts → bufferedAsyncIterable.d.ts} +1 -1
  347. package/dist/utils/bufferedAsyncIterable.d.ts.map +1 -0
  348. package/dist/utils/{BufferedAsyncIterable.js → bufferedAsyncIterable.js} +1 -1
  349. package/dist/utils/bufferedAsyncIterable.js.map +1 -0
  350. package/dist/utils/deferred.d.ts.map +1 -1
  351. package/dist/utils/deferred.js.map +1 -1
  352. package/dist/utils/getOrInsertPolyFill.d.ts +2 -0
  353. package/dist/utils/getOrInsertPolyFill.d.ts.map +1 -0
  354. package/dist/utils/getOrInsertPolyFill.js +12 -0
  355. package/dist/utils/getOrInsertPolyFill.js.map +1 -0
  356. package/dist/utils/logger.d.ts +40 -3
  357. package/dist/utils/logger.d.ts.map +1 -1
  358. package/dist/utils/logger.js +53 -7
  359. package/dist/utils/logger.js.map +1 -1
  360. package/dist/utils/mod.d.ts +6 -1
  361. package/dist/utils/mod.d.ts.map +1 -1
  362. package/dist/utils/mod.js +5 -1
  363. package/dist/utils/mod.js.map +1 -1
  364. package/dist/utils/outboundTopicAliasManager.d.ts +52 -0
  365. package/dist/utils/outboundTopicAliasManager.d.ts.map +1 -0
  366. package/dist/utils/outboundTopicAliasManager.js +74 -0
  367. package/dist/utils/outboundTopicAliasManager.js.map +1 -0
  368. package/dist/utils/queue.d.ts.map +1 -1
  369. package/dist/utils/topicFilter.d.ts +32 -0
  370. package/dist/utils/topicFilter.d.ts.map +1 -0
  371. package/dist/utils/topicFilter.js +52 -0
  372. package/dist/utils/topicFilter.js.map +1 -0
  373. package/dist/utils/utils.d.ts +2 -0
  374. package/dist/utils/utils.d.ts.map +1 -1
  375. package/dist/utils/utils.js +2 -0
  376. package/dist/utils/utils.js.map +1 -1
  377. package/dist/utils/validators.d.ts +34 -0
  378. package/dist/utils/validators.d.ts.map +1 -0
  379. package/dist/utils/validators.js +61 -0
  380. package/dist/utils/validators.js.map +1 -0
  381. package/dist/web/webSocketStream.d.ts +29 -0
  382. package/dist/web/webSocketStream.d.ts.map +1 -0
  383. package/dist/web/webSocketStream.js +69 -0
  384. package/dist/web/webSocketStream.js.map +1 -0
  385. package/dist/web/wrapWebSocket.d.ts +12 -0
  386. package/dist/web/wrapWebSocket.d.ts.map +1 -0
  387. package/dist/web/wrapWebSocket.js +41 -0
  388. package/dist/web/wrapWebSocket.js.map +1 -0
  389. package/dist/web/wsClient.d.ts +7 -0
  390. package/dist/web/wsClient.d.ts.map +1 -0
  391. package/dist/web/wsClient.js +22 -0
  392. package/dist/web/wsClient.js.map +1 -0
  393. package/dist/web/wsClient.test.d.ts +2 -0
  394. package/dist/web/wsClient.test.d.ts.map +1 -0
  395. package/dist/web/wsClient.test.js +20 -0
  396. package/dist/web/wsClient.test.js.map +1 -0
  397. package/examples/authHandler.test.ts +164 -0
  398. package/examples/mqtt.test.ts +89 -0
  399. package/examples/mqtts.test.ts +100 -0
  400. package/examples/webSocket.test.ts +94 -0
  401. package/mqttConn/mqttConn.test.ts +9 -9
  402. package/mqttConn/mqttConn.ts +76 -44
  403. package/mqttPacket/Properties.ts +6 -3
  404. package/mqttPacket/ReasonCode.ts +2 -1
  405. package/mqttPacket/auth.test.ts +1 -1
  406. package/mqttPacket/auth.ts +41 -48
  407. package/mqttPacket/codec.ts +146 -0
  408. package/mqttPacket/connack.ts +57 -68
  409. package/mqttPacket/connect.test.ts +2 -2
  410. package/mqttPacket/connect.ts +175 -182
  411. package/mqttPacket/decoder.test.ts +0 -39
  412. package/mqttPacket/decoder.ts +8 -35
  413. package/mqttPacket/disconnect.ts +57 -68
  414. package/mqttPacket/encoder.ts +5 -40
  415. package/mqttPacket/mod.ts +48 -200
  416. package/mqttPacket/pingreq.ts +21 -27
  417. package/mqttPacket/pingres.ts +21 -27
  418. package/mqttPacket/protocolLevels.ts +12 -7
  419. package/mqttPacket/pubblishAcks.ts +56 -70
  420. package/mqttPacket/publish.ts +67 -74
  421. package/mqttPacket/suback.ts +48 -58
  422. package/mqttPacket/subscribe.ts +141 -117
  423. package/mqttPacket/types.ts +1 -9
  424. package/mqttPacket/unsuback.ts +46 -58
  425. package/mqttPacket/unsubscribe.ts +74 -63
  426. package/mqttPacket/validators.ts +5 -31
  427. package/node/socket-node-stream.test.ts +322 -0
  428. package/node/socket-node-stream.ts +174 -0
  429. package/node/tcpClient.test.ts +70 -0
  430. package/node/tcpClient.ts +13 -12
  431. package/node/tcpServer.test.ts +24 -20
  432. package/node/tcpServer.ts +6 -0
  433. package/node/tlsServer.test.ts +94 -0
  434. package/node/tlsServer.ts +81 -0
  435. package/node/wrapNodeSocket.ts +7 -30
  436. package/package.json +72 -44
  437. package/persistence/basicPersistence.ts +495 -0
  438. package/persistence/deps.ts +11 -1
  439. package/persistence/memory/memoryPersistence.ts +12 -153
  440. package/persistence/memory/memoryStorage.ts +232 -0
  441. package/persistence/mod.ts +4 -9
  442. package/persistence/persistence.test.ts +24 -0
  443. package/persistence/persistence.testing.ts +1324 -0
  444. package/persistence/persistence.ts +111 -67
  445. package/persistence/sqlite/sqliteDatabase.ts +294 -0
  446. package/persistence/sqlite/sqlitePersistence.test.ts +48 -0
  447. package/persistence/sqlite/sqlitePersistence.ts +36 -0
  448. package/persistence/sqlite/sqliteStorage.ts +324 -0
  449. package/persistence/storage.ts +84 -0
  450. package/server/config.ts +65 -0
  451. package/server/context.ts +658 -74
  452. package/server/deps.ts +25 -5
  453. package/server/handlers/completeConnect.ts +93 -0
  454. package/server/handlers/duplicate.test.ts +196 -0
  455. package/server/handlers/handleAuth.test.ts +225 -0
  456. package/server/handlers/handleAuth.ts +88 -0
  457. package/server/handlers/handleConnect.test.ts +589 -0
  458. package/server/handlers/handleConnect.ts +201 -86
  459. package/server/handlers/handleConnect.version.test.ts +108 -0
  460. package/server/handlers/handleDisconnect.test.ts +56 -0
  461. package/server/handlers/handleDisconnect.ts +3 -3
  462. package/server/handlers/handlePacket.test.ts +24 -0
  463. package/server/handlers/handlePacket.ts +30 -8
  464. package/server/handlers/handlePingreq.test.ts +29 -0
  465. package/server/handlers/handlePuback.test.ts +28 -0
  466. package/server/handlers/handlePuback.ts +5 -8
  467. package/server/handlers/handlePubcomp.test.ts +28 -0
  468. package/server/handlers/handlePubcomp.ts +5 -4
  469. package/server/handlers/handlePublish.test.ts +471 -0
  470. package/server/handlers/handlePublish.ts +189 -35
  471. package/server/handlers/handlePubrec.test.ts +28 -0
  472. package/server/handlers/handlePubrec.ts +2 -3
  473. package/server/handlers/handlePubrel.test.ts +74 -0
  474. package/server/handlers/handlePubrel.ts +12 -2
  475. package/server/handlers/handleSubscribe.test.ts +971 -0
  476. package/server/handlers/handleSubscribe.ts +158 -39
  477. package/server/handlers/handleUnsubscribe.test.ts +79 -0
  478. package/server/handlers/handleUnsubscribe.ts +29 -5
  479. package/server/handlers/keepalive.test.ts +132 -0
  480. package/server/handlers/session.persistence.test.ts +194 -0
  481. package/server/handlers/will.delivery.test.ts +221 -0
  482. package/server/mod.ts +4 -3
  483. package/server/preconnect.test.ts +151 -0
  484. package/server/server.ts +115 -17
  485. package/socket/socket.test.ts +91 -0
  486. package/socket/socket.ts +81 -34
  487. package/timer/timer.test.ts +4 -7
  488. package/timer/timer.ts +36 -0
  489. package/tools/benchmarks/receiver.ts +51 -0
  490. package/tools/benchmarks/sender.ts +48 -0
  491. package/tools/benchmarks/utils.ts +31 -0
  492. package/tools/mqtt-compat/README.md +130 -0
  493. package/tools/mqtt-compat/broker.ts +52 -0
  494. package/tools/mqtt-compat/paho-mqtt4.test.ts +379 -0
  495. package/tools/mqtt-compat/paho-mqtt5.tests.ts +887 -0
  496. package/trie/trie.test.ts +9 -1
  497. package/trie/trie.ts +70 -45
  498. package/utils/bufferedAsyncIterable.test.ts +92 -0
  499. package/utils/deferred.test.ts +36 -0
  500. package/utils/deferred.ts +0 -1
  501. package/utils/getOrInsertPolyFill.ts +12 -0
  502. package/utils/logger.test.ts +189 -0
  503. package/utils/logger.ts +62 -7
  504. package/utils/mod.ts +15 -1
  505. package/utils/outboundTopicAliasManager.ts +100 -0
  506. package/utils/queue.test.ts +61 -0
  507. package/utils/topicFilter.test.ts +63 -0
  508. package/utils/topicFilter.ts +61 -0
  509. package/utils/utils.ts +3 -0
  510. package/utils/validators.ts +67 -0
  511. package/web/webSocketStream.ts +97 -0
  512. package/web/wrapWebSocket.ts +52 -0
  513. package/web/wsClient.test.ts +26 -0
  514. package/web/wsClient.ts +25 -0
  515. package/benchmarks/receiver.ts +0 -35
  516. package/benchmarks/sender.ts +0 -32
  517. package/benchmarks/utils.ts +0 -9
  518. package/dev_utils/dummyConn.ts +0 -110
  519. package/dev_utils/socketPair.ts +0 -85
  520. package/dist/persistence/store.d.ts +0 -14
  521. package/dist/persistence/store.d.ts.map +0 -1
  522. package/dist/persistence/store.js +0 -2
  523. package/dist/persistence/store.js.map +0 -1
  524. package/dist/utils/BufferedAsyncIterable.d.ts.map +0 -1
  525. package/dist/utils/BufferedAsyncIterable.js.map +0 -1
  526. package/examples/tcpServer.test.ts +0 -148
  527. package/persistence/memory/memoryPersistence.test.ts +0 -156
  528. package/persistence/store.ts +0 -16
  529. package/server/test/handleConnect.test.ts +0 -122
  530. package/server/test/test-handlers.ts +0 -53
  531. /package/utils/{BufferedAsyncIterable.ts → bufferedAsyncIterable.ts} +0 -0
@@ -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
+ });
@@ -0,0 +1,73 @@
1
+ import { MqttServer } from "../server/mod.ts";
2
+ import type { MqttServerOptions } from "../server/mod.ts";
3
+ import { logger } from "../utils/logger.ts";
4
+ import { wrapWebSocket } from "../web/wrapWebSocket.ts";
5
+ import type { HostnamePort } from "../web/wrapWebSocket.ts";
6
+
7
+ export class WsServer {
8
+ private server?: Deno.HttpServer;
9
+ private mqttServer: MqttServer;
10
+ private listenOptions: Deno.ServeOptions & {
11
+ port: number;
12
+ hostname?: string;
13
+ };
14
+
15
+ constructor(
16
+ serverOptions: Deno.ServeOptions & { port: number; hostname?: string },
17
+ mqttOptions: MqttServerOptions,
18
+ ) {
19
+ this.listenOptions = serverOptions;
20
+ this.mqttServer = new MqttServer(mqttOptions);
21
+ }
22
+ private async handleWsClient(socket: WebSocket, remoteAddr: HostnamePort) {
23
+ const conn = await wrapWebSocket(socket, remoteAddr);
24
+ logger.debug("created conn");
25
+ this.mqttServer.serve(conn);
26
+ logger.debug("serving mqtt");
27
+ }
28
+
29
+ async start(): Promise<void> {
30
+ this.server = Deno.serve(this.listenOptions, (req, info) => {
31
+ const { hostname, port } = info.remoteAddr;
32
+ logger.debug(
33
+ `Server received http connection from ${hostname}:${port}`,
34
+ );
35
+
36
+ if (req.headers.get("upgrade") !== "websocket") {
37
+ return new Response("Expected WebSocket connection.", { status: 426 });
38
+ }
39
+ logger.debug("starting upgrade to websocket");
40
+ const { socket, response } = Deno.upgradeWebSocket(req);
41
+ logger.debug("upgraded to websocket");
42
+ this.handleWsClient(socket, { hostname, port });
43
+ return response;
44
+ });
45
+
46
+ await this.server.finished;
47
+ }
48
+
49
+ stop(): void {
50
+ this.mqttServer.close(true);
51
+ if (this.server) {
52
+ this.server.shutdown();
53
+ }
54
+ }
55
+
56
+ get port(): number | undefined {
57
+ // deno-coverage-ignore-start
58
+ if (this.server?.addr.transport === "tcp") {
59
+ return this.server.addr.port;
60
+ }
61
+ return undefined;
62
+ // deno-coverage-ignore-stop
63
+ }
64
+
65
+ get address(): string | undefined {
66
+ // deno-coverage-ignore-start
67
+ if (this.server?.addr.transport === "tcp") {
68
+ return this.server.addr.hostname;
69
+ }
70
+ return undefined;
71
+ // deno-coverage-ignore-stop
72
+ }
73
+ }