- FIX: .gbapp files now correctly loaded before other package types so custom models can be used to sync DB.
- NEW: Removed Boot Package feature. Now every .gbot found on deploy folders are deployed on startup.
This commit is contained in:
parent
3bb0b316a9
commit
51d244ce44
5 changed files with 125 additions and 104 deletions
|
@ -70,10 +70,6 @@ export class GBConfigService {
|
||||||
value = undefined;
|
value = undefined;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "BOOT_PACKAGE":
|
|
||||||
value = "none";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "DEFAULT_AI":
|
case "DEFAULT_AI":
|
||||||
value = undefined;
|
value = undefined;
|
||||||
break;
|
break;
|
||||||
|
@ -81,6 +77,7 @@ export class GBConfigService {
|
||||||
case "DATABASE_SYNC":
|
case "DATABASE_SYNC":
|
||||||
value = "false";
|
value = "false";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
logger.trace(
|
logger.trace(
|
||||||
`Guaribas General Error: Invalid key on .env file: '${key}'`
|
`Guaribas General Error: Invalid key on .env file: '${key}'`
|
||||||
|
|
|
@ -103,18 +103,9 @@ export class GBCoreService implements IGBCoreService {
|
||||||
acquire: 40000
|
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) {
|
syncDatabaseStructure(cb) {
|
||||||
logger.trace("Syncing database...");
|
logger.trace("Syncing database...");
|
||||||
this.sequelize.sync().then(value => {
|
this.sequelize.sync().then(value => {
|
||||||
|
|
|
@ -199,7 +199,6 @@ export class GBMinService {
|
||||||
|
|
||||||
botbuilder: (session, next) => {
|
botbuilder: (session, next) => {
|
||||||
|
|
||||||
|
|
||||||
if (!session.privateConversationData.loaded) {
|
if (!session.privateConversationData.loaded) {
|
||||||
setTimeout(
|
setTimeout(
|
||||||
() => {
|
() => {
|
||||||
|
@ -278,7 +277,7 @@ export class GBMinService {
|
||||||
generalPackages.forEach(e => {
|
generalPackages.forEach(e => {
|
||||||
logger.trace(`Loading package: ${e.name}...`);
|
logger.trace(`Loading package: ${e.name}...`);
|
||||||
let p = Object.create(e.prototype) as IGBPackage;
|
let p = Object.create(e.prototype) as IGBPackage;
|
||||||
p.loadBot(min)
|
p.loadBot(min);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Specialized load for each min instance.
|
// Specialized load for each min instance.
|
||||||
|
@ -301,6 +300,7 @@ export class GBMinService {
|
||||||
paths = paths.concat(additionalPath.toLowerCase().split(";"));
|
paths = paths.concat(additionalPath.toLowerCase().split(";"));
|
||||||
}
|
}
|
||||||
let botPackages = new Array<string>();
|
let botPackages = new Array<string>();
|
||||||
|
let gbappPackages = new Array<string>();
|
||||||
let generalPackages = new Array<string>();
|
let generalPackages = new Array<string>();
|
||||||
|
|
||||||
function doIt(path) {
|
function doIt(path) {
|
||||||
|
@ -313,6 +313,9 @@ export class GBMinService {
|
||||||
if (element.endsWith('.gbot')) {
|
if (element.endsWith('.gbot')) {
|
||||||
botPackages.push(element);
|
botPackages.push(element);
|
||||||
}
|
}
|
||||||
|
else if (element.endsWith('.gbapp')) {
|
||||||
|
gbappPackages.push(element);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
generalPackages.push(element);
|
generalPackages.push(element);
|
||||||
}
|
}
|
||||||
|
@ -326,16 +329,54 @@ export class GBMinService {
|
||||||
doIt(e);
|
doIt(e);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/** 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++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
WaitUntil()
|
||||||
|
.interval(1000)
|
||||||
|
.times(5)
|
||||||
|
.condition(function (cb) {
|
||||||
|
logger.trace(`Waiting for app package deployment...`);
|
||||||
|
cb(appPackagesProcessed == gbappPackages.length);
|
||||||
|
})
|
||||||
|
.done(function (result) {
|
||||||
|
logger.trace(`App Package deployment done.`);
|
||||||
|
|
||||||
|
core.syncDatabaseStructure(cb => {
|
||||||
|
|
||||||
/** Deploys all .gbot files first. */
|
/** Deploys all .gbot files first. */
|
||||||
|
|
||||||
botPackages.forEach(e => {
|
botPackages.forEach(e => {
|
||||||
logger.trace(`Deploying bot: ${e}...`);
|
logger.trace(`Deploying bot: ${e}...`);
|
||||||
this.deployer.deployBot(e, (data, err) => {
|
_this.deployer.deployBot(e, (data, err) => {
|
||||||
botPackages.length++;
|
|
||||||
logger.trace(`Bot: ${e} deployed...`);
|
logger.trace(`Bot: ${e} deployed...`);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// TODO: Wait here.
|
||||||
|
|
||||||
/** Then all remaining generalPackages are loaded. */
|
/** Then all remaining generalPackages are loaded. */
|
||||||
|
|
||||||
generalPackages.forEach(filename => {
|
generalPackages.forEach(filename => {
|
||||||
|
@ -347,16 +388,6 @@ export class GBMinService {
|
||||||
|
|
||||||
if (Path.extname(filename) === ".gbapp" || Path.extname(filename) === ".gblib") {
|
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. */
|
/** Themes for bots. */
|
||||||
|
|
||||||
|
@ -393,22 +424,22 @@ export class GBMinService {
|
||||||
.times(5)
|
.times(5)
|
||||||
.condition(function (cb) {
|
.condition(function (cb) {
|
||||||
logger.trace(`Waiting for package deployment...`);
|
logger.trace(`Waiting for package deployment...`);
|
||||||
cb(totalPackages == (generalPackages.length + botPackages.length));
|
cb(totalPackages == (generalPackages.length));
|
||||||
})
|
})
|
||||||
.done(function (result) {
|
.done(function (result) {
|
||||||
if (botPackages.length === 0){
|
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.`);
|
logger.info(`The bot server is running empty: No bot instances have been found, at least one .gbot file must be deployed.`);
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
logger.trace(`Package deployment done.`);
|
logger.trace(`Package deployment done.`);
|
||||||
}
|
}
|
||||||
resolve();
|
resolve();
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
reject(err)
|
reject(err)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
10
src/app.ts
10
src/app.ts
|
@ -67,15 +67,14 @@ export class GBServer {
|
||||||
// the Marketplace until GB get serverless.
|
// the Marketplace until GB get serverless.
|
||||||
|
|
||||||
let port = process.env.port || process.env.PORT || 4242;
|
let port = process.env.port || process.env.PORT || 4242;
|
||||||
logger.info(`Starting GeneralBots HTTP server...`);
|
logger.info(`Starting HTTP BotServer...`);
|
||||||
let server = express();
|
let server = express();
|
||||||
|
|
||||||
server.listen(port, () => {
|
server.listen(port, () => {
|
||||||
|
|
||||||
logger.info(`General Bots Server - RUNNING on ${port}...`);
|
logger.info(`General Bot - RUNNING on ${port}...`);
|
||||||
logger.info(`Starting instances...`);
|
logger.info(`Starting instances...`);
|
||||||
|
|
||||||
|
|
||||||
// Reads basic configuration, initialize minimal services.
|
// Reads basic configuration, initialize minimal services.
|
||||||
|
|
||||||
GBConfigService.init();
|
GBConfigService.init();
|
||||||
|
@ -93,7 +92,8 @@ export class GBServer {
|
||||||
|
|
||||||
let sysPackages = new Array<IGBPackage>();
|
let sysPackages = new Array<IGBPackage>();
|
||||||
|
|
||||||
[GBAdminPackage, GBAnalyticsPackage, GBCorePackage, GBSecurityPackage, GBKBPackage, GBCustomerSatisfactionPackage].forEach(e => {
|
[GBAdminPackage, GBAnalyticsPackage, GBCorePackage, GBSecurityPackage,
|
||||||
|
GBKBPackage, GBCustomerSatisfactionPackage].forEach(e => {
|
||||||
logger.trace(`Loading sys package: ${e.name}...`);
|
logger.trace(`Loading sys package: ${e.name}...`);
|
||||||
let p = Object.create(e.prototype) as IGBPackage;
|
let p = Object.create(e.prototype) as IGBPackage;
|
||||||
p.loadPackage(core, core.sequelize);
|
p.loadPackage(core, core.sequelize);
|
||||||
|
@ -104,10 +104,12 @@ export class GBServer {
|
||||||
try {
|
try {
|
||||||
let appPackages = new Array<IGBPackage>();
|
let appPackages = new Array<IGBPackage>();
|
||||||
await minService.deployPackages(core, server, appPackages, sysPackages);
|
await minService.deployPackages(core, server, appPackages, sysPackages);
|
||||||
|
|
||||||
minService.buildMin(instance => {
|
minService.buildMin(instance => {
|
||||||
logger.info(`Instance loaded: ${instance.botId}...`);
|
logger.info(`Instance loaded: ${instance.botId}...`);
|
||||||
}, server, appPackages);
|
}, server, appPackages);
|
||||||
|
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.log(err)
|
logger.log(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ var logger = new (winston.Logger)({
|
||||||
});
|
});
|
||||||
|
|
||||||
logger.add(winston.transports.Console, {
|
logger.add(winston.transports.Console, {
|
||||||
label: 'General Bots Server',
|
label: 'General Bot Server',
|
||||||
level: 'info',
|
level: 'info',
|
||||||
prettyPrint: true,
|
prettyPrint: true,
|
||||||
colorize: true,
|
colorize: true,
|
||||||
|
@ -69,7 +69,7 @@ logger.add(winston.transports.Console, {
|
||||||
});
|
});
|
||||||
|
|
||||||
logger.add(winston.transports.File, {
|
logger.add(winston.transports.File, {
|
||||||
label: 'General Bots Server',
|
label: 'General Bot Server',
|
||||||
prettyPrint: true,
|
prettyPrint: true,
|
||||||
level: 'info',
|
level: 'info',
|
||||||
silent: false,
|
silent: false,
|
||||||
|
|
Loading…
Add table
Reference in a new issue