@seriousme/opifex 1.11.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. package/LICENSE.txt +1 -1
  2. package/README.md +102 -43
  3. package/bin/conformanceServer.ts +45 -13
  4. package/bin/demoServer.ts +38 -13
  5. package/bin/mqtt.ts +52 -30
  6. package/client/ConnectionState.ts +2 -0
  7. package/client/client.ts +57 -47
  8. package/client/context.ts +75 -21
  9. package/client/deps.ts +5 -0
  10. package/client/handlers/handleAuth.test.ts +193 -0
  11. package/client/handlers/handleAuth.ts +89 -0
  12. package/client/handlers/handleConnack.test.ts +173 -0
  13. package/client/handlers/handleConnack.ts +16 -6
  14. package/client/handlers/handleDisconnect.test.ts +22 -0
  15. package/client/handlers/handleDisconnect.ts +17 -0
  16. package/client/handlers/handlePacket.test.ts +242 -0
  17. package/client/handlers/handlePacket.ts +19 -5
  18. package/client/handlers/handlePuback.test.ts +99 -0
  19. package/client/handlers/handlePuback.ts +6 -0
  20. package/client/handlers/handlePubcomp.test.ts +112 -0
  21. package/client/handlers/handlePubcomp.ts +5 -0
  22. package/client/handlers/handlePublish.test.ts +188 -0
  23. package/client/handlers/handlePubrec.test.ts +119 -0
  24. package/client/handlers/handlePubrec.ts +5 -1
  25. package/client/handlers/handlePubrel.test.ts +136 -0
  26. package/client/handlers/handleSuback.test.ts +122 -0
  27. package/client/handlers/handleSuback.ts +3 -0
  28. package/client/handlers/handleUnsuback.test.ts +101 -0
  29. package/client/mod.ts +2 -2
  30. package/client/store/memoryStore.ts +2 -2
  31. package/client/store/store.ts +3 -1
  32. package/deno/README.md +1 -2
  33. package/deno/tcpClient.test.ts +75 -0
  34. package/deno/tcpClient.ts +16 -11
  35. package/deno/tcpServer.test.ts +22 -21
  36. package/deno/tcpServer.ts +5 -0
  37. package/deno/tlsServer.test.ts +97 -0
  38. package/deno/tlsServer.ts +42 -0
  39. package/deno/wsServer.test.ts +93 -0
  40. package/deno/wsServer.ts +73 -0
  41. package/dev_utils/generateCert.ts +95 -0
  42. package/dev_utils/mockConn.ts +36 -0
  43. package/dev_utils/mockServer.ts +28 -0
  44. package/dev_utils/mod.ts +30 -2
  45. package/dev_utils/packetHelpers.ts +404 -0
  46. package/dev_utils/test-handlers.ts +98 -0
  47. package/dev_utils/timers.ts +14 -0
  48. package/dev_utils/webStreamPair.test.ts +171 -0
  49. package/dev_utils/webStreamPair.ts +143 -0
  50. package/dist/bin/conformanceServer.js +17 -12
  51. package/dist/bin/conformanceServer.js.map +1 -1
  52. package/dist/bin/demoServer.js +16 -12
  53. package/dist/bin/demoServer.js.map +1 -1
  54. package/dist/bin/mqtt.js +19 -16
  55. package/dist/bin/mqtt.js.map +1 -1
  56. package/dist/client/ConnectionState.d.ts +2 -0
  57. package/dist/client/ConnectionState.d.ts.map +1 -1
  58. package/dist/client/ConnectionState.js +2 -0
  59. package/dist/client/ConnectionState.js.map +1 -1
  60. package/dist/client/client.d.ts +19 -22
  61. package/dist/client/client.d.ts.map +1 -1
  62. package/dist/client/client.js +34 -20
  63. package/dist/client/client.js.map +1 -1
  64. package/dist/client/context.d.ts +11 -3
  65. package/dist/client/context.d.ts.map +1 -1
  66. package/dist/client/context.js +44 -12
  67. package/dist/client/context.js.map +1 -1
  68. package/dist/client/deps.d.ts +3 -2
  69. package/dist/client/deps.d.ts.map +1 -1
  70. package/dist/client/deps.js +1 -1
  71. package/dist/client/deps.js.map +1 -1
  72. package/dist/client/handlers/handleAuth.d.ts +9 -0
  73. package/dist/client/handlers/handleAuth.d.ts.map +1 -0
  74. package/dist/client/handlers/handleAuth.js +66 -0
  75. package/dist/client/handlers/handleAuth.js.map +1 -0
  76. package/dist/client/handlers/handleConnack.d.ts +2 -2
  77. package/dist/client/handlers/handleConnack.d.ts.map +1 -1
  78. package/dist/client/handlers/handleConnack.js +16 -6
  79. package/dist/client/handlers/handleConnack.js.map +1 -1
  80. package/dist/client/handlers/handleDisconnect.d.ts +11 -0
  81. package/dist/client/handlers/handleDisconnect.d.ts.map +1 -0
  82. package/dist/client/handlers/handleDisconnect.js +15 -0
  83. package/dist/client/handlers/handleDisconnect.js.map +1 -0
  84. package/dist/client/handlers/handlePacket.d.ts.map +1 -1
  85. package/dist/client/handlers/handlePacket.js +14 -3
  86. package/dist/client/handlers/handlePacket.js.map +1 -1
  87. package/dist/client/handlers/handlePuback.d.ts.map +1 -1
  88. package/dist/client/handlers/handlePuback.js +5 -0
  89. package/dist/client/handlers/handlePuback.js.map +1 -1
  90. package/dist/client/handlers/handlePubcomp.d.ts.map +1 -1
  91. package/dist/client/handlers/handlePubcomp.js +5 -0
  92. package/dist/client/handlers/handlePubcomp.js.map +1 -1
  93. package/dist/client/handlers/handlePubrec.d.ts.map +1 -1
  94. package/dist/client/handlers/handlePubrec.js +5 -1
  95. package/dist/client/handlers/handlePubrec.js.map +1 -1
  96. package/dist/client/handlers/handleSuback.d.ts +1 -0
  97. package/dist/client/handlers/handleSuback.d.ts.map +1 -1
  98. package/dist/client/handlers/handleSuback.js +3 -0
  99. package/dist/client/handlers/handleSuback.js.map +1 -1
  100. package/dist/client/mod.d.ts +2 -2
  101. package/dist/client/mod.d.ts.map +1 -1
  102. package/dist/client/mod.js +1 -1
  103. package/dist/client/mod.js.map +1 -1
  104. package/dist/client/store/memoryStore.d.ts.map +1 -1
  105. package/dist/client/store/memoryStore.js +2 -2
  106. package/dist/client/store/memoryStore.js.map +1 -1
  107. package/dist/client/store/store.d.ts +2 -1
  108. package/dist/client/store/store.d.ts.map +1 -1
  109. package/dist/client/store/store.js +1 -1
  110. package/dist/client/store/store.js.map +1 -1
  111. package/dist/dev_utils/generateCert.d.ts +11 -0
  112. package/dist/dev_utils/generateCert.d.ts.map +1 -0
  113. package/dist/dev_utils/generateCert.js +76 -0
  114. package/dist/dev_utils/generateCert.js.map +1 -0
  115. package/dist/examples/authHandler.test.d.ts +2 -0
  116. package/dist/examples/authHandler.test.d.ts.map +1 -0
  117. package/dist/examples/authHandler.test.js +123 -0
  118. package/dist/examples/authHandler.test.js.map +1 -0
  119. package/dist/examples/mqtt.test.d.ts +2 -0
  120. package/dist/examples/mqtt.test.d.ts.map +1 -0
  121. package/dist/examples/mqtt.test.js +70 -0
  122. package/dist/examples/mqtt.test.js.map +1 -0
  123. package/dist/examples/mqtts.test.d.ts +2 -0
  124. package/dist/examples/mqtts.test.d.ts.map +1 -0
  125. package/dist/examples/mqtts.test.js +81 -0
  126. package/dist/examples/mqtts.test.js.map +1 -0
  127. package/dist/mqttConn/mqttConn.d.ts +25 -16
  128. package/dist/mqttConn/mqttConn.d.ts.map +1 -1
  129. package/dist/mqttConn/mqttConn.js +69 -40
  130. package/dist/mqttConn/mqttConn.js.map +1 -1
  131. package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -1
  132. package/dist/mqttPacket/BitMask.d.ts +12 -11
  133. package/dist/mqttPacket/BitMask.d.ts.map +1 -1
  134. package/dist/mqttPacket/BitMask.js +10 -18
  135. package/dist/mqttPacket/BitMask.js.map +1 -1
  136. package/dist/mqttPacket/PacketType.d.ts.map +1 -1
  137. package/dist/mqttPacket/Properties.d.ts +2 -2
  138. package/dist/mqttPacket/Properties.d.ts.map +1 -1
  139. package/dist/mqttPacket/Properties.js.map +1 -1
  140. package/dist/mqttPacket/ReasonCode.d.ts +1 -0
  141. package/dist/mqttPacket/ReasonCode.d.ts.map +1 -1
  142. package/dist/mqttPacket/ReasonCode.js +1 -0
  143. package/dist/mqttPacket/ReasonCode.js.map +1 -1
  144. package/dist/mqttPacket/RetainHandling.d.ts.map +1 -1
  145. package/dist/mqttPacket/auth.d.ts +3 -5
  146. package/dist/mqttPacket/auth.d.ts.map +1 -1
  147. package/dist/mqttPacket/auth.js +31 -30
  148. package/dist/mqttPacket/auth.js.map +1 -1
  149. package/dist/mqttPacket/codec.d.ts +48 -0
  150. package/dist/mqttPacket/codec.d.ts.map +1 -0
  151. package/dist/mqttPacket/codec.js +93 -0
  152. package/dist/mqttPacket/codec.js.map +1 -0
  153. package/dist/mqttPacket/connack.d.ts +4 -5
  154. package/dist/mqttPacket/connack.d.ts.map +1 -1
  155. package/dist/mqttPacket/connack.js +43 -45
  156. package/dist/mqttPacket/connack.js.map +1 -1
  157. package/dist/mqttPacket/connect.d.ts +26 -27
  158. package/dist/mqttPacket/connect.d.ts.map +1 -1
  159. package/dist/mqttPacket/connect.js +156 -157
  160. package/dist/mqttPacket/connect.js.map +1 -1
  161. package/dist/mqttPacket/decoder.d.ts +1 -13
  162. package/dist/mqttPacket/decoder.d.ts.map +1 -1
  163. package/dist/mqttPacket/decoder.js +7 -28
  164. package/dist/mqttPacket/decoder.js.map +1 -1
  165. package/dist/mqttPacket/disconnect.d.ts +4 -5
  166. package/dist/mqttPacket/disconnect.d.ts.map +1 -1
  167. package/dist/mqttPacket/disconnect.js +41 -43
  168. package/dist/mqttPacket/disconnect.js.map +1 -1
  169. package/dist/mqttPacket/encoder.d.ts +1 -15
  170. package/dist/mqttPacket/encoder.d.ts.map +1 -1
  171. package/dist/mqttPacket/encoder.js +4 -27
  172. package/dist/mqttPacket/encoder.js.map +1 -1
  173. package/dist/mqttPacket/length.js +1 -1
  174. package/dist/mqttPacket/length.js.map +1 -1
  175. package/dist/mqttPacket/mod.d.ts +21 -103
  176. package/dist/mqttPacket/mod.d.ts.map +1 -1
  177. package/dist/mqttPacket/mod.js +5 -94
  178. package/dist/mqttPacket/mod.js.map +1 -1
  179. package/dist/mqttPacket/pingreq.d.ts +4 -5
  180. package/dist/mqttPacket/pingreq.d.ts.map +1 -1
  181. package/dist/mqttPacket/pingreq.js +11 -13
  182. package/dist/mqttPacket/pingreq.js.map +1 -1
  183. package/dist/mqttPacket/pingres.d.ts +4 -5
  184. package/dist/mqttPacket/pingres.d.ts.map +1 -1
  185. package/dist/mqttPacket/pingres.js +11 -13
  186. package/dist/mqttPacket/pingres.js.map +1 -1
  187. package/dist/mqttPacket/protocolLevels.d.ts +11 -6
  188. package/dist/mqttPacket/protocolLevels.d.ts.map +1 -1
  189. package/dist/mqttPacket/protocolLevels.js +5 -1
  190. package/dist/mqttPacket/protocolLevels.js.map +1 -1
  191. package/dist/mqttPacket/pubblishAcks.d.ts +9 -10
  192. package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -1
  193. package/dist/mqttPacket/pubblishAcks.js +43 -45
  194. package/dist/mqttPacket/pubblishAcks.js.map +1 -1
  195. package/dist/mqttPacket/publish.d.ts +14 -14
  196. package/dist/mqttPacket/publish.d.ts.map +1 -1
  197. package/dist/mqttPacket/publish.js +53 -55
  198. package/dist/mqttPacket/publish.js.map +1 -1
  199. package/dist/mqttPacket/suback.d.ts +4 -5
  200. package/dist/mqttPacket/suback.d.ts.map +1 -1
  201. package/dist/mqttPacket/suback.js +38 -40
  202. package/dist/mqttPacket/suback.js.map +1 -1
  203. package/dist/mqttPacket/subscribe.d.ts +36 -7
  204. package/dist/mqttPacket/subscribe.d.ts.map +1 -1
  205. package/dist/mqttPacket/subscribe.js +90 -89
  206. package/dist/mqttPacket/subscribe.js.map +1 -1
  207. package/dist/mqttPacket/types.d.ts +1 -8
  208. package/dist/mqttPacket/types.d.ts.map +1 -1
  209. package/dist/mqttPacket/unsuback.d.ts +4 -5
  210. package/dist/mqttPacket/unsuback.d.ts.map +1 -1
  211. package/dist/mqttPacket/unsuback.js +32 -34
  212. package/dist/mqttPacket/unsuback.js.map +1 -1
  213. package/dist/mqttPacket/unsubscribe.d.ts +23 -6
  214. package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
  215. package/dist/mqttPacket/unsubscribe.js +45 -44
  216. package/dist/mqttPacket/unsubscribe.js.map +1 -1
  217. package/dist/mqttPacket/validators.d.ts +4 -16
  218. package/dist/mqttPacket/validators.d.ts.map +1 -1
  219. package/dist/mqttPacket/validators.js +5 -26
  220. package/dist/mqttPacket/validators.js.map +1 -1
  221. package/dist/node/tcpClient.d.ts +1 -1
  222. package/dist/node/tcpClient.d.ts.map +1 -1
  223. package/dist/node/tcpClient.js +12 -7
  224. package/dist/node/tcpClient.js.map +1 -1
  225. package/dist/node/tcpServer.d.ts.map +1 -1
  226. package/dist/node/tcpServer.js +4 -0
  227. package/dist/node/tcpServer.js.map +1 -1
  228. package/dist/node/tlsServer.d.ts +19 -0
  229. package/dist/node/tlsServer.d.ts.map +1 -0
  230. package/dist/node/tlsServer.js +58 -0
  231. package/dist/node/tlsServer.js.map +1 -0
  232. package/dist/node/wrapNodeSocket.d.ts.map +1 -1
  233. package/dist/node/wrapNodeSocket.js +6 -28
  234. package/dist/node/wrapNodeSocket.js.map +1 -1
  235. package/dist/persistence/basicPersistence.d.ts +36 -0
  236. package/dist/persistence/basicPersistence.d.ts.map +1 -0
  237. package/dist/persistence/basicPersistence.js +306 -0
  238. package/dist/persistence/basicPersistence.js.map +1 -0
  239. package/dist/persistence/deps.d.ts +3 -2
  240. package/dist/persistence/deps.d.ts.map +1 -1
  241. package/dist/persistence/deps.js +2 -1
  242. package/dist/persistence/deps.js.map +1 -1
  243. package/dist/persistence/memory/memoryPersistence.d.ts +6 -23
  244. package/dist/persistence/memory/memoryPersistence.d.ts.map +1 -1
  245. package/dist/persistence/memory/memoryPersistence.js +12 -115
  246. package/dist/persistence/memory/memoryPersistence.js.map +1 -1
  247. package/dist/persistence/memory/memoryStorage.d.ts +45 -0
  248. package/dist/persistence/memory/memoryStorage.d.ts.map +1 -0
  249. package/dist/persistence/memory/memoryStorage.js +143 -0
  250. package/dist/persistence/memory/memoryStorage.js.map +1 -0
  251. package/dist/persistence/mod.d.ts +3 -3
  252. package/dist/persistence/mod.d.ts.map +1 -1
  253. package/dist/persistence/mod.js +6 -1
  254. package/dist/persistence/mod.js.map +1 -1
  255. package/dist/persistence/persistence.d.ts +44 -69
  256. package/dist/persistence/persistence.d.ts.map +1 -1
  257. package/dist/persistence/persistence.js +1 -2
  258. package/dist/persistence/persistence.js.map +1 -1
  259. package/dist/persistence/sqlite/sqliteDatabase.d.ts +46 -0
  260. package/dist/persistence/sqlite/sqliteDatabase.d.ts.map +1 -0
  261. package/dist/persistence/sqlite/sqliteDatabase.js +215 -0
  262. package/dist/persistence/sqlite/sqliteDatabase.js.map +1 -0
  263. package/dist/persistence/sqlite/sqlitePersistence.d.ts +16 -0
  264. package/dist/persistence/sqlite/sqlitePersistence.d.ts.map +1 -0
  265. package/dist/persistence/sqlite/sqlitePersistence.js +29 -0
  266. package/dist/persistence/sqlite/sqlitePersistence.js.map +1 -0
  267. package/dist/persistence/sqlite/sqliteStorage.d.ts +36 -0
  268. package/dist/persistence/sqlite/sqliteStorage.d.ts.map +1 -0
  269. package/dist/persistence/sqlite/sqliteStorage.js +194 -0
  270. package/dist/persistence/sqlite/sqliteStorage.js.map +1 -0
  271. package/dist/persistence/storage.d.ts +38 -0
  272. package/dist/persistence/storage.d.ts.map +1 -0
  273. package/dist/persistence/storage.js +5 -0
  274. package/dist/persistence/storage.js.map +1 -0
  275. package/dist/server/config.d.ts +47 -0
  276. package/dist/server/config.d.ts.map +1 -0
  277. package/dist/server/config.js +41 -0
  278. package/dist/server/config.js.map +1 -0
  279. package/dist/server/context.d.ts +198 -24
  280. package/dist/server/context.d.ts.map +1 -1
  281. package/dist/server/context.js +432 -53
  282. package/dist/server/context.js.map +1 -1
  283. package/dist/server/deps.d.ts +5 -6
  284. package/dist/server/deps.d.ts.map +1 -1
  285. package/dist/server/deps.js +2 -2
  286. package/dist/server/deps.js.map +1 -1
  287. package/dist/server/handlers/completeConnect.d.ts +8 -0
  288. package/dist/server/handlers/completeConnect.d.ts.map +1 -0
  289. package/dist/server/handlers/completeConnect.js +74 -0
  290. package/dist/server/handlers/completeConnect.js.map +1 -0
  291. package/dist/server/handlers/handleAuth.d.ts +9 -0
  292. package/dist/server/handlers/handleAuth.d.ts.map +1 -0
  293. package/dist/server/handlers/handleAuth.js +69 -0
  294. package/dist/server/handlers/handleAuth.js.map +1 -0
  295. package/dist/server/handlers/handleConnect.d.ts +2 -4
  296. package/dist/server/handlers/handleConnect.d.ts.map +1 -1
  297. package/dist/server/handlers/handleConnect.js +140 -67
  298. package/dist/server/handlers/handleConnect.js.map +1 -1
  299. package/dist/server/handlers/handleDisconnect.d.ts +1 -1
  300. package/dist/server/handlers/handleDisconnect.d.ts.map +1 -1
  301. package/dist/server/handlers/handleDisconnect.js +3 -3
  302. package/dist/server/handlers/handleDisconnect.js.map +1 -1
  303. package/dist/server/handlers/handlePacket.d.ts.map +1 -1
  304. package/dist/server/handlers/handlePacket.js +19 -6
  305. package/dist/server/handlers/handlePacket.js.map +1 -1
  306. package/dist/server/handlers/handlePuback.d.ts +1 -3
  307. package/dist/server/handlers/handlePuback.d.ts.map +1 -1
  308. package/dist/server/handlers/handlePuback.js +2 -8
  309. package/dist/server/handlers/handlePuback.js.map +1 -1
  310. package/dist/server/handlers/handlePubcomp.d.ts +1 -1
  311. package/dist/server/handlers/handlePubcomp.d.ts.map +1 -1
  312. package/dist/server/handlers/handlePubcomp.js +2 -4
  313. package/dist/server/handlers/handlePubcomp.js.map +1 -1
  314. package/dist/server/handlers/handlePublish.d.ts +1 -1
  315. package/dist/server/handlers/handlePublish.d.ts.map +1 -1
  316. package/dist/server/handlers/handlePublish.js +149 -45
  317. package/dist/server/handlers/handlePublish.js.map +1 -1
  318. package/dist/server/handlers/handlePubrec.d.ts.map +1 -1
  319. package/dist/server/handlers/handlePubrec.js +2 -3
  320. package/dist/server/handlers/handlePubrec.js.map +1 -1
  321. package/dist/server/handlers/handlePubrel.d.ts.map +1 -1
  322. package/dist/server/handlers/handlePubrel.js +6 -2
  323. package/dist/server/handlers/handlePubrel.js.map +1 -1
  324. package/dist/server/handlers/handleSubscribe.d.ts +1 -6
  325. package/dist/server/handlers/handleSubscribe.d.ts.map +1 -1
  326. package/dist/server/handlers/handleSubscribe.js +99 -38
  327. package/dist/server/handlers/handleSubscribe.js.map +1 -1
  328. package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -1
  329. package/dist/server/handlers/handleUnsubscribe.js +19 -4
  330. package/dist/server/handlers/handleUnsubscribe.js.map +1 -1
  331. package/dist/server/mod.d.ts +3 -3
  332. package/dist/server/mod.d.ts.map +1 -1
  333. package/dist/server/mod.js +1 -1
  334. package/dist/server/mod.js.map +1 -1
  335. package/dist/server/server.d.ts +29 -6
  336. package/dist/server/server.d.ts.map +1 -1
  337. package/dist/server/server.js +84 -15
  338. package/dist/server/server.js.map +1 -1
  339. package/dist/socket/socket.d.ts +11 -9
  340. package/dist/socket/socket.d.ts.map +1 -1
  341. package/dist/socket/socket.js +67 -15
  342. package/dist/socket/socket.js.map +1 -1
  343. package/dist/timer/timer.d.ts +32 -0
  344. package/dist/timer/timer.d.ts.map +1 -1
  345. package/dist/timer/timer.js +32 -0
  346. package/dist/timer/timer.js.map +1 -1
  347. package/dist/trie/trie.d.ts +10 -5
  348. package/dist/trie/trie.d.ts.map +1 -1
  349. package/dist/trie/trie.js +47 -17
  350. package/dist/trie/trie.js.map +1 -1
  351. package/dist/utils/assert.d.ts.map +1 -1
  352. package/dist/utils/{BufferedAsyncIterable.d.ts → bufferedAsyncIterable.d.ts} +1 -1
  353. package/dist/utils/bufferedAsyncIterable.d.ts.map +1 -0
  354. package/dist/utils/{BufferedAsyncIterable.js → bufferedAsyncIterable.js} +1 -1
  355. package/dist/utils/bufferedAsyncIterable.js.map +1 -0
  356. package/dist/utils/deferred.d.ts.map +1 -1
  357. package/dist/utils/deferred.js.map +1 -1
  358. package/dist/utils/getOrInsertPolyFill.d.ts +2 -0
  359. package/dist/utils/getOrInsertPolyFill.d.ts.map +1 -0
  360. package/dist/utils/getOrInsertPolyFill.js +12 -0
  361. package/dist/utils/getOrInsertPolyFill.js.map +1 -0
  362. package/dist/utils/logger.d.ts +40 -3
  363. package/dist/utils/logger.d.ts.map +1 -1
  364. package/dist/utils/logger.js +53 -7
  365. package/dist/utils/logger.js.map +1 -1
  366. package/dist/utils/mod.d.ts +6 -1
  367. package/dist/utils/mod.d.ts.map +1 -1
  368. package/dist/utils/mod.js +5 -1
  369. package/dist/utils/mod.js.map +1 -1
  370. package/dist/utils/outboundTopicAliasManager.d.ts +52 -0
  371. package/dist/utils/outboundTopicAliasManager.d.ts.map +1 -0
  372. package/dist/utils/outboundTopicAliasManager.js +74 -0
  373. package/dist/utils/outboundTopicAliasManager.js.map +1 -0
  374. package/dist/utils/queue.d.ts.map +1 -1
  375. package/dist/utils/topicFilter.d.ts +32 -0
  376. package/dist/utils/topicFilter.d.ts.map +1 -0
  377. package/dist/utils/topicFilter.js +52 -0
  378. package/dist/utils/topicFilter.js.map +1 -0
  379. package/dist/utils/utils.d.ts +2 -0
  380. package/dist/utils/utils.d.ts.map +1 -1
  381. package/dist/utils/utils.js +2 -0
  382. package/dist/utils/utils.js.map +1 -1
  383. package/dist/utils/validators.d.ts +34 -0
  384. package/dist/utils/validators.d.ts.map +1 -0
  385. package/dist/utils/validators.js +61 -0
  386. package/dist/utils/validators.js.map +1 -0
  387. package/dist/web/webSocketStream.d.ts +29 -0
  388. package/dist/web/webSocketStream.d.ts.map +1 -0
  389. package/dist/web/webSocketStream.js +69 -0
  390. package/dist/web/webSocketStream.js.map +1 -0
  391. package/dist/web/wrapWebSocket.d.ts +12 -0
  392. package/dist/web/wrapWebSocket.d.ts.map +1 -0
  393. package/dist/web/wrapWebSocket.js +41 -0
  394. package/dist/web/wrapWebSocket.js.map +1 -0
  395. package/dist/web/wsClient.d.ts +7 -0
  396. package/dist/web/wsClient.d.ts.map +1 -0
  397. package/dist/web/wsClient.js +22 -0
  398. package/dist/web/wsClient.js.map +1 -0
  399. package/dist/web/wsClient.test.d.ts +2 -0
  400. package/dist/web/wsClient.test.d.ts.map +1 -0
  401. package/dist/web/wsClient.test.js +20 -0
  402. package/dist/web/wsClient.test.js.map +1 -0
  403. package/examples/authHandler.test.ts +164 -0
  404. package/examples/mqtt.test.ts +89 -0
  405. package/examples/mqtts.test.ts +100 -0
  406. package/examples/webSocket.test.ts +94 -0
  407. package/mqttConn/mqttConn.test.ts +9 -9
  408. package/mqttConn/mqttConn.ts +91 -49
  409. package/mqttPacket/BitMask.ts +11 -19
  410. package/mqttPacket/Properties.ts +6 -3
  411. package/mqttPacket/ReasonCode.ts +2 -1
  412. package/mqttPacket/auth.test.ts +1 -1
  413. package/mqttPacket/auth.ts +41 -48
  414. package/mqttPacket/codec.ts +146 -0
  415. package/mqttPacket/connack.ts +57 -68
  416. package/mqttPacket/connect.test.ts +2 -2
  417. package/mqttPacket/connect.ts +197 -204
  418. package/mqttPacket/decoder.test.ts +0 -39
  419. package/mqttPacket/decoder.ts +9 -36
  420. package/mqttPacket/disconnect.ts +57 -68
  421. package/mqttPacket/encoder.ts +5 -40
  422. package/mqttPacket/length.ts +1 -1
  423. package/mqttPacket/mod.ts +48 -200
  424. package/mqttPacket/pingreq.ts +21 -27
  425. package/mqttPacket/pingres.ts +21 -27
  426. package/mqttPacket/protocolLevels.ts +12 -7
  427. package/mqttPacket/pubblishAcks.ts +68 -77
  428. package/mqttPacket/publish.ts +76 -83
  429. package/mqttPacket/suback.ts +48 -58
  430. package/mqttPacket/subscribe.ts +141 -117
  431. package/mqttPacket/types.ts +1 -9
  432. package/mqttPacket/unsuback.ts +46 -58
  433. package/mqttPacket/unsubscribe.ts +74 -63
  434. package/mqttPacket/validators.ts +5 -31
  435. package/node/socket-node-stream.test.ts +322 -0
  436. package/node/socket-node-stream.ts +174 -0
  437. package/node/tcpClient.test.ts +70 -0
  438. package/node/tcpClient.ts +13 -12
  439. package/node/tcpServer.test.ts +24 -20
  440. package/node/tcpServer.ts +6 -0
  441. package/node/tlsServer.test.ts +94 -0
  442. package/node/tlsServer.ts +81 -0
  443. package/node/wrapNodeSocket.ts +7 -30
  444. package/package.json +73 -45
  445. package/persistence/basicPersistence.ts +495 -0
  446. package/persistence/deps.ts +11 -1
  447. package/persistence/memory/memoryPersistence.ts +12 -152
  448. package/persistence/memory/memoryStorage.ts +232 -0
  449. package/persistence/mod.ts +4 -4
  450. package/persistence/persistence.test.ts +24 -0
  451. package/persistence/persistence.testing.ts +1324 -0
  452. package/persistence/persistence.ts +111 -67
  453. package/persistence/sqlite/sqliteDatabase.ts +294 -0
  454. package/persistence/sqlite/sqlitePersistence.test.ts +48 -0
  455. package/persistence/sqlite/sqlitePersistence.ts +36 -0
  456. package/persistence/sqlite/sqliteStorage.ts +324 -0
  457. package/persistence/storage.ts +84 -0
  458. package/server/config.ts +65 -0
  459. package/server/context.ts +658 -74
  460. package/server/deps.ts +25 -5
  461. package/server/handlers/completeConnect.ts +93 -0
  462. package/server/handlers/duplicate.test.ts +196 -0
  463. package/server/handlers/handleAuth.test.ts +225 -0
  464. package/server/handlers/handleAuth.ts +88 -0
  465. package/server/handlers/handleConnect.test.ts +589 -0
  466. package/server/handlers/handleConnect.ts +201 -86
  467. package/server/handlers/handleConnect.version.test.ts +108 -0
  468. package/server/handlers/handleDisconnect.test.ts +56 -0
  469. package/server/handlers/handleDisconnect.ts +3 -3
  470. package/server/handlers/handlePacket.test.ts +24 -0
  471. package/server/handlers/handlePacket.ts +30 -8
  472. package/server/handlers/handlePingreq.test.ts +29 -0
  473. package/server/handlers/handlePuback.test.ts +28 -0
  474. package/server/handlers/handlePuback.ts +5 -8
  475. package/server/handlers/handlePubcomp.test.ts +28 -0
  476. package/server/handlers/handlePubcomp.ts +5 -4
  477. package/server/handlers/handlePublish.test.ts +471 -0
  478. package/server/handlers/handlePublish.ts +189 -35
  479. package/server/handlers/handlePubrec.test.ts +28 -0
  480. package/server/handlers/handlePubrec.ts +2 -3
  481. package/server/handlers/handlePubrel.test.ts +74 -0
  482. package/server/handlers/handlePubrel.ts +12 -2
  483. package/server/handlers/handleSubscribe.test.ts +971 -0
  484. package/server/handlers/handleSubscribe.ts +158 -39
  485. package/server/handlers/handleUnsubscribe.test.ts +79 -0
  486. package/server/handlers/handleUnsubscribe.ts +29 -5
  487. package/server/handlers/keepalive.test.ts +132 -0
  488. package/server/handlers/session.persistence.test.ts +194 -0
  489. package/server/handlers/will.delivery.test.ts +221 -0
  490. package/server/mod.ts +4 -3
  491. package/server/preconnect.test.ts +151 -0
  492. package/server/server.ts +115 -17
  493. package/socket/socket.test.ts +91 -0
  494. package/socket/socket.ts +81 -31
  495. package/timer/timer.test.ts +4 -7
  496. package/timer/timer.ts +36 -0
  497. package/tools/benchmarks/receiver.ts +51 -0
  498. package/tools/benchmarks/sender.ts +48 -0
  499. package/tools/benchmarks/utils.ts +31 -0
  500. package/tools/mqtt-compat/README.md +130 -0
  501. package/tools/mqtt-compat/broker.ts +52 -0
  502. package/tools/mqtt-compat/paho-mqtt4.test.ts +379 -0
  503. package/tools/mqtt-compat/paho-mqtt5.tests.ts +887 -0
  504. package/trie/trie.test.ts +9 -1
  505. package/trie/trie.ts +57 -22
  506. package/utils/bufferedAsyncIterable.test.ts +92 -0
  507. package/utils/{BufferedAsyncIterable.ts → bufferedAsyncIterable.ts} +1 -1
  508. package/utils/deferred.test.ts +36 -0
  509. package/utils/deferred.ts +0 -1
  510. package/utils/getOrInsertPolyFill.ts +12 -0
  511. package/utils/logger.test.ts +189 -0
  512. package/utils/logger.ts +62 -7
  513. package/utils/mod.ts +15 -1
  514. package/utils/outboundTopicAliasManager.ts +100 -0
  515. package/utils/queue.test.ts +61 -0
  516. package/utils/topicFilter.test.ts +63 -0
  517. package/utils/topicFilter.ts +61 -0
  518. package/utils/utils.ts +3 -0
  519. package/utils/validators.ts +67 -0
  520. package/web/webSocketStream.ts +97 -0
  521. package/web/wrapWebSocket.ts +52 -0
  522. package/web/wsClient.test.ts +26 -0
  523. package/web/wsClient.ts +25 -0
  524. package/benchmarks/receiver.ts +0 -35
  525. package/benchmarks/sender.ts +0 -32
  526. package/benchmarks/utils.ts +0 -9
  527. package/dev_utils/dummyConn.ts +0 -110
  528. package/dist/persistence/store.d.ts +0 -13
  529. package/dist/persistence/store.d.ts.map +0 -1
  530. package/dist/persistence/store.js +0 -2
  531. package/dist/persistence/store.js.map +0 -1
  532. package/dist/utils/BufferedAsyncIterable.d.ts.map +0 -1
  533. package/dist/utils/BufferedAsyncIterable.js.map +0 -1
  534. package/examples/tcpServer.test.ts +0 -148
  535. package/persistence/memory/memoryPersistence.test.ts +0 -156
  536. package/persistence/store.ts +0 -15
  537. package/server/test/handleConnect.test.ts +0 -130
  538. package/server/test/test-handlers.ts +0 -53
