Search code examples
javascriptnode.jsdom-eventseventemitter

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?


Solution

  • 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);
        }
    
    }