@enbox/dwn-server 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +3 -2
- package/README.md +112 -212
- 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 +122 -3
- package/dist/esm/src/config.d.ts.map +1 -1
- package/dist/esm/src/config.js +151 -5
- package/dist/esm/src/config.js.map +1 -1
- package/dist/esm/src/connection/connection-manager.d.ts +24 -1
- package/dist/esm/src/connection/connection-manager.d.ts.map +1 -1
- package/dist/esm/src/connection/connection-manager.js +33 -2
- 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 +39 -4
- package/dist/esm/src/connection/socket-connection.d.ts.map +1 -1
- package/dist/esm/src/connection/socket-connection.js +80 -9
- 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 +8 -0
- package/dist/esm/src/dwn-server.d.ts.map +1 -1
- package/dist/esm/src/dwn-server.js +198 -12
- package/dist/esm/src/dwn-server.js.map +1 -1
- package/dist/esm/src/http-api.d.ts +19 -2
- package/dist/esm/src/http-api.d.ts.map +1 -1
- package/dist/esm/src/http-api.js +219 -19
- 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 +106 -4
- 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 +22 -4
- 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 +13 -1
- 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/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 +27 -4
- package/dist/esm/src/registration/registration-manager.d.ts.map +1 -1
- package/dist/esm/src/registration/registration-manager.js +77 -6
- 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 +4 -4
- package/dist/esm/src/storage.d.ts.map +1 -1
- package/dist/esm/src/storage.js +100 -20
- 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 +8 -1
- package/dist/esm/src/web5-connect/sql-ttl-cache.js.map +1 -1
- package/dist/esm/src/ws-api.d.ts +17 -1
- package/dist/esm/src/ws-api.d.ts.map +1 -1
- package/dist/esm/src/ws-api.js +9 -2
- package/dist/esm/src/ws-api.js.map +1 -1
- package/package.json +18 -16
- 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 +177 -5
- package/src/connection/connection-manager.ts +50 -6
- package/src/connection/flow-controller.ts +117 -0
- package/src/connection/socket-connection.ts +103 -21
- package/src/delivery-service.ts +740 -0
- package/src/dwn-error.ts +9 -0
- package/src/dwn-server.ts +242 -14
- package/src/http-api.ts +271 -30
- package/src/index.ts +13 -2
- package/src/json-rpc-api.ts +2 -1
- package/src/json-rpc-handlers/dwn/process-message.ts +140 -5
- package/src/json-rpc-handlers/subscription/ack.ts +63 -0
- package/src/json-rpc-handlers/subscription/close.ts +2 -6
- package/src/json-rpc-handlers/subscription/index.ts +1 -0
- package/src/lib/json-rpc-router.ts +22 -6
- 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 +50 -1
- package/src/plugins/event-log-nats.ts +466 -0
- 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 +1 -1
- package/src/registration/provider-auth-plugin.ts +84 -0
- package/src/registration/registration-manager.ts +108 -12
- package/src/registration/registration-store.ts +326 -17
- package/src/storage.ts +121 -27
- package/src/web5-connect/sql-ttl-cache.ts +7 -1
- package/src/ws-api.ts +30 -2
- 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/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 -113
- 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 -49
- 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 -147
- 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 -48
- 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 -782
- 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 -227
- 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 -156
- 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 -74
- 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 -511
- 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 -141
- 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 -28
- package/dist/esm/tests/test-dwn.js.map +0 -1
- package/dist/esm/tests/utils.d.ts +0 -43
- package/dist/esm/tests/utils.d.ts.map +0 -1
- package/dist/esm/tests/utils.js +0 -107
- 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 -332
- package/dist/esm/tests/ws-api.spec.js.map +0 -1
- package/src/json-rpc-socket.ts +0 -156
- 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,63 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
|
|
3
|
+
import type { JsonRpcId } from '@enbox/dwn-clients';
|
|
4
|
+
import type {
|
|
5
|
+
HandlerResponse,
|
|
6
|
+
JsonRpcHandler,
|
|
7
|
+
} from '../../lib/json-rpc-router.js';
|
|
8
|
+
|
|
9
|
+
import { createJsonRpcErrorResponse, createJsonRpcSuccessResponse, JsonRpcErrorCodes } from '@enbox/dwn-clients';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Handles `rpc.ack` — acknowledges receipt of subscription events up to the
|
|
13
|
+
* given cursor, advancing the per-subscription flow-control window.
|
|
14
|
+
*
|
|
15
|
+
* Request shape:
|
|
16
|
+
* ```json
|
|
17
|
+
* {
|
|
18
|
+
* "jsonrpc": "2.0",
|
|
19
|
+
* "method": "rpc.ack",
|
|
20
|
+
* "params": { "cursor": "<opaque-cursor>" },
|
|
21
|
+
* "subscription": { "id": "<subscription-id>" }
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* This is a notification (no `id` required), but the server sends a response
|
|
26
|
+
* if validation fails (missing params, unknown subscription, etc.).
|
|
27
|
+
*/
|
|
28
|
+
export const handleSubscriptionAck: JsonRpcHandler = async (
|
|
29
|
+
jsonRpcRequest,
|
|
30
|
+
context,
|
|
31
|
+
) => {
|
|
32
|
+
const requestId = jsonRpcRequest.id ?? uuidv4();
|
|
33
|
+
|
|
34
|
+
if (context.socketConnection === undefined) {
|
|
35
|
+
const jsonRpcResponse = createJsonRpcErrorResponse(
|
|
36
|
+
requestId, JsonRpcErrorCodes.InvalidRequest, 'socket connection does not exist'
|
|
37
|
+
);
|
|
38
|
+
return { jsonRpcResponse };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (jsonRpcRequest.subscription === undefined) {
|
|
42
|
+
const jsonRpcResponse = createJsonRpcErrorResponse(
|
|
43
|
+
requestId, JsonRpcErrorCodes.InvalidParams, 'subscription options are required'
|
|
44
|
+
);
|
|
45
|
+
return { jsonRpcResponse };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const { id: subscriptionId } = jsonRpcRequest.subscription as { id: JsonRpcId };
|
|
49
|
+
const { cursor } = (jsonRpcRequest.params ?? {}) as { cursor?: string };
|
|
50
|
+
|
|
51
|
+
if (cursor === undefined || typeof cursor !== 'string' || cursor === '') {
|
|
52
|
+
const jsonRpcResponse = createJsonRpcErrorResponse(
|
|
53
|
+
requestId, JsonRpcErrorCodes.InvalidParams, 'params.cursor is required and must be a non-empty string'
|
|
54
|
+
);
|
|
55
|
+
return { jsonRpcResponse };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const { socketConnection } = context;
|
|
59
|
+
socketConnection.ackSubscription(subscriptionId, cursor);
|
|
60
|
+
|
|
61
|
+
const jsonRpcResponse = createJsonRpcSuccessResponse(requestId, { reply: { status: 200, detail: 'OK' } });
|
|
62
|
+
return { jsonRpcResponse } as HandlerResponse;
|
|
63
|
+
};
|
|
@@ -4,14 +4,10 @@ import type {
|
|
|
4
4
|
HandlerResponse,
|
|
5
5
|
JsonRpcHandler,
|
|
6
6
|
} from '../../lib/json-rpc-router.js';
|
|
7
|
-
import type { JsonRpcId, JsonRpcResponse } from '
|
|
7
|
+
import type { JsonRpcId, JsonRpcResponse } from '@enbox/dwn-clients';
|
|
8
8
|
|
|
9
9
|
import { DwnServerErrorCode } from '../../dwn-error.js';
|
|
10
|
-
import {
|
|
11
|
-
createJsonRpcErrorResponse,
|
|
12
|
-
createJsonRpcSuccessResponse,
|
|
13
|
-
JsonRpcErrorCodes,
|
|
14
|
-
} from '../../lib/json-rpc.js';
|
|
10
|
+
import { createJsonRpcErrorResponse, createJsonRpcSuccessResponse, JsonRpcErrorCodes } from '@enbox/dwn-clients';
|
|
15
11
|
|
|
16
12
|
/**
|
|
17
13
|
* Closes a subscription tied to a specific `SocketConnection`.
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
import type {
|
|
4
|
-
|
|
1
|
+
import type { ActivityLog } from '../admin/activity-log.js';
|
|
2
|
+
import type { AdminStore } from '../admin/admin-store.js';
|
|
3
|
+
import type { DwnServerConfig } from '../config.js';
|
|
4
|
+
import type { MessageProcessedHook } from '../message-processed-hook.js';
|
|
5
|
+
import type { RateLimiter } from '../rate-limiter.js';
|
|
6
|
+
import type { RegistrationStore } from '../registration/registration-store.js';
|
|
5
7
|
import type { SocketConnection } from '../connection/socket-connection.js';
|
|
8
|
+
import type { Dwn, SubscriptionListener } from '@enbox/dwn-sdk-js';
|
|
9
|
+
import type { JsonRpcId, JsonRpcRequest, JsonRpcResponse } from '@enbox/dwn-clients';
|
|
6
10
|
|
|
7
11
|
export type RequestContext = {
|
|
8
12
|
transport: 'http' | 'ws';
|
|
@@ -12,11 +16,23 @@ export type RequestContext = {
|
|
|
12
16
|
subscriptionRequest?: {
|
|
13
17
|
/** The JsonRpcId of the subscription handler */
|
|
14
18
|
id: JsonRpcId;
|
|
15
|
-
/** The `
|
|
16
|
-
subscriptionHandler:
|
|
19
|
+
/** The `SubscriptionMessage` handler associated with a subscription request, only used in `ws` requests */
|
|
20
|
+
subscriptionHandler: SubscriptionListener;
|
|
17
21
|
}
|
|
18
22
|
/** The `ReadableStream` associated with a `RecordsWrite` request only used in `http` requests */
|
|
19
23
|
dataStream?: ReadableStream<Uint8Array>;
|
|
24
|
+
/** The admin activity log for capturing DWN request events (optional). */
|
|
25
|
+
activityLog?: ActivityLog;
|
|
26
|
+
/** The admin store for quota usage queries (optional). */
|
|
27
|
+
adminStore?: AdminStore;
|
|
28
|
+
/** The registration store for per-tenant quota lookups (optional). */
|
|
29
|
+
registrationStore?: RegistrationStore;
|
|
30
|
+
/** Server configuration for global quota/rate-limit defaults (optional). */
|
|
31
|
+
config?: DwnServerConfig;
|
|
32
|
+
/** Per-tenant rate limiter (optional). */
|
|
33
|
+
tenantRateLimiter?: RateLimiter;
|
|
34
|
+
/** Hooks invoked after every `dwn.processMessage()` call (fire-and-forget). */
|
|
35
|
+
messageProcessedHooks?: MessageProcessedHook[];
|
|
20
36
|
};
|
|
21
37
|
|
|
22
38
|
export type HandlerResponse = {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escapes SQL LIKE wildcard characters (`%`, `_`, `\`) in user-supplied input
|
|
3
|
+
* so that they are treated as literal characters rather than pattern operators.
|
|
4
|
+
*/
|
|
5
|
+
export function escapeLikeWildcards(input: string): string {
|
|
6
|
+
return input.replace(/[%_\\]/g, '\\$&');
|
|
7
|
+
}
|
package/src/main.ts
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// node.js 18 and earlier, needs globalThis.crypto polyfill. needed for dwn-sdk-js
|
|
3
|
-
import { webcrypto } from 'node:crypto';
|
|
4
|
-
|
|
5
2
|
import { DwnServer } from './dwn-server.js';
|
|
6
3
|
|
|
7
|
-
if (!globalThis.crypto) {
|
|
8
|
-
// @ts-ignore
|
|
9
|
-
globalThis.crypto = webcrypto;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
4
|
const dwnServer = new DwnServer();
|
|
13
5
|
|
|
14
6
|
await dwnServer.start();
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { GenericMessage } from '@enbox/dwn-sdk-js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Context provided to hooks after `dwn.processMessage()` returns.
|
|
5
|
+
*/
|
|
6
|
+
export type MessageProcessedContext = {
|
|
7
|
+
/** The tenant DID that owns the DWN. */
|
|
8
|
+
tenant: string;
|
|
9
|
+
/** The original signed DWN message. */
|
|
10
|
+
message: GenericMessage;
|
|
11
|
+
/** The reply status from the DWN engine. */
|
|
12
|
+
status: { code: number; detail: string };
|
|
13
|
+
/** The transport over which the message was received. */
|
|
14
|
+
transport: 'http' | 'ws';
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Hook that is invoked after every successful `dwn.processMessage()` call.
|
|
19
|
+
*
|
|
20
|
+
* Hooks are fire-and-forget: they run asynchronously and their return values
|
|
21
|
+
* are ignored. Errors thrown by hooks are logged but never propagate to the
|
|
22
|
+
* request handler or the client.
|
|
23
|
+
*
|
|
24
|
+
* Implementations should return quickly and schedule any expensive work
|
|
25
|
+
* (network I/O, retries) internally.
|
|
26
|
+
*/
|
|
27
|
+
export interface MessageProcessedHook {
|
|
28
|
+
/**
|
|
29
|
+
* Called after a DWN message has been processed.
|
|
30
|
+
* May return void or a Promise — both are handled gracefully.
|
|
31
|
+
*/
|
|
32
|
+
onMessageProcessed(context: MessageProcessedContext): void | Promise<void>;
|
|
33
|
+
}
|
package/src/metrics.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import { Counter, Histogram } from 'prom-client';
|
|
1
|
+
import { Counter, Gauge, Histogram } from 'prom-client';
|
|
2
|
+
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Existing metrics
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
2
6
|
|
|
3
7
|
export const requestCounter = new Counter({
|
|
4
8
|
name : 'dwn_requests_total',
|
|
@@ -12,3 +16,48 @@ export const responseHistogram = new Histogram({
|
|
|
12
16
|
buckets : [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],
|
|
13
17
|
labelNames : ['route', 'code'],
|
|
14
18
|
});
|
|
19
|
+
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Enhanced gauges — updated periodically by AdminApi.startMetricsUpdater()
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
/** Number of active (registered) tenants. */
|
|
25
|
+
export const activeTenants = new Gauge({
|
|
26
|
+
name : 'dwn_active_tenants',
|
|
27
|
+
help : 'number of active registered tenants',
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
/** Total messages stored across all tenants. */
|
|
31
|
+
export const totalMessages = new Gauge({
|
|
32
|
+
name : 'dwn_total_messages',
|
|
33
|
+
help : 'total messages stored across all tenants',
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
/** Total data storage in bytes across all tenants. */
|
|
37
|
+
export const totalDataBytes = new Gauge({
|
|
38
|
+
name : 'dwn_total_data_bytes',
|
|
39
|
+
help : 'total data storage bytes across all tenants',
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
/** Number of active WebSocket connections. */
|
|
43
|
+
export const websocketConnections = new Gauge({
|
|
44
|
+
name : 'dwn_websocket_connections',
|
|
45
|
+
help : 'number of active websocket connections',
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
/** Number of active WebSocket subscriptions. */
|
|
49
|
+
export const websocketSubscriptions = new Gauge({
|
|
50
|
+
name : 'dwn_websocket_subscriptions',
|
|
51
|
+
help : 'number of active websocket subscriptions',
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Enhanced counters — incremented per-request
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
/** Total data bytes written via RecordsWrite, labeled by interface + method. */
|
|
59
|
+
export const requestDataBytesTotal = new Counter({
|
|
60
|
+
name : 'dwn_request_data_bytes_total',
|
|
61
|
+
help : 'total data bytes processed in DWN requests',
|
|
62
|
+
labelNames : ['interface', 'method'],
|
|
63
|
+
});
|