@seriousme/opifex 1.11.3 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/README.md +99 -40
  2. package/bin/conformanceServer.ts +45 -13
  3. package/bin/demoServer.ts +38 -13
  4. package/bin/mqtt.ts +2 -2
  5. package/client/ConnectionState.ts +2 -0
  6. package/client/client.ts +51 -41
  7. package/client/context.ts +75 -21
  8. package/client/deps.ts +4 -0
  9. package/client/handlers/handleAuth.test.ts +193 -0
  10. package/client/handlers/handleAuth.ts +89 -0
  11. package/client/handlers/handleConnack.test.ts +173 -0
  12. package/client/handlers/handleConnack.ts +16 -6
  13. package/client/handlers/handleDisconnect.test.ts +22 -0
  14. package/client/handlers/handleDisconnect.ts +17 -0
  15. package/client/handlers/handlePacket.test.ts +242 -0
  16. package/client/handlers/handlePacket.ts +19 -5
  17. package/client/handlers/handlePuback.test.ts +99 -0
  18. package/client/handlers/handlePuback.ts +6 -0
  19. package/client/handlers/handlePubcomp.test.ts +112 -0
  20. package/client/handlers/handlePubcomp.ts +5 -0
  21. package/client/handlers/handlePublish.test.ts +188 -0
  22. package/client/handlers/handlePubrec.test.ts +119 -0
  23. package/client/handlers/handlePubrec.ts +5 -1
  24. package/client/handlers/handlePubrel.test.ts +136 -0
  25. package/client/handlers/handleSuback.test.ts +122 -0
  26. package/client/handlers/handleSuback.ts +3 -0
  27. package/client/handlers/handleUnsuback.test.ts +101 -0
  28. package/client/mod.ts +1 -1
  29. package/client/store/memoryStore.ts +2 -2
  30. package/client/store/store.ts +3 -1
  31. package/deno/README.md +1 -2
  32. package/deno/tcpClient.test.ts +75 -0
  33. package/deno/tcpClient.ts +16 -11
  34. package/deno/tcpServer.test.ts +22 -21
  35. package/deno/tcpServer.ts +5 -0
  36. package/deno/tlsServer.test.ts +97 -0
  37. package/deno/tlsServer.ts +42 -0
  38. package/deno/wsServer.test.ts +93 -0
  39. package/deno/wsServer.ts +73 -0
  40. package/dev_utils/generateCert.ts +95 -0
  41. package/dev_utils/mockConn.ts +36 -0
  42. package/dev_utils/mockServer.ts +28 -0
  43. package/dev_utils/mod.ts +30 -3
  44. package/dev_utils/packetHelpers.ts +404 -0
  45. package/dev_utils/test-handlers.ts +98 -0
  46. package/dev_utils/timers.ts +14 -0
  47. package/dev_utils/webStreamPair.test.ts +171 -0
  48. package/dev_utils/webStreamPair.ts +143 -0
  49. package/dist/bin/conformanceServer.js +17 -12
  50. package/dist/bin/conformanceServer.js.map +1 -1
  51. package/dist/bin/demoServer.js +16 -12
  52. package/dist/bin/demoServer.js.map +1 -1
  53. package/dist/bin/mqtt.js +2 -2
  54. package/dist/bin/mqtt.js.map +1 -1
  55. package/dist/client/ConnectionState.d.ts +2 -0
  56. package/dist/client/ConnectionState.d.ts.map +1 -1
  57. package/dist/client/ConnectionState.js +2 -0
  58. package/dist/client/ConnectionState.js.map +1 -1
  59. package/dist/client/client.d.ts +13 -16
  60. package/dist/client/client.d.ts.map +1 -1
  61. package/dist/client/client.js +34 -20
  62. package/dist/client/client.js.map +1 -1
  63. package/dist/client/context.d.ts +11 -3
  64. package/dist/client/context.d.ts.map +1 -1
  65. package/dist/client/context.js +44 -12
  66. package/dist/client/context.js.map +1 -1
  67. package/dist/client/deps.d.ts +3 -2
  68. package/dist/client/deps.d.ts.map +1 -1
  69. package/dist/client/deps.js +1 -1
  70. package/dist/client/deps.js.map +1 -1
  71. package/dist/client/handlers/handleAuth.d.ts +9 -0
  72. package/dist/client/handlers/handleAuth.d.ts.map +1 -0
  73. package/dist/client/handlers/handleAuth.js +66 -0
  74. package/dist/client/handlers/handleAuth.js.map +1 -0
  75. package/dist/client/handlers/handleConnack.d.ts +2 -2
  76. package/dist/client/handlers/handleConnack.d.ts.map +1 -1
  77. package/dist/client/handlers/handleConnack.js +16 -6
  78. package/dist/client/handlers/handleConnack.js.map +1 -1
  79. package/dist/client/handlers/handleDisconnect.d.ts +11 -0
  80. package/dist/client/handlers/handleDisconnect.d.ts.map +1 -0
  81. package/dist/client/handlers/handleDisconnect.js +15 -0
  82. package/dist/client/handlers/handleDisconnect.js.map +1 -0
  83. package/dist/client/handlers/handlePacket.d.ts.map +1 -1
  84. package/dist/client/handlers/handlePacket.js +14 -3
  85. package/dist/client/handlers/handlePacket.js.map +1 -1
  86. package/dist/client/handlers/handlePuback.d.ts.map +1 -1
  87. package/dist/client/handlers/handlePuback.js +5 -0
  88. package/dist/client/handlers/handlePuback.js.map +1 -1
  89. package/dist/client/handlers/handlePubcomp.d.ts.map +1 -1
  90. package/dist/client/handlers/handlePubcomp.js +5 -0
  91. package/dist/client/handlers/handlePubcomp.js.map +1 -1
  92. package/dist/client/handlers/handlePubrec.d.ts.map +1 -1
  93. package/dist/client/handlers/handlePubrec.js +5 -1
  94. package/dist/client/handlers/handlePubrec.js.map +1 -1
  95. package/dist/client/handlers/handleSuback.d.ts +1 -0
  96. package/dist/client/handlers/handleSuback.d.ts.map +1 -1
  97. package/dist/client/handlers/handleSuback.js +3 -0
  98. package/dist/client/handlers/handleSuback.js.map +1 -1
  99. package/dist/client/mod.d.ts +1 -1
  100. package/dist/client/mod.d.ts.map +1 -1
  101. package/dist/client/mod.js +1 -1
  102. package/dist/client/mod.js.map +1 -1
  103. package/dist/client/store/memoryStore.d.ts.map +1 -1
  104. package/dist/client/store/memoryStore.js +2 -2
  105. package/dist/client/store/memoryStore.js.map +1 -1
  106. package/dist/client/store/store.d.ts +2 -1
  107. package/dist/client/store/store.d.ts.map +1 -1
  108. package/dist/client/store/store.js +1 -1
  109. package/dist/client/store/store.js.map +1 -1
  110. package/dist/dev_utils/generateCert.d.ts +11 -0
  111. package/dist/dev_utils/generateCert.d.ts.map +1 -0
  112. package/dist/dev_utils/generateCert.js +76 -0
  113. package/dist/dev_utils/generateCert.js.map +1 -0
  114. package/dist/examples/authHandler.test.d.ts +2 -0
  115. package/dist/examples/authHandler.test.d.ts.map +1 -0
  116. package/dist/examples/authHandler.test.js +123 -0
  117. package/dist/examples/authHandler.test.js.map +1 -0
  118. package/dist/examples/mqtt.test.d.ts +2 -0
  119. package/dist/examples/mqtt.test.d.ts.map +1 -0
  120. package/dist/examples/mqtt.test.js +70 -0
  121. package/dist/examples/mqtt.test.js.map +1 -0
  122. package/dist/examples/mqtts.test.d.ts +2 -0
  123. package/dist/examples/mqtts.test.d.ts.map +1 -0
  124. package/dist/examples/mqtts.test.js +81 -0
  125. package/dist/examples/mqtts.test.js.map +1 -0
  126. package/dist/mqttConn/mqttConn.d.ts +23 -15
  127. package/dist/mqttConn/mqttConn.d.ts.map +1 -1
  128. package/dist/mqttConn/mqttConn.js +56 -35
  129. package/dist/mqttConn/mqttConn.js.map +1 -1
  130. package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -1
  131. package/dist/mqttPacket/BitMask.d.ts.map +1 -1
  132. package/dist/mqttPacket/PacketType.d.ts.map +1 -1
  133. package/dist/mqttPacket/Properties.d.ts +2 -2
  134. package/dist/mqttPacket/Properties.d.ts.map +1 -1
  135. package/dist/mqttPacket/Properties.js.map +1 -1
  136. package/dist/mqttPacket/ReasonCode.d.ts +1 -0
  137. package/dist/mqttPacket/ReasonCode.d.ts.map +1 -1
  138. package/dist/mqttPacket/ReasonCode.js +1 -0
  139. package/dist/mqttPacket/ReasonCode.js.map +1 -1
  140. package/dist/mqttPacket/RetainHandling.d.ts.map +1 -1
  141. package/dist/mqttPacket/auth.d.ts +3 -5
  142. package/dist/mqttPacket/auth.d.ts.map +1 -1
  143. package/dist/mqttPacket/auth.js +31 -30
  144. package/dist/mqttPacket/auth.js.map +1 -1
  145. package/dist/mqttPacket/codec.d.ts +48 -0
  146. package/dist/mqttPacket/codec.d.ts.map +1 -0
  147. package/dist/mqttPacket/codec.js +93 -0
  148. package/dist/mqttPacket/codec.js.map +1 -0
  149. package/dist/mqttPacket/connack.d.ts +4 -5
  150. package/dist/mqttPacket/connack.d.ts.map +1 -1
  151. package/dist/mqttPacket/connack.js +43 -45
  152. package/dist/mqttPacket/connack.js.map +1 -1
  153. package/dist/mqttPacket/connect.d.ts +4 -5
  154. package/dist/mqttPacket/connect.d.ts.map +1 -1
  155. package/dist/mqttPacket/connect.js +156 -157
  156. package/dist/mqttPacket/connect.js.map +1 -1
  157. package/dist/mqttPacket/decoder.d.ts +1 -13
  158. package/dist/mqttPacket/decoder.d.ts.map +1 -1
  159. package/dist/mqttPacket/decoder.js +6 -27
  160. package/dist/mqttPacket/decoder.js.map +1 -1
  161. package/dist/mqttPacket/disconnect.d.ts +4 -5
  162. package/dist/mqttPacket/disconnect.d.ts.map +1 -1
  163. package/dist/mqttPacket/disconnect.js +41 -43
  164. package/dist/mqttPacket/disconnect.js.map +1 -1
  165. package/dist/mqttPacket/encoder.d.ts +1 -15
  166. package/dist/mqttPacket/encoder.d.ts.map +1 -1
  167. package/dist/mqttPacket/encoder.js +4 -27
  168. package/dist/mqttPacket/encoder.js.map +1 -1
  169. package/dist/mqttPacket/mod.d.ts +21 -103
  170. package/dist/mqttPacket/mod.d.ts.map +1 -1
  171. package/dist/mqttPacket/mod.js +5 -94
  172. package/dist/mqttPacket/mod.js.map +1 -1
  173. package/dist/mqttPacket/pingreq.d.ts +4 -5
  174. package/dist/mqttPacket/pingreq.d.ts.map +1 -1
  175. package/dist/mqttPacket/pingreq.js +11 -13
  176. package/dist/mqttPacket/pingreq.js.map +1 -1
  177. package/dist/mqttPacket/pingres.d.ts +4 -5
  178. package/dist/mqttPacket/pingres.d.ts.map +1 -1
  179. package/dist/mqttPacket/pingres.js +11 -13
  180. package/dist/mqttPacket/pingres.js.map +1 -1
  181. package/dist/mqttPacket/protocolLevels.d.ts +11 -6
  182. package/dist/mqttPacket/protocolLevels.d.ts.map +1 -1
  183. package/dist/mqttPacket/protocolLevels.js +5 -1
  184. package/dist/mqttPacket/protocolLevels.js.map +1 -1
  185. package/dist/mqttPacket/pubblishAcks.d.ts +4 -5
  186. package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -1
  187. package/dist/mqttPacket/pubblishAcks.js +43 -45
  188. package/dist/mqttPacket/pubblishAcks.js.map +1 -1
  189. package/dist/mqttPacket/publish.d.ts +5 -5
  190. package/dist/mqttPacket/publish.d.ts.map +1 -1
  191. package/dist/mqttPacket/publish.js +53 -55
  192. package/dist/mqttPacket/publish.js.map +1 -1
  193. package/dist/mqttPacket/suback.d.ts +4 -5
  194. package/dist/mqttPacket/suback.d.ts.map +1 -1
  195. package/dist/mqttPacket/suback.js +38 -40
  196. package/dist/mqttPacket/suback.js.map +1 -1
  197. package/dist/mqttPacket/subscribe.d.ts +36 -7
  198. package/dist/mqttPacket/subscribe.d.ts.map +1 -1
  199. package/dist/mqttPacket/subscribe.js +90 -89
  200. package/dist/mqttPacket/subscribe.js.map +1 -1
  201. package/dist/mqttPacket/types.d.ts +1 -8
  202. package/dist/mqttPacket/types.d.ts.map +1 -1
  203. package/dist/mqttPacket/unsuback.d.ts +4 -5
  204. package/dist/mqttPacket/unsuback.d.ts.map +1 -1
  205. package/dist/mqttPacket/unsuback.js +32 -34
  206. package/dist/mqttPacket/unsuback.js.map +1 -1
  207. package/dist/mqttPacket/unsubscribe.d.ts +23 -6
  208. package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
  209. package/dist/mqttPacket/unsubscribe.js +45 -44
  210. package/dist/mqttPacket/unsubscribe.js.map +1 -1
  211. package/dist/mqttPacket/validators.d.ts +4 -16
  212. package/dist/mqttPacket/validators.d.ts.map +1 -1
  213. package/dist/mqttPacket/validators.js +5 -26
  214. package/dist/mqttPacket/validators.js.map +1 -1
  215. package/dist/node/tcpClient.d.ts +1 -1
  216. package/dist/node/tcpClient.d.ts.map +1 -1
  217. package/dist/node/tcpClient.js +12 -7
  218. package/dist/node/tcpClient.js.map +1 -1
  219. package/dist/node/tcpServer.d.ts.map +1 -1
  220. package/dist/node/tcpServer.js +4 -0
  221. package/dist/node/tcpServer.js.map +1 -1
  222. package/dist/node/tlsServer.d.ts +19 -0
  223. package/dist/node/tlsServer.d.ts.map +1 -0
  224. package/dist/node/tlsServer.js +58 -0
  225. package/dist/node/tlsServer.js.map +1 -0
  226. package/dist/node/wrapNodeSocket.d.ts.map +1 -1
  227. package/dist/node/wrapNodeSocket.js +6 -28
  228. package/dist/node/wrapNodeSocket.js.map +1 -1
  229. package/dist/persistence/basicPersistence.d.ts +36 -0
  230. package/dist/persistence/basicPersistence.d.ts.map +1 -0
  231. package/dist/persistence/basicPersistence.js +306 -0
  232. package/dist/persistence/basicPersistence.js.map +1 -0
  233. package/dist/persistence/deps.d.ts +3 -2
  234. package/dist/persistence/deps.d.ts.map +1 -1
  235. package/dist/persistence/deps.js +2 -1
  236. package/dist/persistence/deps.js.map +1 -1
  237. package/dist/persistence/memory/memoryPersistence.d.ts +6 -23
  238. package/dist/persistence/memory/memoryPersistence.d.ts.map +1 -1
  239. package/dist/persistence/memory/memoryPersistence.js +12 -115
  240. package/dist/persistence/memory/memoryPersistence.js.map +1 -1
  241. package/dist/persistence/memory/memoryStorage.d.ts +45 -0
  242. package/dist/persistence/memory/memoryStorage.d.ts.map +1 -0
  243. package/dist/persistence/memory/memoryStorage.js +143 -0
  244. package/dist/persistence/memory/memoryStorage.js.map +1 -0
  245. package/dist/persistence/mod.d.ts +3 -3
  246. package/dist/persistence/mod.d.ts.map +1 -1
  247. package/dist/persistence/mod.js +6 -1
  248. package/dist/persistence/mod.js.map +1 -1
  249. package/dist/persistence/persistence.d.ts +44 -69
  250. package/dist/persistence/persistence.d.ts.map +1 -1
  251. package/dist/persistence/persistence.js +1 -2
  252. package/dist/persistence/persistence.js.map +1 -1
  253. package/dist/persistence/sqlite/sqliteDatabase.d.ts +46 -0
  254. package/dist/persistence/sqlite/sqliteDatabase.d.ts.map +1 -0
  255. package/dist/persistence/sqlite/sqliteDatabase.js +215 -0
  256. package/dist/persistence/sqlite/sqliteDatabase.js.map +1 -0
  257. package/dist/persistence/sqlite/sqlitePersistence.d.ts +16 -0
  258. package/dist/persistence/sqlite/sqlitePersistence.d.ts.map +1 -0
  259. package/dist/persistence/sqlite/sqlitePersistence.js +29 -0
  260. package/dist/persistence/sqlite/sqlitePersistence.js.map +1 -0
  261. package/dist/persistence/sqlite/sqliteStorage.d.ts +36 -0
  262. package/dist/persistence/sqlite/sqliteStorage.d.ts.map +1 -0
  263. package/dist/persistence/sqlite/sqliteStorage.js +194 -0
  264. package/dist/persistence/sqlite/sqliteStorage.js.map +1 -0
  265. package/dist/persistence/storage.d.ts +38 -0
  266. package/dist/persistence/storage.d.ts.map +1 -0
  267. package/dist/persistence/storage.js +5 -0
  268. package/dist/persistence/storage.js.map +1 -0
  269. package/dist/server/config.d.ts +47 -0
  270. package/dist/server/config.d.ts.map +1 -0
  271. package/dist/server/config.js +41 -0
  272. package/dist/server/config.js.map +1 -0
  273. package/dist/server/context.d.ts +198 -24
  274. package/dist/server/context.d.ts.map +1 -1
  275. package/dist/server/context.js +432 -53
  276. package/dist/server/context.js.map +1 -1
  277. package/dist/server/deps.d.ts +5 -6
  278. package/dist/server/deps.d.ts.map +1 -1
  279. package/dist/server/deps.js +2 -2
  280. package/dist/server/deps.js.map +1 -1
  281. package/dist/server/handlers/completeConnect.d.ts +8 -0
  282. package/dist/server/handlers/completeConnect.d.ts.map +1 -0
  283. package/dist/server/handlers/completeConnect.js +74 -0
  284. package/dist/server/handlers/completeConnect.js.map +1 -0
  285. package/dist/server/handlers/handleAuth.d.ts +9 -0
  286. package/dist/server/handlers/handleAuth.d.ts.map +1 -0
  287. package/dist/server/handlers/handleAuth.js +69 -0
  288. package/dist/server/handlers/handleAuth.js.map +1 -0
  289. package/dist/server/handlers/handleConnect.d.ts +2 -4
  290. package/dist/server/handlers/handleConnect.d.ts.map +1 -1
  291. package/dist/server/handlers/handleConnect.js +140 -67
  292. package/dist/server/handlers/handleConnect.js.map +1 -1
  293. package/dist/server/handlers/handleDisconnect.d.ts +1 -1
  294. package/dist/server/handlers/handleDisconnect.d.ts.map +1 -1
  295. package/dist/server/handlers/handleDisconnect.js +3 -3
  296. package/dist/server/handlers/handleDisconnect.js.map +1 -1
  297. package/dist/server/handlers/handlePacket.d.ts.map +1 -1
  298. package/dist/server/handlers/handlePacket.js +19 -6
  299. package/dist/server/handlers/handlePacket.js.map +1 -1
  300. package/dist/server/handlers/handlePuback.d.ts +1 -3
  301. package/dist/server/handlers/handlePuback.d.ts.map +1 -1
  302. package/dist/server/handlers/handlePuback.js +2 -8
  303. package/dist/server/handlers/handlePuback.js.map +1 -1
  304. package/dist/server/handlers/handlePubcomp.d.ts +1 -1
  305. package/dist/server/handlers/handlePubcomp.d.ts.map +1 -1
  306. package/dist/server/handlers/handlePubcomp.js +2 -4
  307. package/dist/server/handlers/handlePubcomp.js.map +1 -1
  308. package/dist/server/handlers/handlePublish.d.ts +1 -1
  309. package/dist/server/handlers/handlePublish.d.ts.map +1 -1
  310. package/dist/server/handlers/handlePublish.js +149 -45
  311. package/dist/server/handlers/handlePublish.js.map +1 -1
  312. package/dist/server/handlers/handlePubrec.d.ts.map +1 -1
  313. package/dist/server/handlers/handlePubrec.js +2 -3
  314. package/dist/server/handlers/handlePubrec.js.map +1 -1
  315. package/dist/server/handlers/handlePubrel.d.ts.map +1 -1
  316. package/dist/server/handlers/handlePubrel.js +6 -2
  317. package/dist/server/handlers/handlePubrel.js.map +1 -1
  318. package/dist/server/handlers/handleSubscribe.d.ts +1 -6
  319. package/dist/server/handlers/handleSubscribe.d.ts.map +1 -1
  320. package/dist/server/handlers/handleSubscribe.js +99 -38
  321. package/dist/server/handlers/handleSubscribe.js.map +1 -1
  322. package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -1
  323. package/dist/server/handlers/handleUnsubscribe.js +19 -4
  324. package/dist/server/handlers/handleUnsubscribe.js.map +1 -1
  325. package/dist/server/mod.d.ts +3 -3
  326. package/dist/server/mod.d.ts.map +1 -1
  327. package/dist/server/mod.js +1 -1
  328. package/dist/server/mod.js.map +1 -1
  329. package/dist/server/server.d.ts +29 -6
  330. package/dist/server/server.d.ts.map +1 -1
  331. package/dist/server/server.js +84 -15
  332. package/dist/server/server.js.map +1 -1
  333. package/dist/socket/socket.d.ts +11 -9
  334. package/dist/socket/socket.d.ts.map +1 -1
  335. package/dist/socket/socket.js +66 -18
  336. package/dist/socket/socket.js.map +1 -1
  337. package/dist/timer/timer.d.ts +32 -0
  338. package/dist/timer/timer.d.ts.map +1 -1
  339. package/dist/timer/timer.js +32 -0
  340. package/dist/timer/timer.js.map +1 -1
  341. package/dist/trie/trie.d.ts +10 -5
  342. package/dist/trie/trie.d.ts.map +1 -1
  343. package/dist/trie/trie.js +61 -41
  344. package/dist/trie/trie.js.map +1 -1
  345. package/dist/utils/assert.d.ts.map +1 -1
  346. package/dist/utils/{BufferedAsyncIterable.d.ts → bufferedAsyncIterable.d.ts} +1 -1
  347. package/dist/utils/bufferedAsyncIterable.d.ts.map +1 -0
  348. package/dist/utils/{BufferedAsyncIterable.js → bufferedAsyncIterable.js} +1 -1
  349. package/dist/utils/bufferedAsyncIterable.js.map +1 -0
  350. package/dist/utils/deferred.d.ts.map +1 -1
  351. package/dist/utils/deferred.js.map +1 -1
  352. package/dist/utils/getOrInsertPolyFill.d.ts +2 -0
  353. package/dist/utils/getOrInsertPolyFill.d.ts.map +1 -0
  354. package/dist/utils/getOrInsertPolyFill.js +12 -0
  355. package/dist/utils/getOrInsertPolyFill.js.map +1 -0
  356. package/dist/utils/logger.d.ts +40 -3
  357. package/dist/utils/logger.d.ts.map +1 -1
  358. package/dist/utils/logger.js +53 -7
  359. package/dist/utils/logger.js.map +1 -1
  360. package/dist/utils/mod.d.ts +6 -1
  361. package/dist/utils/mod.d.ts.map +1 -1
  362. package/dist/utils/mod.js +5 -1
  363. package/dist/utils/mod.js.map +1 -1
  364. package/dist/utils/outboundTopicAliasManager.d.ts +52 -0
  365. package/dist/utils/outboundTopicAliasManager.d.ts.map +1 -0
  366. package/dist/utils/outboundTopicAliasManager.js +74 -0
  367. package/dist/utils/outboundTopicAliasManager.js.map +1 -0
  368. package/dist/utils/queue.d.ts.map +1 -1
  369. package/dist/utils/topicFilter.d.ts +32 -0
  370. package/dist/utils/topicFilter.d.ts.map +1 -0
  371. package/dist/utils/topicFilter.js +52 -0
  372. package/dist/utils/topicFilter.js.map +1 -0
  373. package/dist/utils/utils.d.ts +2 -0
  374. package/dist/utils/utils.d.ts.map +1 -1
  375. package/dist/utils/utils.js +2 -0
  376. package/dist/utils/utils.js.map +1 -1
  377. package/dist/utils/validators.d.ts +34 -0
  378. package/dist/utils/validators.d.ts.map +1 -0
  379. package/dist/utils/validators.js +61 -0
  380. package/dist/utils/validators.js.map +1 -0
  381. package/dist/web/webSocketStream.d.ts +29 -0
  382. package/dist/web/webSocketStream.d.ts.map +1 -0
  383. package/dist/web/webSocketStream.js +69 -0
  384. package/dist/web/webSocketStream.js.map +1 -0
  385. package/dist/web/wrapWebSocket.d.ts +12 -0
  386. package/dist/web/wrapWebSocket.d.ts.map +1 -0
  387. package/dist/web/wrapWebSocket.js +41 -0
  388. package/dist/web/wrapWebSocket.js.map +1 -0
  389. package/dist/web/wsClient.d.ts +7 -0
  390. package/dist/web/wsClient.d.ts.map +1 -0
  391. package/dist/web/wsClient.js +22 -0
  392. package/dist/web/wsClient.js.map +1 -0
  393. package/dist/web/wsClient.test.d.ts +2 -0
  394. package/dist/web/wsClient.test.d.ts.map +1 -0
  395. package/dist/web/wsClient.test.js +20 -0
  396. package/dist/web/wsClient.test.js.map +1 -0
  397. package/examples/authHandler.test.ts +164 -0
  398. package/examples/mqtt.test.ts +89 -0
  399. package/examples/mqtts.test.ts +100 -0
  400. package/examples/webSocket.test.ts +94 -0
  401. package/mqttConn/mqttConn.test.ts +9 -9
  402. package/mqttConn/mqttConn.ts +76 -44
  403. package/mqttPacket/Properties.ts +6 -3
  404. package/mqttPacket/ReasonCode.ts +2 -1
  405. package/mqttPacket/auth.test.ts +1 -1
  406. package/mqttPacket/auth.ts +41 -48
  407. package/mqttPacket/codec.ts +146 -0
  408. package/mqttPacket/connack.ts +57 -68
  409. package/mqttPacket/connect.test.ts +2 -2
  410. package/mqttPacket/connect.ts +175 -182
  411. package/mqttPacket/decoder.test.ts +0 -39
  412. package/mqttPacket/decoder.ts +8 -35
  413. package/mqttPacket/disconnect.ts +57 -68
  414. package/mqttPacket/encoder.ts +5 -40
  415. package/mqttPacket/mod.ts +48 -200
  416. package/mqttPacket/pingreq.ts +21 -27
  417. package/mqttPacket/pingres.ts +21 -27
  418. package/mqttPacket/protocolLevels.ts +12 -7
  419. package/mqttPacket/pubblishAcks.ts +56 -70
  420. package/mqttPacket/publish.ts +67 -74
  421. package/mqttPacket/suback.ts +48 -58
  422. package/mqttPacket/subscribe.ts +141 -117
  423. package/mqttPacket/types.ts +1 -9
  424. package/mqttPacket/unsuback.ts +46 -58
  425. package/mqttPacket/unsubscribe.ts +74 -63
  426. package/mqttPacket/validators.ts +5 -31
  427. package/node/socket-node-stream.test.ts +322 -0
  428. package/node/socket-node-stream.ts +174 -0
  429. package/node/tcpClient.test.ts +70 -0
  430. package/node/tcpClient.ts +13 -12
  431. package/node/tcpServer.test.ts +24 -20
  432. package/node/tcpServer.ts +6 -0
  433. package/node/tlsServer.test.ts +94 -0
  434. package/node/tlsServer.ts +81 -0
  435. package/node/wrapNodeSocket.ts +7 -30
  436. package/package.json +72 -44
  437. package/persistence/basicPersistence.ts +495 -0
  438. package/persistence/deps.ts +11 -1
  439. package/persistence/memory/memoryPersistence.ts +12 -153
  440. package/persistence/memory/memoryStorage.ts +232 -0
  441. package/persistence/mod.ts +4 -9
  442. package/persistence/persistence.test.ts +24 -0
  443. package/persistence/persistence.testing.ts +1324 -0
  444. package/persistence/persistence.ts +111 -67
  445. package/persistence/sqlite/sqliteDatabase.ts +294 -0
  446. package/persistence/sqlite/sqlitePersistence.test.ts +48 -0
  447. package/persistence/sqlite/sqlitePersistence.ts +36 -0
  448. package/persistence/sqlite/sqliteStorage.ts +324 -0
  449. package/persistence/storage.ts +84 -0
  450. package/server/config.ts +65 -0
  451. package/server/context.ts +658 -74
  452. package/server/deps.ts +25 -5
  453. package/server/handlers/completeConnect.ts +93 -0
  454. package/server/handlers/duplicate.test.ts +196 -0
  455. package/server/handlers/handleAuth.test.ts +225 -0
  456. package/server/handlers/handleAuth.ts +88 -0
  457. package/server/handlers/handleConnect.test.ts +589 -0
  458. package/server/handlers/handleConnect.ts +201 -86
  459. package/server/handlers/handleConnect.version.test.ts +108 -0
  460. package/server/handlers/handleDisconnect.test.ts +56 -0
  461. package/server/handlers/handleDisconnect.ts +3 -3
  462. package/server/handlers/handlePacket.test.ts +24 -0
  463. package/server/handlers/handlePacket.ts +30 -8
  464. package/server/handlers/handlePingreq.test.ts +29 -0
  465. package/server/handlers/handlePuback.test.ts +28 -0
  466. package/server/handlers/handlePuback.ts +5 -8
  467. package/server/handlers/handlePubcomp.test.ts +28 -0
  468. package/server/handlers/handlePubcomp.ts +5 -4
  469. package/server/handlers/handlePublish.test.ts +471 -0
  470. package/server/handlers/handlePublish.ts +189 -35
  471. package/server/handlers/handlePubrec.test.ts +28 -0
  472. package/server/handlers/handlePubrec.ts +2 -3
  473. package/server/handlers/handlePubrel.test.ts +74 -0
  474. package/server/handlers/handlePubrel.ts +12 -2
  475. package/server/handlers/handleSubscribe.test.ts +971 -0
  476. package/server/handlers/handleSubscribe.ts +158 -39
  477. package/server/handlers/handleUnsubscribe.test.ts +79 -0
  478. package/server/handlers/handleUnsubscribe.ts +29 -5
  479. package/server/handlers/keepalive.test.ts +132 -0
  480. package/server/handlers/session.persistence.test.ts +194 -0
  481. package/server/handlers/will.delivery.test.ts +221 -0
  482. package/server/mod.ts +4 -3
  483. package/server/preconnect.test.ts +151 -0
  484. package/server/server.ts +115 -17
  485. package/socket/socket.test.ts +91 -0
  486. package/socket/socket.ts +81 -34
  487. package/timer/timer.test.ts +4 -7
  488. package/timer/timer.ts +36 -0
  489. package/tools/benchmarks/receiver.ts +51 -0
  490. package/tools/benchmarks/sender.ts +48 -0
  491. package/tools/benchmarks/utils.ts +31 -0
  492. package/tools/mqtt-compat/README.md +130 -0
  493. package/tools/mqtt-compat/broker.ts +52 -0
  494. package/tools/mqtt-compat/paho-mqtt4.test.ts +379 -0
  495. package/tools/mqtt-compat/paho-mqtt5.tests.ts +887 -0
  496. package/trie/trie.test.ts +9 -1
  497. package/trie/trie.ts +70 -45
  498. package/utils/bufferedAsyncIterable.test.ts +92 -0
  499. package/utils/deferred.test.ts +36 -0
  500. package/utils/deferred.ts +0 -1
  501. package/utils/getOrInsertPolyFill.ts +12 -0
  502. package/utils/logger.test.ts +189 -0
  503. package/utils/logger.ts +62 -7
  504. package/utils/mod.ts +15 -1
  505. package/utils/outboundTopicAliasManager.ts +100 -0
  506. package/utils/queue.test.ts +61 -0
  507. package/utils/topicFilter.test.ts +63 -0
  508. package/utils/topicFilter.ts +61 -0
  509. package/utils/utils.ts +3 -0
  510. package/utils/validators.ts +67 -0
  511. package/web/webSocketStream.ts +97 -0
  512. package/web/wrapWebSocket.ts +52 -0
  513. package/web/wsClient.test.ts +26 -0
  514. package/web/wsClient.ts +25 -0
  515. package/benchmarks/receiver.ts +0 -35
  516. package/benchmarks/sender.ts +0 -32
  517. package/benchmarks/utils.ts +0 -9
  518. package/dev_utils/dummyConn.ts +0 -110
  519. package/dev_utils/socketPair.ts +0 -85
  520. package/dist/persistence/store.d.ts +0 -14
  521. package/dist/persistence/store.d.ts.map +0 -1
  522. package/dist/persistence/store.js +0 -2
  523. package/dist/persistence/store.js.map +0 -1
  524. package/dist/utils/BufferedAsyncIterable.d.ts.map +0 -1
  525. package/dist/utils/BufferedAsyncIterable.js.map +0 -1
  526. package/examples/tcpServer.test.ts +0 -148
  527. package/persistence/memory/memoryPersistence.test.ts +0 -156
  528. package/persistence/store.ts +0 -16
  529. package/server/test/handleConnect.test.ts +0 -122
  530. package/server/test/test-handlers.ts +0 -53
  531. /package/utils/{BufferedAsyncIterable.ts → bufferedAsyncIterable.ts} +0 -0
