@opendatalabs/personal-server-ts-server 0.0.1-canary.0078f25

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 (101) hide show
  1. package/dist/api.d.ts +2 -0
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +2 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/app.d.ts +35 -0
  6. package/dist/app.d.ts.map +1 -0
  7. package/dist/app.js +124 -0
  8. package/dist/app.js.map +1 -0
  9. package/dist/bootstrap.d.ts +35 -0
  10. package/dist/bootstrap.d.ts.map +1 -0
  11. package/dist/bootstrap.js +232 -0
  12. package/dist/bootstrap.js.map +1 -0
  13. package/dist/dev-token.d.ts +6 -0
  14. package/dist/dev-token.d.ts.map +1 -0
  15. package/dist/dev-token.js +9 -0
  16. package/dist/dev-token.js.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +60 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/middleware/access-log.d.ts +8 -0
  22. package/dist/middleware/access-log.d.ts.map +1 -0
  23. package/dist/middleware/access-log.js +38 -0
  24. package/dist/middleware/access-log.js.map +1 -0
  25. package/dist/middleware/body-limit.d.ts +10 -0
  26. package/dist/middleware/body-limit.d.ts.map +1 -0
  27. package/dist/middleware/body-limit.js +20 -0
  28. package/dist/middleware/body-limit.js.map +1 -0
  29. package/dist/middleware/builder-check.d.ts +8 -0
  30. package/dist/middleware/builder-check.d.ts.map +1 -0
  31. package/dist/middleware/builder-check.js +29 -0
  32. package/dist/middleware/builder-check.js.map +1 -0
  33. package/dist/middleware/grant-check.d.ts +12 -0
  34. package/dist/middleware/grant-check.d.ts.map +1 -0
  35. package/dist/middleware/grant-check.js +90 -0
  36. package/dist/middleware/grant-check.js.map +1 -0
  37. package/dist/middleware/owner-check.d.ts +9 -0
  38. package/dist/middleware/owner-check.d.ts.map +1 -0
  39. package/dist/middleware/owner-check.js +37 -0
  40. package/dist/middleware/owner-check.js.map +1 -0
  41. package/dist/middleware/web3-auth.d.ts +16 -0
  42. package/dist/middleware/web3-auth.d.ts.map +1 -0
  43. package/dist/middleware/web3-auth.js +58 -0
  44. package/dist/middleware/web3-auth.js.map +1 -0
  45. package/dist/routes/access-logs.d.ts +16 -0
  46. package/dist/routes/access-logs.d.ts.map +1 -0
  47. package/dist/routes/access-logs.js +30 -0
  48. package/dist/routes/access-logs.js.map +1 -0
  49. package/dist/routes/data.d.ts +20 -0
  50. package/dist/routes/data.d.ts.map +1 -0
  51. package/dist/routes/data.js +213 -0
  52. package/dist/routes/data.js.map +1 -0
  53. package/dist/routes/grants.d.ts +17 -0
  54. package/dist/routes/grants.d.ts.map +1 -0
  55. package/dist/routes/grants.js +208 -0
  56. package/dist/routes/grants.js.map +1 -0
  57. package/dist/routes/health.d.ts +16 -0
  58. package/dist/routes/health.d.ts.map +1 -0
  59. package/dist/routes/health.js +37 -0
  60. package/dist/routes/health.js.map +1 -0
  61. package/dist/routes/mcp.d.ts +7 -0
  62. package/dist/routes/mcp.d.ts.map +1 -0
  63. package/dist/routes/mcp.js +14 -0
  64. package/dist/routes/mcp.js.map +1 -0
  65. package/dist/routes/sync.d.ts +16 -0
  66. package/dist/routes/sync.d.ts.map +1 -0
  67. package/dist/routes/sync.js +52 -0
  68. package/dist/routes/sync.js.map +1 -0
  69. package/dist/routes/ui-config.d.ts +7 -0
  70. package/dist/routes/ui-config.d.ts.map +1 -0
  71. package/dist/routes/ui-config.js +89 -0
  72. package/dist/routes/ui-config.js.map +1 -0
  73. package/dist/routes/ui.d.ts +6 -0
  74. package/dist/routes/ui.d.ts.map +1 -0
  75. package/dist/routes/ui.js +36 -0
  76. package/dist/routes/ui.js.map +1 -0
  77. package/dist/tunnel/auth.d.ts +46 -0
  78. package/dist/tunnel/auth.d.ts.map +1 -0
  79. package/dist/tunnel/auth.js +46 -0
  80. package/dist/tunnel/auth.js.map +1 -0
  81. package/dist/tunnel/binary.d.ts +57 -0
  82. package/dist/tunnel/binary.d.ts.map +1 -0
  83. package/dist/tunnel/binary.js +180 -0
  84. package/dist/tunnel/binary.js.map +1 -0
  85. package/dist/tunnel/config.d.ts +27 -0
  86. package/dist/tunnel/config.d.ts.map +1 -0
  87. package/dist/tunnel/config.js +38 -0
  88. package/dist/tunnel/config.js.map +1 -0
  89. package/dist/tunnel/index.d.ts +13 -0
  90. package/dist/tunnel/index.d.ts.map +1 -0
  91. package/dist/tunnel/index.js +9 -0
  92. package/dist/tunnel/index.js.map +1 -0
  93. package/dist/tunnel/manager.d.ts +88 -0
  94. package/dist/tunnel/manager.d.ts.map +1 -0
  95. package/dist/tunnel/manager.js +279 -0
  96. package/dist/tunnel/manager.js.map +1 -0
  97. package/dist/tunnel/verify.d.ts +28 -0
  98. package/dist/tunnel/verify.d.ts.map +1 -0
  99. package/dist/tunnel/verify.js +40 -0
  100. package/dist/tunnel/verify.js.map +1 -0
  101. package/package.json +47 -0
