diff --git a/.vscode/launch.json b/.vscode/launch.json index 9e89f4a86..9e3fe8b90 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,10 +9,13 @@ "program": "${workspaceRoot}/boot.mjs", "cwd": "${workspaceRoot}", "env": { - "NODE_ENV": "development" + "NODE_ENV": "development", + "NODE_NO_WARNINGS":"1" }, "args": [ - "--no-deprecation" + "--no-deprecation", + "--loader ts-node/esm", + "--require ${workspaceRoot}/suppress-node-warnings.cjs", ], "skipFiles": [ "node_modules/**/*.js" diff --git a/boot.mjs b/boot.mjs index b159a36a7..b6c54175d 100644 --- a/boot.mjs +++ b/boot.mjs @@ -3,63 +3,60 @@ import Fs from 'fs'; import Path from 'path'; import { exec } from 'child_process'; -import pjson from './package.json' assert { type: "json" }; -import * as GBServer from "./dist/src/app.js"; +import pjson from './package.json' assert { type: 'json' }; // Displays version of Node JS being used at runtime and others attributes. -console.log(`[GB Runtime] BotServer = v${pjson.version}`); -console.log(`[GB Runtime] BotLib = v${pjson.dependencies.botlib}`); -console.log(`[GB Runtime] BotBuilder (MS) = v${pjson.dependencies.botbuilder}`); -console.log(`[GB Runtime] NodeJS = ${process.version}`); -console.log(`[GB Runtime] platform = ${process.platform}`); -console.log(`[GB Runtime] architecture = ${process.arch}`); -console.log(`[GB Runtime] argv = ${process.argv}`); -console.log(`[GB Runtime] debugPort = ${process.debugPort}`); +console.log(``); +console.log(``); +console.log(``); +console.log(` ██████ ███████ ███ ██ ███████ ██████ █████ ██ ██████ ██████ ████████ ███████ ®`); +console.log(`██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ `); +console.log(`██ ███ █████ ██ ██ ██ █████ ██████ ███████ ██ ██████ ██ ██ ██ ███████ `); +console.log(`██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ `); +console.log(` ██████ ███████ ██ ████ ███████ ██ ██ ██ ██ ███████ ██████ ██████ ██ ███████ 3.0`); +console.log(``); +console.log(`botserver@${pjson.version}, botlib@${pjson.dependencies.botlib}, botbuilder@${pjson.dependencies.botbuilder}, nodeJS: ${process.version}, platform: ${process.platform}, architecture: ${process.arch}.`); +console.log(``); +console.log(``); var now = () => { - return (new Date()).toISOString().replace(/T/, ' ').replace(/\..+/, '') + ' UTC'; -} + return new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '') + ' UTC'; +}; var __dirname = process.env.PWD; try { - - var run = () => { - - console.log(`[GB Runtime] Initializing General Bots (BotServer)...`); - console.log(`[GB Runtime] ${now()} - Running on '${import.meta.url}'`); - GBServer.GBServer.run(); - } - var processDist = () => { - if (!Fs.existsSync('dist')) { - console.log(`${now()} - Compiling...`); - exec(Path.join(__dirname, 'node_modules/.bin/tsc'), (err, stdout, stderr) => { - if (err) { - console.error(err); - return; - } - run(); - }); + var run = () => { + import('./dist/src/app.js').then((gb)=> gb.GBServer.run()); + }; + var processDist = () => { + if (!Fs.existsSync('dist')) { + console.log(`${now()} - Compiling...`); + exec(Path.join(__dirname, 'node_modules/.bin/tsc'), (err, stdout, stderr) => { + if (err) { + console.error(err); + return; } - else { - run(); - } - }; - - // Installing modules if it has not been done yet. - - if (!Fs.existsSync('node_modules')) { - console.log(`${now()} - Installing modules for the first time, please wait...`); - exec('npm install', (err, stdout, stderr) => { - if (err) { - console.error(err); - return; - } - processDist(); - }); - } - else { - processDist(); + run(); + }); + } else { + run(); } + }; + + // Installing modules if it has not been done yet. + + if (!Fs.existsSync('node_modules')) { + console.log(`${now()} - Installing modules for the first time, please wait...`); + exec('npm install', (err, stdout, stderr) => { + if (err) { + console.error(err); + return; + } + processDist(); + }); + } else { + processDist(); + } } catch (e) { - console.log(e); + console.log(e); } diff --git a/gbot.sh b/gbot.sh index 5dc1e7ea8..54a4157f3 100755 --- a/gbot.sh +++ b/gbot.sh @@ -1,5 +1,2 @@ -echo General Bots -echo Installing modules for the first time... - -npm i -node . +echo Starting General Bots... +node boot.mjs --no-warnings diff --git a/package.json b/package.json index da2f6c4ba..12e412ee7 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "build-gbui": "cd packages/default.gbui && echo SKIP_PREFLIGHT_CHECK=true >.env && npm install && npm run build", "build-docs": "typedoc --options typedoc.json src/", "test": "node test.js", - "start": "node ./boot.cjs", + "start": "NODE_NO_WARNINGS=1 node ./boot.mjs --loader ts-node/esm --require ./suppress-node-warnings.cjs ", "reverse-proxy": "node_modules/.bin/ngrok http 4242", "watch:build": "tsc --watch", "posttypedoc": "shx cp .nojekyll docs/reference/.nojekyll", diff --git a/packages/core.gbapp/services/GBMinService.ts b/packages/core.gbapp/services/GBMinService.ts index 4c513b50b..87b2074f8 100644 --- a/packages/core.gbapp/services/GBMinService.ts +++ b/packages/core.gbapp/services/GBMinService.ts @@ -144,7 +144,7 @@ export class GBMinService { if (process.env.DISABLE_WEB !== 'true') { // SSR processing and default.gbui access definition. - GBServer.globals.server.get('/', async (req, res, next)=> { + GBServer.globals.server.get('/', async (req, res, next) => { await GBSSR.ssrFilter(req, res, next); }); @@ -225,11 +225,43 @@ export class GBMinService { const url = `/api/messages/${botId}`; removeRoute(GBServer.globals.server, url); - const uiUrl = `/${botId}`; removeRoute(GBServer.globals.server, uiUrl); GBServer.globals.minInstances = GBServer.globals.minInstances.filter(p => p.instance.botId !== botId); + } + + /** + * Mount the bot web site (default.gbui) secure domain. + */ + public async loadDomain(min: GBMinInstance) { + // TODO: https://github.com/GeneralBots/BotServer/issues/321 + const options = { + passphrase: process.env.CERTIFICATE2_PASSPHRASE, + pfx: Fs.readFileSync(process.env.CERTIFICATE2_PFX) + }; + + const domain = min.core.getParam(min.instance, 'Domain', null); + if (domain) { + GBServer.globals.server.get(domain, async (req, res, next) => { + await GBSSR.ssrFilter(req, res, next); + }); + GBLog.verbose(`Bot UI ${GBMinService.uiPackage} accessible at custom domain: ${domain}.`); + } + + + GBServer.globals.httpsServer.addContext(process.env.CERTIFICATE2_DOMAIN, options); + } + + /** + * Unmounts the bot web site (default.gbui) secure domain, if any. + */ + public async unloadDomain(instance: IGBInstance) { + + + + + } /** @@ -364,23 +396,15 @@ export class GBMinService { if (process.env.DISABLE_WEB !== 'true') { const uiUrl = `/${instance.botId}`; - - GBServer.globals.server.get(uiUrl, async (req, res, next)=> { + + GBServer.globals.server.get(uiUrl, async (req, res, next) => { await GBSSR.ssrFilter(req, res, next); }); const uiUrlAlt = `/${instance.activationCode}`; - GBServer.globals.server.get(uiUrlAlt, async (req, res, next)=> { + GBServer.globals.server.get(uiUrlAlt, async (req, res, next) => { await GBSSR.ssrFilter(req, res, next); }); - - const domain = min.core.getParam(min.instance, 'Domain', null); - if (domain) { - GBServer.globals.server.get(domain, async (req, res, next)=> { - await GBSSR.ssrFilter(req, res, next); - }); - GBLog.verbose(`Bot UI ${GBMinService.uiPackage} accessible at custom domain: ${domain}.`); - } GBLog.verbose(`Bot UI ${GBMinService.uiPackage} accessible at: ${uiUrl} and ${uiUrlAlt}.`); } @@ -879,7 +903,6 @@ export class GBMinService { data: data.slice(0, 10) }); } - } // Required for MSTEAMS handling of persisted conversations. @@ -918,7 +941,7 @@ export class GBMinService { if (startDialog) { await sec.setParam(userId, 'welcomed', 'true'); GBLog.info(`Auto start (teams) dialog is now being called: ${startDialog} for ${min.instance.botId}...`); - await GBVMService.callVM(startDialog.toLowerCase(), min, step, user, this.deployer, false); + await GBVMService.callVM(startDialog.toLowerCase(), min, step, user, this.deployer, false); } } } @@ -994,7 +1017,6 @@ export class GBMinService { await this.processEventActivity(min, user, context, step); } - } catch (error) { const msg = `ERROR: ${error.message} ${error.stack ? error.stack : ''}`; GBLog.error(msg); @@ -1120,7 +1142,7 @@ export class GBMinService { const member = context.activity.from; let user = await sec.ensureUser(min.instance.instanceId, member.id, member.name, '', 'web', member.name, null); - + const userId = user.userId; const params = user.params ? JSON.parse(user.params) : {}; @@ -1137,7 +1159,6 @@ export class GBMinService { user.conversationId = conversation.Id; } - message = await analytics.createMessage( min.instance.instanceId, user.conversationId, @@ -1206,7 +1227,7 @@ export class GBMinService { await min.conversationalService.sendEvent(min, step, 'loadInstance', {}); } else if (cmdOrDialogName === '/call') { - await GBVMService.callVM(args, min, step, user, this.deployer, false); + await GBVMService.callVM(args, min, step, user, this.deployer, false); } else if (cmdOrDialogName === '/callsch') { await GBVMService.callVM(args, min, null, null, null, false); } else if (cmdOrDialogName === '/calldbg') { diff --git a/packages/core.gbapp/services/GBSSR.ts b/packages/core.gbapp/services/GBSSR.ts index 5e33cfc99..cd12c242a 100644 --- a/packages/core.gbapp/services/GBSSR.ts +++ b/packages/core.gbapp/services/GBSSR.ts @@ -36,6 +36,9 @@ 'use strict'; +import { createRequire } from 'module'; +const require = createRequire(import.meta.url); + import Path from 'path'; import Fs from 'fs'; import { NextFunction, Request, Response } from 'express'; @@ -43,11 +46,9 @@ import urljoin from 'url-join'; import { GBMinInstance } from 'botlib'; import { GBServer } from '../../../src/app.js'; import { GBLogEx } from './GBLogEx.js'; -import { createRequire } from 'module'; import urlJoin from 'url-join'; import { GBDeployer } from './GBDeployer.js'; import { GBMinService } from './GBMinService.js'; -const require = createRequire(import.meta.url); const puppeteer = require('puppeteer-extra'); const hidden = require('puppeteer-extra-plugin-stealth'); const { executablePath } = require('puppeteer'); diff --git a/suppress-node-warnings.cjs b/suppress-node-warnings.cjs new file mode 100644 index 000000000..080629da7 --- /dev/null +++ b/suppress-node-warnings.cjs @@ -0,0 +1,11 @@ +// inspired by +// https://github.com/nodejs/node/issues/30810#issuecomment-1383184769 +const { emit: originalEmit } = process; + +function suppresser(event, error) { + return event === 'warning' && error.name === 'ExperimentalWarning' + ? false + : originalEmit.apply(process, arguments); +} + +process.emit = suppresser; \ No newline at end of file