@flexent/ws-proxy 2.12.0 → 2.14.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.
package/README.md CHANGED
@@ -4,19 +4,23 @@ Transparent WebSocket upgrade relay for Node.js HTTP servers.
4
4
 
5
5
  ## Usage
6
6
 
7
- Subclass `WsProxy` and implement outbound connection handling:
7
+ Subclass `WsProxy` and implement `processConnection` to authenticate, open the outbound socket, and specify the upgrade request to send upstream:
8
8
 
9
9
  ```ts
10
- import { Duplex } from 'node:stream';
11
- import { WsProxy, WsProxyContext } from '@flexent/ws-proxy';
10
+ import { connectToUrl, WsProxy, WsProxyContext, WsProxyRelay } from '@flexent/ws-proxy';
12
11
 
13
12
  class MyProxy extends WsProxy {
14
13
 
15
- protected override async processConnection(_ctx: WsProxyContext): Promise<void> {}
16
-
17
- protected override async connectOutbound(_ctx: WsProxyContext): Promise<Duplex> {
18
- // Return a TCP socket or other Duplex connected to the upstream server.
19
- throw new Error('Not implemented');
14
+ protected async processConnection(ctx: WsProxyContext): Promise<WsProxyRelay> {
15
+ const outbound = await connectToUrl('wss://upstream.example/lease');
16
+ return {
17
+ outbound,
18
+ upgrade: {
19
+ path: '/lease?t=token',
20
+ host: 'upstream.example',
21
+ omitHeaders: ['authorization'],
22
+ },
23
+ };
20
24
  }
21
25
 
22
26
  }
@@ -1,16 +1,15 @@
1
1
  import { IncomingMessage } from 'node:http';
2
2
  import { Duplex } from 'node:stream';
3
- import { OutboundUpgradeOptions, WsProxyContext } from './types.js';
3
+ import { OutboundUpgradeOptions, WsProxyContext, WsProxyRelay } from './types.js';
4
4
  export declare abstract class WsProxy {
5
5
  onUpgrade(request: IncomingMessage, socket: Duplex, head: Buffer): void;
6
- protected abstract processConnection(ctx: WsProxyContext): Promise<void>;
7
- protected abstract connectOutbound(ctx: WsProxyContext): Promise<Duplex>;
8
- protected buildOutboundUpgrade(ctx: WsProxyContext): string;
6
+ private onUpgradeInternal;
7
+ protected abstract processConnection(ctx: WsProxyContext): Promise<WsProxyRelay>;
9
8
  protected onConnected(_ctx: WsProxyContext, _outbound: Duplex): void;
10
9
  protected onError(error: unknown, ctx: WsProxyContext): void;
11
10
  protected encodeForwardedUpgrade(request: IncomingMessage, options: OutboundUpgradeOptions): string;
12
- private relay;
13
11
  private runRelay;
14
12
  private assertWebSocketUpgrade;
15
13
  private reject;
14
+ protected canonicalHeaderName(name: string): string;
16
15
  }
@@ -14,21 +14,18 @@ const FORWARDED_HEADER_NAMES = [
14
14
  ];
15
15
  export class WsProxy {
16
16
  onUpgrade(request, socket, head) {
17
+ this.onUpgradeInternal(request, socket, head).catch(() => { });
18
+ }
19
+ async onUpgradeInternal(request, socket, head) {
17
20
  const ctx = { request, socket, head };
18
- socket.pause();
19
21
  try {
22
+ socket.pause();
20
23
  this.assertWebSocketUpgrade(ctx);
24
+ await this.runRelay(ctx);
21
25
  }
22
26
  catch (error) {
23
27
  this.onError(error, ctx);
24
- return;
25
28
  }
26
- this.relay(ctx);
27
- }
28
- buildOutboundUpgrade(ctx) {
29
- return this.encodeForwardedUpgrade(ctx.request, {
30
- path: ctx.request.url ?? '/',
31
- });
32
29
  }
33
30
  onConnected(_ctx, _outbound) { }
34
31
  onError(error, ctx) {
@@ -48,7 +45,7 @@ export class WsProxy {
48
45
  if (value == null) {
49
46
  continue;
50
47
  }
51
- headers[canonicalHeaderName(name)] = value;
48
+ headers[this.canonicalHeaderName(name)] = value;
52
49
  }
53
50
  if (options.host) {
54
51
  headers.Host = options.host;
@@ -58,10 +55,10 @@ export class WsProxy {
58
55
  }
59
56
  for (const [name, value] of Object.entries(options.headers ?? {})) {
60
57
  if (value == null) {
61
- delete headers[canonicalHeaderName(name)];
58
+ delete headers[this.canonicalHeaderName(name)];
62
59
  continue;
63
60
  }
64
- headers[canonicalHeaderName(name)] = value;
61
+ headers[this.canonicalHeaderName(name)] = value;
65
62
  }
66
63
  const lines = [`GET ${options.path} HTTP/${request.httpVersion}`];
67
64
  for (const [name, value] of Object.entries(headers)) {
@@ -76,21 +73,15 @@ export class WsProxy {
76
73
  }
77
74
  return `${lines.join('\r\n')}\r\n\r\n`;
78
75
  }
79
- relay(ctx) {
80
- this.runRelay(ctx).catch(error => {
81
- this.onError(error, ctx);
82
- });
83
- }
84
76
  async runRelay(ctx) {
85
- await this.processConnection(ctx);
86
- const outbound = await this.connectOutbound(ctx);
87
- outbound.write(this.buildOutboundUpgrade(ctx));
77
+ const relay = await this.processConnection(ctx);
78
+ relay.outbound.write(this.encodeForwardedUpgrade(ctx.request, relay.upgrade));
88
79
  ctx.socket.resume();
89
- pipeBidirectional(ctx.socket, outbound);
80
+ pipeBidirectional(ctx.socket, relay.outbound);
90
81
  if (ctx.head.length > 0) {
91
- queueMicrotask(() => outbound.write(ctx.head));
82
+ queueMicrotask(() => relay.outbound.write(ctx.head));
92
83
  }
93
- this.onConnected(ctx, outbound);
84
+ this.onConnected(ctx, relay.outbound);
94
85
  }
95
86
  assertWebSocketUpgrade(ctx) {
96
87
  if (ctx.request.method !== 'GET') {
@@ -124,11 +115,11 @@ export class WsProxy {
124
115
  ].join('\r\n');
125
116
  socket.end(payload);
126
117
  }
127
- }
128
- function canonicalHeaderName(name) {
129
- return name
130
- .split('-')
131
- .map(part => part ? `${part[0].toUpperCase()}${part.slice(1).toLowerCase()}` : part)
132
- .join('-');
118
+ canonicalHeaderName(name) {
119
+ return name
120
+ .split('-')
121
+ .map(part => part ? `${part[0].toUpperCase()}${part.slice(1).toLowerCase()}` : part)
122
+ .join('-');
123
+ }
133
124
  }
134
125
  //# sourceMappingURL=WsProxy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WsProxy.js","sourceRoot":"","sources":["../../src/main/WsProxy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WsProxy.js","sourceRoot":"","sources":["../../src/main/WsProxy.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  export * from './errors.js';
2
2
  export * from './types.js';
3
+ export * from './util/connect.js';
3
4
  export * from './WsProxy.js';
package/out/main/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './errors.js';
2
2
  export * from './types.js';
3
+ export * from './util/connect.js';
3
4
  export * from './WsProxy.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/main/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/main/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC"}
@@ -11,3 +11,7 @@ export interface OutboundUpgradeOptions {
11
11
  headers?: Record<string, string | string[]>;
12
12
  omitHeaders?: string[];
13
13
  }
14
+ export interface WsProxyRelay {
15
+ outbound: Duplex;
16
+ upgrade: OutboundUpgradeOptions;
17
+ }
@@ -0,0 +1,2 @@
1
+ import { Duplex } from 'node:stream';
2
+ export declare function connectToUrl(url: URL | string): Promise<Duplex>;
@@ -0,0 +1,23 @@
1
+ import { once } from 'node:events';
2
+ import net from 'node:net';
3
+ import tls from 'node:tls';
4
+ export async function connectToUrl(url) {
5
+ const target = typeof url === 'string' ? new URL(url) : url;
6
+ if (target.protocol === 'wss:' || target.protocol === 'https:') {
7
+ const hostname = target.hostname;
8
+ const socket = tls.connect({
9
+ host: hostname,
10
+ port: target.port ? Number(target.port) : 443,
11
+ ...(net.isIP(hostname) ? {} : { servername: hostname }),
12
+ });
13
+ await once(socket, 'secureConnect');
14
+ return socket;
15
+ }
16
+ if (target.protocol === 'ws:' || target.protocol === 'http:') {
17
+ const socket = net.connect(target.port ? Number(target.port) : 80, target.hostname);
18
+ await once(socket, 'connect');
19
+ return socket;
20
+ }
21
+ throw new Error(`Unsupported URL protocol: ${target.protocol}`);
22
+ }
23
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/main/util/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAiB;IAChD,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;YACvB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG;YAC7C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;SAC1D,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CACtB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EACtC,MAAM,CAAC,QAAQ,CAClB,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpE,CAAC"}
@@ -1,16 +1,29 @@
1
1
  export function pipeBidirectional(left, right) {
2
- const onLeftError = (error) => destroyQuietly(right, error);
3
- const onRightError = (error) => destroyQuietly(left, error);
4
- const onClose = () => {
2
+ let cleaned = false;
3
+ const cleanup = () => {
4
+ if (cleaned) {
5
+ return;
6
+ }
7
+ cleaned = true;
5
8
  left.off('error', onLeftError);
6
9
  right.off('error', onRightError);
7
- left.off('close', onClose);
8
- right.off('close', onClose);
10
+ left.off('close', onLeftGone);
11
+ right.off('close', onRightGone);
12
+ left.off('end', onLeftGone);
13
+ right.off('end', onRightGone);
9
14
  };
15
+ const onLeftGone = () => destroyQuietly(right);
16
+ const onRightGone = () => destroyQuietly(left);
17
+ const onLeftError = (error) => destroyQuietly(right, error);
18
+ const onRightError = (error) => destroyQuietly(left, error);
10
19
  left.on('error', onLeftError);
11
20
  right.on('error', onRightError);
12
- left.on('close', onClose);
13
- right.on('close', onClose);
21
+ left.on('close', onLeftGone);
22
+ right.on('close', onRightGone);
23
+ left.on('end', onLeftGone);
24
+ right.on('end', onRightGone);
25
+ left.once('close', cleanup);
26
+ right.once('close', cleanup);
14
27
  left.pipe(right, { end: false });
15
28
  right.pipe(left, { end: false });
16
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pipe.js","sourceRoot":"","sources":["../../../src/main/util/pipe.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAa;IACzD,MAAM,WAAW,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,GAAG,EAAE;QACjB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3B,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,KAAa;IACjD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"pipe.js","sourceRoot":"","sources":["../../../src/main/util/pipe.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAa;IACzD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,OAAO,GAAG,GAAG,EAAE;QACjB,IAAI,OAAO,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9B,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC5B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAClC,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC3B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,KAAa;IACjD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import assert from 'node:assert/strict';
2
+ import { once } from 'node:events';
3
+ import { PassThrough } from 'node:stream';
4
+ import { pipeBidirectional } from '../main/util/pipe.js';
5
+ describe('pipeBidirectional', () => {
6
+ it('destroys the peer when the left side ends', async () => {
7
+ const left = new PassThrough();
8
+ const right = new PassThrough();
9
+ pipeBidirectional(left, right);
10
+ left.end();
11
+ await once(right, 'close');
12
+ assert.equal(right.destroyed, true);
13
+ });
14
+ it('destroys the peer when the right side ends', async () => {
15
+ const left = new PassThrough();
16
+ const right = new PassThrough();
17
+ pipeBidirectional(left, right);
18
+ right.end();
19
+ await once(left, 'close');
20
+ assert.equal(left.destroyed, true);
21
+ });
22
+ });
23
+ //# sourceMappingURL=pipe.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipe.test.js","sourceRoot":"","sources":["../../src/test/pipe.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAE/B,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;QAChC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;QAChC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,MAAM,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AAEP,CAAC,CAAC,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import assert from 'node:assert/strict';
2
+ import { once } from 'node:events';
2
3
  import { PassThrough } from 'node:stream';
3
4
  import { WsProxy } from '../main/WsProxy.js';
4
- describe('@flexent/ws-proxy', () => {
5
+ describe('WsProxy', () => {
5
6
  it('rejects non-WebSocket upgrade requests', async () => {
6
7
  const proxy = new TestProxy();
7
8
  const socket = new PassThrough();
@@ -35,11 +36,35 @@ describe('@flexent/ws-proxy', () => {
35
36
  assert.match(payload, /Host: host\.example\r\n/i);
36
37
  assert.match(payload, /Sec-Websocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n/i);
37
38
  });
39
+ it('destroys outbound when the client disconnects', async () => {
40
+ const outbound = new PassThrough();
41
+ const proxy = new TestProxy(outbound);
42
+ const socket = new PassThrough();
43
+ proxy.onUpgrade({
44
+ method: 'GET',
45
+ httpVersion: '1.1',
46
+ headers: {
47
+ upgrade: 'websocket',
48
+ connection: 'Upgrade',
49
+ 'sec-websocket-key': 'dGhlIHNhbXBsZSBub25jZQ==',
50
+ },
51
+ }, socket, Buffer.alloc(0));
52
+ await once(outbound, 'data');
53
+ socket.end();
54
+ await once(outbound, 'close');
55
+ assert.equal(outbound.destroyed, true);
56
+ });
38
57
  });
39
58
  class TestProxy extends WsProxy {
40
- async processConnection() { }
41
- async connectOutbound() {
42
- return new PassThrough();
59
+ constructor(outbound = new PassThrough()) {
60
+ super();
61
+ this.outbound = outbound;
62
+ }
63
+ async processConnection() {
64
+ return {
65
+ outbound: this.outbound,
66
+ upgrade: { path: '/' },
67
+ };
43
68
  }
44
69
  publicEncode(request, options) {
45
70
  return this.encodeForwardedUpgrade(request, options);
@@ -1 +1 @@
1
- {"version":3,"file":"ws-proxy.test.js","sourceRoot":"","sources":["../../src/test/ws-proxy.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAE/B,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,KAAK,CAAC,SAAS,CAAC;YACZ,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE;SACrB,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC;YAC/B,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,GAAG,EAAE,sBAAsB;YAC3B,OAAO,EAAE;gBACL,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,WAAW;gBACpB,UAAU,EAAE,SAAS;gBACrB,mBAAmB,EAAE,0BAA0B;gBAC/C,uBAAuB,EAAE,IAAI;aAChC;SACe,EAAE;YAClB,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,cAAc;SACvB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,sCAAsC,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,kDAAkD,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AAEP,CAAC,CAAC,CAAC;AAEH,MAAM,SAAU,SAAQ,OAAO;IAER,KAAK,CAAC,iBAAiB,KAAmB,CAAC;IAE3C,KAAK,CAAC,eAAe;QACpC,OAAO,IAAI,WAAW,EAAE,CAAC;IAC7B,CAAC;IAED,YAAY,CAAC,OAAwB,EAAE,OAAwC;QAC3E,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;CAEJ"}
1
+ {"version":3,"file":"ws-proxy.test.js","sourceRoot":"","sources":["../../src/test/ws-proxy.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flexent/ws-proxy",
3
- "version": "2.12.0",
3
+ "version": "2.14.1",
4
4
  "description": "Transparent WebSocket upgrade relay for Node.js HTTP servers",
5
5
  "author": "Boris Okunskiy",
6
6
  "license": "MIT",