@powerhousedao/reactor-api 1.29.13-dev.0 → 1.29.13-dev.1
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/package-manager.d.ts +42 -0
- package/dist/src/package-manager.d.ts.map +1 -0
- package/dist/src/package-manager.js +218 -0
- package/dist/src/server.d.ts +2 -0
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +39 -0
- package/dist/src/subgraphs/analytics/index.d.ts +3 -3
- package/dist/src/subgraphs/analytics/index.d.ts.map +1 -1
- package/dist/src/subgraphs/base/index.d.ts +6 -5
- package/dist/src/subgraphs/base/index.d.ts.map +1 -1
- package/dist/src/subgraphs/base/index.js +1 -0
- package/dist/src/subgraphs/drive/index.js +1 -1
- package/dist/src/subgraphs/manager.d.ts +3 -7
- package/dist/src/subgraphs/manager.d.ts.map +1 -1
- package/dist/src/subgraphs/manager.js +42 -37
- package/dist/src/subgraphs/types.d.ts +7 -5
- package/dist/src/subgraphs/types.d.ts.map +1 -1
- package/dist/src/utils/create-schema.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export declare const installPackages: (packages: string[]) => Promise<void>;
|
|
2
|
+
export declare const readManifest: () => string;
|
|
3
|
+
import { type Subgraph } from "@powerhousedao/reactor-api";
|
|
4
|
+
import { type Listener } from "document-drive/server/types";
|
|
5
|
+
import { type DocumentModelModule } from "document-model";
|
|
6
|
+
interface IPackagesManager {
|
|
7
|
+
onDocumentModelsChange(handler: (documentModels: Record<string, DocumentModelModule[]>) => void): void;
|
|
8
|
+
}
|
|
9
|
+
type IPackagesManagerOptions = {
|
|
10
|
+
packages: string[];
|
|
11
|
+
} | {
|
|
12
|
+
configFile: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function loadDependency(packageName: string, subPath: string): Promise<unknown>;
|
|
15
|
+
export declare function getUniqueDocumentModels(...documentModels: DocumentModelModule[][]): DocumentModelModule[];
|
|
16
|
+
export declare class PackagesManager implements IPackagesManager {
|
|
17
|
+
protected options: IPackagesManagerOptions;
|
|
18
|
+
protected onError?: ((e: unknown) => void) | undefined;
|
|
19
|
+
private docModelsMap;
|
|
20
|
+
private subgraphsMap;
|
|
21
|
+
private listenerMap;
|
|
22
|
+
private configWatcher;
|
|
23
|
+
private eventEmitter;
|
|
24
|
+
constructor(options: IPackagesManagerOptions, onError?: ((e: unknown) => void) | undefined);
|
|
25
|
+
init(): Promise<{
|
|
26
|
+
documentModels: DocumentModelModule[];
|
|
27
|
+
subgraphs: Subgraph[];
|
|
28
|
+
listeners: Listener[];
|
|
29
|
+
} | undefined>;
|
|
30
|
+
private loadPackages;
|
|
31
|
+
private loadFromConfigFile;
|
|
32
|
+
private initConfigFile;
|
|
33
|
+
private updatePackagesMap;
|
|
34
|
+
private updateSubgraphsMap;
|
|
35
|
+
private updateListenersMap;
|
|
36
|
+
private getUniqueListeners;
|
|
37
|
+
onDocumentModelsChange(handler: (documentModels: Record<string, DocumentModelModule[]>) => void): void;
|
|
38
|
+
onSubgraphsChange(handler: (subgraphs: Record<string, Subgraph[]>) => void): void;
|
|
39
|
+
onListenersChange(handler: (listeners: Record<string, Listener[]>) => void): void;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe,GAAU,UAAU,MAAM,EAAE,kBAIvD,CAAC;AAEF,eAAO,MAAM,YAAY,cAGxB,CAAC;AAGF,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAI1D,UAAU,gBAAgB;IACxB,sBAAsB,CACpB,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,KAAK,IAAI,GACvE,IAAI,CAAC;CACT;AAED,KAAK,uBAAuB,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAU/E,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAmDD,wBAAgB,uBAAuB,CACrC,GAAG,cAAc,EAAE,mBAAmB,EAAE,EAAE,GACzC,mBAAmB,EAAE,CAUvB;AAYD,qBAAa,eAAgB,YAAW,gBAAgB;IAYpD,SAAS,CAAC,OAAO,EAAE,uBAAuB;IAC1C,SAAS,CAAC,OAAO,CAAC,GAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI;IAZ1C,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,YAAY,CAIf;gBAGO,OAAO,EAAE,uBAAuB,EAChC,OAAO,CAAC,GAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,aAAA;IAW7B,IAAI;;;;;YAQH,YAAY;YAkBZ,kBAAkB;IAkBhC,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,kBAAkB;IAU1B,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,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,GACvD,IAAI;IAIP,iBAAiB,CACf,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,GACvD,IAAI;CAGR"}
|
|
@@ -0,0 +1,218 @@
|
|
|
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
|
+
import { getConfig } from "@powerhousedao/config";
|
|
12
|
+
import EventEmitter from "node:events";
|
|
13
|
+
import { watchFile } from "node:fs";
|
|
14
|
+
export async function loadDependency(packageName, subPath) {
|
|
15
|
+
try {
|
|
16
|
+
// First try to import the package directly
|
|
17
|
+
const module = (await import(packageName));
|
|
18
|
+
// If subPath exists in the module, return it
|
|
19
|
+
if (subPath in module) {
|
|
20
|
+
return module[subPath];
|
|
21
|
+
}
|
|
22
|
+
// If not, try importing with the subpath
|
|
23
|
+
const fullPath = `${packageName}/${subPath}`;
|
|
24
|
+
return await import(fullPath);
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
console.error("Error loading dependency", packageName, subPath, e);
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function loadPackagesDocumentModels(packages) {
|
|
32
|
+
const loadedPackages = new Map();
|
|
33
|
+
for (const pkg of packages) {
|
|
34
|
+
try {
|
|
35
|
+
console.log("> Loading package:", pkg);
|
|
36
|
+
const pkgModule = (await loadDependency(pkg, "document-models"));
|
|
37
|
+
if (pkgModule) {
|
|
38
|
+
console.log(` ➜ Loaded Document Models from: ${pkg}`);
|
|
39
|
+
loadedPackages.set(pkg, Object.values(pkgModule));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.warn(` ➜ No Document Models found: ${pkg}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
console.error("Error loading Document Models from", pkg, e);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return loadedPackages;
|
|
50
|
+
}
|
|
51
|
+
async function loadPackagesSubgraphs(packages) {
|
|
52
|
+
const loadedPackages = new Map();
|
|
53
|
+
for (const pkg of packages) {
|
|
54
|
+
const pkgModule = (await loadDependency(pkg, "subgraphs"));
|
|
55
|
+
if (pkgModule) {
|
|
56
|
+
console.log(` ➜ Loaded Subgraphs from: ${pkg}`);
|
|
57
|
+
loadedPackages.set(pkg.replaceAll("@", ""), pkgModule);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.warn(` ➜ No Subgraphs found: ${pkg}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return loadedPackages;
|
|
64
|
+
}
|
|
65
|
+
async function loadPackagesListeners(packages) {
|
|
66
|
+
const loadedPackages = new Map();
|
|
67
|
+
for (const pkg of packages) {
|
|
68
|
+
const pkgModule = (await loadDependency(pkg, "processors"));
|
|
69
|
+
if (pkgModule) {
|
|
70
|
+
console.log(` ➜ Loaded Listeners from: ${pkg}`);
|
|
71
|
+
loadedPackages.set(pkg, pkgModule);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.warn(` ➜ No Listeners found: ${pkg}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return loadedPackages;
|
|
78
|
+
}
|
|
79
|
+
export function getUniqueDocumentModels(...documentModels) {
|
|
80
|
+
const uniqueModels = new Map();
|
|
81
|
+
for (const models of documentModels) {
|
|
82
|
+
for (const model of models) {
|
|
83
|
+
uniqueModels.set(model.documentModel.id, model);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return Array.from(uniqueModels.values());
|
|
87
|
+
}
|
|
88
|
+
function getUniqueSubgraphs(subgraphs) {
|
|
89
|
+
const uniqueSubgraphs = new Map();
|
|
90
|
+
for (const subgraphss of subgraphs) {
|
|
91
|
+
for (const subgraph of subgraphss) {
|
|
92
|
+
uniqueSubgraphs.set(subgraph.name, subgraph);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return Array.from(uniqueSubgraphs.values());
|
|
96
|
+
}
|
|
97
|
+
export class PackagesManager {
|
|
98
|
+
options;
|
|
99
|
+
onError;
|
|
100
|
+
docModelsMap = new Map();
|
|
101
|
+
subgraphsMap = new Map();
|
|
102
|
+
listenerMap = new Map();
|
|
103
|
+
configWatcher;
|
|
104
|
+
eventEmitter = new EventEmitter();
|
|
105
|
+
constructor(options, onError) {
|
|
106
|
+
this.options = options;
|
|
107
|
+
this.onError = onError;
|
|
108
|
+
this.eventEmitter.setMaxListeners(0);
|
|
109
|
+
if ("packages" in options) {
|
|
110
|
+
void this.loadPackages(options.packages).catch(onError);
|
|
111
|
+
}
|
|
112
|
+
else if ("configFile" in options) {
|
|
113
|
+
void this.initConfigFile(options.configFile).catch(onError);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async init() {
|
|
117
|
+
if ("packages" in this.options) {
|
|
118
|
+
return await this.loadPackages(this.options.packages);
|
|
119
|
+
}
|
|
120
|
+
else if ("configFile" in this.options) {
|
|
121
|
+
return await this.initConfigFile(this.options.configFile);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async loadPackages(packages) {
|
|
125
|
+
// install packages
|
|
126
|
+
const packagesMap = await loadPackagesDocumentModels(packages);
|
|
127
|
+
const subgraphsMap = await loadPackagesSubgraphs(packages);
|
|
128
|
+
const listenersMap = await loadPackagesListeners(packages);
|
|
129
|
+
this.updatePackagesMap(packagesMap);
|
|
130
|
+
this.updateSubgraphsMap(subgraphsMap);
|
|
131
|
+
this.updateListenersMap(listenersMap);
|
|
132
|
+
return {
|
|
133
|
+
documentModels: getUniqueDocumentModels(...Array.from(packagesMap.values())),
|
|
134
|
+
subgraphs: getUniqueSubgraphs(Array.from(subgraphsMap.values())),
|
|
135
|
+
listeners: this.getUniqueListeners(Array.from(listenersMap.values())),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
async loadFromConfigFile(configFile) {
|
|
139
|
+
try {
|
|
140
|
+
const loadedConfig = getConfig(configFile);
|
|
141
|
+
if (!loadedConfig) {
|
|
142
|
+
throw new Error(`Failed to load config from ${configFile}`);
|
|
143
|
+
}
|
|
144
|
+
const packageNames = loadedConfig.packages?.map((pkg) => pkg.packageName) ?? [];
|
|
145
|
+
return await this.loadPackages(packageNames);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
149
|
+
if (this.onError) {
|
|
150
|
+
this.onError(err);
|
|
151
|
+
}
|
|
152
|
+
return Promise.reject(err);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
initConfigFile(configFile) {
|
|
156
|
+
const result = this.loadFromConfigFile(configFile);
|
|
157
|
+
if (!this.configWatcher) {
|
|
158
|
+
this.configWatcher = watchFile(configFile, { interval: 100 }, (curr, prev) => {
|
|
159
|
+
if (curr.mtime === prev.mtime) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
void this.loadFromConfigFile(configFile).catch(this.onError);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
updatePackagesMap(packagesMap) {
|
|
168
|
+
const oldPackages = Array.from(this.docModelsMap.keys());
|
|
169
|
+
const newPackages = Array.from(packagesMap.keys());
|
|
170
|
+
oldPackages
|
|
171
|
+
.filter((pkg) => !newPackages.includes(pkg))
|
|
172
|
+
.forEach((pkg) => {
|
|
173
|
+
console.log("> Removed package:", pkg);
|
|
174
|
+
});
|
|
175
|
+
this.docModelsMap = packagesMap;
|
|
176
|
+
this.eventEmitter.emit("documentModelsChange", Object.fromEntries(packagesMap));
|
|
177
|
+
}
|
|
178
|
+
updateSubgraphsMap(subgraphsMap) {
|
|
179
|
+
const oldPackages = Array.from(this.subgraphsMap.keys());
|
|
180
|
+
const newPackages = Array.from(subgraphsMap.keys());
|
|
181
|
+
oldPackages
|
|
182
|
+
.filter((pkg) => !newPackages.includes(pkg))
|
|
183
|
+
.forEach((pkg) => {
|
|
184
|
+
console.log("> Removed Subgraphs from:", pkg);
|
|
185
|
+
});
|
|
186
|
+
this.subgraphsMap = subgraphsMap;
|
|
187
|
+
this.eventEmitter.emit("subgraphsChange", Object.fromEntries(subgraphsMap));
|
|
188
|
+
}
|
|
189
|
+
updateListenersMap(listenersMap) {
|
|
190
|
+
const oldPackages = Array.from(this.listenerMap.keys());
|
|
191
|
+
const newPackages = Array.from(listenersMap.keys());
|
|
192
|
+
oldPackages
|
|
193
|
+
.filter((pkg) => !newPackages.includes(pkg))
|
|
194
|
+
.forEach((pkg) => {
|
|
195
|
+
console.log("> Removed Listeners from:", pkg);
|
|
196
|
+
});
|
|
197
|
+
this.listenerMap = listenersMap;
|
|
198
|
+
this.eventEmitter.emit("listenersChange", Object.fromEntries(listenersMap));
|
|
199
|
+
}
|
|
200
|
+
getUniqueListeners(listeners) {
|
|
201
|
+
const uniqueListeners = new Map();
|
|
202
|
+
for (const packageListeners of listeners) {
|
|
203
|
+
for (const listener of packageListeners) {
|
|
204
|
+
uniqueListeners.set(listener.listenerId, listener);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return Array.from(uniqueListeners.values());
|
|
208
|
+
}
|
|
209
|
+
onDocumentModelsChange(handler) {
|
|
210
|
+
this.eventEmitter.on("documentModelsChange", handler);
|
|
211
|
+
}
|
|
212
|
+
onSubgraphsChange(handler) {
|
|
213
|
+
this.eventEmitter.on("subgraphsChange", handler);
|
|
214
|
+
}
|
|
215
|
+
onListenersChange(handler) {
|
|
216
|
+
this.eventEmitter.on("listenersChange", handler);
|
|
217
|
+
}
|
|
218
|
+
}
|
package/dist/src/server.d.ts
CHANGED
package/dist/src/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAOnD,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAgB,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAKhD,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;AAIF,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,GAAG,CAAC,CAuGd"}
|
package/dist/src/server.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getUniqueDocumentModels, PackagesManager } from "#package-manager.js";
|
|
1
2
|
import { SubgraphManager } from "#subgraphs/manager.js";
|
|
2
3
|
import { KnexAnalyticsStore, KnexQueryExecutor, } from "@powerhousedao/analytics-engine-knex";
|
|
3
4
|
import devcert from "devcert";
|
|
@@ -15,8 +16,46 @@ export async function startAPI(reactor, options) {
|
|
|
15
16
|
executor: new KnexQueryExecutor(),
|
|
16
17
|
knex: db,
|
|
17
18
|
});
|
|
19
|
+
const pkgManager = new PackagesManager(options.configFile
|
|
20
|
+
? {
|
|
21
|
+
configFile: options.configFile,
|
|
22
|
+
}
|
|
23
|
+
: {
|
|
24
|
+
packages: options.packages ?? [],
|
|
25
|
+
});
|
|
26
|
+
const result = await pkgManager.init();
|
|
27
|
+
const documentModels = result?.documentModels ?? [];
|
|
28
|
+
reactor.setDocumentModelModules(getUniqueDocumentModels([
|
|
29
|
+
...reactor.getDocumentModelModules(),
|
|
30
|
+
...documentModels,
|
|
31
|
+
]));
|
|
18
32
|
const subgraphManager = new SubgraphManager("/", app, reactor, db, analyticsStore);
|
|
19
33
|
await subgraphManager.init();
|
|
34
|
+
pkgManager.onDocumentModelsChange((documentModels) => {
|
|
35
|
+
const uniqueModels = getUniqueDocumentModels(Object.values(documentModels).flat());
|
|
36
|
+
reactor.setDocumentModelModules(uniqueModels);
|
|
37
|
+
subgraphManager.updateRouter();
|
|
38
|
+
});
|
|
39
|
+
pkgManager.onSubgraphsChange((packagedSubgraphs) => {
|
|
40
|
+
for (const [supergraph, subgraphs] of Object.entries(packagedSubgraphs)) {
|
|
41
|
+
subgraphManager.setSupergraph(supergraph, subgraphs);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
pkgManager.onListenersChange((listeners) => {
|
|
45
|
+
Object.entries(listeners).forEach(([packageName, packageListeners]) => {
|
|
46
|
+
packageListeners.forEach((listener) => {
|
|
47
|
+
if (!listener.driveId) {
|
|
48
|
+
console.warn(`Skipping listener ${listener.listenerId} from package ${packageName} - missing driveId`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
reactor.listeners
|
|
52
|
+
.setListener(listener.driveId, listener)
|
|
53
|
+
.catch((error) => {
|
|
54
|
+
console.error(`Failed to set listener ${listener.listenerId} for drive ${listener.driveId}:`, error);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
20
59
|
if (options.https) {
|
|
21
60
|
const currentDir = process.cwd();
|
|
22
61
|
let server;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { GraphQLResolverMap } from "@apollo/subgraph/dist/schema-helper/resolverMap.js";
|
|
2
|
-
import { IAnalyticsStore } from "@powerhousedao/analytics-engine-core";
|
|
1
|
+
import { type GraphQLResolverMap } from "@apollo/subgraph/dist/schema-helper/resolverMap.js";
|
|
2
|
+
import { type IAnalyticsStore } from "@powerhousedao/analytics-engine-core";
|
|
3
3
|
import { AnalyticsModel } from "@powerhousedao/analytics-engine-graphql";
|
|
4
4
|
import { Subgraph } from "../base/index.js";
|
|
5
|
-
import { Context, SubgraphArgs } from "../index.js";
|
|
5
|
+
import { type Context, type SubgraphArgs } from "../index.js";
|
|
6
6
|
export declare class AnalyticsSubgraph extends Subgraph {
|
|
7
7
|
#private;
|
|
8
8
|
analyticsStore: IAnalyticsStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/subgraphs/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/subgraphs/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AAC7F,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,cAAc,EAGf,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,qBAAa,iBAAkB,SAAQ,QAAQ;;IAC7C,cAAc,EAAE,eAAe,CAAC;IAChC,cAAc,EAAE,cAAc,CAAC;IAE/B,IAAI,SAAe;IACnB,QAAQ,iCAEN;IAEF,SAAS,EAAyB,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBAElD,IAAI,EAAE,YAAY;IAiBxB,OAAO;CA4Ed"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { SubgraphManager } from "#subgraphs/manager.js";
|
|
2
|
-
import { ISubgraph, SubgraphArgs } from "#subgraphs/types.js";
|
|
3
|
-
import { Db } from "#types.js";
|
|
4
|
-
import { IDocumentDriveServer } from "document-drive";
|
|
5
|
-
import { DocumentNode } from "graphql";
|
|
1
|
+
import { type SubgraphManager } from "#subgraphs/manager.js";
|
|
2
|
+
import { type ISubgraph, type SubgraphArgs } from "#subgraphs/types.js";
|
|
3
|
+
import { type Db } from "#types.js";
|
|
4
|
+
import { type IDocumentDriveServer } from "document-drive";
|
|
5
|
+
import { type DocumentNode } from "graphql";
|
|
6
6
|
export declare class Subgraph implements ISubgraph {
|
|
7
7
|
name: string;
|
|
8
|
+
path: string;
|
|
8
9
|
resolvers: Record<string, any>;
|
|
9
10
|
typeDefs: DocumentNode;
|
|
10
11
|
reactor: IDocumentDriveServer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/subgraphs/base/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/subgraphs/base/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,qBAAa,QAAS,YAAW,SAAS;IACxC,IAAI,SAAa;IACjB,IAAI,SAAM;IACV,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAI5B;IACF,QAAQ,EAAE,YAAY,CAIpB;IACF,OAAO,EAAE,oBAAoB,CAAC;IAC9B,eAAe,EAAE,eAAe,CAAC;IACjC,gBAAgB,EAAE,EAAE,CAAC;gBACT,IAAI,EAAE,YAAY;IAKxB,OAAO;CAGd"}
|
|
@@ -2,7 +2,7 @@ import { type Db } from "#types.js";
|
|
|
2
2
|
import { type IAnalyticsStore } from "@powerhousedao/analytics-engine-core";
|
|
3
3
|
import { type IDocumentDriveServer } from "document-drive";
|
|
4
4
|
import type express from "express";
|
|
5
|
-
import { type SubgraphClass } from "./index.js";
|
|
5
|
+
import { type Subgraph, type SubgraphClass } from "./index.js";
|
|
6
6
|
export declare class SubgraphManager {
|
|
7
7
|
#private;
|
|
8
8
|
private readonly path;
|
|
@@ -15,14 +15,10 @@ export declare class SubgraphManager {
|
|
|
15
15
|
private subgraphs;
|
|
16
16
|
constructor(path: string, app: express.Express, reactor: IDocumentDriveServer, operationalStore: Db, analyticsStore: IAnalyticsStore);
|
|
17
17
|
init(): Promise<void>;
|
|
18
|
+
registerSubgraph(subgraph: SubgraphClass, supergraph?: string, path?: string): Promise<void>;
|
|
18
19
|
updateRouter(): Promise<void>;
|
|
19
|
-
private createApolloServer;
|
|
20
|
-
private waitForServer;
|
|
21
|
-
private setupSubgraphs;
|
|
22
|
-
private createApolloGateway;
|
|
23
|
-
private setupApolloExpressMiddleware;
|
|
24
|
-
registerSubgraph(subgraph: SubgraphClass, supergraph?: string): Promise<void>;
|
|
25
20
|
getAdditionalContextFields: () => Record<string, any>;
|
|
26
21
|
setAdditionalContextFields(fields: Record<string, any>): void;
|
|
22
|
+
setSupergraph(supergraph: string, subgraphs: Subgraph[]): void;
|
|
27
23
|
}
|
|
28
24
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/subgraphs/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,WAAW,CAAC;AAOpC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAG5E,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAMnC,OAAO,
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/subgraphs/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,WAAW,CAAC;AAOpC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAG5E,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAMnC,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAG/D,qBAAa,eAAe;;IAMxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc;IATjC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,SAAS,CAAkC;gBAGhC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,OAAO,CAAC,OAAO,EACpB,OAAO,EAAE,oBAAoB,EAC7B,gBAAgB,EAAE,EAAE,EACpB,cAAc,EAAE,eAAe;IAS5C,IAAI;IAmBJ,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,SAAK,EAAE,IAAI,SAAK;IAsBpE,YAAY;IAQlB,0BAA0B,4BAExB;IAEF,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAItD,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE;CA0HxD"}
|
|
@@ -44,14 +44,43 @@ export class SubgraphManager {
|
|
|
44
44
|
});
|
|
45
45
|
this.app.use(this.path, (req, res, next) => this.reactorRouter(req, res, next));
|
|
46
46
|
}
|
|
47
|
+
async registerSubgraph(subgraph, supergraph = "", path = "") {
|
|
48
|
+
const subgraphInstance = new subgraph({
|
|
49
|
+
operationalStore: this.operationalStore,
|
|
50
|
+
analyticsStore: this.analyticsStore,
|
|
51
|
+
reactor: this.reactor,
|
|
52
|
+
subgraphManager: this,
|
|
53
|
+
path,
|
|
54
|
+
});
|
|
55
|
+
await subgraphInstance.onSetup();
|
|
56
|
+
if (!this.subgraphs[supergraph]) {
|
|
57
|
+
if (supergraph !== "") {
|
|
58
|
+
console.log(`> Created /${supergraph} supergraph `);
|
|
59
|
+
}
|
|
60
|
+
this.subgraphs[supergraph] = [];
|
|
61
|
+
}
|
|
62
|
+
this.subgraphs[supergraph].push(subgraphInstance);
|
|
63
|
+
console.log(`> Registered ${supergraph ? "/" + supergraph : ""}${this.path.endsWith("/") ? this.path : this.path + "/"}${subgraphInstance.name} subgraph.`);
|
|
64
|
+
await this.updateRouter();
|
|
65
|
+
}
|
|
47
66
|
async updateRouter() {
|
|
48
67
|
const newRouter = Router();
|
|
49
68
|
newRouter.use(cors());
|
|
50
69
|
newRouter.use(bodyParser.json());
|
|
51
|
-
await this
|
|
70
|
+
await this.#setupSubgraphs(newRouter);
|
|
52
71
|
this.reactorRouter = newRouter;
|
|
53
72
|
}
|
|
54
|
-
|
|
73
|
+
getAdditionalContextFields = () => {
|
|
74
|
+
return this.contextFields;
|
|
75
|
+
};
|
|
76
|
+
setAdditionalContextFields(fields) {
|
|
77
|
+
this.contextFields = { ...this.contextFields, ...fields };
|
|
78
|
+
}
|
|
79
|
+
setSupergraph(supergraph, subgraphs) {
|
|
80
|
+
this.subgraphs[supergraph] = subgraphs;
|
|
81
|
+
this.updateRouter();
|
|
82
|
+
}
|
|
83
|
+
#createApolloServer(schema) {
|
|
55
84
|
return new ApolloServer({
|
|
56
85
|
schema,
|
|
57
86
|
introspection: true,
|
|
@@ -61,18 +90,18 @@ export class SubgraphManager {
|
|
|
61
90
|
],
|
|
62
91
|
});
|
|
63
92
|
}
|
|
64
|
-
async waitForServer(server) {
|
|
93
|
+
async #waitForServer(server) {
|
|
65
94
|
return new Promise((resolve) => {
|
|
66
95
|
try {
|
|
67
96
|
server.assertStarted("waitForServer");
|
|
68
97
|
resolve(true);
|
|
69
98
|
}
|
|
70
99
|
catch (e) {
|
|
71
|
-
setTimeout(() => this
|
|
100
|
+
setTimeout(() => this.#waitForServer(server), 100);
|
|
72
101
|
}
|
|
73
102
|
});
|
|
74
103
|
}
|
|
75
|
-
async setupSubgraphs(router) {
|
|
104
|
+
async #setupSubgraphs(router) {
|
|
76
105
|
for (const supergraph of Object.keys(this.subgraphs)) {
|
|
77
106
|
const supergraphEndpoints = {};
|
|
78
107
|
for (const subgraph of this.subgraphs[supergraph]) {
|
|
@@ -82,26 +111,26 @@ export class SubgraphManager {
|
|
|
82
111
|
// create subgraph schema
|
|
83
112
|
const schema = createSchema(this.reactor, subgraphConfig.resolvers, subgraphConfig.typeDefs);
|
|
84
113
|
// create and start apollo server
|
|
85
|
-
const server = this
|
|
86
|
-
const path =
|
|
114
|
+
const server = this.#createApolloServer(schema);
|
|
115
|
+
const path = `${subgraph.path ? "/" + subgraph.path : ""}/${subgraphConfig.name}`;
|
|
87
116
|
await server.start();
|
|
88
|
-
await this
|
|
89
|
-
this
|
|
117
|
+
await this.#waitForServer(server);
|
|
118
|
+
this.#setupApolloExpressMiddleware(server, router, path);
|
|
90
119
|
if (supergraph !== "") {
|
|
91
120
|
supergraphEndpoints[path] = server;
|
|
92
121
|
}
|
|
93
122
|
}
|
|
94
123
|
if (Object.keys(supergraphEndpoints).length > 0) {
|
|
95
|
-
const supergraphServer = await this
|
|
124
|
+
const supergraphServer = await this.#createApolloGateway(supergraphEndpoints);
|
|
96
125
|
if (supergraphServer) {
|
|
97
126
|
const path = `/${supergraph}`;
|
|
98
|
-
this
|
|
127
|
+
this.#setupApolloExpressMiddleware(supergraphServer, router, path);
|
|
99
128
|
console.log(`> Updated Apollo Gateway at ${path}`);
|
|
100
129
|
}
|
|
101
130
|
}
|
|
102
131
|
}
|
|
103
132
|
}
|
|
104
|
-
async createApolloGateway(endpoints) {
|
|
133
|
+
async #createApolloGateway(endpoints) {
|
|
105
134
|
try {
|
|
106
135
|
const gateway = new ApolloGateway({
|
|
107
136
|
supergraphSdl: new IntrospectAndCompose({
|
|
@@ -130,7 +159,7 @@ export class SubgraphManager {
|
|
|
130
159
|
}
|
|
131
160
|
}
|
|
132
161
|
}
|
|
133
|
-
setupApolloExpressMiddleware(server, router, path) {
|
|
162
|
+
#setupApolloExpressMiddleware(server, router, path) {
|
|
134
163
|
router.use(path,
|
|
135
164
|
// @ts-expect-error todo check type defs
|
|
136
165
|
expressMiddleware(server, {
|
|
@@ -144,24 +173,6 @@ export class SubgraphManager {
|
|
|
144
173
|
}));
|
|
145
174
|
this.reactorRouter = router;
|
|
146
175
|
}
|
|
147
|
-
async registerSubgraph(subgraph, supergraph = "") {
|
|
148
|
-
const subgraphInstance = new subgraph({
|
|
149
|
-
operationalStore: this.operationalStore,
|
|
150
|
-
analyticsStore: this.analyticsStore,
|
|
151
|
-
reactor: this.reactor,
|
|
152
|
-
subgraphManager: this,
|
|
153
|
-
});
|
|
154
|
-
await subgraphInstance.onSetup();
|
|
155
|
-
if (!this.subgraphs[supergraph]) {
|
|
156
|
-
if (supergraph !== "") {
|
|
157
|
-
console.log(`> Created /${supergraph} supergraph `);
|
|
158
|
-
}
|
|
159
|
-
this.subgraphs[supergraph] = [];
|
|
160
|
-
}
|
|
161
|
-
this.subgraphs[supergraph].push(subgraphInstance);
|
|
162
|
-
console.log(`> Registered ${this.path.endsWith("/") ? this.path : this.path + "/"}${subgraphInstance.name} subgraph.`);
|
|
163
|
-
await this.updateRouter();
|
|
164
|
-
}
|
|
165
176
|
#getLocalSubgraphConfig(subgraphName) {
|
|
166
177
|
let entry;
|
|
167
178
|
for (const supergraph of Object.keys(this.subgraphs)) {
|
|
@@ -171,10 +182,4 @@ export class SubgraphManager {
|
|
|
171
182
|
}
|
|
172
183
|
return entry;
|
|
173
184
|
}
|
|
174
|
-
getAdditionalContextFields = () => {
|
|
175
|
-
return this.contextFields;
|
|
176
|
-
};
|
|
177
|
-
setAdditionalContextFields(fields) {
|
|
178
|
-
this.contextFields = { ...this.contextFields, ...fields };
|
|
179
|
-
}
|
|
180
185
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Db } from "#types.js";
|
|
2
|
-
import { IAnalyticsStore } from "@powerhousedao/analytics-engine-core";
|
|
3
|
-
import { IDocumentDriveServer } from "document-drive";
|
|
4
|
-
import { DocumentNode } from "graphql";
|
|
1
|
+
import { type Db } from "#types.js";
|
|
2
|
+
import { type IAnalyticsStore } from "@powerhousedao/analytics-engine-core";
|
|
3
|
+
import { type IDocumentDriveServer } from "document-drive";
|
|
4
|
+
import { type DocumentNode } from "graphql";
|
|
5
5
|
import type { IncomingHttpHeaders } from "http";
|
|
6
|
-
import { SubgraphManager } from "./manager.js";
|
|
6
|
+
import { type SubgraphManager } from "./manager.js";
|
|
7
7
|
export type Context = {
|
|
8
8
|
driveServer: IDocumentDriveServer;
|
|
9
9
|
driveId?: string;
|
|
@@ -12,6 +12,7 @@ export type Context = {
|
|
|
12
12
|
};
|
|
13
13
|
export type ISubgraph = {
|
|
14
14
|
name: string;
|
|
15
|
+
path?: string;
|
|
15
16
|
resolvers: Record<string, any>;
|
|
16
17
|
typeDefs: DocumentNode;
|
|
17
18
|
reactor: IDocumentDriveServer;
|
|
@@ -23,5 +24,6 @@ export type SubgraphArgs = {
|
|
|
23
24
|
operationalStore: Db;
|
|
24
25
|
analyticsStore: IAnalyticsStore;
|
|
25
26
|
subgraphManager: SubgraphManager;
|
|
27
|
+
path?: string;
|
|
26
28
|
};
|
|
27
29
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/subgraphs/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/subgraphs/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,MAAM,OAAO,GAAG;IACpB,WAAW,EAAE,oBAAoB,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,EAAE,EAAE,OAAO,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,gBAAgB,EAAE,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,gBAAgB,EAAE,EAAE,CAAC;IACrB,cAAc,EAAE,eAAe,CAAC;IAChC,eAAe,EAAE,eAAe,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-schema.d.ts","sourceRoot":"","sources":["../../../src/utils/create-schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-schema.d.ts","sourceRoot":"","sources":["../../../src/utils/create-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AAG7F,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,eAAO,MAAM,YAAY,GACvB,qBAAqB,oBAAoB,EACzC,WAAW,kBAAkB,CAAC,OAAO,CAAC,EACtC,UAAU,YAAY,oCAavB,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,qBAAqB,oBAAoB,EACzC,UAAU,YAAY,iBA2IvB,CAAC"}
|