Comparing version 1.2.0 to 1.3.0
(function (root, factory) {(typeof module === 'object' && module.exports) ? module.exports = factory() : root.RaceEvent = factory()}(typeof self !== 'undefined' ? self : this, function () { | ||
"use strict";var RaceEvent=(()=>{var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var h=(r,e)=>{for(var t in e)a(r,t,{get:e[t],enumerable:!0})},p=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of u(e))!f.call(r,o)&&o!==t&&a(r,o,{get:()=>e[o],enumerable:!(n=b(e,o))||n.enumerable});return r};var y=r=>p(a({},"__esModule",{value:!0}),r);var w={};h(w,{AbortError:()=>i,raceEvent:()=>m});var i=class extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.name="AbortError",this.code=t??"ABORT_ERR"}};async function m(r,e,t,n){let o=new i(n?.errorMessage,n?.errorCode);return t?.aborted===!0?Promise.reject(o):new Promise((E,v)=>{let s=d=>{try{if(n?.filter?.(d)===!1)return}catch(L){r.removeEventListener(e,s),t?.removeEventListener("abort",c),v(L);return}r.removeEventListener(e,s),t?.removeEventListener("abort",c),E(d)},c=()=>{r.removeEventListener(e,s),t?.removeEventListener("abort",c),v(o)};r.addEventListener(e,s),t?.addEventListener("abort",c)})}return y(w);})(); | ||
"use strict";var RaceEvent=(()=>{var c=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var y=(r,e)=>{for(var n in e)c(r,n,{get:e[n],enumerable:!0})},m=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of l(e))!h.call(r,o)&&o!==n&&c(r,o,{get:()=>e[o],enumerable:!(t=b(e,o))||t.enumerable});return r};var w=r=>m(c({},"__esModule",{value:!0}),r);var R={};y(R,{AbortError:()=>a,raceEvent:()=>x});var a=class extends Error{type;code;constructor(e,n){super(e??"The operation was aborted"),this.type="aborted",this.name="AbortError",this.code=n??"ABORT_ERR"}};async function x(r,e,n,t){let o=new a(t?.errorMessage,t?.errorCode);return n?.aborted===!0?Promise.reject(o):new Promise((L,v)=>{function s(){n?.removeEventListener("abort",u),r.removeEventListener(e,d),t?.errorEvent!=null&&r.removeEventListener(t.errorEvent,E)}let d=i=>{try{if(t?.filter?.(i)===!1)return}catch(f){s(),v(f);return}s(),L(i)},E=i=>{s(),v(i.detail)},u=()=>{s(),v(o)};n?.addEventListener("abort",u),r.addEventListener(e,d),t?.errorEvent!=null&&r.addEventListener(t.errorEvent,E)})}return w(R);})(); | ||
return RaceEvent})); |
@@ -28,2 +28,21 @@ /** | ||
* | ||
* @example Aborting the promise with an error event | ||
* | ||
* ```TypeScript | ||
* import { raceEvent } from 'race-event' | ||
* | ||
* const emitter = new EventTarget() | ||
* | ||
* setTimeout(() => { | ||
* emitter.dispatchEvent(new CustomEvent('failure', { | ||
* detail: new Error('Oh no!') | ||
* })) | ||
* }, 1000) | ||
* | ||
* // throws 'Oh no!' error | ||
* const resolve = await raceEvent(emitter, 'success', AbortSignal.timeout(5000), { | ||
* errorEvent: 'failure' | ||
* }) | ||
* ``` | ||
* | ||
* @example Customising the thrown AbortError | ||
@@ -111,2 +130,8 @@ * | ||
/** | ||
* The name of an event emitted on the emitter that should cause the returned | ||
* promise to reject. The rejection reason will be the `.detail` field of the | ||
* event. | ||
*/ | ||
errorEvent?: string; | ||
/** | ||
* When multiple events with the same name may be emitted, pass a filter | ||
@@ -113,0 +138,0 @@ * function here to allow ignoring ones that should not cause the returned |
@@ -28,2 +28,21 @@ /** | ||
* | ||
* @example Aborting the promise with an error event | ||
* | ||
* ```TypeScript | ||
* import { raceEvent } from 'race-event' | ||
* | ||
* const emitter = new EventTarget() | ||
* | ||
* setTimeout(() => { | ||
* emitter.dispatchEvent(new CustomEvent('failure', { | ||
* detail: new Error('Oh no!') | ||
* })) | ||
* }, 1000) | ||
* | ||
* // throws 'Oh no!' error | ||
* const resolve = await raceEvent(emitter, 'success', AbortSignal.timeout(5000), { | ||
* errorEvent: 'failure' | ||
* }) | ||
* ``` | ||
* | ||
* @example Customising the thrown AbortError | ||
@@ -116,2 +135,9 @@ * | ||
return new Promise((resolve, reject) => { | ||
function removeListeners() { | ||
signal?.removeEventListener('abort', abortListener); | ||
emitter.removeEventListener(eventName, eventListener); | ||
if (opts?.errorEvent != null) { | ||
emitter.removeEventListener(opts.errorEvent, errorEventListener); | ||
} | ||
} | ||
const eventListener = (evt) => { | ||
@@ -124,20 +150,24 @@ try { | ||
catch (err) { | ||
emitter.removeEventListener(eventName, eventListener); | ||
signal?.removeEventListener('abort', abortListener); | ||
removeListeners(); | ||
reject(err); | ||
return; | ||
} | ||
emitter.removeEventListener(eventName, eventListener); | ||
signal?.removeEventListener('abort', abortListener); | ||
removeListeners(); | ||
resolve(evt); | ||
}; | ||
const errorEventListener = (evt) => { | ||
removeListeners(); | ||
reject(evt.detail); | ||
}; | ||
const abortListener = () => { | ||
emitter.removeEventListener(eventName, eventListener); | ||
signal?.removeEventListener('abort', abortListener); | ||
removeListeners(); | ||
reject(error); | ||
}; | ||
signal?.addEventListener('abort', abortListener); | ||
emitter.addEventListener(eventName, eventListener); | ||
signal?.addEventListener('abort', abortListener); | ||
if (opts?.errorEvent != null) { | ||
emitter.addEventListener(opts.errorEvent, errorEventListener); | ||
} | ||
}); | ||
} | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "race-event", | ||
"version": "1.2.0", | ||
"version": "1.3.0", | ||
"description": "Race an event against an AbortSignal", | ||
@@ -5,0 +5,0 @@ "author": "Alex Potsides <alex@achingbrain.net>", |
@@ -49,2 +49,21 @@ # race-event | ||
## Example - Aborting the promise with an error event | ||
```TypeScript | ||
import { raceEvent } from 'race-event' | ||
const emitter = new EventTarget() | ||
setTimeout(() => { | ||
emitter.dispatchEvent(new CustomEvent('failure', { | ||
detail: new Error('Oh no!') | ||
})) | ||
}, 1000) | ||
// throws 'Oh no!' error | ||
const resolve = await raceEvent(emitter, 'success', AbortSignal.timeout(5000), { | ||
errorEvent: 'failure' | ||
}) | ||
``` | ||
## Example - Customising the thrown AbortError | ||
@@ -51,0 +70,0 @@ |
@@ -28,2 +28,21 @@ /** | ||
* | ||
* @example Aborting the promise with an error event | ||
* | ||
* ```TypeScript | ||
* import { raceEvent } from 'race-event' | ||
* | ||
* const emitter = new EventTarget() | ||
* | ||
* setTimeout(() => { | ||
* emitter.dispatchEvent(new CustomEvent('failure', { | ||
* detail: new Error('Oh no!') | ||
* })) | ||
* }, 1000) | ||
* | ||
* // throws 'Oh no!' error | ||
* const resolve = await raceEvent(emitter, 'success', AbortSignal.timeout(5000), { | ||
* errorEvent: 'failure' | ||
* }) | ||
* ``` | ||
* | ||
* @example Customising the thrown AbortError | ||
@@ -121,2 +140,9 @@ * | ||
/** | ||
* The name of an event emitted on the emitter that should cause the returned | ||
* promise to reject. The rejection reason will be the `.detail` field of the | ||
* event. | ||
*/ | ||
errorEvent?: string | ||
/** | ||
* When multiple events with the same name may be emitted, pass a filter | ||
@@ -141,2 +167,11 @@ * function here to allow ignoring ones that should not cause the returned | ||
return new Promise((resolve, reject) => { | ||
function removeListeners (): void { | ||
signal?.removeEventListener('abort', abortListener) | ||
emitter.removeEventListener(eventName, eventListener) | ||
if (opts?.errorEvent != null) { | ||
emitter.removeEventListener(opts.errorEvent, errorEventListener) | ||
} | ||
} | ||
const eventListener = (evt: any): void => { | ||
@@ -148,5 +183,3 @@ try { | ||
} catch (err: any) { | ||
emitter.removeEventListener(eventName, eventListener) | ||
signal?.removeEventListener('abort', abortListener) | ||
removeListeners() | ||
reject(err) | ||
@@ -156,17 +189,23 @@ return | ||
emitter.removeEventListener(eventName, eventListener) | ||
signal?.removeEventListener('abort', abortListener) | ||
removeListeners() | ||
resolve(evt) | ||
} | ||
const errorEventListener = (evt: any): void => { | ||
removeListeners() | ||
reject(evt.detail) | ||
} | ||
const abortListener = (): void => { | ||
emitter.removeEventListener(eventName, eventListener) | ||
signal?.removeEventListener('abort', abortListener) | ||
removeListeners() | ||
reject(error) | ||
} | ||
signal?.addEventListener('abort', abortListener) | ||
emitter.addEventListener(eventName, eventListener) | ||
signal?.addEventListener('abort', abortListener) | ||
if (opts?.errorEvent != null) { | ||
emitter.addEventListener(opts.errorEvent, errorEventListener) | ||
} | ||
}) | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
25729
517
160