0.2.0 • Published 5 years ago

events-decorator v0.2.0

Weekly downloads
1
License
MIT
Repository
github
Last release
5 years ago

Event Decorator

node Build Status npm GitHub David David

Decorates EventEmitter with handy methods when working with multiple events

Install

$ npm install --save events-decorator

API

    const { onceAny, onceAll, decorate } = require('events-decorator');

onceAny(emitter, eventNames, handler)

Will subscribe to all events is evantNames from emitter and will execute handler once for the first event that occurs. When handler is executed, it will immediately unsubscribe from all events.

Returns a function to unsubscribe from the events.

const { onceAny } = require('events-decorator');

const unsubscribe = onceAny(emitter, ['one', 'two', 'three'], (trigger, ...arguments) => {
    console.info(`first event was ${trigger}`);
});

Parameters

NameTypeDescription
emitterEventEmitter
eventNamesArraydefaults to empty array []
handlerFunctionuser provider handler

Returns

unsubscriber: function() calling this function before the handler is executed will unsubscribe from all the events. Calling it after the handler is executed has no effect.

onceAll(emitter, eventNames, handler)

Will subscribe to all events is evantNames from emitter and will execute handler once for the last event that occurs. When handler is executed, it will immediately unsubscribe from all events.

Returns a function to unsubscribe from the events.

const { onceAll } = require('events-decorator');

const unsubscribe = onceAll(emitter, ['one', 'two', 'three'], (argumentsArray) => {
    console.info(`the last event was ${trigger}`);
});

Parameters

NameTypeDescription
emitterEventEmitter
eventNamesArraydefaults to empty array []
handlerFunctionuser provider handler

Returns

unsubscriber: function() calling this function before the handler is executed will unsubscribe from all the events. Calling it after the handler is executed has no effect.

decorate(emitter)

Decorates the EventEmitter with the onceAny and onceAll methods. It won't modify the emitter. The new methods will have similar API to the ones described above, but omitting the first parameter.

Returns a Proxy for the emitter.

const { decorate } = require('events-decorator');

const decorated = decorate(emitter);

const unsub1 = decorated.onceAny(['one', 'two', 'three'], (trigger, ...arguments) => {
    console.info(`first event was ${trigger}`);
});

const unsub2 = decorated.onLast(['one', 'two', 'three'], (trigger, ...arguments) => {
    console.info(`the last event was ${trigger}`);
});

Parameters

NameTypeDescription
emitterEventEmitter

Returns

decorated: Proxy<EventEmitter>

Examples

To count the in-flight requests on a express server:

const { onceAny } = require('events-decorator');

let inflightRequests = 0;
app.use((req, res, next) => {
    inflightRequests++;
    onceAny(res, ['error', 'finish', 'close'], () => {
        inflightRequests--;
    });
    next();
});

To log the response time for each request:

const { onceAny } = require("events-decorator");

app.use((req, res, next) => {
    // hrtime.bigint is available on Node v10.7+
    const start = process.hrtime.bigint();
    onceAny(res, ['finish', 'close'], () => {
        const end = process.hrtime.bigint();
        console.log(`response took ${end - star} nanosecods`);
    });
    next();
});

MIT © Guilherme Hermeto