@betterportal/tunnels 1.0.33 → 1.0.35

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 (33) hide show
  1. package/SPEC.md +6 -3
  2. package/lib/.bsb/clients/service-tunnels-client.d.ts +28 -9
  3. package/lib/.bsb/clients/service-tunnels-client.d.ts.map +1 -1
  4. package/lib/.bsb/clients/service-tunnels-client.js +25 -10
  5. package/lib/.bsb/clients/service-tunnels-client.js.map +1 -1
  6. package/lib/.bsb/clients/service-tunnels-proxy.d.ts +68 -1
  7. package/lib/.bsb/clients/service-tunnels-proxy.d.ts.map +1 -1
  8. package/lib/.bsb/clients/service-tunnels-proxy.js +51 -1
  9. package/lib/.bsb/clients/service-tunnels-proxy.js.map +1 -1
  10. package/lib/cli.js +56 -41
  11. package/lib/cli.js.map +1 -1
  12. package/lib/plugins/service-tunnels-client/index.d.ts +23 -7
  13. package/lib/plugins/service-tunnels-client/index.d.ts.map +1 -1
  14. package/lib/plugins/service-tunnels-client/index.js +85 -61
  15. package/lib/plugins/service-tunnels-client/index.js.map +1 -1
  16. package/lib/plugins/service-tunnels-client/registry.d.ts +13 -7
  17. package/lib/plugins/service-tunnels-client/registry.d.ts.map +1 -1
  18. package/lib/plugins/service-tunnels-client/registry.js.map +1 -1
  19. package/lib/plugins/service-tunnels-proxy/http.d.ts +1 -0
  20. package/lib/plugins/service-tunnels-proxy/http.d.ts.map +1 -1
  21. package/lib/plugins/service-tunnels-proxy/http.js +4 -0
  22. package/lib/plugins/service-tunnels-proxy/http.js.map +1 -1
  23. package/lib/plugins/service-tunnels-proxy/index.d.ts +62 -0
  24. package/lib/plugins/service-tunnels-proxy/index.d.ts.map +1 -1
  25. package/lib/plugins/service-tunnels-proxy/index.js +177 -30
  26. package/lib/plugins/service-tunnels-proxy/index.js.map +1 -1
  27. package/lib/schemas/service-tunnels-admin.json +1 -1
  28. package/lib/schemas/service-tunnels-admin.plugin.json +1 -1
  29. package/lib/schemas/service-tunnels-client.json +47 -17
  30. package/lib/schemas/service-tunnels-client.plugin.json +2 -2
  31. package/lib/schemas/service-tunnels-proxy.json +122 -2
  32. package/lib/schemas/service-tunnels-proxy.plugin.json +2 -2
  33. package/package.json +1 -1
package/SPEC.md CHANGED
@@ -80,11 +80,11 @@ Client side:
80
80
  - One websocket per active tunnel for MVP.
81
81
  - A CLI process may open multiple tunnel websockets from one `.bettertunnel` config.
82
82
  - Requests are multiplexed over the tunnel websocket using request IDs.
83
- - Each proxied request carries method, path, query, headers, body stream, and response stream.
83
+ - Each proxied request carries method, path, query, headers, a bounded body, and a response stream.
84
84
  - Client sends heartbeat every 30 seconds.
85
85
  - Two missed heartbeats force disconnect and session cleanup.
86
- - Request bodies stream immediately.
87
- - If the server does not receive a client ACK for `request.start` within 5 seconds, return `502`.
86
+ - Request bodies are buffered up to the configured request-body limit; response headers and body chunks stream immediately.
87
+ - The total request timeout applies while waiting for response headers; SSE drops that total cap after headers and remains subject to the idle timeout.
88
88
  - If the client disconnects mid-request, return `502`.
89
89
  - Idle data timeout: 30 seconds for anonymous tunnels, 60 seconds for authenticated tunnels.
90
90
  - Total request timeout: 60 seconds for anonymous tunnels, 5 minutes for authenticated tunnels.
@@ -99,6 +99,7 @@ tunnel.close
99
99
  request.start
100
100
  request.body
101
101
  request.end
102
+ request.cancel
102
103
  response.start
103
104
  response.body
104
105
  response.end
@@ -508,6 +509,8 @@ CLI self-hosting behavior:
508
509
  - `btunnel host .` can serve a static directory and expose it publicly without a separate local server. It picks a free local port automatically; `--port <port>` overrides, and startup fails fast if that port is unavailable (no tunnel is started).
509
510
  - `btunnel host --dev --port <port> <command...>` can run a local dev server and expose its selected port. `--port` is required because the dev command, not the CLI, owns the listener.
510
511
  - `btunnel up` reads `.bettertunnel.json`; each tunnel entry can optionally orchestrate its own service:
512
+ - `btunnel up <prefix>` starts only the single entry whose configured `prefix` matches.
513
+ - `btunnel up --proc` opens each entry in its own terminal window and requires at least two entries.
511
514
  - `name`: label used for log prefixes and errors.
512
515
  - `run`: shell command the CLI starts and owns (`port` required; killed as a tree on exit/ctrl-c; if it exits, all services stop and `up` exits non-zero).
513
516
  - `cwd`: working directory for `run` (only valid with `run`).
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Auto-generated BSB virtual client for service-tunnels-client
3
3
  * DO NOT EDIT - Regenerated on every build
4
- * @version 1.0.33
4
+ * @version 1.0.35
5
5
  */
6
6
  import { ServiceClient, BSBService } from "@bsb/base";
7
7
  import type { Observable, BSBServiceClientDefinition, EventInputType, EventOutputType } from "@bsb/base";
@@ -23,7 +23,13 @@ declare const _proxyMetricsSchema: import("anyvali").ObjectSchema<{
23
23
  originMs: import("anyvali").OptionalSchema<import("@bsb/base").BSBType>;
24
24
  internalServerMs: import("anyvali").OptionalSchema<import("@bsb/base").BSBType>;
25
25
  }>;
26
+ declare const _proxyCancelSchema: import("anyvali").ObjectSchema<{
27
+ hostname: import("anyvali").StringSchema;
28
+ requestId: import("anyvali").StringSchema;
29
+ }>;
26
30
  declare const _proxyRequestSchema: import("anyvali").ObjectSchema<{
31
+ publicServerId: import("anyvali").StringSchema;
32
+ publicRequestId: import("anyvali").StringSchema;
27
33
  hostname: import("anyvali").StringSchema;
28
34
  method: import("anyvali").StringSchema;
29
35
  path: import("anyvali").StringSchema;
@@ -36,11 +42,9 @@ declare const _proxyRequestOutputSchema: import("anyvali").ObjectSchema<{
36
42
  ownerServerId: import("anyvali").StringSchema;
37
43
  status: import("@bsb/base").BSBType;
38
44
  headers: import("anyvali").RecordSchema<import("anyvali").StringSchema>;
39
- body: import("anyvali").StringSchema;
45
+ body: import("anyvali").OptionalSchema<import("anyvali").StringSchema>;
40
46
  webStartedAt: import("@bsb/base").BSBType;
41
47
  clientApiRoundtripMs: import("@bsb/base").BSBType;
42
- cliOverheadMs: import("anyvali").OptionalSchema<import("@bsb/base").BSBType>;
43
- originMs: import("anyvali").OptionalSchema<import("@bsb/base").BSBType>;
44
48
  }>;
45
49
  declare const _EventSchemas: {
46
50
  readonly onEvents: {
@@ -70,10 +74,20 @@ declare const _EventSchemas: {
70
74
  description?: string;
71
75
  readonly __brand: "fire-and-forget";
72
76
  };
77
+ readonly 'proxy.cancel': {
78
+ input: import("anyvali").ObjectSchema<{
79
+ hostname: import("anyvali").StringSchema;
80
+ requestId: import("anyvali").StringSchema;
81
+ }>;
82
+ description?: string;
83
+ readonly __brand: "fire-and-forget";
84
+ };
73
85
  };
74
86
  readonly onReturnableEvents: {
75
87
  readonly 'proxy.request': {
76
88
  input: import("anyvali").ObjectSchema<{
89
+ publicServerId: import("anyvali").StringSchema;
90
+ publicRequestId: import("anyvali").StringSchema;
77
91
  hostname: import("anyvali").StringSchema;
78
92
  method: import("anyvali").StringSchema;
79
93
  path: import("anyvali").StringSchema;
@@ -86,11 +100,9 @@ declare const _EventSchemas: {
86
100
  ownerServerId: import("anyvali").StringSchema;
87
101
  status: import("@bsb/base").BSBType;
88
102
  headers: import("anyvali").RecordSchema<import("anyvali").StringSchema>;
89
- body: import("anyvali").StringSchema;
103
+ body: import("anyvali").OptionalSchema<import("anyvali").StringSchema>;
90
104
  webStartedAt: import("@bsb/base").BSBType;
91
105
  clientApiRoundtripMs: import("@bsb/base").BSBType;
92
- cliOverheadMs: import("anyvali").OptionalSchema<import("@bsb/base").BSBType>;
93
- originMs: import("anyvali").OptionalSchema<import("@bsb/base").BSBType>;
94
106
  }>;
95
107
  description?: string;
96
108
  defaultTimeout?: number;
@@ -104,6 +116,9 @@ export type WsToOriginInput = EventInputType<{
104
116
  export type ProxyMetricsInput = EventInputType<{
105
117
  input: typeof _proxyMetricsSchema;
106
118
  }>;
119
+ export type ProxyCancelInput = EventInputType<{
120
+ input: typeof _proxyCancelSchema;
121
+ }>;
107
122
  export type ProxyRequestInput = EventInputType<{
108
123
  input: typeof _proxyRequestSchema;
109
124
  }>;
@@ -124,9 +139,13 @@ export default class TunnelsClientClient extends ServiceClient<any, typeof _Even
124
139
  proxyMetrics(obs: Observable, input: ProxyMetricsInput): Promise<void>;
125
140
  /** Send final proxy request timings to the connected tunnel client for a specific server */
126
141
  proxyMetricsSpecific(serverId: string, obs: Observable, input: ProxyMetricsInput): Promise<void>;
127
- /** Proxy an HTTP request through a connected tunnel client (default timeout: 60s) */
142
+ /** Cancel an active HTTP request */
143
+ proxyCancel(obs: Observable, input: ProxyCancelInput): Promise<void>;
144
+ /** Cancel an active HTTP request for a specific server */
145
+ proxyCancelSpecific(serverId: string, obs: Observable, input: ProxyCancelInput): Promise<void>;
146
+ /** Proxy an HTTP request through a connected tunnel client (default timeout: 310s) */
128
147
  proxyRequest(obs: Observable, input: ProxyRequestInput, timeout?: number): Promise<ProxyRequestOutput>;
129
- /** Proxy an HTTP request through a connected tunnel client for a specific server (default timeout: 60s) */
148
+ /** Proxy an HTTP request through a connected tunnel client for a specific server (default timeout: 310s) */
130
149
  proxyRequestSpecific(serverId: string, obs: Observable, input: ProxyRequestInput, timeout?: number): Promise<ProxyRequestOutput>;
131
150
  }
132
151
  export { TunnelsClientClient };
@@ -1 +1 @@
1
- {"version":3,"file":"service-tunnels-client.d.ts","sourceRoot":"","sources":["../../../src/.bsb/clients/service-tunnels-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAsH,MAAM,WAAW,CAAC;AAC1K,OAAO,KAAK,EAAE,UAAU,EAAE,0BAA0B,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEzG,QAAA,MAAM,iBAAiB;;;;;;;;EAQnB,CAAC;AACL,QAAA,MAAM,mBAAmB;;;;;;;;EAQrB,CAAC;AACL,QAAA,MAAM,mBAAmB;;;;;;;EAOrB,CAAC;AACL,QAAA,MAAM,yBAAyB;;;;;;;;;;EAU3B,CAAC;AAEL,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQjB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,OAAO,iBAAiB,CAAA;CAAE,CAAC,CAAC;AAClF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,OAAO,mBAAmB,CAAA;CAAE,CAAC,CAAC;AACtF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,OAAO,mBAAmB,CAAA;CAAE,CAAC,CAAC;AACtF,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC;IAAE,MAAM,EAAE,OAAO,yBAAyB,CAAA;CAAE,CAAC,CAAC;AAM/F,cAAM,UAAU;IACd,MAAM,CAAC,aAAa,6BAAkB;CACvC;AAED,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,aAAa,CAAC,GAAG,EAAE,OAAO,aAAa,EAAE,OAAO,UAAU,CAAC;gBAC9F,OAAO,EAAE,UAAU;IAI/B,OAAO,CAAC,oBAAoB;IAQ5B,oEAAoE;IAC9D,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxE,0FAA0F;IACpF,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlG,sEAAsE;IAChE,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5E,4FAA4F;IACtF,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtG,qFAAqF;IAC/E,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,GAAE,MAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAKhH,2GAA2G;IACrG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,GAAE,MAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAI3I;AACD,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"service-tunnels-client.d.ts","sourceRoot":"","sources":["../../../src/.bsb/clients/service-tunnels-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAsH,MAAM,WAAW,CAAC;AAC1K,OAAO,KAAK,EAAE,UAAU,EAAE,0BAA0B,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEzG,QAAA,MAAM,iBAAiB;;;;;;;;EAQnB,CAAC;AACL,QAAA,MAAM,mBAAmB;;;;;;;;EAQrB,CAAC;AACL,QAAA,MAAM,kBAAkB;;;EAGpB,CAAC;AACL,QAAA,MAAM,mBAAmB;;;;;;;;;EASrB,CAAC;AACL,QAAA,MAAM,yBAAyB;;;;;;;;EAQ3B,CAAC;AAEL,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CASjB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,OAAO,iBAAiB,CAAA;CAAE,CAAC,CAAC;AAClF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,OAAO,mBAAmB,CAAA;CAAE,CAAC,CAAC;AACtF,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,OAAO,kBAAkB,CAAA;CAAE,CAAC,CAAC;AACpF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,OAAO,mBAAmB,CAAA;CAAE,CAAC,CAAC;AACtF,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC;IAAE,MAAM,EAAE,OAAO,yBAAyB,CAAA;CAAE,CAAC,CAAC;AAM/F,cAAM,UAAU;IACd,MAAM,CAAC,aAAa,6BAAkB;CACvC;AAED,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,aAAa,CAAC,GAAG,EAAE,OAAO,aAAa,EAAE,OAAO,UAAU,CAAC;gBAC9F,OAAO,EAAE,UAAU;IAI/B,OAAO,CAAC,oBAAoB;IAQ5B,oEAAoE;IAC9D,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxE,0FAA0F;IACpF,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlG,sEAAsE;IAChE,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5E,4FAA4F;IACtF,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtG,oCAAoC;IAC9B,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1E,0DAA0D;IACpD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpG,sFAAsF;IAChF,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,GAAE,MAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAKjH,4GAA4G;IACtG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,GAAE,MAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAI5I;AACD,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Auto-generated BSB virtual client for service-tunnels-client
3
3
  * DO NOT EDIT - Regenerated on every build
4
- * @version 1.0.33
4
+ * @version 1.0.35
5
5
  */
6
6
  import { ServiceClient, bsb, optional, createReturnableEvent, createFireAndForgetEvent, createEventSchemas } from "@bsb/base";
7
7
  const _wsToOriginSchema = bsb.object({
@@ -22,7 +22,13 @@ const _proxyMetricsSchema = bsb.object({
22
22
  "originMs": optional(bsb.number()),
23
23
  "internalServerMs": optional(bsb.number())
24
24
  });
25
+ const _proxyCancelSchema = bsb.object({
26
+ "hostname": bsb.string(),
27
+ "requestId": bsb.string()
28
+ });
25
29
  const _proxyRequestSchema = bsb.object({
30
+ "publicServerId": bsb.string(),
31
+ "publicRequestId": bsb.string(),
26
32
  "hostname": bsb.string(),
27
33
  "method": bsb.string(),
28
34
  "path": bsb.string(),
@@ -35,19 +41,18 @@ const _proxyRequestOutputSchema = bsb.object({
35
41
  "ownerServerId": bsb.string(),
36
42
  "status": bsb.number(),
37
43
  "headers": bsb.record(bsb.string(), bsb.string()),
38
- "body": bsb.string(),
44
+ "body": optional(bsb.string()),
39
45
  "webStartedAt": bsb.number(),
40
- "clientApiRoundtripMs": bsb.number(),
41
- "cliOverheadMs": optional(bsb.number()),
42
- "originMs": optional(bsb.number())
46
+ "clientApiRoundtripMs": bsb.number()
43
47
  });
44
48
  const _EventSchemas = createEventSchemas({
45
49
  onEvents: {
46
50
  'ws.toOrigin': createFireAndForgetEvent(_wsToOriginSchema, "Relay a public websocket frame to the connected tunnel client"),
47
51
  'proxy.metrics': createFireAndForgetEvent(_proxyMetricsSchema, "Send final proxy request timings to the connected tunnel client"),
52
+ 'proxy.cancel': createFireAndForgetEvent(_proxyCancelSchema, "Cancel an active HTTP request"),
48
53
  },
49
54
  onReturnableEvents: {
50
- 'proxy.request': createReturnableEvent(_proxyRequestSchema, _proxyRequestOutputSchema, "Proxy an HTTP request through a connected tunnel client", 60),
55
+ 'proxy.request': createReturnableEvent(_proxyRequestSchema, _proxyRequestOutputSchema, "Proxy an HTTP request through a connected tunnel client", 310),
51
56
  },
52
57
  });
53
58
  const _PLUGIN_CLIENT = {
@@ -87,13 +92,23 @@ export default class TunnelsClientClient extends ServiceClient {
87
92
  const events = this._requireClientEvents("emitEventSpecific", "proxy.metrics");
88
93
  await events.emitEventSpecific("proxy.metrics", serverId, obs, input);
89
94
  }
90
- /** Proxy an HTTP request through a connected tunnel client (default timeout: 60s) */
91
- async proxyRequest(obs, input, timeout = 60) {
95
+ /** Cancel an active HTTP request */
96
+ async proxyCancel(obs, input) {
97
+ const events = this._requireClientEvents("emitEvent", "proxy.cancel");
98
+ await events.emitEvent("proxy.cancel", obs, input);
99
+ }
100
+ /** Cancel an active HTTP request for a specific server */
101
+ async proxyCancelSpecific(serverId, obs, input) {
102
+ const events = this._requireClientEvents("emitEventSpecific", "proxy.cancel");
103
+ await events.emitEventSpecific("proxy.cancel", serverId, obs, input);
104
+ }
105
+ /** Proxy an HTTP request through a connected tunnel client (default timeout: 310s) */
106
+ async proxyRequest(obs, input, timeout = 310) {
92
107
  const events = this._requireClientEvents("emitEventAndReturn", "proxy.request");
93
108
  return events.emitEventAndReturn("proxy.request", obs, input, timeout);
94
109
  }
95
- /** Proxy an HTTP request through a connected tunnel client for a specific server (default timeout: 60s) */
96
- async proxyRequestSpecific(serverId, obs, input, timeout = 60) {
110
+ /** Proxy an HTTP request through a connected tunnel client for a specific server (default timeout: 310s) */
111
+ async proxyRequestSpecific(serverId, obs, input, timeout = 310) {
97
112
  const events = this._requireClientEvents("emitEventAndReturnSpecific", "proxy.request");
98
113
  return events.emitEventAndReturnSpecific("proxy.request", serverId, obs, input, timeout);
99
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"service-tunnels-client.js","sourceRoot":"","sources":["../../../src/.bsb/clients/service-tunnels-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service-tunnels-client.js","sourceRoot":"","sources":["../../../src/.bsb/clients/service-tunnels-client.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Auto-generated BSB virtual client for service-tunnels-proxy
3
3
  * DO NOT EDIT - Regenerated on every build
4
- * @version 1.0.33
4
+ * @version 1.0.35
5
5
  */
6
6
  import { ServiceClient, BSBService } from "@bsb/base";
7
7
  import type { Observable, BSBServiceClientDefinition, EventInputType } from "@bsb/base";
@@ -11,6 +11,23 @@ declare const _wsFromOriginSchema: import("anyvali").ObjectSchema<{
11
11
  event: import("anyvali").OptionalSchema<import("anyvali").StringSchema>;
12
12
  body: import("anyvali").OptionalSchema<import("anyvali").StringSchema>;
13
13
  }>;
14
+ declare const _proxyResponseBodySchema: import("anyvali").ObjectSchema<{
15
+ publicRequestId: import("anyvali").StringSchema;
16
+ body: import("anyvali").StringSchema;
17
+ }>;
18
+ declare const _proxyResponseEndSchema: import("anyvali").ObjectSchema<{
19
+ publicRequestId: import("anyvali").StringSchema;
20
+ requestId: import("anyvali").StringSchema;
21
+ ownerServerId: import("anyvali").StringSchema;
22
+ status: import("@bsb/base").BSBType;
23
+ clientApiRoundtripMs: import("@bsb/base").BSBType;
24
+ cliOverheadMs: import("anyvali").OptionalSchema<import("@bsb/base").BSBType>;
25
+ originMs: import("anyvali").OptionalSchema<import("@bsb/base").BSBType>;
26
+ }>;
27
+ declare const _proxyResponseErrorSchema: import("anyvali").ObjectSchema<{
28
+ publicRequestId: import("anyvali").StringSchema;
29
+ message: import("anyvali").StringSchema;
30
+ }>;
14
31
  declare const _EventSchemas: {
15
32
  readonly onEvents: {
16
33
  readonly 'ws.fromOrigin': {
@@ -23,11 +40,49 @@ declare const _EventSchemas: {
23
40
  description?: string;
24
41
  readonly __brand: "fire-and-forget";
25
42
  };
43
+ readonly 'proxy.response.body': {
44
+ input: import("anyvali").ObjectSchema<{
45
+ publicRequestId: import("anyvali").StringSchema;
46
+ body: import("anyvali").StringSchema;
47
+ }>;
48
+ description?: string;
49
+ readonly __brand: "fire-and-forget";
50
+ };
51
+ readonly 'proxy.response.end': {
52
+ input: import("anyvali").ObjectSchema<{
53
+ publicRequestId: import("anyvali").StringSchema;
54
+ requestId: import("anyvali").StringSchema;
55
+ ownerServerId: import("anyvali").StringSchema;
56
+ status: import("@bsb/base").BSBType;
57
+ clientApiRoundtripMs: import("@bsb/base").BSBType;
58
+ cliOverheadMs: import("anyvali").OptionalSchema<import("@bsb/base").BSBType>;
59
+ originMs: import("anyvali").OptionalSchema<import("@bsb/base").BSBType>;
60
+ }>;
61
+ description?: string;
62
+ readonly __brand: "fire-and-forget";
63
+ };
64
+ readonly 'proxy.response.error': {
65
+ input: import("anyvali").ObjectSchema<{
66
+ publicRequestId: import("anyvali").StringSchema;
67
+ message: import("anyvali").StringSchema;
68
+ }>;
69
+ description?: string;
70
+ readonly __brand: "fire-and-forget";
71
+ };
26
72
  };
27
73
  };
28
74
  export type WsFromOriginInput = EventInputType<{
29
75
  input: typeof _wsFromOriginSchema;
30
76
  }>;
77
+ export type ProxyResponseBodyInput = EventInputType<{
78
+ input: typeof _proxyResponseBodySchema;
79
+ }>;
80
+ export type ProxyResponseEndInput = EventInputType<{
81
+ input: typeof _proxyResponseEndSchema;
82
+ }>;
83
+ export type ProxyResponseErrorInput = EventInputType<{
84
+ input: typeof _proxyResponseErrorSchema;
85
+ }>;
31
86
  declare class _PluginRef {
32
87
  static PLUGIN_CLIENT: BSBServiceClientDefinition;
33
88
  }
@@ -38,6 +93,18 @@ export default class TunnelsProxyClient extends ServiceClient<any, typeof _Event
38
93
  wsFromOrigin(obs: Observable, input: WsFromOriginInput): Promise<void>;
39
94
  /** Relay an origin websocket frame to the public websocket for a specific server */
40
95
  wsFromOriginSpecific(serverId: string, obs: Observable, input: WsFromOriginInput): Promise<void>;
96
+ /** Stream an HTTP response chunk to the public client */
97
+ proxyResponseBody(obs: Observable, input: ProxyResponseBodyInput): Promise<void>;
98
+ /** Stream an HTTP response chunk to the public client for a specific server */
99
+ proxyResponseBodySpecific(serverId: string, obs: Observable, input: ProxyResponseBodyInput): Promise<void>;
100
+ /** Complete a streamed HTTP response */
101
+ proxyResponseEnd(obs: Observable, input: ProxyResponseEndInput): Promise<void>;
102
+ /** Complete a streamed HTTP response for a specific server */
103
+ proxyResponseEndSpecific(serverId: string, obs: Observable, input: ProxyResponseEndInput): Promise<void>;
104
+ /** Fail a streamed HTTP response */
105
+ proxyResponseError(obs: Observable, input: ProxyResponseErrorInput): Promise<void>;
106
+ /** Fail a streamed HTTP response for a specific server */
107
+ proxyResponseErrorSpecific(serverId: string, obs: Observable, input: ProxyResponseErrorInput): Promise<void>;
41
108
  }
42
109
  export { TunnelsProxyClient };
43
110
  //# sourceMappingURL=service-tunnels-proxy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-tunnels-proxy.d.ts","sourceRoot":"","sources":["../../../src/.bsb/clients/service-tunnels-proxy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAsH,MAAM,WAAW,CAAC;AAC1K,OAAO,KAAK,EAAE,UAAU,EAAE,0BAA0B,EAAE,cAAc,EAAmB,MAAM,WAAW,CAAC;AAEzG,QAAA,MAAM,mBAAmB;;;;;EAKrB,CAAC;AAEL,QAAA,MAAM,aAAa;;;;;;;;;;;;;CAIjB,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,OAAO,mBAAmB,CAAA;CAAE,CAAC,CAAC;AAMtF,cAAM,UAAU;IACd,MAAM,CAAC,aAAa,6BAAkB;CACvC;AAED,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,aAAa,CAAC,GAAG,EAAE,OAAO,aAAa,EAAE,OAAO,UAAU,CAAC;gBAC7F,OAAO,EAAE,UAAU;IAI/B,OAAO,CAAC,oBAAoB;IAQ5B,8DAA8D;IACxD,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5E,oFAAoF;IAC9E,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAIvG;AACD,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"service-tunnels-proxy.d.ts","sourceRoot":"","sources":["../../../src/.bsb/clients/service-tunnels-proxy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAsH,MAAM,WAAW,CAAC;AAC1K,OAAO,KAAK,EAAE,UAAU,EAAE,0BAA0B,EAAE,cAAc,EAAmB,MAAM,WAAW,CAAC;AAEzG,QAAA,MAAM,mBAAmB;;;;;EAKrB,CAAC;AACL,QAAA,MAAM,wBAAwB;;;EAG1B,CAAC;AACL,QAAA,MAAM,uBAAuB;;;;;;;;EAQzB,CAAC;AACL,QAAA,MAAM,yBAAyB;;;EAG3B,CAAC;AAEL,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOjB,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,OAAO,mBAAmB,CAAA;CAAE,CAAC,CAAC;AACtF,MAAM,MAAM,sBAAsB,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,OAAO,wBAAwB,CAAA;CAAE,CAAC,CAAC;AAChG,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,OAAO,uBAAuB,CAAA;CAAE,CAAC,CAAC;AAC9F,MAAM,MAAM,uBAAuB,GAAG,cAAc,CAAC;IAAE,KAAK,EAAE,OAAO,yBAAyB,CAAA;CAAE,CAAC,CAAC;AAMlG,cAAM,UAAU;IACd,MAAM,CAAC,aAAa,6BAAkB;CACvC;AAED,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,aAAa,CAAC,GAAG,EAAE,OAAO,aAAa,EAAE,OAAO,UAAU,CAAC;gBAC7F,OAAO,EAAE,UAAU;IAI/B,OAAO,CAAC,oBAAoB;IAQ5B,8DAA8D;IACxD,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5E,oFAAoF;IAC9E,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtG,yDAAyD;IACnD,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtF,+EAA+E;IACzE,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhH,wCAAwC;IAClC,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpF,8DAA8D;IACxD,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9G,oCAAoC;IAC9B,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxF,0DAA0D;IACpD,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;CAInH;AACD,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Auto-generated BSB virtual client for service-tunnels-proxy
3
3
  * DO NOT EDIT - Regenerated on every build
4
- * @version 1.0.33
4
+ * @version 1.0.35
5
5
  */
6
6
  import { ServiceClient, bsb, optional, createFireAndForgetEvent, createEventSchemas } from "@bsb/base";
7
7
  const _wsFromOriginSchema = bsb.object({
@@ -10,9 +10,29 @@ const _wsFromOriginSchema = bsb.object({
10
10
  "event": optional(bsb.string()),
11
11
  "body": optional(bsb.string())
12
12
  });
13
+ const _proxyResponseBodySchema = bsb.object({
14
+ "publicRequestId": bsb.string(),
15
+ "body": bsb.string()
16
+ });
17
+ const _proxyResponseEndSchema = bsb.object({
18
+ "publicRequestId": bsb.string(),
19
+ "requestId": bsb.string(),
20
+ "ownerServerId": bsb.string(),
21
+ "status": bsb.number(),
22
+ "clientApiRoundtripMs": bsb.number(),
23
+ "cliOverheadMs": optional(bsb.number()),
24
+ "originMs": optional(bsb.number())
25
+ });
26
+ const _proxyResponseErrorSchema = bsb.object({
27
+ "publicRequestId": bsb.string(),
28
+ "message": bsb.string()
29
+ });
13
30
  const _EventSchemas = createEventSchemas({
14
31
  onEvents: {
15
32
  'ws.fromOrigin': createFireAndForgetEvent(_wsFromOriginSchema, "Relay an origin websocket frame to the public websocket"),
33
+ 'proxy.response.body': createFireAndForgetEvent(_proxyResponseBodySchema, "Stream an HTTP response chunk to the public client"),
34
+ 'proxy.response.end': createFireAndForgetEvent(_proxyResponseEndSchema, "Complete a streamed HTTP response"),
35
+ 'proxy.response.error': createFireAndForgetEvent(_proxyResponseErrorSchema, "Fail a streamed HTTP response"),
16
36
  },
17
37
  });
18
38
  const _PLUGIN_CLIENT = {
@@ -42,6 +62,36 @@ export default class TunnelsProxyClient extends ServiceClient {
42
62
  const events = this._requireClientEvents("emitEventSpecific", "ws.fromOrigin");
43
63
  await events.emitEventSpecific("ws.fromOrigin", serverId, obs, input);
44
64
  }
65
+ /** Stream an HTTP response chunk to the public client */
66
+ async proxyResponseBody(obs, input) {
67
+ const events = this._requireClientEvents("emitEvent", "proxy.response.body");
68
+ await events.emitEvent("proxy.response.body", obs, input);
69
+ }
70
+ /** Stream an HTTP response chunk to the public client for a specific server */
71
+ async proxyResponseBodySpecific(serverId, obs, input) {
72
+ const events = this._requireClientEvents("emitEventSpecific", "proxy.response.body");
73
+ await events.emitEventSpecific("proxy.response.body", serverId, obs, input);
74
+ }
75
+ /** Complete a streamed HTTP response */
76
+ async proxyResponseEnd(obs, input) {
77
+ const events = this._requireClientEvents("emitEvent", "proxy.response.end");
78
+ await events.emitEvent("proxy.response.end", obs, input);
79
+ }
80
+ /** Complete a streamed HTTP response for a specific server */
81
+ async proxyResponseEndSpecific(serverId, obs, input) {
82
+ const events = this._requireClientEvents("emitEventSpecific", "proxy.response.end");
83
+ await events.emitEventSpecific("proxy.response.end", serverId, obs, input);
84
+ }
85
+ /** Fail a streamed HTTP response */
86
+ async proxyResponseError(obs, input) {
87
+ const events = this._requireClientEvents("emitEvent", "proxy.response.error");
88
+ await events.emitEvent("proxy.response.error", obs, input);
89
+ }
90
+ /** Fail a streamed HTTP response for a specific server */
91
+ async proxyResponseErrorSpecific(serverId, obs, input) {
92
+ const events = this._requireClientEvents("emitEventSpecific", "proxy.response.error");
93
+ await events.emitEventSpecific("proxy.response.error", serverId, obs, input);
94
+ }
45
95
  }
46
96
  export { TunnelsProxyClient };
47
97
  //# sourceMappingURL=service-tunnels-proxy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-tunnels-proxy.js","sourceRoot":"","sources":["../../../src/.bsb/clients/service-tunnels-proxy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAc,GAAG,EAAE,QAAQ,EAAmC,wBAAwB,EAAwB,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAG1K,MAAM,mBAAmB,GAAG,GAAG,CAAC,MAAM,CAAC;IACnC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE;IAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE;IACzB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAC/B,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;CAC/B,CAAC,CAAC;AAEL,MAAM,aAAa,GAAG,kBAAkB,CAAC;IACvC,QAAQ,EAAE;QACR,eAAe,EAAE,wBAAwB,CAAC,mBAAmB,EAAE,yDAAyD,CAAC;KAC1H;CACF,CAAC,CAAC;AAIH,MAAM,cAAc,GAA+B;IACjD,IAAI,EAAE,uBAAuB;CAC9B,CAAC;AAEF,MAAM,UAAU;IACd,MAAM,CAAC,aAAa,GAAG,cAAc,CAAC;;AAGxC,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,aAA2D;IACzG,YAAY,OAAmB;QAC7B,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IAEO,oBAAoB,CAAC,UAAkB,EAAE,SAAiB;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAa,CAAC;QAClC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,UAAU,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,qDAAqD,SAAS,SAAS,UAAU,wnBAAwnB,CAAC,CAAC;QAC7tB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,YAAY,CAAC,GAAe,EAAE,KAAwB;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACvE,MAAM,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,oFAAoF;IACpF,KAAK,CAAC,oBAAoB,CAAC,QAAgB,EAAE,GAAe,EAAE,KAAwB;QACpF,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QAC/E,MAAM,MAAM,CAAC,iBAAiB,CAAC,eAAe,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;CACF;AACD,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"service-tunnels-proxy.js","sourceRoot":"","sources":["../../../src/.bsb/clients/service-tunnels-proxy.ts"],"names":[],"mappings":"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"}
package/lib/cli.js CHANGED
@@ -101,6 +101,7 @@ async function startTunnel(config) {
101
101
  const ws = new WebSocket(url);
102
102
  const originSockets = new Map();
103
103
  const requests = new Map();
104
+ const originRequests = new Map();
104
105
  let alive = true;
105
106
  let reconnect = true;
106
107
  const heartbeat = setInterval(() => {
@@ -128,6 +129,9 @@ async function startTunnel(config) {
128
129
  for (const origin of originSockets.values())
129
130
  origin.close();
130
131
  originSockets.clear();
132
+ for (const request of originRequests.values())
133
+ request.abort();
134
+ originRequests.clear();
131
135
  console.warn(`Tunnel server connection lost for ${config.host}:${config.port} (server-side, your local service is fine): code=${code} reason=${reason.toString() || "none"}`);
132
136
  if (!reconnect || code === 1002 || code === 1008)
133
137
  return;
@@ -208,79 +212,90 @@ async function startTunnel(config) {
208
212
  origin.close();
209
213
  return;
210
214
  }
215
+ if (frame.type === "request.cancel" && frame.requestId) {
216
+ originRequests.get(frame.requestId)?.abort();
217
+ return;
218
+ }
211
219
  if (frame.type !== "request.start" || !frame.requestId)
212
220
  return;
213
221
  const request = JSON.parse(raw.toString());
222
+ const controller = new AbortController();
223
+ originRequests.set(request.requestId, controller);
214
224
  try {
215
225
  const cliStartedAt = Date.now();
216
226
  const headers = { ...request.headers };
217
227
  if (config.host_header)
218
228
  headers.host = config.host_header;
219
- const response = await localRequest(config.host, config.port, request.method, request.path, headers, request.body);
220
- const cliOverheadMs = Math.max(0, Date.now() - cliStartedAt - response.originMs);
221
- ws.send(JSON.stringify({
229
+ const response = await localRequest(config.host, config.port, request.method, request.path, headers, request.body, controller.signal, async (status, responseHeaders) => sendFrame(ws, {
222
230
  type: "response.start",
223
231
  requestId: request.requestId,
224
- status: response.status,
225
- headers: response.headers
226
- }));
227
- ws.send(JSON.stringify({
232
+ status,
233
+ headers: responseHeaders
234
+ }), async (body) => sendFrame(ws, {
228
235
  type: "response.body",
229
236
  requestId: request.requestId,
230
- body: response.body
231
- }));
232
- ws.send(JSON.stringify({
233
- type: "response.end",
234
- requestId: request.requestId,
235
- cliOverheadMs,
236
- originMs: response.originMs
237
+ body
237
238
  }));
239
+ const cliOverheadMs = Math.max(0, Date.now() - cliStartedAt - response.originMs);
238
240
  requests.set(request.requestId, {
239
241
  method: request.method,
240
242
  path: request.path,
241
243
  status: response.status,
242
244
  originMs: response.originMs
243
245
  });
246
+ await sendFrame(ws, {
247
+ type: "response.end",
248
+ requestId: request.requestId,
249
+ cliOverheadMs,
250
+ originMs: response.originMs
251
+ });
244
252
  }
245
253
  catch (error) {
246
- ws.send(JSON.stringify({
247
- type: "error",
248
- requestId: request.requestId,
249
- message: error instanceof Error ? error.message : String(error)
250
- }));
254
+ if (!controller.signal.aborted) {
255
+ await sendFrame(ws, {
256
+ type: "error",
257
+ requestId: request.requestId,
258
+ message: error instanceof Error ? error.message : String(error)
259
+ });
260
+ }
261
+ }
262
+ finally {
263
+ originRequests.delete(request.requestId);
251
264
  }
252
265
  });
253
266
  };
254
267
  connect();
255
268
  await new Promise(() => undefined);
256
269
  }
257
- function localRequest(host, port, method, path, headers, body) {
258
- return new Promise((resolve, reject) => {
259
- const startedAt = Date.now();
260
- const req = httpRequest({ host, port, method, path, headers }, (res) => {
261
- const chunks = [];
262
- res.on("data", (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
263
- res.on("end", () => {
264
- const responseHeaders = {};
265
- for (const [key, value] of Object.entries(res.headers)) {
266
- if (Array.isArray(value))
267
- responseHeaders[key] = value.join(", ");
268
- else if (value !== undefined)
269
- responseHeaders[key] = value;
270
- }
271
- resolve({
272
- status: res.statusCode ?? 502,
273
- headers: responseHeaders,
274
- body: Buffer.concat(chunks).toString("base64"),
275
- originMs: Date.now() - startedAt
276
- });
277
- });
278
- });
270
+ async function localRequest(host, port, method, path, headers, body, signal, onStart, onBody) {
271
+ const startedAt = Date.now();
272
+ const response = await new Promise((resolve, reject) => {
273
+ const req = httpRequest({ host, port, method, path, headers, signal }, resolve);
279
274
  req.on("error", reject);
280
275
  if (body)
281
276
  req.write(Buffer.from(body, "base64"));
282
277
  req.end();
283
278
  });
279
+ const responseHeaders = {};
280
+ for (const [key, value] of Object.entries(response.headers)) {
281
+ if (Array.isArray(value))
282
+ responseHeaders[key] = value.join(", ");
283
+ else if (value !== undefined)
284
+ responseHeaders[key] = value;
285
+ }
286
+ const status = response.statusCode ?? 502;
287
+ await onStart(status, responseHeaders);
288
+ for await (const value of response) {
289
+ const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);
290
+ if (chunk.byteLength)
291
+ await onBody(chunk.toString("base64"));
292
+ }
293
+ return { status, originMs: Date.now() - startedAt };
294
+ }
295
+ function sendFrame(ws, value) {
296
+ return new Promise((resolve, reject) => {
297
+ ws.send(JSON.stringify(value), (error) => error ? reject(error) : resolve());
298
+ });
284
299
  }
285
300
  function entryLabel(t, i) {
286
301
  if (t.name)