@enbox/dwn-server 0.0.2 → 0.0.4

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 (309) hide show
  1. package/LICENSE +3 -2
  2. package/README.md +115 -215
  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 +124 -9
  36. package/dist/esm/src/config.d.ts.map +1 -1
  37. package/dist/esm/src/config.js +155 -13
  38. package/dist/esm/src/config.js.map +1 -1
  39. package/dist/esm/src/connection/connection-manager.d.ts +32 -9
  40. package/dist/esm/src/connection/connection-manager.d.ts.map +1 -1
  41. package/dist/esm/src/connection/connection-manager.js +38 -5
  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 +54 -18
  48. package/dist/esm/src/connection/socket-connection.d.ts.map +1 -1
  49. package/dist/esm/src/connection/socket-connection.js +102 -40
  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 +13 -6
  60. package/dist/esm/src/dwn-server.d.ts.map +1 -1
  61. package/dist/esm/src/dwn-server.js +199 -24
  62. package/dist/esm/src/dwn-server.js.map +1 -1
  63. package/dist/esm/src/http-api.d.ts +28 -13
  64. package/dist/esm/src/http-api.d.ts.map +1 -1
  65. package/dist/esm/src/http-api.js +649 -374
  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 +109 -7
  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 +25 -8
  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 +14 -2
  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/proof-of-work-manager.js +3 -3
  123. package/dist/esm/src/registration/proof-of-work-manager.js.map +1 -1
  124. package/dist/esm/src/registration/provider-auth-plugin.d.ts +46 -0
  125. package/dist/esm/src/registration/provider-auth-plugin.d.ts.map +1 -0
  126. package/dist/esm/src/registration/provider-auth-plugin.js +29 -0
  127. package/dist/esm/src/registration/provider-auth-plugin.js.map +1 -0
  128. package/dist/esm/src/registration/registration-manager.d.ts +28 -5
  129. package/dist/esm/src/registration/registration-manager.d.ts.map +1 -1
  130. package/dist/esm/src/registration/registration-manager.js +83 -12
  131. package/dist/esm/src/registration/registration-manager.js.map +1 -1
  132. package/dist/esm/src/registration/registration-store.d.ts +83 -3
  133. package/dist/esm/src/registration/registration-store.d.ts.map +1 -1
  134. package/dist/esm/src/registration/registration-store.js +248 -11
  135. package/dist/esm/src/registration/registration-store.js.map +1 -1
  136. package/dist/esm/src/storage.d.ts +5 -5
  137. package/dist/esm/src/storage.d.ts.map +1 -1
  138. package/dist/esm/src/storage.js +105 -24
  139. package/dist/esm/src/storage.js.map +1 -1
  140. package/dist/esm/src/web5-connect/sql-ttl-cache.d.ts.map +1 -1
  141. package/dist/esm/src/web5-connect/sql-ttl-cache.js +11 -3
  142. package/dist/esm/src/web5-connect/sql-ttl-cache.js.map +1 -1
  143. package/dist/esm/src/web5-connect/web5-connect-server.d.ts.map +1 -1
  144. package/dist/esm/src/web5-connect/web5-connect-server.js +2 -2
  145. package/dist/esm/src/web5-connect/web5-connect-server.js.map +1 -1
  146. package/dist/esm/src/ws-api.d.ts +18 -4
  147. package/dist/esm/src/ws-api.d.ts.map +1 -1
  148. package/dist/esm/src/ws-api.js +12 -16
  149. package/dist/esm/src/ws-api.js.map +1 -1
  150. package/package.json +34 -53
  151. package/src/admin/activity-log.ts +100 -0
  152. package/src/admin/admin-api.ts +1308 -0
  153. package/src/admin/admin-auth.ts +56 -0
  154. package/src/admin/admin-store.ts +515 -0
  155. package/src/admin/audit-log.ts +327 -0
  156. package/src/admin/index.ts +34 -0
  157. package/src/admin/types.ts +352 -0
  158. package/src/admin/webhook-manager.ts +245 -0
  159. package/src/config.ts +190 -22
  160. package/src/connection/connection-manager.ts +67 -17
  161. package/src/connection/flow-controller.ts +117 -0
  162. package/src/connection/socket-connection.ts +144 -67
  163. package/src/delivery-service.ts +740 -0
  164. package/src/dwn-error.ts +11 -2
  165. package/src/dwn-server.ts +254 -39
  166. package/src/http-api.ts +736 -392
  167. package/src/index.ts +13 -2
  168. package/src/json-rpc-api.ts +2 -1
  169. package/src/json-rpc-handlers/dwn/process-message.ts +149 -15
  170. package/src/json-rpc-handlers/subscription/ack.ts +63 -0
  171. package/src/json-rpc-handlers/subscription/close.ts +5 -9
  172. package/src/json-rpc-handlers/subscription/index.ts +1 -0
  173. package/src/lib/json-rpc-router.ts +26 -11
  174. package/src/lib/sql-utils.ts +7 -0
  175. package/src/main.ts +0 -8
  176. package/src/message-processed-hook.ts +33 -0
  177. package/src/metrics.ts +57 -8
  178. package/src/plugins/event-log-nats.ts +466 -0
  179. package/src/process-handlers.ts +5 -5
  180. package/src/rate-limiter.ts +143 -0
  181. package/src/registration/jwt-provider-auth-plugin.ts +119 -0
  182. package/src/registration/open-auth-handler.ts +263 -0
  183. package/src/registration/proof-of-work-manager.ts +11 -10
  184. package/src/registration/provider-auth-plugin.ts +84 -0
  185. package/src/registration/registration-manager.ts +129 -31
  186. package/src/registration/registration-store.ts +332 -22
  187. package/src/storage.ts +136 -40
  188. package/src/web5-connect/sql-ttl-cache.ts +12 -5
  189. package/src/web5-connect/web5-connect-server.ts +9 -8
  190. package/src/ws-api.ts +39 -26
  191. package/dist/cjs/index.js +0 -6811
  192. package/dist/cjs/package.json +0 -1
  193. package/dist/esm/src/json-rpc-socket.d.ts +0 -39
  194. package/dist/esm/src/json-rpc-socket.d.ts.map +0 -1
  195. package/dist/esm/src/json-rpc-socket.js +0 -125
  196. package/dist/esm/src/json-rpc-socket.js.map +0 -1
  197. package/dist/esm/src/lib/http-server-shutdown-handler.d.ts +0 -10
  198. package/dist/esm/src/lib/http-server-shutdown-handler.d.ts.map +0 -1
  199. package/dist/esm/src/lib/http-server-shutdown-handler.js +0 -65
  200. package/dist/esm/src/lib/http-server-shutdown-handler.js.map +0 -1
  201. package/dist/esm/src/lib/json-rpc.d.ts +0 -54
  202. package/dist/esm/src/lib/json-rpc.d.ts.map +0 -1
  203. package/dist/esm/src/lib/json-rpc.js +0 -60
  204. package/dist/esm/src/lib/json-rpc.js.map +0 -1
  205. package/dist/esm/src/registration/proof-of-work-types.d.ts +0 -8
  206. package/dist/esm/src/registration/proof-of-work-types.d.ts.map +0 -1
  207. package/dist/esm/src/registration/proof-of-work-types.js +0 -2
  208. package/dist/esm/src/registration/proof-of-work-types.js.map +0 -1
  209. package/dist/esm/src/registration/registration-types.d.ts +0 -18
  210. package/dist/esm/src/registration/registration-types.d.ts.map +0 -1
  211. package/dist/esm/src/registration/registration-types.js +0 -2
  212. package/dist/esm/src/registration/registration-types.js.map +0 -1
  213. package/dist/esm/tests/common-scenario-validator.d.ts +0 -11
  214. package/dist/esm/tests/common-scenario-validator.d.ts.map +0 -1
  215. package/dist/esm/tests/common-scenario-validator.js +0 -114
  216. package/dist/esm/tests/common-scenario-validator.js.map +0 -1
  217. package/dist/esm/tests/connection/connection-manager.spec.d.ts +0 -2
  218. package/dist/esm/tests/connection/connection-manager.spec.d.ts.map +0 -1
  219. package/dist/esm/tests/connection/connection-manager.spec.js +0 -47
  220. package/dist/esm/tests/connection/connection-manager.spec.js.map +0 -1
  221. package/dist/esm/tests/connection/socket-connection.spec.d.ts +0 -2
  222. package/dist/esm/tests/connection/socket-connection.spec.d.ts.map +0 -1
  223. package/dist/esm/tests/connection/socket-connection.spec.js +0 -125
  224. package/dist/esm/tests/connection/socket-connection.spec.js.map +0 -1
  225. package/dist/esm/tests/cors/http-api.browser.d.ts +0 -2
  226. package/dist/esm/tests/cors/http-api.browser.d.ts.map +0 -1
  227. package/dist/esm/tests/cors/http-api.browser.js +0 -60
  228. package/dist/esm/tests/cors/http-api.browser.js.map +0 -1
  229. package/dist/esm/tests/cors/ping.browser.d.ts +0 -2
  230. package/dist/esm/tests/cors/ping.browser.d.ts.map +0 -1
  231. package/dist/esm/tests/cors/ping.browser.js +0 -7
  232. package/dist/esm/tests/cors/ping.browser.js.map +0 -1
  233. package/dist/esm/tests/dwn-process-message.spec.d.ts +0 -2
  234. package/dist/esm/tests/dwn-process-message.spec.d.ts.map +0 -1
  235. package/dist/esm/tests/dwn-process-message.spec.js +0 -172
  236. package/dist/esm/tests/dwn-process-message.spec.js.map +0 -1
  237. package/dist/esm/tests/dwn-server.spec.d.ts +0 -2
  238. package/dist/esm/tests/dwn-server.spec.d.ts.map +0 -1
  239. package/dist/esm/tests/dwn-server.spec.js +0 -49
  240. package/dist/esm/tests/dwn-server.spec.js.map +0 -1
  241. package/dist/esm/tests/http-api.spec.d.ts +0 -2
  242. package/dist/esm/tests/http-api.spec.d.ts.map +0 -1
  243. package/dist/esm/tests/http-api.spec.js +0 -775
  244. package/dist/esm/tests/http-api.spec.js.map +0 -1
  245. package/dist/esm/tests/json-rpc-socket.spec.d.ts +0 -2
  246. package/dist/esm/tests/json-rpc-socket.spec.d.ts.map +0 -1
  247. package/dist/esm/tests/json-rpc-socket.spec.js +0 -225
  248. package/dist/esm/tests/json-rpc-socket.spec.js.map +0 -1
  249. package/dist/esm/tests/plugins/data-store-sqlite.d.ts +0 -17
  250. package/dist/esm/tests/plugins/data-store-sqlite.d.ts.map +0 -1
  251. package/dist/esm/tests/plugins/data-store-sqlite.js +0 -23
  252. package/dist/esm/tests/plugins/data-store-sqlite.js.map +0 -1
  253. package/dist/esm/tests/plugins/event-log-sqlite.d.ts +0 -17
  254. package/dist/esm/tests/plugins/event-log-sqlite.d.ts.map +0 -1
  255. package/dist/esm/tests/plugins/event-log-sqlite.js +0 -23
  256. package/dist/esm/tests/plugins/event-log-sqlite.js.map +0 -1
  257. package/dist/esm/tests/plugins/event-stream-in-memory.d.ts +0 -17
  258. package/dist/esm/tests/plugins/event-stream-in-memory.d.ts.map +0 -1
  259. package/dist/esm/tests/plugins/event-stream-in-memory.js +0 -21
  260. package/dist/esm/tests/plugins/event-stream-in-memory.js.map +0 -1
  261. package/dist/esm/tests/plugins/message-store-sqlite.d.ts +0 -17
  262. package/dist/esm/tests/plugins/message-store-sqlite.d.ts.map +0 -1
  263. package/dist/esm/tests/plugins/message-store-sqlite.js +0 -23
  264. package/dist/esm/tests/plugins/message-store-sqlite.js.map +0 -1
  265. package/dist/esm/tests/plugins/resumable-task-store-sqlite.d.ts +0 -17
  266. package/dist/esm/tests/plugins/resumable-task-store-sqlite.d.ts.map +0 -1
  267. package/dist/esm/tests/plugins/resumable-task-store-sqlite.js +0 -23
  268. package/dist/esm/tests/plugins/resumable-task-store-sqlite.js.map +0 -1
  269. package/dist/esm/tests/process-handler.spec.d.ts +0 -2
  270. package/dist/esm/tests/process-handler.spec.d.ts.map +0 -1
  271. package/dist/esm/tests/process-handler.spec.js +0 -60
  272. package/dist/esm/tests/process-handler.spec.js.map +0 -1
  273. package/dist/esm/tests/registration/proof-of-work-manager.spec.d.ts +0 -2
  274. package/dist/esm/tests/registration/proof-of-work-manager.spec.d.ts.map +0 -1
  275. package/dist/esm/tests/registration/proof-of-work-manager.spec.js +0 -157
  276. package/dist/esm/tests/registration/proof-of-work-manager.spec.js.map +0 -1
  277. package/dist/esm/tests/rpc-subscribe-close.spec.d.ts +0 -2
  278. package/dist/esm/tests/rpc-subscribe-close.spec.d.ts.map +0 -1
  279. package/dist/esm/tests/rpc-subscribe-close.spec.js +0 -81
  280. package/dist/esm/tests/rpc-subscribe-close.spec.js.map +0 -1
  281. package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.d.ts +0 -2
  282. package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.d.ts.map +0 -1
  283. package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.js +0 -73
  284. package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.js.map +0 -1
  285. package/dist/esm/tests/scenarios/registration.spec.d.ts +0 -2
  286. package/dist/esm/tests/scenarios/registration.spec.d.ts.map +0 -1
  287. package/dist/esm/tests/scenarios/registration.spec.js +0 -507
  288. package/dist/esm/tests/scenarios/registration.spec.js.map +0 -1
  289. package/dist/esm/tests/scenarios/web5-connect.spec.d.ts +0 -2
  290. package/dist/esm/tests/scenarios/web5-connect.spec.d.ts.map +0 -1
  291. package/dist/esm/tests/scenarios/web5-connect.spec.js +0 -137
  292. package/dist/esm/tests/scenarios/web5-connect.spec.js.map +0 -1
  293. package/dist/esm/tests/test-dwn.d.ts +0 -7
  294. package/dist/esm/tests/test-dwn.d.ts.map +0 -1
  295. package/dist/esm/tests/test-dwn.js +0 -34
  296. package/dist/esm/tests/test-dwn.js.map +0 -1
  297. package/dist/esm/tests/utils.d.ts +0 -46
  298. package/dist/esm/tests/utils.d.ts.map +0 -1
  299. package/dist/esm/tests/utils.js +0 -116
  300. package/dist/esm/tests/utils.js.map +0 -1
  301. package/dist/esm/tests/ws-api.spec.d.ts +0 -2
  302. package/dist/esm/tests/ws-api.spec.d.ts.map +0 -1
  303. package/dist/esm/tests/ws-api.spec.js +0 -327
  304. package/dist/esm/tests/ws-api.spec.js.map +0 -1
  305. package/src/json-rpc-socket.ts +0 -155
  306. package/src/lib/http-server-shutdown-handler.ts +0 -79
  307. package/src/lib/json-rpc.ts +0 -126
  308. package/src/registration/proof-of-work-types.ts +0 -7
  309. package/src/registration/registration-types.ts +0 -18
