@zk-tech/bedrock 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/container-factory/index.cjs +254 -0
- package/dist/container-factory/index.cjs.map +1 -0
- package/dist/container-factory/index.d.cts +32 -0
- package/dist/container-factory/index.d.ts +32 -0
- package/dist/container-factory/index.js +232 -0
- package/dist/container-factory/index.js.map +1 -0
- package/dist/di/index.d.cts +7 -95
- package/dist/di/index.d.ts +7 -95
- package/dist/dynamic-dependency-service.interface-BrwqELkH.d.ts +40 -0
- package/dist/dynamic-dependency-service.interface-OUOyz9BD.d.cts +40 -0
- package/dist/instantiation-service-DjBf8Dy1.d.cts +59 -0
- package/dist/instantiation-service-V9JO6Ljg.d.ts +59 -0
- package/dist/{instantiation-service.interface-CVFMBUUD.d.cts → instantiation-service.interface-bshqO0aS.d.cts} +1 -1
- package/dist/{instantiation-service.interface-CVFMBUUD.d.ts → instantiation-service.interface-bshqO0aS.d.ts} +1 -1
- package/dist/launch/index.d.cts +1 -1
- package/dist/launch/index.d.ts +1 -1
- package/dist/services/dynamic-dependency/index.cjs +1583 -0
- package/dist/services/dynamic-dependency/index.cjs.map +1 -0
- package/dist/services/dynamic-dependency/index.d.cts +17 -0
- package/dist/services/dynamic-dependency/index.d.ts +17 -0
- package/dist/services/dynamic-dependency/index.js +1581 -0
- package/dist/services/dynamic-dependency/index.js.map +1 -0
- package/dist/type-BsqwDzaj.d.cts +39 -0
- package/dist/type-Bya55PZP.d.ts +39 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/di/base.ts","../../../src/di/descriptor.ts","../../../src/di/instantiation-service.interface.ts","../../../src/_internal/logger.ts","../../../src/assert/assert.ts","../../../src/dispose/disposable-t.ts","../../../src/dispose/disposable-utils.ts","../../../src/scheduler/core/task.ts","../../../src/scheduler/core/utils.ts","../../../src/scheduler/core/chunk-scheduler.ts","../../../src/scheduler/core/actuator.ts","../../../src/structure/min-heap.ts","../../../src/scheduler/core/task-queue.ts","../../../src/scheduler/executor/abstract-executor.ts","../../../src/scheduler/executor/idle-callback-executor.ts","../../../src/scheduler/executor/post-message-executor.ts","../../../src/scheduler/executor/make-executor.ts","../../../src/scheduler/core/scheduler.ts","../../../src/scheduler/callback-token.ts","../../../src/scheduler/lv-scheduler-callback.ts","../../../src/structure/linked-list.ts","../../../src/event/disposable-linked-list.ts","../../../src/event/error-handler.ts","../../../src/event/emitter.ts","../../../src/event/once.ts","../../../src/di/idle-value.ts","../../../src/structure/graph.ts","../../../src/di/service-collection.ts","../../../src/di/proxy-builder.ts","../../../src/di/trace.ts","../../../src/di/instantiation-service.ts","../../../src/services/dynamic-dependency/dynamic-dependency-service.interface.ts","../../../src/services/dynamic-dependency/dynamic-dependency-service.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// service特征标识\nexport type BrandedService = { _serviceBrand: undefined };\n\n//\n// 服务唯一标识符(编译时生成)\n// 需要DI进行注入的服务必须拥有该标识符\n// 本质上是一个参数装饰器\n//\nexport interface ServiceIdentifier<T> {\n (...args: any[]): void;\n type: T;\n}\n\n// 获取服务的视图接口\nexport interface ServicesAccessor {\n get: <T>(id: ServiceIdentifier<T>) => T;\n}\n\n// 服务唯一标识符存储\nconst serviceIds = new Map<string, ServiceIdentifier<any>>();\n\nexport const DI_TARGET = '$di$target';\nexport const DI_DEPENDENCIES = '$di$dependencies';\n\n// 获取某个服务的依赖\n// 因为服务依赖关系会存放在构造函数的属性上\nexport function getServiceDependencies(ctor: any): { id: ServiceIdentifier<any>; index: number }[] {\n return ctor[DI_DEPENDENCIES] || [];\n}\n\n// 更新服务依赖依赖关系\nfunction setServiceDependency(id: ServiceIdentifier<any>, ctor: any, index: number): void {\n if (ctor[DI_TARGET] === ctor) {\n ctor[DI_DEPENDENCIES].push({ id, index });\n } else {\n ctor[DI_DEPENDENCIES] = [{ id, index }];\n ctor[DI_TARGET] = ctor;\n }\n}\n\n//\n// 创建服务唯一标识符\n// 传入服务ID,返回一个参数装饰器\n// 参数装饰器会记录A需要\n// const IFooServiceId = createDecorator<FooService>('FooService');\n//\n// class Bar\n// constructor(@IFooServiceId a: IFooService) // IFooService是接口声明\n//\nexport function createDecorator<T>(serviceId: string): ServiceIdentifier<T> {\n if (serviceIds.has(serviceId)) {\n return serviceIds.get(serviceId)!;\n }\n\n const id = function (target: any, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n setServiceDependency(id, target, index);\n } as any;\n\n id.toString = () => serviceId;\n\n serviceIds.set(serviceId, id);\n return id;\n}\n\n// TODO(niurouwan): 补一下注释和例子\nexport function refineServiceDecorator<T1, T extends T1>(\n serviceIdentifier: ServiceIdentifier<T1>,\n): ServiceIdentifier<T> {\n return serviceIdentifier as ServiceIdentifier<T>;\n}\n","//\n// DI中服务描述符,本质上是构造函数的包装\n//\n// 必须提供服务构造函数\n// 支持静态参数\n// 支持配置是否延迟初始化\n//\nexport class SyncDescriptor<T> {\n readonly ctor: new (...args: any[]) => T;\n readonly staticArguments: any[];\n readonly supportsDelayedInstantiation: boolean;\n\n constructor(\n ctor: new (...args: any[]) => T,\n staticArguments: any[] = [],\n supportsDelayedInstantiation = false,\n ) {\n this.ctor = ctor;\n this.staticArguments = staticArguments;\n this.supportsDelayedInstantiation = supportsDelayedInstantiation;\n }\n}\n\n//\n// 特化描述符\n// 1. 没有静态参数,没有动态参数,只存在注入参数\n// 2. 默认延迟初始化\n//\nexport interface SyncDescriptor0<T> {\n readonly ctor: new () => T;\n}\n","import type { BrandedService, ServicesAccessor } from './base';\nimport { createDecorator } from './base';\nimport type { SyncDescriptor0 } from './descriptor';\nimport type { ServiceCollection } from './service-collection';\n\nexport type GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends []\n ? []\n : TArgs extends [...infer TFirst, BrandedService]\n ? GetLeadingNonServiceArgs<TFirst>\n : TArgs;\n\nexport interface IInstantiationService {\n readonly _serviceBrand: undefined;\n\n /**\n * Synchronously creates an instance that is denoted by the descriptor\n */\n createInstance: {\n <T>(descriptor: SyncDescriptor0<T>): T;\n <Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(\n ctor: Ctor,\n ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>\n ): R;\n };\n\n /**\n * Calls a function with a service accessor.\n */\n invokeFunction: <R, TS extends any[] = []>(\n fn: (accessor: ServicesAccessor, ...args: TS) => R,\n ...args: TS\n ) => R;\n\n /**\n * Creates a child of this service which inherits all current services\n * and adds/overwrites the given services.\n */\n createChild: (services: ServiceCollection) => IInstantiationService;\n\n /**\n * 生命周期归属该DI上下文的服务进行销毁\n */\n dispose: () => void;\n}\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('instantiation');\n","/* eslint-disable no-console */\n\nexport const Logger = {\n error(...data: any[]): void {\n if (typeof console.error === 'function') {\n console.error(...data);\n }\n },\n info(...data: any[]): void {\n if (typeof console.info === 'function') {\n console.info(...data);\n }\n },\n log(...data: any[]): void {\n if (typeof console.log === 'function') {\n console.log(...data);\n }\n },\n time(label?: string): void {\n if (typeof console.time === 'function') {\n console.time(label);\n }\n },\n timeEnd(label?: string): void {\n if (typeof console.timeEnd === 'function') {\n console.timeEnd(label);\n }\n },\n timeLog(label?: string, ...data: any[]): void {\n if (typeof console.timeLog === 'function') {\n console.timeLog(label, ...data);\n }\n },\n timeStamp(label?: string): void {\n if (typeof console.timeStamp === 'function') {\n console.timeStamp(label);\n }\n },\n trace(...data: any[]): void {\n if (typeof console.trace === 'function') {\n console.trace(...data);\n }\n },\n warn(...data: any[]): void {\n if (typeof console.warn === 'function') {\n console.warn(...data);\n }\n },\n profile(label?: string): void {\n if (typeof console.profile === 'function') {\n console.profile(label);\n }\n },\n profileEnd(label?: string): void {\n if (typeof console.profileEnd === 'function') {\n console.profileEnd(label);\n }\n },\n};\n","function abort(reason: string): never {\n throw new Error(`lvAssert(${reason})`);\n}\n\n/**\n * 断言表达式为真\n * @param expr \n * @param reason \n */\nexport function lvAssert(expr: unknown, reason?: string): asserts expr {\n if (!expr) {\n abort(reason ?? '#expr is false');\n }\n}\n\n/**\n * 断言deadcode路径\n * @param reason \n */\nexport function lvAssertNotHere(reason?: string): never {\n abort(reason ?? 'unreachable code flow');\n}\n\n/**\n * 断言类型不可达\n * @param member \n * @param message \n */\nexport function lvAssertNever(member: never, message = 'Illegal value:'): never {\n abort(`${message}: ${member}`);\n}\n\n/**\n * 断言变量为null或者undefined\n * @param val \n * @param reason \n */\nexport function lvAssertNotNil<T>(val: T, reason?: string): asserts val is NonNullable<T> {\n if (val === null || val === undefined) {\n abort(reason ?? '#val is nil');\n }\n}\n","import { Logger } from '@/_internal/logger';\nimport { lvAssertNotNil } from '@/assert';\nimport { DisposableStore } from './disposable-store';\nimport type { IDisposable } from './dispose-base';\nimport { BRANCH_DISPOSE } from './logger';\nimport { MARK_AS_DISPOSED, SET_PARENT_OF_DISPOSABLE, TRACK_DISPOSABLE } from './tracker';\n\n//\n// Disposable基类\n//\n// 自动添加DisposableStore,提供默认的dispose和register方法\n//\nexport abstract class Disposable implements IDisposable {\n protected readonly _store = new DisposableStore();\n\n constructor() {\n TRACK_DISPOSABLE(this);\n SET_PARENT_OF_DISPOSABLE(this._store, this);\n }\n\n // 销毁该节点和所有的子节点\n dispose(): void {\n MARK_AS_DISPOSED(this);\n BRANCH_DISPOSE(this.constructor.name, this._store.constructor.name);\n\n this._store.dispose();\n }\n\n // 挂载子节点\n protected _register<T extends IDisposable>(o: T): T {\n if ((o as unknown as Disposable) === this) {\n throw new Error('Cannot register a disposable on itself!');\n }\n return this._store.add(o);\n }\n}\n\n/**\n * 容器类\n * 提供一个容器,容器内部的IDisposable对象可以切换更新,每次更新的时候,旧的IDisposable对象会自动进行dispose\n *\n * 使用方式:\n * class Foo {\n * private readonly _barRef: MutableDisposable;\n *\n * toggle() {\n * this._barRef.setValue(new Bar());\n * }\n *\n * doSomething() {\n * this._barRef.value.xxx();\n * }\n * }\n */\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value?: T;\n private _isDisposed = false;\n\n constructor(value?: T) {\n TRACK_DISPOSABLE(this);\n this.value = value;\n }\n\n get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n\n this._value?.dispose();\n if (value) {\n SET_PARENT_OF_DISPOSABLE(value, this);\n }\n this._value = value;\n }\n\n clear(): void {\n this.value = undefined;\n }\n\n dispose(): void {\n this._isDisposed = true;\n MARK_AS_DISPOSED(this);\n this._value?.dispose();\n this._value = undefined;\n }\n\n release(): T | undefined {\n const oldValue = this._value;\n this._value = undefined;\n if (oldValue) {\n SET_PARENT_OF_DISPOSABLE(oldValue, null);\n }\n return oldValue;\n }\n}\n\n/**\n * 容器类\n * 通过该容器进行dispose试,可以保证内部的IDisposable一会进行一次dispose\n * 本质是一种防御性质的处理,如果需要使用时,最好有明确的理由\n */\nexport class SafeDisposable<T extends IDisposable> implements IDisposable {\n private _value?: T;\n\n constructor(value: T) {\n this._value = value;\n TRACK_DISPOSABLE(this);\n }\n\n get value(): T | undefined {\n return this._value;\n }\n\n isEmpty() {\n return this._value === undefined;\n }\n\n dispose() {\n if (!this._value) {\n return;\n }\n this._value.dispose();\n this._value = undefined;\n MARK_AS_DISPOSED(this);\n }\n}\n\n/**\n * 容器类\n * 引用计数容器,当引用为0时自动执行dispose\n * 注意:初始计数为1,默认构造的地方自动获得引用,如果在栈上构造,记得最后调用release\n *\n * 使用实例:\n * class Foo {\n * private _bar: RefCountedDisposable = new RefCountedDisposable(new Bar());\n *\n * getBar() {\n * this._bar.acquire();\n * return this._bar;\n * }\n * }\n *\n * // 如果在栈上构造\n * const bar = new RefCountedDisposable(new Bar());\n * makeFoo(bar);\n * makeFoo(bar);\n * bar.release();\n */\nexport class RefCountedDisposable<T extends IDisposable> implements IDisposable {\n private _counter: number = 1;\n private _value?: T;\n\n constructor(value: T) {\n this._value = value;\n TRACK_DISPOSABLE(this);\n }\n\n get value(): T | undefined {\n return this._value;\n }\n\n acquire() {\n if (!this._value) {\n return this;\n }\n this._counter++;\n return this;\n }\n\n release() {\n if (--this._counter === 0) {\n this._value!.dispose();\n this._value = undefined;\n MARK_AS_DISPOSED(this);\n }\n return this;\n }\n\n dispose() {\n this.release();\n }\n}\n\n/**\n * 容器类,表示了一个T生命周期的转移\n *\n * 由于js引用传递的特性,正常情况下,我们默认为传递过来的对象不具备dispose权利\n * class Foo extends Disposable {\n * private readonly _bar = new Bar();\n *\n * constructor(\n * thirdparty: Thirdparty,\n * ) {\n * this._register(this._bar); // class内部构造的,具备dispose权利\n * this._register(thirdparty); // ❌,很少会直接这么写,除非能很确定存在生命周期转移\n * }\n *\n * constructor(\n * thirdparty: TransferDisposable<Thirdparty>, // ✅,明确表示了我依赖了Thirdparty,但是该对象生命周期要归我所有\n * ) {\n * this._register(this._bar);\n * this._register(thirdparty.release()); // ✅,可以直接register\n * }\n * }\n *\n * 注意:\n * 不同于C++中的unique_ptr,该class只作用于转移场景。\n * 所以class理论上只在栈上出现,不应该在堆上存在。\n * 如果出现了需要在堆上存储的场景,可以联系架构侧\n */\nexport class TransferDisposable<T extends IDisposable> extends Disposable {\n private _val?: T;\n\n constructor(val: T) {\n super();\n\n this._val = val;\n }\n\n release() {\n // 只能release一次\n lvAssertNotNil(this._val);\n const v = this._val;\n this._val = undefined;\n return v;\n }\n\n dispose(): void {\n // 虽然它有dispose,但是不应该被执行,应该直接被gc才对\n Logger.warn(new Error('TransferDisposable call dispose.'));\n this._val?.dispose();\n super.dispose();\n }\n}\n","import { SafeDisposable, TransferDisposable } from './disposable-t';\nimport { EmptyDispose, type IDisposable } from './dispose-base';\nimport { MARK_AS_LEAKED } from './tracker';\n\nexport function makeSafeDisposable(fn: (...args: any) => any) {\n const disposable = new SafeDisposable({\n dispose: fn,\n });\n return disposable;\n}\n\nexport function makeEmptyDisposable() {\n return EmptyDispose;\n}\n\n// 忽略dispose\nexport function ignoreDispose(x: IDisposable) {\n MARK_AS_LEAKED(x);\n}\n\n// 判断一个thing是否是disposable\nexport function isDisposable<E = any>(thing: E): thing is E & IDisposable {\n return typeof (thing as IDisposable).dispose === 'function' && (thing as IDisposable).dispose.length === 0;\n}\n\nexport function makeTransferDisposable<T extends IDisposable>(val: T) {\n return new TransferDisposable(val);\n}\n","import { lvAssert } from '../../assert';\nimport type { IScheduledCallback } from '../type';\n\nexport class Task {\n private _callback?: IScheduledCallback;\n private _sortIndex: number = -1;\n\n constructor(\n callback: IScheduledCallback,\n private _startTime: number,\n private _expirationTime: number,\n ) {\n this._callback = callback;\n }\n\n getCallback() {\n return this._callback;\n }\n\n setCallback(callback: IScheduledCallback) {\n lvAssert(this._callback === undefined, 'cant overlay callback.');\n this._callback = callback;\n }\n\n clearCallback() {\n this._callback = undefined;\n }\n\n getStartTime() {\n return this._startTime;\n }\n\n setStartTime(startTime: number) {\n this._startTime = startTime;\n }\n\n getExpirationTime() {\n return this._expirationTime;\n }\n\n setExpirationTime(expirationTime: number) {\n this._expirationTime = expirationTime;\n }\n\n setSortIndex(index: number) {\n this._sortIndex = index;\n }\n\n getSortIndex() {\n return this._sortIndex;\n }\n}\n","// Max 31 bit integer. The max integer size in V8 for 32-bit systems.\n// Math.pow(2, 30) - 1\n\nimport { Task } from './task';\nimport { PriorityLevel, type IScheduledCallback, type IOptions } from '../type';\n\n// 0b111111111111111111111111111111\nconst maxSigned31BitInt = 1073741823;\n\n// Times out immediately\nconst IMMEDIATE_PRIORITY_TIMEOUT = -1;\n// Eventually times out\nconst USER_BLOCKING_PRIORITY_TIMEOUT = 250;\nconst NORMAL_PRIORITY_TIMEOUT = 5000;\nconst LOW_PRIORITY_TIMEOUT = 10000;\n// Never times out\nconst IDLE_PRIORITY_TIMEOUT = maxSigned31BitInt;\n\nexport function getCurrentTime() {\n return Date.now();\n}\n\nexport function getTimeout(priorityLevel: PriorityLevel = PriorityLevel.NormalPriority) {\n switch (priorityLevel) {\n case PriorityLevel.ImmediatePriority:\n return IMMEDIATE_PRIORITY_TIMEOUT;\n case PriorityLevel.UserBlockingPriority:\n return USER_BLOCKING_PRIORITY_TIMEOUT;\n case PriorityLevel.IdlePriority:\n return IDLE_PRIORITY_TIMEOUT;\n case PriorityLevel.LowPriority:\n return LOW_PRIORITY_TIMEOUT;\n case PriorityLevel.NormalPriority:\n default:\n return NORMAL_PRIORITY_TIMEOUT;\n }\n}\n\nexport function makeTask(callback: IScheduledCallback, options: IOptions = {}) {\n const currentTime = getCurrentTime();\n const delay = options.delay ?? 0;\n const timeout = getTimeout(options.priorityLevel);\n const startTime = delay + currentTime;\n const expirationTime = startTime + timeout;\n\n const newTask = new Task(callback, startTime, expirationTime);\n return newTask;\n}\n","import type { Scheduler } from './scheduler';\nimport { Task } from './task';\nimport { type IChunkScheduler, type IScheduledCallback, type IOptions } from '../type';\nimport { makeTask } from './utils';\n\nexport class ChunkScheduler implements IChunkScheduler {\n private _needContinue: boolean = false;\n\n constructor(\n private readonly _task: Task,\n private readonly _scheduler: Scheduler,\n ) {}\n\n get needContinue() {\n return this._needContinue;\n }\n\n continueExecute(callback: IScheduledCallback) {\n this._needContinue = true;\n // 该task还需要延续执行,更新一些信息\n this._task.setCallback(callback);\n }\n\n execute(callback: IScheduledCallback, options: IOptions = {}) {\n const newTask = makeTask(callback, options);\n this._scheduler.addTask(newTask);\n }\n}\n","import { ChunkScheduler } from './chunk-scheduler';\nimport type { Scheduler } from './scheduler';\nimport type { TaskQueue } from './task-queue';\nimport { getCurrentTime } from './utils';\n\nexport class Actuator {\n constructor(\n private readonly _taskQueue: TaskQueue,\n private readonly _scheduler: Scheduler,\n ) {}\n\n workLoop(hasTimeRemaining: boolean, initialTime: number, deadline: number): boolean {\n let currentTime = initialTime;\n this._taskQueue.advance(currentTime);\n let currentTask = this._taskQueue.waitingTasks.peek();\n\n while (currentTask !== null) {\n // 暂停执行需要满足的条件(1,2同时满足)\n // 1. 不能超时了,超时的任务一定会执行\n // 2. 没有剩余时间了,或者调度器认为需要释放资源\n if (\n currentTask.getExpirationTime() > currentTime &&\n (!hasTimeRemaining || this._scheduler.shouldYieldToHost(deadline))\n ) {\n break;\n }\n\n if (currentTask.getCallback() === undefined) {\n // 任务取消了\n this._taskQueue.waitingTasks.remove();\n } else {\n const callback = currentTask.getCallback()!;\n const didUserCallbackTimeout = currentTask.getExpirationTime() <= currentTime;\n const remainingTime = deadline - currentTime;\n currentTask.clearCallback();\n\n const chunkInvoker = new ChunkScheduler(currentTask, this._scheduler);\n callback(chunkInvoker, didUserCallbackTimeout, remainingTime);\n\n if (!chunkInvoker.needContinue) {\n this._taskQueue.waitingTasks.remove();\n }\n\n currentTime = getCurrentTime();\n this._taskQueue.advance(currentTime);\n }\n\n currentTask = this._taskQueue.waitingTasks.peek();\n }\n\n if (currentTask !== null) {\n return true;\n }\n // 如果等待队列结束了,要启动异步调度了\n this._scheduler.requestHostTimeout(currentTime);\n return false;\n }\n}\n","export class MinHeap<T> {\n private readonly _heap: T[] = [];\n private readonly _compare: (a: T, b: T) => number;\n\n constructor(compareFunction?: (a: T, b: T) => number) {\n if (compareFunction) {\n this._compare = compareFunction;\n } else {\n this._compare = (a, b) => {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n };\n }\n }\n\n public insert(value: T): void {\n this._heap.push(value);\n this._siftUp();\n }\n\n public peek(): T | null {\n return this._heap.length > 0 ? this._heap[0] : null;\n }\n\n public remove(): T | null {\n if (this._heap.length === 0) return null;\n if (this._heap.length === 1) return this._heap.pop()!;\n\n const item = this._heap[0];\n this._heap[0] = this._heap.pop()!;\n this._siftDown();\n return item;\n }\n\n public size(): number {\n return this._heap.length;\n }\n\n public clear(): void {\n this._heap.length = 0;\n }\n\n private _getLeftChildIndex(parentIndex: number): number {\n return 2 * parentIndex + 1;\n }\n\n private _getRightChildIndex(parentIndex: number): number {\n return 2 * parentIndex + 2;\n }\n\n private _getParentIndex(childIndex: number): number {\n return Math.floor((childIndex - 1) / 2);\n }\n\n private _swap(indexOne: number, indexTwo: number): void {\n [this._heap[indexOne], this._heap[indexTwo]] = [this._heap[indexTwo], this._heap[indexOne]];\n }\n\n private _siftUp(): void {\n let index = this._heap.length - 1;\n while (index > 0 && this._compare(this._heap[this._getParentIndex(index)], this._heap[index]) > 0) {\n const parentIndex = this._getParentIndex(index);\n this._swap(index, parentIndex);\n index = parentIndex;\n }\n }\n\n private _siftDown(): void {\n let index = 0;\n let smallerChildIndex = this._getLeftChildIndex(index);\n\n while (smallerChildIndex < this._heap.length) {\n const rightChildIndex = this._getRightChildIndex(index);\n if (\n rightChildIndex < this._heap.length &&\n this._compare(this._heap[rightChildIndex], this._heap[smallerChildIndex]) < 0\n ) {\n smallerChildIndex = rightChildIndex;\n }\n\n if (this._compare(this._heap[index], this._heap[smallerChildIndex]) <= 0) {\n break;\n }\n\n this._swap(index, smallerChildIndex);\n index = smallerChildIndex;\n smallerChildIndex = this._getLeftChildIndex(index);\n }\n }\n}\n","import { MinHeap } from '../../structure/min-heap';\nimport type { Task } from './task';\n\nfunction compare(lhs: Task, rhs: Task) {\n return lhs.getSortIndex() - rhs.getSortIndex();\n}\n\n/**\n * 任务存储队列\n * 本身是两个小根堆\n */\nexport class TaskQueue {\n // 延时任务\n private readonly _timerTasks = new MinHeap<Task>(compare);\n // 等待执行的任务\n private readonly _waitingTasks = new MinHeap<Task>(compare);\n\n get timerTasks() {\n return this._timerTasks;\n }\n\n get waitingTasks() {\n return this._waitingTasks;\n }\n\n advance(currentTime: number) {\n let task = this._timerTasks.peek();\n while (task !== null) {\n if (task.getCallback() === null) {\n // 任务已经取消\n this._timerTasks.remove();\n } else if (task.getStartTime() <= currentTime) {\n // 任务触发,移动到等待队列\n this._timerTasks.remove();\n task.setSortIndex(task.getExpirationTime());\n this._waitingTasks.insert(task);\n } else {\n // 剩余的异步任务pending即可\n return;\n }\n task = this._timerTasks.peek();\n }\n }\n}\n","import { lvAssert } from '../../assert';\nimport type { IExecutedCallback, IExecutor } from './executor.interface';\n\nexport abstract class AbstractExecutor implements IExecutor {\n private _timeoutId: number = -1;\n protected _deadline: number = 0;\n protected _yieldInterval: number = 16;\n\n get deadline() {\n return this._deadline;\n }\n\n setFrameRate(fps: number) {\n lvAssert(fps > 0 && fps <= 125);\n this._yieldInterval = Math.floor(1000 / fps);\n }\n\n resetFrameRate() {\n this._yieldInterval = 16;\n }\n\n public abstract requestHostCallback(fn: IExecutedCallback): void;\n public abstract cancelHostCallback(): void;\n\n public requestHostTimeout(fn: () => void, delayMs: number) {\n lvAssert(this._timeoutId === -1, 'has request host timeout.');\n clearTimeout(this._timeoutId);\n this._timeoutId = setTimeout(() => {\n this._timeoutId = -1;\n fn();\n }, delayMs) as unknown as number;\n }\n\n public cancelHostTimeout() {\n clearTimeout(this._timeoutId);\n this._timeoutId = -1;\n }\n}\n","import type { IDisposable } from '../../dispose';\nimport { getCurrentTime } from '../core/utils';\nimport { AbstractExecutor } from './abstract-executor';\nimport type { IExecutedCallback } from './executor.interface';\n\ndeclare function requestIdleCallback(\n callback: (args: IdleDeadline) => void,\n options?: { timeout: number },\n): number;\ndeclare function cancelIdleCallback(handle: number): void;\n\nexport class IdleCallbackExecutor extends AbstractExecutor {\n private _scheduledCallback?: IExecutedCallback;\n private _disposable?: IDisposable;\n private _runWhenIdle: (callback: (idle: IdleDeadline) => void, timeout?: number) => IDisposable;\n\n constructor() {\n super();\n if (typeof requestIdleCallback !== 'function' || typeof cancelIdleCallback !== 'function') {\n this._runWhenIdle = (runner) => {\n let disposed = false;\n setTimeout(() => {\n if (disposed) {\n return;\n }\n const end = Date.now() + 15; // one frame at 64fps\n runner(\n Object.freeze({\n didTimeout: true,\n timeRemaining() {\n return Math.max(0, end - Date.now());\n },\n }),\n );\n });\n return {\n dispose() {\n if (disposed) {\n return;\n }\n disposed = true;\n },\n };\n };\n } else {\n this._runWhenIdle = (runner, timeout?) => {\n const handle: number = requestIdleCallback(\n runner,\n typeof timeout === 'number' ? { timeout } : undefined,\n );\n let disposed = false;\n return {\n dispose() {\n if (disposed) {\n return;\n }\n disposed = true;\n cancelIdleCallback(handle);\n },\n };\n };\n }\n }\n\n public requestHostCallback(fn: IExecutedCallback) {\n this._scheduledCallback = fn;\n if (!this._disposable) {\n this._disposable = this._runWhenIdle(this._flushCallback);\n }\n }\n\n public cancelHostCallback() {\n this._disposable?.dispose();\n this._scheduledCallback = undefined;\n this._disposable = undefined;\n }\n\n private readonly _flushCallback = () => {\n if (!this._scheduledCallback) {\n return;\n }\n const currentTime = getCurrentTime();\n const deadline = currentTime + this._yieldInterval;\n\n try {\n const hasMoreWork = this._scheduledCallback(true, currentTime, deadline);\n if (!hasMoreWork) {\n this._scheduledCallback = undefined;\n this._disposable = undefined;\n } else {\n this._disposable = this._runWhenIdle(this._flushCallback);\n }\n } catch (err) {\n this._disposable = this._runWhenIdle(this._flushCallback);\n throw err;\n }\n };\n}\n","import { getCurrentTime } from '../core/utils';\nimport { AbstractExecutor } from './abstract-executor';\nimport type { IExecutedCallback } from './executor.interface';\n\nexport class PostMessageExecutor extends AbstractExecutor {\n private _scheduledCallback?: IExecutedCallback;\n private _isMessageLoopRunning: boolean = false;\n private readonly _channel = new MessageChannel();\n\n constructor() {\n super();\n\n this._channel.port1.onmessage = () => {\n this._flushCallback();\n };\n }\n\n public requestHostCallback(fn: IExecutedCallback) {\n this._scheduledCallback = fn;\n if (!this._isMessageLoopRunning) {\n this._isMessageLoopRunning = true;\n this._channel.port2.postMessage(null);\n }\n }\n\n public cancelHostCallback() {\n this._scheduledCallback = undefined;\n }\n\n private readonly _flushCallback = () => {\n if (!this._scheduledCallback) {\n this._isMessageLoopRunning = false;\n return;\n }\n\n const currentTime = getCurrentTime();\n const deadline = currentTime + this._yieldInterval;\n\n try {\n const hasMoreWork = this._scheduledCallback(true, currentTime, deadline);\n if (!hasMoreWork) {\n this._isMessageLoopRunning = false;\n this._scheduledCallback = undefined;\n } else {\n this._channel.port2.postMessage(null);\n }\n } catch (err) {\n this._channel.port2.postMessage(null);\n throw err;\n }\n };\n}\n","import type { IExecutor } from './executor.interface';\nimport { IdleCallbackExecutor } from './idle-callback-executor';\nimport { PostMessageExecutor } from './post-message-executor';\n\ndeclare const global: {\n window?: any;\n};\n\nexport function makeExecutor(): IExecutor {\n try {\n if (global.window) {\n return new PostMessageExecutor();\n }\n } catch (e) {\n // ...\n }\n return new IdleCallbackExecutor();\n}\n","import { Actuator } from './actuator';\nimport { TaskQueue } from './task-queue';\nimport { Task } from './task';\nimport { getCurrentTime } from './utils';\nimport { lvAssert } from '../../assert';\nimport type { IExecutor } from '../executor/executor.interface';\nimport { makeExecutor } from '../executor/make-executor';\n\ndeclare const global: {\n navigator:\n | (Navigator & {\n scheduling?: {\n isInputPending?: () => boolean;\n };\n })\n | undefined;\n};\n\n/**\n * 调度器\n * 负责推动任务的执行,闲时和非闲时的处理\n */\nexport class Scheduler {\n private _isHostTimeoutScheduled: boolean = false;\n private _isHostCallbackScheduled: boolean = false;\n private _isWorking: boolean = false;\n private _enableInputPending: boolean = true;\n private readonly _executor: IExecutor = makeExecutor();\n\n private readonly _taskQueue: TaskQueue = new TaskQueue();\n private readonly _actuator: Actuator = new Actuator(this._taskQueue, this);\n\n public get taskQueue() {\n return this._taskQueue;\n }\n\n public get executor() {\n return this._executor;\n }\n\n /**\n * 是否需要让出事件给宿主\n */\n public shouldYieldToHost = (() => {\n try {\n if (global.navigator?.scheduling?.isInputPending !== undefined) {\n const { scheduling } = global.navigator;\n return (deadline: number) => {\n if (this._enableInputPending && scheduling.isInputPending!()) {\n // 当遇到inputPending时,认为需要释放时间片\n return true;\n }\n return getCurrentTime() >= deadline;\n };\n }\n } catch (e) {\n // ...\n }\n return (deadline: number) => {\n // 如果不考虑isInputPending的情况下\n // 当前时间已经超了,认为需要释放时间片,返回true\n return getCurrentTime() >= deadline;\n };\n })();\n\n /**\n * 设置是否开启InputPending\n */\n public setEnableInputPending(val: boolean) {\n this._enableInputPending = val;\n }\n\n /**\n * 调度器中添加任务\n */\n public addTask(task: Task) {\n const currentTime = getCurrentTime();\n if (task.getStartTime() > currentTime) {\n task.setSortIndex(task.getStartTime());\n this._taskQueue.timerTasks.insert(task);\n\n // 如果等待队列为空,延迟队列队首是该任务,进行延迟调度\n if (this._taskQueue.waitingTasks.peek() === null && task === this._taskQueue.timerTasks.peek()) {\n // 如果之前已经有延迟调度了,取消再重新延迟调度\n // 有可能之前延迟10s\n // 最新的任务只需要延迟3s\n if (this._isHostTimeoutScheduled) {\n this._executor.cancelHostTimeout();\n } else {\n this._isHostTimeoutScheduled = true;\n }\n this._executor.requestHostTimeout(this._handleHostTimeout, task.getStartTime() - currentTime);\n }\n } else {\n task.setSortIndex(task.getExpirationTime());\n this._taskQueue.waitingTasks.insert(task);\n\n // 如果当前没有在及时调度或者执行中,进行及时调度\n if (!this._isHostCallbackScheduled && !this._isWorking) {\n this._isHostCallbackScheduled = true;\n this._executor.requestHostCallback(this._handleHostCallback);\n }\n }\n }\n\n /**\n * 尝试启动异步任务调度\n */\n public requestHostTimeout(currentTime: number) {\n this._requestHostTimeout(currentTime);\n }\n\n private readonly _handleHostTimeout = () => {\n this._isHostTimeoutScheduled = false;\n const currentTime = getCurrentTime();\n this._taskQueue.advance(currentTime);\n\n if (this._isHostCallbackScheduled) {\n return;\n }\n\n if (this._taskQueue.waitingTasks.peek() !== null) {\n this._isHostCallbackScheduled = true;\n this._executor.requestHostCallback(this._handleHostCallback);\n return;\n }\n\n this._requestHostTimeout(currentTime);\n };\n\n private readonly _handleHostCallback = (\n hasTimeRemaining: boolean,\n initialTime: number,\n deadline: number,\n ) => {\n this._isHostCallbackScheduled = false;\n\n if (this._isHostTimeoutScheduled) {\n // 如果有异步任务调度中,直接取消,应该没必要了\n this._isHostTimeoutScheduled = false;\n this._executor.cancelHostTimeout();\n }\n\n // 进入work状态\n this._isWorking = true;\n try {\n return this._actuator.workLoop(hasTimeRemaining, initialTime, deadline);\n } finally {\n this._isWorking = false;\n }\n };\n\n private _requestHostTimeout(currentTime: number) {\n // 调用该函数时,一定不在及时调度和异步调度的状态中\n lvAssert(!this._isHostCallbackScheduled);\n lvAssert(!this._isHostTimeoutScheduled);\n const firstTimerTask = this._taskQueue.timerTasks.peek();\n if (firstTimerTask !== null) {\n this._isHostTimeoutScheduled = true;\n this._executor.requestHostTimeout(this._handleHostTimeout, firstTimerTask.getStartTime() - currentTime);\n }\n }\n}\n\n// 考虑到外界复杂的场景,不编译时构造,按需构造\nlet scheduler: Scheduler | undefined;\nexport function getScheduler() {\n if (!scheduler) {\n scheduler = new Scheduler();\n }\n return scheduler;\n}\n","import type { IDisposable } from '../dispose';\nimport { Task } from './core/task';\nimport { getTimeout, makeTask } from './core/utils';\nimport { getScheduler } from './core/scheduler';\nimport type { PriorityLevel } from './type';\n\nexport class CallbackToken implements IDisposable {\n constructor(private _task: Task) {}\n\n dispose() {\n this._task.clearCallback();\n }\n\n updatePriorityLevel(priorityLevel: PriorityLevel) {\n const callback = this._task.getCallback();\n if (!callback) {\n return;\n }\n this._task.clearCallback();\n const newTask = makeTask(callback, {\n priorityLevel,\n });\n const startTime = this._task.getStartTime();\n const timeout = getTimeout(priorityLevel);\n const expirationTime = startTime + timeout;\n newTask.setStartTime(startTime);\n newTask.setExpirationTime(expirationTime);\n getScheduler().addTask(newTask);\n this._task = newTask;\n }\n}\n","import { type IDisposable } from '../dispose';\nimport { getScheduler } from './core/scheduler';\nimport type { IOptions, IScheduledCallback, PriorityLevel } from './type';\nimport { makeTask } from './core/utils';\nimport { CallbackToken } from './callback-token';\n\nexport interface ILvCallbackToken extends IDisposable {\n /**\n * 更新优先级\n */\n updatePriorityLevel: (priorityLevel: PriorityLevel) => void;\n}\n\nexport function lvSchedulerCallback(callback: IScheduledCallback, options: IOptions = {}): ILvCallbackToken {\n const newTask = makeTask(callback, options);\n getScheduler().addTask(newTask);\n\n return new CallbackToken(newTask);\n}\n","class ListNode<T> {\n constructor(\n public value: T,\n public next: ListNode<T> | null = null,\n public prev: ListNode<T> | null = null,\n ) {}\n}\n\nexport class LinkedList<T> {\n protected _head: ListNode<T> | null = null;\n protected _tail: ListNode<T> | null = null;\n protected _count = 0;\n\n public get size(): number {\n return this._count;\n }\n\n public get firstNode(): ListNode<T> | null {\n return this._head;\n }\n\n public isEmpty(): boolean {\n return this._head === null;\n }\n\n public clear(): void {\n let current = this._head;\n while (current !== null) {\n const next = current.next;\n current.prev = null;\n current.next = null;\n current = next;\n }\n\n this._head = null;\n this._tail = null;\n this._count = 0;\n }\n\n public unshift(value: T): LinkedList<T> {\n const node = new ListNode(value);\n\n if (this.isEmpty()) {\n this._head = node;\n this._tail = node;\n } else {\n const oldHead = this._head;\n this._head = node;\n node.next = oldHead;\n oldHead!.prev = node;\n }\n\n this._count++;\n return this;\n }\n\n public push(value: T): LinkedList<T> {\n const node = new ListNode(value);\n\n if (this.isEmpty()) {\n this._head = node;\n this._tail = node;\n } else {\n const oldTail = this._tail;\n this._tail = node;\n node.prev = oldTail;\n oldTail!.next = node;\n }\n\n this._count++;\n return this;\n }\n\n public shift(): T | null {\n if (this.isEmpty()) {\n return null;\n }\n\n const node = this._head!;\n const value = node.value;\n this._remove(node);\n return value;\n }\n\n public pop(): T | null {\n if (this.isEmpty()) {\n return null;\n }\n\n const node = this._tail!;\n const value = node.value;\n this._remove(node);\n return value;\n }\n\n public toArray(): T[] {\n const result: T[] = [];\n for (const value of this) {\n result.push(value);\n }\n return result;\n }\n\n public *[Symbol.iterator](): Iterator<T> {\n let current = this._head;\n while (current !== null) {\n yield current.value;\n current = current.next;\n }\n }\n\n protected _remove(node: ListNode<T>): void {\n // 如果节点已经被移除(prev 和 next 都为 null),直接返回\n if (node.prev === null && node.next === null && node !== this._head && node !== this._tail) {\n return;\n }\n\n // 更新链表头尾指针\n if (node === this._head) {\n this._head = node.next;\n if (this._head) {\n this._head.prev = null;\n }\n }\n if (node === this._tail) {\n this._tail = node.prev;\n if (this._tail) {\n this._tail.next = null;\n }\n }\n\n // 更新相邻节点的引用\n if (node.prev) {\n node.prev.next = node.next;\n }\n if (node.next) {\n node.next.prev = node.prev;\n }\n\n // 清理被移除节点的引用\n node.prev = null;\n node.next = null;\n this._count--;\n }\n}\n","import { LinkedList } from '@/structure/linked-list';\n\nexport class DisposableLinkedList<T> extends LinkedList<T> {\n unshiftAndGetDisposableNode(value: T): () => void {\n this.unshift(value);\n\n const node = this._head!;\n let hasRemoved = false;\n return (): void => {\n if (!hasRemoved) {\n hasRemoved = true;\n super._remove(node);\n }\n };\n }\n\n pushAndGetDisposableNode(value: T): () => void {\n this.push(value);\n\n const node = this._tail!;\n let hasRemoved = false;\n return (): void => {\n if (!hasRemoved) {\n hasRemoved = true;\n super._remove(node);\n }\n };\n }\n}\n","/**\n * 针对未捕获的错误,异步抛出,不阻塞事件响应主流程\n * 默认模式\n */\nexport function asyncUnexpectedError(e: any): void {\n setTimeout(() => {\n throw e;\n }, 0);\n}\n\n/**\n * 针对未捕获的错误,同步抛出,阻塞事件响应主流程\n */\nexport function syncUnexpectedError(e: any): void {\n throw e;\n}\n\n/**\n * 针对未捕获的错误,静默掉,不进行处理\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function ignoreUnexpectedError(e: any): void {}\n","import { makeSafeDisposable } from '@/dispose';\nimport type { IDisposable } from '@/dispose';\nimport { DisposableLinkedList } from './disposable-linked-list';\nimport { asyncUnexpectedError } from './error-handler';\n\nexport interface EmitterOptions {\n onAddListener?: (...args: any) => any;\n onRemoveListener?: (...args: any) => any;\n onListenerError?: (e: any) => void;\n}\n\n//\n// 事件监听中的回调实体\n//\nclass Listener<TArgs extends any[]> {\n private readonly _callback: (...args: TArgs) => void;\n private readonly _callbackThis: any | undefined;\n\n constructor(callback: (...args: TArgs) => void, callbackThis: any | undefined) {\n this._callback = callback;\n this._callbackThis = callbackThis;\n }\n\n invoke(...args: TArgs): void {\n this._callback.call(this._callbackThis, ...args);\n }\n}\n\n//\n// 存放在EventDeliveryQueue中的元素\n//\nclass EventDeliveryQueueElement<TArgs extends any[]> {\n readonly emitter: Emitter<TArgs>;\n readonly listener: Listener<TArgs>;\n readonly event: TArgs;\n constructor(emitter: Emitter<TArgs>, listener: Listener<TArgs>, event: TArgs) {\n this.emitter = emitter;\n this.listener = listener;\n this.event = event;\n }\n}\n\nexport class EventDeliveryQueue {\n protected _queue = new DisposableLinkedList<EventDeliveryQueueElement<any>>();\n\n constructor(private readonly _onListenerError: (e: unknown) => void = asyncUnexpectedError) {}\n\n get size(): number {\n return this._queue.size;\n }\n\n push<TArgs extends any[]>(emitter: Emitter<TArgs>, listener: Listener<TArgs>, event: TArgs): void {\n this._queue.push(new EventDeliveryQueueElement(emitter, listener, event));\n }\n\n clear<TArgs extends any[]>(emitter: Emitter<TArgs>): void {\n const newQueue = new DisposableLinkedList<EventDeliveryQueueElement<TArgs>>();\n for (const element of this._queue) {\n if (element.emitter !== emitter) {\n newQueue.push(element);\n }\n }\n this._queue = newQueue;\n }\n\n deliver(): void {\n while (this._queue.size > 0) {\n const element = this._queue.shift()!;\n try {\n element.listener.invoke(...element.event);\n } catch (e) {\n this._onListenerError(e);\n }\n }\n }\n}\n\nexport interface Event<T extends any[]> {\n (listener: (...args: T) => any, thisArgs?: any): IDisposable;\n}\n\nexport class Emitter<TArgs extends any[]> {\n protected _listeners?: DisposableLinkedList<Listener<TArgs>>;\n private readonly _options?: EmitterOptions;\n private _disposed = false;\n private _event?: Event<TArgs>;\n private _deliveryQueue?: EventDeliveryQueue;\n\n constructor(options?: EmitterOptions) {\n this._options = options;\n }\n\n get event(): Event<TArgs> {\n if (this._event) {\n return this._event;\n }\n\n this._event = (callback: (...args: TArgs) => any, thisArgs?: any): IDisposable => {\n const listener = new Listener(callback, thisArgs);\n\n if (!this._listeners) {\n this._listeners = new DisposableLinkedList();\n }\n\n const removeListener = this._listeners.pushAndGetDisposableNode(listener);\n\n if (this._options?.onAddListener) {\n this._options.onAddListener(this, callback, thisArgs);\n }\n\n // 生成可销毁函数返回\n const result = () => {\n if (!this._disposed) {\n removeListener();\n if (this._options?.onRemoveListener) {\n this._options.onRemoveListener(this, callback, thisArgs);\n }\n }\n };\n\n return makeSafeDisposable(result);\n };\n\n return this._event;\n }\n\n dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners?.clear();\n this._deliveryQueue?.clear(this);\n }\n\n fire(...event: TArgs): void {\n if (!this._listeners || this._listeners.size === 0) {\n return;\n }\n // 绝大部分场景事件只会有一个监听器,针对性进行性能优化,没必要构造DeliveryQueue结构\n if (this._listeners.size === 1) {\n const listener = this._listeners.firstNode!;\n try {\n listener.value.invoke(...event);\n } catch (e) {\n if (this._options?.onListenerError) {\n this._options.onListenerError(e);\n } else {\n asyncUnexpectedError(e);\n }\n }\n return;\n }\n\n this._deliveryQueue ??= new EventDeliveryQueue(this._options?.onListenerError);\n\n for (const listener of this._listeners) {\n this._deliveryQueue.push(this, listener, event);\n }\n this._deliveryQueue.deliver();\n }\n}\n","import type { Event } from './emitter';\nimport type { IDisposable } from '@/dispose';\n\n// 辅助能力:只监听某个事件一次\nexport function listenOnce<TArgs extends any[]>(event: Event<TArgs>): Event<TArgs> {\n return (listener, thisArgs = null) => {\n let didFire = false;\n // 必须这样写,事件可能同步触发\n // eslint-disable-next-line no-undef-init\n let result: IDisposable | undefined = undefined;\n result = event((...args) => {\n if (didFire) {\n return;\n } else if (result) {\n result.dispose();\n } else {\n didFire = true;\n }\n\n return listener.call(thisArgs, ...args);\n }, null);\n\n if (didFire) {\n result.dispose();\n }\n\n return result;\n };\n}\n","import { lvSchedulerCallback, PriorityLevel } from '@/scheduler';\nimport type { IDisposable } from '@/dispose';\nimport { Emitter, type Event } from '@/event';\n\n//\n// 容器类型,存放一个可以延迟初始化的值\n//\nexport class IdleValue<T> implements IDisposable {\n private readonly _executor: () => void;\n private readonly _handle: IDisposable;\n private _executorEmitter?: Emitter<[]>;\n\n private _didRun = false;\n private _value?: T;\n private _error: unknown;\n\n constructor(executor: () => T) {\n this._executor = () => {\n try {\n this._value = executor();\n } catch (err) {\n this._error = err;\n throw err;\n } finally {\n this._didRun = true;\n if (this._value && this._executorEmitter) {\n this._executorEmitter.fire();\n }\n }\n };\n this._handle = lvSchedulerCallback(() => this._executor(), {\n priorityLevel: PriorityLevel.IdlePriority,\n });\n }\n\n get value(): T {\n // 如果没有run过,dispose之后再立刻执行\n if (!this._didRun) {\n this._handle.dispose();\n this._executor();\n }\n if (this._error) {\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw this._error;\n }\n return this._value!;\n }\n\n get isInitialized(): boolean {\n return this._didRun;\n }\n\n get onExecutor(): Event<[]> {\n if (!this._executorEmitter) {\n this._executorEmitter = new Emitter<[]>();\n }\n return this._executorEmitter.event;\n }\n\n dispose(): void {\n this._handle.dispose();\n }\n}\n","class Node<K, T> {\n readonly incoming = new Map<K, Node<K, T>>();\n readonly outgoing = new Map<K, Node<K, T>>();\n\n constructor(\n public key: K,\n public data: T,\n ) {}\n}\n\nexport class Graph<K, T> {\n private readonly _nodes = new Map<K, Node<K, T>>();\n\n constructor(private readonly _hashFn: (element: T) => K) {}\n\n // 寻找所有的叶子节点\n public leafs(): Node<K, T>[] {\n const ret: Node<K, T>[] = [];\n for (const node of this._nodes.values()) {\n if (node.outgoing.size === 0) {\n ret.push(node);\n }\n }\n return ret;\n }\n\n // 插入一条边\n public insertEdge(from: T, to: T): void {\n const fromNode = this.lookupOrInsertNode(from);\n const toNode = this.lookupOrInsertNode(to);\n\n fromNode.outgoing.set(toNode.key, toNode);\n toNode.incoming.set(fromNode.key, fromNode);\n }\n\n // 移除某个节点\n public removeNode(data: T): void {\n const key = this._hashFn(data);\n this._nodes.delete(key);\n for (const node of this._nodes.values()) {\n node.outgoing.delete(key);\n node.incoming.delete(key);\n }\n }\n\n // 查找某个节点\n public lookup(data: T): Node<K, T> | undefined {\n return this._nodes.get(this._hashFn(data));\n }\n\n // 查找某个节点,不存在则插入\n public lookupOrInsertNode(data: T): Node<K, T> {\n const key = this._hashFn(data);\n let node = this._nodes.get(key);\n\n if (!node) {\n node = new Node(key, data);\n this._nodes.set(key, node);\n }\n\n return node;\n }\n\n public isEmpty(): boolean {\n return this._nodes.size === 0;\n }\n\n public toString(): string {\n const data: string[] = [];\n for (const [key, value] of this._nodes) {\n data.push(\n `${key}\\n\\t(-> incoming)[${[...value.incoming.keys()].join(', ')}]\\n\\t(outgoing ->)[${[\n ...value.outgoing.keys(),\n ].join(',')}]\\n`,\n );\n }\n return data.join('\\n');\n }\n\n public findCycleSlow() {\n for (const [id, node] of this._nodes) {\n const seen = new Set<K>([id]);\n const res = this._findCycle(node, seen);\n if (res) {\n return res;\n }\n }\n return undefined;\n }\n\n private _findCycle(node: Node<K, T>, seen: Set<K>): string | undefined {\n for (const [id, outgoing] of node.outgoing) {\n if (seen.has(id)) {\n return [...seen, id].join(' -> ');\n }\n seen.add(id);\n const value = this._findCycle(outgoing, seen);\n if (value) {\n return value;\n }\n seen.delete(id);\n }\n return undefined;\n }\n}\n","import type { ServiceIdentifier } from './base';\nimport { SyncDescriptor } from './descriptor';\nimport { ServiceOwnershipCollection } from './service-ownership-collection';\n//\n// 服务的集合\n// key 服务ID\n// value 服务的描述符或者是实例\n//\nexport type IServiceCollection = {\n entries?: [ServiceIdentifier<any>, any][];\n ownership?: ServiceOwnershipCollection;\n};\n\nexport class ServiceCollection {\n private readonly _entries = new Map<ServiceIdentifier<any>, any>();\n private readonly _ownership: ServiceOwnershipCollection | undefined;\n\n constructor(options?: IServiceCollection) {\n for (const [id, service] of options?.entries || []) {\n this.set(id, service);\n }\n if (options?.ownership) {\n this._ownership = options.ownership;\n }\n }\n\n get entries() {\n return this._entries;\n }\n\n get ownerships() {\n return this._ownership?.entries;\n }\n\n set<T>(id: ServiceIdentifier<T>, instanceOrDescriptor: T | SyncDescriptor<T>) {\n this._entries.set(id, instanceOrDescriptor);\n }\n\n has(id: ServiceIdentifier<any>): boolean {\n return this._entries.has(id);\n }\n\n get<T>(id: ServiceIdentifier<T>): T | SyncDescriptor<T> {\n return this._entries.get(id);\n }\n}\n","import { listenOnce } from '@/event';\nimport type { IdleValue } from './idle-value';\n\n//\n// 快速生成一个di proxy对象,用于di中的延迟初始化能力\n// 依赖idleValue容器\n//\nexport function makeProxy<T>(valueWrapper: IdleValue<T>, ctor: any) {\n const wrapper = Object.create(null);\n const result = new Proxy(wrapper, {\n get(target: any, key: PropertyKey): any {\n if (key in target) {\n return target[key];\n }\n\n const obj = valueWrapper.value as any;\n let prop = obj[key];\n if (typeof prop !== 'function') {\n return prop;\n }\n prop = prop.bind(obj);\n target[key] = prop;\n return prop;\n },\n set(_target: T, p: PropertyKey, value: any): boolean {\n const obj = valueWrapper.value as any;\n obj[p] = value;\n return true;\n },\n }) as T;\n // @ts-ignore\n wrapper.__originClass__ = ctor;\n listenOnce(valueWrapper.onExecutor)(() => {\n // @ts-ignore\n wrapper.__origin__ = valueWrapper.value;\n });\n return result as T;\n}\n","import type { ServiceIdentifier } from './base';\n\nenum TraceType {\n None = 0,\n Creation = 1,\n Invocation = 2,\n Branch = 3,\n}\n\nexport class Trace {\n static all = new Set<string>();\n\n private static readonly _None = new (class extends Trace {\n constructor() {\n super(TraceType.None, null);\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n override stop() {}\n override branch() {\n return this;\n }\n })();\n\n static traceInvocation(_enableTracing: boolean, ctor: any): Trace {\n return !_enableTracing\n ? Trace._None\n : new Trace(TraceType.Invocation, ctor.name || new Error().stack!.split('\\n').slice(3, 4).join('\\n'));\n }\n\n static traceCreation(_enableTracing: boolean, ctor: any): Trace {\n return !_enableTracing ? Trace._None : new Trace(TraceType.Creation, ctor.name);\n }\n\n private static _totals = 0;\n private readonly _start: number = Date.now();\n private readonly _dep: [ServiceIdentifier<any>, boolean, Trace?][] = [];\n private readonly _type: TraceType;\n private readonly _name: string | null;\n\n private constructor(type: TraceType, name: string | null) {\n this._type = type;\n this._name = name;\n }\n\n branch(id: ServiceIdentifier<any>, first: boolean): Trace {\n const child = new Trace(TraceType.Branch, id.toString());\n this._dep.push([id, first, child]);\n return child;\n }\n\n stop() {\n const dur = Date.now() - this._start;\n Trace._totals += dur;\n\n let causedCreation = false;\n\n function printChild(n: number, trace: Trace) {\n const res: string[] = [];\n const prefix = new Array(n + 1).join('\\t');\n for (const [id, first, child] of trace._dep) {\n if (first && child) {\n causedCreation = true;\n res.push(`${prefix}CREATES -> ${id}`);\n const nested = printChild(n + 1, child);\n if (nested) {\n res.push(nested);\n }\n } else {\n res.push(`${prefix}uses -> ${id}`);\n }\n }\n return res.join('\\n');\n }\n\n const lines = [\n `${this._type === TraceType.Creation ? 'CREATE' : 'CALL'} ${this._name}`,\n `${printChild(1, this)}`,\n `DONE, took ${dur.toFixed(2)}ms (grand total ${Trace._totals.toFixed(2)}ms)`,\n ];\n\n if (dur > 2 || causedCreation) {\n Trace.all.add(lines.join('\\n'));\n }\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { IdleValue } from './idle-value';\nimport type { SyncDescriptor0 } from './descriptor';\nimport { SyncDescriptor } from './descriptor';\nimport { Graph } from '../structure/graph';\nimport { ServiceCollection } from './service-collection';\nimport { makeProxy } from './proxy-builder';\nimport type { ServiceIdentifier, ServicesAccessor } from './base';\nimport { getServiceDependencies } from './base';\nimport type { GetLeadingNonServiceArgs } from './instantiation-service.interface';\nimport { IInstantiationService } from './instantiation-service.interface';\nimport { Trace } from './trace';\nimport { Emitter, type Event } from '../event';\nimport { Logger } from '@/_internal/logger';\nimport { isDisposable, SET_PARENT_OF_DISPOSABLE } from '@/dispose';\nimport { ServiceOwnership } from './service-ownership-collection';\n\n// 依赖图\ntype DepGraph = Graph<string, any>;\n\n// TRACING\nconst _enableAllTracing = false;\n// || \"TRUE\" // DO NOT CHECK IN!\nclass CyclicDependencyError extends Error {\n constructor(graph: DepGraph) {\n super('cyclic dependency between services');\n this.message = graph.findCycleSlow() ?? `UNABLE to detect cycle, dumping graph: \\n${graph.toString()}`;\n }\n}\n\nexport enum InstantiationErrorType {\n UnknownDependency = 'UnknownDependency',\n}\ninterface IBaseErrorEvent {\n errorType: InstantiationErrorType;\n message: string;\n}\n\ninterface IUnknownDependencyErrorEvent extends IBaseErrorEvent {\n errorType: InstantiationErrorType.UnknownDependency;\n dependencyId: string;\n issuer: string;\n}\n\ntype ErrorDataType = IUnknownDependencyErrorEvent;\n\n/**\n * 从容器中获取对应的service\n * @param instantiationService \n * @param id \n * @returns Service<T>\n * \n * @remarks 减少使用该方法,尽量将业务函数作为invokeFunction的参数,从accessor中获取你所期望的service\n */\nexport function getService<T>(instantiationService: IInstantiationService, id: ServiceIdentifier<T>) {\n return instantiationService.invokeFunction((accessor) => {\n return accessor.get(id);\n });\n}\n\nexport class InstantiationService implements IInstantiationService {\n readonly _serviceBrand: undefined;\n // 全局依赖图,开启tracing才会生成,整个instantiationSerive父子链上只会有一个globalGraph\n readonly _globalGraph?: DepGraph;\n // 该instantiationService所包含的服务集合\n private readonly _services: ServiceCollection;\n // 父instantiationService\n private readonly _parent?: InstantiationService;\n private readonly _childs = new Set<IInstantiationService>();\n // 是否开启tracing\n private readonly _enableTracing: boolean;\n // 隐式依赖\n private _globalGraphImplicitDependency?: string;\n // 记录当前正在创建的服务,防止循环依赖\n private readonly _activeInstantiations = new Set<ServiceIdentifier<any>>();\n\n private _emitter: Emitter<[ErrorDataType]> | null = null;\n\n constructor(\n services: ServiceCollection = new ServiceCollection(),\n parent?: InstantiationService,\n enableTracing: boolean = _enableAllTracing,\n ) {\n this._services = services;\n this._services.set(IInstantiationService, this);\n\n this._parent = parent;\n if (this._parent) {\n // 建立父子关系\n this._parent._childs.add(this);\n }\n\n this._enableTracing = enableTracing;\n if (enableTracing) {\n this._globalGraph = parent?._globalGraph ?? new Graph((e) => e);\n }\n }\n\n get services(): ServiceCollection {\n return this._services;\n }\n\n // 仅限 Flow 调用\n get onError(): Event<[ErrorDataType]> {\n if (!this._emitter) {\n this._emitter = new Emitter<[ErrorDataType]>();\n }\n return this._emitter.event;\n }\n\n // 创建子instantiationService\n createChild(services: ServiceCollection): IInstantiationService {\n return new InstantiationService(services, this, this._enableTracing);\n }\n\n // 提供通过instantiationService直接获取到内部服务的能力\n // 返回servicesAccessor这一视图类,并不暴露instantiationService内部接口\n invokeFunction<R, TS extends any[] = []>(\n fn: (accessor: ServicesAccessor, ...args: TS) => R,\n ...args: TS\n ): R {\n const _trace = Trace.traceInvocation(this._enableTracing, fn);\n let _done = false;\n try {\n const accessor: ServicesAccessor = {\n get: <T>(id: ServiceIdentifier<T>) => {\n if (_done) {\n throw new Error('service accessor is only valid during the invocation of its target method');\n }\n\n const result = this._getOrCreateServiceInstance(id, _trace);\n if (!result) {\n this._handleError({\n errorType: InstantiationErrorType.UnknownDependency,\n issuer: 'service-accessor',\n dependencyId: `${id}`,\n message: `[invokeFunction] unknown service '${id}'`,\n });\n }\n return result;\n },\n };\n return fn(accessor, ...args);\n } finally {\n _done = true;\n _trace.stop();\n }\n }\n\n // 通过描述符创建一个实例\n createInstance<T>(descriptor: SyncDescriptor0<T>): T;\n // 通过构造函数直接创建一个实例\n createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(\n ctor: Ctor,\n ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>\n ): R;\n createInstance<T, Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(\n descriptor: SyncDescriptor<T>,\n ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>\n ): R;\n createInstance(ctorOrDescriptor: any | SyncDescriptor<any>, ...rest: any[]): any {\n let _trace: Trace, result: any;\n if (ctorOrDescriptor instanceof SyncDescriptor) {\n _trace = Trace.traceCreation(this._enableTracing, ctorOrDescriptor.ctor);\n result = this._createInstance(\n ctorOrDescriptor.ctor,\n ctorOrDescriptor.staticArguments.concat(rest),\n _trace,\n );\n } else {\n _trace = Trace.traceCreation(this._enableTracing, ctorOrDescriptor);\n result = this._createInstance(ctorOrDescriptor, rest, _trace);\n }\n _trace.stop();\n return result;\n }\n\n dispose() {\n // 子容器进行dispose\n for (const child of this._childs) {\n child.dispose();\n }\n\n // 断开父容器\n this._parent?._childs.delete(this);\n\n // 内部服务进行清理\n for (const [identifier, instanceOrDescriptor] of this._services.entries) {\n if (instanceOrDescriptor instanceof SyncDescriptor) {\n continue;\n }\n if (instanceOrDescriptor === this) {\n continue;\n }\n if (instanceOrDescriptor.__origin__ === this) {\n continue;\n }\n if (isDisposable(instanceOrDescriptor)) {\n const ownerShip = this._services.ownerships?.get(identifier);\n\n // eslint-disable-next-line max-depth\n switch (ownerShip) {\n case ServiceOwnership.Reference:\n // skip dispose..\n break;\n case ServiceOwnership.Owned:\n default:\n instanceOrDescriptor.dispose();\n break;\n }\n }\n }\n }\n\n // 创建实例\n private _createInstance<T>(ctor: any, args: any[] = [], _trace: Trace): T {\n // 获取服务构造中的依赖情况,按参数顺序排列\n const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n const serviceArgs: any[] = [];\n // 先构造依赖的服务\n for (const dependency of serviceDependencies) {\n const service = this._getOrCreateServiceInstance(dependency.id, _trace);\n if (!service) {\n this._handleError({\n errorType: InstantiationErrorType.UnknownDependency,\n issuer: `create-instance-${ctor.name}`,\n dependencyId: `${dependency.id}`,\n message: `[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id}.`,\n });\n }\n serviceArgs.push(service);\n }\n\n // 找到第一个服务的参数\n const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n // 如果参数不匹配,调整静态参数位置\n if (args.length !== firstServiceArgPos) {\n Logger.trace(\n `[createInstance] First service dependency of ${ctor.name} at position ${\n firstServiceArgPos + 1\n } conflicts with ${args.length} static arguments`,\n );\n\n const delta = firstServiceArgPos - args.length;\n if (delta > 0) {\n args = args.concat(new Array(delta));\n } else {\n args = args.slice(0, firstServiceArgPos);\n }\n }\n\n // 通过createInstance明确指定的服务一定是立刻创建\n return Reflect.construct<any, T>(ctor, args.concat(serviceArgs));\n }\n\n // 保存服务实例\n private _setServiceInstance<T>(id: ServiceIdentifier<T>, instance: T): void {\n if (this._services.get(id) instanceof SyncDescriptor) {\n this._services.set(id, instance);\n } else if (this._parent) {\n this._parent._setServiceInstance(id, instance);\n } else {\n throw new Error('illegalState - setting UNKNOWN service instance');\n }\n }\n\n // 获取服务实例或者描述符\n private _getServiceInstanceOrDescriptor<T>(id: ServiceIdentifier<T>): T | SyncDescriptor<T> {\n const instanceOrDesc = this._services.get(id);\n if (!instanceOrDesc && this._parent) {\n return this._parent._getServiceInstanceOrDescriptor(id);\n } else {\n return instanceOrDesc;\n }\n }\n\n // 获取服务实例,没有的话就创建\n private _getOrCreateServiceInstance<T>(id: ServiceIdentifier<T>, _trace: Trace): T {\n if (this._globalGraph && this._globalGraphImplicitDependency) {\n this._globalGraph.insertEdge(this._globalGraphImplicitDependency, String(id));\n }\n const thing = this._getServiceInstanceOrDescriptor(id);\n if (thing instanceof SyncDescriptor) {\n return this._safeCreateAndCacheServiceInstance(id, thing, _trace.branch(id, true));\n } else {\n _trace.branch(id, false);\n return thing;\n }\n }\n\n // 安全的创建并且记录在缓存中\n private _safeCreateAndCacheServiceInstance<T>(\n id: ServiceIdentifier<T>,\n desc: SyncDescriptor<T>,\n _trace: Trace,\n ): T {\n if (this._activeInstantiations.has(id)) {\n throw new Error(`illegal state - RECURSIVELY instantiating service '${id}'`);\n }\n this._activeInstantiations.add(id);\n try {\n return this._createAndCacheServiceInstance(id, desc, _trace);\n } finally {\n this._activeInstantiations.delete(id);\n }\n }\n\n // 非安全创建并记录在缓存中\n // 核心方法,服务创建的最基础流程\n private _createAndCacheServiceInstance<T>(\n id: ServiceIdentifier<T>,\n desc: SyncDescriptor<T>,\n _trace: Trace,\n ): T {\n type Triple = {\n id: ServiceIdentifier<any>;\n desc: SyncDescriptor<any>;\n _trace: Trace;\n };\n // 记录一个临时依赖图\n const graph = new Graph<string, Triple>((data) => data.id.toString());\n\n let cycleCount = 0;\n // dfs\n const stack = [{ id, desc, _trace }];\n while (stack.length) {\n const item = stack.pop()!;\n graph.lookupOrInsertNode(item);\n\n // a weak but working heuristic for cycle checks\n if (cycleCount++ > 1000) {\n throw new CyclicDependencyError(graph);\n }\n\n // 检查所有依赖项,并添加记录\n // check all dependencies for existence and if they need to be created first\n for (const dependency of getServiceDependencies(item.desc.ctor)) {\n const instanceOrDesc = this._getServiceInstanceOrDescriptor(dependency.id);\n if (!instanceOrDesc) {\n this._handleError({\n errorType: InstantiationErrorType.UnknownDependency,\n issuer: `create-service-${id}`,\n dependencyId: `${dependency.id}`,\n message: `[createInstance] ${id} depends on ${dependency.id} which is NOT registered.`,\n });\n }\n\n // 全局的依赖图中需要添加\n this._globalGraph?.insertEdge(String(item.id), String(dependency.id));\n\n if (instanceOrDesc instanceof SyncDescriptor) {\n const d = {\n id: dependency.id,\n desc: instanceOrDesc,\n _trace: item._trace.branch(dependency.id, true),\n };\n // 当依赖没有初始化为实例,仍然是描述符式,添加到临时依赖图\n graph.insertEdge(item, d);\n stack.push(d);\n }\n }\n }\n\n // 将临时依赖图(只有描述符)初始化成服务实例\n while (true) {\n // 找到图的根节点集合\n const leafs = graph.leafs();\n\n // 临时依赖图中含有节点,但是没有叶子节点,意味着有循环依赖\n if (leafs.length === 0) {\n if (!graph.isEmpty()) {\n throw new CyclicDependencyError(graph);\n }\n break;\n }\n\n // 迭代子节点\n for (const { data } of leafs) {\n const instanceOrDesc = this._getServiceInstanceOrDescriptor(data.id);\n // 一定要重复检查,因为data可能会有重复的(某个服务被多个服务依赖)\n if (instanceOrDesc instanceof SyncDescriptor) {\n const instance = this._createServiceInstanceWithOwner(\n data.id,\n data.desc.ctor,\n data.desc.staticArguments,\n data.desc.supportsDelayedInstantiation,\n data._trace,\n );\n this._setServiceInstance(data.id, instance);\n }\n graph.removeNode(data);\n }\n }\n // 一定返回的是实例\n return this._getServiceInstanceOrDescriptor(id) as T;\n }\n\n // 创建服务实例(会判断在哪层instantiation中判断)\n private _createServiceInstanceWithOwner<T>(\n id: ServiceIdentifier<T>,\n ctor: any,\n args: any[] = [],\n supportsDelayedInstantiation: boolean,\n _trace: Trace,\n ): T {\n // 如果注册在本层,就在本层创建\n if (this._services.get(id) instanceof SyncDescriptor) {\n return this._createServiceInstance(id, ctor, args, supportsDelayedInstantiation, _trace);\n } else if (this._parent) {\n // 本层没有尝试去上层找\n return this._parent._createServiceInstanceWithOwner(\n id,\n ctor,\n args,\n supportsDelayedInstantiation,\n _trace,\n );\n } else {\n throw new Error(`illegalState - creating UNKNOWN service instance ${ctor.name}`);\n }\n }\n\n // 准备创建服务实例\n private _createServiceInstance<T>(\n id: ServiceIdentifier<T>,\n ctor: any,\n args: any[] = [],\n supportsDelayedInstantiation: boolean,\n _trace: Trace,\n ): T {\n // 如果不支持延迟初始化,走同步逻辑\n if (!supportsDelayedInstantiation) {\n return this._createService(ctor, args, _trace);\n }\n // 使用IdleValue容器包装真正的对象,按需要进行初始化\n const idle = new IdleValue<T>(() => this._createService<T>(ctor, args, _trace));\n // 实现了一个proxy\n // 当真正需要的时候,才会去构造\n return makeProxy(idle, ctor);\n }\n\n // 创建服务\n private _createService<T>(ctor: any, args: any[] = [], _trace: Trace): T {\n // 通过createInstance明确指定的服务一定是立刻创建\n const service = this._createInstance<T>(ctor, args, _trace);\n if (isDisposable(service)) {\n SET_PARENT_OF_DISPOSABLE(service, this);\n }\n return service;\n }\n\n // 处理错误\n private _handleError(errorData: ErrorDataType) {\n // 错误统一上报到顶层容器\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let topInstantiationService: InstantiationService = this;\n while (topInstantiationService._parent) {\n topInstantiationService = topInstantiationService._parent;\n }\n // 触发顶层容器的错误监听\n if (topInstantiationService._emitter) {\n topInstantiationService._emitter.fire(errorData);\n }\n\n throw new Error(errorData.message);\n }\n}\n","import { SyncDescriptor, IInstantiationService, createDecorator } from '@/di';\nimport type { ServiceCollection, BrandedService, ServiceIdentifier } from '@/di';\n\nimport { IContainerService } from '@/di';\n\n/**\n 【动态依赖服务】\n 支持为子容器创建一块动态依赖的构建空间.\n 动态创建出来的服务可以依赖到自身的静态依赖服务, 反之不被允许。\n 子容器可以借助动态层完成一些【多容器间公共依赖】的抽离.可以理解为为了减少静态依赖图在多层设计应用时过于繁琐的一种简化手段.\n -----------------------------\n | InstantiationService |\n -----------------------------\n ↑ lookup service ↑\n -----------------------------\n | DynamicDependencyService |\n -----------------------------\n ↑ lookup service ↑\n -----------------------------\n | ChildContainerService |\n -----------------------------\n */\nexport interface IDynamicDependencyService extends IInstantiationService {\n readonly _serviceBrand: undefined;\n\n /**\n * 创建子容器\n */\n createChild: (services: ServiceCollection) => IContainerService;\n\n /**\n * 动态注册 service\n * 重复注册会抛弃后面的服务\n * */\n register: <T, Services extends BrandedService[]>(\n id: ServiceIdentifier<T>,\n ctorOrDescriptor: { new (...services: Services): T } | SyncDescriptor<any>,\n ) => void;\n\n /**\n * containerService支持销毁,子containerService都会进行dispose\n */\n dispose: () => void;\n}\n\nexport const IDynamicDependencyService = createDecorator<IDynamicDependencyService>(\n 'dynamic-dependency-service',\n);\n","import { SyncDescriptor, ServiceCollection, InstantiationService } from '@/di';\nimport type { BrandedService, ServiceIdentifier } from '@/di';\n\nimport { IContainerService, ContainerService } from '@/di';\n\nexport class DynamicDependencyService extends ContainerService {\n private readonly _servicesCollection: ServiceCollection;\n\n constructor(@IContainerService _containerService: InstantiationService | ContainerService) {\n const collection = new ServiceCollection();\n super(collection, _containerService);\n\n this._servicesCollection = collection;\n }\n\n register<T, Services extends BrandedService[]>(\n id: ServiceIdentifier<T>,\n ctorOrDescriptor: { new (...services: Services): T } | SyncDescriptor<any>,\n ) {\n if (this._servicesCollection.has(id)) {\n return;\n }\n\n // 无论是构造函数还是描述符,最终加入到registry中的都会转为描述符\n if (!(ctorOrDescriptor instanceof SyncDescriptor)) {\n ctorOrDescriptor = new SyncDescriptor<T>(ctorOrDescriptor as new (...args: any[]) => T, []);\n }\n\n this._servicesCollection.set(id, ctorOrDescriptor);\n }\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { S as ServiceIdentifier, a as SyncDescriptor, B as BrandedService, e as ServiceOwnershipCollection, f as ServiceOwnership, b as ServiceCollection } from './instantiation-service.interface-bshqO0aS.cjs';
|
|
2
|
+
|
|
3
|
+
declare enum InstantiationType {
|
|
4
|
+
Eager = 0,
|
|
5
|
+
Delayed = 1
|
|
6
|
+
}
|
|
7
|
+
interface IServiceRegistryConfig {
|
|
8
|
+
checkDuplicate?: boolean;
|
|
9
|
+
}
|
|
10
|
+
declare class ServiceRegistry {
|
|
11
|
+
protected readonly _registry: [ServiceIdentifier<any>, SyncDescriptor<any> | BrandedService][];
|
|
12
|
+
protected readonly _serviceOwnership: ServiceOwnershipCollection;
|
|
13
|
+
private readonly _ids;
|
|
14
|
+
private readonly _checkDuplicate;
|
|
15
|
+
constructor(config?: IServiceRegistryConfig);
|
|
16
|
+
get registry(): [ServiceIdentifier<any>, BrandedService | SyncDescriptor<any>][];
|
|
17
|
+
/**
|
|
18
|
+
* 注册服务,通过传入构造函数或者描述符
|
|
19
|
+
*/
|
|
20
|
+
register<T, Services extends BrandedService[]>(id: ServiceIdentifier<T>, ctor: new (...services: Services) => T, supportsDelayedInstantiation?: boolean | InstantiationType): void;
|
|
21
|
+
register<T, Services extends BrandedService[]>(id: ServiceIdentifier<T>, descriptor: SyncDescriptor<any>): void;
|
|
22
|
+
/**
|
|
23
|
+
* 直接注册一个服务的实例
|
|
24
|
+
*
|
|
25
|
+
* 注意:谨慎使用,优先使用register
|
|
26
|
+
* 一般用于特殊场景:需要先于DI之前就构造了某个service
|
|
27
|
+
*/
|
|
28
|
+
registerInstance<T extends BrandedService>(id: ServiceIdentifier<T>, instance: T, options?: {
|
|
29
|
+
ownership: ServiceOwnership;
|
|
30
|
+
}): void;
|
|
31
|
+
makeCollection(): ServiceCollection;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
type LazyService<T> = {
|
|
35
|
+
readonly _serviceBrand: undefined;
|
|
36
|
+
getInstance: () => Promise<T>;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export { type LazyService as L, ServiceRegistry as S };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { S as ServiceIdentifier, a as SyncDescriptor, B as BrandedService, e as ServiceOwnershipCollection, f as ServiceOwnership, b as ServiceCollection } from './instantiation-service.interface-bshqO0aS.js';
|
|
2
|
+
|
|
3
|
+
declare enum InstantiationType {
|
|
4
|
+
Eager = 0,
|
|
5
|
+
Delayed = 1
|
|
6
|
+
}
|
|
7
|
+
interface IServiceRegistryConfig {
|
|
8
|
+
checkDuplicate?: boolean;
|
|
9
|
+
}
|
|
10
|
+
declare class ServiceRegistry {
|
|
11
|
+
protected readonly _registry: [ServiceIdentifier<any>, SyncDescriptor<any> | BrandedService][];
|
|
12
|
+
protected readonly _serviceOwnership: ServiceOwnershipCollection;
|
|
13
|
+
private readonly _ids;
|
|
14
|
+
private readonly _checkDuplicate;
|
|
15
|
+
constructor(config?: IServiceRegistryConfig);
|
|
16
|
+
get registry(): [ServiceIdentifier<any>, BrandedService | SyncDescriptor<any>][];
|
|
17
|
+
/**
|
|
18
|
+
* 注册服务,通过传入构造函数或者描述符
|
|
19
|
+
*/
|
|
20
|
+
register<T, Services extends BrandedService[]>(id: ServiceIdentifier<T>, ctor: new (...services: Services) => T, supportsDelayedInstantiation?: boolean | InstantiationType): void;
|
|
21
|
+
register<T, Services extends BrandedService[]>(id: ServiceIdentifier<T>, descriptor: SyncDescriptor<any>): void;
|
|
22
|
+
/**
|
|
23
|
+
* 直接注册一个服务的实例
|
|
24
|
+
*
|
|
25
|
+
* 注意:谨慎使用,优先使用register
|
|
26
|
+
* 一般用于特殊场景:需要先于DI之前就构造了某个service
|
|
27
|
+
*/
|
|
28
|
+
registerInstance<T extends BrandedService>(id: ServiceIdentifier<T>, instance: T, options?: {
|
|
29
|
+
ownership: ServiceOwnership;
|
|
30
|
+
}): void;
|
|
31
|
+
makeCollection(): ServiceCollection;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
type LazyService<T> = {
|
|
35
|
+
readonly _serviceBrand: undefined;
|
|
36
|
+
getInstance: () => Promise<T>;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export { type LazyService as L, ServiceRegistry as S };
|