* Creates a `Promise` that is fulfilled when the emitter * emits the given event. * @param {EventEmitter} emitter * @param {string | symbol} name * @param {{ signal: AbortSignal; }} [options] * @returns {Promise}
(emitter, name, options = kEmptyObject)
| 988 | * @returns {Promise} |
| 989 | */ |
| 990 | async function once(emitter, name, options = kEmptyObject) { |
| 991 | validateObject(options, 'options'); |
| 992 | const { signal } = options; |
| 993 | validateAbortSignal(signal, 'options.signal'); |
| 994 | if (signal?.aborted) |
| 995 | throw new AbortError(undefined, { cause: signal.reason }); |
| 996 | return new Promise((resolve, reject) => { |
| 997 | const errorListener = (err) => { |
| 998 | emitter.removeListener(name, resolver); |
| 999 | if (signal != null) { |
| 1000 | eventTargetAgnosticRemoveListener(signal, 'abort', abortListener); |
| 1001 | } |
| 1002 | reject(err); |
| 1003 | }; |
| 1004 | const resolver = (...args) => { |
| 1005 | if (typeof emitter.removeListener === 'function') { |
| 1006 | emitter.removeListener('error', errorListener); |
| 1007 | } |
| 1008 | if (signal != null) { |
| 1009 | eventTargetAgnosticRemoveListener(signal, 'abort', abortListener); |
| 1010 | } |
| 1011 | resolve(args); |
| 1012 | }; |
| 1013 | |
| 1014 | kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation; |
| 1015 | const opts = { __proto__: null, once: true, [kResistStopPropagation]: true }; |
| 1016 | eventTargetAgnosticAddListener(emitter, name, resolver, opts); |
| 1017 | if (name !== 'error' && typeof emitter.once === 'function') { |
| 1018 | // EventTarget does not have `error` event semantics like Node |
| 1019 | // EventEmitters, we listen to `error` events only on EventEmitters. |
| 1020 | emitter.once('error', errorListener); |
| 1021 | } |
| 1022 | function abortListener() { |
| 1023 | eventTargetAgnosticRemoveListener(emitter, name, resolver); |
| 1024 | eventTargetAgnosticRemoveListener(emitter, 'error', errorListener); |
| 1025 | reject(new AbortError(undefined, { cause: signal?.reason })); |
| 1026 | } |
| 1027 | if (signal != null) { |
| 1028 | eventTargetAgnosticAddListener( |
| 1029 | signal, 'abort', abortListener, { __proto__: null, once: true, [kResistStopPropagation]: true }); |
| 1030 | } |
| 1031 | }); |
| 1032 | } |
| 1033 | |
| 1034 | function createIterResult(value, done) { |
| 1035 | return { done, value }; |
no test coverage detected
searching dependent graphs…