Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

race-event

achingbrain90.1kApache-2.0 OR MIT1.3.0TypeScript support: included

Race an event against an AbortSignal

readme

race-event

codecov CI

Race an event against an AbortSignal

About

Race an event against an AbortSignal, taking care to remove any event listeners that were added.

Example - Getting started

import { raceEvent } from 'race-event'

const controller = new AbortController()
const emitter = new EventTarget()

setTimeout(() => {
  controller.abort()
}, 500)

setTimeout(() => {
  // too late
  emitter.dispatchEvent(new CustomEvent('event'))
}, 1000)

// throws an AbortError
const resolve = await raceEvent(emitter, 'event', controller.signal)

Example - Aborting the promise with an error event

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

The error message and .code property of the thrown AbortError can be specified by passing options:

import { raceEvent } from 'race-event'

const controller = new AbortController()
const emitter = new EventTarget()

setTimeout(() => {
  controller.abort()
}, 500)

// throws a Error: Oh no!
const resolve = await raceEvent(emitter, 'event', controller.signal, {
  errorMessage: 'Oh no!',
  errorCode: 'ERR_OH_NO'
})

Example - Only resolving on specific events

Where multiple events with the same type are emitted, a filter function can be passed to only resolve on one of them:

import { raceEvent } from 'race-event'

const controller = new AbortController()
const emitter = new EventTarget()

// throws a Error: Oh no!
const resolve = await raceEvent(emitter, 'event', controller.signal, {
  filter: (evt: Event) => {
    return evt.detail.foo === 'bar'
  }
})

Example - Terminating early by throwing from the filter

You can cause listening for the event to cease and all event listeners to be removed by throwing from the filter:

import { raceEvent } from 'race-event'

const controller = new AbortController()
const emitter = new EventTarget()

// throws Error: Cannot continue
const resolve = await raceEvent(emitter, 'event', controller.signal, {
  filter: (evt) => {
    if (...reasons) {
      throw new Error('Cannot continue')
    }

    return true
  }
})

Install

$ npm i race-event

Browser <script> tag

Loading this module through a script tag will make it's exports available as RaceEvent in the global namespace.

<script src="https://unpkg.com/race-event/dist/index.min.js"></script>

API Docs

License

Licensed under either of

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

changelog

1.3.0 (2024-04-25)

Features

  • reject on configurable error event (#12) (c8f00f3)

1.2.0 (2024-02-14)

Features

  • allow throwing from event filter (#11) (71b5b54)

1.1.0 (2024-01-05)

Features

1.0.0 (2024-01-05)

Features