@enbox/dwn-server 0.0.3 → 0.0.5

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 (295) hide show
  1. package/LICENSE +3 -2
  2. package/README.md +112 -212
  3. package/dist/esm/src/admin/activity-log.d.ts +44 -0
  4. package/dist/esm/src/admin/activity-log.d.ts.map +1 -0
  5. package/dist/esm/src/admin/activity-log.js +85 -0
  6. package/dist/esm/src/admin/activity-log.js.map +1 -0
  7. package/dist/esm/src/admin/admin-api.d.ts +61 -0
  8. package/dist/esm/src/admin/admin-api.d.ts.map +1 -0
  9. package/dist/esm/src/admin/admin-api.js +1047 -0
  10. package/dist/esm/src/admin/admin-api.js.map +1 -0
  11. package/dist/esm/src/admin/admin-auth.d.ts +9 -0
  12. package/dist/esm/src/admin/admin-auth.d.ts.map +1 -0
  13. package/dist/esm/src/admin/admin-auth.js +45 -0
  14. package/dist/esm/src/admin/admin-auth.js.map +1 -0
  15. package/dist/esm/src/admin/admin-store.d.ts +111 -0
  16. package/dist/esm/src/admin/admin-store.d.ts.map +1 -0
  17. package/dist/esm/src/admin/admin-store.js +376 -0
  18. package/dist/esm/src/admin/admin-store.js.map +1 -0
  19. package/dist/esm/src/admin/audit-log.d.ts +94 -0
  20. package/dist/esm/src/admin/audit-log.d.ts.map +1 -0
  21. package/dist/esm/src/admin/audit-log.js +220 -0
  22. package/dist/esm/src/admin/audit-log.js.map +1 -0
  23. package/dist/esm/src/admin/index.d.ts +10 -0
  24. package/dist/esm/src/admin/index.d.ts.map +1 -0
  25. package/dist/esm/src/admin/index.js +7 -0
  26. package/dist/esm/src/admin/index.js.map +1 -0
  27. package/dist/esm/src/admin/types.d.ts +306 -0
  28. package/dist/esm/src/admin/types.d.ts.map +1 -0
  29. package/dist/esm/src/admin/types.js +2 -0
  30. package/dist/esm/src/admin/types.js.map +1 -0
  31. package/dist/esm/src/admin/webhook-manager.d.ts +55 -0
  32. package/dist/esm/src/admin/webhook-manager.d.ts.map +1 -0
  33. package/dist/esm/src/admin/webhook-manager.js +184 -0
  34. package/dist/esm/src/admin/webhook-manager.js.map +1 -0
  35. package/dist/esm/src/config.d.ts +122 -3
  36. package/dist/esm/src/config.d.ts.map +1 -1
  37. package/dist/esm/src/config.js +151 -5
  38. package/dist/esm/src/config.js.map +1 -1
  39. package/dist/esm/src/connection/connection-manager.d.ts +24 -1
  40. package/dist/esm/src/connection/connection-manager.d.ts.map +1 -1
  41. package/dist/esm/src/connection/connection-manager.js +33 -2
  42. package/dist/esm/src/connection/connection-manager.js.map +1 -1
  43. package/dist/esm/src/connection/flow-controller.d.ts +53 -0
  44. package/dist/esm/src/connection/flow-controller.d.ts.map +1 -0
  45. package/dist/esm/src/connection/flow-controller.js +101 -0
  46. package/dist/esm/src/connection/flow-controller.js.map +1 -0
  47. package/dist/esm/src/connection/socket-connection.d.ts +39 -4
  48. package/dist/esm/src/connection/socket-connection.d.ts.map +1 -1
  49. package/dist/esm/src/connection/socket-connection.js +80 -9
  50. package/dist/esm/src/connection/socket-connection.js.map +1 -1
  51. package/dist/esm/src/delivery-service.d.ts +43 -0
  52. package/dist/esm/src/delivery-service.d.ts.map +1 -0
  53. package/dist/esm/src/delivery-service.js +574 -0
  54. package/dist/esm/src/delivery-service.js.map +1 -0
  55. package/dist/esm/src/dwn-error.d.ts +10 -1
  56. package/dist/esm/src/dwn-error.d.ts.map +1 -1
  57. package/dist/esm/src/dwn-error.js +9 -0
  58. package/dist/esm/src/dwn-error.js.map +1 -1
  59. package/dist/esm/src/dwn-server.d.ts +8 -0
  60. package/dist/esm/src/dwn-server.d.ts.map +1 -1
  61. package/dist/esm/src/dwn-server.js +198 -12
  62. package/dist/esm/src/dwn-server.js.map +1 -1
  63. package/dist/esm/src/http-api.d.ts +19 -2
  64. package/dist/esm/src/http-api.d.ts.map +1 -1
  65. package/dist/esm/src/http-api.js +219 -19
  66. package/dist/esm/src/http-api.js.map +1 -1
  67. package/dist/esm/src/index.d.ts +6 -2
  68. package/dist/esm/src/index.d.ts.map +1 -1
  69. package/dist/esm/src/index.js +4 -1
  70. package/dist/esm/src/index.js.map +1 -1
  71. package/dist/esm/src/json-rpc-api.js +2 -1
  72. package/dist/esm/src/json-rpc-api.js.map +1 -1
  73. package/dist/esm/src/json-rpc-handlers/dwn/process-message.d.ts.map +1 -1
  74. package/dist/esm/src/json-rpc-handlers/dwn/process-message.js +106 -4
  75. package/dist/esm/src/json-rpc-handlers/dwn/process-message.js.map +1 -1
  76. package/dist/esm/src/json-rpc-handlers/subscription/ack.d.ts +20 -0
  77. package/dist/esm/src/json-rpc-handlers/subscription/ack.d.ts.map +1 -0
  78. package/dist/esm/src/json-rpc-handlers/subscription/ack.js +41 -0
  79. package/dist/esm/src/json-rpc-handlers/subscription/ack.js.map +1 -0
  80. package/dist/esm/src/json-rpc-handlers/subscription/close.d.ts.map +1 -1
  81. package/dist/esm/src/json-rpc-handlers/subscription/close.js +1 -1
  82. package/dist/esm/src/json-rpc-handlers/subscription/close.js.map +1 -1
  83. package/dist/esm/src/json-rpc-handlers/subscription/index.d.ts +1 -0
  84. package/dist/esm/src/json-rpc-handlers/subscription/index.d.ts.map +1 -1
  85. package/dist/esm/src/json-rpc-handlers/subscription/index.js +1 -0
  86. package/dist/esm/src/json-rpc-handlers/subscription/index.js.map +1 -1
  87. package/dist/esm/src/lib/json-rpc-router.d.ts +22 -4
  88. package/dist/esm/src/lib/json-rpc-router.d.ts.map +1 -1
  89. package/dist/esm/src/lib/json-rpc-router.js.map +1 -1
  90. package/dist/esm/src/lib/sql-utils.d.ts +6 -0
  91. package/dist/esm/src/lib/sql-utils.d.ts.map +1 -0
  92. package/dist/esm/src/lib/sql-utils.js +8 -0
  93. package/dist/esm/src/lib/sql-utils.js.map +1 -0
  94. package/dist/esm/src/main.js +0 -6
  95. package/dist/esm/src/main.js.map +1 -1
  96. package/dist/esm/src/message-processed-hook.d.ts +35 -0
  97. package/dist/esm/src/message-processed-hook.d.ts.map +1 -0
  98. package/dist/esm/src/message-processed-hook.js +2 -0
  99. package/dist/esm/src/message-processed-hook.js.map +1 -0
  100. package/dist/esm/src/metrics.d.ts +13 -1
  101. package/dist/esm/src/metrics.d.ts.map +1 -1
  102. package/dist/esm/src/metrics.js +41 -1
  103. package/dist/esm/src/metrics.js.map +1 -1
  104. package/dist/esm/src/plugins/event-log-nats.d.ts +25 -0
  105. package/dist/esm/src/plugins/event-log-nats.d.ts.map +1 -0
  106. package/dist/esm/src/plugins/event-log-nats.js +379 -0
  107. package/dist/esm/src/plugins/event-log-nats.js.map +1 -0
  108. package/dist/esm/src/rate-limiter.d.ts +60 -0
  109. package/dist/esm/src/rate-limiter.d.ts.map +1 -0
  110. package/dist/esm/src/rate-limiter.js +116 -0
  111. package/dist/esm/src/rate-limiter.js.map +1 -0
  112. package/dist/esm/src/registration/jwt-provider-auth-plugin.d.ts +53 -0
  113. package/dist/esm/src/registration/jwt-provider-auth-plugin.d.ts.map +1 -0
  114. package/dist/esm/src/registration/jwt-provider-auth-plugin.js +90 -0
  115. package/dist/esm/src/registration/jwt-provider-auth-plugin.js.map +1 -0
  116. package/dist/esm/src/registration/open-auth-handler.d.ts +37 -0
  117. package/dist/esm/src/registration/open-auth-handler.d.ts.map +1 -0
  118. package/dist/esm/src/registration/open-auth-handler.js +214 -0
  119. package/dist/esm/src/registration/open-auth-handler.js.map +1 -0
  120. package/dist/esm/src/registration/proof-of-work-manager.d.ts +1 -1
  121. package/dist/esm/src/registration/proof-of-work-manager.d.ts.map +1 -1
  122. package/dist/esm/src/registration/provider-auth-plugin.d.ts +46 -0
  123. package/dist/esm/src/registration/provider-auth-plugin.d.ts.map +1 -0
  124. package/dist/esm/src/registration/provider-auth-plugin.js +29 -0
  125. package/dist/esm/src/registration/provider-auth-plugin.js.map +1 -0
  126. package/dist/esm/src/registration/registration-manager.d.ts +27 -4
  127. package/dist/esm/src/registration/registration-manager.d.ts.map +1 -1
  128. package/dist/esm/src/registration/registration-manager.js +77 -6
  129. package/dist/esm/src/registration/registration-manager.js.map +1 -1
  130. package/dist/esm/src/registration/registration-store.d.ts +83 -3
  131. package/dist/esm/src/registration/registration-store.d.ts.map +1 -1
  132. package/dist/esm/src/registration/registration-store.js +248 -11
  133. package/dist/esm/src/registration/registration-store.js.map +1 -1
  134. package/dist/esm/src/storage.d.ts +4 -4
  135. package/dist/esm/src/storage.d.ts.map +1 -1
  136. package/dist/esm/src/storage.js +100 -20
  137. package/dist/esm/src/storage.js.map +1 -1
  138. package/dist/esm/src/web5-connect/sql-ttl-cache.d.ts.map +1 -1
  139. package/dist/esm/src/web5-connect/sql-ttl-cache.js +8 -1
  140. package/dist/esm/src/web5-connect/sql-ttl-cache.js.map +1 -1
  141. package/dist/esm/src/ws-api.d.ts +17 -1
  142. package/dist/esm/src/ws-api.d.ts.map +1 -1
  143. package/dist/esm/src/ws-api.js +9 -2
  144. package/dist/esm/src/ws-api.js.map +1 -1
  145. package/package.json +18 -16
  146. package/src/admin/activity-log.ts +100 -0
  147. package/src/admin/admin-api.ts +1308 -0
  148. package/src/admin/admin-auth.ts +56 -0
  149. package/src/admin/admin-store.ts +515 -0
  150. package/src/admin/audit-log.ts +327 -0
  151. package/src/admin/index.ts +34 -0
  152. package/src/admin/types.ts +352 -0
  153. package/src/admin/webhook-manager.ts +245 -0
  154. package/src/config.ts +177 -5
  155. package/src/connection/connection-manager.ts +50 -6
  156. package/src/connection/flow-controller.ts +117 -0
  157. package/src/connection/socket-connection.ts +103 -21
  158. package/src/delivery-service.ts +740 -0
  159. package/src/dwn-error.ts +9 -0
  160. package/src/dwn-server.ts +242 -14
  161. package/src/http-api.ts +271 -30
  162. package/src/index.ts +13 -2
  163. package/src/json-rpc-api.ts +2 -1
  164. package/src/json-rpc-handlers/dwn/process-message.ts +140 -5
  165. package/src/json-rpc-handlers/subscription/ack.ts +63 -0
  166. package/src/json-rpc-handlers/subscription/close.ts +2 -6
  167. package/src/json-rpc-handlers/subscription/index.ts +1 -0
  168. package/src/lib/json-rpc-router.ts +22 -6
  169. package/src/lib/sql-utils.ts +7 -0
  170. package/src/main.ts +0 -8
  171. package/src/message-processed-hook.ts +33 -0
  172. package/src/metrics.ts +50 -1
  173. package/src/plugins/event-log-nats.ts +466 -0
  174. package/src/rate-limiter.ts +143 -0
  175. package/src/registration/jwt-provider-auth-plugin.ts +119 -0
  176. package/src/registration/open-auth-handler.ts +263 -0
  177. package/src/registration/proof-of-work-manager.ts +1 -1
  178. package/src/registration/provider-auth-plugin.ts +84 -0
  179. package/src/registration/registration-manager.ts +108 -12
  180. package/src/registration/registration-store.ts +326 -17
  181. package/src/storage.ts +121 -27
  182. package/src/web5-connect/sql-ttl-cache.ts +7 -1
  183. package/src/ws-api.ts +30 -2
  184. package/dist/esm/src/json-rpc-socket.d.ts +0 -39
  185. package/dist/esm/src/json-rpc-socket.d.ts.map +0 -1
  186. package/dist/esm/src/json-rpc-socket.js +0 -125
  187. package/dist/esm/src/json-rpc-socket.js.map +0 -1
  188. package/dist/esm/src/lib/json-rpc.d.ts +0 -54
  189. package/dist/esm/src/lib/json-rpc.d.ts.map +0 -1
  190. package/dist/esm/src/lib/json-rpc.js +0 -60
  191. package/dist/esm/src/lib/json-rpc.js.map +0 -1
  192. package/dist/esm/src/registration/proof-of-work-types.d.ts +0 -8
  193. package/dist/esm/src/registration/proof-of-work-types.d.ts.map +0 -1
  194. package/dist/esm/src/registration/proof-of-work-types.js +0 -2
  195. package/dist/esm/src/registration/proof-of-work-types.js.map +0 -1
  196. package/dist/esm/src/registration/registration-types.d.ts +0 -18
  197. package/dist/esm/src/registration/registration-types.d.ts.map +0 -1
  198. package/dist/esm/src/registration/registration-types.js +0 -2
  199. package/dist/esm/src/registration/registration-types.js.map +0 -1
  200. package/dist/esm/tests/common-scenario-validator.d.ts +0 -11
  201. package/dist/esm/tests/common-scenario-validator.d.ts.map +0 -1
  202. package/dist/esm/tests/common-scenario-validator.js +0 -113
  203. package/dist/esm/tests/common-scenario-validator.js.map +0 -1
  204. package/dist/esm/tests/connection/connection-manager.spec.d.ts +0 -2
  205. package/dist/esm/tests/connection/connection-manager.spec.d.ts.map +0 -1
  206. package/dist/esm/tests/connection/connection-manager.spec.js +0 -49
  207. package/dist/esm/tests/connection/connection-manager.spec.js.map +0 -1
  208. package/dist/esm/tests/connection/socket-connection.spec.d.ts +0 -2
  209. package/dist/esm/tests/connection/socket-connection.spec.d.ts.map +0 -1
  210. package/dist/esm/tests/connection/socket-connection.spec.js +0 -147
  211. package/dist/esm/tests/connection/socket-connection.spec.js.map +0 -1
  212. package/dist/esm/tests/cors/http-api.browser.d.ts +0 -2
  213. package/dist/esm/tests/cors/http-api.browser.d.ts.map +0 -1
  214. package/dist/esm/tests/cors/http-api.browser.js +0 -60
  215. package/dist/esm/tests/cors/http-api.browser.js.map +0 -1
  216. package/dist/esm/tests/cors/ping.browser.d.ts +0 -2
  217. package/dist/esm/tests/cors/ping.browser.d.ts.map +0 -1
  218. package/dist/esm/tests/cors/ping.browser.js +0 -7
  219. package/dist/esm/tests/cors/ping.browser.js.map +0 -1
  220. package/dist/esm/tests/dwn-process-message.spec.d.ts +0 -2
  221. package/dist/esm/tests/dwn-process-message.spec.d.ts.map +0 -1
  222. package/dist/esm/tests/dwn-process-message.spec.js +0 -172
  223. package/dist/esm/tests/dwn-process-message.spec.js.map +0 -1
  224. package/dist/esm/tests/dwn-server.spec.d.ts +0 -2
  225. package/dist/esm/tests/dwn-server.spec.d.ts.map +0 -1
  226. package/dist/esm/tests/dwn-server.spec.js +0 -48
  227. package/dist/esm/tests/dwn-server.spec.js.map +0 -1
  228. package/dist/esm/tests/http-api.spec.d.ts +0 -2
  229. package/dist/esm/tests/http-api.spec.d.ts.map +0 -1
  230. package/dist/esm/tests/http-api.spec.js +0 -782
  231. package/dist/esm/tests/http-api.spec.js.map +0 -1
  232. package/dist/esm/tests/json-rpc-socket.spec.d.ts +0 -2
  233. package/dist/esm/tests/json-rpc-socket.spec.d.ts.map +0 -1
  234. package/dist/esm/tests/json-rpc-socket.spec.js +0 -227
  235. package/dist/esm/tests/json-rpc-socket.spec.js.map +0 -1
  236. package/dist/esm/tests/plugins/data-store-sqlite.d.ts +0 -17
  237. package/dist/esm/tests/plugins/data-store-sqlite.d.ts.map +0 -1
  238. package/dist/esm/tests/plugins/data-store-sqlite.js +0 -23
  239. package/dist/esm/tests/plugins/data-store-sqlite.js.map +0 -1
  240. package/dist/esm/tests/plugins/event-log-sqlite.d.ts +0 -17
  241. package/dist/esm/tests/plugins/event-log-sqlite.d.ts.map +0 -1
  242. package/dist/esm/tests/plugins/event-log-sqlite.js +0 -23
  243. package/dist/esm/tests/plugins/event-log-sqlite.js.map +0 -1
  244. package/dist/esm/tests/plugins/event-stream-in-memory.d.ts +0 -17
  245. package/dist/esm/tests/plugins/event-stream-in-memory.d.ts.map +0 -1
  246. package/dist/esm/tests/plugins/event-stream-in-memory.js +0 -21
  247. package/dist/esm/tests/plugins/event-stream-in-memory.js.map +0 -1
  248. package/dist/esm/tests/plugins/message-store-sqlite.d.ts +0 -17
  249. package/dist/esm/tests/plugins/message-store-sqlite.d.ts.map +0 -1
  250. package/dist/esm/tests/plugins/message-store-sqlite.js +0 -23
  251. package/dist/esm/tests/plugins/message-store-sqlite.js.map +0 -1
  252. package/dist/esm/tests/plugins/resumable-task-store-sqlite.d.ts +0 -17
  253. package/dist/esm/tests/plugins/resumable-task-store-sqlite.d.ts.map +0 -1
  254. package/dist/esm/tests/plugins/resumable-task-store-sqlite.js +0 -23
  255. package/dist/esm/tests/plugins/resumable-task-store-sqlite.js.map +0 -1
  256. package/dist/esm/tests/process-handler.spec.d.ts +0 -2
  257. package/dist/esm/tests/process-handler.spec.d.ts.map +0 -1
  258. package/dist/esm/tests/process-handler.spec.js +0 -60
  259. package/dist/esm/tests/process-handler.spec.js.map +0 -1
  260. package/dist/esm/tests/registration/proof-of-work-manager.spec.d.ts +0 -2
  261. package/dist/esm/tests/registration/proof-of-work-manager.spec.d.ts.map +0 -1
  262. package/dist/esm/tests/registration/proof-of-work-manager.spec.js +0 -156
  263. package/dist/esm/tests/registration/proof-of-work-manager.spec.js.map +0 -1
  264. package/dist/esm/tests/rpc-subscribe-close.spec.d.ts +0 -2
  265. package/dist/esm/tests/rpc-subscribe-close.spec.d.ts.map +0 -1
  266. package/dist/esm/tests/rpc-subscribe-close.spec.js +0 -81
  267. package/dist/esm/tests/rpc-subscribe-close.spec.js.map +0 -1
  268. package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.d.ts +0 -2
  269. package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.d.ts.map +0 -1
  270. package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.js +0 -74
  271. package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.js.map +0 -1
  272. package/dist/esm/tests/scenarios/registration.spec.d.ts +0 -2
  273. package/dist/esm/tests/scenarios/registration.spec.d.ts.map +0 -1
  274. package/dist/esm/tests/scenarios/registration.spec.js +0 -511
  275. package/dist/esm/tests/scenarios/registration.spec.js.map +0 -1
  276. package/dist/esm/tests/scenarios/web5-connect.spec.d.ts +0 -2
  277. package/dist/esm/tests/scenarios/web5-connect.spec.d.ts.map +0 -1
  278. package/dist/esm/tests/scenarios/web5-connect.spec.js +0 -141
  279. package/dist/esm/tests/scenarios/web5-connect.spec.js.map +0 -1
  280. package/dist/esm/tests/test-dwn.d.ts +0 -7
  281. package/dist/esm/tests/test-dwn.d.ts.map +0 -1
  282. package/dist/esm/tests/test-dwn.js +0 -28
  283. package/dist/esm/tests/test-dwn.js.map +0 -1
  284. package/dist/esm/tests/utils.d.ts +0 -43
  285. package/dist/esm/tests/utils.d.ts.map +0 -1
  286. package/dist/esm/tests/utils.js +0 -107
  287. package/dist/esm/tests/utils.js.map +0 -1
  288. package/dist/esm/tests/ws-api.spec.d.ts +0 -2
  289. package/dist/esm/tests/ws-api.spec.d.ts.map +0 -1
  290. package/dist/esm/tests/ws-api.spec.js +0 -332
  291. package/dist/esm/tests/ws-api.spec.js.map +0 -1
  292. package/src/json-rpc-socket.ts +0 -156
  293. package/src/lib/json-rpc.ts +0 -126
  294. package/src/registration/proof-of-work-types.ts +0 -7
  295. package/src/registration/registration-types.ts +0 -18
