@powerhousedao/reactor-api 1.29.18-dev.0 → 1.29.18-dev.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/graphql/drive/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAOpE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AAyB7F,qBAAa,aAAc,SAAQ,QAAQ;IACzC,OAAO,CAAC,MAAM,CAGX;gBAES,IAAI,EAAE,YAAY;IAM9B,IAAI,SAAc;IAClB,QAAQ,iCAsJN;IAEF,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAoPpC;CACH"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/graphql/drive/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAOpE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AAyB7F,qBAAa,aAAc,SAAQ,QAAQ;IACzC,OAAO,CAAC,MAAM,CAGX;gBAES,IAAI,EAAE,YAAY;IAS9B,IAAI,SAAc;IAClB,QAAQ,iCAsJN;IAEF,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAoPpC;CACH"}
@@ -16,6 +16,9 @@ export class DriveSubgraph extends Subgraph {
16
16
  super(args);
17
17
  this.logger.verbose(`constructor()`);
18
18
  }
19
+ // Note: This GQL declaration depends on the document drive subgraph already
20
+ // being registered. If the document drive subgraph is not registered, this
21
+ // will throw an error as it relies on those types.
19
22
  name = "d/:drive";
20
23
  typeDefs = gql `
21
24
  type DriveMeta {
@@ -224,7 +227,7 @@ export class DriveSubgraph extends Subgraph {
224
227
  id,
225
228
  revision: document.revision.global,
226
229
  state: document.state.global,
227
- stateJSON: JSON.stringify(document.state.global),
230
+ stateJSON: document.state.global,
228
231
  operations: document.operations.global.map((op) => ({
229
232
  ...op,
230
233
  inputText: typeof op.input === "string"
@@ -0,0 +1,14 @@
1
+ import { SubgraphClass } from "#graphql/index.js";
2
+ import { ProcessorFactory } from "document-drive/processors/types";
3
+ import { DocumentModelModule } from "document-model";
4
+ import { IPackageLoader } from "./types.js";
5
+ /**
6
+ * This class is used to load packages using the import keyword.
7
+ */
8
+ export declare class ImportPackageLoader implements IPackageLoader {
9
+ private readonly logger;
10
+ loadDocumentModels(identifier: string): Promise<DocumentModelModule[]>;
11
+ loadSubgraphs(identifier: string): Promise<SubgraphClass[]>;
12
+ loadProcessors(identifier: string): Promise<(module: any) => ProcessorFactory>;
13
+ }
14
+ //# sourceMappingURL=import-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-loader.d.ts","sourceRoot":"","sources":["../../../src/packages/import-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C;;GAEG;AACH,qBAAa,mBAAoB,YAAW,cAAc;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;IAElE,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAyBtE,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAsB3D,cAAc,CAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,gBAAgB,CAAC;CAgB9C"}
@@ -0,0 +1,53 @@
1
+ import { childLogger } from "document-drive";
2
+ import { loadDependency } from "./util.js";
3
+ /**
4
+ * This class is used to load packages using the import keyword.
5
+ */
6
+ export class ImportPackageLoader {
7
+ logger = childLogger(["reactor-api", "import-loader"]);
8
+ async loadDocumentModels(identifier) {
9
+ this.logger.verbose("Loading document models from package:", identifier);
10
+ let pkgModule;
11
+ try {
12
+ pkgModule = (await loadDependency(identifier, "document-models"));
13
+ }
14
+ catch (e) {
15
+ this.logger.verbose(` ➜ No Document Models found: ${identifier}`);
16
+ return [];
17
+ }
18
+ if (pkgModule) {
19
+ this.logger.verbose(` ➜ Loaded Document Models from: ${identifier}`);
20
+ return Object.values(pkgModule);
21
+ }
22
+ else {
23
+ this.logger.verbose(` ➜ No Document Models found: ${identifier}`);
24
+ return [];
25
+ }
26
+ }
27
+ async loadSubgraphs(identifier) {
28
+ this.logger.verbose("Loading subgraphs from package:", identifier);
29
+ const pkgModule = (await loadDependency(identifier, "subgraphs"));
30
+ if (!pkgModule) {
31
+ this.logger.verbose(` ➜ No Subgraphs found: ${identifier}`);
32
+ return [];
33
+ }
34
+ const subgraphs = Object.values(pkgModule).map((subgraph) => {
35
+ return Object.values(subgraph);
36
+ });
37
+ this.logger.verbose(` ➜ Loaded Subgraphs from: ${identifier}`);
38
+ return subgraphs.flat();
39
+ }
40
+ async loadProcessors(identifier) {
41
+ this.logger.verbose("Loading processors from package:", identifier);
42
+ const pkgModule = (await loadDependency(identifier, "processors"));
43
+ if (pkgModule) {
44
+ this.logger.verbose(` ➜ Loaded Processor Factory from: ${identifier}`);
45
+ return pkgModule;
46
+ }
47
+ else {
48
+ this.logger.verbose(` ➜ No Processor Factory found: ${identifier}`);
49
+ }
50
+ // empty processor factory
51
+ return () => () => [];
52
+ }
53
+ }
@@ -0,0 +1,28 @@
1
+ import { type SubgraphClass } from "@powerhousedao/reactor-api";
2
+ import { ProcessorFactory } from "document-drive/processors/types";
3
+ import { type DocumentModelModule } from "document-model";
4
+ import { IPackageLoader, IPackageManager, IPackageManagerOptions, PackageManagerResult } from "./types.js";
5
+ export declare function getUniqueDocumentModels(...documentModels: DocumentModelModule[][]): DocumentModelModule[];
6
+ export declare class PackageManager implements IPackageManager {
7
+ protected options: IPackageManagerOptions;
8
+ private readonly logger;
9
+ private loaders;
10
+ private docModelsMap;
11
+ private subgraphsMap;
12
+ private processorMap;
13
+ private configWatcher;
14
+ private eventEmitter;
15
+ constructor(loaders: IPackageLoader[], options: IPackageManagerOptions);
16
+ init(): Promise<PackageManagerResult>;
17
+ private loadPackages;
18
+ private getAllPackageNames;
19
+ private getPackageNamesFromConfigFile;
20
+ private initConfigFileWatcher;
21
+ private updatePackagesMap;
22
+ private updateSubgraphsMap;
23
+ private updateProcessorsMap;
24
+ onDocumentModelsChange(handler: (documentModels: Record<string, DocumentModelModule[]>) => void): void;
25
+ onSubgraphsChange(handler: (subgraphs: Map<string, SubgraphClass[]>) => void): void;
26
+ onProcessorsChange(handler: (processors: Map<string, ((module: any) => ProcessorFactory)[]>) => void): void;
27
+ }
28
+ //# sourceMappingURL=package-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../../src/packages/package-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AACpB,wBAAgB,uBAAuB,CACrC,GAAG,cAAc,EAAE,mBAAmB,EAAE,EAAE,GACzC,mBAAmB,EAAE,CAUvB;AAED,qBAAa,cAAe,YAAW,eAAe;IAmBlD,SAAS,CAAC,OAAO,EAAE,sBAAsB;IAlB3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmD;IAC1E,OAAO,CAAC,OAAO,CAAmB;IAElC,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,YAAY,CAGhB;IACJ,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,YAAY,CAIf;gBAGH,OAAO,EAAE,cAAc,EAAE,EACf,OAAO,EAAE,sBAAsB;IAM9B,IAAI,IAAI,OAAO,CAAC,oBAAoB,CAAC;YAQpC,YAAY;IAsD1B,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,6BAA6B;IAKrC,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,mBAAmB;IAe3B,sBAAsB,CACpB,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,KAAK,IAAI,GACvE,IAAI;IAIP,iBAAiB,CACf,OAAO,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,KAAK,IAAI,GACzD,IAAI;IAIP,kBAAkB,CAChB,OAAO,EAAE,CACP,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,gBAAgB,CAAC,EAAE,CAAC,KAC3D,IAAI,GACR,IAAI;CAGR"}
@@ -0,0 +1,135 @@
1
+ import { getConfig } from "@powerhousedao/config";
2
+ import { childLogger, driveDocumentModelModule } from "document-drive";
3
+ import { documentModelDocumentModelModule, } from "document-model";
4
+ import EventEmitter from "node:events";
5
+ import { watchFile } from "node:fs";
6
+ export function getUniqueDocumentModels(...documentModels) {
7
+ const uniqueModels = new Map();
8
+ for (const models of documentModels) {
9
+ for (const model of models) {
10
+ uniqueModels.set(model.documentModel.id, model);
11
+ }
12
+ }
13
+ return Array.from(uniqueModels.values());
14
+ }
15
+ export class PackageManager {
16
+ options;
17
+ logger = childLogger(["reactor-api", "package-manager"]);
18
+ loaders;
19
+ docModelsMap = new Map();
20
+ subgraphsMap = new Map();
21
+ processorMap = new Map();
22
+ configWatcher;
23
+ eventEmitter = new EventEmitter();
24
+ constructor(loaders, options) {
25
+ this.options = options;
26
+ this.loaders = loaders;
27
+ this.eventEmitter.setMaxListeners(0);
28
+ }
29
+ async init() {
30
+ if (this.options.configFile) {
31
+ this.initConfigFileWatcher(this.options.configFile);
32
+ }
33
+ return await this.loadPackages(this.getAllPackageNames());
34
+ }
35
+ async loadPackages(packages) {
36
+ this.logger.info(`Loading packages: ${packages.join(", ")}`);
37
+ const documentModelModuleMap = new Map();
38
+ const subgraphsMap = new Map();
39
+ const processorsMap = new Map();
40
+ // static prereqs
41
+ documentModelModuleMap.set("document-drive", [
42
+ driveDocumentModelModule,
43
+ ]);
44
+ documentModelModuleMap.set("document-model", [
45
+ documentModelDocumentModelModule,
46
+ ]);
47
+ for (const pkg of packages) {
48
+ const allDocumentModels = [];
49
+ const allSubgraphs = [];
50
+ const allProcessors = [];
51
+ for (const loader of this.loaders) {
52
+ const documentModels = await loader.loadDocumentModels(pkg);
53
+ const subgraphs = await loader.loadSubgraphs(pkg);
54
+ const processors = await loader.loadProcessors(pkg);
55
+ allDocumentModels.push(...documentModels);
56
+ allSubgraphs.push(...subgraphs);
57
+ allProcessors.push(processors);
58
+ }
59
+ documentModelModuleMap.set(pkg, allDocumentModels);
60
+ subgraphsMap.set(pkg, allSubgraphs);
61
+ processorsMap.set(pkg, allProcessors);
62
+ }
63
+ this.updatePackagesMap(documentModelModuleMap);
64
+ this.updateSubgraphsMap(subgraphsMap);
65
+ this.updateProcessorsMap(processorsMap);
66
+ return {
67
+ documentModels: getUniqueDocumentModels(...Array.from(documentModelModuleMap.values())),
68
+ subgraphs: subgraphsMap,
69
+ processors: processorsMap,
70
+ };
71
+ }
72
+ getAllPackageNames() {
73
+ const packageNames = this.options.packages ?? [];
74
+ if (this.options.configFile) {
75
+ packageNames.push(...this.getPackageNamesFromConfigFile(this.options.configFile));
76
+ }
77
+ return packageNames;
78
+ }
79
+ getPackageNamesFromConfigFile(configFile) {
80
+ const loadedConfig = getConfig(configFile);
81
+ return loadedConfig.packages?.map((pkg) => pkg.packageName) ?? [];
82
+ }
83
+ initConfigFileWatcher(configFile) {
84
+ if (!this.configWatcher) {
85
+ this.configWatcher = watchFile(configFile, { interval: 100 }, (curr, prev) => {
86
+ if (curr.mtime === prev.mtime) {
87
+ return;
88
+ }
89
+ void this.loadPackages(this.getAllPackageNames());
90
+ });
91
+ }
92
+ }
93
+ updatePackagesMap(packagesMap) {
94
+ const oldPackages = Array.from(this.docModelsMap.keys());
95
+ const newPackages = Array.from(packagesMap.keys());
96
+ oldPackages
97
+ .filter((pkg) => !newPackages.includes(pkg))
98
+ .forEach((pkg) => {
99
+ this.logger.info(`> Removed package: ${pkg}`);
100
+ });
101
+ this.docModelsMap = packagesMap;
102
+ this.eventEmitter.emit("documentModelsChange", Object.fromEntries(packagesMap));
103
+ }
104
+ updateSubgraphsMap(subgraphsMap) {
105
+ const oldPackages = Array.from(this.subgraphsMap.keys());
106
+ const newPackages = Array.from(subgraphsMap.keys());
107
+ oldPackages
108
+ .filter((pkg) => !newPackages.includes(pkg))
109
+ .forEach((pkg) => {
110
+ this.logger.info(`> Removed Subgraphs from: ${pkg}`);
111
+ });
112
+ this.subgraphsMap = subgraphsMap;
113
+ this.eventEmitter.emit("subgraphsChange", subgraphsMap);
114
+ }
115
+ updateProcessorsMap(processorsMap) {
116
+ const oldPackages = Array.from(this.processorMap.keys());
117
+ const newPackages = Array.from(processorsMap.keys());
118
+ oldPackages
119
+ .filter((pkg) => !newPackages.includes(pkg))
120
+ .forEach((pkg) => {
121
+ this.logger.info(`> Removed Processor Factories from: ${pkg}`);
122
+ });
123
+ this.processorMap = processorsMap;
124
+ this.eventEmitter.emit("processorsChange", processorsMap);
125
+ }
126
+ onDocumentModelsChange(handler) {
127
+ this.eventEmitter.on("documentModelsChange", handler);
128
+ }
129
+ onSubgraphsChange(handler) {
130
+ this.eventEmitter.on("subgraphsChange", handler);
131
+ }
132
+ onProcessorsChange(handler) {
133
+ this.eventEmitter.on("processorsChange", handler);
134
+ }
135
+ }
@@ -0,0 +1,27 @@
1
+ import { SubgraphClass } from "#graphql/index.js";
2
+ import { ProcessorFactory } from "document-drive/processors/types";
3
+ import { DocumentModelModule } from "document-model";
4
+ export interface IPackageLoader {
5
+ loadDocumentModels(identifier: string): Promise<DocumentModelModule[]>;
6
+ loadSubgraphs(identifier: string): Promise<SubgraphClass[]>;
7
+ loadProcessors(identifier: string): Promise<(module: any) => ProcessorFactory>;
8
+ }
9
+ export interface IPackageManager {
10
+ onDocumentModelsChange(handler: (documentModels: Record<string, DocumentModelModule[]>) => void): void;
11
+ }
12
+ export type IPackageManagerOptions = {
13
+ packages?: string[];
14
+ configFile?: string;
15
+ };
16
+ export interface PackageConfig {
17
+ packageName: string;
18
+ }
19
+ export interface PowerhouseConfig {
20
+ packages?: PackageConfig[];
21
+ }
22
+ export type PackageManagerResult = {
23
+ documentModels: DocumentModelModule[];
24
+ subgraphs: Map<string, SubgraphClass[]>;
25
+ processors: Map<string, ((module: any) => ProcessorFactory)[]>;
26
+ };
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/packages/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACvE,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC5D,cAAc,CACZ,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,gBAAgB,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,eAAe;IAC9B,sBAAsB,CACpB,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,KAAK,IAAI,GACvE,IAAI,CAAC;CACT;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IACxC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,gBAAgB,CAAC,EAAE,CAAC,CAAC;CAChE,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ export declare const installPackages: (packages: string[]) => Promise<void>;
2
+ export declare const readManifest: () => string;
3
+ export declare function loadDependency(packageName: string, subPath: string): Promise<unknown>;
4
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/packages/util.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,GAAU,UAAU,MAAM,EAAE,kBAIvD,CAAC;AAEF,eAAO,MAAM,YAAY,cAGxB,CAAC;AAEF,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAUlB"}
@@ -0,0 +1,21 @@
1
+ import { execSync } from "node:child_process";
2
+ export const installPackages = async (packages) => {
3
+ for (const packageName of packages) {
4
+ execSync(`ph install ${packageName}`);
5
+ }
6
+ };
7
+ export const readManifest = () => {
8
+ const manifest = execSync(`ph manifest`).toString();
9
+ return manifest;
10
+ };
11
+ export async function loadDependency(packageName, subPath) {
12
+ try {
13
+ const fullPath = `${packageName}/${subPath}`;
14
+ // vite does not support this, but that's okay as we have provided the
15
+ // vite-loader for this purpose
16
+ return await import(/* @vite-ignore */ fullPath);
17
+ }
18
+ catch (e) {
19
+ return null;
20
+ }
21
+ }
@@ -1,3 +1,4 @@
1
+ import { type IPackageLoader } from "#packages/types.js";
1
2
  import { type PGlite } from "@electric-sql/pglite";
2
3
  import { type IDocumentDriveServer } from "document-drive";
3
4
  import { type Express } from "express";
@@ -14,7 +15,17 @@ type Options = {
14
15
  keyPath: string;
15
16
  certPath: string;
16
17
  } | boolean | undefined;
18
+ packageLoader?: IPackageLoader;
17
19
  };
20
+ /**
21
+ * Starts the API server.
22
+ *
23
+ * @param reactor - The document drive server.
24
+ * @param options - Additional options for server configuration. These options intended to be serializable.
25
+ * @param overrides - System overrides. These overrides are intended to be object references.
26
+ *
27
+ * @returns The API server.
28
+ */
18
29
  export declare function startAPI(reactor: IDocumentDriveServer, options: Options): Promise<API>;
19
30
  export {};
20
31
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAOnD,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAM3D,OAAgB,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAMhD,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAGtC,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,KAAK,CAAC,EACF;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,GACD,OAAO,GACP,SAAS,CAAC;CACf,CAAC;AAsKF,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,GAAG,CAAC,CAwDd"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAOnD,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AAGxB,OAAgB,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAMhD,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,KAAK,GAAG,EAAsB,MAAM,YAAY,CAAC;AAK1D,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,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;CAChC,CAAC;AAqJF;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,GAAG,CAAC,CAsEd"}
@@ -1,15 +1,18 @@
1
1
  import { config } from "#config.js";
2
2
  import { GraphQLManager } from "#graphql/graphql-manager.js";
3
3
  import { renderGraphqlPlayground } from "#graphql/playground.js";
4
- import { getUniqueDocumentModels, PackagesManager, } from "#package-manager.js";
4
+ import { ImportPackageLoader } from "#packages/import-loader.js";
5
+ import { getUniqueDocumentModels, PackageManager, } from "#packages/package-manager.js";
5
6
  import { KnexAnalyticsStore, KnexQueryExecutor, } from "@powerhousedao/analytics-engine-knex";
6
7
  import devcert from "devcert";
8
+ import { childLogger, } from "document-drive";
7
9
  import { ProcessorManager } from "document-drive/processors/processor-manager";
8
10
  import express from "express";
9
11
  import fs from "node:fs";
10
12
  import https from "node:https";
11
13
  import path from "node:path";
12
14
  import { getDbClient } from "./utils/db.js";
15
+ const logger = childLogger(["reactor-api", "server"]);
13
16
  const DEFAULT_PORT = 4000;
14
17
  /**
15
18
  * Sets up the Express app with necessary routes
@@ -38,30 +41,15 @@ function initializeDatabaseAndAnalytics(dbPath) {
38
41
  });
39
42
  return { db, analyticsStore };
40
43
  }
41
- /**
42
- * Initializes the package manager and returns the result
43
- */
44
- async function initializePackageManager(options) {
45
- const pkgManager = new PackagesManager(options.configFile
46
- ? {
47
- configFile: options.configFile,
48
- }
49
- : {
50
- packages: options.packages ?? [],
51
- });
52
- const result = (await pkgManager.init());
53
- return { pkgManager, result };
54
- }
55
44
  /**
56
45
  * Sets up the subgraph manager and registers subgraphs
57
46
  */
58
- async function setupGraphQLManager(app, reactor, db, analyticsStore, result) {
47
+ async function setupGraphQLManager(app, reactor, db, analyticsStore, subgraphs) {
59
48
  const graphqlManager = new GraphQLManager(config.basePath, app, reactor, db, analyticsStore);
60
- if (result.subgraphs) {
61
- for (const [supergraph, subgraphs] of result.subgraphs.entries()) {
62
- for (const subgraph of subgraphs) {
63
- await graphqlManager.registerSubgraph(subgraph, supergraph);
64
- }
49
+ await graphqlManager.init();
50
+ for (const [supergraph, collection] of subgraphs.entries()) {
51
+ for (const subgraph of collection) {
52
+ graphqlManager.registerSubgraph(subgraph, "graphql");
65
53
  }
66
54
  }
67
55
  await graphqlManager.init();
@@ -79,16 +67,16 @@ function setupEventListeners(pkgManager, reactor, graphqlManager, processorManag
79
67
  pkgManager.onSubgraphsChange((packagedSubgraphs) => {
80
68
  for (const [supergraph, subgraphs] of packagedSubgraphs) {
81
69
  for (const subgraph of subgraphs) {
82
- graphqlManager.registerSubgraph(subgraph, supergraph);
70
+ graphqlManager.registerSubgraph(subgraph, "graphql");
83
71
  }
84
72
  }
85
73
  graphqlManager.updateRouter();
86
74
  });
87
75
  pkgManager.onProcessorsChange(async (processors) => {
88
- for (const [packageName, fn] of processors) {
76
+ for (const [packageName, fns] of processors) {
89
77
  await processorManager.unregisterFactory(packageName);
90
- const factory = fn(module);
91
- await processorManager.registerFactory(packageName, factory);
78
+ const factories = fns.map((fn) => fn(module));
79
+ await processorManager.registerFactory(packageName, (driveId) => factories.map((factory) => factory(driveId)).flat());
92
80
  }
93
81
  });
94
82
  }
@@ -124,6 +112,15 @@ async function startServer(app, port, httpsOptions) {
124
112
  app.listen(port);
125
113
  }
126
114
  }
115
+ /**
116
+ * Starts the API server.
117
+ *
118
+ * @param reactor - The document drive server.
119
+ * @param options - Additional options for server configuration. These options intended to be serializable.
120
+ * @param overrides - System overrides. These overrides are intended to be object references.
121
+ *
122
+ * @returns The API server.
123
+ */
127
124
  export async function startAPI(reactor, options) {
128
125
  const port = options.port ?? DEFAULT_PORT;
129
126
  const app = options.express ?? express();
@@ -134,25 +131,35 @@ export async function startAPI(reactor, options) {
134
131
  const { db, analyticsStore } = initializeDatabaseAndAnalytics(options.dbPath);
135
132
  const module = { db, analyticsStore };
136
133
  // Initialize package manager
137
- const { pkgManager, result } = await initializePackageManager(options);
138
- const documentModels = result.documentModels ?? [];
134
+ const loaders = [new ImportPackageLoader()];
135
+ if (options.packageLoader) {
136
+ loaders.push(options.packageLoader);
137
+ }
138
+ const packages = new PackageManager(loaders, {
139
+ configFile: options.configFile,
140
+ packages: options.packages ?? [],
141
+ });
142
+ const { documentModels, processors, subgraphs } = await packages.init();
139
143
  // initialize processors
140
144
  const processorManager = new ProcessorManager(reactor.listeners, reactor);
141
- const packageToProcessorFactory = result.processors ?? new Map();
142
- for (const [packageName, fn] of packageToProcessorFactory) {
143
- const factory = fn(module);
144
- processorManager.registerFactory(packageName, factory);
145
+ for (const [packageName, fns] of processors) {
146
+ const factories = fns.map((fn) => fn(module));
147
+ await processorManager.registerFactory(packageName, (driveId) => factories.map((factory) => factory(driveId)).flat());
145
148
  }
146
- // Set document model modules
149
+ // hook up processor manager to drive added event
150
+ reactor.on("driveAdded", async (drive) => {
151
+ await processorManager.registerDrive(drive.state.global.id);
152
+ });
153
+ // set document model modules
147
154
  reactor.setDocumentModelModules(getUniqueDocumentModels([
148
155
  ...reactor.getDocumentModelModules(),
149
156
  ...documentModels,
150
157
  ]));
151
- // Set up subgraph manager
152
- const graphqlManager = await setupGraphQLManager(app, reactor, db, analyticsStore, result);
158
+ // set up subgraph manager
159
+ const graphqlManager = await setupGraphQLManager(app, reactor, db, analyticsStore, subgraphs);
153
160
  // Set up event listeners
154
- setupEventListeners(pkgManager, reactor, graphqlManager, processorManager, module);
161
+ setupEventListeners(packages, reactor, graphqlManager, processorManager, module);
155
162
  // Start the server
156
163
  await startServer(app, port, options.https);
157
- return { app, graphqlManager, processorManager };
164
+ return { app, graphqlManager, processorManager, packages };
158
165
  }
@@ -2,12 +2,16 @@ import { type IAnalyticsStore } from "@powerhousedao/analytics-engine-core";
2
2
  import { type IProcessorManager } from "document-drive/processors/types";
3
3
  import { type Express } from "express";
4
4
  import { type GraphQLManager } from "./graphql/graphql-manager.js";
5
- import { type Db } from "./utils/db.js";
5
+ import { IPackageManager } from "./packages/types.js";
6
+ import { Db } from "./utils/db.js";
7
+ export type { SubgraphClass } from "./graphql/index.js";
8
+ export type { IPackageLoader } from "./packages/types.js";
6
9
  export type { Db } from "./utils/db.js";
7
10
  export type API = {
8
11
  app: Express;
9
12
  graphqlManager: GraphQLManager;
10
13
  processorManager: IProcessorManager;
14
+ packages: IPackageManager;
11
15
  };
12
16
  export type ReactorModule = {
13
17
  analyticsStore: IAnalyticsStore;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,eAAe,CAAC;AACxC,YAAY,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,MAAM,GAAG,GAAG;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;IAC/B,gBAAgB,EAAE,iBAAiB,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,cAAc,EAAE,eAAe,CAAC;IAChC,gBAAgB,EAAE,EAAE,CAAC;CACtB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAEnC,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,MAAM,GAAG,GAAG;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;IAC/B,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,cAAc,EAAE,eAAe,CAAC;IAChC,gBAAgB,EAAE,EAAE,CAAC;CACtB,CAAC"}