Skip to content

Commit a912426

Browse files
chore(multiplexer): drop Event/CloseEvent/MessageEvent polyfills, keep ErrorEvent
Node 24 (repo engines floor) has Event, CloseEvent, and MessageEvent as globals — the typeof checks in Event.ts / CloseEventClass.ts / MessageEventClass.ts always picked native on any supported runtime. Inlining native constructors at the 5 Multiplexer/Message call sites and deleting the three dead polyfill files. ErrorEvent is NOT yet a Node global — verified on Node 24.14.1 via 'typeof ErrorEvent === "undefined"' (tracked upstream at nodejs/node#49986; internal-only ErrorEvent lives in undici). Kept ErrorEventClass.ts and rewrote it to extend native Event (it previously extended the now-deleted Event2). Runtime smoke test confirms the polyfill dispatches and listeners see error/message/filename/lineno/colno fields correctly. Net: -137/+18 across 6 files, 0 tsc errors, 89/89 tests pass, webpack clean, generated .d.ts byte-identical (920 bytes).
1 parent a858519 commit a912426

6 files changed

Lines changed: 18 additions & 137 deletions

File tree

src/packages/multiplexer/CloseEventClass.ts

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
1-
import { Event2 } from './Event';
1+
// Polyfill for ErrorEvent on server runtimes. Node 24 still has not
2+
// promoted ErrorEvent to a global (tracked at nodejs/node#49986) though
3+
// Event, CloseEvent, and MessageEvent are all present. In browsers it's
4+
// always available, so the export below picks native when defined.
25

3-
export class ErrorEvent2 extends Event2 implements ErrorEvent {
6+
class ErrorEventPolyfill extends Event {
47
readonly colno: number;
5-
readonly error: any;
8+
readonly error: unknown;
69
readonly filename: string;
710
readonly lineno: number;
811
readonly message: string;
912

1013
constructor(type: string, { colno, error, filename, lineno, message }: ErrorEventInit = {}) {
1114
super(type);
1215
this.error = error;
13-
this.colno = colno || 0;
14-
this.filename = filename || '';
15-
this.lineno = lineno || 0;
16-
this.message = message || '';
16+
this.colno = colno ?? 0;
17+
this.filename = filename ?? '';
18+
this.lineno = lineno ?? 0;
19+
this.message = message ?? '';
1720
}
1821
}
1922

20-
export const ErrorEventClass = typeof ErrorEvent !== 'undefined' ? ErrorEvent : ErrorEvent2;
23+
export const ErrorEventClass: typeof ErrorEvent =
24+
typeof ErrorEvent !== 'undefined' ? ErrorEvent : (ErrorEventPolyfill as unknown as typeof ErrorEvent);

src/packages/multiplexer/Event.ts

Lines changed: 0 additions & 78 deletions
This file was deleted.

src/packages/multiplexer/Message.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { CloseEventClass } from './CloseEventClass';
21
import { MessageType } from './MessageType';
32

43
export class Message {
@@ -56,7 +55,7 @@ export class Message {
5655
reason = new TextDecoder().decode(new Uint8Array(this.data, 6, length));
5756
}
5857
}
59-
return new CloseEventClass('close', {
58+
return new CloseEvent('close', {
6059
code,
6160
reason,
6261
wasClean: code === 1000,

src/packages/multiplexer/MessageEventClass.ts

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/packages/multiplexer/Multiplexer.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import Util from '../../app/Util';
22
import { TypedEmitter } from '../../common/TypedEmitter';
3-
import { CloseEventClass } from './CloseEventClass';
43
import { ErrorEventClass } from './ErrorEventClass';
5-
import { EventClass } from './Event';
64
import { Message } from './Message';
7-
import { MessageEventClass } from './MessageEventClass';
85
import { MessageType } from './MessageType';
96

107
interface MultiplexerEvents extends WebSocketEventMap {
@@ -100,7 +97,7 @@ export class Multiplexer extends TypedEmitter<MultiplexerEvents> implements WebS
10097
const data = this.channels.get(message.channelId);
10198
if (data) {
10299
const { channel } = data;
103-
const msg = new MessageEventClass('message', {
100+
const msg = new MessageEvent('message', {
104101
data: new TextDecoder().decode(new Uint8Array(message.data)),
105102
lastEventId: event.lastEventId,
106103
origin: event.origin,
@@ -116,7 +113,7 @@ export class Multiplexer extends TypedEmitter<MultiplexerEvents> implements WebS
116113
const data = this.channels.get(message.channelId);
117114
if (data) {
118115
const { channel } = data;
119-
const msg = new MessageEventClass('message', {
116+
const msg = new MessageEvent('message', {
120117
data: message.data,
121118
lastEventId: event.lastEventId,
122119
origin: event.origin,
@@ -132,7 +129,7 @@ export class Multiplexer extends TypedEmitter<MultiplexerEvents> implements WebS
132129
const data = this.channels.get(message.channelId);
133130
if (data) {
134131
const { emitter } = data;
135-
const msg = new MessageEventClass('message', {
132+
const msg = new MessageEvent('message', {
136133
data: message.data,
137134
lastEventId: event.lastEventId,
138135
origin: event.origin,
@@ -247,7 +244,7 @@ export class Multiplexer extends TypedEmitter<MultiplexerEvents> implements WebS
247244
} else {
248245
this.ws.send(message);
249246
}
250-
this.emit('close', new CloseEventClass('close', { code, reason }));
247+
this.emit('close', new CloseEvent('close', { code, reason }));
251248
} finally {
252249
this.readyState = this.CLOSED;
253250
}
@@ -301,7 +298,7 @@ export class Multiplexer extends TypedEmitter<MultiplexerEvents> implements WebS
301298
if (this.readyState === this.OPEN) {
302299
Util.setImmediate(() => {
303300
channel.readyState = this.OPEN;
304-
channel.dispatchEvent(new EventClass('open'));
301+
channel.dispatchEvent(new Event('open'));
305302
});
306303
}
307304
} else {

0 commit comments

Comments
 (0)