umbot
Version:
Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф
130 lines (129 loc) • 5.19 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.run = run;
/**
* Модуль для упрощённого запуска приложения без boilerplate-кода.
*
* Предоставляет функцию {@link run}, которая автоматически инициализирует бота,
* подключает платформы, настраивает базу данных и запускает сервер или тесты
* в зависимости от выбранного режима (`dev`, `dev-online`, `prod`).
*
* Используйте этот модуль, если не требуется кастомная конфигурация HTTP-сервера
* или сложная асинхронная инициализация.
*
* @packageDocumentation
* @module build
*/
const index_1 = require("./index");
const plugins_1 = require("./plugins");
const test_1 = require("./test");
/**
* Инициализирует основные параметры приложения
* @param {Bot | BotTest} bot Экземпляр приложения для инициализации
* @param {IConfig} config Конфигурация приложения
* @remarks
* Устанавливает конфигурацию, параметры и контроллер для приложения.
* Этот метод должен вызываться перед запуском приложения.
*/
function _initParam(bot, config) {
bot.setAppConfig(config.appConfig || {});
if (config.appParam) {
bot.setPlatformParams(config.appParam);
}
if (config.controller) {
bot.initBotController(config.controller);
}
if (config.logic) {
config.logic(bot);
}
if (config.plugins) {
config.plugins.forEach((plugin) => {
bot.use(plugin);
});
}
else {
const appContext = bot.getAppContext();
if (!(0, index_1.keysCount)(appContext.platforms)) {
bot.use(plugins_1.fullPlatforms);
}
if (!appContext.database.adapter) {
if (appContext.appConfig.db) {
bot.use(new plugins_1.MongoAdapter(appContext.appConfig.db));
}
else {
bot.use(new plugins_1.FileAdapter());
}
}
}
}
/**
* Единая точка входа для запуска приложения — «из коробки» без boilerplate-кода.
*
* **Зачем это нужно?**
* Вместо ручной инициализации (5-7 строк):
* ```ts
* const bot = new Bot();
* bot.setAppConfig(config.appConfig || {});
* bot.setPlatformParams(config.appParam);
* bot.initBotController(config.controller);
* bot.setAppMode('strict_prod');
* bot.start(hostname, port);
* ```
*
* Достаточно одного вызова:
* ```ts
* run(config, 'prod', '0.0.0.0', 8080);
* ```
*
* **Когда использовать:**
* - Стандартные сценарии запуска (локальная разработка, тестирование, продакшн)
* - Когда используется встроенный HTTP-сервер фреймворка (`node:http.Server`)
*
* **Когда не использовать:**
* - Нужен кастомный HTTP-сервер (Express, Fastify)
* - Требуется сложная логика инициализации (асинхронная загрузка конфига и т.п.)
*
* @param config — конфигурация приложения (контроллер, параметры, плагины)
* @param mode — режим работы ('dev' для консольных тестов, 'dev-online' для webhook-тестов, 'prod' для продакшна)
* @param hostname — хост (по умолчанию 'localhost')
* @param port — порт (по умолчанию 3000)
* @returns В режиме 'dev' возвращает Promise<void>; в режимах 'dev-online' и 'prod' — объект Server (node:http.Server).
*
* @example
* ```ts
* // Запуск в режиме разработки
* run({
* appConfig: { ... },
* appParam: { ... },
* controller: MyController,
* testParams: { ... }
* }, 'dev');
*
* // Запуск в продакшн режиме
* run({
* appConfig: { ... },
* appParam: { ... },
* controller: MyController
* }, 'prod');
* ```
*/
function run(config, mode = 'prod', hostname = 'localhost', port = 3000) {
let bot;
switch (mode) {
case 'dev':
bot = new test_1.BotTest();
_initParam(bot, config);
bot.setAppMode('dev');
return bot.test(config.testParams);
case 'dev-online':
bot = new index_1.Bot();
_initParam(bot, config);
bot.setAppMode('dev');
return bot.start(hostname, port);
case 'prod':
bot = new index_1.Bot();
_initParam(bot, config);
bot.setAppMode('strict_prod');
return bot.start(hostname, port);
}
}