@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.
- package/.dockerignore +5 -0
- package/CHANGELOG.md +346 -0
- package/Dockerfile +50 -0
- package/LICENSE +661 -0
- package/dist/src/clients/redis.d.ts +5 -0
- package/dist/src/clients/redis.d.ts.map +1 -0
- package/dist/src/clients/redis.js +41 -0
- package/dist/src/clients/redis.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +84 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/install-packages.d.ts +2 -0
- package/dist/src/install-packages.d.ts.map +1 -0
- package/dist/src/install-packages.js +9 -0
- package/dist/src/install-packages.js.map +1 -0
- package/dist/src/profiler.d.ts +4 -0
- package/dist/src/profiler.d.ts.map +1 -0
- package/dist/src/profiler.js +17 -0
- package/dist/src/profiler.js.map +1 -0
- package/dist/src/utils/gen-doc-model-type-defs.d.ts +3 -0
- package/dist/src/utils/gen-doc-model-type-defs.d.ts.map +1 -0
- package/dist/src/utils/gen-doc-model-type-defs.js +55 -0
- package/dist/src/utils/gen-doc-model-type-defs.js.map +1 -0
- package/dist/src/utils/package-manager.d.ts +33 -0
- package/dist/src/utils/package-manager.d.ts.map +1 -0
- package/dist/src/utils/package-manager.js +145 -0
- package/dist/src/utils/package-manager.js.map +1 -0
- package/package.json +48 -0
- package/powerhouse.config.json +16 -0
- package/prisma/schema.prisma +94 -0
- package/scripts/install-packages.sh +14 -0
- package/src/clients/redis.ts +51 -0
- package/src/index.ts +99 -0
- package/src/install-packages.ts +8 -0
- package/src/profiler.ts +25 -0
- package/src/utils/gen-doc-model-type-defs.ts +65 -0
- package/src/utils/package-manager.ts +204 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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,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
|
+
|