@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
@@ -0,0 +1,63 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+
3
+ import type { JsonRpcId } from '@enbox/dwn-clients';
4
+ import type {
5
+ HandlerResponse,
6
+ JsonRpcHandler,
7
+ } from '../../lib/json-rpc-router.js';
8
+
9
+ import { createJsonRpcErrorResponse, createJsonRpcSuccessResponse, JsonRpcErrorCodes } from '@enbox/dwn-clients';
10
+
11
+ /**
12
+ * Handles `rpc.ack` — acknowledges receipt of subscription events up to the
13
+ * given cursor, advancing the per-subscription flow-control window.
14
+ *
15
+ * Request shape:
16
+ * ```json
17
+ * {
18
+ * "jsonrpc": "2.0",
19
+ * "method": "rpc.ack",
20
+ * "params": { "cursor": "<opaque-cursor>" },
21
+ * "subscription": { "id": "<subscription-id>" }
22
+ * }
23
+ * ```
24
+ *
25
+ * This is a notification (no `id` required), but the server sends a response
26
+ * if validation fails (missing params, unknown subscription, etc.).
27
+ */
28
+ export const handleSubscriptionAck: JsonRpcHandler = async (
29
+ jsonRpcRequest,
30
+ context,
31
+ ) => {
32
+ const requestId = jsonRpcRequest.id ?? uuidv4();
33
+
34
+ if (context.socketConnection === undefined) {
35
+ const jsonRpcResponse = createJsonRpcErrorResponse(
36
+ requestId, JsonRpcErrorCodes.InvalidRequest, 'socket connection does not exist'
37
+ );
38
+ return { jsonRpcResponse };
39
+ }
40
+
41
+ if (jsonRpcRequest.subscription === undefined) {
42
+ const jsonRpcResponse = createJsonRpcErrorResponse(
43
+ requestId, JsonRpcErrorCodes.InvalidParams, 'subscription options are required'
44
+ );
45
+ return { jsonRpcResponse };
46
+ }
47
+
48
+ const { id: subscriptionId } = jsonRpcRequest.subscription as { id: JsonRpcId };
49
+ const { cursor } = (jsonRpcRequest.params ?? {}) as { cursor?: string };
50
+
51
+ if (cursor === undefined || typeof cursor !== 'string' || cursor === '') {
52
+ const jsonRpcResponse = createJsonRpcErrorResponse(
53
+ requestId, JsonRpcErrorCodes.InvalidParams, 'params.cursor is required and must be a non-empty string'
54
+ );
55
+ return { jsonRpcResponse };
56
+ }
57
+
58
+ const { socketConnection } = context;
59
+ socketConnection.ackSubscription(subscriptionId, cursor);
60
+
61
+ const jsonRpcResponse = createJsonRpcSuccessResponse(requestId, { reply: { status: 200, detail: 'OK' } });
62
+ return { jsonRpcResponse } as HandlerResponse;
63
+ };
@@ -4,14 +4,10 @@ import type {
4
4
  HandlerResponse,
5
5
  JsonRpcHandler,
6
6
  } from '../../lib/json-rpc-router.js';
7
- import type { JsonRpcId, JsonRpcResponse } from '../../lib/json-rpc.js';
7
+ import type { JsonRpcId, JsonRpcResponse } from '@enbox/dwn-clients';
8
8
 
9
9
  import { DwnServerErrorCode } from '../../dwn-error.js';
10
- import {
11
- createJsonRpcErrorResponse,
12
- createJsonRpcSuccessResponse,
13
- JsonRpcErrorCodes,
14
- } from '../../lib/json-rpc.js';
10
+ import { createJsonRpcErrorResponse, createJsonRpcSuccessResponse, JsonRpcErrorCodes } from '@enbox/dwn-clients';
15
11
 
16
12
  /**
17
13
  * Closes a subscription tied to a specific `SocketConnection`.
@@ -1 +1,2 @@
1
+ export * from './ack.js';
1
2
  export * from './close.js';
@@ -1,8 +1,12 @@
1
- import type { Dwn, MessageSubscriptionHandler } from '@enbox/dwn-sdk-js';
2
-
3
- import type { JsonRpcId, JsonRpcRequest, JsonRpcResponse } from './json-rpc.js';
4
-
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';
5
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';
6
10
 
7
11
  export type RequestContext = {
8
12
  transport: 'http' | 'ws';
@@ -12,11 +16,23 @@ export type RequestContext = {
12
16
  subscriptionRequest?: {
13
17
  /** The JsonRpcId of the subscription handler */
14
18
  id: JsonRpcId;
15
- /** The `MessageEvent` handler associated with a subscription request, only used in `ws` requests */
16
- subscriptionHandler: MessageSubscriptionHandler;
19
+ /** The `SubscriptionMessage` handler associated with a subscription request, only used in `ws` requests */
20
+ subscriptionHandler: SubscriptionListener;
17
21
  }
18
22
  /** The `ReadableStream` associated with a `RecordsWrite` request only used in `http` requests */
19
23
  dataStream?: ReadableStream<Uint8Array>;
