diff --git a/packages/ws/src/ws/WebSocketShard.ts b/packages/ws/src/ws/WebSocketShard.ts index 73222737ce9e..82195d941b9b 100644 --- a/packages/ws/src/ws/WebSocketShard.ts +++ b/packages/ws/src/ws/WebSocketShard.ts @@ -667,10 +667,23 @@ export class WebSocketShard extends AsyncEventEmitter { this.zLibSyncInflate.push(Buffer.from(decompressable), flush ? zLibSync.Z_SYNC_FLUSH : zLibSync.Z_NO_FLUSH); if (this.zLibSyncInflate.err) { - this.emit( - WebSocketShardEvents.Error, - new Error(`${this.zLibSyncInflate.err}${this.zLibSyncInflate.msg ? `: ${this.zLibSyncInflate.msg}` : ''}`), - ); + // Must be here because zlib-sync is lazily loaded + const ZlibErrorCodes = { + [zLibSync.Z_NEED_DICT]: 'Z_NEED_DICT', + [zLibSync.Z_STREAM_END]: 'Z_STREAM_END', + [zLibSync.Z_ERRNO]: 'Z_ERRNO', + [zLibSync.Z_STREAM_ERROR]: 'Z_STREAM_ERROR', + [zLibSync.Z_DATA_ERROR]: 'Z_DATA_ERROR', + [zLibSync.Z_MEM_ERROR]: 'Z_MEM_ERROR', + [zLibSync.Z_BUF_ERROR]: 'Z_BUF_ERROR', + [zLibSync.Z_VERSION_ERROR]: 'Z_VERSION_ERROR', + } as const satisfies Record; + + // Try to match nodejs zlib errors as much as possible + const error: NodeJS.ErrnoException = new Error(this.zLibSyncInflate.msg ?? undefined); + error.errno = this.zLibSyncInflate.err; + error.code = ZlibErrorCodes[this.zLibSyncInflate.err]; + this.emit(WebSocketShardEvents.Error, error); } if (!flush) {