vana-cli 0.26.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +28 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/server-start.d.ts +14 -1
- package/dist/cli/server-start.d.ts.map +1 -1
- package/dist/cli/server-start.js +207 -5
- package/dist/cli/server-start.js.map +1 -1
- package/dist/personal-server/local/config.d.ts +5 -0
- package/dist/personal-server/local/config.d.ts.map +1 -1
- package/dist/personal-server/local/config.js +4 -2
- package/dist/personal-server/local/config.js.map +1 -1
- package/dist/personal-server/local/detach.d.ts +29 -0
- package/dist/personal-server/local/detach.d.ts.map +1 -0
- package/dist/personal-server/local/detach.js +134 -0
- package/dist/personal-server/local/detach.js.map +1 -0
- package/dist/personal-server/local/frpc.d.ts +59 -0
- package/dist/personal-server/local/frpc.d.ts.map +1 -0
- package/dist/personal-server/local/frpc.js +191 -0
- package/dist/personal-server/local/frpc.js.map +1 -0
- package/dist/personal-server/local/owner-binding.d.ts +22 -2
- package/dist/personal-server/local/owner-binding.d.ts.map +1 -1
- package/dist/personal-server/local/owner-binding.js +23 -14
- package/dist/personal-server/local/owner-binding.js.map +1 -1
- package/dist/personal-server/local/registration.d.ts +42 -0
- package/dist/personal-server/local/registration.d.ts.map +1 -0
- package/dist/personal-server/local/registration.js +81 -0
- package/dist/personal-server/local/registration.js.map +1 -0
- package/dist/personal-server/local/runtime-pkg/entry.mjs +138 -20
- package/dist/personal-server/local/server.d.ts +25 -0
- package/dist/personal-server/local/server.d.ts.map +1 -1
- package/dist/personal-server/local/server.js +80 -4
- package/dist/personal-server/local/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,7 +2,10 @@ import type { VanaNetworkName } from "../core/network.js";
|
|
|
2
2
|
import { type ResolvedNode } from "../pdpp/host.js";
|
|
3
3
|
import { runOwnerBindingExchange } from "../personal-server/local/owner-binding.js";
|
|
4
4
|
import { type OwnerSecretStore } from "../personal-server/local/owner-secret.js";
|
|
5
|
-
import { startLocalServer, type LocalServerHandle, type RunningServer } from "../personal-server/local/server.js";
|
|
5
|
+
import { startLocalServer, type LocalServerHandle, type PublicMarker, type RunningServer } from "../personal-server/local/server.js";
|
|
6
|
+
import { startDetachedServer } from "../personal-server/local/detach.js";
|
|
7
|
+
import { type FrpcResolution } from "../personal-server/local/frpc.js";
|
|
8
|
+
import { signServerRegistration } from "../personal-server/local/registration.js";
|
|
6
9
|
import { type VanaCredentials } from "./auth.js";
|
|
7
10
|
export interface ServerStartIo {
|
|
8
11
|
/** A line for a person; silent in --json mode. */
|
|
@@ -25,6 +28,12 @@ export interface ServerStartDeps {
|
|
|
25
28
|
ensureRuntime: (node: ResolvedNode, logPath: string) => Promise<string>;
|
|
26
29
|
choosePort: (requested?: number) => Promise<number | null>;
|
|
27
30
|
start: typeof startLocalServer;
|
|
31
|
+
resolveFrpc: () => Promise<FrpcResolution>;
|
|
32
|
+
installFrpc: (logPath: string) => Promise<string>;
|
|
33
|
+
signRegistration: typeof signServerRegistration;
|
|
34
|
+
readPublicMarker: (network: VanaNetworkName) => PublicMarker | null;
|
|
35
|
+
writePublicMarker: (network: VanaNetworkName, marker: PublicMarker) => Promise<void>;
|
|
36
|
+
startDetached: typeof startDetachedServer;
|
|
28
37
|
/** Resolves when the person asks the server to stop (Ctrl+C). */
|
|
29
38
|
waitForStop: (handle: LocalServerHandle) => Promise<"stopped" | "exited">;
|
|
30
39
|
}
|
|
@@ -38,5 +47,9 @@ export declare function runServerStart(options: {
|
|
|
38
47
|
port?: number;
|
|
39
48
|
noInput?: boolean;
|
|
40
49
|
yes?: boolean;
|
|
50
|
+
/** Stay local: no tunnel, no registration, nothing apps can reach. */
|
|
51
|
+
local?: boolean;
|
|
52
|
+
/** Start in the background and return once it answers. */
|
|
53
|
+
detach?: boolean;
|
|
41
54
|
}, io: ServerStartIo, deps?: ServerStartDeps): Promise<number>;
|
|
42
55
|
//# sourceMappingURL=server-start.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-start.d.ts","sourceRoot":"","sources":["../../src/cli/server-start.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EACL,uBAAuB,EAExB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,0CAA0C,CAAC;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"server-start.d.ts","sourceRoot":"","sources":["../../src/cli/server-start.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/server-start.js
CHANGED
|
@@ -5,7 +5,10 @@ import { canInstallNodeFor, findCompatibleNode, installManagedNode, } from "../p
|
|
|
5
5
|
import { isRuntimeInstalled, ensureRuntime, } from "../personal-server/local/runtime.js";
|
|
6
6
|
import { runOwnerBindingExchange, } from "../personal-server/local/owner-binding.js";
|
|
7
7
|
import { defaultOwnerSecretStore, ownerSecretKey, } from "../personal-server/local/owner-secret.js";
|
|
8
|
-
import { choosePort, findRunningServers, startLocalServer, } from "../personal-server/local/server.js";
|
|
8
|
+
import { choosePort, findRunningServers, nextMessage, readPublicMarker, startLocalServer, writePublicMarker, } from "../personal-server/local/server.js";
|
|
9
|
+
import { startDetachedServer, } from "../personal-server/local/detach.js";
|
|
10
|
+
import { installFrpc, resolveFrpc, } from "../personal-server/local/frpc.js";
|
|
11
|
+
import { RegistrationNeedsBrowserError, signServerRegistration, } from "../personal-server/local/registration.js";
|
|
9
12
|
import { getAccountUrl, isExpired, loadCredentials, openBrowser, saveCredentials, } from "./auth.js";
|
|
10
13
|
/** The server release needs the same Node range as the published connectors. */
|
|
11
14
|
const NODE_RANGE = ">=24.15.0 <25";
|
|
@@ -23,6 +26,12 @@ export function defaultServerStartDeps() {
|
|
|
23
26
|
ensureRuntime: (node, logPath) => ensureRuntime(node, logPath),
|
|
24
27
|
choosePort,
|
|
25
28
|
start: startLocalServer,
|
|
29
|
+
resolveFrpc: () => resolveFrpc(),
|
|
30
|
+
installFrpc: (logPath) => installFrpc(logPath),
|
|
31
|
+
signRegistration: signServerRegistration,
|
|
32
|
+
readPublicMarker,
|
|
33
|
+
writePublicMarker,
|
|
34
|
+
startDetached: startDetachedServer,
|
|
26
35
|
waitForStop: (handle) => new Promise((resolve) => {
|
|
27
36
|
// Stay subscribed until the process ends: a second Ctrl+C while the
|
|
28
37
|
// server shuts down must not kill the CLI before it cleans up.
|
|
@@ -100,13 +109,31 @@ export async function runServerStart(options, io, deps = defaultServerStartDeps(
|
|
|
100
109
|
}
|
|
101
110
|
deps.secrets.set(secretKey, binding);
|
|
102
111
|
}
|
|
103
|
-
//
|
|
112
|
+
// Public unless asked to stay local, as Desktop's server is. A registered
|
|
113
|
+
// server started --local stays registered, and apps find it offline.
|
|
114
|
+
const marker = deps.readPublicMarker(options.network);
|
|
115
|
+
let frpc = null;
|
|
116
|
+
if (options.local) {
|
|
117
|
+
if (marker) {
|
|
118
|
+
io.say("This server is registered; while it runs local only, apps find it offline.");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
frpc = await deps.resolveFrpc();
|
|
123
|
+
if (frpc.kind === "unavailable") {
|
|
124
|
+
io.say(`${frpc.reason} The server starts local only.`);
|
|
125
|
+
io.event({ type: "server-tunnel-unavailable", reason: frpc.reason });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// One-time installs: Node 24, the pinned server, the tunnel client.
|
|
104
129
|
let node = await deps.findNode(NODE_RANGE);
|
|
105
130
|
const runtimeReady = deps.runtimeInstalled();
|
|
106
|
-
|
|
131
|
+
const frpcNeeded = frpc?.kind === "installable";
|
|
132
|
+
if (!node || !runtimeReady || frpcNeeded) {
|
|
107
133
|
const needs = [
|
|
108
134
|
...(node ? [] : ["Node.js 24, which the server runs on"]),
|
|
109
135
|
...(runtimeReady ? [] : ["the Personal Server itself (~175 MB)"]),
|
|
136
|
+
...(frpcNeeded ? ["the tunnel client, frpc (~15 MB)"] : []),
|
|
110
137
|
];
|
|
111
138
|
if (options.noInput && !options.yes) {
|
|
112
139
|
io.say(`The first start installs ${needs.join(" and ")}. Run without --no-input, or add --yes.`);
|
|
@@ -130,6 +157,21 @@ export async function runServerStart(options, io, deps = defaultServerStartDeps(
|
|
|
130
157
|
if (!runtimeReady)
|
|
131
158
|
io.say("Installing the Personal Server (one time)...");
|
|
132
159
|
const runtimeDir = await deps.ensureRuntime(node, logPath);
|
|
160
|
+
let frpcPath = frpc?.kind === "ready" ? frpc.path : null;
|
|
161
|
+
if (frpcNeeded) {
|
|
162
|
+
io.say("Installing the tunnel client (one time)...");
|
|
163
|
+
frpcPath = await deps.installFrpc(logPath);
|
|
164
|
+
}
|
|
165
|
+
// Everything that needed a person is done: the rest runs in the
|
|
166
|
+
// background, as a second `vana server start` that outlives this one.
|
|
167
|
+
if (options.detach) {
|
|
168
|
+
io.say("Starting in the background...");
|
|
169
|
+
return reportDetached(await deps.startDetached({
|
|
170
|
+
network: options.network,
|
|
171
|
+
port: options.port,
|
|
172
|
+
local: options.local,
|
|
173
|
+
}), io);
|
|
174
|
+
}
|
|
133
175
|
const port = await deps.choosePort(options.port);
|
|
134
176
|
if (!port) {
|
|
135
177
|
io.say(options.port
|
|
@@ -146,6 +188,7 @@ export async function runServerStart(options, io, deps = defaultServerStartDeps(
|
|
|
146
188
|
binding,
|
|
147
189
|
port,
|
|
148
190
|
logPath,
|
|
191
|
+
frpcPath,
|
|
149
192
|
});
|
|
150
193
|
}
|
|
151
194
|
catch (error) {
|
|
@@ -165,14 +208,32 @@ export async function runServerStart(options, io, deps = defaultServerStartDeps(
|
|
|
165
208
|
});
|
|
166
209
|
io.say(`Personal Server running at ${url}`);
|
|
167
210
|
io.say(`Owner ${binding.signerAddress}, network ${options.network}.`);
|
|
168
|
-
|
|
211
|
+
let registered = false;
|
|
212
|
+
let publicUrl = null;
|
|
213
|
+
if (frpcPath) {
|
|
214
|
+
const outcome = await goPublic(handle, {
|
|
215
|
+
...options,
|
|
216
|
+
accountUrl,
|
|
217
|
+
accessToken: account.session_token,
|
|
218
|
+
ownerAddress: account.address,
|
|
219
|
+
binding,
|
|
220
|
+
io,
|
|
221
|
+
deps,
|
|
222
|
+
});
|
|
223
|
+
registered = outcome.registered;
|
|
224
|
+
publicUrl = outcome.publicUrl;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
io.say("Local only: not registered and not reachable from other devices.");
|
|
228
|
+
}
|
|
169
229
|
io.say("Collect into it with `vana connect <source>`. Press Ctrl+C to stop.");
|
|
170
230
|
io.event({
|
|
171
231
|
type: "server-ready",
|
|
172
232
|
url,
|
|
173
233
|
owner: binding.signerAddress,
|
|
174
234
|
network: options.network,
|
|
175
|
-
registered
|
|
235
|
+
registered,
|
|
236
|
+
publicUrl,
|
|
176
237
|
logPath,
|
|
177
238
|
});
|
|
178
239
|
const reason = await deps.waitForStop(handle);
|
|
@@ -186,4 +247,145 @@ export async function runServerStart(options, io, deps = defaultServerStartDeps(
|
|
|
186
247
|
io.event({ type: "server-stopped" });
|
|
187
248
|
return CliExitCode.OK;
|
|
188
249
|
}
|
|
250
|
+
/**
|
|
251
|
+
* Bring a server with a tunnel client online for apps: register it when asked
|
|
252
|
+
* and not yet registered, then report the public URL once the relay answers.
|
|
253
|
+
* Nothing here stops the server; a failure leaves it running local only.
|
|
254
|
+
*/
|
|
255
|
+
async function goPublic(handle, input) {
|
|
256
|
+
const { io, deps } = input;
|
|
257
|
+
let state;
|
|
258
|
+
try {
|
|
259
|
+
// The server checks the gateway and reserves its URL before answering.
|
|
260
|
+
state = await nextMessage(handle, ["public"], 90_000);
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
io.say(error instanceof Error ? error.message : String(error));
|
|
264
|
+
return { registered: false, publicUrl: null };
|
|
265
|
+
}
|
|
266
|
+
const publicUrl = typeof state.serverUrl === "string" ? state.serverUrl : null;
|
|
267
|
+
const serverAddress = typeof state.serverAddress === "string" ? state.serverAddress : null;
|
|
268
|
+
// Report the tunnel whenever it settles; the command keeps running.
|
|
269
|
+
const unsubscribe = handle.onMessage((message) => {
|
|
270
|
+
if (message.type !== "tunnel")
|
|
271
|
+
return;
|
|
272
|
+
unsubscribe();
|
|
273
|
+
if (message.status === "connected") {
|
|
274
|
+
io.say(`Reachable by apps at ${String(message.url)}`);
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
io.say(`The public URL is not answering yet: ${String(message.warning ?? message.status)}`);
|
|
278
|
+
}
|
|
279
|
+
io.event({
|
|
280
|
+
type: "server-tunnel",
|
|
281
|
+
status: message.status,
|
|
282
|
+
url: message.url ?? null,
|
|
283
|
+
warning: message.warning ?? null,
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
if (state.registered === true) {
|
|
287
|
+
io.say(`Registered. Opening ${publicUrl ?? "the public URL"}...`);
|
|
288
|
+
return { registered: true, publicUrl };
|
|
289
|
+
}
|
|
290
|
+
if (!publicUrl || !serverAddress) {
|
|
291
|
+
io.say("The server did not reserve a public URL, so it stays local only.");
|
|
292
|
+
return { registered: false, publicUrl: null };
|
|
293
|
+
}
|
|
294
|
+
io.say(`Registering ${publicUrl} as your Personal Server. This is recorded on-chain and cannot be undone.`);
|
|
295
|
+
try {
|
|
296
|
+
handle.send({ type: "prepare-registration" });
|
|
297
|
+
const prepared = await nextMessage(handle, ["registration-request", "command-failed"], 30_000);
|
|
298
|
+
if (prepared.type === "command-failed") {
|
|
299
|
+
throw new Error(String(prepared.message));
|
|
300
|
+
}
|
|
301
|
+
const signed = await deps.signRegistration({
|
|
302
|
+
accountUrl: input.accountUrl,
|
|
303
|
+
accessToken: input.accessToken,
|
|
304
|
+
trustToken: input.binding.trustToken,
|
|
305
|
+
request: prepared.request,
|
|
306
|
+
allowBrowser: !input.noInput,
|
|
307
|
+
}, {
|
|
308
|
+
openBrowser: deps.openBrowser,
|
|
309
|
+
onConfirmationUrl: (url) => io.say(`Confirm the registration in your browser: ${url}`),
|
|
310
|
+
});
|
|
311
|
+
if (signed.signerAddress &&
|
|
312
|
+
signed.signerAddress.toLowerCase() !== input.ownerAddress.toLowerCase()) {
|
|
313
|
+
throw new Error(`The registration came back signed by ${signed.signerAddress}, not ${input.ownerAddress}. Nothing was submitted.`);
|
|
314
|
+
}
|
|
315
|
+
handle.send({ type: "submit-registration", signature: signed.signature });
|
|
316
|
+
const submitted = await nextMessage(handle, ["registration-submitted", "command-failed"], 60_000);
|
|
317
|
+
if (submitted.type === "command-failed") {
|
|
318
|
+
throw new Error(String(submitted.message));
|
|
319
|
+
}
|
|
320
|
+
await deps.writePublicMarker(input.network, {
|
|
321
|
+
serverAddress,
|
|
322
|
+
serverUrl: publicUrl,
|
|
323
|
+
registeredAt: new Date().toISOString(),
|
|
324
|
+
});
|
|
325
|
+
io.say(`Registered. Opening ${publicUrl}...`);
|
|
326
|
+
io.event({
|
|
327
|
+
type: "server-registered",
|
|
328
|
+
serverAddress,
|
|
329
|
+
serverUrl: publicUrl,
|
|
330
|
+
serverId: submitted.serverId ?? null,
|
|
331
|
+
signing: signed.via,
|
|
332
|
+
});
|
|
333
|
+
return { registered: true, publicUrl };
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
337
|
+
io.say(`Not registered: ${message} The server keeps running, local only.`);
|
|
338
|
+
io.event({
|
|
339
|
+
type: "server-registration-failed",
|
|
340
|
+
needsBrowser: error instanceof RegistrationNeedsBrowserError,
|
|
341
|
+
message,
|
|
342
|
+
});
|
|
343
|
+
return { registered: false, publicUrl: null };
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/** Say what the background server reported, and whether it came up. */
|
|
347
|
+
function reportDetached(start, io) {
|
|
348
|
+
for (const event of start.events) {
|
|
349
|
+
io.event(event);
|
|
350
|
+
const text = (key) => String(event[key] ?? "");
|
|
351
|
+
switch (event.type) {
|
|
352
|
+
case "server-ready":
|
|
353
|
+
io.say(`Personal Server running at ${text("url")}`);
|
|
354
|
+
io.say(`Owner ${text("owner")}, network ${text("network")}.`);
|
|
355
|
+
if (!event.publicUrl) {
|
|
356
|
+
io.say("Local only: not registered and not reachable from other devices.");
|
|
357
|
+
}
|
|
358
|
+
break;
|
|
359
|
+
case "server-registered":
|
|
360
|
+
io.say(`Registered ${text("serverUrl")}.`);
|
|
361
|
+
break;
|
|
362
|
+
case "server-tunnel":
|
|
363
|
+
io.say(event.status === "connected"
|
|
364
|
+
? `Reachable by apps at ${text("url")}`
|
|
365
|
+
: `The public URL is not answering yet: ${text("warning") || text("status")}`);
|
|
366
|
+
break;
|
|
367
|
+
case "server-registration-failed":
|
|
368
|
+
io.say(event.needsBrowser
|
|
369
|
+
? "Not registered: this account confirms registration in a browser. Run `vana server start` once in the foreground."
|
|
370
|
+
: `Not registered: ${text("message")}`);
|
|
371
|
+
break;
|
|
372
|
+
case "server-tunnel-unavailable":
|
|
373
|
+
io.say(`${text("reason")} The server runs local only.`);
|
|
374
|
+
break;
|
|
375
|
+
case "server-already-running":
|
|
376
|
+
io.say(`Your Personal Server is already running at ${text("url")}.`);
|
|
377
|
+
break;
|
|
378
|
+
default:
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
if (!start.ready) {
|
|
383
|
+
io.say(`The background server did not start. See ${start.logPath}.`);
|
|
384
|
+
return start.events.some((event) => event.type === "server-already-running")
|
|
385
|
+
? CliExitCode.OK
|
|
386
|
+
: CliExitCode.FAILURE;
|
|
387
|
+
}
|
|
388
|
+
io.say(`Running in the background (pid ${start.pid}). Stop it with \`vana server stop\`.`);
|
|
389
|
+
return CliExitCode.OK;
|
|
390
|
+
}
|
|
189
391
|
//# sourceMappingURL=server-start.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-start.js","sourceRoot":"","sources":["../../src/cli/server-start.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server-start.js","sourceRoot":"","sources":["../../src/cli/server-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,11 @@ export interface LocalServerNetwork {
|
|
|
6
6
|
gatewayUrl: string;
|
|
7
7
|
storageApiUrl: string;
|
|
8
8
|
contracts: Record<string, string>;
|
|
9
|
+
/** The relay frpc dials to give the server its public URL. */
|
|
10
|
+
tunnel: {
|
|
11
|
+
serverAddr: string;
|
|
12
|
+
serverPort: number;
|
|
13
|
+
};
|
|
9
14
|
}
|
|
10
15
|
export declare function localServerNetwork(name: VanaNetworkName): LocalServerNetwork;
|
|
11
16
|
/** The pinned server release, matching runtime-pkg/package.json. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/personal-server/local/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/personal-server/local/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,8DAA8D;IAC9D,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD;AAiCD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,kBAAkB,CAE5E;AAED,oEAAoE;AACpE,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAEhD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAEnE;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wFAAwF;AACxF,eAAO,MAAM,kBAAkB,6BAA8B,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { getVanaHome } from "../../core/paths.js";
|
|
3
|
-
// Same deployment on both chains. Mirrors the `contracts`
|
|
4
|
-
// Desktop's packages/app-runtime/src/personal-server/environments.json.
|
|
3
|
+
// Same deployment on both chains. Mirrors the `contracts` and tunnel entries
|
|
4
|
+
// of Vana Desktop's packages/app-runtime/src/personal-server/environments.json.
|
|
5
5
|
const CONTRACTS = {
|
|
6
6
|
dataPortabilityEscrow: "0x07d7769081adc3a3DBe91f5E4B98E9A5a6B292e3",
|
|
7
7
|
dataPortabilityGrantees: "0x8325C0A0948483EdA023A1A2Fd895e62C5131234",
|
|
@@ -18,6 +18,7 @@ const NETWORKS = {
|
|
|
18
18
|
gatewayUrl: "https://dp-rpc.moksha.vana.org",
|
|
19
19
|
storageApiUrl: "https://storage-dev.vana.org",
|
|
20
20
|
contracts: CONTRACTS,
|
|
21
|
+
tunnel: { serverAddr: "frpc.server-dev.vana.org", serverPort: 7000 },
|
|
21
22
|
},
|
|
22
23
|
mainnet: {
|
|
23
24
|
name: "mainnet",
|
|
@@ -25,6 +26,7 @@ const NETWORKS = {
|
|
|
25
26
|
gatewayUrl: "https://dp-rpc.vana.org",
|
|
26
27
|
storageApiUrl: "https://storage.vana.org",
|
|
27
28
|
contracts: CONTRACTS,
|
|
29
|
+
tunnel: { serverAddr: "frpc.server.vana.org", serverPort: 7000 },
|
|
28
30
|
},
|
|
29
31
|
};
|
|
30
32
|
export function localServerNetwork(name) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/personal-server/local/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/personal-server/local/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAclD,6EAA6E;AAC7E,gFAAgF;AAChF,MAAM,SAAS,GAA2B;IACxC,qBAAqB,EAAE,4CAA4C;IACnE,uBAAuB,EAAE,4CAA4C;IACrE,0BAA0B,EAAE,4CAA4C;IACxE,qBAAqB,EAAE,4CAA4C;IACnE,mBAAmB,EAAE,4CAA4C;IACjE,YAAY,EAAE,4CAA4C;IAC1D,WAAW,EAAE,4CAA4C;CAC1D,CAAC;AAEF,MAAM,QAAQ,GAAgD;IAC5D,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,gCAAgC;QAC5C,aAAa,EAAE,8BAA8B;QAC7C,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,EAAE,UAAU,EAAE,0BAA0B,EAAE,UAAU,EAAE,IAAI,EAAE;KACrE;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,yBAAyB;QACrC,aAAa,EAAE,0BAA0B;QACzC,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,EAAE,UAAU,EAAE,sBAAsB,EAAE,UAAU,EAAE,IAAI,EAAE;KACjE;CACF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAqB;IACtD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAEhD,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAwB;IACzD,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC;AAC1E,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { VanaNetworkName } from "../../core/network.js";
|
|
2
|
+
export interface DetachedStart {
|
|
3
|
+
/** Every event the background server wrote, in order. */
|
|
4
|
+
events: Array<Record<string, unknown>>;
|
|
5
|
+
ready: boolean;
|
|
6
|
+
pid: number | null;
|
|
7
|
+
logPath: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Run `vana server start` again as a background process that outlives this
|
|
11
|
+
* one, and wait until it answers: ready, and once registered, until its
|
|
12
|
+
* public URL answers too. It runs with --no-input, so everything that needs
|
|
13
|
+
* a person (login, owner confirmation, installs) must be done before.
|
|
14
|
+
*/
|
|
15
|
+
export declare function startDetachedServer(input: {
|
|
16
|
+
network: VanaNetworkName;
|
|
17
|
+
port?: number;
|
|
18
|
+
local?: boolean;
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
tunnelTimeoutMs?: number;
|
|
21
|
+
}): Promise<DetachedStart>;
|
|
22
|
+
/** The pid of a `vana server start` running from this network's data dir. */
|
|
23
|
+
export declare function runningServerPid(network: VanaNetworkName): number | null;
|
|
24
|
+
/**
|
|
25
|
+
* Stop the server `vana server start` runs for this network, detached or
|
|
26
|
+
* not, the way Ctrl+C does, and wait until it has cleaned up.
|
|
27
|
+
*/
|
|
28
|
+
export declare function stopLocalServer(network: VanaNetworkName, timeoutMs?: number): Promise<"stopped" | "not-running" | "timeout">;
|
|
29
|
+
//# sourceMappingURL=detach.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detach.d.ts","sourceRoot":"","sources":["../../../src/personal-server/local/detach.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAc7D,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAsBD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,OAAO,EAAE,eAAe,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAAC,aAAa,CAAC,CA0DzB;AAWD,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAcxE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,eAAe,EACxB,SAAS,SAAS,GACjB,OAAO,CAAC,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC,CAUhD"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import fsp from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { localServerDataDir } from "./config.js";
|
|
6
|
+
/** Events after which the background server will not become ready. */
|
|
7
|
+
const FAILURES = new Set([
|
|
8
|
+
"server-needs-login",
|
|
9
|
+
"server-needs-owner-confirmation",
|
|
10
|
+
"server-setup-required",
|
|
11
|
+
"server-owner-confirmation-failed",
|
|
12
|
+
"server-failed",
|
|
13
|
+
"server-exited",
|
|
14
|
+
"server-already-running",
|
|
15
|
+
]);
|
|
16
|
+
function readEvents(logPath) {
|
|
17
|
+
let text = "";
|
|
18
|
+
try {
|
|
19
|
+
text = fs.readFileSync(logPath, "utf8");
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
const events = [];
|
|
25
|
+
for (const line of text.split("\n")) {
|
|
26
|
+
if (!line.startsWith("{"))
|
|
27
|
+
continue;
|
|
28
|
+
try {
|
|
29
|
+
const event = JSON.parse(line);
|
|
30
|
+
if (typeof event.type === "string")
|
|
31
|
+
events.push(event);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// A partial line; read it next time.
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return events;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Run `vana server start` again as a background process that outlives this
|
|
41
|
+
* one, and wait until it answers: ready, and once registered, until its
|
|
42
|
+
* public URL answers too. It runs with --no-input, so everything that needs
|
|
43
|
+
* a person (login, owner confirmation, installs) must be done before.
|
|
44
|
+
*/
|
|
45
|
+
export async function startDetachedServer(input) {
|
|
46
|
+
const logDir = localServerDataDir(input.network);
|
|
47
|
+
await fsp.mkdir(logDir, { recursive: true, mode: 0o700 });
|
|
48
|
+
const logPath = path.join(logDir, "detached.log");
|
|
49
|
+
await fsp.writeFile(logPath, "", { mode: 0o600 });
|
|
50
|
+
const logFd = fs.openSync(logPath, "a");
|
|
51
|
+
const child = spawn(process.execPath, [
|
|
52
|
+
process.argv[1],
|
|
53
|
+
"server",
|
|
54
|
+
"start",
|
|
55
|
+
"--json",
|
|
56
|
+
"--no-input",
|
|
57
|
+
"--yes",
|
|
58
|
+
"--network",
|
|
59
|
+
input.network,
|
|
60
|
+
...(input.port ? ["--port", String(input.port)] : []),
|
|
61
|
+
...(input.local ? ["--local"] : []),
|
|
62
|
+
], {
|
|
63
|
+
detached: true,
|
|
64
|
+
stdio: ["ignore", logFd, logFd],
|
|
65
|
+
env: { ...process.env, VANA_DETACHED: "1" },
|
|
66
|
+
windowsHide: true,
|
|
67
|
+
});
|
|
68
|
+
fs.closeSync(logFd);
|
|
69
|
+
let exited = false;
|
|
70
|
+
child.once("exit", () => {
|
|
71
|
+
exited = true;
|
|
72
|
+
});
|
|
73
|
+
child.unref();
|
|
74
|
+
const started = Date.now();
|
|
75
|
+
let readyAt = null;
|
|
76
|
+
for (;;) {
|
|
77
|
+
const events = readEvents(logPath);
|
|
78
|
+
const ready = events.find((event) => event.type === "server-ready");
|
|
79
|
+
const failed = events.some((event) => FAILURES.has(String(event.type)));
|
|
80
|
+
if (failed || (exited && !ready)) {
|
|
81
|
+
return { events, ready: false, pid: child.pid ?? null, logPath };
|
|
82
|
+
}
|
|
83
|
+
if (ready) {
|
|
84
|
+
readyAt ??= Date.now();
|
|
85
|
+
const settled = ready.registered !== true ||
|
|
86
|
+
events.some((event) => event.type === "server-tunnel") ||
|
|
87
|
+
Date.now() - readyAt > (input.tunnelTimeoutMs ?? 90_000);
|
|
88
|
+
if (settled) {
|
|
89
|
+
return { events, ready: true, pid: child.pid ?? null, logPath };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (Date.now() - started > (input.timeoutMs ?? 5 * 60_000)) {
|
|
93
|
+
return { events, ready: false, pid: child.pid ?? null, logPath };
|
|
94
|
+
}
|
|
95
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function processIsRunning(pid) {
|
|
99
|
+
try {
|
|
100
|
+
process.kill(pid, 0);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
return error.code === "EPERM";
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** The pid of a `vana server start` running from this network's data dir. */
|
|
108
|
+
export function runningServerPid(network) {
|
|
109
|
+
try {
|
|
110
|
+
const pid = Number(JSON.parse(fs.readFileSync(path.join(localServerDataDir(network), ".vana-cli.lock"), "utf8")).pid);
|
|
111
|
+
return pid > 0 && processIsRunning(pid) ? pid : null;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Stop the server `vana server start` runs for this network, detached or
|
|
119
|
+
* not, the way Ctrl+C does, and wait until it has cleaned up.
|
|
120
|
+
*/
|
|
121
|
+
export async function stopLocalServer(network, timeoutMs = 20_000) {
|
|
122
|
+
const pid = runningServerPid(network);
|
|
123
|
+
if (!pid)
|
|
124
|
+
return "not-running";
|
|
125
|
+
process.kill(pid, "SIGTERM");
|
|
126
|
+
const started = Date.now();
|
|
127
|
+
while (Date.now() - started < timeoutMs) {
|
|
128
|
+
if (!processIsRunning(pid))
|
|
129
|
+
return "stopped";
|
|
130
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
131
|
+
}
|
|
132
|
+
return "timeout";
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=detach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detach.js","sourceRoot":"","sources":["../../../src/personal-server/local/detach.ts"],"names":[],"mappings":"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"}
|