@powerhousedao/reactor-api 6.0.0-dev.8 → 6.0.0-dev.81
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/dist/codegen.js +1 -1
- package/dist/codegen.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/src/config.d.ts +1 -2
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +1 -5
- package/dist/src/config.js.map +1 -1
- package/dist/src/graphql/auth/resolvers.d.ts +17 -0
- package/dist/src/graphql/auth/resolvers.d.ts.map +1 -1
- package/dist/src/graphql/auth/resolvers.js +54 -0
- package/dist/src/graphql/auth/resolvers.js.map +1 -1
- package/dist/src/graphql/auth/schema.graphql +27 -5
- package/dist/src/graphql/auth/subgraph.d.ts +25 -0
- package/dist/src/graphql/auth/subgraph.d.ts.map +1 -1
- package/dist/src/graphql/auth/subgraph.js +45 -1
- package/dist/src/graphql/auth/subgraph.js.map +1 -1
- package/dist/src/graphql/base-subgraph.d.ts +12 -4
- package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/base-subgraph.js +94 -2
- package/dist/src/graphql/base-subgraph.js.map +1 -1
- package/dist/src/graphql/document-model-subgraph.d.ts +16 -44
- package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/document-model-subgraph.js +285 -87
- package/dist/src/graphql/document-model-subgraph.js.map +1 -1
- package/dist/src/graphql/graphql-manager.d.ts +28 -6
- package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
- package/dist/src/graphql/graphql-manager.js +266 -161
- package/dist/src/graphql/graphql-manager.js.map +1 -1
- package/dist/src/graphql/index.d.ts +2 -1
- package/dist/src/graphql/index.d.ts.map +1 -1
- package/dist/src/graphql/index.js +2 -1
- package/dist/src/graphql/index.js.map +1 -1
- package/dist/src/graphql/packages/index.d.ts +2 -0
- package/dist/src/graphql/packages/index.d.ts.map +1 -0
- package/dist/src/graphql/packages/index.js +2 -0
- package/dist/src/graphql/packages/index.js.map +1 -0
- package/dist/src/graphql/packages/resolvers.d.ts +31 -0
- package/dist/src/graphql/packages/resolvers.d.ts.map +1 -0
- package/dist/src/graphql/packages/resolvers.js +37 -0
- package/dist/src/graphql/packages/resolvers.js.map +1 -0
- package/dist/src/graphql/packages/schema.graphql +50 -0
- package/dist/src/graphql/packages/subgraph.d.ts +55 -0
- package/dist/src/graphql/packages/subgraph.d.ts.map +1 -0
- package/dist/src/graphql/packages/subgraph.js +73 -0
- package/dist/src/graphql/packages/subgraph.js.map +1 -0
- package/dist/src/graphql/reactor/adapters.d.ts +10 -2
- package/dist/src/graphql/reactor/adapters.d.ts.map +1 -1
- package/dist/src/graphql/reactor/adapters.js +35 -1
- package/dist/src/graphql/reactor/adapters.js.map +1 -1
- package/dist/src/graphql/reactor/factory.d.ts +16 -1
- package/dist/src/graphql/reactor/factory.d.ts.map +1 -1
- package/dist/src/graphql/reactor/factory.js +1 -1
- package/dist/src/graphql/reactor/factory.js.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.d.ts +271 -76
- package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.js +181 -10
- package/dist/src/graphql/reactor/gen/graphql.js.map +1 -1
- package/dist/src/graphql/reactor/index.d.ts +1 -1
- package/dist/src/graphql/reactor/index.d.ts.map +1 -1
- package/dist/src/graphql/reactor/index.js +1 -1
- package/dist/src/graphql/reactor/index.js.map +1 -1
- package/dist/src/graphql/reactor/operations.graphql +132 -1
- package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +1 -1
- package/dist/src/graphql/reactor/requester.with-zod.js +109 -38
- package/dist/src/graphql/reactor/requester.with-zod.js.map +1 -1
- package/dist/src/graphql/reactor/resolvers.d.ts +78 -25
- package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
- package/dist/src/graphql/reactor/resolvers.js +197 -74
- package/dist/src/graphql/reactor/resolvers.js.map +1 -1
- package/dist/src/graphql/reactor/schema.graphql +70 -30
- package/dist/src/graphql/reactor/subgraph.d.ts +2 -31
- package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
- package/dist/src/graphql/reactor/subgraph.js +132 -209
- package/dist/src/graphql/reactor/subgraph.js.map +1 -1
- package/dist/src/graphql/reactor/validation.d.ts +208 -20
- package/dist/src/graphql/reactor/validation.d.ts.map +1 -1
- package/dist/src/graphql/reactor/validation.js +90 -4
- package/dist/src/graphql/reactor/validation.js.map +1 -1
- package/dist/src/graphql/system/index.d.ts +0 -1
- package/dist/src/graphql/system/index.d.ts.map +1 -1
- package/dist/src/graphql/system/index.js +0 -1
- package/dist/src/graphql/system/index.js.map +1 -1
- package/dist/src/graphql/types.d.ts +6 -8
- package/dist/src/graphql/types.d.ts.map +1 -1
- package/dist/src/graphql/utils.d.ts +1 -18
- package/dist/src/graphql/utils.d.ts.map +1 -1
- package/dist/src/graphql/utils.js +7 -35
- package/dist/src/graphql/utils.js.map +1 -1
- package/dist/src/migrations/002_add_document_protection.d.ts +4 -0
- package/dist/src/migrations/002_add_document_protection.d.ts.map +1 -0
- package/dist/src/migrations/002_add_document_protection.js +18 -0
- package/dist/src/migrations/002_add_document_protection.js.map +1 -0
- package/dist/src/migrations/index.d.ts.map +1 -1
- package/dist/src/migrations/index.js +2 -0
- package/dist/src/migrations/index.js.map +1 -1
- package/dist/src/packages/http-loader.d.ts +68 -0
- package/dist/src/packages/http-loader.d.ts.map +1 -0
- package/dist/src/packages/http-loader.js +176 -0
- package/dist/src/packages/http-loader.js.map +1 -0
- package/dist/src/packages/https-hooks.d.mts +23 -0
- package/dist/src/packages/https-hooks.d.mts.map +1 -0
- package/dist/src/packages/https-hooks.mjs +59 -0
- package/dist/src/packages/https-hooks.mjs.map +1 -0
- package/dist/src/packages/import-loader.d.ts +5 -3
- package/dist/src/packages/import-loader.d.ts.map +1 -1
- package/dist/src/packages/import-loader.js +19 -10
- package/dist/src/packages/import-loader.js.map +1 -1
- package/dist/src/packages/package-manager.d.ts +2 -2
- package/dist/src/packages/package-manager.d.ts.map +1 -1
- package/dist/src/packages/package-manager.js.map +1 -1
- package/dist/src/packages/types.d.ts +9 -4
- package/dist/src/packages/types.d.ts.map +1 -1
- package/dist/src/packages/util.d.ts +3 -2
- package/dist/src/packages/util.d.ts.map +1 -1
- package/dist/src/packages/util.js +1 -1
- package/dist/src/packages/util.js.map +1 -1
- package/dist/src/packages/vite-loader.d.ts +10 -8
- package/dist/src/packages/vite-loader.d.ts.map +1 -1
- package/dist/src/packages/vite-loader.js +33 -10
- package/dist/src/packages/vite-loader.js.map +1 -1
- package/dist/src/server.d.ts +14 -11
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +153 -92
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/auth.service.d.ts +0 -12
- package/dist/src/services/auth.service.d.ts.map +1 -1
- package/dist/src/services/auth.service.js +13 -40
- package/dist/src/services/auth.service.js.map +1 -1
- package/dist/src/services/authorization.service.d.ts +70 -0
- package/dist/src/services/authorization.service.d.ts.map +1 -0
- package/dist/src/services/authorization.service.js +155 -0
- package/dist/src/services/authorization.service.js.map +1 -0
- package/dist/src/services/document-permission.service.d.ts +47 -7
- package/dist/src/services/document-permission.service.d.ts.map +1 -1
- package/dist/src/services/document-permission.service.js +162 -7
- package/dist/src/services/document-permission.service.js.map +1 -1
- package/dist/src/services/package-management.service.d.ts +32 -0
- package/dist/src/services/package-management.service.d.ts.map +1 -0
- package/dist/src/services/package-management.service.js +95 -0
- package/dist/src/services/package-management.service.js.map +1 -0
- package/dist/src/services/package-storage.d.ts +23 -0
- package/dist/src/services/package-storage.d.ts.map +1 -0
- package/dist/src/services/package-storage.js +19 -0
- package/dist/src/services/package-storage.js.map +1 -0
- package/dist/src/tracing.d.ts.map +1 -1
- package/dist/src/tracing.js +19 -1
- package/dist/src/tracing.js.map +1 -1
- package/dist/src/types.d.ts +5 -5
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/auth.d.ts +1 -1
- package/dist/src/utils/auth.d.ts.map +1 -1
- package/dist/src/utils/auth.js +5 -12
- package/dist/src/utils/auth.js.map +1 -1
- package/dist/src/utils/create-schema.d.ts +25 -6
- package/dist/src/utils/create-schema.d.ts.map +1 -1
- package/dist/src/utils/create-schema.js +294 -22
- package/dist/src/utils/create-schema.js.map +1 -1
- package/dist/src/utils/db.d.ts +8 -0
- package/dist/src/utils/db.d.ts.map +1 -1
- package/dist/src/utils/db.js.map +1 -1
- package/dist/src/utils/drive-url.d.ts +2 -0
- package/dist/src/utils/drive-url.d.ts.map +1 -0
- package/dist/src/utils/drive-url.js +3 -0
- package/dist/src/utils/drive-url.js.map +1 -0
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +1 -0
- package/dist/src/utils/index.js.map +1 -1
- package/dist/test/authorization.service.test.d.ts +2 -0
- package/dist/test/authorization.service.test.d.ts.map +1 -0
- package/dist/test/authorization.service.test.js +252 -0
- package/dist/test/authorization.service.test.js.map +1 -0
- package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts +2 -0
- package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts.map +1 -0
- package/dist/test/connect-switchboard-reshuffle-convergence.test.js +203 -0
- package/dist/test/connect-switchboard-reshuffle-convergence.test.js.map +1 -0
- package/dist/test/connect-switchboard-sync.test.d.ts +2 -0
- package/dist/test/connect-switchboard-sync.test.d.ts.map +1 -0
- package/dist/test/connect-switchboard-sync.test.js +581 -0
- package/dist/test/connect-switchboard-sync.test.js.map +1 -0
- package/dist/test/document-drive-subgraph.test.d.ts +2 -0
- package/dist/test/document-drive-subgraph.test.d.ts.map +1 -0
- package/dist/test/document-drive-subgraph.test.js +186 -0
- package/dist/test/document-drive-subgraph.test.js.map +1 -0
- package/dist/test/document-model-subgraph-permissions.test.d.ts +2 -0
- package/dist/test/document-model-subgraph-permissions.test.d.ts.map +1 -0
- package/dist/test/document-model-subgraph-permissions.test.js +563 -0
- package/dist/test/document-model-subgraph-permissions.test.js.map +1 -0
- package/dist/test/drive-info-endpoint.test.d.ts +2 -0
- package/dist/test/drive-info-endpoint.test.d.ts.map +1 -0
- package/dist/test/drive-info-endpoint.test.js +123 -0
- package/dist/test/drive-info-endpoint.test.js.map +1 -0
- package/dist/test/index.d.ts +0 -1
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +0 -1
- package/dist/test/index.js.map +1 -1
- package/dist/test/permissions-integration.test.js +6 -20
- package/dist/test/permissions-integration.test.js.map +1 -1
- package/dist/test/push-backfill.test.d.ts +2 -0
- package/dist/test/push-backfill.test.d.ts.map +1 -0
- package/dist/test/push-backfill.test.js +298 -0
- package/dist/test/push-backfill.test.js.map +1 -0
- package/dist/test/reactor-client.test.js +87 -13
- package/dist/test/reactor-client.test.js.map +1 -1
- package/dist/test/reactor-resolvers.test.js +8 -11
- package/dist/test/reactor-resolvers.test.js.map +1 -1
- package/dist/test/reactor-subgraph-permissions.test.js +7 -36
- package/dist/test/reactor-subgraph-permissions.test.js.map +1 -1
- package/dist/test/subscriptions.test.js +2 -0
- package/dist/test/subscriptions.test.js.map +1 -1
- package/dist/test/utils/gql-resolver-bridge.d.ts +4 -1
- package/dist/test/utils/gql-resolver-bridge.d.ts.map +1 -1
- package/dist/test/utils/gql-resolver-bridge.js +36 -7
- package/dist/test/utils/gql-resolver-bridge.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +46 -55
- package/dist/src/graphql/drive-subgraph.d.ts +0 -25
- package/dist/src/graphql/drive-subgraph.d.ts.map +0 -1
- package/dist/src/graphql/drive-subgraph.js +0 -487
- package/dist/src/graphql/drive-subgraph.js.map +0 -1
- package/dist/src/graphql/system/system-subgraph.d.ts +0 -49
- package/dist/src/graphql/system/system-subgraph.d.ts.map +0 -1
- package/dist/src/graphql/system/system-subgraph.js +0 -130
- package/dist/src/graphql/system/system-subgraph.js.map +0 -1
- package/dist/src/sync/types.d.ts +0 -10
- package/dist/src/sync/types.d.ts.map +0 -1
- package/dist/src/sync/types.js +0 -2
- package/dist/src/sync/types.js.map +0 -1
- package/dist/src/sync/utils.d.ts +0 -7
- package/dist/src/sync/utils.d.ts.map +0 -1
- package/dist/src/sync/utils.js +0 -78
- package/dist/src/sync/utils.js.map +0 -1
- package/dist/test/drive-handlers.d.ts +0 -4
- package/dist/test/drive-handlers.d.ts.map +0 -1
- package/dist/test/drive-handlers.js +0 -39
- package/dist/test/drive-handlers.js.map +0 -1
- package/dist/test/drive-subgraph-permissions.test.d.ts +0 -2
- package/dist/test/drive-subgraph-permissions.test.d.ts.map +0 -1
- package/dist/test/drive-subgraph-permissions.test.js +0 -195
- package/dist/test/drive-subgraph-permissions.test.js.map +0 -1
- package/dist/test/drive.test.d.ts +0 -2
- package/dist/test/drive.test.d.ts.map +0 -1
- package/dist/test/drive.test.js +0 -142
- package/dist/test/drive.test.js.map +0 -1
- package/dist/test/pull-responder-transmitter.test.d.ts +0 -2
- package/dist/test/pull-responder-transmitter.test.d.ts.map +0 -1
- package/dist/test/pull-responder-transmitter.test.js +0 -220
- package/dist/test/pull-responder-transmitter.test.js.map +0 -1
- package/dist/test/push-transmitter.test.d.ts +0 -2
- package/dist/test/push-transmitter.test.d.ts.map +0 -1
- package/dist/test/push-transmitter.test.js +0 -179
- package/dist/test/push-transmitter.test.js.map +0 -1
- package/dist/test/system.test.d.ts +0 -2
- package/dist/test/system.test.d.ts.map +0 -1
- package/dist/test/system.test.js +0 -211
- package/dist/test/system.test.js.map +0 -1
- package/dist/test/three-reactor-gql-sync.test.d.ts +0 -2
- package/dist/test/three-reactor-gql-sync.test.d.ts.map +0 -1
- package/dist/test/three-reactor-gql-sync.test.js +0 -368
- package/dist/test/three-reactor-gql-sync.test.js.map +0 -1
- package/dist/test/two-reactor-gql-sync.test.d.ts +0 -2
- package/dist/test/two-reactor-gql-sync.test.d.ts.map +0 -1
- package/dist/test/two-reactor-gql-sync.test.js +0 -348
- package/dist/test/two-reactor-gql-sync.test.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/reactor-api",
|
|
3
|
-
"version": "6.0.0-dev.
|
|
3
|
+
"version": "6.0.0-dev.81",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -12,6 +12,14 @@
|
|
|
12
12
|
"import": "./dist/index.js",
|
|
13
13
|
"types": "./dist/index.d.ts"
|
|
14
14
|
},
|
|
15
|
+
"./graphql": {
|
|
16
|
+
"import": "./dist/graphql/index.js",
|
|
17
|
+
"types": "./dist/graphql/index.d.ts"
|
|
18
|
+
},
|
|
19
|
+
"./graphql/*": {
|
|
20
|
+
"import": "./dist/graphql/*.js",
|
|
21
|
+
"types": "./dist/graphql/*.d.ts"
|
|
22
|
+
},
|
|
15
23
|
"./test": {
|
|
16
24
|
"import": "./test/index.ts"
|
|
17
25
|
}
|
|
@@ -32,87 +40,70 @@
|
|
|
32
40
|
"@apollo/server": "^5.0.0",
|
|
33
41
|
"@apollo/subgraph": "^2.11.3",
|
|
34
42
|
"@as-integrations/express4": "^1.1.2",
|
|
35
|
-
"@electric-sql/pglite": "0.
|
|
36
|
-
"@graphql-typed-document-node/core": "^3.2.0",
|
|
43
|
+
"@electric-sql/pglite": "0.3.15",
|
|
37
44
|
"@opentelemetry/auto-instrumentations-node": "^0.57.1",
|
|
45
|
+
"@opentelemetry/exporter-metrics-otlp-http": "^0.57.2",
|
|
38
46
|
"@opentelemetry/exporter-trace-otlp-http": "^0.57.2",
|
|
47
|
+
"@opentelemetry/sdk-metrics": "^1.29.0",
|
|
39
48
|
"@opentelemetry/resources": "^1.29.0",
|
|
40
49
|
"@opentelemetry/sdk-node": "^0.57.2",
|
|
41
50
|
"@opentelemetry/sdk-trace-base": "^1.29.0",
|
|
42
51
|
"@opentelemetry/semantic-conventions": "^1.29.0",
|
|
43
52
|
"@originjs/vite-plugin-commonjs": "^1.0.3",
|
|
44
|
-
"@powerhousedao/
|
|
45
|
-
"@powerhousedao/analytics-engine-graphql": "^0.4.0",
|
|
46
|
-
"@powerhousedao/analytics-engine-pg": "^0.6.0",
|
|
47
|
-
"@powerhousedao/document-engineering": "^1.40.1",
|
|
53
|
+
"@powerhousedao/document-engineering": "1.40.1",
|
|
48
54
|
"body-parser": "^1.20.3",
|
|
49
|
-
"change-case": "
|
|
55
|
+
"change-case": "5.4.4",
|
|
50
56
|
"cors": "^2.8.5",
|
|
51
57
|
"devcert": "^1.2.2",
|
|
52
58
|
"dotenv": "^16.4.5",
|
|
53
|
-
"drizzle-kit": "^0.25.0",
|
|
54
|
-
"drizzle-orm": "^0.34.1",
|
|
55
|
-
"ethers": "^6.0.8",
|
|
56
59
|
"express": "^4.21.1",
|
|
57
|
-
"graphql": "
|
|
60
|
+
"graphql": "16.12.0",
|
|
58
61
|
"graphql-subscriptions": "^3.0.0",
|
|
59
62
|
"graphql-type-json": "^0.3.2",
|
|
60
63
|
"graphql-ws": "^6.0.6",
|
|
61
|
-
"
|
|
62
|
-
"knex": "
|
|
63
|
-
"
|
|
64
|
-
"kysely": "
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"pg": "^8.13.0",
|
|
69
|
-
"read-pkg": "^9.0.1",
|
|
70
|
-
"siwe": "^2.3.2",
|
|
71
|
-
"uuid": "^9.0.1",
|
|
72
|
-
"wildcard-match": "^5.1.3",
|
|
64
|
+
"knex": "3.1.0",
|
|
65
|
+
"knex-pglite": "0.13.0",
|
|
66
|
+
"kysely": "0.28.11",
|
|
67
|
+
"kysely-knex": "0.2.0",
|
|
68
|
+
"path-to-regexp": "^8.3.0",
|
|
69
|
+
"pg": "8.18.0",
|
|
70
|
+
"read-pkg": "10.1.0",
|
|
73
71
|
"ws": "^8.18.3",
|
|
74
|
-
"zod": "
|
|
75
|
-
"@powerhousedao/
|
|
76
|
-
"@powerhousedao/
|
|
77
|
-
"@powerhousedao/
|
|
78
|
-
"@
|
|
79
|
-
"
|
|
80
|
-
"
|
|
72
|
+
"zod": "4.3.6",
|
|
73
|
+
"@powerhousedao/analytics-engine-core": "6.0.0-dev.81",
|
|
74
|
+
"@powerhousedao/analytics-engine-graphql": "6.0.0-dev.81",
|
|
75
|
+
"@powerhousedao/analytics-engine-pg": "6.0.0-dev.81",
|
|
76
|
+
"@powerhousedao/reactor": "6.0.0-dev.81",
|
|
77
|
+
"@powerhousedao/reactor-mcp": "6.0.0-dev.81",
|
|
78
|
+
"@powerhousedao/config": "6.0.0-dev.81",
|
|
79
|
+
"@renown/sdk": "6.0.0-dev.81",
|
|
80
|
+
"document-drive": "6.0.0-dev.81",
|
|
81
|
+
"document-model": "6.0.0-dev.81",
|
|
82
|
+
"@powerhousedao/shared": "6.0.0-dev.81"
|
|
81
83
|
},
|
|
82
84
|
"devDependencies": {
|
|
83
|
-
"@graphql-codegen/cli": "
|
|
84
|
-
"@graphql-codegen/
|
|
85
|
-
"@graphql-codegen/
|
|
86
|
-
"@graphql-codegen/typescript": "
|
|
87
|
-
"@graphql-codegen/typescript-
|
|
88
|
-
"@graphql-codegen/typescript-graphql-request": "^6.2.0",
|
|
89
|
-
"@graphql-codegen/typescript-operations": "^4.0.1",
|
|
90
|
-
"@graphql-codegen/typescript-resolvers": "^4.0.1",
|
|
91
|
-
"@graphql-tools/graphql-file-loader": "^8.0.0",
|
|
92
|
-
"@graphql-tools/load": "^8.0.0",
|
|
85
|
+
"@graphql-codegen/cli": "6.1.1",
|
|
86
|
+
"@graphql-codegen/typescript": "5.0.7",
|
|
87
|
+
"@graphql-codegen/typescript-generic-sdk": "4.1.0",
|
|
88
|
+
"@graphql-codegen/typescript-operations": "5.0.7",
|
|
89
|
+
"@graphql-codegen/typescript-resolvers": "5.1.5",
|
|
93
90
|
"@types/body-parser": "^1.19.5",
|
|
94
91
|
"@types/cors": "^2.8.17",
|
|
95
92
|
"@types/express": "^4.17.25",
|
|
96
|
-
"@types/
|
|
97
|
-
"@types/
|
|
98
|
-
"@types/node": "^24.6.1",
|
|
99
|
-
"@types/pg": "^8.11.10",
|
|
93
|
+
"@types/node": "25.2.3",
|
|
94
|
+
"@types/pg": "8.16.0",
|
|
100
95
|
"@types/ws": "^8.18.1",
|
|
101
|
-
"copyfiles": "
|
|
102
|
-
"
|
|
103
|
-
"graphql-codegen-typescript-validation-schema": "^0.12.0",
|
|
104
|
-
"graphql-tag": "^2.12.6",
|
|
105
|
-
"kysely-pglite-dialect": "^1.2.0",
|
|
96
|
+
"copyfiles": "2.4.1",
|
|
97
|
+
"graphql-tag": "2.12.6",
|
|
106
98
|
"msw": "^2.7.3",
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
"vitest": "^3.2.4"
|
|
99
|
+
"vite": "7.3.1",
|
|
100
|
+
"vitest": "3.2.4"
|
|
110
101
|
},
|
|
111
102
|
"scripts": {
|
|
112
103
|
"tsc": "tsc",
|
|
113
|
-
"build": "
|
|
104
|
+
"build:misc": "copyfiles -u 0 \"src/**/*.graphql\" dist/",
|
|
114
105
|
"lint": "eslint",
|
|
115
|
-
"test": "vitest run",
|
|
106
|
+
"test": "vitest --run",
|
|
116
107
|
"bench": "vitest bench",
|
|
117
108
|
"codegen": "graphql-codegen --config codegen.ts && prettier --write src/graphql/reactor/gen/*.ts && eslint --fix src/graphql/reactor/gen/*.ts --no-warn-ignored",
|
|
118
109
|
"codegen:watch": "graphql-codegen --config codegen.ts --watch"
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { GraphQLResolverMap } from "@apollo/subgraph/dist/schema-helper/resolverMap.js";
|
|
2
|
-
import type { Context, GqlOperation, SubgraphArgs } from "@powerhousedao/reactor-api";
|
|
3
|
-
import type { FileNode } from "document-drive";
|
|
4
|
-
import { BaseSubgraph } from "./base-subgraph.js";
|
|
5
|
-
export declare const DocumentDriveResolvers: {
|
|
6
|
-
DocumentDrive_Node: {
|
|
7
|
-
__resolveType: (obj: FileNode) => string;
|
|
8
|
-
};
|
|
9
|
-
DocumentDrive: {
|
|
10
|
-
operations: (obj: unknown, { skip, first }: {
|
|
11
|
-
skip?: number;
|
|
12
|
-
first?: number;
|
|
13
|
-
}, ctx: Context) => GqlOperation[];
|
|
14
|
-
};
|
|
15
|
-
};
|
|
16
|
-
export declare class DriveSubgraph extends BaseSubgraph {
|
|
17
|
-
private logger;
|
|
18
|
-
constructor(args: SubgraphArgs);
|
|
19
|
-
name: string;
|
|
20
|
-
typeDefs: import("graphql").DocumentNode;
|
|
21
|
-
private getDriveIdBySlugOrId;
|
|
22
|
-
private getDriveBySlugOrId;
|
|
23
|
-
resolvers: GraphQLResolverMap<Context>;
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=drive-subgraph.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"drive-subgraph.d.ts","sourceRoot":"","sources":["../../../src/graphql/drive-subgraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AAC7F,OAAO,KAAK,EACV,OAAO,EAEP,YAAY,EAEZ,YAAY,EACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAGV,QAAQ,EAMT,MAAM,gBAAgB,CAAC;AAgBxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASlD,eAAO,MAAM,sBAAsB;;6BAEV,QAAQ;;;;gBAsGL,CAAC;iBAClB,CAAC;;;CA9FX,CAAC;AAEF,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAGX;gBAES,IAAI,EAAE,YAAY;IAS9B,IAAI,SAAc;IAClB,QAAQ,iCAyKN;YAEY,oBAAoB;YASpB,kBAAkB;IAWhC,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,CA+WpC;CACH"}
|
|
@@ -1,487 +0,0 @@
|
|
|
1
|
-
import { pascalCase } from "change-case";
|
|
2
|
-
import { childLogger, PullResponderTransmitter, responseForDocument, responseForDrive, } from "document-drive";
|
|
3
|
-
import { generateId } from "document-model/core";
|
|
4
|
-
import { GraphQLError } from "graphql";
|
|
5
|
-
import { gql } from "graphql-tag";
|
|
6
|
-
import { processAcknowledge, processGetStrands, processPushUpdate, } from "../sync/utils.js";
|
|
7
|
-
import { BaseSubgraph } from "./base-subgraph.js";
|
|
8
|
-
import { buildGraphQlDriveDocument, IDocumentGraphql } from "./utils.js";
|
|
9
|
-
const driveKindTypeNames = {
|
|
10
|
-
file: "DocumentDrive_FileNode",
|
|
11
|
-
folder: "DocumentDrive_FolderNode",
|
|
12
|
-
};
|
|
13
|
-
export const DocumentDriveResolvers = {
|
|
14
|
-
DocumentDrive_Node: {
|
|
15
|
-
__resolveType: (obj) => {
|
|
16
|
-
return obj.documentType
|
|
17
|
-
? driveKindTypeNames.file
|
|
18
|
-
: driveKindTypeNames.folder;
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
DocumentDrive: {
|
|
22
|
-
operations: IDocumentGraphql.resolvers.IDocument.operations,
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
export class DriveSubgraph extends BaseSubgraph {
|
|
26
|
-
logger = childLogger([
|
|
27
|
-
"DriveSubgraph",
|
|
28
|
-
Math.floor(Math.random() * 999).toString(),
|
|
29
|
-
]);
|
|
30
|
-
constructor(args) {
|
|
31
|
-
super(args);
|
|
32
|
-
this.logger.verbose(`constructor()`);
|
|
33
|
-
}
|
|
34
|
-
// Note: This GQL declaration depends on the document drive subgraph already
|
|
35
|
-
// being registered. If the document drive subgraph is not registered, this
|
|
36
|
-
// will throw an error as it relies on those types.
|
|
37
|
-
name = "d/:drive";
|
|
38
|
-
typeDefs = gql `
|
|
39
|
-
type DriveMeta {
|
|
40
|
-
preferredEditor: String
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
extend type DocumentDrive_DocumentDriveState {
|
|
44
|
-
meta: DriveMeta
|
|
45
|
-
}
|
|
46
|
-
extend type DocumentDrive {
|
|
47
|
-
meta: DriveMeta
|
|
48
|
-
slug: String!
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
type Query {
|
|
52
|
-
system: System
|
|
53
|
-
drive: DriveInfo
|
|
54
|
-
driveDocument: DocumentDrive
|
|
55
|
-
document(id: String!): DriveDocument
|
|
56
|
-
documents: [String!]!
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
type Mutation {
|
|
60
|
-
registerPullResponderListener(
|
|
61
|
-
filter: InputListenerFilter!
|
|
62
|
-
listenerId: String
|
|
63
|
-
): DocumentDrive_Listener
|
|
64
|
-
pushUpdates(strands: [InputStrandUpdate!]): [ListenerRevision!]!
|
|
65
|
-
acknowledge(
|
|
66
|
-
listenerId: String!
|
|
67
|
-
revisions: [ListenerRevisionInput]
|
|
68
|
-
): Boolean
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
input InputOperationSignerUser {
|
|
72
|
-
address: String!
|
|
73
|
-
networkId: String!
|
|
74
|
-
chainId: Int!
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
type OperationSignerUser {
|
|
78
|
-
address: String!
|
|
79
|
-
networkId: String!
|
|
80
|
-
chainId: Int!
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
input InputOperationSignerApp {
|
|
84
|
-
name: String!
|
|
85
|
-
key: String!
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
type OperationSignerApp {
|
|
89
|
-
name: String!
|
|
90
|
-
key: String!
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
type OperationSigner {
|
|
94
|
-
app: OperationSignerApp
|
|
95
|
-
user: OperationSignerUser
|
|
96
|
-
signatures: [[String!]]!
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
input InputOperationSigner {
|
|
100
|
-
app: InputOperationSignerApp
|
|
101
|
-
user: InputOperationSignerUser
|
|
102
|
-
signatures: [[String!]]!
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
type OperationContext {
|
|
106
|
-
signer: OperationSigner
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
input InputOperationContext {
|
|
110
|
-
signer: InputOperationSigner
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
input InputOperationUpdate {
|
|
114
|
-
index: Int!
|
|
115
|
-
skip: Int
|
|
116
|
-
type: String!
|
|
117
|
-
id: String!
|
|
118
|
-
actionId: String!
|
|
119
|
-
input: String!
|
|
120
|
-
hash: String!
|
|
121
|
-
timestampUtcMs: String!
|
|
122
|
-
error: String
|
|
123
|
-
context: InputOperationContext
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
type OperationUpdate {
|
|
127
|
-
index: Int!
|
|
128
|
-
skip: Int
|
|
129
|
-
type: String!
|
|
130
|
-
id: String!
|
|
131
|
-
actionId: String!
|
|
132
|
-
input: String!
|
|
133
|
-
hash: String!
|
|
134
|
-
timestampUtcMs: String!
|
|
135
|
-
error: String
|
|
136
|
-
context: OperationContext
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
type StrandUpdate {
|
|
140
|
-
driveId: String!
|
|
141
|
-
documentId: String!
|
|
142
|
-
documentType: String!
|
|
143
|
-
scope: String!
|
|
144
|
-
branch: String!
|
|
145
|
-
operations: [OperationUpdate!]!
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
input InputStrandUpdate {
|
|
149
|
-
driveId: String!
|
|
150
|
-
documentId: String!
|
|
151
|
-
documentType: String!
|
|
152
|
-
scope: String!
|
|
153
|
-
branch: String!
|
|
154
|
-
operations: [InputOperationUpdate!]!
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
input InputListenerFilter {
|
|
158
|
-
documentType: [String!]
|
|
159
|
-
documentId: [String!]
|
|
160
|
-
scope: [String!]
|
|
161
|
-
branch: [String!]
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
enum UpdateStatus {
|
|
165
|
-
SUCCESS
|
|
166
|
-
MISSING
|
|
167
|
-
CONFLICT
|
|
168
|
-
ERROR
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
input ListenerRevisionInput {
|
|
172
|
-
driveId: String!
|
|
173
|
-
documentId: String!
|
|
174
|
-
documentType: String!
|
|
175
|
-
scope: String!
|
|
176
|
-
branch: String!
|
|
177
|
-
status: UpdateStatus!
|
|
178
|
-
revision: Int!
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
type ListenerRevision {
|
|
182
|
-
driveId: String!
|
|
183
|
-
documentId: String!
|
|
184
|
-
documentType: String!
|
|
185
|
-
scope: String!
|
|
186
|
-
branch: String!
|
|
187
|
-
status: UpdateStatus!
|
|
188
|
-
revision: Int!
|
|
189
|
-
error: String
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
type System {
|
|
193
|
-
sync: Sync
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
type Sync {
|
|
197
|
-
strands(listenerId: ID!, since: String): [StrandUpdate!]!
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
type DriveInfo {
|
|
201
|
-
id: String!
|
|
202
|
-
name: String!
|
|
203
|
-
slug: String!
|
|
204
|
-
meta: DriveMeta
|
|
205
|
-
icon: String
|
|
206
|
-
}
|
|
207
|
-
`;
|
|
208
|
-
async getDriveIdBySlugOrId(slugOrId) {
|
|
209
|
-
try {
|
|
210
|
-
return await this.reactor.getDriveIdBySlug(slugOrId);
|
|
211
|
-
}
|
|
212
|
-
catch {
|
|
213
|
-
const drive = await this.reactor.getDrive(slugOrId);
|
|
214
|
-
return drive.header.id;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
async getDriveBySlugOrId(slugOrId) {
|
|
218
|
-
try {
|
|
219
|
-
return await this.reactor.getDriveBySlug(slugOrId);
|
|
220
|
-
}
|
|
221
|
-
catch {
|
|
222
|
-
const drive = await this.reactor.getDrive(slugOrId);
|
|
223
|
-
return drive;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
resolvers = {
|
|
227
|
-
Asset: {
|
|
228
|
-
__resolveType: (obj) => {
|
|
229
|
-
return obj.type;
|
|
230
|
-
},
|
|
231
|
-
},
|
|
232
|
-
Node: {
|
|
233
|
-
__resolveType: (obj) => {
|
|
234
|
-
return obj.documentType
|
|
235
|
-
? driveKindTypeNames.file
|
|
236
|
-
: driveKindTypeNames.folder;
|
|
237
|
-
},
|
|
238
|
-
},
|
|
239
|
-
Operation: {
|
|
240
|
-
type: (operation) => "type" in operation ? operation.type : operation.action.type,
|
|
241
|
-
id: (operation) => operation.id,
|
|
242
|
-
},
|
|
243
|
-
DriveDocument: {
|
|
244
|
-
operations: IDocumentGraphql.resolvers.IDocument.operations,
|
|
245
|
-
},
|
|
246
|
-
...DocumentDriveResolvers,
|
|
247
|
-
Query: {
|
|
248
|
-
drive: async (_, args, ctx) => {
|
|
249
|
-
this.logger.verbose(`drive()`, JSON.stringify(args));
|
|
250
|
-
if (!ctx.driveId)
|
|
251
|
-
throw new Error("Drive ID is required");
|
|
252
|
-
const drive = await this.getDriveBySlugOrId(ctx.driveId);
|
|
253
|
-
return responseForDrive(drive);
|
|
254
|
-
},
|
|
255
|
-
driveDocument: async (_, args, ctx) => {
|
|
256
|
-
this.logger.verbose(`driveDocument()`, JSON.stringify(args));
|
|
257
|
-
if (!ctx.driveId)
|
|
258
|
-
throw new Error("Drive ID is required");
|
|
259
|
-
const drive = await this.getDriveBySlugOrId(ctx.driveId);
|
|
260
|
-
ctx.document = drive;
|
|
261
|
-
return buildGraphQlDriveDocument(drive);
|
|
262
|
-
},
|
|
263
|
-
documents: async (_, args, ctx) => {
|
|
264
|
-
this.logger.verbose(`documents(drive: ${ctx.driveId})`, args);
|
|
265
|
-
if (!ctx.driveId)
|
|
266
|
-
throw new Error("Drive ID is required");
|
|
267
|
-
const driveId = await this.getDriveIdBySlugOrId(ctx.driveId);
|
|
268
|
-
const documents = await this.reactor.getDocuments(driveId);
|
|
269
|
-
return documents;
|
|
270
|
-
},
|
|
271
|
-
document: async (_, { id }, ctx) => {
|
|
272
|
-
this.logger.verbose(`document(drive: ${ctx.driveId}, id: ${id})`);
|
|
273
|
-
if (!ctx.driveId)
|
|
274
|
-
throw new Error("Drive ID is required");
|
|
275
|
-
const driveId = await this.getDriveIdBySlugOrId(ctx.driveId);
|
|
276
|
-
if (id !== driveId) {
|
|
277
|
-
const driveDocuments = await this.reactor.getDocuments(driveId);
|
|
278
|
-
if (!driveDocuments.includes(id)) {
|
|
279
|
-
throw new GraphQLError("Document is not part of this drive");
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
const document = await this.reactor.getDocument(id);
|
|
283
|
-
const dms = this.reactor.getDocumentModelModules();
|
|
284
|
-
const dm = dms.find(({ documentModel }) => documentModel.global.id === document.header.documentType);
|
|
285
|
-
let node;
|
|
286
|
-
const driveDocument = await this.reactor.getDrive(driveId);
|
|
287
|
-
if (driveDocument?.state?.global?.nodes) {
|
|
288
|
-
node = driveDocument.state.global.nodes.find((node) => node.id === id);
|
|
289
|
-
}
|
|
290
|
-
// eslint-disable-next-line
|
|
291
|
-
const globalState = document.state.global;
|
|
292
|
-
if (!globalState)
|
|
293
|
-
throw new Error("Document was found with no global state");
|
|
294
|
-
const typeName = pascalCase((dm?.documentModel.global.name || "").replaceAll("/", " "));
|
|
295
|
-
return responseForDocument(document, typeName, node?.name);
|
|
296
|
-
},
|
|
297
|
-
system: () => ({ sync: {} }),
|
|
298
|
-
},
|
|
299
|
-
Mutation: {
|
|
300
|
-
registerPullResponderListener: async (_, { filter, listenerId }, ctx) => {
|
|
301
|
-
this.logger.verbose(`registerPullResponderListener(drive: ${ctx.driveId})`, filter);
|
|
302
|
-
if (!ctx.driveId) {
|
|
303
|
-
throw new Error("Drive ID is required");
|
|
304
|
-
}
|
|
305
|
-
const reactorDriveId = await this.getDriveIdBySlugOrId(ctx.driveId);
|
|
306
|
-
// Check global roles first
|
|
307
|
-
const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? "");
|
|
308
|
-
const isGlobalUser = ctx.isUser?.(ctx.user?.address ?? "");
|
|
309
|
-
const isGlobalGuest = ctx.isGuest?.(ctx.user?.address ?? "") ||
|
|
310
|
-
process.env.FREE_ENTRY === "true";
|
|
311
|
-
// If user has a global role, allow access
|
|
312
|
-
const hasGlobalAccess = isGlobalAdmin || isGlobalUser || isGlobalGuest;
|
|
313
|
-
// If no global access, check document-level permissions
|
|
314
|
-
if (!hasGlobalAccess && this.documentPermissionService) {
|
|
315
|
-
const canRead = await this.documentPermissionService.canReadDocument(reactorDriveId, ctx.user?.address);
|
|
316
|
-
if (!canRead) {
|
|
317
|
-
this.logger.warn(`registerPullResponderListener rejected: user ${ctx.user?.address ?? "anonymous"} lacks read permission for drive ${reactorDriveId}`);
|
|
318
|
-
throw new GraphQLError("Forbidden: insufficient permissions to read from this drive");
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
else if (!hasGlobalAccess) {
|
|
322
|
-
throw new GraphQLError("Forbidden");
|
|
323
|
-
}
|
|
324
|
-
const driveId = await this.getDriveIdBySlugOrId(ctx.driveId);
|
|
325
|
-
// Create the listener and transmitter
|
|
326
|
-
const uuid = listenerId ?? generateId();
|
|
327
|
-
const listener = {
|
|
328
|
-
driveId: driveId,
|
|
329
|
-
listenerId: uuid,
|
|
330
|
-
block: false,
|
|
331
|
-
filter,
|
|
332
|
-
system: false,
|
|
333
|
-
label: `Pullresponder #${uuid}`,
|
|
334
|
-
callInfo: {
|
|
335
|
-
data: "",
|
|
336
|
-
name: "PullResponder",
|
|
337
|
-
transmitterType: "PullResponder",
|
|
338
|
-
},
|
|
339
|
-
};
|
|
340
|
-
// TODO: circular reference
|
|
341
|
-
// TODO: once we have DI, remove this and pass around
|
|
342
|
-
const listenerManager = this.reactor.listeners;
|
|
343
|
-
listener.transmitter = new PullResponderTransmitter(listener, listenerManager);
|
|
344
|
-
// set the listener on the manager directly (bypassing operations)
|
|
345
|
-
try {
|
|
346
|
-
await listenerManager.setListener(driveId, listener);
|
|
347
|
-
}
|
|
348
|
-
catch (error) {
|
|
349
|
-
this.logger.error(`Failed to register ephemeral listener: ${error}`);
|
|
350
|
-
throw new Error(`Listener couldn't be registered: ${error}`);
|
|
351
|
-
}
|
|
352
|
-
// for backwards compatibility: return everything but the transmitter
|
|
353
|
-
return {
|
|
354
|
-
driveId: listener.driveId,
|
|
355
|
-
listenerId: listener.listenerId,
|
|
356
|
-
label: listener.label,
|
|
357
|
-
block: listener.block,
|
|
358
|
-
system: listener.system,
|
|
359
|
-
filter: listener.filter,
|
|
360
|
-
callInfo: listener.callInfo,
|
|
361
|
-
};
|
|
362
|
-
},
|
|
363
|
-
pushUpdates: async (_, { strands: strandsGql }, ctx) => {
|
|
364
|
-
if (!ctx.driveId)
|
|
365
|
-
throw new Error("Drive ID is required");
|
|
366
|
-
const driveId = await this.getDriveIdBySlugOrId(ctx.driveId);
|
|
367
|
-
this.logger.verbose(`pushUpdates(drive: slug:${ctx.driveId} id:${driveId})`, strandsGql);
|
|
368
|
-
// Check global roles first (write requires admin or user, not guest)
|
|
369
|
-
const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? "");
|
|
370
|
-
const isGlobalUser = ctx.isUser?.(ctx.user?.address ?? "");
|
|
371
|
-
// If user has global write access, allow
|
|
372
|
-
const hasGlobalWriteAccess = isGlobalAdmin || isGlobalUser;
|
|
373
|
-
// If no global write access, check document-level permissions
|
|
374
|
-
if (!hasGlobalWriteAccess && this.documentPermissionService) {
|
|
375
|
-
const canWrite = await this.documentPermissionService.canWriteDocument(driveId, ctx.user?.address);
|
|
376
|
-
if (!canWrite) {
|
|
377
|
-
this.logger.warn(`pushUpdates rejected: user ${ctx.user?.address ?? "anonymous"} lacks write permission for drive ${driveId}`);
|
|
378
|
-
throw new GraphQLError("Forbidden: insufficient permissions to write to this drive");
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
else if (!hasGlobalWriteAccess) {
|
|
382
|
-
throw new GraphQLError("Forbidden");
|
|
383
|
-
}
|
|
384
|
-
// translate data types
|
|
385
|
-
const strands = strandsGql.map((strandGql) => {
|
|
386
|
-
return {
|
|
387
|
-
operations: strandGql.operations.map((op) => ({
|
|
388
|
-
index: op.index,
|
|
389
|
-
skip: op.skip ?? 0,
|
|
390
|
-
timestampUtcMs: op.timestampUtcMs,
|
|
391
|
-
hash: op.hash,
|
|
392
|
-
id: op.id,
|
|
393
|
-
// Map GraphQL context to Action.context (only signer is defined in schema)
|
|
394
|
-
action: {
|
|
395
|
-
id: op.actionId,
|
|
396
|
-
type: op.type,
|
|
397
|
-
timestampUtcMs: op.timestampUtcMs,
|
|
398
|
-
scope: strandGql.scope,
|
|
399
|
-
input: JSON.parse(op.input),
|
|
400
|
-
context: op.context,
|
|
401
|
-
},
|
|
402
|
-
})),
|
|
403
|
-
documentId: strandGql.documentId,
|
|
404
|
-
documentType: strandGql.documentType,
|
|
405
|
-
driveId: strandGql.driveId,
|
|
406
|
-
scope: strandGql.scope,
|
|
407
|
-
branch: strandGql.branch,
|
|
408
|
-
};
|
|
409
|
-
});
|
|
410
|
-
// return a list of listener revisions
|
|
411
|
-
return await Promise.all(strands.map((strand) => processPushUpdate(this.reactor, strand)));
|
|
412
|
-
},
|
|
413
|
-
acknowledge: async (_, { listenerId, revisions, }, ctx) => {
|
|
414
|
-
if (!listenerId || !revisions)
|
|
415
|
-
return false;
|
|
416
|
-
if (!ctx.driveId)
|
|
417
|
-
throw new Error("Drive ID is required");
|
|
418
|
-
const driveId = await this.getDriveIdBySlugOrId(ctx.driveId);
|
|
419
|
-
this.logger.verbose(`acknowledge(drive: ${ctx.driveId}/${driveId}, listenerId: ${listenerId})`, revisions);
|
|
420
|
-
// translate data types
|
|
421
|
-
const validEntries = revisions
|
|
422
|
-
.filter((r) => r !== null)
|
|
423
|
-
.map((e) => ({
|
|
424
|
-
driveId: e.driveId,
|
|
425
|
-
documentId: e.documentId,
|
|
426
|
-
documentType: e.documentType,
|
|
427
|
-
scope: e.scope,
|
|
428
|
-
branch: e.branch,
|
|
429
|
-
revision: e.revision,
|
|
430
|
-
status: e.status,
|
|
431
|
-
}));
|
|
432
|
-
// return a boolean indicating if the acknowledge was successful
|
|
433
|
-
return await processAcknowledge(this.reactor, driveId, listenerId, validEntries);
|
|
434
|
-
},
|
|
435
|
-
},
|
|
436
|
-
System: {},
|
|
437
|
-
Sync: {
|
|
438
|
-
strands: async (_, { listenerId, since, }, ctx) => {
|
|
439
|
-
if (!ctx.driveId)
|
|
440
|
-
throw new Error("Drive ID is required");
|
|
441
|
-
const driveId = await this.getDriveIdBySlugOrId(ctx.driveId);
|
|
442
|
-
this.logger.verbose(`strands(drive: ${ctx.driveId}/${driveId}, listenerId: ${listenerId}, since:${since})`);
|
|
443
|
-
// Check global roles first
|
|
444
|
-
const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? "");
|
|
445
|
-
const isGlobalUser = ctx.isUser?.(ctx.user?.address ?? "");
|
|
446
|
-
const isGlobalGuest = ctx.isGuest?.(ctx.user?.address ?? "") ||
|
|
447
|
-
process.env.FREE_ENTRY === "true";
|
|
448
|
-
// If user has a global role, allow access
|
|
449
|
-
const hasGlobalAccess = isGlobalAdmin || isGlobalUser || isGlobalGuest;
|
|
450
|
-
// If no global access, check document-level permissions
|
|
451
|
-
if (!hasGlobalAccess && this.documentPermissionService) {
|
|
452
|
-
const canRead = await this.documentPermissionService.canReadDocument(driveId, ctx.user?.address);
|
|
453
|
-
if (!canRead) {
|
|
454
|
-
this.logger.warn(`strands filtered: user ${ctx.user?.address ?? "anonymous"} lacks read permission for drive ${driveId}`);
|
|
455
|
-
return []; // Return empty for drives without permission
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
else if (!hasGlobalAccess) {
|
|
459
|
-
return []; // Return empty if no access
|
|
460
|
-
}
|
|
461
|
-
// get the requested strand updates
|
|
462
|
-
const strands = await processGetStrands(this.reactor, driveId, listenerId, since);
|
|
463
|
-
// translate data types
|
|
464
|
-
return strands.map((update) => ({
|
|
465
|
-
driveId: update.driveId,
|
|
466
|
-
documentId: update.documentId,
|
|
467
|
-
documentType: update.documentType,
|
|
468
|
-
scope: update.scope,
|
|
469
|
-
branch: update.branch,
|
|
470
|
-
operations: update.operations.map((op) => ({
|
|
471
|
-
index: op.index,
|
|
472
|
-
skip: op.skip,
|
|
473
|
-
// no extra name field; GraphQL schema exposes `type`
|
|
474
|
-
input: JSON.stringify(op.input),
|
|
475
|
-
hash: op.hash,
|
|
476
|
-
timestampUtcMs: op.timestampUtcMs,
|
|
477
|
-
type: op.type,
|
|
478
|
-
context: op.context,
|
|
479
|
-
id: op.id,
|
|
480
|
-
actionId: op.actionId,
|
|
481
|
-
})),
|
|
482
|
-
}));
|
|
483
|
-
},
|
|
484
|
-
},
|
|
485
|
-
};
|
|
486
|
-
}
|
|
487
|
-
//# sourceMappingURL=drive-subgraph.js.map
|