@powerhousedao/switchboard 6.0.2-staging.2 → 6.0.2-staging.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/Auth.md +45 -27
  2. package/CHANGELOG.md +1416 -104
  3. package/README.md +13 -12
  4. package/dist/index.d.mts +1 -0
  5. package/dist/index.mjs +129 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/dist/install-packages.d.mts +1 -0
  8. package/dist/install-packages.mjs +31 -0
  9. package/dist/install-packages.mjs.map +1 -0
  10. package/dist/migrate.d.mts +1 -0
  11. package/dist/migrate.mjs +55 -0
  12. package/dist/migrate.mjs.map +1 -0
  13. package/dist/server-BMtyzhoR.mjs +291 -0
  14. package/dist/server-BMtyzhoR.mjs.map +1 -0
  15. package/dist/server.d.mts +93 -0
  16. package/dist/server.d.mts.map +1 -0
  17. package/dist/server.mjs +4 -0
  18. package/dist/utils-DFl0ezBT.mjs +44 -0
  19. package/dist/utils-DFl0ezBT.mjs.map +1 -0
  20. package/dist/utils.d.mts +9 -0
  21. package/dist/utils.d.mts.map +1 -0
  22. package/dist/utils.mjs +2 -0
  23. package/package.json +33 -27
  24. package/tsconfig.json +6 -3
  25. package/tsdown.config.ts +16 -0
  26. package/vitest.config.ts +2 -6
  27. package/Dockerfile +0 -86
  28. package/dist/src/clients/redis.d.ts +0 -5
  29. package/dist/src/clients/redis.d.ts.map +0 -1
  30. package/dist/src/clients/redis.js +0 -48
  31. package/dist/src/clients/redis.js.map +0 -1
  32. package/dist/src/config.d.ts +0 -12
  33. package/dist/src/config.d.ts.map +0 -1
  34. package/dist/src/config.js +0 -33
  35. package/dist/src/config.js.map +0 -1
  36. package/dist/src/feature-flags.d.ts +0 -2
  37. package/dist/src/feature-flags.d.ts.map +0 -1
  38. package/dist/src/feature-flags.js +0 -9
  39. package/dist/src/feature-flags.js.map +0 -1
  40. package/dist/src/index.d.ts +0 -3
  41. package/dist/src/index.d.ts.map +0 -1
  42. package/dist/src/index.js +0 -49
  43. package/dist/src/index.js.map +0 -1
  44. package/dist/src/install-packages.d.ts +0 -2
  45. package/dist/src/install-packages.d.ts.map +0 -1
  46. package/dist/src/install-packages.js +0 -36
  47. package/dist/src/install-packages.js.map +0 -1
  48. package/dist/src/metrics.d.ts +0 -7
  49. package/dist/src/metrics.d.ts.map +0 -1
  50. package/dist/src/metrics.js +0 -34
  51. package/dist/src/metrics.js.map +0 -1
  52. package/dist/src/migrate.d.ts +0 -3
  53. package/dist/src/migrate.d.ts.map +0 -1
  54. package/dist/src/migrate.js +0 -65
  55. package/dist/src/migrate.js.map +0 -1
  56. package/dist/src/profiler.d.ts +0 -9
  57. package/dist/src/profiler.d.ts.map +0 -1
  58. package/dist/src/profiler.js +0 -43
  59. package/dist/src/profiler.js.map +0 -1
  60. package/dist/src/renown.d.ts +0 -24
  61. package/dist/src/renown.d.ts.map +0 -1
  62. package/dist/src/renown.js +0 -45
  63. package/dist/src/renown.js.map +0 -1
  64. package/dist/src/server.d.ts +0 -5
  65. package/dist/src/server.d.ts.map +0 -1
  66. package/dist/src/server.js +0 -282
  67. package/dist/src/server.js.map +0 -1
  68. package/dist/src/types.d.ts +0 -66
  69. package/dist/src/types.d.ts.map +0 -1
  70. package/dist/src/types.js +0 -2
  71. package/dist/src/types.js.map +0 -1
  72. package/dist/src/utils.d.ts +0 -5
  73. package/dist/src/utils.d.ts.map +0 -1
  74. package/dist/src/utils.js +0 -62
  75. package/dist/src/utils.js.map +0 -1
  76. package/dist/test/metrics.test.d.ts +0 -2
  77. package/dist/test/metrics.test.d.ts.map +0 -1
  78. package/dist/test/metrics.test.js +0 -121
  79. package/dist/test/metrics.test.js.map +0 -1
  80. package/dist/tsconfig.tsbuildinfo +0 -1
  81. package/dist/vitest.config.d.ts +0 -3
  82. package/dist/vitest.config.d.ts.map +0 -1
  83. package/dist/vitest.config.js +0 -15
  84. package/dist/vitest.config.js.map +0 -1
  85. package/entrypoint.sh +0 -17
