| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 6558ffa commit e51d7c5
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -171,6 +171,14 @@ Object.defineProperty(Event.prototype, SymbolToStringTag, { | |||
| 171 | 171 | value: 'Event', | |
| 172 | 172 | }); | |
| 173 | 173 | ||
| 174 | + class NodeCustomEvent extends Event { | ||
| 175 | + constructor(type, options) { | ||
| 176 | + super(type, options); | ||
| 177 | + if (options && options.detail) { | ||
| 178 | + this.detail = options.detail; | ||
| 179 | + } | ||
| 180 | + } | ||
| 181 | + } | ||
| 174 | 182 | // The listeners for an EventTarget are maintained as a linked list. | |
| 175 | 183 | // Unfortunately, the way EventTarget is defined, listeners are accounted | |
| 176 | 184 | // using the tuple [handler,capture], and even if we don't actually make | |
@@ -376,6 +384,9 @@ class EventTarget { | |||
| 376 | 384 | event[kTarget] = undefined; | |
| 377 | 385 | } | |
| 378 | 386 | ||
| 387 | + [kCreateEvent](nodeValue, type) { | ||
| 388 | + return new NodeCustomEvent(type, { detail: nodeValue }); | ||
| 389 | + } | ||
| 379 | 390 | [customInspectSymbol](depth, options) { | |
| 380 | 391 | const name = this.constructor.name; | |
| 381 | 392 | if (depth < 0) | |
@@ -473,6 +484,14 @@ class NodeEventTarget extends EventTarget { | |||
| 473 | 484 | this.addEventListener(type, listener, { [kIsNodeStyleListener]: true }); | |
| 474 | 485 | return this; | |
| 475 | 486 | } | |
| 487 | + emit(type, arg) { | ||
| 488 | + if (typeof type !== 'string') { | ||
| 489 | + throw new ERR_INVALID_ARG_TYPE('type', 'string', type); | ||
| 490 | + } | ||
| 491 | + const hadListeners = this.listenerCount(type) > 0; | ||
| 492 | + this[kHybridDispatch](arg, type); | ||
| 493 | + return hadListeners; | ||
| 494 | + } | ||
| 476 | 495 | ||
| 477 | 496 | once(type, listener) { | |
| 478 | 497 | this.addEventListener(type, listener, | |
@@ -501,6 +520,7 @@ Object.defineProperties(NodeEventTarget.prototype, { | |||
| 501 | 520 | on: { enumerable: true }, | |
| 502 | 521 | addListener: { enumerable: true }, | |
| 503 | 522 | once: { enumerable: true }, | |
| 523 | + emit: { enumerable: true }, | ||
| 504 | 524 | removeAllListeners: { enumerable: true }, | |
| 505 | 525 | }); | |
| 506 | 526 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -30,6 +30,7 @@ const { | |||
| 30 | 30 | const { Readable, Writable } = require('stream'); | |
| 31 | 31 | const { | |
| 32 | 32 | Event, | |
| 33 | + EventTarget, | ||
| 33 | 34 | NodeEventTarget, | |
| 34 | 35 | defineEventHandler, | |
| 35 | 36 | initNodeEventTarget, | |
@@ -79,11 +80,15 @@ class MessageEvent extends Event { | |||
| 79 | 80 | } | |
| 80 | 81 | } | |
| 81 | 82 | ||
| 83 | + const originalCreateEvent = EventTarget.prototype[kCreateEvent]; | ||
| 82 | 84 | ObjectDefineProperty( | |
| 83 | 85 | MessagePort.prototype, | |
| 84 | 86 | kCreateEvent, | |
| 85 | 87 | { | |
| 86 | 88 | value: function(data, type) { | |
| 89 | + if (type !== 'message' && type !== 'messageerror') { | ||
| 90 | + return originalCreateEvent.call(this, data, type); | ||
| 91 | + } | ||
| 87 | 92 | return new MessageEvent(data, this, type); | |
| 88 | 93 | }, | |
| 89 | 94 | configurable: false, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -11,6 +11,7 @@ const { | |||
| 11 | 11 | deepStrictEqual, | |
| 12 | 12 | ok, | |
| 13 | 13 | strictEqual, | |
| 14 | + throws, | ||
| 14 | 15 | } = require('assert'); | |
| 15 | 16 | ||
| 16 | 17 | const { on } = require('events'); | |
@@ -145,6 +146,27 @@ const { on } = require('events'); | |||
| 145 | 146 | target.on('foo', () => {}); | |
| 146 | 147 | target.on('foo', () => {}); | |
| 147 | 148 | } | |
| 149 | + { | ||
| 150 | + // Test NodeEventTarget emit | ||
| 151 | + const emitter = new NodeEventTarget(); | ||
| 152 | + emitter.addEventListener('foo', common.mustCall((e) => { | ||
| 153 | + strictEqual(e.type, 'foo'); | ||
| 154 | + strictEqual(e.detail, 'bar'); | ||
| 155 | + ok(e instanceof Event); | ||
| 156 | + }), { once: true }); | ||
| 157 | + emitter.once('foo', common.mustCall((e, droppedAdditionalArgument) => { | ||
| 158 | + strictEqual(e, 'bar'); | ||
| 159 | + strictEqual(droppedAdditionalArgument, undefined); | ||
| 160 | + })); | ||
| 161 | + emitter.emit('foo', 'bar', 'baz'); | ||
| 162 | + } | ||
| 163 | + { | ||
| 164 | + // Test NodeEventTarget emit unsupported usage | ||
| 165 | + const emitter = new NodeEventTarget(); | ||
| 166 | + throws(() => { | ||
| 167 | + emitter.emit(); | ||
| 168 | + }, /ERR_INVALID_ARG_TYPE/); | ||
| 169 | + } | ||
| 148 | 170 | ||
| 149 | 171 | (async () => { | |
| 150 | 172 | // test NodeEventTarget async-iterability | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -16,7 +16,18 @@ const { MessageChannel, MessagePort } = require('worker_threads'); | |||
| 16 | 16 | port2.close(common.mustCall()); | |
| 17 | 17 | })); | |
| 18 | 18 | } | |
| 19 | - | ||
| 19 | + { | ||
| 20 | + // Test emitting non-message events on a port | ||
| 21 | + const { port2 } = new MessageChannel(); | ||
| 22 | + port2.addEventListener('foo', common.mustCall((received) => { | ||
| 23 | + assert.strictEqual(received.type, 'foo'); | ||
| 24 | + assert.strictEqual(received.detail, 'bar'); | ||
| 25 | + })); | ||
| 26 | + port2.on('foo', common.mustCall((received) => { | ||
| 27 | + assert.strictEqual(received, 'bar'); | ||
| 28 | + })); | ||
| 29 | + port2.emit('foo', 'bar'); | ||
| 30 | + } | ||
| 20 | 31 | { | |
| 21 | 32 | const { port1, port2 } = new MessageChannel(); | |
| 22 | 33 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments