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
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
// The Personal Server process `vana server start` runs, modeled on Vana
|
|
2
2
|
// Desktop's sidecar (apps/desktop/personal-server/index.js in unity-surfaces).
|
|
3
3
|
//
|
|
4
|
-
//
|
|
5
|
-
// process list or environment:
|
|
4
|
+
// The first JSON line on stdin is its configuration, so the owner signature
|
|
5
|
+
// never appears in the process list or environment:
|
|
6
6
|
// { rootPath, port, ownerSignature, ownerAddress, network: { gatewayUrl, chainId,
|
|
7
|
-
// contracts, storageApiUrl } }
|
|
8
|
-
//
|
|
9
|
-
//
|
|
7
|
+
// contracts, storageApiUrl }, tunnel: { binaryPath, serverAddr, serverPort } | null }
|
|
8
|
+
// Later lines are commands from the CLI, which holds the Account session:
|
|
9
|
+
// { type: "prepare-registration" } -> registration-request
|
|
10
|
+
// { type: "submit-registration", signature } -> registration-submitted
|
|
11
|
+
// It writes one JSON object per line on stdout: ready, public, tunnel,
|
|
12
|
+
// registration-request, registration-submitted, command-failed, error,
|
|
13
|
+
// stopped. Logs go to stderr.
|
|
10
14
|
|
|
11
15
|
import { readFile, rename, writeFile } from "node:fs/promises";
|
|
12
16
|
import { join } from "node:path";
|
|
@@ -42,10 +46,12 @@ function applyDerived(persisted, derived) {
|
|
|
42
46
|
return merged;
|
|
43
47
|
}
|
|
44
48
|
|
|
45
|
-
// Everything that follows from the network
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
+
// Everything that follows from the network and the tunnel client. Without a
|
|
50
|
+
// tunnel client the server is local only: nothing outside can reach it, so
|
|
51
|
+
// it is never registered and has nothing to sync. With one, the server
|
|
52
|
+
// reserves its public URL but dials the relay only once registered, and sync
|
|
53
|
+
// waits for registration too.
|
|
54
|
+
function derivedConfig(network, tunnel) {
|
|
49
55
|
return {
|
|
50
56
|
devUi: { enabled: true },
|
|
51
57
|
gateway: {
|
|
@@ -61,29 +67,134 @@ function derivedConfig(network) {
|
|
|
61
67
|
backend: "vana",
|
|
62
68
|
config: { vana: { apiUrl: network.storageApiUrl } },
|
|
63
69
|
},
|
|
64
|
-
sync: { enabled:
|
|
65
|
-
tunnel:
|
|
70
|
+
sync: { enabled: Boolean(tunnel) },
|
|
71
|
+
tunnel: tunnel
|
|
72
|
+
? {
|
|
73
|
+
enabled: true,
|
|
74
|
+
serverAddr: tunnel.serverAddr,
|
|
75
|
+
serverPort: tunnel.serverPort,
|
|
76
|
+
binaryPath: tunnel.binaryPath,
|
|
77
|
+
}
|
|
78
|
+
: { enabled: false },
|
|
66
79
|
};
|
|
67
80
|
}
|
|
68
81
|
|
|
82
|
+
const lines = readline
|
|
83
|
+
.createInterface({ input: process.stdin })
|
|
84
|
+
[Symbol.asyncIterator]();
|
|
85
|
+
|
|
69
86
|
async function readInput() {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (
|
|
73
|
-
|
|
74
|
-
return JSON.parse(line);
|
|
75
|
-
}
|
|
87
|
+
for (;;) {
|
|
88
|
+
const { value, done } = await lines.next();
|
|
89
|
+
if (done) throw new Error("No configuration on stdin.");
|
|
90
|
+
if (value.trim()) return JSON.parse(value);
|
|
76
91
|
}
|
|
77
|
-
throw new Error("No configuration on stdin.");
|
|
78
92
|
}
|
|
79
93
|
|
|
80
94
|
let ps = null;
|
|
81
95
|
|
|
96
|
+
// Only a tunnel URL may be registered: without one the server offers its
|
|
97
|
+
// localhost origin, which no app could ever reach.
|
|
98
|
+
function publicState(info) {
|
|
99
|
+
const tunnel = info.details?.tunnel ?? null;
|
|
100
|
+
return {
|
|
101
|
+
registered: Boolean(info.registration?.registered),
|
|
102
|
+
serverAddress: info.server?.address ?? null,
|
|
103
|
+
serverUrl: info.urls?.public ?? null,
|
|
104
|
+
tunnel: tunnel
|
|
105
|
+
? {
|
|
106
|
+
status: tunnel.status ?? null,
|
|
107
|
+
routable: tunnel.routable !== false,
|
|
108
|
+
warning: tunnel.warning ?? null,
|
|
109
|
+
}
|
|
110
|
+
: null,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let watching = false;
|
|
115
|
+
|
|
116
|
+
// The server dials the relay on its own once it sees the registration (it
|
|
117
|
+
// polls the gateway); report when the public URL answers, as Desktop does.
|
|
118
|
+
async function watchTunnel() {
|
|
119
|
+
if (watching) return;
|
|
120
|
+
watching = true;
|
|
121
|
+
const started = Date.now();
|
|
122
|
+
let last = null;
|
|
123
|
+
while (Date.now() - started < 10 * 60_000) {
|
|
124
|
+
try {
|
|
125
|
+
last = publicState(await ps.info());
|
|
126
|
+
if (last.tunnel?.status === "connected" && last.tunnel.routable) {
|
|
127
|
+
send({ type: "tunnel", status: "connected", url: last.serverUrl });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
} catch (error) {
|
|
131
|
+
process.stderr.write(`[entry] tunnel check failed: ${error}\n`);
|
|
132
|
+
}
|
|
133
|
+
await new Promise((resolve) => setTimeout(resolve, 3_000));
|
|
134
|
+
}
|
|
135
|
+
send({
|
|
136
|
+
type: "tunnel",
|
|
137
|
+
status: last?.tunnel?.status ?? "unknown",
|
|
138
|
+
url: last?.serverUrl ?? null,
|
|
139
|
+
warning: last?.tunnel?.warning ?? "The tunnel did not connect in time.",
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Typed data can carry bigints, which JSON.stringify refuses.
|
|
144
|
+
const plain = (value) =>
|
|
145
|
+
JSON.parse(
|
|
146
|
+
JSON.stringify(value, (_key, item) =>
|
|
147
|
+
typeof item === "bigint" ? item.toString() : item,
|
|
148
|
+
),
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
async function handleCommands() {
|
|
152
|
+
for (;;) {
|
|
153
|
+
const { value, done } = await lines.next();
|
|
154
|
+
if (done) return;
|
|
155
|
+
if (!value.trim()) continue;
|
|
156
|
+
let command;
|
|
157
|
+
try {
|
|
158
|
+
command = JSON.parse(value);
|
|
159
|
+
} catch {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
if (command.type === "prepare-registration") {
|
|
164
|
+
const { serverUrl } = publicState(await ps.info());
|
|
165
|
+
if (!serverUrl) throw new Error("The server has no public URL.");
|
|
166
|
+
const request = await ps.prepareRegistration({ serverUrl });
|
|
167
|
+
send({
|
|
168
|
+
type: "registration-request",
|
|
169
|
+
request: { typedData: plain(request.typedData) },
|
|
170
|
+
});
|
|
171
|
+
} else if (command.type === "submit-registration") {
|
|
172
|
+
const result = await ps.submitRegistration({
|
|
173
|
+
signature: command.signature,
|
|
174
|
+
});
|
|
175
|
+
send({
|
|
176
|
+
type: "registration-submitted",
|
|
177
|
+
serverId: result?.serverId ?? null,
|
|
178
|
+
alreadyRegistered: Boolean(result?.alreadyRegistered),
|
|
179
|
+
});
|
|
180
|
+
void watchTunnel();
|
|
181
|
+
}
|
|
182
|
+
} catch (error) {
|
|
183
|
+
send({
|
|
184
|
+
type: "command-failed",
|
|
185
|
+
command: command.type,
|
|
186
|
+
message: error instanceof Error ? error.message : String(error),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
82
192
|
async function main() {
|
|
83
193
|
const input = await readInput();
|
|
84
|
-
const { rootPath, port, ownerSignature, ownerAddress, network } =
|
|
194
|
+
const { rootPath, port, ownerSignature, ownerAddress, network, tunnel } =
|
|
195
|
+
input;
|
|
85
196
|
const configPath = join(rootPath, "server.json");
|
|
86
|
-
const derived = derivedConfig(network);
|
|
197
|
+
const derived = derivedConfig(network, tunnel ?? null);
|
|
87
198
|
|
|
88
199
|
// Persist the derived block the way Desktop does, so a network change can
|
|
89
200
|
// never leave an old gateway or storage host behind in server.json.
|
|
@@ -129,6 +240,13 @@ async function main() {
|
|
|
129
240
|
port,
|
|
130
241
|
url: info.urls?.local ?? `http://localhost:${port}`,
|
|
131
242
|
});
|
|
243
|
+
void handleCommands();
|
|
244
|
+
if (!tunnel) return;
|
|
245
|
+
|
|
246
|
+
// Waits for the gateway registration check and the tunnel URL reservation.
|
|
247
|
+
const state = publicState(await ps.ready({ publicUrl: true }));
|
|
248
|
+
send({ type: "public", ...state });
|
|
249
|
+
if (state.registered) void watchTunnel();
|
|
132
250
|
}
|
|
133
251
|
|
|
134
252
|
async function shutdown(signal) {
|
|
@@ -15,14 +15,25 @@ export declare function choosePort(requested?: number): Promise<number | null>;
|
|
|
15
15
|
* taken over; a live one means a server is already running from that dir.
|
|
16
16
|
*/
|
|
17
17
|
export declare function acquireDataDirLock(dir: string): Promise<() => Promise<void>>;
|
|
18
|
+
/** One JSON line the server process writes on stdout. */
|
|
19
|
+
export interface ServerMessage {
|
|
20
|
+
type: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
18
23
|
export interface LocalServerHandle {
|
|
19
24
|
url: string;
|
|
20
25
|
port: number;
|
|
21
26
|
accessToken: string;
|
|
22
27
|
/** Resolves when the server process exits, for whatever reason. */
|
|
23
28
|
exited: Promise<number | null>;
|
|
29
|
+
/** Send one command line to the server process. */
|
|
30
|
+
send(command: Record<string, unknown>): void;
|
|
31
|
+
/** Every message from now on; returns an unsubscribe. */
|
|
32
|
+
onMessage(listener: (message: ServerMessage) => void): () => void;
|
|
24
33
|
stop(): Promise<void>;
|
|
25
34
|
}
|
|
35
|
+
/** The next message of one of `types`, or a timeout error. */
|
|
36
|
+
export declare function nextMessage(handle: Pick<LocalServerHandle, "onMessage" | "exited">, types: string[], timeoutMs: number): Promise<ServerMessage>;
|
|
26
37
|
/**
|
|
27
38
|
* Start the pinned Personal Server as a foreground child process on the
|
|
28
39
|
* managed Node, local only, and wait until it answers.
|
|
@@ -34,6 +45,20 @@ export declare function startLocalServer(input: {
|
|
|
34
45
|
binding: OwnerBinding;
|
|
35
46
|
port: number;
|
|
36
47
|
logPath: string;
|
|
48
|
+
/** A tunnel client to run; absent = local only. */
|
|
49
|
+
frpcPath?: string | null;
|
|
37
50
|
readyTimeoutMs?: number;
|
|
38
51
|
}): Promise<LocalServerHandle>;
|
|
52
|
+
/** What the CLI remembers about a server it registered. */
|
|
53
|
+
export interface PublicMarker {
|
|
54
|
+
serverAddress: string;
|
|
55
|
+
serverUrl: string;
|
|
56
|
+
registeredAt: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* A registered server stays public: registrations cannot be removed, so once
|
|
60
|
+
* apps may look for it, every later start brings its tunnel back.
|
|
61
|
+
*/
|
|
62
|
+
export declare function readPublicMarker(network: VanaNetworkName): PublicMarker | null;
|
|
63
|
+
export declare function writePublicMarker(network: VanaNetworkName, marker: PublicMarker): Promise<void>;
|
|
39
64
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/personal-server/local/server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,mEAAmE;AACnE,wBAAsB,kBAAkB,CACtC,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,aAAa,EAAE,CAAC,CA+B1B;AAWD,qFAAqF;AACrF,wBAAsB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ3E;AAWD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CA8B9B;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,OAAO,EAAE,eAAe,CAAC;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/personal-server/local/server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,mEAAmE;AACnE,wBAAsB,kBAAkB,CACtC,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,aAAa,EAAE,CAAC,CA+B1B;AAWD,qFAAqF;AACrF,wBAAsB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ3E;AAWD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CA8B9B;AAED,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/B,mDAAmD;IACnD,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7C,yDAAyD;IACzD,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAClE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,8DAA8D;AAC9D,wBAAgB,WAAW,CACzB,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,QAAQ,CAAC,EACvD,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CAoBxB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,OAAO,EAAE,eAAe,CAAC;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqJ7B;AAED,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,eAAe,GACvB,YAAY,GAAG,IAAI,CAgBrB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
|
@@ -99,6 +99,27 @@ export async function acquireDataDirLock(dir) {
|
|
|
99
99
|
}
|
|
100
100
|
throw new Error(`Could not lock ${dir}.`);
|
|
101
101
|
}
|
|
102
|
+
/** The next message of one of `types`, or a timeout error. */
|
|
103
|
+
export function nextMessage(handle, types, timeoutMs) {
|
|
104
|
+
return new Promise((resolve, reject) => {
|
|
105
|
+
const timer = setTimeout(() => {
|
|
106
|
+
unsubscribe();
|
|
107
|
+
reject(new Error(`The Personal Server did not answer (${types.join(", ")}).`));
|
|
108
|
+
}, timeoutMs);
|
|
109
|
+
const unsubscribe = handle.onMessage((message) => {
|
|
110
|
+
if (!types.includes(message.type))
|
|
111
|
+
return;
|
|
112
|
+
clearTimeout(timer);
|
|
113
|
+
unsubscribe();
|
|
114
|
+
resolve(message);
|
|
115
|
+
});
|
|
116
|
+
void handle.exited.then(() => {
|
|
117
|
+
clearTimeout(timer);
|
|
118
|
+
unsubscribe();
|
|
119
|
+
reject(new Error("The Personal Server exited."));
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
102
123
|
/**
|
|
103
124
|
* Start the pinned Personal Server as a foreground child process on the
|
|
104
125
|
* managed Node, local only, and wait until it answers.
|
|
@@ -114,7 +135,7 @@ export async function startLocalServer(input) {
|
|
|
114
135
|
PATH: `${path.dirname(input.node.path)}${path.delimiter}${process.env.PATH ?? ""}`,
|
|
115
136
|
NODE_ENV: "production",
|
|
116
137
|
PS_ACCESS_TOKEN: accessToken,
|
|
117
|
-
TUNNEL_ENABLED: "false",
|
|
138
|
+
TUNNEL_ENABLED: input.frpcPath ? "true" : "false",
|
|
118
139
|
...(process.env.TMPDIR ? { TMPDIR: process.env.TMPDIR } : {}),
|
|
119
140
|
};
|
|
120
141
|
const child = spawn(input.node.path, ["entry.mjs"], {
|
|
@@ -131,6 +152,7 @@ export async function startLocalServer(input) {
|
|
|
131
152
|
resolve(code);
|
|
132
153
|
});
|
|
133
154
|
});
|
|
155
|
+
const listeners = new Set();
|
|
134
156
|
const ready = new Promise((resolve, reject) => {
|
|
135
157
|
let buffer = "";
|
|
136
158
|
child.stdout?.setEncoding("utf8");
|
|
@@ -145,7 +167,14 @@ export async function startLocalServer(input) {
|
|
|
145
167
|
continue;
|
|
146
168
|
try {
|
|
147
169
|
const message = JSON.parse(line);
|
|
148
|
-
|
|
170
|
+
// The server's own pino lines carry no type: keep them whole. An
|
|
171
|
+
// entry message is logged by type only, since a command's answer
|
|
172
|
+
// can carry typed data.
|
|
173
|
+
log.write(typeof message.type === "string"
|
|
174
|
+
? `[entry] ${message.type}\n`
|
|
175
|
+
: `${line}\n`);
|
|
176
|
+
for (const listener of [...listeners])
|
|
177
|
+
listener(message);
|
|
149
178
|
if (message.type === "ready")
|
|
150
179
|
resolve(message.url ?? `http://localhost:${input.port}`);
|
|
151
180
|
if (message.type === "error")
|
|
@@ -171,9 +200,22 @@ export async function startLocalServer(input) {
|
|
|
171
200
|
contracts: network.contracts,
|
|
172
201
|
storageApiUrl: network.storageApiUrl,
|
|
173
202
|
},
|
|
203
|
+
tunnel: input.frpcPath
|
|
204
|
+
? { binaryPath: input.frpcPath, ...network.tunnel }
|
|
205
|
+
: null,
|
|
174
206
|
})}\n`);
|
|
175
|
-
|
|
207
|
+
// Stdin stays open: it carries the registration commands.
|
|
208
|
+
const send = (command) => {
|
|
209
|
+
if (child.stdin?.writable) {
|
|
210
|
+
child.stdin.write(`${JSON.stringify(command)}\n`);
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
const onMessage = (listener) => {
|
|
214
|
+
listeners.add(listener);
|
|
215
|
+
return () => void listeners.delete(listener);
|
|
216
|
+
};
|
|
176
217
|
const stop = async () => {
|
|
218
|
+
child.stdin?.end();
|
|
177
219
|
if (child.exitCode !== null || child.signalCode !== null)
|
|
178
220
|
return;
|
|
179
221
|
child.kill("SIGINT");
|
|
@@ -189,7 +231,15 @@ export async function startLocalServer(input) {
|
|
|
189
231
|
timer = setTimeout(() => reject(new Error(`The Personal Server did not become ready in time. See ${input.logPath}.`)), input.readyTimeoutMs ?? 120_000);
|
|
190
232
|
}),
|
|
191
233
|
]);
|
|
192
|
-
return {
|
|
234
|
+
return {
|
|
235
|
+
url,
|
|
236
|
+
port: input.port,
|
|
237
|
+
accessToken,
|
|
238
|
+
exited,
|
|
239
|
+
send,
|
|
240
|
+
onMessage,
|
|
241
|
+
stop,
|
|
242
|
+
};
|
|
193
243
|
}
|
|
194
244
|
catch (error) {
|
|
195
245
|
await stop();
|
|
@@ -200,4 +250,30 @@ export async function startLocalServer(input) {
|
|
|
200
250
|
clearTimeout(timer);
|
|
201
251
|
}
|
|
202
252
|
}
|
|
253
|
+
function publicMarkerPath(network) {
|
|
254
|
+
return path.join(localServerDataDir(network), ".vana-cli-public.json");
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* A registered server stays public: registrations cannot be removed, so once
|
|
258
|
+
* apps may look for it, every later start brings its tunnel back.
|
|
259
|
+
*/
|
|
260
|
+
export function readPublicMarker(network) {
|
|
261
|
+
try {
|
|
262
|
+
const value = JSON.parse(fs.readFileSync(publicMarkerPath(network), "utf8"));
|
|
263
|
+
return typeof value.serverAddress === "string" &&
|
|
264
|
+
typeof value.serverUrl === "string"
|
|
265
|
+
? {
|
|
266
|
+
serverAddress: value.serverAddress,
|
|
267
|
+
serverUrl: value.serverUrl,
|
|
268
|
+
registeredAt: String(value.registeredAt ?? ""),
|
|
269
|
+
}
|
|
270
|
+
: null;
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
export async function writePublicMarker(network, marker) {
|
|
277
|
+
await fsp.writeFile(publicMarkerPath(network), `${JSON.stringify(marker, null, 2)}\n`, { mode: 0o600 });
|
|
278
|
+
}
|
|
203
279
|
//# sourceMappingURL=server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/personal-server/local/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/personal-server/local/server.ts"],"names":[],"mappings":"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"}
|