@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
package/src/dwn-error.ts
CHANGED
|
@@ -16,8 +16,8 @@ export class DwnServerError extends Error {
|
|
|
16
16
|
*/
|
|
17
17
|
public toJSON(): { code: string, message: string } {
|
|
18
18
|
return {
|
|
19
|
-
code: this.code,
|
|
20
|
-
message: this.message,
|
|
19
|
+
code : this.code,
|
|
20
|
+
message : this.message,
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
23
|
}
|
|
@@ -33,6 +33,15 @@ export enum DwnServerErrorCode {
|
|
|
33
33
|
ProofOfWorkManagerInvalidChallengeNonce = 'ProofOfWorkManagerInvalidChallengeNonce',
|
|
34
34
|
ProofOfWorkManagerInvalidResponseNonceFormat = 'ProofOfWorkManagerInvalidResponseNonceFormat',
|
|
35
35
|
ProofOfWorkManagerResponseNonceReused = 'ProofOfWorkManagerResponseNonceReused',
|
|
36
|
+
ProviderAuthNotEnabled = 'ProviderAuthNotEnabled',
|
|
37
|
+
ProviderAuthPluginLoadFailed = 'ProviderAuthPluginLoadFailed',
|
|
38
|
+
ProviderAuthPluginNotConfigured = 'ProviderAuthPluginNotConfigured',
|
|
39
|
+
ProviderAuthTokenInvalid = 'ProviderAuthTokenInvalid',
|
|
40
|
+
RateLimitExceeded = 'RateLimitExceeded',
|
|
36
41
|
RegistrationManagerInvalidOrOutdatedTermsOfServiceHash = 'RegistrationManagerInvalidOrOutdatedTermsOfServiceHash',
|
|
42
|
+
RegistrationRequestMissingCredentials = 'RegistrationRequestMissingCredentials',
|
|
43
|
+
TenantMessageQuotaExceeded = 'TenantMessageQuotaExceeded',
|
|
37
44
|
TenantRegistrationOutdatedTermsOfService = 'TenantRegistrationOutdatedTermsOfService',
|
|
45
|
+
TenantStorageQuotaExceeded = 'TenantStorageQuotaExceeded',
|
|
46
|
+
TenantSuspended = 'TenantSuspended',
|
|
38
47
|
}
|
package/src/dwn-server.ts
CHANGED
|
@@ -1,20 +1,35 @@
|
|
|
1
1
|
import type { DidResolver } from '@enbox/dids';
|
|
2
|
-
import type { EventStream } from '@enbox/dwn-sdk-js';
|
|
3
|
-
import type { ProcessHandlers } from './process-handlers.js';
|
|
4
|
-
import type { Server } from 'http';
|
|
5
|
-
import type { WebSocketServer } from 'ws';
|
|
6
2
|
import type { DwnServerConfig } from './config.js';
|
|
3
|
+
import type { EventLog } from '@enbox/dwn-sdk-js';
|
|
4
|
+
import type { MessageProcessedHook } from './message-processed-hook.js';
|
|
5
|
+
import type { ProcessHandlers } from './process-handlers.js';
|
|
6
|
+
import type { Server } from 'bun';
|
|
7
|
+
|
|
8
|
+
import type { WsData } from './http-api.js';
|
|
7
9
|
|
|
8
10
|
import log from 'loglevel';
|
|
9
11
|
import prefix from 'loglevel-plugin-prefix';
|
|
12
|
+
import { DidDht, DidJwk, DidKey, DidWeb, UniversalResolver } from '@enbox/dids';
|
|
13
|
+
import { Dwn, EventEmitterEventLog } from '@enbox/dwn-sdk-js';
|
|
14
|
+
|
|
15
|
+
import type { ProviderAuthPlugin } from './registration/provider-auth-plugin.js';
|
|
16
|
+
|
|
17
|
+
import { ActivityLog } from './admin/activity-log.js';
|
|
18
|
+
import { AdminApi } from './admin/admin-api.js';
|
|
19
|
+
import { AdminStore } from './admin/admin-store.js';
|
|
20
|
+
import { AuditLog } from './admin/audit-log.js';
|
|
10
21
|
import { config as defaultConfig } from './config.js';
|
|
11
|
-
import {
|
|
12
|
-
import { HttpServerShutdownHandler } from './lib/http-server-shutdown-handler.js';
|
|
22
|
+
import { DeliveryService } from './delivery-service.js';
|
|
13
23
|
import { HttpApi } from './http-api.js';
|
|
24
|
+
import { JwtProviderAuthPlugin } from './registration/jwt-provider-auth-plugin.js';
|
|
25
|
+
import { loadProviderAuthPlugin } from './registration/provider-auth-plugin.js';
|
|
26
|
+
import { OpenAuthHandler } from './registration/open-auth-handler.js';
|
|
14
27
|
import { PluginLoader } from './plugin-loader.js';
|
|
28
|
+
import { RateLimiter } from './rate-limiter.js';
|
|
15
29
|
import { RegistrationManager } from './registration/registration-manager.js';
|
|
30
|
+
import { WebhookManager } from './admin/webhook-manager.js';
|
|
16
31
|
import { WsApi } from './ws-api.js';
|
|
17
|
-
import {
|
|
32
|
+
import { getDialectFromUrl, getDwnConfig } from './storage.js';
|
|
18
33
|
import { removeProcessHandlers, setProcessHandlers } from './process-handlers.js';
|
|
19
34
|
|
|
20
35
|
/**
|
|
@@ -30,6 +45,13 @@ export type DwnServerOptions = {
|
|
|
30
45
|
didResolver?: DidResolver;
|
|
31
46
|
dwn?: Dwn;
|
|
32
47
|
config?: DwnServerConfig;
|
|
48
|
+
/**
|
|
49
|
+
* Hooks invoked after every `dwn.processMessage()` call.
|
|
50
|
+
* The built-in DeliveryService hook is always prepended automatically
|
|
51
|
+
* when forwarding or delivery is enabled. Additional hooks provided here
|
|
52
|
+
* are appended after the DeliveryService hook.
|
|
53
|
+
*/
|
|
54
|
+
messageProcessedHooks?: MessageProcessedHook[];
|
|
33
55
|
};
|
|
34
56
|
|
|
35
57
|
/**
|
|
@@ -43,7 +65,7 @@ enum DwnServerState {
|
|
|
43
65
|
export class DwnServer {
|
|
44
66
|
serverState = DwnServerState.Stopped;
|
|
45
67
|
processHandlers: ProcessHandlers;
|
|
46
|
-
|
|
68
|
+
|
|
47
69
|
/**
|
|
48
70
|
* A custom DID resolver to use in the DWN.
|
|
49
71
|
* Mainly for testing purposes. Ignored if `dwn` is provided.
|
|
@@ -51,9 +73,13 @@ export class DwnServer {
|
|
|
51
73
|
didResolver?: DidResolver;
|
|
52
74
|
dwn?: Dwn;
|
|
53
75
|
config: DwnServerConfig;
|
|
54
|
-
#httpServerShutdownHandler: HttpServerShutdownHandler;
|
|
55
76
|
#httpApi: HttpApi;
|
|
56
77
|
#wsApi: WsApi;
|
|
78
|
+
#adminApi: AdminApi | undefined;
|
|
79
|
+
#ipRateLimiter: RateLimiter | undefined;
|
|
80
|
+
#tenantRateLimiter: RateLimiter | undefined;
|
|
81
|
+
#auditLog: AuditLog | undefined;
|
|
82
|
+
#externalHooks: MessageProcessedHook[];
|
|
57
83
|
|
|
58
84
|
/**
|
|
59
85
|
* @param options.dwn - Dwn instance to use as an override. Registration endpoint will not be enabled if this is provided.
|
|
@@ -63,6 +89,7 @@ export class DwnServer {
|
|
|
63
89
|
|
|
64
90
|
this.didResolver = options.didResolver;
|
|
65
91
|
this.dwn = options.dwn;
|
|
92
|
+
this.#externalHooks = options.messageProcessedHooks ?? [];
|
|
66
93
|
|
|
67
94
|
log.setLevel(this.config.logLevel as log.LogLevelDesc);
|
|
68
95
|
|
|
@@ -91,46 +118,226 @@ export class DwnServer {
|
|
|
91
118
|
|
|
92
119
|
let registrationManager: RegistrationManager;
|
|
93
120
|
if (!this.dwn) {
|
|
121
|
+
// Load provider auth plugin if configured.
|
|
122
|
+
let providerAuthPlugin: ProviderAuthPlugin | undefined;
|
|
123
|
+
if (this.config.providerAuthEnabled) {
|
|
124
|
+
if (this.config.providerAuthPluginPath) {
|
|
125
|
+
// Custom external plugin.
|
|
126
|
+
providerAuthPlugin = await loadProviderAuthPlugin(this.config.providerAuthPluginPath);
|
|
127
|
+
log.info('Provider auth plugin loaded from path');
|
|
128
|
+
} else if (this.config.providerAuthJwtSecret || this.config.providerAuthJwtJwksUrl) {
|
|
129
|
+
// Built-in JWT plugin.
|
|
130
|
+
providerAuthPlugin = await JwtProviderAuthPlugin.create({
|
|
131
|
+
secret : this.config.providerAuthJwtSecret,
|
|
132
|
+
jwksUrl : this.config.providerAuthJwtJwksUrl,
|
|
133
|
+
issuer : this.config.baseUrl,
|
|
134
|
+
audience : this.config.baseUrl,
|
|
135
|
+
});
|
|
136
|
+
log.info('Built-in JWT provider auth plugin created');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
94
140
|
// undefined registrationStoreUrl is used as a signal that there is no need for tenant registration, DWN is open for all.
|
|
95
141
|
registrationManager = await RegistrationManager.create({
|
|
96
|
-
registrationStoreUrl: this.config.registrationStoreUrl,
|
|
97
|
-
termsOfServiceFilePath: this.config.termsOfServiceFilePath,
|
|
98
|
-
proofOfWorkChallengeNonceSeed: this.config.registrationProofOfWorkSeed,
|
|
99
|
-
proofOfWorkInitialMaximumAllowedHash: this.config.registrationProofOfWorkInitialMaxHash,
|
|
142
|
+
registrationStoreUrl : this.config.registrationStoreUrl,
|
|
143
|
+
termsOfServiceFilePath : this.config.termsOfServiceFilePath,
|
|
144
|
+
proofOfWorkChallengeNonceSeed : this.config.registrationProofOfWorkSeed,
|
|
145
|
+
proofOfWorkInitialMaximumAllowedHash : this.config.registrationProofOfWorkInitialMaxHash,
|
|
146
|
+
providerAuthPlugin,
|
|
100
147
|
});
|
|
101
148
|
|
|
102
|
-
|
|
149
|
+
// Warn if the tenant gate is active but no registration method is enabled.
|
|
150
|
+
// This is almost certainly a misconfiguration — new tenants will be rejected
|
|
151
|
+
// with 401 and have no way to register.
|
|
152
|
+
if (this.config.registrationStoreUrl
|
|
153
|
+
&& !this.config.registrationProofOfWorkEnabled
|
|
154
|
+
&& !providerAuthPlugin) {
|
|
155
|
+
log.warn(
|
|
156
|
+
'*** WARNING: DWN_REGISTRATION_STORE_URL is set (tenant gate active) but neither ' +
|
|
157
|
+
'proof-of-work (DWN_REGISTRATION_PROOF_OF_WORK_ENABLED) nor provider auth ' +
|
|
158
|
+
'(DWN_PROVIDER_AUTH_ENABLED + secret/plugin) is configured. ' +
|
|
159
|
+
'New tenants will be unable to register. ***',
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
let eventLog: EventLog | undefined;
|
|
103
164
|
if (this.config.webSocketSupport) {
|
|
104
|
-
// If
|
|
105
|
-
if (this.config.
|
|
106
|
-
|
|
165
|
+
// If EventLog plugin is not specified, use `EventEmitterEventLog` implementation as default.
|
|
166
|
+
if (this.config.eventLogPluginPath === undefined || this.config.eventLogPluginPath === '') {
|
|
167
|
+
eventLog = new EventEmitterEventLog();
|
|
107
168
|
} else {
|
|
108
|
-
|
|
169
|
+
eventLog = await PluginLoader.loadPlugin<EventLog>(this.config.eventLogPluginPath);
|
|
109
170
|
}
|
|
110
171
|
|
|
111
172
|
}
|
|
112
173
|
|
|
174
|
+
// Create a DID resolver explicitly without LevelDB cache. The default
|
|
175
|
+
// Dwn.create() uses DidResolverCacheLevel which requires exclusive file
|
|
176
|
+
// locks and is not managed by the DWN's open()/close() lifecycle. In
|
|
177
|
+
// containerized deployments this causes "Database is not open" errors
|
|
178
|
+
// when the LevelDB lock file persists across restarts or when concurrent
|
|
179
|
+
// async operations (e.g. DeliveryService) race with the deferred open.
|
|
180
|
+
// UniversalResolver defaults to DidResolverCacheNoop when no cache is provided.
|
|
181
|
+
const didResolver = this.didResolver ?? new UniversalResolver({
|
|
182
|
+
didResolvers: [DidDht, DidJwk, DidKey, DidWeb],
|
|
183
|
+
});
|
|
184
|
+
|
|
113
185
|
const dwnConfig = await getDwnConfig(this.config, {
|
|
114
|
-
didResolver
|
|
186
|
+
didResolver,
|
|
115
187
|
tenantGate: registrationManager,
|
|
116
|
-
|
|
117
|
-
})
|
|
188
|
+
eventLog,
|
|
189
|
+
});
|
|
118
190
|
this.dwn = await Dwn.create(dwnConfig);
|
|
119
191
|
}
|
|
120
192
|
|
|
121
|
-
|
|
193
|
+
// Assemble message-processed hooks.
|
|
194
|
+
const messageProcessedHooks: MessageProcessedHook[] = [];
|
|
122
195
|
|
|
123
|
-
|
|
124
|
-
|
|
196
|
+
// Add the built-in DeliveryService hook when forwarding or delivery is enabled.
|
|
197
|
+
if (this.config.forwardingEnabled || this.config.deliveryEnabled) {
|
|
198
|
+
const deliveryResolver = this.didResolver ?? new UniversalResolver({
|
|
199
|
+
didResolvers: [DidDht, DidJwk, DidKey, DidWeb],
|
|
200
|
+
});
|
|
201
|
+
const deliveryService = DeliveryService.create(this.dwn, deliveryResolver, this.config);
|
|
202
|
+
messageProcessedHooks.push(deliveryService);
|
|
203
|
+
log.info(`Delivery service enabled (forwarding: ${this.config.forwardingEnabled}, delivery: ${this.config.deliveryEnabled})`);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Append externally provided hooks.
|
|
207
|
+
messageProcessedHooks.push(...this.#externalHooks);
|
|
208
|
+
|
|
209
|
+
// Create rate limiters when configured.
|
|
210
|
+
let ipRateLimiter: RateLimiter | undefined;
|
|
211
|
+
let tenantRateLimiter: RateLimiter | undefined;
|
|
212
|
+
|
|
213
|
+
if (this.config.rateLimitRequestsPerSecond > 0) {
|
|
214
|
+
ipRateLimiter = new RateLimiter({
|
|
215
|
+
refillRate : this.config.rateLimitRequestsPerSecond,
|
|
216
|
+
maxTokens : this.config.rateLimitBurst,
|
|
217
|
+
});
|
|
218
|
+
log.info(`Per-IP rate limiting enabled: ${this.config.rateLimitRequestsPerSecond} req/s, burst ${this.config.rateLimitBurst}`);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (this.config.rateLimitTenantRequestsPerSecond > 0) {
|
|
222
|
+
tenantRateLimiter = new RateLimiter({
|
|
223
|
+
refillRate : this.config.rateLimitTenantRequestsPerSecond,
|
|
224
|
+
maxTokens : this.config.rateLimitTenantBurst,
|
|
225
|
+
});
|
|
226
|
+
log.info(`Per-tenant rate limiting enabled: ${this.config.rateLimitTenantRequestsPerSecond} req/s, burst ${this.config.rateLimitTenantBurst}`);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const registrationStore = registrationManager?.getRegistrationStore();
|
|
230
|
+
|
|
231
|
+
// Initialize admin API if an admin token is configured.
|
|
232
|
+
let adminApi: AdminApi | undefined;
|
|
233
|
+
let activityLog: ActivityLog | undefined;
|
|
234
|
+
let adminStore: AdminStore | undefined;
|
|
235
|
+
let auditLog: AuditLog | undefined;
|
|
236
|
+
let webhookManager: WebhookManager | undefined;
|
|
237
|
+
|
|
238
|
+
if (this.config.adminToken) {
|
|
239
|
+
const storageUrl = this.config.messageStore;
|
|
240
|
+
adminStore = AdminStore.create(storageUrl);
|
|
241
|
+
activityLog = new ActivityLog(this.config.adminActivityLogCapacity);
|
|
242
|
+
|
|
243
|
+
// Create the persistent audit log using the registration store's dialect
|
|
244
|
+
// (same DB) or the message store URL as fallback.
|
|
245
|
+
if (this.config.registrationStoreUrl) {
|
|
246
|
+
try {
|
|
247
|
+
const auditDialect = getDialectFromUrl(new URL(this.config.registrationStoreUrl));
|
|
248
|
+
auditLog = await AuditLog.create(auditDialect, {
|
|
249
|
+
maxAgeDays : this.config.auditLogMaxAgeDays,
|
|
250
|
+
maxRows : this.config.auditLogMaxRows,
|
|
251
|
+
});
|
|
252
|
+
} catch (err) {
|
|
253
|
+
log.warn('Failed to create audit log:', err);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
125
256
|
|
|
126
|
-
|
|
127
|
-
this
|
|
257
|
+
// Create webhook manager using the same dialect as the audit log.
|
|
258
|
+
if (this.config.registrationStoreUrl) {
|
|
259
|
+
try {
|
|
260
|
+
const webhookDialect = getDialectFromUrl(new URL(this.config.registrationStoreUrl));
|
|
261
|
+
webhookManager = await WebhookManager.create(webhookDialect);
|
|
262
|
+
} catch (err) {
|
|
263
|
+
log.warn('Failed to create webhook manager:', err);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
adminApi = AdminApi.create({
|
|
268
|
+
config : this.config,
|
|
269
|
+
dwn : this.dwn,
|
|
270
|
+
adminStore,
|
|
271
|
+
registrationManager,
|
|
272
|
+
registrationStore,
|
|
273
|
+
activityLog,
|
|
274
|
+
auditLog,
|
|
275
|
+
ipRateLimiter,
|
|
276
|
+
tenantRateLimiter,
|
|
277
|
+
webhookManager,
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
// Record server start event in audit log.
|
|
281
|
+
if (auditLog) {
|
|
282
|
+
await auditLog.record({ actor: 'system', action: 'server.start' });
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
log.info('Admin API enabled');
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Store references for cleanup in stop().
|
|
289
|
+
this.#adminApi = adminApi;
|
|
290
|
+
this.#ipRateLimiter = ipRateLimiter;
|
|
291
|
+
this.#tenantRateLimiter = tenantRateLimiter;
|
|
292
|
+
this.#auditLog = auditLog;
|
|
293
|
+
|
|
294
|
+
// Create open-auth handler if provider auth is enabled with a JWT secret
|
|
295
|
+
// and authorize/token URLs point to this server (or are not set — defaulting to built-in).
|
|
296
|
+
let openAuthHandler: OpenAuthHandler | undefined;
|
|
297
|
+
if (this.config.providerAuthEnabled && this.config.providerAuthJwtSecret && !this.config.providerAuthPluginPath) {
|
|
298
|
+
openAuthHandler = OpenAuthHandler.create(
|
|
299
|
+
this.config.providerAuthJwtSecret,
|
|
300
|
+
this.config.baseUrl,
|
|
301
|
+
);
|
|
302
|
+
log.info('Built-in open-auth endpoints enabled');
|
|
303
|
+
|
|
304
|
+
// Auto-configure authorize/token/refresh URLs if not explicitly set.
|
|
305
|
+
if (!this.config.providerAuthAuthorizeUrl) {
|
|
306
|
+
this.config.providerAuthAuthorizeUrl = `${this.config.baseUrl}/provider-auth/authorize`;
|
|
307
|
+
}
|
|
308
|
+
if (!this.config.providerAuthTokenUrl) {
|
|
309
|
+
this.config.providerAuthTokenUrl = `${this.config.baseUrl}/provider-auth/token`;
|
|
310
|
+
}
|
|
311
|
+
if (!this.config.providerAuthRefreshUrl) {
|
|
312
|
+
this.config.providerAuthRefreshUrl = `${this.config.baseUrl}/provider-auth/refresh`;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
this.#httpApi = await HttpApi.create(
|
|
317
|
+
this.config, this.dwn, registrationManager, adminApi, activityLog,
|
|
318
|
+
{ adminStore, registrationStore, ipRateLimiter, tenantRateLimiter, messageProcessedHooks, openAuthHandler },
|
|
128
319
|
);
|
|
129
320
|
|
|
321
|
+
await this.#httpApi.start(this.config.port);
|
|
322
|
+
log.info(`HttpServer listening on port ${this.config.port}`);
|
|
323
|
+
|
|
130
324
|
if (this.config.webSocketSupport) {
|
|
131
|
-
this.#wsApi = new WsApi(
|
|
325
|
+
this.#wsApi = new WsApi(
|
|
326
|
+
this.#httpApi, this.dwn, undefined, this.config.maxInFlight, activityLog,
|
|
327
|
+
{ adminStore, registrationStore, config: this.config, tenantRateLimiter, messageProcessedHooks },
|
|
328
|
+
);
|
|
132
329
|
this.#wsApi.start();
|
|
133
330
|
log.info('WebSocketServer ready...');
|
|
331
|
+
|
|
332
|
+
// Wire connection manager to admin API for connection counting.
|
|
333
|
+
if (adminApi) {
|
|
334
|
+
adminApi.setConnectionManager(this.#wsApi.connectionManager);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Start periodic Prometheus gauge updates.
|
|
339
|
+
if (adminApi) {
|
|
340
|
+
adminApi.startMetricsUpdater();
|
|
134
341
|
}
|
|
135
342
|
}
|
|
136
343
|
|
|
@@ -142,33 +349,41 @@ export class DwnServer {
|
|
|
142
349
|
return;
|
|
143
350
|
}
|
|
144
351
|
|
|
352
|
+
// Stop admin metrics updater and record shutdown audit event.
|
|
353
|
+
if (this.#adminApi) {
|
|
354
|
+
this.#adminApi.stopMetricsUpdater();
|
|
355
|
+
}
|
|
356
|
+
if (this.#auditLog) {
|
|
357
|
+
await this.#auditLog.record({ actor: 'system', action: 'server.stop' });
|
|
358
|
+
await this.#auditLog.close();
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Clean up rate limiters (stops their interval timers).
|
|
362
|
+
if (this.#ipRateLimiter) {
|
|
363
|
+
this.#ipRateLimiter.destroy();
|
|
364
|
+
}
|
|
365
|
+
if (this.#tenantRateLimiter) {
|
|
366
|
+
this.#tenantRateLimiter.destroy();
|
|
367
|
+
}
|
|
368
|
+
|
|
145
369
|
await this.dwn.close();
|
|
146
|
-
await this.#httpApi.close();
|
|
147
370
|
|
|
148
|
-
//
|
|
371
|
+
// Close WebSocket server if it was initialized.
|
|
149
372
|
if (this.#wsApi !== undefined) {
|
|
150
373
|
await this.#wsApi.close();
|
|
151
374
|
}
|
|
152
375
|
|
|
153
|
-
await
|
|
154
|
-
this.#httpServerShutdownHandler.stop(() => {
|
|
155
|
-
resolve();
|
|
156
|
-
});
|
|
157
|
-
});
|
|
376
|
+
await this.#httpApi.close();
|
|
158
377
|
|
|
159
378
|
removeProcessHandlers(this.processHandlers);
|
|
160
379
|
|
|
161
380
|
this.serverState = DwnServerState.Stopped;
|
|
162
381
|
}
|
|
163
382
|
|
|
164
|
-
get httpServer(): Server {
|
|
383
|
+
get httpServer(): Server<WsData> {
|
|
165
384
|
return this.#httpApi.server;
|
|
166
385
|
}
|
|
167
386
|
|
|
168
|
-
get wsServer(): WebSocketServer | undefined {
|
|
169
|
-
return this.#wsApi?.server;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
387
|
/**
|
|
173
388
|
* Gets the RegistrationManager for testing purposes.
|
|
174
389
|
*/
|