@seriousme/opifex 1.11.3 → 2.1.0

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 (542) 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 +3 -1
  6. package/client/client.ts +88 -47
  7. package/client/context.ts +79 -27
  8. package/client/deps.ts +10 -3
  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 +18 -8
  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 +13 -2
  29. package/client/store/memoryStore.ts +12 -11
  30. package/client/store/store.ts +4 -2
  31. package/deno/README.md +1 -2
  32. package/deno/tcpClient.test.ts +75 -0
  33. package/deno/tcpClient.ts +36 -18
  34. package/deno/tcpServer.test.ts +22 -21
  35. package/deno/tcpServer.ts +26 -4
  36. package/deno/tlsServer.test.ts +97 -0
  37. package/deno/tlsServer.ts +58 -0
  38. package/deno/wsServer.test.ts +93 -0
  39. package/deno/wsServer.ts +96 -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 +3 -1
  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 +47 -21
  60. package/dist/client/client.d.ts.map +1 -1
  61. package/dist/client/client.js +57 -20
  62. package/dist/client/client.js.map +1 -1
  63. package/dist/client/context.d.ts +15 -7
  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 +4 -3
  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 +3 -2
  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 +3 -3
  104. package/dist/client/store/memoryStore.d.ts.map +1 -1
  105. package/dist/client/store/memoryStore.js +3 -3
  106. package/dist/client/store/memoryStore.js.map +1 -1
  107. package/dist/client/store/store.d.ts +3 -2
  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 +24 -31
  128. package/dist/mqttConn/mqttConn.d.ts.map +1 -1
  129. package/dist/mqttConn/mqttConn.js +57 -36
  130. package/dist/mqttConn/mqttConn.js.map +1 -1
  131. package/dist/mqttPacket/AuthenticationResult.d.ts +4 -0
  132. package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -1
  133. package/dist/mqttPacket/AuthenticationResult.js.map +1 -1
  134. package/dist/mqttPacket/BitMask.d.ts.map +1 -1
  135. package/dist/mqttPacket/PacketType.d.ts +4 -0
  136. package/dist/mqttPacket/PacketType.d.ts.map +1 -1
  137. package/dist/mqttPacket/Properties.d.ts +4 -4
  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 +4 -5
  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 +4 -0
  145. package/dist/mqttPacket/RetainHandling.d.ts.map +1 -1
  146. package/dist/mqttPacket/auth.d.ts +7 -8
  147. package/dist/mqttPacket/auth.d.ts.map +1 -1
  148. package/dist/mqttPacket/auth.js +31 -30
  149. package/dist/mqttPacket/auth.js.map +1 -1
  150. package/dist/mqttPacket/codec.d.ts +48 -0
  151. package/dist/mqttPacket/codec.d.ts.map +1 -0
  152. package/dist/mqttPacket/codec.js +93 -0
  153. package/dist/mqttPacket/codec.js.map +1 -0
  154. package/dist/mqttPacket/connack.d.ts +11 -10
  155. package/dist/mqttPacket/connack.d.ts.map +1 -1
  156. package/dist/mqttPacket/connack.js +43 -45
  157. package/dist/mqttPacket/connack.js.map +1 -1
  158. package/dist/mqttPacket/connect.d.ts +7 -7
  159. package/dist/mqttPacket/connect.d.ts.map +1 -1
  160. package/dist/mqttPacket/connect.js +156 -157
  161. package/dist/mqttPacket/connect.js.map +1 -1
  162. package/dist/mqttPacket/decoder.d.ts +6 -16
  163. package/dist/mqttPacket/decoder.d.ts.map +1 -1
  164. package/dist/mqttPacket/decoder.js +7 -28
  165. package/dist/mqttPacket/decoder.js.map +1 -1
  166. package/dist/mqttPacket/disconnect.d.ts +9 -8
  167. package/dist/mqttPacket/disconnect.d.ts.map +1 -1
  168. package/dist/mqttPacket/disconnect.js +41 -43
  169. package/dist/mqttPacket/disconnect.js.map +1 -1
  170. package/dist/mqttPacket/encoder.d.ts +7 -19
  171. package/dist/mqttPacket/encoder.d.ts.map +1 -1
  172. package/dist/mqttPacket/encoder.js +5 -28
  173. package/dist/mqttPacket/encoder.js.map +1 -1
  174. package/dist/mqttPacket/mod.d.ts +21 -103
  175. package/dist/mqttPacket/mod.d.ts.map +1 -1
  176. package/dist/mqttPacket/mod.js +5 -94
  177. package/dist/mqttPacket/mod.js.map +1 -1
  178. package/dist/mqttPacket/pingreq.d.ts +6 -6
  179. package/dist/mqttPacket/pingreq.d.ts.map +1 -1
  180. package/dist/mqttPacket/pingreq.js +11 -13
  181. package/dist/mqttPacket/pingreq.js.map +1 -1
  182. package/dist/mqttPacket/pingres.d.ts +6 -6
  183. package/dist/mqttPacket/pingres.d.ts.map +1 -1
  184. package/dist/mqttPacket/pingres.js +11 -13
  185. package/dist/mqttPacket/pingres.js.map +1 -1
  186. package/dist/mqttPacket/protocolLevels.d.ts +11 -6
  187. package/dist/mqttPacket/protocolLevels.d.ts.map +1 -1
  188. package/dist/mqttPacket/protocolLevels.js +5 -1
  189. package/dist/mqttPacket/protocolLevels.js.map +1 -1
  190. package/dist/mqttPacket/pubblishAcks.d.ts +9 -10
  191. package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -1
  192. package/dist/mqttPacket/pubblishAcks.js +43 -45
  193. package/dist/mqttPacket/pubblishAcks.js.map +1 -1
  194. package/dist/mqttPacket/publish.d.ts +8 -7
  195. package/dist/mqttPacket/publish.d.ts.map +1 -1
  196. package/dist/mqttPacket/publish.js +53 -55
  197. package/dist/mqttPacket/publish.js.map +1 -1
  198. package/dist/mqttPacket/suback.d.ts +9 -8
  199. package/dist/mqttPacket/suback.d.ts.map +1 -1
  200. package/dist/mqttPacket/suback.js +38 -40
  201. package/dist/mqttPacket/suback.js.map +1 -1
  202. package/dist/mqttPacket/subscribe.d.ts +41 -10
  203. package/dist/mqttPacket/subscribe.d.ts.map +1 -1
  204. package/dist/mqttPacket/subscribe.js +90 -89
  205. package/dist/mqttPacket/subscribe.js.map +1 -1
  206. package/dist/mqttPacket/types.d.ts +2 -29
  207. package/dist/mqttPacket/types.d.ts.map +1 -1
  208. package/dist/mqttPacket/unsuback.d.ts +9 -8
  209. package/dist/mqttPacket/unsuback.d.ts.map +1 -1
  210. package/dist/mqttPacket/unsuback.js +32 -34
  211. package/dist/mqttPacket/unsuback.js.map +1 -1
  212. package/dist/mqttPacket/unsubscribe.d.ts +26 -8
  213. package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
  214. package/dist/mqttPacket/unsubscribe.js +45 -44
  215. package/dist/mqttPacket/unsubscribe.js.map +1 -1
  216. package/dist/mqttPacket/validators.d.ts +4 -16
  217. package/dist/mqttPacket/validators.d.ts.map +1 -1
  218. package/dist/mqttPacket/validators.js +5 -26
  219. package/dist/mqttPacket/validators.js.map +1 -1
  220. package/dist/node/tcpClient.d.ts +22 -2
  221. package/dist/node/tcpClient.d.ts.map +1 -1
  222. package/dist/node/tcpClient.js +29 -10
  223. package/dist/node/tcpClient.js.map +1 -1
  224. package/dist/node/tcpServer.d.ts +18 -0
  225. package/dist/node/tcpServer.d.ts.map +1 -1
  226. package/dist/node/tcpServer.js +21 -2
  227. package/dist/node/tcpServer.js.map +1 -1
  228. package/dist/node/tlsServer.d.ts +37 -0
  229. package/dist/node/tlsServer.d.ts.map +1 -0
  230. package/dist/node/tlsServer.js +73 -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 +45 -70
  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 +199 -25
  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 +9 -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 +32 -9
  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 +15 -9
  340. package/dist/socket/socket.d.ts.map +1 -1
  341. package/dist/socket/socket.js +66 -18
  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 +61 -41
  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 +42 -5
  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 +14 -0
  396. package/dist/web/wsClient.d.ts.map +1 -0
  397. package/dist/web/wsClient.js +33 -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 +76 -60
  409. package/mqttPacket/AuthenticationResult.ts +6 -0
  410. package/mqttPacket/PacketType.ts +5 -0
  411. package/mqttPacket/Properties.ts +8 -5
  412. package/mqttPacket/ReasonCode.ts +8 -9
  413. package/mqttPacket/RetainHandling.ts +5 -0
  414. package/mqttPacket/auth.test.ts +1 -1
  415. package/mqttPacket/auth.ts +44 -51
  416. package/mqttPacket/codec.ts +147 -0
  417. package/mqttPacket/connack.ts +63 -73
  418. package/mqttPacket/connect.test.ts +2 -2
  419. package/mqttPacket/connect.ts +178 -192
  420. package/mqttPacket/decoder.test.ts +0 -39
  421. package/mqttPacket/decoder.ts +17 -46
  422. package/mqttPacket/disconnect.ts +60 -71
  423. package/mqttPacket/encoder.test.ts +2 -2
  424. package/mqttPacket/encoder.ts +13 -46
  425. package/mqttPacket/mod.ts +48 -204
  426. package/mqttPacket/pingreq.ts +22 -28
  427. package/mqttPacket/pingres.ts +22 -28
  428. package/mqttPacket/protocolLevels.ts +12 -7
  429. package/mqttPacket/pubblishAcks.ts +61 -75
  430. package/mqttPacket/publish.ts +70 -84
  431. package/mqttPacket/publishAcks.test.ts +3 -3
  432. package/mqttPacket/suback.ts +53 -68
  433. package/mqttPacket/subscribe.ts +146 -128
  434. package/mqttPacket/types.ts +2 -35
  435. package/mqttPacket/unsuback.ts +50 -61
  436. package/mqttPacket/unsubscribe.ts +77 -72
  437. package/mqttPacket/validators.ts +5 -31
  438. package/node/socket-node-stream.test.ts +322 -0
  439. package/node/socket-node-stream.ts +174 -0
  440. package/node/tcpClient.test.ts +70 -0
  441. package/node/tcpClient.ts +33 -17
  442. package/node/tcpServer.test.ts +24 -20
  443. package/node/tcpServer.ts +29 -6
  444. package/node/tlsServer.test.ts +94 -0
  445. package/node/tlsServer.ts +97 -0
  446. package/node/wrapNodeSocket.ts +7 -30
  447. package/package.json +72 -44
  448. package/persistence/basicPersistence.ts +495 -0
  449. package/persistence/deps.ts +11 -1
  450. package/persistence/memory/memoryPersistence.ts +12 -153
  451. package/persistence/memory/memoryStorage.ts +232 -0
  452. package/persistence/mod.ts +5 -10
  453. package/persistence/persistence.test.ts +24 -0
  454. package/persistence/persistence.testing.ts +1324 -0
  455. package/persistence/persistence.ts +112 -68
  456. package/persistence/sqlite/sqliteDatabase.ts +294 -0
  457. package/persistence/sqlite/sqlitePersistence.test.ts +48 -0
  458. package/persistence/sqlite/sqlitePersistence.ts +36 -0
  459. package/persistence/sqlite/sqliteStorage.ts +324 -0
  460. package/persistence/storage.ts +84 -0
  461. package/server/config.ts +65 -0
  462. package/server/context.ts +660 -76
  463. package/server/deps.ts +24 -5
  464. package/server/handlers/completeConnect.ts +93 -0
  465. package/server/handlers/duplicate.test.ts +196 -0
  466. package/server/handlers/handleAuth.test.ts +225 -0
  467. package/server/handlers/handleAuth.ts +88 -0
  468. package/server/handlers/handleConnect.test.ts +589 -0
  469. package/server/handlers/handleConnect.ts +201 -86
  470. package/server/handlers/handleConnect.version.test.ts +108 -0
  471. package/server/handlers/handleDisconnect.test.ts +56 -0
  472. package/server/handlers/handleDisconnect.ts +3 -3
  473. package/server/handlers/handlePacket.test.ts +24 -0
  474. package/server/handlers/handlePacket.ts +30 -8
  475. package/server/handlers/handlePingreq.test.ts +29 -0
  476. package/server/handlers/handlePuback.test.ts +28 -0
  477. package/server/handlers/handlePuback.ts +5 -8
  478. package/server/handlers/handlePubcomp.test.ts +28 -0
  479. package/server/handlers/handlePubcomp.ts +5 -4
  480. package/server/handlers/handlePublish.test.ts +471 -0
  481. package/server/handlers/handlePublish.ts +188 -35
  482. package/server/handlers/handlePubrec.test.ts +28 -0
  483. package/server/handlers/handlePubrec.ts +2 -3
  484. package/server/handlers/handlePubrel.test.ts +74 -0
  485. package/server/handlers/handlePubrel.ts +12 -2
  486. package/server/handlers/handleSubscribe.test.ts +971 -0
  487. package/server/handlers/handleSubscribe.ts +157 -39
  488. package/server/handlers/handleUnsubscribe.test.ts +79 -0
  489. package/server/handlers/handleUnsubscribe.ts +28 -4
  490. package/server/handlers/keepalive.test.ts +132 -0
  491. package/server/handlers/session.persistence.test.ts +194 -0
  492. package/server/handlers/will.delivery.test.ts +221 -0
  493. package/server/mod.ts +5 -4
  494. package/server/preconnect.test.ts +151 -0
  495. package/server/server.ts +117 -19
  496. package/socket/socket.test.ts +91 -0
  497. package/socket/socket.ts +85 -34
  498. package/timer/timer.test.ts +4 -7
  499. package/timer/timer.ts +36 -0
  500. package/tools/benchmarks/receiver.ts +51 -0
  501. package/tools/benchmarks/sender.ts +48 -0
  502. package/tools/benchmarks/utils.ts +31 -0
  503. package/tools/mqtt-compat/README.md +130 -0
  504. package/tools/mqtt-compat/broker.ts +52 -0
  505. package/tools/mqtt-compat/paho-mqtt4.test.ts +379 -0
  506. package/tools/mqtt-compat/paho-mqtt5.tests.ts +887 -0
  507. package/trie/trie.test.ts +9 -1
  508. package/trie/trie.ts +70 -45
  509. package/utils/bufferedAsyncIterable.test.ts +92 -0
  510. package/utils/deferred.test.ts +36 -0
  511. package/utils/deferred.ts +0 -1
  512. package/utils/getOrInsertPolyFill.ts +12 -0
  513. package/utils/logger.test.ts +189 -0
  514. package/utils/logger.ts +64 -9
  515. package/utils/mod.ts +15 -1
  516. package/utils/outboundTopicAliasManager.ts +100 -0
  517. package/utils/queue.test.ts +61 -0
  518. package/utils/topicFilter.test.ts +63 -0
  519. package/utils/topicFilter.ts +61 -0
  520. package/utils/utils.ts +3 -0
  521. package/utils/validators.ts +67 -0
  522. package/web/webSocketStream.ts +97 -0
  523. package/web/wrapWebSocket.ts +52 -0
  524. package/web/wsClient.test.ts +26 -0
  525. package/web/wsClient.ts +37 -0
  526. package/benchmarks/receiver.ts +0 -35
  527. package/benchmarks/sender.ts +0 -32
  528. package/benchmarks/utils.ts +0 -9
  529. package/dev_utils/dummyConn.ts +0 -110
  530. package/dev_utils/socketPair.ts +0 -85
  531. package/dist/persistence/store.d.ts +0 -14
  532. package/dist/persistence/store.d.ts.map +0 -1
  533. package/dist/persistence/store.js +0 -2
  534. package/dist/persistence/store.js.map +0 -1
  535. package/dist/utils/BufferedAsyncIterable.d.ts.map +0 -1
  536. package/dist/utils/BufferedAsyncIterable.js.map +0 -1
  537. package/examples/tcpServer.test.ts +0 -148
  538. package/persistence/memory/memoryPersistence.test.ts +0 -156
  539. package/persistence/store.ts +0 -16
  540. package/server/test/handleConnect.test.ts +0 -122
  541. package/server/test/test-handlers.ts +0 -53
  542. /package/utils/{BufferedAsyncIterable.ts → bufferedAsyncIterable.ts} +0 -0