@@ -1,7 +1,9 @@
1
1
  import { DwnInterfaceName, DwnMethodName } from '@enbox/dwn-sdk-js';
2
2
  import log from 'loglevel';
3
3
  import { v4 as uuidv4 } from 'uuid';
4
- import { createJsonRpcErrorResponse, createJsonRpcSuccessResponse, JsonRpcErrorCodes, } from '../../lib/json-rpc.js';
4
+ import { DwnServerErrorCode } from '../../dwn-error.js';
5
+ import { requestDataBytesTotal } from '../../metrics.js';
6
+ import { createJsonRpcErrorResponse, createJsonRpcSuccessResponse, JsonRpcErrorCodes, } from '@enbox/dwn-clients';
5
7
  export const handleDwnProcessMessage = async (dwnRequest, context) => {
6
8
  const { dwn, dataStream, subscriptionRequest, socketConnection, transport } = context;
7
9
  const { target, message } = dwnRequest.params;
@@ -32,6 +34,25 @@ export const handleDwnProcessMessage = async (dwnRequest, context) => {
32
34
  const jsonRpcResponse = createJsonRpcErrorResponse(requestId, JsonRpcErrorCodes.InvalidParams, `the subscribe id: ${subscriptionRequest.id} is in use by an active subscription`);
33
35
  return { jsonRpcResponse };
34
36
  }
37
+ // --- Per-tenant rate limiting (before any DWN processing) ---
38
+ if (context.tenantRateLimiter) {
39
+ const result = context.tenantRateLimiter.consume(target);
40
+ if (result.allowed === false) {
41
+ const retryAfterSec = Math.ceil(result.retryAfterMs / 1000);
42
+ const jsonRpcResponse = createJsonRpcErrorResponse(requestId, JsonRpcErrorCodes.TooManyRequests, `${DwnServerErrorCode.RateLimitExceeded}: tenant rate limit exceeded, retry after ${retryAfterSec}s`, { retryAfterSec });
43
+ return { jsonRpcResponse };
44
+ }
45
+ }
46
+ // --- Per-tenant storage quota enforcement (RecordsWrite only) ---
47
+ if (context.config &&
48
+ context.adminStore &&
49
+ message.descriptor.interface === DwnInterfaceName.Records &&
50
+ message.descriptor.method === DwnMethodName.Write) {
51
+ const quotaResult = await enforceQuota(target, message, context);
52
+ if (quotaResult !== undefined) {
53
+ return quotaResult;
54
+ }
55
+ }
35
56
  const reply = await dwn.processMessage(target, message, {
36
57
  dataStream,
37
58
  subscriptionHandler: subscriptionRequest?.subscriptionHandler,
@@ -61,13 +82,94 @@ export const handleDwnProcessMessage = async (dwnRequest, context) => {
61
82
  if (recordDataStream) {
62
83
  responsePayload.dataStream = recordDataStream;
63
84
  }
85
+ // --- Fire-and-forget: post-processing hooks ---
86
+ const statusCode = reply.status?.code ?? 0;
87
+ if (context.messageProcessedHooks) {
88
+ const hookContext = { tenant: target, message, status: reply.status, transport };
89
+ for (const hook of context.messageProcessedHooks) {
90
+ try {
91
+ const result = hook.onMessageProcessed(hookContext);
92
+ if (result instanceof Promise) {
93
+ result.catch((err) => {
94
+ log.error('MessageProcessedHook error', err);
95
+ });
96
+ }
97
+ }
98
+ catch (err) {
99
+ log.error('MessageProcessedHook error', err);
100
+ }
101
+ }
102
+ }
103
+ // Capture activity event and per-request metrics.
104
+ const dwnInterface = message.descriptor.interface;
105
+ const dwnMethod = message.descriptor.method;
106
+ const dataSizeBytes = message.descriptor.dataSize;
107
+ if (dataSizeBytes !== undefined && dataSizeBytes > 0) {
108
+ requestDataBytesTotal.inc({ interface: dwnInterface, method: dwnMethod }, dataSizeBytes);
109
+ }
110
+ if (context.activityLog) {
111
+ context.activityLog.record({
112
+ tenant: target,
113
+ interface: dwnInterface,
114
+ method: dwnMethod,
115
+ statusCode,
116
+ transport,
117
+ dataSizeBytes,
118
+ });
119
+ }
64
120
  return responsePayload;
65
121
  }
66
122
  catch (error) {
67
- const jsonRpcResponse = createJsonRpcErrorResponse(requestId, JsonRpcErrorCodes.InternalError, error.message);
68
- // log the unhandled error response
69
- log.error('handleDwnProcessMessage error', jsonRpcResponse, dwnRequest, error);
123
+ // Log the full error internally but return a generic message to the client
124
+ // to avoid leaking implementation details (SQL errors, file paths, etc.).
125
+ log.error('handleDwnProcessMessage error', error);
126
+ const jsonRpcResponse = createJsonRpcErrorResponse(requestId, JsonRpcErrorCodes.InternalError, 'an unexpected error occurred while processing the message');
70
127
  return { jsonRpcResponse };
71
128
  }
72
129
  };
130
+ // ---------------------------------------------------------------------------
131
+ // Quota enforcement helper
132
+ // ---------------------------------------------------------------------------
133
+ /**
134
+ * Checks whether the tenant has exceeded their message count or storage quota.
135
+ * Returns a JSON-RPC error response if the quota is exceeded, or `undefined` to proceed.
136
+ */
137
+ async function enforceQuota(target, message, context) {
138
+ const { config, adminStore, registrationStore } = context;
139
+ const requestId = message.recordId ?? uuidv4();
140
+ // Resolve effective quota: per-tenant override > global config > unlimited.
141
+ let maxMessages = config.quotaMaxMessages ?? 0;
142
+ let maxStorageBytes = config.quotaMaxStorageBytes ?? 0;
143
+ if (registrationStore) {
144
+ const tenantQuota = await registrationStore.getQuota(target);
145
+ if (tenantQuota !== undefined) {
146
+ maxMessages = tenantQuota.maxMessages ?? maxMessages;
147
+ maxStorageBytes = tenantQuota.maxStorageBytes ?? maxStorageBytes;
148
+ }
149
+ }
150
+ // 0 means unlimited — skip enforcement.
151
+ if (maxMessages === 0 && maxStorageBytes === 0) {
152
+ return undefined;
153
+ }
154
+ // Check message count quota.
155
+ if (maxMessages > 0) {
156
+ const currentMessages = await adminStore.getTenantMessageCount(target);
157
+ if (currentMessages >= maxMessages) {
158
+ return {
159
+ jsonRpcResponse: createJsonRpcErrorResponse(requestId, JsonRpcErrorCodes.InvalidRequest, `${DwnServerErrorCode.TenantMessageQuotaExceeded}: tenant has reached the message limit of ${maxMessages}`),
160
+ };
161
+ }
162
+ }
163
+ // Check storage size quota.
164
+ if (maxStorageBytes > 0) {
165
+ const dataSize = message.descriptor.dataSize ?? 0;
166
+ const currentStorage = await adminStore.getTenantStorageSize(target);
167
+ if (currentStorage + dataSize > maxStorageBytes) {
168
+ return {
169
+ jsonRpcResponse: createJsonRpcErrorResponse(requestId, JsonRpcErrorCodes.InvalidRequest, `${DwnServerErrorCode.TenantStorageQuotaExceeded}: tenant would exceed storage limit of ${maxStorageBytes} bytes`),
170
+ };
171
+ }
172
+ }
173
+ return undefined;
174
+ }
73
175
  //# sourceMappingURL=process-message.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-message.js","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/dwn/process-message.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process-message.js","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/dwn/process-message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { JsonRpcHandler } from '../../lib/json-rpc-router.js';
2
+ /**
3
+ * Handles `rpc.ack` — acknowledges receipt of subscription events up to the
4
+ * given cursor, advancing the per-subscription flow-control window.
5
+ *
6
+ * Request shape:
7
+ * ```json
8
+ * {
9
+ * "jsonrpc": "2.0",
10
+ * "method": "rpc.ack",
11
+ * "params": { "cursor": "<opaque-cursor>" },
12
+ * "subscription": { "id": "<subscription-id>" }
13
+ * }
14
+ * ```
15
+ *
16
+ * This is a notification (no `id` required), but the server sends a response
17
+ * if validation fails (missing params, unknown subscription, etc.).
18
+ */
19
+ export declare const handleSubscriptionAck: JsonRpcHandler;
20
+ //# sourceMappingURL=ack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ack.d.ts","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/ack.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,cAAc,EACf,MAAM,8BAA8B,CAAC;AAItC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAmCnC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { createJsonRpcErrorResponse, createJsonRpcSuccessResponse, JsonRpcErrorCodes } from '@enbox/dwn-clients';
3
+ /**
4
+ * Handles `rpc.ack` — acknowledges receipt of subscription events up to the
5
+ * given cursor, advancing the per-subscription flow-control window.
6
+ *
7
+ * Request shape:
8
+ * ```json
9
+ * {
10
+ * "jsonrpc": "2.0",
11
+ * "method": "rpc.ack",
12
+ * "params": { "cursor": "<opaque-cursor>" },
13
+ * "subscription": { "id": "<subscription-id>" }
14
+ * }
15
+ * ```
16
+ *
17
+ * This is a notification (no `id` required), but the server sends a response
18
+ * if validation fails (missing params, unknown subscription, etc.).
19
+ */
20
+ export const handleSubscriptionAck = async (jsonRpcRequest, context) => {
21
+ const requestId = jsonRpcRequest.id ?? uuidv4();
22
+ if (context.socketConnection === undefined) {
23
+ const jsonRpcResponse = createJsonRpcErrorResponse(requestId, JsonRpcErrorCodes.InvalidRequest, 'socket connection does not exist');
24
+ return { jsonRpcResponse };
25
+ }
26
+ if (jsonRpcRequest.subscription === undefined) {
27
+ const jsonRpcResponse = createJsonRpcErrorResponse(requestId, JsonRpcErrorCodes.InvalidParams, 'subscription options are required');
28
+ return { jsonRpcResponse };
29
+ }
30
+ const { id: subscriptionId } = jsonRpcRequest.subscription;
31
+ const { cursor } = (jsonRpcRequest.params ?? {});
32
+ if (cursor === undefined || typeof cursor !== 'string' || cursor === '') {
33
+ const jsonRpcResponse = createJsonRpcErrorResponse(requestId, JsonRpcErrorCodes.InvalidParams, 'params.cursor is required and must be a non-empty string');
34
+ return { jsonRpcResponse };
35
+ }
36
+ const { socketConnection } = context;
37
+ socketConnection.ackSubscription(subscriptionId, cursor);
38
+ const jsonRpcResponse = createJsonRpcSuccessResponse(requestId, { reply: { status: 200, detail: 'OK' } });
39
+ return { jsonRpcResponse };
40
+ };
41
+ //# sourceMappingURL=ack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ack.js","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/ack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAQpC,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEjH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAmB,KAAK,EACxD,cAAc,EACd,OAAO,EACP,EAAE;IACF,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;IAEhD,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,eAAe,GAAG,0BAA0B,CAChD,SAAS,EAAE,iBAAiB,CAAC,cAAc,EAAE,kCAAkC,CAChF,CAAC;QACF,OAAO,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,cAAc,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC9C,MAAM,eAAe,GAAG,0BAA0B,CAChD,SAAS,EAAE,iBAAiB,CAAC,aAAa,EAAE,mCAAmC,CAChF,CAAC;QACF,OAAO,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,YAAiC,CAAC;IAChF,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE,CAAwB,CAAC;IAExE,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QACxE,MAAM,eAAe,GAAG,0BAA0B,CAChD,SAAS,EAAE,iBAAiB,CAAC,aAAa,EAAE,0DAA0D,CACvG,CAAC;QACF,OAAO,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IACrC,gBAAgB,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAEzD,MAAM,eAAe,GAAG,4BAA4B,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1G,OAAO,EAAE,eAAe,EAAqB,CAAC;AAChD,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/close.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,cAAc,EACf,MAAM,8BAA8B,CAAC;AAUtC;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,EAAE,cAoCtC,CAAC"}
1
+ {"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/close.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,cAAc,EACf,MAAM,8BAA8B,CAAC;AAMtC;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,EAAE,cAoCtC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { v4 as uuidv4 } from 'uuid';
2
2
  import { DwnServerErrorCode } from '../../dwn-error.js';
3
- import { createJsonRpcErrorResponse, createJsonRpcSuccessResponse, JsonRpcErrorCodes, } from '../../lib/json-rpc.js';
3
+ import { createJsonRpcErrorResponse, createJsonRpcSuccessResponse, JsonRpcErrorCodes } from '@enbox/dwn-clients';
4
4
  /**
5
5
  * Closes a subscription tied to a specific `SocketConnection`.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"close.js","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/close.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAQpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAmB,KAAK,EAC3D,cAAc,EACd,OAAO,EACP,EAAE;IACF,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;IAChD,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,eAAe,GAAG,0BAA0B,CAAC,SAAS,EAAE,iBAAiB,CAAC,cAAc,EAAE,kCAAkC,CAAC,CAAC;QACpI,OAAO,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,cAAc,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC9C,MAAM,eAAe,GAAG,0BAA0B,CAAC,SAAS,EAAE,iBAAiB,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC;QAClI,OAAO,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,EAAE,EAAE,EAAE,GAAG,cAAc,CAAC,YAAiC,CAAC;IAEhE,IAAI,eAA+B,CAAC;IACpC,IAAI,CAAC;QACH,sFAAsF;QACtF,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC7C,eAAe,GAAG,4BAA4B,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5G,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC,uCAAuC,EAAE,CAAC;YAC9E,eAAe,GAAG,0BAA0B,CAAC,SAAS,EAAE,iBAAiB,CAAC,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QACjI,CAAC;aAAM,CAAC;YACN,eAAe,GAAG,0BAA0B,CAC1C,SAAS,EACT,iBAAiB,CAAC,aAAa,EAC/B,wCAAwC,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,eAAe,EAAqB,CAAC;AAChD,CAAC,CAAC"}
1
+ {"version":3,"file":"close.js","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/close.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAQpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEjH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAmB,KAAK,EAC3D,cAAc,EACd,OAAO,EACP,EAAE;IACF,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;IAChD,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,eAAe,GAAG,0BAA0B,CAAC,SAAS,EAAE,iBAAiB,CAAC,cAAc,EAAE,kCAAkC,CAAC,CAAC;QACpI,OAAO,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,cAAc,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC9C,MAAM,eAAe,GAAG,0BAA0B,CAAC,SAAS,EAAE,iBAAiB,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC;QAClI,OAAO,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,EAAE,EAAE,EAAE,GAAG,cAAc,CAAC,YAAiC,CAAC;IAEhE,IAAI,eAA+B,CAAC;IACpC,IAAI,CAAC;QACH,sFAAsF;QACtF,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC7C,eAAe,GAAG,4BAA4B,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5G,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC,uCAAuC,EAAE,CAAC;YAC9E,eAAe,GAAG,0BAA0B,CAAC,SAAS,EAAE,iBAAiB,CAAC,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QACjI,CAAC;aAAM,CAAC;YACN,eAAe,GAAG,0BAA0B,CAC1C,SAAS,EACT,iBAAiB,CAAC,aAAa,EAC/B,wCAAwC,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,eAAe,EAAqB,CAAC;AAChD,CAAC,CAAC"}
@@ -1,2 +1,3 @@
1
+ export * from './ack.js';
1
2
  export * from './close.js';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC"}
@@ -1,2 +1,3 @@
1
+ export * from './ack.js';
1
2
  export * from './close.js';
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC"}
@@ -1,6 +1,12 @@
1
- import type { Dwn, MessageSubscriptionHandler } from '@enbox/dwn-sdk-js';
2
- import type { JsonRpcId, JsonRpcRequest, JsonRpcResponse } from './json-rpc.js';
1
+ import type { ActivityLog } from '../admin/activity-log.js';
2
+ import type { AdminStore } from '../admin/admin-store.js';
3
+ import type { DwnServerConfig } from '../config.js';
4
+ import type { MessageProcessedHook } from '../message-processed-hook.js';
5
+ import type { RateLimiter } from '../rate-limiter.js';
6
+ import type { RegistrationStore } from '../registration/registration-store.js';
3
7
  import type { SocketConnection } from '../connection/socket-connection.js';
8
+ import type { Dwn, SubscriptionListener } from '@enbox/dwn-sdk-js';
9
+ import type { JsonRpcId, JsonRpcRequest, JsonRpcResponse } from '@enbox/dwn-clients';
4
10
  export type RequestContext = {
5
11
  transport: 'http' | 'ws';
6
12
  dwn: Dwn;
@@ -9,11 +15,23 @@ export type RequestContext = {
9
15
  subscriptionRequest?: {
10
16
  /** The JsonRpcId of the subscription handler */
11
17
  id: JsonRpcId;
12
- /** The `MessageEvent` handler associated with a subscription request, only used in `ws` requests */
13
- subscriptionHandler: MessageSubscriptionHandler;
18
+ /** The `SubscriptionMessage` handler associated with a subscription request, only used in `ws` requests */
19
+ subscriptionHandler: SubscriptionListener;
14
20
  };
15
21
  /** The `ReadableStream` associated with a `RecordsWrite` request only used in `http` requests */
16
22
  dataStream?: ReadableStream<Uint8Array>;
23
+ /** The admin activity log for capturing DWN request events (optional). */
24
+ activityLog?: ActivityLog;
25
+ /** The admin store for quota usage queries (optional). */
26
+ adminStore?: AdminStore;
27
+ /** The registration store for per-tenant quota lookups (optional). */
28
+ registrationStore?: RegistrationStore;
29
+ /** Server configuration for global quota/rate-limit defaults (optional). */
30
+ config?: DwnServerConfig;
31
+ /** Per-tenant rate limiter (optional). */
32
+ tenantRateLimiter?: RateLimiter;
33
+ /** Hooks invoked after every `dwn.processMessage()` call (fire-and-forget). */
34
+ messageProcessedHooks?: MessageProcessedHook[];
17
35
  };
18
36
  export type HandlerResponse = {
19
37
  jsonRpcResponse: JsonRpcResponse;
@@ -1 +1 @@
1
- {"version":3,"file":"json-rpc-router.d.ts","sourceRoot":"","sources":["../../../../src/lib/json-rpc-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAE3E,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,GAAG,CAAC;IACT,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,mBAAmB,CAAC,EAAE;QACpB,gDAAgD;QAChD,EAAE,EAAE,SAAS,CAAC;QACd,oGAAoG;QACpG,mBAAmB,EAAE,0BAA0B,CAAC;KACjD,CAAA;IACD,iGAAiG;IACjG,UAAU,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAC3B,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,eAAe,CAAC,CAAC;AAE9B,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAuC;;IAM7D,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAI/C,MAAM,CACV,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC;CAK5B"}
1
+ {"version":3,"file":"json-rpc-router.d.ts","sourceRoot":"","sources":["../../../../src/lib/json-rpc-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,KAAK,EAAE,GAAG,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErF,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,GAAG,CAAC;IACT,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,mBAAmB,CAAC,EAAE;QACpB,gDAAgD;QAChD,EAAE,EAAE,SAAS,CAAC;QACd,2GAA2G;QAC3G,mBAAmB,EAAE,oBAAoB,CAAC;KAC3C,CAAA;IACD,iGAAiG;IACjG,UAAU,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACxC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,0DAA0D;IAC1D,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,4EAA4E;IAC5E,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC,+EAA+E;IAC/E,qBAAqB,CAAC,EAAE,oBAAoB,EAAE,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAC3B,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,eAAe,CAAC,CAAC;AAE9B,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAuC;;IAM7D,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAI/C,MAAM,CACV,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC;CAK5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"json-rpc-router.js","sourceRoot":"","sources":["../../../../src/lib/json-rpc-router.ts"],"names":[],"mappings":"AA+BA,MAAM,OAAO,aAAa;IAChB,cAAc,CAAuC;IAE7D;QACE,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,EAAE,CAAC,UAAkB,EAAE,OAAuB;QAC5C,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM,CACV,UAA0B,EAC1B,OAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAEvD,OAAO,MAAM,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;CACF"}
1
+ {"version":3,"file":"json-rpc-router.js","sourceRoot":"","sources":["../../../../src/lib/json-rpc-router.ts"],"names":[],"mappings":"AA+CA,MAAM,OAAO,aAAa;IAChB,cAAc,CAAuC;IAE7D;QACE,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,EAAE,CAAC,UAAkB,EAAE,OAAuB;QAC5C,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM,CACV,UAA0B,EAC1B,OAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAEvD,OAAO,MAAM,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Escapes SQL LIKE wildcard characters (`%`, `_`, `\`) in user-supplied input
3
+ * so that they are treated as literal characters rather than pattern operators.
4
+ */
5
+ export declare function escapeLikeWildcards(input: string): string;
6
+ //# sourceMappingURL=sql-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-utils.d.ts","sourceRoot":"","sources":["../../../../src/lib/sql-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Escapes SQL LIKE wildcard characters (`%`, `_`, `\`) in user-supplied input
3
+ * so that they are treated as literal characters rather than pattern operators.
4
+ */
5
+ export function escapeLikeWildcards(input) {
6
+ return input.replace(/[%_\\]/g, '\\$&');
7
+ }
8
+ //# sourceMappingURL=sql-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-utils.js","sourceRoot":"","sources":["../../../../src/lib/sql-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC"}
@@ -1,11 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // node.js 18 and earlier, needs globalThis.crypto polyfill. needed for dwn-sdk-js
3
- import { webcrypto } from 'node:crypto';
4
2
  import { DwnServer } from './dwn-server.js';
5
- if (!globalThis.crypto) {
6
- // @ts-ignore
7
- globalThis.crypto = webcrypto;
8
- }
9
3
  const dwnServer = new DwnServer();
10
4
  await dwnServer.start();
11
5
  //# sourceMappingURL=main.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/main.ts"],"names":[],"mappings":";AACA,kFAAkF;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;IACvB,aAAa;IACb,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC;AAChC,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAElC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAElC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { GenericMessage } from '@enbox/dwn-sdk-js';
2
+ /**
3
+ * Context provided to hooks after `dwn.processMessage()` returns.
4
+ */
5
+ export type MessageProcessedContext = {
6
+ /** The tenant DID that owns the DWN. */
7
+ tenant: string;
8
+ /** The original signed DWN message. */
9
+ message: GenericMessage;
10
+ /** The reply status from the DWN engine. */
11
+ status: {
12
+ code: number;
13
+ detail: string;
14
+ };
15
+ /** The transport over which the message was received. */
16
+ transport: 'http' | 'ws';
17
+ };
18
+ /**
19
+ * Hook that is invoked after every successful `dwn.processMessage()` call.
20
+ *
21
+ * Hooks are fire-and-forget: they run asynchronously and their return values
22
+ * are ignored. Errors thrown by hooks are logged but never propagate to the
23
+ * request handler or the client.
24
+ *
25
+ * Implementations should return quickly and schedule any expensive work
26
+ * (network I/O, retries) internally.
27
+ */
28
+ export interface MessageProcessedHook {
29
+ /**
30
+ * Called after a DWN message has been processed.
31
+ * May return void or a Promise — both are handled gracefully.
32
+ */
33
+ onMessageProcessed(context: MessageProcessedContext): void | Promise<void>;
34
+ }
35
+ //# sourceMappingURL=message-processed-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-processed-hook.d.ts","sourceRoot":"","sources":["../../../src/message-processed-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,OAAO,EAAE,cAAc,CAAC;IACxB,4CAA4C;IAC5C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,yDAAyD;IACzD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,kBAAkB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=message-processed-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-processed-hook.js","sourceRoot":"","sources":["../../../src/message-processed-hook.ts"],"names":[],"mappings":""}
@@ -1,4 +1,16 @@
1
- import { Counter, Histogram } from 'prom-client';
1
+ import { Counter, Gauge, Histogram } from 'prom-client';
2
2
  export declare const requestCounter: Counter<"method" | "status" | "error">;
3
3
  export declare const responseHistogram: Histogram<"route" | "code">;
4
+ /** Number of active (registered) tenants. */
5
+ export declare const activeTenants: Gauge<string>;
6
+ /** Total messages stored across all tenants. */
7
+ export declare const totalMessages: Gauge<string>;
8
+ /** Total data storage in bytes across all tenants. */
9
+ export declare const totalDataBytes: Gauge<string>;
10
+ /** Number of active WebSocket connections. */
11
+ export declare const websocketConnections: Gauge<string>;
12
+ /** Number of active WebSocket subscriptions. */
13
+ export declare const websocketSubscriptions: Gauge<string>;
14
+ /** Total data bytes written via RecordsWrite, labeled by interface + method. */
15
+ export declare const requestDataBytesTotal: Counter<"interface" | "method">;
4
16
  //# sourceMappingURL=metrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,cAAc,wCAIzB,CAAC;AAEH,eAAO,MAAM,iBAAiB,6BAK5B,CAAC"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAMxD,eAAO,MAAM,cAAc,wCAIzB,CAAC;AAEH,eAAO,MAAM,iBAAiB,6BAK5B,CAAC;AAMH,6CAA6C;AAC7C,eAAO,MAAM,aAAa,eAGxB,CAAC;AAEH,gDAAgD;AAChD,eAAO,MAAM,aAAa,eAGxB,CAAC;AAEH,sDAAsD;AACtD,eAAO,MAAM,cAAc,eAGzB,CAAC;AAEH,8CAA8C;AAC9C,eAAO,MAAM,oBAAoB,eAG/B,CAAC;AAEH,gDAAgD;AAChD,eAAO,MAAM,sBAAsB,eAGjC,CAAC;AAMH,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,iCAIhC,CAAC"}
@@ -1,4 +1,7 @@
1
- import { Counter, Histogram } from 'prom-client';
1
+ import { Counter, Gauge, Histogram } from 'prom-client';
2
+ // ---------------------------------------------------------------------------
3
+ // Existing metrics
4
+ // ---------------------------------------------------------------------------
2
5
  export const requestCounter = new Counter({
3
6
  name: 'dwn_requests_total',
4
7
  help: 'all dwn requests processed',
@@ -10,4 +13,41 @@ export const responseHistogram = new Histogram({
10
13
  buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],
11
14
  labelNames: ['route', 'code'],
12
15
  });
16
+ // ---------------------------------------------------------------------------
17
+ // Enhanced gauges — updated periodically by AdminApi.startMetricsUpdater()
18
+ // ---------------------------------------------------------------------------
19
+ /** Number of active (registered) tenants. */
20
+ export const activeTenants = new Gauge({
21
+ name: 'dwn_active_tenants',
22
+ help: 'number of active registered tenants',
23
+ });
24
+ /** Total messages stored across all tenants. */
25
+ export const totalMessages = new Gauge({
26
+ name: 'dwn_total_messages',
27
+ help: 'total messages stored across all tenants',
28
+ });
29
+ /** Total data storage in bytes across all tenants. */
30
+ export const totalDataBytes = new Gauge({
31
+ name: 'dwn_total_data_bytes',
32
+ help: 'total data storage bytes across all tenants',
33
+ });
34
+ /** Number of active WebSocket connections. */
35
+ export const websocketConnections = new Gauge({
36
+ name: 'dwn_websocket_connections',
37
+ help: 'number of active websocket connections',
38
+ });
39
+ /** Number of active WebSocket subscriptions. */
40
+ export const websocketSubscriptions = new Gauge({
41
+ name: 'dwn_websocket_subscriptions',
42
+ help: 'number of active websocket subscriptions',
43
+ });
44
+ // ---------------------------------------------------------------------------
45
+ // Enhanced counters — incremented per-request
46
+ // ---------------------------------------------------------------------------
47
+ /** Total data bytes written via RecordsWrite, labeled by interface + method. */
48
+ export const requestDataBytesTotal = new Counter({
49
+ name: 'dwn_request_data_bytes_total',
50
+ help: 'total data bytes processed in DWN requests',
51
+ labelNames: ['interface', 'method'],
52
+ });
13
53
  //# sourceMappingURL=metrics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC;IACxC,IAAI,EAAS,oBAAoB;IACjC,IAAI,EAAS,4BAA4B;IACzC,UAAU,EAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;CAC3C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,SAAS,CAAC;IAC7C,IAAI,EAAS,eAAe;IAC5B,IAAI,EAAS,oBAAoB;IACjC,OAAO,EAAM,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACtE,UAAU,EAAG,CAAC,OAAO,EAAE,MAAM,CAAC;CAC/B,CAAC,CAAC"}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExD,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC;IACxC,IAAI,EAAS,oBAAoB;IACjC,IAAI,EAAS,4BAA4B;IACzC,UAAU,EAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;CAC3C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,SAAS,CAAC;IAC7C,IAAI,EAAS,eAAe;IAC5B,IAAI,EAAS,oBAAoB;IACjC,OAAO,EAAM,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACtE,UAAU,EAAG,CAAC,OAAO,EAAE,MAAM,CAAC;CAC/B,CAAC,CAAC;AAEH,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAE9E,6CAA6C;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC;IACrC,IAAI,EAAG,oBAAoB;IAC3B,IAAI,EAAG,qCAAqC;CAC7C,CAAC,CAAC;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC;IACrC,IAAI,EAAG,oBAAoB;IAC3B,IAAI,EAAG,0CAA0C;CAClD,CAAC,CAAC;AAEH,sDAAsD;AACtD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC;IACtC,IAAI,EAAG,sBAAsB;IAC7B,IAAI,EAAG,6CAA6C;CACrD,CAAC,CAAC;AAEH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,KAAK,CAAC;IAC5C,IAAI,EAAG,2BAA2B;IAClC,IAAI,EAAG,wCAAwC;CAChD,CAAC,CAAC;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,KAAK,CAAC;IAC9C,IAAI,EAAG,6BAA6B;IACpC,IAAI,EAAG,0CAA0C;CAClD,CAAC,CAAC;AAEH,8EAA8E;AAC9E,8CAA8C;AAC9C,8EAA8E;AAE9E,gFAAgF;AAChF,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,OAAO,CAAC;IAC/C,IAAI,EAAS,8BAA8B;IAC3C,IAAI,EAAS,4CAA4C;IACzD,UAAU,EAAG,CAAC,WAAW,EAAE,QAAQ,CAAC;CACrC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { EventLog, EventLogReadOptions, EventLogReadResult, EventLogSubscribeOptions, EventSubscription, KeyValues, MessageEvent, SubscriptionListener } from '@enbox/dwn-sdk-js';
2
+ /**
3
+ * Distributed {@link EventLog} implementation backed by NATS JetStream.
4
+ *
5
+ * Events are published to per-tenant subjects within a single JetStream stream.
6
+ * NATS stream sequence numbers are used as opaque cursors, providing native
7
+ * cursor-based replay and EOSE detection via `msg.info.pending`.
8
+ *
9
+ * Designed for multi-node DWN deployments: node A can emit an event, and a
10
+ * subscriber connected to node B receives it via the shared NATS cluster.
11
+ *
12
+ * Loaded by the DWN server plugin system via `DWN_EVENT_LOG_PLUGIN_PATH`.
13
+ * Must be a default export with a no-arg constructor.
14
+ */
15
+ export default class NatsEventLog implements EventLog {
16
+ #private;
17
+ constructor();
18
+ open(): Promise<void>;
19
+ close(): Promise<void>;
20
+ emit(tenant: string, event: MessageEvent, indexes: KeyValues): Promise<string>;
21
+ read(tenant: string, options?: EventLogReadOptions): Promise<EventLogReadResult>;
22
+ subscribe(tenant: string, id: string, listener: SubscriptionListener, options?: EventLogSubscribeOptions): Promise<EventSubscription>;
23
+ trim(tenant: string, olderThan: number | string): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=event-log-nats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-log-nats.d.ts","sourceRoot":"","sources":["../../../../src/plugins/event-log-nats.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAiB,mBAAmB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,iBAAiB,EAAU,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AA+I9M;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,YAAa,YAAW,QAAQ;;;IAetC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBtB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAW9E,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoEpF,SAAS,CACpB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,iBAAiB,CAAC;IA8GhB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA2D7E"}