oblien 2.2.0 → 2.2.1

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.
Files changed (43) hide show
  1. package/README.md +1 -0
  2. package/dist/cli/commands/tunnel.d.ts +14 -0
  3. package/dist/cli/commands/tunnel.d.ts.map +1 -0
  4. package/dist/cli/commands/tunnel.js +177 -0
  5. package/dist/cli/commands/tunnel.js.map +1 -0
  6. package/dist/cli/index.js +8 -0
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/client.d.ts +3 -0
  9. package/dist/client.d.ts.map +1 -1
  10. package/dist/client.js +4 -0
  11. package/dist/client.js.map +1 -1
  12. package/dist/edge-tunnel.d.ts +95 -0
  13. package/dist/edge-tunnel.d.ts.map +1 -0
  14. package/dist/edge-tunnel.js +121 -0
  15. package/dist/edge-tunnel.js.map +1 -0
  16. package/dist/index.d.ts +4 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +2 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/runtime/transfer.d.ts.map +1 -1
  21. package/dist/runtime/transfer.js +43 -1
  22. package/dist/runtime/transfer.js.map +1 -1
  23. package/dist/runtime-http.d.ts +10 -0
  24. package/dist/runtime-http.d.ts.map +1 -1
  25. package/dist/runtime-http.js +83 -1
  26. package/dist/runtime-http.js.map +1 -1
  27. package/dist/tunnel/client.d.ts +65 -0
  28. package/dist/tunnel/client.d.ts.map +1 -0
  29. package/dist/tunnel/client.js +227 -0
  30. package/dist/tunnel/client.js.map +1 -0
  31. package/dist/tunnel/protocol.d.ts +38 -0
  32. package/dist/tunnel/protocol.d.ts.map +1 -0
  33. package/dist/tunnel/protocol.js +66 -0
  34. package/dist/tunnel/protocol.js.map +1 -0
  35. package/dist/types/edge-tunnel.d.ts +36 -0
  36. package/dist/types/edge-tunnel.d.ts.map +1 -0
  37. package/dist/types/edge-tunnel.js +3 -0
  38. package/dist/types/edge-tunnel.js.map +1 -0
  39. package/dist/types/index.d.ts +2 -1
  40. package/dist/types/index.d.ts.map +1 -1
  41. package/dist/types/runtime.d.ts +16 -0
  42. package/dist/types/runtime.d.ts.map +1 -1
  43. package/package.json +1 -1