@@ -0,0 +1,143 @@
1
+ import { PacketDirection } from "../storage.js";
2
+ import { getOrInsert, joinTopicFilter, topicFilterToRegExp } from "../deps.js";
3
+ export class MemoryStorage {
4
+ seqId = 1;
5
+ sessionTable = new Map();
6
+ subscriptionTable = new Map();
7
+ pendingIncomingTable = new Map();
8
+ pendingOutgoingTable = new Map();
9
+ pendingAckOutgoingTable = new Map();
10
+ retainedTable = new Map();
11
+ initialize() {
12
+ return Promise.resolve();
13
+ }
14
+ // --- Sessions ---
15
+ saveSession(clientId, session) {
16
+ this.sessionTable.set(clientId, session);
17
+ return Promise.resolve();
18
+ }
19
+ getSession(clientId) {
20
+ return Promise.resolve(this.sessionTable.get(clientId) ?? null);
21
+ }
22
+ deleteSession(clientId) {
23
+ this.sessionTable.delete(clientId);
24
+ this.pendingIncomingTable.delete(clientId);
25
+ this.pendingOutgoingTable.delete(clientId);
26
+ this.pendingAckOutgoingTable.delete(clientId);
27
+ this.subscriptionTable.delete(clientId);
28
+ return Promise.resolve();
29
+ }
30
+ async *listAllSessions() {
31
+ for (const [clientId, session] of this.sessionTable.entries()) {
32
+ yield { clientId, session };
33
+ }
34
+ }
35
+ // --- Subscriptions ---
36
+ saveSubscription(clientId, sub) {
37
+ const key = joinTopicFilter(sub.topicFilter, sub.shareName);
38
+ const clientSubs = getOrInsert(this.subscriptionTable, clientId, new Map());
39
+ clientSubs.set(key, sub);
40
+ return Promise.resolve();
41
+ }
42
+ deleteSubscription(clientId, topicFilter, shareName) {
43
+ const key = joinTopicFilter(topicFilter, shareName);
44
+ this.subscriptionTable.get(clientId)?.delete(key);
45
+ return Promise.resolve();
46
+ }
47
+ async *listSubscriptions(clientId) {
48
+ const clientSubs = this.subscriptionTable.get(clientId);
49
+ if (clientSubs) {
50
+ for (const sub of clientSubs.values()) {
51
+ yield sub;
52
+ }
53
+ }
54
+ }
55
+ async *listAllSubscriptions() {
56
+ for (const [clientId, clientSubs] of this.subscriptionTable.entries()) {
57
+ for (const sub of clientSubs.values()) {
58
+ yield { ...sub, clientId };
59
+ }
60
+ }
61
+ }
62
+ // --- Pending Packets (Incoming & Outgoing) ---
63
+ getPacketTable(clientId, direction) {
64
+ const table = direction === PacketDirection.Incoming
65
+ ? this.pendingIncomingTable
66
+ : this.pendingOutgoingTable;
67
+ return getOrInsert(table, clientId, new Map());
68
+ }
69
+ savePendingPacket(clientId, direction, packet) {
70
+ const createdAtMs = Date.now();
71
+ if (packet.id !== undefined) {
72
+ this.getPacketTable(clientId, direction).set(packet.id, {
73
+ seqId: this.seqId++,
74
+ packet,
75
+ createdAtMs,
76
+ });
77
+ }
78
+ return Promise.resolve();
79
+ }
80
+ getPendingPacket(clientId, direction, packetId) {
81
+ const entry = this.getPacketTable(clientId, direction).get(packetId);
82
+ return Promise.resolve(entry?.packet ?? null);
83
+ }
84
+ updatePendingPacket(clientId, direction, packetId, dup) {
85
+ const entry = this.getPacketTable(clientId, direction).get(packetId);
86
+ if (entry !== undefined) {
87
+ entry.packet.dup = dup;
88
+ }
89
+ return Promise.resolve(entry !== undefined);
90
+ }
91
+ deletePendingPacket(clientId, direction, packetId) {
92
+ const deleted = this.getPacketTable(clientId, direction).delete(packetId);
93
+ return Promise.resolve(deleted);
94
+ }
95
+ async *listPendingPackets(clientId, direction) {
96
+ const queue = this.getPacketTable(clientId, direction);
97
+ if (!queue)
98
+ return;
99
+ for (const entry of queue.values()) {
100
+ yield entry.packet;
101
+ }
102
+ }
103
+ // --- ACKs ---
104
+ getAckSet(clientId) {
105
+ return getOrInsert(this.pendingAckOutgoingTable, clientId, new Set());
106
+ }
107
+ savePendingAck(clientId, packetId) {
108
+ this.getAckSet(clientId).add(packetId);
109
+ return Promise.resolve();
110
+ }
111
+ hasPendingAck(clientId, packetId) {
112
+ const hasAck = this.getAckSet(clientId).has(packetId);
113
+ return Promise.resolve(hasAck);
114
+ }
115
+ deletePendingAck(clientId, packetId) {
116
+ const deleted = this.getAckSet(clientId).delete(packetId);
117
+ return Promise.resolve(deleted);
118
+ }
119
+ async *listPendingAcks(clientId) {
120
+ const ackSet = this.getAckSet(clientId);
121
+ for (const packetId of ackSet) {
122
+ yield packetId;
123
+ }
124
+ }
125
+ // --- Retained Messages ---
126
+ saveRetained(topic, packet) {
127
+ this.retainedTable.set(topic, packet);
128
+ return Promise.resolve();
129
+ }
130
+ deleteRetained(topic) {
131
+ this.retainedTable.delete(topic);
132
+ return Promise.resolve();
133
+ }
134
+ async *listRetainedMatches(topicFilter) {
135
+ const regex = topicFilterToRegExp(topicFilter);
136
+ for (const [topic, packet] of this.retainedTable.entries()) {
137
+ if (regex.test(topic)) {
138
+ yield packet;
139
+ }
140
+ }
141
+ }
142
+ }
143
+ //# sourceMappingURL=memoryStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryStorage.js","sourceRoot":"","sources":["../../../persistence/memory/memoryStorage.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAQ/E,MAAM,OAAO,aAAa;IAChB,KAAK,GAAG,CAAC,CAAC;IACV,YAAY,GAAG,IAAI,GAAG,EAAsC,CAAC;IAE7D,iBAAiB,GAAG,IAAI,GAAG,EAGhC,CAAC;IAEI,oBAAoB,GAAG,IAAI,GAAG,EAGnC,CAAC;IAEI,oBAAoB,GAAG,IAAI,GAAG,EAGnC,CAAC;IAEI,uBAAuB,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE7D,aAAa,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE3D,UAAU;QACR,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,mBAAmB;IACnB,WAAW,CACT,QAAkB,EAClB,OAAiC;QAEjC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,UAAU,CAAC,QAAkB;QAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,aAAa,CAAC,QAAkB;QAC9B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,CAAC,eAAe;QAGpB,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,gBAAgB,CAAC,QAAkB,EAAE,GAAuB;QAC1D,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC5E,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,kBAAkB,CAChB,QAAkB,EAClB,WAAwB,EACxB,SAAoB;QAEpB,MAAM,GAAG,GAAG,eAAe,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,CAAC,iBAAiB,CACtB,QAAkB;QAElB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtC,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,oBAAoB;QACzB,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC;YACtE,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtC,MAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,gDAAgD;IACxC,cAAc,CAAC,QAAkB,EAAE,SAA0B;QACnE,MAAM,KAAK,GAAG,SAAS,KAAK,eAAe,CAAC,QAAQ;YAClD,CAAC,CAAC,IAAI,CAAC,oBAAoB;YAC3B,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;QAC9B,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,iBAAiB,CACf,QAAkB,EAClB,SAA0B,EAC1B,MAAwB;QAExB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE;gBACtD,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;gBACnB,MAAM;gBACN,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,gBAAgB,CACd,QAAkB,EAClB,SAA0B,EAC1B,QAAkB;QAElB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,mBAAmB,CACjB,QAAkB,EAClB,SAA0B,EAC1B,QAAkB,EAClB,GAAY;QAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;QACzB,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,mBAAmB,CACjB,QAAkB,EAClB,SAA0B,EAC1B,QAAkB;QAElB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1E,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,CAAC,kBAAkB,CACvB,QAAkB,EAClB,SAA0B;QAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnC,MAAM,KAAK,CAAC,MAAM,CAAC;QACrB,CAAC;IACH,CAAC;IAED,eAAe;IACP,SAAS,CAAC,QAAkB;QAClC,OAAO,WAAW,CAAC,IAAI,CAAC,uBAAuB,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,cAAc,CAAC,QAAkB,EAAE,QAAkB;QACnD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,aAAa,CAAC,QAAkB,EAAE,QAAkB;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,gBAAgB,CAAC,QAAkB,EAAE,QAAkB;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,CAAC,eAAe,CAAC,QAAkB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC9B,MAAM,QAAQ,CAAC;QACjB,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,YAAY,CAAC,KAAY,EAAE,MAAwB;QACjD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,cAAc,CAAC,KAAY;QACzB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,CAAC,mBAAmB,CACxB,WAAwB;QAExB,MAAM,KAAK,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;YAC3D,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,MAAM,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -2,8 +2,8 @@
2
2
  * @module persistence
