bcherny / typed-rx-emitter

Typesafe RxJS-based EventEmitter
MIT License
27 stars 1 forks source link
emitter event eventemitter javascript rx rxjs typescript
typed-rx-emitter: Typesafe Rx-based event emitter

Build Status npm mit ts flow

Highlights

Installation (with RxJS v5.x or v6.x - recommended)

# Using Yarn:
yarn add typed-rx-emitter rxjs

# Using NPM:
npm install typed-rx-emitter rxjs --save

Installation (with RxJS v4.x)

# Using Yarn:
yarn add typed-rx-emitter@^0.3

# Using NPM:
npm install typed-rx-emitter@^0.3 --save

Usage

import { Emitter } from 'typed-rx-emitter'

// Enumerate messages
type Messages = {
  INCREMENT_COUNTER: number
  OPEN_MODAL: boolean
}

const emitter = new Emitter<Messages>()

// Listen on an event (basic)
emitter
  .on('OPEN_MODAL')
  .subscribe(_ => console.log(`Change modal visibility: ${_}`)) // _ is a boolean

// Listen on an event (advanced)
import { debounceTime, filter } from 'rxjs/operators'

emitter
  .on('INCREMENT_COUNTER')
  .pipe(
    filter(_ => _ > 3), // _ is a number
    debounceTime(100)
  )
  .subscribe(_ => console.log(`Counter incremented to ${_}`)) // _ is a number

// Listen on all events
emitter
  .all()
  .subscribe(() => console.log('Something changed'))

// Trigger an event - throws a compile time error unless id and value are set, and are of the right types
emitter.emit('OPEN_MODAL', true)

// Event is misspelled - throws a compile time error
emitter.emit('INCREMENT_CONTER')

See a complete browser usage example here.

Options

Emitter takes an optional options argument. options is an object, and each key in the object is optional:

Option Default Description
Error CyclicalDependencyError Custom Error subclass for cycle warning
isDevMode false Perform dynamic analysis to warn about cycles?

Tests

npm test