@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
package/src/dwn-error.ts
CHANGED
|
@@ -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,6 +1,7 @@
|
|
|
1
1
|
import type { DidResolver } from '@enbox/dids';
|
|
2
2
|
import type { DwnServerConfig } from './config.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { EventLog } from '@enbox/dwn-sdk-js';
|
|
4
|
+
import type { MessageProcessedHook } from './message-processed-hook.js';
|
|
4
5
|
import type { ProcessHandlers } from './process-handlers.js';
|
|
5
6
|
import type { Server } from 'bun';
|
|
6
7
|
|
|
@@ -8,14 +9,27 @@ import type { WsData } from './http-api.js';
|
|
|
8
9
|
|
|
9
10
|
import log from 'loglevel';
|
|
10
11
|
import prefix from 'loglevel-plugin-prefix';
|
|
11
|
-
import {
|
|
12
|
+
import { DidDht, DidJwk, DidKey, DidWeb, UniversalResolver } from '@enbox/dids';
|
|
13
|
+
import { Dwn, EventEmitterEventLog } from '@enbox/dwn-sdk-js';
|
|
12
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';
|
|
13
21
|
import { config as defaultConfig } from './config.js';
|
|
14
|
-
import {
|
|
22
|
+
import { DeliveryService } from './delivery-service.js';
|
|
15
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';
|
|
16
27
|
import { PluginLoader } from './plugin-loader.js';
|
|
28
|
+
import { RateLimiter } from './rate-limiter.js';
|
|
17
29
|
import { RegistrationManager } from './registration/registration-manager.js';
|
|
30
|
+
import { WebhookManager } from './admin/webhook-manager.js';
|
|
18
31
|
import { WsApi } from './ws-api.js';
|
|
32
|
+
import { getDialectFromUrl, getDwnConfig } from './storage.js';
|
|
19
33
|
import { removeProcessHandlers, setProcessHandlers } from './process-handlers.js';
|
|
20
34
|
|
|
21
35
|
/**
|
|
@@ -31,6 +45,13 @@ export type DwnServerOptions = {
|
|
|
31
45
|
didResolver?: DidResolver;
|
|
32
46
|
dwn?: Dwn;
|
|
33
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[];
|
|
34
55
|
};
|
|
35
56
|
|
|
36
57
|
/**
|
|
@@ -54,6 +75,11 @@ export class DwnServer {
|
|
|
54
75
|
config: DwnServerConfig;
|
|
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,42 +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
142
|
registrationStoreUrl : this.config.registrationStoreUrl,
|
|
97
143
|
termsOfServiceFilePath : this.config.termsOfServiceFilePath,
|
|
98
144
|
proofOfWorkChallengeNonceSeed : this.config.registrationProofOfWorkSeed,
|
|
99
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
|
|
115
|
-
tenantGate
|
|
116
|
-
|
|
186
|
+
didResolver,
|
|
187
|
+
tenantGate: registrationManager,
|
|
188
|
+
eventLog,
|
|
117
189
|
});
|
|
118
190
|
this.dwn = await Dwn.create(dwnConfig);
|
|
119
191
|
}
|
|
120
192
|
|
|
121
|
-
|
|
193
|
+
// Assemble message-processed hooks.
|
|
194
|
+
const messageProcessedHooks: MessageProcessedHook[] = [];
|
|
195
|
+
|
|
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
|
+
}
|
|
256
|
+
|
|
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 },
|
|
319
|
+
);
|
|
122
320
|
|
|
123
321
|
await this.#httpApi.start(this.config.port);
|
|
124
322
|
log.info(`HttpServer listening on port ${this.config.port}`);
|
|
125
323
|
|
|
126
324
|
if (this.config.webSocketSupport) {
|
|
127
|
-
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
|
+
);
|
|
128
329
|
this.#wsApi.start();
|
|
129
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();
|
|
130
341
|
}
|
|
131
342
|
}
|
|
132
343
|
|
|
@@ -138,9 +349,26 @@ export class DwnServer {
|
|
|
138
349
|
return;
|
|
139
350
|
}
|
|
140
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
|
+
|
|
141
369
|
await this.dwn.close();
|
|
142
370
|
|
|
143
|
-
//
|
|
371
|
+
// Close WebSocket server if it was initialized.
|
|
144
372
|
if (this.#wsApi !== undefined) {
|
|
145
373
|
await this.#wsApi.close();
|
|
146
374
|
}
|