@@ -2,9 +2,6 @@ export type DwnServerConfig = typeof config;
2
2
  export declare const config: {
3
3
  /**
4
4
  * Used to populate the `server` property returned by the `/info` endpoint.
5
- *
6
- * If running using `npm` the `process.env.npm_package_name` variable exists and we use that,
7
- * otherwise we fall back on the use defined `DWN_SERVER_PACKAGE_NAME` or `@enbox/dwn-server`.
8
5
  */
9
6
  serverName: string;
10
7
  /**
@@ -30,26 +27,144 @@ export declare const config: {
30
27
  * Used to populate the `version` and `sdkVersion` properties returned by the `/info` endpoint.
31
28
  *
32
29
  * The `version` and `sdkVersion` are pulled from `package.json` at runtime.
33
- * If running using `npm` the `process.env.npm_package_json` variable exists as the filepath, so we use that.
34
- * Otherwise we check to see if a specific `DWN_SERVER_PACKAGE_JSON` exists, if it does we use that.
35
- * Finally if both of those options don't exist we resort to the path within the docker server image, located at `/dwn-server/package.json`
30
+ * If `DWN_SERVER_PACKAGE_JSON` is set, we use that path.
31
+ * Otherwise we resort to the path within the docker server image, located at `/dwn-server/package.json`.
36
32
  */
37
33
  packageJsonPath: string;
34
+ /**
35
+ * Maximum size of data that can be provided with a RecordsWrite.
36
+ * Request bodies up to this size are buffered fully into memory, so the
37
+ * default should be conservative enough to prevent memory exhaustion from
38
+ * concurrent large uploads. Operators can raise the limit via the
39
+ * `MAX_RECORD_DATA_SIZE` env var (e.g. `'1gb'`).
40
+ */
38
41
  maxRecordDataSize: number;
42
+ /**
43
+ * Maximum number of unacknowledged subscription events the server will send
44
+ * per subscription before pausing delivery. Clients must send `rpc.ack` to
45
+ * advance the window. Configurable via `DWN_MAX_IN_FLIGHT` env var.
46
+ */
47
+ maxInFlight: number;
39
48
  webSocketSupport: boolean;
40
49
  /**
41
- * Path to DWN Event Stream plugin to use. Default single-node implementation will be used if left empty.
50
+ * Path to DWN EventLog plugin to use. Default in-memory implementation will be used if left empty.
51
+ * Also accepts the legacy `DWN_EVENT_STREAM_PLUGIN_PATH` env var for backward compatibility.
42
52
  */
43
- eventStreamPluginPath: string;
53
+ eventLogPluginPath: string;
44
54
  messageStore: string;
45
55
  dataStore: string;
46
- eventLog: string;
56
+ stateIndex: string;
47
57
  resumableTaskStore: string;
58
+ /**
59
+ * PostgreSQL connection pool tuning. When multiple DWN stores share the same
60
+ * Postgres connection URL, a single shared pool is used instead of one pool
61
+ * per store (which would be 4 pools x 10 default connections = 40 connections).
62
+ */
63
+ pgPoolMin: number;
64
+ pgPoolMax: number;
65
+ pgPoolIdleTimeout: number;
48
66
  registrationStoreUrl: string;
49
67
  registrationProofOfWorkSeed: string;
50
68
  registrationProofOfWorkEnabled: boolean;
51
69
  registrationProofOfWorkInitialMaxHash: string;
52
70
  termsOfServiceFilePath: string;
71
+ providerAuthEnabled: boolean;
72
+ providerAuthAuthorizeUrl: string;
73
+ providerAuthTokenUrl: string;
74
+ providerAuthRefreshUrl: string;
75
+ providerAuthManagementUrl: string;
76
+ providerAuthPluginPath: string;
77
+ providerAuthJwtSecret: string;
78
+ providerAuthJwtJwksUrl: string;
53
79
  logLevel: string;
80
+ /**
81
+ * Bearer token for the admin API. If unset (or empty), the admin API is disabled entirely.
82
+ * Can also be read from a file path via `DWN_ADMIN_TOKEN_FILE` (useful for Docker secrets).
83
+ */
84
+ adminToken: string;
85
+ /**
86
+ * Maximum number of recent DWN activity events retained in the in-memory
87
+ * ring buffer for the admin `/events` endpoint. Defaults to 10,000.
88
+ */
89
+ adminActivityLogCapacity: number;
90
+ /**
91
+ * Interval (in seconds) at which Prometheus gauge metrics are updated from
92
+ * the admin store. Defaults to 30 seconds.
93
+ */
94
+ adminMetricsUpdateIntervalSeconds: number;
95
+ /**
96
+ * Default maximum number of messages a tenant may store. 0 = unlimited (default).
97
+ * Per-tenant overrides are managed via the admin API.
98
+ */
99
+ quotaMaxMessages: number;
100
+ /**
101
+ * Default maximum data storage in bytes a tenant may use. 0 = unlimited (default).
102
+ * Per-tenant overrides are managed via the admin API.
103
+ */
104
+ quotaMaxStorageBytes: number;
105
+ /**
106
+ * Maximum age of audit log entries in days. Entries older than this are purged.
107
+ * 0 = no age limit (default: 90 days).
108
+ *
109
+ * @see https://github.com/enboxorg/enbox/issues/394
110
+ */
111
+ auditLogMaxAgeDays: number;
112
+ /**
113
+ * Maximum number of audit log rows to retain. Oldest entries are purged when exceeded.
114
+ * 0 = no row limit (default: 100000).
115
+ *
116
+ * @see https://github.com/enboxorg/enbox/issues/394
117
+ */
118
+ auditLogMaxRows: number;
119
+ /**
120
+ * Maximum HTTP requests per second per IP address. Set to 0 to disable.
121
+ * Defaults to 30 req/s which is generous for normal usage while limiting abuse.
122
+ * Can be reconfigured at runtime via the admin `PATCH /config` endpoint.
123
+ */
124
+ rateLimitRequestsPerSecond: number;
125
+ /**
126
+ * Maximum burst size for per-IP rate limiting. Allows short spikes above the
127
+ * sustained rate without triggering 429s. Defaults to 50.
128
+ */
129
+ rateLimitBurst: number;
130
+ /**
131
+ * Maximum DWN requests per second per tenant DID. Set to 0 to disable.
132
+ * Defaults to 20 req/s. Applies to both HTTP and WebSocket transports.
133
+ * Can be reconfigured at runtime via the admin `PATCH /config` endpoint.
134
+ */
135
+ rateLimitTenantRequestsPerSecond: number;
136
+ /**
137
+ * Maximum burst size for per-tenant rate limiting. Defaults to 50.
138
+ */
139
+ rateLimitTenantBurst: number;
140
+ /**
141
+ * Enable endpoint forwarding: when a RecordsWrite/RecordsDelete is processed,
142
+ * forward the original signed message to the tenant's other DWN service
143
+ * endpoints (discovered via DID resolution). Disabled by default.
144
+ */
145
+ forwardingEnabled: boolean;
146
+ /**
147
+ * Enable protocol-aware record delivery: when a RecordsWrite/RecordsDelete is
148
+ * processed at a protocol path with `$delivery`, proactively deliver to
149
+ * participants' DWN endpoints. Disabled by default.
150
+ */
151
+ deliveryEnabled: boolean;
152
+ /**
153
+ * Maximum number of concurrent outbound delivery/forwarding requests.
154
+ * Prevents unbounded parallelism when delivering to many providers.
155
+ * Defaults to 10.
156
+ */
157
+ deliveryMaxConcurrency: number;
158
+ /**
159
+ * TTL in seconds for caching DID document service endpoint resolution results.
160
+ * Avoids resolving the same DID document on every delivery. Defaults to 300 (5 min).
161
+ */
162
+ deliveryEndpointCacheTtlSeconds: number;
163
+ /**
164
+ * TTL in seconds for the recently-forwarded messageCid deduplication cache.
165
+ * Messages with CIDs in this cache are not forwarded again, reducing redundant
166
+ * outbound requests between peer endpoints. Defaults to 60.
167
+ */
168
+ forwardingDeduplicationTtlSeconds: number;
54
169
  };
