core: use cordis to manage app lifecycle

This commit is contained in:
undefined committed 2022-09-23 17:52:27 +08:00
1 parent d7ec26b772
commit 5b7067d77d
19 files changed
+307 -375

No files matched your search

+16 -40
View File
@@ -4,21 +4,20 @@ import os from 'os';
import path from 'path';
import cac from 'cac';
import fs from 'fs-extra';
import { Context } from '../context';
import { Logger } from '../logger';
import options from '../options';
import * as bus from '../service/bus';
import db from '../service/db';
import { Runtime } from '../service/module';
import {
addon, handler, lib, locale, model,
script, service, setting, template,
} from './common';
const argv = cac().parse();
const logger = new Logger('worker');
const { loaderDetail: detail, watch } = cac().parse().options;
const tmpdir = path.resolve(os.tmpdir(), 'hydro');
export async function load() {
export async function apply(ctx: Context) {
fs.ensureDirSync(tmpdir);
require('../lib/i18n');
require('../utils');
@@ -26,66 +25,43 @@ export async function load() {
const config = require('../options')();
if (!process.env.CI && !config) {
logger.info('Starting setup');
return require('./setup').load();
await require('./setup').load();
}
const pending = global.addons;
const fail = [];
if (detail) logger.info('start');
await Promise.all([
locale(pending, fail),
template(pending, fail),
]);
if (detail) logger.info('finish: locale/template/static');
const opts = options();
await db.start(opts);
await db.start();
await require('../settings').loadConfig();
if (detail) logger.info('finish: db.connect');
const modelSystem = require('../model/system');
await modelSystem.runConfig();
if (detail) logger.info('finish: config');
const storage = require('../service/storage');
await storage.loadStorageService();
if (detail) logger.info('finish: storage.connect');
await require('hydrooj/src/service/server').apply(ctx);
// Make sure everything is ready and then start main entry
if (argv.options.watch) await ctx.loader.reloadPlugin(ctx, 'hydrooj/src/service/watcher', {});
await ctx.root.start();
require('../lib/index');
if (detail) logger.info('finish: lib.builtin');
await lib(pending, fail);
if (detail) logger.info('finish: lib.extra');
await lib(pending, fail, ctx);
require('../service/monitor');
if (detail) logger.info('finish: monitor');
const server = require('../service/server');
await server.prepare();
if (detail) logger.info('finish: server');
if (watch) require('../service/watcher');
await service(pending, fail);
if (detail) logger.info('finish: service.extra');
await service(pending, fail, ctx);
require('../model/index');
if (detail) logger.info('finish: model.builtin');
const handlerDir = path.resolve(__dirname, '..', 'handler');
const handlers = await fs.readdir(handlerDir);
for (const h of handlers) {
const f = path.resolve(handlerDir, h);
const m = require(f);
if (m.apply) new Runtime(f).load(m);
ctx.loader.reloadPlugin(ctx, path.resolve(handlerDir, h), {}, `hydrooj/handler/${h.split('.')[0]}`);
}
if (detail) logger.info('finish: handler.builtin');
await model(pending, fail);
if (detail) logger.info('finish: model.extra');
await model(pending, fail, ctx);
const modelSetting = require('../model/setting');
await setting(pending, fail, modelSetting);
if (detail) logger.info('finish: setting');
await handler(pending, fail);
await addon(pending, fail);
if (detail) logger.info('finish: handler.extra');
await handler(pending, fail, ctx);
await addon(pending, fail, ctx);
for (const i in global.Hydro.handler) await global.Hydro.handler[i]();
if (detail) logger.info('finish: handler.apply');
require('../script/index');
if (detail) logger.info('finish: script.builtin');
await script(pending, fail);
if (detail) logger.info('finish: script.extra');
await script(pending, fail, ctx);
await bus.serial('app/started');
if (detail) logger.info('finish: bus.serial(start)');
await server.start();
if (detail) logger.info('finish: server.start');
if (process.env.NODE_APP_INSTANCE === '0') {
const scripts = require('../upgrade').default;
let dbVer = (await modelSystem.get('db.ver')) ?? 0;