From 804523aff70e7dd76aea25e22d4a7530da62b748 Mon Sep 17 00:00:00 2001 From: Jacob M-G Evans <27247160+JacobMGEvans@users.noreply.github.com> Date: Wed, 16 Feb 2022 10:45:06 -0600 Subject: [PATCH] bugfix: replace destroy on faye websockets with `close()` (#472) interface to give faye same types as compliant ws with additional `pipe()` implementation --- .changeset/few-cherries-compare.md | 6 ++++++ packages/wrangler/src/proxy.ts | 14 ++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 .changeset/few-cherries-compare.md diff --git a/.changeset/few-cherries-compare.md b/.changeset/few-cherries-compare.md new file mode 100644 index 000000000000..4e032ec2efc7 --- /dev/null +++ b/.changeset/few-cherries-compare.md @@ -0,0 +1,6 @@ +--- +"wrangler": patch +--- + +bugfix: Replace `.destroy()` on `faye-websockets` with `.close()` +added: Interface to give faye same types as compliant `ws` with additional `.pipe()` implementation; `.on("message" => fn)` diff --git a/packages/wrangler/src/proxy.ts b/packages/wrangler/src/proxy.ts index 2ec5bb30bd7c..109a806164b7 100644 --- a/packages/wrangler/src/proxy.ts +++ b/packages/wrangler/src/proxy.ts @@ -12,6 +12,12 @@ import type { Server, } from "node:http"; import type { ClientHttp2Session, ServerHttp2Stream } from "node:http2"; +import type ws from "ws"; + +interface IWebsocket extends ws { + // Pipe implements .on("message", ...) + pipe(fn: T): IWebsocket; +} /** * `usePreviewServer` is a React hook that creates a local development @@ -207,18 +213,18 @@ export function usePreviewServer({ const { headers, url } = message; addCfPreviewTokenHeader(headers, previewToken.value); headers["host"] = previewToken.host; - const localWebsocket = new WebSocket(message, socket, body); + const localWebsocket = new WebSocket(message, socket, body) as IWebsocket; // TODO(soon): Custom WebSocket protocol is not working? const remoteWebsocketClient = new WebSocket.Client( `wss://${previewToken.host}${url}`, [], { headers } - ); + ) as IWebsocket; localWebsocket.pipe(remoteWebsocketClient).pipe(localWebsocket); // We close down websockets whenever we refresh the token. cleanupListeners.push(() => { - localWebsocket.destroy(); - remoteWebsocketClient.destroy(); + localWebsocket.close(); + remoteWebsocketClient.close(); }); }; proxy.on("upgrade", handleUpgrade);