55
170
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG,OAAO,MAAM,CAAC;AAE5C,eAAO,MAAM,MAAM;IACjB;;;;;OAKG;;IAGH;;;;OAIG;;IAGH;;OAEG;;IAGH;;;;;;;OAOG;;IAGH;;;;;;;OAOG;;;;IAQH;;OAEG;;;;;;;;;;;;CAkBJ,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG,OAAO,MAAM,CAAC;AAE5C,eAAO,MAAM,MAAM;IACjB;;OAEG;;IAGH;;;;OAIG;;IAGH;;OAEG;;IAGH;;;;;;;OAOG;;IAGH;;;;;;OAMG;;IAEH;;;;;;OAMG;;IAGH;;;;OAIG;;;IAMH;;;OAGG;;;;;;IASH;;;;OAIG;;;;;;;;;;;;;;;;;;IAyBH;;;OAGG;;IAOH;;;OAGG;;IAGH;;;OAGG;;IAOH;;;OAGG;;IAGH;;;OAGG;;IAOH;;;;;OAKG;;IAGH;;;;;OAKG;;IAOH;;;;OAIG;;IAGH;;;OAGG;;IAGH;;;;OAIG;;IAGH;;OAEG;;IAOH;;;;OAIG;;IAGH;;;;OAIG;;IAGH;;;;OAIG;;IAGH;;;OAGG;;IAGH;;;;OAIG;;CAEJ,CAAC"}
@@ -1,12 +1,10 @@
1
+ import { readFileSync } from 'fs';
1
2
  import bytes from 'bytes';
