@powerhousedao/reactor-api 6.0.0-dev.6 → 6.0.0-dev.61
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/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 -3
- package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/base-subgraph.js +94 -0
- package/dist/src/graphql/base-subgraph.js.map +1 -1
- package/dist/src/graphql/document-model-subgraph.d.ts +28 -43
- package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/document-model-subgraph.js +425 -83
- package/dist/src/graphql/document-model-subgraph.js.map +1 -1
- package/dist/src/graphql/drive-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/drive-subgraph.js +47 -35
- package/dist/src/graphql/drive-subgraph.js.map +1 -1
- package/dist/src/graphql/graphql-manager.d.ts +13 -5
- package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
- package/dist/src/graphql/graphql-manager.js +206 -137
- package/dist/src/graphql/graphql-manager.js.map +1 -1
- package/dist/src/graphql/index.d.ts +1 -0
- package/dist/src/graphql/index.d.ts.map +1 -1
- package/dist/src/graphql/index.js +1 -0
- package/dist/src/graphql/index.js.map +1 -1
- 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 +12 -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 +221 -76
- package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.js +129 -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 +84 -1
- package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +1 -1
- package/dist/src/graphql/reactor/requester.with-zod.js +104 -38
- package/dist/src/graphql/reactor/requester.with-zod.js.map +1 -1
- package/dist/src/graphql/reactor/resolvers.d.ts +77 -25
- package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
- package/dist/src/graphql/reactor/resolvers.js +164 -70
- 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 +23 -5
- package/dist/src/graphql/reactor/validation.d.ts.map +1 -1
- package/dist/src/graphql/reactor/validation.js +15 -1
- 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 -5
- package/dist/src/graphql/types.d.ts.map +1 -1
- package/dist/src/graphql/utils.d.ts.map +1 -1
- package/dist/src/graphql/utils.js +7 -3
- 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/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 +18 -11
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +147 -90
- 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/tracing.js +3 -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 +21 -1
- package/dist/src/utils/create-schema.d.ts.map +1 -1
- package/dist/src/utils/create-schema.js +289 -16
- 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-legacy-permissions.test.d.ts +2 -0
- package/dist/test/document-model-subgraph-legacy-permissions.test.d.ts.map +1 -0
- package/dist/test/document-model-subgraph-legacy-permissions.test.js +460 -0
- package/dist/test/document-model-subgraph-legacy-permissions.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 +573 -0
- package/dist/test/document-model-subgraph-permissions.test.js.map +1 -0
- package/dist/test/document-model-subgraph.test.d.ts +2 -0
- package/dist/test/document-model-subgraph.test.d.ts.map +1 -0
- package/dist/test/document-model-subgraph.test.js +439 -0
- package/dist/test/document-model-subgraph.test.js.map +1 -0
- package/dist/test/drive-handlers.js +1 -1
- package/dist/test/drive-handlers.js.map +1 -1
- 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/drive-subgraph-permissions.test.js +1 -30
- package/dist/test/drive-subgraph-permissions.test.js.map +1 -1
- package/dist/test/permissions-integration.test.js +5 -19
- 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 +4 -4
- 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 +6 -35
- 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 +44 -55
- 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/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
|
@@ -2,17 +2,28 @@ import { viteCommonjs } from "@originjs/vite-plugin-commonjs";
|
|
|
2
2
|
import { childLogger } from "document-drive";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { readPackage } from "read-pkg";
|
|
5
|
-
import { createServer } from "vite";
|
|
5
|
+
import { createLogger, createServer } from "vite";
|
|
6
6
|
import { isSubgraphClass } from "../graphql/utils.js";
|
|
7
7
|
import { debounce, isSubpath } from "./util.js";
|
|
8
|
+
export function createViteLogger(logger, prefix = "") {
|
|
9
|
+
const customLogger = createLogger("info", {
|
|
10
|
+
prefix,
|
|
11
|
+
});
|
|
12
|
+
customLogger.info = logger.info;
|
|
13
|
+
customLogger.warn = logger.warn;
|
|
14
|
+
customLogger.error = logger.error;
|
|
15
|
+
return customLogger;
|
|
16
|
+
}
|
|
8
17
|
export class VitePackageLoader {
|
|
9
18
|
logger = childLogger(["reactor-api", "vite-loader"]);
|
|
19
|
+
legacyReactor;
|
|
10
20
|
vite;
|
|
11
|
-
static build(vite) {
|
|
12
|
-
return new VitePackageLoader(vite);
|
|
21
|
+
static build(vite, options) {
|
|
22
|
+
return new VitePackageLoader(vite, options);
|
|
13
23
|
}
|
|
14
|
-
constructor(vite) {
|
|
24
|
+
constructor(vite, options) {
|
|
15
25
|
this.vite = vite;
|
|
26
|
+
this.legacyReactor = options?.legacyReactor ?? false;
|
|
16
27
|
}
|
|
17
28
|
getDocumentModelsPath(identifier) {
|
|
18
29
|
return path.join(identifier, "./document-models");
|
|
@@ -73,11 +84,22 @@ export class VitePackageLoader {
|
|
|
73
84
|
const fullPath = this.getProcessorsPath(identifier);
|
|
74
85
|
this.logger.verbose("Loading processors from", fullPath);
|
|
75
86
|
try {
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
87
|
+
const pkgModule = await this.vite.ssrLoadModule(fullPath);
|
|
88
|
+
// Choose factory based on constructor option
|
|
89
|
+
const factoryName = this.legacyReactor
|
|
90
|
+
? "processorFactoryLegacy"
|
|
91
|
+
: "processorFactory";
|
|
92
|
+
const factory = pkgModule?.[factoryName];
|
|
93
|
+
if (factory && typeof factory === "function") {
|
|
94
|
+
this.logger.verbose(` ➜ Loaded Processor Factory (${factoryName}) from: ${identifier}`);
|
|
95
|
+
return factory;
|
|
96
|
+
}
|
|
97
|
+
// Fallback: if legacy requested but not found, try default (backwards compat)
|
|
98
|
+
if (this.legacyReactor &&
|
|
99
|
+
pkgModule?.processorFactory &&
|
|
100
|
+
typeof pkgModule.processorFactory === "function") {
|
|
101
|
+
this.logger.verbose(` ➜ Loaded Processor Factory (fallback to processorFactory) from: ${identifier}`);
|
|
102
|
+
return pkgModule.processorFactory;
|
|
81
103
|
}
|
|
82
104
|
}
|
|
83
105
|
catch (e) {
|
|
@@ -127,11 +149,12 @@ export class VitePackageLoader {
|
|
|
127
149
|
};
|
|
128
150
|
}
|
|
129
151
|
}
|
|
130
|
-
export async function startViteServer(root) {
|
|
152
|
+
export async function startViteServer(root, logger) {
|
|
131
153
|
const packageJson = await readPackage({ cwd: root });
|
|
132
154
|
const vite = await createServer({
|
|
133
155
|
root,
|
|
134
156
|
configFile: false,
|
|
157
|
+
logger,
|
|
135
158
|
server: { middlewareMode: true, watch: { ignored: ["**/.ph/**"] } },
|
|
136
159
|
appType: "custom",
|
|
137
160
|
build: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-loader.js","sourceRoot":"","sources":["../../../src/packages/vite-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"vite-loader.js","sourceRoot":"","sources":["../../../src/packages/vite-loader.ts"],"names":[],"mappings":"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"}
|
package/dist/src/server.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { PGlite } from "@electric-sql/pglite";
|
|
2
|
-
import type { IDocumentModelRegistry, IReactorClient, ISyncManager } from "@powerhousedao/reactor";
|
|
3
|
-
import type { IDocumentDriveServer } from "document-drive";
|
|
2
|
+
import type { IDocumentModelRegistry, IReactorClient, ISyncManager, ReactorClientModule } from "@powerhousedao/reactor";
|
|
3
|
+
import type { IDocumentDriveServer, ILogger } from "document-drive";
|
|
4
4
|
import type { DocumentModelModule } from "document-model";
|
|
5
5
|
import type { Express } from "express";
|
|
6
6
|
import type { Pool } from "pg";
|
|
7
|
+
import type { ProcessorApp } from "@powerhousedao/shared/processors";
|
|
7
8
|
import { DocumentPermissionService } from "./services/document-permission.service.js";
|
|
8
9
|
import type { API, IPackageLoader, Processor } from "./types.js";
|
|
9
10
|
type Options = {
|
|
@@ -15,10 +16,7 @@ type Options = {
|
|
|
15
16
|
packages?: string[];
|
|
16
17
|
auth?: {
|
|
17
18
|
enabled: boolean;
|
|
18
|
-
guests: string[];
|
|
19
|
-
users: string[];
|
|
20
19
|
admins: string[];
|
|
21
|
-
freeEntry: boolean;
|
|
22
20
|
};
|
|
23
21
|
https?: {
|
|
24
22
|
keyPath: string;
|
|
@@ -37,6 +35,17 @@ type Options = {
|
|
|
37
35
|
*/
|
|
38
36
|
documentPermissionService?: DocumentPermissionService;
|
|
39
37
|
enableDocumentModelSubgraphs?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* When true, uses the new DocumentModelSubgraph class that uses reactorClient.
|
|
40
|
+
* When false (default), uses the legacy DocumentModelSubgraphLegacy class.
|
|
41
|
+
*/
|
|
42
|
+
useNewDocumentModelSubgraph?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* When true, uses the legacy ProcessorManager from document-drive and hooks up
|
|
45
|
+
* the driveAdded event. When false (default), uses ProcessorManager from ReactorModule.
|
|
46
|
+
*/
|
|
47
|
+
legacyReactor?: boolean;
|
|
48
|
+
logger?: ILogger;
|
|
40
49
|
};
|
|
41
50
|
/**
|
|
42
51
|
* Starts the API server with pre-initialized drive server and client instances.
|
|
@@ -47,24 +56,22 @@ type Options = {
|
|
|
47
56
|
*
|
|
48
57
|
* @returns The API server components.
|
|
49
58
|
*/
|
|
50
|
-
export declare function startAPI(driveServer: IDocumentDriveServer, client: IReactorClient, registry: IDocumentModelRegistry, syncManager: ISyncManager, options: Options): Promise<API>;
|
|
59
|
+
export declare function startAPI(driveServer: IDocumentDriveServer, client: IReactorClient, registry: IDocumentModelRegistry, syncManager: ISyncManager, options: Options, processorApp: ProcessorApp): Promise<API>;
|
|
51
60
|
/**
|
|
52
61
|
* Initializes and starts the API server using initializer functions.
|
|
53
62
|
* This function first loads packages to get document models, then calls the initializer functions
|
|
54
63
|
* to create the drive server and client instances with the appropriate dependencies.
|
|
55
64
|
*
|
|
56
65
|
* @param driveServerInitializer - Initializer function that creates the document drive server with document models.
|
|
57
|
-
* @param clientInitializer - Initializer function that creates the reactor client
|
|
66
|
+
* @param clientInitializer - Initializer function that creates the reactor client module with the drive server.
|
|
58
67
|
* @param options - Additional options for server configuration.
|
|
59
68
|
*
|
|
60
69
|
* @returns The API server components along with the created drive server and client instances.
|
|
61
70
|
*/
|
|
62
|
-
export declare function initializeAndStartAPI(driveServerInitializer: (documentModelModules: DocumentModelModule[]) => Promise<IDocumentDriveServer>, clientInitializer: (driveServer: IDocumentDriveServer, documentModels: DocumentModelModule[]) => Promise<{
|
|
63
|
-
client: IReactorClient;
|
|
64
|
-
syncManager: ISyncManager;
|
|
65
|
-
}>, options: Options): Promise<API & {
|
|
71
|
+
export declare function initializeAndStartAPI(driveServerInitializer: (documentModelModules: DocumentModelModule[]) => Promise<IDocumentDriveServer>, clientInitializer: (driveServer: IDocumentDriveServer, documentModels: DocumentModelModule[]) => Promise<ReactorClientModule>, options: Options, processorApp: ProcessorApp): Promise<API & {
|
|
66
72
|
driveServer: IDocumentDriveServer;
|
|
67
73
|
client: IReactorClient;
|
|
74
|
+
syncManager: ISyncManager;
|
|
68
75
|
}>;
|
|
69
76
|
export {};
|
|
70
77
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/src/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAInD,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAInD,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EAEd,YAAY,EACZ,mBAAmB,EAEpB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAEV,oBAAoB,EACpB,OAAO,EAKR,MAAM,gBAAgB,CAAC;AAMxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAQvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAG/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAgBrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AAEtF,OAAO,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AASjE,KAAK,OAAO,GAAG;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,IAAI,GAAG,SAAS,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,KAAK,CAAC,EACF;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,GACD,OAAO,GACP,SAAS,CAAC;IACd,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC;;;;;;OAMG;IACH,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IACtD,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAmkBF;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,oBAAoB,EACjC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,YAAY,EACzB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,GAAG,CAAC,CAuDd;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,sBAAsB,EAAE,CACtB,oBAAoB,EAAE,mBAAmB,EAAE,KACxC,OAAO,CAAC,oBAAoB,CAAC,EAClC,iBAAiB,EAAE,CACjB,WAAW,EAAE,oBAAoB,EACjC,cAAc,EAAE,mBAAmB,EAAE,KAClC,OAAO,CAAC,mBAAmB,CAAC,EACjC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,GACzB,OAAO,CACR,GAAG,GAAG;IACJ,WAAW,EAAE,oBAAoB,CAAC;IAClC,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,YAAY,CAAC;CAC3B,CACF,CAwEA"}
|
package/dist/src/server.js
CHANGED
|
@@ -2,14 +2,12 @@ import { PostgresAnalyticsStore } from "@powerhousedao/analytics-engine-pg";
|
|
|
2
2
|
import { getConfig } from "@powerhousedao/config/node";
|
|
3
3
|
import { setupMcpServer } from "@powerhousedao/reactor-mcp";
|
|
4
4
|
import devcert from "devcert";
|
|
5
|
-
import { childLogger,
|
|
5
|
+
import { childLogger, createRelationalDbLegacy, ProcessorManagerLegacy, } from "document-drive";
|
|
6
6
|
import express from "express";
|
|
7
7
|
import fs from "node:fs";
|
|
8
8
|
import https from "node:https";
|
|
9
9
|
import path from "node:path";
|
|
10
10
|
import { WebSocketServer } from "ws";
|
|
11
|
-
// Import tracing - initializes OpenTelemetry and provides stub functions for backwards compatibility
|
|
12
|
-
import { initTracing, isTracingEnabled, trace } from "./tracing.js";
|
|
13
11
|
import { config, DefaultCoreSubgraphs } from "./config.js";
|
|
14
12
|
import { AuthSubgraph } from "./graphql/auth/subgraph.js";
|
|
15
13
|
import { GraphQLManager } from "./graphql/graphql-manager.js";
|
|
@@ -19,9 +17,11 @@ import { runMigrations } from "./migrations/index.js";
|
|
|
19
17
|
import { ImportPackageLoader } from "./packages/import-loader.js";
|
|
20
18
|
import { getUniqueDocumentModels, PackageManager, } from "./packages/package-manager.js";
|
|
21
19
|
import { AuthService } from "./services/auth.service.js";
|
|
20
|
+
import { AuthorizationService } from "./services/authorization.service.js";
|
|
22
21
|
import { DocumentPermissionService } from "./services/document-permission.service.js";
|
|
22
|
+
import { initTracing, isTracingEnabled, trace } from "./tracing.js";
|
|
23
23
|
import { getDbClient, initAnalyticsStoreSql, } from "./utils/db.js";
|
|
24
|
-
const
|
|
24
|
+
const defaultLogger = childLogger(["reactor-api", "server"]);
|
|
25
25
|
const DEFAULT_PORT = 4000;
|
|
26
26
|
/**
|
|
27
27
|
* Sets up the Express app with necessary routes
|
|
@@ -44,7 +44,7 @@ function setupGraphQlExplorer(router) {
|
|
|
44
44
|
*/
|
|
45
45
|
async function initializeDatabaseAndAnalytics(dbPath) {
|
|
46
46
|
const { db, knex } = getDbClient(dbPath);
|
|
47
|
-
const relationalDb =
|
|
47
|
+
const relationalDb = createRelationalDbLegacy(db);
|
|
48
48
|
const analyticsStore = new PostgresAnalyticsStore({
|
|
49
49
|
knex,
|
|
50
50
|
});
|
|
@@ -56,16 +56,14 @@ async function initializeDatabaseAndAnalytics(dbPath) {
|
|
|
56
56
|
/**
|
|
57
57
|
* Sets up the subgraph manager and registers subgraphs
|
|
58
58
|
*/
|
|
59
|
-
async function setupGraphQLManager(app, httpServer, wsServer, reactor, client, relationalDb, analyticsStore, syncManager, subgraphs, auth, documentPermissionService, enableDocumentModelSubgraphs) {
|
|
60
|
-
const graphqlManager = new GraphQLManager(config.basePath, app, httpServer, wsServer, reactor, client, relationalDb, analyticsStore, syncManager, {
|
|
59
|
+
async function setupGraphQLManager(app, httpServer, wsServer, reactor, client, relationalDb, analyticsStore, syncManager, subgraphs, logger, auth, documentPermissionService, enableDocumentModelSubgraphs, useNewDocumentModelSubgraph, port, authorizationService) {
|
|
60
|
+
const graphqlManager = new GraphQLManager(config.basePath, app, httpServer, wsServer, reactor, client, relationalDb, analyticsStore, syncManager, logger, {
|
|
61
61
|
enabled: auth?.enabled ?? false,
|
|
62
|
-
guests: auth?.guests ?? [],
|
|
63
|
-
users: auth?.users ?? [],
|
|
64
62
|
admins: auth?.admins ?? [],
|
|
65
|
-
freeEntry: auth?.freeEntry ?? false,
|
|
66
63
|
}, documentPermissionService, {
|
|
67
64
|
enableDocumentModelSubgraphs,
|
|
68
|
-
|
|
65
|
+
useNewDocumentModelSubgraph,
|
|
66
|
+
}, port, authorizationService);
|
|
69
67
|
await graphqlManager.init(subgraphs.core);
|
|
70
68
|
for (const [, collection] of subgraphs.extended.entries()) {
|
|
71
69
|
for (const subgraph of collection) {
|
|
@@ -94,10 +92,7 @@ function setupEventListeners(pkgManager, reactor, graphqlManager, processorManag
|
|
|
94
92
|
pkgManager.onProcessorsChange(async (processors) => {
|
|
95
93
|
for (const [packageName, fns] of processors) {
|
|
96
94
|
await processorManager.unregisterFactory(packageName);
|
|
97
|
-
const factories = fns.map((fn) => fn(
|
|
98
|
-
analyticsStore: module.analyticsStore,
|
|
99
|
-
relationalDb: module.relationalDb,
|
|
100
|
-
}));
|
|
95
|
+
const factories = fns.map((fn) => fn(module));
|
|
101
96
|
await processorManager.registerFactory(packageName, async (driveHeader) => (await Promise.all(factories.map((factory) => Promise.resolve(factory(driveHeader))))).flat());
|
|
102
97
|
}
|
|
103
98
|
});
|
|
@@ -105,7 +100,7 @@ function setupEventListeners(pkgManager, reactor, graphqlManager, processorManag
|
|
|
105
100
|
/**
|
|
106
101
|
* Starts the server (HTTP or HTTPS) and attaches WebSocket server
|
|
107
102
|
*/
|
|
108
|
-
async function startServer(app, port, httpsOptions) {
|
|
103
|
+
async function startServer(app, port, httpsOptions, logger) {
|
|
109
104
|
let httpServer;
|
|
110
105
|
if (httpsOptions) {
|
|
111
106
|
const currentDir = process.cwd();
|
|
@@ -153,60 +148,52 @@ async function _setupCommonInfrastructure(options) {
|
|
|
153
148
|
const app = options.express ?? express();
|
|
154
149
|
// Setup auth configuration
|
|
155
150
|
let admins = [];
|
|
156
|
-
let users = [];
|
|
157
|
-
let guests = [];
|
|
158
151
|
let authEnabled = false;
|
|
159
|
-
let freeEntry = false;
|
|
160
152
|
if (options.configFile) {
|
|
161
153
|
const config = getConfig(options.configFile);
|
|
162
154
|
admins = config.auth?.admins?.map((a) => a.toLowerCase()) ?? [];
|
|
163
|
-
users = config.auth?.users?.map((u) => u.toLowerCase()) ?? [];
|
|
164
|
-
guests = config.auth?.guests?.map((g) => g.toLowerCase()) ?? [];
|
|
165
155
|
authEnabled = config.auth?.enabled ?? false;
|
|
166
|
-
freeEntry = config.auth?.freeEntry ?? false;
|
|
167
156
|
}
|
|
168
157
|
else if (options.auth) {
|
|
169
158
|
admins = options.auth?.admins?.map((a) => a.toLowerCase()) ?? [];
|
|
170
|
-
users = options.auth?.users?.map((u) => u.toLowerCase()) ?? [];
|
|
171
|
-
guests = options.auth?.guests?.map((g) => g.toLowerCase()) ?? [];
|
|
172
159
|
authEnabled = options.auth?.enabled ?? false;
|
|
173
|
-
freeEntry = options.auth?.freeEntry ?? false;
|
|
174
160
|
}
|
|
175
|
-
const { AUTH_ENABLED,
|
|
161
|
+
const { AUTH_ENABLED, ADMINS, DEFAULT_PROTECTION, DOCUMENT_PERMISSIONS_ENABLED, SKIP_CREDENTIAL_VERIFICATION, } = process.env;
|
|
176
162
|
if (AUTH_ENABLED !== undefined) {
|
|
177
163
|
authEnabled = AUTH_ENABLED === "true";
|
|
178
164
|
}
|
|
179
|
-
if (GUESTS !== undefined) {
|
|
180
|
-
guests = GUESTS.split(",").map((g) => g.toLowerCase());
|
|
181
|
-
}
|
|
182
|
-
if (USERS !== undefined) {
|
|
183
|
-
users = USERS.split(",").map((u) => u.toLowerCase());
|
|
184
|
-
}
|
|
185
165
|
if (ADMINS !== undefined) {
|
|
186
166
|
admins = ADMINS.split(",").map((a) => a.toLowerCase());
|
|
187
167
|
}
|
|
188
|
-
|
|
189
|
-
|
|
168
|
+
let defaultProtection = false;
|
|
169
|
+
if (DEFAULT_PROTECTION !== undefined) {
|
|
170
|
+
defaultProtection = DEFAULT_PROTECTION.toLowerCase() === "true";
|
|
171
|
+
}
|
|
172
|
+
// Warn about deprecated env vars
|
|
173
|
+
const { USERS, GUESTS, FREE_ENTRY } = process.env;
|
|
174
|
+
if (USERS || GUESTS || FREE_ENTRY) {
|
|
175
|
+
console.warn("[DEPRECATION WARNING] The USERS, GUESTS, and FREE_ENTRY environment variables are no longer supported. " +
|
|
176
|
+
"Access control is now managed per-document via the DocumentProtection system. " +
|
|
177
|
+
"Use DEFAULT_PROTECTION=true for strict mode, or manage protection per document via the GraphQL API. " +
|
|
178
|
+
"See the auth documentation for migration guidance.");
|
|
190
179
|
}
|
|
191
180
|
let skipCredentialVerification = false;
|
|
192
181
|
if (SKIP_CREDENTIAL_VERIFICATION !== undefined) {
|
|
193
182
|
skipCredentialVerification = SKIP_CREDENTIAL_VERIFICATION === "true";
|
|
194
183
|
}
|
|
195
|
-
const authService = new AuthService({
|
|
196
|
-
enabled: authEnabled,
|
|
197
|
-
guests,
|
|
198
|
-
users,
|
|
199
|
-
admins,
|
|
200
|
-
freeEntry,
|
|
201
|
-
skipCredentialVerification,
|
|
202
|
-
});
|
|
203
184
|
// Health check endpoint (before auth middleware)
|
|
204
185
|
app.get("/health", (_req, res) => {
|
|
205
186
|
res.status(200).send("OK");
|
|
206
187
|
});
|
|
188
|
+
const logger = options.logger ?? defaultLogger;
|
|
207
189
|
// add auth middleware if auth is enabled
|
|
208
190
|
if (authEnabled) {
|
|
209
191
|
logger.info("Setting up Auth middleware");
|
|
192
|
+
const authService = new AuthService({
|
|
193
|
+
enabled: authEnabled,
|
|
194
|
+
admins,
|
|
195
|
+
skipCredentialVerification,
|
|
196
|
+
});
|
|
210
197
|
// Apply auth middleware to all routes including GraphQL
|
|
211
198
|
app.use((req, res, next) => {
|
|
212
199
|
authService.authenticate(req, res, next);
|
|
@@ -224,11 +211,21 @@ async function _setupCommonInfrastructure(options) {
|
|
|
224
211
|
// Run document permission migrations
|
|
225
212
|
await runMigrations(db);
|
|
226
213
|
logger.info("Document permission migrations completed");
|
|
227
|
-
documentPermissionService = new DocumentPermissionService(db);
|
|
214
|
+
documentPermissionService = new DocumentPermissionService(db, { defaultProtection });
|
|
228
215
|
logger.info("Document permission service initialized");
|
|
229
216
|
}
|
|
217
|
+
// Create AuthorizationService when document permission service is available
|
|
218
|
+
let authorizationService;
|
|
219
|
+
if (documentPermissionService) {
|
|
220
|
+
authorizationService = new AuthorizationService(documentPermissionService, {
|
|
221
|
+
admins,
|
|
222
|
+
defaultProtection,
|
|
223
|
+
});
|
|
224
|
+
logger.info("Authorization service initialized");
|
|
225
|
+
}
|
|
230
226
|
// Initialize package manager
|
|
231
|
-
const
|
|
227
|
+
const legacyReactor = options.legacyReactor ?? false;
|
|
228
|
+
const packageLoader = options.packageLoader ?? new ImportPackageLoader({ legacyReactor });
|
|
232
229
|
const loaders = [packageLoader];
|
|
233
230
|
const packages = new PackageManager(loaders, {
|
|
234
231
|
configFile: options.configFile,
|
|
@@ -239,62 +236,110 @@ async function _setupCommonInfrastructure(options) {
|
|
|
239
236
|
app,
|
|
240
237
|
auth: {
|
|
241
238
|
enabled: authEnabled,
|
|
242
|
-
guests,
|
|
243
|
-
users,
|
|
244
239
|
admins,
|
|
245
|
-
freeEntry,
|
|
246
240
|
},
|
|
247
241
|
relationalDb,
|
|
248
242
|
analyticsStore,
|
|
249
243
|
documentPermissionService,
|
|
244
|
+
authorizationService,
|
|
250
245
|
packages,
|
|
251
246
|
};
|
|
252
247
|
}
|
|
253
248
|
/**
|
|
254
249
|
* Private helper function containing common setup logic for API initialization
|
|
255
250
|
*/
|
|
256
|
-
async function _setupAPI(reactor, reactorClient, syncManager, app, port, packages, relationalDb, analyticsStore, documentPermissionService, processors, subgraphs, options, auth) {
|
|
257
|
-
const module = {
|
|
251
|
+
async function _setupAPI(reactor, reactorClient, syncManager, app, port, packages, relationalDb, analyticsStore, documentPermissionService, processors, subgraphs, options, auth, legacyReactor, processorApp, reactorProcessorManager, authorizationService) {
|
|
252
|
+
const module = {
|
|
253
|
+
relationalDb,
|
|
254
|
+
analyticsStore,
|
|
255
|
+
processorApp,
|
|
256
|
+
config: options.processorConfig,
|
|
257
|
+
};
|
|
258
258
|
const mcpServerEnabled = options.mcp ?? true;
|
|
259
|
+
const logger = options.logger ?? defaultLogger;
|
|
259
260
|
// initialize processors
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
261
|
+
let processorManager;
|
|
262
|
+
if (legacyReactor) {
|
|
263
|
+
// LEGACY PATH - use document-drive ProcessorManager
|
|
264
|
+
processorManager = new ProcessorManagerLegacy(reactor.listeners, reactor);
|
|
265
|
+
for (const [packageName, fns] of [
|
|
266
|
+
...processors.entries(),
|
|
267
|
+
...Object.entries(options.processors ?? {}),
|
|
268
|
+
]) {
|
|
269
|
+
const factories = fns.map((fn) => {
|
|
270
|
+
try {
|
|
271
|
+
return fn(module);
|
|
272
|
+
}
|
|
273
|
+
catch (e) {
|
|
274
|
+
logger.error(`Error initializing processor factory for package ${packageName}:`, e);
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
const validFactories = factories.filter((factory) => factory !== null && typeof factory === "function");
|
|
279
|
+
if (!validFactories.length) {
|
|
280
|
+
continue;
|
|
276
281
|
}
|
|
282
|
+
await processorManager.registerFactory(packageName, async (driveHeader) => (await Promise.all(validFactories.map(async (factory) => {
|
|
283
|
+
try {
|
|
284
|
+
return await factory(driveHeader);
|
|
285
|
+
}
|
|
286
|
+
catch (e) {
|
|
287
|
+
logger.error(`Error creating processor for drive ${driveHeader.id}:`, e);
|
|
288
|
+
return [];
|
|
289
|
+
}
|
|
290
|
+
}))).flat());
|
|
291
|
+
}
|
|
292
|
+
// hook up processor manager to drive added event
|
|
293
|
+
reactor.on("driveAdded", async (drive) => {
|
|
294
|
+
await processorManager.registerDrive(drive.header.id);
|
|
277
295
|
});
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
// NEW REACTOR PATH - use ProcessorManager from ReactorModule
|
|
299
|
+
if (!reactorProcessorManager) {
|
|
300
|
+
throw new Error("ProcessorManager not available from ReactorModule");
|
|
281
301
|
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
302
|
+
// Create a wrapper that adapts the legacy-style ProcessorManager interface
|
|
303
|
+
// to track processors for the API response
|
|
304
|
+
processorManager = new ProcessorManagerLegacy(reactor.listeners, reactor);
|
|
305
|
+
for (const [packageName, fns] of [
|
|
306
|
+
...processors.entries(),
|
|
307
|
+
...Object.entries(options.processors ?? {}),
|
|
308
|
+
]) {
|
|
309
|
+
const factories = fns.map((fn) => {
|
|
310
|
+
try {
|
|
311
|
+
return fn(module);
|
|
312
|
+
}
|
|
313
|
+
catch (e) {
|
|
314
|
+
logger.error(`Error initializing processor factory for package ${packageName}:`, e);
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
// Filter and cast to the reactor types
|
|
319
|
+
// When legacyReactor=false, PackageLoader loads processorFactory which
|
|
320
|
+
// returns factories implementing reactor's IProcessor interface
|
|
321
|
+
const validFactories = factories.filter((factory) => factory !== null && typeof factory === "function");
|
|
322
|
+
if (!validFactories.length) {
|
|
323
|
+
continue;
|
|
289
324
|
}
|
|
290
|
-
|
|
325
|
+
// Register with the new reactor ProcessorManager
|
|
326
|
+
// Cast the results to ReactorProcessorRecord since the loaded factories
|
|
327
|
+
// implement the new reactor interface when legacyReactor=false
|
|
328
|
+
await reactorProcessorManager.registerFactory(packageName, async (driveHeader) => (await Promise.all(validFactories.map(async (factory) => {
|
|
329
|
+
try {
|
|
330
|
+
const result = await factory(driveHeader);
|
|
331
|
+
return result;
|
|
332
|
+
}
|
|
333
|
+
catch (e) {
|
|
334
|
+
logger.error(`Error creating processor for drive ${driveHeader.id}:`, e);
|
|
335
|
+
return [];
|
|
336
|
+
}
|
|
337
|
+
}))).flat());
|
|
338
|
+
}
|
|
339
|
+
// No driveAdded event listener needed - ProcessorManager is a read model
|
|
291
340
|
}
|
|
292
|
-
// hook up processor manager to drive added event
|
|
293
|
-
reactor.on("driveAdded", async (drive) => {
|
|
294
|
-
await processorManager.registerDrive(drive.header.id);
|
|
295
|
-
});
|
|
296
341
|
// Start the server
|
|
297
|
-
const { httpServer, wsServer } = await startServer(app, port, options.https);
|
|
342
|
+
const { httpServer, wsServer } = await startServer(app, port, options.https, logger);
|
|
298
343
|
// set up subgraph manager
|
|
299
344
|
const coreSubgraphs = DefaultCoreSubgraphs.slice();
|
|
300
345
|
coreSubgraphs.push(ReactorSubgraph);
|
|
@@ -306,7 +351,7 @@ async function _setupAPI(reactor, reactorClient, syncManager, app, port, package
|
|
|
306
351
|
const graphqlManager = await setupGraphQLManager(app, httpServer, wsServer, reactor, reactorClient, relationalDb, analyticsStore, syncManager, {
|
|
307
352
|
extended: subgraphs,
|
|
308
353
|
core: coreSubgraphs,
|
|
309
|
-
}, auth, documentPermissionService, options.enableDocumentModelSubgraphs);
|
|
354
|
+
}, logger.child(["graphql-manager"]), auth, documentPermissionService, options.enableDocumentModelSubgraphs, options.useNewDocumentModelSubgraph, port, authorizationService);
|
|
310
355
|
// Set up event listeners
|
|
311
356
|
setupEventListeners(packages, reactor, graphqlManager, processorManager, module);
|
|
312
357
|
if (mcpServerEnabled) {
|
|
@@ -329,8 +374,8 @@ async function _setupAPI(reactor, reactorClient, syncManager, app, port, package
|
|
|
329
374
|
*
|
|
330
375
|
* @returns The API server components.
|
|
331
376
|
*/
|
|
332
|
-
export async function startAPI(driveServer, client, registry, syncManager, options) {
|
|
333
|
-
const { port, app, auth, relationalDb, analyticsStore, documentPermissionService, packages, } = await trace("reactor-api.setup.infrastructure", { tags: { "resource.name": "infrastructure" } }, () => _setupCommonInfrastructure(options));
|
|
377
|
+
export async function startAPI(driveServer, client, registry, syncManager, options, processorApp) {
|
|
378
|
+
const { port, app, auth, relationalDb, analyticsStore, documentPermissionService, authorizationService, packages, } = await trace("reactor-api.setup.infrastructure", { tags: { "resource.name": "infrastructure" } }, () => _setupCommonInfrastructure(options));
|
|
334
379
|
const { documentModels, processors, subgraphs } = await trace("reactor-api.packages.init", { tags: { "resource.name": "packages" } }, () => packages.init());
|
|
335
380
|
// pass to legacy reactor
|
|
336
381
|
driveServer.setDocumentModelModules(getUniqueDocumentModels([
|
|
@@ -339,7 +384,10 @@ export async function startAPI(driveServer, client, registry, syncManager, optio
|
|
|
339
384
|
]));
|
|
340
385
|
// pass to registry
|
|
341
386
|
registry.registerModules(...documentModels);
|
|
342
|
-
|
|
387
|
+
// startAPI always uses legacy reactor since it doesn't have ReactorClientModule
|
|
388
|
+
const legacyReactor = true;
|
|
389
|
+
return _setupAPI(driveServer, client, syncManager, app, port, packages, relationalDb, analyticsStore, documentPermissionService, processors, subgraphs, options, auth, legacyReactor, processorApp, undefined, // no reactorProcessorManager in legacy mode
|
|
390
|
+
authorizationService);
|
|
343
391
|
}
|
|
344
392
|
/**
|
|
345
393
|
* Initializes and starts the API server using initializer functions.
|
|
@@ -347,21 +395,30 @@ export async function startAPI(driveServer, client, registry, syncManager, optio
|
|
|
347
395
|
* to create the drive server and client instances with the appropriate dependencies.
|
|
348
396
|
*
|
|
349
397
|
* @param driveServerInitializer - Initializer function that creates the document drive server with document models.
|
|
350
|
-
* @param clientInitializer - Initializer function that creates the reactor client
|
|
398
|
+
* @param clientInitializer - Initializer function that creates the reactor client module with the drive server.
|
|
351
399
|
* @param options - Additional options for server configuration.
|
|
352
400
|
*
|
|
353
401
|
* @returns The API server components along with the created drive server and client instances.
|
|
354
402
|
*/
|
|
355
|
-
export async function initializeAndStartAPI(driveServerInitializer, clientInitializer, options) {
|
|
356
|
-
const { port, app, auth, relationalDb, analyticsStore, documentPermissionService, packages, } = await trace("reactor-api.setup.infrastructure", { tags: { "resource.name": "infrastructure" } }, () => _setupCommonInfrastructure(options));
|
|
403
|
+
export async function initializeAndStartAPI(driveServerInitializer, clientInitializer, options, processorApp) {
|
|
404
|
+
const { port, app, auth, relationalDb, analyticsStore, documentPermissionService, authorizationService, packages, } = await trace("reactor-api.setup.infrastructure", { tags: { "resource.name": "infrastructure" } }, () => _setupCommonInfrastructure(options));
|
|
357
405
|
const { documentModels, processors, subgraphs } = await trace("reactor-api.packages.init", { tags: { "resource.name": "packages" } }, () => packages.init());
|
|
358
406
|
const reactor = await trace("reactor-api.drive-server.init", { tags: { "resource.name": "drive-server" } }, () => driveServerInitializer(documentModels));
|
|
359
|
-
const
|
|
360
|
-
|
|
407
|
+
const reactorClientModule = await trace("reactor-api.reactor-client.init", { tags: { "resource.name": "reactor-client" } }, () => clientInitializer(reactor, documentModels));
|
|
408
|
+
// Extract client and syncManager from the module
|
|
409
|
+
const reactorClient = reactorClientModule.client;
|
|
410
|
+
const syncManager = reactorClientModule.reactorModule?.syncModule?.syncManager;
|
|
411
|
+
if (!syncManager) {
|
|
412
|
+
throw new Error("SyncManager not available from ReactorClientModule");
|
|
413
|
+
}
|
|
414
|
+
const legacyReactor = options.legacyReactor ?? false;
|
|
415
|
+
const reactorProcessorManager = reactorClientModule.reactorModule?.processorManager;
|
|
416
|
+
const api = await _setupAPI(reactor, reactorClient, syncManager, app, port, packages, relationalDb, analyticsStore, documentPermissionService, processors, subgraphs, options, auth, legacyReactor, processorApp, reactorProcessorManager, authorizationService);
|
|
361
417
|
return {
|
|
362
418
|
...api,
|
|
363
419
|
driveServer: reactor,
|
|
364
420
|
client: reactorClient,
|
|
421
|
+
syncManager,
|
|
365
422
|
};
|
|
366
423
|
}
|
|
367
424
|
//# sourceMappingURL=server.js.map
|