24
+ /** The admin activity log for capturing DWN request events (optional). */
25
+ activityLog?: ActivityLog;
26
+ /** The admin store for quota usage queries (optional). */
27
+ adminStore?: AdminStore;
28
+ /** The registration store for per-tenant quota lookups (optional). */
29
+ registrationStore?: RegistrationStore;
30
+ /** Server configuration for global quota/rate-limit defaults (optional). */
31
+ config?: DwnServerConfig;
32
+ /** Per-tenant rate limiter (optional). */
33
+ tenantRateLimiter?: RateLimiter;
34
+ /** Hooks invoked after every `dwn.processMessage()` call (fire-and-forget). */
35
+ messageProcessedHooks?: MessageProcessedHook[];
20
36
  };
21
37
 
22
38
  export type HandlerResponse = {
@@ -0,0 +1,7 @@
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: string): string {
6
+ return input.replace(/[%_\\]/g, '\\$&');
7
+ }
package/src/main.ts CHANGED
@@ -1,14 +1,6 @@
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
-
5
2
  import { DwnServer } from './dwn-server.js';
6
3
 
7
- if (!globalThis.crypto) {
8
- // @ts-ignore
9
- globalThis.crypto = webcrypto;
10
- }
11
-
12
4
  const dwnServer = new DwnServer();
13
5
 
14
6
  await dwnServer.start();
@@ -0,0 +1,33 @@
1
+ import type { GenericMessage } from '@enbox/dwn-sdk-js';
2
+
3
+ /**
4
+ * Context provided to hooks after `dwn.processMessage()` returns.
5
+ */
6
+ export type MessageProcessedContext = {
7
+ /** The tenant DID that owns the DWN. */
8
+ tenant: string;
9
+ /** The original signed DWN message. */
10
+ message: GenericMessage;
11
+ /** The reply status from the DWN engine. */
12
+ status: { code: number; detail: string };
13
+ /** The transport over which the message was received. */
14
+ transport: 'http' | 'ws';
15
+ };
16
+
17
+ /**
18
+ * Hook that is invoked after every successful `dwn.processMessage()` call.
19
+ *
20
+ * Hooks are fire-and-forget: they run asynchronously and their return values
21
+ * are ignored. Errors thrown by hooks are logged but never propagate to the
22
+ * request handler or the client.
23
+ *
24
+ * Implementations should return quickly and schedule any expensive work
25
+ * (network I/O, retries) internally.
26
+ */
27
+ export interface MessageProcessedHook {
28
+ /**
29
+ * Called after a DWN message has been processed.
30
+ * May return void or a Promise — both are handled gracefully.
31
+ */
32
+ onMessageProcessed(context: MessageProcessedContext): void | Promise<void>;
33
+ }
package/src/metrics.ts CHANGED
@@ -1,4 +1,8 @@
1
- import { Counter, Histogram } from 'prom-client';
1
+ import { Counter, Gauge, Histogram } from 'prom-client';
2
+
3
+ // ---------------------------------------------------------------------------
4
+ // Existing metrics
5
+ // ---------------------------------------------------------------------------
2
6
 
3
7
  export const requestCounter = new Counter({
4
8
  name : 'dwn_requests_total',
@@ -12,3 +16,48 @@ export const responseHistogram = new Histogram({
12
16
  buckets : [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],
13
17
  labelNames : ['route', 'code'],
14
18
  });
19
+
20
+ // ---------------------------------------------------------------------------
21
+ // Enhanced gauges — updated periodically by AdminApi.startMetricsUpdater()
22
+ // ---------------------------------------------------------------------------
23
+
24
+ /** Number of active (registered) tenants. */
25
+ export const activeTenants = new Gauge({
26
+ name : 'dwn_active_tenants',
27
+ help : 'number of active registered tenants',
28
+ });
29
+
30
+ /** Total messages stored across all tenants. */
31
+ export const totalMessages = new Gauge({
32
+ name : 'dwn_total_messages',
33
+ help : 'total messages stored across all tenants',
34
+ });
35
+
36
+ /** Total data storage in bytes across all tenants. */
37
+ export const totalDataBytes = new Gauge({
38
+ name : 'dwn_total_data_bytes',
39
+ help : 'total data storage bytes across all tenants',
40
+ });
41
+
42
+ /** Number of active WebSocket connections. */
43
+ export const websocketConnections = new Gauge({
44
+ name : 'dwn_websocket_connections',
45
+ help : 'number of active websocket connections',
46
+ });
47
+
48
+ /** Number of active WebSocket subscriptions. */
49
+ export const websocketSubscriptions = new Gauge({
50
+ name : 'dwn_websocket_subscriptions',
51
+ help : 'number of active websocket subscriptions',
52
+ });
53
+
54
+ // ---------------------------------------------------------------------------
55
+ // Enhanced counters — incremented per-request
56
+ // ---------------------------------------------------------------------------
57
+
58
+ /** Total data bytes written via RecordsWrite, labeled by interface + method. */
59
+ export const requestDataBytesTotal = new Counter({
60
+ name : 'dwn_request_data_bytes_total',
61
+ help : 'total data bytes processed in DWN requests',
62
+ labelNames : ['interface', 'method'],
63
+ });