Socket
Socket
Sign inDemoInstall

strict-event-emitter

Package Overview
Dependencies
0
Maintainers
1
Versions
22
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    strict-event-emitter

Type-safe implementation of EventEmitter for browser and Node.js


Version published
Weekly downloads
4.1M
increased by2.26%
Maintainers
1
Install size
44.7 kB
Created
Weekly downloads
 

Readme

Source

Strict Event Emitter

A type-safe implementation of EventEmitter for browser and Node.js.

Motivation

Despite event emitters potentially accepting any runtime value, defining a strict event contract is crucial when developing complex event-driven architectures. Unfortunately, the native type definitions for Node's EventEmitter annotate event names as string, which forbids any stricter type validation.

// index.js
const emitter = new EventEmitter()

// Let's say our application expects a "ping"
// event with the number payload.
emitter.on('ping', (n: number) => {})

// We can, however, emit a different event by mistake.
emitter.emit('pong', 1)

// Or even the correct event with the wrong data.
emitter.emit('ping', 'wait, not a number')

The purpose of this library is to provide an EventEmitter instance that can accept a generic describing the expected events contract.

import { Emitter } from 'strict-event-emitter'

// Define a strict events contract where keys
// represent event names and values represent
// the list of arguments expected in ".emit()".
type Events = {
  ping: [number]
}

const emitter = new Emitter<Events>()
emitter.addListener('ping', (n) => {
  // "n" argument type is inferred as "number'.
})

emitter.emit('ping', 10) // OK
emitter.emit('unknown', 10) // TypeError (invalid event name)
emitter.emit('ping', 'wait, not a number') // TypeError (invalid data)

This library is also a custom EventEmitter implementation, which makes it compatible with other environments, like browsers or React Native.

Getting started

Install

npm install strict-event-emitter

Use

import { Emitter } from 'strict-event-emitter'

// 1. Define an interface that describes your events.
// Set event names as the keys, and their expected payloads as values.
interface Events {
  connect: [id: string]
  disconnect: [id: string]
}

// 2. Create a strict emitter and pass the previously defined "Events"
// as its first generic argument.
const emitter = new Emitter<Events>()

// 3. Use the "emitter" the same way you'd use the regular "EventEmitter" instance.
emitter.addListener('connect', (id) => {})
emitter.emit('connect', 'abc-123')

License

MIT

FAQs

Last updated on 21 Sep 2023

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc