diff --git a/electron/src/electron.ts b/electron/src/electron.ts index fcd17aca0..3b005c0b2 100644 --- a/electron/src/electron.ts +++ b/electron/src/electron.ts @@ -77,5 +77,10 @@ process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true"; */ electron.app.requestSingleInstanceLock(); -const app = startTrilium(); +const app = startTrilium({ + setupCompleteCallback: () => { + windowService.createMainWindow(electron.app); + windowService.closeSetupWindow(); + } +}); electronRouting(app); \ No newline at end of file diff --git a/server/src/app.ts b/server/src/app.ts index 12b7a2b1b..0300d3e06 100644 --- a/server/src/app.ts +++ b/server/src/app.ts @@ -6,8 +6,9 @@ import helmet = require('helmet'); import compression = require('compression'); import sessionParser = require('./routes/session_parser'); import utils = require('./services/utils'); +import { RouteConfig } from './routes/types'; -function buildApp() { +function buildApp(routeConfig: RouteConfig) { require('./services/handlers'); require('./becca/becca_loader'); @@ -39,7 +40,7 @@ function buildApp() { app.use(favicon(`${__dirname}/../../common/images/app-icons/win/icon.ico`)); require('./routes/assets').register(app); - require('./routes/routes').register(app); + require('./routes/routes').register(app, routeConfig); require('./routes/custom').register(app); require('./routes/error_handlers').register(app); diff --git a/server/src/index.ts b/server/src/index.ts index 8b78f3e0f..f3d30879c 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -1,3 +1,7 @@ import startTrilium = require("./www"); -startTrilium(); \ No newline at end of file +startTrilium({ + setupCompleteCallback: (res) => { + res.redirect('.'); + } +}); \ No newline at end of file diff --git a/server/src/routes/routes.ts b/server/src/routes/routes.ts index 55cad4cd5..8e9577799 100644 --- a/server/src/routes/routes.ts +++ b/server/src/routes/routes.ts @@ -71,6 +71,7 @@ import etapiSpecialNoteRoutes = require('../etapi/special_notes'); import etapiSpecRoute = require('../etapi/spec'); import etapiBackupRoute = require('../etapi/backup'); import { AppRequest, AppRequestHandler } from './route-interface'; +import { RouteConfig } from './types'; const csrfMiddleware = csurf({ cookie: { @@ -101,7 +102,7 @@ const uploadMiddlewareWithErrorHandling = function (req: express.Request, res: e }); }; -function register(app: express.Application) { +function register(app: express.Application, config: RouteConfig) { route(GET, '/', [auth.checkAuth, csrfMiddleware], indexRoute.index); route(GET, '/login', [auth.checkAppInitialized, auth.checkPasswordSet], loginRoute.loginPage); route(GET, '/set-password', [auth.checkAppInitialized, auth.checkPasswordNotSet], loginRoute.setPasswordPage); @@ -115,7 +116,7 @@ function register(app: express.Application) { route(PST, '/login', [loginRateLimiter], loginRoute.login); route(PST, '/logout', [csrfMiddleware, auth.checkAuth], loginRoute.logout); route(PST, '/set-password', [auth.checkAppInitialized, auth.checkPasswordNotSet], loginRoute.setPassword); - route(GET, '/setup', [], setupRoute.setupPage); + route(GET, '/setup', [], setupRoute.buildSetupRoute(config.setupCompleteCallback)); apiRoute(GET, '/api/tree', treeApiRoute.getTree); apiRoute(PST, '/api/tree/load', treeApiRoute.load); diff --git a/server/src/routes/setup.ts b/server/src/routes/setup.ts index 1d3521f4a..66b2c975a 100644 --- a/server/src/routes/setup.ts +++ b/server/src/routes/setup.ts @@ -2,42 +2,35 @@ import sqlInit = require('../services/sql_init'); import setupService = require('../services/setup'); -import utils = require('../services/utils'); import assetPath = require('../services/asset_path'); import appPath = require('../services/app_path'); import { Request, Response } from 'express'; +import { SetupCompleteCallback } from './types'; -function setupPage(req: Request, res: Response) { - if (sqlInit.isDbInitialized()) { - if (utils.isElectron()) { - const windowService = require('../services/window'); - const { app } = require('electron'); - windowService.createMainWindow(app); - windowService.closeSetupWindow(); +function buildSetupRoute(setupCompleteCallback: SetupCompleteCallback) { + return (req: Request, res: Response) => { + if (sqlInit.isDbInitialized()) { + setupCompleteCallback(res); + return; } - else { - res.redirect('.'); + + // we got here because DB is not completely initialized, so if schema exists, + // it means we're in "sync in progress" state. + const syncInProgress = sqlInit.schemaExists(); + + if (syncInProgress) { + // trigger sync if it's not already running + setupService.triggerSync(); } - - return; + + res.render('setup', { + syncInProgress: syncInProgress, + assetPath: assetPath, + appPath: appPath + }); } - - // we got here because DB is not completely initialized, so if schema exists, - // it means we're in "sync in progress" state. - const syncInProgress = sqlInit.schemaExists(); - - if (syncInProgress) { - // trigger sync if it's not already running - setupService.triggerSync(); - } - - res.render('setup', { - syncInProgress: syncInProgress, - assetPath: assetPath, - appPath: appPath - }); } export = { - setupPage + buildSetupRoute }; diff --git a/server/src/routes/types.ts b/server/src/routes/types.ts new file mode 100644 index 000000000..898404249 --- /dev/null +++ b/server/src/routes/types.ts @@ -0,0 +1,8 @@ +import { Response } from "express"; + +export type SetupCompleteCallback = (res: Response) => void; + +export interface RouteConfig { + /** Callback to be invoked when first setup is complete. */ + setupCompleteCallback: SetupCompleteCallback; +} \ No newline at end of file diff --git a/server/src/www.ts b/server/src/www.ts index b4eace40d..8a3e266fa 100644 --- a/server/src/www.ts +++ b/server/src/www.ts @@ -31,8 +31,9 @@ import port = require('./services/port'); import host = require('./services/host'); import semver = require('semver'); import type { Express } from "express"; +import { RouteConfig } from './routes/types'; -function startTrilium() { +function startTrilium(routeConfig: RouteConfig) { if (!semver.satisfies(process.version, ">=10.5.0")) { console.error("Trilium only supports node.js 10.5 and later"); process.exit(1); @@ -40,7 +41,7 @@ function startTrilium() { log.info(JSON.stringify(appInfo, null, 2)); - const app = buildApp(); + const app = buildApp(routeConfig); const cpuInfos = require('os').cpus(); if (cpuInfos && cpuInfos[0] !== undefined) { // https://github.com/zadam/trilium/pull/3957