@powerhousedao/switchboard 2.2.122-dev.0

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.
Files changed (39) hide show
  1. package/.dockerignore +5 -0
  2. package/CHANGELOG.md +346 -0
  3. package/Dockerfile +50 -0
  4. package/LICENSE +661 -0
  5. package/dist/src/clients/redis.d.ts +5 -0
  6. package/dist/src/clients/redis.d.ts.map +1 -0
  7. package/dist/src/clients/redis.js +41 -0
  8. package/dist/src/clients/redis.js.map +1 -0
  9. package/dist/src/index.d.ts +3 -0
  10. package/dist/src/index.d.ts.map +1 -0
  11. package/dist/src/index.js +84 -0
  12. package/dist/src/index.js.map +1 -0
  13. package/dist/src/install-packages.d.ts +2 -0
  14. package/dist/src/install-packages.d.ts.map +1 -0
  15. package/dist/src/install-packages.js +9 -0
  16. package/dist/src/install-packages.js.map +1 -0
  17. package/dist/src/profiler.d.ts +4 -0
  18. package/dist/src/profiler.d.ts.map +1 -0
  19. package/dist/src/profiler.js +17 -0
  20. package/dist/src/profiler.js.map +1 -0
  21. package/dist/src/utils/gen-doc-model-type-defs.d.ts +3 -0
  22. package/dist/src/utils/gen-doc-model-type-defs.d.ts.map +1 -0
  23. package/dist/src/utils/gen-doc-model-type-defs.js +55 -0
  24. package/dist/src/utils/gen-doc-model-type-defs.js.map +1 -0
  25. package/dist/src/utils/package-manager.d.ts +33 -0
  26. package/dist/src/utils/package-manager.d.ts.map +1 -0
  27. package/dist/src/utils/package-manager.js +145 -0
  28. package/dist/src/utils/package-manager.js.map +1 -0
  29. package/package.json +48 -0
  30. package/powerhouse.config.json +16 -0
  31. package/prisma/schema.prisma +94 -0
  32. package/scripts/install-packages.sh +14 -0
  33. package/src/clients/redis.ts +51 -0
  34. package/src/index.ts +99 -0
  35. package/src/install-packages.ts +8 -0
  36. package/src/profiler.ts +25 -0
  37. package/src/utils/gen-doc-model-type-defs.ts +65 -0
  38. package/src/utils/package-manager.ts +204 -0
  39. package/tsconfig.json +8 -0
