Ctrl K
ComunidadGuías…

socket/server.js

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
'use strict';

/**
 * Fleetbase socket server entry point.
 *
 * Public listener (SOCKETCLUSTER_PORT, default 8000):   GET /health-check, WebSocket at /socketcluster/
 * Internal listener (SOCKETCLUSTER_INTERNAL_PORT, 8001): signed POST /publish, signed GET /stats
 *
 * With SOCKETCLUSTER_AUTH_KEY set, the server polls the API's socket config endpoint and
 * applies enabled/mode/origins changes made in the console without a restart.
 *
 * See README.md for every environment variable and the auth modes.
 */

const { loadConfig, ConfigError } = require('./lib/config');
const { createSocketServer } = require('./lib/app');
const { createLogger, describeError } = require('./lib/logger');

function redactUrl(value) {
    try {
        const url = new URL(value);
        url.username = '';
        url.password = '';
        url.search = '';
        return url.toString();
    } catch (error) {
        return null;
    }
}

async function main() {
    let config;
    try {
        config = loadConfig(process.env);
    } catch (error) {
        const logger = createLogger({ level: 1 });
        logger.error({ event: 'socket_config_error', error: describeError(error) });
        process.exit(error instanceof ConfigError ? 78 : 1);
        return;
    }

    const logger = createLogger({ level: config.logLevel });
    for (const warning of config.warnings) {
        logger.warn({ event: 'socket_config_warning', message: warning });
    }

    const server = createSocketServer(config, { logger });
    const ports = await server.start();

    logger.info({
        event: 'socket_server_started',
        pid: process.pid,
        port: ports.port,
        internal_port: ports.internalPort,
        mode: config.mode,
        auth_enabled: config.authEnabled,
        client_publish: config.mode !== 'enforce',
        authorize_url: config.authKey !== null ? redactUrl(config.authorizeUrl) : null,
        config_url: server.poller ? redactUrl(config.configUrl) : null,
        config_poll_seconds: server.poller ? config.configPollSeconds : 0,
        scc: Boolean(config.scc.stateServerHost),
    });

    let stopping = false;
    const shutdown = (signal) => {
        if (stopping) {
            return;
        }
        stopping = true;
        logger.info({ event: 'socket_server_stopping', signal });
        const force = setTimeout(() => process.exit(0), 10000);
        force.unref();
        server
            .stop()
            .catch((error) => logger.error({ event: 'socket_server_stop_error', error: describeError(error) }))
            .finally(() => process.exit(0));
    };
    process.on('SIGTERM', () => shutdown('SIGTERM'));
    process.on('SIGINT', () => shutdown('SIGINT'));
}

main().catch((error) => {
    createLogger({ level: 1 }).error({ event: 'socket_server_fatal', error: describeError(error) });
    process.exit(1);
});