core: fix types

This commit is contained in:
undefined committed 2022-10-04 01:38:51 +08:00
1 parent d27a1499d2
commit 1c3dc161b6
13 files changed
+48 -62

No files matched your search

-7
View File
@@ -1,7 +0,0 @@
## Changes for hydrooj@3:
- 重构了 server 结构:
- - 移除了 `Handler.init` `Handler.finish` 方法。
- - 移除了 `handler/finish` 钩子。
- - 移除了 `requireCsrfToken` 。
- - 移除了 `sockjs`,转为使用原生 `WebSocket` 。
+1 -1
View File
@@ -21,7 +21,7 @@ function provideModule<T extends keyof ModuleInterfaces>(type: T, id: string, mo
}
export interface Context {
[Context.events]: Events<this>;
[Context.events]: Events<Context>;
loader: Loader;
Route: typeof import('./service/server').Route;
Connection: typeof import('./service/server').Connection;
+2 -1
View File
@@ -31,7 +31,8 @@ function locateFile(basePath: string, filenames: string[]) {
return null;
}
const getLoader = (type: string, filename: string) => async function loader(pending: string[], fail: string[], ctx: Context) {
type LoadTask = 'handler' | 'model' | 'addon' | 'lib' | 'script' | 'service';
const getLoader = (type: LoadTask, filename: string) => async function loader(pending: string[], fail: string[], ctx: Context) {
for (const i of pending) {
const p = locateFile(i, [`${filename}.ts`, `${filename}.js`]);
if (p && !fail.includes(i)) {
-1
View File
@@ -851,7 +851,6 @@ export class ProblemSolutionHandler extends ProblemDetailHandler {
this.response.body = {
psdocs, page, pcount, pscount, udict, pssdict, pdoc: this.pdoc, sid,
};
await bus.parallel('handler/solution/get', this);
}
@param('content', Types.Content)
-3
View File
@@ -1,7 +1,6 @@
import { omit } from 'lodash';
import { FilterQuery, ObjectID } from 'mongodb';
import { BlogDoc } from '../interface';
import * as bus from '../service/bus';
import { NumberKeys } from '../typeutils';
import * as document from './document';
@@ -18,13 +17,11 @@ export async function add(
updateAt: new Date(),
views: 0,
};
await bus.parallel('blog/before-add', payload);
const res = await document.add(
'system', payload.content!, payload.owner!, document.TYPE_BLOG,
null, null, null, omit(payload, ['domainId', 'content', 'owner']),
);
payload.docId = res;
await bus.emit('blog/add', payload);
return payload.docId;
}
+2 -2
View File
@@ -291,7 +291,7 @@ async function updateSort() {
}
}
export async function apply(ctx: Context) {
export function apply(ctx: Context) {
ctx.using(['worker'], async ({ worker }) => {
worker.addHandler('discussion.sort', updateSort);
if (!await TaskModel.count({ type: 'schedule', subType: 'discussion.sort' })) {
@@ -305,7 +305,7 @@ export async function apply(ctx: Context) {
});
}
global.Hydro.model.DiscussionModel = {
global.Hydro.model.discussion = {
typeDisplay,
PROJECTION_LIST,
PROJECTION_PUBLIC,
+15 -14
View File
@@ -2,15 +2,15 @@
import { omit, sum } from 'lodash';
import moment from 'moment-timezone';
import {
Collection, FilterQuery, MatchKeysAndValues,
FilterQuery, MatchKeysAndValues,
ObjectID, OnlyFieldsOfType, PushOperator,
UpdateQuery,
} from 'mongodb';
import { Context } from '../context';
import { ProblemNotFoundError } from '../error';
import {
FileInfo, JudgeMeta, JudgeRequest, ProblemConfigFile, RecordDoc,
} from '../interface';
import * as bus from '../service/bus';
import db from '../service/db';
import { MaybeArray, NumberKeys } from '../typeutils';
import { ArgMethod, buildProjection, Time } from '../utils';
@@ -18,8 +18,8 @@ import { STATUS } from './builtin';
import problem from './problem';
import task from './task';
class RecordModel {
static coll: Collection<RecordDoc> = db.collection('record');
export default class RecordModel {
static coll = db.collection('record');
static PROJECTION_LIST: (keyof RecordDoc)[] = [
'_id', 'score', 'time', 'memory', 'lang',
'uid', 'pid', 'rejudged', 'progress', 'domainId',
@@ -230,15 +230,16 @@ class RecordModel {
}
}
// Mark problem as deleted
bus.on('problem/delete', (domainId, docId) => RecordModel.coll.updateMany({ domainId, pid: docId }, { $set: { pid: -1 } }));
bus.on('domain/delete', (domainId) => RecordModel.coll.deleteMany({ domainId }));
bus.on('ready', () => db.ensureIndexes(
RecordModel.coll,
{ key: { domainId: 1, contest: 1, _id: -1 }, name: 'basic' },
{ key: { domainId: 1, contest: 1, uid: 1, _id: -1 }, name: 'withUser' },
{ key: { domainId: 1, contest: 1, pid: 1, _id: -1 }, name: 'withProblem' },
));
export function apply(ctx: Context) {
// Mark problem as deleted
ctx.on('problem/delete', (domainId, docId) => RecordModel.coll.updateMany({ domainId, pid: docId }, { $set: { pid: -1 } }));
ctx.on('domain/delete', (domainId) => RecordModel.coll.deleteMany({ domainId }));
ctx.on('ready', () => db.ensureIndexes(
RecordModel.coll,
{ key: { domainId: 1, contest: 1, _id: -1 }, name: 'basic' },
{ key: { domainId: 1, contest: 1, uid: 1, _id: -1 }, name: 'withUser' },
{ key: { domainId: 1, contest: 1, pid: 1, _id: -1 }, name: 'withProblem' },
));
}
export default RecordModel;
global.Hydro.model.record = RecordModel;
+1 -1
View File
@@ -187,7 +187,7 @@ export async function apply(ctx: Context) {
const handleEvent = async (doc: EventDoc) => {
const payload = JSON.parse(doc.payload);
if (process.send) process.send({ type: 'hydro:broadcast', data: { event: doc.event, payload } });
await bus.parallel(doc.event, ...payload);
await (bus.parallel as any)(doc.event, ...payload);
};
stream.on('change', async (change) => {
if (change.operationType !== 'insert') return;
+22 -25
View File
@@ -12,22 +12,26 @@ import type {
Tdoc, TrainingDoc, User,
} from '../interface';
import type { DocType } from '../model/document';
import type { Handler } from './server';
import type { ConnectionHandler, Handler } from './server';
export type Disposable = () => void;
export type VoidReturn = Promise<any> | any;
type HookType = 'before-prepare' | 'before' | 'after' | 'finish';
type ModuleCategories = 'lib' | 'locale' | 'template' | 'script' | 'model' | 'setting' | 'handler' | 'service' | 'addon';
type LifecycleEvents = Record<`app/load/${ModuleCategories}`, () => VoidReturn>;
type MapHandlerEvents<N extends string, H extends Handler> = Record<`handler/${HookType}/${N}`, (thisArg: H) => VoidReturn>;
type KnownHandlerEvents =
MapHandlerEvents<'UserRegister', UserRegisterHandler>
& MapHandlerEvents<'ProblemSolution', ProblemSolutionHandler>;
type HandlerEvents =
KnownHandlerEvents
& Record<`handler/${HookType}/${string}`, (thisArg: Handler & Record<string, any>) => VoidReturn>
& Record<`handler/${HookType}`, (thisArg: Handler) => VoidReturn>
& Record<`connection/${'create' | 'active' | 'close'}`, (thisArg: ConnectionHandler) => VoidReturn>;
/* eslint-disable @typescript-eslint/naming-convention */
export interface EventMap {
export interface EventMap extends LifecycleEvents, HandlerEvents {
'app/started': () => void
'app/load/lib': () => VoidReturn
'app/load/locale': () => VoidReturn
'app/load/template': () => VoidReturn
'app/load/script': () => VoidReturn
'app/load/setting': () => VoidReturn
'app/load/model': () => VoidReturn
'app/load/handler': () => VoidReturn
'app/load/service': () => VoidReturn
'app/ready': () => VoidReturn
'app/exit': () => VoidReturn
@@ -59,16 +63,7 @@ export interface EventMap {
'handler/create': (thisArg: Handler) => VoidReturn
'handler/init': (thisArg: Handler) => VoidReturn
'handler/before-prepare/UserRegister': (thisArg: UserRegisterHandler) => VoidReturn
'handler/before-prepare': (thisArg: Handler) => VoidReturn
'handler/before/UserRegister': (thisArg: UserRegisterHandler) => VoidReturn
'handler/before': (thisArg: Handler) => VoidReturn
'handler/after/UserRegister': (thisArg: UserRegisterHandler) => VoidReturn
'handler/after': (thisArg: Handler) => VoidReturn
'handler/finish/UserRegister': (thisArg: UserRegisterHandler) => VoidReturn
'handler/finish': (thisArg: Handler) => VoidReturn
'handler/error': (thisArg: Handler, e: Error) => VoidReturn
'handler/solution/get': (thisArg: ProblemSolutionHandler) => VoidReturn
'discussion/before-add': (payload: Partial<DiscussionDoc>) => VoidReturn
'discussion/add': (payload: Partial<DiscussionDoc>) => VoidReturn
@@ -90,6 +85,8 @@ export interface EventMap {
'contest/before-add': (payload: Partial<Tdoc>) => VoidReturn
'contest/add': (payload: Partial<Tdoc>, id: ObjectID) => VoidReturn
'oplog/log': (type: string, handler: Handler, args: any, data: any) => VoidReturn;
'training/list': (query: FilterQuery<TrainingDoc>, handler: any) => VoidReturn
'training/get': (tdoc: TrainingDoc, handler: any) => VoidReturn
@@ -104,7 +101,7 @@ export function apply(ctx: Context) {
pm2.launchBus((err, bus) => {
if (err) throw new Error();
bus.on('hydro:broadcast', (packet) => {
ctx.parallel(packet.data.event, ...packet.data.payload);
(ctx.parallel as any)(packet.data.event, ...packet.data.payload);
});
ctx.on('bus/broadcast', (event, payload) => {
process.send({ type: 'hydro:broadcast', data: { event, payload } });
@@ -121,11 +118,11 @@ export default app;
export const on = (a, b, c?) => app.on(a, b, c);
export const off = (a, b) => app.off(a, b);
export const once = (a, b, c?) => app.once(a, b, c);
export const parallel = (a, ...b) => app.parallel(a, ...b);
export const emit = (a, ...b) => app.parallel(a, ...b);
export const bail = (a, ...b) => app.bail(a, ...b);
export const parallel = app.parallel.bind(app);
export const emit = app.parallel.bind(app);
export const bail = app.bail.bind(app);
// For backward compatibility
export const serial: any = (a, ...b) => app.parallel(a, ...b);
export const broadcast = (a, ...b) => app.broadcast(a, ...b);
export const serial: any = app.parallel.bind(app);
export const broadcast = app.broadcast.bind(app);
global.Hydro.service.bus = app as any;
+2 -1
View File
@@ -2,9 +2,10 @@
import {
Collection, Db, IndexSpecification, MongoClient,
} from 'mongodb';
import { Collections } from '../interface';
import { Logger } from '../logger';
import options from '../options';
// Note: this might be re-declared so we have to use Collections here
import type { Collections } from '../plugin-api';
import * as bus from './bus';
const logger = new Logger('mongo');
+1 -1
View File
@@ -210,7 +210,7 @@ export class Handler extends HandlerCommon {
}
async function bail(name: string, ...args: any[]) {
const r = await bus.bail(name, ...args);
const r = await (bus.bail as any)(name, ...args);
if (r instanceof Error) throw r;
return r;
}
+1 -4
View File
@@ -2,7 +2,6 @@ import yaml from 'js-yaml';
import { nanoid } from 'nanoid';
import Schema from 'schemastery';
import { Logger } from './logger';
import * as bus from './service/bus';
import { NestKeys } from './typeutils';
const defaultPath = process.env.CI ? '/tmp/file'
@@ -64,7 +63,7 @@ export async function saveConfig(config: any) {
Schema.intersect(SystemSettings)(config);
const value = yaml.dump(config);
await global.Hydro.service.db.collection('system').updateOne({ _id: 'config' }, { $set: { value } }, { upsert: true });
bus.broadcast('config/update');
loadConfig();
}
export async function setConfig(key: string, value: any) {
const path = key.split('.');
@@ -109,5 +108,3 @@ export function requestConfig<T, S>(s: Schema<T, S>): {
const builtin = requestConfig(builtinSettings);
export const builtinConfig = builtin.config;
export const setBuiltinConfig = builtin.setConfig;
bus.on('config/update', loadConfig);
+1 -1
View File
@@ -13,7 +13,7 @@ import { join, resolve } from 'path';
import convert from 'schemastery-jsonschema';
import markdown from './backendlib/markdown';
declare module 'hydrooj' {
declare module 'hydrooj/src/interface' {
interface UI {
esbuildPlugins?: esbuild.Plugin[]
}