@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
@@ -0,0 +1,379 @@
1
+ import assert from "node:assert/strict";
2
+ import { test } from "node:test";
3
+ import { MQTTLevel, PacketType } from "../../server/deps.ts";
4
+ import type {
5
+ AnyPacket,
6
+ ConnectPacket,
7
+ PublishPacket,
8
+ ShareName,
9
+ } from "../../server/deps.ts";
10
+ import {
11
+ addMockClient,
12
+ connect,
13
+ delay,
14
+ disconnect,
15
+ isAuthenticatedBroker,
16
+ ping,
17
+ publish,
18
+ receiveMessages,
19
+ startMockServer,
20
+ subscribe,
21
+ unsubscribe,
22
+ } from "../../dev_utils/mod.ts";
23
+
24
+ const txtEncoder = new TextEncoder();
25
+
26
+ const NO_SUBSCRIBE_TOPIC = "test/nosubscribe";
27
+
28
+ // Test configurations matching client_test.py global parameters
29
+ const topics = ["TopicA", "TopicA/B", "Topic/C", "TopicA/C", "/TopicA"];
30
+ const wildtopics = ["TopicA/+", "+/C", "#", "/#", "/+", "+/+", "TopicA/#"];
31
+ const nosubscribeTopics = ["test/nosubscribe"];
32
+
33
+ // --- Tests ---
34
+
35
+ test("Basic test: Connect, Subscribe, and Publish", async () => {
36
+ const { mqttConn, mqttServer } = startMockServer();
37
+
38
+ // Initial clean connect sequence
39
+ await connect(mqttConn, { clientId: "myclientid", clean: true });
40
+ await disconnect(mqttConn);
41
+
42
+ // Reconnect and issue subscription + messages
43
+ const mqttConn2 = addMockClient(mqttServer);
44
+ await connect(mqttConn2, { clientId: "myclientid", clean: false });
45
+ await subscribe(mqttConn2, [{ topicFilter: topics[0], qos: 2 }]);
46
+
47
+ const mqttConn3 = addMockClient(mqttServer);
48
+ await connect(mqttConn3, { clientId: "publisher" });
49
+ await publish(mqttConn3, topics[0], 0, { payload: "qos 0" });
50
+ await publish(mqttConn3, topics[0], 1, { payload: "qos 1", id: 1 });
51
+ await publish(mqttConn3, topics[0], 2, { payload: "qos 2", id: 2 });
52
+ await disconnect(mqttConn3);
53
+ const packets = await receiveMessages(mqttConn2);
54
+ assert.equal(packets.length, 3);
55
+ assert.equal(
56
+ packets.filter((p: AnyPacket) => p.type === PacketType.publish).length,
57
+ 3,
58
+ );
59
+ });
60
+
61
+ test("Retained messages verification and clearance", async () => {
62
+ const { mqttConn, mqttServer } = startMockServer();
63
+ await connect(mqttConn, { clientId: "myclientid", clean: true });
64
+
65
+ // Publish retained messages
66
+ await publish(mqttConn, topics[1], 0, { retain: true, payload: "qos 0" });
67
+ await publish(mqttConn, topics[2], 1, {
68
+ retain: true,
69
+ payload: "qos 1",
70
+ id: 3,
71
+ });
72
+ await publish(mqttConn, topics[3], 2, {
73
+ retain: true,
74
+ payload: "qos 2",
75
+ id: 4,
76
+ });
77
+
78
+ await delay(50);
79
+
80
+ // Bring a secondary client online to assert the retained packets deliver on subscription
81
+ const bConn = addMockClient(mqttServer);
82
+ await connect(bConn, { clientId: "myclientid2", clean: true });
83
+ await subscribe(bConn, [{ topicFilter: wildtopics[5], qos: 2 }]);
84
+
85
+ const packets = await receiveMessages(bConn);
86
+ assert.strictEqual(packets.length, 3);
87
+ assert.equal(
88
+ packets.filter((p: AnyPacket) => p.type === PacketType.publish).length,
89
+ 3,
90
+ );
91
+
92
+ // Clear retained messages by publishing empty payloads
93
+ await publish(mqttConn, topics[1], 0, { retain: true, payload: "" });
94
+ await publish(mqttConn, topics[2], 1, { retain: true, payload: "", id: 5 });
95
+ await publish(mqttConn, topics[3], 2, { retain: true, payload: "", id: 6 });
96
+
97
+ await disconnect(mqttConn);
98
+ });
99
+
100
+ test("Will message execution upon un-clean termination", async () => {
101
+ const { mqttConn: aConn, mqttServer } = startMockServer();
102
+
103
+ const payload = txtEncoder.encode("client not disconnected");
104
+ await connect(aConn, {
105
+ clientId: "myclientid",
106
+ clean: true,
107
+ keepAlive: 2,
108
+ will: {
109
+ topic: topics[2],
110
+ payload,
111
+ qos: 2,
112
+ retain: false,
113
+ },
114
+ });
115
+
116
+ // Setup client B to monitor the Will topic
117
+ const bConn = addMockClient(mqttServer);
118
+ await connect(bConn, { clientId: "myclientid2", clean: false });
119
+ await subscribe(bConn, [{ topicFilter: topics[2], qos: 2 }]);
120
+
121
+ // Kill Connection A abruptly (no DISCONNECT packet sent)
122
+ await aConn.close();
123
+
124
+ // Connection B picks up the system-dispatched Will publication
125
+ const { value: willPacket } = await bConn.next();
126
+ assert.strictEqual(willPacket.type, PacketType.publish);
127
+ assert.strictEqual(willPacket.topic, topics[2]);
128
+
129
+ await disconnect(bConn);
130
+ });
131
+
132
+ test("Zero length Client ID rules under MQTT 3.1.1", async () => {
133
+ const { mqttConn: mqttConn1, mqttServer } = startMockServer();
134
+
135
+ const invalidZeroIdPacket: ConnectPacket = {
136
+ type: PacketType.connect,
137
+ protocolName: "MQTT",
138
+ protocolLevel: MQTTLevel.v4,
139
+ clientId: "",
140
+ clean: false, // Disallowed for zero-length IDs in 3.1.1
141
+ keepAlive: 0,
142
+ };
143
+
144
+ // 1. Clean = false must fail/be rejected
145
+ await mqttConn1.send(invalidZeroIdPacket);
146
+ const response1 = await mqttConn1.next();
147
+ // Server will either return an error Connack code or shut down connection
148
+ if (response1.value) {
149
+ assert.notStrictEqual(response1.value.returnCode, 0);
150
+ }
151
+
152
+ // 2. Clean = true must succeed
153
+ const mqttConn2 = addMockClient(mqttServer);
154
+ invalidZeroIdPacket.clean = true;
155
+ await mqttConn2.send(invalidZeroIdPacket);
156
+ const { value: connack } = await mqttConn2.next();
157
+ assert.strictEqual(connack.type, PacketType.connack);
158
+
159
+ await disconnect(mqttConn2);
160
+ });
161
+
162
+ test("Offline message queueing across clean=false reconnects", async () => {
163
+ const { mqttConn: aConn, mqttServer } = startMockServer();
164
+
165
+ // Connect and subscribe to topic with clean=false
166
+ await connect(aConn, { clientId: "offlineClient", clean: false });
167
+ await subscribe(aConn, [{ topicFilter: wildtopics[5], qos: 2 }]);
168
+ await disconnect(aConn);
169
+
170
+ // Bring on a publisher while target is offline
171
+ const bConn = addMockClient(mqttServer);
172
+ await connect(bConn, { clientId: "publisher", clean: true });
173
+ await publish(bConn, topics[1], 0, { payload: "qos 0" });
174
+ await publish(bConn, topics[2], 1, { payload: "qos 1", id: 10 });
175
+ await publish(bConn, topics[3], 2, { payload: "qos 2", id: 11 });
176
+ await disconnect(bConn);
177
+
178
+ // Re-establish offline target client session
179
+ const aReconnect = addMockClient(mqttServer);
180
+ await connect(aReconnect, { clientId: "offlineClient", clean: false });
181
+
182
+ // Confirm persistent QoS 1 & QoS 2 flights get pushed to consumer
183
+ const msg1 = await aReconnect.next();
184
+ const msg2 = await aReconnect.next();
185
+ assert.strictEqual(msg1.value.type, PacketType.publish);
186
+ assert.strictEqual(msg2.value.type, PacketType.publish);
187
+
188
+ await disconnect(aReconnect);
189
+ });
190
+
191
+ test("Subscribe failure validation returns 0x80", async () => {
192
+ function isAuthorizedToSubscribe(
193
+ _ctx: never,
194
+ topic: string,
195
+ _shareName: ShareName,
196
+ ): boolean {
197
+ return topic !== NO_SUBSCRIBE_TOPIC;
198
+ }
199
+
200
+ const { mqttConn } = startMockServer({
201
+ handlers: { isAuthorizedToSubscribe },
202
+ });
203
+ await connect(mqttConn);
204
+
205
+ const suback = await subscribe(
206
+ mqttConn,
207
+ [{
208
+ topicFilter: nosubscribeTopics[0],
209
+ qos: 2,
210
+ }],
211
+ { id: 1, checkAcks: false },
212
+ );
213
+ assert.deepStrictEqual(suback.returnCodes || [suback.status], [0x80]);
214
+ await disconnect(mqttConn);
215
+ });
216
+
217
+ test("Unsubscribe removes specific active topic metrics", async () => {
218
+ const { mqttConn } = startMockServer();
219
+ await connect(mqttConn);
220
+
221
+ // Register multiple topic patterns
222
+ await subscribe(mqttConn, [
223
+ { topicFilter: topics[0], qos: 2 },
224
+ { topicFilter: topics[1], qos: 2 },
225
+ ]);
226
+
227
+ // Issue UNSUBSCRIBE to single item
228
+ await unsubscribe(mqttConn, [topics[0]], { id: 2 });
229
+ await disconnect(mqttConn);
230
+ });
231
+
232
+ test("Overlapping subscriptions routing behavior", async () => {
233
+ const { mqttConn: aConn, mqttServer } = startMockServer();
234
+ await connect(aConn, { clientId: "overlappingClient" });
235
+
236
+ // Subscribe to multiple overlapping filters matching the same topic
237
+ await subscribe(aConn, [
238
+ { topicFilter: wildtopics[6], qos: 2 }, // TopicA/#
239
+ { topicFilter: wildtopics[0], qos: 1 }, // TopicA/+
240
+ ]);
241
+
242
+ // Publish from a secondary context
243
+ const publisherConn = addMockClient(mqttServer);
244
+ await connect(publisherConn, { clientId: "overlappingPub" });
245
+ await publish(publisherConn, topics[3], 2, {
246
+ payload: "overlapping topic filters",
247
+ }); // TopicA/C
248
+ await disconnect(publisherConn);
249
+
250
+ await delay(50);
251
+
252
+ // Consume incoming payloads sent to the client
253
+ const messages = await receiveMessages(aConn);
254
+ const qos = [];
255
+ for (const mesg of messages) {
256
+ assert.strictEqual(
257
+ mesg.type,
258
+ PacketType.publish,
259
+ "Expecting a PUBLISH packet",
260
+ );
261
+ const packet = mesg as PublishPacket;
262
+ qos.push(packet.qos);
263
+ }
264
+ // The server may send back 1 message with the highest QoS, or 1 message for each matching filter
265
+ assert.ok(
266
+ messages.length === 1 || messages.length === 2,
267
+ "Should receive 1 or 2 messages",
268
+ );
269
+ if (messages.length === 1) {
270
+ assert.strictEqual(
271
+ qos[0],
272
+ 2,
273
+ "Single delivered packet must inherit highest QoS",
274
+ );
275
+ } else {
276
+ const qosLevels = qos.sort();
277
+ assert.deepStrictEqual(
278
+ qosLevels,
279
+ [1, 2],
280
+ "Delivered packets must match both matching subscription QoS layers",
281
+ );
282
+ }
283
+ await disconnect(aConn);
284
+ });
285
+
286
+ test("Keepalive termination triggers Will dispatching", async () => {
287
+ const { mqttConn: aConn, mqttServer } = startMockServer();
288
+
289
+ // Connect Client A with a tight 1 second keepAlive and a Will payload
290
+ await connect(aConn, {
291
+ clientId: "willClient",
292
+ keepAlive: 1,
293
+ will: {
294
+ topic: topics[4], // /TopicA
295
+ payload: txtEncoder.encode("keepalive expiry"),
296
+ qos: 2,
297
+ retain: false,
298
+ },
299
+ });
300
+
301
+ // Client B sits to watch for the dispatching of that Will topic
302
+ const bConn = addMockClient(mqttServer);
303
+ await connect(bConn, { clientId: "observerClient" });
304
+ await subscribe(bConn, [{ topicFilter: topics[4], qos: 2 }]);
305
+
306
+ // We explicitly intentionally idle Client A so that the mock server drops it via timeout rules
307
+ await delay(1600);
308
+
309
+ // Client B should pick up the server-sent Will publication
310
+ const { value: willMsg } = await bConn.next();
311
+ assert.ok(willMsg, "Will publication message should arrive at observer");
312
+ assert.strictEqual(willMsg.type, PacketType.publish);
313
+ assert.strictEqual(willMsg.topic, topics[4]);
314
+
315
+ await disconnect(bConn);
316
+ });
317
+
318
+ test("Redelivery of uncompleted QoS 1 and QoS 2 packets on un-clean reconnect", async () => {
319
+ const { mqttConn: bConn, mqttServer } = startMockServer();
320
+
321
+ // Join session with clean: false
322
+ await connect(bConn, { clientId: "redeliveryClient", clean: false });
323
+ await subscribe(bConn, [{ topicFilter: wildtopics[6], qos: 2 }]); // TopicA/#
324
+
325
+ // Simulate an absolute, sudden transport break (close socket abruptly without a regular DISCONNECT)
326
+ await bConn.close();
327
+
328
+ // Create an unrelated context to pass packets into the offline client's targets
329
+ const publisherConn = addMockClient(mqttServer);
330
+ await connect(publisherConn, { clientId: "redeliveryPub" });
331
+ await publish(publisherConn, topics[1], 1, {
332
+ payload: "qos 1 packet",
333
+ id: 20,
334
+ }); // TopicA/B
335
+ await publish(publisherConn, topics[3], 2, {
336
+ payload: "qos 2 packet",
337
+ id: 21,
338
+ }); // TopicA/C
339
+ await disconnect(publisherConn);
340
+
341
+ await delay(50);
342
+
343
+ // Re-establish our session with clean: false
344
+ const bReconnectConn = addMockClient(mqttServer);
345
+ await connect(bReconnectConn, { clientId: "redeliveryClient", clean: false });
346
+
347
+ // Assert that both messages get safely pushed immediately onto the reconnected line
348
+ const msg1 = await bReconnectConn.next();
349
+ const msg2 = await bReconnectConn.next();
350
+
351
+ assert.strictEqual(msg1.value?.type, PacketType.publish);
352
+ assert.strictEqual(msg2.value?.type, PacketType.publish);
353
+
354
+ await disconnect(bReconnectConn);
355
+ });
356
+
357
+ test("$ dollar-sign topics isolation from wildcard tracking", async () => {
358
+ const { mqttConn: bConn, mqttServer } = startMockServer({
359
+ handlers: {
360
+ isAuthenticated: isAuthenticatedBroker,
361
+ },
362
+ });
363
+ await connect(bConn, { clientId: "dollarClient", clean: true });
364
+
365
+ // Subscribing to broad wildcard '#' should not match hidden system '$' topics
366
+ await subscribe(bConn, [{ topicFilter: wildtopics[5], qos: 2 }]); // '#'
367
+
368
+ // Publish explicitly to a system target structure string
369
+ const publisherConn = addMockClient(mqttServer);
370
+ await connect(publisherConn, { clientId: "dollarPub" });
371
+ await publish(publisherConn, "$" + topics[1], 1, {
372
+ payload: "hidden system info",
373
+ });
374
+ await disconnect(publisherConn);
375
+
376
+ // make sure we didn't get any publish
377
+ await ping(bConn);
378
+ await disconnect(bConn);
379
+ });