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,167 @@
1
+ // src/dispose/disposable-t.ts
2
+ var SafeDisposable = class {
3
+ _value = null;
4
+ constructor(value) {
5
+ this._value = value;
6
+ }
7
+ isEmpty() {
8
+ return this._value === null;
9
+ }
10
+ dispose() {
11
+ if (!this._value) {
12
+ return;
13
+ }
14
+ this._value.dispose();
15
+ this._value = null;
16
+ }
17
+ };
18
+
19
+ // src/dispose/disposable-utils.ts
20
+ function makeSafeDisposable(fn) {
21
+ const disposable = new SafeDisposable({
22
+ dispose: fn
23
+ });
24
+ return disposable;
25
+ }
26
+
27
+ // src/event/emitter.ts
28
+ function asyncUnexpectedErrorHandler(e) {
29
+ setTimeout(() => {
30
+ throw e;
31
+ }, 0);
32
+ }
33
+ function syncUnexpectedError(e) {
34
+ throw e;
35
+ }
36
+ function ignoreUnexpectedError(_e) {
37
+ }
38
+ var Listener = class {
39
+ _callback;
40
+ _callbackThis;
41
+ constructor(callback, callbackThis) {
42
+ this._callback = callback;
43
+ this._callbackThis = callbackThis;
44
+ }
45
+ invoke(...args) {
46
+ this._callback.call(this._callbackThis, ...args);
47
+ }
48
+ };
49
+ var EventDeliveryQueueElement = class {
50
+ emitter;
51
+ listener;
52
+ event;
53
+ constructor(emitter, listener, event) {
54
+ this.emitter = emitter;
55
+ this.listener = listener;
56
+ this.event = event;
57
+ }
58
+ };
59
+ var EventDeliveryQueue = class {
60
+ constructor(_onListenerError = asyncUnexpectedErrorHandler) {
61
+ this._onListenerError = _onListenerError;
62
+ }
63
+ _onListenerError;
64
+ _queue = [];
65
+ get size() {
66
+ return this._queue.length;
67
+ }
68
+ push(emitter, listener, event) {
69
+ this._queue.push(new EventDeliveryQueueElement(emitter, listener, event));
70
+ }
71
+ clear(emitter) {
72
+ this._queue = this._queue.filter((element) => element.emitter !== emitter);
73
+ }
74
+ deliver() {
75
+ while (this._queue.length > 0) {
76
+ const element = this._queue.shift();
77
+ try {
78
+ element.listener.invoke(...element.event);
79
+ } catch (e) {
80
+ this._onListenerError(e);
81
+ }
82
+ }
83
+ }
84
+ };
85
+ var Emitter = class {
86
+ _listeners;
87
+ _options;
88
+ _disposed = false;
89
+ _event;
90
+ _deliveryQueue;
91
+ constructor(options) {
92
+ this._options = options;
93
+ }
94
+ get event() {
95
+ if (this._event) {
96
+ return this._event;
97
+ }
98
+ this._event = (callback, thisArgs) => {
99
+ if (!this._listeners) {
100
+ this._listeners = /* @__PURE__ */ new Set();
101
+ }
102
+ const listener = new Listener(callback, thisArgs);
103
+ this._listeners.add(listener);
104
+ if (this._options?.onAddListener) {
105
+ this._options.onAddListener(this, callback, thisArgs);
106
+ }
107
+ const result = () => {
108
+ if (!this._disposed) {
109
+ this._listeners?.delete(listener);
110
+ if (this._options?.onRemoveListener) {
111
+ this._options.onRemoveListener(this, callback, thisArgs);
112
+ }
113
+ }
114
+ };
115
+ return makeSafeDisposable(result);
116
+ };
117
+ return this._event;
118
+ }
119
+ dispose() {
120
+ if (this._disposed) {
121
+ return;
122
+ }
123
+ this._disposed = true;
124
+ this._listeners?.clear();
125
+ this._deliveryQueue?.clear(this);
126
+ }
127
+ fire(...event) {
128
+ if (!this._listeners) {
129
+ return;
130
+ }
131
+ this._deliveryQueue ??= new EventDeliveryQueue(this._options?.onListenerError);
132
+ for (const listener of this._listeners) {
133
+ this._deliveryQueue.push(this, listener, event);
134
+ }
135
+ this._deliveryQueue.deliver();
136
+ }
137
+ };
138
+ function listenOnce(event) {
139
+ return (listener, thisArgs = null) => {
140
+ let didFire = false;
141
+ let result = void 0;
142
+ result = event((...args) => {
143
+ if (didFire) {
144
+ return;
145
+ }
146
+ if (result) {
147
+ result.dispose();
148
+ } else {
149
+ didFire = true;
150
+ }
151
+ return listener.call(thisArgs, ...args);
152
+ }, null);
153
+ if (didFire) {
154
+ result.dispose();
155
+ }
156
+ return result;
157
+ };
158
+ }
159
+ export {
160
+ Emitter,
161
+ EventDeliveryQueue,
162
+ asyncUnexpectedErrorHandler,
163
+ ignoreUnexpectedError,
164
+ listenOnce,
165
+ syncUnexpectedError
166
+ };
167
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/dispose/disposable-t.ts","../../src/dispose/disposable-utils.ts","../../src/event/emitter.ts"],"sourcesContent":["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/no-redundant-type-constituents */\nimport { makeSafeDisposable } from '../dispose';\nimport type { IDisposable } from '../dispose';\n\nexport interface EmitterOptions {\n onAddListener?: (...args: any) => any;\n onRemoveListener?: (...args: any) => any;\n onListenerError?: (e: any) => void;\n}\n\n/**\n * 默认错误处理:异步抛出监听器错误,避免阻塞当前事件分发。\n */\nexport function asyncUnexpectedErrorHandler(e: unknown): undefined {\n setTimeout(() => {\n throw e;\n }, 0);\n}\n\n/**\n * 同步抛出监听器错误,适合测试或需要立即失败的场景。\n */\nexport function syncUnexpectedError(e: unknown): undefined {\n throw e;\n}\n\n/**\n * 忽略监听器错误,适合明确允许 best-effort 通知的场景。\n */\nexport function ignoreUnexpectedError(_e: unknown): undefined {}\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: EventDeliveryQueueElement<any>[] = [];\n\n constructor(\n private readonly _onListenerError: (e: unknown) => void = asyncUnexpectedErrorHandler,\n ) {}\n\n get size(): number {\n return this._queue.length;\n }\n\n push<TArgs extends any[]>(\n emitter: Emitter<TArgs>,\n listener: Listener<TArgs>,\n event: TArgs,\n ): void {\n this._queue.push(new EventDeliveryQueueElement(emitter, listener, event));\n }\n\n clear<TArgs extends any[]>(emitter: Emitter<TArgs>): void {\n this._queue = this._queue.filter((element) => element.emitter !== emitter);\n }\n\n deliver(): void {\n while (this._queue.length > 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?: Set<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 if (!this._listeners) {\n this._listeners = new Set();\n }\n\n const listener = new Listener(callback, thisArgs);\n this._listeners.add(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 this._listeners?.delete(listener);\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) {\n return;\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\n// 辅助能力:只监听某个事件一次\nexport function listenOnce<TArgs extends any[]>(event: Event<TArgs>): Event<TArgs> {\n return (listener, thisArgs = null) => {\n let didFire = false;\n let result: IDisposable | undefined = undefined;\n\n result = event((...args) => {\n if (didFire) {\n return;\n }\n if (result) {\n result.dispose();\n } else {\n didFire = true;\n }\n\n return listener.call(thisArgs, ...args);\n }, null);\n\n if (didFire) {\n result.dispose();\n }\n\n return result;\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,10 @@
1
+ export { lvAssert, lvAssertNever, lvAssertNotHere, lvAssertNotNil } from './assert/index.js';
2
+ export { Barrier, CancelablePromise, CancellationToken, CancellationTokenSource, Deferred, IBarrier, ICancellationToken, defer, makeBarrierByPromise, makeCancelablePromise, makePromiseWithTimeout, parallelPromise, wait } from './async/index.js';
3
+ export { E as EmptyDispose, I as IDisposable } from './dispose-base-CAeXDpjg.js';
4
+ export { Disposable, DisposableStore, IDisposableLogger, MutableDisposable, SafeDisposable, disposeWithLog, makeEmptyDisposable, makeSafeDisposable } from './dispose/index.js';
5
+ export { I as ILvErrorOr, a as ILvErrorRef, b as ILvRealErrorRef, c as ILvValueRef } from './error-base-BWuBlS2k.js';
6
+ export { GenericError, alreadyExistsError, cancelledError, interruptedError, invalidArgumentError, isLvErrorRef, lvErrorConst, makeError, makeErrorBy, makeOk, makeOkWith, networkFailedError, notSupportedError, outOfRangeError, permissionDeniedError, resourceUnavailableError, resultNilError, timeoutError } from './error/index.js';
7
+ export { Emitter, EmitterOptions, Event, EventDeliveryQueue, asyncUnexpectedErrorHandler, ignoreUnexpectedError, listenOnce, syncUnexpectedError } from './event/index.js';
8
+ export { safeJsonParse, safeJsonStringify } from './json/index.js';
9
+ export { SharedMutex } from './lock/index.js';
10
+ export { IErrorResponse, IResponse, ISuccessResponse, makeErrorResponse, makeSuccessResponse } from './response/index.js';