@@ -1,13 +1,5 @@
1
- import type {
2
- ClientId,
3
- CodecOpts,
4
- Payload,
5
- ProtocolLevel,
6
- ProtocolLevelNoV5,
7
- QoS,
8
- Topic,
9
- TPacketType,
10
- } from "./types.ts";
1
+ import type { ClientId, CodecOpts, Payload, QoS, Topic } from "./types.ts";
2
+ import type { ProtocolLevel, ProtocolLevelNoV5 } from "./protocolLevels.ts";
11
3
  import type { ConnectProperties, WillProperties } from "./Properties.ts";
12
4
  import { PropertySetType } from "./Properties.ts";
13
5
  import { PacketType } from "./PacketType.ts";
@@ -21,7 +13,7 @@ import {
21
13
  } from "./decoder.ts";
22
14
 
23
15
  export type ConnectPacketV4 = {
24
- type: TPacketType;
16
+ type: PacketType;
25
17
  protocolName?: string | undefined;
26
18
  protocolLevel: ProtocolLevelNoV5;
27
19
  clientId?: ClientId | undefined;
@@ -39,7 +31,7 @@ export type ConnectPacketV4 = {
39
31
  };
40
32
 
41
33
  export type ConnectPacketV5 = {
42
- type: TPacketType;
34
+ type: PacketType;
43
35
  protocolName?: string | undefined;
44
36
  protocolLevel: 5;
45
37
  clientId?: ClientId | undefined;
@@ -76,221 +68,215 @@ function invalidProtocolName(version: number, name: string): boolean {
76
68
  return true;
77
69
  }
78
70
 
79
- export const connect: {
80
- encode(packet: ConnectPacket, _codecOpts: CodecOpts): Uint8Array;
81
- decode(
82
- buffer: Uint8Array,
83
- flags: number,
84
- codecOpts: CodecOpts,
85
- packetType: TPacketType,
86
- ): ConnectPacket;
87
- } = {
88
- encode(packet: ConnectPacket, codecOpts: CodecOpts): Uint8Array {
89
- const flags = 0;
71
+ export function encode(
72
+ packet: ConnectPacket,
73
+ codecOpts: CodecOpts,
74
+ ): Uint8Array {
75
+ const flags = 0;
90
76
 
91
- if (typeof packet.protocolLevel !== "number") {
92
- throw new EncoderError("Protocol level must be a number");
93
- }
94
- const protocolLevel = packet.protocolLevel || 4;
95
- if (protocolLevel < 3 || protocolLevel > 5) {
96
- throw new EncoderError("Unsupported protocol level");
97
- }
98
- const protocolName = protocolLevel > 3 ? "MQTT" : "MQIsdp";
99
- const clientId = packet.clientId || "";
100
- const usernameFlag = packet.username !== undefined;
101
- if (protocolLevel === 3 && clientId === "") {
102
- throw new EncoderError("Client id required for protocol level 3");
103
- }
104
- const passwordFlag = usernameFlag && packet.password !== undefined;
105
- const willRetain = !!packet.will?.retain;
106
- const willQoS = packet.will?.qos || 0;
107
- const willFlag = packet.will !== undefined;
108
- if (willFlag) {
109
- if (packet.will?.topic === undefined) {
110
- throw new EncoderError("Will topic must be defined");
111
- }
112
- if (packet.will?.payload === undefined) {
113
- throw new EncoderError("Will payload must be defined");
114
- }
77
+ // deno-coverage-ignore-start
78
+ if (typeof packet.protocolLevel !== "number") {
79
+ throw new EncoderError("Protocol level must be a number");
80
+ }
81
+ const protocolLevel = packet.protocolLevel || 4;
82
+ if (protocolLevel < 3 || protocolLevel > 5) {
83
+ throw new EncoderError("Unsupported protocol level");
84
+ }
85
+ // deno-coverage-ignore-stop
86
+ const protocolName = protocolLevel > 3 ? "MQTT" : "MQIsdp";
87
+ const clientId = packet.clientId || "";
88
+ const usernameFlag = packet.username !== undefined;
89
+ if (protocolLevel === 3 && clientId === "") {
90
+ throw new EncoderError("Client id required for protocol level 3");
91
+ }
92
+ const passwordFlag = usernameFlag && packet.password !== undefined;
93
+ const willRetain = !!packet.will?.retain;
94
+ const willQoS = packet.will?.qos || 0;
95
+ const willFlag = packet.will !== undefined;
96
+ if (willFlag) {
97
+ if (packet.will?.topic === undefined) {
98
+ throw new EncoderError("Will topic must be defined");
115
99
  }
116
- const cleanSession = packet.clean !== false;
117
- if (!cleanSession && (clientId === "")) {
118
- throw new EncoderError("Client id required for clean session");
100
+ if (packet.will?.payload === undefined) {
101
+ throw new EncoderError("Will payload must be defined");
119
102
  }
120
- const connectFlags = (usernameFlag ? BitMask.bit7 : 0) +
121
- (passwordFlag ? BitMask.bit6 : 0) +
122
- (willRetain ? BitMask.bit5 : 0) +
123
- (willQoS & 2 ? BitMask.bit4 : 0) +
124
- (willQoS & 1 ? BitMask.bit3 : 0) +
125
- (willFlag ? BitMask.bit2 : 0) +
126
- (cleanSession ? BitMask.bit1 : 0);
127
- const keepAlive = packet.keepAlive || 0;
128
- const bridgeMode = !!packet.bridgeMode;
129
- const rawProtocolLevel = bridgeMode ? protocolLevel + 128 : protocolLevel;
103
+ }
104
+ const cleanSession = packet.clean !== false;
105
+ if (!cleanSession && (clientId === "")) {
106
+ throw new EncoderError("Client id required for non-clean session");
107
+ }
108
+ const connectFlags = (usernameFlag ? BitMask.bit7 : 0) +
109
+ (passwordFlag ? BitMask.bit6 : 0) +
110
+ (willRetain ? BitMask.bit5 : 0) +
111
+ (willQoS & 2 ? BitMask.bit4 : 0) +
112
+ (willQoS & 1 ? BitMask.bit3 : 0) +
113
+ (willFlag ? BitMask.bit2 : 0) +
114
+ (cleanSession ? BitMask.bit1 : 0);
115
+ const keepAlive = packet.keepAlive || 0;
116
+ const bridgeMode = !!packet.bridgeMode;
117
+ const rawProtocolLevel = bridgeMode ? protocolLevel + 128 : protocolLevel;
130
118
 
131
- const encoder = new Encoder(packet.type);
132
- encoder
133
- .setUtf8String(protocolName)
134
- .setByte(rawProtocolLevel)
135
- .setByte(connectFlags)
136
- .setInt16(keepAlive);
119
+ const encoder = new Encoder(packet.type);
120
+ encoder
121
+ .setUtf8String(protocolName)
122
+ .setByte(rawProtocolLevel)
123
+ .setByte(connectFlags)
124
+ .setInt16(keepAlive);
125
+ if (packet.protocolLevel === 5) {
126
+ encoder.setProperties(
127
+ packet.properties || {},
128
+ PropertySetType.connect,
129
+ codecOpts.maxOutgoingPacketSize,
130
+ );
131
+ }
132
+ encoder.setUtf8String(clientId);
133
+
134
+ if (
135
+ packet.will !== undefined && packet.will.topic !== undefined &&
136
+ packet.will.payload !== undefined
137
+ ) {
137
138
  if (packet.protocolLevel === 5) {
138
139
  encoder.setProperties(
139
- packet.properties || {},
140
- PropertySetType.connect,
140
+ packet.will?.properties || {},
141
+ PropertySetType.will,
141
142
  codecOpts.maxOutgoingPacketSize,
142
143
  );
143
144
  }
144
- encoder.setUtf8String(clientId);
145
-
146
- if (
147
- packet.will !== undefined && packet.will.topic !== undefined &&
148
- packet.will.payload !== undefined
149
- ) {
150
- if (packet.protocolLevel === 5) {
151
- encoder.setProperties(
152
- packet.will?.properties || {},
153
- PropertySetType.will,
154
- codecOpts.maxOutgoingPacketSize,
155
- );
156
- }
157
- encoder.setTopic(packet.will.topic).setByteArray(packet.will.payload);
158
- }
145
+ encoder.setUtf8String(packet.will.topic);
146
+ encoder.setByteArray(packet.will.payload);
147
+ }
159
148
 
160
- if (packet.username !== undefined) {
161
- encoder.setUtf8String(packet.username);
162
- }
149
+ if (packet.username !== undefined) {
150
+ encoder.setUtf8String(packet.username);
151
+ }
163
152
 
164
- if (passwordFlag && packet.password !== undefined) {
165
- encoder.setByteArray(packet.password);
166
- }
167
- return encoder.done(flags);
168
- },
153
+ if (passwordFlag && packet.password !== undefined) {
154
+ encoder.setByteArray(packet.password);
155
+ }
156
+ return encoder.done(flags);
157
+ }
169
158
 
170
- decode(
171
- buffer: Uint8Array,
172
- flags: number,
173
- _codecOpts: CodecOpts,
174
- packetType: TPacketType,
175
- ): ConnectPacket {
176
- const decoder = new Decoder(packetType, buffer);
177
- const protocolName = decoder.getUTF8String();
178
- const rawProtocolLevel = decoder.getByte();
179
- const bridgeMode = rawProtocolLevel > 128;
180
- const protocolLevel = bridgeMode
181
- ? rawProtocolLevel - 128
182
- : rawProtocolLevel;
159
+ export function decode(
160
+ buffer: Uint8Array,
161
+ flags: number,
162
+ _codecOpts: CodecOpts,
163
+ packetType: PacketType,
164
+ ): ConnectPacket {
165
+ const decoder = new Decoder(packetType, buffer);
166
+ const protocolName = decoder.getUTF8String();
167
+ const rawProtocolLevel = decoder.getByte();
168
+ const bridgeMode = rawProtocolLevel > 128;
169
+ const protocolLevel = bridgeMode ? rawProtocolLevel - 128 : rawProtocolLevel;
183
170
 
184
- if (invalidProtocolName(protocolLevel, protocolName)) {
185
- throw new DecoderError("Invalid protocol name or level");
186
- }
171
+ if (invalidProtocolName(protocolLevel, protocolName)) {
172
+ throw new DecoderError("Invalid protocol name or level");
173
+ }
187
174
 
188
- const connectFlags = decoder.getByte();
175
+ const connectFlags = decoder.getByte();
189
176
 
190
- const usernameFlag = booleanFlag(connectFlags, BitMask.bit7);
191
- const passwordFlag = booleanFlag(connectFlags, BitMask.bit6);
192
- const willRetain = booleanFlag(connectFlags, BitMask.bit5);
193
- const willQoS = (connectFlags & (BitMask.bit4 + BitMask.bit3)) >> 3;
194
- const willFlag = booleanFlag(connectFlags, BitMask.bit2);
195
- const cleanSession = booleanFlag(connectFlags, BitMask.bit1);
196
- const reservedBit = booleanFlag(connectFlags, BitMask.bit0);
177
+ const usernameFlag = booleanFlag(connectFlags, BitMask.bit7);
178
+ const passwordFlag = booleanFlag(connectFlags, BitMask.bit6);
179
+ const willRetain = booleanFlag(connectFlags, BitMask.bit5);
180
+ const willQoS = (connectFlags & (BitMask.bit4 + BitMask.bit3)) >> 3;
181
+ const willFlag = booleanFlag(connectFlags, BitMask.bit2);
182
+ const cleanSession = booleanFlag(connectFlags, BitMask.bit1);
183
+ const reservedBit = booleanFlag(connectFlags, BitMask.bit0);
197
184
 
198
- hasEmptyFlags(flags);
199
- // The Server MUST validate that the reserved flag in the CONNECT Control Packet
200
- // is set to zero and disconnect the Client if it is not zero [MQTT-3.1.2-3].
201
- if (reservedBit) {
202
- throw new DecoderError("Invalid reserved bit");
203
- }
185
+ hasEmptyFlags(flags);
186
+ // The Server MUST validate that the reserved flag in the CONNECT Control Packet
187
+ // is set to zero and disconnect the Client if it is not zero [MQTT-3.1.2-3].
188
+ if (reservedBit) {
189
+ throw new DecoderError("Invalid reserved bit");
190
+ }
204
191
 
205
- if (willQoS !== 0 && willQoS !== 1 && willQoS !== 2) {
206
- throw new DecoderError("Invalid will qos");
207
- }
192
+ if (willQoS !== 0 && willQoS !== 1 && willQoS !== 2) {
193
+ throw new DecoderError("Invalid will qos");
194
+ }
208
195
 
209
- if (!usernameFlag && passwordFlag) {
210
- throw new DecoderError("Password without username");
211
- }
196
+ if (!usernameFlag && passwordFlag) {
197
+ throw new DecoderError("Password without username");
198
+ }
212
199
 
213
- const keepAlive = decoder.getInt16();
214
- const isV5 = protocolLevel === 5;
215
- let properties;
200
+ const keepAlive = decoder.getInt16();
201
+ const isV5 = protocolLevel === 5;
202
+ let properties;
203
+ if (isV5) {
204
+ properties = decoder.getProperties(PropertySetType.connect);
205
+ }
206
+ const clientId = decoder.getUTF8String();
207
+ let willProperties;
208
+ let willTopic;
209
+ let willPayload;
210
+ if (willFlag) {
216
211
  if (isV5) {
217
- properties = decoder.getProperties(PropertySetType.connect);
218
- }
219
- const clientId = decoder.getUTF8String();
220
- let willProperties;
221
- let willTopic;
222
- let willPayload;
223
- if (willFlag) {
224
- if (isV5) {
225
- willProperties = decoder.getProperties(PropertySetType.will);
226
- }
227
- willTopic = decoder.getTopic();
228
- willPayload = decoder.getByteArray();
212
+ willProperties = decoder.getProperties(PropertySetType.will);
229
213
  }
214
+ willTopic = decoder.getUTF8String();
215
+ willPayload = decoder.getByteArray();
216
+ }
230
217
 
231
- let username;
232
- let password;
233
- if (usernameFlag) {
234
- username = decoder.getUTF8String();
235
- }
218
+ let username;
219
+ let password;
220
+ if (usernameFlag) {
221
+ username = decoder.getUTF8String();
222
+ }
236
223
 
237
- if (passwordFlag) {
238
- password = decoder.getByteArray();
239
- }
224
+ if (passwordFlag) {
225
+ password = decoder.getByteArray();
226
+ }
240
227
 
241
- decoder.done();
242
- if (!willFlag && (willQoS !== 0 || willRetain === true)) {
243
- throw new DecoderError(
244
- "Will QoS must be 0 and Will retain to false when Will flag is false",
245
- );
246
- }
228
+ decoder.done();
229
+ if (!willFlag && (willQoS !== 0 || willRetain === true)) {
230
+ throw new DecoderError(
231
+ "Will QoS must be 0 and Will retain to false when Will flag is false",
232
+ );
233
+ }
247
234
 
248
- if (clientId.length === 0 && cleanSession === false) {
249
- throw new DecoderError("Clean session must be true if clientID is empty");
250
- }
235
+ if (clientId.length === 0 && cleanSession === false) {
236
+ throw new DecoderError("Clean session must be true if clientID is empty");
237
+ }
251
238
 
252
- let bridgeModeProp = {};
253
- if (bridgeMode) {
254
- bridgeModeProp = { bridgeMode };
255
- }
256
- const commonProps = {
257
- type: PacketType.connect,
258
- protocolName: protocolName,
259
- clientId: clientId,
260
- username,
261
- password: password ? password : undefined,
262
- clean: cleanSession,
263
- keepAlive,
264
- ...bridgeModeProp,
265
- };
239
+ let bridgeModeProp = {};
240
+ if (bridgeMode) {
241
+ bridgeModeProp = { bridgeMode };
242
+ }
243
+ const commonProps = {
244
+ type: PacketType.connect,
245
+ protocolName: protocolName,
246
+ clientId: clientId,
247
+ username,
248
+ password: password ? password : undefined,
249
+ clean: cleanSession,
250
+ keepAlive,
251
+ ...bridgeModeProp,
252
+ };
266
253
 
267
- if (isV5) {
268
- return {
269
- ...commonProps,
270
- protocolLevel: 5,
271
- will: willFlag
272
- ? {
273
- topic: willTopic || "",
274
- payload: willPayload || Uint8Array.from([0]),
275
- retain: willRetain,
276
- qos: willQoS,
277
- properties: willProperties,
278
- }
279
- : undefined,
280
- properties,
281
- };
282
- }
254
+ if (isV5) {
283
255
  return {
284
256
  ...commonProps,
285
- protocolLevel: protocolLevel as ProtocolLevel,
257
+ protocolLevel: 5,
286
258
  will: willFlag
287
259
  ? {
288
260
  topic: willTopic || "",
289
261
  payload: willPayload || Uint8Array.from([0]),
290
262
  retain: willRetain,
291
263
  qos: willQoS,
264
+ properties: willProperties,
292
265
  }
293
266
  : undefined,
267
+ properties,
294
268
  };
295
- },
296
- };
269
+ }
270
+ return {
271
+ ...commonProps,
272
+ protocolLevel: protocolLevel as ProtocolLevel,
273
+ will: willFlag
274
+ ? {
275
+ topic: willTopic || "",
276
+ payload: willPayload || Uint8Array.from([0]),
277
+ retain: willRetain,
278
+ qos: willQoS,
279
+ }
280
+ : undefined,
281
+ };
282
+ }
@@ -77,45 +77,6 @@ test("decode string", () => {
77
77
  assert.deepStrictEqual(decoder.done(), true);
78
78
  });
79
79
 
80
- test("decode topic", () => {
81
- const str = "hello world";
82
- const byteArray = utf8encoder.encode(str);
83
- const len = byteArray.length;
84
- const decoder = new Decoder(
85
- packetType,
86
- Uint8Array.from([0x00, len, ...byteArray]),
87
- );
88
- assert.deepStrictEqual(decoder.getTopic(), str);
89
- assert.deepStrictEqual(decoder.done(), true);
90
- });
91
-
92
- test("Topic too short", () => {
93
- const decoder = new Decoder(packetType, Uint8Array.from([0x00, 0]));
94
- assert.throws(
95
- () => decoder.getTopic(),
96
- Error,
97
- "Topic must contain valid UTF-8 and contain more than 1 byte and no wildcards",
98
- );
99
- });
100
-
101
- test("Invalid topic", () => {
102
- const decoder = new Decoder(packetType, Uint8Array.from([0x00, 0x01, 0x00]));
103
- assert.throws(
104
- () => decoder.getTopic(),
105
- Error,
106
- "Topic must contain valid UTF-8 and contain more than 1 byte and no wildcards",
107
- );
108
- });
109
-
110
- test("Invalid topicFilter", () => {
111
- const decoder = new Decoder(packetType, Uint8Array.from([0x00, 0x01, 0x00]));
112
- assert.throws(
113
- () => decoder.getTopic(),
114
- Error,
115
- "Topic must contain valid UTF-8 and contain more than 1 byte and no wildcards",
116
- );
117
- });
118
-
119
80
  test("Buffer too short", () => {
120
81
  const str = "hello world";
121
82
  const byteArray = utf8encoder.encode(str);
@@ -1,12 +1,5 @@
1
- import type {
2
- TBitMask,
3
- Topic,
4
- TopicFilter,
5
- TPacketType,
6
- TReasonCode,
7
- UTF8StringPair,
8
- } from "./types.ts";
9
- import { invalidTopic, invalidTopicFilter } from "./validators.ts";
1
+ import type { BitMask, UTF8StringPair } from "./types.ts";
2
+ import { invalidUTF8 } from "./validators.ts";
10
3
  import { isValidReasonCode } from "./ReasonCode.ts";
11
4
  import type {
12
5
  Mqttv5PropertyTypesNoUser,
@@ -23,6 +16,9 @@ import {
23
16
  propertyToKind,
24
17
  } from "./Properties.ts";
25
18
 
19
+ import type { PacketType } from "./PacketType.ts";
20
+ import type { ReasonCode } from "./ReasonCode.ts";
21
+
26
22
  const utf8Decoder = new TextDecoder("utf-8");
27
23
  const userPropID = propertyToId.userProperty;
28
24
  const subIdentID = propertyToId.subscriptionIdentifier;
@@ -33,7 +29,7 @@ const subIdentsID = propertyToId.subscriptionIdentifiers;
33
29
  * @param mask - The bitmask to apply
34
30
  * @returns True if the flag is set, false otherwise
35
31
  */
36
- export function booleanFlag(byte: number, mask: TBitMask): boolean {
32
+ export function booleanFlag(byte: number, mask: BitMask): boolean {
37
33
  return !!(byte & mask);
38
34
  }
39
35
 
@@ -73,7 +69,7 @@ export class DecoderError extends Error {
73
69
  * Decoder class for parsing MQTT packets
74
70
  */
75
71
  export class Decoder {
76
- private packetType: TPacketType;
72
+ private packetType: PacketType;
77
73
  private buf: Uint8Array;
78
74
  private pos: number;
79
75
  private len: number;
@@ -83,7 +79,7 @@ export class Decoder {
83
79
  * @param buf - The buffer to decode
84
80
  * @param pos - Starting position in the buffer (default: 0)
85
81
  */
86
- constructor(packetType: TPacketType, buf: Uint8Array, pos: number = 0) {
82
+ constructor(packetType: PacketType, buf: Uint8Array, pos: number = 0) {
87
83
  this.packetType = packetType;
88
84
  this.buf = buf;
89
85
  this.pos = pos;
@@ -170,6 +166,11 @@ export class Decoder {
170
166
  */
171
167
  getUTF8String(): string {
172
168
  const str = utf8Decoder.decode(this.getByteArray());
169
+ if (invalidUTF8(str)) {
170
+ throw new DecoderError(
171
+ "String must contain valid UTF-8",
172
+ );
173
+ }
173
174
  return str;
174
175
  }
175
176
 
@@ -178,41 +179,11 @@ export class Decoder {
178
179
  * @returns The decoded UTF-8 pair as [name,value]
179
180
  */
180
181
  getUTF8StringPair(): UTF8StringPair {
181
- const name = utf8Decoder.decode(this.getByteArray());
182
- const value = utf8Decoder.decode(this.getByteArray());
182
+ const name = this.getUTF8String();
183
+ const value = this.getUTF8String();
183
184
  return [name, value];
184
185
  }
185
186
 
186
- /**
187
- * Gets a topic from the buffer
188
- * @returns The decoded topic
189
- * @throws {DecoderError} If topic is invalid
190
- */
191
- getTopic(): Topic {
192
- const topic = this.getUTF8String();
193
- if (invalidTopic(topic)) {
194
- throw new DecoderError(
195
- "Topic must contain valid UTF-8 and contain more than 1 byte and no wildcards",
196
- );
197
- }
198
- return topic;
199
- }
200
-
201
- /**
202
- * Gets a topic filter from the buffer
203
- * @returns The decoded topic filter
204
- * @throws {DecoderError} If topic filter is invalid
205
- */
206
- getTopicFilter(): TopicFilter {
207
- const topicFilter = this.getUTF8String();
208
- if (invalidTopicFilter(topicFilter)) {
209
- throw new DecoderError(
210
- "Topicfilter must contain valid UTF-8 and contain more than 1 byte and valid wildcards",
211
- );
212
- }
213
- return topicFilter;
214
- }
215
-
216
187
  /**
217
188
  * Gets the remaining bytes from the current position to the end
218
189
  * @returns The remaining bytes as a subarray
@@ -316,12 +287,12 @@ export class Decoder {
316
287
  * @returns The decoded reason code
317
288
  * @throws {DecoderError} If reason code is invalid
318
289
  */
319
- getReasonCode(): TReasonCode {
290
+ geReasonCode(): ReasonCode {
320
291
  const reasonCode = this.getByte();
321
292
  if (!isValidReasonCode(this.packetType, reasonCode)) {
322
293
  throw new DecoderError("Invalid reason code");
323
294
  }
324
- return reasonCode as TReasonCode;
295
+ return reasonCode as ReasonCode;
325
296
  }
326
297
 
327
298
  /**