@@ -25,7 +25,7 @@ export class TransferResource {
25
25
  * Returns the raw `Response` — read `.body` for the binary stream.
26
26
  */
27
27
  async download(params) {
28
- return this._http.requestStream({
28
+ const response = await this._http.requestStream({
29
29
  method: 'POST',
30
30
  path: '/files/transfer/download',
31
31
  body: {
@@ -33,6 +33,40 @@ export class TransferResource {
33
33
  exclude_patterns: params.excludePatterns,
34
34
  },
35
35
  });
36
+ if (!params.onProgress || !response.body) {
37
+ return response;
38
+ }
39
+ const totalBytesHeader = response.headers.get('content-length');
40
+ const totalBytes = totalBytesHeader ? Number(totalBytesHeader) : undefined;
41
+ let loadedBytes = 0;
42
+ const reader = response.body.getReader();
43
+ const stream = new ReadableStream({
44
+ async pull(controller) {
45
+ const { done, value } = await reader.read();
46
+ if (done) {
47
+ controller.close();
48
+ return;
49
+ }
50
+ if (value) {
51
+ loadedBytes += value.byteLength;
52
+ params.onProgress?.({
53
+ phase: 'download',
54
+ loadedBytes,
55
+ totalBytes: Number.isFinite(totalBytes) ? totalBytes : undefined,
56
+ percent: computePercent(loadedBytes, totalBytes),
57
+ });
58
+ controller.enqueue(value);
59
+ }
60
+ },
61
+ async cancel(reason) {
62
+ await reader.cancel(reason);
63
+ },
64
+ });
65
+ return new Response(stream, {
66
+ status: response.status,
67
+ statusText: response.statusText,
68
+ headers: response.headers,
69
+ });
36
70
  }
37
71
  /**
38
72
  * Upload a tar.gz archive and extract it into the workspace.
@@ -43,7 +77,15 @@ export class TransferResource {
43
77
  path: '/files/transfer/upload',
44
78
  body: params.body,
45
79
  query: { dest: params.dest ?? '/' },
80
+ totalBytes: params.totalBytes,
81
+ onProgress: params.onProgress,
46
82
  });
47
83
  }
48
84
  }
85
+ function computePercent(loadedBytes, totalBytes) {
86
+ if (typeof totalBytes !== 'number' || !Number.isFinite(totalBytes) || totalBytes <= 0) {
87
+ return undefined;
88
+ }
89
+ return Math.min(100, (loadedBytes / totalBytes) * 100);
90
+ }
49
91
  //# sourceMappingURL=transfer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/runtime/transfer.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,KAAwB;QAAxB,UAAK,GAAL,KAAK,CAAmB;IAAG,CAAC;IAEzD;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,MAA8B;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;YAC9B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE;gBACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,gBAAgB,EAAE,MAAM,CAAC,eAAe;aACzC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,MAA4B;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAyB;YACtD,IAAI,EAAE,wBAAwB;YAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/runtime/transfer.ts"],"names":[],"mappings":"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"}
@@ -33,10 +33,20 @@ export declare class RuntimeHttpClient {
33
33
  body: ArrayBuffer | Uint8Array | Blob | ReadableStream<Uint8Array>;
34
34
  query?: Record<string, string | number | boolean | undefined>;
35
35
  contentType?: string;
36
+ totalBytes?: number;
37
+ onProgress?: (progress: {
38
+ phase: 'upload';
39
+ loadedBytes: number;
40
+ totalBytes?: number;
41
+ percent?: number;
42
+ }) => void;
36
43
  }): Promise<T>;
37
44
  getBaseUrl(): string;
38
45
  getHeaders(): Record<string, string>;
39
46
  private buildUrl;
40
47
  private errorForStatus;
48
+ private wrapUploadBody;
49
+ private normalizeUploadSource;
50
+ private computePercent;
41
51
  }
42
52
  //# sourceMappingURL=runtime-http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-http.d.ts","sourceRoot":"","sources":["../src/runtime-http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,OAAO,EAAE,cAAc;IAQ7B,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE;QAClC,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;QAC9D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,CAAC,CAAC;IA2Bd,kCAAkC;IAC5B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkB9D;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE;QAC3B,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;QAC9D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsBrB,gFAAgF;IAC1E,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE;QACxC,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QACnE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;QAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,CAAC,CAAC;IAgBd,UAAU,IAAI,MAAM;IAIpB,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMpC,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,cAAc;CAGvB"}
1
+ {"version":3,"file":"runtime-http.d.ts","sourceRoot":"","sources":["../src/runtime-http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,OAAO,EAAE,cAAc;IAQ7B,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE;QAClC,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;QAC9D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,CAAC,CAAC;IA2Bd,kCAAkC;IAC5B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkB9D;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE;QAC3B,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;QAC9D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsBrB,gFAAgF;IAC1E,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE;QACxC,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QACnE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;QAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;YAAE,KAAK,EAAE,QAAQ,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;KAClH,GAAG,OAAO,CAAC,CAAC,CAAC;IAiBd,UAAU,IAAI,MAAM;IAIpB,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMpC,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,cAAc;IA4CtB,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,cAAc;CAMvB"}
@@ -76,13 +76,14 @@ export class RuntimeHttpClient {
76
76
  /** Send a raw binary body (for tar.gz upload). Returns parsed JSON response. */
77
77
  async requestUpload(options) {
78
78
  const url = this.buildUrl(options.path, options.query);
79
+ const upload = this.wrapUploadBody(options.body, options.totalBytes, options.onProgress);
79
80
  const res = await fetch(url, {
80
81
  method: 'POST',
81
82
  headers: {
82
83
  'Authorization': this.headers['Authorization'],
83
84
  'Content-Type': options.contentType ?? 'application/gzip',
84
85
  },
85
- body: options.body,
86
+ body: upload.body,
86
87
  duplex: 'half',
87
88
  });
88
89
  const json = await res.json().catch(() => null);
@@ -111,5 +112,86 @@ export class RuntimeHttpClient {
111
112
  errorForStatus(status, body) {
112
113
  return buildOblienError(status, body);
113
114
  }
115
+ wrapUploadBody(body, totalBytes, onProgress) {
116
+ if (!onProgress) {
117
+ return { body };
118
+ }
119
+ const source = this.normalizeUploadSource(body, totalBytes);
120
+ let loadedBytes = 0;
121
+ const stream = new ReadableStream({
122
+ start: async (controller) => {
123
+ const reader = source.stream.getReader();
124
+ try {
125
+ for (;;) {
126
+ const { done, value } = await reader.read();
127
+ if (done)
128
+ break;
129
+ if (!value)
130
+ continue;
131
+ loadedBytes += value.byteLength;
132
+ onProgress({
133
+ phase: 'upload',
134
+ loadedBytes,
135
+ totalBytes: source.totalBytes,
136
+ percent: this.computePercent(loadedBytes, source.totalBytes),
137
+ });
138
+ controller.enqueue(value);
139
+ }
140
+ if (source.totalBytes === 0) {
141
+ onProgress({ phase: 'upload', loadedBytes: 0, totalBytes: 0, percent: 100 });
142
+ }
143
+ controller.close();
144
+ }
145
+ catch (error) {
146
+ controller.error(error);
147
+ }
148
+ finally {
149
+ reader.releaseLock();
150
+ }
151
+ },
152
+ });
153
+ return { body: stream };
154
+ }
155
+ normalizeUploadSource(body, totalBytes) {
156
+ if (body instanceof Uint8Array) {
157
+ return {
158
+ stream: new ReadableStream({
159
+ start(controller) {
160
+ controller.enqueue(body);
161
+ controller.close();
162
+ },
163
+ }),
164
+ totalBytes: totalBytes ?? body.byteLength,
165
+ };
166
+ }
167
+ if (body instanceof ArrayBuffer) {
168
+ const bytes = new Uint8Array(body);
169
+ return {
170
+ stream: new ReadableStream({
171
+ start(controller) {
172
+ controller.enqueue(bytes);
173
+ controller.close();
174
+ },
175
+ }),
176
+ totalBytes: totalBytes ?? bytes.byteLength,
177
+ };
178
+ }
179
+ if (typeof Blob !== 'undefined' && body instanceof Blob) {
180
+ return {
181
+ stream: body.stream(),
182
+ totalBytes: totalBytes ?? body.size,
183
+ };
184
+ }
185
+ return {
186
+ stream: body,
187
+ totalBytes,
188
+ };
189
+ }
190
+ computePercent(loadedBytes, totalBytes) {
191
+ if (typeof totalBytes !== 'number' || totalBytes <= 0) {
192
+ return undefined;
193
+ }
194
+ return Math.min(100, (loadedBytes / totalBytes) * 100);
195
+ }
114
196
  }
115
197
  //# sourceMappingURL=runtime-http.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-http.js","sourceRoot":"","sources":["../src/runtime-http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime-http.js","sourceRoot":"","sources":["../src/runtime-http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Tunnel client — connects to the broker over WebSocket and forwards
3
+ * incoming requests to a local TCP port.
4
+ *
5
+ * This is the agent side of the tunnel. Use it directly for programmatic
6
+ * control, or via {@link EdgeTunnel.connect} for the full create+connect flow.
7
+ *
8
+ * ```ts
9
+ * import { TunnelClient } from 'oblien';
10
+ *
11
+ * const client = new TunnelClient({
12
+ * connectUrl: 'wss://edge.oblien.com/connect',
13
+ * token: '<tunnel-jwt>',
14
+ * localPort: 3000,
15
+ * });
16
+ *
17
+ * client.on('open', () => console.log('connected'));
18
+ * client.on('request', (streamId, port) => console.log(`→ localhost:${port}`));
19
+ * client.on('disconnect', (code, reason) => console.log('lost connection'));
20
+ * client.on('close', () => console.log('done'));
21
+ *
22
+ * client.connect();
23
+ * ```
24
+ */
25
+ import { EventEmitter } from 'node:events';
26
+ export interface TunnelClientOptions {
27
+ /** WebSocket URL (wss://edge.oblien.com/connect). */
28
+ connectUrl: string;
29
+ /** JWT token for broker auth. */
30
+ token: string;
31
+ /** Override the local port to forward to. */
32
+ localPort?: number;
33
+ }
34
+ export declare class TunnelClient extends EventEmitter {
35
+ private readonly opts;
36
+ private ws;
37
+ private streams;
38
+ private connected;
39
+ private closing;
40
+ constructor(opts: TunnelClientOptions);
41
+ /** Open the WebSocket connection and start forwarding. */
42
+ connect(): void;
43
+ /** Gracefully close the tunnel. */
44
+ close(): void;
45
+ /** Whether the WebSocket is connected. */
46
+ get isConnected(): boolean;
47
+ private handleFrame;
48
+ /**
49
+ * OPEN: broker wants us to open a TCP connection to localhost:port.
50
+ * We open the connection immediately and store it in the stream map.
51
+ */
52
+ private onOpen;
53
+ /**
54
+ * DATA: raw bytes for an existing stream → write to the TCP socket.
55
+ */
56
+ private onData;
57
+ /**
58
+ * CLOSE: broker is done sending request data.
59
+ * Half-close the TCP write side and start reading the response.
60
+ */
61
+ private onClose;
62
+ private sendFrame;
63
+ private cleanup;
64
+ }
65
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/tunnel/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAa,SAAQ,YAAY;IAMhC,OAAO,CAAC,QAAQ,CAAC,IAAI;IALjC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;gBAEK,IAAI,EAAE,mBAAmB;IAItD,0DAA0D;IAC1D,OAAO,IAAI,IAAI;IAqCf,mCAAmC;IACnC,KAAK,IAAI,IAAI;IAUb,0CAA0C;IAC1C,IAAI,WAAW,IAAI,OAAO,CAEzB;IAID,OAAO,CAAC,WAAW;IAkBnB;;;OAGG;IACH,OAAO,CAAC,MAAM;IAed;;OAEG;IACH,OAAO,CAAC,MAAM;IAMd;;;OAGG;IACH,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,OAAO;CAMhB"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Tunnel client — connects to the broker over WebSocket and forwards
3
+ * incoming requests to a local TCP port.
4
+ *
5
+ * This is the agent side of the tunnel. Use it directly for programmatic
6
+ * control, or via {@link EdgeTunnel.connect} for the full create+connect flow.
7
+ *
8
+ * ```ts
9
+ * import { TunnelClient } from 'oblien';
10
+ *
11
+ * const client = new TunnelClient({
12
+ * connectUrl: 'wss://edge.oblien.com/connect',
13
+ * token: '<tunnel-jwt>',
14
+ * localPort: 3000,
15
+ * });
16
+ *
17
+ * client.on('open', () => console.log('connected'));
18
+ * client.on('request', (streamId, port) => console.log(`→ localhost:${port}`));
19
+ * client.on('disconnect', (code, reason) => console.log('lost connection'));
20
+ * client.on('close', () => console.log('done'));
21
+ *
22
+ * client.connect();
23
+ * ```
24
+ */
25
+ import { createConnection } from 'node:net';
26
+ import { EventEmitter } from 'node:events';
27
+ import { FRAME_OPEN, FRAME_DATA, FRAME_CLOSE, FRAME_ERROR, readFrame, marshalFrame, makeData, makeClose, makeError, parseOpenPayload, } from './protocol.js';
28
+ export class TunnelClient extends EventEmitter {
29
+ opts;
30
+ ws = null;
31
+ streams = new Map();
32
+ connected = false;
33
+ closing = false;
34
+ constructor(opts) {
35
+ super();
36
+ this.opts = opts;
37
+ }
38
+ /** Open the WebSocket connection and start forwarding. */
39
+ connect() {
40
+ const url = new URL(this.opts.connectUrl);
41
+ if (!url.searchParams.has('token')) {
42
+ url.searchParams.set('token', this.opts.token);
43
+ }
44
+ this.ws = new WebSocket(url.toString());
45
+ this.ws.binaryType = 'arraybuffer';
46
+ this.ws.onopen = () => {
47
+ this.connected = true;
48
+ this.emit('open');
49
+ };
50
+ this.ws.onclose = (ev) => {
51
+ this.connected = false;
52
+ this.cleanup();
53
+ if (!this.closing) {
54
+ this.emit('disconnect', ev.code, ev.reason);
55
+ }
56
+ };
57
+ this.ws.onerror = () => {
58
+ // onerror is always followed by onclose; no-op here.
59
+ };
60
+ this.ws.onmessage = (ev) => {
61
+ try {
62
+ const buf = Buffer.from(ev.data);
63
+ const frame = readFrame(buf);
64
+ this.handleFrame(frame);
65
+ }
66
+ catch (err) {
67
+ this.emit('error', err);
68
+ }
69
+ };
70
+ }
71
+ /** Gracefully close the tunnel. */
72
+ close() {
73
+ this.closing = true;
74
+ this.cleanup();
75
+ if (this.ws) {
76
+ try {
77
+ this.ws.close(1000);
78
+ }
79
+ catch { /* ignore */ }
80
+ this.ws = null;
81
+ }
82
+ this.emit('close');
83
+ }
84
+ /** Whether the WebSocket is connected. */
85
+ get isConnected() {
86
+ return this.connected;
87
+ }
88
+ // ── Frame handling ──────────────────────────────────────────────
89
+ handleFrame(frame) {
90
+ switch (frame.type) {
91
+ case FRAME_OPEN:
92
+ this.onOpen(frame);
93
+ break;
94
+ case FRAME_DATA:
95
+ this.onData(frame);
96
+ break;
97
+ case FRAME_CLOSE:
98
+ this.onClose(frame);
99
+ break;
100
+ case FRAME_ERROR:
101
+ this.emit('stream-error', frame.streamId, frame.payload.toString());
102
+ this.streams.delete(frame.streamId);
103
+ break;
104
+ }
105
+ }
106
+ /**
107
+ * OPEN: broker wants us to open a TCP connection to localhost:port.
108
+ * We open the connection immediately and store it in the stream map.
109
+ */
110
+ onOpen(frame) {
111
+ const brokerPort = parseOpenPayload(frame.payload);
112
+ const localPort = this.opts.localPort ?? brokerPort;
113
+ const streamId = frame.streamId;
114
+ const handler = new StreamHandler(streamId, localPort, (f) => this.sendFrame(f));
115
+ this.streams.set(streamId, handler);
116
+ handler.once('done', () => {
117
+ this.streams.delete(streamId);
118
+ });
119
+ this.emit('request', streamId, localPort);
120
+ }
121
+ /**
122
+ * DATA: raw bytes for an existing stream → write to the TCP socket.
123
+ */
124
+ onData(frame) {
125
+ const handler = this.streams.get(frame.streamId);
126
+ if (!handler)
127
+ return;
128
+ handler.writeToLocal(frame.payload);
129
+ }
130
+ /**
131
+ * CLOSE: broker is done sending request data.
132
+ * Half-close the TCP write side and start reading the response.
133
+ */
134
+ onClose(frame) {
135
+ const handler = this.streams.get(frame.streamId);
136
+ if (!handler)
137
+ return;
138
+ handler.finishWriting();
139
+ }
140
+ // ── Internal helpers ────────────────────────────────────────────
141
+ sendFrame(frame) {
142
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN)
143
+ return;
144
+ const data = marshalFrame(frame);
145
+ this.ws.send(data);
146
+ }
147
+ cleanup() {
148
+ for (const handler of this.streams.values()) {
149
+ handler.destroy();
150
+ }
151
+ this.streams.clear();
152
+ }
153
+ }
154
+ // ── StreamHandler ─────────────────────────────────────────────────────
155
+ /**
156
+ * Manages a single request/response stream.
157
+ * OPEN → connect to localhost:port
158
+ * DATA → write to TCP socket
159
+ * CLOSE → end TCP write, read response, send DATA+CLOSE back
160
+ */
161
+ class StreamHandler extends EventEmitter {
162
+ streamId;
163
+ port;
164
+ send;
165
+ tcp = null;
166
+ responseChunks = [];
167
+ localConnected = false;
168
+ writingDone = false;
169
+ constructor(streamId, port, send) {
170
+ super();
171
+ this.streamId = streamId;
172
+ this.port = port;
173
+ this.send = send;
174
+ this.connectLocal();
175
+ }
176
+ /** Write incoming request data to the local TCP socket. */
177
+ writeToLocal(data) {
178
+ if (this.tcp && this.localConnected) {
179
+ this.tcp.write(data);
180
+ }
181
+ }
182
+ /** Broker is done sending — end the write side and collect response. */
183
+ finishWriting() {
184
+ this.writingDone = true;
185
+ if (this.tcp && this.localConnected) {
186
+ this.tcp.end();
187
+ }
188
+ }
189
+ /** Tear down this stream immediately. */
190
+ destroy() {
191
+ if (this.tcp) {
192
+ this.tcp.destroy();
193
+ this.tcp = null;
194
+ }
195
+ this.emit('done');
196
+ }
197
+ // ────────────────────────────────────────────────────────────────
198
+ connectLocal() {
199
+ this.tcp = createConnection({ host: '127.0.0.1', port: this.port }, () => {
200
+ this.localConnected = true;
201
+ // If writing was already marked done before we connected, close now.
202
+ if (this.writingDone) {
203
+ this.tcp.end();
204
+ }
205
+ });
206
+ this.tcp.on('data', (chunk) => {
207
+ this.responseChunks.push(chunk);
208
+ });
209
+ this.tcp.on('end', () => {
210
+ this.sendResponse();
211
+ });
212
+ this.tcp.on('error', (err) => {
213
+ this.send(makeError(this.streamId, err.message));
214
+ this.emit('done');
215
+ });
216
+ }
217
+ /** Assemble response data and send it back through the tunnel. */
218
+ sendResponse() {
219
+ const response = Buffer.concat(this.responseChunks);
220
+ if (response.length > 0) {
221
+ this.send(makeData(this.streamId, response));
222
+ }
223
+ this.send(makeClose(this.streamId));
224
+ this.emit('done');
225
+ }
226
+ }
227
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/tunnel/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Binary framing protocol for multiplexing TCP streams over WebSocket.
3
+ *
4
+ * Frame layout:
5
+ * [1 byte type][4 bytes stream_id][4 bytes payload_len][payload]
6
+ *
7
+ * Types:
8
+ * 0x01 OPEN — broker → agent: open TCP to localhost:port
9
+ * 0x02 DATA — bidirectional: raw bytes for a stream
10
+ * 0x03 CLOSE — either side: stream ended gracefully
11
+ * 0x04 ERROR — either side: stream failed
12
+ *
13
+ * Must match: demon/tunnel/protocol/frame.go
14
+ */
15
+ export declare const FRAME_OPEN = 1;
16
+ export declare const FRAME_DATA = 2;
17
+ export declare const FRAME_CLOSE = 3;
18
+ export declare const FRAME_ERROR = 4;
19
+ export declare const HEADER_SIZE = 9;
20
+ export declare const MAX_PAYLOAD: number;
21
+ export interface Frame {
22
+ type: number;
23
+ streamId: number;
24
+ payload: Buffer;
25
+ }
26
+ /** Serialize a frame into wire format. */
27
+ export declare function marshalFrame(frame: Frame): Buffer;
28
+ /** Parse a single frame from a binary message. */
29
+ export declare function readFrame(data: Buffer): Frame;
30
+ /** Extract port from an OPEN frame's payload. */
31
+ export declare function parseOpenPayload(payload: Buffer): number;
32
+ /** Create a DATA frame. */
33
+ export declare function makeData(streamId: number, data: Buffer): Frame;
34
+ /** Create a CLOSE frame. */
35
+ export declare function makeClose(streamId: number): Frame;
36
+ /** Create an ERROR frame. */
37
+ export declare function makeError(streamId: number, reason: string): Frame;
38
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/tunnel/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,UAAU,IAAQ,CAAC;AAChC,eAAO,MAAM,UAAU,IAAQ,CAAC;AAChC,eAAO,MAAM,WAAW,IAAO,CAAC;AAChC,eAAO,MAAM,WAAW,IAAO,CAAC;AAEhC,eAAO,MAAM,WAAW,IAAQ,CAAC;AACjC,eAAO,MAAM,WAAW,QAAsB,CAAC;AAE/C,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,0CAA0C;AAC1C,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAUjD;AAED,kDAAkD;AAClD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAY7C;AAED,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,2BAA2B;AAC3B,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,CAE9D;AAED,4BAA4B;AAC5B,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAEjD;AAED,6BAA6B;AAC7B,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAEjE"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Binary framing protocol for multiplexing TCP streams over WebSocket.
3
+ *
4
+ * Frame layout:
5
+ * [1 byte type][4 bytes stream_id][4 bytes payload_len][payload]
6
+ *
7
+ * Types:
8
+ * 0x01 OPEN — broker → agent: open TCP to localhost:port
9
+ * 0x02 DATA — bidirectional: raw bytes for a stream
10
+ * 0x03 CLOSE — either side: stream ended gracefully
11
+ * 0x04 ERROR — either side: stream failed
12
+ *
13
+ * Must match: demon/tunnel/protocol/frame.go
14
+ */
15
+ export const FRAME_OPEN = 0x01;
16
+ export const FRAME_DATA = 0x02;
17
+ export const FRAME_CLOSE = 0x03;
18
+ export const FRAME_ERROR = 0x04;
19
+ export const HEADER_SIZE = 9;
20
+ export const MAX_PAYLOAD = 4 * 1024 * 1024; // 4 MB
21
+ /** Serialize a frame into wire format. */
22
+ export function marshalFrame(frame) {
23
+ const payloadLen = frame.payload.length;
24
+ const buf = Buffer.alloc(HEADER_SIZE + payloadLen);
25
+ buf[0] = frame.type;
26
+ buf.writeUInt32BE(frame.streamId, 1);
27
+ buf.writeUInt32BE(payloadLen, 5);
28
+ if (payloadLen > 0) {
29
+ frame.payload.copy(buf, HEADER_SIZE);
30
+ }
31
+ return buf;
32
+ }
33
+ /** Parse a single frame from a binary message. */
34
+ export function readFrame(data) {
35
+ if (data.length < HEADER_SIZE) {
36
+ throw new Error('frame too short');
37
+ }
38
+ const type = data[0];
39
+ const streamId = data.readUInt32BE(1);
40
+ const payloadLen = data.readUInt32BE(5);
41
+ if (payloadLen > MAX_PAYLOAD) {
42
+ throw new Error('payload too large');
43
+ }
44
+ const payload = data.subarray(HEADER_SIZE, HEADER_SIZE + payloadLen);
45
+ return { type, streamId, payload };
46
+ }
47
+ /** Extract port from an OPEN frame's payload. */
48
+ export function parseOpenPayload(payload) {
49
+ if (payload.length < 2) {
50
+ throw new Error('invalid open payload');
51
+ }
52
+ return payload.readUInt16BE(0);
53
+ }
54
+ /** Create a DATA frame. */
55
+ export function makeData(streamId, data) {
56
+ return { type: FRAME_DATA, streamId, payload: data };
57
+ }
58
+ /** Create a CLOSE frame. */
59
+ export function makeClose(streamId) {
60
+ return { type: FRAME_CLOSE, streamId, payload: Buffer.alloc(0) };
61
+ }
62
+ /** Create an ERROR frame. */
63
+ export function makeError(streamId, reason) {
64
+ return { type: FRAME_ERROR, streamId, payload: Buffer.from(reason) };
65
+ }
66
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/tunnel/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAI,IAAI,CAAC;AAChC,MAAM,CAAC,MAAM,UAAU,GAAI,IAAI,CAAC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAEhC,MAAM,CAAC,MAAM,WAAW,GAAO,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAO,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAQvD,0CAA0C;AAC1C,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;IACxC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC;IACnD,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;IACpB,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACrC,GAAG,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACjC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,IAAI,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,UAAU,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC;IACrE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,IAAY;IACrD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvD,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,MAAc;IACxD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACvE,CAAC"}