# 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)