Interacción entre los oyentes de Expressjs, socket.io y EventEmitter

Tengo una configuración de servidor que usa Expressjs que se comunica con los clientes front-end usando socket.io. El servidor se ejecuta en la raspberry pi y proporciona un backend para controlar mplayer player para mi biblioteca de música usando el módulo mplayer nodejs.

La mayoría de las acciones para actualizar los clientes en el front-end se realizan en función de los eventos emitidos por el módulo EventEmitter de mplayer. Por ejemplo :

Cuando se emite un comando para detener al jugador como player.stop() la instancia del EventEmitter del jugador emite 'stop' evento 'stop' .

Luego, el servidor escucha este evento de la siguiente manera: player.on('stop', socket.emit('stop'));

¡El problema que he notado es que a medida que más clientes se conectan al servidor a través de socket io, cada cliente crea un oyente para el evento 'stop' EventEmitter de mplayer! Así, por ejemplo, si hubiera 3 clientes, tendería a recibir 3 eventos de 'stop' del jugador EventEmitter y, por consiguiente, enviaría 3 eventos de 'stop' a mis clientes front-end.

Mi pregunta es ¿cómo puedo asegurarme de que solo se haya creado un oyente para el evento del jugador? ¿Por qué cada cliente se enlaza como oyente al evento EventEmitter?

La configuración de socketio de mi servidor se ve de la siguiente manera:

 io.on('connection', function(socket) { console.log('a user connected @ ' + socket.id); ///// Listen for player to successfully stop playing or when EOF is reached player.on('stop', function() { console.log("Received Stop Event From Player"); socket.emit('song:next'); //Play next song } 

Salida de consola cuando hay 3 clientes conectados, al recibir el evento 'stop' :

 Received Stop Event From Player Received Stop Event From Player Received Stop Event From Player 

Esto me lleva a enviar 3 'next' eventos para enviar a todos mis clientes.

MPlayer nodejs tiene este aspecto:

 this.player.on('playstop', function() { if(options.verbose) { console.log('player.stop'); } this.emit('stop') }.bind(this)); 

mplayer para nodejs

En una investigación adicional a través de stackoverflow parece similar a esta pregunta: EventEmitter local que escucha el eventEmitter global

Pero la solución provista en los comentarios no tiene sentido para mí debido al uso de addListener y removeListener ?? ¿Alguien puede descomponerlo y explicarme cómo lograría lo que se menciona allí?

Este es un diagrama de lo que entiendo que está sucediendo. ¿Alguna forma de eludir esto?

El problema parecía ser este trozo de código.

 io.on('connection', function(socket) { console.log('a user connected @ ' + socket.id); ///// Listen for player to successfully stop playing or when EOF is reached player.on('stop', function() { console.log("Received Stop Event From Player"); socket.emit('song:next'); //Play next song } 

Tener el reproductor dentro del bloque de conexión provocó que cada cliente se vinculara al jugador como oyente. Al mover todo el manejo de eventos del jugador al ámbito global, el problema parece haberse solucionado.