@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
@@ -0,0 +1,98 @@
1
+ import { ReasonCode } from "../server/mod.ts";
2
+ import { logger } from "../utils/mod.ts";
3
+ import type {
4
+ AuthenticatedResult,
5
+ Context,
6
+ ShareName,
7
+ Topic,
8
+ } from "../server/mod.ts";
9
+
10
+ const utf8Decoder = new TextDecoder();
11
+ const userTable = new Map();
12
+ userTable.set("IoTester_1", "strong_password");
13
+ userTable.set("IoTester_2", "strong_password");
14
+ const strictUsername = new RegExp(/^[a-zA-Z0-9]{0,23}$/);
15
+
16
+ function isAuthenticated(
17
+ _ctx: Context,
18
+ clientId: string,
19
+ username: string,
20
+ password: Uint8Array,
21
+ ): AuthenticatedResult {
22
+ const pwd = utf8Decoder.decode(password);
23
+ logger.debug(
24
+ `Verifying authentication of client '${clientId}' with username '${username}'`,
25
+ );
26
+
27
+ if (!userTable.has(username)) {
28
+ if (!strictUsername.test(username)) {
29
+ return { reasonCode: ReasonCode.success };
30
+ }
31
+ }
32
+
33
+ const pass = userTable.get(username);
34
+ if (pwd === pass) {
35
+ return { reasonCode: ReasonCode.success };
36
+ }
37
+ return {
38
+ reasonCode: ReasonCode.badUserNameOrPassword,
39
+ reasonString: "Bad username or password",
40
+ };
41
+ }
42
+
43
+ function processAuth(
44
+ _ctx: Context,
45
+ _clientId: string,
46
+ _authMethod: string,
47
+ _authData: Uint8Array,
48
+ ) {
49
+ return {
50
+ reasonCode: ReasonCode.badAuthenticationMethod,
51
+ reasonString: "Authentication method not supported",
52
+ };
53
+ }
54
+
55
+ function isAuthorizedToPublish(ctx: Context, topic: Topic): boolean {
56
+ logger.debug(
57
+ "Checking authorization of client",
58
+ ctx.clientId,
59
+ "to publish on topic",
60
+ topic,
61
+ );
62
+ if (topic === "topic/unauthorized") {
63
+ return false;
64
+ }
65
+ return true;
66
+ }
67
+ function isAuthorizedToSubscribe(
68
+ ctx: Context,
69
+ topic: Topic,
70
+ shareName: ShareName,
71
+ ): boolean {
72
+ logger.debug(
73
+ "Checking authorization of client",
74
+ ctx.clientId,
75
+ "to subscribe to topic",
76
+ topic,
77
+ "using shareName",
78
+ shareName,
79
+ );
80
+ if (topic === "topic/unauthorized") {
81
+ return false;
82
+ }
83
+ return true;
84
+ }
85
+
86
+ export const handlers = {
87
+ isAuthenticated,
88
+ processAuth,
89
+ isAuthorizedToPublish,
90
+ isAuthorizedToSubscribe,
91
+ };
92
+
93
+ export function isAuthenticatedBroker(
94
+ ctx: Context,
95
+ ): AuthenticatedResult {
96
+ ctx.isBroker = true;
97
+ return { reasonCode: ReasonCode.success };
98
+ }
@@ -6,6 +6,9 @@
6
6
  // This will also work on Deno:
7
7
  // https://docs.deno.com/api/node/timers/#namespace_setimmediate
8
8
  import { setImmediate } from "node:timers";
9
+ import { setTimeout as delay } from "node:timers/promises";
10
+ import type { AnyPacket } from "../mqttPacket/mod.ts";
11
+ export { delay };
9
12
 
10
13
  let taskCounter = 0;
11
14
 
