UNPKG

@jspm/core

Version:

This package contains the core libraries used in jspm 2.

106 lines (92 loc) 2.61 kB
import events from 'events'; // https://github.com/denoland/deno_std/blob/d005433c709054af87aca54f57a446b4f7966f11/node/events.ts#L501-L638 events.once = function (emitter, event) { return new Promise((resolve, reject) => { function eventListener(...args) { if (errorListener !== undefined) { emitter.removeListener('error', errorListener); } resolve(args); }; let errorListener; if (event !== 'error') { // deno-lint-ignore no-explicit-any errorListener = (err) => { emitter.removeListener(name, eventListener); reject(err); }; emitter.once('error', errorListener); } emitter.once(event, eventListener); }); }; events.on = function (emitter, event) { const unconsumedEventValues = []; const unconsumedPromises = []; let error = null; let finished = false; const iterator = { async next() { const value = unconsumedEventValues.shift(); if (value) { return createIterResult(value, false); } if (error) { const p = Promise.reject(error); error = null; return p; } if (finished) { return createIterResult(undefined, true); } return new Promise((resolve, reject) => unconsumedPromises.push({ resolve, reject })); }, async return() { emitter.removeListener(event, eventHandler); emitter.removeListener('error', errorHandler); finished = true; for (const promise of unconsumedPromises) { promise.resolve(createIterResult(undefined, true)); } return createIterResult(undefined, true); }, throw(err) { error = err; emitter.removeListener(event, eventHandler); emitter.removeListener('error', errorHandler); }, [Symbol.asyncIterator]() { return this; }, }; emitter.on(event, eventHandler); emitter.on('error', errorHandler); return iterator; function eventHandler(...args) { const promise = unconsumedPromises.shift(); if (promise) { promise.resolve(createIterResult(args, false)); } else { unconsumedEventValues.push(args); } } function errorHandler(err) { finished = true; const toError = unconsumedPromises.shift(); if (toError) { toError.reject(err); } else { error = err; } iterator.return(); } } export default events; export const { EventEmitter, defaultMaxListeners, init, listenerCount, on, once, } = events;