package/dist/src/index.js DELETED
@@ -1,49 +0,0 @@
1
- #!/usr/bin/env node
2
- import * as Sentry from "@sentry/node";
3
- import { childLogger } from "document-drive";
4
- import { config } from "./config.js";
5
- import { createMeterProviderFromEnv } from "./metrics.js";
6
- import { initProfilerFromEnv } from "./profiler.js";
7
- import { startSwitchboard } from "./server.js";
8
- const logger = childLogger(["switchboard"]);
9
- function ensureNodeVersion(minVersion = "24") {
10
- const version = process.versions.node;
11
- if (!version) {
12
- return;
13
- }
14
- if (version < minVersion) {
15
- console.error(`Node version ${minVersion} or higher is required. Current version: ${version}`);
16
- process.exit(1);
17
- }
18
- }
19
- // Ensure minimum Node.js version
20
- ensureNodeVersion("24");
21
- const meterProvider = createMeterProviderFromEnv({
22
- OTEL_EXPORTER_OTLP_ENDPOINT: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
23
- OTEL_METRIC_EXPORT_INTERVAL: process.env.OTEL_METRIC_EXPORT_INTERVAL,
24
- OTEL_SERVICE_NAME: process.env.OTEL_SERVICE_NAME,
25
- });
26
- async function shutdown() {
27
- console.log("\nShutting down...");
28
- // Flush final metrics before exit. Races against a 5s deadline so an
29
- // unresponsive OTLP endpoint cannot exhaust terminationGracePeriodSeconds.
30
- await Promise.race([
31
- meterProvider?.shutdown().catch(() => undefined),
32
- new Promise((resolve) => setTimeout(resolve, 5_000)),
33
- ]);
34
- process.exit(0);
35
- }
36
- // SIGINT: Ctrl-C in development; SIGTERM: graceful shutdown in Docker/Kubernetes
37
- process.on("SIGINT", shutdown);
38
- process.on("SIGTERM", shutdown);
39
- if (process.env.PYROSCOPE_SERVER_ADDRESS) {
40
- try {
41
- await initProfilerFromEnv(process.env);
42
- }
43
- catch (e) {
44
- Sentry.captureException(e);
45
- logger.error("Error starting profiler: @error", e);
46
- }
47
- }
48
- startSwitchboard({ ...config, meterProvider }).catch(console.error);
49
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AAE5C,SAAS,iBAAiB,CAAC,UAAU,GAAG,IAAI;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CACX,gBAAgB,UAAU,4CAA4C,OAAO,EAAE,CAChF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AACD,iCAAiC;AACjC,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAExB,MAAM,aAAa,GAAG,0BAA0B,CAAC;IAC/C,2BAA2B,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B;IACpE,2BAA2B,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B;IACpE,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;CACjD,CAAC,CAAC;AAEH,KAAK,UAAU,QAAQ;IACrB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,qEAAqE;IACrE,2EAA2E;IAC3E,MAAM,OAAO,CAAC,IAAI,CAAC;QACjB,aAAa,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;QAChD,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KAC3D,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,iFAAiF;AACjF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEhC,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,gBAAgB,CAAC,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=install-packages.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-packages.d.ts","sourceRoot":"","sources":["../../src/install-packages.ts"],"names":[],"mappings":""}
@@ -1,36 +0,0 @@
1
- import { execSync } from "child_process";
2
- import fs from "fs";
3
- import path from "path";
4
- // Get the list of packages to install from the environment variable
5
- const pkgs = process.env.PH_PACKAGES?.split(",") || [];
6
- // Skip if no packages to install
7
- if (pkgs.length === 0 || (pkgs.length === 1 && pkgs[0] === "")) {
8
- process.exit(0);
9
- }
10
- try {
11
- // Read the package.json file to check existing dependencies
12
- const packageJsonPath = path.join(process.cwd(), "package.json");
13
- const packageJsonContent = fs.readFileSync(packageJsonPath, "utf-8");
14
- const packageJson = JSON.parse(packageJsonContent);
15
- // Get all installed dependencies
16
- const installedDependencies = {
17
- ...(packageJson.dependencies || {}),
18
- ...(packageJson.devDependencies || {}),
19
- };
20
- for (const pkg of pkgs) {
21
- if (pkg === "")
22
- continue;
23
- // Check if the package is already installed
24
- if (installedDependencies[pkg]) {
25
- console.log(`> Package ${pkg} is already installed, skipping`);
26
- continue;
27
- }
28
- console.log(`> Installing ${pkg}`);
29
- execSync(`pnpm add ${pkg}@latest`, { stdio: "inherit" });
30
- }
31
- }
32
- catch (error) {
33
- console.error("Error in package installation:", error);
34
- process.exit(1);
35
- }
36
- //# sourceMappingURL=install-packages.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-packages.js","sourceRoot":"","sources":["../../src/install-packages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,oEAAoE;AACpE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AAEvD,iCAAiC;AACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,CAAC;IACH,4DAA4D;IAC5D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,kBAAkB,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAgB,CAAC;IAElE,iCAAiC;IACjC,MAAM,qBAAqB,GAA2B;QACpD,GAAG,CAAC,WAAW,CAAC,YAAY,IAAI,EAAE,CAAC;QACnC,GAAG,CAAC,WAAW,CAAC,eAAe,IAAI,EAAE,CAAC;KACvC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,EAAE;YAAE,SAAS;QAEzB,4CAA4C;QAC5C,IAAI,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,iCAAiC,CAAC,CAAC;YAC/D,SAAS;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;QACnC,QAAQ,CAAC,YAAY,GAAG,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -1,7 +0,0 @@
1
- import { MeterProvider } from "@opentelemetry/sdk-metrics";
2
- export declare function createMeterProviderFromEnv(env: {
3
- OTEL_EXPORTER_OTLP_ENDPOINT?: string;
4
- OTEL_METRIC_EXPORT_INTERVAL?: string;
5
- OTEL_SERVICE_NAME?: string;
6
- }): MeterProvider | undefined;
7
- //# sourceMappingURL=metrics.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EAEd,MAAM,4BAA4B,CAAC;AAKpC,wBAAgB,0BAA0B,CAAC,GAAG,EAAE;IAC9C,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,aAAa,GAAG,SAAS,CA8B5B"}
@@ -1,34 +0,0 @@
1
- import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
2
- import { Resource } from "@opentelemetry/resources";
3
- import { MeterProvider, PeriodicExportingMetricReader, } from "@opentelemetry/sdk-metrics";
4
- import { childLogger } from "document-drive";
5
- const logger = childLogger(["switchboard", "metrics"]);
6
- export function createMeterProviderFromEnv(env) {
7
- const endpoint = env.OTEL_EXPORTER_OTLP_ENDPOINT;
8
- if (!endpoint)
9
- return undefined;
10
- const parsed = parseInt(env.OTEL_METRIC_EXPORT_INTERVAL ?? "", 10);
11
- const exportIntervalMillis = Number.isFinite(parsed) && parsed > 0 ? parsed : 5_000;
12
- const base = endpoint.replace(/\/$/, "");
13
- const exporterUrl = base.endsWith("/v1/metrics")
14
- ? base
15
- : `${base}/v1/metrics`;
16
- logger.info(`Initializing OpenTelemetry metrics exporter at: ${endpoint}`);
17
- const meterProvider = new MeterProvider({
18
- resource: new Resource({
19
- "service.name": env.OTEL_SERVICE_NAME ?? "switchboard",
20
- }),
21
- readers: [
22
- new PeriodicExportingMetricReader({
23
- exporter: new OTLPMetricExporter({
24
- url: exporterUrl,
25
- }),
26
- exportIntervalMillis,
27
- exportTimeoutMillis: Math.max(exportIntervalMillis - 250, 1),
28
- }),
29
- ],
30
- });
31
- logger.info(`Metrics export enabled (interval: ${exportIntervalMillis}ms)`);
32
- return meterProvider;
33
- }
34
- //# sourceMappingURL=metrics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EACL,aAAa,EACb,6BAA6B,GAC9B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;AAEvD,MAAM,UAAU,0BAA0B,CAAC,GAI1C;IACC,MAAM,QAAQ,GAAG,GAAG,CAAC,2BAA2B,CAAC;IACjD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACnE,MAAM,oBAAoB,GACxB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAEzD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC9C,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,GAAG,IAAI,aAAa,CAAC;IAEzB,MAAM,CAAC,IAAI,CAAC,mDAAmD,QAAQ,EAAE,CAAC,CAAC;IAC3E,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC;QACtC,QAAQ,EAAE,IAAI,QAAQ,CAAC;YACrB,cAAc,EAAE,GAAG,CAAC,iBAAiB,IAAI,aAAa;SACvD,CAAC;QACF,OAAO,EAAE;YACP,IAAI,6BAA6B,CAAC;gBAChC,QAAQ,EAAE,IAAI,kBAAkB,CAAC;oBAC/B,GAAG,EAAE,WAAW;iBACjB,CAAC;gBACF,oBAAoB;gBACpB,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,oBAAoB,GAAG,GAAG,EAAE,CAAC,CAAC;aAC7D,CAAC;SACH;KACF,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,qCAAqC,oBAAoB,KAAK,CAAC,CAAC;IAC5E,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=migrate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/migrate.ts"],"names":[],"mappings":""}
@@ -1,65 +0,0 @@
1
- #!/usr/bin/env node
2
- import { Kysely, PostgresDialect } from "kysely";
3
- import { Pool } from "pg";
4
- import { runMigrations, getMigrationStatus, REACTOR_SCHEMA, } from "@powerhousedao/reactor";
5
- import { getConfig } from "@powerhousedao/config/node";
6
- function isPostgresUrl(url) {
7
- return url.startsWith("postgresql://") || url.startsWith("postgres://");
8
- }
9
- async function main() {
10
- const command = process.argv[2];
11
- const config = getConfig();
12
- const dbPath = process.env.PH_REACTOR_DATABASE_URL ??
13
- process.env.DATABASE_URL ??
14
- config.switchboard?.database?.url;
15
- if (!dbPath || !isPostgresUrl(dbPath)) {
16
- console.log("No PostgreSQL URL configured. Skipping migrations.");
17
- console.log("(PGlite migrations are handled automatically on startup)");
18
- return;
19
- }
20
- console.log(`Database: ${dbPath}`);
21
- const pool = new Pool({ connectionString: dbPath });
22
- const db = new Kysely({
23
- dialect: new PostgresDialect({ pool }),
24
- });
25
- try {
26
- if (command === "status") {
27
- console.log("\nChecking migration status...");
28
- const migrations = await getMigrationStatus(db, REACTOR_SCHEMA);
29
- console.log("\nMigration Status:");
30
- console.log("=================");
31
- for (const migration of migrations) {
32
- const status = migration.executedAt
33
- ? `[OK] Executed at ${migration.executedAt.toISOString()}`
34
- : "[--] Pending";
35
- console.log(`${status} - ${migration.name}`);
36
- }
37
- }
38
- else {
39
- console.log("\nRunning migrations...");
40
- const result = await runMigrations(db, REACTOR_SCHEMA);
41
- if (!result.success) {
42
- console.error("Migration failed:", result.error?.message);
43
- process.exit(1);
44
- }
45
- if (result.migrationsExecuted.length === 0) {
46
- console.log("No migrations to run - database is up to date");
47
- }
48
- else {
49
- console.log(`Successfully executed ${result.migrationsExecuted.length} migration(s):`);
50
- for (const name of result.migrationsExecuted) {
51
- console.log(` - ${name}`);
52
- }
53
- }
54
- }
55
- }
56
- catch (error) {
57
- console.error("Error:", error instanceof Error ? error.message : String(error));
58
- process.exit(1);
59
- }
60
- finally {
61
- await db.destroy();
62
- }
63
- }
64
- void main();
65
- //# sourceMappingURL=migrate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/migrate.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import type { PyroscopeConfig } from "@pyroscope/nodejs";
2
- export declare function initProfilerFromEnv(env: typeof process.env): Promise<void>;
3
- interface ProfilerFlags {
4
- wallEnabled?: boolean;
5
- heapEnabled?: boolean;
6
- }
7
- export declare function initProfiler(options?: PyroscopeConfig, flags?: ProfilerFlags): Promise<void>;
8
- export {};
9
- //# sourceMappingURL=profiler.d.ts.map
@@ -1 +0,0 @@
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,iBAgChE;AAED,UAAU,aAAa;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,YAAY,CAChC,OAAO,CAAC,EAAE,eAAe,EACzB,KAAK,GAAE,aAAyD,iBAqBjE"}
@@ -1,43 +0,0 @@
1
- export async function initProfilerFromEnv(env) {
2
- const { PYROSCOPE_SERVER_ADDRESS: serverAddress, PYROSCOPE_APPLICATION_NAME: appName, PYROSCOPE_USER: basicAuthUser, PYROSCOPE_PASSWORD: basicAuthPassword, PYROSCOPE_WALL_ENABLED: wallEnabled, PYROSCOPE_HEAP_ENABLED: heapEnabled, } = env;
3
- const options = {
4
- serverAddress,
5
- appName,
6
- basicAuthUser,
7
- basicAuthPassword,
8
- // Wall profiling captures wall-clock time (includes async I/O waits)
9
- // This shows GraphQL resolvers even when waiting for database
10
- wall: {
11
- samplingDurationMs: 10000, // 10 second sampling windows
12
- samplingIntervalMicros: 10000, // 10ms sampling interval (100 samples/sec)
13
- collectCpuTime: true, // Also collect CPU time alongside wall time
14
- },
15
- // Heap profiling for memory allocation tracking
16
- heap: {
17
- samplingIntervalBytes: 512 * 1024, // Sample every 512KB allocated
18
- stackDepth: 64, // Capture deeper stacks for better context
19
- },
20
- };
21
- return initProfiler(options, {
22
- wallEnabled: wallEnabled !== "false",
23
- heapEnabled: heapEnabled === "true",
24
- });
25
- }
26
- export async function initProfiler(options, flags = { wallEnabled: true, heapEnabled: false }) {
27
- console.log("Initializing Pyroscope profiler at:", options?.serverAddress);
28
- console.log(" Wall profiling:", flags.wallEnabled ? "enabled" : "disabled");
29
- console.log(" Heap profiling:", flags.heapEnabled ? "enabled" : "disabled");
30
- const { default: Pyroscope } = await import("@pyroscope/nodejs");
31
- Pyroscope.init(options);
32
- // Start wall profiling (captures async I/O time - shows resolvers)
33
- if (flags.wallEnabled) {
34
- Pyroscope.startWallProfiling();
35
- }
36
- // Start CPU profiling (captures CPU-bound work)
37
- Pyroscope.startCpuProfiling();
38
- // Optionally start heap profiling (memory allocations)
39
- if (flags.heapEnabled) {
40
- Pyroscope.startHeapProfiling();
41
- }
42
- }
43
- //# sourceMappingURL=profiler.js.map
@@ -1 +0,0 @@
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,EACrC,sBAAsB,EAAE,WAAW,EACnC,sBAAsB,EAAE,WAAW,GACpC,GAAG,GAAG,CAAC;IAER,MAAM,OAAO,GAAoB;QAC/B,aAAa;QACb,OAAO;QACP,aAAa;QACb,iBAAiB;QACjB,qEAAqE;QACrE,8DAA8D;QAC9D,IAAI,EAAE;YACJ,kBAAkB,EAAE,KAAK,EAAE,6BAA6B;YACxD,sBAAsB,EAAE,KAAK,EAAE,2CAA2C;YAC1E,cAAc,EAAE,IAAI,EAAE,4CAA4C;SACnE;QACD,gDAAgD;QAChD,IAAI,EAAE;YACJ,qBAAqB,EAAE,GAAG,GAAG,IAAI,EAAE,+BAA+B;YAClE,UAAU,EAAE,EAAE,EAAE,2CAA2C;SAC5D;KACF,CAAC;IACF,OAAO,YAAY,CAAC,OAAO,EAAE;QAC3B,WAAW,EAAE,WAAW,KAAK,OAAO;QACpC,WAAW,EAAE,WAAW,KAAK,MAAM;KACpC,CAAC,CAAC;AACL,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAyB,EACzB,QAAuB,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE;IAEhE,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAE7E,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACjE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAExB,mEAAmE;IACnE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,SAAS,CAAC,kBAAkB,EAAE,CAAC;IACjC,CAAC;IAED,gDAAgD;IAChD,SAAS,CAAC,iBAAiB,EAAE,CAAC;IAE9B,uDAAuD;IACvD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,SAAS,CAAC,kBAAkB,EAAE,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -1,24 +0,0 @@
1
- import type { SignerConfig } from "@powerhousedao/reactor";
2
- import { type IRenown } from "@renown/sdk/node";
3
- export interface RenownOptions {
4
- /** Path to the keypair file. Defaults to .ph/.keypair.json in cwd */
5
- keypairPath?: string;
6
- /** If true, won't generate a new keypair if none exists */
7
- requireExisting?: boolean;
8
- /** Base url of the Renown instance to use */
9
- baseUrl?: string;
10
- }
11
- /**
12
- * Initialize Renown for the Switchboard instance.
13
- * This allows Switchboard to authenticate with remote services
14
- * using the same identity established during `ph login`.
15
- */
16
- export declare function initRenown(options?: RenownOptions): Promise<IRenown | null>;
17
- /**
18
- * Get the signer config for the given renown instance.
19
- *
20
- * @param renown - The renown instance
21
- * @param requireSignature - If true, unsigned actions are rejected
22
- */
23
- export declare function getRenownSignerConfig(renown: IRenown, requireSignature?: boolean): SignerConfig;
24
- //# sourceMappingURL=renown.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"renown.d.ts","sourceRoot":"","sources":["../../src/renown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAML,KAAK,OAAO,EACb,MAAM,kBAAkB,CAAC;AAK1B,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAqCzB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,gBAAgB,CAAC,EAAE,OAAO,GACzB,YAAY,CAKd"}
@@ -1,45 +0,0 @@
1
- import { createSignatureVerifier, DEFAULT_RENOWN_URL, NodeKeyStorage, RenownBuilder, RenownCryptoBuilder, } from "@renown/sdk/node";
2
- import { childLogger } from "document-drive";
3
- const logger = childLogger(["switchboard", "renown"]);
4
- /**
5
- * Initialize Renown for the Switchboard instance.
6
- * This allows Switchboard to authenticate with remote services
7
- * using the same identity established during `ph login`.
8
- */
9
- export async function initRenown(options = {}) {
10
- const { keypairPath, requireExisting = false, baseUrl = DEFAULT_RENOWN_URL, } = options;
11
- const keyStorage = new NodeKeyStorage(keypairPath, {
12
- logger,
13
- });
14
- // Check if we have an existing keypair
15
- const existingKeyPair = await keyStorage.loadKeyPair();
16
- if (!existingKeyPair && requireExisting) {
17
- throw new Error("No existing keypair found and requireExisting is true. " +
18
- 'Run "ph login" to create one.');
19
- }
20
- if (!existingKeyPair) {
21
- logger.info("No existing keypair found. A new one will be generated.");
22
- }
23
- const renownCrypto = await new RenownCryptoBuilder()
24
- .withKeyPairStorage(keyStorage)
25
- .build();
26
- const renown = await new RenownBuilder("switchboard", {})
27
- .withCrypto(renownCrypto)
28
- .withBaseUrl(baseUrl)
29
- .build();
30
- logger.info("Switchboard identity initialized: @did", renownCrypto.did);
31
- return renown;
32
- }
33
- /**
34
- * Get the signer config for the given renown instance.
35
- *
36
- * @param renown - The renown instance
37
- * @param requireSignature - If true, unsigned actions are rejected
38
- */
39
- export function getRenownSignerConfig(renown, requireSignature) {
40
- return {
41
- signer: renown.signer,
42
- verifier: createSignatureVerifier(requireSignature),
43
- };
44
- }
45
- //# sourceMappingURL=renown.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"renown.js","sourceRoot":"","sources":["../../src/renown.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,mBAAmB,GAEpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;AAWtD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,UAAyB,EAAE;IAE3B,MAAM,EACJ,WAAW,EACX,eAAe,GAAG,KAAK,EACvB,OAAO,GAAG,kBAAkB,GAC7B,GAAG,OAAO,CAAC;IAEZ,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC,WAAW,EAAE;QACjD,MAAM;KACP,CAAC,CAAC;IAEH,uCAAuC;IACvC,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC;IAEvD,IAAI,CAAC,eAAe,IAAI,eAAe,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,yDAAyD;YACvD,+BAA+B,CAClC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,IAAI,mBAAmB,EAAE;SACjD,kBAAkB,CAAC,UAAU,CAAC;SAC9B,KAAK,EAAE,CAAC;IAEX,MAAM,MAAM,GAAG,MAAM,IAAI,aAAa,CAAC,aAAa,EAAE,EAAE,CAAC;SACtD,UAAU,CAAC,YAAY,CAAC;SACxB,WAAW,CAAC,OAAO,CAAC;SACpB,KAAK,EAAE,CAAC;IAEX,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IAExE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAe,EACf,gBAA0B;IAE1B,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,uBAAuB,CAAC,gBAAgB,CAAC;KACpD,CAAC;AACJ,CAAC"}
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env node
2
- import type { StartServerOptions, SwitchboardReactor } from "./types.js";
3
- export declare const startSwitchboard: (options?: StartServerOptions) => Promise<SwitchboardReactor>;
4
- export * from "./types.js";
5
- //# sourceMappingURL=server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";AA4CA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAqSzE,eAAO,MAAM,gBAAgB,GAC3B,UAAS,kBAAuB,KAC/B,OAAO,CAAC,kBAAkB,CAwD5B,CAAC;AAEF,cAAc,YAAY,CAAC"}