@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.
@@ -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
+ }
@@ -8,6 +8,8 @@ type Options = {
8
8
  port?: number;
9
9
  dbPath: string | undefined;
10
10
  client?: PGlite | typeof Pool | undefined;
11
+ configFile?: string;
12
+ packages?: string[];
11
13
  https?: {
12
14
  keyPath: string;
13
15
  certPath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AACA,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,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,CAgDd"}
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"}
@@ -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;AACxF,OAAO,EAEL,eAAe,EAChB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,cAAc,EAGf,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEpD,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
+ {"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;AACxD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,qBAAa,QAAS,YAAW,SAAS;IACxC,IAAI,SAAa;IACjB,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"}
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"}
@@ -1,6 +1,7 @@
1
1
  import { gql } from "graphql-tag";
2
2
  export class Subgraph {
3
3
  name = "example";
4
+ path = "";
4
5
  resolvers = {
5
6
  Query: {
6
7
  hello: () => this.name,
@@ -22,7 +22,7 @@ export class DriveSubgraph extends Subgraph {
22
22
  preferredEditor: String
23
23
  }
24
24
 
25
- extend type DocumentDrive_DocumentDriveState {
25
+ extend type DocumentDriveState {
26
26
  meta: DriveMeta
27
27
  }
28
28
 
@@ -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,EAAiB,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,YAAY;IAQlB,OAAO,CAAC,kBAAkB;YAWZ,aAAa;YAWb,cAAc;YAmCd,mBAAmB;IA8BjC,OAAO,CAAC,4BAA4B;IAsB9B,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,SAAK;IA8B/D,0BAA0B,4BAExB;IAEF,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAGvD"}
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.setupSubgraphs(newRouter);
70
+ await this.#setupSubgraphs(newRouter);
52
71
  this.reactorRouter = newRouter;
53
72
  }
54
- createApolloServer(schema) {
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.waitForServer(server), 100);
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.createApolloServer(schema);
86
- const path = `/${subgraphConfig.name}`;
114
+ const server = this.#createApolloServer(schema);
115
+ const path = `${subgraph.path ? "/" + subgraph.path : ""}/${subgraphConfig.name}`;
87
116
  await server.start();
88
- await this.waitForServer(server);
89
- this.setupApolloExpressMiddleware(server, router, path);
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.createApolloGateway(supergraphEndpoints);
124
+ const supergraphServer = await this.#createApolloGateway(supergraphEndpoints);
96
125
  if (supergraphServer) {
97
126
  const path = `/${supergraph}`;
98
- this.setupApolloExpressMiddleware(supergraphServer, router, path);
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;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,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,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;CAClC,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":"AACA,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"}
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"}