rockbed 0.1.0

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.
Files changed (62) hide show
  1. package/README.md +143 -0
  2. package/dist/assert/index.d.ts +6 -0
  3. package/dist/assert/index.js +27 -0
  4. package/dist/assert/index.js.map +1 -0
  5. package/dist/async/index.d.ts +105 -0
  6. package/dist/async/index.js +380 -0
  7. package/dist/async/index.js.map +1 -0
  8. package/dist/dispose/index.d.ts +47 -0
  9. package/dist/dispose/index.js +166 -0
  10. package/dist/dispose/index.js.map +1 -0
  11. package/dist/dispose-base-CAeXDpjg.d.ts +6 -0
  12. package/dist/error/index.d.ts +46 -0
  13. package/dist/error/index.js +150 -0
  14. package/dist/error/index.js.map +1 -0
  15. package/dist/error-base-BWuBlS2k.d.ts +28 -0
  16. package/dist/event/index.d.ts +57 -0
  17. package/dist/event/index.js +167 -0
  18. package/dist/event/index.js.map +1 -0
  19. package/dist/index.d.ts +10 -0
  20. package/dist/index.js +989 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/json/index.d.ts +4 -0
  23. package/dist/json/index.js +20 -0
  24. package/dist/json/index.js.map +1 -0
  25. package/dist/lock/index.d.ts +106 -0
  26. package/dist/lock/index.js +404 -0
  27. package/dist/lock/index.js.map +1 -0
  28. package/dist/response/index.d.ts +17 -0
  29. package/dist/response/index.js +19 -0
  30. package/dist/response/index.js.map +1 -0
  31. package/package.json +80 -0
  32. package/src/assert/assert.ts +24 -0
  33. package/src/assert/index.ts +2 -0
  34. package/src/async/barrier.ts +47 -0
  35. package/src/async/index.ts +8 -0
  36. package/src/async/promise.ts +316 -0
  37. package/src/async/wait.ts +7 -0
  38. package/src/dispose/disposable-store.ts +68 -0
  39. package/src/dispose/disposable-t.ts +85 -0
  40. package/src/dispose/disposable-utils.ts +13 -0
  41. package/src/dispose/dispose-base.ts +9 -0
  42. package/src/dispose/index.ts +8 -0
  43. package/src/dispose/logger.ts +41 -0
  44. package/src/error/error-base.ts +39 -0
  45. package/src/error/error-code.ts +48 -0
  46. package/src/error/error-const.ts +16 -0
  47. package/src/error/error-or.ts +2 -0
  48. package/src/error/error-t.ts +93 -0
  49. package/src/error/index.ts +5 -0
  50. package/src/event/emitter.ts +193 -0
  51. package/src/event/index.ts +10 -0
  52. package/src/index.ts +8 -0
  53. package/src/json/index.ts +1 -0
  54. package/src/json/json.ts +15 -0
  55. package/src/lock/README.md +11 -0
  56. package/src/lock/capability.ts +89 -0
  57. package/src/lock/index.ts +2 -0
  58. package/src/lock/semaphore.ts +21 -0
  59. package/src/lock/shared-mutex.ts +256 -0
  60. package/src/response/index.ts +1 -0
  61. package/src/response/response.ts +27 -0
  62. package/tsconfig.json +23 -0
