@powerhousedao/reactor-api 6.0.2-staging.2 → 6.0.2-staging.3
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/README.md +6 -0
- package/dist/index.d.mts +2943 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +6375 -0
- package/dist/index.mjs.map +1 -0
- package/dist/src/packages/https-hooks.d.mts +23 -7
- package/dist/src/packages/https-hooks.d.mts.map +1 -1
- package/dist/src/packages/https-hooks.mjs +73 -53
- package/dist/src/packages/https-hooks.mjs.map +1 -1
- package/dist/src/packages/vite-loader.d.mts +29 -0
- package/dist/src/packages/vite-loader.d.mts.map +1 -0
- package/dist/src/packages/vite-loader.mjs +142 -0
- package/dist/src/packages/vite-loader.mjs.map +1 -0
- package/dist/types-Do4QTfT3.d.mts +37 -0
- package/dist/types-Do4QTfT3.d.mts.map +1 -0
- package/dist/utils-DEEhP99G.mjs +286 -0
- package/dist/utils-DEEhP99G.mjs.map +1 -0
- package/package.json +45 -32
- package/dist/codegen.d.ts +0 -4
- package/dist/codegen.d.ts.map +0 -1
- package/dist/codegen.js +0 -38
- package/dist/codegen.js.map +0 -1
- package/dist/index.d.ts +0 -16
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -16
- package/dist/index.js.map +0 -1
- package/dist/src/config.d.ts +0 -6
- package/dist/src/config.d.ts.map +0 -1
- package/dist/src/config.js +0 -6
- package/dist/src/config.js.map +0 -1
- package/dist/src/dev.d.ts +0 -2
- package/dist/src/dev.d.ts.map +0 -1
- package/dist/src/dev.js +0 -51
- package/dist/src/dev.js.map +0 -1
- package/dist/src/graphql/analytics-subgraph.d.ts +0 -14
- package/dist/src/graphql/analytics-subgraph.d.ts.map +0 -1
- package/dist/src/graphql/analytics-subgraph.js +0 -26
- package/dist/src/graphql/analytics-subgraph.js.map +0 -1
- package/dist/src/graphql/auth/index.d.ts +0 -2
- package/dist/src/graphql/auth/index.d.ts.map +0 -1
- package/dist/src/graphql/auth/index.js +0 -2
- package/dist/src/graphql/auth/index.js.map +0 -1
- package/dist/src/graphql/auth/resolvers.d.ts +0 -166
- package/dist/src/graphql/auth/resolvers.d.ts.map +0 -1
- package/dist/src/graphql/auth/resolvers.js +0 -227
- package/dist/src/graphql/auth/resolvers.js.map +0 -1
- package/dist/src/graphql/auth/schema.graphql +0 -195
- package/dist/src/graphql/auth/subgraph.d.ts +0 -202
- package/dist/src/graphql/auth/subgraph.d.ts.map +0 -1
- package/dist/src/graphql/auth/subgraph.js +0 -384
- package/dist/src/graphql/auth/subgraph.js.map +0 -1
- package/dist/src/graphql/base-subgraph.d.ts +0 -28
- package/dist/src/graphql/base-subgraph.d.ts.map +0 -1
- package/dist/src/graphql/base-subgraph.js +0 -126
- package/dist/src/graphql/base-subgraph.js.map +0 -1
- package/dist/src/graphql/document-model-subgraph.d.ts +0 -105
- package/dist/src/graphql/document-model-subgraph.d.ts.map +0 -1
- package/dist/src/graphql/document-model-subgraph.js +0 -312
- package/dist/src/graphql/document-model-subgraph.js.map +0 -1
- package/dist/src/graphql/graphql-manager.d.ts +0 -68
- package/dist/src/graphql/graphql-manager.d.ts.map +0 -1
- package/dist/src/graphql/graphql-manager.js +0 -589
- package/dist/src/graphql/graphql-manager.js.map +0 -1
- package/dist/src/graphql/index.d.ts +0 -10
- package/dist/src/graphql/index.d.ts.map +0 -1
- package/dist/src/graphql/index.js +0 -10
- package/dist/src/graphql/index.js.map +0 -1
- package/dist/src/graphql/packages/index.d.ts +0 -2
- package/dist/src/graphql/packages/index.d.ts.map +0 -1
- package/dist/src/graphql/packages/index.js +0 -2
- package/dist/src/graphql/packages/index.js.map +0 -1
- package/dist/src/graphql/packages/resolvers.d.ts +0 -31
- package/dist/src/graphql/packages/resolvers.d.ts.map +0 -1
- package/dist/src/graphql/packages/resolvers.js +0 -37
- package/dist/src/graphql/packages/resolvers.js.map +0 -1
- package/dist/src/graphql/packages/schema.graphql +0 -50
- package/dist/src/graphql/packages/subgraph.d.ts +0 -55
- package/dist/src/graphql/packages/subgraph.d.ts.map +0 -1
- package/dist/src/graphql/packages/subgraph.js +0 -73
- package/dist/src/graphql/packages/subgraph.js.map +0 -1
- package/dist/src/graphql/playground.d.ts +0 -2
- package/dist/src/graphql/playground.d.ts.map +0 -1
- package/dist/src/graphql/playground.js +0 -81
- package/dist/src/graphql/playground.js.map +0 -1
- package/dist/src/graphql/reactor/adapters.d.ts +0 -62
- package/dist/src/graphql/reactor/adapters.d.ts.map +0 -1
- package/dist/src/graphql/reactor/adapters.js +0 -271
- package/dist/src/graphql/reactor/adapters.js.map +0 -1
- package/dist/src/graphql/reactor/factory.d.ts +0 -105
- package/dist/src/graphql/reactor/factory.d.ts.map +0 -1
- package/dist/src/graphql/reactor/factory.js +0 -7
- package/dist/src/graphql/reactor/factory.js.map +0 -1
- package/dist/src/graphql/reactor/gen/graphql.d.ts +0 -1489
- package/dist/src/graphql/reactor/gen/graphql.d.ts.map +0 -1
- package/dist/src/graphql/reactor/gen/graphql.js +0 -731
- package/dist/src/graphql/reactor/gen/graphql.js.map +0 -1
- package/dist/src/graphql/reactor/index.d.ts +0 -4
- package/dist/src/graphql/reactor/index.d.ts.map +0 -1
- package/dist/src/graphql/reactor/index.js +0 -4
- package/dist/src/graphql/reactor/index.js.map +0 -1
- package/dist/src/graphql/reactor/operations.graphql +0 -443
- package/dist/src/graphql/reactor/pubsub.d.ts +0 -27
- package/dist/src/graphql/reactor/pubsub.d.ts.map +0 -1
- package/dist/src/graphql/reactor/pubsub.js +0 -93
- package/dist/src/graphql/reactor/pubsub.js.map +0 -1
- package/dist/src/graphql/reactor/requester.d.ts +0 -4
- package/dist/src/graphql/reactor/requester.d.ts.map +0 -1
- package/dist/src/graphql/reactor/requester.js +0 -22
- package/dist/src/graphql/reactor/requester.js.map +0 -1
- package/dist/src/graphql/reactor/requester.with-zod.d.ts +0 -4
- package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +0 -1
- package/dist/src/graphql/reactor/requester.with-zod.js +0 -129
- package/dist/src/graphql/reactor/requester.with-zod.js.map +0 -1
- package/dist/src/graphql/reactor/resolvers.d.ts +0 -223
- package/dist/src/graphql/reactor/resolvers.d.ts.map +0 -1
- package/dist/src/graphql/reactor/resolvers.js +0 -682
- package/dist/src/graphql/reactor/resolvers.js.map +0 -1
- package/dist/src/graphql/reactor/schema.graphql +0 -475
- package/dist/src/graphql/reactor/subgraph.d.ts +0 -18
- package/dist/src/graphql/reactor/subgraph.d.ts.map +0 -1
- package/dist/src/graphql/reactor/subgraph.js +0 -457
- package/dist/src/graphql/reactor/subgraph.js.map +0 -1
- package/dist/src/graphql/reactor/validation.d.ts +0 -348
- package/dist/src/graphql/reactor/validation.d.ts.map +0 -1
- package/dist/src/graphql/reactor/validation.js +0 -167
- package/dist/src/graphql/reactor/validation.js.map +0 -1
- package/dist/src/graphql/sse.d.ts +0 -42
- package/dist/src/graphql/sse.d.ts.map +0 -1
- package/dist/src/graphql/sse.js +0 -33
- package/dist/src/graphql/sse.js.map +0 -1
- package/dist/src/graphql/system/env/getters.d.ts +0 -2
- package/dist/src/graphql/system/env/getters.d.ts.map +0 -1
- package/dist/src/graphql/system/env/getters.js +0 -4
- package/dist/src/graphql/system/env/getters.js.map +0 -1
- package/dist/src/graphql/system/env/index.d.ts +0 -2
- package/dist/src/graphql/system/env/index.d.ts.map +0 -1
- package/dist/src/graphql/system/env/index.js +0 -5
- package/dist/src/graphql/system/env/index.js.map +0 -1
- package/dist/src/graphql/system/index.d.ts +0 -2
- package/dist/src/graphql/system/index.d.ts.map +0 -1
- package/dist/src/graphql/system/index.js +0 -2
- package/dist/src/graphql/system/index.js.map +0 -1
- package/dist/src/graphql/system/types.d.ts +0 -2
- package/dist/src/graphql/system/types.d.ts.map +0 -1
- package/dist/src/graphql/system/types.js +0 -2
- package/dist/src/graphql/system/types.js.map +0 -1
- package/dist/src/graphql/temp-hack-rwa-type-defs.d.ts +0 -57
- package/dist/src/graphql/temp-hack-rwa-type-defs.d.ts.map +0 -1
- package/dist/src/graphql/temp-hack-rwa-type-defs.js +0 -2
- package/dist/src/graphql/temp-hack-rwa-type-defs.js.map +0 -1
- package/dist/src/graphql/types.d.ts +0 -102
- package/dist/src/graphql/types.d.ts.map +0 -1
- package/dist/src/graphql/types.js +0 -2
- package/dist/src/graphql/types.js.map +0 -1
- package/dist/src/graphql/utils.d.ts +0 -9
- package/dist/src/graphql/utils.d.ts.map +0 -1
- package/dist/src/graphql/utils.js +0 -72
- package/dist/src/graphql/utils.js.map +0 -1
- package/dist/src/graphql/websocket.d.ts +0 -3
- package/dist/src/graphql/websocket.d.ts.map +0 -1
- package/dist/src/graphql/websocket.js +0 -15
- package/dist/src/graphql/websocket.js.map +0 -1
- package/dist/src/migrations/001_create_document_permissions.d.ts +0 -4
- package/dist/src/migrations/001_create_document_permissions.d.ts.map +0 -1
- package/dist/src/migrations/001_create_document_permissions.js +0 -91
- package/dist/src/migrations/001_create_document_permissions.js.map +0 -1
- package/dist/src/migrations/002_add_document_protection.d.ts +0 -4
- package/dist/src/migrations/002_add_document_protection.d.ts.map +0 -1
- package/dist/src/migrations/002_add_document_protection.js +0 -18
- package/dist/src/migrations/002_add_document_protection.js.map +0 -1
- package/dist/src/migrations/index.d.ts +0 -10
- package/dist/src/migrations/index.d.ts.map +0 -1
- package/dist/src/migrations/index.js +0 -58
- package/dist/src/migrations/index.js.map +0 -1
- package/dist/src/packages/http-loader.d.ts +0 -68
- package/dist/src/packages/http-loader.d.ts.map +0 -1
- package/dist/src/packages/http-loader.js +0 -176
- package/dist/src/packages/http-loader.js.map +0 -1
- package/dist/src/packages/import-loader.d.ts +0 -14
- package/dist/src/packages/import-loader.d.ts.map +0 -1
- package/dist/src/packages/import-loader.js +0 -46
- package/dist/src/packages/import-loader.js.map +0 -1
- package/dist/src/packages/import-resolver.d.ts +0 -5
- package/dist/src/packages/import-resolver.d.ts.map +0 -1
- package/dist/src/packages/import-resolver.js +0 -127
- package/dist/src/packages/import-resolver.js.map +0 -1
- package/dist/src/packages/package-manager.d.ts +0 -34
- package/dist/src/packages/package-manager.d.ts.map +0 -1
- package/dist/src/packages/package-manager.js +0 -213
- package/dist/src/packages/package-manager.js.map +0 -1
- package/dist/src/packages/types.d.ts +0 -38
- package/dist/src/packages/types.d.ts.map +0 -1
- package/dist/src/packages/types.js +0 -2
- package/dist/src/packages/types.js.map +0 -1
- package/dist/src/packages/util.d.ts +0 -27
- package/dist/src/packages/util.d.ts.map +0 -1
- package/dist/src/packages/util.js +0 -97
- package/dist/src/packages/util.js.map +0 -1
- package/dist/src/packages/vite-loader.d.ts +0 -24
- package/dist/src/packages/vite-loader.d.ts.map +0 -1
- package/dist/src/packages/vite-loader.js +0 -169
- package/dist/src/packages/vite-loader.js.map +0 -1
- package/dist/src/server.d.ts +0 -56
- package/dist/src/server.d.ts.map +0 -1
- package/dist/src/server.js +0 -365
- package/dist/src/server.js.map +0 -1
- package/dist/src/services/auth.service.d.ts +0 -56
- package/dist/src/services/auth.service.d.ts.map +0 -1
- package/dist/src/services/auth.service.js +0 -172
- package/dist/src/services/auth.service.js.map +0 -1
- package/dist/src/services/authorization.service.d.ts +0 -70
- package/dist/src/services/authorization.service.d.ts.map +0 -1
- package/dist/src/services/authorization.service.js +0 -155
- package/dist/src/services/authorization.service.js.map +0 -1
- package/dist/src/services/document-permission.service.d.ts +0 -241
- package/dist/src/services/document-permission.service.d.ts.map +0 -1
- package/dist/src/services/document-permission.service.js +0 -791
- package/dist/src/services/document-permission.service.js.map +0 -1
- package/dist/src/services/package-management.service.d.ts +0 -32
- package/dist/src/services/package-management.service.d.ts.map +0 -1
- package/dist/src/services/package-management.service.js +0 -95
- package/dist/src/services/package-management.service.js.map +0 -1
- package/dist/src/services/package-storage.d.ts +0 -23
- package/dist/src/services/package-storage.d.ts.map +0 -1
- package/dist/src/services/package-storage.js +0 -19
- package/dist/src/services/package-storage.js.map +0 -1
- package/dist/src/tracing.d.ts +0 -4
- package/dist/src/tracing.d.ts.map +0 -1
- package/dist/src/tracing.js +0 -140
- package/dist/src/tracing.js.map +0 -1
- package/dist/src/types.d.ts +0 -17
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -2
- package/dist/src/types.js.map +0 -1
- package/dist/src/utils/auth.d.ts +0 -3
- package/dist/src/utils/auth.d.ts.map +0 -1
- package/dist/src/utils/auth.js +0 -12
- package/dist/src/utils/auth.js.map +0 -1
- package/dist/src/utils/create-schema.d.ts +0 -36
- package/dist/src/utils/create-schema.d.ts.map +0 -1
- package/dist/src/utils/create-schema.js +0 -725
- package/dist/src/utils/create-schema.js.map +0 -1
- package/dist/src/utils/db.d.ts +0 -82
- package/dist/src/utils/db.d.ts.map +0 -1
- package/dist/src/utils/db.js +0 -101
- package/dist/src/utils/db.js.map +0 -1
- package/dist/src/utils/drive-url.d.ts +0 -2
- package/dist/src/utils/drive-url.d.ts.map +0 -1
- package/dist/src/utils/drive-url.js +0 -3
- package/dist/src/utils/drive-url.js.map +0 -1
- package/dist/src/utils/index.d.ts +0 -4
- package/dist/src/utils/index.d.ts.map +0 -1
- package/dist/src/utils/index.js +0 -4
- package/dist/src/utils/index.js.map +0 -1
- package/dist/test/authorization.service.test.d.ts +0 -2
- package/dist/test/authorization.service.test.d.ts.map +0 -1
- package/dist/test/authorization.service.test.js +0 -252
- package/dist/test/authorization.service.test.js.map +0 -1
- package/dist/test/benchmarks/load.bench.d.ts +0 -2
- package/dist/test/benchmarks/load.bench.d.ts.map +0 -1
- package/dist/test/benchmarks/load.bench.js +0 -73
- package/dist/test/benchmarks/load.bench.js.map +0 -1
- package/dist/test/benchmarks/sync.bench.d.ts +0 -2
- package/dist/test/benchmarks/sync.bench.d.ts.map +0 -1
- package/dist/test/benchmarks/sync.bench.js +0 -119
- package/dist/test/benchmarks/sync.bench.js.map +0 -1
- package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts +0 -2
- package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts.map +0 -1
- package/dist/test/connect-switchboard-reshuffle-convergence.test.js +0 -203
- package/dist/test/connect-switchboard-reshuffle-convergence.test.js.map +0 -1
- package/dist/test/connect-switchboard-sync.test.d.ts +0 -2
- package/dist/test/connect-switchboard-sync.test.d.ts.map +0 -1
- package/dist/test/connect-switchboard-sync.test.js +0 -632
- package/dist/test/connect-switchboard-sync.test.js.map +0 -1
- package/dist/test/document-drive-subgraph.test.d.ts +0 -2
- package/dist/test/document-drive-subgraph.test.d.ts.map +0 -1
- package/dist/test/document-drive-subgraph.test.js +0 -249
- package/dist/test/document-drive-subgraph.test.js.map +0 -1
- package/dist/test/document-model-subgraph-permissions.test.d.ts +0 -2
- package/dist/test/document-model-subgraph-permissions.test.d.ts.map +0 -1
- package/dist/test/document-model-subgraph-permissions.test.js +0 -587
- package/dist/test/document-model-subgraph-permissions.test.js.map +0 -1
- package/dist/test/document-permission.service.test.d.ts +0 -2
- package/dist/test/document-permission.service.test.d.ts.map +0 -1
- package/dist/test/document-permission.service.test.js +0 -480
- package/dist/test/document-permission.service.test.js.map +0 -1
- package/dist/test/drive-info-endpoint.test.d.ts +0 -2
- package/dist/test/drive-info-endpoint.test.d.ts.map +0 -1
- package/dist/test/drive-info-endpoint.test.js +0 -123
- package/dist/test/drive-info-endpoint.test.js.map +0 -1
- package/dist/test/fault-injection-sync.test.d.ts +0 -2
- package/dist/test/fault-injection-sync.test.d.ts.map +0 -1
- package/dist/test/fault-injection-sync.test.js +0 -196
- package/dist/test/fault-injection-sync.test.js.map +0 -1
- package/dist/test/identity-integration.test.d.ts +0 -2
- package/dist/test/identity-integration.test.d.ts.map +0 -1
- package/dist/test/identity-integration.test.js +0 -349
- package/dist/test/identity-integration.test.js.map +0 -1
- package/dist/test/index.d.ts +0 -2
- package/dist/test/index.d.ts.map +0 -1
- package/dist/test/index.js +0 -2
- package/dist/test/index.js.map +0 -1
- package/dist/test/permissions-integration.test.d.ts +0 -2
- package/dist/test/permissions-integration.test.d.ts.map +0 -1
- package/dist/test/permissions-integration.test.js +0 -407
- package/dist/test/permissions-integration.test.js.map +0 -1
- package/dist/test/push-backfill.test.d.ts +0 -2
- package/dist/test/push-backfill.test.d.ts.map +0 -1
- package/dist/test/push-backfill.test.js +0 -298
- package/dist/test/push-backfill.test.js.map +0 -1
- package/dist/test/reactor-adapters.test.d.ts +0 -2
- package/dist/test/reactor-adapters.test.d.ts.map +0 -1
- package/dist/test/reactor-adapters.test.js +0 -379
- package/dist/test/reactor-adapters.test.js.map +0 -1
- package/dist/test/reactor-client.test.d.ts +0 -2
- package/dist/test/reactor-client.test.d.ts.map +0 -1
- package/dist/test/reactor-client.test.js +0 -371
- package/dist/test/reactor-client.test.js.map +0 -1
- package/dist/test/reactor-resolvers.test.d.ts +0 -2
- package/dist/test/reactor-resolvers.test.d.ts.map +0 -1
- package/dist/test/reactor-resolvers.test.js +0 -258
- package/dist/test/reactor-resolvers.test.js.map +0 -1
- package/dist/test/reactor-subgraph-permissions.test.d.ts +0 -2
- package/dist/test/reactor-subgraph-permissions.test.d.ts.map +0 -1
- package/dist/test/reactor-subgraph-permissions.test.js +0 -371
- package/dist/test/reactor-subgraph-permissions.test.js.map +0 -1
- package/dist/test/router.test.d.ts +0 -2
- package/dist/test/router.test.d.ts.map +0 -1
- package/dist/test/router.test.js +0 -38
- package/dist/test/router.test.js.map +0 -1
- package/dist/test/subscriptions-sse.test.d.ts +0 -2
- package/dist/test/subscriptions-sse.test.d.ts.map +0 -1
- package/dist/test/subscriptions-sse.test.js +0 -264
- package/dist/test/subscriptions-sse.test.js.map +0 -1
- package/dist/test/subscriptions.test.d.ts +0 -2
- package/dist/test/subscriptions.test.d.ts.map +0 -1
- package/dist/test/subscriptions.test.js +0 -248
- package/dist/test/subscriptions.test.js.map +0 -1
- package/dist/test/utils/gql-resolver-bridge.d.ts +0 -15
- package/dist/test/utils/gql-resolver-bridge.d.ts.map +0 -1
- package/dist/test/utils/gql-resolver-bridge.js +0 -89
- package/dist/test/utils/gql-resolver-bridge.js.map +0 -1
- package/dist/test/utils.d.ts +0 -10
- package/dist/test/utils.d.ts.map +0 -1
- package/dist/test/utils.js +0 -23
- package/dist/test/utils.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/vitest.config.d.ts +0 -3
- package/dist/vitest.config.d.ts.map +0 -1
- package/dist/vitest.config.js +0 -38
- package/dist/vitest.config.js.map +0 -1
package/dist/src/server.js
DELETED
|
@@ -1,365 +0,0 @@
|
|
|
1
|
-
import { PostgresAnalyticsStore } from "@powerhousedao/analytics-engine-pg";
|
|
2
|
-
import { getConfig } from "@powerhousedao/config/node";
|
|
3
|
-
import { setupMcpServer } from "@powerhousedao/reactor-mcp";
|
|
4
|
-
import devcert from "devcert";
|
|
5
|
-
import { childLogger, createRelationalDbLegacy } from "document-drive";
|
|
6
|
-
import express from "express";
|
|
7
|
-
import fs from "node:fs";
|
|
8
|
-
import https from "node:https";
|
|
9
|
-
import path from "node:path";
|
|
10
|
-
import { WebSocketServer } from "ws";
|
|
11
|
-
import { config, DefaultCoreSubgraphs } from "./config.js";
|
|
12
|
-
import { AuthSubgraph } from "./graphql/auth/subgraph.js";
|
|
13
|
-
import { GraphQLManager } from "./graphql/graphql-manager.js";
|
|
14
|
-
import { renderGraphqlPlayground } from "./graphql/playground.js";
|
|
15
|
-
import { ReactorSubgraph } from "./graphql/reactor/subgraph.js";
|
|
16
|
-
import { runMigrations } from "./migrations/index.js";
|
|
17
|
-
import { ImportPackageLoader } from "./packages/import-loader.js";
|
|
18
|
-
import { PackageManager } from "./packages/package-manager.js";
|
|
19
|
-
import { AuthService } from "./services/auth.service.js";
|
|
20
|
-
import { AuthorizationService } from "./services/authorization.service.js";
|
|
21
|
-
import { DocumentPermissionService } from "./services/document-permission.service.js";
|
|
22
|
-
import { initTracing, isTracingEnabled, trace } from "./tracing.js";
|
|
23
|
-
import { getDbClient, initAnalyticsStoreSql, } from "./utils/db.js";
|
|
24
|
-
const defaultLogger = childLogger(["reactor-api", "server"]);
|
|
25
|
-
const DEFAULT_PORT = 4000;
|
|
26
|
-
/**
|
|
27
|
-
* Sets up the Express app with necessary routes
|
|
28
|
-
*/
|
|
29
|
-
function setupGraphQlExplorer(router) {
|
|
30
|
-
router.get("/explorer/:endpoint?", (req, res) => {
|
|
31
|
-
res.setHeader("Content-Type", "text/html");
|
|
32
|
-
const endpoint = req.params.endpoint !== undefined
|
|
33
|
-
? `/${req.params.endpoint}`
|
|
34
|
-
: "/graphql";
|
|
35
|
-
const { query } = req.query;
|
|
36
|
-
if (query && typeof query !== "string") {
|
|
37
|
-
throw new Error("Invalid query");
|
|
38
|
-
}
|
|
39
|
-
res.send(renderGraphqlPlayground(endpoint, query));
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Initializes the database and analytics store
|
|
44
|
-
*/
|
|
45
|
-
async function initializeDatabaseAndAnalytics(dbPath) {
|
|
46
|
-
const { db, knex } = getDbClient(dbPath);
|
|
47
|
-
const relationalDb = createRelationalDbLegacy(db);
|
|
48
|
-
const analyticsStore = new PostgresAnalyticsStore({
|
|
49
|
-
knex,
|
|
50
|
-
});
|
|
51
|
-
for (const sql of initAnalyticsStoreSql) {
|
|
52
|
-
await knex.raw(sql);
|
|
53
|
-
}
|
|
54
|
-
return { relationalDb, analyticsStore };
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Sets up the subgraph manager and registers subgraphs
|
|
58
|
-
*/
|
|
59
|
-
async function setupGraphQLManager(app, httpServer, wsServer, client, relationalDb, analyticsStore, syncManager, subgraphs, logger, auth, documentPermissionService, enableDocumentModelSubgraphs, port, authorizationService) {
|
|
60
|
-
const graphqlManager = new GraphQLManager(config.basePath, app, httpServer, wsServer, client, relationalDb, analyticsStore, syncManager, logger, {
|
|
61
|
-
enabled: auth?.enabled ?? false,
|
|
62
|
-
admins: auth?.admins ?? [],
|
|
63
|
-
}, documentPermissionService, {
|
|
64
|
-
enableDocumentModelSubgraphs,
|
|
65
|
-
}, port, authorizationService);
|
|
66
|
-
await graphqlManager.init(subgraphs.core);
|
|
67
|
-
for (const [, collection] of subgraphs.extended.entries()) {
|
|
68
|
-
for (const subgraph of collection) {
|
|
69
|
-
await graphqlManager.registerSubgraph(subgraph, "graphql");
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
await graphqlManager.updateRouter();
|
|
73
|
-
return graphqlManager;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Sets up event listeners for package manager changes
|
|
77
|
-
*/
|
|
78
|
-
function setupEventListeners(pkgManager, graphqlManager, reactorProcessorManager, module) {
|
|
79
|
-
pkgManager.onDocumentModelsChange(async () => {
|
|
80
|
-
await graphqlManager.updateRouter();
|
|
81
|
-
});
|
|
82
|
-
pkgManager.onSubgraphsChange(async (packagedSubgraphs) => {
|
|
83
|
-
for (const [, subgraphs] of packagedSubgraphs) {
|
|
84
|
-
for (const subgraph of subgraphs) {
|
|
85
|
-
await graphqlManager.registerSubgraph(subgraph, "graphql");
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
await graphqlManager.updateRouter();
|
|
89
|
-
});
|
|
90
|
-
pkgManager.onProcessorsChange(async (processors) => {
|
|
91
|
-
for (const [packageName, fns] of processors) {
|
|
92
|
-
await reactorProcessorManager.unregisterFactory(packageName);
|
|
93
|
-
const factories = fns.map((fn) => fn(module));
|
|
94
|
-
const validFactories = factories.filter((factory) => factory !== null && typeof factory === "function");
|
|
95
|
-
if (!validFactories.length) {
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
await reactorProcessorManager.registerFactory(packageName, async (driveHeader) => (await Promise.all(validFactories.map(async (factory) => {
|
|
99
|
-
try {
|
|
100
|
-
const result = await factory(driveHeader);
|
|
101
|
-
return result;
|
|
102
|
-
}
|
|
103
|
-
catch (e) {
|
|
104
|
-
const logger = defaultLogger;
|
|
105
|
-
logger.error(`Error creating processor for drive ${driveHeader.id}:`, e);
|
|
106
|
-
return [];
|
|
107
|
-
}
|
|
108
|
-
}))).flat());
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Starts the server (HTTP or HTTPS) and attaches WebSocket server
|
|
114
|
-
*/
|
|
115
|
-
async function startServer(app, port, httpsOptions, logger) {
|
|
116
|
-
let httpServer;
|
|
117
|
-
if (httpsOptions) {
|
|
118
|
-
const currentDir = process.cwd();
|
|
119
|
-
if (typeof httpsOptions === "object") {
|
|
120
|
-
httpServer = https.createServer({
|
|
121
|
-
key: fs.readFileSync(path.join(currentDir, httpsOptions.keyPath)),
|
|
122
|
-
cert: fs.readFileSync(path.join(currentDir, httpsOptions.certPath)),
|
|
123
|
-
}, app);
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
try {
|
|
127
|
-
const { cert, key } = (await devcert.certificateFor("localhost"));
|
|
128
|
-
if (!cert || !key) {
|
|
129
|
-
throw new Error("Invalid certificate generated");
|
|
130
|
-
}
|
|
131
|
-
httpServer = https.createServer({ cert, key }, app);
|
|
132
|
-
}
|
|
133
|
-
catch (err) {
|
|
134
|
-
console.error("Failed to get HTTPS certificate:", err);
|
|
135
|
-
throw new Error("Failed to start HTTPS server");
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
httpServer.listen(port);
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
httpServer = app.listen(port);
|
|
142
|
-
}
|
|
143
|
-
const wsServer = new WebSocketServer({
|
|
144
|
-
server: httpServer,
|
|
145
|
-
path: "/graphql/subscriptions",
|
|
146
|
-
});
|
|
147
|
-
logger.info("WebSocket server available at /graphql/subscriptions");
|
|
148
|
-
return { httpServer, wsServer };
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Private helper function that sets up common infrastructure before API initialization.
|
|
152
|
-
* This includes auth configuration, database setup, and package manager initialization.
|
|
153
|
-
*/
|
|
154
|
-
async function _setupCommonInfrastructure(options) {
|
|
155
|
-
// Initialize OpenTelemetry tracing
|
|
156
|
-
if (isTracingEnabled()) {
|
|
157
|
-
await initTracing();
|
|
158
|
-
}
|
|
159
|
-
const port = options.port ?? DEFAULT_PORT;
|
|
160
|
-
const app = options.express ?? express();
|
|
161
|
-
// Setup auth configuration
|
|
162
|
-
let admins = [];
|
|
163
|
-
let authEnabled = false;
|
|
164
|
-
if (options.configFile) {
|
|
165
|
-
const config = getConfig(options.configFile);
|
|
166
|
-
admins = config.auth?.admins?.map((a) => a.toLowerCase()) ?? [];
|
|
167
|
-
authEnabled = config.auth?.enabled ?? false;
|
|
168
|
-
}
|
|
169
|
-
else if (options.auth) {
|
|
170
|
-
admins = options.auth?.admins?.map((a) => a.toLowerCase()) ?? [];
|
|
171
|
-
authEnabled = options.auth?.enabled ?? false;
|
|
172
|
-
}
|
|
173
|
-
const { AUTH_ENABLED, ADMINS, DEFAULT_PROTECTION, DOCUMENT_PERMISSIONS_ENABLED, SKIP_CREDENTIAL_VERIFICATION, } = process.env;
|
|
174
|
-
if (AUTH_ENABLED !== undefined) {
|
|
175
|
-
authEnabled = AUTH_ENABLED === "true";
|
|
176
|
-
}
|
|
177
|
-
if (ADMINS !== undefined) {
|
|
178
|
-
admins = ADMINS.split(",").map((a) => a.toLowerCase());
|
|
179
|
-
}
|
|
180
|
-
let defaultProtection = false;
|
|
181
|
-
if (DEFAULT_PROTECTION !== undefined) {
|
|
182
|
-
defaultProtection = DEFAULT_PROTECTION.toLowerCase() === "true";
|
|
183
|
-
}
|
|
184
|
-
// Warn about deprecated env vars
|
|
185
|
-
const { USERS, GUESTS, FREE_ENTRY } = process.env;
|
|
186
|
-
if (USERS || GUESTS || FREE_ENTRY) {
|
|
187
|
-
console.warn("[DEPRECATION WARNING] The USERS, GUESTS, and FREE_ENTRY environment variables are no longer supported. " +
|
|
188
|
-
"Access control is now managed per-document via the DocumentProtection system. " +
|
|
189
|
-
"Use DEFAULT_PROTECTION=true for strict mode, or manage protection per document via the GraphQL API. " +
|
|
190
|
-
"See the auth documentation for migration guidance.");
|
|
191
|
-
}
|
|
192
|
-
let skipCredentialVerification = false;
|
|
193
|
-
if (SKIP_CREDENTIAL_VERIFICATION !== undefined) {
|
|
194
|
-
skipCredentialVerification = SKIP_CREDENTIAL_VERIFICATION === "true";
|
|
195
|
-
}
|
|
196
|
-
// Health check endpoint (before auth middleware)
|
|
197
|
-
app.get("/health", (_req, res) => {
|
|
198
|
-
res.status(200).send("OK");
|
|
199
|
-
});
|
|
200
|
-
const logger = options.logger ?? defaultLogger;
|
|
201
|
-
// add auth middleware if auth is enabled
|
|
202
|
-
if (authEnabled) {
|
|
203
|
-
logger.info("Setting up Auth middleware");
|
|
204
|
-
const authService = new AuthService({
|
|
205
|
-
enabled: authEnabled,
|
|
206
|
-
admins,
|
|
207
|
-
skipCredentialVerification,
|
|
208
|
-
});
|
|
209
|
-
// Apply auth middleware to all routes including GraphQL
|
|
210
|
-
app.use((req, res, next) => {
|
|
211
|
-
authService.authenticate(req, res, next);
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
const defaultRouter = express.Router();
|
|
215
|
-
setupGraphQlExplorer(defaultRouter);
|
|
216
|
-
app.use(config.basePath, defaultRouter);
|
|
217
|
-
// Initialize database and analytics store
|
|
218
|
-
const { relationalDb, analyticsStore } = await trace("reactor-api.init.database", { tags: { "resource.name": "database" } }, () => initializeDatabaseAndAnalytics(options.dbPath));
|
|
219
|
-
// Use provided document permission service, or create one if env var is set
|
|
220
|
-
let documentPermissionService = options.documentPermissionService;
|
|
221
|
-
if (!documentPermissionService && DOCUMENT_PERMISSIONS_ENABLED === "true") {
|
|
222
|
-
const { db } = getDbClient(options.dbPath);
|
|
223
|
-
// Run document permission migrations
|
|
224
|
-
await runMigrations(db);
|
|
225
|
-
logger.info("Document permission migrations completed");
|
|
226
|
-
documentPermissionService = new DocumentPermissionService(db, { defaultProtection });
|
|
227
|
-
logger.info("Document permission service initialized");
|
|
228
|
-
}
|
|
229
|
-
// Create AuthorizationService when document permission service is available
|
|
230
|
-
let authorizationService;
|
|
231
|
-
if (documentPermissionService) {
|
|
232
|
-
authorizationService = new AuthorizationService(documentPermissionService, {
|
|
233
|
-
admins,
|
|
234
|
-
defaultProtection,
|
|
235
|
-
});
|
|
236
|
-
logger.info("Authorization service initialized");
|
|
237
|
-
}
|
|
238
|
-
// Initialize package manager
|
|
239
|
-
const packageLoader = options.packageLoader ?? new ImportPackageLoader();
|
|
240
|
-
const loaders = [packageLoader];
|
|
241
|
-
const packages = new PackageManager(loaders, {
|
|
242
|
-
configFile: options.configFile,
|
|
243
|
-
packages: options.packages ?? [],
|
|
244
|
-
});
|
|
245
|
-
return {
|
|
246
|
-
port,
|
|
247
|
-
app,
|
|
248
|
-
auth: {
|
|
249
|
-
enabled: authEnabled,
|
|
250
|
-
admins,
|
|
251
|
-
},
|
|
252
|
-
relationalDb,
|
|
253
|
-
analyticsStore,
|
|
254
|
-
documentPermissionService,
|
|
255
|
-
authorizationService,
|
|
256
|
-
packages,
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Private helper function containing common setup logic for API initialization
|
|
261
|
-
*/
|
|
262
|
-
async function _setupAPI(reactorClient, syncManager, reactorProcessorManager, app, port, packages, relationalDb, analyticsStore, documentPermissionService, processors, subgraphs, options, auth, processorApp, authorizationService) {
|
|
263
|
-
const module = {
|
|
264
|
-
relationalDb,
|
|
265
|
-
analyticsStore,
|
|
266
|
-
processorApp,
|
|
267
|
-
config: options.processorConfig,
|
|
268
|
-
};
|
|
269
|
-
const mcpServerEnabled = options.mcp ?? true;
|
|
270
|
-
const logger = options.logger ?? defaultLogger;
|
|
271
|
-
// initialize processors
|
|
272
|
-
for (const [packageName, fns] of [
|
|
273
|
-
...processors.entries(),
|
|
274
|
-
...Object.entries(options.processors ?? {}),
|
|
275
|
-
]) {
|
|
276
|
-
const factories = fns.map((fn) => {
|
|
277
|
-
try {
|
|
278
|
-
return fn(module);
|
|
279
|
-
}
|
|
280
|
-
catch (e) {
|
|
281
|
-
logger.error(`Error initializing processor factory for package ${packageName}:`, e);
|
|
282
|
-
return null;
|
|
283
|
-
}
|
|
284
|
-
});
|
|
285
|
-
const validFactories = factories.filter((factory) => factory !== null && typeof factory === "function");
|
|
286
|
-
if (!validFactories.length) {
|
|
287
|
-
continue;
|
|
288
|
-
}
|
|
289
|
-
// Register with the reactor ProcessorManager
|
|
290
|
-
// Cast the results to ReactorProcessorRecord since the loaded factories
|
|
291
|
-
// implement the reactor interface
|
|
292
|
-
await reactorProcessorManager.registerFactory(packageName, async (driveHeader) => (await Promise.all(validFactories.map(async (factory) => {
|
|
293
|
-
try {
|
|
294
|
-
const result = await factory(driveHeader);
|
|
295
|
-
return result;
|
|
296
|
-
}
|
|
297
|
-
catch (e) {
|
|
298
|
-
logger.error(`Error creating processor for drive ${driveHeader.id}:`, e);
|
|
299
|
-
return [];
|
|
300
|
-
}
|
|
301
|
-
}))).flat());
|
|
302
|
-
}
|
|
303
|
-
// Start the server
|
|
304
|
-
const { httpServer, wsServer } = await startServer(app, port, options.https, logger);
|
|
305
|
-
// set up subgraph manager
|
|
306
|
-
const coreSubgraphs = DefaultCoreSubgraphs.slice();
|
|
307
|
-
coreSubgraphs.push(ReactorSubgraph);
|
|
308
|
-
// Register Auth subgraph when document permission service is available
|
|
309
|
-
if (documentPermissionService) {
|
|
310
|
-
coreSubgraphs.push(AuthSubgraph);
|
|
311
|
-
logger.info("Auth subgraph registered (document permissions enabled)");
|
|
312
|
-
}
|
|
313
|
-
const graphqlManager = await setupGraphQLManager(app, httpServer, wsServer, reactorClient, relationalDb, analyticsStore, syncManager, {
|
|
314
|
-
extended: subgraphs,
|
|
315
|
-
core: coreSubgraphs,
|
|
316
|
-
}, logger.child(["graphql-manager"]), auth, documentPermissionService, options.enableDocumentModelSubgraphs, port, authorizationService);
|
|
317
|
-
// Set up event listeners
|
|
318
|
-
setupEventListeners(packages, graphqlManager, reactorProcessorManager, module);
|
|
319
|
-
if (mcpServerEnabled) {
|
|
320
|
-
await setupMcpServer({ client: reactorClient, syncManager }, app);
|
|
321
|
-
logger.info(`MCP server available at http://localhost:${port}/mcp`);
|
|
322
|
-
}
|
|
323
|
-
return {
|
|
324
|
-
app,
|
|
325
|
-
graphqlManager,
|
|
326
|
-
packages,
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* Initializes and starts the API server using an initializer function.
|
|
331
|
-
* This function first loads packages to get document models, then calls the initializer function
|
|
332
|
-
* to create the reactor client module with the appropriate dependencies.
|
|
333
|
-
*
|
|
334
|
-
* @param clientInitializer - Initializer function that creates the reactor client module with document models.
|
|
335
|
-
* @param options - Additional options for server configuration.
|
|
336
|
-
*
|
|
337
|
-
* @returns The API server components along with the created client instances.
|
|
338
|
-
*/
|
|
339
|
-
export async function initializeAndStartAPI(clientInitializer, options, processorApp) {
|
|
340
|
-
const { port, app, auth, relationalDb, analyticsStore, documentPermissionService, authorizationService, packages, } = await trace("reactor-api.setup.infrastructure", { tags: { "resource.name": "infrastructure" } }, () => _setupCommonInfrastructure(options));
|
|
341
|
-
const { documentModels, processors, subgraphs } = await trace("reactor-api.packages.init", { tags: { "resource.name": "packages" } }, () => packages.init());
|
|
342
|
-
const reactorClientModule = await trace("reactor-api.reactor-client.init", { tags: { "resource.name": "reactor-client" } }, () => clientInitializer(documentModels));
|
|
343
|
-
// Extract client and syncManager from the module
|
|
344
|
-
const reactorClient = reactorClientModule.client;
|
|
345
|
-
const syncManager = reactorClientModule.reactorModule?.syncModule?.syncManager;
|
|
346
|
-
if (!syncManager) {
|
|
347
|
-
throw new Error("SyncManager not available from ReactorClientModule");
|
|
348
|
-
}
|
|
349
|
-
const reactorProcessorManager = reactorClientModule.reactorModule?.processorManager;
|
|
350
|
-
if (!reactorProcessorManager) {
|
|
351
|
-
throw new Error("ProcessorManager not available from ReactorClientModule");
|
|
352
|
-
}
|
|
353
|
-
const api = await _setupAPI(reactorClient, syncManager, reactorProcessorManager, app, port, packages, relationalDb, analyticsStore, documentPermissionService, processors, subgraphs, options, auth, processorApp, authorizationService);
|
|
354
|
-
const documentModelRegistry = reactorClientModule.reactorModule?.documentModelRegistry;
|
|
355
|
-
if (!documentModelRegistry) {
|
|
356
|
-
throw new Error("DocumentModelRegistry not available from ReactorClientModule");
|
|
357
|
-
}
|
|
358
|
-
return {
|
|
359
|
-
...api,
|
|
360
|
-
client: reactorClient,
|
|
361
|
-
syncManager,
|
|
362
|
-
documentModelRegistry,
|
|
363
|
-
};
|
|
364
|
-
}
|
|
365
|
-
//# sourceMappingURL=server.js.map
|
package/dist/src/server.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import type { NextFunction, Request, Response } from "express";
|
|
2
|
-
export interface AuthConfig {
|
|
3
|
-
enabled: boolean;
|
|
4
|
-
admins: string[];
|
|
5
|
-
cacheTtl?: number;
|
|
6
|
-
skipCredentialVerification?: boolean;
|
|
7
|
-
}
|
|
8
|
-
export interface User {
|
|
9
|
-
address: string;
|
|
10
|
-
chainId: number;
|
|
11
|
-
networkId: string;
|
|
12
|
-
}
|
|
13
|
-
export interface AuthenticatedRequest extends Request {
|
|
14
|
-
user?: User;
|
|
15
|
-
admins: string[];
|
|
16
|
-
}
|
|
17
|
-
export declare class AuthService {
|
|
18
|
-
private readonly config;
|
|
19
|
-
constructor(config: AuthConfig);
|
|
20
|
-
/**
|
|
21
|
-
* Middleware function to authenticate requests
|
|
22
|
-
*/
|
|
23
|
-
authenticate(req: AuthenticatedRequest, res: Response, next: NextFunction): Promise<void>;
|
|
24
|
-
authenticateWebSocketConnection(connectionParams: Record<string, unknown>): Promise<User | null>;
|
|
25
|
-
/**
|
|
26
|
-
* Verify the auth bearer token
|
|
27
|
-
*/
|
|
28
|
-
private verifyToken;
|
|
29
|
-
/**
|
|
30
|
-
* Extract user information from verification result
|
|
31
|
-
*/
|
|
32
|
-
private extractUserFromVerification;
|
|
33
|
-
/**
|
|
34
|
-
* Get additional context fields for GraphQL
|
|
35
|
-
*/
|
|
36
|
-
getAdditionalContextFields(): {
|
|
37
|
-
isAdmin: (address: string) => boolean;
|
|
38
|
-
};
|
|
39
|
-
/**
|
|
40
|
-
* Get user context for GraphQL
|
|
41
|
-
*/
|
|
42
|
-
getUserContext(user?: User): {
|
|
43
|
-
user?: undefined;
|
|
44
|
-
} | {
|
|
45
|
-
user: {
|
|
46
|
-
address: string;
|
|
47
|
-
chainId: number;
|
|
48
|
-
networkId: string;
|
|
49
|
-
};
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* Verify that the credential still exists on the Renown API
|
|
53
|
-
*/
|
|
54
|
-
private verifyCredentialExists;
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=auth.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../../../src/services/auth.service.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAqB,SAAQ,OAAO;IACnD,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;gBAExB,MAAM,EAAE,UAAU;IAI9B;;OAEG;IACG,YAAY,CAChB,GAAG,EAAE,oBAAoB,EACzB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC;IAiEV,+BAA+B,CACnC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IA4CvB;;OAEG;YACW,WAAW;IAIzB;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAqBnC;;OAEG;IACH,0BAA0B;2BAQH,MAAM;;IAM7B;;OAEG;IACH,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI;;;;;;;;;IAY1B;;OAEG;YACW,sBAAsB;CAgCrC"}
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import { verifyAuthBearerToken, } from "@renown/sdk";
|
|
2
|
-
export class AuthService {
|
|
3
|
-
config;
|
|
4
|
-
constructor(config) {
|
|
5
|
-
this.config = config;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Middleware function to authenticate requests
|
|
9
|
-
*/
|
|
10
|
-
async authenticate(req, res, next) {
|
|
11
|
-
if (!this.config.enabled ||
|
|
12
|
-
req.method === "OPTIONS" ||
|
|
13
|
-
req.method === "GET") {
|
|
14
|
-
next();
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
// Set auth lists on request
|
|
18
|
-
req.admins = this.config.admins;
|
|
19
|
-
req.auth_enabled = this.config.enabled;
|
|
20
|
-
const token = req.headers.authorization?.split(" ")[1];
|
|
21
|
-
if (!token) {
|
|
22
|
-
// Allow through without user — resolver layer enforces permissions
|
|
23
|
-
// This is critical: GraphQL queries are POST requests, so blocking
|
|
24
|
-
// unauthenticated POSTs would block all anonymous reads.
|
|
25
|
-
next();
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
try {
|
|
29
|
-
const verified = await this.verifyToken(token);
|
|
30
|
-
if (!verified) {
|
|
31
|
-
res.status(401).json({ error: "Verification failed" });
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const user = this.extractUserFromVerification(verified);
|
|
35
|
-
if (!user) {
|
|
36
|
-
res.status(401).json({ error: "Missing credentials" });
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
// Verify that the credentials still exist on the Renown API
|
|
40
|
-
// This can be skipped via config (useful for testing or when Renown API is unavailable)
|
|
41
|
-
if (!this.config.skipCredentialVerification) {
|
|
42
|
-
const credentialExists = await this.verifyCredentialExists(user.address, user.chainId, verified.issuer);
|
|
43
|
-
if (!credentialExists) {
|
|
44
|
-
res.status(401).json({ error: "Credentials no longer valid" });
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
req.user = user;
|
|
49
|
-
// Note: We no longer block users here based on global allowed lists.
|
|
50
|
-
// The resolver layer handles authorization based on:
|
|
51
|
-
// 1. Global roles (admin/user/guest) for unrestricted access
|
|
52
|
-
// 2. Document-level permissions (direct or via groups) for specific documents
|
|
53
|
-
// This allows users who have document-specific permissions (e.g., via groups)
|
|
54
|
-
// to access those documents even if they're not in the global allowed lists.
|
|
55
|
-
next();
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
res.status(401).json({ error: "Authentication failed" });
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
async authenticateWebSocketConnection(connectionParams) {
|
|
62
|
-
if (!this.config.enabled) {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
const authHeader = connectionParams.authorization;
|
|
66
|
-
if (!authHeader) {
|
|
67
|
-
throw new Error("Missing authorization in connection parameters");
|
|
68
|
-
}
|
|
69
|
-
const token = authHeader.split(" ")[1];
|
|
70
|
-
if (!token) {
|
|
71
|
-
throw new Error("Invalid authorization format");
|
|
72
|
-
}
|
|
73
|
-
const verified = await this.verifyToken(token);
|
|
74
|
-
if (!verified) {
|
|
75
|
-
throw new Error("Token verification failed");
|
|
76
|
-
}
|
|
77
|
-
const user = this.extractUserFromVerification(verified);
|
|
78
|
-
if (!user) {
|
|
79
|
-
throw new Error("Invalid credentials");
|
|
80
|
-
}
|
|
81
|
-
// Verify that the credentials still exist on the Renown API
|
|
82
|
-
// This can be skipped via config (useful for testing or when Renown API is unavailable)
|
|
83
|
-
if (!this.config.skipCredentialVerification) {
|
|
84
|
-
const credentialExists = await this.verifyCredentialExists(user.address, user.chainId, verified.issuer);
|
|
85
|
-
if (!credentialExists) {
|
|
86
|
-
throw new Error("Credentials no longer valid");
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// Note: We no longer block based on global allowed lists.
|
|
90
|
-
// Authorization is handled at the resolver level based on document permissions.
|
|
91
|
-
return user;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Verify the auth bearer token
|
|
95
|
-
*/
|
|
96
|
-
async verifyToken(token) {
|
|
97
|
-
return await verifyAuthBearerToken(token);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Extract user information from verification result
|
|
101
|
-
*/
|
|
102
|
-
extractUserFromVerification(verified) {
|
|
103
|
-
try {
|
|
104
|
-
const { address, chainId, networkId } = verified.verifiableCredential.credentialSubject;
|
|
105
|
-
if (!address || !chainId || !networkId) {
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
return {
|
|
109
|
-
address,
|
|
110
|
-
chainId,
|
|
111
|
-
networkId,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Get additional context fields for GraphQL
|
|
120
|
-
*/
|
|
121
|
-
getAdditionalContextFields() {
|
|
122
|
-
if (!this.config.enabled) {
|
|
123
|
-
return {
|
|
124
|
-
isAdmin: () => true,
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
return {
|
|
128
|
-
isAdmin: (address) => this.config.enabled &&
|
|
129
|
-
this.config.admins?.includes(address.toLowerCase()),
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Get user context for GraphQL
|
|
134
|
-
*/
|
|
135
|
-
getUserContext(user) {
|
|
136
|
-
if (!user)
|
|
137
|
-
return {};
|
|
138
|
-
return {
|
|
139
|
-
user: {
|
|
140
|
-
address: user.address.toLowerCase(),
|
|
141
|
-
chainId: user.chainId,
|
|
142
|
-
networkId: user.networkId,
|
|
143
|
-
},
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Verify that the credential still exists on the Renown API
|
|
148
|
-
*/
|
|
149
|
-
async verifyCredentialExists(address, chainId, appId) {
|
|
150
|
-
const url = `https://www.renown.id/api/auth/credential?address=${address}&chainId=${chainId}&connectId=${appId}&appId=${appId}`;
|
|
151
|
-
try {
|
|
152
|
-
const response = await fetch(url, {
|
|
153
|
-
method: "GET",
|
|
154
|
-
});
|
|
155
|
-
const body = (await response.json());
|
|
156
|
-
const credential = body.credential;
|
|
157
|
-
const appIdVerfied = credential.credentialSubject.id;
|
|
158
|
-
const addressVerfied = credential.issuer.id.split(":")[4];
|
|
159
|
-
const chainIdVerfied = credential.issuer.id.split(":")[3];
|
|
160
|
-
if (response.status !== 200) {
|
|
161
|
-
return false;
|
|
162
|
-
}
|
|
163
|
-
return (appIdVerfied === appId &&
|
|
164
|
-
addressVerfied.toLocaleLowerCase() === address.toLocaleLowerCase() &&
|
|
165
|
-
chainIdVerfied === chainId.toString());
|
|
166
|
-
}
|
|
167
|
-
catch {
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
//# sourceMappingURL=auth.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../src/services/auth.service.ts"],"names":[],"mappings":"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"}
|