diff --git a/src/__tests__/use.ts b/src/__tests__/use.ts index 7d8d0c4a..8455ac34 100644 --- a/src/__tests__/use.ts +++ b/src/__tests__/use.ts @@ -504,6 +504,27 @@ for (const { tServer, skipUWS, startTServer } of tServers) { }); }); + it('should handle and limit internal server errors that are not instances of `Error`', async () => { + const { url } = await startTServer({ + onConnect: () => { + throw 'i am exactly 124 characters long i am exactly 124 characters long i am exactly 124 characters long i am exactly 124 characte'; + }, + }); + + const client = await createTClient(url); + client.ws.send( + stringifyMessage({ + type: MessageType.ConnectionInit, + }), + ); + + await client.waitForClose((event) => { + expect(event.code).toBe(CloseCode.InternalServerError); + expect(event.reason).toBe('Internal server error'); + expect(event.wasClean).toBeTruthy(); // because the server reported the error + }); + }); + describe('Keep-Alive', () => { it('should dispatch pings after the timeout has passed', async (done) => { const { url } = await startTServer(undefined, 50); diff --git a/src/use/@fastify/websocket.ts b/src/use/@fastify/websocket.ts index e77e1d07..4602f507 100644 --- a/src/use/@fastify/websocket.ts +++ b/src/use/@fastify/websocket.ts @@ -79,7 +79,10 @@ export function makeHandler< CloseCode.InternalServerError, isProd ? 'Internal server error' - : limitCloseReason(err.message, 'Internal server error'), + : limitCloseReason( + err instanceof Error ? err.message : String(err), + 'Internal server error', + ), ); } catch (err) { firstErr = firstErr ?? err; @@ -104,7 +107,10 @@ export function makeHandler< CloseCode.InternalServerError, isProd ? 'Internal server error' - : limitCloseReason(err.message, 'Internal server error'), + : limitCloseReason( + err instanceof Error ? err.message : String(err), + 'Internal server error', + ), ); } @@ -161,7 +167,10 @@ export function makeHandler< CloseCode.InternalServerError, isProd ? 'Internal server error' - : limitCloseReason(err.message, 'Internal server error'), + : limitCloseReason( + err instanceof Error ? err.message : String(err), + 'Internal server error', + ), ); } }), diff --git a/src/use/uWebSockets.ts b/src/use/uWebSockets.ts index d175b3fc..aa67afe6 100644 --- a/src/use/uWebSockets.ts +++ b/src/use/uWebSockets.ts @@ -205,7 +205,10 @@ export function makeBehavior< CloseCode.InternalServerError, isProd ? 'Internal server error' - : limitCloseReason(err.message, 'Internal server error'), + : limitCloseReason( + err instanceof Error ? err.message : String(err), + 'Internal server error', + ), ); } }, diff --git a/src/use/ws.ts b/src/use/ws.ts index d1cedaf0..f991edfa 100644 --- a/src/use/ws.ts +++ b/src/use/ws.ts @@ -73,7 +73,10 @@ export function useServer< CloseCode.InternalServerError, isProd ? 'Internal server error' - : limitCloseReason(err.message, 'Internal server error'), + : limitCloseReason( + err instanceof Error ? err.message : String(err), + 'Internal server error', + ), ); } catch (err) { firstErr = firstErr ?? err; @@ -94,7 +97,10 @@ export function useServer< CloseCode.InternalServerError, isProd ? 'Internal server error' - : limitCloseReason(err.message, 'Internal server error'), + : limitCloseReason( + err instanceof Error ? err.message : String(err), + 'Internal server error', + ), ); }); @@ -146,7 +152,10 @@ export function useServer< CloseCode.InternalServerError, isProd ? 'Internal server error' - : limitCloseReason(err.message, 'Internal server error'), + : limitCloseReason( + err instanceof Error ? err.message : String(err), + 'Internal server error', + ), ); } }),