Socket
Socket
Sign inDemoInstall

emittery

Package Overview
Dependencies
Maintainers
2
Versions
30
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

emittery - npm Package Compare versions

Comparing version 0.10.2 to 0.11.0

12

index.d.ts
/* eslint-disable no-redeclare */
/**
Emittery accepts strings and symbols as event names.
Emittery accepts strings, symbols, and numbers as event names.
Symbol event names can be used to avoid name collisions when your classes are extended, especially for internal events.
Symbol event names are preferred given that they can be used to avoid name collisions when your classes are extended, especially for internal events.
*/
type EventName = string | symbol;
type EventName = PropertyKey;

@@ -93,3 +93,3 @@ // Helper type for turning the passed `EventData` type map into a list of string keys that don't require data alongside the event name when emitting. Uses the same trick that `Omit` does internally to filter keys by building a map of keys to keys we want to keep, and then accessing all the keys to return just the list of keys we want to keep.

if (typeof eventName === 'symbol') {
if (typeof eventName === 'symbol' || typeof eventName === 'number') {
eventName = eventName.toString();

@@ -146,3 +146,3 @@ }

const emitter = new Emittery<
// Pass `{[eventName: <string | symbol>]: undefined | <eventArg>}` as the first type argument for events that pass data to their listeners.
// Pass `{[eventName: <string | symbol | number>]: undefined | <eventArg>}` as the first type argument for events that pass data to their listeners.
// A value of `undefined` in this map means the event listeners should expect no data, and a type other than `undefined` means the listeners will receive one argument of that type.

@@ -169,3 +169,3 @@ {

declare class Emittery<
EventData = Record<string, any>, // When https://github.com/microsoft/TypeScript/issues/1863 ships, we can switch this to have an index signature including Symbols. If you want to use symbol keys right now, you need to pass an interface with those symbol keys explicitly listed.
EventData = Record<EventName, any>,
AllEventData = EventData & _OmnipresentEventData,

@@ -172,0 +172,0 @@ DatalessEvents = DatalessEventNames<EventData>

@@ -9,11 +9,19 @@ 'use strict';

// Define symbols for "meta" events.
const listenerAdded = Symbol('listenerAdded');
const listenerRemoved = Symbol('listenerRemoved');
// Define a symbol that allows internal code to emit meta events, but prevents userland from doing so.
const metaEventsAllowed = Symbol('metaEventsAllowed');
let isGlobalDebugEnabled = false;
function assertEventName(eventName) {
if (typeof eventName !== 'string' && typeof eventName !== 'symbol') {
throw new TypeError('eventName must be a string or a symbol');
function assertEventName(eventName, allowMetaEvents) {
if (typeof eventName !== 'string' && typeof eventName !== 'symbol' && typeof eventName !== 'number') {
throw new TypeError('`eventName` must be a string, symbol, or number');
}
if (isMetaEvent(eventName) && allowMetaEvents !== metaEventsAllowed) {
throw new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`');
}
}

@@ -37,3 +45,3 @@

function getEventProducers(instance, eventName) {
const key = typeof eventName === 'string' || typeof eventName === 'symbol' ? eventName : anyProducer;
const key = typeof eventName === 'string' || typeof eventName === 'symbol' || typeof eventName === 'number' ? eventName : anyProducer;
const producers = producersMap.get(instance);

@@ -152,3 +160,3 @@ if (!producers.has(key)) {

const isListenerSymbol = symbol => symbol === listenerAdded || symbol === listenerRemoved;
const isMetaEvent = eventName => eventName === listenerAdded || eventName === listenerRemoved;

@@ -229,3 +237,3 @@ class Emittery {

if (typeof eventName === 'symbol') {
if (typeof eventName === 'symbol' || typeof eventName === 'number') {
eventName = eventName.toString();

@@ -252,3 +260,3 @@ }

for (const eventName of eventNames) {
assertEventName(eventName);
assertEventName(eventName, metaEventsAllowed);
getListeners(this, eventName).add(listener);

@@ -258,4 +266,4 @@

if (!isListenerSymbol(eventName)) {
this.emit(listenerAdded, {eventName, listener});
if (!isMetaEvent(eventName)) {
this.emit(listenerAdded, {eventName, listener}, metaEventsAllowed);
}

@@ -272,3 +280,3 @@ }

for (const eventName of eventNames) {
assertEventName(eventName);
assertEventName(eventName, metaEventsAllowed);
getListeners(this, eventName).delete(listener);

@@ -278,4 +286,4 @@

if (!isListenerSymbol(eventName)) {
this.emit(listenerRemoved, {eventName, listener});
if (!isMetaEvent(eventName)) {
this.emit(listenerRemoved, {eventName, listener}, metaEventsAllowed);
}

@@ -297,3 +305,3 @@ }

for (const eventName of eventNames) {
assertEventName(eventName);
assertEventName(eventName, metaEventsAllowed);
}

@@ -304,4 +312,4 @@

async emit(eventName, eventData) {
assertEventName(eventName);
async emit(eventName, eventData, allowMetaEvents) {
assertEventName(eventName, allowMetaEvents);

@@ -315,3 +323,3 @@ this.logIfDebugEnabled('emit', eventName, eventData);

const staticListeners = [...listeners];
const staticAnyListeners = isListenerSymbol(eventName) ? [] : [...anyListeners];
const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];

@@ -333,4 +341,4 @@ await resolvedPromise;

async emitSerial(eventName, eventData) {
assertEventName(eventName);
async emitSerial(eventName, eventData, allowMetaEvents) {
assertEventName(eventName, allowMetaEvents);

@@ -366,3 +374,3 @@ this.logIfDebugEnabled('emitSerial', eventName, eventData);

anyMap.get(this).add(listener);
this.emit(listenerAdded, {listener});
this.emit(listenerAdded, {listener}, metaEventsAllowed);
return this.offAny.bind(this, listener);

@@ -380,3 +388,3 @@ }

this.emit(listenerRemoved, {listener});
this.emit(listenerRemoved, {listener}, metaEventsAllowed);
anyMap.get(this).delete(listener);

@@ -391,3 +399,3 @@ }

if (typeof eventName === 'string' || typeof eventName === 'symbol') {
if (typeof eventName === 'string' || typeof eventName === 'symbol' || typeof eventName === 'number') {
getListeners(this, eventName).clear();

@@ -432,3 +440,3 @@

if (typeof eventName !== 'undefined') {
assertEventName(eventName);
assertEventName(eventName, metaEventsAllowed);
}

@@ -435,0 +443,0 @@

{
"name": "emittery",
"version": "0.10.2",
"version": "0.11.0",
"description": "Simple and modern async event emitter",

@@ -5,0 +5,0 @@ "license": "MIT",

@@ -43,5 +43,5 @@ # <img src="media/header.png" width="1000">

Emittery accepts strings and symbols as event names.
Emittery accepts strings, symbols, and numbers as event names.
Symbol event names can be used to avoid name collisions when your classes are extended, especially for internal events.
Symbol event names are preferred given that they can be used to avoid name collisions when your classes are extended, especially for internal events.

@@ -164,3 +164,3 @@ ### isDebugEnabled

if (typeof eventName === 'symbol') {
if (typeof eventName === 'symbol' || typeof eventName === 'number') {
eventName = eventName.toString();

@@ -227,3 +227,3 @@ }

Emittery exports some symbols which represent custom events that can be passed to `Emitter.on` and similar methods.
Emittery exports some symbols which represent "meta" events that can be passed to `Emitter.on` and similar methods.

@@ -230,0 +230,0 @@ - `Emittery.listenerAdded` - Fires when an event listener was added.

SocketSocket SOC 2 Logo

Product

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

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc