From bbdf304b8bdd53fe1b7d4f039a35ee4cbbd5a566 Mon Sep 17 00:00:00 2001 From: Corey Farrell Date: Sat, 30 Mar 2024 09:37:43 -0400 Subject: [PATCH] fix: Websocket proxy was not working --- index.js | 69 +++++--------------------------------------------------- 1 file changed, 6 insertions(+), 63 deletions(-) diff --git a/index.js b/index.js index 9ae12d4..2c0e7af 100644 --- a/index.js +++ b/index.js @@ -25,65 +25,9 @@ function forwardWSHeaders(headers) { return headers; } -// Begin copied from fastify-http-proxy -function liftErrorCode(code) { - if (typeof code !== 'number') { - // Sometimes "close" event emits with a non-numeric value - return 1011; - } - - switch (code) { - case 1004: - case 1005: - case 1006: - // ws module forbid those error codes usage, lift to "application level" (4xxx) - return 4000 + (code % 1000); - default: - return code; - } -} - -function closeWebSocket(socket, code, reason) { - if (socket.readyState === WebSocket.OPEN) { - socket.close(liftErrorCode(code), reason); - } -} - -function waitConnection(socket, write) { - if (socket.readyState === WebSocket.CONNECTING) { - socket.once('open', write); - } else { - write(); - } -} - -function proxyWebSockets(source, target) { - function close(code, reason) { - closeWebSocket(source, code, reason); - closeWebSocket(target, code, reason); - } - - source.on('message', data => waitConnection(target, () => target.send(data))); - source.on('ping', data => waitConnection(target, () => target.ping(data))); - source.on('pong', data => waitConnection(target, () => target.pong(data))); - source.on('close', close); - source.on('error', error => close(1011, error.message)); - source.on('unexpected-response', () => close(1011, 'unexpected response')); - - // source WebSocket is already connected because it is created by ws server - target.on('message', data => source.send(data)); - target.on('ping', data => source.ping(data)); - target.on('pong', data => source.pong(data)); - target.on('close', close); - target.on('error', error => close(1011, error.message)); - target.on('unexpected-response', () => close(1011, 'unexpected response')); -} -// End copied from fastify-http-proxy - export class FastifyIntegrationDaemon { constructor(fastifyOptions) { this.daemon = fastify(fastifyOptions); - this.daemon.register(fastifyWebSocket); } serveProxy({prefix, upstream, onResponse}) { @@ -97,13 +41,12 @@ export class FastifyIntegrationDaemon { return this; } - forwardWS({path, destination, forwardHeaders = forwardWSHeaders}) { - this.daemon.get(path, {websocket: true}, (connection, request) => { - const upstream = new WebSocket(destination, { - headers: forwardHeaders({...request.headers}) - }); - - proxyWebSockets(connection.socket, upstream); + forwardWS({path, destination}) { + this.daemon.register(fastifyHttpProxy, { + websocket: true, + prefix: path, + upstream: destination, + wsUpstream: destination }); return this;