3
3
  * @description Module for handling MQTT message persistence and client management
4
4
  */
5
- export type { IStore, PacketStore, SubscriptionStore } from "./store.ts";
6
5
  export type { ClientId, PacketId, PublishPacket, QoS, Topic, TopicFilter, } from "./deps.ts";
7
- export type { Client, Handler, IPersistence, RetainStore, } from "./persistence.ts";
8
- export { maxPacketId } from "./persistence.ts";
6
+ export type { ClientRegistrationResult, Handler, IPersistence, } from "./persistence.ts";
7
+ export { MAX_PACKET_ID } from "./persistence.ts";
8
+ export { SqlitePersistence } from "./sqlite/sqlitePersistence.ts";
9
9
  //# sourceMappingURL=mod.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../persistence/mod.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACzE,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,GAAG,EACH,KAAK,EACL,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,MAAM,EACN,OAAO,EACP,YAAY,EACZ,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../persistence/mod.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,GAAG,EACH,KAAK,EACL,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,wBAAwB,EACxB,OAAO,EACP,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -1,2 +1,7 @@
1
- export { maxPacketId } from "./persistence.js";
1
+ /**
2
+ * @module persistence
3
+ * @description Module for handling MQTT message persistence and client management
4
+ */
5
+ export { MAX_PACKET_ID } from "./persistence.js";
6
+ export { SqlitePersistence } from "./sqlite/sqlitePersistence.js";
2
7
  //# sourceMappingURL=mod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../persistence/mod.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../persistence/mod.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -2,85 +2,60 @@