2
3
  export const config = {
3
4
  /**
4
5
  * Used to populate the `server` property returned by the `/info` endpoint.
5
- *
6
- * If running using `npm` the `process.env.npm_package_name` variable exists and we use that,
7
- * otherwise we fall back on the use defined `DWN_SERVER_PACKAGE_NAME` or `@enbox/dwn-server`.
8
6
  */
9
- serverName: process.env.npm_package_name || process.env.DWN_SERVER_PACKAGE_NAME || '@enbox/dwn-server',
7
+ serverName: process.env.DWN_SERVER_PACKAGE_NAME || '@enbox/dwn-server',
10
8
  /**
11
9
  * The base external URL of this DWN.
12
10
  * This is used to construct URL paths such as the `Request URI` in the Web5 Connect flow.
@@ -30,31 +28,175 @@ export const config = {
30
28
  * Used to populate the `version` and `sdkVersion` properties returned by the `/info` endpoint.
31
29
  *
32
30
  * The `version` and `sdkVersion` are pulled from `package.json` at runtime.
33
- * If running using `npm` the `process.env.npm_package_json` variable exists as the filepath, so we use that.
34
- * Otherwise we check to see if a specific `DWN_SERVER_PACKAGE_JSON` exists, if it does we use that.
35
- * Finally if both of those options don't exist we resort to the path within the docker server image, located at `/dwn-server/package.json`
31
+ * If `DWN_SERVER_PACKAGE_JSON` is set, we use that path.
32
+ * Otherwise we resort to the path within the docker server image, located at `/dwn-server/package.json`.
33
+ */
34
+ packageJsonPath: process.env.DWN_SERVER_PACKAGE_JSON || '/dwn-server/package.json',
35
+ /**
36
+ * Maximum size of data that can be provided with a RecordsWrite.
37
+ * Request bodies up to this size are buffered fully into memory, so the
38
+ * default should be conservative enough to prevent memory exhaustion from
39
+ * concurrent large uploads. Operators can raise the limit via the
40
+ * `MAX_RECORD_DATA_SIZE` env var (e.g. `'1gb'`).
36
41
  */
37
- packageJsonPath: process.env.npm_package_json || process.env.DWN_SERVER_PACKAGE_JSON || '/dwn-server/package.json',
38
- // max size of data that can be provided with a RecordsWrite
39
- maxRecordDataSize: bytes(process.env.MAX_RECORD_DATA_SIZE || '1gb'),
42
+ maxRecordDataSize: bytes(process.env.MAX_RECORD_DATA_SIZE || '100mb'),
43
+ /**
44
+ * Maximum number of unacknowledged subscription events the server will send
45
+ * per subscription before pausing delivery. Clients must send `rpc.ack` to
46
+ * advance the window. Configurable via `DWN_MAX_IN_FLIGHT` env var.
47
+ */
48
+ maxInFlight: parseInt(process.env.DWN_MAX_IN_FLIGHT || '32'),
40
49
  // whether to enable 'ws:'
41
50
  webSocketSupport: { on: true, off: false }[process.env.DS_WEBSOCKET_SERVER] ?? true,
42
51
  /**
43
- * Path to DWN Event Stream plugin to use. Default single-node implementation will be used if left empty.
52
+ * Path to DWN EventLog plugin to use. Default in-memory implementation will be used if left empty.
53
+ * Also accepts the legacy `DWN_EVENT_STREAM_PLUGIN_PATH` env var for backward compatibility.
44
54
  */
45
- eventStreamPluginPath: process.env.DWN_EVENT_STREAM_PLUGIN_PATH,
55
+ eventLogPluginPath: process.env.DWN_EVENT_LOG_PLUGIN_PATH || process.env.DWN_EVENT_STREAM_PLUGIN_PATH,
46
56
  // where to store persistent data
47
57
  messageStore: process.env.DWN_STORAGE_MESSAGES || process.env.DWN_STORAGE || 'level://data',
48
58
  dataStore: process.env.DWN_STORAGE_DATA || process.env.DWN_STORAGE || 'level://data',
49
- eventLog: process.env.DWN_STORAGE_EVENTS || process.env.DWN_STORAGE || 'level://data',
59
+ stateIndex: process.env.DWN_STORAGE_STATE_INDEX || process.env.DWN_STORAGE || 'level://data',
50
60
  resumableTaskStore: process.env.DWN_STORAGE_RESUMABLE_TASKS || process.env.DWN_STORAGE || 'level://data',
61
+ /**
62
+ * PostgreSQL connection pool tuning. When multiple DWN stores share the same
63
+ * Postgres connection URL, a single shared pool is used instead of one pool
64
+ * per store (which would be 4 pools x 10 default connections = 40 connections).
65
+ */
66
+ pgPoolMin: parseInt(process.env.DWN_PG_POOL_MIN || '5'),
67
+ pgPoolMax: parseInt(process.env.DWN_PG_POOL_MAX || '30'),
68
+ pgPoolIdleTimeout: parseInt(process.env.DWN_PG_POOL_IDLE_TIMEOUT || '30000'),
51
69
  // tenant registration feature configuration
52
70
  registrationStoreUrl: process.env.DWN_REGISTRATION_STORE_URL || process.env.DWN_STORAGE,
53
71
  registrationProofOfWorkSeed: process.env.DWN_REGISTRATION_PROOF_OF_WORK_SEED,
54
72
  registrationProofOfWorkEnabled: process.env.DWN_REGISTRATION_PROOF_OF_WORK_ENABLED === 'true',
55
73
  registrationProofOfWorkInitialMaxHash: process.env.DWN_REGISTRATION_PROOF_OF_WORK_INITIAL_MAX_HASH,
56
74
  termsOfServiceFilePath: process.env.DWN_TERMS_OF_SERVICE_FILE_PATH,
75
+ // Provider auth configuration for paid DWN registration
76
+ providerAuthEnabled: process.env.DWN_PROVIDER_AUTH_ENABLED === 'true',
77
+ providerAuthAuthorizeUrl: process.env.DWN_PROVIDER_AUTH_AUTHORIZE_URL,
78
+ providerAuthTokenUrl: process.env.DWN_PROVIDER_AUTH_TOKEN_URL,
79
+ providerAuthRefreshUrl: process.env.DWN_PROVIDER_AUTH_REFRESH_URL,
80
+ providerAuthManagementUrl: process.env.DWN_PROVIDER_AUTH_MANAGEMENT_URL,
81
+ providerAuthPluginPath: process.env.DWN_PROVIDER_AUTH_PLUGIN_PATH,
82
+ providerAuthJwtSecret: process.env.DWN_PROVIDER_AUTH_JWT_SECRET,
83
+ providerAuthJwtJwksUrl: process.env.DWN_PROVIDER_AUTH_JWT_JWKS_URL,
57
84
  // log level - trace/debug/info/warn/error
58
85
  logLevel: process.env.DWN_SERVER_LOG_LEVEL || 'INFO',
86
+ /**
87
+ * Bearer token for the admin API. If unset (or empty), the admin API is disabled entirely.
88
+ * Can also be read from a file path via `DWN_ADMIN_TOKEN_FILE` (useful for Docker secrets).
89
+ */
90
+ adminToken: process.env.DWN_ADMIN_TOKEN || (process.env.DWN_ADMIN_TOKEN_FILE
91
+ ? readAdminTokenFromFile(process.env.DWN_ADMIN_TOKEN_FILE)
92
+ : undefined),
93
+ /**
94
+ * Maximum number of recent DWN activity events retained in the in-memory
95
+ * ring buffer for the admin `/events` endpoint. Defaults to 10,000.
96
+ */
97
+ adminActivityLogCapacity: parseInt(process.env.DWN_ADMIN_ACTIVITY_LOG_CAPACITY || '10000'),
98
+ /**
99
+ * Interval (in seconds) at which Prometheus gauge metrics are updated from
100
+ * the admin store. Defaults to 30 seconds.
101
+ */
102
+ adminMetricsUpdateIntervalSeconds: parseInt(process.env.DWN_ADMIN_METRICS_UPDATE_INTERVAL || '30'),
103
+ // ---------------------------------------------------------------------------
104
+ // Per-tenant storage quotas
105
+ // ---------------------------------------------------------------------------
106
+ /**
107
+ * Default maximum number of messages a tenant may store. 0 = unlimited (default).
108
+ * Per-tenant overrides are managed via the admin API.
109
+ */
110
+ quotaMaxMessages: parseInt(process.env.DWN_QUOTA_MAX_MESSAGES || '0'),
111
+ /**
112
+ * Default maximum data storage in bytes a tenant may use. 0 = unlimited (default).
113
+ * Per-tenant overrides are managed via the admin API.
114
+ */
115
+ quotaMaxStorageBytes: parseInt(process.env.DWN_QUOTA_MAX_STORAGE_BYTES || '0'),
116
+ // ---------------------------------------------------------------------------
117
+ // Audit log retention
118
+ // ---------------------------------------------------------------------------
119
+ /**
120
+ * Maximum age of audit log entries in days. Entries older than this are purged.
121
+ * 0 = no age limit (default: 90 days).
122
+ *
123
+ * @see https://github.com/enboxorg/enbox/issues/394
124
+ */
125
+ auditLogMaxAgeDays: parseInt(process.env.DWN_AUDIT_LOG_MAX_AGE_DAYS || '90'),
126
+ /**
127
+ * Maximum number of audit log rows to retain. Oldest entries are purged when exceeded.
128
+ * 0 = no row limit (default: 100000).
129
+ *
130
+ * @see https://github.com/enboxorg/enbox/issues/394
131
+ */
132
+ auditLogMaxRows: parseInt(process.env.DWN_AUDIT_LOG_MAX_ROWS || '100000'),
133
+ // ---------------------------------------------------------------------------
134
+ // Rate limiting
135
+ // ---------------------------------------------------------------------------
136
+ /**
137
+ * Maximum HTTP requests per second per IP address. Set to 0 to disable.
138
+ * Defaults to 30 req/s which is generous for normal usage while limiting abuse.
139
+ * Can be reconfigured at runtime via the admin `PATCH /config` endpoint.
140
+ */
141
+ rateLimitRequestsPerSecond: parseInt(process.env.DWN_RATE_LIMIT_REQUESTS_PER_SECOND || '30'),
142
+ /**
143
+ * Maximum burst size for per-IP rate limiting. Allows short spikes above the
144
+ * sustained rate without triggering 429s. Defaults to 50.
145
+ */
146
+ rateLimitBurst: parseInt(process.env.DWN_RATE_LIMIT_BURST || '50'),
147
+ /**
148
+ * Maximum DWN requests per second per tenant DID. Set to 0 to disable.
149
+ * Defaults to 20 req/s. Applies to both HTTP and WebSocket transports.
150
+ * Can be reconfigured at runtime via the admin `PATCH /config` endpoint.
151
+ */
152
+ rateLimitTenantRequestsPerSecond: parseInt(process.env.DWN_RATE_LIMIT_TENANT_REQUESTS_PER_SECOND || '20'),
153
+ /**
154
+ * Maximum burst size for per-tenant rate limiting. Defaults to 50.
155
+ */
156
+ rateLimitTenantBurst: parseInt(process.env.DWN_RATE_LIMIT_TENANT_BURST || '50'),
157
+ // ---------------------------------------------------------------------------
158
+ // Record delivery & endpoint forwarding
159
+ // ---------------------------------------------------------------------------
160
+ /**
161
+ * Enable endpoint forwarding: when a RecordsWrite/RecordsDelete is processed,
162
+ * forward the original signed message to the tenant's other DWN service
163
+ * endpoints (discovered via DID resolution). Disabled by default.
164
+ */
165
+ forwardingEnabled: process.env.DWN_FORWARDING_ENABLED === 'true',
166
+ /**
167
+ * Enable protocol-aware record delivery: when a RecordsWrite/RecordsDelete is
168
+ * processed at a protocol path with `$delivery`, proactively deliver to
169
+ * participants' DWN endpoints. Disabled by default.
170
+ */
171
+ deliveryEnabled: process.env.DWN_DELIVERY_ENABLED === 'true',
172
+ /**
173
+ * Maximum number of concurrent outbound delivery/forwarding requests.
174
+ * Prevents unbounded parallelism when delivering to many providers.
175
+ * Defaults to 10.
176
+ */
177
+ deliveryMaxConcurrency: parseInt(process.env.DWN_DELIVERY_MAX_CONCURRENCY || '10'),
178
+ /**
179
+ * TTL in seconds for caching DID document service endpoint resolution results.
180
+ * Avoids resolving the same DID document on every delivery. Defaults to 300 (5 min).
181
+ */
182
+ deliveryEndpointCacheTtlSeconds: parseInt(process.env.DWN_DELIVERY_ENDPOINT_CACHE_TTL || '300'),
183
+ /**
184
+ * TTL in seconds for the recently-forwarded messageCid deduplication cache.
185
+ * Messages with CIDs in this cache are not forwarded again, reducing redundant
186
+ * outbound requests between peer endpoints. Defaults to 60.
187
+ */
188
+ forwardingDeduplicationTtlSeconds: parseInt(process.env.DWN_FORWARDING_DEDUP_TTL || '60'),
59
189
  };
