botserver/src/app.ts

165 lines
7 KiB
TypeScript
Raw Normal View History

#! /usr/bin / env node
2018-04-21 02:59:30 -03:00
/*****************************************************************************\
| ( )_ _ |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' _ `\ /'_`\ |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| ( ) |( (_) ) |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' |
| | | ( )_) | |
| (_) \___/' |
| |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. |
| Licensed under the AGPL-3.0. |
2018-11-11 19:09:18 -02:00
| |
2018-04-21 02:59:30 -03:00
| According to our dual licensing model, this program can be used either |
| under the terms of the GNU Affero General Public License, version 3, |
| or under a proprietary license. |
| |
| The texts of the GNU Affero General Public License with an additional |
| permission and of our proprietary license can be found at and |
| in the LICENSE file you have received along with this program. |
| |
| This program is distributed in the hope that it will be useful, |
2018-09-11 19:40:53 -03:00
| but WITHOUT ANY WARRANTY, without even the implied warranty of |
2018-04-21 02:59:30 -03:00
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. |
| |
| "General Bots" is a registered trademark of Pragmatismo.io. |
| The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. |
| |
\*****************************************************************************/
2018-11-11 19:09:18 -02:00
/**
* @fileoverview General Bots server core.
*/
'use strict';
const logger = require('./logger');
const express = require('express');
const bodyParser = require('body-parser');
import { IGBCoreService, IGBInstance, IGBPackage, GBLog } from 'botlib';
import { GBAdminService } from '../packages/admin.gbapp/services/GBAdminService';
import { AzureDeployerService } from '../packages/azuredeployer.gbapp/services/AzureDeployerService';
import { GuaribasInstance } from '../packages/core.gbapp/models/GBModel';
import { GBConfigService } from '../packages/core.gbapp/services/GBConfigService';
import { GBConversationalService } from '../packages/core.gbapp/services/GBConversationalService';
import { GBCoreService } from '../packages/core.gbapp/services/GBCoreService';
import { GBDeployer } from '../packages/core.gbapp/services/GBDeployer';
import { GBImporter } from '../packages/core.gbapp/services/GBImporterService';
import { GBMinService } from '../packages/core.gbapp/services/GBMinService';
const appPackages = new Array<IGBPackage>();
2018-05-11 23:27:00 -03:00
2018-04-21 02:59:30 -03:00
/**
* General Bots open-core entry point.
*/
export class GBServer {
/**
* Program entry-point.
*/
public static run() {
GBLog.info(`The Bot Server is in STARTING mode...`);
2018-04-21 02:59:30 -03:00
// Creates a basic HTTP server that will serve several URL, one for each
// bot instance. This allows the same server to attend multiple Bot on
// the Marketplace until GB get serverless.
const port = process.env.port || process.env.PORT || 4242;
const server = express();
2018-04-21 02:59:30 -03:00
server.use(bodyParser.json()); // to support JSON-encoded bodies
server.use(
bodyParser.urlencoded({
// to support URL-encoded bodies
2018-11-27 22:56:11 -02:00
extended: true
})
);
2018-05-11 23:27:00 -03:00
2018-10-25 18:13:51 -03:00
let bootInstance: IGBInstance;
2018-09-09 16:40:04 -03:00
server.listen(port, () => {
(async () => {
try {
GBLog.info(`Now accepting connections on ${port}...`);
2018-04-21 02:59:30 -03:00
2018-09-09 16:40:04 -03:00
// Reads basic configuration, initialize minimal services.
2018-09-09 14:39:37 -03:00
GBConfigService.init();
const core: IGBCoreService = new GBCoreService();
2018-10-25 18:13:51 -03:00
2018-11-27 22:56:11 -02:00
const importer: GBImporter = new GBImporter(core);
const deployer: GBDeployer = new GBDeployer(core, importer);
const azureDeployer: AzureDeployerService = new AzureDeployerService(deployer);
const adminService: GBAdminService = new GBAdminService(core);
const conversationalService: GBConversationalService = new GBConversationalService(core);
// Ensure that local development proxy is setup.
GBLog.info(`Establishing a development local proxy (ngrok)...`);
const proxyAddress: string = await core.ensureProxy(port);
// Creates a boot instance or load it from storage.
let bootInstance: IGBInstance = null;
try {
await core.initStorage();
} catch (error) {
bootInstance = await core.createBootInstance(core, azureDeployer, proxyAddress);
await core.initStorage();
}
2019-02-25 09:44:39 -03:00
core.ensureAdminIsSecured();
// Deploys system and user packages.
GBLog.info(`Deploying packages...`);
core.loadSysPackages(core);
await core.checkStorage(azureDeployer);
await deployer.deployPackages(core, server, appPackages);
// Loads all bot instances.
GBLog.info(`Publishing instances...`);
const packageInstance = await importer.importIfNotExistsBotPackage(
GBConfigService.get('CLOUD_GROUP'),
'boot.gbot',
'packages/boot.gbot'
);
const fullInstance = { ...packageInstance, ...bootInstance };
2018-11-27 22:56:11 -02:00
await core.saveInstance(fullInstance);
let instances: IGBInstance[] = await core.loadAllInstances(core, azureDeployer, proxyAddress);
2018-11-27 22:56:11 -02:00
instances = await core.ensureInstances(instances, bootInstance, core);
if (!bootInstance) {
bootInstance = instances[0];
}
2018-11-27 22:56:11 -02:00
// Builds minimal service infrastructure.
2018-11-27 22:56:11 -02:00
const minService: GBMinService = new GBMinService(core, conversationalService, adminService, deployer);
await minService.buildMin(bootInstance, server, appPackages, instances, deployer);
// Deployment of local applications for the first time.
deployer.runOnce();
GBLog.info(`The Bot Server is in RUNNING mode...`);
// Opens Navigator.
core.openBrowserInDevelopment();
2018-09-09 16:40:04 -03:00
} catch (err) {
GBLog.error(`STOP: ${err} ${err.stack ? err.stack : ''}`);
process.exit(1);
2018-09-09 16:40:04 -03:00
}
})();
});
2018-04-21 02:59:30 -03:00
}
}
2018-12-02 19:59:27 -02:00
// First line to run.
GBServer.run();