diff --git a/framework/framework/api.ts b/framework/framework/api.ts index 54b522f8b..231d3cc50 100644 --- a/framework/framework/api.ts +++ b/framework/framework/api.ts @@ -187,7 +187,7 @@ declare module 'cordis' { } } -export class ApiHandler extends Handler { +export class ApiHandler extends Handler { @param('op', Types.String) async all({ }, op: string) { if (!['get', 'post'].includes(this.request.method.toLowerCase())) { @@ -219,7 +219,7 @@ export class ApiHandler extends Handler { } } -export class ApiConnectionHandler extends ConnectionHandler { +export class ApiConnectionHandler extends ConnectionHandler { dispose: () => Promise | void; isRpc: boolean; diff --git a/framework/framework/decorators.ts b/framework/framework/decorators.ts index 1235bcf34..d7b92854a 100644 --- a/framework/framework/decorators.ts +++ b/framework/framework/decorators.ts @@ -1,4 +1,3 @@ -import { Context } from 'cordis'; import Schema from 'schemastery'; import { ValidationError } from './error'; import type { Handler } from './server'; @@ -57,7 +56,7 @@ function _buildParam(name: string, source: 'get' | 'post' | 'all' | 'route', ... } function _descriptor(v: ParamOption) { - return function desc(this: Handler, target: any, funcName: string, obj: any) { + return function desc(this: Handler, target: any, funcName: string, obj: any) { target.__param ||= {}; target.__param[target.constructor.name] ||= {}; if (!target.__param[target.constructor.name][funcName]) { @@ -66,7 +65,7 @@ function _descriptor(v: ParamOption) { const firstArg = val.split(')')[0]?.split(',')[0]?.split('(')[1]?.trim() || ''; const domainIdStyle = firstArg.toLowerCase().startsWith('domainid'); target.__param[target.constructor.name][funcName] = []; - obj.value = function validate(this: Handler, rawArgs: any, ...extra: any[]) { + obj.value = function validate(this: Handler, rawArgs: any, ...extra: any[]) { if (typeof rawArgs !== 'object' || extra.length) return originalMethod.call(this, rawArgs, ...extra); const c = []; const arglist: ParamOption[] = target.__param[target.constructor.name][funcName]; diff --git a/framework/framework/interface.ts b/framework/framework/interface.ts index 1aa0a5f94..358b31681 100644 --- a/framework/framework/interface.ts +++ b/framework/framework/interface.ts @@ -1,4 +1,3 @@ -import type { Context } from 'cordis'; import type { ApiHandler } from './api'; import type { ConnectionHandler, Handler, NotFoundHandler } from './server'; @@ -6,7 +5,7 @@ export interface KnownHandlers { NotFound: NotFoundHandler; } -type MapHandlerEvents> = +type MapHandlerEvents = Record<`handler/${HookType}/${N}`, (thisArg: H) => VoidReturn> & Record<`handler/${HookWithMethod}/${N}/${Methods}`, (thisArg: H) => VoidReturn>; @@ -14,8 +13,8 @@ type KnownHandlerEvents = { [key in keyof KnownHandlers]: MapHandlerEvents }[keyof KnownHandlers]; -type HandlerEvents = - Record<`handler/${HookType}`, (thisArg: Handler) => VoidReturn> +type HandlerEvents = + Record<`handler/${HookType}`, (thisArg: Handler) => VoidReturn> & Record<`connection/${'create' | 'active' | 'close'}`, (thisArg: any) => VoidReturn>; export type VoidReturn = Promise | any; @@ -23,23 +22,23 @@ export type HookType = 'before-prepare' | 'before' | 'before-operation' | 'after export type Methods = 'get' | 'post' | 'put' | 'delete' | 'patch'; export type HookWithMethod = Exclude; -export interface ServerEvents extends KnownHandlerEvents, HandlerEvents { - 'handler/create': (thisArg: Handler | ConnectionHandler, type: 'ws' | 'http') => VoidReturn; - 'handler/create/http': (thisArg: Handler) => VoidReturn; - 'handler/create/ws': (thisArg: ConnectionHandler) => VoidReturn; - 'handler/init': (thisArg: Handler) => VoidReturn; - 'handler/error': (thisArg: Handler | ConnectionHandler, e: Error) => VoidReturn; - 'handler/api/before': (thisArg: ApiHandler) => VoidReturn; +export interface ServerEvents extends KnownHandlerEvents, HandlerEvents { + 'handler/create': (thisArg: Handler | ConnectionHandler, type: 'ws' | 'http') => VoidReturn; + 'handler/create/http': (thisArg: Handler) => VoidReturn; + 'handler/create/ws': (thisArg: ConnectionHandler) => VoidReturn; + 'handler/init': (thisArg: Handler) => VoidReturn; + 'handler/error': (thisArg: Handler | ConnectionHandler, e: Error) => VoidReturn; + 'handler/api/before': (thisArg: ApiHandler) => VoidReturn; 'api/before': (args: any) => VoidReturn; [k: `handler/${HookType}/${string}`]: (thisArg: any) => VoidReturn; [k: `handler/${HookWithMethod}/${string}/${Methods}`]: (thisArg: any) => VoidReturn; [k: `handler/register/${string}`]: (HandlerClass: new (...args: any[]) => any) => VoidReturn; - [k: `handler/error/${string}`]: (thisArg: Handler, e: Error) => VoidReturn; - [k: `handler/api/before/${string}`]: (thisArg: ApiHandler) => VoidReturn; + [k: `handler/error/${string}`]: (thisArg: Handler, e: Error) => VoidReturn; + [k: `handler/api/before/${string}`]: (thisArg: ApiHandler) => VoidReturn; [k: `api/before/${string}`]: (args: any) => VoidReturn; } declare module 'cordis' { - interface Events extends ServerEvents { + interface Events extends ServerEvents { } } diff --git a/framework/framework/serializer.ts b/framework/framework/serializer.ts index affa84a5c..9dd63e4a5 100644 --- a/framework/framework/serializer.ts +++ b/framework/framework/serializer.ts @@ -1,6 +1,6 @@ import type { HandlerCommon } from './server'; -export default function serializer(ignoreSerializeFunction = false, h?: HandlerCommon) { +export default function serializer(ignoreSerializeFunction = false, h?: HandlerCommon) { return (k: string, v: any) => { if (k.startsWith('_') && k !== '_id') return undefined; if (typeof v === 'bigint') return `BigInt::${v.toString()}`; diff --git a/framework/framework/server.ts b/framework/framework/server.ts index cf2c2568f..2e17b282d 100644 --- a/framework/framework/server.ts +++ b/framework/framework/server.ts @@ -3,6 +3,7 @@ import http from 'http'; import { tmpdir } from 'os'; import { join } from 'path'; import { PassThrough } from 'stream'; +import type { } from '@cordisjs/plugin-timer'; import { Context as CordisContext, Service } from 'cordis'; import type { Files } from 'formidable'; import fs from 'fs-extra'; @@ -43,7 +44,7 @@ export function encodeRFC5987ValueChars(str: string) { ); } -async function forkContextWithScope(ctx: C) { +async function forkContextWithScope(ctx: CordisContext) { const scope = ctx.plugin(() => { }); await scope; const dispose = () => scope.dispose(); @@ -141,8 +142,8 @@ export interface UserModel { _id: number; } -export interface HandlerCommon { } // eslint-disable-line ts/no-unused-vars -export class HandlerCommon { +export interface HandlerCommon { } +export class HandlerCommon { static [kHandler]: string | boolean = 'HandlerCommon'; session: Record; args: Record; @@ -151,7 +152,7 @@ export class HandlerCommon { UiContext: Record; user: UserModel; - constructor(public context: KoaContext, public ctx: C) { + constructor(public context: KoaContext, public ctx: CordisContext) { this.renderHTML = this.renderHTML.bind(this); this.url = this.url.bind(this); this.session = context.session; @@ -212,7 +213,7 @@ export class HandlerCommon { } } -export class Handler extends HandlerCommon { +export class Handler extends HandlerCommon { static [kHandler] = 'Handler'; loginMethods: any; @@ -260,7 +261,7 @@ export class Handler extends HandlerCommon { } } -export class ConnectionHandler extends HandlerCommon { +export class ConnectionHandler extends HandlerCommon { static [kHandler] = 'ConnectionHandler'; conn: WebSocket; @@ -300,7 +301,7 @@ export class ConnectionHandler extends HandlerCommon { } } -export class NotFoundHandler extends Handler { +export class NotFoundHandler extends Handler { prepare() { throw new NotFoundError(this.request.path); } all() { } } @@ -328,7 +329,7 @@ function executeMiddlewareStack(context: any, middlewares: { name: string, func: return dispatch(0); } -export class WebService extends Service { +export class WebService extends Service { static Config = Schema.object({ keys: Schema.array(Schema.string()), proxy: Schema.boolean(), @@ -347,8 +348,8 @@ export class WebService extends Service private handlerLayers = []; private wsLayers = []; private captureAllRoutes = Object.create(null); - private customDefaultContext: C; - private activeHandlers: Map, { start: number, name: string }> = new Map(); + private customDefaultContext: CordisContext; + private activeHandlers: Map = new Map(); renderers: Record = Object.create(null); server = koa; @@ -357,7 +358,7 @@ export class WebService extends Service Handler = Handler; ConnectionHandler = ConnectionHandler; - constructor(ctx: C, public config: ReturnType) { + constructor(ctx: CordisContext, public config: ReturnType) { super(ctx, 'server'); ctx.mixin('server', ['Route', 'Connection', 'withHandlerClass']); this.server.keys = this.config.keys; @@ -503,7 +504,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); }); } - private async handleHttp(ctx: KoaContext, HandlerClass, checker, savedContext: C) { + private async handleHttp(ctx: KoaContext, HandlerClass, checker, savedContext: CordisContext) { const { args } = ctx.HydroContext; Object.assign(args, ctx.params); await using sub = await forkContextWithScope(savedContext); @@ -589,7 +590,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); } } - private async handleWS(ctx: KoaContext, HandlerClass, checker, conn?, layer?, savedContext?) { + private async handleWS(ctx: KoaContext, HandlerClass, checker, conn?, layer?, savedContext?: CordisContext) { const { args } = ctx.HydroContext; const sub = await forkContextWithScope(savedContext); const h = new HandlerClass(ctx, sub.ctx); @@ -731,7 +732,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); perm = item; } } - return function check(this: Handler) { + return function check(this: Handler) { checker(); if (perm) this.checkPerm(perm); if (priv) this.checkPriv(priv); @@ -767,7 +768,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); }); } - public setDefaultContext(ctx: C) { + public setDefaultContext(ctx: CordisContext) { try { if (!ctx.server) throw new Error(); } catch (e) { @@ -783,7 +784,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); } public withHandlerClass( - name: T, callback: (HandlerClass: T extends `${string}ConnectionHandler` ? typeof ConnectionHandler : typeof Handler) => any, + name: T, callback: (HandlerClass: T extends `${string}ConnectionHandler` ? typeof ConnectionHandler : typeof Handler) => any, ) { name = name.replace(/Handler$/, '') as any; if (this.registry[name]) callback(this.registry[name]); @@ -792,7 +793,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); } // eslint-disable-next-line ts/naming-convention - public Route(name: string, path: string, RouteHandler: typeof Handler, ...permPrivChecker) { + public Route(name: string, path: string, RouteHandler: typeof Handler, ...permPrivChecker) { // if (name === 'contest_scoreboard') { // console.log('+++', this.ctx); // console.log(this.ctx.scoreboard); @@ -801,7 +802,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); } // eslint-disable-next-line ts/naming-convention - public Connection(name: string, path: string, RouteHandler: typeof ConnectionHandler, ...permPrivChecker) { + public Connection(name: string, path: string, RouteHandler: typeof ConnectionHandler, ...permPrivChecker) { return this.register('conn', name, path, RouteHandler, ...permPrivChecker); } @@ -866,15 +867,15 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); }); } - public handlerMixin(MixinClass: Partial> | ((s: HandlerCommon) => Partial>)) { + public handlerMixin(MixinClass: Partial | ((s: HandlerCommon) => Partial)) { return this._applyMixin(HandlerCommon, MixinClass); } - public httpHandlerMixin(MixinClass: Partial> | ((s: Handler) => Partial>)) { + public httpHandlerMixin(MixinClass: Partial | ((s: Handler) => Partial)) { return this._applyMixin(Handler, MixinClass); } - public wsHandlerMixin(MixinClass: Partial> | ((s: ConnectionHandler) => Partial>)) { + public wsHandlerMixin(MixinClass: Partial | ((s: ConnectionHandler) => Partial)) { return this._applyMixin(ConnectionHandler, MixinClass); } @@ -891,9 +892,9 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); declare module 'cordis' { interface Context { - server: WebService; - Route: WebService['Route']; - Connection: WebService['Connection']; - withHandlerClass: WebService['withHandlerClass']; + server: WebService; + Route: WebService['Route']; + Connection: WebService['Connection']; + withHandlerClass: WebService['withHandlerClass']; } } diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 27414f2e2..baed2d7d7 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -28,7 +28,7 @@ "@zip.js/zip.js": "^2.8.26", "adm-zip": "0.5.16", "cac": "^7.0.0", - "cordis": "4.0.0-rc.0", + "cordis": "4.0.0-rc.2", "csv-stringify": "^6.7.0", "emoji-regex": "^10.6.0", "emojis-list": "2.1.0", diff --git a/packages/hydrooj/src/context.ts b/packages/hydrooj/src/context.ts index 54f674e12..26ad97d7a 100644 --- a/packages/hydrooj/src/context.ts +++ b/packages/hydrooj/src/context.ts @@ -1,7 +1,6 @@ -/* eslint-disable ts/no-unsafe-declaration-merging */ -import LoggerService from '@cordisjs/plugin-logger'; -import { TimerService } from '@cordisjs/plugin-timer'; -import * as cordis from 'cordis'; +import type { } from '@cordisjs/plugin-logger'; +import type { } from '@cordisjs/plugin-timer'; +import { Service } from 'cordis'; import Schema from 'schemastery'; import type { DomainDoc, GeoIP, ModuleInterfaces } from './interface'; import { inject } from './lib/ui'; @@ -12,6 +11,21 @@ import type { } from './service/migration'; export { EventMap as Events }; +declare module 'cordis' { + export interface Events extends EventMap { } + interface Context { + domain?: DomainDoc; + loader: Loader; + check: CheckService; + setImmediate: typeof setImmediate; + addScript: typeof addScript; + provideModule: typeof provideModule; + injectUI: typeof inject; + broadcast: Context['emit']; + geoip?: GeoIP; + } +} + function addScript(name: string, description: string, validate: Schema, run: (args: K, report: any) => boolean | Promise) { if (global.Hydro.script[name]) throw new Error(`duplicate script ${name} registered.`); global.Hydro.script[name] = { description, validate, run }; @@ -24,28 +38,10 @@ function provideModule(type: T, id: string, mo return () => delete global.Hydro.module[type][id]; } -export type Fiber = cordis.Fiber; -export const Fiber = cordis.Fiber; - -export { Disposable, FiberState, Plugin } from 'cordis'; - -export interface Context extends cordis.Context { - [Context.events]: EventMap & cordis.Events; - loader: Loader; - check: CheckService; - setImmediate: typeof setImmediate; - addScript: typeof addScript; - provideModule: typeof provideModule; - injectUI: typeof inject; - broadcast: Context['emit']; - geoip?: GeoIP; -} - -export abstract class Service extends cordis.Service { -} +export { Context, Disposable, Fiber, FiberState, Plugin, Service } from 'cordis'; const T = any>(origFunc: F, disposeFunc?) => - function method(this: cordis.Service, ...args: Parameters) { + function method(this: Service, ...args: Parameters) { this.ctx.effect(() => { const res = origFunc(...args); return () => (disposeFunc ? disposeFunc(res) : res()); @@ -65,25 +61,3 @@ export class ApiMixin extends Service { ctx.mixin('$api', ['addScript', 'setImmediate', 'provideModule', 'injectUI', 'broadcast']); } } - -export class Context extends cordis.Context { - domain?: DomainDoc; - - constructor() { - super(); - this.plugin(ApiMixin); - this.plugin(TimerService); - this.plugin(LoggerService, { - console: { - showDiff: false, - showTime: 'dd hh:mm:ss', - label: { - align: 'right', - width: 9, - margin: 1, - }, - levels: { default: process.env.DEV ? 3 : 2 }, - }, - }); - } -} diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 72b4c4da2..141e25725 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -876,7 +876,7 @@ class ScoreboardService extends Service { } } -declare module '../context' { +declare module 'cordis' { interface Context { scoreboard: ScoreboardService; } diff --git a/packages/hydrooj/src/lib/i18n.ts b/packages/hydrooj/src/lib/i18n.ts index 15e6c4953..da68c0c07 100644 --- a/packages/hydrooj/src/lib/i18n.ts +++ b/packages/hydrooj/src/lib/i18n.ts @@ -2,7 +2,7 @@ import { Context, Service } from '../context'; const translations: Record[]> = {}; -declare module '../context' { +declare module 'cordis' { interface Context { i18n: I18nService; } diff --git a/packages/hydrooj/src/loader.ts b/packages/hydrooj/src/loader.ts index 4f9c1735b..9b8a64750 100644 --- a/packages/hydrooj/src/loader.ts +++ b/packages/hydrooj/src/loader.ts @@ -12,12 +12,14 @@ import { I18nService } from './lib/i18n'; import { Logger } from './logger'; import { - Context, Service, FiberState, Fiber, + Context, Service, FiberState, Fiber, ApiMixin, } from './context'; // eslint-disable-next-line import/no-duplicates import { sleep, unwrapExports } from './utils'; import { PRIV } from './model/builtin'; import { getAddons } from './options'; +import { TimerService } from '@cordisjs/plugin-timer'; +import LoggerService from '@cordisjs/plugin-logger'; import Schema from 'schemastery'; import { isEqual } from 'lodash'; @@ -162,6 +164,20 @@ export class Loader extends Service { } } +app.plugin(ApiMixin); +app.plugin(TimerService); +app.plugin(LoggerService, { + console: { + showDiff: false, + showTime: 'dd hh:mm:ss', + label: { + align: 'right', + width: 9, + margin: 1, + }, + levels: { default: process.env.DEV ? 3 : 2 }, + }, +}); app.plugin(I18nService); app.plugin(Loader); diff --git a/packages/hydrooj/src/model/oauth.ts b/packages/hydrooj/src/model/oauth.ts index ac1e35225..1201bf740 100644 --- a/packages/hydrooj/src/model/oauth.ts +++ b/packages/hydrooj/src/model/oauth.ts @@ -10,7 +10,7 @@ export interface OauthMap { uid: number; } -declare module '../context' { +declare module 'cordis' { interface Context { oauth: OauthModel; } diff --git a/packages/hydrooj/src/service/bus.ts b/packages/hydrooj/src/service/bus.ts index 14aacd7ba..ddf2bbca3 100644 --- a/packages/hydrooj/src/service/bus.ts +++ b/packages/hydrooj/src/service/bus.ts @@ -22,10 +22,10 @@ export interface EventMap { 'app/before-reload': (entries: Set) => VoidReturn; 'app/reload': (entries: Set) => VoidReturn; - 'subscription/init': (h: ConnectionHandler, privileged: boolean) => VoidReturn; + 'subscription/init': (h: ConnectionHandler, privileged: boolean) => VoidReturn; 'subscription/subscribe': (channel: string, user: User, metadata: Record) => VoidReturn; 'subscription/enable': ( - channel: string, h: ConnectionHandler, privileged: boolean, onDispose: (disposable: () => void) => void, + channel: string, h: ConnectionHandler, privileged: boolean, onDispose: (disposable: () => void) => void, ) => VoidReturn; 'app/watch/change': (path: string) => VoidReturn; @@ -91,7 +91,7 @@ export interface EventMap { 'contest/balloon': (domainId: string, tid: ObjectId, bdoc: ContestBalloonDoc) => VoidReturn; 'contest/del': (domainId: string, tid: ObjectId) => VoidReturn; - 'oplog/log': (type: string, handler: Handler | ConnectionHandler, args: any, data: any) => VoidReturn; + 'oplog/log': (type: string, handler: Handler | ConnectionHandler, args: any, data: any) => VoidReturn; 'training/list': (query: Filter, handler: any) => VoidReturn; 'training/get': (tdoc: TrainingDoc, handler: any) => VoidReturn; diff --git a/packages/hydrooj/src/service/db.ts b/packages/hydrooj/src/service/db.ts index a1dac420e..af0c1d1ae 100644 --- a/packages/hydrooj/src/service/db.ts +++ b/packages/hydrooj/src/service/db.ts @@ -26,7 +26,7 @@ interface MongoConfig { collectionMap?: Record; } -declare module '../context' { +declare module 'cordis' { interface Context { db: MongoService; } diff --git a/packages/hydrooj/src/service/hmr.ts b/packages/hydrooj/src/service/hmr.ts index 1673ef395..28718f46d 100644 --- a/packages/hydrooj/src/service/hmr.ts +++ b/packages/hydrooj/src/service/hmr.ts @@ -9,9 +9,9 @@ import { Context, Plugin, Service } from '../context'; import { Logger } from '../logger'; import { unwrapExports } from '../utils'; -declare module '../context' { +declare module 'cordis' { interface Events { - 'hmr/reload': (reloads: Map }>) => void; + 'hmr/reload': (reloads: Map) => void; } interface Context { hmr: HMR; @@ -150,7 +150,7 @@ export default class HMR extends Service { const pending = new Map(); /** plugins that should be reloaded */ - const reloads = new Map }>(); + const reloads = new Map(); // we assume that plugin entry files are "atomic" // that is, reloading them will not cause any other reloads diff --git a/packages/hydrooj/src/service/migration.ts b/packages/hydrooj/src/service/migration.ts index c6ac42fec..87d275f23 100644 --- a/packages/hydrooj/src/service/migration.ts +++ b/packages/hydrooj/src/service/migration.ts @@ -9,7 +9,7 @@ const argv = cac().parse(); export type MigrationScript = null | ((ctx: Context) => Promise); const logger = new Logger('migration'); -declare module '../context' { +declare module 'cordis' { interface Context { migration: MigrationService; } diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index 33f8a67ea..298b74b03 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -28,7 +28,7 @@ const ignoredLimit = `,${argv.options.ignoredLimit},`; const logger = new Logger('server'); declare module '@hydrooj/framework' { - export interface HandlerCommon { // eslint-disable-line ts/no-unused-vars + export interface HandlerCommon { domain: DomainDoc; paginate(cursor: FindCursor, page: number, key: string): Promise<[docs: T[], numPages: number, count: number]>; @@ -72,10 +72,10 @@ export function requireSudo(target: any, funcName: string, obj: any) { return obj; } -export class Handler extends HandlerOriginal { +export class Handler extends HandlerOriginal { domain: DomainDoc; } -export class ConnectionHandler extends ConnectionHandlerOriginal { +export class ConnectionHandler extends ConnectionHandlerOriginal { domain: DomainDoc; } diff --git a/packages/hydrooj/src/service/storage.ts b/packages/hydrooj/src/service/storage.ts index 118f58a20..e3c2318b6 100644 --- a/packages/hydrooj/src/service/storage.ts +++ b/packages/hydrooj/src/service/storage.ts @@ -423,7 +423,7 @@ export async function apply(ctx: Context, config: ReturnType ctx.provide('storage', service); } -declare module '../context' { +declare module 'cordis' { interface Context { storage: RemoteStorageService | LocalStorageService; } diff --git a/packages/hydrooj/src/service/worker.ts b/packages/hydrooj/src/service/worker.ts index 202d1d4e8..0718b07c0 100644 --- a/packages/hydrooj/src/service/worker.ts +++ b/packages/hydrooj/src/service/worker.ts @@ -4,7 +4,7 @@ import { sleep } from '@hydrooj/utils'; import { Context, Service } from '../context'; import db from './db'; -declare module '../context' { +declare module 'cordis' { interface Context { worker: WorkerService; } diff --git a/packages/prom-client/metrics.ts b/packages/prom-client/metrics.ts index ef16552be..0542e1964 100644 --- a/packages/prom-client/metrics.ts +++ b/packages/prom-client/metrics.ts @@ -3,7 +3,7 @@ import { } from 'prom-client'; import { Context, db } from 'hydrooj'; -declare module 'hydrooj' { +declare module 'cordis' { interface Context { metrics: Registry; } diff --git a/packages/sonic/index.ts b/packages/sonic/index.ts index bc7d88a5c..dc18a4a09 100644 --- a/packages/sonic/index.ts +++ b/packages/sonic/index.ts @@ -7,7 +7,7 @@ import { Logger, ProblemModel, Schema, Service, SystemModel, } from 'hydrooj'; -declare module 'hydrooj' { +declare module 'cordis' { interface Context { sonic?: SonicService; } diff --git a/packages/ui-default/components/scratchpad/index.tsx b/packages/ui-default/components/scratchpad/index.tsx index d7020315a..dbd8ae696 100644 --- a/packages/ui-default/components/scratchpad/index.tsx +++ b/packages/ui-default/components/scratchpad/index.tsx @@ -54,7 +54,7 @@ class ScratchpadService extends Service { rerenderCallback?.(); } } -declare module '../../context' { +declare module 'cordis' { interface Context { scratchpad: ScratchpadService; } diff --git a/packages/ui-default/context.ts b/packages/ui-default/context.ts index 022dce826..d9c4be5ef 100644 --- a/packages/ui-default/context.ts +++ b/packages/ui-default/context.ts @@ -1,20 +1,11 @@ -/* eslint-disable ts/no-unsafe-declaration-merging */ - -import * as cordis from 'cordis'; +import { Context } from 'cordis'; import type { EventMap } from './api'; -export interface Events extends cordis.Events, EventMap { } - -export type { Disposable, FiberState, Plugin } from 'cordis'; - -export interface Context { - [Context.events]: Events; - broadcast: Context['emit']; +declare module 'cordis' { + export interface Events extends EventMap { } } -export class Context extends cordis.Context { } -export type Fiber = cordis.Fiber; +export type { Disposable, Plugin } from 'cordis'; +export { Context, Fiber, FiberState, Service } from 'cordis'; -export class Service extends cordis.Service { -} export const ctx = new Context(); diff --git a/packages/ui-default/pages/home_messages.page.tsx b/packages/ui-default/pages/home_messages.page.tsx index 7e2876d8c..78045c86c 100644 --- a/packages/ui-default/pages/home_messages.page.tsx +++ b/packages/ui-default/pages/home_messages.page.tsx @@ -18,7 +18,7 @@ class MessagePadService extends Service { } } -declare module '../context' { +declare module 'cordis' { interface Context { messagepad: MessagePadService; } diff --git a/packages/vjudge/src/index.ts b/packages/vjudge/src/index.ts index 893b613ab..4e18cb520 100644 --- a/packages/vjudge/src/index.ts +++ b/packages/vjudge/src/index.ts @@ -177,7 +177,7 @@ class AccountService { } } -declare module 'hydrooj' { +declare module 'cordis' { interface Context { vjudge: VJudgeService; }