190
+ /**
191
+ * Reads the admin token from a file path, trimming whitespace.
192
+ * Returns `undefined` if the file cannot be read.
193
+ */
194
+ function readAdminTokenFromFile(filePath) {
195
+ try {
196
+ return readFileSync(filePath).toString().trim() || undefined;
197
+ }
198
+ catch {
199
+ return undefined;
200
+ }
201
+ }
60
202
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB;;;;;OAKG;IACH,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,mBAAmB;IAEtG;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,uBAAuB;IAE5D;;OAEG;IACH,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;IAE7C;;;;;;;OAOG;IACH,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,WAAW;IAEzD;;;;;;;OAOG;IACH,eAAe,EAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAK,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,0BAA0B;IACpH,4DAA4D;IAC5D,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,KAAK,CAAC;IAEnE,0BAA0B;IAC1B,gBAAgB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI;IAEnF;;OAEG;IACH,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B;IAE/D,iCAAiC;IACjC,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,cAAc;IAC3F,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,cAAc;IACpF,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,cAAc;IACrF,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,cAAc;IAExG,4CAA4C;IAC5C,oBAAoB,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW;IACvF,2BAA2B,EAAE,OAAO,CAAC,GAAG,CAAC,mCAAmC;IAC5E,8BAA8B,EAAE,OAAO,CAAC,GAAG,CAAC,sCAAsC,KAAK,MAAM;IAC7F,qCAAqC,EAAE,OAAO,CAAC,GAAG,CAAC,+CAA+C;IAClG,sBAAsB,EAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B;IAElE,0CAA0C;IAC1C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,MAAM;CACrD,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,48 @@
1
- import type { Dwn } from "@enbox/dwn-sdk-js";
2
- import type { IncomingMessage } from "http";
3
- import type { WebSocket } from 'ws';
4
- import { SocketConnection } from "./socket-connection.js";
1
+ import type { Dwn } from '@enbox/dwn-sdk-js';
2
+ import type { ServerWebSocket } from 'bun';
3
+ import type { ActivityLog } from '../admin/activity-log.js';
4
+ import type { AdminConnectionSnapshot } from '../admin/types.js';
5
+ import type { AdminStore } from '../admin/admin-store.js';
6
+ import type { DwnServerConfig } from '../config.js';
7
+ import type { MessageProcessedHook } from '../message-processed-hook.js';
8
+ import type { RateLimiter } from '../rate-limiter.js';
9
+ import type { RegistrationStore } from '../registration/registration-store.js';
10
+ import type { WsData } from '../http-api.js';
11
+ import { SocketConnection } from './socket-connection.js';
5
12
  /**
6
13
  * Interface for managing `WebSocket` connections as they arrive.
7
14
  */
8
15
  export interface ConnectionManager {
9
- /** connect handler used for the `WebSockets` `'connection'` event. */
10
- connect(socket: WebSocket, request?: IncomingMessage): Promise<void>;
16
+ /** connect handler invoked when a new WebSocket connection is established. */
17
+ connect(socket: ServerWebSocket<WsData>): Promise<void>;
11
18
  /** closes all of the connections */
12
19
  closeAll(): Promise<void>;
20
+ /** Returns the number of active connections. */
21
+ getConnectionCount(): number;
22
+ /** Returns the total number of active subscriptions across all connections. */
23
+ getSubscriptionCount(): number;
24
+ /** Returns serializable snapshots of all active connections. */
25
+ getConnectionSnapshots(): AdminConnectionSnapshot[];
13
26
  }
14
27
  /**
15
28
  * A Simple In Memory ConnectionManager implementation.
16
- * It uses a `Map<WebSocket, SocketConnection>` to manage connections.
29
+ * It uses a `Map<ServerWebSocket, SocketConnection>` to manage connections.
17
30
  */
18
31
  export declare class InMemoryConnectionManager implements ConnectionManager {
19
32
  private dwn;
20
33
  private connections;
21
- constructor(dwn: Dwn, connections?: Map<WebSocket, SocketConnection>);
22
- connect(socket: WebSocket): Promise<void>;
34
+ private maxInFlight?;
35
+ private activityLog?;
36
+ private adminStore?;
37
+ private registrationStore?;
38
+ private serverConfig?;
39
+ private tenantRateLimiter?;
40
+ private messageProcessedHooks?;
41
+ constructor(dwn: Dwn, connections?: Map<ServerWebSocket<WsData>, SocketConnection>, maxInFlight?: number, activityLog?: ActivityLog, adminStore?: AdminStore, registrationStore?: RegistrationStore, serverConfig?: DwnServerConfig, tenantRateLimiter?: RateLimiter, messageProcessedHooks?: MessageProcessedHook[]);
42
+ connect(socket: ServerWebSocket<WsData>): Promise<void>;
23
43
  closeAll(): Promise<void>;
44
+ getConnectionCount(): number;
45
+ getSubscriptionCount(): number;
46
+ getConnectionSnapshots(): AdminConnectionSnapshot[];
24
47
  }
