import * as cordis from 'cordis'; import type { EventMap } from './api'; export interface Events extends cordis.Events, EventMap { } export interface Context { [Context.events]: Events; setTimeout: typeof setTimeout; setInterval: typeof setInterval; setImmediate: typeof setImmediate; api: ApiMixin; } export class Context extends cordis.Context { static readonly session = Symbol('session'); } export namespace Context { export interface Config extends cordis.Context.Config { } } export type MainScope = cordis.MainScope; export type EffectScope = cordis.EffectScope; export type ForkScope = cordis.ForkScope; export type Plugin = cordis.Plugin; export const Service = cordis.Service; export namespace Plugin { export type Function = cordis.Plugin.Function; export type Constructor = cordis.Plugin.Constructor; export type Object = cordis.Plugin.Object; } const T = any>(origFunc: F, disposeFunc?) => function method(this: cordis.Service, ...args: Parameters) { const res = origFunc(...args); this.caller?.on('dispose', () => (disposeFunc ? disposeFunc(res) : res())); }; export class ApiMixin extends Service { static readonly methods = ['addScript', 'setInterval', 'setTimeout', 'setImmediate', 'provideModule', 'inject', 'broadcast']; setInterval = T(setInterval, clearInterval); setTimeout = T(setTimeout, clearTimeout); setImmediate = T(setImmediate, clearImmediate); constructor(ctx) { super(ctx, 'api', true); } } Context.service('api', ApiMixin); export const ctx = new Context();