@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
@@ -1,110 +0,0 @@
1
- import type { BufferedAsyncIterable } from "../utils/mod.ts";
2
-
3
- class Uint8Writer implements WritableStreamDefaultWriter {
4
- private buff: Uint8Array;
5
- private pos: number;
6
- closed = Promise.resolve(undefined);
7
- close = () => Promise.resolve();
8
- abort = () => Promise.resolve();
9
- ready = Promise.resolve(undefined);
10
- releaseLock = () => {};
11
- desiredSize = 20;
12
-
13
- constructor(
14
- buff: Uint8Array,
15
- ) {
16
- this.buff = buff;
17
- this.pos = 0;
18
- }
19
- write(chunk: Uint8Array): Promise<void> {
20
- this.buff.set(chunk, this.pos);
21
- this.pos += chunk.length;
22
- return Promise.resolve();
23
- }
24
- }
25
-
26
- class Uint8QueuedWriter implements WritableStreamDefaultWriter {
27
- private queue: BufferedAsyncIterable<Uint8Array>;
28
- closed = Promise.resolve(undefined);
29
- close = () => Promise.resolve();
30
- abort = () => Promise.resolve();
31
- ready = Promise.resolve(undefined);
32
- releaseLock = () => {};
33
- desiredSize = 20;
34
-
35
- constructor(
36
- queue: BufferedAsyncIterable<Uint8Array>,
37
- ) {
38
- this.queue = queue;
39
- }
40
- write(chunk: Uint8Array): Promise<void> {
41
- this.queue.push(chunk);
42
- return Promise.resolve();
43
- }
44
- }
45
-
46
- function readableByteStreamFromArray(readerBuffs: Array<Uint8Array>) {
47
- let i = 0;
48
- return new ReadableStream({
49
- type: "bytes",
50
- pull(controller) {
51
- if (i === readerBuffs.length) {
52
- controller.close();
53
- controller.byobRequest?.respond(0);
54
- return;
55
- }
56
- controller.enqueue(readerBuffs[i++]);
57
- },
58
- });
59
- }
60
-
61
- function ReadableStreamFrom(
62
- iterable: AsyncIterable<Uint8Array>,
63
- ): ReadableStream {
64
- if (!iterable || !(Symbol.asyncIterator in iterable)) {
65
- throw new TypeError("Argument must be an asyncIterable");
66
- }
67
-
68
- return new ReadableStream({
69
- type: "bytes",
70
- async pull(controller) {
71
- const iterator = iterable[Symbol.asyncIterator]();
72
- const next = await iterator.next();
73
-
74
- if (next.done) {
75
- controller.close();
76
- controller.byobRequest?.respond(0);
77
- return;
78
- }
79
- controller.enqueue(next.value);
80
- },
81
- });
82
- }
83
-
84
- export function makeDummySockConn(
85
- readerBuffs: Uint8Array[],
86
- writerBuf: Uint8Array,
87
- close = () => {},
88
- ) {
89
- const readable = readableByteStreamFromArray(readerBuffs);
90
- const writable = new WritableStream(new Uint8Writer(writerBuf));
91
- return {
92
- readable,
93
- writable,
94
- close,
95
- };
96
- }
97
-
98
- export function makeDummyQueueSockConn(
99
- r: BufferedAsyncIterable<Uint8Array>,
100
- w: BufferedAsyncIterable<Uint8Array>,
101
- close = () => {},
102
- ) {
103
- const readable = ReadableStreamFrom(r);
104
- const writable = new WritableStream(new Uint8QueuedWriter(w));
105
- return {
106
- readable,
107
- writable,
108
- close,
109
- };
110
- }
@@ -1,13 +0,0 @@
1
- import type { ClientId, PacketId, PublishPacket, QoS, Topic } from "./deps.ts";
2
- export type PacketStore = Map<PacketId, PublishPacket>;
3
- export type SubscriptionStore = Map<Topic, QoS>;
4
- export interface IStore {
5
- existingSession: boolean;
6
- clientId: ClientId;
7
- pendingIncoming: PacketStore;
8
- pendingOutgoing: PacketStore;
9
- pendingAckOutgoing: Set<PacketId>;
10
- subscriptions: SubscriptionStore;
11
- nextId(): PacketId;
12
- }
13
- //# sourceMappingURL=store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../persistence/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAE/E,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAEvD,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAEhD,MAAM,WAAW,MAAM;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,WAAW,CAAC;IAC7B,eAAe,EAAE,WAAW,CAAC;IAC7B,kBAAkB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,aAAa,EAAE,iBAAiB,CAAC;IACjC,MAAM,IAAI,QAAQ,CAAC;CACpB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../persistence/store.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BufferedAsyncIterable.d.ts","sourceRoot":"","sources":["../../utils/BufferedAsyncIterable.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,qBAAa,qBAAqB,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;;IAC/D,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,IAAI,CAAS;gBAIT,UAAU,GAAE,MAAa;IAK9B,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC;IAM1E,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAYtB,KAAK,CAAC,MAAM,SAAW,GAAG,IAAI;IAO9B,QAAQ,CAAC,IAAI,GAAI,MAAM,CAAC,KAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB7C;IAEF,IAAI,MAAM,IAAI,OAAO,CAEpB;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BufferedAsyncIterable.js","sourceRoot":"","sources":["../../utils/BufferedAsyncIterable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,qBAAqB;IACxB,MAAM,CAAgB;IACtB,UAAU,CAAS;IAEnB,IAAI,GAAG,KAAK,CAAC;IAErB,KAAK,CAAe;IAEpB,YAAY,aAAqB,IAAI;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI;QACF,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAG,CAAC;QAChC,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,EAAK,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,GAAG,QAAQ;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEQ,IAAI,GAAG,CAAC,IAAO,EAAwB,EAAE;QAChD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACzC,8EAA8E;YAC9E,6EAA6E;YAC7E,6EAA6E;YAC7E,2EAA2E;YAC3E,+EAA+E;YAC/E,oCAAoC;YACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -1,148 +0,0 @@
1
- import { test } from "node:test";
2
- import assert from "node:assert/strict";
3
- import { TcpClient } from "@seriousme/opifex/tcpClient";
4
- import { TcpServer } from "@seriousme/opifex/tcpServer";
5
- import { logger, LogLevel } from "@seriousme/opifex/utils";
6
- import type { PublishPacket, QoS } from "@seriousme/opifex/mqttPacket";
7
-
8
- logger.level(LogLevel.info);
9
- export function sleep(ms: number): Promise<unknown> {
10
- return new Promise((r) => setTimeout(r, ms));
11
- }
12
-
13
- test("Test pubSub using client and server", async function () {
14
- const server = new TcpServer({ port: 0 }, {});
15
- server.start();
16
-
17
- assert.deepStrictEqual(
18
- server.port !== undefined,
19
- true,
20
- "server runs a a random port",
21
- );
22
- logger.verbose({ port: server.port, address: server.address });
23
-
24
- const params = {
25
- url: new URL(`mqtt://${server.address}:${server.port}`),
26
- numberOfRetries: 0,
27
- };
28
-
29
- const client = new TcpClient();
30
-
31
- await client.connect(params);
32
- assert(true, "Client connected to server");
33
-
34
- const publishSet: { topic: string; qos: QoS }[] = [
35
- { topic: "t0@q0", qos: 0 },
36
- { topic: "t1@q0", qos: 0 },
37
- { topic: "t2@q0", qos: 0 },
38
- { topic: "t0@q1", qos: 1 },
39
- { topic: "t1@q1", qos: 1 },
40
- { topic: "t2@q1", qos: 1 },
41
- { topic: "t0@q2", qos: 2 },
42
- { topic: "t1@q2", qos: 2 },
43
- { topic: "t2@q2", qos: 2 },
44
- ];
45
-
46
- const subscriptions = publishSet.map((item) => ({
47
- topicFilter: item.topic,
48
- qos: item.qos,
49
- }));
50
- await client.subscribe({
51
- subscriptions,
52
- });
53
-
54
- // the IIFE ensures message reception runs in parallel
55
- logger.verbose(`Start receiving`);
56
- const received: PublishPacket[] = [];
57
- (async function () {
58
- for await (const item of client.messages()) {
59
- logger.verbose(`Receiving: ${item.topic} -- ${item.qos}`);
60
- received.push(item);
61
- }
62
- })();
63
- // end of IIFE
64
- for (const item of publishSet) {
65
- logger.verbose(`Publishing: ${item.topic} -- ${item.qos}`);
66
- await client.publish({
67
- topic: item.topic,
68
- qos: item.qos,
69
- payload: new Uint8Array([0x01]),
70
- });
71
- }
72
-
73
- await sleep(100);
74
- logger.verbose(`Disconnect client`);
75
- await client.disconnect();
76
-
77
- logger.verbose(`Check completeness`);
78
- for (const item of publishSet) {
79
- const found = received.find((f) =>
80
- f.topic == item.topic && f.qos === item.qos
81
- );
82
- logger.verbose(`Found: ${item.topic} -- ${item.qos}`);
83
- assert(found, `${item.topic} -- ${item.qos}`);
84
- }
85
-
86
- logger.verbose(`Stop server`);
87
- server.stop();
88
- });
89
-
90
- test("Test subscription persistence after reconnect", async function () {
91
- // Start server
92
- const server = new TcpServer({ port: 0 }, {});
93
- server.start();
94
-
95
- const params = {
96
- url: new URL(`mqtt://${server.address}:${server.port}`),
97
- numberOfRetries: 0,
98
- };
99
-
100
- const client = new TcpClient();
101
- const testTopic = "test/topic";
102
- const received: PublishPacket[] = [];
103
-
104
- // First connection and subscription
105
- await client.connect(params);
106
- await client.subscribe({
107
- subscriptions: [{
108
- topicFilter: testTopic,
109
- qos: 0,
110
- }],
111
- });
112
-
113
- // Start receiving messages
114
- (async function () {
115
- for await (const item of client.messages()) {
116
- received.push(item);
117
- }
118
- })();
119
-
120
- // Disconnect client
121
- await client.disconnect();
122
- await sleep(100);
123
-
124
- // Reconnect client
125
- await client.connect(params);
126
- await sleep(100);
127
-
128
- // Publish test message
129
- await client.publish({
130
- topic: testTopic,
131
- qos: 0,
132
- payload: new Uint8Array([0x01]),
133
- });
134
-
135
- await sleep(100);
136
- logger.verbose(`Disconnect client`);
137
- await client.disconnect();
138
-
139
- // Verify message was received
140
- assert.equal(received.length, 1, "Should receive one message");
141
- assert.equal(
142
- received[0].topic,
143
- testTopic,
144
- "Should receive message on subscribed topic",
145
- );
146
-
147
- server.stop();
148
- });
@@ -1,156 +0,0 @@
1
- import {
2
- MemoryPersistence as Persistence,
3
- MemoryStore as Store,
4
- } from "./memoryPersistence.ts";
5
-
6
- import assert from "node:assert/strict";
7
- import { test } from "node:test";
8
- import { MQTTLevel, PacketType } from "../deps.ts";
9
- import type { PublishPacket } from "../deps.ts";
10
-
11
- const payloadAny = new TextEncoder().encode("any");
12
- const qos = 1;
13
-
14
- function delay(ms: number): Promise<unknown> {
15
- return new Promise((resolve) => setTimeout(resolve, ms));
16
- }
17
-
18
- test("new should create new Persistence object", () => {
19
- const persistence = new Persistence();
20
- assert.deepStrictEqual(typeof persistence, "object");
21
- assert.deepStrictEqual(persistence instanceof Persistence, true);
22
- });
23
-
24
- test(
25
- "Registering a client should register the client and return a Store Object",
26
- () => {
27
- const persistence = new Persistence();
28
- const clientId = "myClient";
29
- const client = persistence.registerClient(clientId, () => {}, false);
30
- assert.deepStrictEqual(persistence.clientList.has(clientId), true);
31
- assert.deepStrictEqual(typeof client, "object");
32
- assert.deepStrictEqual(client instanceof Store, true);
33
- assert.deepStrictEqual(client.existingSession, false);
34
- },
35
- );
36
-
37
- test("pub/sub should work", async () => {
38
- const persistence = new Persistence();
39
- const clientId = "myClient";
40
- const topic = "/myTopic";
41
- const publishPacket: PublishPacket = {
42
- type: PacketType.publish,
43
- protocolLevel: MQTTLevel.v4,
44
- id: 1,
45
- topic,
46
- payload: payloadAny,
47
- };
48
-
49
- function makePacket(id: number | undefined) {
50
- publishPacket.id = id;
51
- return publishPacket;
52
- }
53
- const seen = new Set();
54
-
55
- function handler(packet: PublishPacket): void {
56
- seen.add(packet.id);
57
- }
58
-
59
- const store = persistence.registerClient(clientId, handler, false);
60
-
61
- persistence.subscribe(store, topic, qos);
62
- assert.deepStrictEqual(
63
- store.subscriptions.has(topic),
64
- true,
65
- "topic is registered as subscription",
66
- );
67
- persistence.publish(topic, makePacket(25));
68
- persistence.publish(topic, makePacket(27));
69
- persistence.publish(topic, makePacket(undefined));
70
- persistence.publish("noTopic", makePacket(undefined));
71
- await delay(10);
72
- assert.deepStrictEqual(seen.size, 3, `received ${seen.size} messages`);
73
- });
74
-
75
- test("many packets should work", async () => {
76
- const persistence = new Persistence();
77
- const clientId = "myClient";
78
- const topic = "/myTopic";
79
- const numMessages = 1000;
80
- const publishPacket: PublishPacket = {
81
- type: PacketType.publish,
82
- protocolLevel: MQTTLevel.v4,
83
- id: 1,
84
- topic,
85
- payload: payloadAny,
86
- };
87
-
88
- function makePacket(id: number | undefined) {
89
- const newPacket = Object.assign({}, publishPacket);
90
- newPacket.id = id;
91
- return newPacket;
92
- }
93
- const seen = new Set();
94
-
95
- function handler(packet: PublishPacket): void {
96
- assert.deepStrictEqual(
97
- seen.has(packet.id),
98
- false,
99
- `Not seen ${packet.id} before`,
100
- );
101
- seen.add(packet.id);
102
- }
103
-
104
- const store = persistence.registerClient(clientId, handler, false);
105
-
106
- persistence.subscribe(store, topic, qos);
107
- assert.deepStrictEqual(
108
- store.subscriptions.has(topic),
109
- true,
110
- "topic is registered as subscription",
111
- );
112
- for (let i = 0; i < numMessages; i++) {
113
- persistence.publish(topic, makePacket(i));
114
- }
115
- await delay(10);
116
- assert.deepStrictEqual(
117
- seen.size,
118
- numMessages,
119
- `received all ${numMessages} messages`,
120
- );
121
- });
122
-
123
- test("unsubscribe should work", () => {
124
- const persistence = new Persistence();
125
- const clientId = "myClient";
126
- const topic = "/myTopic";
127
- const publishPacket: PublishPacket = {
128
- type: PacketType.publish,
129
- protocolLevel: MQTTLevel.v4,
130
- id: 1,
131
- topic,
132
- payload: payloadAny,
133
- };
134
-
135
- const seen = new Set();
136
- function handler(packet: PublishPacket): void {
137
- assert.deepStrictEqual(
138
- seen.has(packet.id),
139
- false,
140
- `Not seen ${packet.id} before`,
141
- );
142
- seen.add(packet.id);
143
- }
144
-
145
- const store = persistence.registerClient(clientId, handler, false);
146
- persistence.subscribe(store, topic, qos);
147
- persistence.unsubscribe(store, topic);
148
-
149
- assert.deepStrictEqual(
150
- store.subscriptions.has(topic),
151
- false,
152
- "topic is still registered as subscription after unsubscription",
153
- );
154
- persistence.publish(topic, publishPacket);
155
- assert.deepStrictEqual(seen.size, 0);
156
- });
@@ -1,15 +0,0 @@
1
- import type { ClientId, PacketId, PublishPacket, QoS, Topic } from "./deps.ts";
2
-
3
- export type PacketStore = Map<PacketId, PublishPacket>;
4
-
5
- export type SubscriptionStore = Map<Topic, QoS>;
6
-
7
- export interface IStore {
8
- existingSession: boolean;
9
- clientId: ClientId;
10
- pendingIncoming: PacketStore;
11
- pendingOutgoing: PacketStore;
12
- pendingAckOutgoing: Set<PacketId>;
13
- subscriptions: SubscriptionStore;
14
- nextId(): PacketId;
15
- }
@@ -1,130 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import { test } from "node:test";
3
- import {
4
- makeDummyQueueSockConn,
5
- resolveNextTick,
6
- } from "../../dev_utils/mod.ts";
7
- import {
8
- type AnyPacket,
9
- AuthenticationResult,
10
- PacketType,
11
- } from "../../mqttPacket/mod.ts";
12
- import { BufferedAsyncIterable } from "../../utils/mod.ts";
13
- import { MqttConn, MQTTLevel } from "../deps.ts";
14
- import { MqttServer } from "../mod.ts";
15
- import { handlers } from "./test-handlers.ts";
16
-
17
- const txtEncoder = new TextEncoder();
18
- // logger.level(LogLevel.debug);
19
-
20
- const connectPacket: AnyPacket = {
21
- type: PacketType.connect,
22
- protocolName: "MQTT",
23
- protocolLevel: 4,
24
- clientId: "testClient",
25
- clean: true,
26
- keepAlive: 0,
27
- username: "IoTester_1",
28
- password: txtEncoder.encode("strong_password"),
29
- will: undefined,
30
- };
31
-
32
- const disconnectPacket: AnyPacket = {
33
- type: PacketType.disconnect,
34
- protocolLevel: MQTTLevel.v4,
35
- };
36
-
37
- const mqttServer = new MqttServer({ handlers });
38
-
39
- function startServer(): {
40
- reader: AsyncIterator<AnyPacket>;
41
- mqttConn: MqttConn;
42
- } {
43
- const reader = new BufferedAsyncIterable<Uint8Array>();
44
- const writer = new BufferedAsyncIterable<Uint8Array>();
45
-
46
- const outputConn = makeDummyQueueSockConn(writer, reader);
47
- const mqttConn = new MqttConn({ conn: outputConn });
48
- const inputConn = makeDummyQueueSockConn(reader, writer, () => {
49
- mqttConn.close();
50
- });
51
- mqttServer.serve(inputConn);
52
- return { reader: mqttConn[Symbol.asyncIterator](), mqttConn };
53
- }
54
-
55
- test("Authentication with valid username and password works", async () => {
56
- const { reader, mqttConn } = startServer();
57
- mqttConn.send(connectPacket);
58
- const { value: connack } = await reader.next();
59
- assert.deepStrictEqual(
60
- connack.type,
61
- PacketType.connack,
62
- "Expect Connack packet",
63
- );
64
- if (connack.type === PacketType.connack) {
65
- assert.deepStrictEqual(
66
- connack.returnCode,
67
- AuthenticationResult.ok,
68
- "Expected OK",
69
- );
70
- }
71
- mqttConn.send(disconnectPacket);
72
- await resolveNextTick();
73
- assert.deepStrictEqual(
74
- mqttConn.isClosed,
75
- true,
76
- "Expected connection to be closed",
77
- );
78
- });
79
-
80
- test("Authentication with invalid username fails", async () => {
81
- const newPacket = Object.assign({}, connectPacket);
82
- newPacket.username = "wrong";
83
- const { reader, mqttConn } = startServer();
84
- mqttConn.send(newPacket);
85
- const { value: connack } = await reader.next();
86
- assert.deepStrictEqual(
87
- connack.type,
88
- PacketType.connack,
89
- "Expected Connack packet",
90
- );
91
- if (connack.type === PacketType.connack) {
92
- assert.deepStrictEqual(
93
- connack.returnCode,
94
- AuthenticationResult.badUsernameOrPassword,
95
- "Expected badUsernameOrPassword",
96
- );
97
- }
98
- await resolveNextTick();
99
- assert.deepStrictEqual(
100
- mqttConn.isClosed,
101
- true,
102
- "Expected connection to be closed",
103
- );
104
- });
105
-
106
- test("Authentication with invalid password fails", async () => {
107
- const newPacket = Object.assign({}, connectPacket);
108
- newPacket.password = undefined;
109
- const { reader, mqttConn } = startServer();
110
- mqttConn.send(newPacket);
111
- const { value: connack } = await reader.next();
112
- assert.deepStrictEqual(
113
- connack.type,
114
- PacketType.connack,
115
- "Expected Connack packet",
116
- );
117
- if (connack.type === PacketType.connack) {
118
- assert.deepStrictEqual(
119
- connack.returnCode,
120
- AuthenticationResult.badUsernameOrPassword,
121
- "Expected badUsernameOrPassword",
122
- );
123
- }
124
- await resolveNextTick();
125
- assert.deepStrictEqual(
126
- mqttConn.isClosed,
127
- true,
128
- "Expected connection to be closed",
129
- );
130
- });
@@ -1,53 +0,0 @@
1
- import { AuthenticationResult } from "../mod.ts";
2
- import { logger } from "../../utils/mod.ts";
3
- import type { TAuthenticationResult } from "../deps.ts";
4
- import type { Context, Topic } from "../mod.ts";
5
-
6
- const utf8Decoder = new TextDecoder();
7
- const userTable = new Map();
8
- userTable.set("IoTester_1", "strong_password");
9
- userTable.set("IoTester_2", "strong_password");
10
- const strictUsername = new RegExp(/^[a-zA-Z0-9]{0,23}$/);
11
-
12
- function isAuthenticated(
13
- _ctx: Context,
14
- clientId: string,
15
- username: string,
16
- password: Uint8Array,
17
- ): TAuthenticationResult {
18
- const pwd = utf8Decoder.decode(password);
19
- logger.debug(
20
- `Verifying authentication of client '${clientId}' with username '${username}' and password '${pwd}'`,
21
- );
22
-
23
- if (!userTable.has(username)) {
24
- if (!strictUsername.test(username)) {
25
- return AuthenticationResult.badUsernameOrPassword;
26
- }
27
- }
28
-
29
- const pass = userTable.get(username);
30
- if (pwd === pass) {
31
- return AuthenticationResult.ok;
32
- }
33
- return AuthenticationResult.badUsernameOrPassword;
34
- }
35
-
36
- function isAuthorizedToPublish(ctx: Context, topic: Topic): boolean {
37
- logger.debug(
38
- `Checking authorization of client '${ctx.store?.clientId}' to publish on topic '${topic}'`,
39
- );
40
- return true;
41
- }
42
- function isAuthorizedToSubscribe(ctx: Context, topic: Topic): boolean {
43
- logger.debug(
44
- `Checking authorization of client '${ctx.store?.clientId}' to subscribe to topic '${topic}'`,
45
- );
46
- return true;
47
- }
48
-
49
- export const handlers = {
50
- isAuthenticated,
51
- isAuthorizedToPublish,
52
- isAuthorizedToSubscribe,
53
- };