@@ -0,0 +1,41 @@
1
+ import { createClient } from "redis";
2
+ export let redisClient;
3
+ export const initRedis = async () => {
4
+ if (!redisClient) {
5
+ const url = process.env.REDIS_TLS_URL ?? process.env.REDIS_URL;
6
+ if (!url) {
7
+ throw new Error("REDIS_TLS_URL is not set");
8
+ }
9
+ const socket = url.includes("rediss")
10
+ ? {
11
+ tls: true,
12
+ rejectUnauthorized: false,
13
+ }
14
+ : undefined;
15
+ redisClient = createClient({
16
+ url,
17
+ socket,
18
+ });
19
+ redisClient.on("error", (err) => {
20
+ console.log("Redis Client Error", err);
21
+ throw new Error("Redis Client Error");
22
+ });
23
+ redisClient.connect();
24
+ }
25
+ return redisClient;
26
+ };
27
+ const timer = setInterval(async () => {
28
+ try {
29
+ if (redisClient) {
30
+ await redisClient.ping();
31
+ }
32
+ }
33
+ catch (err) {
34
+ console.error("Ping Interval Error", err);
35
+ }
36
+ }, 1000 * 60 * 4);
37
+ export const closeRedis = () => {
38
+ clearInterval(timer);
39
+ redisClient.disconnect();
40
+ };
41
+ //# sourceMappingURL=redis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../../src/clients/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAwB,MAAM,OAAO,CAAC;AAE3D,MAAM,CAAC,IAAI,WAA4B,CAAC;AACxC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;IAClC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAC/D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACnC,CAAC,CAAC;gBACE,GAAG,EAAE,IAAI;gBACT,kBAAkB,EAAE,KAAK;aAC1B;YACH,CAAC,CAAC,SAAS,CAAC;QAEd,WAAW,GAAG,YAAY,CAAC;YACzB,GAAG;YACH,MAAM;SACP,CAAC,CAAC;QAEH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE;YACtC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,WAAW,CACvB,KAAK,IAAI,EAAE;IACT,IAAI,CAAC;QACH,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC,EACD,IAAI,GAAG,EAAE,GAAG,CAAC,CACd,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,WAAW,CAAC,UAAU,EAAE,CAAC;AAC3B,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ import { startAPI } from "@powerhousedao/reactor-api";
3
+ import * as Sentry from "@sentry/node";
4
+ import { ReactorBuilder, driveDocumentModelModule } from "document-drive";
5
+ import RedisCache from "document-drive/cache/redis";
6
+ import { PrismaStorageFactory } from "document-drive/storage/prisma";
7
+ import { documentModelDocumentModelModule, } from "document-model";
8
+ import dotenv from "dotenv";
9
+ import express from "express";
10
+ import { initRedis } from "./clients/redis.js";
11
+ import { initProfilerFromEnv } from "./profiler.js";
12
+ import { PackagesManager } from "./utils/package-manager.js";
13
+ dotenv.config();
14
+ // Create a monolith express app for all subgraphs
15
+ const app = express();
16
+ if (process.env.SENTRY_DSN) {
17
+ console.log("Initialized Sentry with env:", process.env.SENTRY_ENV);
18
+ Sentry.init({
19
+ dsn: process.env.SENTRY_DSN,
20
+ environment: process.env.SENTRY_ENV,
21
+ });
22
+ Sentry.setupExpressErrorHandler(app);
23
+ }
24
+ const serverPort = process.env.PORT ? Number(process.env.PORT) : 4001;
25
+ const main = async () => {
26
+ if (process.env.PYROSCOPE_SERVER_ADDRESS) {
27
+ try {
28
+ await initProfilerFromEnv(process.env);
29
+ }
30
+ catch (e) {
31
+ Sentry.captureException(e);
32
+ console.error("Error starting profiler", e);
33
+ }
34
+ }
35
+ try {
36
+ const packages = process.env.PH_PACKAGES && process.env.PH_PACKAGES !== ""
37
+ ? process.env.PH_PACKAGES.split(",")
38
+ : [];
39
+ const pkgManager = new PackagesManager({
40
+ packages,
41
+ });
42
+ const { documentModels, subgraphs } = await pkgManager.init();
43
+ const redis = await initRedis();
44
+ const connectionString = process.env.DATABASE_URL;
45
+ if (!connectionString) {
46
+ throw new Error("Please set env var DATABASE_URL");
47
+ }
48
+ const dbUrl = connectionString.includes("amazonaws") &&
49
+ !connectionString.includes("sslmode=no-verify")
50
+ ? connectionString + "?sslmode=no-verify"
51
+ : connectionString;
52
+ const redisCache = new RedisCache(redis);
53
+ const storageFactory = new PrismaStorageFactory(dbUrl, redisCache);
54
+ const storage = storageFactory.build();
55
+ const reactor = new ReactorBuilder([
56
+ documentModelDocumentModelModule,
57
+ driveDocumentModelModule,
58
+ ...documentModels,
59
+ ])
60
+ .withStorage(storage)
61
+ .withCache(redisCache)
62
+ .build();
63
+ // init drive server
64
+ await reactor.initialize();
65
+ // Start the API with the reactor and options
66
+ await startAPI(reactor, {
67
+ express: app,
68
+ port: serverPort,
69
+ dbPath: dbUrl,
70
+ packages,
71
+ });
72
+ // start http server
73
+ // httpServer.listen({ port: serverPort }, () => {
74
+ // console.log(`Subgraph server listening on port ${serverPort}`);
75
+ // });
76
+ }
77
+ catch (e) {
78
+ Sentry.captureException(e);
79
+ console.error("App crashed", e);
80
+ throw e;
81
+ }
82
+ };
83
+ main().catch(console.error);
84
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=install-packages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-packages.d.ts","sourceRoot":"","sources":["../../src/install-packages.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { execSync } from "child_process";
2
+ const pkgs = process.env.PH_PACKAGES?.split(",") || [];
3
+ for (const pkg of pkgs) {
4
+ if (pkg === "")
5
+ continue;
6
+ console.log(`> Installing ${pkg}`);
7
+ execSync(`pnpm add ${pkg}`, { stdio: "inherit" });
8
+ }
9
+ //# sourceMappingURL=install-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-packages.js","sourceRoot":"","sources":["../../src/install-packages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AACvD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,IAAI,GAAG,KAAK,EAAE;QAAE,SAAS;IACzB,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;IACnC,QAAQ,CAAC,YAAY,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { PyroscopeConfig } from "@pyroscope/nodejs";
2
+ export declare function initProfilerFromEnv(env: typeof process.env): Promise<void>;
3
+ export declare function initProfiler(options?: PyroscopeConfig): Promise<void>;
4
+ //# sourceMappingURL=profiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../../src/profiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,OAAO,OAAO,CAAC,GAAG,iBAehE;AAED,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE,eAAe,iBAK3D"}
@@ -0,0 +1,17 @@
1
+ export async function initProfilerFromEnv(env) {
2
+ const { PYROSCOPE_SERVER_ADDRESS: serverAddress, PYROSCOPE_APPLICATION_NAME: appName, PYROSCOPE_USER: basicAuthUser, PYROSCOPE_PASSWORD: basicAuthPassword, } = env;
3
+ const options = {
4
+ serverAddress,
5
+ appName,
6
+ basicAuthUser,
7
+ basicAuthPassword,
8
+ };
9
+ return initProfiler(options);
10
+ }
11
+ export async function initProfiler(options) {
12
+ console.log("Initializing Pyroscope profiler at:", options?.serverAddress);
13
+ const Pyroscope = await import("@pyroscope/nodejs");
14
+ Pyroscope.init(options);
15
+ Pyroscope.start();
16
+ }
17
+ //# sourceMappingURL=profiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiler.js","sourceRoot":"","sources":["../../src/profiler.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAuB;IAC/D,MAAM,EACJ,wBAAwB,EAAE,aAAa,EACvC,0BAA0B,EAAE,OAAO,EACnC,cAAc,EAAE,aAAa,EAC7B,kBAAkB,EAAE,iBAAiB,GACtC,GAAG,GAAG,CAAC;IAER,MAAM,OAAO,GAAoB;QAC/B,aAAa;QACb,OAAO;QACP,aAAa;QACb,iBAAiB;KAClB,CAAC;IACF,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAyB;IAC1D,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACpD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,SAAS,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type BaseDocumentDriveServer } from "document-drive";
2
+ export declare const getDocumentModelTypeDefs: (documentDriveServer: BaseDocumentDriveServer, typeDefs: string) => import("graphql").DocumentNode;
3
+ //# sourceMappingURL=gen-doc-model-type-defs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gen-doc-model-type-defs.d.ts","sourceRoot":"","sources":["../../../src/utils/gen-doc-model-type-defs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9D,eAAO,MAAM,wBAAwB,GACnC,qBAAqB,uBAAuB,EAC5C,UAAU,MAAM,mCA2DjB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { parse } from "graphql";
2
+ export const getDocumentModelTypeDefs = (documentDriveServer, typeDefs) => {
3
+ const documentModels = documentDriveServer.getDocumentModelModules();
4
+ let dmSchema = "";
5
+ documentModels.forEach(({ documentModel }) => {
6
+ dmSchema += `
7
+ ${documentModel.specifications
8
+ .map((specification) => specification.state.global.schema
9
+ .replaceAll(" Account ", ` ${documentModel.name}Account `)
10
+ .replaceAll(`: Account`, `: ${documentModel.name}Account`)
11
+ .replaceAll(`[Account!]!`, `[${documentModel.name}Account!]!`)
12
+ .replaceAll("scalar DateTime", "")
13
+ .replaceAll(/input (.*?) {[\s\S]*?}/g, ""))
14
+ .join("\n")};
15
+
16
+ ${documentModel.specifications
17
+ .map((specification) => specification.state.local.schema
18
+ .replaceAll(" Account ", ` ${documentModel.name}Account `)
19
+ .replaceAll(`: Account`, `: ${documentModel.name}Account`)
20
+ .replaceAll(`[Account!]!`, `[${documentModel.name}Account!]!`)
21
+ .replaceAll("scalar DateTime", "")
22
+ .replaceAll(/input (.*?) {[\s\S]*?}/g, "")
23
+ .replaceAll("type AccountSnapshotLocalState", "")
24
+ .replaceAll("type BudgetStatementLocalState", "")
25
+ .replaceAll("type ScopeFrameworkLocalState", ""))
26
+ .join("\n")};
27
+
28
+ type ${documentModel.name} implements IDocument {
29
+ id: ID!
30
+ name: String!
31
+ documentType: String!
32
+ revision: Int!
33
+ created: DateTime!
34
+ lastModified: DateTime!
35
+ ${documentModel.name !== "DocumentModel" ? `state: ${documentModel.name}State!` : ""}
36
+ }\n`;
37
+ });
38
+ // add the mutation and query types
39
+ const schema = `
40
+ scalar DateTime
41
+ interface IDocument {
42
+ name: String!
43
+ documentType: String!
44
+ revision: Int!
45
+ created: DateTime!
46
+ lastModified: DateTime!
47
+
48
+ }
49
+ ${dmSchema}
50
+
51
+ ${typeDefs}
52
+ `;
53
+ return parse(schema.replaceAll(";", ""));
54
+ };
55
+ //# sourceMappingURL=gen-doc-model-type-defs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gen-doc-model-type-defs.js","sourceRoot":"","sources":["../../../src/utils/gen-doc-model-type-defs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,mBAA4C,EAC5C,QAAgB,EAChB,EAAE;IACF,MAAM,cAAc,GAAG,mBAAmB,CAAC,uBAAuB,EAAE,CAAC;IACrE,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE;QAC3C,QAAQ,IAAI;UACN,aAAa,CAAC,cAAc;aAC3B,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CACrB,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;aAC9B,UAAU,CAAC,WAAW,EAAE,IAAI,aAAa,CAAC,IAAI,UAAU,CAAC;aACzD,UAAU,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,IAAI,SAAS,CAAC;aACzD,UAAU,CAAC,aAAa,EAAE,IAAI,aAAa,CAAC,IAAI,YAAY,CAAC;aAC7D,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;aACjC,UAAU,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAC7C;aACA,IAAI,CAAC,IAAI,CAAC;;UAEX,aAAa,CAAC,cAAc;aAC3B,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CACrB,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;aAC7B,UAAU,CAAC,WAAW,EAAE,IAAI,aAAa,CAAC,IAAI,UAAU,CAAC;aACzD,UAAU,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,IAAI,SAAS,CAAC;aACzD,UAAU,CAAC,aAAa,EAAE,IAAI,aAAa,CAAC,IAAI,YAAY,CAAC;aAC7D,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;aACjC,UAAU,CAAC,yBAAyB,EAAE,EAAE,CAAC;aACzC,UAAU,CAAC,gCAAgC,EAAE,EAAE,CAAC;aAChD,UAAU,CAAC,gCAAgC,EAAE,EAAE,CAAC;aAChD,UAAU,CAAC,+BAA+B,EAAE,EAAE,CAAC,CACnD;aACA,IAAI,CAAC,IAAI,CAAC;;eAEN,aAAa,CAAC,IAAI;;;;;;;cAOnB,aAAa,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,UAAU,aAAa,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE;YACpF,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,mCAAmC;IACnC,MAAM,MAAM,GAAG;;;;;;;;;;MAUX,QAAQ;;MAER,QAAQ;KACT,CAAC;IAEJ,OAAO,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC"}
@@ -0,0 +1,33 @@
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 DocumentModelModule } from "document-model";
5
+ interface IPackagesManager {
6
+ onDocumentModelsChange(handler: (documentModels: DocumentModelModule[]) => void): void;
7
+ }
8
+ type IPackagesManagerOptions = {
9
+ packages: string[];
10
+ };
11
+ export declare function loadDependency(packageName: string, subPath: string): Promise<unknown>;
12
+ export declare class PackagesManager implements IPackagesManager {
13
+ protected options: IPackagesManagerOptions;
14
+ protected onError?: ((e: unknown) => void) | undefined;
15
+ private docModelsMap;
16
+ private subgraphsMap;
17
+ private configWatcher;
18
+ private eventEmitter;
19
+ constructor(options: IPackagesManagerOptions, onError?: ((e: unknown) => void) | undefined);
20
+ init(): Promise<{
21
+ documentModels: DocumentModelModule[];
22
+ subgraphs: (typeof Subgraph)[];
23
+ }>;
24
+ private loadPackages;
25
+ private loadFromConfigFile;
26
+ private initConfigFile;
27
+ private updatePackagesMap;
28
+ private updateSubgraphsMap;
29
+ onDocumentModelsChange(handler: (documentModels: DocumentModelModule[]) => void): void;
30
+ onSubgraphsChange(handler: (subgraphs: (typeof Subgraph)[]) => void): void;
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=package-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../../src/utils/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,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAI1D,UAAU,gBAAgB;IACxB,sBAAsB,CACpB,OAAO,EAAE,CAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,IAAI,GACvD,IAAI,CAAC;CACT;AAED,KAAK,uBAAuB,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEtD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,oBAGxE;AA2ED,qBAAa,eAAgB,YAAW,gBAAgB;IAUpD,SAAS,CAAC,OAAO,EAAE,uBAAuB;IAC1C,SAAS,CAAC,OAAO,CAAC,GAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI;IAV1C,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,YAAY,CAGf;gBAGO,OAAO,EAAE,uBAAuB,EAChC,OAAO,CAAC,GAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,aAAA;IAK7B,IAAI;;;;YAIH,YAAY;IAe1B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,kBAAkB;IAa1B,sBAAsB,CACpB,OAAO,EAAE,CAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,IAAI,GACvD,IAAI;IAGP,iBAAiB,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,QAAQ,CAAC,EAAE,KAAK,IAAI,GAAG,IAAI;CAG3E"}
@@ -0,0 +1,145 @@
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/powerhouse";
12
+ import EventEmitter from "node:events";
13
+ import { watchFile } from "node:fs";
14
+ export async function loadDependency(packageName, subPath) {
15
+ const module = (await import(`${packageName}/${subPath}`));
16
+ return module;
17
+ }
18
+ async function loadPackagesDocumentModels(packages) {
19
+ const loadedPackages = new Map();
20
+ for (const pkg of packages) {
21
+ try {
22
+ console.log("> Loading package:", pkg);
23
+ const pkgModule = (await loadDependency(pkg, "document-models"));
24
+ if (pkgModule) {
25
+ console.log(` ➜ Loaded Document Models from: ${pkg}`);
26
+ loadedPackages.set(pkg, Object.values(pkgModule));
27
+ }
28
+ else {
29
+ console.warn(` ➜ No Document Models found: ${pkg}`);
30
+ }
31
+ }
32
+ catch (e) {
33
+ console.error("Error loading Document Models from", pkg, e);
34
+ }
35
+ }
36
+ return loadedPackages;
37
+ }
38
+ async function loadPackagesSubgraphs(packages) {
39
+ const loadedPackages = new Map();
40
+ for (const pkg of packages) {
41
+ const pkgModule = (await loadDependency(pkg, "subgraphs"));
42
+ if (pkgModule) {
43
+ console.log(` ➜ Loaded Subgraphs from: ${pkg}`);
44
+ loadedPackages.set(pkg, pkgModule);
45
+ }
46
+ else {
47
+ console.warn(` ➜ No Subgraphs found: ${pkg}`);
48
+ }
49
+ }
50
+ return loadedPackages;
51
+ }
52
+ function getUniqueDocumentModels(...documentModels) {
53
+ const uniqueModels = new Map();
54
+ for (const models of documentModels) {
55
+ for (const model of models) {
56
+ uniqueModels.set(model.documentModel.id, model);
57
+ }
58
+ }
59
+ return Array.from(uniqueModels.values());
60
+ }
61
+ function getUniqueSubgraphs(subgraphs) {
62
+ const uniqueSubgraphs = new Map();
63
+ for (const subgraphss of subgraphs) {
64
+ const keys = Object.keys(subgraphss);
65
+ for (const key of keys) {
66
+ uniqueSubgraphs.set(key, subgraphss[key][key]);
67
+ }
68
+ }
69
+ return Array.from(uniqueSubgraphs.values());
70
+ }
71
+ export class PackagesManager {
72
+ options;
73
+ onError;
74
+ docModelsMap = new Map();
75
+ subgraphsMap = new Map();
76
+ configWatcher;
77
+ eventEmitter = new EventEmitter();
78
+ constructor(options, onError) {
79
+ this.options = options;
80
+ this.onError = onError;
81
+ this.eventEmitter.setMaxListeners(0);
82
+ }
83
+ async init() {
84
+ return await this.loadPackages(this.options.packages);
85
+ }
86
+ async loadPackages(packages) {
87
+ // install packages
88
+ const packagesMap = await loadPackagesDocumentModels(packages);
89
+ const subgraphsMap = await loadPackagesSubgraphs(packages);
90
+ this.updatePackagesMap(packagesMap);
91
+ this.updateSubgraphsMap(subgraphsMap);
92
+ return {
93
+ documentModels: getUniqueDocumentModels(...Array.from(packagesMap.values())),
94
+ subgraphs: getUniqueSubgraphs(Array.from(subgraphsMap.values())),
95
+ };
96
+ }
97
+ loadFromConfigFile(configFile) {
98
+ const config = getConfig(configFile);
99
+ const packages = config.packages;
100
+ return this.loadPackages(packages?.map((pkg) => pkg.packageName) ?? []).catch(this.onError);
101
+ }
102
+ initConfigFile(configFile) {
103
+ const result = this.loadFromConfigFile(configFile);
104
+ if (!this.configWatcher) {
105
+ this.configWatcher = watchFile(configFile, { interval: 100 }, (curr, prev) => {
106
+ if (curr.mtime === prev.mtime) {
107
+ return;
108
+ }
109
+ void this.loadFromConfigFile(configFile).catch(this.onError);
110
+ });
111
+ }
112
+ return result;
113
+ }
114
+ updatePackagesMap(packagesMap) {
115
+ const oldPackages = Array.from(this.docModelsMap.keys());
116
+ const newPackages = Array.from(packagesMap.keys());
117
+ oldPackages
118
+ .filter((pkg) => !newPackages.includes(pkg))
119
+ .forEach((pkg) => {
120
+ console.log("> Removed package:", pkg);
121
+ });
122
+ this.docModelsMap = packagesMap;
123
+ const documentModels = getUniqueDocumentModels(...Array.from(packagesMap.values()));
124
+ this.eventEmitter.emit("documentModelsChange", documentModels);
125
+ }
126
+ updateSubgraphsMap(subgraphsMap) {
127
+ const oldPackages = Array.from(this.subgraphsMap.keys());
128
+ const newPackages = Array.from(subgraphsMap.keys());
129
+ oldPackages
130
+ .filter((pkg) => !newPackages.includes(pkg))
131
+ .forEach((pkg) => {
132
+ console.log("> Removed Subgraphs from:", pkg);
133
+ });
134
+ this.subgraphsMap = subgraphsMap;
135
+ const subgraphs = getUniqueSubgraphs(Array.from(subgraphsMap.values()));
136
+ this.eventEmitter.emit("subgraphsChange", subgraphs);
137
+ }
138
+ onDocumentModelsChange(handler) {
139
+ this.eventEmitter.on("documentModelsChange", handler);
140
+ }
141
+ onSubgraphsChange(handler) {
142
+ this.eventEmitter.on("subgraphsChange", handler);
143
+ }
144
+ }
145
+ //# sourceMappingURL=package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../../src/utils/package-manager.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@powerhousedao/switchboard",
3
+ "type": "module",
4
+ "version": "2.2.122-dev.0",
5
+ "main": "dist/src/index.js",
6
+ "bin": {
7
+ "switchboard": "dist/src/index.js"
8
+ },
9
+ "author": "",
10
+ "license": "ISC",
11
+ "description": "",
12
+ "dependencies": {
13
+ "@powerhousedao/analytics-engine-knex": "^0.4.0",
14
+ "@pyroscope/nodejs": "^0.4.5",
15
+ "@sentry/node": "^9.6.1",
16
+ "body-parser": "^1.20.3",
17
+ "cors": "^2.8.5",
18
+ "dotenv": "^16.4.7",
19
+ "exponential-backoff": "^3.1.1",
20
+ "express": "^4.21.2",
21
+ "graphql": "^16.10.0",
22
+ "redis": "^4.7.0",
23
+ "@powerhousedao/config": "1.27.0-dev.5",
24
+ "@powerhousedao/reactor-api": "1.29.18-dev.11",
25
+ "@powerhousedao/scalars": "1.33.1-dev.4",
26
+ "document-drive": "1.29.9-dev.2",
27
+ "document-model": "2.28.1-dev.4"
28
+ },
29
+ "devDependencies": {
30
+ "@types/express": "^5.0.0",
31
+ "@types/node": "^22.13.9",
32
+ "concurrently": "^9.1.2",
33
+ "nodemon": "^3.1.9",
34
+ "typescript": "^5.7.3"
35
+ },
36
+ "scripts": {
37
+ "build:tsc": "tsc --build",
38
+ "build": "pnpm run build:tsc",
39
+ "start": "node dist/src/index.js",
40
+ "dev": "concurrently -P 'pnpm -w run build:tsc --watch' 'nodemon --trace-warnings --watch \"../..\" -e ts,tsx,js,json dist/src/index.js -- {@}' --",
41
+ "lint": "eslint .",
42
+ "lint:nx": "eslint . --fix --quiet",
43
+ "install-packages": "node dist/src/install-packages.js",
44
+ "postbuild": "pnpm run install-packages",
45
+ "clean": "rimraf dist",
46
+ "clean:node_modules": "rimraf node_modules"
47
+ }
48
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "documentModelsDir": "./document-models",
3
+ "editorsDir": "./editors",
4
+ "studio": {
5
+ "port": 3000,
6
+ "https": true
7
+ },
8
+ "reactor": {
9
+ "port": 4001,
10
+ "https": true
11
+ },
12
+ "switchboard": {
13
+ "https": true
14
+ },
15
+ "packages": []
16
+ }
@@ -0,0 +1,94 @@
1
+ // This is your Prisma schema file,
2
+ // learn more about it in the docs: https://pris.ly/d/prisma-schema
3
+
4
+ generator client {
5
+ provider = "prisma-client-js"
6
+ }
7
+
8
+ datasource db {
9
+ provider = "postgresql"
10
+ url = env("DATABASE_URL")
11
+ }
12
+
13
+ model Drive {
14
+ id String @id
15
+ slug String @unique
16
+ driveDocuments DriveDocument[]
17
+ }
18
+
19
+ model Document {
20
+ id String @id
21
+ created DateTime @default(now())
22
+ lastModified DateTime @default(now())
23
+ isDrive Boolean
24
+ revision String
25
+ name String?
26
+ operations Operation[]
27
+ initialState String // json object with the scope as keys of the root object
28
+ documentType String
29
+ meta String?
30
+ syncronizationUnits SyncronizationUnit[]
31
+ driveDocuments DriveDocument[]
32
+ }
33
+
34
+ // Model to map the many-to-many relationship between drives and documents
35
+ model DriveDocument {
36
+ driveId String
37
+ documentId String
38
+ drive Drive @relation(fields: [driveId], references: [id], onDelete: Cascade)
39
+ document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
40
+
41
+ @@id([driveId, documentId])
42
+ @@index([driveId])
43
+ @@index([documentId])
44
+ }
45
+
46
+ model Operation {
47
+ id String @id @default(uuid())
48
+ opId String?
49
+ driveId String
50
+ Document Document? @relation(fields: [documentId], references: [id], onDelete: Cascade)
51
+ documentId String
52
+ scope String
53
+ branch String
54
+ index Int
55
+ skip Int
56
+ hash String
57
+ timestamp DateTime
58
+ input String
59
+ type String
60
+ attachments Attachment[]
61
+ syncId String?
62
+ clipboard Boolean? @default(false)
63
+ context Json?
64
+ resultingState Bytes?
65
+
66
+ SyncronizationUnit SyncronizationUnit? @relation(fields: [syncId, driveId], references: [id, driveId], onDelete: Cascade)
67
+
68
+ @@unique([driveId, documentId, scope, branch, index(sort: Asc)], name: "unique_operation")
69
+ }
70
+
71
+ model SyncronizationUnit {
72
+ id String
73
+ driveId String
74
+ documentId String
75
+
76
+ Document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
77
+ scope String
78
+ branch String
79
+ operations Operation[]
80
+
81
+ @@id([id, driveId])
82
+ }
83
+
84
+ model Attachment {
85
+ id String @id @default(uuid())
86
+ operationId String
87
+ Operation Operation @relation(fields: [operationId], references: [id], onDelete: Cascade)
88
+
89
+ mimeType String
90
+ data String
91
+ filename String?
92
+ extension String?
93
+ hash String
94
+ }
@@ -0,0 +1,14 @@
1
+ #!/bin/bash
2
+
3
+ # check if PH_PACKAGES is set
4
+ if [ -z "${PH_PACKAGES}" ]; then
5
+ echo "PH_PACKAGES is not set"
6
+ exit 1
7
+ fi
8
+
9
+ # replace commas with spaces in env var PH_PACKAGES
10
+ PH_PACKAGES=$(echo "${PH_PACKAGES}" | tr ',' ' ')
11
+
12
+ # install packages
13
+ ph install $(echo "${PH_PACKAGES}" | tr ',' ' ') --package-manager pnpm
14
+