@urateam/cli 0.1.42 → 0.1.44

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.
@@ -0,0 +1,105 @@
1
+ /**
2
+ * `ura start --tunnel <mode>` runtime: wraps `cloudflared` as a child process.
3
+ *
4
+ * Two modes:
5
+ * - "cloudflare-quick": `cloudflared tunnel --url http://localhost:<port>`.
6
+ * Cloudflare assigns a random `*.trycloudflare.com` URL, which is parsed
7
+ * out of cloudflared's stderr.
8
+ * - "cloudflare-token": `cloudflared tunnel --token <token> run`. Operator
9
+ * has already configured a named tunnel in Cloudflare; the public URL
10
+ * is known ahead of time and must be passed via `opts.publicUrl` /
11
+ * `URATEAM_PUBLIC_URL`.
12
+ *
13
+ * Restart-on-exit: the child is supervised with exponential-backoff retries
14
+ * (default 1s → 2s → 4s ... capped at 30s, max 10 attempts). On `stop()`
15
+ * the supervisor cancels any pending retry timer and SIGTERMs the child.
16
+ *
17
+ * All I/O is injectable for tests; the real `spawn` is only invoked when the
18
+ * caller doesn't override `opts.spawn`.
19
+ */
20
+ import { spawn as realSpawn } from "node:child_process";
21
+ import { EventEmitter } from "node:events";
22
+ export type TunnelMode = "cloudflare-quick" | "cloudflare-token";
23
+ export interface TunnelManagerOpts {
24
+ mode: TunnelMode;
25
+ /** Required for "cloudflare-token" — typically from `CLOUDFLARE_TUNNEL_TOKEN`. */
26
+ token?: string;
27
+ /** Static public URL — required for "cloudflare-token", ignored for quick. */
28
+ publicUrl?: string;
29
+ /** Local port the daemon listens on. For "cloudflare-quick". */
30
+ localPort: number;
31
+ /**
32
+ * Override for real `spawn` — tests pass a stub returning a controllable
33
+ * EventEmitter with `stdout`, `stderr`, `kill`, and an `on("exit", ...)`
34
+ * surface.
35
+ */
36
+ spawn?: typeof realSpawn;
37
+ /** Initial restart delay (ms). Default 1000. */
38
+ initialRestartDelayMs?: number;
39
+ /** Max restart delay (ms). Default 30000. */
40
+ maxRestartDelayMs?: number;
41
+ /** Max restart attempts before giving up. Default 10. */
42
+ maxRestartAttempts?: number;
43
+ /** Time to wait for the public URL to appear in stderr (quick mode). Default 30s. */
44
+ urlDetectTimeoutMs?: number;
45
+ /** Logger (defaults to console.log). */
46
+ log?: (msg: string) => void;
47
+ }
48
+ export interface TunnelStartResult {
49
+ publicUrl: string;
50
+ restartCount: number;
51
+ }
52
+ /**
53
+ * Thrown when the `cloudflared` binary isn't installed (ENOENT on spawn).
54
+ * Carries an install hint so the start command can render an actionable
55
+ * error.
56
+ */
57
+ export declare class CloudflaredMissingError extends Error {
58
+ constructor();
59
+ }
60
+ export declare class TunnelManager extends EventEmitter {
61
+ private readonly opts;
62
+ private child;
63
+ private restartCount;
64
+ private shuttingDown;
65
+ private restartTimer;
66
+ private publicUrl;
67
+ private readonly spawnFn;
68
+ private readonly initialRestartDelayMs;
69
+ private readonly maxRestartDelayMs;
70
+ private readonly maxRestartAttempts;
71
+ private readonly urlDetectTimeoutMs;
72
+ private readonly log;
73
+ constructor(opts: TunnelManagerOpts);
74
+ /**
75
+ * Start the tunnel. Resolves with the detected (quick) or pre-configured
76
+ * (token) public URL. Throws `CloudflaredMissingError` on ENOENT.
77
+ */
78
+ start(): Promise<TunnelStartResult>;
79
+ /**
80
+ * Stop the tunnel. Cancels any pending restart, SIGTERMs the child, and
81
+ * awaits the exit. Subsequent restarts (e.g. an exit fired during
82
+ * shutdown) are skipped.
83
+ */
84
+ stop(): Promise<void>;
85
+ private buildArgs;
86
+ private spawnChild;
87
+ private spawnAndDetectUrl;
88
+ /**
89
+ * Wire the supervisor: on unexpected exit, schedule a restart with
90
+ * exponential backoff. Caps at `maxRestartAttempts` then emits "error".
91
+ */
92
+ private wireSupervisor;
93
+ private restart;
94
+ /** Currently-known public URL, or null before `start()`. */
95
+ getPublicUrl(): string | null;
96
+ /**
97
+ * Total restart attempts made since `start()`. Never resets within the
98
+ * lifetime of a single TunnelManager — so even a long stable period
99
+ * followed by a single new failure still incurs the cap-tier delay.
100
+ * Operators who care can construct a fresh manager. Used by the
101
+ * `tunnel.stopped` audit event to attribute flap loops correctly.
102
+ */
103
+ getRestartCount(): number;
104
+ }
105
+ //# sourceMappingURL=tunnel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/lib/tunnel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EACL,KAAK,IAAI,SAAS,EAGnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,UAAU,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,SAAS,CAAC;IACzB,gDAAgD;IAChD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yDAAyD;IACzD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wCAAwC;IACxC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAKD;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;;CAUjD;AAED,qBAAa,aAAc,SAAQ,YAAY;IAajC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAZjC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;gBAEf,IAAI,EAAE,iBAAiB;IAUpD;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAoBzC;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,OAAO,CAAC,SAAS;IAkBjB,OAAO,CAAC,UAAU;YAYJ,iBAAiB;IAoD/B;;;OAGG;IACH,OAAO,CAAC,cAAc;YAiCR,OAAO;IA6BrB,4DAA4D;IAC5D,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B;;;;;;OAMG;IACH,eAAe,IAAI,MAAM;CAG1B"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * `ura start --tunnel <mode>` runtime: wraps `cloudflared` as a child process.
3
+ *
4
+ * Two modes:
5
+ * - "cloudflare-quick": `cloudflared tunnel --url http://localhost:<port>`.
6
+ * Cloudflare assigns a random `*.trycloudflare.com` URL, which is parsed
7
+ * out of cloudflared's stderr.
8
+ * - "cloudflare-token": `cloudflared tunnel --token <token> run`. Operator
9
+ * has already configured a named tunnel in Cloudflare; the public URL
10
+ * is known ahead of time and must be passed via `opts.publicUrl` /
11
+ * `URATEAM_PUBLIC_URL`.
12
+ *
13
+ * Restart-on-exit: the child is supervised with exponential-backoff retries
14
+ * (default 1s → 2s → 4s ... capped at 30s, max 10 attempts). On `stop()`
15
+ * the supervisor cancels any pending retry timer and SIGTERMs the child.
16
+ *
17
+ * All I/O is injectable for tests; the real `spawn` is only invoked when the
18
+ * caller doesn't override `opts.spawn`.
19
+ */
20
+ import { spawn as realSpawn, } from "node:child_process";
21
+ import { EventEmitter } from "node:events";
22
+ /** Cloudflare quick-tunnel stderr line we parse the URL out of. */
23
+ const QUICK_URL_REGEX = /https:\/\/[a-z0-9-]+\.trycloudflare\.com/;
24
+ /**
25
+ * Thrown when the `cloudflared` binary isn't installed (ENOENT on spawn).
26
+ * Carries an install hint so the start command can render an actionable
27
+ * error.
28
+ */
29
+ export class CloudflaredMissingError extends Error {
30
+ constructor() {
31
+ super("cloudflared binary not found. Install it:\n" +
32
+ " macOS: brew install cloudflared\n" +
33
+ " Linux: https://pkg.cloudflare.com/index.html (apt/yum)\n" +
34
+ " Other: https://github.com/cloudflare/cloudflared/releases");
35
+ this.name = "CloudflaredMissingError";
36
+ }
37
+ }
38
+ export class TunnelManager extends EventEmitter {
39
+ opts;
40
+ child = null;
41
+ restartCount = 0;
42
+ shuttingDown = false;
43
+ restartTimer = null;
44
+ publicUrl = null;
45
+ spawnFn;
46
+ initialRestartDelayMs;
47
+ maxRestartDelayMs;
48
+ maxRestartAttempts;
49
+ urlDetectTimeoutMs;
50
+ log;
51
+ constructor(opts) {
52
+ super();
53
+ this.opts = opts;
54
+ this.spawnFn = opts.spawn ?? realSpawn;
55
+ this.initialRestartDelayMs = opts.initialRestartDelayMs ?? 1000;
56
+ this.maxRestartDelayMs = opts.maxRestartDelayMs ?? 30000;
57
+ this.maxRestartAttempts = opts.maxRestartAttempts ?? 10;
58
+ this.urlDetectTimeoutMs = opts.urlDetectTimeoutMs ?? 30000;
59
+ this.log = opts.log ?? ((m) => console.log(m));
60
+ }
61
+ /**
62
+ * Start the tunnel. Resolves with the detected (quick) or pre-configured
63
+ * (token) public URL. Throws `CloudflaredMissingError` on ENOENT.
64
+ */
65
+ async start() {
66
+ if (this.opts.mode === "cloudflare-token") {
67
+ if (!this.opts.token) {
68
+ throw new Error("TunnelManager: cloudflare-token mode requires `token` (or CLOUDFLARE_TUNNEL_TOKEN env var)");
69
+ }
70
+ if (!this.opts.publicUrl) {
71
+ throw new Error("TunnelManager: cloudflare-token mode requires `publicUrl` (or URATEAM_PUBLIC_URL env var)");
72
+ }
73
+ this.publicUrl = this.opts.publicUrl;
74
+ }
75
+ const url = await this.spawnAndDetectUrl();
76
+ this.publicUrl = url;
77
+ return { publicUrl: url, restartCount: this.restartCount };
78
+ }
79
+ /**
80
+ * Stop the tunnel. Cancels any pending restart, SIGTERMs the child, and
81
+ * awaits the exit. Subsequent restarts (e.g. an exit fired during
82
+ * shutdown) are skipped.
83
+ */
84
+ async stop() {
85
+ this.shuttingDown = true;
86
+ if (this.restartTimer) {
87
+ clearTimeout(this.restartTimer);
88
+ this.restartTimer = null;
89
+ }
90
+ if (this.child && this.child.exitCode === null && !this.child.killed) {
91
+ const exited = new Promise((resolve) => {
92
+ this.child.once("exit", () => resolve());
93
+ });
94
+ this.child.kill("SIGTERM");
95
+ await exited;
96
+ }
97
+ }
98
+ buildArgs() {
99
+ if (this.opts.mode === "cloudflare-quick") {
100
+ return [
101
+ "tunnel",
102
+ "--no-autoupdate",
103
+ "--url",
104
+ `http://localhost:${this.opts.localPort}`,
105
+ ];
106
+ }
107
+ return [
108
+ "tunnel",
109
+ "--no-autoupdate",
110
+ "run",
111
+ "--token",
112
+ this.opts.token,
113
+ ];
114
+ }
115
+ spawnChild() {
116
+ const spawnOpts = { stdio: ["ignore", "pipe", "pipe"] };
117
+ try {
118
+ return this.spawnFn("cloudflared", this.buildArgs(), spawnOpts);
119
+ }
120
+ catch (err) {
121
+ if (err.code === "ENOENT") {
122
+ throw new CloudflaredMissingError();
123
+ }
124
+ throw err;
125
+ }
126
+ }
127
+ async spawnAndDetectUrl() {
128
+ return new Promise((resolve, reject) => {
129
+ let child;
130
+ try {
131
+ child = this.spawnChild();
132
+ }
133
+ catch (err) {
134
+ reject(err);
135
+ return;
136
+ }
137
+ // Synchronous ENOENT surfaces as an "error" event on the child, not as
138
+ // a throw — cover both paths.
139
+ const onError = (err) => {
140
+ if (err.code === "ENOENT") {
141
+ reject(new CloudflaredMissingError());
142
+ }
143
+ else {
144
+ reject(err);
145
+ }
146
+ };
147
+ child.once("error", onError);
148
+ this.child = child;
149
+ this.wireSupervisor(child);
150
+ if (this.opts.mode === "cloudflare-token") {
151
+ // We already have a static publicUrl; the spawn either succeeds or
152
+ // exits — the supervisor handles both. Resolve immediately.
153
+ resolve(this.opts.publicUrl);
154
+ return;
155
+ }
156
+ const urlTimer = setTimeout(() => {
157
+ reject(new Error(`TunnelManager: did not see a *.trycloudflare.com URL within ${this.urlDetectTimeoutMs}ms`));
158
+ }, this.urlDetectTimeoutMs);
159
+ const onStderr = (chunk) => {
160
+ const text = chunk.toString();
161
+ const match = text.match(QUICK_URL_REGEX);
162
+ if (match) {
163
+ clearTimeout(urlTimer);
164
+ child.stderr?.removeListener("data", onStderr);
165
+ this.log(`🌐 Public URL: ${match[0]}`);
166
+ resolve(match[0]);
167
+ }
168
+ };
169
+ child.stderr?.on("data", onStderr);
170
+ });
171
+ }
172
+ /**
173
+ * Wire the supervisor: on unexpected exit, schedule a restart with
174
+ * exponential backoff. Caps at `maxRestartAttempts` then emits "error".
175
+ */
176
+ wireSupervisor(child) {
177
+ child.once("exit", (code, signal) => {
178
+ this.child = null;
179
+ this.emit("stopped", {
180
+ exitCode: code,
181
+ signal,
182
+ restartCount: this.restartCount,
183
+ });
184
+ if (this.shuttingDown)
185
+ return;
186
+ if (this.restartCount >= this.maxRestartAttempts) {
187
+ this.emit("error", new Error(`TunnelManager: cloudflared exited ${this.restartCount} times in a row; giving up`));
188
+ return;
189
+ }
190
+ const delay = Math.min(this.initialRestartDelayMs * 2 ** this.restartCount, this.maxRestartDelayMs);
191
+ this.log(`tunnel: cloudflared exited (code=${code}, signal=${signal}); restart #${this.restartCount + 1} in ${delay}ms`);
192
+ this.restartTimer = setTimeout(() => {
193
+ this.restartTimer = null;
194
+ this.restartCount += 1;
195
+ this.restart().catch((err) => this.emit("error", err));
196
+ }, delay);
197
+ });
198
+ }
199
+ async restart() {
200
+ if (this.shuttingDown)
201
+ return;
202
+ if (this.opts.mode === "cloudflare-quick") {
203
+ try {
204
+ const url = await this.spawnAndDetectUrl();
205
+ this.publicUrl = url;
206
+ this.emit("started", {
207
+ publicUrl: url,
208
+ restartCount: this.restartCount,
209
+ });
210
+ }
211
+ catch (err) {
212
+ this.emit("error", err);
213
+ }
214
+ return;
215
+ }
216
+ // token mode: spawn child; publicUrl is already known.
217
+ try {
218
+ const child = this.spawnChild();
219
+ this.child = child;
220
+ this.wireSupervisor(child);
221
+ this.emit("started", {
222
+ publicUrl: this.publicUrl,
223
+ restartCount: this.restartCount,
224
+ });
225
+ }
226
+ catch (err) {
227
+ this.emit("error", err);
228
+ }
229
+ }
230
+ /** Currently-known public URL, or null before `start()`. */
231
+ getPublicUrl() {
232
+ return this.publicUrl;
233
+ }
234
+ /**
235
+ * Total restart attempts made since `start()`. Never resets within the
236
+ * lifetime of a single TunnelManager — so even a long stable period
237
+ * followed by a single new failure still incurs the cap-tier delay.
238
+ * Operators who care can construct a fresh manager. Used by the
239
+ * `tunnel.stopped` audit event to attribute flap loops correctly.
240
+ */
241
+ getRestartCount() {
242
+ return this.restartCount;
243
+ }
244
+ }
245
+ //# sourceMappingURL=tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/lib/tunnel.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urateam/cli",
3
- "version": "0.1.42",
3
+ "version": "0.1.44",
4
4
  "license": "BUSL-1.1",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -23,8 +23,8 @@
23
23
  "commander": "^13.1.0",
24
24
  "postgres": "^3.4.0",
25
25
  "zod": "^4.3.6",
26
- "@urateam/core": "0.1.40",
27
- "@urateam/dashboard": "0.1.40"
26
+ "@urateam/core": "0.1.42",
27
+ "@urateam/dashboard": "0.1.42"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/better-sqlite3": "^7.6.0",