package/dist/api.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { createServer, type CreateServerOptions, type ServerContext, } from "./bootstrap.js";
2
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC"}
package/dist/api.js ADDED
@@ -0,0 +1,2 @@
1
+ export { createServer, } from "./bootstrap.js";
2
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAGb,MAAM,gBAAgB,CAAC"}
package/dist/app.d.ts ADDED
@@ -0,0 +1,35 @@
1
+ import { Hono } from "hono";
2
+ import type { IndexManager } from "@opendatalabs/personal-server-ts-core/storage/index";
3
+ import type { HierarchyManagerOptions } from "@opendatalabs/personal-server-ts-core/storage/hierarchy";
4
+ import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
5
+ import type { AccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
6
+ import type { AccessLogReader } from "@opendatalabs/personal-server-ts-core/logging/access-reader";
7
+ import { type HealthDeps } from "./routes/health.js";
8
+ import type { SyncManager } from "@opendatalabs/personal-server-ts-core/sync";
9
+ import type { ServerSigner } from "@opendatalabs/personal-server-ts-core/signing";
10
+ import type { Logger } from "pino";
11
+ export interface IdentityInfo {
12
+ address: `0x${string}`;
13
+ publicKey: `0x${string}`;
14
+ serverId: string | null;
15
+ }
16
+ export interface AppDeps {
17
+ logger: Logger;
18
+ version: string;
19
+ startedAt: Date;
20
+ indexManager: IndexManager;
21
+ hierarchyOptions: HierarchyManagerOptions;
22
+ serverOrigin: string | (() => string);
23
+ serverOwner?: `0x${string}`;
24
+ identity?: IdentityInfo;
25
+ gateway: GatewayClient;
26
+ accessLogWriter: AccessLogWriter;
27
+ accessLogReader: AccessLogReader;
28
+ devToken?: string;
29
+ configPath?: string;
30
+ syncManager?: SyncManager | null;
31
+ serverSigner?: ServerSigner;
32
+ getTunnelStatus?: HealthDeps["getTunnelStatus"];
33
+ }
34
+ export declare function createApp(deps: AppDeps): Hono;
35
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AACvG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAC;AACnG,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,KAAK,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,eAAe,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;CACjD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CA0J7C"}
package/dist/app.js ADDED
@@ -0,0 +1,124 @@
1
+ import { Hono } from "hono";
2
+ import { cors } from "hono/cors";
3
+ import { ProtocolError } from "@opendatalabs/personal-server-ts-core/errors";
4
+ import { healthRoute } from "./routes/health.js";
5
+ import { dataRoutes } from "./routes/data.js";
6
+ import { grantsRoutes } from "./routes/grants.js";
7
+ import { accessLogsRoutes } from "./routes/access-logs.js";
8
+ import { syncRoutes } from "./routes/sync.js";
9
+ import { uiConfigRoutes } from "./routes/ui-config.js";
10
+ import { uiRoute } from "./routes/ui.js";
11
+ import { mcpRoute } from "./routes/mcp.js";
12
+ export function createApp(deps) {
13
+ const app = new Hono();
14
+ // CORS — allow all origins for browser-based clients
15
+ app.use("*", cors({
16
+ origin: "*",
17
+ allowHeaders: [
18
+ "Content-Type",
19
+ "Authorization",
20
+ "mcp-session-id",
21
+ "Last-Event-ID",
22
+ "mcp-protocol-version",
23
+ ],
24
+ exposeHeaders: ["mcp-session-id", "mcp-protocol-version"],
25
+ allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
26
+ maxAge: 86400,
27
+ }));
28
+ // Mount health route
29
+ app.route("/", healthRoute({
30
+ version: deps.version,
31
+ startedAt: deps.startedAt,
32
+ serverOwner: deps.serverOwner,
33
+ identity: deps.identity,
34
+ gateway: deps.gateway,
35
+ logger: deps.logger,
36
+ getTunnelStatus: deps.getTunnelStatus,
37
+ }));
38
+ // Mount data routes (ingest + read + delete)
39
+ app.route("/v1/data", dataRoutes({
40
+ indexManager: deps.indexManager,
41
+ hierarchyOptions: deps.hierarchyOptions,
42
+ logger: deps.logger,
43
+ serverOrigin: deps.serverOrigin,
44
+ serverOwner: deps.serverOwner,
45
+ gateway: deps.gateway,
46
+ accessLogWriter: deps.accessLogWriter,
47
+ devToken: deps.devToken,
48
+ syncManager: deps.syncManager ?? null,
49
+ }));
50
+ // Mount grants routes (POST /verify is public, GET / and POST / need owner auth)
51
+ app.route("/v1/grants", grantsRoutes({
52
+ logger: deps.logger,
53
+ gateway: deps.gateway,
54
+ serverOwner: deps.serverOwner,
55
+ serverOrigin: deps.serverOrigin,
56
+ devToken: deps.devToken,
57
+ serverSigner: deps.serverSigner,
58
+ }));
59
+ // Mount access-logs routes (all owner auth)
60
+ app.route("/v1/access-logs", accessLogsRoutes({
61
+ logger: deps.logger,
62
+ accessLogReader: deps.accessLogReader,
63
+ serverOrigin: deps.serverOrigin,
64
+ serverOwner: deps.serverOwner,
65
+ devToken: deps.devToken,
66
+ }));
67
+ // Mount sync routes (all owner auth)
68
+ app.route("/v1/sync", syncRoutes({
69
+ logger: deps.logger,
70
+ serverOrigin: deps.serverOrigin,
71
+ serverOwner: deps.serverOwner,
72
+ devToken: deps.devToken,
73
+ syncManager: deps.syncManager ?? null,
74
+ }));
75
+ // Mount MCP endpoint (Model Context Protocol for AI tools)
76
+ if (deps.serverOwner) {
77
+ app.route("/mcp", mcpRoute({
78
+ mcpContext: {
79
+ indexManager: deps.indexManager,
80
+ hierarchyOptions: deps.hierarchyOptions,
81
+ gatewayClient: deps.gateway,
82
+ serverOwner: deps.serverOwner,
83
+ logger: deps.logger,
84
+ },
85
+ }));
86
+ }
87
+ // Mount dev UI routes when dev token is available
88
+ if (deps.devToken) {
89
+ app.route("/ui", uiRoute({ devToken: deps.devToken }));
90
+ if (deps.configPath) {
91
+ app.route("/ui/api", uiConfigRoutes({
92
+ devToken: deps.devToken,
93
+ configPath: deps.configPath,
94
+ }));
95
+ }
96
+ }
97
+ // Global error handler
98
+ app.onError((err, c) => {
99
+ if (err instanceof ProtocolError) {
100
+ deps.logger.warn({ err }, err.message);
101
+ return c.json(err.toJSON(), err.code);
102
+ }
103
+ deps.logger.error({ err }, "Unhandled error");
104
+ return c.json({
105
+ error: {
106
+ code: 500,
107
+ errorCode: "INTERNAL_ERROR",
108
+ message: "Internal server error",
109
+ },
110
+ }, 500);
111
+ });
112
+ // 404 fallback
113
+ app.notFound((c) => {
114
+ return c.json({
115
+ error: {
116
+ code: 404,
117
+ errorCode: "NOT_FOUND",
118
+ message: "Not found",
119
+ },
120
+ }, 404);
121
+ });
122
+ return app;
123
+ }
124
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { ServerConfig } from "@opendatalabs/personal-server-ts-core/schemas";
2
+ import { type Logger } from "@opendatalabs/personal-server-ts-core/logger";
3
+ import { type IndexManager } from "@opendatalabs/personal-server-ts-core/storage/index";
4
+ import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
5
+ import type { AccessLogReader } from "@opendatalabs/personal-server-ts-core/logging/access-reader";
6
+ import type { ServerAccount } from "@opendatalabs/personal-server-ts-core/keys";
7
+ import type { ServerSigner } from "@opendatalabs/personal-server-ts-core/signing";
8
+ import { type SyncManager } from "@opendatalabs/personal-server-ts-core/sync";
9
+ import type { Hono } from "hono";
10
+ import { TunnelManager } from "./tunnel/index.js";
11
+ export interface ServerContext {
12
+ app: Hono;
13
+ logger: Logger;
14
+ config: ServerConfig;
15
+ startedAt: Date;
16
+ indexManager: IndexManager;
17
+ gatewayClient: GatewayClient;
18
+ accessLogReader: AccessLogReader;
19
+ serverAccount?: ServerAccount;
20
+ serverSigner?: ServerSigner;
21
+ syncManager: SyncManager | null;
22
+ tunnelManager?: TunnelManager;
23
+ tunnelUrl?: string;
24
+ devToken?: string;
25
+ startBackgroundServices: () => Promise<void>;
26
+ cleanup: () => Promise<void>;
27
+ }
28
+ export interface CreateServerOptions {
29
+ rootPath?: string;
30
+ /** @deprecated Use rootPath instead. */
31
+ serverDir?: string;
32
+ dataDir?: string;
33
+ }
34
+ export declare function createServer(config: ServerConfig, options?: CreateServerOptions): Promise<ServerContext>;
35
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAKlF,OAAO,EAEL,KAAK,MAAM,EACZ,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,qDAAqD,CAAC;AAG7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAGnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAC;AAMnG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAKhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,EAAE,aAAa,EAAoB,MAAM,mBAAmB,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uBAAuB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,aAAa,CAAC,CA6QxB"}
@@ -0,0 +1,232 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import { createRequire } from "node:module";
3
+ import { randomUUID } from "node:crypto";
4
+ import { join } from "node:path";
5
+ const require = createRequire(import.meta.url);
6
+ const pkg = require("../package.json");
7
+ import { DEFAULT_ROOT_PATH, resolveRootPath, } from "@opendatalabs/personal-server-ts-core/config";
8
+ import { createLogger, } from "@opendatalabs/personal-server-ts-core/logger";
9
+ import { initializeDatabase, createIndexManager, } from "@opendatalabs/personal-server-ts-core/storage/index";
10
+ import { createGatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
11
+ import { createAccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
12
+ import { createAccessLogReader } from "@opendatalabs/personal-server-ts-core/logging/access-reader";
13
+ import { deriveMasterKey, recoverServerOwner, loadOrCreateServerAccount, } from "@opendatalabs/personal-server-ts-core/keys";
14
+ import { createServerSigner, createRequestSigner, } from "@opendatalabs/personal-server-ts-core/signing";
15
+ import { createSyncCursor, createSyncManager, } from "@opendatalabs/personal-server-ts-core/sync";
16
+ import { createVanaStorageAdapter } from "@opendatalabs/personal-server-ts-core/storage/adapters";
17
+ import { createApp } from "./app.js";
18
+ import { generateDevToken } from "./dev-token.js";
19
+ import { TunnelManager, ensureFrpcBinary } from "./tunnel/index.js";
20
+ export async function createServer(config, options) {
21
+ const logger = createLogger(config.logging);
22
+ const startedAt = new Date();
23
+ const storageRoot = resolveRootPath(options?.rootPath ?? options?.serverDir ?? DEFAULT_ROOT_PATH);
24
+ const dataDir = options?.dataDir ?? join(storageRoot, "data");
25
+ const indexPath = join(storageRoot, "index.db");
26
+ const configPath = join(storageRoot, "config.json");
27
+ await mkdir(storageRoot, { recursive: true });
28
+ await mkdir(dataDir, { recursive: true });
29
+ const db = initializeDatabase(indexPath);
30
+ const indexManager = createIndexManager(db);
31
+ const hierarchyOptions = { dataDir };
32
+ const gatewayClient = createGatewayClient(config.gateway.url);
33
+ // Derive server owner from VANA_MASTER_KEY_SIGNATURE env var
34
+ const masterKeySignature = process.env.VANA_MASTER_KEY_SIGNATURE;
35
+ let serverOwner;
36
+ let serverAccount;
37
+ let serverSigner;
38
+ let identity;
39
+ if (masterKeySignature) {
40
+ serverOwner = await recoverServerOwner(masterKeySignature);
41
+ deriveMasterKey(masterKeySignature); // validate signature format
42
+ logger.info({ owner: serverOwner }, "Server owner derived from master key");
43
+ // Load or create server keypair from disk
44
+ const keyPath = join(storageRoot, "key.json");
45
+ serverAccount = loadOrCreateServerAccount(keyPath);
46
+ logger.info({ owner: serverOwner, serverAddress: serverAccount.address }, "Server signing account loaded");
47
+ serverSigner = createServerSigner(serverAccount, {
48
+ chainId: config.gateway.chainId,
49
+ contracts: config.gateway.contracts,
50
+ });
51
+ // Identity starts with serverId=null; background services will populate it
52
+ identity = {
53
+ address: serverAccount.address,
54
+ publicKey: serverAccount.publicKey,
55
+ serverId: null,
56
+ };
57
+ }
58
+ else {
59
+ logger.warn("VANA_MASTER_KEY_SIGNATURE not set — owner-restricted endpoints will return 500");
60
+ }
61
+ // Download frpc binary eagerly (auth-independent) so it's ready when the user signs in
62
+ let frpcBinaryPath = "";
63
+ if (config.tunnel.enabled) {
64
+ try {
65
+ frpcBinaryPath = await ensureFrpcBinary(storageRoot, {
66
+ log: (msg) => logger.info(msg),
67
+ });
68
+ }
69
+ catch (err) {
70
+ logger.warn({ err }, "Failed to download frpc binary - tunnel disabled");
71
+ }
72
+ }
73
+ // --- Sync engine setup ---
74
+ let syncManager = null;
75
+ if (config.sync.enabled &&
76
+ masterKeySignature &&
77
+ serverOwner &&
78
+ serverAccount &&
79
+ serverSigner) {
80
+ const masterKey = deriveMasterKey(masterKeySignature);
81
+ const vanaConfig = config.storage.config.vana ?? {
82
+ apiUrl: "https://storage.vana.com",
83
+ };
84
+ const requestSigner = createRequestSigner(serverAccount);
85
+ const storageAdapter = createVanaStorageAdapter({
86
+ apiUrl: vanaConfig.apiUrl,
87
+ ownerAddress: serverOwner,
88
+ signer: requestSigner,
89
+ });
90
+ const cursor = createSyncCursor(configPath);
91
+ const uploadDeps = {
92
+ indexManager,
93
+ hierarchyOptions,
94
+ storageAdapter,
95
+ gateway: gatewayClient,
96
+ signer: serverSigner,
97
+ masterKey,
98
+ serverOwner,
99
+ logger,
100
+ };
101
+ const downloadDeps = {
102
+ indexManager,
103
+ hierarchyOptions,
104
+ storageAdapter,
105
+ gateway: gatewayClient,
106
+ cursor,
107
+ masterKey,
108
+ serverOwner,
109
+ logger,
110
+ };
111
+ syncManager = createSyncManager(uploadDeps, downloadDeps);
112
+ syncManager.start();
113
+ logger.info("Sync engine started");
114
+ }
115
+ else if (config.sync.enabled) {
116
+ logger.warn("Sync enabled in config but VANA_MASTER_KEY_SIGNATURE not set — sync disabled");
117
+ }
118
+ const logsDir = join(storageRoot, "logs");
119
+ await mkdir(logsDir, { recursive: true });
120
+ const accessLogWriter = createAccessLogWriter(logsDir);
121
+ const accessLogReader = createAccessLogReader(logsDir);
122
+ // Generate ephemeral dev token when devUi is enabled
123
+ const devToken = config.devUi.enabled ? generateDevToken() : undefined;
124
+ // Mutable origin — starts with config value, updated when tunnel connects
125
+ let effectiveOrigin = config.server.origin;
126
+ // Mutable tunnelManager — set when tunnel starts in background
127
+ let tunnelManager;
128
+ const app = createApp({
129
+ logger,
130
+ version: pkg.version,
131
+ startedAt,
132
+ indexManager,
133
+ hierarchyOptions,
134
+ serverOrigin: () => effectiveOrigin,
135
+ serverOwner,
136
+ identity,
137
+ gateway: gatewayClient,
138
+ accessLogWriter,
139
+ accessLogReader,
140
+ devToken,
141
+ configPath,
142
+ syncManager,
143
+ serverSigner,
144
+ getTunnelStatus: () => tunnelManager?.getStatus() ?? null,
145
+ });
146
+ const cleanup = async () => {
147
+ if (tunnelManager) {
148
+ await tunnelManager.stop();
149
+ }
150
+ if (syncManager) {
151
+ await syncManager.stop();
152
+ }
153
+ indexManager.close();
154
+ };
155
+ const context = {
156
+ app,
157
+ logger,
158
+ config,
159
+ startedAt,
160
+ indexManager,
161
+ gatewayClient,
162
+ accessLogReader,
163
+ serverAccount,
164
+ serverSigner,
165
+ syncManager,
166
+ tunnelManager,
167
+ tunnelUrl: undefined,
168
+ devToken,
169
+ startBackgroundServices: async () => {
170
+ // --- Gateway registration check (slow: HTTP call) ---
171
+ if (serverAccount && identity) {
172
+ try {
173
+ const serverInfo = await gatewayClient.getServer(serverAccount.address);
174
+ identity.serverId = serverInfo?.id ?? null;
175
+ }
176
+ catch {
177
+ // Gateway unreachable — assume not registered
178
+ }
179
+ if (identity.serverId) {
180
+ logger.info("Server registered with gateway — signing delegation active");
181
+ }
182
+ else {
183
+ logger.warn({
184
+ serverAddress: serverAccount.address,
185
+ publicKey: serverAccount.publicKey,
186
+ }, "Server not registered. Register personal server with the gateway to enable delegation.");
187
+ }
188
+ }
189
+ // --- Tunnel setup (slow: subprocess wait) ---
190
+ if (config.tunnel.enabled &&
191
+ serverOwner &&
192
+ serverAccount &&
193
+ frpcBinaryPath) {
194
+ tunnelManager = new TunnelManager(storageRoot);
195
+ context.tunnelManager = tunnelManager;
196
+ const runId = randomUUID();
197
+ try {
198
+ const url = await tunnelManager.start({
199
+ walletAddress: serverAccount.address,
200
+ ownerAddress: serverOwner,
201
+ serverKeypair: serverAccount,
202
+ runId,
203
+ serverAddr: config.tunnel.serverAddr,
204
+ serverPort: config.tunnel.serverPort,
205
+ localPort: config.server.port,
206
+ }, frpcBinaryPath);
207
+ logger.info({ tunnelUrl: url }, "Tunnel established");
208
+ context.tunnelUrl = url;
209
+ effectiveOrigin = url;
210
+ if (!identity?.serverId) {
211
+ logger.warn("Tunnel started but server is not registered with gateway — tunnel will not route traffic. Run: npm run register-server");
212
+ tunnelManager.setVerified(false, "Server not registered with gateway");
213
+ }
214
+ }
215
+ catch (err) {
216
+ logger.warn({ err }, "Tunnel failed to connect - server running in local-only mode");
217
+ tunnelManager = undefined;
218
+ context.tunnelManager = undefined;
219
+ }
220
+ }
221
+ else if (config.tunnel.enabled && !frpcBinaryPath) {
222
+ logger.warn("frpc binary not available — tunnel disabled");
223
+ }
224
+ else if (config.tunnel.enabled) {
225
+ logger.warn("Tunnel enabled in config but VANA_MASTER_KEY_SIGNATURE not set — tunnel disabled");
226
+ }
227
+ },
228
+ cleanup,
229
+ };
230
+ return context;
231
+ }
232
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,OAAO,EACL,iBAAiB,EACjB,eAAe,GAChB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,YAAY,GAEb,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,qDAAqD,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0DAA0D,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AAEpG,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,+CAA+C,CAAC;AAEvD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wDAAwD,CAAC;AAElG,OAAO,EAAE,SAAS,EAAqB,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AA2BpE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAoB,EACpB,OAA6B;IAE7B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAE7B,MAAM,WAAW,GAAG,eAAe,CACjC,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,SAAS,IAAI,iBAAiB,CAC7D,CAAC;IACF,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAEpD,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,EAAE,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC5C,MAAM,gBAAgB,GAA4B,EAAE,OAAO,EAAE,CAAC;IAE9D,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE9D,6DAA6D;IAC7D,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,yBAE1B,CAAC;IACd,IAAI,WAAsC,CAAC;IAE3C,IAAI,aAAwC,CAAC;IAC7C,IAAI,YAAsC,CAAC;IAC3C,IAAI,QAAkC,CAAC;IAEvC,IAAI,kBAAkB,EAAE,CAAC;QACvB,WAAW,GAAG,MAAM,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,4BAA4B;QACjE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,sCAAsC,CAAC,CAAC;QAE5E,0CAA0C;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC9C,aAAa,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CACT,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,EAC5D,+BAA+B,CAChC,CAAC;QAEF,YAAY,GAAG,kBAAkB,CAAC,aAAa,EAAE;YAC/C,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;YAC/B,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;SACpC,CAAC,CAAC;QAEH,2EAA2E;QAC3E,QAAQ,GAAG;YACT,OAAO,EAAE,aAAa,CAAC,OAAO;YAC9B,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CACT,gFAAgF,CACjF,CAAC;IACJ,CAAC;IAED,uFAAuF;IACvF,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,cAAc,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE;gBACnD,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;aAC/B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,kDAAkD,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,WAAW,GAAuB,IAAI,CAAC;IAE3C,IACE,MAAM,CAAC,IAAI,CAAC,OAAO;QACnB,kBAAkB;QAClB,WAAW;QACX,aAAa;QACb,YAAY,EACZ,CAAC;QACD,MAAM,SAAS,GAAG,eAAe,CAAC,kBAAkB,CAAC,CAAC;QAEtD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI;YAC/C,MAAM,EAAE,0BAA0B;SACnC,CAAC;QACF,MAAM,aAAa,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,cAAc,GAAG,wBAAwB,CAAC;YAC9C,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,YAAY,EAAE,WAAW;YACzB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAE5C,MAAM,UAAU,GAAG;YACjB,YAAY;YACZ,gBAAgB;YAChB,cAAc;YACd,OAAO,EAAE,aAAa;YACtB,MAAM,EAAE,YAAY;YACpB,SAAS;YACT,WAAW;YACX,MAAM;SACP,CAAC;QAEF,MAAM,YAAY,GAAG;YACnB,YAAY;YACZ,gBAAgB;YAChB,cAAc;YACd,OAAO,EAAE,aAAa;YACtB,MAAM;YACN,SAAS;YACT,WAAW;YACX,MAAM;SACP,CAAC;QAEF,WAAW,GAAG,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC1D,WAAW,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CACT,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEvD,qDAAqD;IACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvE,0EAA0E;IAC1E,IAAI,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IAE3C,+DAA+D;IAC/D,IAAI,aAAwC,CAAC;IAE7C,MAAM,GAAG,GAAG,SAAS,CAAC;QACpB,MAAM;QACN,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS;QACT,YAAY;QACZ,gBAAgB;QAChB,YAAY,EAAE,GAAG,EAAE,CAAC,eAAe;QACnC,WAAW;QACX,QAAQ;QACR,OAAO,EAAE,aAAa;QACtB,eAAe;QACf,eAAe;QACf,QAAQ;QACR,UAAU;QACV,WAAW;QACX,YAAY;QACZ,eAAe,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,IAAI;KAC1D,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QACD,YAAY,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAkB;QAC7B,GAAG;QACH,MAAM;QACN,MAAM;QACN,SAAS;QACT,YAAY;QACZ,aAAa;QACb,eAAe;QACf,aAAa;QACb,YAAY;QACZ,WAAW;QACX,aAAa;QACb,SAAS,EAAE,SAAS;QACpB,QAAQ;QACR,uBAAuB,EAAE,KAAK,IAAI,EAAE;YAClC,uDAAuD;YACvD,IAAI,aAAa,IAAI,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,SAAS,CAC9C,aAAa,CAAC,OAAO,CACtB,CAAC;oBACF,QAAQ,CAAC,QAAQ,GAAG,UAAU,EAAE,EAAE,IAAI,IAAI,CAAC;gBAC7C,CAAC;gBAAC,MAAM,CAAC;oBACP,8CAA8C;gBAChD,CAAC;gBAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACtB,MAAM,CAAC,IAAI,CACT,4DAA4D,CAC7D,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CACT;wBACE,aAAa,EAAE,aAAa,CAAC,OAAO;wBACpC,SAAS,EAAE,aAAa,CAAC,SAAS;qBACnC,EACD,wFAAwF,CACzF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,+CAA+C;YAC/C,IACE,MAAM,CAAC,MAAM,CAAC,OAAO;gBACrB,WAAW;gBACX,aAAa;gBACb,cAAc,EACd,CAAC;gBACD,aAAa,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;gBAC/C,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;gBAEtC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;gBAE3B,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CACnC;wBACE,aAAa,EAAE,aAAa,CAAC,OAAO;wBACpC,YAAY,EAAE,WAAW;wBACzB,aAAa,EAAE,aAAa;wBAC5B,KAAK;wBACL,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;wBACpC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;wBACpC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;qBAC9B,EACD,cAAc,CACf,CAAC;oBACF,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC;oBACtD,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC;oBACxB,eAAe,GAAG,GAAG,CAAC;oBAEtB,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;wBACxB,MAAM,CAAC,IAAI,CACT,wHAAwH,CACzH,CAAC;wBACF,aAAa,CAAC,WAAW,CACvB,KAAK,EACL,oCAAoC,CACrC,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CACT,EAAE,GAAG,EAAE,EACP,8DAA8D,CAC/D,CAAC;oBACF,aAAa,GAAG,SAAS,CAAC;oBAC1B,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;gBACpC,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpD,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC7D,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CACT,kFAAkF,CACnF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO;KACR,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Generates a random 32-byte hex string for use as an ephemeral dev token.
3
+ * This token is generated once at startup and lives only in memory.
4
+ */
5
+ export declare function generateDevToken(): string;
6
+ //# sourceMappingURL=dev-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-token.d.ts","sourceRoot":"","sources":["../src/dev-token.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
@@ -0,0 +1,9 @@
1
+ import { randomBytes } from "node:crypto";
2
+ /**
3
+ * Generates a random 32-byte hex string for use as an ephemeral dev token.
4
+ * This token is generated once at startup and lives only in memory.
5
+ */
6
+ export function generateDevToken() {
7
+ return randomBytes(32).toString("hex");
8
+ }
9
+ //# sourceMappingURL=dev-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-token.js","sourceRoot":"","sources":["../src/dev-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,60 @@
1
+ import { serve } from "@hono/node-server";
2
+ import { createRequire } from "node:module";
3
+ import { loadConfig } from "@opendatalabs/personal-server-ts-core/config";
4
+ import { createServer } from "./bootstrap.js";
5
+ import { verifyTunnelUrl } from "./tunnel/index.js";
6
+ const require = createRequire(import.meta.url);
7
+ const pkg = require("../package.json");
8
+ const DRAIN_TIMEOUT_MS = 5_000;
9
+ async function main() {
10
+ const rootPath = process.env.PERSONAL_SERVER_ROOT_PATH;
11
+ const config = await loadConfig({ rootPath });
12
+ const context = await createServer(config, { rootPath });
13
+ const { app, logger, devToken } = context;
14
+ const server = serve({ fetch: app.fetch, port: config.server.port }, (info) => {
15
+ logger.info({ port: info.port, version: pkg.version }, "Server started");
16
+ if (devToken) {
17
+ logger.info({ url: `http://localhost:${info.port}/ui` }, "Dev UI available");
18
+ logger.info({ devToken }, "Dev token (ephemeral)");
19
+ }
20
+ });
21
+ // Fire-and-forget: gateway check + tunnel connect (slow operations)
22
+ // HTTP server is already listening so POST /v1/data/:scope works immediately
23
+ context.startBackgroundServices().then(() => {
24
+ // Verify tunnel URL is reachable now that both HTTP server and tunnel are up
25
+ const { tunnelManager, tunnelUrl } = context;
26
+ if (tunnelUrl &&
27
+ tunnelManager &&
28
+ tunnelManager.getStatus().status !== "error") {
29
+ logger.info({ tunnelUrl }, "Verifying tunnel URL is reachable...");
30
+ verifyTunnelUrl(tunnelUrl).then((result) => {
31
+ tunnelManager.setVerified(result.reachable, result.error);
32
+ if (result.reachable) {
33
+ logger.info({ tunnelUrl, attempts: result.attempts }, "Tunnel URL verified");
34
+ }
35
+ else {
36
+ logger.warn({ tunnelUrl, attempts: result.attempts, error: result.error }, "Tunnel URL not reachable — server running in local-only mode");
37
+ }
38
+ });
39
+ }
40
+ });
41
+ function shutdown(signal) {
42
+ logger.info({ signal }, "Shutdown signal received, draining connections");
43
+ server.close(() => {
44
+ logger.info("Server stopped");
45
+ process.exit(0);
46
+ });
47
+ // Force exit after drain timeout
48
+ setTimeout(() => {
49
+ logger.warn("Drain timeout exceeded, forcing exit");
50
+ process.exit(1);
51
+ }, DRAIN_TIMEOUT_MS).unref();
52
+ }
53
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
54
+ process.on("SIGINT", () => shutdown("SIGINT"));
55
+ }
56
+ main().catch((err) => {
57
+ console.error("Failed to start server:", err);
58
+ process.exit(1);
59
+ });
60
+ //# 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,8 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ import type { AccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
3
+ /**
4
+ * Logs builder data access AFTER successful response (2xx).
5
+ * Fire-and-forget: write failures don't affect response.
6
+ */
7
+ export declare function createAccessLogMiddleware(writer: AccessLogWriter): MiddlewareHandler;
8
+ //# sourceMappingURL=access-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-log.d.ts","sourceRoot":"","sources":["../../src/middleware/access-log.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAIhG;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,GACtB,iBAAiB,CAoCnB"}
@@ -0,0 +1,38 @@
1
+ import { randomUUID } from "node:crypto";
2
+ /**
3
+ * Logs builder data access AFTER successful response (2xx).
4
+ * Fire-and-forget: write failures don't affect response.
5
+ */
6
+ export function createAccessLogMiddleware(writer) {
7
+ return async (c, next) => {
8
+ await next();
9
+ // Only log on 2xx responses
10
+ if (c.res.status < 200 || c.res.status >= 300) {
11
+ return;
12
+ }
13
+ const auth = c.get("auth");
14
+ const grant = c.get("grant");
15
+ if (!auth || !grant) {
16
+ return;
17
+ }
18
+ const scope = c.req.param("scope") ?? "unknown";
19
+ try {
20
+ await writer.write({
21
+ logId: randomUUID(),
22
+ grantId: grant.id,
23
+ builder: auth.signer,
24
+ action: "read",
25
+ scope,
26
+ timestamp: new Date().toISOString(),
27
+ ipAddress: c.req.header("x-forwarded-for") ??
28
+ c.req.header("x-real-ip") ??
29
+ "unknown",
30
+ userAgent: c.req.header("user-agent") ?? "unknown",
31
+ });
32
+ }
33
+ catch {
34
+ // Fire-and-forget: write failures don't affect response
35
+ }
36
+ };
37
+ }
38
+ //# sourceMappingURL=access-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-log.js","sourceRoot":"","sources":["../../src/middleware/access-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMzC;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAuB;IAEvB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,IAAI,EAAE,CAAC;QAEb,4BAA4B;QAC5B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAA6B,CAAC;QACvD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAqC,CAAC;QAEjE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC;gBACjB,KAAK,EAAE,UAAU,EAAE;gBACnB,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,OAAO,EAAE,IAAI,CAAC,MAAM;gBACpB,MAAM,EAAE,MAAM;gBACd,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,SAAS,EACP,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC;oBAC/B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;oBACzB,SAAS;gBACX,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,SAAS;aACnD,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ /** 50 MB — max body size for data ingest routes */
3
+ export declare const DATA_INGEST_MAX_SIZE: number;
4
+ /** 1 MB — default max body size for general routes */
5
+ export declare const DEFAULT_MAX_SIZE: number;
6
+ /**
7
+ * Creates a Hono body-limit middleware that returns 413 JSON on overflow.
8
+ */
9
+ export declare function createBodyLimit(maxSize: number): MiddlewareHandler;
10
+ //# sourceMappingURL=body-limit.d.ts.map