@opendatalabs/personal-server-ts-server 0.0.1-canary.196d89e → 0.0.1-canary.1c2d4c2
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/dist/app.d.ts +6 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +13 -1
- package/dist/app.js.map +1 -1
- package/dist/bootstrap.d.ts +8 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +126 -11
- package/dist/bootstrap.js.map +1 -1
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/dist/routes/data.d.ts +2 -0
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +8 -2
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/grants.d.ts +3 -2
- package/dist/routes/grants.d.ts.map +1 -1
- package/dist/routes/grants.js +88 -2
- package/dist/routes/grants.js.map +1 -1
- package/dist/routes/health.d.ts +2 -0
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +2 -0
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/sync.d.ts +4 -2
- package/dist/routes/sync.d.ts.map +1 -1
- package/dist/routes/sync.js +24 -10
- package/dist/routes/sync.js.map +1 -1
- package/dist/tunnel/auth.d.ts +46 -0
- package/dist/tunnel/auth.d.ts.map +1 -0
- package/dist/tunnel/auth.js +46 -0
- package/dist/tunnel/auth.js.map +1 -0
- package/dist/tunnel/binary.d.ts +57 -0
- package/dist/tunnel/binary.d.ts.map +1 -0
- package/dist/tunnel/binary.js +180 -0
- package/dist/tunnel/binary.js.map +1 -0
- package/dist/tunnel/config.d.ts +27 -0
- package/dist/tunnel/config.d.ts.map +1 -0
- package/dist/tunnel/config.js +38 -0
- package/dist/tunnel/config.js.map +1 -0
- package/dist/tunnel/index.d.ts +13 -0
- package/dist/tunnel/index.d.ts.map +1 -0
- package/dist/tunnel/index.js +9 -0
- package/dist/tunnel/index.js.map +1 -0
- package/dist/tunnel/manager.d.ts +88 -0
- package/dist/tunnel/manager.d.ts.map +1 -0
- package/dist/tunnel/manager.js +279 -0
- package/dist/tunnel/manager.js.map +1 -0
- package/dist/tunnel/verify.d.ts +28 -0
- package/dist/tunnel/verify.d.ts.map +1 -0
- package/dist/tunnel/verify.js +40 -0
- package/dist/tunnel/verify.js.map +1 -0
- package/package.json +2 -2
package/dist/app.d.ts
CHANGED
|
@@ -4,6 +4,9 @@ import type { HierarchyManagerOptions } from "@opendatalabs/personal-server-ts-c
|
|
|
4
4
|
import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
|
|
5
5
|
import type { AccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
|
|
6
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";
|
|
7
10
|
import type { Logger } from "pino";
|
|
8
11
|
export interface IdentityInfo {
|
|
9
12
|
address: `0x${string}`;
|
|
@@ -24,6 +27,9 @@ export interface AppDeps {
|
|
|
24
27
|
accessLogReader: AccessLogReader;
|
|
25
28
|
devToken?: string;
|
|
26
29
|
configPath?: string;
|
|
30
|
+
syncManager?: SyncManager | null;
|
|
31
|
+
serverSigner?: ServerSigner;
|
|
32
|
+
getTunnelStatus?: HealthDeps["getTunnelStatus"];
|
|
27
33
|
}
|
|
28
34
|
export declare function createApp(deps: AppDeps): Hono;
|
|
29
35
|
//# sourceMappingURL=app.d.ts.map
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
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;AAOlE,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,CAAC;IACrB,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,CAmI7C"}
|
package/dist/app.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
|
+
import { cors } from "hono/cors";
|
|
2
3
|
import { ProtocolError } from "@opendatalabs/personal-server-ts-core/errors";
|
|
3
4
|
import { healthRoute } from "./routes/health.js";
|
|
4
5
|
import { dataRoutes } from "./routes/data.js";
|
|
@@ -9,6 +10,13 @@ import { uiConfigRoutes } from "./routes/ui-config.js";
|
|
|
9
10
|
import { uiRoute } from "./routes/ui.js";
|
|
10
11
|
export function createApp(deps) {
|
|
11
12
|
const app = new Hono();
|
|
13
|
+
// CORS — allow all origins for browser-based clients
|
|
14
|
+
app.use("*", cors({
|
|
15
|
+
origin: "*",
|
|
16
|
+
allowHeaders: ["Content-Type", "Authorization"],
|
|
17
|
+
allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
|
|
18
|
+
maxAge: 86400,
|
|
19
|
+
}));
|
|
12
20
|
// Mount health route
|
|
13
21
|
app.route("/", healthRoute({
|
|
14
22
|
version: deps.version,
|
|
@@ -17,6 +25,7 @@ export function createApp(deps) {
|
|
|
17
25
|
identity: deps.identity,
|
|
18
26
|
gateway: deps.gateway,
|
|
19
27
|
logger: deps.logger,
|
|
28
|
+
getTunnelStatus: deps.getTunnelStatus,
|
|
20
29
|
}));
|
|
21
30
|
// Mount data routes (ingest + read + delete)
|
|
22
31
|
app.route("/v1/data", dataRoutes({
|
|
@@ -28,14 +37,16 @@ export function createApp(deps) {
|
|
|
28
37
|
gateway: deps.gateway,
|
|
29
38
|
accessLogWriter: deps.accessLogWriter,
|
|
30
39
|
devToken: deps.devToken,
|
|
40
|
+
syncManager: deps.syncManager ?? null,
|
|
31
41
|
}));
|
|
32
|
-
// Mount grants routes (POST /verify is public, GET /
|
|
42
|
+
// Mount grants routes (POST /verify is public, GET / and POST / need owner auth)
|
|
33
43
|
app.route("/v1/grants", grantsRoutes({
|
|
34
44
|
logger: deps.logger,
|
|
35
45
|
gateway: deps.gateway,
|
|
36
46
|
serverOwner: deps.serverOwner,
|
|
37
47
|
serverOrigin: deps.serverOrigin,
|
|
38
48
|
devToken: deps.devToken,
|
|
49
|
+
serverSigner: deps.serverSigner,
|
|
39
50
|
}));
|
|
40
51
|
// Mount access-logs routes (all owner auth)
|
|
41
52
|
app.route("/v1/access-logs", accessLogsRoutes({
|
|
@@ -51,6 +62,7 @@ export function createApp(deps) {
|
|
|
51
62
|
serverOrigin: deps.serverOrigin,
|
|
52
63
|
serverOwner: deps.serverOwner,
|
|
53
64
|
devToken: deps.devToken,
|
|
65
|
+
syncManager: deps.syncManager ?? null,
|
|
54
66
|
}));
|
|
55
67
|
// Mount dev UI routes when dev token is available
|
|
56
68
|
if (deps.devToken) {
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAM7E,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/bootstrap.d.ts
CHANGED
|
@@ -5,7 +5,9 @@ import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gatewa
|
|
|
5
5
|
import type { AccessLogReader } from "@opendatalabs/personal-server-ts-core/logging/access-reader";
|
|
6
6
|
import type { ServerAccount } from "@opendatalabs/personal-server-ts-core/keys";
|
|
7
7
|
import type { ServerSigner } from "@opendatalabs/personal-server-ts-core/signing";
|
|
8
|
+
import { type SyncManager } from "@opendatalabs/personal-server-ts-core/sync";
|
|
8
9
|
import type { Hono } from "hono";
|
|
10
|
+
import { TunnelManager } from "./tunnel/index.js";
|
|
9
11
|
export interface ServerContext {
|
|
10
12
|
app: Hono;
|
|
11
13
|
logger: Logger;
|
|
@@ -16,10 +18,15 @@ export interface ServerContext {
|
|
|
16
18
|
accessLogReader: AccessLogReader;
|
|
17
19
|
serverAccount?: ServerAccount;
|
|
18
20
|
serverSigner?: ServerSigner;
|
|
21
|
+
syncManager: SyncManager | null;
|
|
22
|
+
tunnelManager?: TunnelManager;
|
|
23
|
+
tunnelUrl?: string;
|
|
19
24
|
devToken?: string;
|
|
20
|
-
cleanup: () => void
|
|
25
|
+
cleanup: () => Promise<void>;
|
|
21
26
|
}
|
|
22
27
|
export interface CreateServerOptions {
|
|
28
|
+
rootPath?: string;
|
|
29
|
+
/** @deprecated Use rootPath instead. */
|
|
23
30
|
serverDir?: string;
|
|
24
31
|
dataDir?: string;
|
|
25
32
|
}
|
package/dist/bootstrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAGA,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,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,CAiQxB"}
|
package/dist/bootstrap.js
CHANGED
|
@@ -1,26 +1,33 @@
|
|
|
1
|
+
import { mkdir } from "node:fs/promises";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
1
3
|
import { join } from "node:path";
|
|
2
|
-
import {
|
|
4
|
+
import { DEFAULT_ROOT_PATH, resolveRootPath, } from "@opendatalabs/personal-server-ts-core/config";
|
|
3
5
|
import { createLogger, } from "@opendatalabs/personal-server-ts-core/logger";
|
|
4
6
|
import { initializeDatabase, createIndexManager, } from "@opendatalabs/personal-server-ts-core/storage/index";
|
|
5
7
|
import { createGatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
|
|
6
8
|
import { createAccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
|
|
7
9
|
import { createAccessLogReader } from "@opendatalabs/personal-server-ts-core/logging/access-reader";
|
|
8
10
|
import { deriveMasterKey, recoverServerOwner, loadOrCreateServerAccount, } from "@opendatalabs/personal-server-ts-core/keys";
|
|
9
|
-
import { createServerSigner } from "@opendatalabs/personal-server-ts-core/signing";
|
|
11
|
+
import { createServerSigner, createRequestSigner, } from "@opendatalabs/personal-server-ts-core/signing";
|
|
12
|
+
import { createSyncCursor, createSyncManager, } from "@opendatalabs/personal-server-ts-core/sync";
|
|
13
|
+
import { createVanaStorageAdapter } from "@opendatalabs/personal-server-ts-core/storage/adapters";
|
|
10
14
|
import { createApp } from "./app.js";
|
|
11
15
|
import { generateDevToken } from "./dev-token.js";
|
|
16
|
+
import { TunnelManager, ensureFrpcBinary } from "./tunnel/index.js";
|
|
12
17
|
export async function createServer(config, options) {
|
|
13
18
|
const logger = createLogger(config.logging);
|
|
14
19
|
const startedAt = new Date();
|
|
15
|
-
const
|
|
16
|
-
const dataDir = options?.dataDir ??
|
|
17
|
-
const indexPath = join(
|
|
18
|
-
const configPath = join(
|
|
20
|
+
const storageRoot = resolveRootPath(options?.rootPath ?? options?.serverDir ?? DEFAULT_ROOT_PATH);
|
|
21
|
+
const dataDir = options?.dataDir ?? join(storageRoot, "data");
|
|
22
|
+
const indexPath = join(storageRoot, "index.db");
|
|
23
|
+
const configPath = join(storageRoot, "config.json");
|
|
24
|
+
await mkdir(storageRoot, { recursive: true });
|
|
25
|
+
await mkdir(dataDir, { recursive: true });
|
|
19
26
|
const db = initializeDatabase(indexPath);
|
|
20
27
|
const indexManager = createIndexManager(db);
|
|
21
28
|
const hierarchyOptions = { dataDir };
|
|
22
29
|
const gatewayClient = createGatewayClient(config.gateway.url);
|
|
23
|
-
const
|
|
30
|
+
const _serverOrigin = config.server.origin;
|
|
24
31
|
// Derive server owner from VANA_MASTER_KEY_SIGNATURE env var
|
|
25
32
|
const masterKeySignature = process.env.VANA_MASTER_KEY_SIGNATURE;
|
|
26
33
|
let serverOwner;
|
|
@@ -32,7 +39,7 @@ export async function createServer(config, options) {
|
|
|
32
39
|
deriveMasterKey(masterKeySignature); // validate signature format
|
|
33
40
|
logger.info({ owner: serverOwner }, "Server owner derived from master key");
|
|
34
41
|
// Load or create server keypair from disk
|
|
35
|
-
const keyPath = join(
|
|
42
|
+
const keyPath = join(storageRoot, "key.json");
|
|
36
43
|
serverAccount = loadOrCreateServerAccount(keyPath);
|
|
37
44
|
logger.info({ owner: serverOwner, serverAddress: serverAccount.address }, "Server signing account loaded");
|
|
38
45
|
serverSigner = createServerSigner(serverAccount, {
|
|
@@ -66,7 +73,101 @@ export async function createServer(config, options) {
|
|
|
66
73
|
else {
|
|
67
74
|
logger.warn("VANA_MASTER_KEY_SIGNATURE not set — owner-restricted endpoints will return 500");
|
|
68
75
|
}
|
|
69
|
-
|
|
76
|
+
// --- Tunnel setup ---
|
|
77
|
+
// Tunnel starts FIRST to get public URL for Gateway registration
|
|
78
|
+
let tunnelManager;
|
|
79
|
+
let tunnelUrl;
|
|
80
|
+
let effectiveOrigin = config.server.origin; // Start with config.server.origin
|
|
81
|
+
if (config.tunnel.enabled && serverOwner && serverAccount) {
|
|
82
|
+
// Ensure frpc binary is available (downloads on first run or version bump)
|
|
83
|
+
let frpcBinaryPath;
|
|
84
|
+
try {
|
|
85
|
+
frpcBinaryPath = await ensureFrpcBinary(storageRoot, {
|
|
86
|
+
log: (msg) => logger.info(msg),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
logger.warn({ err }, "Failed to download frpc binary - tunnel disabled");
|
|
91
|
+
frpcBinaryPath = "";
|
|
92
|
+
}
|
|
93
|
+
if (frpcBinaryPath) {
|
|
94
|
+
tunnelManager = new TunnelManager(storageRoot);
|
|
95
|
+
// Generate unique run ID for this process/session (used for claim binding)
|
|
96
|
+
const runId = randomUUID();
|
|
97
|
+
try {
|
|
98
|
+
tunnelUrl = await tunnelManager.start({
|
|
99
|
+
walletAddress: serverAccount.address, // Use server's own keypair address
|
|
100
|
+
ownerAddress: serverOwner,
|
|
101
|
+
serverKeypair: serverAccount,
|
|
102
|
+
runId,
|
|
103
|
+
serverAddr: config.tunnel.serverAddr,
|
|
104
|
+
serverPort: config.tunnel.serverPort,
|
|
105
|
+
localPort: config.server.port,
|
|
106
|
+
}, frpcBinaryPath);
|
|
107
|
+
logger.info({ tunnelUrl }, "Tunnel established");
|
|
108
|
+
if (!identity?.serverId) {
|
|
109
|
+
logger.warn("Tunnel started but server is not registered with gateway — tunnel will not route traffic. Run: npm run register-server");
|
|
110
|
+
tunnelManager.setVerified(false, "Server not registered with gateway");
|
|
111
|
+
}
|
|
112
|
+
// Use tunnel URL as effective origin for requests and Gateway registration
|
|
113
|
+
effectiveOrigin = tunnelUrl;
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
logger.warn({ err }, "Tunnel failed to connect - server running in local-only mode");
|
|
117
|
+
tunnelManager = undefined;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else if (config.tunnel.enabled) {
|
|
122
|
+
logger.warn("Tunnel enabled in config but VANA_MASTER_KEY_SIGNATURE not set — tunnel disabled");
|
|
123
|
+
}
|
|
124
|
+
// --- Sync engine setup ---
|
|
125
|
+
let syncManager = null;
|
|
126
|
+
if (config.sync.enabled &&
|
|
127
|
+
masterKeySignature &&
|
|
128
|
+
serverOwner &&
|
|
129
|
+
serverAccount &&
|
|
130
|
+
serverSigner) {
|
|
131
|
+
const masterKey = deriveMasterKey(masterKeySignature);
|
|
132
|
+
const vanaConfig = config.storage.config.vana ?? {
|
|
133
|
+
apiUrl: "https://storage.vana.com",
|
|
134
|
+
};
|
|
135
|
+
const requestSigner = createRequestSigner(serverAccount);
|
|
136
|
+
const storageAdapter = createVanaStorageAdapter({
|
|
137
|
+
apiUrl: vanaConfig.apiUrl,
|
|
138
|
+
ownerAddress: serverOwner,
|
|
139
|
+
signer: requestSigner,
|
|
140
|
+
});
|
|
141
|
+
const cursor = createSyncCursor(configPath);
|
|
142
|
+
const uploadDeps = {
|
|
143
|
+
indexManager,
|
|
144
|
+
hierarchyOptions,
|
|
145
|
+
storageAdapter,
|
|
146
|
+
gateway: gatewayClient,
|
|
147
|
+
signer: serverSigner,
|
|
148
|
+
masterKey,
|
|
149
|
+
serverOwner,
|
|
150
|
+
logger,
|
|
151
|
+
};
|
|
152
|
+
const downloadDeps = {
|
|
153
|
+
indexManager,
|
|
154
|
+
hierarchyOptions,
|
|
155
|
+
storageAdapter,
|
|
156
|
+
gateway: gatewayClient,
|
|
157
|
+
cursor,
|
|
158
|
+
masterKey,
|
|
159
|
+
serverOwner,
|
|
160
|
+
logger,
|
|
161
|
+
};
|
|
162
|
+
syncManager = createSyncManager(uploadDeps, downloadDeps);
|
|
163
|
+
syncManager.start();
|
|
164
|
+
logger.info("Sync engine started");
|
|
165
|
+
}
|
|
166
|
+
else if (config.sync.enabled) {
|
|
167
|
+
logger.warn("Sync enabled in config but VANA_MASTER_KEY_SIGNATURE not set — sync disabled");
|
|
168
|
+
}
|
|
169
|
+
const logsDir = join(storageRoot, "logs");
|
|
170
|
+
await mkdir(logsDir, { recursive: true });
|
|
70
171
|
const accessLogWriter = createAccessLogWriter(logsDir);
|
|
71
172
|
const accessLogReader = createAccessLogReader(logsDir);
|
|
72
173
|
// Generate ephemeral dev token when devUi is enabled
|
|
@@ -77,7 +178,7 @@ export async function createServer(config, options) {
|
|
|
77
178
|
startedAt,
|
|
78
179
|
indexManager,
|
|
79
180
|
hierarchyOptions,
|
|
80
|
-
serverOrigin,
|
|
181
|
+
serverOrigin: effectiveOrigin,
|
|
81
182
|
serverOwner,
|
|
82
183
|
identity,
|
|
83
184
|
gateway: gatewayClient,
|
|
@@ -85,8 +186,19 @@ export async function createServer(config, options) {
|
|
|
85
186
|
accessLogReader,
|
|
86
187
|
devToken,
|
|
87
188
|
configPath,
|
|
189
|
+
syncManager,
|
|
190
|
+
serverSigner,
|
|
191
|
+
getTunnelStatus: tunnelManager
|
|
192
|
+
? () => tunnelManager.getStatus()
|
|
193
|
+
: undefined,
|
|
88
194
|
});
|
|
89
|
-
const cleanup = () => {
|
|
195
|
+
const cleanup = async () => {
|
|
196
|
+
if (tunnelManager) {
|
|
197
|
+
await tunnelManager.stop();
|
|
198
|
+
}
|
|
199
|
+
if (syncManager) {
|
|
200
|
+
await syncManager.stop();
|
|
201
|
+
}
|
|
90
202
|
indexManager.close();
|
|
91
203
|
};
|
|
92
204
|
return {
|
|
@@ -99,6 +211,9 @@ export async function createServer(config, options) {
|
|
|
99
211
|
accessLogReader,
|
|
100
212
|
serverAccount,
|
|
101
213
|
serverSigner,
|
|
214
|
+
syncManager,
|
|
215
|
+
tunnelManager,
|
|
216
|
+
tunnelUrl,
|
|
102
217
|
devToken,
|
|
103
218
|
cleanup,
|
|
104
219
|
};
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,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;AA0BpE,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,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IAE3C,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,gEAAgE;QAChE,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACxE,QAAQ,GAAG,UAAU,EAAE,EAAE,IAAI,IAAI,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CACT;gBACE,aAAa,EAAE,aAAa,CAAC,OAAO;gBACpC,SAAS,EAAE,aAAa,CAAC,SAAS;aACnC,EACD,wFAAwF,CACzF,CAAC;QACJ,CAAC;QAED,QAAQ,GAAG;YACT,OAAO,EAAE,aAAa,CAAC,OAAO;YAC9B,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,QAAQ;SACT,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CACT,gFAAgF,CACjF,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,iEAAiE;IACjE,IAAI,aAAwC,CAAC;IAC7C,IAAI,SAA6B,CAAC;IAClC,IAAI,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,kCAAkC;IAE9E,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,WAAW,IAAI,aAAa,EAAE,CAAC;QAC1D,2EAA2E;QAC3E,IAAI,cAAsB,CAAC;QAC3B,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;YACzE,cAAc,GAAG,EAAE,CAAC;QACtB,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,aAAa,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;YAE/C,2EAA2E;YAC3E,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;YAE3B,IAAI,CAAC;gBACH,SAAS,GAAG,MAAM,aAAa,CAAC,KAAK,CACnC;oBACE,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,mCAAmC;oBACzE,YAAY,EAAE,WAAW;oBACzB,aAAa,EAAE,aAAa;oBAC5B,KAAK;oBACL,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;oBACpC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;oBACpC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;iBAC9B,EACD,cAAc,CACf,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,oBAAoB,CAAC,CAAC;gBAEjD,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CACT,wHAAwH,CACzH,CAAC;oBACF,aAAa,CAAC,WAAW,CACvB,KAAK,EACL,oCAAoC,CACrC,CAAC;gBACJ,CAAC;gBAED,2EAA2E;gBAC3E,eAAe,GAAG,SAAS,CAAC;YAC9B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CACT,EAAE,GAAG,EAAE,EACP,8DAA8D,CAC/D,CAAC;gBACF,aAAa,GAAG,SAAS,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CACT,kFAAkF,CACnF,CAAC;IACJ,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,MAAM,GAAG,GAAG,SAAS,CAAC;QACpB,MAAM;QACN,OAAO,EAAE,OAAO;QAChB,SAAS;QACT,YAAY;QACZ,gBAAgB;QAChB,YAAY,EAAE,eAAe;QAC7B,WAAW;QACX,QAAQ;QACR,OAAO,EAAE,aAAa;QACtB,eAAe;QACf,eAAe;QACf,QAAQ;QACR,UAAU;QACV,WAAW;QACX,YAAY;QACZ,eAAe,EAAE,aAAa;YAC5B,CAAC,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE;YACjC,CAAC,CAAC,SAAS;KACd,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,OAAO;QACL,GAAG;QACH,MAAM;QACN,MAAM;QACN,SAAS;QACT,YAAY;QACZ,aAAa;QACb,eAAe;QACf,aAAa;QACb,YAAY;QACZ,WAAW;QACX,aAAa;QACb,SAAS;QACT,QAAQ;QACR,OAAO;KACR,CAAC;AACJ,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,36 @@
|
|
|
1
1
|
import { serve } from "@hono/node-server";
|
|
2
2
|
import { loadConfig } from "@opendatalabs/personal-server-ts-core/config";
|
|
3
3
|
import { createServer } from "./bootstrap.js";
|
|
4
|
+
import { verifyTunnelUrl } from "./tunnel/index.js";
|
|
4
5
|
const DRAIN_TIMEOUT_MS = 5_000;
|
|
5
6
|
async function main() {
|
|
6
|
-
const
|
|
7
|
-
const
|
|
7
|
+
const rootPath = process.env.PERSONAL_SERVER_ROOT_PATH;
|
|
8
|
+
const config = await loadConfig({ rootPath });
|
|
9
|
+
const { app, logger, devToken, tunnelUrl, tunnelManager } = await createServer(config, {
|
|
10
|
+
rootPath,
|
|
11
|
+
});
|
|
8
12
|
const server = serve({ fetch: app.fetch, port: config.server.port }, (info) => {
|
|
9
13
|
logger.info({ port: info.port, version: "0.0.1" }, "Server started");
|
|
10
14
|
if (devToken) {
|
|
11
15
|
logger.info({ url: `http://localhost:${info.port}/ui` }, "Dev UI available");
|
|
12
16
|
logger.info({ devToken }, "Dev token (ephemeral)");
|
|
13
17
|
}
|
|
18
|
+
// Verify tunnel URL is reachable now that the HTTP server is listening
|
|
19
|
+
// Skip if already in error state (e.g. server not registered)
|
|
20
|
+
if (tunnelUrl &&
|
|
21
|
+
tunnelManager &&
|
|
22
|
+
tunnelManager.getStatus().status !== "error") {
|
|
23
|
+
logger.info({ tunnelUrl }, "Verifying tunnel URL is reachable...");
|
|
24
|
+
verifyTunnelUrl(tunnelUrl).then((result) => {
|
|
25
|
+
tunnelManager.setVerified(result.reachable, result.error);
|
|
26
|
+
if (result.reachable) {
|
|
27
|
+
logger.info({ tunnelUrl, attempts: result.attempts }, "Tunnel URL verified");
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
logger.warn({ tunnelUrl, attempts: result.attempts, error: result.error }, "Tunnel URL not reachable — server running in local-only mode");
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
14
34
|
});
|
|
15
35
|
function shutdown(signal) {
|
|
16
36
|
logger.info({ signal }, "Shutdown signal received, draining connections");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,GACvD,MAAM,YAAY,CAAC,MAAM,EAAE;QACzB,QAAQ;KACT,CAAC,CAAC;IAEL,MAAM,MAAM,GAAG,KAAK,CAClB,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAC9C,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAErE,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,EAAE,GAAG,EAAE,oBAAoB,IAAI,CAAC,IAAI,KAAK,EAAE,EAC3C,kBAAkB,CACnB,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACrD,CAAC;QAED,uEAAuE;QACvE,8DAA8D;QAC9D,IACE,SAAS;YACT,aAAa;YACb,aAAa,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,OAAO,EAC5C,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,sCAAsC,CAAC,CAAC;YACnE,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACzC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EACxC,qBAAqB,CACtB,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAC7D,8DAA8D,CAC/D,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;IAEF,SAAS,QAAQ,CAAC,MAAc;QAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,gDAAgD,CAAC,CAAC;QAE1E,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;YAChB,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/routes/data.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { HierarchyManagerOptions } from "@opendatalabs/personal-server-ts-c
|
|
|
3
3
|
import type { IndexManager } from "@opendatalabs/personal-server-ts-core/storage/index";
|
|
4
4
|
import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
|
|
5
5
|
import type { AccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
|
|
6
|
+
import type { SyncManager } from "@opendatalabs/personal-server-ts-core/sync";
|
|
6
7
|
import type { Logger } from "pino";
|
|
7
8
|
export interface DataRouteDeps {
|
|
8
9
|
indexManager: IndexManager;
|
|
@@ -12,6 +13,7 @@ export interface DataRouteDeps {
|
|
|
12
13
|
serverOwner?: `0x${string}`;
|
|
13
14
|
gateway: GatewayClient;
|
|
14
15
|
accessLogWriter: AccessLogWriter;
|
|
16
|
+
syncManager?: SyncManager | null;
|
|
15
17
|
devToken?: string;
|
|
16
18
|
}
|
|
17
19
|
export declare function dataRoutes(deps: DataRouteDeps): Hono;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAS5B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AACvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAWnC,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAS5B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AACvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAWnC,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAoRpD"}
|
package/dist/routes/data.js
CHANGED
|
@@ -177,8 +177,14 @@ export function dataRoutes(deps) {
|
|
|
177
177
|
sizeBytes: writeResult.sizeBytes,
|
|
178
178
|
});
|
|
179
179
|
deps.logger.info({ scope, collectedAt, path: writeResult.relativePath }, "Data file ingested");
|
|
180
|
-
// 8.
|
|
181
|
-
|
|
180
|
+
// 8. Notify sync manager of new data (if enabled)
|
|
181
|
+
let status = "stored";
|
|
182
|
+
if (deps.syncManager) {
|
|
183
|
+
deps.syncManager.notifyNewData();
|
|
184
|
+
status = "syncing";
|
|
185
|
+
}
|
|
186
|
+
// 9. Return 201
|
|
187
|
+
return c.json({ scope, collectedAt, status }, 201);
|
|
182
188
|
});
|
|
183
189
|
// Owner-check middleware (web3-auth + owner-check)
|
|
184
190
|
const ownerCheck = createOwnerCheckMiddleware(deps.serverOwner);
|
package/dist/routes/data.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,8CAA8C,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yDAAyD,CAAC;AACjG,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,iBAAiB,GAClB,MAAM,yDAAyD,CAAC;
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/grants.d.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Grants routes — POST /verify (public
|
|
3
|
-
* Verifies EIP-712 grant signatures locally without network calls.
|
|
2
|
+
* Grants routes — GET / (owner), POST / (create grant), POST /verify (public).
|
|
4
3
|
*/
|
|
5
4
|
import { Hono } from "hono";
|
|
6
5
|
import type { Logger } from "pino";
|
|
7
6
|
import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
|
|
7
|
+
import type { ServerSigner } from "@opendatalabs/personal-server-ts-core/signing";
|
|
8
8
|
export interface GrantsRouteDeps {
|
|
9
9
|
logger: Logger;
|
|
10
10
|
gateway: GatewayClient;
|
|
11
11
|
serverOwner?: `0x${string}`;
|
|
12
12
|
serverOrigin: string;
|
|
13
13
|
devToken?: string;
|
|
14
|
+
serverSigner?: ServerSigner;
|
|
14
15
|
}
|
|
15
16
|
export declare function grantsRoutes(deps: GrantsRouteDeps): Hono;
|
|
16
17
|
//# sourceMappingURL=grants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/routes/grants.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/routes/grants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAKnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAIlF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAoED,wBAAgB,YAAY,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAwMxD"}
|
package/dist/routes/grants.js
CHANGED
|
@@ -1,12 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Grants routes — POST /verify (public
|
|
3
|
-
* Verifies EIP-712 grant signatures locally without network calls.
|
|
2
|
+
* Grants routes — GET / (owner), POST / (create grant), POST /verify (public).
|
|
4
3
|
*/
|
|
5
4
|
import { Hono } from "hono";
|
|
6
5
|
import { verifyTypedData } from "viem";
|
|
7
6
|
import { GRANT_DOMAIN, GRANT_TYPES, } from "@opendatalabs/personal-server-ts-core/grants";
|
|
8
7
|
import { createWeb3AuthMiddleware } from "../middleware/web3-auth.js";
|
|
9
8
|
import { createOwnerCheckMiddleware } from "../middleware/owner-check.js";
|
|
9
|
+
function isValidCreateBody(body) {
|
|
10
|
+
if (body === null || typeof body !== "object" || Array.isArray(body))
|
|
11
|
+
return false;
|
|
12
|
+
const b = body;
|
|
13
|
+
if (typeof b.granteeAddress !== "string" ||
|
|
14
|
+
!b.granteeAddress.startsWith("0x"))
|
|
15
|
+
return false;
|
|
16
|
+
if (!Array.isArray(b.scopes) || b.scopes.length === 0)
|
|
17
|
+
return false;
|
|
18
|
+
if (!b.scopes.every((s) => typeof s === "string"))
|
|
19
|
+
return false;
|
|
20
|
+
if (b.expiresAt !== undefined && typeof b.expiresAt !== "number")
|
|
21
|
+
return false;
|
|
22
|
+
if (b.nonce !== undefined && typeof b.nonce !== "number")
|
|
23
|
+
return false;
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
10
26
|
function isValidVerifyBody(body) {
|
|
11
27
|
if (body === null || typeof body !== "object" || Array.isArray(body))
|
|
12
28
|
return false;
|
|
@@ -56,6 +72,76 @@ export function grantsRoutes(deps) {
|
|
|
56
72
|
const grants = await deps.gateway.listGrantsByUser(deps.serverOwner);
|
|
57
73
|
return c.json({ grants });
|
|
58
74
|
});
|
|
75
|
+
// POST / — create a grant (owner-only, called by Desktop App)
|
|
76
|
+
app.post("/", web3Auth, ownerCheck, async (c) => {
|
|
77
|
+
if (!deps.serverOwner) {
|
|
78
|
+
return c.json({
|
|
79
|
+
error: {
|
|
80
|
+
code: 500,
|
|
81
|
+
errorCode: "SERVER_NOT_CONFIGURED",
|
|
82
|
+
message: "Server owner address not configured. Set VANA_MASTER_KEY_SIGNATURE environment variable.",
|
|
83
|
+
},
|
|
84
|
+
}, 500);
|
|
85
|
+
}
|
|
86
|
+
if (!deps.serverSigner) {
|
|
87
|
+
return c.json({
|
|
88
|
+
error: {
|
|
89
|
+
code: 500,
|
|
90
|
+
errorCode: "SERVER_SIGNER_NOT_CONFIGURED",
|
|
91
|
+
message: "Server signer not configured. Set VANA_MASTER_KEY_SIGNATURE environment variable.",
|
|
92
|
+
},
|
|
93
|
+
}, 500);
|
|
94
|
+
}
|
|
95
|
+
let body;
|
|
96
|
+
try {
|
|
97
|
+
body = await c.req.json();
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return c.json({ error: "INVALID_BODY", message: "Invalid JSON body" }, 400);
|
|
101
|
+
}
|
|
102
|
+
if (!isValidCreateBody(body)) {
|
|
103
|
+
return c.json({
|
|
104
|
+
error: "INVALID_BODY",
|
|
105
|
+
message: "Body must include granteeAddress (0x string) and scopes (non-empty string array)",
|
|
106
|
+
}, 400);
|
|
107
|
+
}
|
|
108
|
+
const { granteeAddress, scopes, expiresAt, nonce } = body;
|
|
109
|
+
// Look up builder to get their on-chain ID
|
|
110
|
+
const builder = await deps.gateway.getBuilder(granteeAddress);
|
|
111
|
+
if (!builder) {
|
|
112
|
+
return c.json({
|
|
113
|
+
error: {
|
|
114
|
+
code: 404,
|
|
115
|
+
errorCode: "BUILDER_NOT_REGISTERED",
|
|
116
|
+
message: `Builder ${granteeAddress} is not registered on-chain`,
|
|
117
|
+
},
|
|
118
|
+
}, 404);
|
|
119
|
+
}
|
|
120
|
+
// Build the grant payload JSON string
|
|
121
|
+
const grantPayload = JSON.stringify({
|
|
122
|
+
user: deps.serverOwner,
|
|
123
|
+
builder: granteeAddress,
|
|
124
|
+
scopes,
|
|
125
|
+
expiresAt: expiresAt ?? 0,
|
|
126
|
+
nonce: nonce ?? Date.now(),
|
|
127
|
+
});
|
|
128
|
+
// Sign EIP-712 GrantRegistration
|
|
129
|
+
const signature = await deps.serverSigner.signGrantRegistration({
|
|
130
|
+
grantorAddress: deps.serverOwner,
|
|
131
|
+
granteeId: builder.id,
|
|
132
|
+
grant: grantPayload,
|
|
133
|
+
fileIds: [],
|
|
134
|
+
});
|
|
135
|
+
// Submit to Gateway
|
|
136
|
+
const result = await deps.gateway.createGrant({
|
|
137
|
+
grantorAddress: deps.serverOwner,
|
|
138
|
+
granteeId: builder.id,
|
|
139
|
+
grant: grantPayload,
|
|
140
|
+
fileIds: [],
|
|
141
|
+
signature,
|
|
142
|
+
});
|
|
143
|
+
return c.json({ grantId: result.grantId }, 201);
|
|
144
|
+
});
|
|
59
145
|
// POST /verify — public endpoint, no auth required
|
|
60
146
|
app.post("/verify", async (c) => {
|
|
61
147
|
let body;
|