From 0b03b17fc80f5985c8c235524a27ab682255d20b Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 16 Mar 2025 23:28:05 +0800 Subject: [PATCH] bug fixes --- framework/framework/server.ts | 25 +++++++++++++------------ packages/elastic/index.ts | 4 ++-- packages/hydrooj/src/entry/cli.ts | 4 +--- packages/hydrooj/src/entry/worker.ts | 3 ++- packages/hydrooj/src/handler/contest.ts | 1 - packages/utils/lib/utils.ts | 1 + 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/framework/framework/server.ts b/framework/framework/server.ts index 74845bf18..88f883c9b 100644 --- a/framework/framework/server.ts +++ b/framework/framework/server.ts @@ -437,7 +437,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); ...this.handlerLayers, { name: '404', - func: (t) => this.handleHttp(t, NotFoundHandler, () => true), + func: (t) => this.handleHttp(t, NotFoundHandler, () => true, this.ctx), }, ])); this.addLayer('base', base(logger, this.config.xff, this.config.xhost)); @@ -471,10 +471,10 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); }); } - private async handleHttp(ctx: KoaContext, HandlerClass, checker) { + private async handleHttp(ctx: KoaContext, HandlerClass, checker, savedContext) { const { args } = ctx.HydroContext; Object.assign(args, ctx.params); - const h = new HandlerClass(ctx, this.ctx); + const h = new HandlerClass(ctx, savedContext); ctx.handler = h; const method = ctx.method.toLowerCase(); const name = ((Object.hasOwn(HandlerClass, kHandler) && typeof HandlerClass[kHandler] === 'string') @@ -550,9 +550,9 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); } } - private async handleWS(ctx: KoaContext, HandlerClass, checker, conn?, layer?) { + private async handleWS(ctx: KoaContext, HandlerClass, checker, conn?, layer?, savedContext?) { const { args } = ctx.HydroContext; - const h = new HandlerClass(ctx, this.ctx); + const h = new HandlerClass(ctx, savedContext); // FIXME: should pass type check await (this.ctx.parallel as any)('connection/create', h); const stream = new PassThrough(); @@ -695,18 +695,19 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); }; }; - // if (name === 'ContestScoreboard') { - // console.log('-------------', this.ctx, this.ctx.scoreboard); - // } - + // We hope to use parent context for handler (the context that calls register) + // So that handler can use services injected before calling register + const savedContext = Object.hasOwn(this.ctx, Symbol.for('cordis.shadow')) + ? Object.getPrototypeOf(this.ctx) + : this.ctx; if (type === 'route') { - router.all(routeName, path, (ctx) => this.handleHttp(ctx as any, HandlerClass, Checker(permPrivChecker))); + router.all(routeName, path, (ctx) => this.handleHttp(ctx as any, HandlerClass, Checker(permPrivChecker), savedContext)); } else { const checker = Checker(permPrivChecker); const layer = router.ws(path, async (conn, _req, ctx) => { - await this.handleWS(ctx as any, HandlerClass, checker, conn, layer); + await this.handleWS(ctx as any, HandlerClass, checker, conn, layer, savedContext); }); - router.get(path, (ctx) => this.handleWS(ctx as any, HandlerClass, checker, null, null)); + router.get(path, (ctx) => this.handleWS(ctx as any, HandlerClass, checker, null, null, savedContext)); } const dispose = router.disposeLastOp; // @ts-ignore diff --git a/packages/elastic/index.ts b/packages/elastic/index.ts index 82f27de29..5c3f64f9d 100644 --- a/packages/elastic/index.ts +++ b/packages/elastic/index.ts @@ -119,8 +119,8 @@ export default class ElasticSearchService extends Service { Schema.object({ domainId: Schema.string(), }), - this.run, + this.run.bind(this), ); - this.ctx.provideModule('problemSearch', 'elastic', this.problemSearch); + this.ctx.provideModule('problemSearch', 'elastic', this.problemSearch.bind(this)); } } diff --git a/packages/hydrooj/src/entry/cli.ts b/packages/hydrooj/src/entry/cli.ts index 8bf49a81f..ed605d181 100644 --- a/packages/hydrooj/src/entry/cli.ts +++ b/packages/hydrooj/src/entry/cli.ts @@ -10,7 +10,7 @@ import { load as loadOptions } from '../options'; import { MongoService } from '../service/db'; import { ConfigService } from '../settings'; import { - addon, builtinModel, lib, model, script, service, setting, + addon, builtinModel, model, service, setting, } from './common'; const argv = cac().parse(); @@ -122,7 +122,6 @@ export async function load(ctx: Context) { await ctx.loader.reloadPlugin(require.resolve('../service/storage'), 'file'); require('../lib/index'); await Promise.all([ - lib(pending, fail, ctx), service(pending, fail, ctx), ]); ctx.plugin(require('../service/worker')); @@ -140,6 +139,5 @@ export async function load(ctx: Context) { for (const h of await fs.readdir(scriptDir)) { ctx.loader.reloadPlugin(path.resolve(scriptDir, h), ''); } - await script(pending, fail, ctx); await cli(); } diff --git a/packages/hydrooj/src/entry/worker.ts b/packages/hydrooj/src/entry/worker.ts index c05e67a88..fedb1c7d2 100644 --- a/packages/hydrooj/src/entry/worker.ts +++ b/packages/hydrooj/src/entry/worker.ts @@ -10,7 +10,7 @@ import { load } from '../options'; import { MongoService } from '../service/db'; import { ConfigService } from '../settings'; import { - addon, builtinModel, locale, model, service, + addon, builtinModel, locale, model, service, setting, } from './common'; const argv = cac().parse(); @@ -58,6 +58,7 @@ export async function apply(ctx: Context) { await service(pending, fail, ctx); await builtinModel(ctx); await model(pending, fail, ctx); + await setting(pending, fail, require('../model/setting')); const handlerDir = path.resolve(__dirname, '..', 'handler'); const handlers = await fs.readdir(handlerDir); diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 0ab444a34..fa2c13220 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -676,7 +676,6 @@ class ScoreboardService extends Service { views: Record> = {}; constructor(ctx: Context) { super(ctx, 'scoreboard'); - ctx.set('scoreboard', this); } addView }>( diff --git a/packages/utils/lib/utils.ts b/packages/utils/lib/utils.ts index 84338a1bc..01a5b2c03 100644 --- a/packages/utils/lib/utils.ts +++ b/packages/utils/lib/utils.ts @@ -24,6 +24,7 @@ factory.addExporter(new Exporter.Console({ }, timestamp: Date.now(), })); +factory.exporters.get(1).levels = { default: process.env.DEV ? 3 : 2 }; function createLogger(name: string) { return factory.createLogger(name);