/* Test servers for autobahn, run with ASAN. /exit route shuts down everything */
const uWS = require('../dist/uws.js');

/* Keep track of all apps */
let apps = [];
let closing = false;

function listenWithSettings(settings) {
  /* These are our shared SSL options */
  let sslOptions = {
    key_file_name: 'misc/key.pem',
    cert_file_name: 'misc/cert.pem',
    passphrase: '1234'
  };

  /* Create the app */
  let app = settings.ssl ? uWS.SSLApp(sslOptions) : uWS.App(sslOptions);

  /* Attach our behavior from settings */
  app.ws('/*', {
    compression: settings.compression,
    maxPayloadLength: 16 * 1024 * 1024,
    idleTimeout: 60,
    maxBackpressure: 16 * 1024 * 1204,
    open: (ws, req) => {
      if (settings.pubsub) {
        ws.subscribe('broadcast');
      }
    },
    message: (ws, message, isBinary) => {
      if (settings.pubsub) {
        ws.publish('broadcast', message, isBinary);
      } else {
        ws.send(message, isBinary, true);
      }
    }
  }).any('/exit', (res, req) => {
    /* Shut down everything on this route */
    if (!closing) {
      apps.forEach((a) => {
        uWS.us_listen_socket_close(a.listenSocket);
      });
      closing = true;
    }

    /* Close this connection */
    res.close();
  }).listen(settings.port, (listenSocket) => {
    if (listenSocket) {
      /* Add this app with its listenSocket */
      apps.push({
        app: app,
        listenSocket: listenSocket
      });
      console.log('Up and running: ' + JSON.stringify(settings));
    } else {
      /* Failure here */
      console.log('Failed to listen, closing everything now');
      process.exit(0);
    }
  });
}

/* non-SSL, non-compression */
listenWithSettings({
  port: 9001,
  ssl: false,
  compression: uWS.DISABLED,
  pubsub: false
});

/* SSL, shared compressor */
listenWithSettings({
  port: 9002,
  ssl: true,
  compression: uWS.SHARED_COMPRESSOR,
  pubsub: false
});

/* non-SSL, dedicated compressor */
listenWithSettings({
  port: 9003,
  ssl: false,
  compression: uWS.DEDICATED_COMPRESSOR,
  pubsub: false
});

/* pub/sub based, non-SSL, non-compression */
listenWithSettings({
  port: 9004,
  ssl: false,
  compression: uWS.DISABLED,
  pubsub: true
});

/* pub/sub based, SSL, non-compression */
listenWithSettings({
  port: 9005,
  ssl: true,
  compression: uWS.DISABLED,
  pubsub: true
});
