@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
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { Kysely } from 'kysely';
|
|
1
|
+
import { Kysely, sql } from 'kysely';
|
|
2
|
+
import { escapeLikeWildcards } from '../lib/sql-utils.js';
|
|
2
3
|
/**
|
|
3
4
|
* The RegistrationStore is responsible for storing and retrieving tenant registration information.
|
|
4
5
|
*/
|
|
5
6
|
export class RegistrationStore {
|
|
6
7
|
static registeredTenantTableName = 'registeredTenants';
|
|
8
|
+
static tenantQuotasTableName = 'tenantQuotas';
|
|
7
9
|
db;
|
|
8
10
|
constructor(sqlDialect) {
|
|
9
11
|
this.db = new Kysely({ dialect: sqlDialect });
|
|
@@ -12,9 +14,9 @@ export class RegistrationStore {
|
|
|
12
14
|
* Creates a new RegistrationStore instance.
|
|
13
15
|
*/
|
|
14
16
|
static async create(sqlDialect) {
|
|
15
|
-
const
|
|
16
|
-
await
|
|
17
|
-
return
|
|
17
|
+
const store = new RegistrationStore(sqlDialect);
|
|
18
|
+
await store.initialize();
|
|
19
|
+
return store;
|
|
18
20
|
}
|
|
19
21
|
async initialize() {
|
|
20
22
|
await this.db.schema
|
|
@@ -22,19 +24,79 @@ export class RegistrationStore {
|
|
|
22
24
|
.ifNotExists()
|
|
23
25
|
.addColumn('did', 'text', (column) => column.primaryKey())
|
|
24
26
|
.addColumn('termsOfServiceHash', 'text')
|
|
27
|
+
.addColumn('suspended', 'integer', (column) => column.defaultTo(0))
|
|
28
|
+
.execute();
|
|
29
|
+
// Add the `suspended` column to existing tables that don't have it yet.
|
|
30
|
+
// Kysely doesn't support `ADD COLUMN IF NOT EXISTS` across all dialects, so we
|
|
31
|
+
// catch and ignore the "column already exists" error.
|
|
32
|
+
try {
|
|
33
|
+
await this.db.schema
|
|
34
|
+
.alterTable(RegistrationStore.registeredTenantTableName)
|
|
35
|
+
.addColumn('suspended', 'integer', (column) => column.defaultTo(0))
|
|
36
|
+
.execute();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Column already exists — expected for new installations.
|
|
40
|
+
}
|
|
41
|
+
// Add provider-auth columns (idempotent migration). https://github.com/enboxorg/enbox/issues/404
|
|
42
|
+
for (const col of ['accountId', 'registrationType', 'registeredAt', 'metadata']) {
|
|
43
|
+
try {
|
|
44
|
+
await this.db.schema
|
|
45
|
+
.alterTable(RegistrationStore.registeredTenantTableName)
|
|
46
|
+
.addColumn(col, 'text')
|
|
47
|
+
.execute();
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Column already exists — expected.
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Per-tenant storage quotas table.
|
|
54
|
+
await this.db.schema
|
|
55
|
+
.createTable(RegistrationStore.tenantQuotasTableName)
|
|
56
|
+
.ifNotExists()
|
|
57
|
+
.addColumn('did', 'text', (column) => column.primaryKey())
|
|
58
|
+
.addColumn('maxMessages', 'integer', (column) => column.defaultTo(0))
|
|
59
|
+
.addColumn('maxStorageBytes', 'bigint', (column) => column.defaultTo(0))
|
|
25
60
|
.execute();
|
|
26
61
|
}
|
|
27
62
|
/**
|
|
28
63
|
* Inserts or updates the tenant registration information.
|
|
29
64
|
*/
|
|
30
65
|
async insertOrUpdateTenantRegistration(registrationData) {
|
|
66
|
+
const insertValues = {
|
|
67
|
+
did: registrationData.did,
|
|
68
|
+
termsOfServiceHash: registrationData.termsOfServiceHash ?? '',
|
|
69
|
+
suspended: 0,
|
|
70
|
+
registeredAt: new Date().toISOString(),
|
|
71
|
+
};
|
|
72
|
+
if (registrationData.accountId !== undefined) {
|
|
73
|
+
insertValues.accountId = registrationData.accountId;
|
|
74
|
+
}
|
|
75
|
+
if (registrationData.registrationType !== undefined) {
|
|
76
|
+
insertValues.registrationType = registrationData.registrationType;
|
|
77
|
+
}
|
|
78
|
+
if (registrationData.metadata !== undefined) {
|
|
79
|
+
insertValues.metadata = registrationData.metadata;
|
|
80
|
+
}
|
|
31
81
|
await this.db
|
|
32
82
|
.insertInto(RegistrationStore.registeredTenantTableName)
|
|
33
|
-
.values(
|
|
34
|
-
.onConflict((oc) => oc.column('did').doUpdateSet((eb) =>
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
83
|
+
.values(insertValues)
|
|
84
|
+
.onConflict((oc) => oc.column('did').doUpdateSet((eb) => {
|
|
85
|
+
const updateSet = {
|
|
86
|
+
termsOfServiceHash: eb.ref('excluded.termsOfServiceHash'),
|
|
87
|
+
};
|
|
88
|
+
// Do NOT overwrite registeredAt on update.
|
|
89
|
+
if (registrationData.accountId !== undefined) {
|
|
90
|
+
updateSet.accountId = registrationData.accountId;
|
|
91
|
+
}
|
|
92
|
+
if (registrationData.registrationType !== undefined) {
|
|
93
|
+
updateSet.registrationType = registrationData.registrationType;
|
|
94
|
+
}
|
|
95
|
+
if (registrationData.metadata !== undefined) {
|
|
96
|
+
updateSet.metadata = registrationData.metadata;
|
|
97
|
+
}
|
|
98
|
+
return updateSet;
|
|
99
|
+
}))
|
|
38
100
|
.executeTakeFirst();
|
|
39
101
|
}
|
|
40
102
|
/**
|
|
@@ -43,8 +105,7 @@ export class RegistrationStore {
|
|
|
43
105
|
async getTenantRegistration(tenantDid) {
|
|
44
106
|
const result = await this.db
|
|
45
107
|
.selectFrom(RegistrationStore.registeredTenantTableName)
|
|
46
|
-
.select('did')
|
|
47
|
-
.select('termsOfServiceHash')
|
|
108
|
+
.select(['did', 'termsOfServiceHash', 'suspended', 'accountId', 'registrationType', 'registeredAt', 'metadata'])
|
|
48
109
|
.where('did', '=', tenantDid)
|
|
49
110
|
.execute();
|
|
50
111
|
if (result.length === 0) {
|
|
@@ -52,5 +113,181 @@ export class RegistrationStore {
|
|
|
52
113
|
}
|
|
53
114
|
return result[0];
|
|
54
115
|
}
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
// Admin operations
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
/**
|
|
120
|
+
* Returns a paginated list of registered tenants with optional search and status filtering.
|
|
121
|
+
*
|
|
122
|
+
* @see https://github.com/enboxorg/enbox/issues/390
|
|
123
|
+
*/
|
|
124
|
+
async listTenants(options) {
|
|
125
|
+
const limit = options?.limit ?? 20;
|
|
126
|
+
let query = this.db
|
|
127
|
+
.selectFrom(RegistrationStore.registeredTenantTableName)
|
|
128
|
+
.select(['did', 'termsOfServiceHash', 'suspended', 'accountId', 'registrationType', 'registeredAt', 'metadata'])
|
|
129
|
+
.orderBy('did', 'asc')
|
|
130
|
+
.limit(limit + 1); // fetch one extra to detect next page
|
|
131
|
+
if (options?.cursor) {
|
|
132
|
+
query = query.where('did', '>', options.cursor);
|
|
133
|
+
}
|
|
134
|
+
if (options?.search) {
|
|
135
|
+
query = query.where('did', 'like', `%${escapeLikeWildcards(options.search)}%`);
|
|
136
|
+
}
|
|
137
|
+
if (options?.status === 'suspended') {
|
|
138
|
+
query = query.where('suspended', '=', 1);
|
|
139
|
+
}
|
|
140
|
+
else if (options?.status === 'active') {
|
|
141
|
+
query = query.where('suspended', '=', 0);
|
|
142
|
+
}
|
|
143
|
+
const results = await query.execute();
|
|
144
|
+
let cursor;
|
|
145
|
+
if (results.length > limit) {
|
|
146
|
+
results.pop();
|
|
147
|
+
cursor = results[results.length - 1].did;
|
|
148
|
+
}
|
|
149
|
+
return { tenants: results, cursor };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Returns the total count of registered tenants matching optional filters.
|
|
153
|
+
*/
|
|
154
|
+
async getTenantCount(options) {
|
|
155
|
+
let query = this.db
|
|
156
|
+
.selectFrom(RegistrationStore.registeredTenantTableName)
|
|
157
|
+
.select(sql `count(*)`.as('count'));
|
|
158
|
+
if (options?.search) {
|
|
159
|
+
query = query.where('did', 'like', `%${escapeLikeWildcards(options.search)}%`);
|
|
160
|
+
}
|
|
161
|
+
if (options?.status === 'suspended') {
|
|
162
|
+
query = query.where('suspended', '=', 1);
|
|
163
|
+
}
|
|
164
|
+
else if (options?.status === 'active') {
|
|
165
|
+
query = query.where('suspended', '=', 0);
|
|
166
|
+
}
|
|
167
|
+
const result = await query.executeTakeFirstOrThrow();
|
|
168
|
+
return Number(result.count);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Inserts a new tenant registration. Returns `false` if the tenant already exists.
|
|
172
|
+
*
|
|
173
|
+
* @see https://github.com/enboxorg/enbox/issues/393
|
|
174
|
+
*/
|
|
175
|
+
async createTenant(did) {
|
|
176
|
+
try {
|
|
177
|
+
await this.db
|
|
178
|
+
.insertInto(RegistrationStore.registeredTenantTableName)
|
|
179
|
+
.values({ did, termsOfServiceHash: '', suspended: 0 })
|
|
180
|
+
.execute();
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Unique constraint violation — tenant already exists.
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Suspends a tenant. Returns `true` if the tenant was found and suspended.
|
|
190
|
+
*/
|
|
191
|
+
async suspendTenant(did) {
|
|
192
|
+
const result = await this.db
|
|
193
|
+
.updateTable(RegistrationStore.registeredTenantTableName)
|
|
194
|
+
.set({ suspended: 1 })
|
|
195
|
+
.where('did', '=', did)
|
|
196
|
+
.executeTakeFirst();
|
|
197
|
+
return Number(result.numUpdatedRows) > 0;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Unsuspends a tenant. Returns `true` if the tenant was found and unsuspended.
|
|
201
|
+
*/
|
|
202
|
+
async unsuspendTenant(did) {
|
|
203
|
+
const result = await this.db
|
|
204
|
+
.updateTable(RegistrationStore.registeredTenantTableName)
|
|
205
|
+
.set({ suspended: 0 })
|
|
206
|
+
.where('did', '=', did)
|
|
207
|
+
.executeTakeFirst();
|
|
208
|
+
return Number(result.numUpdatedRows) > 0;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Deletes a tenant registration. Returns `true` if the tenant was found and deleted.
|
|
212
|
+
*/
|
|
213
|
+
async deleteTenant(did) {
|
|
214
|
+
const result = await this.db
|
|
215
|
+
.deleteFrom(RegistrationStore.registeredTenantTableName)
|
|
216
|
+
.where('did', '=', did)
|
|
217
|
+
.executeTakeFirst();
|
|
218
|
+
return Number(result.numDeletedRows) > 0;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Returns all tenant registrations associated with the given account ID.
|
|
222
|
+
*
|
|
223
|
+
* @see https://github.com/enboxorg/enbox/issues/404
|
|
224
|
+
*/
|
|
225
|
+
async getTenantsForAccount(accountId) {
|
|
226
|
+
return this.db
|
|
227
|
+
.selectFrom(RegistrationStore.registeredTenantTableName)
|
|
228
|
+
.select(['did', 'termsOfServiceHash', 'suspended', 'accountId', 'registrationType', 'registeredAt', 'metadata'])
|
|
229
|
+
.where('accountId', '=', accountId)
|
|
230
|
+
.orderBy('did', 'asc')
|
|
231
|
+
.execute();
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Returns the count of suspended tenants.
|
|
235
|
+
*/
|
|
236
|
+
async getSuspendedCount() {
|
|
237
|
+
const result = await this.db
|
|
238
|
+
.selectFrom(RegistrationStore.registeredTenantTableName)
|
|
239
|
+
.select(sql `count(*)`.as('count'))
|
|
240
|
+
.where('suspended', '=', 1)
|
|
241
|
+
.executeTakeFirstOrThrow();
|
|
242
|
+
return Number(result.count);
|
|
243
|
+
}
|
|
244
|
+
// ---------------------------------------------------------------------------
|
|
245
|
+
// Tenant quota operations
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
/**
|
|
248
|
+
* Returns the quota for a tenant, or `undefined` if no per-tenant quota is set.
|
|
249
|
+
*/
|
|
250
|
+
async getQuota(did) {
|
|
251
|
+
const result = await this.db
|
|
252
|
+
.selectFrom(RegistrationStore.tenantQuotasTableName)
|
|
253
|
+
.select(['did', 'maxMessages', 'maxStorageBytes'])
|
|
254
|
+
.where('did', '=', did)
|
|
255
|
+
.executeTakeFirst();
|
|
256
|
+
if (result === undefined) {
|
|
257
|
+
return undefined;
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
did: result.did,
|
|
261
|
+
maxMessages: Number(result.maxMessages),
|
|
262
|
+
maxStorageBytes: Number(result.maxStorageBytes),
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Sets (inserts or updates) the quota for a tenant.
|
|
267
|
+
*/
|
|
268
|
+
async setQuota(quota) {
|
|
269
|
+
await this.db
|
|
270
|
+
.insertInto(RegistrationStore.tenantQuotasTableName)
|
|
271
|
+
.values({
|
|
272
|
+
did: quota.did,
|
|
273
|
+
maxMessages: quota.maxMessages,
|
|
274
|
+
maxStorageBytes: quota.maxStorageBytes,
|
|
275
|
+
})
|
|
276
|
+
.onConflict((oc) => oc.column('did').doUpdateSet({
|
|
277
|
+
maxMessages: quota.maxMessages,
|
|
278
|
+
maxStorageBytes: quota.maxStorageBytes,
|
|
279
|
+
}))
|
|
280
|
+
.executeTakeFirst();
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Deletes the per-tenant quota. Returns `true` if a quota existed and was deleted.
|
|
284
|
+
*/
|
|
285
|
+
async deleteQuota(did) {
|
|
286
|
+
const result = await this.db
|
|
287
|
+
.deleteFrom(RegistrationStore.tenantQuotasTableName)
|
|
288
|
+
.where('did', '=', did)
|
|
289
|
+
.executeTakeFirst();
|
|
290
|
+
return Number(result.numDeletedRows) > 0;
|
|
291
|
+
}
|
|
55
292
|
}
|
|
56
293
|
//# sourceMappingURL=registration-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registration-store.js","sourceRoot":"","sources":["../../../../src/registration/registration-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registration-store.js","sourceRoot":"","sources":["../../../../src/registration/registration-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type { DidResolver } from '@enbox/dids';
|
|
2
|
-
import type { DataStore, DwnConfig, EventLog, EventStream, MessageStore, ResumableTaskStore, TenantGate } from '@enbox/dwn-sdk-js';
|
|
3
1
|
import type { Dialect } from '@enbox/dwn-sql-store';
|
|
2
|
+
import type { DidResolver } from '@enbox/dids';
|
|
4
3
|
import type { DwnServerConfig } from './config.js';
|
|
4
|
+
import type { DataStore, DwnConfig, EventLog, MessageStore, ResumableTaskStore, StateIndex, TenantGate } from '@enbox/dwn-sdk-js';
|
|
5
5
|
export declare enum StoreType {
|
|
6
6
|
DataStore = 0,
|
|
7
7
|
MessageStore = 1,
|
|
8
|
-
|
|
8
|
+
StateIndex = 2,
|
|
9
9
|
ResumableTaskStore = 3
|
|
10
10
|
}
|
|
11
11
|
export declare enum BackendTypes {
|
|
@@ -14,11 +14,11 @@ export declare enum BackendTypes {
|
|
|
14
14
|
MYSQL = "mysql",
|
|
15
15
|
POSTGRES = "postgres"
|
|
16
16
|
}
|
|
17
|
-
export type DwnStore = DataStore |
|
|
17
|
+
export type DwnStore = DataStore | StateIndex | MessageStore | ResumableTaskStore;
|
|
18
18
|
export declare function getDwnConfig(config: DwnServerConfig, options: {
|
|
19
19
|
didResolver?: DidResolver;
|
|
20
20
|
tenantGate?: TenantGate;
|
|
21
|
-
|
|
21
|
+
eventLog?: EventLog;
|
|
22
22
|
}): Promise<DwnConfig>;
|
|
23
23
|
export declare function getDialectFromUrl(connectionUrl: URL): Dialect;
|
|
24
24
|
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,UAAU,EACX,MAAM,mBAAmB,CAAC;AA6B3B,oBAAY,SAAS;IACnB,SAAS,IAAA;IACT,YAAY,IAAA;IACZ,UAAU,IAAA;IACV,kBAAkB,IAAA;CACnB;AAED,oBAAY,YAAY;IACtB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,QAAQ,aAAa;CACtB;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,kBAAkB,CAAC;AA4ClF,wBAAsB,YAAY,CAChC,MAAM,EAAG,eAAe,EACxB,OAAO,EAAG;IACR,WAAW,CAAC,EAAG,WAAW,CAAC;IAC3B,UAAU,CAAC,EAAG,UAAU,CAAC;IACzB,QAAQ,CAAC,EAAG,QAAQ,CAAC;CACtB,GACA,OAAO,CAAC,SAAS,CAAC,CAcpB;AAmJD,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,GAAG,GAAG,OAAO,CA4B7D"}
|
package/dist/esm/src/storage.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import Cursor from 'pg-cursor';
|
|
3
|
-
import Database from 'better-sqlite3';
|
|
4
|
-
import pg from 'pg';
|
|
5
3
|
import { createPool as MySQLCreatePool } from 'mysql2';
|
|
4
|
+
import pg from 'pg';
|
|
5
|
+
import { Kysely } from 'kysely';
|
|
6
|
+
import { createBunSqliteDatabase } from '@enbox/dwn-sql-store';
|
|
6
7
|
import { PluginLoader } from './plugin-loader.js';
|
|
7
|
-
import { DataStoreLevel,
|
|
8
|
-
import { DataStoreSql,
|
|
8
|
+
import { DataStoreLevel, MessageStoreLevel, ResumableTaskStoreLevel, StateIndexLevel, } from '@enbox/dwn-sdk-js';
|
|
9
|
+
import { DataStoreSql, MessageStoreSql, MysqlDialect, PostgresDialect, ResumableTaskStoreSql, runDwnStoreMigrations, SqliteDialect, StateIndexSql, } from '@enbox/dwn-sql-store';
|
|
9
10
|
export var StoreType;
|
|
10
11
|
(function (StoreType) {
|
|
11
12
|
StoreType[StoreType["DataStore"] = 0] = "DataStore";
|
|
12
13
|
StoreType[StoreType["MessageStore"] = 1] = "MessageStore";
|
|
13
|
-
StoreType[StoreType["
|
|
14
|
+
StoreType[StoreType["StateIndex"] = 2] = "StateIndex";
|
|
14
15
|
StoreType[StoreType["ResumableTaskStore"] = 3] = "ResumableTaskStore";
|
|
15
16
|
})(StoreType || (StoreType = {}));
|
|
16
17
|
export var BackendTypes;
|
|
@@ -20,13 +21,92 @@ export var BackendTypes;
|
|
|
20
21
|
BackendTypes["MYSQL"] = "mysql";
|
|
21
22
|
BackendTypes["POSTGRES"] = "postgres";
|
|
22
23
|
})(BackendTypes || (BackendTypes = {}));
|
|
24
|
+
/**
|
|
25
|
+
* Cache of shared PostgreSQL dialects keyed by connection URL. When multiple
|
|
26
|
+
* DWN stores share the same Postgres URL, they reuse a single dialect (and
|
|
27
|
+
* thus a single `pg.Pool`) instead of each creating their own. This reduces
|
|
28
|
+
* connection count from 4 × pool_max to 1 × pool_max per DWN process.
|
|
29
|
+
*/
|
|
30
|
+
const sharedDialectCache = new Map();
|
|
31
|
+
/**
|
|
32
|
+
* Returns a (potentially cached) dialect for the given Postgres connection URL.
|
|
33
|
+
* Non-Postgres URLs always return a fresh dialect (no caching).
|
|
34
|
+
*/
|
|
35
|
+
function getOrCreateDialect(connectionUrl, config) {
|
|
36
|
+
const protocol = connectionUrl.protocol.slice(0, -1);
|
|
37
|
+
if (protocol !== BackendTypes.POSTGRES) {
|
|
38
|
+
return getDialectFromUrl(connectionUrl);
|
|
39
|
+
}
|
|
40
|
+
const key = connectionUrl.toString();
|
|
41
|
+
const cached = sharedDialectCache.get(key);
|
|
42
|
+
if (cached !== undefined) {
|
|
43
|
+
return cached;
|
|
44
|
+
}
|
|
45
|
+
// Create a single pg.Pool instance with configurable sizing.
|
|
46
|
+
const pool = new pg.Pool({
|
|
47
|
+
connectionString: connectionUrl.toString(),
|
|
48
|
+
min: config.pgPoolMin,
|
|
49
|
+
max: config.pgPoolMax,
|
|
50
|
+
idleTimeoutMillis: config.pgPoolIdleTimeout,
|
|
51
|
+
});
|
|
52
|
+
const dialect = new PostgresDialect({
|
|
53
|
+
pool: async () => pool,
|
|
54
|
+
cursor: Cursor,
|
|
55
|
+
});
|
|
56
|
+
sharedDialectCache.set(key, dialect);
|
|
57
|
+
return dialect;
|
|
58
|
+
}
|
|
23
59
|
export async function getDwnConfig(config, options) {
|
|
24
|
-
const { tenantGate,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
60
|
+
const { tenantGate, eventLog, didResolver } = options;
|
|
61
|
+
// Run SQL schema migrations before creating stores. Uses the data store
|
|
62
|
+
// connection to determine the dialect — all SQL stores typically share the
|
|
63
|
+
// same database. Non-SQL backends (level://) are skipped.
|
|
64
|
+
await runSqlMigrationsIfNeeded(config);
|
|
65
|
+
const dataStore = await getStore(config, config.dataStore, StoreType.DataStore);
|
|
66
|
+
const stateIndex = await getStore(config, config.stateIndex, StoreType.StateIndex);
|
|
67
|
+
const messageStore = await getStore(config, config.messageStore, StoreType.MessageStore);
|
|
68
|
+
const resumableTaskStore = await getStore(config, config.resumableTaskStore, StoreType.ResumableTaskStore);
|
|
69
|
+
return { didResolver, eventLog, stateIndex, dataStore, messageStore, resumableTaskStore, tenantGate };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Runs DWN SQL schema migrations if the data store is configured with a SQL
|
|
73
|
+
* backend. Creates a temporary Kysely instance, runs all pending migrations,
|
|
74
|
+
* then destroys it. The subsequent store `open()` calls will reuse the shared
|
|
75
|
+
* dialect/pool and find the schema already in place.
|
|
76
|
+
*/
|
|
77
|
+
async function runSqlMigrationsIfNeeded(config) {
|
|
78
|
+
// Skip if the data store config is a file path (plugin) or non-SQL backend
|
|
79
|
+
if (isFilePath(config.dataStore)) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
let storeUrl;
|
|
83
|
+
try {
|
|
84
|
+
storeUrl = new URL(config.dataStore);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return; // Not a valid URL — skip
|
|
88
|
+
}
|
|
89
|
+
const protocol = storeUrl.protocol.slice(0, -1);
|
|
90
|
+
const sqlBackends = [BackendTypes.SQLITE, BackendTypes.MYSQL, BackendTypes.POSTGRES];
|
|
91
|
+
if (!sqlBackends.includes(protocol)) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const dialect = getOrCreateDialect(storeUrl, config);
|
|
95
|
+
const db = new Kysely({ dialect });
|
|
96
|
+
try {
|
|
97
|
+
const applied = await runDwnStoreMigrations(db, dialect);
|
|
98
|
+
if (applied.length > 0) {
|
|
99
|
+
console.log(`DWN migrations applied: ${applied.join(', ')}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
// Don't destroy the Kysely instance if using a shared Postgres pool —
|
|
104
|
+
// the pool is cached in sharedDialectCache and will be reused by stores.
|
|
105
|
+
// Only destroy for non-cached dialects (SQLite, MySQL).
|
|
106
|
+
if (protocol !== BackendTypes.POSTGRES) {
|
|
107
|
+
await db.destroy();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
30
110
|
}
|
|
31
111
|
function getLevelStore(storeURI, storeType) {
|
|
32
112
|
switch (storeType) {
|
|
@@ -39,9 +119,9 @@ function getLevelStore(storeURI, storeType) {
|
|
|
39
119
|
blockstoreLocation: storeURI.host + storeURI.pathname + '/MESSAGESTORE',
|
|
40
120
|
indexLocation: storeURI.host + storeURI.pathname + '/INDEX',
|
|
41
121
|
});
|
|
42
|
-
case StoreType.
|
|
43
|
-
return new
|
|
44
|
-
location: storeURI.host + storeURI.pathname + '/
|
|
122
|
+
case StoreType.StateIndex:
|
|
123
|
+
return new StateIndexLevel({
|
|
124
|
+
location: storeURI.host + storeURI.pathname + '/STATEINDEX',
|
|
45
125
|
});
|
|
46
126
|
case StoreType.ResumableTaskStore:
|
|
47
127
|
return new ResumableTaskStoreLevel({
|
|
@@ -51,15 +131,15 @@ function getLevelStore(storeURI, storeType) {
|
|
|
51
131
|
throw new Error('Unexpected level store type');
|
|
52
132
|
}
|
|
53
133
|
}
|
|
54
|
-
function getSqlStore(connectionUrl, storeType) {
|
|
55
|
-
const dialect =
|
|
134
|
+
function getSqlStore(config, connectionUrl, storeType) {
|
|
135
|
+
const dialect = getOrCreateDialect(connectionUrl, config);
|
|
56
136
|
switch (storeType) {
|
|
57
137
|
case StoreType.DataStore:
|
|
58
138
|
return new DataStoreSql(dialect);
|
|
59
139
|
case StoreType.MessageStore:
|
|
60
140
|
return new MessageStoreSql(dialect);
|
|
61
|
-
case StoreType.
|
|
62
|
-
return new
|
|
141
|
+
case StoreType.StateIndex:
|
|
142
|
+
return new StateIndexSql(dialect);
|
|
63
143
|
case StoreType.ResumableTaskStore:
|
|
64
144
|
return new ResumableTaskStoreSql(dialect);
|
|
65
145
|
default:
|
|
@@ -73,7 +153,7 @@ function isFilePath(configString) {
|
|
|
73
153
|
const filePathPrefixes = ['/', './', '../'];
|
|
74
154
|
return filePathPrefixes.some(prefix => configString.startsWith(prefix));
|
|
75
155
|
}
|
|
76
|
-
async function getStore(storeConfigString, storeType) {
|
|
156
|
+
async function getStore(config, storeConfigString, storeType) {
|
|
77
157
|
if (isFilePath(storeConfigString)) {
|
|
78
158
|
return await loadStoreFromFilePath(storeConfigString, storeType);
|
|
79
159
|
}
|
|
@@ -85,7 +165,7 @@ async function getStore(storeConfigString, storeType) {
|
|
|
85
165
|
case BackendTypes.SQLITE:
|
|
86
166
|
case BackendTypes.MYSQL:
|
|
87
167
|
case BackendTypes.POSTGRES:
|
|
88
|
-
return getSqlStore(storeURI, storeType);
|
|
168
|
+
return getSqlStore(config, storeURI, storeType);
|
|
89
169
|
default:
|
|
90
170
|
throw invalidStorageSchemeMessage(storeURI.protocol);
|
|
91
171
|
}
|
|
@@ -97,7 +177,7 @@ async function loadStoreFromFilePath(filePath, storeType) {
|
|
|
97
177
|
switch (storeType) {
|
|
98
178
|
case StoreType.DataStore:
|
|
99
179
|
return await PluginLoader.loadPlugin(filePath);
|
|
100
|
-
case StoreType.
|
|
180
|
+
case StoreType.StateIndex:
|
|
101
181
|
return await PluginLoader.loadPlugin(filePath);
|
|
102
182
|
case StoreType.MessageStore:
|
|
103
183
|
return await PluginLoader.loadPlugin(filePath);
|
|
@@ -109,7 +189,7 @@ async function loadStoreFromFilePath(filePath, storeType) {
|
|
|
109
189
|
}
|
|
110
190
|
export function getDialectFromUrl(connectionUrl) {
|
|
111
191
|
switch (connectionUrl.protocol.slice(0, -1)) {
|
|
112
|
-
case BackendTypes.SQLITE:
|
|
192
|
+
case BackendTypes.SQLITE: {
|
|
113
193
|
const path = connectionUrl.host + connectionUrl.pathname;
|
|
114
194
|
console.log('SQL-lite relative path:', path ? path : undefined); // NOTE, using ? for lose equality comparison
|
|
115
195
|
if (connectionUrl.host && !fs.existsSync(connectionUrl.host)) {
|
|
@@ -119,8 +199,9 @@ export function getDialectFromUrl(connectionUrl) {
|
|
|
119
199
|
// Use in-memory database if no path is provided (for tests)
|
|
120
200
|
const dbPath = path || ':memory:';
|
|
121
201
|
return new SqliteDialect({
|
|
122
|
-
database: async () =>
|
|
202
|
+
database: async () => createBunSqliteDatabase(dbPath),
|
|
123
203
|
});
|
|
204
|
+
}
|
|
124
205
|
case BackendTypes.MYSQL:
|
|
125
206
|
return new MysqlDialect({
|
|
126
207
|
pool: async () => MySQLCreatePool(connectionUrl.toString()),
|
|
@@ -138,7 +219,7 @@ function invalidStorageSchemeMessage(protocol) {
|
|
|
138
219
|
schemes.push(value);
|
|
139
220
|
}
|
|
140
221
|
return ('Unknown storage protocol ' +
|
|
141
|
-
protocol.slice(0, 1) +
|
|
222
|
+
protocol.slice(0, -1) +
|
|
142
223
|
'! Please use one of: ' +
|
|
143
224
|
schemes.join(', ') +
|
|
144
225
|
'. For details, see README');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-ttl-cache.d.ts","sourceRoot":"","sources":["../../../../src/web5-connect/sql-ttl-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAkB;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAM;IAEtD,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,EAAE,CAAwB;IAClC,OAAO,CAAC,YAAY,CAAiB;IAErC,OAAO;IAKP;;OAEG;WACiB,MAAM,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;YAQvD,UAAU;IA0BxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;;OAGG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3E;;OAEG;IACU,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"sql-ttl-cache.d.ts","sourceRoot":"","sources":["../../../../src/web5-connect/sql-ttl-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAkB;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAM;IAEtD,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,EAAE,CAAwB;IAClC,OAAO,CAAC,YAAY,CAAiB;IAErC,OAAO;IAKP;;OAEG;WACiB,MAAM,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;YAQvD,UAAU;IA0BxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;;OAGG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3E;;OAEG;IACU,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA+B1D;;OAEG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C;;OAEG;IACU,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;CAMpD"}
|
|
@@ -30,7 +30,7 @@ export class SqlTtlCache {
|
|
|
30
30
|
// 512 chars to accommodate potentially large `state` in Web5 Connect flow
|
|
31
31
|
.addColumn('key', 'varchar(512)', (column) => column.primaryKey())
|
|
32
32
|
.addColumn('value', 'text', (column) => column.notNull())
|
|
33
|
-
.addColumn('expiry', '
|
|
33
|
+
.addColumn('expiry', 'bigint', (column) => column.notNull())
|
|
34
34
|
.execute();
|
|
35
35
|
await this.db.schema
|
|
36
36
|
.createIndex('index_expiry')
|
|
@@ -78,11 +78,19 @@ export class SqlTtlCache {
|
|
|
78
78
|
}
|
|
79
79
|
const entry = result[0];
|
|
80
80
|
// if the entry is expired, don't return it and delete it
|
|
81
|
-
|
|
81
|
+
const expiry = typeof entry.expiry === 'string' ? parseInt(entry.expiry, 10) : entry.expiry;
|
|
82
|
+
if (Date.now() >= expiry) {
|
|
83
|
+
this.delete(key); // no need to await
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
return JSON.parse(entry.value);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Corrupt entry — remove it and return undefined.
|
|
82
91
|
this.delete(key); // no need to await
|
|
83
92
|
return undefined;
|
|
84
93
|
}
|
|
85
|
-
return JSON.parse(entry.value);
|
|
86
94
|
}
|
|
87
95
|
/**
|
|
88
96
|
* Deletes a cache entry.
|