Skip to content

Commit 3ea2d64

Browse files
KhafraDevUzlopak
authored andcommitted
expose MessageEvent in fetch bundle (nodejs#2770)
* expose MessageEvent * fixup
1 parent e779afb commit 3ea2d64

File tree

3 files changed

+141
-0
lines changed

3 files changed

+141
-0
lines changed

index-fetch.js

+1
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ module.exports.Response = require('./lib/fetch/response').Response
1616
module.exports.Request = require('./lib/fetch/request').Request
1717

1818
module.exports.WebSocket = require('./lib/websocket/websocket').WebSocket
19+
module.exports.MessageEvent = require('./lib/websocket/events').MessageEvent
1920

2021
module.exports.EventSource = require('./lib/eventsource/eventsource').EventSource

index.js

+4
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,11 @@ const { parseMIMEType, serializeAMimeType } = require('./lib/fetch/dataURL')
137137
module.exports.parseMIMEType = parseMIMEType
138138
module.exports.serializeAMimeType = serializeAMimeType
139139

140+
const { CloseEvent, ErrorEvent, MessageEvent } = require('./lib/websocket/events')
140141
module.exports.WebSocket = require('./lib/websocket/websocket').WebSocket
142+
module.exports.CloseEvent = CloseEvent
143+
module.exports.ErrorEvent = ErrorEvent
144+
module.exports.MessageEvent = MessageEvent
141145

142146
module.exports.request = makeDispatcher(api.request)
143147
module.exports.stream = makeDispatcher(api.stream)

test/websocket/messageevent.js

+136
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
'use strict'
2+
3+
const { test } = require('node:test')
4+
const assert = require('assert')
5+
const { MessageEvent } = require('../..')
6+
7+
test('test/parallel/test-messageevent-brandcheck.js', () => {
8+
[
9+
'data',
10+
'origin',
11+
'lastEventId',
12+
'source',
13+
'ports'
14+
].forEach((i) => {
15+
assert.throws(() => Reflect.get(MessageEvent.prototype, i, {}), {
16+
constructor: TypeError,
17+
message: 'Illegal invocation'
18+
})
19+
})
20+
})
21+
22+
test('test/parallel/test-worker-message-port.js', () => {
23+
const dummyPort = new MessageChannel().port1
24+
25+
for (const [args, expected] of [
26+
[
27+
['message'],
28+
{
29+
type: 'message',
30+
data: null,
31+
origin: '',
32+
lastEventId: '',
33+
source: null,
34+
ports: []
35+
}
36+
],
37+
[
38+
['message', { data: undefined, origin: 'foo' }],
39+
{
40+
type: 'message',
41+
data: null,
42+
origin: 'foo',
43+
lastEventId: '',
44+
source: null,
45+
ports: []
46+
}
47+
],
48+
[
49+
['message', { data: 2, origin: 1, lastEventId: 0 }],
50+
{
51+
type: 'message',
52+
data: 2,
53+
origin: '1',
54+
lastEventId: '0',
55+
source: null,
56+
ports: []
57+
}
58+
],
59+
[
60+
['message', { lastEventId: 'foo' }],
61+
{
62+
type: 'message',
63+
data: null,
64+
origin: '',
65+
lastEventId: 'foo',
66+
source: null,
67+
ports: []
68+
}
69+
],
70+
[
71+
['messageerror', { lastEventId: 'foo', source: dummyPort }],
72+
{
73+
type: 'messageerror',
74+
data: null,
75+
origin: '',
76+
lastEventId: 'foo',
77+
source: dummyPort,
78+
ports: []
79+
}
80+
],
81+
[
82+
['message', { ports: [dummyPort], source: null }],
83+
{
84+
type: 'message',
85+
data: null,
86+
origin: '',
87+
lastEventId: '',
88+
source: null,
89+
ports: [dummyPort]
90+
}
91+
]
92+
]) {
93+
const ev = new MessageEvent(...args)
94+
const { type, data, origin, lastEventId, source, ports } = ev
95+
assert.deepStrictEqual(expected, {
96+
type, data, origin, lastEventId, source, ports
97+
})
98+
}
99+
100+
assert.throws(() => new MessageEvent('message', { source: 1 }), {
101+
constructor: TypeError,
102+
message: 'MessagePort: Expected 1 to be an instance of MessagePort.'
103+
})
104+
assert.throws(() => new MessageEvent('message', { source: {} }), {
105+
constructor: TypeError,
106+
message: 'MessagePort: Expected [object Object] to be an instance of MessagePort.'
107+
})
108+
assert.throws(() => new MessageEvent('message', { ports: 0 }), {
109+
constructor: TypeError,
110+
message: 'Sequence: Value of type Number is not an Object.'
111+
})
112+
assert.throws(() => new MessageEvent('message', { ports: [null] }), {
113+
constructor: TypeError,
114+
message: 'MessagePort: Expected null to be an instance of MessagePort.'
115+
})
116+
assert.throws(() =>
117+
new MessageEvent('message', { ports: [{}] })
118+
, {
119+
constructor: TypeError,
120+
message: 'MessagePort: Expected [object Object] to be an instance of MessagePort.'
121+
})
122+
123+
assert(new MessageEvent('message') instanceof Event)
124+
125+
// https://github.com/nodejs/node/issues/51767
126+
const event = new MessageEvent('type', { cancelable: true })
127+
event.preventDefault()
128+
129+
assert(event.cancelable)
130+
assert(event.defaultPrevented)
131+
})
132+
133+
test('bug in node core', () => {
134+
// In node core, this will throw an error.
135+
new MessageEvent('', null) // eslint-disable-line no-new
136+
})

0 commit comments

Comments
 (0)