Skip to content

Commit eee522a

Browse files
addaleaxnodejs-github-bot
authored andcommitted
lib: add EventTarget-related browser globals
Add - Event - EventTarget - MessagePort - MessageChannel - MessageEvent to the set of global objects, since they are available now and behave like they do in the browser. Fixes: #35495 PR-URL: #35496 Reviewed-By: Rich Trott <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Myles Borins <[email protected]> Reviewed-By: Shelley Vohr <[email protected]> Reviewed-By: Michael Dawson <[email protected]> Reviewed-By: Khaidi Chu <[email protected]>
1 parent 705d888 commit eee522a

11 files changed

+128
-18
lines changed

Diff for: .eslintrc.js

+5
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,11 @@ module.exports = {
287287
BigInt: 'readable',
288288
BigInt64Array: 'readable',
289289
BigUint64Array: 'readable',
290+
Event: 'readable',
291+
EventTarget: 'readable',
292+
MessageChannel: 'readable',
293+
MessageEvent: 'readable',
294+
MessagePort: 'readable',
290295
TextEncoder: 'readable',
291296
TextDecoder: 'readable',
292297
queueMicrotask: 'readable',

Diff for: doc/api/events.md

+18-3
Original file line numberDiff line numberDiff line change
@@ -1069,9 +1069,15 @@ const ac = new AbortController();
10691069
process.nextTick(() => ac.abort());
10701070
```
10711071

1072+
<a id="event-target-and-event-api"></a>
10721073
## `EventTarget` and `Event` API
10731074
<!-- YAML
10741075
added: v14.5.0
1076+
changes:
1077+
- version: REPLACEME
1078+
pr-url: https://github.com/nodejs/node/pull/35496
1079+
description:
1080+
The `EventTarget` and `Event` classes are now available as globals.
10751081
-->
10761082

10771083
> Stability: 1 - Experimental
@@ -1082,7 +1088,7 @@ Neither the `EventTarget` nor `Event` classes are available for end
10821088
user code to create.
10831089

10841090
```js
1085-
const target = getEventTargetSomehow();
1091+
const target = new EventTarget();
10861092

10871093
target.addEventListener('foo', (event) => {
10881094
console.log('foo event happened!');
@@ -1168,7 +1174,7 @@ const handler4 = {
11681174
}
11691175
};
11701176

1171-
const target = getEventTargetSomehow();
1177+
const target = new EventTarget();
11721178

11731179
target.addEventListener('foo', handler1);
11741180
target.addEventListener('foo', handler2);
@@ -1189,6 +1195,10 @@ The `EventTarget` does not implement any special default handling for
11891195
### Class: `Event`
11901196
<!-- YAML
11911197
added: v14.5.0
1198+
changes:
1199+
- version: REPLACEME
1200+
pr-url: https://github.com/nodejs/node/pull/35496
1201+
description: The `Event` class is now available through the global object.
11921202
-->
11931203

11941204
The `Event` object is an adaptation of the [`Event` Web API][]. Instances
@@ -1341,6 +1351,11 @@ The event type identifier.
13411351
### Class: `EventTarget`
13421352
<!-- YAML
13431353
added: v14.5.0
1354+
changes:
1355+
- version: REPLACEME
1356+
pr-url: https://github.com/nodejs/node/pull/35496
1357+
description:
1358+
The `EventTarget` class is now available through the global object.
13441359
-->
13451360

13461361
#### `eventTarget.addEventListener(type, listener[, options])`
@@ -1374,7 +1389,7 @@ a `listener`. Any individual `listener` may be added once with
13741389
```js
13751390
function handler(event) {}
13761391

1377-
const target = getEventTargetSomehow();
1392+
const target = new EventTarget();
13781393
target.addEventListener('foo', handler, { capture: true }); // first
13791394
target.addEventListener('foo', handler, { capture: false }); // second
13801395

Diff for: doc/api/globals.md

+55
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,30 @@ added: v0.1.100
169169

170170
Used to print to stdout and stderr. See the [`console`][] section.
171171

172+
## `Event`
173+
<!-- YAML
174+
added: REPLACEME
175+
-->
176+
177+
<!-- type=global -->
178+
179+
> Stability: 1 - Experimental
180+
181+
A browser-compatible implementation of the `Event` class. See
182+
[`EventTarget` and `Event` API][] for more details.
183+
184+
## `EventTarget`
185+
<!-- YAML
186+
added: REPLACEME
187+
-->
188+
189+
<!-- type=global -->
190+
191+
> Stability: 1 - Experimental
192+
193+
A browser-compatible implementation of the `EventTarget` class. See
194+
[`EventTarget` and `Event` API][] for more details.
195+
172196
## `exports`
173197

174198
This variable may appear to be global but is not. See [`exports`][].
@@ -187,6 +211,33 @@ within the browser `var something` will define a new global variable. In
187211
Node.js this is different. The top-level scope is not the global scope;
188212
`var something` inside a Node.js module will be local to that module.
189213

214+
## `MessageChannel`
215+
<!-- YAML
216+
added: REPLACEME
217+
-->
218+
219+
<!-- type=global -->
220+
221+
The `MessageChannel` class. See [`MessageChannel`][] for more details.
222+
223+
## `MessageEvent`
224+
<!-- YAML
225+
added: REPLACEME
226+
-->
227+
228+
<!-- type=global -->
229+
230+
The `MessageEvent` class. See [`MessageEvent`][] for more details.
231+
232+
## `MessagePort`
233+
<!-- YAML
234+
added: REPLACEME
235+
-->
236+
237+
<!-- type=global -->
238+
239+
The `MessagePort` class. See [`MessagePort`][] for more details.
240+
190241
## `module`
191242

192243
This variable may appear to be global but is not. See [`module`][].
@@ -322,6 +373,10 @@ The object that acts as the namespace for all W3C
322373
[Mozilla Developer Network][webassembly-mdn] for usage and compatibility.
323374

324375
[`AbortController`]: https://developer.mozilla.org/en-US/docs/Web/API/AbortController
376+
[`EventTarget` and `Event` API]: events.md#event-target-and-event-api
377+
[`MessageChannel`]: worker_threads.md#worker_threads_class_messagechannel
378+
[`MessageEvent`]: https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent/MessageEvent
379+
[`MessagePort`]: worker_threads.md#worker_threads_class_messageport
325380
[`TextDecoder`]: util.md#util_class_util_textdecoder
326381
[`TextEncoder`]: util.md#util_class_util_textencoder
327382
[`URLSearchParams`]: url.md#url_class_urlsearchparams

Diff for: lib/internal/bootstrap/node.js

+15
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,21 @@ if (!config.noBrowserGlobals) {
140140
exposeInterface(global, 'AbortController', AbortController);
141141
exposeInterface(global, 'AbortSignal', AbortSignal);
142142

143+
const {
144+
EventTarget,
145+
Event,
146+
} = require('internal/event_target');
147+
exposeInterface(global, 'EventTarget', EventTarget);
148+
exposeInterface(global, 'Event', Event);
149+
const {
150+
MessageChannel,
151+
MessagePort,
152+
MessageEvent,
153+
} = require('internal/worker/io');
154+
exposeInterface(global, 'MessageChannel', MessageChannel);
155+
exposeInterface(global, 'MessagePort', MessagePort);
156+
exposeInterface(global, 'MessageEvent', MessageEvent);
157+
143158
// https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope
144159
const timers = require('timers');
145160
defineOperation(global, 'clearInterval', timers.clearInterval);

Diff for: src/node_external_reference.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ class ExternalReferenceRegistry {
6464
V(string_decoder) \
6565
V(trace_events) \
6666
V(timers) \
67-
V(types)
67+
V(types) \
68+
V(worker)
6869

6970
#if NODE_HAVE_I18N_SUPPORT
7071
#define EXTERNAL_REFERENCE_BINDING_LIST_I18N(V) V(icu)

Diff for: src/node_worker.cc

+13-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "debug_utils-inl.h"
33
#include "memory_tracker-inl.h"
44
#include "node_errors.h"
5+
#include "node_external_reference.h"
56
#include "node_buffer.h"
67
#include "node_options-inl.h"
78
#include "node_perf.h"
@@ -860,9 +861,20 @@ void InitWorker(Local<Object> target,
860861
NODE_DEFINE_CONSTANT(target, kTotalResourceLimitCount);
861862
}
862863

863-
} // anonymous namespace
864+
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
865+
registry->Register(GetEnvMessagePort);
866+
registry->Register(Worker::New);
867+
registry->Register(Worker::StartThread);
868+
registry->Register(Worker::StopThread);
869+
registry->Register(Worker::Ref);
870+
registry->Register(Worker::Unref);
871+
registry->Register(Worker::GetResourceLimits);
872+
registry->Register(Worker::TakeHeapSnapshot);
873+
}
864874

875+
} // anonymous namespace
865876
} // namespace worker
866877
} // namespace node
867878

868879
NODE_MODULE_CONTEXT_AWARE_INTERNAL(worker, node::worker::InitWorker)
880+
NODE_MODULE_EXTERNAL_REFERENCE(worker, node::worker::RegisterExternalReferences)

Diff for: test/parallel/test-bootstrap-modules.js

+14
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const expectedModules = new Set([
3131
'Internal Binding types',
3232
'Internal Binding url',
3333
'Internal Binding util',
34+
'Internal Binding worker',
3435
'NativeModule buffer',
3536
'NativeModule events',
3637
'NativeModule fs',
@@ -76,6 +77,17 @@ const expectedModules = new Set([
7677
'NativeModule internal/process/warning',
7778
'NativeModule internal/querystring',
7879
'NativeModule internal/source_map/source_map_cache',
80+
'NativeModule internal/streams/buffer_list',
81+
'NativeModule internal/streams/destroy',
82+
'NativeModule internal/streams/duplex',
83+
'NativeModule internal/streams/end-of-stream',
84+
'NativeModule internal/streams/legacy',
85+
'NativeModule internal/streams/passthrough',
86+
'NativeModule internal/streams/pipeline',
87+
'NativeModule internal/streams/readable',
88+
'NativeModule internal/streams/state',
89+
'NativeModule internal/streams/transform',
90+
'NativeModule internal/streams/writable',
7991
'NativeModule internal/timers',
8092
'NativeModule internal/url',
8193
'NativeModule internal/util',
@@ -84,8 +96,10 @@ const expectedModules = new Set([
8496
'NativeModule internal/util/types',
8597
'NativeModule internal/validators',
8698
'NativeModule internal/vm/module',
99+
'NativeModule internal/worker/io',
87100
'NativeModule internal/worker/js_transferable',
88101
'NativeModule path',
102+
'NativeModule stream',
89103
'NativeModule timers',
90104
'NativeModule url',
91105
'NativeModule util',

Diff for: test/parallel/test-event-on-async-iterator.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ const common = require('../common');
55
const assert = require('assert');
66
const { on, EventEmitter } = require('events');
77
const {
8-
EventTarget,
9-
NodeEventTarget,
10-
Event
8+
NodeEventTarget
119
} = require('internal/event_target');
1210

1311
async function basic() {

Diff for: test/parallel/test-events-once.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
'use strict';
2-
// Flags: --expose-internals --no-warnings
2+
// Flags: --no-warnings
33

44
const common = require('../common');
55
const { once, EventEmitter } = require('events');
@@ -9,7 +9,6 @@ const {
99
fail,
1010
rejects,
1111
} = require('assert');
12-
const { EventTarget, Event } = require('internal/event_target');
1312

1413
async function onceAnEvent() {
1514
const ee = new EventEmitter();

Diff for: test/parallel/test-eventtarget-whatwg-passive.js

-6
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
1-
// Flags: --expose-internals
21
'use strict';
32

43
const common = require('../common');
54

6-
const {
7-
Event,
8-
EventTarget,
9-
} = require('internal/event_target');
10-
115
const {
126
fail,
137
ok,

Diff for: test/parallel/test-worker-message-event.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
// Flags: --expose-internals
21
'use strict';
32
require('../common');
43
const assert = require('assert');
5-
const { MessageEvent, MessageChannel } = require('internal/worker/io');
64

75
const dummyPort = new MessageChannel().port1;
86

@@ -90,3 +88,7 @@ const dummyPort = new MessageChannel().port1;
9088
message: /The "init\.ports\[0\]" property must be an instance of MessagePort/,
9189
});
9290
}
91+
92+
{
93+
assert(new MessageEvent('message') instanceof Event);
94+
}

0 commit comments

Comments
 (0)