@iicp/client 0.7.60 → 0.7.61
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/tunnel.d.ts +15 -1
- package/dist/tunnel.d.ts.map +1 -1
- package/dist/tunnel.js +72 -5
- package/dist/tunnel.js.map +1 -1
- package/package.json +1 -1
package/dist/tunnel.d.ts
CHANGED
|
@@ -16,8 +16,21 @@
|
|
|
16
16
|
import { type ChildProcess } from "node:child_process";
|
|
17
17
|
/** cloudflared usually prints the URL within ~5 s; 20 s covers slow first runs. */
|
|
18
18
|
export declare const TUNNEL_START_TIMEOUT_MS = 20000;
|
|
19
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* Bounded self-healing: this many CONSECUTIVE failed respawns (without the tunnel
|
|
21
|
+
* recovering to a healthy state in between) → give up. Resets to 0 once a respawned
|
|
22
|
+
* tunnel passes a health check, so a long-running relay heals indefinitely. (#538)
|
|
23
|
+
*/
|
|
20
24
|
export declare const MAX_RESPAWNS = 3;
|
|
25
|
+
/**
|
|
26
|
+
* Active liveness check of the tunnel's OWN public URL — catches the failure mode the
|
|
27
|
+
* process-exit watcher misses: cloudflared still running but the edge connection
|
|
28
|
+
* dropped, so the URL is unreachable while the node looks healthy (the recurring
|
|
29
|
+
* dead-endpoint bug, #538). Probe every interval; after this many consecutive failures,
|
|
30
|
+
* force a tunnel restart (kill → exit hook respawns → new URL → re-register).
|
|
31
|
+
*/
|
|
32
|
+
export declare const TUNNEL_HEALTH_INTERVAL_MS = 30000;
|
|
33
|
+
export declare const TUNNEL_HEALTH_MAX_FAILS = 3;
|
|
21
34
|
export declare const INSTALL_HINT: string;
|
|
22
35
|
/** Locate the cloudflared binary on PATH, or null (we never auto-install it). */
|
|
23
36
|
export declare function cloudflaredPath(): string | null;
|
|
@@ -29,6 +42,7 @@ export declare class QuickTunnel {
|
|
|
29
42
|
private readonly _binary;
|
|
30
43
|
private _closed;
|
|
31
44
|
private _respawns;
|
|
45
|
+
private _healthTimer?;
|
|
32
46
|
private readonly _exitHook;
|
|
33
47
|
constructor(proc: ChildProcess, url: string, localPort: number, binary: string);
|
|
34
48
|
get respawns(): number;
|
package/dist/tunnel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAM9D,mFAAmF;AACnF,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C
|
|
1
|
+
{"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAM9D,mFAAmF;AACnF,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C;;;;GAIG;AACH,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAChD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAoBzC,eAAO,MAAM,YAAY,QAI0B,CAAC;AAEpD,iFAAiF;AACjF,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAe/C;AAED,6EAA6E;AAC7E,qBAAa,WAAW;IACtB,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,YAAY,CAAC,CAAiC;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;gBAE3B,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAS9E,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,IAAI;IAwEhE,yEAAyE;IACzE,KAAK,IAAI,IAAI;CASd;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAgC,EAC3C,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC,CA6CtB"}
|
package/dist/tunnel.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* hook so a normal exit never orphans the child).
|
|
17
17
|
*/
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.QuickTunnel = exports.INSTALL_HINT = exports.MAX_RESPAWNS = exports.TUNNEL_START_TIMEOUT_MS = void 0;
|
|
19
|
+
exports.QuickTunnel = exports.INSTALL_HINT = exports.TUNNEL_HEALTH_MAX_FAILS = exports.TUNNEL_HEALTH_INTERVAL_MS = exports.MAX_RESPAWNS = exports.TUNNEL_START_TIMEOUT_MS = void 0;
|
|
20
20
|
exports.cloudflaredPath = cloudflaredPath;
|
|
21
21
|
exports.openQuickTunnel = openQuickTunnel;
|
|
22
22
|
const node_child_process_1 = require("node:child_process");
|
|
@@ -25,8 +25,40 @@ const path = require("node:path");
|
|
|
25
25
|
const URL_RE = /https:\/\/[a-z0-9-]+\.trycloudflare\.com/;
|
|
26
26
|
/** cloudflared usually prints the URL within ~5 s; 20 s covers slow first runs. */
|
|
27
27
|
exports.TUNNEL_START_TIMEOUT_MS = 20_000;
|
|
28
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Bounded self-healing: this many CONSECUTIVE failed respawns (without the tunnel
|
|
30
|
+
* recovering to a healthy state in between) → give up. Resets to 0 once a respawned
|
|
31
|
+
* tunnel passes a health check, so a long-running relay heals indefinitely. (#538)
|
|
32
|
+
*/
|
|
29
33
|
exports.MAX_RESPAWNS = 3;
|
|
34
|
+
/**
|
|
35
|
+
* Active liveness check of the tunnel's OWN public URL — catches the failure mode the
|
|
36
|
+
* process-exit watcher misses: cloudflared still running but the edge connection
|
|
37
|
+
* dropped, so the URL is unreachable while the node looks healthy (the recurring
|
|
38
|
+
* dead-endpoint bug, #538). Probe every interval; after this many consecutive failures,
|
|
39
|
+
* force a tunnel restart (kill → exit hook respawns → new URL → re-register).
|
|
40
|
+
*/
|
|
41
|
+
exports.TUNNEL_HEALTH_INTERVAL_MS = 30_000;
|
|
42
|
+
exports.TUNNEL_HEALTH_MAX_FAILS = 3;
|
|
43
|
+
/**
|
|
44
|
+
* GET `<url>/iicp/health` through the Cloudflare edge back to the local node — the same
|
|
45
|
+
* path a browser consumer takes — so it detects an edge-drop, not just a local-process
|
|
46
|
+
* death. Any error / non-2xx → unreachable (a failed probe).
|
|
47
|
+
*/
|
|
48
|
+
async function tunnelUrlReachable(url) {
|
|
49
|
+
const ctrl = new AbortController();
|
|
50
|
+
const timer = setTimeout(() => ctrl.abort(), 8_000);
|
|
51
|
+
try {
|
|
52
|
+
const resp = await fetch(`${url.replace(/\/$/, "")}/iicp/health`, { signal: ctrl.signal });
|
|
53
|
+
return resp.ok;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
clearTimeout(timer);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
30
62
|
exports.INSTALL_HINT = "cloudflared not found — install it to become reachable without router " +
|
|
31
63
|
"changes (zero-account Quick Tunnel): " +
|
|
32
64
|
"macOS `brew install cloudflared` · Linux: https://pkg.cloudflare.com · " +
|
|
@@ -58,6 +90,7 @@ class QuickTunnel {
|
|
|
58
90
|
_binary;
|
|
59
91
|
_closed = false;
|
|
60
92
|
_respawns = 0;
|
|
93
|
+
_healthTimer;
|
|
61
94
|
_exitHook;
|
|
62
95
|
constructor(proc, url, localPort, binary) {
|
|
63
96
|
this.process = proc;
|
|
@@ -76,6 +109,37 @@ class QuickTunnel {
|
|
|
76
109
|
* MUST re-register. After MAX_RESPAWNS, `onDead()` fires once.
|
|
77
110
|
*/
|
|
78
111
|
watch(onNewUrl, onDead) {
|
|
112
|
+
// #538 — edge-drop detection: cloudflared can stay alive while its tunnel becomes
|
|
113
|
+
// unreachable. Probe the public URL; on sustained failure, kill the child so the
|
|
114
|
+
// exit hook respawns it. A healthy probe resets the respawn count so a long-running
|
|
115
|
+
// relay heals indefinitely.
|
|
116
|
+
let healthFails = 0;
|
|
117
|
+
const healthTimer = setInterval(() => {
|
|
118
|
+
if (this._closed)
|
|
119
|
+
return;
|
|
120
|
+
if (this.process.exitCode !== null || this.process.killed)
|
|
121
|
+
return; // exit hook owns this
|
|
122
|
+
void (async () => {
|
|
123
|
+
if (await tunnelUrlReachable(this.url)) {
|
|
124
|
+
healthFails = 0;
|
|
125
|
+
this._respawns = 0;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
healthFails += 1;
|
|
129
|
+
if (healthFails >= exports.TUNNEL_HEALTH_MAX_FAILS) {
|
|
130
|
+
console.warn(`[quick-tunnel] ${this.url} unreachable ${healthFails}× while cloudflared is up ` +
|
|
131
|
+
"(edge dropped) — restarting tunnel.");
|
|
132
|
+
healthFails = 0;
|
|
133
|
+
if (this.process.exitCode === null && !this.process.killed) {
|
|
134
|
+
this.process.kill("SIGTERM"); // → once("exit") → respawn below
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
})();
|
|
139
|
+
}, exports.TUNNEL_HEALTH_INTERVAL_MS);
|
|
140
|
+
// Don't let the watchdog timer keep a one-shot/test process alive.
|
|
141
|
+
healthTimer.unref?.();
|
|
142
|
+
this._healthTimer = healthTimer;
|
|
79
143
|
const arm = (proc) => {
|
|
80
144
|
proc.once("exit", () => {
|
|
81
145
|
if (this._closed)
|
|
@@ -83,12 +147,13 @@ class QuickTunnel {
|
|
|
83
147
|
void (async () => {
|
|
84
148
|
this._respawns += 1;
|
|
85
149
|
if (this._respawns > exports.MAX_RESPAWNS) {
|
|
86
|
-
console.error(`[quick-tunnel]
|
|
87
|
-
"Node is no longer publicly reachable; restart
|
|
150
|
+
console.error(`[quick-tunnel] ${this._respawns - 1} consecutive respawns failed to recover ` +
|
|
151
|
+
"a healthy tunnel — giving up. Node is no longer publicly reachable; restart " +
|
|
152
|
+
"`iicp-node serve` to recover.");
|
|
88
153
|
onDead();
|
|
89
154
|
return;
|
|
90
155
|
}
|
|
91
|
-
console.warn(`[quick-tunnel]
|
|
156
|
+
console.warn(`[quick-tunnel] tunnel down — respawning (${this._respawns}/${exports.MAX_RESPAWNS})…`);
|
|
92
157
|
let fresh;
|
|
93
158
|
try {
|
|
94
159
|
fresh = await openQuickTunnel(this.localPort, exports.TUNNEL_START_TIMEOUT_MS, this._binary);
|
|
@@ -115,6 +180,8 @@ class QuickTunnel {
|
|
|
115
180
|
if (this._closed)
|
|
116
181
|
return;
|
|
117
182
|
this._closed = true;
|
|
183
|
+
if (this._healthTimer)
|
|
184
|
+
clearInterval(this._healthTimer);
|
|
118
185
|
process.removeListener("exit", this._exitHook);
|
|
119
186
|
if (this.process.exitCode === null && !this.process.killed) {
|
|
120
187
|
this.process.kill("SIGTERM");
|
package/dist/tunnel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":";AAAA,sCAAsC;AACtC;;;;;;;;;;;;;;GAcG;;;
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"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"}
|