Skip to content
Advertisement

Allow only certain events

Is there a way to only allow certain events in a custom eventEmitter?

For example, if I have something like this everything works as expected:

const EventEmitter = require('events');

class myEvent extends EventEmitter {
    constructor() {
        super();
        var self = this;
        setInterval(function() {
            self.emit('1stEvent');
        }, 1000)
        setInterval(function() {
            self.emit('2ndEvent');
        }, 2000)
    }

}

var MyEvent = new myEvent();
MyEvent.on('1stEvent', function () {
    console.log('1st Event triggered');
});
MyEvent.on('2ndEvent', function () {
    console.log('2nd Event triggered');
});
MyEvent.on('3rdEvent', function () {
    console.log('3rd Event triggered');
});

I get a callback every second on the first event and every 2 seconds on the 2nd event. For the 3rd nothing happens, because I don’t emit this event. Is there a way that this class tells me that this event is not defined and I cannot add a listener to it, or that it is only possible to add listeners to event 1 and 2?

Advertisement

Answer

There is no built-in functionality, but you can create some kind of wrapper to do this.

const EventEmitter = require('events');

class myEvent extends EventEmitter {
    constructor() {
        super();

        this._events = new Set();
        this._events.add('1stEvent');      
        this._events.add('2ndEvent');   

        var self = this;
        setInterval(function() {
            self.emit('1stEvent');
        }, 1000)
        setInterval(function() {
            self.emit('2ndEvent');
        }, 2000)
    }

    on(event, callback) {
      if(!this._events.has(event)) {
        console.log('Event not registered'); 
        return;
      }

      super.on(event, callback);
    }

}
Advertisement