25
48
  //# sourceMappingURL=connection-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../../../src/connection/connection-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,oCAAoC;IACpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAED;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,iBAAiB;IACrD,OAAO,CAAC,GAAG;IAAO,OAAO,CAAC,WAAW;gBAA7B,GAAG,EAAE,GAAG,EAAU,WAAW,GAAE,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAa;IAEzF,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IASzC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAKhC"}
1
+ {"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../../../src/connection/connection-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,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,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,oCAAoC;IACpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,gDAAgD;IAChD,kBAAkB,IAAI,MAAM,CAAC;IAC7B,+EAA+E;IAC/E,oBAAoB,IAAI,MAAM,CAAC;IAC/B,gEAAgE;IAChE,sBAAsB,IAAI,uBAAuB,EAAE,CAAC;CACrD;AAED;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,iBAAiB;IAE/D,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,UAAU,CAAC;IACnB,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,qBAAqB,CAAC;gBARtB,GAAG,EAAE,GAAG,EACR,WAAW,GAAE,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAa,EACvE,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,WAAW,EACzB,UAAU,CAAC,EAAE,UAAU,EACvB,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,YAAY,CAAC,EAAE,eAAe,EAC9B,iBAAiB,CAAC,EAAE,WAAW,EAC/B,qBAAqB,CAAC,EAAE,oBAAoB,EAAE;IAGlD,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,kBAAkB,IAAI,MAAM;IAI5B,oBAAoB,IAAI,MAAM;IAQ9B,sBAAsB,IAAI,uBAAuB,EAAE;CAOpD"}
@@ -1,26 +1,59 @@
1
- import { SocketConnection } from "./socket-connection.js";
1
+ import { SocketConnection } from './socket-connection.js';
2
2
  /**
3
3
  * A Simple In Memory ConnectionManager implementation.
4
- * It uses a `Map<WebSocket, SocketConnection>` to manage connections.
4
+ * It uses a `Map<ServerWebSocket, SocketConnection>` to manage connections.
5
5
  */
6
6
  export class InMemoryConnectionManager {
7
7
  dwn;
8
8
  connections;
9
- constructor(dwn, connections = new Map()) {
9
+ maxInFlight;
10
+ activityLog;
11
+ adminStore;
12
+ registrationStore;
13
+ serverConfig;
14
+ tenantRateLimiter;
15
+ messageProcessedHooks;
16
+ constructor(dwn, connections = new Map(), maxInFlight, activityLog, adminStore, registrationStore, serverConfig, tenantRateLimiter, messageProcessedHooks) {
10
17
  this.dwn = dwn;
11
18
  this.connections = connections;
19
+ this.maxInFlight = maxInFlight;
20
+ this.activityLog = activityLog;
21
+ this.adminStore = adminStore;
22
+ this.registrationStore = registrationStore;
23
+ this.serverConfig = serverConfig;
24
+ this.tenantRateLimiter = tenantRateLimiter;
25
+ this.messageProcessedHooks = messageProcessedHooks;
12
26
  }
13
27
  async connect(socket) {
14
28
  const connection = new SocketConnection(socket, this.dwn, () => {
15
29
  // this is the onClose handler to clean up any closed connections.
16
30
  this.connections.delete(socket);
17
- });
31
+ }, this.maxInFlight, this.activityLog, this.adminStore, this.registrationStore, this.serverConfig, this.tenantRateLimiter, this.messageProcessedHooks);
32
+ // Attach the connection to the ws.data so Bun's websocket handlers can delegate to it.
33
+ socket.data.connection = connection;
18
34
  this.connections.set(socket, connection);
19
35
  }