@@ -2,12 +2,11 @@ import type {
2
2
  ClientId,
3
3
  CodecOpts,
4
4
  Payload,
5
- ProtocolLevel,
6
- ProtocolLevelNoV5,
7
5
  QoS,
8
6
  Topic,
9
7
  TPacketType,
10
8
  } from "./types.ts";
9
+ import type { ProtocolLevel, ProtocolLevelNoV5 } from "./protocolLevels.ts";
11
10
  import type { ConnectProperties, WillProperties } from "./Properties.ts";
12
11
  import { PropertySetType } from "./Properties.ts";
13
12
  import { PacketType } from "./PacketType.ts";
@@ -76,221 +75,215 @@ function invalidProtocolName(version: number, name: string): boolean {
76
75
  return true;
77
76
  }
78
77
 
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;
78
+ export function encode(
79
+ packet: ConnectPacket,
80
+ codecOpts: CodecOpts,
81
+ ): Uint8Array {
82
+ const flags = 0;
90
83
 
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
- }
84
+ // deno-coverage-ignore-start
85
+ if (typeof packet.protocolLevel !== "number") {
86
+ throw new EncoderError("Protocol level must be a number");
87
+ }
88
+ const protocolLevel = packet.protocolLevel || 4;
89
+ if (protocolLevel < 3 || protocolLevel > 5) {
90
+ throw new EncoderError("Unsupported protocol level");
91
+ }
92
+ // deno-coverage-ignore-stop
93
+ const protocolName = protocolLevel > 3 ? "MQTT" : "MQIsdp";
94
+ const clientId = packet.clientId || "";
95
+ const usernameFlag = packet.username !== undefined;
96
+ if (protocolLevel === 3 && clientId === "") {
97
+ throw new EncoderError("Client id required for protocol level 3");
98
+ }
99
+ const passwordFlag = usernameFlag && packet.password !== undefined;
100
+ const willRetain = !!packet.will?.retain;
101
+ const willQoS = packet.will?.qos || 0;
102
+ const willFlag = packet.will !== undefined;
103
+ if (willFlag) {
104
+ if (packet.will?.topic === undefined) {
105
+ throw new EncoderError("Will topic must be defined");
115
106
  }
116
- const cleanSession = packet.clean !== false;
117
- if (!cleanSession && (clientId === "")) {
118
- throw new EncoderError("Client id required for clean session");
107
+ if (packet.will?.payload === undefined) {
108
+ throw new EncoderError("Will payload must be defined");
119
109
  }
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;
110
+ }
111
+ const cleanSession = packet.clean !== false;
112
+ if (!cleanSession && (clientId === "")) {
113
+ throw new EncoderError("Client id required for non-clean session");
114
+ }
115
+ const connectFlags = (usernameFlag ? BitMask.bit7 : 0) +
116
+ (passwordFlag ? BitMask.bit6 : 0) +
117
+ (willRetain ? BitMask.bit5 : 0) +
118
+ (willQoS & 2 ? BitMask.bit4 : 0) +
119
+ (willQoS & 1 ? BitMask.bit3 : 0) +
120
+ (willFlag ? BitMask.bit2 : 0) +
121
+ (cleanSession ? BitMask.bit1 : 0);
122
+ const keepAlive = packet.keepAlive || 0;
123
+ const bridgeMode = !!packet.bridgeMode;
124
+ const rawProtocolLevel = bridgeMode ? protocolLevel + 128 : protocolLevel;
130
125
 
131
- const encoder = new Encoder(packet.type);
132
- encoder
133
- .setUtf8String(protocolName)
134
- .setByte(rawProtocolLevel)
135
- .setByte(connectFlags)
136
- .setInt16(keepAlive);
126
+ const encoder = new Encoder(packet.type);
127
+ encoder
128
+ .setUtf8String(protocolName)
129
+ .setByte(rawProtocolLevel)
130
+ .setByte(connectFlags)
131
+ .setInt16(keepAlive);
132
+ if (packet.protocolLevel === 5) {
133
+ encoder.setProperties(
134
+ packet.properties || {},
135
+ PropertySetType.connect,
136
+ codecOpts.maxOutgoingPacketSize,
137
+ );
138
+ }
139
+ encoder.setUtf8String(clientId);
140
+
141
+ if (
142
+ packet.will !== undefined && packet.will.topic !== undefined &&
143
+ packet.will.payload !== undefined
144
+ ) {
137
145
  if (packet.protocolLevel === 5) {
138
146
  encoder.setProperties(
139
- packet.properties || {},
140
- PropertySetType.connect,
147
+ packet.will?.properties || {},
148
+ PropertySetType.will,
141
149
  codecOpts.maxOutgoingPacketSize,
142
150
  );
143
151
  }
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
- }
152
+ encoder.setUtf8String(packet.will.topic);
153
+ encoder.setByteArray(packet.will.payload);
154
+ }
159
155
 
