113 lines
4.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Сервис интеграции ПП Парус 8 с WEB API
Точка входа в сервер приложений
*/
//----------------------
// Подключение библиотек
//----------------------
const cfg = require("./config"); //Настройки сервера приложений
const app = require("./core/app"); //Сервер приложений
const { makeErrorText } = require("./core/utils"); //Вспомогательные функции
//--------------------------
// Глобальные идентификаторы
//--------------------------
let appSrv = new app.ParusAppServer(); //Экземпляр сервера приложений
//----------------------------------------
// Управление процессом сервера приложений
//----------------------------------------
//Разрешение на TLS (Transport Layer Security) без авторизации
process.env.NODE_TLS_REJECT_UNAUTHORIZED = cfg?.outGoing?.bValidateSSL === false ? "0" : "1";
//Включение "Токого режима" для Oracle
process.env.NODE_ORACLE_DB_THIN_MODE = cfg?.dbConnect?.bOraUseThinMode === true ? "1" : "0";
//Путь к клиентским библиотекам для Oracle
process.env.ORACLE_CLIENT_LIB_DIR = cfg?.dbConnect?.sOraClient || "";
//Аварийное освобождение файла лога
const releaseLogFileEmergency = () => {
try {
appSrv.logger.closeLogFileSync();
} catch {}
};
//Аварийный выход с протоколированием и освобождением файла лога
const emergencyExit = sErrMsg => {
if (sErrMsg) appSrv.logger.errorSync(sErrMsg);
if (!appSrv.logger.wasStopLogged()) {
appSrv.logger.notifyServerStoppedSync(1);
}
releaseLogFileEmergency();
process.exit(1);
};
//Обработка события "выход" жизненного цикла процесса
process.on("exit", code => {
//Если сообщение об останове уже было выдано ранее - не дублируем
if (appSrv.logger.wasStopLogged()) return;
//Допишем в console и в файл (если ещё открыт), затем освободим дескриптор
appSrv.logger.notifyServerStoppedSync(code);
releaseLogFileEmergency();
});
//Обработка событий мягкого останова процесса
["SIGINT", "SIGQUIT", "SIGTERM"].forEach(sSig => {
process.once(sSig, async () => {
await appSrv.logger.warn(`Получен сигнал на останов сервера приложений: ${sSig}`);
const terminateTimeout = setTimeout(() => {
emergencyExit("Истекло время ожидания останова сервера приложений. Инициирован аварийный выход из процесса.");
}, cfg.common.nTerminateTimeout);
try {
await appSrv.stop(terminateTimeout);
} catch (e) {
clearTimeout(terminateTimeout);
//Только sync: дальше закрываем файл и выходим
appSrv.logger.errorSync(`При останове сервера приложений: ${makeErrorText(e)}`);
emergencyExit();
}
});
});
//Перехват всех неохваченных ошибок
process.on("uncaughtException", e => {
emergencyExit(`НЕПРЕДВИДЕННАЯ ОШИБКА: ${makeErrorText(e)}`);
});
//Запуск сервера приложений
const start = async () => {
try {
//Инициализируем сервер приложений
await appSrv.init({ config: cfg });
//Включаем его
await appSrv.run();
} catch (e) {
//Если есть ошибки с которыми сервер не справился - ловим их, показываем...
await appSrv.logger.error(makeErrorText(e));
//...и пытаемся остановить сервер нормально (с таймаутом и кодом 1)
const terminateTimeout = setTimeout(() => {
emergencyExit("Истекло время ожидания останова сервера приложений. Инициирован аварийный выход из процесса.");
}, cfg.common.nTerminateTimeout);
try {
await appSrv.stop(terminateTimeout, 1);
} catch (eStop) {
clearTimeout(terminateTimeout);
//Только sync: дальше закрываем файл и выходим
appSrv.logger.errorSync(makeErrorText(eStop));
emergencyExit();
}
}
};
//------------
// Точка входа
//------------
//Старутем
start();