@@ -0,0 +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/async/promise.ts","../../src/async/wait.ts","../../src/async/barrier.ts"],"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\nexport function makeOk(): ILvErrorOr<never> {\n return {\n ok: true,\n value: null!,\n pair() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return [null, null!] as any;\n },\n code: 0,\n msg: '',\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n}\n\nexport function makeOkWith<T>(value: T): ILvErrorOr<T> {\n return {\n ok: true,\n value,\n pair() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return [null, value] as any;\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(\n code: number,\n msg: string,\n cause?: ILvErrorRef | Error,\n errorInfo?: unknown,\n) {\n const errorRef: ILvRealErrorRef = {\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 ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n return errorRef;\n}\n\nexport function makeError(code: number, msg: string, errorInfo?: unknown): ILvRealErrorRef {\n return internalMakeError(code, msg, undefined, errorInfo);\n}\n\nexport function makeErrorBy(\n code: number,\n msg: string,\n cause: ILvErrorRef | Error,\n errorInfo?: unknown,\n): ILvRealErrorRef {\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(\n GenericError.PermissionDenied,\n 'permission denied.',\n);\nexport const alreadyExistsError = lvErrorConst(GenericError.AlreadyExists, 'already exists.');\nexport const notSupportedError = lvErrorConst(\n GenericError.NotSupported,\n 'operation(s) not supported.',\n);\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(\n GenericError.InvalidArgument,\n 'invalid arguments.',\n);\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 { DisposableStore } from './disposable-store';\nimport type { IDisposable } from './dispose-base';\nimport { BRANCH_DISPOSE } from './logger';\n\n//\n// Disposable基类\n//\n// 自动添加DisposableStore,提供默认的dispose和register方法\n//\nexport abstract class Disposable implements IDisposable {\n protected readonly _store = new DisposableStore();\n\n // 销毁该节点和所有的子节点\n dispose(): void {\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\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value?: T;\n private _isDisposed = false;\n\n constructor(value?: T) {\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 this._value = value;\n }\n\n clear(): void {\n this.value = undefined;\n }\n\n dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n\n release(): T | undefined {\n const oldValue = this._value;\n this._value = undefined;\n return oldValue;\n }\n}\n\nexport class SafeDisposable<T extends IDisposable> implements IDisposable {\n private _value: T | null = null;\n\n constructor(value: T) {\n this._value = value;\n }\n\n isEmpty() {\n return this._value === null;\n }\n\n dispose() {\n if (!this._value) {\n return;\n }\n this._value.dispose();\n this._value = null;\n }\n}\n","import { SafeDisposable } from './disposable-t';\nimport { EmptyDispose } from './dispose-base';\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","/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */\nimport {\n makeOkWith,\n type ILvErrorOr,\n cancelledError,\n GenericError,\n timeoutError,\n type ILvErrorRef,\n makeOk,\n isLvErrorRef,\n} from '../error';\nimport { EmptyDispose, makeSafeDisposable, type IDisposable } from '../dispose';\n\nexport interface ICancellationToken {\n readonly isCancellationRequested: boolean;\n readonly reason?: string;\n readonly onCancellationRequested: (\n listener: () => any,\n thisArgs?: any,\n ) => IDisposable;\n}\n\nconst shortcutCancellationEvent = (callback: () => any, context?: any): IDisposable => {\n const handle = setTimeout(callback.bind(context), 0);\n return makeSafeDisposable(() => clearTimeout(handle));\n};\n\nclass MutableToken implements ICancellationToken, IDisposable {\n private _isCancelled = false;\n private _reason?: string;\n private readonly _listeners = new Set<() => void>();\n\n get isCancellationRequested(): boolean {\n return this._isCancelled;\n }\n\n get reason(): string | undefined {\n return this._reason;\n }\n\n onCancellationRequested(listener: () => any, thisArgs?: any): IDisposable {\n if (this._isCancelled) {\n return shortcutCancellationEvent(listener, thisArgs);\n }\n\n const wrappedListener = listener.bind(thisArgs);\n this._listeners.add(wrappedListener);\n return makeSafeDisposable(() => {\n this._listeners.delete(wrappedListener);\n });\n }\n\n cancel(reason?: string): void {\n if (this._isCancelled) {\n return;\n }\n\n this._reason = reason;\n this._isCancelled = true;\n for (const listener of this._listeners) {\n listener();\n }\n this._listeners.clear();\n }\n\n dispose(): void {\n this._listeners.clear();\n }\n}\n\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: shortcutCancellationEvent,\n });\n\n static Make(reason: string): ICancellationToken {\n return Object.freeze<ICancellationToken>({\n isCancellationRequested: true,\n onCancellationRequested: shortcutCancellationEvent,\n reason,\n });\n }\n}\n\nexport class CancellationTokenSource implements IDisposable {\n private _token?: ICancellationToken;\n private _abortController?: AbortController;\n\n get token(): ICancellationToken {\n if (!this._token) {\n this._token = new MutableToken();\n }\n return this._token;\n }\n\n get signal(): AbortSignal {\n if (!this._abortController) {\n this._abortController = new AbortController();\n }\n if (this._token?.isCancellationRequested) {\n this._abortController.abort(this._token.reason);\n }\n return this._abortController.signal;\n }\n\n cancel(reason?: string): void {\n if (!this._token) {\n this._token =\n reason === undefined ? CancellationToken.Cancelled : CancellationToken.Make(reason);\n } else if (this._token instanceof MutableToken) {\n this._token.cancel(reason);\n }\n this._abortController?.abort(reason);\n }\n\n dispose(cancel = false): void {\n if (cancel) {\n this.cancel();\n }\n if (!this._token) {\n this._token = CancellationToken.None;\n } else if (this._token instanceof MutableToken) {\n this._token.dispose();\n }\n }\n}\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>) | null,\n reject?: ((reason: any) => TResult2 | Promise<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return promise.then(resolve, reject);\n }\n catch<TResult = never>(\n reject?: ((reason: any) => TResult | Promise<TResult>) | null,\n ): Promise<T | TResult> {\n return this.then(undefined, reject);\n }\n finally(onfinally?: (() => void) | 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\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\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","/**\n * 等待一段时间\n * @param ms 单位毫秒\n */\nexport function wait(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export interface IBarrier {\n isOpen: () => boolean;\n open: () => void;\n wait: () => Promise<boolean>;\n}\n\n/**\n * A barrier that is initially closed and then becomes opened permanently after a certain period of\n * time or when open is called explicitly\n */\nexport class Barrier {\n private _isOpen: boolean;\n private readonly _promise: Promise<boolean>;\n private _completePromise!: (v: boolean) => void;\n\n constructor() {\n this._isOpen = false;\n this._promise = new Promise<boolean>((c, e) => {\n this._completePromise = c;\n });\n }\n\n isOpen(): boolean {\n return this._isOpen;\n }\n\n open(): void {\n this._isOpen = true;\n this._completePromise(true);\n }\n\n wait(): Promise<boolean> {\n return this._promise;\n }\n}\n\nexport function makeBarrierByPromise(promise: Promise<any>, openWhenReject: boolean = false) {\n const barrier = new Barrier();\n promise.then(() => barrier.open());\n if (openWhenReject) {\n promise.catch((err) => {\n barrier.open();\n throw err;\n });\n }\n return barrier;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,47 @@
1
+ import { I as IDisposable } from '../dispose-base-CAeXDpjg.js';
2
+ export { E as EmptyDispose } from '../dispose-base-CAeXDpjg.js';
3
+
4
+ declare class DisposableStore implements IDisposable {
5
+ static DISABLE_DISPOSED_WARNING: boolean;
6
+ private readonly _toDispose;
7
+ private _isDisposed;
8
+ get isDisposed(): boolean;
9
+ dispose(): void;
10
+ clear(): void;
11
+ add<T extends IDisposable>(o: T): T;
12
+ }
13
+
14
+ declare abstract class Disposable implements IDisposable {
15
+ protected readonly _store: DisposableStore;
16
+ dispose(): void;
17
+ protected _register<T extends IDisposable>(o: T): T;
18
+ }
19
+ declare class MutableDisposable<T extends IDisposable> implements IDisposable {
20
+ private _value?;
21
+ private _isDisposed;
22
+ constructor(value?: T);
23
+ get value(): T | undefined;
24
+ set value(value: T | undefined);
25
+ clear(): void;
26
+ dispose(): void;
27
+ release(): T | undefined;
28
+ }
29
+ declare class SafeDisposable<T extends IDisposable> implements IDisposable {
30
+ private _value;
31
+ constructor(value: T);
32
+ isEmpty(): boolean;
33
+ dispose(): void;
34
+ }
35
+
36
+ declare function makeSafeDisposable(fn: (...args: any) => any): SafeDisposable<{
37
+ dispose: (...args: any) => any;
38
+ }>;
39
+ declare function makeEmptyDisposable(): Readonly<IDisposable>;
40
+
41
+ interface IDisposableLogger {
42
+ branch: (from: string, to: string) => void;
43
+ end: () => void;
44
+ }
45
+ declare function disposeWithLog<T extends IDisposable>(x: T, logger?: IDisposableLogger): void;
46
+
47
+ export { Disposable, DisposableStore, IDisposable, type IDisposableLogger, MutableDisposable, SafeDisposable, disposeWithLog, makeEmptyDisposable, makeSafeDisposable };
@@ -0,0 +1,166 @@
1
+ // src/dispose/dispose-base.ts
2
+ var EmptyDispose = Object.freeze({ dispose() {
3
+ } });
4
+
5
+ // src/dispose/logger.ts
6
+ var disposableLogger = null;
7
+ function setDisposableLogger(logger) {
8
+ disposableLogger = logger;
9
+ }
10
+ function makeDefaultLogger() {
11
+ return new class {
12
+ _dep = [];
13
+ branch(from, to) {
14
+ this._dep.push([from, to]);
15
+ }
16
+ end() {
17
+ }
18
+ }();
19
+ }
20
+ function BRANCH_DISPOSE(from, to) {
21
+ disposableLogger?.branch(from, to);
22
+ }
23
+ function disposeWithLog(x, logger = makeDefaultLogger()) {
24
+ setDisposableLogger(logger);
25
+ x.dispose();
26
+ logger.end();
27
+ setDisposableLogger(null);
28
+ }
29
+
30
+ // src/dispose/disposable-store.ts
31
+ var DisposableStore = class _DisposableStore {
32
+ static DISABLE_DISPOSED_WARNING = false;
33
+ _toDispose = /* @__PURE__ */ new Set();
34
+ _isDisposed = false;
35
+ get isDisposed() {
36
+ return this._isDisposed;
37
+ }
38
+ dispose() {
39
+ if (this._isDisposed) {
40
+ console.warn(new Error("DisposableStore has disposed.").stack);
41
+ return;
42
+ }
43
+ this._isDisposed = true;
44
+ this.clear();
45
+ }
46
+ clear() {
47
+ if (this._toDispose.size === 0) {
48
+ return;
49
+ }
50
+ for (const disposable of this._toDispose) {
51
+ BRANCH_DISPOSE(this.constructor.name, disposable.constructor.name);
52
+ }
53
+ try {
54
+ for (const disposable of this._toDispose) {
55
+ disposable.dispose();
56
+ }
57
+ } finally {
58
+ this._toDispose.clear();
59
+ }
60
+ }
61
+ add(o) {
62
+ if (!o) {
63
+ return o;
64
+ }
65
+ if (o === this) {
66
+ throw new Error("Cannot register a disposable on itself.");
67
+ }
68
+ if (this._isDisposed) {
69
+ if (!_DisposableStore.DISABLE_DISPOSED_WARNING) {
70
+ console.warn(
71
+ new Error(
72
+ "Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!"
73
+ ).stack
74
+ );
75
+ }
76
+ } else {
77
+ this._toDispose.add(o);
78
+ }
79
+ return o;
80
+ }
81
+ };
82
+
83
+ // src/dispose/disposable-t.ts
84
+ var Disposable = class {
85
+ _store = new DisposableStore();
86
+ // 销毁该节点和所有的子节点
87
+ dispose() {
88
+ BRANCH_DISPOSE(this.constructor.name, this._store.constructor.name);
89
+ this._store.dispose();
90
+ }
91
+ // 挂载子节点
92
+ _register(o) {
93
+ if (o === this) {
94
+ throw new Error("Cannot register a disposable on itself!");
95
+ }
96
+ return this._store.add(o);
97
+ }
98
+ };
99
+ var MutableDisposable = class {
100
+ _value;
101
+ _isDisposed = false;
102
+ constructor(value) {
103
+ this.value = value;
104
+ }
105
+ get value() {
106
+ return this._isDisposed ? void 0 : this._value;
107
+ }
108
+ set value(value) {
109
+ if (this._isDisposed || value === this._value) {
110
+ return;
111
+ }
112
+ this._value?.dispose();
113
+ this._value = value;
114
+ }
115
+ clear() {
116
+ this.value = void 0;
117
+ }
118
+ dispose() {
119
+ this._isDisposed = true;
120
+ this._value?.dispose();
121
+ this._value = void 0;
122
+ }
123
+ release() {
124
+ const oldValue = this._value;
125
+ this._value = void 0;
126
+ return oldValue;
127
+ }
128
+ };
129
+ var SafeDisposable = class {
130
+ _value = null;
131
+ constructor(value) {
132
+ this._value = value;
133
+ }
134
+ isEmpty() {
135
+ return this._value === null;
136
+ }
137
+ dispose() {
138
+ if (!this._value) {
139
+ return;
140
+ }
141
+ this._value.dispose();
142
+ this._value = null;
143
+ }
144
+ };
145
+
146
+ // src/dispose/disposable-utils.ts
147
+ function makeSafeDisposable(fn) {
148
+ const disposable = new SafeDisposable({
149
+ dispose: fn
150
+ });
151
+ return disposable;
152
+ }
153
+ function makeEmptyDisposable() {
154
+ return EmptyDispose;
155
+ }
156
+ export {
157
+ Disposable,
158
+ DisposableStore,
159
+ EmptyDispose,
160
+ MutableDisposable,
161
+ SafeDisposable,
162
+ disposeWithLog,
163
+ makeEmptyDisposable,
164
+ makeSafeDisposable
165
+ };
166
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/dispose/dispose-base.ts","../../src/dispose/logger.ts","../../src/dispose/disposable-store.ts","../../src/dispose/disposable-t.ts","../../src/dispose/disposable-utils.ts"],"sourcesContent":["//\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 type { IDisposable } from './dispose-base';\n\nlet disposableLogger: IDisposableLogger | null = null;\n\nexport interface IDisposableLogger {\n branch: (from: string, to: string) => void;\n end: () => void;\n}\n\nfunction setDisposableLogger(logger: IDisposableLogger | null): void {\n disposableLogger = logger;\n}\n\nfunction makeDefaultLogger() {\n return new (class implements IDisposableLogger {\n private readonly _dep: [string, string][] = [];\n\n branch(from: string, to: string): void {\n this._dep.push([from, to]);\n }\n\n end(): void {\n // console.log(this._dep);\n }\n })();\n}\n\n// 辅助能力 dispose触发时记录\nexport function BRANCH_DISPOSE(from: string, to: string) {\n disposableLogger?.branch(from, to);\n}\n\nexport function disposeWithLog<T extends IDisposable>(\n x: T,\n logger: IDisposableLogger = makeDefaultLogger(),\n) {\n setDisposableLogger(logger);\n x.dispose();\n logger.end();\n setDisposableLogger(null);\n}\n","import type { IDisposable } from './dispose-base';\nimport { BRANCH_DISPOSE } from './logger';\n\nexport class DisposableStore implements IDisposable {\n static DISABLE_DISPOSED_WARNING = false;\n\n private readonly _toDispose = new Set<IDisposable>();\n private _isDisposed = false;\n\n get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n dispose(): void {\n if (this._isDisposed) {\n // 不应该出现重复dispose\n /* eslint-disable no-console */\n console.warn(new Error('DisposableStore has disposed.').stack);\n return;\n }\n\n this._isDisposed = true;\n this.clear();\n }\n\n clear(): void {\n if (this._toDispose.size === 0) {\n return;\n }\n\n for (const disposable of this._toDispose) {\n BRANCH_DISPOSE(this.constructor.name, disposable.constructor.name);\n }\n\n try {\n // TODO(vorshen): 考虑异常情况\n for (const disposable of this._toDispose) {\n disposable.dispose();\n }\n } finally {\n this._toDispose.clear();\n }\n }\n\n add<T extends IDisposable>(o: T): T {\n if (!o) {\n return o;\n }\n if ((o as unknown as DisposableStore) === this) {\n throw new Error('Cannot register a disposable on itself.');\n }\n\n if (this._isDisposed) {\n if (!DisposableStore.DISABLE_DISPOSED_WARNING) {\n /* eslint-disable no-console */\n console.warn(\n new Error(\n 'Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!',\n ).stack,\n );\n }\n } else {\n this._toDispose.add(o);\n }\n\n return o;\n }\n}\n","import { DisposableStore } from './disposable-store';\nimport type { IDisposable } from './dispose-base';\nimport { BRANCH_DISPOSE } from './logger';\n\n//\n// Disposable基类\n//\n// 自动添加DisposableStore,提供默认的dispose和register方法\n//\nexport abstract class Disposable implements IDisposable {\n protected readonly _store = new DisposableStore();\n\n // 销毁该节点和所有的子节点\n dispose(): void {\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\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value?: T;\n private _isDisposed = false;\n\n constructor(value?: T) {\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 this._value = value;\n }\n\n clear(): void {\n this.value = undefined;\n }\n\n dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n\n release(): T | undefined {\n const oldValue = this._value;\n this._value = undefined;\n return oldValue;\n }\n}\n\nexport class SafeDisposable<T extends IDisposable> implements IDisposable {\n private _value: T | null = null;\n\n constructor(value: T) {\n this._value = value;\n }\n\n isEmpty() {\n return this._value === null;\n }\n\n dispose() {\n if (!this._value) {\n return;\n }\n this._value.dispose();\n this._value = null;\n }\n}\n","import { SafeDisposable } from './disposable-t';\nimport { EmptyDispose } from './dispose-base';\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"],"mappings":"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","names":[]}
@@ -0,0 +1,6 @@
1
+ interface IDisposable {
2
+ dispose: () => void;
3
+ }
4
+ declare const EmptyDispose: Readonly<IDisposable>;
5
+
6
+ export { EmptyDispose as E, type IDisposable as I };
@@ -0,0 +1,46 @@
1
+ import { b as ILvRealErrorRef, a as ILvErrorRef, I as ILvErrorOr } from '../error-base-BWuBlS2k.js';
2
+ export { c as ILvValueRef } from '../error-base-BWuBlS2k.js';
3
+
4
+ declare function lvErrorConst(code: number, msg: string): (rewrite?: string | Error) => ILvRealErrorRef;
5
+
6
+ declare function makeOk(): ILvErrorOr<never>;
7
+ declare function makeOkWith<T>(value: T): ILvErrorOr<T>;
8
+ declare function makeError(code: number, msg: string, errorInfo?: unknown): ILvRealErrorRef;
9
+ declare function makeErrorBy(code: number, msg: string, cause: ILvErrorRef | Error, errorInfo?: unknown): ILvRealErrorRef;
10
+ declare function isLvErrorRef(val: unknown): val is ILvErrorRef;
11
+
12
+ /**
13
+ * 提供了通用的错误码(+1至+256)
14
+ *
15
+ * 注意:这里只是提供了通用的错误码,方便服务使用,但并不是要求服务一定使用如下的错误码来表明某种错误
16
+ */
17
+ declare enum GenericError {
18
+ Ok = 0,
19
+ Cancelled = 1,// 操作被取消
20
+ TimedOut = 2,// 操作超时
21
+ PermissionDenied = 3,// 无权限
22
+ AlreadyExists = 4,// 已经存在(文件/记录等)
23
+ NotSupported = 5,// 操作不支持
24
+ ResourceUnavailable = 6,// 资源不可用
25
+ OutOfRange = 7,// (参数/结果等)发生越界
26
+ InvalidArgument = 8,// 无效参数
27
+ NetworkFailed = 9,// 网络失败
28
+ Interrupted = 10,// 操作被中断(捕获异常转为错误)
29
+ ResultNil = 11
30
+ }
31
+ /**
32
+ * 通用错误码所对应的编译时常量对象(ErrorConst)
33
+ */
34
+ declare const cancelledError: (rewrite?: string | Error) => ILvRealErrorRef;
35
+ declare const timeoutError: (rewrite?: string | Error) => ILvRealErrorRef;
36
+ declare const permissionDeniedError: (rewrite?: string | Error) => ILvRealErrorRef;
37
+ declare const alreadyExistsError: (rewrite?: string | Error) => ILvRealErrorRef;
38
+ declare const notSupportedError: (rewrite?: string | Error) => ILvRealErrorRef;
39
+ declare const resourceUnavailableError: (rewrite?: string | Error) => ILvRealErrorRef;
40
+ declare const outOfRangeError: (rewrite?: string | Error) => ILvRealErrorRef;
41
+ declare const invalidArgumentError: (rewrite?: string | Error) => ILvRealErrorRef;
42
+ declare const networkFailedError: (rewrite?: string | Error) => ILvRealErrorRef;
43
+ declare const interruptedError: (rewrite?: string | Error) => ILvRealErrorRef;
44
+ declare const resultNilError: (rewrite?: string | Error) => ILvRealErrorRef;
45
+
46
+ export { GenericError, ILvErrorOr, ILvErrorRef, ILvRealErrorRef, alreadyExistsError, cancelledError, interruptedError, invalidArgumentError, isLvErrorRef, lvErrorConst, makeError, makeErrorBy, makeOk, makeOkWith, networkFailedError, notSupportedError, outOfRangeError, permissionDeniedError, resourceUnavailableError, resultNilError, timeoutError };
@@ -0,0 +1,150 @@
1
+ // src/error/error-base.ts
2
+ var ILvErrorRef = /* @__PURE__ */ Symbol.for("rockbed.ILvErrorRef");
3
+ var ILvRealErrorRef = /* @__PURE__ */ Symbol.for("rockbed.ILvRealErrorRef");
4
+ var ILvValueRef = /* @__PURE__ */ Symbol.for("rockbed.ILvValueRef");
5
+ var ILvErrorOr = /* @__PURE__ */ Symbol.for("rockbed.ILvErrorOr");
6
+
7
+ // src/error/error-t.ts
8
+ var lvErrorRefSymbol = /* @__PURE__ */ Symbol("lvErrorRef");
9
+ function makeOk() {
10
+ return {
11
+ ok: true,
12
+ value: null,
13
+ pair() {
14
+ return [null, null];
15
+ },
16
+ code: 0,
17
+ msg: "",
18
+ ...{ [lvErrorRefSymbol]: true }
19
+ // 跳过类型检测
20
+ };
21
+ }
22
+ function makeOkWith(value) {
23
+ return {
24
+ ok: true,
25
+ value,
26
+ pair() {
27
+ return [null, value];
28
+ },
29
+ code: 0,
30
+ msg: "",
31
+ ...{ [lvErrorRefSymbol]: true }
32
+ // 跳过类型检测
33
+ };
34
+ }
35
+ function printCause(cause) {
36
+ if (cause === void 0) {
37
+ return "";
38
+ } else if (cause instanceof Error) {
39
+ return `
40
+ caused by [jsError]${cause.name}-${cause.message}`;
41
+ } else {
42
+ return `
43
+ caused by [${cause.code}]${cause.msg}${cause.ok ? "" : printCause(cause.cause)}`;
44
+ }
45
+ }
46
+ function internalMakeError(code, msg, cause, errorInfo) {
47
+ const errorRef = {
48
+ ok: false,
49
+ code,
50
+ msg,
51
+ cause,
52
+ errorInfo,
53
+ toString() {
54
+ return `[${code}]${msg}.${cause ? printCause(cause) : ""}`;
55
+ },
56
+ pair() {
57
+ return [errorRef, null];
58
+ },
59
+ ...{ [lvErrorRefSymbol]: true }
60
+ // 跳过类型检测
61
+ };
62
+ return errorRef;
63
+ }
64
+ function makeError(code, msg, errorInfo) {
65
+ return internalMakeError(code, msg, void 0, errorInfo);
66
+ }
67
+ function makeErrorBy(code, msg, cause, errorInfo) {
68
+ return internalMakeError(code, msg, cause, errorInfo);
69
+ }
70
+ function isLvErrorRef(val) {
71
+ return typeof val === "object" && val !== null && lvErrorRefSymbol in val;
72
+ }
73
+
74
+ // src/error/error-const.ts
75
+ function lvErrorConst(code, msg) {
76
+ return (rewrite) => {
77
+ if (!rewrite) {
78
+ return makeError(code, msg);
79
+ }
80
+ if (typeof rewrite === "string") {
81
+ return makeError(code, rewrite);
82
+ }
83
+ return makeErrorBy(code, rewrite.message, rewrite);
84
+ };
85
+ }
86
+
87
+ // src/error/error-code.ts
88
+ var GenericError = /* @__PURE__ */ ((GenericError2) => {
89
+ GenericError2[GenericError2["Ok"] = 0] = "Ok";
90
+ GenericError2[GenericError2["Cancelled"] = 1] = "Cancelled";
91
+ GenericError2[GenericError2["TimedOut"] = 2] = "TimedOut";
92
+ GenericError2[GenericError2["PermissionDenied"] = 3] = "PermissionDenied";
93
+ GenericError2[GenericError2["AlreadyExists"] = 4] = "AlreadyExists";
94
+ GenericError2[GenericError2["NotSupported"] = 5] = "NotSupported";
95
+ GenericError2[GenericError2["ResourceUnavailable"] = 6] = "ResourceUnavailable";
96
+ GenericError2[GenericError2["OutOfRange"] = 7] = "OutOfRange";
97
+ GenericError2[GenericError2["InvalidArgument"] = 8] = "InvalidArgument";
98
+ GenericError2[GenericError2["NetworkFailed"] = 9] = "NetworkFailed";
99
+ GenericError2[GenericError2["Interrupted"] = 10] = "Interrupted";
100
+ GenericError2[GenericError2["ResultNil"] = 11] = "ResultNil";
101
+ return GenericError2;
102
+ })(GenericError || {});
103
+ var cancelledError = lvErrorConst(1 /* Cancelled */, "operation(s) cancelled.");
104
+ var timeoutError = lvErrorConst(2 /* TimedOut */, "operation(s) timed out.");
105
+ var permissionDeniedError = lvErrorConst(
106
+ 3 /* PermissionDenied */,
107
+ "permission denied."
108
+ );
109
+ var alreadyExistsError = lvErrorConst(4 /* AlreadyExists */, "already exists.");
110
+ var notSupportedError = lvErrorConst(
111
+ 5 /* NotSupported */,
112
+ "operation(s) not supported."
113
+ );
114
+ var resourceUnavailableError = lvErrorConst(
115
+ 6 /* ResourceUnavailable */,
116
+ "resource is unavailable."
117
+ );
118
+ var outOfRangeError = lvErrorConst(7 /* OutOfRange */, "out of range.");
119
+ var invalidArgumentError = lvErrorConst(
120
+ 8 /* InvalidArgument */,
121
+ "invalid arguments."
122
+ );
123
+ var networkFailedError = lvErrorConst(9 /* NetworkFailed */, "network failed.");
124
+ var interruptedError = lvErrorConst(10 /* Interrupted */, "interrupted.");
125
+ var resultNilError = lvErrorConst(11 /* ResultNil */, "result is nil.");
126
+ export {
127
+ GenericError,
128
+ ILvErrorOr,
129
+ ILvErrorRef,
130
+ ILvRealErrorRef,
131
+ ILvValueRef,
132
+ alreadyExistsError,
133
+ cancelledError,
134
+ interruptedError,
135
+ invalidArgumentError,
136
+ isLvErrorRef,
137
+ lvErrorConst,
138
+ makeError,
139
+ makeErrorBy,
140
+ makeOk,
141
+ makeOkWith,
142
+ networkFailedError,
143
+ notSupportedError,
144
+ outOfRangeError,
145
+ permissionDeniedError,
146
+ resourceUnavailableError,
147
+ resultNilError,
148
+ timeoutError
149
+ };
150
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/error/error-base.ts","../../src/error/error-t.ts","../../src/error/error-const.ts","../../src/error/error-code.ts"],"sourcesContent":["//\n// lv项目中使用的错误类型\n//\n\nexport const ILvErrorRef = Symbol.for('rockbed.ILvErrorRef');\nexport type ILvErrorRef = ILvErrorOr<never>;\n\nexport const ILvRealErrorRef = Symbol.for('rockbed.ILvRealErrorRef');\nexport interface ILvRealErrorRef {\n readonly ok: false;\n readonly code: number;\n readonly msg: string;\n readonly cause?: ILvErrorRef | Error;\n readonly toString: () => string;\n readonly pair: () => [ILvRealErrorRef, null];\n readonly errorInfo?: unknown;\n}\n\n//\n// 没有错误时,可以直接使用 value 字段\n//\nexport const ILvValueRef = Symbol.for('rockbed.ILvValueRef');\nexport interface ILvValueRef<T> {\n readonly ok: true;\n readonly code: 0;\n readonly msg: '';\n readonly cause?: undefined;\n readonly value: T;\n readonly toString: () => string;\n readonly pair: () => [null, T];\n}\n\n//\n// lv项目中使用的携带值可能错误类型\n//\nexport const ILvErrorOr = Symbol.for('rockbed.ILvErrorOr');\nexport type ILvErrorOr<T> = (ILvRealErrorRef | ILvValueRef<T>) & {\n readonly pair: () => [null, T] | [ILvRealErrorRef, null];\n};\n","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\nexport function makeOk(): ILvErrorOr<never> {\n return {\n ok: true,\n value: null!,\n pair() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return [null, null!] as any;\n },\n code: 0,\n msg: '',\n ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n}\n\nexport function makeOkWith<T>(value: T): ILvErrorOr<T> {\n return {\n ok: true,\n value,\n pair() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return [null, value] as any;\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(\n code: number,\n msg: string,\n cause?: ILvErrorRef | Error,\n errorInfo?: unknown,\n) {\n const errorRef: ILvRealErrorRef = {\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 ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测\n };\n return errorRef;\n}\n\nexport function makeError(code: number, msg: string, errorInfo?: unknown): ILvRealErrorRef {\n return internalMakeError(code, msg, undefined, errorInfo);\n}\n\nexport function makeErrorBy(\n code: number,\n msg: string,\n cause: ILvErrorRef | Error,\n errorInfo?: unknown,\n): ILvRealErrorRef {\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(\n GenericError.PermissionDenied,\n 'permission denied.',\n);\nexport const alreadyExistsError = lvErrorConst(GenericError.AlreadyExists, 'already exists.');\nexport const notSupportedError = lvErrorConst(\n GenericError.NotSupported,\n 'operation(s) not supported.',\n);\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(\n GenericError.InvalidArgument,\n 'invalid arguments.',\n);\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"],"mappings":"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","names":["GenericError"]}
@@ -0,0 +1,28 @@
1
+ declare const ILvErrorRef: unique symbol;
2
+ type ILvErrorRef = ILvErrorOr<never>;
3
+ declare const ILvRealErrorRef: unique symbol;
4
+ interface ILvRealErrorRef {
5
+ readonly ok: false;
6
+ readonly code: number;
7
+ readonly msg: string;
8
+ readonly cause?: ILvErrorRef | Error;
9
+ readonly toString: () => string;
10
+ readonly pair: () => [ILvRealErrorRef, null];
11
+ readonly errorInfo?: unknown;
12
+ }
13
+ declare const ILvValueRef: unique symbol;
14
+ interface ILvValueRef<T> {
15
+ readonly ok: true;
16
+ readonly code: 0;
17
+ readonly msg: '';
18
+ readonly cause?: undefined;
19
+ readonly value: T;
20
+ readonly toString: () => string;
21
+ readonly pair: () => [null, T];
22
+ }
23
+ declare const ILvErrorOr: unique symbol;
24
+ type ILvErrorOr<T> = (ILvRealErrorRef | ILvValueRef<T>) & {
25
+ readonly pair: () => [null, T] | [ILvRealErrorRef, null];
26
+ };
27
+
28
+ export { ILvErrorOr as I, ILvErrorRef as a, ILvRealErrorRef as b, ILvValueRef as c };
@@ -0,0 +1,57 @@
1
+ import { I as IDisposable } from '../dispose-base-CAeXDpjg.js';
2
+
3
+ interface EmitterOptions {
4
+ onAddListener?: (...args: any) => any;
5
+ onRemoveListener?: (...args: any) => any;
6
+ onListenerError?: (e: any) => void;
7
+ }
8
+ /**
9
+ * 默认错误处理:异步抛出监听器错误,避免阻塞当前事件分发。
10
+ */
11
+ declare function asyncUnexpectedErrorHandler(e: unknown): undefined;
12
+ /**
13
+ * 同步抛出监听器错误,适合测试或需要立即失败的场景。
14
+ */
15
+ declare function syncUnexpectedError(e: unknown): undefined;
16
+ /**
17
+ * 忽略监听器错误,适合明确允许 best-effort 通知的场景。
18
+ */
19
+ declare function ignoreUnexpectedError(_e: unknown): undefined;
20
+ declare class Listener<TArgs extends any[]> {
21
+ private readonly _callback;
22
+ private readonly _callbackThis;
23
+ constructor(callback: (...args: TArgs) => void, callbackThis: any | undefined);
24
+ invoke(...args: TArgs): void;
25
+ }
26
+ declare class EventDeliveryQueueElement<TArgs extends any[]> {
27
+ readonly emitter: Emitter<TArgs>;
28
+ readonly listener: Listener<TArgs>;
29
+ readonly event: TArgs;
30
+ constructor(emitter: Emitter<TArgs>, listener: Listener<TArgs>, event: TArgs);
31
+ }
32
+ declare class EventDeliveryQueue {
33
+ private readonly _onListenerError;
34
+ protected _queue: EventDeliveryQueueElement<any>[];
35
+ constructor(_onListenerError?: (e: unknown) => void);
36
+ get size(): number;
37
+ push<TArgs extends any[]>(emitter: Emitter<TArgs>, listener: Listener<TArgs>, event: TArgs): void;
38
+ clear<TArgs extends any[]>(emitter: Emitter<TArgs>): void;
39
+ deliver(): void;
40
+ }
41
+ interface Event<T extends any[]> {
42
+ (listener: (...args: T) => any, thisArgs?: any): IDisposable;
43
+ }
44
+ declare class Emitter<TArgs extends any[]> {
45
+ protected _listeners?: Set<Listener<TArgs>>;
46
+ private readonly _options?;
47
+ private _disposed;
48
+ private _event?;
49
+ private _deliveryQueue?;
50
+ constructor(options?: EmitterOptions);
51
+ get event(): Event<TArgs>;
52
+ dispose(): void;
53
+ fire(...event: TArgs): void;
54
+ }
55
+ declare function listenOnce<TArgs extends any[]>(event: Event<TArgs>): Event<TArgs>;
56
+
57
+ export { Emitter, type EmitterOptions, type Event, EventDeliveryQueue, asyncUnexpectedErrorHandler, ignoreUnexpectedError, listenOnce, syncUnexpectedError };