160
- if (packet.username !== undefined) {
161
- encoder.setUtf8String(packet.username);
162
- }
156
+ if (packet.username !== undefined) {
157
+ encoder.setUtf8String(packet.username);
158
+ }
163
159
 
164
- if (passwordFlag && packet.password !== undefined) {
165
- encoder.setByteArray(packet.password);
166
- }
167
- return encoder.done(flags);
168
- },
160
+ if (passwordFlag && packet.password !== undefined) {
161
+ encoder.setByteArray(packet.password);
162
+ }
163
+ return encoder.done(flags);
164
+ }
169
165
 
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;
166
+ export function decode(
167
+ buffer: Uint8Array,
168
+ flags: number,
169
+ _codecOpts: CodecOpts,
170
+ packetType: TPacketType,
171
+ ): ConnectPacket {
172
+ const decoder = new Decoder(packetType, buffer);
173
+ const protocolName = decoder.getUTF8String();
174
+ const rawProtocolLevel = decoder.getByte();
175
+ const bridgeMode = rawProtocolLevel > 128;
176
+ const protocolLevel = bridgeMode ? rawProtocolLevel - 128 : rawProtocolLevel;
183
177
 
184
- if (invalidProtocolName(protocolLevel, protocolName)) {
185
- throw new DecoderError("Invalid protocol name or level");
186
- }
178
+ if (invalidProtocolName(protocolLevel, protocolName)) {
179
+ throw new DecoderError("Invalid protocol name or level");
180
+ }
187
181
 
188
- const connectFlags = decoder.getByte();
182
+ const connectFlags = decoder.getByte();
189
183
 
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);
184
+ const usernameFlag = booleanFlag(connectFlags, BitMask.bit7);
185
+ const passwordFlag = booleanFlag(connectFlags, BitMask.bit6);
186
+ const willRetain = booleanFlag(connectFlags, BitMask.bit5);
187
+ const willQoS = (connectFlags & (BitMask.bit4 + BitMask.bit3)) >> 3;
188
+ const willFlag = booleanFlag(connectFlags, BitMask.bit2);
189
+ const cleanSession = booleanFlag(connectFlags, BitMask.bit1);
190
+ const reservedBit = booleanFlag(connectFlags, BitMask.bit0);
197
191
 
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
- }
192
+ hasEmptyFlags(flags);
193
+ // The Server MUST validate that the reserved flag in the CONNECT Control Packet
194
+ // is set to zero and disconnect the Client if it is not zero [MQTT-3.1.2-3].
195
+ if (reservedBit) {
196
+ throw new DecoderError("Invalid reserved bit");
197
+ }
204
198
 
