# ayemitter

> A typed easy-to-use event emitter that you can just construct with a event type and start adding handlers.

Latest version **1.0.2** (published 2021-02-17) · MIT license · 0 weekly downloads

## Install

```sh
npm install ayemitter
pnpm add ayemitter
yarn add ayemitter
bun add ayemitter
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.2 |
| Published | 2021-02-17 |
| First published | 2021-02-17 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 0 |
| Unpacked size | 10.6 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | Lukas Bach |
| Maintainers | lukasbach |
| Keywords | EventEmitter, events, on, off, addEventListener, listener, handler, typed, subscribe, async, promise, tested |

## Links

- npm: https://www.npmjs.com/package/ayemitter
- Repository: https://github.com/lukasbach/ayemitter
- Homepage: https://github.com/lukasbach/ayemitter#readme
- Issues: https://github.com/lukasbach/ayemitter/issues
- npm.io page: https://npm.io/package/ayemitter

## Alternatives

- [@mapbox/jsonlint-lines-primitives](https://npm.io/package/@mapbox/jsonlint-lines-primitives.md) — 5.3M weekly downloads
- [reftools](https://npm.io/package/reftools.md) — 3.5M weekly downloads
- [@hey-api/openapi-ts](https://npm.io/package/@hey-api/openapi-ts.md) — 3.5M weekly downloads
- [@mapbox/geojson-rewind](https://npm.io/package/@mapbox/geojson-rewind.md) — 2.4M weekly downloads
- [turbo-stream](https://npm.io/package/turbo-stream.md) — 1.7M weekly downloads

## Recent versions

- 1.0.2 (latest) — 2021-02-17
- 1.0.1 — 2021-02-17

## README

# ayemitter

A typed easy-to-use event emitter that you can just construct with a event
type and start adding handlers.

## Usage

    yarn add ayemitter

Create a `EventEmitter` instance typed to whatever your
payload type is, add handlers and emit a new event.

```typescript
import { EventEmitter } from 'ayemitter';

const emitter = new EventEmitter<string>();

emitter.on(payload => {
  console.log('Handler 1 ' + payload);
});

emitter.on(payload => {
  console.log('Handler 2 ' + payload);
});

emitter.emit('yup');
// Outputs:
//   Handler 1 yup
//   Handler 2 yup
```

If one or more handlers are asynchronous, the `emit`
call waits for all handlers to finish. All handlers are
invoked at the same time.

```typescript
import { EventEmitter } from 'ayemitter';

const emitter = new EventEmitter<string>();

emitter.on(async payload => {
  // waits for 2 seconds
});

emitter.on(async payload => {
  // waits for 1 second
});

emitter.on(async payload => {
  // immediately returns
});

emitter.emit('yup').then(() => console.log('Done!'));
// All three handlers are invoked at the same time
// "Done!" is outputted after 2 seconds, i.e. after
// all handlers are finished
```

## API

```typescript
interface EventEmitter<EventPayload> {
  constructor(options?: EventEmitterOptions<EventPayload>);
  get numberOfHandlers(): number;
  emit(payload: EventPayload): Promise<void>;
  on(handler: EventHandler<EventPayload>): number;
  off(handlerId: number): void;
  delete(handlerId: number): void;
}

interface EventEmitterOptions<EventPayload = any> {
    logger?: (log: string, payload?: EventPayload) => void;
}

type EventHandler<EventPayload> = ((payload: EventPayload) => Promise<void> | void) | null | undefined;
```

## React Hook

Use in conjunction with [ayemitter-hook](https://github.com/lukasbach/ayemitter/tree/master/packages/hook) to use as React hook.

```typescript jsx
import { EventEmitter } from 'ayemitter';
import { useEventChangeHandler } from 'ayemitter-hook';

const emitter = new EventEmitter<string>();
const Component = () => {
  const [state, setState] = useState('state1');
  useEventChangeHandler(
    emitter,
    () => {
      console.log('Hello!');
    },
    [state]
  ); // state is a dependency

  // The handler is rebinded to the emitter everytime the
  // handler or a dependency changes.

  return; // ...
};
```

---
_Source: https://npm.io/package/ayemitter · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
