axon icon indicating copy to clipboard operation
axon copied to clipboard

Impossible to handle server errors like 'EADDRINUSE' without 'domain'

Open Skywalker13 opened this issue 7 years ago • 0 comments

Hi,

In sock.js https://github.com/tj/axon/blob/master/lib/sockets/sock.js#L368 , the 'error' event of this.server is not handled then it's not possible to handle the EADDRINUSE error for example (when binding on a non-free port).

I'm doing ugly thing with domain like this:

    this._host = host;
    this._port = parseInt (port);

    /* Create domain in order to catch port binding errors. */
    const domain = require ('domain').create ();

    domain.on ('error', err => {
      this._log.warn (
        'bus binding on %s:%d, error: %s',
        this._host,
        this._port,
        err.message
      );

      if (err.code === 'EADDRINUSE') {
        this._port++;
        this._log.warn (`address in use, retrying on port ${this._port}`);

        setTimeout (() => {
          this._bind (callback);
        }, 0);
        return;
      }

      this._log.err ('this exception is fatal, we cannot continue...');
      process.exit (1);
    });

    /* Try binding in domain. */
    domain.run (() => {
      this._bind (callback);
    });

_bind is using axon.socket (mode).bind ()

The 'error' server event should be exposed by the public API.

Regards

Skywalker13 avatar May 04 '17 14:05 Skywalker13