205
- if (willQoS !== 0 && willQoS !== 1 && willQoS !== 2) {
206
- throw new DecoderError("Invalid will qos");
207
- }
199
+ if (willQoS !== 0 && willQoS !== 1 && willQoS !== 2) {
200
+ throw new DecoderError("Invalid will qos");
201
+ }
208
202
 
209
- if (!usernameFlag && passwordFlag) {
210
- throw new DecoderError("Password without username");
211
- }
203
+ if (!usernameFlag && passwordFlag) {
204
+ throw new DecoderError("Password without username");
205
+ }
212
206
 
213
- const keepAlive = decoder.getInt16();
214
- const isV5 = protocolLevel === 5;
215
- let properties;
207
+ const keepAlive = decoder.getInt16();
208
+ const isV5 = protocolLevel === 5;
209
+ let properties;
210
+ if (isV5) {
211
+ properties = decoder.getProperties(PropertySetType.connect);
212
+ }
213
+ const clientId = decoder.getUTF8String();
214
+ let willProperties;
215
+ let willTopic;
216
+ let willPayload;
217
+ if (willFlag) {
216
218
  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();
219
+ willProperties = decoder.getProperties(PropertySetType.will);
229
220
  }
221
+ willTopic = decoder.getUTF8String();
222
+ willPayload = decoder.getByteArray();
223
+ }
230
224
 
