Event-e3

Posted by Cyril Walle

Last edit

# event-e3

Event Emitter 3

## Installation

[`npm i event-e3`](https://www.npmjs.com/package/event-e3)

## import

```js
// Deno
import Emitter from 'https://unpkg.com/event-e3/event-e3.js'
// rollup webpack typescript, node12+
import Emitter from "event-e3";
// raw import
import Emitter from "./node_modules/event-e3/event-e3.js";
// with require()
const Emitter = require("event-e3/built/event-e3.js");
```

## API

`eventName` must be a string or a symbol

### Emitter

As a decorator:

```js
const user = Emitter({ name: 'tobi' });
```

As an instance:

```js
const emitter = new Emitter();
```


### .on(eventName, fn)

Register an `eventName` handler `fn`.

### .emit(eventName, data)

Emit an event `eventName` with data. Will trigger previously registered handlers

### .once(eventName, fn)

Register a single-shot `eventName` handler `fn`, removed immediately after it is invoked the first time.

### .off(eventName, fn)

  * Pass `eventName` and `fn` to remove a listener.
  * Pass `eventName` to remove all listeners on that eventName.
  * Pass nothing to remove all listeners on all events.

### .listeners(eventName)

Return an array of callbacks, or an empty array.

### .hasListeners(eventName)

True if this emitter has any `eventName` handlers.

### .eventNames()

Returns an array listing the events for which the emitter has registered listeners.

### .eventNamesStrings()

Same as `.eventNames()` but the array is only Strings.


## EmitterListener

EmitterListener exposes a way to subscribe to subscriptions and unsubscriptions. It can only be used as a constructor, example usage:

```js
import {EmitterListener, onSubscribe, onUnsubscribe} from "event-e3/source/EmitterListener.js";
const x = new EmitterListener(); 

x.on(onSubscribe, console.log.bind('console', 'on\'ed'))
x.on(onUnsubscribe, console.log.bind('console', 'off\'ed')) 
```


## EmitterListenerPlus

EmitterListener further extends EmitterListener. It can be used to direclty listen for the first subscription and last unsubscription for a given event name and  It can only be used as a constructor, example usage:

```js
import {EmitterListenerPlus, onFirstSubscribe, onLastUnsubscribe, onSubscribe, onUnsubscribe} from "event-e3/source/EmitterListenerPlus.js";
const x = new EmitterListenerPlus(); 

x.on(onFirstSubscribe, console.log.bind('console', 'on\'ed'))
x.on(onLastUnsubscribe, console.log.bind('console', 'off\'ed')) 
```

## RegularListener

Extends EmitterListenerPlus, also emits `onFirstSubscribeString` and `onLastUnsubscribeString`

## filterEventStream

Makes it convenient to filter an event stream. The new event stream is emitted on the same emitter as regular events.

An example use case: An Emitter emits 'Earthquake' for the scientific community. But the general public is interested in big ones only.

```js
import Emitter from "event-e3";
import {filterEventStream} from "event-e3/source/filterEventStream.js";
const earthQuakeEmitter = Emitter({});

const isBigEarthQuake = earthQuake => earthQuake.richterScale > 6;
filterEventStream(earthQuakeEmitter, 'Earthquake', 'BigEarthQuake', isBigEarthQuake);

// the original event is still emitted
earthQuakeEmitter.on('Earthquake', scientificCommunity.study);

// 'BigEarthQuake' happens sometimes
earthQuakeEmitter.on('BigEarthQuake', newsAggregator.publishNews);
earthQuakeEmitter.on('BigEarthQuake', humanHelpWithoutBorders.organize);
```

## Comparison with NodeJs Event Emitter

 - `this` is undefined inside the event handler
 - error events do not trigger any special logic
 - no captureRejections 
 - no maxListener
 - `.emit` can only emit 1 thing (use array or object for more)
 - no prepend
 - no method aliases
 - no dependencies

## Tests

`npm t`

## License

[MIT](./LICENSE)