@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.
- package/LICENSE +3 -2
- package/README.md +115 -215
- package/dist/esm/src/admin/activity-log.d.ts +44 -0
- package/dist/esm/src/admin/activity-log.d.ts.map +1 -0
- package/dist/esm/src/admin/activity-log.js +85 -0
- package/dist/esm/src/admin/activity-log.js.map +1 -0
- package/dist/esm/src/admin/admin-api.d.ts +61 -0
- package/dist/esm/src/admin/admin-api.d.ts.map +1 -0
- package/dist/esm/src/admin/admin-api.js +1047 -0
- package/dist/esm/src/admin/admin-api.js.map +1 -0
- package/dist/esm/src/admin/admin-auth.d.ts +9 -0
- package/dist/esm/src/admin/admin-auth.d.ts.map +1 -0
- package/dist/esm/src/admin/admin-auth.js +45 -0
- package/dist/esm/src/admin/admin-auth.js.map +1 -0
- package/dist/esm/src/admin/admin-store.d.ts +111 -0
- package/dist/esm/src/admin/admin-store.d.ts.map +1 -0
- package/dist/esm/src/admin/admin-store.js +376 -0
- package/dist/esm/src/admin/admin-store.js.map +1 -0
- package/dist/esm/src/admin/audit-log.d.ts +94 -0
- package/dist/esm/src/admin/audit-log.d.ts.map +1 -0
- package/dist/esm/src/admin/audit-log.js +220 -0
- package/dist/esm/src/admin/audit-log.js.map +1 -0
- package/dist/esm/src/admin/index.d.ts +10 -0
- package/dist/esm/src/admin/index.d.ts.map +1 -0
- package/dist/esm/src/admin/index.js +7 -0
- package/dist/esm/src/admin/index.js.map +1 -0
- package/dist/esm/src/admin/types.d.ts +306 -0
- package/dist/esm/src/admin/types.d.ts.map +1 -0
- package/dist/esm/src/admin/types.js +2 -0
- package/dist/esm/src/admin/types.js.map +1 -0
- package/dist/esm/src/admin/webhook-manager.d.ts +55 -0
- package/dist/esm/src/admin/webhook-manager.d.ts.map +1 -0
- package/dist/esm/src/admin/webhook-manager.js +184 -0
- package/dist/esm/src/admin/webhook-manager.js.map +1 -0
- package/dist/esm/src/config.d.ts +124 -9
- package/dist/esm/src/config.d.ts.map +1 -1
- package/dist/esm/src/config.js +155 -13
- package/dist/esm/src/config.js.map +1 -1
- package/dist/esm/src/connection/connection-manager.d.ts +32 -9
- package/dist/esm/src/connection/connection-manager.d.ts.map +1 -1
- package/dist/esm/src/connection/connection-manager.js +38 -5
- package/dist/esm/src/connection/connection-manager.js.map +1 -1
- package/dist/esm/src/connection/flow-controller.d.ts +53 -0
- package/dist/esm/src/connection/flow-controller.d.ts.map +1 -0
- package/dist/esm/src/connection/flow-controller.js +101 -0
- package/dist/esm/src/connection/flow-controller.js.map +1 -0
- package/dist/esm/src/connection/socket-connection.d.ts +54 -18
- package/dist/esm/src/connection/socket-connection.d.ts.map +1 -1
- package/dist/esm/src/connection/socket-connection.js +102 -40
- package/dist/esm/src/connection/socket-connection.js.map +1 -1
- package/dist/esm/src/delivery-service.d.ts +43 -0
- package/dist/esm/src/delivery-service.d.ts.map +1 -0
- package/dist/esm/src/delivery-service.js +574 -0
- package/dist/esm/src/delivery-service.js.map +1 -0
- package/dist/esm/src/dwn-error.d.ts +10 -1
- package/dist/esm/src/dwn-error.d.ts.map +1 -1
- package/dist/esm/src/dwn-error.js +9 -0
- package/dist/esm/src/dwn-error.js.map +1 -1
- package/dist/esm/src/dwn-server.d.ts +13 -6
- package/dist/esm/src/dwn-server.d.ts.map +1 -1
- package/dist/esm/src/dwn-server.js +199 -24
- package/dist/esm/src/dwn-server.js.map +1 -1
- package/dist/esm/src/http-api.d.ts +28 -13
- package/dist/esm/src/http-api.d.ts.map +1 -1
- package/dist/esm/src/http-api.js +649 -374
- package/dist/esm/src/http-api.js.map +1 -1
- package/dist/esm/src/index.d.ts +6 -2
- package/dist/esm/src/index.d.ts.map +1 -1
- package/dist/esm/src/index.js +4 -1
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/json-rpc-api.js +2 -1
- package/dist/esm/src/json-rpc-api.js.map +1 -1
- package/dist/esm/src/json-rpc-handlers/dwn/process-message.d.ts.map +1 -1
- package/dist/esm/src/json-rpc-handlers/dwn/process-message.js +109 -7
- package/dist/esm/src/json-rpc-handlers/dwn/process-message.js.map +1 -1
- package/dist/esm/src/json-rpc-handlers/subscription/ack.d.ts +20 -0
- package/dist/esm/src/json-rpc-handlers/subscription/ack.d.ts.map +1 -0
- package/dist/esm/src/json-rpc-handlers/subscription/ack.js +41 -0
- package/dist/esm/src/json-rpc-handlers/subscription/ack.js.map +1 -0
- package/dist/esm/src/json-rpc-handlers/subscription/close.d.ts.map +1 -1
- package/dist/esm/src/json-rpc-handlers/subscription/close.js +1 -1
- package/dist/esm/src/json-rpc-handlers/subscription/close.js.map +1 -1
- package/dist/esm/src/json-rpc-handlers/subscription/index.d.ts +1 -0
- package/dist/esm/src/json-rpc-handlers/subscription/index.d.ts.map +1 -1
- package/dist/esm/src/json-rpc-handlers/subscription/index.js +1 -0
- package/dist/esm/src/json-rpc-handlers/subscription/index.js.map +1 -1
- package/dist/esm/src/lib/json-rpc-router.d.ts +25 -8
- package/dist/esm/src/lib/json-rpc-router.d.ts.map +1 -1
- package/dist/esm/src/lib/json-rpc-router.js.map +1 -1
- package/dist/esm/src/lib/sql-utils.d.ts +6 -0
- package/dist/esm/src/lib/sql-utils.d.ts.map +1 -0
- package/dist/esm/src/lib/sql-utils.js +8 -0
- package/dist/esm/src/lib/sql-utils.js.map +1 -0
- package/dist/esm/src/main.js +0 -6
- package/dist/esm/src/main.js.map +1 -1
- package/dist/esm/src/message-processed-hook.d.ts +35 -0
- package/dist/esm/src/message-processed-hook.d.ts.map +1 -0
- package/dist/esm/src/message-processed-hook.js +2 -0
- package/dist/esm/src/message-processed-hook.js.map +1 -0
- package/dist/esm/src/metrics.d.ts +14 -2
- package/dist/esm/src/metrics.d.ts.map +1 -1
- package/dist/esm/src/metrics.js +41 -1
- package/dist/esm/src/metrics.js.map +1 -1
- package/dist/esm/src/plugins/event-log-nats.d.ts +25 -0
- package/dist/esm/src/plugins/event-log-nats.d.ts.map +1 -0
- package/dist/esm/src/plugins/event-log-nats.js +379 -0
- package/dist/esm/src/plugins/event-log-nats.js.map +1 -0
- package/dist/esm/src/rate-limiter.d.ts +60 -0
- package/dist/esm/src/rate-limiter.d.ts.map +1 -0
- package/dist/esm/src/rate-limiter.js +116 -0
- package/dist/esm/src/rate-limiter.js.map +1 -0
- package/dist/esm/src/registration/jwt-provider-auth-plugin.d.ts +53 -0
- package/dist/esm/src/registration/jwt-provider-auth-plugin.d.ts.map +1 -0
- package/dist/esm/src/registration/jwt-provider-auth-plugin.js +90 -0
- package/dist/esm/src/registration/jwt-provider-auth-plugin.js.map +1 -0
- package/dist/esm/src/registration/open-auth-handler.d.ts +37 -0
- package/dist/esm/src/registration/open-auth-handler.d.ts.map +1 -0
- package/dist/esm/src/registration/open-auth-handler.js +214 -0
- package/dist/esm/src/registration/open-auth-handler.js.map +1 -0
- package/dist/esm/src/registration/proof-of-work-manager.d.ts +1 -1
- package/dist/esm/src/registration/proof-of-work-manager.d.ts.map +1 -1
- package/dist/esm/src/registration/proof-of-work-manager.js +3 -3
- package/dist/esm/src/registration/proof-of-work-manager.js.map +1 -1
- package/dist/esm/src/registration/provider-auth-plugin.d.ts +46 -0
- package/dist/esm/src/registration/provider-auth-plugin.d.ts.map +1 -0
- package/dist/esm/src/registration/provider-auth-plugin.js +29 -0
- package/dist/esm/src/registration/provider-auth-plugin.js.map +1 -0
- package/dist/esm/src/registration/registration-manager.d.ts +28 -5
- package/dist/esm/src/registration/registration-manager.d.ts.map +1 -1
- package/dist/esm/src/registration/registration-manager.js +83 -12
- package/dist/esm/src/registration/registration-manager.js.map +1 -1
- package/dist/esm/src/registration/registration-store.d.ts +83 -3
- package/dist/esm/src/registration/registration-store.d.ts.map +1 -1
- package/dist/esm/src/registration/registration-store.js +248 -11
- package/dist/esm/src/registration/registration-store.js.map +1 -1
- package/dist/esm/src/storage.d.ts +5 -5
- package/dist/esm/src/storage.d.ts.map +1 -1
- package/dist/esm/src/storage.js +105 -24
- package/dist/esm/src/storage.js.map +1 -1
- package/dist/esm/src/web5-connect/sql-ttl-cache.d.ts.map +1 -1
- package/dist/esm/src/web5-connect/sql-ttl-cache.js +11 -3
- package/dist/esm/src/web5-connect/sql-ttl-cache.js.map +1 -1
- package/dist/esm/src/web5-connect/web5-connect-server.d.ts.map +1 -1
- package/dist/esm/src/web5-connect/web5-connect-server.js +2 -2
- package/dist/esm/src/web5-connect/web5-connect-server.js.map +1 -1
- package/dist/esm/src/ws-api.d.ts +18 -4
- package/dist/esm/src/ws-api.d.ts.map +1 -1
- package/dist/esm/src/ws-api.js +12 -16
- package/dist/esm/src/ws-api.js.map +1 -1
- package/package.json +34 -53
- package/src/admin/activity-log.ts +100 -0
- package/src/admin/admin-api.ts +1308 -0
- package/src/admin/admin-auth.ts +56 -0
- package/src/admin/admin-store.ts +515 -0
- package/src/admin/audit-log.ts +327 -0
- package/src/admin/index.ts +34 -0
- package/src/admin/types.ts +352 -0
- package/src/admin/webhook-manager.ts +245 -0
- package/src/config.ts +190 -22
- package/src/connection/connection-manager.ts +67 -17
- package/src/connection/flow-controller.ts +117 -0
- package/src/connection/socket-connection.ts +144 -67
- package/src/delivery-service.ts +740 -0
- package/src/dwn-error.ts +11 -2
- package/src/dwn-server.ts +254 -39
- package/src/http-api.ts +736 -392
- package/src/index.ts +13 -2
- package/src/json-rpc-api.ts +2 -1
- package/src/json-rpc-handlers/dwn/process-message.ts +149 -15
- package/src/json-rpc-handlers/subscription/ack.ts +63 -0
- package/src/json-rpc-handlers/subscription/close.ts +5 -9
- package/src/json-rpc-handlers/subscription/index.ts +1 -0
- package/src/lib/json-rpc-router.ts +26 -11
- package/src/lib/sql-utils.ts +7 -0
- package/src/main.ts +0 -8
- package/src/message-processed-hook.ts +33 -0
- package/src/metrics.ts +57 -8
- package/src/plugins/event-log-nats.ts +466 -0
- package/src/process-handlers.ts +5 -5
- package/src/rate-limiter.ts +143 -0
- package/src/registration/jwt-provider-auth-plugin.ts +119 -0
- package/src/registration/open-auth-handler.ts +263 -0
- package/src/registration/proof-of-work-manager.ts +11 -10
- package/src/registration/provider-auth-plugin.ts +84 -0
- package/src/registration/registration-manager.ts +129 -31
- package/src/registration/registration-store.ts +332 -22
- package/src/storage.ts +136 -40
- package/src/web5-connect/sql-ttl-cache.ts +12 -5
- package/src/web5-connect/web5-connect-server.ts +9 -8
- package/src/ws-api.ts +39 -26
- package/dist/cjs/index.js +0 -6811
- package/dist/cjs/package.json +0 -1
- package/dist/esm/src/json-rpc-socket.d.ts +0 -39
- package/dist/esm/src/json-rpc-socket.d.ts.map +0 -1
- package/dist/esm/src/json-rpc-socket.js +0 -125
- package/dist/esm/src/json-rpc-socket.js.map +0 -1
- package/dist/esm/src/lib/http-server-shutdown-handler.d.ts +0 -10
- package/dist/esm/src/lib/http-server-shutdown-handler.d.ts.map +0 -1
- package/dist/esm/src/lib/http-server-shutdown-handler.js +0 -65
- package/dist/esm/src/lib/http-server-shutdown-handler.js.map +0 -1
- package/dist/esm/src/lib/json-rpc.d.ts +0 -54
- package/dist/esm/src/lib/json-rpc.d.ts.map +0 -1
- package/dist/esm/src/lib/json-rpc.js +0 -60
- package/dist/esm/src/lib/json-rpc.js.map +0 -1
- package/dist/esm/src/registration/proof-of-work-types.d.ts +0 -8
- package/dist/esm/src/registration/proof-of-work-types.d.ts.map +0 -1
- package/dist/esm/src/registration/proof-of-work-types.js +0 -2
- package/dist/esm/src/registration/proof-of-work-types.js.map +0 -1
- package/dist/esm/src/registration/registration-types.d.ts +0 -18
- package/dist/esm/src/registration/registration-types.d.ts.map +0 -1
- package/dist/esm/src/registration/registration-types.js +0 -2
- package/dist/esm/src/registration/registration-types.js.map +0 -1
- package/dist/esm/tests/common-scenario-validator.d.ts +0 -11
- package/dist/esm/tests/common-scenario-validator.d.ts.map +0 -1
- package/dist/esm/tests/common-scenario-validator.js +0 -114
- package/dist/esm/tests/common-scenario-validator.js.map +0 -1
- package/dist/esm/tests/connection/connection-manager.spec.d.ts +0 -2
- package/dist/esm/tests/connection/connection-manager.spec.d.ts.map +0 -1
- package/dist/esm/tests/connection/connection-manager.spec.js +0 -47
- package/dist/esm/tests/connection/connection-manager.spec.js.map +0 -1
- package/dist/esm/tests/connection/socket-connection.spec.d.ts +0 -2
- package/dist/esm/tests/connection/socket-connection.spec.d.ts.map +0 -1
- package/dist/esm/tests/connection/socket-connection.spec.js +0 -125
- package/dist/esm/tests/connection/socket-connection.spec.js.map +0 -1
- package/dist/esm/tests/cors/http-api.browser.d.ts +0 -2
- package/dist/esm/tests/cors/http-api.browser.d.ts.map +0 -1
- package/dist/esm/tests/cors/http-api.browser.js +0 -60
- package/dist/esm/tests/cors/http-api.browser.js.map +0 -1
- package/dist/esm/tests/cors/ping.browser.d.ts +0 -2
- package/dist/esm/tests/cors/ping.browser.d.ts.map +0 -1
- package/dist/esm/tests/cors/ping.browser.js +0 -7
- package/dist/esm/tests/cors/ping.browser.js.map +0 -1
- package/dist/esm/tests/dwn-process-message.spec.d.ts +0 -2
- package/dist/esm/tests/dwn-process-message.spec.d.ts.map +0 -1
- package/dist/esm/tests/dwn-process-message.spec.js +0 -172
- package/dist/esm/tests/dwn-process-message.spec.js.map +0 -1
- package/dist/esm/tests/dwn-server.spec.d.ts +0 -2
- package/dist/esm/tests/dwn-server.spec.d.ts.map +0 -1
- package/dist/esm/tests/dwn-server.spec.js +0 -49
- package/dist/esm/tests/dwn-server.spec.js.map +0 -1
- package/dist/esm/tests/http-api.spec.d.ts +0 -2
- package/dist/esm/tests/http-api.spec.d.ts.map +0 -1
- package/dist/esm/tests/http-api.spec.js +0 -775
- package/dist/esm/tests/http-api.spec.js.map +0 -1
- package/dist/esm/tests/json-rpc-socket.spec.d.ts +0 -2
- package/dist/esm/tests/json-rpc-socket.spec.d.ts.map +0 -1
- package/dist/esm/tests/json-rpc-socket.spec.js +0 -225
- package/dist/esm/tests/json-rpc-socket.spec.js.map +0 -1
- package/dist/esm/tests/plugins/data-store-sqlite.d.ts +0 -17
- package/dist/esm/tests/plugins/data-store-sqlite.d.ts.map +0 -1
- package/dist/esm/tests/plugins/data-store-sqlite.js +0 -23
- package/dist/esm/tests/plugins/data-store-sqlite.js.map +0 -1
- package/dist/esm/tests/plugins/event-log-sqlite.d.ts +0 -17
- package/dist/esm/tests/plugins/event-log-sqlite.d.ts.map +0 -1
- package/dist/esm/tests/plugins/event-log-sqlite.js +0 -23
- package/dist/esm/tests/plugins/event-log-sqlite.js.map +0 -1
- package/dist/esm/tests/plugins/event-stream-in-memory.d.ts +0 -17
- package/dist/esm/tests/plugins/event-stream-in-memory.d.ts.map +0 -1
- package/dist/esm/tests/plugins/event-stream-in-memory.js +0 -21
- package/dist/esm/tests/plugins/event-stream-in-memory.js.map +0 -1
- package/dist/esm/tests/plugins/message-store-sqlite.d.ts +0 -17
- package/dist/esm/tests/plugins/message-store-sqlite.d.ts.map +0 -1
- package/dist/esm/tests/plugins/message-store-sqlite.js +0 -23
- package/dist/esm/tests/plugins/message-store-sqlite.js.map +0 -1
- package/dist/esm/tests/plugins/resumable-task-store-sqlite.d.ts +0 -17
- package/dist/esm/tests/plugins/resumable-task-store-sqlite.d.ts.map +0 -1
- package/dist/esm/tests/plugins/resumable-task-store-sqlite.js +0 -23
- package/dist/esm/tests/plugins/resumable-task-store-sqlite.js.map +0 -1
- package/dist/esm/tests/process-handler.spec.d.ts +0 -2
- package/dist/esm/tests/process-handler.spec.d.ts.map +0 -1
- package/dist/esm/tests/process-handler.spec.js +0 -60
- package/dist/esm/tests/process-handler.spec.js.map +0 -1
- package/dist/esm/tests/registration/proof-of-work-manager.spec.d.ts +0 -2
- package/dist/esm/tests/registration/proof-of-work-manager.spec.d.ts.map +0 -1
- package/dist/esm/tests/registration/proof-of-work-manager.spec.js +0 -157
- package/dist/esm/tests/registration/proof-of-work-manager.spec.js.map +0 -1
- package/dist/esm/tests/rpc-subscribe-close.spec.d.ts +0 -2
- package/dist/esm/tests/rpc-subscribe-close.spec.d.ts.map +0 -1
- package/dist/esm/tests/rpc-subscribe-close.spec.js +0 -81
- package/dist/esm/tests/rpc-subscribe-close.spec.js.map +0 -1
- package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.d.ts +0 -2
- package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.d.ts.map +0 -1
- package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.js +0 -73
- package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.js.map +0 -1
- package/dist/esm/tests/scenarios/registration.spec.d.ts +0 -2
- package/dist/esm/tests/scenarios/registration.spec.d.ts.map +0 -1
- package/dist/esm/tests/scenarios/registration.spec.js +0 -507
- package/dist/esm/tests/scenarios/registration.spec.js.map +0 -1
- package/dist/esm/tests/scenarios/web5-connect.spec.d.ts +0 -2
- package/dist/esm/tests/scenarios/web5-connect.spec.d.ts.map +0 -1
- package/dist/esm/tests/scenarios/web5-connect.spec.js +0 -137
- package/dist/esm/tests/scenarios/web5-connect.spec.js.map +0 -1
- package/dist/esm/tests/test-dwn.d.ts +0 -7
- package/dist/esm/tests/test-dwn.d.ts.map +0 -1
- package/dist/esm/tests/test-dwn.js +0 -34
- package/dist/esm/tests/test-dwn.js.map +0 -1
- package/dist/esm/tests/utils.d.ts +0 -46
- package/dist/esm/tests/utils.d.ts.map +0 -1
- package/dist/esm/tests/utils.js +0 -116
- package/dist/esm/tests/utils.js.map +0 -1
- package/dist/esm/tests/ws-api.spec.d.ts +0 -2
- package/dist/esm/tests/ws-api.spec.d.ts.map +0 -1
- package/dist/esm/tests/ws-api.spec.js +0 -327
- package/dist/esm/tests/ws-api.spec.js.map +0 -1
- package/src/json-rpc-socket.ts +0 -155
- package/src/lib/http-server-shutdown-handler.ts +0 -79
- package/src/lib/json-rpc.ts +0 -126
- package/src/registration/proof-of-work-types.ts +0 -7
- package/src/registration/registration-types.ts +0 -18
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for listing tenants with search, filter, and sort capabilities.
|
|
3
|
+
*
|
|
4
|
+
* @see https://github.com/enboxorg/enbox/issues/390
|
|
5
|
+
*/
|
|
6
|
+
export type TenantListOptions = {
|
|
7
|
+
/** Cursor for keyset pagination. */
|
|
8
|
+
cursor?: string;
|
|
9
|
+
/** Maximum number of results per page. */
|
|
10
|
+
limit?: number;
|
|
11
|
+
/** Substring search across tenant DIDs. */
|
|
12
|
+
search?: string;
|
|
13
|
+
/** Filter by suspension status. */
|
|
14
|
+
status?: 'active' | 'suspended';
|
|
15
|
+
/** Sort field. Default: `did`. */
|
|
16
|
+
sort?: 'did' | 'storage' | 'messages';
|
|
17
|
+
/** Sort direction. Default: `asc`. */
|
|
18
|
+
order?: 'asc' | 'desc';
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Summary of a tenant for list endpoints.
|
|
22
|
+
*/
|
|
23
|
+
export type AdminTenantSummary = {
|
|
24
|
+
did: string;
|
|
25
|
+
messageCount: number;
|
|
26
|
+
dataStorageBytes: number;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Detailed information about a single tenant.
|
|
30
|
+
*/
|
|
31
|
+
export type AdminTenantDetail = {
|
|
32
|
+
did: string;
|
|
33
|
+
isActive: boolean;
|
|
34
|
+
suspended: boolean;
|
|
35
|
+
registration: {
|
|
36
|
+
termsOfServiceHash?: string;
|
|
37
|
+
} | undefined;
|
|
38
|
+
storage: {
|
|
39
|
+
messageCount: number;
|
|
40
|
+
dataStorageBytes: number;
|
|
41
|
+
protocolCount: number;
|
|
42
|
+
};
|
|
43
|
+
protocols: string[];
|
|
44
|
+
quota?: {
|
|
45
|
+
maxMessages: number;
|
|
46
|
+
maxStorageBytes: number;
|
|
47
|
+
source: 'tenant' | 'global' | 'unlimited';
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Per-tenant storage and usage statistics.
|
|
52
|
+
*/
|
|
53
|
+
export type TenantStats = {
|
|
54
|
+
messageCount: number;
|
|
55
|
+
dataStorageBytes: number;
|
|
56
|
+
protocolCount: number;
|
|
57
|
+
protocols: string[];
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Global server statistics.
|
|
61
|
+
*/
|
|
62
|
+
export type GlobalStats = {
|
|
63
|
+
tenantCount: number;
|
|
64
|
+
totalMessages: number;
|
|
65
|
+
totalDataBytes: number;
|
|
66
|
+
totalProtocols: number;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Health check result for a single backend component.
|
|
70
|
+
*/
|
|
71
|
+
export type HealthCheckResult = {
|
|
72
|
+
status: 'healthy' | 'unhealthy';
|
|
73
|
+
latencyMs: number;
|
|
74
|
+
error?: string;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Full deep health check response.
|
|
78
|
+
*/
|
|
79
|
+
export type AdminHealthCheck = {
|
|
80
|
+
status: 'healthy' | 'unhealthy';
|
|
81
|
+
uptime: number;
|
|
82
|
+
version: string | undefined;
|
|
83
|
+
checks: Record<string, HealthCheckResult>;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Server statistics response.
|
|
87
|
+
*/
|
|
88
|
+
export type AdminServerStats = {
|
|
89
|
+
tenants: {
|
|
90
|
+
total: number;
|
|
91
|
+
suspended: number;
|
|
92
|
+
};
|
|
93
|
+
storage: {
|
|
94
|
+
totalMessages: number;
|
|
95
|
+
totalDataBytes: number;
|
|
96
|
+
totalProtocols: number;
|
|
97
|
+
};
|
|
98
|
+
connections: {
|
|
99
|
+
websocket: {
|
|
100
|
+
active: number;
|
|
101
|
+
subscriptions: number;
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
registration: {
|
|
105
|
+
proofOfWorkEnabled: boolean;
|
|
106
|
+
};
|
|
107
|
+
uptime: number;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Paginated response wrapper.
|
|
111
|
+
*/
|
|
112
|
+
export type PaginatedResponse<T> = {
|
|
113
|
+
data: T[];
|
|
114
|
+
cursor?: string;
|
|
115
|
+
totalCount: number;
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* A single DWN activity event captured by the in-memory ring buffer.
|
|
119
|
+
*/
|
|
120
|
+
export type AdminActivityEvent = {
|
|
121
|
+
/** Monotonically increasing event ID (used as cursor). */
|
|
122
|
+
id: number;
|
|
123
|
+
/** ISO-8601 timestamp of the event. */
|
|
124
|
+
timestamp: string;
|
|
125
|
+
/** The tenant DID the request targeted. */
|
|
126
|
+
tenant: string;
|
|
127
|
+
/** DWN interface (e.g. `Records`, `Protocols`, `Events`). */
|
|
128
|
+
interface: string;
|
|
129
|
+
/** DWN method (e.g. `Write`, `Query`, `Read`, `Subscribe`). */
|
|
130
|
+
method: string;
|
|
131
|
+
/** DWN status code returned (e.g. 200, 202, 401). */
|
|
132
|
+
statusCode: number;
|
|
133
|
+
/** Transport used (`http` or `ws`). */
|
|
134
|
+
transport: 'http' | 'ws';
|
|
135
|
+
/** Data size in bytes (if applicable). */
|
|
136
|
+
dataSizeBytes?: number;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Snapshot of a single subscription's flow control state.
|
|
140
|
+
*/
|
|
141
|
+
export type AdminSubscriptionSnapshot = {
|
|
142
|
+
/** Subscription JSON-RPC ID. */
|
|
143
|
+
id: string | number;
|
|
144
|
+
/** Number of events sent but not yet acknowledged. */
|
|
145
|
+
inflight: number;
|
|
146
|
+
/** Number of events buffered waiting for the window to open. */
|
|
147
|
+
buffered: number;
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Snapshot of a single WebSocket connection for the admin inspector.
|
|
151
|
+
*/
|
|
152
|
+
export type AdminConnectionSnapshot = {
|
|
153
|
+
/** Unique connection identifier. */
|
|
154
|
+
id: string;
|
|
155
|
+
/** ISO-8601 timestamp when the connection was established. */
|
|
156
|
+
connectedAt: string;
|
|
157
|
+
/** Number of active subscriptions on this connection. */
|
|
158
|
+
subscriptionCount: number;
|
|
159
|
+
/** Per-subscription flow control state. */
|
|
160
|
+
subscriptions: AdminSubscriptionSnapshot[];
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Per-tenant storage quota limits.
|
|
164
|
+
* A value of 0 (or `undefined`) means the global default applies.
|
|
165
|
+
*/
|
|
166
|
+
export type TenantQuota = {
|
|
167
|
+
/** Tenant DID this quota applies to. */
|
|
168
|
+
did: string;
|
|
169
|
+
/** Maximum number of messages the tenant may store (0 = use global default). */
|
|
170
|
+
maxMessages: number;
|
|
171
|
+
/** Maximum data storage in bytes (0 = use global default). */
|
|
172
|
+
maxStorageBytes: number;
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* Request body for setting a tenant quota via the admin API.
|
|
176
|
+
*/
|
|
177
|
+
export type TenantQuotaInput = {
|
|
178
|
+
maxMessages?: number;
|
|
179
|
+
maxStorageBytes?: number;
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* Current tenant usage relative to their quota.
|
|
183
|
+
*/
|
|
184
|
+
export type TenantQuotaStatus = {
|
|
185
|
+
quota: {
|
|
186
|
+
maxMessages: number;
|
|
187
|
+
maxStorageBytes: number;
|
|
188
|
+
source: 'tenant' | 'global' | 'unlimited';
|
|
189
|
+
};
|
|
190
|
+
usage: {
|
|
191
|
+
messageCount: number;
|
|
192
|
+
storageBytes: number;
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
/**
|
|
196
|
+
* Summary of rate limit state for a single key (IP or tenant DID).
|
|
197
|
+
*/
|
|
198
|
+
export type RateLimitEntry = {
|
|
199
|
+
key: string;
|
|
200
|
+
tokens: number;
|
|
201
|
+
maxTokens: number;
|
|
202
|
+
refillRate: number;
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
205
|
+
* Admin response for the rate-limits endpoint.
|
|
206
|
+
*/
|
|
207
|
+
export type RateLimitStatus = {
|
|
208
|
+
config: {
|
|
209
|
+
perIp: {
|
|
210
|
+
requestsPerSecond: number;
|
|
211
|
+
burst: number;
|
|
212
|
+
enabled: boolean;
|
|
213
|
+
};
|
|
214
|
+
perTenant: {
|
|
215
|
+
requestsPerSecond: number;
|
|
216
|
+
burst: number;
|
|
217
|
+
enabled: boolean;
|
|
218
|
+
};
|
|
219
|
+
};
|
|
220
|
+
activeEntries: {
|
|
221
|
+
ip: number;
|
|
222
|
+
tenant: number;
|
|
223
|
+
};
|
|
224
|
+
};
|
|
225
|
+
/**
|
|
226
|
+
* Runtime-changeable server settings (subset of DwnServerConfig).
|
|
227
|
+
*/
|
|
228
|
+
export type RuntimeConfig = {
|
|
229
|
+
logLevel: string;
|
|
230
|
+
maxRecordDataSize: number;
|
|
231
|
+
maxInFlight: number;
|
|
232
|
+
quotaMaxMessages: number;
|
|
233
|
+
quotaMaxStorageBytes: number;
|
|
234
|
+
rateLimitRequestsPerSecond: number;
|
|
235
|
+
rateLimitBurst: number;
|
|
236
|
+
rateLimitTenantRequestsPerSecond: number;
|
|
237
|
+
rateLimitTenantBurst: number;
|
|
238
|
+
};
|
|
239
|
+
/**
|
|
240
|
+
* Input for PATCH /admin/api/config. All fields are optional.
|
|
241
|
+
*/
|
|
242
|
+
export type RuntimeConfigPatch = Partial<RuntimeConfig>;
|
|
243
|
+
/**
|
|
244
|
+
* Metadata-only view of a DWN message for the tenant data browser.
|
|
245
|
+
* Does not include decrypted content or encoded message bytes.
|
|
246
|
+
*/
|
|
247
|
+
export type AdminMessageSummary = {
|
|
248
|
+
messageCid: string;
|
|
249
|
+
interface: string | null;
|
|
250
|
+
method: string | null;
|
|
251
|
+
protocol: string | null;
|
|
252
|
+
protocolPath: string | null;
|
|
253
|
+
schema: string | null;
|
|
254
|
+
dataFormat: string | null;
|
|
255
|
+
dataSize: number | null;
|
|
256
|
+
dateCreated: string | null;
|
|
257
|
+
messageTimestamp: string | null;
|
|
258
|
+
};
|
|
259
|
+
/**
|
|
260
|
+
* Protocol summary with record count per protocol.
|
|
261
|
+
*/
|
|
262
|
+
export type AdminProtocolSummary = {
|
|
263
|
+
protocol: string;
|
|
264
|
+
messageCount: number;
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* Complete tenant data export for backup/migration.
|
|
268
|
+
*
|
|
269
|
+
* @see https://github.com/enboxorg/enbox/issues/391
|
|
270
|
+
*/
|
|
271
|
+
export type TenantExport = {
|
|
272
|
+
metadata: {
|
|
273
|
+
tenant: string;
|
|
274
|
+
exportedAt: string;
|
|
275
|
+
messageCount: number;
|
|
276
|
+
dataRecordCount: number;
|
|
277
|
+
};
|
|
278
|
+
messages: Record<string, unknown>[];
|
|
279
|
+
dataRecords: Record<string, unknown>[];
|
|
280
|
+
};
|
|
281
|
+
/**
|
|
282
|
+
* A registered webhook endpoint for admin event notifications.
|
|
283
|
+
*
|
|
284
|
+
* @see https://github.com/enboxorg/enbox/issues/395
|
|
285
|
+
*/
|
|
286
|
+
export type AdminWebhook = {
|
|
287
|
+
/** Auto-generated webhook ID. */
|
|
288
|
+
id: string;
|
|
289
|
+
/** URL to POST events to. */
|
|
290
|
+
url: string;
|
|
291
|
+
/** Event patterns to subscribe to (e.g. `tenant.*`, `quota.warning`). Asterisk is wildcard. */
|
|
292
|
+
events: string[];
|
|
293
|
+
/** Optional shared secret for HMAC-SHA256 signature verification. */
|
|
294
|
+
secret?: string;
|
|
295
|
+
/** ISO-8601 timestamp of creation. */
|
|
296
|
+
createdAt: string;
|
|
297
|
+
};
|
|
298
|
+
/**
|
|
299
|
+
* Input for creating a webhook.
|
|
300
|
+
*/
|
|
301
|
+
export type AdminWebhookInput = {
|
|
302
|
+
url: string;
|
|
303
|
+
events: string[];
|
|
304
|
+
secret?: string;
|
|
305
|
+
};
|
|
306
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/admin/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/admin/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Dialect } from '@enbox/dwn-sql-store';
|
|
2
|
+
import type { AdminWebhook, AdminWebhookInput } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Payload delivered to webhook endpoints.
|
|
5
|
+
*/
|
|
6
|
+
export type WebhookPayload = {
|
|
7
|
+
/** Unique delivery ID. */
|
|
8
|
+
id: string;
|
|
9
|
+
/** ISO-8601 timestamp. */
|
|
10
|
+
timestamp: string;
|
|
11
|
+
/** Event type (e.g. `tenant.suspend`, `quota.warning`). */
|
|
12
|
+
event: string;
|
|
13
|
+
/** Optional target (e.g. tenant DID). */
|
|
14
|
+
target?: string;
|
|
15
|
+
/** Additional event data. */
|
|
16
|
+
data?: Record<string, unknown>;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Manages webhook registrations and event delivery.
|
|
20
|
+
*
|
|
21
|
+
* Webhooks are stored in a SQL table and fire asynchronously when matching
|
|
22
|
+
* events occur. Delivery includes retry logic and optional HMAC-SHA256 signatures.
|
|
23
|
+
*
|
|
24
|
+
* @see https://github.com/enboxorg/enbox/issues/395
|
|
25
|
+
*/
|
|
26
|
+
export declare class WebhookManager {
|
|
27
|
+
#private;
|
|
28
|
+
private constructor();
|
|
29
|
+
/**
|
|
30
|
+
* Creates and initializes a `WebhookManager` instance.
|
|
31
|
+
*/
|
|
32
|
+
static create(dialect: Dialect): Promise<WebhookManager>;
|
|
33
|
+
/**
|
|
34
|
+
* Registers a new webhook. Returns the created webhook (without secret echoed).
|
|
35
|
+
*/
|
|
36
|
+
register(input: AdminWebhookInput): Promise<AdminWebhook>;
|
|
37
|
+
/**
|
|
38
|
+
* Lists all registered webhooks. Secrets are redacted.
|
|
39
|
+
*/
|
|
40
|
+
list(): Promise<AdminWebhook[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Deletes a webhook by ID. Returns `true` if found and deleted.
|
|
43
|
+
*/
|
|
44
|
+
delete(id: string): Promise<boolean>;
|
|
45
|
+
/**
|
|
46
|
+
* Fires matching webhooks for a given event. Non-blocking — delivery happens
|
|
47
|
+
* asynchronously and errors are logged but never propagated.
|
|
48
|
+
*/
|
|
49
|
+
fire(event: string, target?: string, data?: Record<string, unknown>): void;
|
|
50
|
+
/**
|
|
51
|
+
* Closes the underlying database connection.
|
|
52
|
+
*/
|
|
53
|
+
close(): Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=webhook-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-manager.d.ts","sourceRoot":"","sources":["../../../../src/admin/webhook-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOlE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,0BAA0B;IAC1B,EAAE,EAAG,MAAM,CAAC;IACZ,0BAA0B;IAC1B,SAAS,EAAG,MAAM,CAAC;IACnB,2DAA2D;IAC3D,KAAK,EAAG,MAAM,CAAC;IACf,yCAAyC;IACzC,MAAM,CAAC,EAAG,MAAM,CAAC;IACjB,6BAA6B;IAC7B,IAAI,CAAC,EAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,cAAc;;IAOzB,OAAO;IAIP;;OAEG;WACiB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBrE;;OAEG;IACU,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IAsBtE;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAgB5C;;OAEG;IACU,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAajD;;;OAGG;IACI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA0FjF;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { createHmac } from 'crypto';
|
|
2
|
+
import { Kysely } from 'kysely';
|
|
3
|
+
import log from 'loglevel';
|
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
5
|
+
/**
|
|
6
|
+
* Manages webhook registrations and event delivery.
|
|
7
|
+
*
|
|
8
|
+
* Webhooks are stored in a SQL table and fire asynchronously when matching
|
|
9
|
+
* events occur. Delivery includes retry logic and optional HMAC-SHA256 signatures.
|
|
10
|
+
*
|
|
11
|
+
* @see https://github.com/enboxorg/enbox/issues/395
|
|
12
|
+
*/
|
|
13
|
+
export class WebhookManager {
|
|
14
|
+
static #tableName = 'adminWebhooks';
|
|
15
|
+
static #maxRetries = 3;
|
|
16
|
+
static #retryDelaysMs = [1000, 5000, 15000];
|
|
17
|
+
#db;
|
|
18
|
+
constructor(dialect) {
|
|
19
|
+
this.#db = new Kysely({ dialect });
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Creates and initializes a `WebhookManager` instance.
|
|
23
|
+
*/
|
|
24
|
+
static async create(dialect) {
|
|
25
|
+
const manager = new WebhookManager(dialect);
|
|
26
|
+
await manager.#initialize();
|
|
27
|
+
return manager;
|
|
28
|
+
}
|
|
29
|
+
async #initialize() {
|
|
30
|
+
await this.#db.schema
|
|
31
|
+
.createTable(WebhookManager.#tableName)
|
|
32
|
+
.ifNotExists()
|
|
33
|
+
.addColumn('id', 'text', (col) => col.primaryKey())
|
|
34
|
+
.addColumn('url', 'text', (col) => col.notNull())
|
|
35
|
+
.addColumn('events', 'text', (col) => col.notNull()) // JSON array
|
|
36
|
+
.addColumn('secret', 'text')
|
|
37
|
+
.addColumn('createdAt', 'text', (col) => col.notNull())
|
|
38
|
+
.execute();
|
|
39
|
+
}
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// CRUD
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/**
|
|
44
|
+
* Registers a new webhook. Returns the created webhook (without secret echoed).
|
|
45
|
+
*/
|
|
46
|
+
async register(input) {
|
|
47
|
+
const webhook = {
|
|
48
|
+
id: uuidv4(),
|
|
49
|
+
url: input.url,
|
|
50
|
+
events: input.events,
|
|
51
|
+
createdAt: new Date().toISOString(),
|
|
52
|
+
};
|
|
53
|
+
await this.#db
|
|
54
|
+
.insertInto(WebhookManager.#tableName)
|
|
55
|
+
.values({
|
|
56
|
+
id: webhook.id,
|
|
57
|
+
url: webhook.url,
|
|
58
|
+
events: JSON.stringify(webhook.events),
|
|
59
|
+
secret: input.secret ?? null,
|
|
60
|
+
createdAt: webhook.createdAt,
|
|
61
|
+
})
|
|
62
|
+
.execute();
|
|
63
|
+
return webhook;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Lists all registered webhooks. Secrets are redacted.
|
|
67
|
+
*/
|
|
68
|
+
async list() {
|
|
69
|
+
const rows = await this.#db
|
|
70
|
+
.selectFrom(WebhookManager.#tableName)
|
|
71
|
+
.select(['id', 'url', 'events', 'secret', 'createdAt'])
|
|
72
|
+
.orderBy('createdAt', 'asc')
|
|
73
|
+
.execute();
|
|
74
|
+
return rows.map((row) => ({
|
|
75
|
+
id: row.id,
|
|
76
|
+
url: row.url,
|
|
77
|
+
events: JSON.parse(row.events),
|
|
78
|
+
secret: row.secret ? '***' : undefined,
|
|
79
|
+
createdAt: row.createdAt,
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Deletes a webhook by ID. Returns `true` if found and deleted.
|
|
84
|
+
*/
|
|
85
|
+
async delete(id) {
|
|
86
|
+
const result = await this.#db
|
|
87
|
+
.deleteFrom(WebhookManager.#tableName)
|
|
88
|
+
.where('id', '=', id)
|
|
89
|
+
.executeTakeFirstOrThrow();
|
|
90
|
+
return Number(result.numDeletedRows) > 0;
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// Event dispatch
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
/**
|
|
96
|
+
* Fires matching webhooks for a given event. Non-blocking — delivery happens
|
|
97
|
+
* asynchronously and errors are logged but never propagated.
|
|
98
|
+
*/
|
|
99
|
+
fire(event, target, data) {
|
|
100
|
+
// Fire-and-forget.
|
|
101
|
+
this.#dispatchAll(event, target, data).catch((err) => {
|
|
102
|
+
log.error('Webhook dispatch error:', err);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async #dispatchAll(event, target, data) {
|
|
106
|
+
const rows = await this.#db
|
|
107
|
+
.selectFrom(WebhookManager.#tableName)
|
|
108
|
+
.select(['id', 'url', 'events', 'secret'])
|
|
109
|
+
.execute();
|
|
110
|
+
const payload = {
|
|
111
|
+
id: uuidv4(),
|
|
112
|
+
timestamp: new Date().toISOString(),
|
|
113
|
+
event,
|
|
114
|
+
target,
|
|
115
|
+
data,
|
|
116
|
+
};
|
|
117
|
+
const body = JSON.stringify(payload);
|
|
118
|
+
for (const row of rows) {
|
|
119
|
+
const patterns = JSON.parse(row.events);
|
|
120
|
+
if (this.#matchesEvent(event, patterns)) {
|
|
121
|
+
this.#deliver(row.url, body, row.secret).catch((err) => {
|
|
122
|
+
log.warn(`Webhook delivery failed for ${row.url}:`, err);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Checks if an event matches any of the subscription patterns.
|
|
129
|
+
* Supports wildcard patterns like `tenant.*`.
|
|
130
|
+
*/
|
|
131
|
+
#matchesEvent(event, patterns) {
|
|
132
|
+
for (const pattern of patterns) {
|
|
133
|
+
if (pattern === '*') {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
if (pattern === event) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
if (pattern.endsWith('.*')) {
|
|
140
|
+
const prefix = pattern.slice(0, -2);
|
|
141
|
+
if (event.startsWith(prefix + '.') || event === prefix) {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Delivers a webhook payload with retry logic and optional HMAC signature.
|
|
150
|
+
*/
|
|
151
|
+
async #deliver(url, body, secret) {
|
|
152
|
+
const headers = {
|
|
153
|
+
'content-type': 'application/json',
|
|
154
|
+
};
|
|
155
|
+
if (secret) {
|
|
156
|
+
const signature = createHmac('sha256', secret).update(body).digest('hex');
|
|
157
|
+
headers['x-webhook-signature'] = `sha256=${signature}`;
|
|
158
|
+
}
|
|
159
|
+
for (let attempt = 0; attempt <= WebhookManager.#maxRetries; attempt++) {
|
|
160
|
+
try {
|
|
161
|
+
const response = await fetch(url, { method: 'POST', headers, body, signal: AbortSignal.timeout(10_000) });
|
|
162
|
+
if (response.ok) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
log.warn(`Webhook ${url} returned ${response.status} (attempt ${attempt + 1})`);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
log.warn(`Webhook ${url} fetch error (attempt ${attempt + 1}):`, err);
|
|
169
|
+
}
|
|
170
|
+
// Wait before retry (skip wait on last attempt).
|
|
171
|
+
if (attempt < WebhookManager.#maxRetries) {
|
|
172
|
+
await new Promise((resolve) => setTimeout(resolve, WebhookManager.#retryDelaysMs[attempt]));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
log.error(`Webhook delivery to ${url} failed after ${WebhookManager.#maxRetries + 1} attempts`);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Closes the underlying database connection.
|
|
179
|
+
*/
|
|
180
|
+
async close() {
|
|
181
|
+
await this.#db.destroy();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=webhook-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-manager.js","sourceRoot":"","sources":["../../../../src/admin/webhook-manager.ts"],"names":[],"mappings":"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"}
|