@inkbox/sdk 0.5.14 → 0.5.15

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 CHANGED
@@ -1216,6 +1216,42 @@ await inkbox.phoneNumbers.release(num.id);
1216
1216
 
1217
1217
  ---
1218
1218
 
1219
+ ## Tunnels
1220
+
1221
+ The Node-only data-plane runtime is exported separately so the main SDK remains
1222
+ browser-safe:
1223
+
1224
+ ```ts
1225
+ import { connect } from "@inkbox/sdk/tunnels/connect";
1226
+
1227
+ const listener = await connect(inkbox, {
1228
+ name: "my-app",
1229
+ forwardTo: "http://127.0.0.1:8080",
1230
+ });
1231
+
1232
+ console.log(listener.publicUrl);
1233
+ console.log(listener.status); // idle, connecting, connected, ...
1234
+ console.log(listener.isConnected); // local runtime liveness
1235
+ console.log(listener.lastConnectedAt); // latest successful HELLO, or null
1236
+ await listener.wait();
1237
+ ```
1238
+
1239
+ Transient connect, HELLO, transport, and PING failures retry with bounded
1240
+ establishment and exponential backoff. `status` is `idle`, `connecting`,
1241
+ `connected`, `reconnecting`, `closed`, or `superseded`; the timestamp remains
1242
+ available while reconnecting. These values describe the local listener, while
1243
+ `listener.tunnel` remains the bootstrap resource snapshot. Authentication,
1244
+ takeover, and unexpected fatal failures reject both `serveForever()` and
1245
+ `wait()`. Attach a rejection handler when calling `serveForever()` without
1246
+ awaiting it.
1247
+
1248
+ For in-process WebSocket handlers, planned drain throws `WsServerDraining`
1249
+ (`4500`) and unplanned tunnel connection loss throws `WsConnectionLost`
1250
+ (`1011`). Both extend `WsClosed` and advise the peer to reconnect. URL-forwarded
1251
+ WebSockets receive the matching CLOSE code on their local upstream connection.
1252
+
1253
+ ---
1254
+
1219
1255
  ## Webhooks
1220
1256
 
1221
1257
  Webhook delivery uses a dedicated subscription resource. Each
@@ -6,8 +6,9 @@
6
6
  * via `wait()`.
7
7
  */
8
8
  import type { Tunnel } from "../types.js";
9
- import type { TunnelRuntime } from "./_runtime.js";
10
- export type TunnelStatusCallback = (status: "connecting" | "connected" | "reconnecting" | "closed" | "superseded") => void;
9
+ import type { TunnelRuntime, TunnelRuntimeStatus } from "./_runtime.js";
10
+ export type TunnelStatusCallback = (status: Exclude<TunnelRuntimeStatus, "idle">) => void;
11
+ export type { TunnelRuntimeStatus } from "./_runtime.js";
11
12
  /**
12
13
  * Options that affect how the listener behaves around process signals.
13
14
  *
@@ -31,6 +32,12 @@ export interface TunnelListener {
31
32
  readonly publicUrl: string;
32
33
  /** Snapshot of the resource record taken at bootstrap. Not refreshed. */
33
34
  readonly tunnel: Tunnel;
35
+ /** Current local runtime lifecycle state. */
36
+ readonly status: TunnelRuntimeStatus;
37
+ /** Whether the local runtime currently has an active connection. */
38
+ readonly isConnected: boolean;
39
+ /** Time of the latest successful hello, retained while reconnecting. */
40
+ readonly lastConnectedAt: Date | null;
34
41
  /** Block until shutdown. Resolves on clean close; throws on fatal. */
35
42
  wait(): Promise<void>;
36
43
  /** Drive a graceful shutdown. Idempotent. */
@@ -46,7 +53,6 @@ export declare class TunnelListenerImpl implements TunnelListener {
46
53
  private readonly runtime;
47
54
  private servePromise;
48
55
  private closed;
49
- private capturedError;
50
56
  private installedSigintHandler;
51
57
  private installedSigtermHandler;
52
58
  private willExitOnSignal;
@@ -56,6 +62,9 @@ export declare class TunnelListenerImpl implements TunnelListener {
56
62
  runtime: TunnelRuntime;
57
63
  listenerOpts?: TunnelListenerOpts;
58
64
  });
65
+ get status(): TunnelRuntimeStatus;
66
+ get isConnected(): boolean;
67
+ get lastConnectedAt(): Date | null;
59
68
  serveForever(): Promise<void>;
60
69
  wait(): Promise<void>;
