sitegui / nodejs-websocket

A node.js module for websocket server and client
MIT License
736 stars 155 forks source link

Max call stack size exceeded on Connection.close #54

Open NishantDesai1306 opened 6 years ago

NishantDesai1306 commented 6 years ago

I have a periodic service in nodejs that tries to create 30-40 socket connections and close it in case (it gets connected successfully or some error occurs while connecting) but every now an then I get Maxmimum call stack size exceeded error at line connection.close()

My Code structure

const connection = ws.connect(socketServerUrl, (err) => {
    if (err) {
        // console.log the error
    }
    else {
        connection.sendPing();
    }
});

connection.on('error', (err) => {
    const reason = err && err.message ? err.message : err;

    // THIS IS WHERE I GET THAT MAX CALL STACK SIZE REACHED EXCEPTION
    connection.close(); // release the connection
});

connection.on('pong', (data) => {
    connection.close(); // release the connection
});

Error Screenshot image

NishantDesai1306 commented 6 years ago

I am also open to other better ways to do this, basically what I need to do is check every few minutes whether socket servers are accepting connection or not.

taomas commented 6 years ago

i have the same problem when close browser or refresh browser

sitegui commented 5 years ago

Hi, the problem here seems to be a loop error -> close -> error -> ...

The error event will naturally also close the socket (https://github.com/sitegui/nodejs-websocket#event-errorerrobj), normally you don't have to explicit call it.

However, the lib shouldn't crash when someone does it :) This happens because a call to close() (by WebSocket spec) does not close the socket right away. First it tries to inform the peer the connection will be dropped by a given reason. The underlying call to write errors and cycle error -> close -> write -> error -> ... begins

I don't have the time to fix this issue for now, however I'm open for a PR if you want to dive into the code.

Best regards,