@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,11 +2,11 @@ import type {
2
2
  CodecOpts,
3
3
  Dup,
4
4
  Payload,
5
- ProtocolLevelNoV5,
6
5
  QoS,
7
6
  Topic,
8
7
  TPacketType,
9
8
  } from "./types.ts";
9
+ import type { ProtocolLevelNoV5 } from "./protocolLevels.ts";
10
10
  import type { PublishProperties } from "./Properties.ts";
11
11
  import { PacketType } from "./PacketType.ts";
12
12
  import { BitMask } from "./BitMask.ts";
@@ -38,92 +38,73 @@ export type PublishPacketV5 = {
38
38
  id?: number | undefined;
39
39
  properties?: PublishProperties | undefined;
40
40
  };
41
-
41
+ /** Publish packet (v4|v5). */
42
42
  export type PublishPacket = PublishPacketV4 | PublishPacketV5;
43
43
 
44
- export const publish: {
45
- encode(packet: PublishPacket, _codecOpts: CodecOpts): Uint8Array;
46
- decode(
47
- buffer: Uint8Array,
48
- flags: number,
49
- codecOpts: CodecOpts,
50
- packetType: TPacketType,
51
- ): PublishPacket;
52
- } = {
53
- encode(packet: PublishPacket, codecOpts: CodecOpts): Uint8Array {
54
- const qos = packet.qos || 0;
44
+ export function encode(
45
+ packet: PublishPacket,
46
+ codecOpts: CodecOpts,
47
+ ): Uint8Array {
48
+ const qos = packet.qos || 0;
55
49
 
56
- const flags = (packet.dup ? BitMask.bit3 : 0) +
57
- (qos & 2 ? BitMask.bit2 : 0) +
58
- (qos & 1 ? BitMask.bit1 : 0) +
59
- (packet.retain ? BitMask.bit0 : 0);
50
+ const flags = (packet.dup ? BitMask.bit3 : 0) +
51
+ (qos & 2 ? BitMask.bit2 : 0) +
52
+ (qos & 1 ? BitMask.bit1 : 0) +
53
+ (packet.retain ? BitMask.bit0 : 0);
60
54
 
61
- const encoder = new Encoder(packet.type);
62
- encoder.setTopic(packet.topic);
55
+ const encoder = new Encoder(packet.type);
56
+ encoder.setUtf8String(packet.topic);
63
57
 
64
- if (qos === 1 || qos === 2) {
65
- if (typeof packet.id !== "number" || packet.id < 1) {
66
- throw new EncoderError("when qos is 1 or 2, packet must have id");
67
- }
68
- encoder.setInt16(packet.id);
58
+ if (qos === 1 || qos === 2) {
59
+ if (typeof packet.id !== "number" || packet.id < 1) {
60
+ throw new EncoderError("when qos is 1 or 2, packet must have id");
69
61
  }
62
+ encoder.setInt16(packet.id);
63
+ }
70
64
 
71
- if (packet.protocolLevel === 5) {
72
- encoder.setProperties(
73
- packet.properties || {},
74
- PacketType.publish,
75
- codecOpts.maxOutgoingPacketSize,
76
- );
77
- }
78
- encoder.setRemainder(packet.payload);
79
- return encoder.done(flags);
80
- },
65
+ if (packet.protocolLevel === 5) {
66
+ encoder.setProperties(
67
+ packet.properties || {},
68
+ PacketType.publish,
69
+ codecOpts.maxOutgoingPacketSize,
70
+ );
71
+ }
72
+ encoder.setRemainder(packet.payload);
73
+ return encoder.done(flags);
74
+ }
81
75
 
82
- decode(
83
- buffer: Uint8Array,
84
- flags: number,
85
- codecOpts: CodecOpts,
86
- packetType: TPacketType,
87
- ): PublishPacket {
88
- const dup = booleanFlag(flags, BitMask.bit3);
89
- const qos = (flags & 6) >> 1;
90
- const retain = booleanFlag(flags, BitMask.bit0);
76
+ export function decode(
77
+ buffer: Uint8Array,
78
+ flags: number,
79
+ codecOpts: CodecOpts,
80
+ packetType: TPacketType,
81
+ ): PublishPacket {
82
+ const dup = booleanFlag(flags, BitMask.bit3);
83
+ const qos = (flags & 6) >> 1;
84
+ const retain = booleanFlag(flags, BitMask.bit0);
91
85
 
92
- if (qos !== 0 && qos !== 1 && qos !== 2) {
93
- throw new DecoderError("Invalid qos");
94
- }
86
+ if (qos !== 0 && qos !== 1 && qos !== 2) {
87
+ throw new DecoderError("Invalid qos");
88
+ }
95
89
 
96
- if (dup && qos === 0) {
97
- throw new DecoderError("Invalid qos for possible duplicate");
98
- }
90
+ if (dup && qos === 0) {
91
+ throw new DecoderError("Invalid qos for possible duplicate");
92
+ }
99
93
 
100
- const decoder = new Decoder(packetType, buffer);
101
- const topic = decoder.getTopic();
94
+ const decoder = new Decoder(packetType, buffer);
95
+ const topic = decoder.getUTF8String();
102
96
 
103
- let id = undefined;
104
- if (qos > 0) {
105
- id = decoder.getInt16();
106
- }
107
- if (codecOpts.protocolLevel === 5) {
108
- const properties = decoder.getProperties(PacketType.publish);
109
- const payload = decoder.getRemainder();
110
- return {
111
- type: PacketType.publish,
112
- protocolLevel: 5,
113
- properties,
114
- topic,
115
- payload,
116
- dup,
117
- retain,
118
- qos,
119
- id,
120
- };
121
- }
122
- // no decoder.done() required because of getRemainder
97
+ let id = undefined;
98
+ if (qos > 0) {
99
+ id = decoder.getInt16();
100
+ }
101
+ if (codecOpts.protocolLevel === 5) {
102
+ const properties = decoder.getProperties(PacketType.publish);
123
103
  const payload = decoder.getRemainder();
124
104
  return {
125
105
  type: PacketType.publish,
126
- protocolLevel: codecOpts.protocolLevel,
106
+ protocolLevel: 5,
107
+ properties,
127
108
  topic,
128
109
  payload,
129
110
  dup,
@@ -131,5 +112,17 @@ export const publish: {
131
112
  qos,
132
113
  id,
133
114
  };
134
- },
135
- };
115
+ }
116
+ // no decoder.done() required because of getRemainder
117
+ const payload = decoder.getRemainder();
118
+ return {
119
+ type: PacketType.publish,
120
+ protocolLevel: codecOpts.protocolLevel,
121
+ topic,
122
+ payload,
123
+ dup,
124
+ retain,
125
+ qos,
126
+ id,
127
+ };
128
+ }
@@ -1,11 +1,11 @@
1
1
  import type {
2
2
  CodecOpts,
3
3
  PacketId,
4
- ProtocolLevelNoV5,
5
4
  ReturnCodes,
6
5
  TPacketType,
7
6
  TReasonCode,
8
7
  } from "./types.ts";
8
+ import type { ProtocolLevelNoV5 } from "./protocolLevels.ts";
9
9
  import type { SubackProperties } from "./Properties.ts";
10
10
  import { PacketType } from "./PacketType.ts";
11
11
  import { Encoder } from "./encoder.ts";
@@ -33,68 +33,58 @@ export type SubackPacketV5 = {
33
33
  */
34
34
  export type SubackPacket = SubackPacketV4 | SubackPacketV5;
35
35
 
36
- export const suback: {
37
- encode(packet: SubackPacket, _codecOpts: CodecOpts): Uint8Array;
38
- decode(
39
- buffer: Uint8Array,
40
- flags: number,
41
- codecOpts: CodecOpts,
42
- packetType: TPacketType,
43
- ): SubackPacket;
44
- } = {
45
- encode(packet: SubackPacket, codecOpts: CodecOpts): Uint8Array {
46
- const flags = 0;
47
- const encoder = new Encoder(packet.type);
48
- encoder.setInt16(packet.id);
49
- if (packet.protocolLevel !== 5) {
50
- for (const code of packet.returnCodes) {
51
- if (!validReturnCodes.includes(code)) {
52
- throw new Error("Invalid return code");
53
- }
36
+ export function encode(packet: SubackPacket, codecOpts: CodecOpts): Uint8Array {
37
+ const flags = 0;
38
+ const encoder = new Encoder(packet.type);
39
+ encoder.setInt16(packet.id);
40
+ if (packet.protocolLevel !== 5) {
41
+ for (const code of packet.returnCodes) {
42
+ if (!validReturnCodes.includes(code)) {
43
+ throw new Error("Invalid return code");
54
44
  }
55
- encoder.setRemainder(packet.returnCodes);
56
- return encoder.done(flags);
57
- }
58
- encoder.setProperties(
59
- packet.properties || {},
60
- packet.type,
61
- codecOpts.maxOutgoingPacketSize,
62
- );
63
- for (const code of packet.reasonCodes) {
64
- encoder.setReasonCode(code);
65
45
  }
46
+ encoder.setRemainder(packet.returnCodes);
66
47
  return encoder.done(flags);
67
- },
48
+ }
49
+ encoder.setProperties(
50
+ packet.properties || {},
51
+ packet.type,
52
+ codecOpts.maxOutgoingPacketSize,
53
+ );
54
+ for (const code of packet.reasonCodes) {
55
+ encoder.setReasonCode(code);
56
+ }
57
+ return encoder.done(flags);
58
+ }
68
59
 
69
- decode(
70
- buffer: Uint8Array,
71
- _flags: number,
72
- codecOpts: CodecOpts,
73
- packetType: TPacketType,
74
- ): SubackPacket {
75
- const packet = {} as SubackPacket;
76
- const decoder = new Decoder(packetType, buffer);
77
- packet.type = PacketType.suback;
78
- packet.id = decoder.getInt16();
79
- packet.protocolLevel = codecOpts.protocolLevel;
60
+ export function decode(
61
+ buffer: Uint8Array,
62
+ _flags: number,
63
+ codecOpts: CodecOpts,
64
+ packetType: TPacketType,
65
+ ): SubackPacket {
66
+ const packet = {} as SubackPacket;
67
+ const decoder = new Decoder(packetType, buffer);
68
+ packet.type = PacketType.suback;
69
+ packet.id = decoder.getInt16();
70
+ packet.protocolLevel = codecOpts.protocolLevel;
80
71
 
81
- if (packet.protocolLevel !== 5) {
82
- const payload = decoder.getRemainder();
83
- packet.returnCodes = [];
84
- for (const code of payload) {
85
- if (!validReturnCodes.includes(code)) {
86
- throw new DecoderError("Invalid return code");
87
- }
88
- packet.returnCodes.push(code);
72
+ if (packet.protocolLevel !== 5) {
73
+ const payload = decoder.getRemainder();
74
+ packet.returnCodes = [];
75
+ for (const code of payload) {
76
+ if (!validReturnCodes.includes(code)) {
77
+ throw new DecoderError("Invalid return code");
89
78
  }
90
- return packet;
91
- }
92
- packet.properties = decoder.getProperties(PacketType.suback);
93
- packet.reasonCodes = [];
94
- while (!decoder.atEnd()) {
95
- const code = decoder.getReasonCode();
96
- packet.reasonCodes.push(code);
79
+ packet.returnCodes.push(code);
97
80
  }
98
81
  return packet;
99
- },
100
- };
82
+ }
83
+ packet.properties = decoder.getProperties(PacketType.suback);
84
+ packet.reasonCodes = [];
85
+ while (!decoder.atEnd()) {
86
+ const code = decoder.getReasonCode();
87
+ packet.reasonCodes.push(code);
88
+ }
89
+ return packet;
90
+ }
@@ -1,181 +1,205 @@
1
1
  import type {
2
2
  CodecOpts,
3
3
  PacketId,
4
- ProtocolLevelNoV5,
5
4
  QoS,
6
5
  TopicFilter,
7
6
  TPacketType,
8
7
  TRetainHandling,
9
8
  } from "./types.ts";
9
+ import type { ProtocolLevelNoV5 } from "./protocolLevels.ts";
10
10
  import type { SubscribeProperties } from "./Properties.ts";
11
11
  import { PacketType } from "./PacketType.ts";
12
12
  import { BitMask } from "./BitMask.ts";
13
13
  import { Encoder } from "./encoder.ts";
14
14
  import { booleanFlag, Decoder, DecoderError } from "./decoder.ts";
15
15
 
16
+ /**
17
+ * Represents an MQTT SUBSCRIBE packet conforming to MQTT version 3.1.1 (Protocol Level 4) or lower.
18
+ */
16
19
  export type SubscribePacketV4 = {
20
+ /** The type of the MQTT control packet. */
17
21
  type: TPacketType;
22
+ /** The protocol version level, restricted to non-v5 variants. */
18
23
  protocolLevel: ProtocolLevelNoV5;
24
+ /** The unique 16-bit packet identifier. */
19
25
  id: PacketId;
26
+ /** The list of topic subscriptions associated with this packet. */
20
27
  subscriptions: Array<SubscriptionV4>;
21
28
  };
22
29
 
30
+ /**
31
+ * Represents an MQTT SUBSCRIBE packet conforming to MQTT version 5.0.
32
+ */
23
33
  export type SubscribePacketV5 = {
34
+ /** The type of the MQTT control packet. */
24
35
  type: TPacketType;
36
+ /** The protocol version level, strictly set to 5. */
25
37
  protocolLevel: 5;
38
+ /** The unique 16-bit packet identifier. */
26
39
  id: PacketId;
40
+ /** Optional user and protocol properties introduced in MQTT v5. */
27
41
  properties?: SubscribeProperties;
42
+ /** The list of topic subscriptions including v5 option flags. */
28
43
  subscriptions: Array<SubscriptionV5>;
29
44
  };
30
45
 
31
46
  /**
32
- * SubscribePacket is sent from client to server to subscribe to topics
47
+ * Represents a union of available MQTT SUBSCRIBE packets (v4 or v5) sent from client to server.
33
48
  */
34
49
  export type SubscribePacket = SubscribePacketV4 | SubscribePacketV5;
50
+
35
51
  /**
36
- * The topic to subscribe to and the associated QoS
52
+ * Describes a topic subscription requirement for MQTT version 3.1.1.
37
53
  */
38
54
  export type SubscriptionV4 = {
55
+ /** The topic filter expression the client intends to subscribe to. */
39
56
  topicFilter: TopicFilter;
57
+ /** The maximum Quality of Service level authorized for this topic filter. */
40
58
  qos: QoS;
41
59
  };
42
60
 
61
+ /**
62
+ * Describes a topic subscription requirement for MQTT version 5.0, including extended flags.
63
+ */
43
64
  export type SubscriptionV5 = {
65
+ /** The topic filter expression the client intends to subscribe to. */
44
66
  topicFilter: TopicFilter;
67
+ /** The maximum Quality of Service level authorized for this topic filter. */
45
68
  qos: QoS;
69
+ /** Optional flag indicating whether messages should not be forwarded back to the client that published them. */
46
70
  noLocal?: boolean;
71
+ /** Optional flag indicating whether messages forwarded under this subscription keep their original retain flag. */
47
72
  retainAsPublished?: boolean;
73
+ /** Optional setting declaring how retained messages are handled when the subscription is created. */
48
74
  retainHandling?: TRetainHandling;
49
75
  };
50
76
 
77
+ /** * Represents a generic union of MQTT subscription configurations (v4 or v5).
78
+ */
51
79
  export type Subscription = SubscriptionV4 | SubscriptionV5;
52
80
 
53
- export const subscribe: {
54
- encode(packet: SubscribePacket, codecOpts: CodecOpts): Uint8Array;
55
- decode(
56
- buffer: Uint8Array,
57
- flags: number,
58
- codecOpts: CodecOpts,
59
- packetType: TPacketType,
60
- ): SubscribePacket;
61
- } = {
62
- encode(packet: SubscribePacket, codecOpts: CodecOpts): Uint8Array {
63
- // Bits 3,2,1 and 0 of the fixed header of the SUBSCRIBE Control Packet are reserved and
64
- // MUST be set to 0,0,1 and 0 respectively. The Server MUST treat any other value as
65
- // malformed and close the Network Connection [MQTT-3.8.1-1].
66
- const flags = 0b0010;
81
+ /**
82
+ * Codec utility object responsible for encoding and decoding MQTT SUBSCRIBE control packets.
83
+ */
84
+ export function encode(
85
+ packet: SubscribePacket,
86
+ codecOpts: CodecOpts,
87
+ ): Uint8Array {
88
+ // Bits 3,2,1 and 0 of the fixed header of the SUBSCRIBE Control Packet are reserved and
89
+ // MUST be set to 0,0,1 and 0 respectively. The Server MUST treat any other value as
90
+ // malformed and close the Network Connection [MQTT-3.8.1-1].
91
+ const flags = 0b0010;
67
92
 
68
- const encoder = new Encoder(packet.type);
69
- encoder.setInt16(packet.id);
93
+ const encoder = new Encoder(packet.type);
94
+ encoder.setInt16(packet.id);
95
+ if (packet.protocolLevel === 5) {
96
+ encoder.setProperties(
97
+ packet.properties || {},
98
+ packet.type,
99
+ codecOpts.maxOutgoingPacketSize,
100
+ );
101
+ }
102
+ for (const sub of packet.subscriptions) {
103
+ encoder.setUtf8String(sub.topicFilter);
70
104
  if (packet.protocolLevel === 5) {
71
- encoder.setProperties(
72
- packet.properties || {},
73
- packet.type,
74
- codecOpts.maxOutgoingPacketSize,
75
- );
76
- }
77
- for (const sub of packet.subscriptions) {
78
- encoder.setTopicFilter(sub.topicFilter);
79
- if (packet.protocolLevel === 5) {
80
- const {
81
- qos,
82
- noLocal = false,
83
- retainAsPublished = false,
84
- retainHandling = 0,
85
- } = sub as SubscriptionV5;
86
- const option = (qos & 1 ? BitMask.bit0 : 0) +
87
- (qos & 2 ? BitMask.bit1 : 0) +
88
- (noLocal ? BitMask.bit2 : 0) +
89
- (retainAsPublished ? BitMask.bit3 : 0) +
90
- ((retainHandling as number) & 1 ? BitMask.bit4 : 0) +
91
- ((retainHandling as number) & 2 ? BitMask.bit5 : 0);
92
- encoder.setByte(option);
93
- } else {
94
- encoder.setByte(sub.qos);
95
- }
105
+ const {
106
+ qos,
107
+ noLocal = false,
108
+ retainAsPublished = false,
109
+ retainHandling = 0,
110
+ } = sub as SubscriptionV5;
111
+ const option = (qos & 1 ? BitMask.bit0 : 0) +
112
+ (qos & 2 ? BitMask.bit1 : 0) +
113
+ (noLocal ? BitMask.bit2 : 0) +
114
+ (retainAsPublished ? BitMask.bit3 : 0) +
115
+ ((retainHandling as number) & 1 ? BitMask.bit4 : 0) +
116
+ ((retainHandling as number) & 2 ? BitMask.bit5 : 0);
117
+ encoder.setByte(option);
118
+ } else {
119
+ encoder.setByte(sub.qos);
96
120
  }
97
- return encoder.done(flags);
98
- },
121
+ }
122
+ return encoder.done(flags);
123
+ }
124
+
125
+ export function decode(
126
+ buffer: Uint8Array,
127
+ flags: number,
128
+ codecOpts: CodecOpts,
129
+ packetType: TPacketType,
130
+ ): SubscribePacket {
131
+ // Bits 3,2,1 and 0 of the fixed header of the SUBSCRIBE Control Packet are reserved and
132
+ // MUST be set to 0,0,1 and 0 respectively. The Server MUST treat any other value as
133
+ // malformed and close the Network Connection [MQTT-3.8.1-1].
134
+ if (flags !== 0b0010) {
135
+ throw new DecoderError("Invalid header");
136
+ }
137
+ const decoder = new Decoder(packetType, buffer);
138
+ const id = decoder.getInt16();
139
+ let properties = {};
140
+ if (codecOpts.protocolLevel === 5) {
141
+ properties = decoder.getProperties(PacketType.subscribe);
142
+ }
99
143
 
100
- decode(
101
- buffer: Uint8Array,
102
- flags: number,
103
- codecOpts: CodecOpts,
104
- packetType: TPacketType,
105
- ): SubscribePacket {
106
- // Bits 3,2,1 and 0 of the fixed header of the SUBSCRIBE Control Packet are reserved and
107
- // MUST be set to 0,0,1 and 0 respectively. The Server MUST treat any other value as
108
- // malformed and close the Network Connection [MQTT-3.8.1-1].
109
- if (flags !== 0b0010) {
110
- throw new DecoderError("Invalid header");
144
+ const subscriptions: Subscription[] = [];
145
+ // The payload of a SUBSCRIBE packet MUST contain at least one Topic Filter / Option pair.
146
+ // A SUBSCRIBE packet with no payload is a protocol violation [MQTT-3.8.3-3].
147
+ do {
148
+ const topicFilter = decoder.getUTF8String();
149
+ const option = decoder.getByte();
150
+ const qos = option & 0b11;
151
+ if (qos !== 0 && qos !== 1 && qos !== 2) {
152
+ throw new DecoderError("Invalid qos");
111
153
  }
112
- const decoder = new Decoder(packetType, buffer);
113
- const id = decoder.getInt16();
114
- let properties = {};
115
- if (codecOpts.protocolLevel === 5) {
116
- properties = decoder.getProperties(PacketType.subscribe);
154
+ if (qos > 0 && id === 0) {
155
+ throw new DecoderError("Invalid packet identifier");
117
156
  }
118
-
119
- const subscriptions: Subscription[] = [];
120
- // The payload of a SUBSCRIBE packet MUST contain at least one Topic Filter / Option pair.
121
- // A SUBSCRIBE packet with no payload is a protocol violation [MQTT-3.8.3-3].
122
- do {
123
- const topicFilter = decoder.getTopicFilter();
124
- const option = decoder.getByte();
125
- const qos = option & 0b11;
126
- if (qos !== 0 && qos !== 1 && qos !== 2) {
157
+ if (codecOpts.protocolLevel !== 5) {
158
+ if (option !== qos) {
127
159
  throw new DecoderError("Invalid qos");
128
160
  }
129
- if (qos > 0 && id === 0) {
130
- throw new DecoderError("Invalid packet identifier");
161
+ subscriptions.push({
162
+ topicFilter: topicFilter,
163
+ qos,
164
+ } as SubscriptionV4);
165
+ } else {
166
+ // Bits 6 and 7 of the Subscription Options byte are reserved for future use.
167
+ // The Server MUST treat a SUBSCRIBE packet as malformed if any of
168
+ // Reserved bits in the Payload are non-zero [MQTT-3.8.3-5].
169
+ if (option > 0b111111) {
170
+ throw new DecoderError("Invalid subscription options");
131
171
  }
132
- if (codecOpts.protocolLevel !== 5) {
133
- if (option !== qos) {
134
- throw new DecoderError("Invalid qos");
135
- }
136
- subscriptions.push({
137
- topicFilter: topicFilter,
138
- qos,
139
- } as SubscriptionV4);
140
- } else {
141
- // Bits 6 and 7 of the Subscription Options byte are reserved for future use.
142
- // The Server MUST treat a SUBSCRIBE packet as malformed if any of
143
- // Reserved bits in the Payload are non-zero [MQTT-3.8.3-5].
144
- if (option > 0b111111) {
145
- throw new DecoderError("Invalid subscription options");
146
- }
147
- const noLocal = booleanFlag(option, BitMask.bit2);
148
- const retainAsPublished = booleanFlag(option, BitMask.bit3);
149
- const retainHandling = (option & 0b110000) >> 4;
150
- if (
151
- retainHandling !== 0 && retainHandling !== 1 && retainHandling !== 2
152
- ) {
153
- throw new DecoderError("Invalid retain handling");
154
- }
155
- subscriptions.push({
156
- topicFilter: topicFilter,
157
- qos,
158
- noLocal,
159
- retainAsPublished,
160
- retainHandling,
161
- } as SubscriptionV5);
172
+ const noLocal = booleanFlag(option, BitMask.bit2);
173
+ const retainAsPublished = booleanFlag(option, BitMask.bit3);
174
+ const retainHandling = (option & 0b110000) >> 4;
175
+ if (
176
+ retainHandling !== 0 && retainHandling !== 1 && retainHandling !== 2
177
+ ) {
178
+ throw new DecoderError("Invalid retain handling");
162
179
  }
163
- } while (!decoder.atEnd());
164
- decoder.done();
165
- if (codecOpts.protocolLevel !== 5) {
166
- return {
167
- type: PacketType.subscribe,
168
- protocolLevel: codecOpts.protocolLevel,
169
- id,
170
- subscriptions: subscriptions as Array<SubscriptionV4>,
171
- };
180
+ subscriptions.push({
181
+ topicFilter: topicFilter,
182
+ qos,
183
+ noLocal,
184
+ retainAsPublished,
185
+ retainHandling,
186
+ } as SubscriptionV5);
172
187
  }
188
+ } while (!decoder.atEnd());
189
+ decoder.done();
190
+ if (codecOpts.protocolLevel !== 5) {
173
191
  return {
174
192
  type: PacketType.subscribe,
175
- protocolLevel: 5,
193
+ protocolLevel: codecOpts.protocolLevel,
176
194
  id,
177
- properties,
178
- subscriptions: subscriptions as Array<SubscriptionV5>,
195
+ subscriptions: subscriptions as Array<SubscriptionV4>,
179
196
  };
180
- },
181
- };
197
+ }
198
+ return {
199
+ type: PacketType.subscribe,
200
+ protocolLevel: 5,
201
+ id,
202
+ properties,
203
+ subscriptions: subscriptions as Array<SubscriptionV5>,
204
+ };
205
+ }
@@ -3,6 +3,7 @@ import type { PacketType } from "./PacketType.ts";
3
3
  import type { RetainHandling } from "./RetainHandling.ts";
4
4
  import type { AuthenticationResult } from "./AuthenticationResult.ts";
5
5
  import type { ReasonCode } from "./ReasonCode.ts";
6
+ import type { ProtocolLevel } from "./protocolLevels.ts";
6
7
 
7
8
  /**
8
9
  * Type to limit bit mask to valid values
@@ -24,15 +25,6 @@ export type TAuthenticationResult =
24
25
  */
25
26
  export type TReasonCode = typeof ReasonCode[keyof typeof ReasonCode];
26
27
 
27
- /**
28
- * Protocol version
29
- * 3.1 = 3
30
- * 3.1.1 = 4
31
- * 5.0 = 5
32
- */
33
- export type ProtocolLevel = 3 | 4 | 5 | undefined;
34
- export type ProtocolLevelNoV5 = Exclude<ProtocolLevel, 5>;
35
-
36
28
  /**
37
29
  * Quality of Service level
38
30
  */