61
70
  close(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"_listener.d.ts","sourceRoot":"","sources":["../../../src/tunnels/client/_listener.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,oBAAoB,GAAG,CACjC,MAAM,EAAE,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,KAC1E,IAAI,CAAC;AAEV;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,6CAA6C;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,0CAA0C;IAC1C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,qCAAqC;IACrC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,sBAAsB,CAA6B;IAC3D,OAAO,CAAC,uBAAuB,CAA6B;IAC5D,OAAO,CAAC,gBAAgB,CAAS;gBAErB,IAAI,EAAE;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,aAAa,CAAC;QACvB,YAAY,CAAC,EAAE,kBAAkB,CAAC;KACnC;IAkDK,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAY7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAoB9B"}
1
+ {"version":3,"file":"_listener.d.ts","sourceRoot":"","sources":["../../../src/tunnels/client/_listener.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAExE,MAAM,MAAM,oBAAoB,GAAG,CACjC,MAAM,EAAE,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,KACzC,IAAI,CAAC;AAEV,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,eAAe,EAAE,IAAI,GAAG,IAAI,CAAC;IACtC,sEAAsE;IACtE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,6CAA6C;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,0CAA0C;IAC1C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,qCAAqC;IACrC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,sBAAsB,CAA6B;IAC3D,OAAO,CAAC,uBAAuB,CAA6B;IAC5D,OAAO,CAAC,gBAAgB,CAAS;gBAErB,IAAI,EAAE;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,aAAa,CAAC;QACvB,YAAY,CAAC,EAAE,kBAAkB,CAAC;KACnC;IAkDD,IAAI,MAAM,IAAI,mBAAmB,CAEhC;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,eAAe,IAAI,IAAI,GAAG,IAAI,CAEjC;IAED,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAMvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAe9B"}
@@ -11,7 +11,6 @@ export class TunnelListenerImpl {
11
11
  runtime;
12
12
  servePromise = null;
13
13
  closed = false;
14
- capturedError = null;
15
14
  installedSigintHandler = null;
16
15
  installedSigtermHandler = null;
17
16
  willExitOnSignal = false;
@@ -63,26 +62,23 @@ export class TunnelListenerImpl {
63
62
  process.on("SIGINT", handler);
64
63
  }
65
64
  }
66
- async serveForever() {
65
+ get status() {
66
+ return this.runtime.status;
67
+ }
68
+ get isConnected() {
69
+ return this.runtime.isConnected;
70
+ }
71
+ get lastConnectedAt() {
72
+ return this.runtime.lastConnectedAt;
73
+ }
74
+ serveForever() {
67
75
  if (this.servePromise !== null)
68
76
  return this.servePromise;
69
- this.servePromise = (async () => {
70
- try {
71
- await this.runtime.serveForever();
72
- }
73
- catch (err) {
74
- this.capturedError = err;
75
- }
76
- })();
77
+ this.servePromise = this.runtime.serveForever();
77
78
  return this.servePromise;
78
79
  }
79
80
  async wait() {
80
81
  await this.serveForever();
81
- if (this.capturedError !== null) {
82
- const err = this.capturedError;
83
- this.capturedError = null;
84
- throw err;
85
- }
86
82
  }
87
83
  async close() {
88
84
  return this.aclose();
@@ -91,6 +87,7 @@ export class TunnelListenerImpl {
91
87
  if (this.closed)
92
88
  return;
93
89
  this.closed = true;
90
+ const settledServe = this.servePromise?.catch(() => undefined);
94
91
  await this.runtime.aclose();
95
92
  if (this.installedSigtermHandler !== null) {
96
93
  process.off("SIGTERM", this.installedSigtermHandler);
@@ -100,14 +97,7 @@ export class TunnelListenerImpl {
100
97
  process.off("SIGINT", this.installedSigintHandler);
101
98
  this.installedSigintHandler = null;
102
99
  }
103
- if (this.servePromise !== null) {
104
- try {
105
- await this.servePromise;
106
- }
107
- catch {
108
- /* swallow — captured in capturedError if relevant */
109
- }
110
- }
100
+ await settledServe;
111
101
  }
112
102
  }
113
103
  //# sourceMappingURL=_listener.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_listener.js","sourceRoot":"","sources":["../../../src/tunnels/client/_listener.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"_listener.js","sourceRoot":"","sources":["../../../src/tunnels/client/_listener.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,9 @@ export declare const PING_INTERVAL_MS = 20000;
28
28
  * a dead TCP doesn't strand the runtime past the next intake.
29
29
  */
30
30
  export declare const PING_ACK_TIMEOUT_MS = 10000;
31
+ export declare const CONNECT_TIMEOUT_MS = 10000;
32
+ export declare const HELLO_TIMEOUT_MS = 15000;
33
+ export declare const INITIAL_BACKOFF_MS = 1000;
31
34
  export declare const BACKOFF_CAP_SEC = 30;
32
35
  export declare const BACKOFF_JITTER = 0.25;
33
36
  export declare const DRAINING_CONNECTION_CLOSE_TIMEOUT_MS = 90000;
@@ -46,7 +49,8 @@ export declare class TunnelAuthError extends Error {
46
49
  export declare class TunnelSupersededError extends Error {
47
50
  constructor(message: string);
48
51
  }
49
- export type StatusCallback = (status: "connecting" | "connected" | "reconnecting" | "closed" | "superseded") => void;
52
+ export type TunnelRuntimeStatus = "idle" | "connecting" | "connected" | "reconnecting" | "closed" | "superseded";
53
+ export type StatusCallback = (status: Exclude<TunnelRuntimeStatus, "idle">) => void;
50
54
  /**
51
55
  * What this runtime forwards to. URL is required; `httpHandler` and
52
56
  * `wsHandler` activate the in-process callable paths.
@@ -85,6 +89,13 @@ export interface TunnelRuntimeOpts {
85
89
  rng?: () => number;
86
90
  /** Internal injection point for tests; default is `node:http2` connect. */
87
91
  http2Connect?: (authority: string, options: http2.ClientSessionOptions | http2.SecureClientSessionOptions) => ClientHttp2Session;
92
+ /** Internal timeout and scheduler injection points for tests. */
93
+ connectTimeoutMs?: number;
94
+ helloTimeoutMs?: number;
95
+ pingIntervalMs?: number;
96
+ pingAckTimeoutMs?: number;
97
+ handoffRedialBudgetMs?: number;
98
+ sleep?: (delayMs: number, signal?: AbortSignal) => Promise<void>;
88
99
  }
89
100
  /**
90
101
  * The data-plane runtime. Construct with the bootstrap-derived
@@ -106,6 +117,12 @@ export declare class TunnelRuntime {
106
117
  private readonly onStatus?;
107
118
  private readonly rng;
108
119
  private readonly http2Connect;
120
+ private readonly connectTimeoutMs;
121
+ private readonly helloTimeoutMs;
122
+ private readonly pingIntervalMs;
123
+ private readonly pingAckTimeoutMs;
124
+ private readonly handoffRedialBudgetMs;
125
+ private readonly sleep;
109
126
  private active;
110
127
  private readonly draining;
111
128
  private nextConnId;
@@ -119,7 +136,18 @@ export declare class TunnelRuntime {
119
136
  private passthroughDispatch;
120
137
  private readonly undiciAgentCache;
121
138
  private shutdownAbort;
139
+ private runtimeStatus;
140
+ private lastConnectedAtMs;
141
+ private hasConnected;
142
+ private coldAttempt;
143
+ private terminalError;
144
+ private pendingConnection;
145
+ private coldGeneration;
146
+ private readonly dispatchGeneration;
122
147
  constructor(opts: TunnelRuntimeOpts);
148
+ get status(): TunnelRuntimeStatus;
149
+ get isConnected(): boolean;
150
+ get lastConnectedAt(): Date | null;
123
151
  /**
124
152
  * Drive the runtime forever. Reconnects with jittered exponential
125
153
  * backoff; rejects only on permanent auth failure (rotate the
@@ -134,6 +162,10 @@ export declare class TunnelRuntime {
134
162
  * `close()` would never resolve; we GOAWAY then destroy after 250ms.
135
163
  */
136
164
  private closeConnection;
165
+ private publishConnectionClosed;
166
+ private destroyConnection;
167
+ private withPhaseTimeout;
168
+ private markConnected;
137
169
  private runOnce;
138
170
  /** Spawn a connection's intake pool + ping loop (cold open or handoff). */
139
171
  private startServing;
@@ -171,7 +203,6 @@ export declare class TunnelRuntime {
171
203
  /** Wait for a draining conn's bridges to finish, then close it. */
172
204
  private drainOldConnection;
173
205
  private openConnection;
174
- private waitForSessionClose;
175
206
  private sendHello;
176
207
  private openStream;
177
208
  private wake;
@@ -202,6 +233,7 @@ export declare class TunnelRuntime {
202
233
  /** The active conn if it can take new streams, else the origin if it can. */
203
234
  private pickReplyConnection;
204
235
  private postResponse;
236
+ private dispatchIsCurrent;
205
237
  private notifyStatus;
206
238
  }
207
239
  //# sourceMappingURL=_runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_runtime.d.ts","sourceRoot":"","sources":["../../../src/tunnels/client/_runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAGpC,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,YAAY,CAAC;AAiBxE,OAAO,EAEL,KAAK,aAAa,EAEnB,MAAM,eAAe,CAAC;AAiBvB,OAAO,KAAK,EAAc,aAAa,EAAE,MAAM,WAAW,CAAC;AAY3D,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,UAAU,CAAC;AAQlB,eAAO,MAAM,gBAAgB,QAAS,CAAC;AACvC;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAC1C,eAAO,MAAM,eAAe,KAAO,CAAC;AACpC,eAAO,MAAM,cAAc,OAAO,CAAC;AAGnC,eAAO,MAAM,oCAAoC,QAAS,CAAC;AAI3D,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAI/C,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AAIvC,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AAEzC,eAAO,MAAM,0BAA0B,QAAmB,CAAC;AAC3D,eAAO,MAAM,2BAA2B,QAAmB,CAAC;AAM5D,eAAO,MAAM,4BAA4B,OAAS,CAAC;AACnD,eAAO,MAAM,wBAAwB,eAAe,CAAC;AACrD,eAAO,MAAM,wBAAwB,sBAAsB,CAAC;AAC5D,eAAO,MAAM,uBAAuB,qBAAqB,CAAC;AAE1D,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAmDD,MAAM,MAAM,cAAc,GAAG,CAC3B,MAAM,EAAE,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,KAC1E,IAAI,CAAC;AAEV;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,oFAAoF;IACpF,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,cAAc,CAAC;IACzB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,CACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,KAAK,CAAC,oBAAoB,GAAG,KAAK,CAAC,0BAA0B,KACnE,kBAAkB,CAAC;CACzB;AA2CD;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuB;IACrD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyB;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiD;IAG9E,OAAO,CAAC,MAAM,CAA2B;IAEzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,UAAU,CAAK;IAEvB,OAAO,CAAC,eAAe,CAAS;IAEhC,OAAO,CAAC,aAAa,CAAK;IAG1B,OAAO,CAAC,cAAc,CAA8B;IAEpD,OAAO,CAAC,cAAc,CAA6B;IAEnD,OAAO,CAAC,IAAI,CAAS;IAGrB,OAAO,CAAC,UAAU,CAAS;IAG3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IAErD,OAAO,CAAC,mBAAmB,CAAkD;IAK7E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA8C;IAC/E,OAAO,CAAC,aAAa,CAA0C;gBAEnD,IAAI,EAAE,iBAAiB;IAmBnC;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAuDnC,uEAAuE;IACjE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B7B;;;;OAIG;YACW,eAAe;YAsCf,OAAO;IA6CrB,2EAA2E;IAC3E,OAAO,CAAC,YAAY;IAUpB,yEAAyE;IACzE,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,gBAAgB;IAQxB;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAI5B,uEAAuE;IACvE,OAAO,CAAC,cAAc;IAItB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAetB;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IA4BjC;;;OAGG;IACH,OAAO,CAAC,YAAY;YAoBN,UAAU;IA8BxB,4EAA4E;YAC9D,yBAAyB;IAwCvC,mEAAmE;YACrD,kBAAkB;YAalB,cAAc;IA6G5B,OAAO,CAAC,mBAAmB;YAcb,SAAS;IAyEvB,OAAO,CAAC,UAAU;IA0DlB,OAAO,CAAC,IAAI;YAQE,SAAS;YAmBT,aAAa;YA6Bb,UAAU;YA+DV,aAAa;IAyE3B,OAAO,CAAC,aAAa;IAoDrB,OAAO,CAAC,YAAY;YAWN,gBAAgB;YAyChB,YAAY;YA6IZ,eAAe;YA8Bf,iBAAiB;YAmDjB,sBAAsB;YA8HtB,YAAY;YAiLZ,iBAAiB;IAiW/B,OAAO,CAAC,gBAAgB;IAyBxB;;;;;;;;OAQG;YACW,gBAAgB;IAwB9B,6EAA6E;IAC7E,OAAO,CAAC,mBAAmB;YAQb,YAAY;IAoE1B,OAAO,CAAC,YAAY;CAerB"}
1
+ {"version":3,"file":"_runtime.d.ts","sourceRoot":"","sources":["../../../src/tunnels/client/_runtime.ts"],"names":[],"mappings":"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"}