20
36
  async closeAll() {
21
37
  const closePromises = [];
22
- this.connections.forEach(connection => closePromises.push(connection.close()));
38
+ this.connections.forEach((connection) => closePromises.push(connection.close()));
23
39
  await Promise.all(closePromises);
24
40
  }
41
+ getConnectionCount() {
42
+ return this.connections.size;
43
+ }
44
+ getSubscriptionCount() {
45
+ let count = 0;
46
+ this.connections.forEach((conn) => {
47
+ count += conn.subscriptionCount;
48
+ });
49
+ return count;
50
+ }
51
+ getConnectionSnapshots() {
52
+ const snapshots = [];
53
+ this.connections.forEach((conn) => {
54
+ snapshots.push(conn.toSnapshot());
55
+ });
56
+ return snapshots;
57
+ }
25
58
  }
26
59
  //# sourceMappingURL=connection-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../../../../src/connection/connection-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAY1D;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IAChB;IAAkB;IAAtC,YAAoB,GAAQ,EAAU,cAAgD,IAAI,GAAG,EAAE;QAA3E,QAAG,GAAH,GAAG,CAAK;QAAU,gBAAW,GAAX,WAAW,CAA8C;IAAG,CAAC;IAEnG,KAAK,CAAC,OAAO,CAAC,MAAiB;QAC7B,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;YAC7D,kEAAkE;YAClE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,aAAa,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/E,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;CACF"}
1
+ {"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../../../../src/connection/connection-manager.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAkB1D;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IAE1B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IATV,YACU,GAAQ,EACR,cAA8D,IAAI,GAAG,EAAE,EACvE,WAAoB,EACpB,WAAyB,EACzB,UAAuB,EACvB,iBAAqC,EACrC,YAA8B,EAC9B,iBAA+B,EAC/B,qBAA8C;QAR9C,QAAG,GAAH,GAAG,CAAK;QACR,gBAAW,GAAX,WAAW,CAA4D;QACvE,gBAAW,GAAX,WAAW,CAAS;QACpB,gBAAW,GAAX,WAAW,CAAc;QACzB,eAAU,GAAV,UAAU,CAAa;QACvB,sBAAiB,GAAjB,iBAAiB,CAAoB;QACrC,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,sBAAiB,GAAjB,iBAAiB,CAAc;QAC/B,0BAAqB,GAArB,qBAAqB,CAAyB;IACrD,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,MAA+B;QAC3C,MAAM,UAAU,GAAG,IAAI,gBAAgB,CACrC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;YACrB,kEAAkE;YAClE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC,EACD,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAClC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,qBAAqB,CAC/G,CAAC;QAEF,uFAAuF;QACvF,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAEpC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,aAAa,GAAoB,EAAE,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,oBAAoB;QAClB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sBAAsB;QACpB,MAAM,SAAS,GAA8B,EAAE,CAAC;QAChD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,53 @@
1
+ import type { SubscriptionMessage } from '@enbox/dwn-sdk-js';
2
+ import type { JsonRpcId, JsonRpcSuccessResponse } from '@enbox/dwn-clients';
3
+ /** Default maximum number of unacknowledged events before pausing delivery. */
4
+ export declare const DEFAULT_MAX_IN_FLIGHT = 32;
5
+ /** Maximum buffer size before the subscription is force-closed to prevent OOM. */
6
+ export declare const MAX_BUFFER_SIZE = 1000;
7
+ /**
8
+ * Per-subscription flow controller that enforces a sliding window of
9
+ * unacknowledged events. When the window is full, incoming events are
10
+ * buffered. When the client sends `rpc.ack` with a cursor, events up
11
+ * to that cursor are acknowledged and buffered events are flushed.
12
+ *
13
+ * If the buffer exceeds {@link MAX_BUFFER_SIZE}, the subscription is
14
+ * closed via the provided `onOverflow` callback to prevent unbounded
15
+ * memory growth.
16
+ */
17
+ export declare class FlowController {
18
+ private readonly subscriptionId;
19
+ private readonly maxInFlight;
20
+ private readonly send;
21
+ private readonly onOverflow;
22
+ /** Ordered list of cursors for events that have been sent but not yet acknowledged. */
23
+ private unacked;
24
+ /** Buffer of events waiting to be sent once the window opens. */
25
+ private buffer;
26
+ /** Whether the controller has been closed due to overflow. */
27
+ private closed;
28
+ constructor(subscriptionId: JsonRpcId, maxInFlight: number, send: (response: JsonRpcSuccessResponse) => void, onOverflow: () => void);
29
+ /**
30
+ * Accept an incoming {@link SubscriptionMessage} from the EventLog listener.
31
+ * If the window has room, send immediately. Otherwise buffer.
32
+ */
33
+ push(message: SubscriptionMessage): void;
34
+ /**
35
+ * Process an `rpc.ack` for this subscription. Acknowledges all events up
36
+ * to and including the given cursor, then flushes buffered events into the
37
+ * newly opened window slots.
38
+ */
39
+ ack(cursor: string): void;
40
+ /**
41
+ * Returns the number of events currently in flight (sent but unacknowledged).
42
+ */
43
+ get inFlightCount(): number;
44
+ /**
45
+ * Returns the number of events currently buffered (waiting to be sent).
46
+ */
47
+ get bufferCount(): number;
48
+ /**
49
+ * Sends a single message over the wire and tracks its cursor.
50
+ */
51
+ private sendMessage;
52
+ }
53
+ //# sourceMappingURL=flow-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-controller.d.ts","sourceRoot":"","sources":["../../../../src/connection/flow-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAM5E,+EAA+E;AAC/E,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,kFAAkF;AAClF,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;;;;;;;;GASG;AACH,qBAAa,cAAc;IAWvB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAb7B,uFAAuF;IACvF,OAAO,CAAC,OAAO,CAAgB;IAE/B,iEAAiE;IACjE,OAAO,CAAC,MAAM,CAA6B;IAE3C,8DAA8D;IAC9D,OAAO,CAAC,MAAM,CAAS;gBAGJ,cAAc,EAAE,SAAS,EACzB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,EAChD,UAAU,EAAE,MAAM,IAAI;IAGzC;;;OAGG;IACI,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAuB/C;;;;OAIG;IACI,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAsBhC;;OAEG;IACH,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED;;OAEG;IACH,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED;;OAEG;IACH,OAAO,CAAC,WAAW;CAKpB"}