@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.
- package/dist/src/graphql/drive/index.d.ts.map +1 -1
- package/dist/src/graphql/drive/index.js +4 -1
- package/dist/src/packages/import-loader.d.ts +14 -0
- package/dist/src/packages/import-loader.d.ts.map +1 -0
- package/dist/src/packages/import-loader.js +53 -0
- package/dist/src/packages/package-manager.d.ts +28 -0
- package/dist/src/packages/package-manager.d.ts.map +1 -0
- package/dist/src/packages/package-manager.js +135 -0
- package/dist/src/packages/types.d.ts +27 -0
- package/dist/src/packages/types.d.ts.map +1 -0
- package/dist/src/packages/types.js +1 -0
- package/dist/src/packages/util.d.ts +4 -0
- package/dist/src/packages/util.d.ts.map +1 -0
- package/dist/src/packages/util.js +21 -0
- package/dist/src/server.d.ts +11 -0
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +43 -36
- package/dist/src/types.d.ts +5 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/dist/src/package-manager.d.ts +0 -42
- package/dist/src/package-manager.d.ts.map +0 -1
- package/dist/src/package-manager.js +0 -197
|
@@ -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;
|
|
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:
|
|
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 @@
|
|
|
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
|
+
}
|
package/dist/src/server.d.ts
CHANGED
|
@@ -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
|
package/dist/src/server.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/src/server.js
CHANGED
|
@@ -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 {
|
|
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,
|
|
47
|
+
async function setupGraphQLManager(app, reactor, db, analyticsStore, subgraphs) {
|
|
59
48
|
const graphqlManager = new GraphQLManager(config.basePath, app, reactor, db, analyticsStore);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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,
|
|
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,
|
|
76
|
+
for (const [packageName, fns] of processors) {
|
|
89
77
|
await processorManager.unregisterFactory(packageName);
|
|
90
|
-
const
|
|
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
|
|
138
|
-
|
|
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
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
152
|
-
const graphqlManager = await setupGraphQLManager(app, reactor, db, analyticsStore,
|
|
158
|
+
// set up subgraph manager
|
|
159
|
+
const graphqlManager = await setupGraphQLManager(app, reactor, db, analyticsStore, subgraphs);
|
|
153
160
|
// Set up event listeners
|
|
154
|
-
setupEventListeners(
|
|
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
|
}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -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 {
|
|
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;
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|