@opendatalabs/personal-server-ts-server 0.2.0 → 1.1.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/dist/api-auth.d.ts +16 -0
- package/dist/api-auth.d.ts.map +1 -0
- package/dist/api-auth.js +97 -0
- package/dist/api-auth.js.map +1 -0
- package/dist/api.d.ts +4 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +3 -0
- package/dist/api.js.map +1 -1
- package/dist/app.d.ts +46 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +102 -30
- package/dist/app.js.map +1 -1
- package/dist/bootstrap.d.ts +11 -3
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +266 -33
- package/dist/bootstrap.js.map +1 -1
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +368 -0
- package/dist/client.js.map +1 -0
- package/dist/config/defaults.d.ts +12 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +14 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +74 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/paths.d.ts +9 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +22 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/hono-context.d.ts +14 -0
- package/dist/hono-context.d.ts.map +1 -0
- package/dist/hono-context.js +2 -0
- package/dist/hono-context.js.map +1 -0
- package/dist/index.js +64 -12
- package/dist/index.js.map +1 -1
- package/dist/keys/server-account.d.ts +28 -0
- package/dist/keys/server-account.d.ts.map +1 -0
- package/dist/keys/server-account.js +48 -0
- package/dist/keys/server-account.js.map +1 -0
- package/dist/logger/index.d.ts +5 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +9 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logging/access-log.d.ts +15 -0
- package/dist/logging/access-log.d.ts.map +1 -0
- package/dist/logging/access-log.js +25 -0
- package/dist/logging/access-log.js.map +1 -0
- package/dist/logging/access-reader.d.ts +19 -0
- package/dist/logging/access-reader.d.ts.map +1 -0
- package/dist/logging/access-reader.js +50 -0
- package/dist/logging/access-reader.js.map +1 -0
- package/dist/middleware/access-log.d.ts.map +1 -1
- package/dist/middleware/access-log.js +8 -2
- package/dist/middleware/access-log.js.map +1 -1
- package/dist/middleware/builder-check.d.ts +2 -2
- package/dist/middleware/builder-check.d.ts.map +1 -1
- package/dist/middleware/builder-check.js +7 -2
- package/dist/middleware/builder-check.js.map +1 -1
- package/dist/middleware/owner-check.js +1 -1
- package/dist/middleware/owner-check.js.map +1 -1
- package/dist/middleware/web3-auth.d.ts +12 -0
- package/dist/middleware/web3-auth.d.ts.map +1 -1
- package/dist/middleware/web3-auth.js +27 -31
- package/dist/middleware/web3-auth.js.map +1 -1
- package/dist/migrations/local-state.d.ts +21 -0
- package/dist/migrations/local-state.d.ts.map +1 -0
- package/dist/migrations/local-state.js +106 -0
- package/dist/migrations/local-state.js.map +1 -0
- package/dist/routes/access-logs.d.ts +7 -0
- package/dist/routes/access-logs.d.ts.map +1 -1
- package/dist/routes/access-logs.js +11 -17
- package/dist/routes/access-logs.js.map +1 -1
- package/dist/routes/auth-device.d.ts +49 -0
- package/dist/routes/auth-device.d.ts.map +1 -0
- package/dist/routes/auth-device.js +581 -0
- package/dist/routes/auth-device.js.map +1 -0
- package/dist/routes/data.d.ts +42 -1
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +36 -201
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/grants.d.ts +9 -2
- package/dist/routes/grants.d.ts.map +1 -1
- package/dist/routes/grants.js +18 -196
- package/dist/routes/grants.js.map +1 -1
- package/dist/routes/health.d.ts +7 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +39 -2
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/mcp.d.ts +93 -6
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +526 -53
- package/dist/routes/mcp.js.map +1 -1
- package/dist/routes/oauth-token.d.ts +56 -0
- package/dist/routes/oauth-token.d.ts.map +1 -0
- package/dist/routes/oauth-token.js +49 -0
- package/dist/routes/oauth-token.js.map +1 -0
- package/dist/routes/sync.d.ts +7 -0
- package/dist/routes/sync.d.ts.map +1 -1
- package/dist/routes/sync.js +12 -39
- package/dist/routes/sync.js.map +1 -1
- package/dist/routes/ui-config.d.ts.map +1 -1
- package/dist/routes/ui-config.js +17 -82
- package/dist/routes/ui-config.js.map +1 -1
- package/dist/routes/ui-registration.d.ts +9 -0
- package/dist/routes/ui-registration.d.ts.map +1 -0
- package/dist/routes/ui-registration.js +217 -0
- package/dist/routes/ui-registration.js.map +1 -0
- package/dist/routes/ui.d.ts +1 -0
- package/dist/routes/ui.d.ts.map +1 -1
- package/dist/routes/ui.js +46 -4
- package/dist/routes/ui.js.map +1 -1
- package/dist/storage/hierarchy.d.ts +29 -0
- package/dist/storage/hierarchy.d.ts.map +1 -0
- package/dist/storage/hierarchy.js +241 -0
- package/dist/storage/hierarchy.js.map +1 -0
- package/dist/storage/index-manager.d.ts +53 -0
- package/dist/storage/index-manager.d.ts.map +1 -0
- package/dist/storage/index-manager.js +167 -0
- package/dist/storage/index-manager.js.map +1 -0
- package/dist/storage/index-schema.d.ts +5 -0
- package/dist/storage/index-schema.d.ts.map +1 -0
- package/dist/storage/index-schema.js +62 -0
- package/dist/storage/index-schema.js.map +1 -0
- package/dist/storage/node-data-storage.d.ts +9 -0
- package/dist/storage/node-data-storage.d.ts.map +1 -0
- package/dist/storage/node-data-storage.js +84 -0
- package/dist/storage/node-data-storage.js.map +1 -0
- package/dist/sync-cursor.d.ts +15 -0
- package/dist/sync-cursor.d.ts.map +1 -0
- package/dist/sync-cursor.js +110 -0
- package/dist/sync-cursor.js.map +1 -0
- package/dist/token-store.d.ts +22 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +120 -0
- package/dist/token-store.js.map +1 -0
- package/dist/tunnel/auth.d.ts +4 -0
- package/dist/tunnel/auth.d.ts.map +1 -1
- package/dist/tunnel/auth.js +2 -1
- package/dist/tunnel/auth.js.map +1 -1
- package/dist/tunnel/config.d.ts +1 -0
- package/dist/tunnel/config.d.ts.map +1 -1
- package/dist/tunnel/config.js +1 -1
- package/dist/tunnel/config.js.map +1 -1
- package/dist/tunnel/manager.d.ts +21 -1
- package/dist/tunnel/manager.d.ts.map +1 -1
- package/dist/tunnel/manager.js +78 -23
- package/dist/tunnel/manager.js.map +1 -1
- package/dist/tunnel/verify.d.ts +1 -1
- package/dist/tunnel/verify.d.ts.map +1 -1
- package/dist/tunnel/verify.js +8 -2
- package/dist/tunnel/verify.js.map +1 -1
- package/dist/ui/browser_tls_rustls_bg.wasm +0 -0
- package/dist/ui/index.html +2192 -0
- package/dist/ui/ps-lite-debug.d.ts +93 -0
- package/dist/ui/ps-lite-debug.d.ts.map +1 -0
- package/dist/ui/ps-lite-debug.js +129416 -0
- package/dist/ui/ps-lite-debug.js.map +1 -0
- package/package.json +20 -8
- package/dist/middleware/grant-check.d.ts +0 -12
- package/dist/middleware/grant-check.d.ts.map +0 -1
- package/dist/middleware/grant-check.js +0 -90
- package/dist/middleware/grant-check.js.map +0 -1
- package/dist/oauth/provider.d.ts +0 -55
- package/dist/oauth/provider.d.ts.map +0 -1
- package/dist/oauth/provider.js +0 -160
- package/dist/oauth/provider.js.map +0 -1
- package/dist/oauth/routes.d.ts +0 -10
- package/dist/oauth/routes.d.ts.map +0 -1
- package/dist/oauth/routes.js +0 -206
- package/dist/oauth/routes.js.map +0 -1
package/dist/tunnel/manager.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import { spawn } from "node:child_process";
|
|
12
12
|
import { writeFile, mkdir, chmod, access, constants } from "node:fs/promises";
|
|
13
13
|
import { join } from "node:path";
|
|
14
|
-
import { generateSignedClaim, CLAIM_TTL_SECONDS } from "./auth.js";
|
|
14
|
+
import { generateSignedClaim, CLAIM_TTL_SECONDS, } from "./auth.js";
|
|
15
15
|
import { generateFrpcConfig } from "./config.js";
|
|
16
16
|
import { buildTunnelUrl } from "./verify.js";
|
|
17
17
|
/** Refresh at 80% of TTL to leave buffer before expiry. */
|
|
@@ -25,6 +25,8 @@ export class TunnelManager {
|
|
|
25
25
|
publicUrl = null;
|
|
26
26
|
connectedSince = null;
|
|
27
27
|
lastError = null;
|
|
28
|
+
routable;
|
|
29
|
+
routeWarning = null;
|
|
28
30
|
config = null;
|
|
29
31
|
binaryPath = null;
|
|
30
32
|
refreshTimer = null;
|
|
@@ -33,18 +35,40 @@ export class TunnelManager {
|
|
|
33
35
|
this.storageRoot = storageRoot;
|
|
34
36
|
}
|
|
35
37
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
38
|
+
* Reserve the tunnel's public URL without starting frpc. The URL is
|
|
39
|
+
* deterministic (wallet-derived subdomain), so callers can register the
|
|
40
|
+
* server with the gateway before any tunnel traffic is attempted. Dialing
|
|
41
|
+
* the relay pre-registration is what poisoned its delegation cache and
|
|
42
|
+
* caused the ~70s "Signer is not a registered server" window (BUI-611).
|
|
39
43
|
*/
|
|
40
|
-
|
|
44
|
+
reserve(config, binaryPath) {
|
|
41
45
|
if (this.process) {
|
|
42
46
|
throw new Error("Tunnel already running");
|
|
43
47
|
}
|
|
44
48
|
this.config = config;
|
|
45
49
|
this.binaryPath = binaryPath;
|
|
50
|
+
const subdomain = config.walletAddress.toLowerCase();
|
|
51
|
+
this.publicUrl = buildTunnelUrl(subdomain, config.serverAddr);
|
|
52
|
+
return this.publicUrl;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Start the frpc process for a previously reserved tunnel.
|
|
56
|
+
* Returns the public URL once the tunnel is established.
|
|
57
|
+
* Automatically schedules periodic claim refresh.
|
|
58
|
+
*/
|
|
59
|
+
async connect() {
|
|
60
|
+
if (this.process) {
|
|
61
|
+
throw new Error("Tunnel already running");
|
|
62
|
+
}
|
|
63
|
+
const config = this.config;
|
|
64
|
+
const binaryPath = this.binaryPath;
|
|
65
|
+
if (!config || !binaryPath || !this.publicUrl) {
|
|
66
|
+
throw new Error("Tunnel not reserved");
|
|
67
|
+
}
|
|
46
68
|
this.status = "starting";
|
|
47
69
|
this.lastError = null;
|
|
70
|
+
this.routable = undefined;
|
|
71
|
+
this.routeWarning = null;
|
|
48
72
|
// Verify binary exists and is executable
|
|
49
73
|
try {
|
|
50
74
|
await access(binaryPath, constants.X_OK);
|
|
@@ -57,13 +81,20 @@ export class TunnelManager {
|
|
|
57
81
|
throw new Error(`frpc binary not found or not executable: ${binaryPath}`);
|
|
58
82
|
}
|
|
59
83
|
}
|
|
60
|
-
const
|
|
61
|
-
this.publicUrl = buildTunnelUrl(subdomain);
|
|
62
|
-
const configPath = await this.writeFreshConfig(subdomain);
|
|
84
|
+
const configPath = await this.writeFreshConfig(config.walletAddress.toLowerCase());
|
|
63
85
|
await this.spawnProcess(configPath);
|
|
64
86
|
this.scheduleRefresh();
|
|
65
87
|
return this.publicUrl;
|
|
66
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Reserve and immediately connect. Prefer reserve() + connect() gated on
|
|
91
|
+
* server registration; this remains for callers that are already
|
|
92
|
+
* registered.
|
|
93
|
+
*/
|
|
94
|
+
async start(config, binaryPath) {
|
|
95
|
+
this.reserve(config, binaryPath);
|
|
96
|
+
return this.connect();
|
|
97
|
+
}
|
|
67
98
|
/**
|
|
68
99
|
* Stop the frpc process gracefully.
|
|
69
100
|
*/
|
|
@@ -85,6 +116,8 @@ export class TunnelManager {
|
|
|
85
116
|
this.status = "stopped";
|
|
86
117
|
this.publicUrl = null;
|
|
87
118
|
this.connectedSince = null;
|
|
119
|
+
this.routable = undefined;
|
|
120
|
+
this.routeWarning = null;
|
|
88
121
|
resolve();
|
|
89
122
|
});
|
|
90
123
|
// Send SIGTERM for graceful shutdown
|
|
@@ -101,14 +134,10 @@ export class TunnelManager {
|
|
|
101
134
|
* Update status based on external verification of the tunnel URL.
|
|
102
135
|
*/
|
|
103
136
|
setVerified(reachable, error) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
else {
|
|
109
|
-
this.status = "error";
|
|
110
|
-
this.lastError = error ?? "Tunnel URL not reachable";
|
|
111
|
-
}
|
|
137
|
+
this.routable = reachable;
|
|
138
|
+
this.routeWarning = reachable
|
|
139
|
+
? null
|
|
140
|
+
: (error ?? "Tunnel URL not reachable");
|
|
112
141
|
}
|
|
113
142
|
/**
|
|
114
143
|
* Get the current tunnel status.
|
|
@@ -119,6 +148,8 @@ export class TunnelManager {
|
|
|
119
148
|
status: this.status,
|
|
120
149
|
publicUrl: this.publicUrl,
|
|
121
150
|
connectedSince: this.connectedSince?.toISOString() ?? null,
|
|
151
|
+
routable: this.routable,
|
|
152
|
+
warning: this.routeWarning ?? undefined,
|
|
122
153
|
error: this.lastError ?? undefined,
|
|
123
154
|
};
|
|
124
155
|
}
|
|
@@ -141,6 +172,7 @@ export class TunnelManager {
|
|
|
141
172
|
walletAddress: config.walletAddress,
|
|
142
173
|
runId: config.runId,
|
|
143
174
|
serverKeypair: config.serverKeypair,
|
|
175
|
+
signer: config.tunnelSigner,
|
|
144
176
|
});
|
|
145
177
|
const frpcConfig = generateFrpcConfig({
|
|
146
178
|
serverAddr: config.serverAddr,
|
|
@@ -171,15 +203,30 @@ export class TunnelManager {
|
|
|
171
203
|
this.process = proc;
|
|
172
204
|
let startupOutput = "";
|
|
173
205
|
let resolved = false;
|
|
206
|
+
const cleanMessage = (message) => message.replace(/\x1b\[[0-9;]*m/g, "").trim();
|
|
207
|
+
const markRetrying = (message) => {
|
|
208
|
+
const warning = cleanMessage(message);
|
|
209
|
+
this.routeWarning = warning || "Waiting for tunnel connection";
|
|
210
|
+
};
|
|
174
211
|
const onData = (data) => {
|
|
175
212
|
const text = data.toString();
|
|
176
213
|
startupOutput += text;
|
|
177
|
-
if (text.includes("start
|
|
178
|
-
text.includes("
|
|
214
|
+
if (text.includes("start error:") ||
|
|
215
|
+
text.includes("connect to server error:")) {
|
|
216
|
+
markRetrying(startupOutput);
|
|
217
|
+
if (!resolved) {
|
|
218
|
+
resolved = true;
|
|
219
|
+
resolve();
|
|
220
|
+
}
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (text.includes("start proxy success")) {
|
|
224
|
+
this.status = "connected";
|
|
225
|
+
this.connectedSince ??= new Date();
|
|
226
|
+
this.routable = undefined;
|
|
227
|
+
this.routeWarning = null;
|
|
179
228
|
if (!resolved) {
|
|
180
229
|
resolved = true;
|
|
181
|
-
this.status = "connected";
|
|
182
|
-
this.connectedSince = new Date();
|
|
183
230
|
resolve();
|
|
184
231
|
}
|
|
185
232
|
}
|
|
@@ -208,13 +255,21 @@ export class TunnelManager {
|
|
|
208
255
|
else if (this.status === "connected") {
|
|
209
256
|
this.status = "disconnected";
|
|
210
257
|
}
|
|
258
|
+
else if (code !== 0) {
|
|
259
|
+
this.status = "error";
|
|
260
|
+
this.lastError = `frpc exited with code ${code}: ${startupOutput}`;
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
this.status = "disconnected";
|
|
264
|
+
}
|
|
211
265
|
});
|
|
212
|
-
// Timeout for startup — resolve optimistically
|
|
266
|
+
// Timeout for startup — resolve optimistically. frpc is generated with
|
|
267
|
+
// loginFailExit=false, so auth/registration/network failures can recover
|
|
268
|
+
// after the server is registered or connectivity returns.
|
|
213
269
|
setTimeout(() => {
|
|
214
270
|
if (!resolved) {
|
|
215
271
|
resolved = true;
|
|
216
|
-
|
|
217
|
-
this.connectedSince = new Date();
|
|
272
|
+
markRetrying(startupOutput || "Waiting for proxy startup");
|
|
218
273
|
resolve();
|
|
219
274
|
}
|
|
220
275
|
}, 10_000);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/tunnel/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/tunnel/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/tunnel/verify.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export interface VerifyTunnelResult {
|
|
|
19
19
|
/**
|
|
20
20
|
* Build the canonical tunnel URL for a wallet address.
|
|
21
21
|
*/
|
|
22
|
-
export declare function buildTunnelUrl(walletAddress: string): string;
|
|
22
|
+
export declare function buildTunnelUrl(walletAddress: string, serverAddr?: string): string;
|
|
23
23
|
/**
|
|
24
24
|
* Verify that a tunnel URL is reachable by hitting its /health endpoint.
|
|
25
25
|
* Retries on failure with configurable attempts, delay, and timeout.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/tunnel/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/tunnel/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AASD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAIR;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CA4B7B"}
|
package/dist/tunnel/verify.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tunnel URL helpers: build the canonical tunnel URL and verify reachability.
|
|
3
3
|
*/
|
|
4
|
+
const ALLOWED_SERVER_ADDRS = {
|
|
5
|
+
"frpc.server.vana.org": "server.vana.org",
|
|
6
|
+
"frpc.server-dev.vana.org": "server-dev.vana.org",
|
|
7
|
+
};
|
|
8
|
+
const DEFAULT_DOMAIN = "server.vana.org";
|
|
4
9
|
/**
|
|
5
10
|
* Build the canonical tunnel URL for a wallet address.
|
|
6
11
|
*/
|
|
7
|
-
export function buildTunnelUrl(walletAddress) {
|
|
8
|
-
|
|
12
|
+
export function buildTunnelUrl(walletAddress, serverAddr) {
|
|
13
|
+
const domain = (serverAddr && ALLOWED_SERVER_ADDRS[serverAddr]) || DEFAULT_DOMAIN;
|
|
14
|
+
return `https://${walletAddress.toLowerCase()}.${domain}`;
|
|
9
15
|
}
|
|
10
16
|
/**
|
|
11
17
|
* Verify that a tunnel URL is reachable by hitting its /health endpoint.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/tunnel/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH;;GAEG;AACH,MAAM,UAAU,cAAc,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/tunnel/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH,MAAM,oBAAoB,GAA2B;IACnD,sBAAsB,EAAE,iBAAiB;IACzC,0BAA0B,EAAE,qBAAqB;CAClD,CAAC;AAEF,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,aAAqB,EACrB,UAAmB;IAEnB,MAAM,MAAM,GACV,CAAC,UAAU,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC,IAAI,cAAc,CAAC;IACrE,OAAO,WAAW,aAAa,CAAC,WAAW,EAAE,IAAI,MAAM,EAAE,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAiB,EACjB,OAA6B;IAE7B,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC;IACnD,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;IAC7C,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC;IAE1C,MAAM,SAAS,GAAG,GAAG,SAAS,SAAS,CAAC;IACxC,IAAI,SAA6B,CAAC;IAElC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE;gBACxC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;aACvC,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YAChD,CAAC;YACD,SAAS,GAAG,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACnE,CAAC;QAED,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;YAC1B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACvE,CAAC"}
|
|
Binary file
|