2
2
  * @module persistence
3
3
  * @description Module for handling MQTT message persistence and client management
4
4
  */
5
- import type { ClientId, PublishPacket, QoS, Topic } from "./deps.ts";
6
- import type { IStore } from "./store.ts";
5
+ import type { ClientId, PacketId, PublishPacketV5, QoS, TopicFilter, TRetainHandling } from "./deps.ts";
7
6
  /**
8
- * Maximum packet ID value for MQTT messages (0xffff/65535)
9
- * @constant {number}
10
- */
11
- export declare const maxPacketId = 65535;
12
- /**
13
- * Handler function type for processing publish packets
14
- * @callback Handler
15
- * @param {PublishPacket} packet - The MQTT publish packet to handle
7
+ * extended publish packet also contains meta data
16
8
  */
17
- export type Handler = (packet: PublishPacket) => void;
9
+ export type ExtPublishPacket = PublishPacketV5 & {
10
+ expiresAtMs?: number;
11
+ };
18
12
  /**
19
- * Store type for retained messages mapped by topic
20
- * @typedef {Map<Topic, PublishPacket>} RetainStore
13
+ * The MQTT topic share to subscribe/unsubscribe to
21
14
  */
22
- export type RetainStore = Map<Topic, PublishPacket>;
15
+ export type ShareName = string;
16
+ export type ClientSubscription = {
17
+ topicFilter: TopicFilter;
18
+ shareName: ShareName;
19
+ qos: QoS;
20
+ noLocal?: boolean;
21
+ retainAsPublished?: boolean;
22
+ retainHandling?: TRetainHandling;
23
+ subscriptionIdentifier?: number;
24
+ };
23
25
  /**
24
- * Client type containing message store and packet handler
25
- * @typedef {Object} Client
26
- * @property {IStore} store - The client's message store
27
- * @property {Handler} handler - The client's packet handler function
26
+ * Maximum packet ID value for MQTT messages (0xffff/65535)
28
27
  */
