@zk-tech/bedrock 0.0.2 → 0.1.1
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/async/index.cjs.map +1 -1
- package/dist/async/index.d.cts +2 -2
- package/dist/async/index.d.ts +2 -2
- package/dist/async/index.js.map +1 -1
- package/dist/error/index.cjs.map +1 -1
- package/dist/error/index.d.cts +19 -19
- package/dist/error/index.d.ts +19 -19
- package/dist/error/index.js.map +1 -1
- package/dist/{error-base-B4zaiJ5m.d.cts → error-base-DOFtBFla.d.cts} +8 -8
- package/dist/{error-base-B4zaiJ5m.d.ts → error-base-DOFtBFla.d.ts} +8 -8
- package/dist/promise/index.cjs.map +1 -1
- package/dist/promise/index.d.cts +4 -4
- package/dist/promise/index.d.ts +4 -4
- package/dist/promise/index.js.map +1 -1
- package/dist/worker/index.cjs.map +1 -1
- package/dist/worker/index.d.cts +2 -2
- package/dist/worker/index.d.ts +2 -2
- package/dist/worker/index.js.map +1 -1
- package/package.json +11 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/error/error-t.ts","../../src/error/error-const.ts","../../src/error/error-code.ts","../../src/dispose/dispose-base.ts","../../src/dispose/disposable-t.ts","../../src/dispose/disposable-utils.ts","../../src/structure/linked-list.ts","../../src/event/disposable-linked-list.ts","../../src/event/error-handler.ts","../../src/event/emitter.ts","../../src/async/cancellation.ts","../../src/promise/promise.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ILvErrorRef, ILvErrorOr, ILvRealErrorRef } from './error-base';\n\n//\n// Error类\n//\n// 用户给函数签名明确错误\n// function foo(): ILvErrorRef\n// return makeOk(); // 如果没有错误\n// return makeError(code, msg); // 指定错误码和携带消息\n//\n// const SomeError = LvErrorConst(code, msg); // 更推荐用LvErrorConst生成\n// return SomeError();\n//\n\nconst lvErrorRefSymbol = Symbol('lvErrorRef');\n\nfunction findJsError(error: ILvErrorRef | Error) {\n let obj: ILvErrorRef | Error | undefined = error;\n while (obj) {\n if (obj instanceof Error) {\n return obj;\n }\n obj = (obj as ILvErrorRef).cause;\n }\n // 如果没有Error,那就序列化lvError\n return new Error((error as ILvErrorRef).toString());\n}\n\nexport function makeOk<K>(): ILvErrorOr<never, K> {\n return {\n ok: true,\n value: null!,\n pair() {\n return [null, null!];\n },\n code: 0,\n msg: '',\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n}\n\nexport function makeOkWith<T, K = unknown>(value: T): ILvErrorOr<T, K> {\n return {\n ok: true,\n value,\n pair() {\n return [null, value];\n },\n code: 0,\n msg: '',\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n}\n\nfunction printCause(cause: ILvErrorRef | Error | undefined): string {\n if (cause === undefined) {\n return '';\n } else if (cause instanceof Error) {\n return `\\ncaused by [jsError]${cause.name}-${cause.message}`;\n } else {\n return `\\ncaused by [${cause.code}]${cause.msg}${cause.ok ? '' : printCause(cause.cause)}`;\n }\n}\n\nfunction internalMakeError<T>(code: number, msg: string, cause?: ILvErrorRef | Error, errorInfo?: T) {\n const errorRef: ILvRealErrorRef<T> = {\n ok: false,\n code,\n msg,\n cause,\n errorInfo,\n toString() {\n return `[${code}]${msg}.${cause ? printCause(cause) : ''}`;\n },\n pair() {\n return [errorRef, null];\n },\n stack: cause instanceof Error ? cause.stack : undefined,\n findJsError: () => findJsError(errorRef),\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n return errorRef;\n}\n\nexport function makeError<T = unknown>(code: number, msg: string, errorInfo?: T): ILvRealErrorRef<T> {\n return internalMakeError(code, msg, undefined, errorInfo);\n}\n\nexport function makeErrorBy<T = unknown>(\n code: number,\n msg: string,\n cause: ILvErrorRef | Error,\n errorInfo?: T,\n): ILvRealErrorRef<T> {\n return internalMakeError(code, msg, cause, errorInfo);\n}\n\nexport function isLvErrorRef(val: unknown): val is ILvErrorRef {\n return typeof val === 'object' && val !== null && lvErrorRefSymbol in val;\n}\n","import { makeError, makeErrorBy } from './error-t';\n\n//\n// Error编译时错误对象\n//\nexport function lvErrorConst(code: number, msg: string) {\n return (rewrite?: string | Error) => {\n if (!rewrite) {\n return makeError(code, msg);\n }\n if (typeof rewrite === 'string') {\n return makeError(code, rewrite);\n }\n return makeErrorBy(code, rewrite.message, rewrite);\n };\n}\n","import { lvErrorConst } from './error-const';\n\n/**\n * 提供了通用的错误码(+1至+256)\n *\n * 注意:这里只是提供了通用的错误码,方便服务使用,但并不是要求服务一定使用如下的错误码来表明某种错误\n */\nexport enum GenericError {\n Ok = 0,\n Cancelled = 1, // 操作被取消\n TimedOut = 2, // 操作超时\n PermissionDenied = 3, // 无权限\n AlreadyExists = 4, // 已经存在(文件/记录等)\n NotSupported = 5, // 操作不支持\n ResourceUnavailable = 6, // 资源不可用\n OutOfRange = 7, // (参数/结果等)发生越界\n InvalidArgument = 8, // 无效参数\n NetworkFailed = 9, // 网络失败\n Interrupted = 10, // 操作被中断(捕获异常转为错误)\n ResultNil = 11, // 结果不存在(null or undefined转为错误)\n}\n\n/**\n * 通用错误码所对应的编译时常量对象(ErrorConst)\n */\nexport const cancelledError = lvErrorConst(GenericError.Cancelled, 'operation(s) cancelled.');\nexport const timeoutError = lvErrorConst(GenericError.TimedOut, 'operation(s) timed out.');\nexport const permissionDeniedError = lvErrorConst(GenericError.PermissionDenied, 'permission denied.');\nexport const alreadyExistsError = lvErrorConst(GenericError.AlreadyExists, 'already exists.');\nexport const notSupportedError = lvErrorConst(GenericError.NotSupported, 'operation(s) not supported.');\nexport const resourceUnavailableError = lvErrorConst(\n GenericError.ResourceUnavailable,\n 'resource is unavailable.',\n);\nexport const outOfRangeError = lvErrorConst(GenericError.OutOfRange, 'out of range.');\nexport const invalidArgumentError = lvErrorConst(GenericError.InvalidArgument, 'invalid arguments.');\nexport const networkFailedError = lvErrorConst(GenericError.NetworkFailed, 'network failed.');\nexport const interruptedError = lvErrorConst(GenericError.Interrupted, 'interrupted.');\nexport const resultNilError = lvErrorConst(GenericError.ResultNil, 'result is nil.');\n","//\n// Disposable特征约束\n//\nexport interface IDisposable {\n dispose: () => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport const EmptyDispose = Object.freeze<IDisposable>({ dispose() {} });\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","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 { EmptyDispose, type IDisposable } from '@/dispose';\nimport type { Event } from '@/event';\nimport { Emitter } from '@/event';\n\n//\n// 任何可取消的异步调用 的令牌接口\n// 因为异步调用无法真正意义上取消,但是可以在异步任务的回调中增加该令牌作为参数\n// 以便在操作被取消时停止执行\n//\nexport interface ICancellationToken {\n // 标记是否进行过了cancel\n readonly isCancellationRequested: boolean;\n\n // 取消的原因\n readonly reason?: string;\n\n // 令牌调用cancel后触发的回调\n // 有如下特点\n // 1. 只会触发一次\n // 2. 当监听的时候token已经cancelled,仍然会触发一次\n readonly onCancellationRequested: (\n listener: () => any,\n thisArgs?: any,\n disposables?: IDisposable[],\n ) => IDisposable;\n}\n\n//\n// 编译时常量,一个快捷的事件响应\n// 用于当外界监听令牌取消时,直接触发回调\n//\nconst shortcutEvent: Event<[]> = Object.freeze(function (callback, context?): IDisposable {\n const handle = setTimeout(callback.bind(context), 0);\n\n return {\n dispose() {\n clearTimeout(handle);\n },\n };\n});\n\n//\n// 可取消异步调用的令牌实现\n// 默认是未取消状态,可以调用cancel进行取消\n//\nclass MutableToken implements ICancellationToken, IDisposable {\n // 是否已经取消该异步调用\n private _isCancelled = false;\n private _emitter: Emitter<[]> | null = null;\n private _reason?: string;\n\n public get reason(): undefined | string {\n return this._reason;\n }\n\n // 获取当前是否已经取消该异步调用\n public get isCancellationRequested(): boolean {\n return this._isCancelled;\n }\n\n // 外界可以监听异步取消发起\n public get onCancellationRequested(): Event<[]> {\n if (this._isCancelled) {\n return shortcutEvent;\n }\n if (!this._emitter) {\n this._emitter = new Emitter<[]>();\n }\n return this._emitter.event;\n }\n\n public cancel(reason?: string) {\n if (!this._isCancelled) {\n this._reason = reason;\n this._isCancelled = true;\n if (this._emitter) {\n this._emitter.fire();\n this.dispose();\n }\n }\n }\n\n public dispose(): void {\n if (this._emitter) {\n this._emitter.dispose();\n this._emitter = null;\n }\n }\n}\n\n//\n// 编译期提供的一些常量Token\n// 不可修改\n//\n// eslint-disable-next-line unicorn/no-static-only-class, @typescript-eslint/no-extraneous-class\nexport class CancellationToken {\n static None = Object.freeze<ICancellationToken>({\n isCancellationRequested: false,\n onCancellationRequested: () => EmptyDispose,\n });\n\n static Cancelled = Object.freeze<ICancellationToken>({\n isCancellationRequested: true,\n onCancellationRequested: shortcutEvent,\n });\n\n static Make = (reason: string) => {\n return Object.freeze<ICancellationToken>({\n isCancellationRequested: true,\n onCancellationRequested: shortcutEvent,\n reason,\n });\n };\n}\n\n//\n// 任何可取消的异步调用 的控制类\n// 参考ICancellationToken,我们通过在异步调用的回调中添加token参数来判断异步调用的状态\n// token来源于CancellationTokenSource\n// CancellationTokenSource也会暴露cancel的接口\n//\n// 使用方式\n// const tokenSource = new CancellationTokenSource();\n//\n// asyncCall(() => {\n// if (token.isCancellationRequested) { return; } // 如果cancelled\n// doSomething();\n// });\n//\n// tokenSource.cancel(); // 因为某些情况,可能会cancel\n// tokenSource.dispose(); // dispose时一定会cancel\n//\nexport class CancellationTokenSource implements IDisposable {\n // 真正的token\n private _token?: ICancellationToken = undefined;\n // 可能存在父级CancellationTokenSource\n private readonly _parentListener?: IDisposable = undefined;\n // 为了支持signal场景,所以在需要时会初始化浏览器提供的abortController原生结构\n private _abortController?: AbortController = undefined;\n\n constructor(parent?: ICancellationToken) {\n // 如果存在父级,当父对象cancel时,子对象也必须cancel\n this._parentListener = parent?.onCancellationRequested(this.cancel, this);\n }\n\n /**\n * 传统的cancellation用法\n */\n public get token(): ICancellationToken {\n if (!this._token) {\n this._token = new MutableToken();\n }\n return this._token;\n }\n\n /**\n * 对齐浏览器提供的abortSignal,支持给fetch、axios等传参使用\n */\n public get signal(): AbortSignal {\n if (this._abortController) {\n return this._abortController.signal;\n }\n this._abortController = new AbortController();\n if (this._token?.isCancellationRequested) {\n this._abortController.abort();\n }\n return this._abortController.signal;\n }\n\n public cancel(reason?: string): void {\n if (!this._token) {\n // 如果没有使用过token就直接cancel,那么就返回一个常量即可\n this._token = reason === undefined ? CancellationToken.Cancelled : CancellationToken.Make(reason);\n } else if (this._token instanceof MutableToken) {\n this._token.cancel(reason);\n }\n if (this._abortController) {\n this._abortController.abort(reason);\n }\n }\n\n public dispose(cancel = false): void {\n if (cancel) {\n this.cancel();\n }\n this._parentListener?.dispose();\n if (!this._token) {\n this._token = CancellationToken.None;\n } else if (this._token instanceof MutableToken) {\n this._token.dispose();\n }\n }\n}\n","import {\n makeOkWith,\n type ILvErrorOr,\n cancelledError,\n GenericError,\n timeoutError,\n type ILvErrorRef,\n makeOk,\n isLvErrorRef,\n} from '../error';\nimport type { ICancellationToken } from '../async';\nimport { CancellationTokenSource } from '../async';\n\n/**\n * 一般来说Promise常用的场景有:\n * 1. 单次异步调用(new Promise)\n * 2. 批量promise调用(Promise.all)\n * 3. promise竞速调用(Promise.race)\n *\n * 但是原生能力有如下的缺陷\n * 1. 不支持取消某一次promise调用\n * 2. 不支持错误语义,promise.catch的重视程度比try catch还低\n * 3. 超时行为需要基于race封装\n *\n * 针对这三点,基建侧提供了高阶的promise能力\n * 1. makeCancelablePromise 返回一个可取消的promise\n * const promise = makeCancelablePromise(() => { ... });\n * promise.then((res) => {\n * // res是一个ILvErrorRef对象\n * });\n * // 可以直接取消promise\n * promise.cancel();\n *\n * 2. parallelPromise 并发执行promise,会自动观测ILvErrorRef语义\n * 当单个promise出现错误返回时,promise执行失败,尽可能调用所有cancelablePromise\n * 当单个promise出现reject时,promise执行失败,尽可能调用所有cancelablePromise,并且将reject继续上抛\n *\n * 3. makePromiseWithTimeout 让promise支持超时,可以提供默认值\n *\n * ——————————————————\n * Promise.allSettled和Promise.any在实际使用中场景较少,暂不提供错误语义包装\n */\n\n//\n// 可以cancel的promise对象\n//\nexport interface CancelablePromise<T> extends Promise<T> {\n cancel: () => void;\n}\n\n/**\n * 快速生成一个CancelablePromise对象\n */\nexport function makeCancelablePromise<T>(\n callback: (token: ICancellationToken) => Promise<T | ILvErrorOr<T>>,\n): CancelablePromise<ILvErrorOr<T>> {\n const source = new CancellationTokenSource();\n const thenable = callback(source.token);\n const promise = new Promise<ILvErrorOr<T>>((resolve, reject) => {\n const subscription = source.token.onCancellationRequested(() => {\n subscription.dispose();\n source.dispose();\n resolve(cancelledError());\n });\n Promise.resolve(thenable).then(\n (value) => {\n subscription.dispose();\n source.dispose();\n if (isLvErrorRef(value)) {\n resolve(value);\n } else {\n resolve(makeOkWith(value as T));\n }\n },\n (err) => {\n subscription.dispose();\n source.dispose();\n reject(err);\n },\n );\n });\n return new (class {\n cancel() {\n source.cancel();\n }\n then<TResult1 = T, TResult2 = never>(\n resolve?: ((value: ILvErrorOr<T>) => TResult1 | Promise<TResult1>) | undefined | null,\n reject?: ((reason: any) => TResult2 | Promise<TResult2>) | undefined | null,\n ): Promise<TResult1 | TResult2> {\n return promise.then(resolve, reject);\n }\n catch<TResult = never>(\n reject?: ((reason: any) => TResult | Promise<TResult>) | undefined | null,\n ): Promise<T | TResult> {\n return this.then(undefined, reject);\n }\n finally(onfinally?: (() => void) | undefined | null): Promise<ILvErrorOr<T>> {\n return promise.finally(onfinally);\n }\n })() as CancelablePromise<ILvErrorOr<T>>;\n}\n\n/**\n * 并行执行promise,当某一个失败,本次调用失败\n * 本质上和Promise.all差不多,相比较之下\n * 1. 包装了错误语义判断\n * 2. 当失败时,会尽可能尝试cancel其他promise\n *\n * 注意:某一个promise失败时,会尽可能尝试调用其他promise的cancel,但不保证一定有效\n * (有可能promiseA已经成功,但是primiseB在之后失败了)\n */\nexport function parallelPromise(promiseList: Promise<any>[]): Promise<ILvErrorRef> {\n if (promiseList.length === 0) {\n return Promise.resolve(makeOk());\n }\n\n let todo = promiseList.length;\n const finish = () => {\n todo = -1;\n for (const promise of promiseList) {\n (promise as Partial<CancelablePromise<any>>).cancel?.();\n }\n };\n\n return new Promise<ILvErrorRef>((resolve, reject) => {\n for (const promise of promiseList) {\n promise\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n .then((res) => {\n if (isLvErrorRef(res) && !res.ok) {\n finish();\n resolve(res as ILvErrorRef);\n return;\n }\n todo--;\n if (todo === 0) {\n resolve(makeOk());\n }\n })\n .catch((err) => {\n finish();\n reject(err);\n });\n }\n });\n}\n\n/**\n * 包装一个promise,提供超时能力\n */\nexport function makePromiseWithTimeout<T>(\n callback: (token: ICancellationToken) => Promise<T | ILvErrorOr<T>>,\n timeout: number,\n defaultValue?: T, // 当发生超时时,提供的默认值\n): Promise<ILvErrorOr<T>> {\n const cancellable = makeCancelablePromise<T>(callback);\n const timer = setTimeout(() => {\n cancellable.cancel();\n }, timeout);\n return cancellable.then((res: ILvErrorOr<T>) => {\n clearTimeout(timer);\n if (res.ok) {\n return res;\n }\n // 如果是被取消,触发了超时\n if (res.code === GenericError.Cancelled) {\n if (defaultValue !== undefined) {\n // 希望返回默认值\n return makeOkWith(defaultValue);\n }\n return timeoutError();\n } else {\n // 遇到其他错误时透传错误\n return res;\n }\n });\n}\n\n// 如果 proposal-promise-with-resolvers 通过了,那么这个函数就可以去掉了\n// https://github.com/microsoft/TypeScript/blob/1d96eb489e559f4f61522edb3c8b5987bbe948af/src/harness/util.ts#L115\nexport interface Deferred<T> {\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: unknown) => void;\n promise: Promise<T>;\n}\n\nexport function defer<T = void>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n return { resolve, reject, promise };\n}\n\nexport function waitForAbortSignal(signal: AbortSignal) {\n const { promise, reject } = defer<never>();\n\n if (signal.aborted) {\n reject(signal.reason);\n }\n\n const handleAbort = () => {\n reject(signal.reason);\n signal.removeEventListener('abort', handleAbort);\n };\n\n signal.addEventListener('abort', handleAbort);\n\n return promise;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/error/error-t.ts","../../src/error/error-const.ts","../../src/error/error-code.ts","../../src/dispose/dispose-base.ts","../../src/dispose/disposable-t.ts","../../src/dispose/disposable-utils.ts","../../src/structure/linked-list.ts","../../src/event/disposable-linked-list.ts","../../src/event/error-handler.ts","../../src/event/emitter.ts","../../src/async/cancellation.ts","../../src/promise/promise.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { LvErrorRef, LvErrorOr, LvRealErrorRef } from './error-base';\n\n//\n// Error类\n//\n// 用户给函数签名明确错误\n// function foo(): LvErrorRef\n// return makeOk(); // 如果没有错误\n// return makeError(code, msg); // 指定错误码和携带消息\n//\n// const SomeError = LvErrorConst(code, msg); // 更推荐用LvErrorConst生成\n// return SomeError();\n//\n\nconst lvErrorRefSymbol = Symbol('lvErrorRef');\n\nfunction findJsError(error: LvErrorRef | Error) {\n let obj: LvErrorRef | Error | undefined = error;\n while (obj) {\n if (obj instanceof Error) {\n return obj;\n }\n obj = (obj as LvErrorRef).cause;\n }\n // 如果没有Error,那就序列化lvError\n return new Error((error as LvErrorRef).toString());\n}\n\nexport function makeOk<K>(): LvErrorOr<never, K> {\n return {\n ok: true,\n value: null!,\n pair() {\n return [null, null!];\n },\n code: 0,\n msg: '',\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n}\n\nexport function makeOkWith<T, K = unknown>(value: T): LvErrorOr<T, K> {\n return {\n ok: true,\n value,\n pair() {\n return [null, value];\n },\n code: 0,\n msg: '',\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n}\n\nfunction printCause(cause: LvErrorRef | Error | undefined): string {\n if (cause === undefined) {\n return '';\n } else if (cause instanceof Error) {\n return `\\ncaused by [jsError]${cause.name}-${cause.message}`;\n } else {\n return `\\ncaused by [${cause.code}]${cause.msg}${cause.ok ? '' : printCause(cause.cause)}`;\n }\n}\n\nfunction internalMakeError<T>(code: number, msg: string, cause?: LvErrorRef | Error, errorInfo?: T) {\n const errorRef: LvRealErrorRef<T> = {\n ok: false,\n code,\n msg,\n cause,\n errorInfo,\n toString() {\n return `[${code}]${msg}.${cause ? printCause(cause) : ''}`;\n },\n pair() {\n return [errorRef, null];\n },\n stack: cause instanceof Error ? cause.stack : undefined,\n findJsError: () => findJsError(errorRef),\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n return errorRef;\n}\n\nexport function makeError<T = unknown>(code: number, msg: string, errorInfo?: T): LvRealErrorRef<T> {\n return internalMakeError(code, msg, undefined, errorInfo);\n}\n\nexport function makeErrorBy<T = unknown>(\n code: number,\n msg: string,\n cause: LvErrorRef | Error,\n errorInfo?: T,\n): LvRealErrorRef<T> {\n return internalMakeError(code, msg, cause, errorInfo);\n}\n\nexport function isLvErrorRef(val: unknown): val is LvErrorRef {\n return typeof val === 'object' && val !== null && lvErrorRefSymbol in val;\n}\n","import { makeError, makeErrorBy } from './error-t';\n\n//\n// Error编译时错误对象\n//\nexport function lvErrorConst(code: number, msg: string) {\n return (rewrite?: string | Error) => {\n if (!rewrite) {\n return makeError(code, msg);\n }\n if (typeof rewrite === 'string') {\n return makeError(code, rewrite);\n }\n return makeErrorBy(code, rewrite.message, rewrite);\n };\n}\n","import { lvErrorConst } from './error-const';\n\n/**\n * 提供了通用的错误码(+1至+256)\n *\n * 注意:这里只是提供了通用的错误码,方便服务使用,但并不是要求服务一定使用如下的错误码来表明某种错误\n */\nexport enum GenericError {\n Ok = 0,\n Cancelled = 1, // 操作被取消\n TimedOut = 2, // 操作超时\n PermissionDenied = 3, // 无权限\n AlreadyExists = 4, // 已经存在(文件/记录等)\n NotSupported = 5, // 操作不支持\n ResourceUnavailable = 6, // 资源不可用\n OutOfRange = 7, // (参数/结果等)发生越界\n InvalidArgument = 8, // 无效参数\n NetworkFailed = 9, // 网络失败\n Interrupted = 10, // 操作被中断(捕获异常转为错误)\n ResultNil = 11, // 结果不存在(null or undefined转为错误)\n}\n\n/**\n * 通用错误码所对应的编译时常量对象(ErrorConst)\n */\nexport const cancelledError = lvErrorConst(GenericError.Cancelled, 'operation(s) cancelled.');\nexport const timeoutError = lvErrorConst(GenericError.TimedOut, 'operation(s) timed out.');\nexport const permissionDeniedError = lvErrorConst(GenericError.PermissionDenied, 'permission denied.');\nexport const alreadyExistsError = lvErrorConst(GenericError.AlreadyExists, 'already exists.');\nexport const notSupportedError = lvErrorConst(GenericError.NotSupported, 'operation(s) not supported.');\nexport const resourceUnavailableError = lvErrorConst(\n GenericError.ResourceUnavailable,\n 'resource is unavailable.',\n);\nexport const outOfRangeError = lvErrorConst(GenericError.OutOfRange, 'out of range.');\nexport const invalidArgumentError = lvErrorConst(GenericError.InvalidArgument, 'invalid arguments.');\nexport const networkFailedError = lvErrorConst(GenericError.NetworkFailed, 'network failed.');\nexport const interruptedError = lvErrorConst(GenericError.Interrupted, 'interrupted.');\nexport const resultNilError = lvErrorConst(GenericError.ResultNil, 'result is nil.');\n","//\n// Disposable特征约束\n//\nexport interface IDisposable {\n dispose: () => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport const EmptyDispose = Object.freeze<IDisposable>({ dispose() {} });\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","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 { EmptyDispose, type IDisposable } from '@/dispose';\nimport type { Event } from '@/event';\nimport { Emitter } from '@/event';\n\n//\n// 任何可取消的异步调用 的令牌接口\n// 因为异步调用无法真正意义上取消,但是可以在异步任务的回调中增加该令牌作为参数\n// 以便在操作被取消时停止执行\n//\nexport interface ICancellationToken {\n // 标记是否进行过了cancel\n readonly isCancellationRequested: boolean;\n\n // 取消的原因\n readonly reason?: string;\n\n // 令牌调用cancel后触发的回调\n // 有如下特点\n // 1. 只会触发一次\n // 2. 当监听的时候token已经cancelled,仍然会触发一次\n readonly onCancellationRequested: (\n listener: () => any,\n thisArgs?: any,\n disposables?: IDisposable[],\n ) => IDisposable;\n}\n\n//\n// 编译时常量,一个快捷的事件响应\n// 用于当外界监听令牌取消时,直接触发回调\n//\nconst shortcutEvent: Event<[]> = Object.freeze(function (callback, context?): IDisposable {\n const handle = setTimeout(callback.bind(context), 0);\n\n return {\n dispose() {\n clearTimeout(handle);\n },\n };\n});\n\n//\n// 可取消异步调用的令牌实现\n// 默认是未取消状态,可以调用cancel进行取消\n//\nclass MutableToken implements ICancellationToken, IDisposable {\n // 是否已经取消该异步调用\n private _isCancelled = false;\n private _emitter: Emitter<[]> | null = null;\n private _reason?: string;\n\n public get reason(): undefined | string {\n return this._reason;\n }\n\n // 获取当前是否已经取消该异步调用\n public get isCancellationRequested(): boolean {\n return this._isCancelled;\n }\n\n // 外界可以监听异步取消发起\n public get onCancellationRequested(): Event<[]> {\n if (this._isCancelled) {\n return shortcutEvent;\n }\n if (!this._emitter) {\n this._emitter = new Emitter<[]>();\n }\n return this._emitter.event;\n }\n\n public cancel(reason?: string) {\n if (!this._isCancelled) {\n this._reason = reason;\n this._isCancelled = true;\n if (this._emitter) {\n this._emitter.fire();\n this.dispose();\n }\n }\n }\n\n public dispose(): void {\n if (this._emitter) {\n this._emitter.dispose();\n this._emitter = null;\n }\n }\n}\n\n//\n// 编译期提供的一些常量Token\n// 不可修改\n//\n// eslint-disable-next-line unicorn/no-static-only-class, @typescript-eslint/no-extraneous-class\nexport class CancellationToken {\n static None = Object.freeze<ICancellationToken>({\n isCancellationRequested: false,\n onCancellationRequested: () => EmptyDispose,\n });\n\n static Cancelled = Object.freeze<ICancellationToken>({\n isCancellationRequested: true,\n onCancellationRequested: shortcutEvent,\n });\n\n static Make = (reason: string) => {\n return Object.freeze<ICancellationToken>({\n isCancellationRequested: true,\n onCancellationRequested: shortcutEvent,\n reason,\n });\n };\n}\n\n//\n// 任何可取消的异步调用 的控制类\n// 参考ICancellationToken,我们通过在异步调用的回调中添加token参数来判断异步调用的状态\n// token来源于CancellationTokenSource\n// CancellationTokenSource也会暴露cancel的接口\n//\n// 使用方式\n// const tokenSource = new CancellationTokenSource();\n//\n// asyncCall(() => {\n// if (token.isCancellationRequested) { return; } // 如果cancelled\n// doSomething();\n// });\n//\n// tokenSource.cancel(); // 因为某些情况,可能会cancel\n// tokenSource.dispose(); // dispose时一定会cancel\n//\nexport class CancellationTokenSource implements IDisposable {\n // 真正的token\n private _token?: ICancellationToken = undefined;\n // 可能存在父级CancellationTokenSource\n private readonly _parentListener?: IDisposable = undefined;\n // 为了支持signal场景,所以在需要时会初始化浏览器提供的abortController原生结构\n private _abortController?: AbortController = undefined;\n\n constructor(parent?: ICancellationToken) {\n // 如果存在父级,当父对象cancel时,子对象也必须cancel\n this._parentListener = parent?.onCancellationRequested(this.cancel, this);\n }\n\n /**\n * 传统的cancellation用法\n */\n public get token(): ICancellationToken {\n if (!this._token) {\n this._token = new MutableToken();\n }\n return this._token;\n }\n\n /**\n * 对齐浏览器提供的abortSignal,支持给fetch、axios等传参使用\n */\n public get signal(): AbortSignal {\n if (this._abortController) {\n return this._abortController.signal;\n }\n this._abortController = new AbortController();\n if (this._token?.isCancellationRequested) {\n this._abortController.abort();\n }\n return this._abortController.signal;\n }\n\n public cancel(reason?: string): void {\n if (!this._token) {\n // 如果没有使用过token就直接cancel,那么就返回一个常量即可\n this._token = reason === undefined ? CancellationToken.Cancelled : CancellationToken.Make(reason);\n } else if (this._token instanceof MutableToken) {\n this._token.cancel(reason);\n }\n if (this._abortController) {\n this._abortController.abort(reason);\n }\n }\n\n public dispose(cancel = false): void {\n if (cancel) {\n this.cancel();\n }\n this._parentListener?.dispose();\n if (!this._token) {\n this._token = CancellationToken.None;\n } else if (this._token instanceof MutableToken) {\n this._token.dispose();\n }\n }\n}\n","import {\n makeOkWith,\n type LvErrorOr,\n cancelledError,\n GenericError,\n timeoutError,\n type LvErrorRef,\n makeOk,\n isLvErrorRef,\n} from '../error';\nimport type { ICancellationToken } from '../async';\nimport { CancellationTokenSource } from '../async';\n\n/**\n * 一般来说Promise常用的场景有:\n * 1. 单次异步调用(new Promise)\n * 2. 批量promise调用(Promise.all)\n * 3. promise竞速调用(Promise.race)\n *\n * 但是原生能力有如下的缺陷\n * 1. 不支持取消某一次promise调用\n * 2. 不支持错误语义,promise.catch的重视程度比try catch还低\n * 3. 超时行为需要基于race封装\n *\n * 针对这三点,基建侧提供了高阶的promise能力\n * 1. makeCancelablePromise 返回一个可取消的promise\n * const promise = makeCancelablePromise(() => { ... });\n * promise.then((res) => {\n * // res是一个ILvErrorRef对象\n * });\n * // 可以直接取消promise\n * promise.cancel();\n *\n * 2. parallelPromise 并发执行promise,会自动观测ILvErrorRef语义\n * 当单个promise出现错误返回时,promise执行失败,尽可能调用所有cancelablePromise\n * 当单个promise出现reject时,promise执行失败,尽可能调用所有cancelablePromise,并且将reject继续上抛\n *\n * 3. makePromiseWithTimeout 让promise支持超时,可以提供默认值\n *\n * ——————————————————\n * Promise.allSettled和Promise.any在实际使用中场景较少,暂不提供错误语义包装\n */\n\n//\n// 可以cancel的promise对象\n//\nexport interface CancelablePromise<T> extends Promise<T> {\n cancel: () => void;\n}\n\n/**\n * 快速生成一个CancelablePromise对象\n */\nexport function makeCancelablePromise<T>(\n callback: (token: ICancellationToken) => Promise<T | LvErrorOr<T>>,\n): CancelablePromise<LvErrorOr<T>> {\n const source = new CancellationTokenSource();\n const thenable = callback(source.token);\n const promise = new Promise<LvErrorOr<T>>((resolve, reject) => {\n const subscription = source.token.onCancellationRequested(() => {\n subscription.dispose();\n source.dispose();\n resolve(cancelledError());\n });\n Promise.resolve(thenable).then(\n (value) => {\n subscription.dispose();\n source.dispose();\n if (isLvErrorRef(value)) {\n resolve(value);\n } else {\n resolve(makeOkWith(value as T));\n }\n },\n (err) => {\n subscription.dispose();\n source.dispose();\n reject(err);\n },\n );\n });\n return new (class {\n cancel() {\n source.cancel();\n }\n then<TResult1 = T, TResult2 = never>(\n resolve?: ((value: LvErrorOr<T>) => TResult1 | Promise<TResult1>) | undefined | null,\n reject?: ((reason: any) => TResult2 | Promise<TResult2>) | undefined | null,\n ): Promise<TResult1 | TResult2> {\n return promise.then(resolve, reject);\n }\n catch<TResult = never>(\n reject?: ((reason: any) => TResult | Promise<TResult>) | undefined | null,\n ): Promise<T | TResult> {\n return this.then(undefined, reject);\n }\n finally(onfinally?: (() => void) | undefined | null): Promise<LvErrorOr<T>> {\n return promise.finally(onfinally);\n }\n })() as CancelablePromise<LvErrorOr<T>>;\n}\n\n/**\n * 并行执行promise,当某一个失败,本次调用失败\n * 本质上和Promise.all差不多,相比较之下\n * 1. 包装了错误语义判断\n * 2. 当失败时,会尽可能尝试cancel其他promise\n *\n * 注意:某一个promise失败时,会尽可能尝试调用其他promise的cancel,但不保证一定有效\n * (有可能promiseA已经成功,但是primiseB在之后失败了)\n */\nexport function parallelPromise(promiseList: Promise<any>[]): Promise<LvErrorRef> {\n if (promiseList.length === 0) {\n return Promise.resolve(makeOk());\n }\n\n let todo = promiseList.length;\n const finish = () => {\n todo = -1;\n for (const promise of promiseList) {\n (promise as Partial<CancelablePromise<any>>).cancel?.();\n }\n };\n\n return new Promise<LvErrorRef>((resolve, reject) => {\n for (const promise of promiseList) {\n promise\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n .then((res) => {\n if (isLvErrorRef(res) && !res.ok) {\n finish();\n resolve(res as LvErrorRef);\n return;\n }\n todo--;\n if (todo === 0) {\n resolve(makeOk());\n }\n })\n .catch((err) => {\n finish();\n reject(err);\n });\n }\n });\n}\n\n/**\n * 包装一个promise,提供超时能力\n */\nexport function makePromiseWithTimeout<T>(\n callback: (token: ICancellationToken) => Promise<T | LvErrorOr<T>>,\n timeout: number,\n defaultValue?: T, // 当发生超时时,提供的默认值\n): Promise<LvErrorOr<T>> {\n const cancellable = makeCancelablePromise<T>(callback);\n const timer = setTimeout(() => {\n cancellable.cancel();\n }, timeout);\n return cancellable.then((res: LvErrorOr<T>) => {\n clearTimeout(timer);\n if (res.ok) {\n return res;\n }\n // 如果是被取消,触发了超时\n if (res.code === GenericError.Cancelled) {\n if (defaultValue !== undefined) {\n // 希望返回默认值\n return makeOkWith(defaultValue);\n }\n return timeoutError();\n } else {\n // 遇到其他错误时透传错误\n return res;\n }\n });\n}\n\n// 如果 proposal-promise-with-resolvers 通过了,那么这个函数就可以去掉了\n// https://github.com/microsoft/TypeScript/blob/1d96eb489e559f4f61522edb3c8b5987bbe948af/src/harness/util.ts#L115\nexport interface Deferred<T> {\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: unknown) => void;\n promise: Promise<T>;\n}\n\nexport function defer<T = void>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n return { resolve, reject, promise };\n}\n\nexport function waitForAbortSignal(signal: AbortSignal) {\n const { promise, reject } = defer<never>();\n\n if (signal.aborted) {\n reject(signal.reason);\n }\n\n const handleAbort = () => {\n reject(signal.reason);\n signal.removeEventListener('abort', handleAbort);\n };\n\n signal.addEventListener('abort', handleAbort);\n\n return promise;\n}\n"]}
|
package/dist/promise/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { L as LvErrorOr, a as LvErrorRef } from '../error-base-DOFtBFla.cjs';
|
|
2
2
|
import { I as ICancellationToken } from '../cancellation-BIIv2UJm.cjs';
|
|
3
3
|
import '../dispose-base-CAeXDpjg.cjs';
|
|
4
4
|
|
|
@@ -37,7 +37,7 @@ interface CancelablePromise<T> extends Promise<T> {
|
|
|
37
37
|
/**
|
|
38
38
|
* 快速生成一个CancelablePromise对象
|
|
39
39
|
*/
|
|
40
|
-
declare function makeCancelablePromise<T>(callback: (token: ICancellationToken) => Promise<T |
|
|
40
|
+
declare function makeCancelablePromise<T>(callback: (token: ICancellationToken) => Promise<T | LvErrorOr<T>>): CancelablePromise<LvErrorOr<T>>;
|
|
41
41
|
/**
|
|
42
42
|
* 并行执行promise,当某一个失败,本次调用失败
|
|
43
43
|
* 本质上和Promise.all差不多,相比较之下
|
|
@@ -47,11 +47,11 @@ declare function makeCancelablePromise<T>(callback: (token: ICancellationToken)
|
|
|
47
47
|
* 注意:某一个promise失败时,会尽可能尝试调用其他promise的cancel,但不保证一定有效
|
|
48
48
|
* (有可能promiseA已经成功,但是primiseB在之后失败了)
|
|
49
49
|
*/
|
|
50
|
-
declare function parallelPromise(promiseList: Promise<any>[]): Promise<
|
|
50
|
+
declare function parallelPromise(promiseList: Promise<any>[]): Promise<LvErrorRef>;
|
|
51
51
|
/**
|
|
52
52
|
* 包装一个promise,提供超时能力
|
|
53
53
|
*/
|
|
54
|
-
declare function makePromiseWithTimeout<T>(callback: (token: ICancellationToken) => Promise<T |
|
|
54
|
+
declare function makePromiseWithTimeout<T>(callback: (token: ICancellationToken) => Promise<T | LvErrorOr<T>>, timeout: number, defaultValue?: T): Promise<LvErrorOr<T>>;
|
|
55
55
|
interface Deferred<T> {
|
|
56
56
|
resolve: (value: T | PromiseLike<T>) => void;
|
|
57
57
|
reject: (reason?: unknown) => void;
|
package/dist/promise/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { L as LvErrorOr, a as LvErrorRef } from '../error-base-DOFtBFla.js';
|
|
2
2
|
import { I as ICancellationToken } from '../cancellation-ClqPPsV1.js';
|
|
3
3
|
import '../dispose-base-CAeXDpjg.js';
|
|
4
4
|
|
|
@@ -37,7 +37,7 @@ interface CancelablePromise<T> extends Promise<T> {
|
|
|
37
37
|
/**
|
|
38
38
|
* 快速生成一个CancelablePromise对象
|
|
39
39
|
*/
|
|
40
|
-
declare function makeCancelablePromise<T>(callback: (token: ICancellationToken) => Promise<T |
|
|
40
|
+
declare function makeCancelablePromise<T>(callback: (token: ICancellationToken) => Promise<T | LvErrorOr<T>>): CancelablePromise<LvErrorOr<T>>;
|
|
41
41
|
/**
|
|
42
42
|
* 并行执行promise,当某一个失败,本次调用失败
|
|
43
43
|
* 本质上和Promise.all差不多,相比较之下
|
|
@@ -47,11 +47,11 @@ declare function makeCancelablePromise<T>(callback: (token: ICancellationToken)
|
|
|
47
47
|
* 注意:某一个promise失败时,会尽可能尝试调用其他promise的cancel,但不保证一定有效
|
|
48
48
|
* (有可能promiseA已经成功,但是primiseB在之后失败了)
|
|
49
49
|
*/
|
|
50
|
-
declare function parallelPromise(promiseList: Promise<any>[]): Promise<
|
|
50
|
+
declare function parallelPromise(promiseList: Promise<any>[]): Promise<LvErrorRef>;
|
|
51
51
|
/**
|
|
52
52
|
* 包装一个promise,提供超时能力
|
|
53
53
|
*/
|
|
54
|
-
declare function makePromiseWithTimeout<T>(callback: (token: ICancellationToken) => Promise<T |
|
|
54
|
+
declare function makePromiseWithTimeout<T>(callback: (token: ICancellationToken) => Promise<T | LvErrorOr<T>>, timeout: number, defaultValue?: T): Promise<LvErrorOr<T>>;
|
|
55
55
|
interface Deferred<T> {
|
|
56
56
|
resolve: (value: T | PromiseLike<T>) => void;
|
|
57
57
|
reject: (reason?: unknown) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/error/error-t.ts","../../src/error/error-const.ts","../../src/error/error-code.ts","../../src/dispose/dispose-base.ts","../../src/dispose/disposable-t.ts","../../src/dispose/disposable-utils.ts","../../src/structure/linked-list.ts","../../src/event/disposable-linked-list.ts","../../src/event/error-handler.ts","../../src/event/emitter.ts","../../src/async/cancellation.ts","../../src/promise/promise.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ILvErrorRef, ILvErrorOr, ILvRealErrorRef } from './error-base';\n\n//\n// Error类\n//\n// 用户给函数签名明确错误\n// function foo(): ILvErrorRef\n// return makeOk(); // 如果没有错误\n// return makeError(code, msg); // 指定错误码和携带消息\n//\n// const SomeError = LvErrorConst(code, msg); // 更推荐用LvErrorConst生成\n// return SomeError();\n//\n\nconst lvErrorRefSymbol = Symbol('lvErrorRef');\n\nfunction findJsError(error: ILvErrorRef | Error) {\n let obj: ILvErrorRef | Error | undefined = error;\n while (obj) {\n if (obj instanceof Error) {\n return obj;\n }\n obj = (obj as ILvErrorRef).cause;\n }\n // 如果没有Error,那就序列化lvError\n return new Error((error as ILvErrorRef).toString());\n}\n\nexport function makeOk<K>(): ILvErrorOr<never, K> {\n return {\n ok: true,\n value: null!,\n pair() {\n return [null, null!];\n },\n code: 0,\n msg: '',\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n}\n\nexport function makeOkWith<T, K = unknown>(value: T): ILvErrorOr<T, K> {\n return {\n ok: true,\n value,\n pair() {\n return [null, value];\n },\n code: 0,\n msg: '',\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n}\n\nfunction printCause(cause: ILvErrorRef | Error | undefined): string {\n if (cause === undefined) {\n return '';\n } else if (cause instanceof Error) {\n return `\\ncaused by [jsError]${cause.name}-${cause.message}`;\n } else {\n return `\\ncaused by [${cause.code}]${cause.msg}${cause.ok ? '' : printCause(cause.cause)}`;\n }\n}\n\nfunction internalMakeError<T>(code: number, msg: string, cause?: ILvErrorRef | Error, errorInfo?: T) {\n const errorRef: ILvRealErrorRef<T> = {\n ok: false,\n code,\n msg,\n cause,\n errorInfo,\n toString() {\n return `[${code}]${msg}.${cause ? printCause(cause) : ''}`;\n },\n pair() {\n return [errorRef, null];\n },\n stack: cause instanceof Error ? cause.stack : undefined,\n findJsError: () => findJsError(errorRef),\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n return errorRef;\n}\n\nexport function makeError<T = unknown>(code: number, msg: string, errorInfo?: T): ILvRealErrorRef<T> {\n return internalMakeError(code, msg, undefined, errorInfo);\n}\n\nexport function makeErrorBy<T = unknown>(\n code: number,\n msg: string,\n cause: ILvErrorRef | Error,\n errorInfo?: T,\n): ILvRealErrorRef<T> {\n return internalMakeError(code, msg, cause, errorInfo);\n}\n\nexport function isLvErrorRef(val: unknown): val is ILvErrorRef {\n return typeof val === 'object' && val !== null && lvErrorRefSymbol in val;\n}\n","import { makeError, makeErrorBy } from './error-t';\n\n//\n// Error编译时错误对象\n//\nexport function lvErrorConst(code: number, msg: string) {\n return (rewrite?: string | Error) => {\n if (!rewrite) {\n return makeError(code, msg);\n }\n if (typeof rewrite === 'string') {\n return makeError(code, rewrite);\n }\n return makeErrorBy(code, rewrite.message, rewrite);\n };\n}\n","import { lvErrorConst } from './error-const';\n\n/**\n * 提供了通用的错误码(+1至+256)\n *\n * 注意:这里只是提供了通用的错误码,方便服务使用,但并不是要求服务一定使用如下的错误码来表明某种错误\n */\nexport enum GenericError {\n Ok = 0,\n Cancelled = 1, // 操作被取消\n TimedOut = 2, // 操作超时\n PermissionDenied = 3, // 无权限\n AlreadyExists = 4, // 已经存在(文件/记录等)\n NotSupported = 5, // 操作不支持\n ResourceUnavailable = 6, // 资源不可用\n OutOfRange = 7, // (参数/结果等)发生越界\n InvalidArgument = 8, // 无效参数\n NetworkFailed = 9, // 网络失败\n Interrupted = 10, // 操作被中断(捕获异常转为错误)\n ResultNil = 11, // 结果不存在(null or undefined转为错误)\n}\n\n/**\n * 通用错误码所对应的编译时常量对象(ErrorConst)\n */\nexport const cancelledError = lvErrorConst(GenericError.Cancelled, 'operation(s) cancelled.');\nexport const timeoutError = lvErrorConst(GenericError.TimedOut, 'operation(s) timed out.');\nexport const permissionDeniedError = lvErrorConst(GenericError.PermissionDenied, 'permission denied.');\nexport const alreadyExistsError = lvErrorConst(GenericError.AlreadyExists, 'already exists.');\nexport const notSupportedError = lvErrorConst(GenericError.NotSupported, 'operation(s) not supported.');\nexport const resourceUnavailableError = lvErrorConst(\n GenericError.ResourceUnavailable,\n 'resource is unavailable.',\n);\nexport const outOfRangeError = lvErrorConst(GenericError.OutOfRange, 'out of range.');\nexport const invalidArgumentError = lvErrorConst(GenericError.InvalidArgument, 'invalid arguments.');\nexport const networkFailedError = lvErrorConst(GenericError.NetworkFailed, 'network failed.');\nexport const interruptedError = lvErrorConst(GenericError.Interrupted, 'interrupted.');\nexport const resultNilError = lvErrorConst(GenericError.ResultNil, 'result is nil.');\n","//\n// Disposable特征约束\n//\nexport interface IDisposable {\n dispose: () => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport const EmptyDispose = Object.freeze<IDisposable>({ dispose() {} });\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","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 { EmptyDispose, type IDisposable } from '@/dispose';\nimport type { Event } from '@/event';\nimport { Emitter } from '@/event';\n\n//\n// 任何可取消的异步调用 的令牌接口\n// 因为异步调用无法真正意义上取消,但是可以在异步任务的回调中增加该令牌作为参数\n// 以便在操作被取消时停止执行\n//\nexport interface ICancellationToken {\n // 标记是否进行过了cancel\n readonly isCancellationRequested: boolean;\n\n // 取消的原因\n readonly reason?: string;\n\n // 令牌调用cancel后触发的回调\n // 有如下特点\n // 1. 只会触发一次\n // 2. 当监听的时候token已经cancelled,仍然会触发一次\n readonly onCancellationRequested: (\n listener: () => any,\n thisArgs?: any,\n disposables?: IDisposable[],\n ) => IDisposable;\n}\n\n//\n// 编译时常量,一个快捷的事件响应\n// 用于当外界监听令牌取消时,直接触发回调\n//\nconst shortcutEvent: Event<[]> = Object.freeze(function (callback, context?): IDisposable {\n const handle = setTimeout(callback.bind(context), 0);\n\n return {\n dispose() {\n clearTimeout(handle);\n },\n };\n});\n\n//\n// 可取消异步调用的令牌实现\n// 默认是未取消状态,可以调用cancel进行取消\n//\nclass MutableToken implements ICancellationToken, IDisposable {\n // 是否已经取消该异步调用\n private _isCancelled = false;\n private _emitter: Emitter<[]> | null = null;\n private _reason?: string;\n\n public get reason(): undefined | string {\n return this._reason;\n }\n\n // 获取当前是否已经取消该异步调用\n public get isCancellationRequested(): boolean {\n return this._isCancelled;\n }\n\n // 外界可以监听异步取消发起\n public get onCancellationRequested(): Event<[]> {\n if (this._isCancelled) {\n return shortcutEvent;\n }\n if (!this._emitter) {\n this._emitter = new Emitter<[]>();\n }\n return this._emitter.event;\n }\n\n public cancel(reason?: string) {\n if (!this._isCancelled) {\n this._reason = reason;\n this._isCancelled = true;\n if (this._emitter) {\n this._emitter.fire();\n this.dispose();\n }\n }\n }\n\n public dispose(): void {\n if (this._emitter) {\n this._emitter.dispose();\n this._emitter = null;\n }\n }\n}\n\n//\n// 编译期提供的一些常量Token\n// 不可修改\n//\n// eslint-disable-next-line unicorn/no-static-only-class, @typescript-eslint/no-extraneous-class\nexport class CancellationToken {\n static None = Object.freeze<ICancellationToken>({\n isCancellationRequested: false,\n onCancellationRequested: () => EmptyDispose,\n });\n\n static Cancelled = Object.freeze<ICancellationToken>({\n isCancellationRequested: true,\n onCancellationRequested: shortcutEvent,\n });\n\n static Make = (reason: string) => {\n return Object.freeze<ICancellationToken>({\n isCancellationRequested: true,\n onCancellationRequested: shortcutEvent,\n reason,\n });\n };\n}\n\n//\n// 任何可取消的异步调用 的控制类\n// 参考ICancellationToken,我们通过在异步调用的回调中添加token参数来判断异步调用的状态\n// token来源于CancellationTokenSource\n// CancellationTokenSource也会暴露cancel的接口\n//\n// 使用方式\n// const tokenSource = new CancellationTokenSource();\n//\n// asyncCall(() => {\n// if (token.isCancellationRequested) { return; } // 如果cancelled\n// doSomething();\n// });\n//\n// tokenSource.cancel(); // 因为某些情况,可能会cancel\n// tokenSource.dispose(); // dispose时一定会cancel\n//\nexport class CancellationTokenSource implements IDisposable {\n // 真正的token\n private _token?: ICancellationToken = undefined;\n // 可能存在父级CancellationTokenSource\n private readonly _parentListener?: IDisposable = undefined;\n // 为了支持signal场景,所以在需要时会初始化浏览器提供的abortController原生结构\n private _abortController?: AbortController = undefined;\n\n constructor(parent?: ICancellationToken) {\n // 如果存在父级,当父对象cancel时,子对象也必须cancel\n this._parentListener = parent?.onCancellationRequested(this.cancel, this);\n }\n\n /**\n * 传统的cancellation用法\n */\n public get token(): ICancellationToken {\n if (!this._token) {\n this._token = new MutableToken();\n }\n return this._token;\n }\n\n /**\n * 对齐浏览器提供的abortSignal,支持给fetch、axios等传参使用\n */\n public get signal(): AbortSignal {\n if (this._abortController) {\n return this._abortController.signal;\n }\n this._abortController = new AbortController();\n if (this._token?.isCancellationRequested) {\n this._abortController.abort();\n }\n return this._abortController.signal;\n }\n\n public cancel(reason?: string): void {\n if (!this._token) {\n // 如果没有使用过token就直接cancel,那么就返回一个常量即可\n this._token = reason === undefined ? CancellationToken.Cancelled : CancellationToken.Make(reason);\n } else if (this._token instanceof MutableToken) {\n this._token.cancel(reason);\n }\n if (this._abortController) {\n this._abortController.abort(reason);\n }\n }\n\n public dispose(cancel = false): void {\n if (cancel) {\n this.cancel();\n }\n this._parentListener?.dispose();\n if (!this._token) {\n this._token = CancellationToken.None;\n } else if (this._token instanceof MutableToken) {\n this._token.dispose();\n }\n }\n}\n","import {\n makeOkWith,\n type ILvErrorOr,\n cancelledError,\n GenericError,\n timeoutError,\n type ILvErrorRef,\n makeOk,\n isLvErrorRef,\n} from '../error';\nimport type { ICancellationToken } from '../async';\nimport { CancellationTokenSource } from '../async';\n\n/**\n * 一般来说Promise常用的场景有:\n * 1. 单次异步调用(new Promise)\n * 2. 批量promise调用(Promise.all)\n * 3. promise竞速调用(Promise.race)\n *\n * 但是原生能力有如下的缺陷\n * 1. 不支持取消某一次promise调用\n * 2. 不支持错误语义,promise.catch的重视程度比try catch还低\n * 3. 超时行为需要基于race封装\n *\n * 针对这三点,基建侧提供了高阶的promise能力\n * 1. makeCancelablePromise 返回一个可取消的promise\n * const promise = makeCancelablePromise(() => { ... });\n * promise.then((res) => {\n * // res是一个ILvErrorRef对象\n * });\n * // 可以直接取消promise\n * promise.cancel();\n *\n * 2. parallelPromise 并发执行promise,会自动观测ILvErrorRef语义\n * 当单个promise出现错误返回时,promise执行失败,尽可能调用所有cancelablePromise\n * 当单个promise出现reject时,promise执行失败,尽可能调用所有cancelablePromise,并且将reject继续上抛\n *\n * 3. makePromiseWithTimeout 让promise支持超时,可以提供默认值\n *\n * ——————————————————\n * Promise.allSettled和Promise.any在实际使用中场景较少,暂不提供错误语义包装\n */\n\n//\n// 可以cancel的promise对象\n//\nexport interface CancelablePromise<T> extends Promise<T> {\n cancel: () => void;\n}\n\n/**\n * 快速生成一个CancelablePromise对象\n */\nexport function makeCancelablePromise<T>(\n callback: (token: ICancellationToken) => Promise<T | ILvErrorOr<T>>,\n): CancelablePromise<ILvErrorOr<T>> {\n const source = new CancellationTokenSource();\n const thenable = callback(source.token);\n const promise = new Promise<ILvErrorOr<T>>((resolve, reject) => {\n const subscription = source.token.onCancellationRequested(() => {\n subscription.dispose();\n source.dispose();\n resolve(cancelledError());\n });\n Promise.resolve(thenable).then(\n (value) => {\n subscription.dispose();\n source.dispose();\n if (isLvErrorRef(value)) {\n resolve(value);\n } else {\n resolve(makeOkWith(value as T));\n }\n },\n (err) => {\n subscription.dispose();\n source.dispose();\n reject(err);\n },\n );\n });\n return new (class {\n cancel() {\n source.cancel();\n }\n then<TResult1 = T, TResult2 = never>(\n resolve?: ((value: ILvErrorOr<T>) => TResult1 | Promise<TResult1>) | undefined | null,\n reject?: ((reason: any) => TResult2 | Promise<TResult2>) | undefined | null,\n ): Promise<TResult1 | TResult2> {\n return promise.then(resolve, reject);\n }\n catch<TResult = never>(\n reject?: ((reason: any) => TResult | Promise<TResult>) | undefined | null,\n ): Promise<T | TResult> {\n return this.then(undefined, reject);\n }\n finally(onfinally?: (() => void) | undefined | null): Promise<ILvErrorOr<T>> {\n return promise.finally(onfinally);\n }\n })() as CancelablePromise<ILvErrorOr<T>>;\n}\n\n/**\n * 并行执行promise,当某一个失败,本次调用失败\n * 本质上和Promise.all差不多,相比较之下\n * 1. 包装了错误语义判断\n * 2. 当失败时,会尽可能尝试cancel其他promise\n *\n * 注意:某一个promise失败时,会尽可能尝试调用其他promise的cancel,但不保证一定有效\n * (有可能promiseA已经成功,但是primiseB在之后失败了)\n */\nexport function parallelPromise(promiseList: Promise<any>[]): Promise<ILvErrorRef> {\n if (promiseList.length === 0) {\n return Promise.resolve(makeOk());\n }\n\n let todo = promiseList.length;\n const finish = () => {\n todo = -1;\n for (const promise of promiseList) {\n (promise as Partial<CancelablePromise<any>>).cancel?.();\n }\n };\n\n return new Promise<ILvErrorRef>((resolve, reject) => {\n for (const promise of promiseList) {\n promise\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n .then((res) => {\n if (isLvErrorRef(res) && !res.ok) {\n finish();\n resolve(res as ILvErrorRef);\n return;\n }\n todo--;\n if (todo === 0) {\n resolve(makeOk());\n }\n })\n .catch((err) => {\n finish();\n reject(err);\n });\n }\n });\n}\n\n/**\n * 包装一个promise,提供超时能力\n */\nexport function makePromiseWithTimeout<T>(\n callback: (token: ICancellationToken) => Promise<T | ILvErrorOr<T>>,\n timeout: number,\n defaultValue?: T, // 当发生超时时,提供的默认值\n): Promise<ILvErrorOr<T>> {\n const cancellable = makeCancelablePromise<T>(callback);\n const timer = setTimeout(() => {\n cancellable.cancel();\n }, timeout);\n return cancellable.then((res: ILvErrorOr<T>) => {\n clearTimeout(timer);\n if (res.ok) {\n return res;\n }\n // 如果是被取消,触发了超时\n if (res.code === GenericError.Cancelled) {\n if (defaultValue !== undefined) {\n // 希望返回默认值\n return makeOkWith(defaultValue);\n }\n return timeoutError();\n } else {\n // 遇到其他错误时透传错误\n return res;\n }\n });\n}\n\n// 如果 proposal-promise-with-resolvers 通过了,那么这个函数就可以去掉了\n// https://github.com/microsoft/TypeScript/blob/1d96eb489e559f4f61522edb3c8b5987bbe948af/src/harness/util.ts#L115\nexport interface Deferred<T> {\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: unknown) => void;\n promise: Promise<T>;\n}\n\nexport function defer<T = void>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n return { resolve, reject, promise };\n}\n\nexport function waitForAbortSignal(signal: AbortSignal) {\n const { promise, reject } = defer<never>();\n\n if (signal.aborted) {\n reject(signal.reason);\n }\n\n const handleAbort = () => {\n reject(signal.reason);\n signal.removeEventListener('abort', handleAbort);\n };\n\n signal.addEventListener('abort', handleAbort);\n\n return promise;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/error/error-t.ts","../../src/error/error-const.ts","../../src/error/error-code.ts","../../src/dispose/dispose-base.ts","../../src/dispose/disposable-t.ts","../../src/dispose/disposable-utils.ts","../../src/structure/linked-list.ts","../../src/event/disposable-linked-list.ts","../../src/event/error-handler.ts","../../src/event/emitter.ts","../../src/async/cancellation.ts","../../src/promise/promise.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { LvErrorRef, LvErrorOr, LvRealErrorRef } from './error-base';\n\n//\n// Error类\n//\n// 用户给函数签名明确错误\n// function foo(): LvErrorRef\n// return makeOk(); // 如果没有错误\n// return makeError(code, msg); // 指定错误码和携带消息\n//\n// const SomeError = LvErrorConst(code, msg); // 更推荐用LvErrorConst生成\n// return SomeError();\n//\n\nconst lvErrorRefSymbol = Symbol('lvErrorRef');\n\nfunction findJsError(error: LvErrorRef | Error) {\n let obj: LvErrorRef | Error | undefined = error;\n while (obj) {\n if (obj instanceof Error) {\n return obj;\n }\n obj = (obj as LvErrorRef).cause;\n }\n // 如果没有Error,那就序列化lvError\n return new Error((error as LvErrorRef).toString());\n}\n\nexport function makeOk<K>(): LvErrorOr<never, K> {\n return {\n ok: true,\n value: null!,\n pair() {\n return [null, null!];\n },\n code: 0,\n msg: '',\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n}\n\nexport function makeOkWith<T, K = unknown>(value: T): LvErrorOr<T, K> {\n return {\n ok: true,\n value,\n pair() {\n return [null, value];\n },\n code: 0,\n msg: '',\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n}\n\nfunction printCause(cause: LvErrorRef | Error | undefined): string {\n if (cause === undefined) {\n return '';\n } else if (cause instanceof Error) {\n return `\\ncaused by [jsError]${cause.name}-${cause.message}`;\n } else {\n return `\\ncaused by [${cause.code}]${cause.msg}${cause.ok ? '' : printCause(cause.cause)}`;\n }\n}\n\nfunction internalMakeError<T>(code: number, msg: string, cause?: LvErrorRef | Error, errorInfo?: T) {\n const errorRef: LvRealErrorRef<T> = {\n ok: false,\n code,\n msg,\n cause,\n errorInfo,\n toString() {\n return `[${code}]${msg}.${cause ? printCause(cause) : ''}`;\n },\n pair() {\n return [errorRef, null];\n },\n stack: cause instanceof Error ? cause.stack : undefined,\n findJsError: () => findJsError(errorRef),\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n return errorRef;\n}\n\nexport function makeError<T = unknown>(code: number, msg: string, errorInfo?: T): LvRealErrorRef<T> {\n return internalMakeError(code, msg, undefined, errorInfo);\n}\n\nexport function makeErrorBy<T = unknown>(\n code: number,\n msg: string,\n cause: LvErrorRef | Error,\n errorInfo?: T,\n): LvRealErrorRef<T> {\n return internalMakeError(code, msg, cause, errorInfo);\n}\n\nexport function isLvErrorRef(val: unknown): val is LvErrorRef {\n return typeof val === 'object' && val !== null && lvErrorRefSymbol in val;\n}\n","import { makeError, makeErrorBy } from './error-t';\n\n//\n// Error编译时错误对象\n//\nexport function lvErrorConst(code: number, msg: string) {\n return (rewrite?: string | Error) => {\n if (!rewrite) {\n return makeError(code, msg);\n }\n if (typeof rewrite === 'string') {\n return makeError(code, rewrite);\n }\n return makeErrorBy(code, rewrite.message, rewrite);\n };\n}\n","import { lvErrorConst } from './error-const';\n\n/**\n * 提供了通用的错误码(+1至+256)\n *\n * 注意:这里只是提供了通用的错误码,方便服务使用,但并不是要求服务一定使用如下的错误码来表明某种错误\n */\nexport enum GenericError {\n Ok = 0,\n Cancelled = 1, // 操作被取消\n TimedOut = 2, // 操作超时\n PermissionDenied = 3, // 无权限\n AlreadyExists = 4, // 已经存在(文件/记录等)\n NotSupported = 5, // 操作不支持\n ResourceUnavailable = 6, // 资源不可用\n OutOfRange = 7, // (参数/结果等)发生越界\n InvalidArgument = 8, // 无效参数\n NetworkFailed = 9, // 网络失败\n Interrupted = 10, // 操作被中断(捕获异常转为错误)\n ResultNil = 11, // 结果不存在(null or undefined转为错误)\n}\n\n/**\n * 通用错误码所对应的编译时常量对象(ErrorConst)\n */\nexport const cancelledError = lvErrorConst(GenericError.Cancelled, 'operation(s) cancelled.');\nexport const timeoutError = lvErrorConst(GenericError.TimedOut, 'operation(s) timed out.');\nexport const permissionDeniedError = lvErrorConst(GenericError.PermissionDenied, 'permission denied.');\nexport const alreadyExistsError = lvErrorConst(GenericError.AlreadyExists, 'already exists.');\nexport const notSupportedError = lvErrorConst(GenericError.NotSupported, 'operation(s) not supported.');\nexport const resourceUnavailableError = lvErrorConst(\n GenericError.ResourceUnavailable,\n 'resource is unavailable.',\n);\nexport const outOfRangeError = lvErrorConst(GenericError.OutOfRange, 'out of range.');\nexport const invalidArgumentError = lvErrorConst(GenericError.InvalidArgument, 'invalid arguments.');\nexport const networkFailedError = lvErrorConst(GenericError.NetworkFailed, 'network failed.');\nexport const interruptedError = lvErrorConst(GenericError.Interrupted, 'interrupted.');\nexport const resultNilError = lvErrorConst(GenericError.ResultNil, 'result is nil.');\n","//\n// Disposable特征约束\n//\nexport interface IDisposable {\n dispose: () => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport const EmptyDispose = Object.freeze<IDisposable>({ dispose() {} });\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","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 { EmptyDispose, type IDisposable } from '@/dispose';\nimport type { Event } from '@/event';\nimport { Emitter } from '@/event';\n\n//\n// 任何可取消的异步调用 的令牌接口\n// 因为异步调用无法真正意义上取消,但是可以在异步任务的回调中增加该令牌作为参数\n// 以便在操作被取消时停止执行\n//\nexport interface ICancellationToken {\n // 标记是否进行过了cancel\n readonly isCancellationRequested: boolean;\n\n // 取消的原因\n readonly reason?: string;\n\n // 令牌调用cancel后触发的回调\n // 有如下特点\n // 1. 只会触发一次\n // 2. 当监听的时候token已经cancelled,仍然会触发一次\n readonly onCancellationRequested: (\n listener: () => any,\n thisArgs?: any,\n disposables?: IDisposable[],\n ) => IDisposable;\n}\n\n//\n// 编译时常量,一个快捷的事件响应\n// 用于当外界监听令牌取消时,直接触发回调\n//\nconst shortcutEvent: Event<[]> = Object.freeze(function (callback, context?): IDisposable {\n const handle = setTimeout(callback.bind(context), 0);\n\n return {\n dispose() {\n clearTimeout(handle);\n },\n };\n});\n\n//\n// 可取消异步调用的令牌实现\n// 默认是未取消状态,可以调用cancel进行取消\n//\nclass MutableToken implements ICancellationToken, IDisposable {\n // 是否已经取消该异步调用\n private _isCancelled = false;\n private _emitter: Emitter<[]> | null = null;\n private _reason?: string;\n\n public get reason(): undefined | string {\n return this._reason;\n }\n\n // 获取当前是否已经取消该异步调用\n public get isCancellationRequested(): boolean {\n return this._isCancelled;\n }\n\n // 外界可以监听异步取消发起\n public get onCancellationRequested(): Event<[]> {\n if (this._isCancelled) {\n return shortcutEvent;\n }\n if (!this._emitter) {\n this._emitter = new Emitter<[]>();\n }\n return this._emitter.event;\n }\n\n public cancel(reason?: string) {\n if (!this._isCancelled) {\n this._reason = reason;\n this._isCancelled = true;\n if (this._emitter) {\n this._emitter.fire();\n this.dispose();\n }\n }\n }\n\n public dispose(): void {\n if (this._emitter) {\n this._emitter.dispose();\n this._emitter = null;\n }\n }\n}\n\n//\n// 编译期提供的一些常量Token\n// 不可修改\n//\n// eslint-disable-next-line unicorn/no-static-only-class, @typescript-eslint/no-extraneous-class\nexport class CancellationToken {\n static None = Object.freeze<ICancellationToken>({\n isCancellationRequested: false,\n onCancellationRequested: () => EmptyDispose,\n });\n\n static Cancelled = Object.freeze<ICancellationToken>({\n isCancellationRequested: true,\n onCancellationRequested: shortcutEvent,\n });\n\n static Make = (reason: string) => {\n return Object.freeze<ICancellationToken>({\n isCancellationRequested: true,\n onCancellationRequested: shortcutEvent,\n reason,\n });\n };\n}\n\n//\n// 任何可取消的异步调用 的控制类\n// 参考ICancellationToken,我们通过在异步调用的回调中添加token参数来判断异步调用的状态\n// token来源于CancellationTokenSource\n// CancellationTokenSource也会暴露cancel的接口\n//\n// 使用方式\n// const tokenSource = new CancellationTokenSource();\n//\n// asyncCall(() => {\n// if (token.isCancellationRequested) { return; } // 如果cancelled\n// doSomething();\n// });\n//\n// tokenSource.cancel(); // 因为某些情况,可能会cancel\n// tokenSource.dispose(); // dispose时一定会cancel\n//\nexport class CancellationTokenSource implements IDisposable {\n // 真正的token\n private _token?: ICancellationToken = undefined;\n // 可能存在父级CancellationTokenSource\n private readonly _parentListener?: IDisposable = undefined;\n // 为了支持signal场景,所以在需要时会初始化浏览器提供的abortController原生结构\n private _abortController?: AbortController = undefined;\n\n constructor(parent?: ICancellationToken) {\n // 如果存在父级,当父对象cancel时,子对象也必须cancel\n this._parentListener = parent?.onCancellationRequested(this.cancel, this);\n }\n\n /**\n * 传统的cancellation用法\n */\n public get token(): ICancellationToken {\n if (!this._token) {\n this._token = new MutableToken();\n }\n return this._token;\n }\n\n /**\n * 对齐浏览器提供的abortSignal,支持给fetch、axios等传参使用\n */\n public get signal(): AbortSignal {\n if (this._abortController) {\n return this._abortController.signal;\n }\n this._abortController = new AbortController();\n if (this._token?.isCancellationRequested) {\n this._abortController.abort();\n }\n return this._abortController.signal;\n }\n\n public cancel(reason?: string): void {\n if (!this._token) {\n // 如果没有使用过token就直接cancel,那么就返回一个常量即可\n this._token = reason === undefined ? CancellationToken.Cancelled : CancellationToken.Make(reason);\n } else if (this._token instanceof MutableToken) {\n this._token.cancel(reason);\n }\n if (this._abortController) {\n this._abortController.abort(reason);\n }\n }\n\n public dispose(cancel = false): void {\n if (cancel) {\n this.cancel();\n }\n this._parentListener?.dispose();\n if (!this._token) {\n this._token = CancellationToken.None;\n } else if (this._token instanceof MutableToken) {\n this._token.dispose();\n }\n }\n}\n","import {\n makeOkWith,\n type LvErrorOr,\n cancelledError,\n GenericError,\n timeoutError,\n type LvErrorRef,\n makeOk,\n isLvErrorRef,\n} from '../error';\nimport type { ICancellationToken } from '../async';\nimport { CancellationTokenSource } from '../async';\n\n/**\n * 一般来说Promise常用的场景有:\n * 1. 单次异步调用(new Promise)\n * 2. 批量promise调用(Promise.all)\n * 3. promise竞速调用(Promise.race)\n *\n * 但是原生能力有如下的缺陷\n * 1. 不支持取消某一次promise调用\n * 2. 不支持错误语义,promise.catch的重视程度比try catch还低\n * 3. 超时行为需要基于race封装\n *\n * 针对这三点,基建侧提供了高阶的promise能力\n * 1. makeCancelablePromise 返回一个可取消的promise\n * const promise = makeCancelablePromise(() => { ... });\n * promise.then((res) => {\n * // res是一个ILvErrorRef对象\n * });\n * // 可以直接取消promise\n * promise.cancel();\n *\n * 2. parallelPromise 并发执行promise,会自动观测ILvErrorRef语义\n * 当单个promise出现错误返回时,promise执行失败,尽可能调用所有cancelablePromise\n * 当单个promise出现reject时,promise执行失败,尽可能调用所有cancelablePromise,并且将reject继续上抛\n *\n * 3. makePromiseWithTimeout 让promise支持超时,可以提供默认值\n *\n * ——————————————————\n * Promise.allSettled和Promise.any在实际使用中场景较少,暂不提供错误语义包装\n */\n\n//\n// 可以cancel的promise对象\n//\nexport interface CancelablePromise<T> extends Promise<T> {\n cancel: () => void;\n}\n\n/**\n * 快速生成一个CancelablePromise对象\n */\nexport function makeCancelablePromise<T>(\n callback: (token: ICancellationToken) => Promise<T | LvErrorOr<T>>,\n): CancelablePromise<LvErrorOr<T>> {\n const source = new CancellationTokenSource();\n const thenable = callback(source.token);\n const promise = new Promise<LvErrorOr<T>>((resolve, reject) => {\n const subscription = source.token.onCancellationRequested(() => {\n subscription.dispose();\n source.dispose();\n resolve(cancelledError());\n });\n Promise.resolve(thenable).then(\n (value) => {\n subscription.dispose();\n source.dispose();\n if (isLvErrorRef(value)) {\n resolve(value);\n } else {\n resolve(makeOkWith(value as T));\n }\n },\n (err) => {\n subscription.dispose();\n source.dispose();\n reject(err);\n },\n );\n });\n return new (class {\n cancel() {\n source.cancel();\n }\n then<TResult1 = T, TResult2 = never>(\n resolve?: ((value: LvErrorOr<T>) => TResult1 | Promise<TResult1>) | undefined | null,\n reject?: ((reason: any) => TResult2 | Promise<TResult2>) | undefined | null,\n ): Promise<TResult1 | TResult2> {\n return promise.then(resolve, reject);\n }\n catch<TResult = never>(\n reject?: ((reason: any) => TResult | Promise<TResult>) | undefined | null,\n ): Promise<T | TResult> {\n return this.then(undefined, reject);\n }\n finally(onfinally?: (() => void) | undefined | null): Promise<LvErrorOr<T>> {\n return promise.finally(onfinally);\n }\n })() as CancelablePromise<LvErrorOr<T>>;\n}\n\n/**\n * 并行执行promise,当某一个失败,本次调用失败\n * 本质上和Promise.all差不多,相比较之下\n * 1. 包装了错误语义判断\n * 2. 当失败时,会尽可能尝试cancel其他promise\n *\n * 注意:某一个promise失败时,会尽可能尝试调用其他promise的cancel,但不保证一定有效\n * (有可能promiseA已经成功,但是primiseB在之后失败了)\n */\nexport function parallelPromise(promiseList: Promise<any>[]): Promise<LvErrorRef> {\n if (promiseList.length === 0) {\n return Promise.resolve(makeOk());\n }\n\n let todo = promiseList.length;\n const finish = () => {\n todo = -1;\n for (const promise of promiseList) {\n (promise as Partial<CancelablePromise<any>>).cancel?.();\n }\n };\n\n return new Promise<LvErrorRef>((resolve, reject) => {\n for (const promise of promiseList) {\n promise\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n .then((res) => {\n if (isLvErrorRef(res) && !res.ok) {\n finish();\n resolve(res as LvErrorRef);\n return;\n }\n todo--;\n if (todo === 0) {\n resolve(makeOk());\n }\n })\n .catch((err) => {\n finish();\n reject(err);\n });\n }\n });\n}\n\n/**\n * 包装一个promise,提供超时能力\n */\nexport function makePromiseWithTimeout<T>(\n callback: (token: ICancellationToken) => Promise<T | LvErrorOr<T>>,\n timeout: number,\n defaultValue?: T, // 当发生超时时,提供的默认值\n): Promise<LvErrorOr<T>> {\n const cancellable = makeCancelablePromise<T>(callback);\n const timer = setTimeout(() => {\n cancellable.cancel();\n }, timeout);\n return cancellable.then((res: LvErrorOr<T>) => {\n clearTimeout(timer);\n if (res.ok) {\n return res;\n }\n // 如果是被取消,触发了超时\n if (res.code === GenericError.Cancelled) {\n if (defaultValue !== undefined) {\n // 希望返回默认值\n return makeOkWith(defaultValue);\n }\n return timeoutError();\n } else {\n // 遇到其他错误时透传错误\n return res;\n }\n });\n}\n\n// 如果 proposal-promise-with-resolvers 通过了,那么这个函数就可以去掉了\n// https://github.com/microsoft/TypeScript/blob/1d96eb489e559f4f61522edb3c8b5987bbe948af/src/harness/util.ts#L115\nexport interface Deferred<T> {\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: unknown) => void;\n promise: Promise<T>;\n}\n\nexport function defer<T = void>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n return { resolve, reject, promise };\n}\n\nexport function waitForAbortSignal(signal: AbortSignal) {\n const { promise, reject } = defer<never>();\n\n if (signal.aborted) {\n reject(signal.reason);\n }\n\n const handleAbort = () => {\n reject(signal.reason);\n signal.removeEventListener('abort', handleAbort);\n };\n\n signal.addEventListener('abort', handleAbort);\n\n return promise;\n}\n"]}
|