diff --git a/deploy/core.gbapp/services/GBConfigService.ts b/deploy/core.gbapp/services/GBConfigService.ts index ece7b149..d972b4a9 100644 --- a/deploy/core.gbapp/services/GBConfigService.ts +++ b/deploy/core.gbapp/services/GBConfigService.ts @@ -70,10 +70,6 @@ export class GBConfigService { value = undefined; break; - case "BOOT_PACKAGE": - value = "none"; - break; - case "DEFAULT_AI": value = undefined; break; @@ -81,6 +77,7 @@ export class GBConfigService { case "DATABASE_SYNC": value = "false"; break; + default: logger.trace( `Guaribas General Error: Invalid key on .env file: '${key}'` diff --git a/deploy/core.gbapp/services/GBCoreService.ts b/deploy/core.gbapp/services/GBCoreService.ts index e7537e5c..d30a9665 100644 --- a/deploy/core.gbapp/services/GBCoreService.ts +++ b/deploy/core.gbapp/services/GBCoreService.ts @@ -103,18 +103,9 @@ export class GBCoreService implements IGBCoreService { acquire: 40000 } }); - - - // TODO: Packages add model. - - if (GBConfigService.get("DATABASE_SYNC") === "true") { - this.syncDatabaseStructure(cb); - } else { - cb(); - } + cb(); } - - /** Calls ORM to sync storage. */ + syncDatabaseStructure(cb) { logger.trace("Syncing database..."); this.sequelize.sync().then(value => { diff --git a/deploy/core.gbapp/services/GBMinService.ts b/deploy/core.gbapp/services/GBMinService.ts index 4dc9c3ee..7e385fa4 100644 --- a/deploy/core.gbapp/services/GBMinService.ts +++ b/deploy/core.gbapp/services/GBMinService.ts @@ -184,7 +184,7 @@ export class GBMinService { // Prepares bot service. let inMemoryStorage = new MemoryBotStorage(); - + min.bot = new gBuilder.UniversalBot(connector, { storage: inMemoryStorage }); @@ -199,22 +199,21 @@ export class GBMinService { botbuilder: (session, next) => { - if (!session.privateConversationData.loaded) { setTimeout( () => { - min.conversationalService.sendEvent( - session, - "loadInstance", - min.instance // TODO: Send a new thiner object. - ) - }, + min.conversationalService.sendEvent( + session, + "loadInstance", + min.instance // TODO: Send a new thiner object. + ) + }, 500 ); session.privateConversationData.loaded = true; session.userData.subjects = []; } - + appPackages.forEach(e => { e.onNewSession(min, session) }); @@ -278,7 +277,7 @@ export class GBMinService { generalPackages.forEach(e => { logger.trace(`Loading package: ${e.name}...`); let p = Object.create(e.prototype) as IGBPackage; - p.loadBot(min) + p.loadBot(min); }); // Specialized load for each min instance. @@ -301,6 +300,7 @@ export class GBMinService { paths = paths.concat(additionalPath.toLowerCase().split(";")); } let botPackages = new Array(); + let gbappPackages = new Array(); let generalPackages = new Array(); function doIt(path) { @@ -313,6 +313,9 @@ export class GBMinService { if (element.endsWith('.gbot')) { botPackages.push(element); } + else if (element.endsWith('.gbapp')) { + gbappPackages.push(element); + } else { generalPackages.push(element); } @@ -326,89 +329,117 @@ export class GBMinService { doIt(e); }); - /** Deploys all .gbot files first. */ - botPackages.forEach(e => { - logger.trace(`Deploying bot: ${e}...`); - this.deployer.deployBot(e, (data, err) => { - botPackages.length++; - logger.trace(`Bot: ${e} deployed...`); - }); + /** Deploys all .gbapp files first. */ + + let appPackagesProcessed = 0; + + gbappPackages.forEach(e => { + logger.trace(`Deploying app: ${e}...`); + // Skips .gbapp inside deploy folder. + if (!e.startsWith('deploy')) { + import(e).then(m => { + let p = new m.Package(); + p.loadPackage(core, core.sequelize); + appPackages.push(p); + logger.trace(`App (.gbapp) deployed: ${e}.`); + appPackagesProcessed++; + }).catch(err => { + logger.trace(`Error deploying App (.gbapp): ${e}: ${err}`); + appPackagesProcessed++; + }); + } else { + appPackagesProcessed++; + } }); - /** Then all remaining generalPackages are loaded. */ - - generalPackages.forEach(filename => { - - let filenameOnly = Path.basename(filename); - logger.trace(`Deploying package: ${filename}...`); - - /** Handles apps for general bots - .gbapp must stay out of deploy folder. */ - - if (Path.extname(filename) === ".gbapp" || Path.extname(filename) === ".gblib") { - - // Skips .gbapp inside deploy folder. - if (!filename.startsWith('deploy')) { - import(filename).then(m => { - - let p = new m.Package(); - p.loadPackage(core); - appPackages.push(p); - logger.trace(`App (.gbapp) deployed: ${filenameOnly}.`); - }); - } - - /** Themes for bots. */ - - } else if (Path.extname(filename) === ".gbtheme") { - server.use("/themes/" + filenameOnly, express.static(filename)); - logger.trace(`Theme (.gbtheme) assets acessible at: ${"/themes/" + filenameOnly}.`); - - - /** Knowledge base for bots. */ - - } else if (Path.extname(filename) === ".gbkb") { - server.use( - "/kb/" + filenameOnly + "/subjects", - express.static(UrlJoin(filename, "subjects")) - ); - logger.trace(`KB (.gbkb) assets acessible at: ${"/kb/" + filenameOnly}.`); - } - - else if (Path.extname(filename) === ".gbui" || filename.endsWith(".git")) { - // Already Handled - } - - /** Unknown package format. */ - - else { - let err = new Error(`Package type not handled: ${filename}.`); - reject(err); - } - totalPackages++; - }); WaitUntil() .interval(1000) .times(5) .condition(function (cb) { - logger.trace(`Waiting for package deployment...`); - cb(totalPackages == (generalPackages.length + botPackages.length)); + logger.trace(`Waiting for app package deployment...`); + cb(appPackagesProcessed == gbappPackages.length); }) .done(function (result) { - if (botPackages.length === 0){ - logger.info(`The bot server is running empty: No bot instances have been found, at least one .gbot file must be deployed.`); - } - else{ - logger.trace(`Package deployment done.`); - } - resolve(); - }); + logger.trace(`App Package deployment done.`); + core.syncDatabaseStructure(cb => { + + /** Deploys all .gbot files first. */ + + botPackages.forEach(e => { + logger.trace(`Deploying bot: ${e}...`); + _this.deployer.deployBot(e, (data, err) => { + logger.trace(`Bot: ${e} deployed...`); + }); + }); + + // TODO: Wait here. + + /** Then all remaining generalPackages are loaded. */ + + generalPackages.forEach(filename => { + + let filenameOnly = Path.basename(filename); + logger.trace(`Deploying package: ${filename}...`); + + /** Handles apps for general bots - .gbapp must stay out of deploy folder. */ + + if (Path.extname(filename) === ".gbapp" || Path.extname(filename) === ".gblib") { + + + /** Themes for bots. */ + + } else if (Path.extname(filename) === ".gbtheme") { + server.use("/themes/" + filenameOnly, express.static(filename)); + logger.trace(`Theme (.gbtheme) assets acessible at: ${"/themes/" + filenameOnly}.`); + + + /** Knowledge base for bots. */ + + } else if (Path.extname(filename) === ".gbkb") { + server.use( + "/kb/" + filenameOnly + "/subjects", + express.static(UrlJoin(filename, "subjects")) + ); + logger.trace(`KB (.gbkb) assets acessible at: ${"/kb/" + filenameOnly}.`); + } + + else if (Path.extname(filename) === ".gbui" || filename.endsWith(".git")) { + // Already Handled + } + + /** Unknown package format. */ + + else { + let err = new Error(`Package type not handled: ${filename}.`); + reject(err); + } + totalPackages++; + }); + + WaitUntil() + .interval(1000) + .times(5) + .condition(function (cb) { + logger.trace(`Waiting for package deployment...`); + cb(totalPackages == (generalPackages.length)); + }) + .done(function (result) { + if (botPackages.length === 0) { + logger.info(`The bot server is running empty: No bot instances have been found, at least one .gbot file must be deployed.`); + } + else { + logger.trace(`Package deployment done.`); + } + resolve(); + }); + }); + }); } catch (err) { reject(err) } }); } - -} +} \ No newline at end of file diff --git a/src/app.ts b/src/app.ts index 6ce2b20b..1e47b9ca 100644 --- a/src/app.ts +++ b/src/app.ts @@ -67,15 +67,14 @@ export class GBServer { // the Marketplace until GB get serverless. let port = process.env.port || process.env.PORT || 4242; - logger.info(`Starting GeneralBots HTTP server...`); + logger.info(`Starting HTTP BotServer...`); let server = express(); server.listen(port, () => { - logger.info(`General Bots Server - RUNNING on ${port}...`); + logger.info(`General Bot - RUNNING on ${port}...`); logger.info(`Starting instances...`); - // Reads basic configuration, initialize minimal services. GBConfigService.init(); @@ -93,7 +92,8 @@ export class GBServer { let sysPackages = new Array(); - [GBAdminPackage, GBAnalyticsPackage, GBCorePackage, GBSecurityPackage, GBKBPackage, GBCustomerSatisfactionPackage].forEach(e => { + [GBAdminPackage, GBAnalyticsPackage, GBCorePackage, GBSecurityPackage, + GBKBPackage, GBCustomerSatisfactionPackage].forEach(e => { logger.trace(`Loading sys package: ${e.name}...`); let p = Object.create(e.prototype) as IGBPackage; p.loadPackage(core, core.sequelize); @@ -104,9 +104,11 @@ export class GBServer { try { let appPackages = new Array(); await minService.deployPackages(core, server, appPackages, sysPackages); - minService.buildMin(instance => { - logger.info(`Instance loaded: ${instance.botId}...`); - }, server, appPackages); + + minService.buildMin(instance => { + logger.info(`Instance loaded: ${instance.botId}...`); + }, server, appPackages); + } catch (err) { logger.log(err) diff --git a/src/logger.ts b/src/logger.ts index ace797d6..b7983d27 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -60,7 +60,7 @@ var logger = new (winston.Logger)({ }); logger.add(winston.transports.Console, { - label: 'General Bots Server', + label: 'General Bot Server', level: 'info', prettyPrint: true, colorize: true, @@ -69,7 +69,7 @@ logger.add(winston.transports.Console, { }); logger.add(winston.transports.File, { - label: 'General Bots Server', + label: 'General Bot Server', prettyPrint: true, level: 'info', silent: false,