29
- export type Client = {
30
- store: IStore;
31
- handler: Handler;
28
+ export declare const MAX_PACKET_ID = 65535;
29
+ export type Handler = (packet: ExtPublishPacket) => void | Promise<void>;
30
+ export type ClientRegistrationResult = {
31
+ existingSession: boolean;
32
32
  };
33
33
  /**
34
34
  * Interface for persistence implementations to store messages and subscriptions
35
- * @interface IPersistence
36
35
  */
37
36
  export interface IPersistence {
38
- /**
39
- * Map of connected clients by client ID
40
- * @type {Map<ClientId, Client>}
41
- */
42
- clientList: Map<ClientId, Client>;
43
- /**
44
- * Map of retained messages by topic
45
- * @type {RetainStore}
46
- */
47
- retained: RetainStore;
48
- /**
49
- * Register a new client with the persistence layer
50
- * @param {ClientId} clientId - Unique identifier for the client
51
- * @param {Handler} handler - Packet handler function for the client
52
- * @param {boolean} clean - Whether to start with a clean session
53
- * @returns {IStore} The client's message store
54
- */
55
- registerClient(clientId: ClientId, handler: Handler, clean: boolean): IStore;
56
- /**
57
- * Remove a client from the persistence layer
58
- * @param {ClientId} clientId - ID of client to deregister
59
- */
60
- deregisterClient(clientId: ClientId): void;
61
- /**
62
- * Publish a message to all subscribed clients
63
- * @param {Topic} topic - Topic to publish to
64
- * @param {PublishPacket} packet - Packet containing the message
65
- */
66
- publish(topic: Topic, packet: PublishPacket): void;
67
- /**
68
- * Subscribe a client to a topic
69
- * @param {IStore} store - Client's message store
70
- * @param {Topic} topic - Topic to subscribe to
71
- * @param {QoS} qos - Quality of Service level
72
- */
73
- subscribe(store: IStore, topic: Topic, qos: QoS): void;
74
- /**
75
- * Unsubscribe a client from a topic
76
- * @param {IStore} store - Client's message store
77
- * @param {Topic} topic - Topic to unsubscribe from
78
- */
79
- unsubscribe(store: IStore, topic: Topic): void;
80
- /**
81
- * Send retained messages to a client
82
- * @param {ClientId} clientId - ID of client to send retained messages to
83
- */
84
- handleRetained(clientId: ClientId): void;
37
+ initialize(): Promise<void>;
38
+ registerClient(clientId: ClientId, handler: Handler): Promise<ClientRegistrationResult>;
39
+ deregisterClient(clientId: ClientId): Promise<void>;
40
+ disconnectClient(clientId: ClientId): Promise<void>;
41
+ subscribe(clientId: ClientId, subscription: ClientSubscription): Promise<void>;
42
+ unsubscribe(clientId: ClientId, topicFilter: TopicFilter, shareName: ShareName): Promise<void>;
43
+ listSubscriptions(clientId: ClientId): AsyncIterableIterator<ClientSubscription>;
44
+ addPendingIncomingPacket(clientId: ClientId, packet: ExtPublishPacket): Promise<void>;
45
+ getPendingIncomingPacket(clientId: ClientId, packetId: PacketId): Promise<ExtPublishPacket | null>;
46
+ listPendingIncomingPackets(clientId: ClientId): AsyncIterableIterator<ExtPublishPacket>;
47
+ deletePendingIncomingPacket(clientId: ClientId, packetId: PacketId): Promise<boolean>;
48
+ addPendingOutgoingPacket(clientId: ClientId, packet: ExtPublishPacket): Promise<void>;
49
+ getPendingOutgoingPacket(clientId: ClientId, packetId: PacketId): Promise<ExtPublishPacket | null>;
50
+ updatePendingOutgoingPacket(clientId: ClientId, packetId: PacketId, dup: boolean): Promise<boolean>;
51
+ listPendingOutgoingPackets(clientId: ClientId): AsyncIterableIterator<ExtPublishPacket>;
52
+ deletePendingOutgoingPacket(clientId: ClientId, packetId: PacketId): Promise<boolean>;
53
+ addPendingAck(clientId: ClientId, packetId: PacketId): Promise<void>;
54
+ hasPendingAck(clientId: ClientId, packetId: PacketId): Promise<boolean>;
55
+ deletePendingAck(clientId: ClientId, packetId: PacketId): Promise<boolean>;
56
+ listPendingAcks(clientId: ClientId): AsyncIterableIterator<PacketId>;
57
+ publish(clientId: ClientId, packet: ExtPublishPacket): Promise<void>;
58
+ handleRetained(clientId: ClientId, subscriptions: ClientSubscription[]): Promise<void>;
59
+ nextPacketId(clientId: ClientId): Promise<PacketId>;
85
60
  }
86
61
  //# sourceMappingURL=persistence.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../persistence/persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC;;;GAGG;AACH,eAAO,MAAM,WAAW,QAAS,CAAC;AAClC;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAElC;;;OAGG;IACH,QAAQ,EAAE,WAAW,CAAC;IAEtB;;;;;;OAMG;IACH,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IAE7E;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAE3C;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAEnD;;;;;OAKG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAEvD;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAE/C;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC1C"}
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../persistence/persistence.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  /**
2
2
  * Maximum packet ID value for MQTT messages (0xffff/65535)
3
- * @constant {number}
4
3
  */
5
- export const maxPacketId = 0xffff;
4
+ export const MAX_PACKET_ID = 0xffff;
6
5
  //# sourceMappingURL=persistence.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../persistence/persistence.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../persistence/persistence.ts"],"names":[],"mappings":"AAmCA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC"}
@@ -0,0 +1,46 @@
1
+ import sqlite from "node:sqlite";
2
+ import type { ClientId } from "../../mqttPacket/types.ts";
3
+ /**
4
+ * Instantiates the physical relational structures and schemas required by the persistence engine.
5
+ * @param filename Filepath location or memory target specifier.
6
+ */
7
+ export declare function initializeDatabase(filename: string): sqlite.DatabaseSync;
8
+ export type AllStatements = {
9
+ saveSession: sqlite.StatementSync;
10
+ getSession: sqlite.StatementSync;
11
+ listAllSessions: sqlite.StatementSync;
12
+ saveSubscription: sqlite.StatementSync;
13
+ deleteSubscription: sqlite.StatementSync;
14
+ listSubscriptions: sqlite.StatementSync;
15
+ listAllSubscriptions: sqlite.StatementSync;
16
+ saveIncoming: sqlite.StatementSync;
17
+ getIncoming: sqlite.StatementSync;
18
+ updateIncomingDup: sqlite.StatementSync;
19
+ deleteIncoming: sqlite.StatementSync;
20
+ listIncoming: sqlite.StatementSync;
21
+ saveOutgoing: sqlite.StatementSync;
22
+ getOutgoing: sqlite.StatementSync;
23
+ updateOutgoingDup: sqlite.StatementSync;
24
+ deleteOutgoing: sqlite.StatementSync;
25
+ listOutgoing: sqlite.StatementSync;
26
+ saveAck: sqlite.StatementSync;
27
+ hasAck: sqlite.StatementSync;
28
+ deleteAck: sqlite.StatementSync;
29
+ listAcks: sqlite.StatementSync;
30
+ saveRetained: sqlite.StatementSync;
31
+ deleteRetained: sqlite.StatementSync;
32
+ getRetainedExact: sqlite.StatementSync;
33
+ listRetainedLike: sqlite.StatementSync;
34
+ };
35
+ /**
36
+ * Instantiates the physical relational structures and schemas required by the persistence engine.
37
+ * @param db the database for which to prepare the statements
38
+ */
39
+ export declare function prepareAllStatements(db: sqlite.DatabaseSync): AllStatements;
40
+ /**
41
+ * Truncates and drops relational state assignments under targeted clients inside atomic scopes.
42
+ * @param db Connection reference context.
43
+ * @param clientId Specific target client ID tracking token.
44
+ */
45
+ export declare function deleteClientState(db: sqlite.DatabaseSync, clientId: ClientId): void;
46
+ //# sourceMappingURL=sqliteDatabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqliteDatabase.d.ts","sourceRoot":"","sources":["../../../persistence/sqlite/sqliteDatabase.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,YAAY,CAoDxE;AAED,MAAM,MAAM,aAAa,GAAG;IAE1B,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC;IAGtC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC;IACvC,kBAAkB,EAAE,MAAM,CAAC,aAAa,CAAC;IACzC,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC;IACxC,oBAAoB,EAAE,MAAM,CAAC,aAAa,CAAC;IAG3C,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC;IAClC,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC;IACxC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC;IAGnC,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC;IAClC,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC;IACxC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC;IAGnC,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC;IAG/B,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC;IACrC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC;IACvC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,CAAC,YAAY,GAAG,aAAa,CAiK3E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,CAAC,YAAY,EACvB,QAAQ,EAAE,QAAQ,GACjB,IAAI,CAkBN"}
@@ -0,0 +1,215 @@
1
+ import sqlite from "node:sqlite";
2
+ /**
3
+ * Instantiates the physical relational structures and schemas required by the persistence engine.
4
+ * @param filename Filepath location or memory target specifier.
5
+ */
6
+ export function initializeDatabase(filename) {
7
+ const db = new sqlite.DatabaseSync(filename);
8
+ db.exec(`
9
+ PRAGMA journal_mode = WAL;
10
+ PRAGMA synchronous = NORMAL;
11
+
12
+ CREATE TABLE IF NOT EXISTS client_sessions (
13
+ client_id TEXT PRIMARY KEY,
14
+ session_data TEXT NOT NULL
15
+ );
16
+
17
+ CREATE TABLE IF NOT EXISTS subscriptions (
18
+ client_id TEXT NOT NULL,
19
+ topic TEXT NOT NULL,
20
+ share_name TEXT NOT NULL,
21
+ subscription_data TEXT NOT NULL,
22
+ PRIMARY KEY (client_id, topic, share_name)
23
+ );
24
+
25
+ CREATE TABLE IF NOT EXISTS pending_incoming (
26
+ seq_id INTEGER PRIMARY KEY AUTOINCREMENT, -- Guarantees absolute insertion order
27
+ client_id TEXT NOT NULL,
28
+ packet_id INTEGER NOT NULL,
29
+ packet TEXT NOT NULL,
30
+ payload BLOB,
31
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
32
+ UNIQUE (client_id, packet_id)
33
+ );
34
+
35
+ CREATE TABLE IF NOT EXISTS pending_outgoing (
36
+ seq_id INTEGER PRIMARY KEY AUTOINCREMENT, -- Guarantees absolute insertion order
37
+ client_id TEXT NOT NULL,
38
+ packet_id INTEGER NOT NULL,
39
+ packet TEXT NOT NULL,
40
+ payload BLOB,
41
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
42
+ UNIQUE (client_id, packet_id)
43
+ );
44
+
45
+ CREATE TABLE IF NOT EXISTS pending_ack_outgoing (
46
+ client_id TEXT NOT NULL,
47
+ packet_id INTEGER NOT NULL,
48
+ PRIMARY KEY (client_id, packet_id)
49
+ );
50
+
51
+ CREATE TABLE IF NOT EXISTS retained (
52
+ topic TEXT PRIMARY KEY,
53
+ packet TEXT NOT NULL,
54
+ payload BLOB
55
+ );
56
+ `);
57
+ return db;
58
+ }
59
+ /**
60
+ * Instantiates the physical relational structures and schemas required by the persistence engine.
61
+ * @param db the database for which to prepare the statements
62
+ */
63
+ export function prepareAllStatements(db) {
64
+ return {
65
+ // Sessions
66
+ saveSession: db.prepare(`
67
+ INSERT INTO client_sessions (client_id, session_data)
68
+ VALUES (?, ?)
69
+ ON CONFLICT(client_id) DO UPDATE SET
70
+ session_data = excluded.session_data
71
+ `),
72
+ getSession: db.prepare(`
73
+ SELECT session_data
74
+ FROM client_sessions
75
+ WHERE client_id = ?
76
+ `),
77
+ listAllSessions: db.prepare(`
78
+ SELECT client_id, session_data
79
+ FROM client_sessions
80
+ `),
81
+ // Subscriptions
82
+ saveSubscription: db.prepare(`
83
+ INSERT INTO subscriptions (client_id, topic, share_name, subscription_data)
84
+ VALUES (?, ?, ?, ?)
85
+ ON CONFLICT(client_id, topic, share_name) DO UPDATE SET
86
+ subscription_data = excluded.subscription_data
87
+ `),
88
+ deleteSubscription: db.prepare(`
89
+ DELETE FROM subscriptions
90
+ WHERE client_id = ? AND topic = ? AND share_name = ?
91
+ `),
92
+ listSubscriptions: db.prepare(`
93
+ SELECT topic, share_name, subscription_data
94
+ FROM subscriptions
95
+ WHERE client_id = ?
96
+ `),
97
+ listAllSubscriptions: db.prepare(`
98
+ SELECT client_id, topic, share_name, subscription_data
99
+ FROM subscriptions
100
+ `),
101
+ // Pending Incoming Packets
102
+ saveIncoming: db.prepare(`
103
+ INSERT INTO pending_incoming (client_id, packet_id, packet, payload)
104
+ VALUES (?, ?, ?, ?)
105
+ ON CONFLICT(client_id, packet_id) DO UPDATE SET
106
+ packet = excluded.packet,
107
+ payload = excluded.payload
108
+ `),
109
+ getIncoming: db.prepare(`
110
+ SELECT packet, payload
111
+ FROM pending_incoming
112
+ WHERE client_id = ? AND packet_id = ?
113
+ `),
114
+ updateIncomingDup: db.prepare(`
115
+ UPDATE pending_incoming
116
+ SET packet = json_set(packet, '$.dup', json(?))
117
+ WHERE client_id = ? AND packet_id = ?
118
+ `),
119
+ deleteIncoming: db.prepare(`
120
+ DELETE FROM pending_incoming
121
+ WHERE client_id = ? AND packet_id = ?
122
+ `),
123
+ listIncoming: db.prepare(`
124
+ SELECT packet, payload
125
+ FROM pending_incoming
126
+ WHERE client_id = ?
127
+ ORDER BY seq_id ASC
128
+ `),
129
+ // Pending Outgoing Packets
130
+ saveOutgoing: db.prepare(`
131
+ INSERT INTO pending_outgoing (client_id, packet_id, packet, payload)
132
+ VALUES (?, ?, ?, ?)
133
+ ON CONFLICT(client_id, packet_id) DO UPDATE SET
134
+ packet = excluded.packet,
135
+ payload = excluded.payload
136
+ `),
137
+ getOutgoing: db.prepare(`
138
+ SELECT packet, payload
139
+ FROM pending_outgoing
140
+ WHERE client_id = ? AND packet_id = ?
141
+ `),
142
+ updateOutgoingDup: db.prepare(`
143
+ UPDATE pending_outgoing
144
+ SET packet = json_set(packet, '$.dup', json(?))
145
+ WHERE client_id = ? AND packet_id = ?
146
+ `),
147
+ deleteOutgoing: db.prepare(`
148
+ DELETE FROM pending_outgoing
149
+ WHERE client_id = ? AND packet_id = ?
150
+ `),
151
+ listOutgoing: db.prepare(`
152
+ SELECT packet, payload
153
+ FROM pending_outgoing
154
+ WHERE client_id = ?
155
+ ORDER BY seq_id ASC
156
+ `),
157
+ // ACKs
158
+ saveAck: db.prepare(`
159
+ INSERT INTO pending_ack_outgoing (client_id, packet_id)
160
+ VALUES (?, ?)
161
+ ON CONFLICT(client_id, packet_id) DO NOTHING
162
+ `),
163
+ hasAck: db.prepare(`
164
+ SELECT 1
165
+ FROM pending_ack_outgoing
166
+ WHERE client_id = ? AND packet_id = ?
167
+ `),
168
+ deleteAck: db.prepare(`
169
+ DELETE FROM pending_ack_outgoing
170
+ WHERE client_id = ? AND packet_id = ?
171
+ `),
172
+ listAcks: db.prepare(`
173
+ SELECT packet_id
174
+ FROM pending_ack_outgoing
175
+ WHERE client_id = ?
176
+ `),
177
+ // Retained Messages
178
+ saveRetained: db.prepare(`
179
+ INSERT INTO retained (topic, packet, payload)
180
+ VALUES (?, ?, ?)
181
+ ON CONFLICT(topic) DO UPDATE SET
182
+ packet = excluded.packet,
183
+ payload = excluded.payload
184
+ `),
185
+ deleteRetained: db.prepare(`
186
+ DELETE FROM retained
187
+ WHERE topic = ?
188
+ `),
189
+ getRetainedExact: db.prepare(`
190
+ SELECT packet, payload
191
+ FROM retained
192
+ WHERE topic = ?
193
+ `),
194
+ listRetainedLike: db.prepare(`
195
+ SELECT topic, packet, payload
196
+ FROM retained
197
+ WHERE topic LIKE ?
198
+ `),
199
+ };
200
+ }
201
+ /**
202
+ * Truncates and drops relational state assignments under targeted clients inside atomic scopes.
203
+ * @param db Connection reference context.
204
+ * @param clientId Specific target client ID tracking token.
205
+ */
206
+ export function deleteClientState(db, clientId) {
207
+ db.exec("begin;");
208
+ db.prepare("delete from subscriptions where client_id = ?").run(clientId);
209
+ db.prepare("delete from pending_incoming where client_id = ?").run(clientId);
210
+ db.prepare("delete from pending_outgoing where client_id = ?").run(clientId);
211
+ db.prepare("delete from pending_ack_outgoing where client_id = ?").run(clientId);
212
+ db.prepare("delete from client_sessions where client_id = ?").run(clientId);
213
+ db.exec("commit;");
214
+ }
215
+ //# sourceMappingURL=sqliteDatabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqliteDatabase.js","sourceRoot":"","sources":["../../../persistence/sqlite/sqliteDatabase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { MqttPersistence } from "../basicPersistence.ts";
2
+ import type sqlite from "node:sqlite";
3
+ export declare class SqlitePersistence extends MqttPersistence {
4
+ private storageInstance;
5
+ constructor(db?: string | sqlite.DatabaseSync);
6
+ /**
7
+ * Convenient lifecycle method combining instance creation and initialization.
8
+ */
9
+ static start(db?: string | sqlite.DatabaseSync): Promise<SqlitePersistence>;
10
+ /**
11
+ * Overrides close to make sure the underlying database file
12
+ * handle is cleaned up correctly when the persistence is halted.
13
+ */
14
+ close(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=sqlitePersistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlitePersistence.d.ts","sourceRoot":"","sources":["../../../persistence/sqlite/sqlitePersistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAItC,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,OAAO,CAAC,eAAe,CAAgB;IAEvC,YAAY,EAAE,GAAE,MAAM,GAAG,MAAM,CAAC,YAAkC,EAIjE;IAED;;OAEG;IACH,OAAa,KAAK,CAChB,EAAE,GAAE,MAAM,GAAG,MAAM,CAAC,YAAkC,GACrD,OAAO,CAAC,iBAAiB,CAAC,CAI5B;IAED;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3B;CACF"}