231
- let username;
232
- let password;
233
- if (usernameFlag) {
234
- username = decoder.getUTF8String();
235
- }
225
+ let username;
226
+ let password;
227
+ if (usernameFlag) {
228
+ username = decoder.getUTF8String();
229
+ }
236
230
 
237
- if (passwordFlag) {
238
- password = decoder.getByteArray();
239
- }
231
+ if (passwordFlag) {
232
+ password = decoder.getByteArray();
233
+ }
240
234
 
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
- }
235
+ decoder.done();
236
+ if (!willFlag && (willQoS !== 0 || willRetain === true)) {
237
+ throw new DecoderError(
238
+ "Will QoS must be 0 and Will retain to false when Will flag is false",
239
+ );
240
+ }
247
241
 
248
- if (clientId.length === 0 && cleanSession === false) {
249
- throw new DecoderError("Clean session must be true if clientID is empty");
250
- }
242
+ if (clientId.length === 0 && cleanSession === false) {
243
+ throw new DecoderError("Clean session must be true if clientID is empty");
244
+ }
251
245
 
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
- };
246
+ let bridgeModeProp = {};
247
+ if (bridgeMode) {
248
+ bridgeModeProp = { bridgeMode };
249
+ }
250
+ const commonProps = {
251
+ type: PacketType.connect,
252
+ protocolName: protocolName,
253
+ clientId: clientId,
254
+ username,
255
+ password: password ? password : undefined,
256
+ clean: cleanSession,
257
+ keepAlive,
258
+ ...bridgeModeProp,
259
+ };
266
260
 
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
- }
261
+ if (isV5) {
283
262
  return {
284
263
  ...commonProps,
285
- protocolLevel: protocolLevel as ProtocolLevel,
264
+ protocolLevel: 5,
286
265
  will: willFlag
287
266
  ? {
288
267
  topic: willTopic || "",
289
268
  payload: willPayload || Uint8Array.from([0]),
290
269
  retain: willRetain,
291
270
  qos: willQoS,
271
+ properties: willProperties,
292
272
  }
293
273
  : undefined,
274
+ properties,
294
275
  };
295
- },
296
- };
276
+ }
277
+ return {
278
+ ...commonProps,
279
+ protocolLevel: protocolLevel as ProtocolLevel,
280
+ will: willFlag
281
+ ? {
282
+ topic: willTopic || "",
283
+ payload: willPayload || Uint8Array.from([0]),
284
+ retain: willRetain,
285
+ qos: willQoS,
286
+ }
287
+ : undefined,
288
+ };
289
+ }
@@ -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,10 @@
1
1
  import type {
2
2
  TBitMask,
3
- Topic,
4
- TopicFilter,
5
3
  TPacketType,
6
4
  TReasonCode,
7
5
  UTF8StringPair,
8
6
  } from "./types.ts";
