englercj / node-esl

FreeSWITCH ESL implementation for Node.js; implements the full Event Socket Library specified in: http://wiki.freeswitch.org/wiki/Esl
http://englercj.github.com/node-esl/
MIT License
170 stars 111 forks source link

execute() does not detect socket disconnection #84

Open ssinyagin opened 4 years ago

ssinyagin commented 4 years ago

I'm running synchronous outbound ESL socket toward the node-esl server. If the server starts an conn.execute(xxxx) command, and the socket disconnects during the execution, the execute() never returns and hangs forever.

by looking through the sources of Connection.js, I couldn't find any handling for such event.

Here's my code:

                    function run_phrases() {
                        if( phrases.length > 0 && input === null ) {
                            let file = phrases.shift() + ext;
                            console.log(conn.cs.uuid + ' Playing ' + file);
                            try {
                                conn.execute('play_and_get_digits', '1 1 1 10 # ' + file + ' "" dialed_digits',
                                             function(ev) {
                                                 input = ev.getHeader('variable_dialed_digits');
                                                 if( input !== null ) {
                                                     console.log(conn.cs.uuid + ' User pressed ' + input);
                                                 }
                                                 run_phrases();
                                             });
                            }
                            catch (err) {
                                if( err.code != 'ERR_STREAM_DESTROYED' ) {
                                    console.error(err);
                                }
                                else {
                                    console.log(conn.cs.uuid + ' disconnected');
                                }
                                reject();
                            }
                        }
                        else {
                            resolve();
                        }
                    }

                    run_phrases();
ssinyagin commented 4 years ago

net.Socket is not sending "end" event on error. It sends "close" in both error and non-error cases, and that's when you need to emit esl::end

I'll send a PR

ssinyagin commented 4 years ago

also a branch to fix it in 1.2.1: https://github.com/voxserv/node-esl/tree/v1.2.1-bugfix

englercj commented 4 years ago

Can you open a PR for that branch to the v1.x branch?

pablito25sp commented 2 years ago

Until this is merged you can set up the callback on your own code.

    connection.socket.on('close', (hadError: boolean) => {
      if (hadError) logger.warn('esl socket closed with error')
      else logger.debug('esl socket closed')
      endCall()
    })