@@ -49,3 +52,14 @@ export const resolveAsap = (): Promise<void> => {
49
52
  export const resolveNextTick = (): Promise<void> => {
50
53
  return new Promise((resolve) => setImmediate(resolve));
51
54
  };
55
+
56
+ /**
57
+ * Races a promise to test timeouts
58
+ */
59
+ export function withTimeout(
60
+ promise: Promise<IteratorResult<AnyPacket>>,
61
+ timeoutMs: number,
62
+ ): Promise<IteratorResult<AnyPacket> | null> {
63
+ const timeoutPromise = delay(timeoutMs, null);
64
+ return Promise.race([promise, timeoutPromise]);
65
+ }
@@ -0,0 +1,171 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert";
3
+ import { createWebStreamPair } from "./webStreamPair.ts";
4
+
5
+ test("Echo server shuts down cleanly when client closes input", async () => {
6
+ const { input, output } = createWebStreamPair();
7
+
8
+ const echoPromise = output.readable.pipeTo(output.writable);
9
+
10
+ const writer = input.writable.getWriter();
11
+ const reader = input.readable.getReader();
12
+
13
+ // Client closes their side
14
+ await writer.close();
15
+
16
+ // The echo server's pipeTo should resolve and finish successfully
17
+ await assert.doesNotReject(echoPromise);
18
+
19
+ // The client's reader should now receive the end-of-stream signal
20
+ const { done } = await reader.read();
21
+ assert.strictEqual(done, true);
22
+
23
+ writer.releaseLock();
24
+ reader.releaseLock();
25
+ });
26
+
27
+ test("Data written to input.writable arrives at output.readable", async () => {
28
+ const { input, output } = createWebStreamPair();
29
+
30
+ const echoPromise = output.readable.pipeTo(output.writable);
31
+
32
+ const writer = input.writable.getWriter();
33
+ const reader = input.readable.getReader();
34
+
35
+ const encoder = new TextEncoder();
36
+ const decoder = new TextDecoder();
37
+
38
+ // Write data to the input side
39
+ await writer.write(encoder.encode("Hello streaming world!"));
40
+ await writer.close(); // Close the stream after writing
41
+
42
+ // The echo server's pipeTo should resolve and finish successfully
43
+ await assert.doesNotReject(echoPromise);
44
+
45
+ // Read the data from the input side
46
+ const chunks: Uint8Array[] = [];
47
+
48
+ while (true) {
49
+ const { value, done } = await reader.read();
50
+ if (done) break;
51
+ if (value) chunks.push(value);
52
+ }
53
+
54
+ // Combine chunks and decode to string
55
+ const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
56
+ const resultUint8 = new Uint8Array(totalLength);
57
+ let offset = 0;
58
+ for (const chunk of chunks) {
59
+ resultUint8.set(chunk, offset);
60
+ offset += chunk.length;
61
+ }
62
+
63
+ const readText = decoder.decode(resultUint8);
64
+
65
+ // Verify the text matches exactly
66
+ assert.strictEqual(readText, "Hello streaming world!");
67
+ reader.releaseLock();
68
+ });
69
+
70
+ test("Data can be written and read sequentially before closing", async () => {
71
+ const { input, output } = createWebStreamPair();
72
+ const echoPromise = output.readable.pipeTo(output.writable);
73
+
74
+ const writer = input.writable.getWriter();
75
+ const reader = input.readable.getReader();
76
+
77
+ const encoder = new TextEncoder();
78
+ const decoder = new TextDecoder();
79
+
80
+ // 1. First Write & Read chunk
81
+ await writer.write(encoder.encode("Chunk 1"));
82
+ const result1 = await reader.read();
83
+ assert.strictEqual(result1.done, false);
84
+ assert.strictEqual(decoder.decode(result1.value), "Chunk 1");
85
+
86
+ // 2. Second Write & Read chunk
87
+ await writer.write(encoder.encode("Chunk 2"));
88
+ const result2 = await reader.read();
89
+ assert.strictEqual(result2.done, false);
90
+ assert.strictEqual(decoder.decode(result2.value), "Chunk 2");
91
+
92
+ // 3. Now we close the writable side mid-stream
93
+ await writer.close();
94
+
95
+ // The echo server's pipeTo should resolve and finish successfully
96
+ await assert.doesNotReject(echoPromise);
97
+
98
+ // 4. Verify that the readable side now registers the close signal
99
+ const finalResult = await reader.read();
100
+ assert.strictEqual(finalResult.done, true);
101
+ assert.strictEqual(finalResult.value, undefined);
102
+
103
+ writer.releaseLock();
104
+ reader.releaseLock();
105
+ });
106
+
107
+ test("Client detects when the echo server abruptly closes its end", async () => {
108
+ const { input, output } = createWebStreamPair();
109
+ const encoder = new TextEncoder();
110
+
111
+ // Set up a manual echo server so we can manipulate its controls
112
+ const serverReader = output.readable.getReader();
113
+ const serverWriter = output.writable.getWriter();
114
+
115
+ // Start a basic manual loop in the background
116
+ const serverLoop = (async () => {
117
+ try {
118
+ while (true) {
119
+ const { value, done } = await serverReader.read();
120
+ if (done) break;
121
+ await serverWriter.write(value);
122
+ }
123
+ } finally {
124
+ serverReader.releaseLock();
125
+ serverWriter.releaseLock();
126
+ }
127
+ })();
128
+
129
+ const clientWriter = input.writable.getWriter();
130
+ const clientReader = input.readable.getReader();
131
+
132
+ // --- Simulate Server Shutdown ---
133
+ // The echo server decides to close its writing side out of nowhere
134
+ try {
135
+ await serverWriter.close();
136
+ await serverReader.cancel();
137
+ await serverLoop;
138
+
139
+ const first = await clientReader.read();
140
+ assert.strictEqual(first.done, true);
141
+
142
+ await assert.rejects(
143
+ () => clientWriter.write(encoder.encode("Is anyone there?")),
144
+ /close|invalid/i,
145
+ );
146
+ } finally {
147
+ clientWriter.releaseLock();
148
+ clientReader.releaseLock();
149
+ }
150
+ });
151
+
152
+ test("Repeated close and cancel calls are idempotent", async () => {
153
+ const { input, output } = createWebStreamPair();
154
+
155
+ const inputWriter = input.writable.getWriter();
156
+ const inputReader = input.readable.getReader();
157
+ const outputWriter = output.writable.getWriter();
158
+ const outputReader = output.readable.getReader();
159
+
160
+ await Promise.allSettled([
161
+ inputWriter.close(),
162
+ outputWriter.close(),
163
+ inputReader.cancel(),
164
+ outputReader.cancel(),
165
+ ]);
166
+
167
+ inputWriter.releaseLock();
168
+ inputReader.releaseLock();
169
+ outputWriter.releaseLock();
170
+ outputReader.releaseLock();
171
+ });
@@ -0,0 +1,143 @@
1
+ export interface WebStreamPairEndpoint {
2
+ readable: ReadableStream<Uint8Array>;
3
+ writable: WritableStream<Uint8Array>;
4
+ close: () => void;
5
+ }
6
+
7
+ export function createWebStreamPair(): {
8
+ input: WebStreamPairEndpoint;
9
+ output: WebStreamPairEndpoint;
10
+ } {
11
+ let aController: ReadableStreamDefaultController | null = null;
12
+ let bController: ReadableStreamDefaultController | null = null;
13
+
14
+ let aClosed = false;
15
+ let bClosed = false;
16
+ let aControllerClosed = false;
17
+ let bControllerClosed = false;
18
+
19
+ const aReadable = new ReadableStream({
20
+ start(controller) {
21
+ aController = controller;
22
+ },
23
+ cancel(_reason) {
24
+ aClosed = true;
25
+ tryCloseBoth();
26
+ },
27
+ });
28
+
29
+ const bReadable = new ReadableStream({
30
+ start(controller) {
31
+ bController = controller;
32
+ },
33
+ cancel(_reason) {
34
+ bClosed = true;
35
+ tryCloseBoth();
36
+ },
37
+ });
38
+
39
+ const makeWritable = (
40
+ getPeerController: () => ReadableStreamDefaultController | null,
41
+ markClosed: () => void,
42
+ ) =>
43
+ new WritableStream({
44
+ write(chunk) {
45
+ const peer = getPeerController();
46
+ if (!peer) throw new Error("peer stream not initialized yet");
47
+ peer.enqueue(chunk);
48
+ },
49
+ close() {
50
+ markClosed();
51
+ tryCloseBoth();
52
+ },
53
+ abort(reason) {
54
+ markClosed();
55
+ tryErrorBoth(reason);
56
+ },
57
+ });
58
+
59
+ const aWritable = makeWritable(
60
+ () => bController,
61
+ () => {
62
+ aClosed = true;
63
+ },
64
+ );
65
+
66
+ const bWritable = makeWritable(
67
+ () => aController,
68
+ () => {
69
+ bClosed = true;
70
+ },
71
+ );
72
+
73
+ function closePeerOnce(
74
+ side: "a" | "b",
75
+ controller: ReadableStreamDefaultController | null,
76
+ ) {
77
+ if (!controller) return;
78
+ const isClosed = side === "a" ? aControllerClosed : bControllerClosed;
79
+ if (isClosed) return;
80
+ if (side === "a") {
81
+ aControllerClosed = true;
82
+ } else {
83
+ bControllerClosed = true;
84
+ }
85
+ try {
86
+ controller.close();
87
+ } catch {
88
+ // ignore duplicate shutdown attempts; Node throws if the controller is already closed
89
+ }
90
+ }
91
+
92
+ function errorPeerOnce(
93
+ side: "a" | "b",
94
+ controller: ReadableStreamDefaultController | null,
95
+ reason: unknown,
96
+ ) {
97
+ if (!controller) return;
98
+ const isClosed = side === "a" ? aControllerClosed : bControllerClosed;
99
+ if (isClosed) return;
100
+ if (side === "a") {
101
+ aControllerClosed = true;
102
+ } else {
103
+ bControllerClosed = true;
104
+ }
105
+ try {
106
+ controller.error(reason);
107
+ } catch {
108
+ // ignore duplicate shutdown attempts; Node throws if the controller is already closed
109
+ }
110
+ }
111
+
112
+ function tryCloseBoth() {
113
+ if (aClosed) {
114
+ closePeerOnce("b", bController);
115
+ }
116
+
117
+ if (bClosed) {
118
+ closePeerOnce("a", aController);
119
+ }
120
+ }
121
+
122
+ function tryErrorBoth(reason: unknown) {
123
+ errorPeerOnce("a", aController, reason);
124
+ errorPeerOnce("b", bController, reason);
125
+ }
126
+
127
+ return {
128
+ input: {
129
+ readable: aReadable,
130
+ writable: aWritable,
131
+ close: () => {
132
+ aReadable.cancel();
133
+ },
134
+ },
135
+ output: {
136
+ readable: bReadable,
137
+ writable: bWritable,
138
+ close: () => {
139
+ bReadable.cancel();
140
+ },
141
+ },
142
+ };
143
+ }
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { parseArgs } from "node:util";
8
8
  import { TcpServer } from "../node/tcpServer.js";
9
- import { AuthenticationResult } from "../server/mod.js";
9
+ import { ReasonCode } from "../server/mod.js";
10
10
  import { logger, LogLevel } from "../utils/mod.js";
11
11
  /**
12
12
  * UTF-8 decoder for parsing passwords
@@ -35,27 +35,32 @@ const checkUsername = true;
35
35
  * @param {string} clientId - Client identifier
36
36
  * @param {string} username - Username to authenticate
37
37
  * @param {Uint8Array} password - Password as byte array
38
- * @returns {TAuthenticationResult} Authentication result
38
+ * @param {ConnectPacket} connectPacket - The raw connect packet
39
+ * @returns {IsAuthenticationResult} Authentication result
39
40
  */
40
- function isAuthenticated(_ctx, clientId, username, password) {
41
+ function isAuthenticated(_ctx, clientId, username, password, connectPacket) {
41
42
  const pwd = utf8Decoder.decode(password);
42
- logger.info(`Verifying authentication of client '${clientId}' with username '${username}' and password '${pwd}'`);
43
+ logger.info("Verifying authentication of client", clientId, "with username", username);
44
+ logger.debug("Client", clientId, "connecting with protocol level", connectPacket.protocolLevel);
43
45
  if (!checkUsername) {
44
46
  // allow all users access
45
- return AuthenticationResult.ok;
47
+ return { reasonCode: ReasonCode.success };
46
48
  }
47
49
  // is the username valid according to MQTT specification
48
50
  if (!strictUsername.test(username)) {
49
- return AuthenticationResult.badUsernameOrPassword;
51
+ return { reasonCode: ReasonCode.badUserNameOrPassword };
50
52
  }
51
53
  // Does user and password match an entry in userTable
52
54
  if (userTable.has(username)) {
53
55
  const pass = userTable.get(username);
54
56
  if (pwd === pass) {
55
- return AuthenticationResult.ok;
57
+ return { reasonCode: ReasonCode.success };
56
58
  }
57
59
  }
58
- return AuthenticationResult.notAuthorized;
60
+ return {
61
+ reasonCode: ReasonCode.notAuthorized,
62
+ reasonString: "Authentication failed",
63
+ };
59
64
  }
60
65
  /**
61
66
  * Checks if client is authorized to publish to a topic
@@ -64,7 +69,7 @@ function isAuthenticated(_ctx, clientId, username, password) {
64
69
  * @returns {boolean} True if authorized
65
70
  */
66
71
  function isAuthorizedToPublish(ctx, topic) {
67
- logger.debug(`Checking authorization of client '${ctx.store?.clientId}' to publish on topic '${topic}'`);
72
+ logger.debug("Checking authorization of client", ctx.clientId, "to publish on topic", topic);
68
73
  return true;
69
74
  }
70
75
  /**
@@ -73,8 +78,8 @@ function isAuthorizedToPublish(ctx, topic) {
73
78
  * @param {Topic} topic - Topic to subscribe to
74
79
  * @returns {boolean} True if authorized
75
80
  */
76
- function isAuthorizedToSubscribe(ctx, topic) {
77
- logger.debug(`Checking authorization of client '${ctx.store?.clientId}' to subscribe to topic '${topic}'`);
81
+ function isAuthorizedToSubscribe(ctx, topic, shareName) {
82
+ logger.debug("Checking authorization of client", ctx.clientId, "to subscribe to topic", topic, "using shareName", shareName);
78
83
  return true;
79
84
  }
80
85
  /**
@@ -95,5 +100,5 @@ const tcpServer = new TcpServer({ port, hostname }, {
95
100
  },
96
101
  });
97
102
  tcpServer.start();
98
- logger.info(`Server started on port ${tcpServer.port}`);
103
+ logger.info("Server started on port", tcpServer.port);
99
104
  //# sourceMappingURL=conformanceServer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conformanceServer.js","sourceRoot":"","sources":["../../bin/conformanceServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conformanceServer.js","sourceRoot":"","sources":["../../bin/conformanceServer.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { parseArgs } from "node:util";
7
7
  import { TcpServer } from "../node/tcpServer.js";
8
- import { AuthenticationResult } from "../server/mod.js";
8
+ import { ReasonCode } from "../server/mod.js";
9
9
  import { logger, LogLevel } from "../utils/mod.js";
10
10
  /**
11
11
  * UTF-8 decoder for parsing passwords
@@ -34,27 +34,31 @@ const checkUsername = false;
34
34
  * @param {string} clientId - Client identifier
35
35
  * @param {string} username - Username to authenticate
36
36
  * @param {Uint8Array} password - Password as byte array
37
- * @returns {TAuthenticationResult} Authentication result
37
+ * @returns {IsAuthenticationResult} Authentication result
38
38
  */
39
- function isAuthenticated(_ctx, clientId, username, password) {
39
+ function isAuthenticated(_ctx, clientId, username, password, connectPacket) {
40
40
  const pwd = utf8Decoder.decode(password);
41
- logger.info(`Verifying authentication of client '${clientId}' with username '${username}' and password '${pwd}'`);
41
+ logger.info(`Verifying authentication of client '${clientId}' with username '${username}'`);
42
+ logger.debug(`Client '${clientId}' connecting with protocol level ${connectPacket.protocolLevel}`);
42
43
  if (!checkUsername) {
43
44
  // allow all users access
44
- return AuthenticationResult.ok;
45
+ return { reasonCode: ReasonCode.success };
45
46
  }
46
47
  // is the username valid according to MQTT specification
47
48
  if (!strictUsername.test(username)) {
48
- return AuthenticationResult.badUsernameOrPassword;
49
+ return { reasonCode: ReasonCode.badUserNameOrPassword };
49
50
  }
50
51
  // Does user and password match an entry in userTable
51
52
  if (userTable.has(username)) {
52
53
  const pass = userTable.get(username);
53
54
  if (pwd === pass) {
54
- return AuthenticationResult.ok;
55
+ return { reasonCode: ReasonCode.success };
55
56
  }
56
57
  }
57
- return AuthenticationResult.notAuthorized;
58
+ return {
59
+ reasonCode: ReasonCode.notAuthorized,
60
+ reasonString: "Authentication failed",
61
+ };
58
62
  }
59
63
  /**
60
64
  * Checks if client is authorized to publish to a topic
@@ -63,7 +67,7 @@ function isAuthenticated(_ctx, clientId, username, password) {
63
67
  * @returns {boolean} True if authorized
64
68
  */
65
69
  function isAuthorizedToPublish(ctx, topic) {
66
- logger.debug(`Checking authorization of client '${ctx.store?.clientId}' to publish on topic '${topic}'`);
70
+ logger.debug("Checking authorization of client", ctx.clientId, "to publish on topic", topic);
67
71
  return true;
68
72
  }
69
73
  /**
@@ -72,8 +76,8 @@ function isAuthorizedToPublish(ctx, topic) {
72
76
  * @param {Topic} topic - Topic to subscribe to
73
77
  * @returns {boolean} True if authorized
74
78
  */
75
- function isAuthorizedToSubscribe(ctx, topic) {
76
- logger.debug(`Checking authorization of client '${ctx.store?.clientId}' to subscribe to topic '${topic}'`);
79
+ function isAuthorizedToSubscribe(ctx, topic, shareName) {
80
+ logger.debug("Checking authorization of client", ctx.clientId, "to subscribe to topic", topic, "using shareName", shareName);
77
81
  return true;
78
82
  }
79
83
  /**
@@ -94,5 +98,5 @@ const tcpServer = new TcpServer({ port, hostname }, {
94
98
  },
95
99
  });
96
100
  tcpServer.start();
97
- logger.info(`Server started on port ${tcpServer.port}`);
101
+ logger.info("Server started on port", tcpServer.port);
98
102
  //# sourceMappingURL=demoServer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"demoServer.js","sourceRoot":"","sources":["../../bin/demoServer.ts"],"names":[],"mappings":";AAEA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;AAC5B,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;AAC/C,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;AAE/C;;;GAGG;AACH,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,aAAa,GAAG,KAAK,CAAC;AAE5B;;;;;;;GAOG;AACH,SAAS,eAAe,CACtB,IAAa,EACb,QAAgB,EAChB,QAAgB,EAChB,QAAoB;IAEpB,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,CAAC,IAAI,CACT,uCAAuC,QAAQ,oBAAoB,QAAQ,mBAAmB,GAAG,GAAG,CACrG,CAAC;IAEF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,yBAAyB;QACzB,OAAO,oBAAoB,CAAC,EAAE,CAAC;IACjC,CAAC;IACD,wDAAwD;IACxD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,oBAAoB,CAAC,qBAAqB,CAAC;IACpD,CAAC;IACD,qDAAqD;IACrD,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,oBAAoB,CAAC,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,aAAa,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,GAAY,EAAE,KAAY;IACvD,MAAM,CAAC,KAAK,CACV,qCAAqC,GAAG,CAAC,KAAK,EAAE,QAAQ,0BAA0B,KAAK,GAAG,CAC3F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAAC,GAAY,EAAE,KAAY;IACzD,MAAM,CAAC,KAAK,CACV,qCAAqC,GAAG,CAAC,KAAK,EAAE,QAAQ,4BAA4B,KAAK,GAAG,CAC7F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;AACzE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;AACrC,MAAM,QAAQ,GAAG,IAAI,CAAC;AACtB,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAClD,QAAQ,EAAE;QACR,eAAe;QACf,qBAAqB;QACrB,uBAAuB;KACxB;CACF,CAAC,CAAC;AACH,SAAS,CAAC,KAAK,EAAE,CAAC;AAClB,MAAM,CAAC,IAAI,CAAC,0BAA0B,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"demoServer.js","sourceRoot":"","sources":["../../bin/demoServer.ts"],"names":[],"mappings":"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"}