9
- import { invalidTopic, invalidTopicFilter } from "./validators.ts";
7
+ import { invalidUTF8 } from "./validators.ts";
10
8
  import { isValidReasonCode } from "./ReasonCode.ts";
11
9
  import type {
12
10
  Mqttv5PropertyTypesNoUser,
@@ -170,6 +168,11 @@ export class Decoder {
170
168
  */
171
169
  getUTF8String(): string {
172
170
  const str = utf8Decoder.decode(this.getByteArray());
171
+ if (invalidUTF8(str)) {
172
+ throw new DecoderError(
173
+ "String must contain valid UTF-8",
174
+ );
175
+ }
173
176
  return str;
174
177
  }
175
178
 
@@ -178,41 +181,11 @@ export class Decoder {
178
181
  * @returns The decoded UTF-8 pair as [name,value]
179
182
  */
180
183
  getUTF8StringPair(): UTF8StringPair {
181
- const name = utf8Decoder.decode(this.getByteArray());
182
- const value = utf8Decoder.decode(this.getByteArray());
184
+ const name = this.getUTF8String();
185
+ const value = this.getUTF8String();
183
186
  return [name, value];
184
187
  }
185
188
 
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
189
  /**
217
190
  * Gets the remaining bytes from the current position to the end
218
191
  * @returns The remaining bytes as a subarray
@@ -1,11 +1,7 @@
1
1
  import { PacketType } from "./PacketType.ts";
2
2
  import { Decoder, hasEmptyFlags, isEmptyBuf } from "./decoder.ts";
3
- import type {
4
- CodecOpts,
5
- ProtocolLevelNoV5,
6
- TPacketType,
7
- TReasonCode,
8
- } from "./types.ts";
3
+ import type { CodecOpts, TPacketType, TReasonCode } from "./types.ts";
4
+ import type { ProtocolLevelNoV5 } from "./protocolLevels.ts";
9
5
  import type { DisconnectProperties } from "./Properties.ts";
10
6
  import { Encoder } from "./encoder.ts";
11
7
  import { ReasonCode } from "./ReasonCode.ts";
@@ -30,71 +26,64 @@ export type DisconnectPacket = DisconnectPacketv4 | DisconnectPacketv5;
30
26
 
31
27
  const DISCONNECT_PACKET = new Uint8Array([PacketType.disconnect << 4, 0]);
32
28
 
33
- export const disconnect: {
34
- encode(_packet: DisconnectPacket, _codecOpts: CodecOpts): Uint8Array;
35
- decode(
36
- buffer: Uint8Array,
37
- _flags: number,
38
- codecOpts: CodecOpts,
39
- packetType: TPacketType,
40
- ): DisconnectPacket;
41
- } = {
42
- encode(packet: DisconnectPacket, codecOpts: CodecOpts): Uint8Array {
43
- if (packet.protocolLevel !== 5) {
44
- return DISCONNECT_PACKET;
45
- }
46
- const reasonCode = packet.reasonCode || ReasonCode.normalDisconnection;
47
- const encoder = new Encoder(packet.type);
48
- // see MQTT v5 3.14.2.1
49
- // if remaining length is less than 1 the value of 0x00 (normal disconnect) is used.
50
- if (
51
- reasonCode === ReasonCode.normalDisconnection &&
52
- Object.keys(packet.properties || {}).length === 0
53
- ) {
54
- return encoder.done(0);
55
- }
56
- encoder
57
- .setReasonCode(reasonCode);
58
- if (packet.properties) {
59
- encoder.setProperties(
60
- packet.properties,
61
- packet.type,
62
- codecOpts.maxOutgoingPacketSize,
63
- );
64
- }
29
+ export function encode(
30
+ packet: DisconnectPacket,
31
+ codecOpts: CodecOpts,
32
+ ): Uint8Array {
33
+ if (packet.protocolLevel !== 5) {
34
+ return DISCONNECT_PACKET;
35
+ }
36
+ const reasonCode = packet.reasonCode || ReasonCode.normalDisconnection;
37
+ const encoder = new Encoder(packet.type);
38
+ // see MQTT v5 3.14.2.1
39
+ // if remaining length is less than 1 the value of 0x00 (normal disconnect) is used.
40
+ if (
41
+ reasonCode === ReasonCode.normalDisconnection &&
42
+ Object.keys(packet.properties || {}).length === 0
43
+ ) {
65
44
  return encoder.done(0);
66
- },
45
+ }
46
+ encoder
47
+ .setReasonCode(reasonCode);
48
+ if (packet.properties) {
49
+ encoder.setProperties(
50
+ packet.properties,
51
+ packet.type,
52
+ codecOpts.maxOutgoingPacketSize,
53
+ );
54
+ }
55
+ return encoder.done(0);
56
+ }
67
57
 
68
- decode(
69
- buffer: Uint8Array,
70
- flags: number,
71
- codecOpts,
72
- packetType: TPacketType,
73
- ): DisconnectPacket {
74
- hasEmptyFlags(flags);
75
- if (codecOpts.protocolLevel !== 5) {
76
- isEmptyBuf(buffer);
77
- return {
78
- type: PacketType.disconnect,
79
- protocolLevel: codecOpts.protocolLevel,
80
- };
81
- }
82
- const decoder = new Decoder(packetType, buffer);
83
- if (decoder.atEnd()) {
84
- return {
85
- type: PacketType.disconnect,
86
- protocolLevel: 5,
87
- reasonCode: 0,
88
- };
89
- }
90
- const reasonCode = decoder.getReasonCode();
91
- const properties = decoder.getProperties(PacketType.disconnect);
92
- decoder.done();
58
+ export function decode(
59
+ buffer: Uint8Array,
60
+ flags: number,
61
+ codecOpts: CodecOpts,
62
+ packetType: TPacketType,
63
+ ): DisconnectPacket {
64
+ hasEmptyFlags(flags);
65
+ if (codecOpts.protocolLevel !== 5) {
66
+ isEmptyBuf(buffer);
67
+ return {
68
+ type: PacketType.disconnect,
69
+ protocolLevel: codecOpts.protocolLevel,
70
+ };
71
+ }
72
+ const decoder = new Decoder(packetType, buffer);
73
+ if (decoder.atEnd()) {
93
74
  return {
94
75
  type: PacketType.disconnect,
95
76
  protocolLevel: 5,
96
- reasonCode,
97
- properties,
77
+ reasonCode: 0,
98
78
  };
99
- },
100
- };
79
+ }
80
+ const reasonCode = decoder.getReasonCode();
81
+ const properties = decoder.getProperties(PacketType.disconnect);
82
+ decoder.done();
83
+ return {
84
+ type: PacketType.disconnect,
85
+ protocolLevel: 5,
86
+ reasonCode,
87
+ properties,
88
+ };
89
+ }