@furystack/utils 7.0.2 → 8.0.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.
- package/README.md +3 -3
- package/esm/debounce.d.ts.map +1 -1
- package/esm/deep-merge.d.ts.map +1 -1
- package/esm/deep-merge.spec.js +1 -1
- package/esm/deep-merge.spec.js.map +1 -1
- package/esm/event-hub.d.ts +1 -2
- package/esm/event-hub.d.ts.map +1 -1
- package/esm/event-hub.js +2 -2
- package/esm/event-hub.js.map +1 -1
- package/esm/event-hub.spec.js +4 -4
- package/esm/event-hub.spec.js.map +1 -1
- package/esm/index.d.ts +6 -4
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +6 -4
- package/esm/index.js.map +1 -1
- package/esm/is-async-disposable.d.ts +7 -0
- package/esm/is-async-disposable.d.ts.map +1 -0
- package/esm/is-async-disposable.js +9 -0
- package/esm/is-async-disposable.js.map +1 -0
- package/esm/is-async-disposable.spec.d.ts +2 -0
- package/esm/is-async-disposable.spec.d.ts.map +1 -0
- package/esm/is-async-disposable.spec.js +21 -0
- package/esm/is-async-disposable.spec.js.map +1 -0
- package/esm/is-disposable.d.ts +7 -0
- package/esm/is-disposable.d.ts.map +1 -0
- package/esm/is-disposable.js +9 -0
- package/esm/is-disposable.js.map +1 -0
- package/esm/is-disposable.spec.d.ts +2 -0
- package/esm/is-disposable.spec.d.ts.map +1 -0
- package/esm/is-disposable.spec.js +21 -0
- package/esm/is-disposable.spec.js.map +1 -0
- package/esm/observable-value.d.ts +4 -5
- package/esm/observable-value.d.ts.map +1 -1
- package/esm/observable-value.js +3 -3
- package/esm/observable-value.js.map +1 -1
- package/esm/observable-value.spec.d.ts.map +1 -1
- package/esm/observable-value.spec.js +10 -9
- package/esm/observable-value.spec.js.map +1 -1
- package/esm/path-helper.js +1 -1
- package/esm/path-helper.js.map +1 -1
- package/esm/path-helper.spec.d.ts.map +1 -1
- package/esm/path-helper.spec.js +9 -1
- package/esm/path-helper.spec.js.map +1 -1
- package/esm/sort-by.d.ts +1 -1
- package/esm/sort-by.d.ts.map +1 -1
- package/esm/tuple.d.ts.map +1 -1
- package/esm/using-async.d.ts +8 -0
- package/esm/using-async.d.ts.map +1 -0
- package/esm/using-async.js +22 -0
- package/esm/using-async.js.map +1 -0
- package/esm/using-async.spec.d.ts +17 -0
- package/esm/using-async.spec.d.ts.map +1 -0
- package/esm/using-async.spec.js +84 -0
- package/esm/using-async.spec.js.map +1 -0
- package/esm/using.d.ts +8 -0
- package/esm/using.d.ts.map +1 -0
- package/esm/using.js +15 -0
- package/esm/using.js.map +1 -0
- package/esm/{disposable.spec.d.ts → using.spec.d.ts} +2 -7
- package/esm/using.spec.d.ts.map +1 -0
- package/esm/using.spec.js +62 -0
- package/esm/using.spec.js.map +1 -0
- package/esm/value-observer.d.ts +3 -4
- package/esm/value-observer.d.ts.map +1 -1
- package/esm/value-observer.js +3 -3
- package/esm/value-observer.js.map +1 -1
- package/package.json +3 -3
- package/src/deep-merge.spec.ts +2 -2
- package/src/event-hub.spec.ts +4 -4
- package/src/event-hub.ts +2 -4
- package/src/index.ts +6 -4
- package/src/is-async-disposable.spec.ts +23 -0
- package/src/is-async-disposable.ts +8 -0
- package/src/is-disposable.spec.ts +23 -0
- package/src/is-disposable.ts +8 -0
- package/src/observable-value.spec.ts +11 -9
- package/src/observable-value.ts +3 -4
- package/src/path-helper.spec.ts +10 -1
- package/src/path-helper.ts +1 -1
- package/src/using-async.spec.ts +93 -0
- package/src/using-async.ts +24 -0
- package/src/using.spec.ts +67 -0
- package/src/using.ts +13 -0
- package/src/value-observer.ts +3 -4
- package/esm/disposable.d.ts +0 -49
- package/esm/disposable.d.ts.map +0 -1
- package/esm/disposable.js +0 -56
- package/esm/disposable.js.map +0 -1
- package/esm/disposable.spec.d.ts.map +0 -1
- package/esm/disposable.spec.js +0 -118
- package/esm/disposable.spec.js.map +0 -1
- package/esm/trace.d.ts +0 -119
- package/esm/trace.d.ts.map +0 -1
- package/esm/trace.js +0 -139
- package/esm/trace.js.map +0 -1
- package/esm/trace.spec.d.ts +0 -2
- package/esm/trace.spec.d.ts.map +0 -1
- package/esm/trace.spec.js +0 -184
- package/esm/trace.spec.js.map +0 -1
- package/src/disposable.spec.ts +0 -130
- package/src/disposable.ts +0 -69
- package/src/trace.spec.ts +0 -200
- package/src/trace.ts +0 -265
package/esm/trace.js
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { ObservableValue } from './observable-value.js';
|
|
2
|
-
/**
|
|
3
|
-
* Helper class that can be used to trace method calls programmatically
|
|
4
|
-
*
|
|
5
|
-
* Usage example:
|
|
6
|
-
* ```ts
|
|
7
|
-
* const methodTracer: IDisposable = Trace.method({
|
|
8
|
-
* object: myObjectInstance, // You can define an object constructor for static methods as well
|
|
9
|
-
* method: myObjectInstance.method, // The method to be tracked
|
|
10
|
-
* isAsync: true, // if you set to async, method finished will be *await*-ed
|
|
11
|
-
* onCalled: (traceData) => {
|
|
12
|
-
* console.log("Method called:", traceData)
|
|
13
|
-
* },
|
|
14
|
-
* onFinished: (traceData) => {
|
|
15
|
-
* console.log("Method call finished:", traceData)
|
|
16
|
-
* },
|
|
17
|
-
* onError: (traceData) => {
|
|
18
|
-
* console.log("Method throwed an error:", traceData)
|
|
19
|
-
* }
|
|
20
|
-
* });
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
export class Trace {
|
|
24
|
-
static objectTraces = new Map();
|
|
25
|
-
static getMethodTrace(object, method) {
|
|
26
|
-
const objectTrace = this.objectTraces.get(object);
|
|
27
|
-
return objectTrace.methodMappings.get(method.name);
|
|
28
|
-
}
|
|
29
|
-
static traceStart(methodTrace, args) {
|
|
30
|
-
const startDateTime = new Date();
|
|
31
|
-
const traceValue = {
|
|
32
|
-
methodArguments: args,
|
|
33
|
-
startDateTime,
|
|
34
|
-
};
|
|
35
|
-
methodTrace.callObservable.setValue(traceValue);
|
|
36
|
-
return traceValue;
|
|
37
|
-
}
|
|
38
|
-
static traceFinished(methodTrace, args, callTrace, returned) {
|
|
39
|
-
const finishedTrace = {
|
|
40
|
-
methodArguments: args,
|
|
41
|
-
startDateTime: callTrace.startDateTime,
|
|
42
|
-
finishedDateTime: new Date(),
|
|
43
|
-
returned,
|
|
44
|
-
};
|
|
45
|
-
methodTrace.finishedObservable.setValue(finishedTrace);
|
|
46
|
-
}
|
|
47
|
-
static traceError(methodTrace, args, callTrace, error) {
|
|
48
|
-
const errorTrace = {
|
|
49
|
-
methodArguments: args,
|
|
50
|
-
startDateTime: callTrace.startDateTime,
|
|
51
|
-
errorDateTime: new Date(),
|
|
52
|
-
error,
|
|
53
|
-
};
|
|
54
|
-
methodTrace.errorObservable.setValue(errorTrace);
|
|
55
|
-
return errorTrace;
|
|
56
|
-
}
|
|
57
|
-
static callMethod(object, method, args) {
|
|
58
|
-
const methodTrace = this.getMethodTrace(object, method);
|
|
59
|
-
const start = this.traceStart(methodTrace, args);
|
|
60
|
-
try {
|
|
61
|
-
const returned = methodTrace.originalMethod.call(object, ...args);
|
|
62
|
-
this.traceFinished(methodTrace, args, start, returned);
|
|
63
|
-
return returned;
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
this.traceError(methodTrace, args, start, error);
|
|
67
|
-
throw error;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
static async callMethodAsync(object, method, args) {
|
|
71
|
-
const methodTrace = this.getMethodTrace(object, method);
|
|
72
|
-
const start = this.traceStart(methodTrace, args);
|
|
73
|
-
try {
|
|
74
|
-
const returned = await methodTrace.originalMethod.call(object, ...args);
|
|
75
|
-
this.traceFinished(methodTrace, args, start, returned);
|
|
76
|
-
return returned;
|
|
77
|
-
}
|
|
78
|
-
catch (error) {
|
|
79
|
-
this.traceError(methodTrace, args, start, error);
|
|
80
|
-
throw error;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Creates an observer that will be observe method calls, finishes and errors
|
|
85
|
-
* @param options The options object for the trace
|
|
86
|
-
* @returns the trace object that can be disposed after usage
|
|
87
|
-
*/
|
|
88
|
-
static method(options) {
|
|
89
|
-
// add object mapping
|
|
90
|
-
if (!this.objectTraces.has(options.object)) {
|
|
91
|
-
this.objectTraces.set(options.object, {
|
|
92
|
-
methodMappings: new Map(),
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
// setup override if needed
|
|
96
|
-
if (!options.method.isTraced) {
|
|
97
|
-
const overriddenMethod = options.isAsync
|
|
98
|
-
? (...args) => this.callMethodAsync(options.object, options.method, args)
|
|
99
|
-
: (...args) => this.callMethod(options.object, options.method, args);
|
|
100
|
-
Object.defineProperty(overriddenMethod, 'name', { value: options.method.name });
|
|
101
|
-
Object.defineProperty(overriddenMethod, 'isTraced', { value: options.method.name });
|
|
102
|
-
options.object[options.method.name] = overriddenMethod;
|
|
103
|
-
}
|
|
104
|
-
const objectTrace = this.objectTraces.get(options.object);
|
|
105
|
-
// add method mapping if needed
|
|
106
|
-
if (!objectTrace.methodMappings.has(options.method.name)) {
|
|
107
|
-
objectTrace.methodMappings.set(options.method.name, {
|
|
108
|
-
originalMethod: options.method,
|
|
109
|
-
callObservable: new ObservableValue({
|
|
110
|
-
methodArguments: [],
|
|
111
|
-
startDateTime: new Date(''),
|
|
112
|
-
}),
|
|
113
|
-
finishedObservable: new ObservableValue({
|
|
114
|
-
methodArguments: [],
|
|
115
|
-
startDateTime: new Date(''),
|
|
116
|
-
finishedDateTime: new Date(''),
|
|
117
|
-
returned: undefined,
|
|
118
|
-
}),
|
|
119
|
-
errorObservable: new ObservableValue({
|
|
120
|
-
methodArguments: [],
|
|
121
|
-
startDateTime: new Date(''),
|
|
122
|
-
errorDateTime: new Date(''),
|
|
123
|
-
error: undefined,
|
|
124
|
-
}),
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
const methodTrace = objectTrace.methodMappings.get(options.method.name);
|
|
128
|
-
const callbacks = [
|
|
129
|
-
options.onCalled && methodTrace.callObservable.subscribe(options.onCalled),
|
|
130
|
-
options.onFinished && methodTrace.finishedObservable.subscribe(options.onFinished),
|
|
131
|
-
options.onError && methodTrace.errorObservable.subscribe(options.onError),
|
|
132
|
-
];
|
|
133
|
-
// Subscribe and return the observer
|
|
134
|
-
return {
|
|
135
|
-
dispose: () => callbacks.forEach((c) => c && c.dispose()),
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
//# sourceMappingURL=trace.js.map
|
package/esm/trace.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
|
package/esm/trace.spec.d.ts
DELETED
package/esm/trace.spec.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace.spec.d.ts","sourceRoot":"","sources":["../src/trace.spec.ts"],"names":[],"mappings":"AA+BA,eAAO,MAAM,UAAU,qCAwKrB,CAAA"}
|
package/esm/trace.spec.js
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { Trace } from './trace.js';
|
|
3
|
-
class MockClass {
|
|
4
|
-
testValue;
|
|
5
|
-
constructor(testValue) {
|
|
6
|
-
this.testValue = testValue;
|
|
7
|
-
}
|
|
8
|
-
testError(msg) {
|
|
9
|
-
throw Error(msg);
|
|
10
|
-
}
|
|
11
|
-
testScope() {
|
|
12
|
-
return this.testValue;
|
|
13
|
-
}
|
|
14
|
-
static addStatic(...args) {
|
|
15
|
-
return args.reduce((a, b) => a + b, 0);
|
|
16
|
-
}
|
|
17
|
-
addInstance(...args) {
|
|
18
|
-
return args.reduce((a, b) => a + b, 0);
|
|
19
|
-
}
|
|
20
|
-
async addInstanceAsync(...args) {
|
|
21
|
-
return args.reduce((a, b) => a + b, 0);
|
|
22
|
-
}
|
|
23
|
-
async testErrorAsync(msg) {
|
|
24
|
-
throw Error(msg);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
export const traceTests = describe('Trace tests', () => {
|
|
28
|
-
describe('Static method traces', () => {
|
|
29
|
-
it('Static Methods call should be traced with args', () => {
|
|
30
|
-
const args = [1, 2, 3];
|
|
31
|
-
const doneCallback = vi.fn();
|
|
32
|
-
const observer = Trace.method({
|
|
33
|
-
object: MockClass,
|
|
34
|
-
method: MockClass.addStatic,
|
|
35
|
-
onCalled: (traceData) => {
|
|
36
|
-
expect(args).toEqual(traceData.methodArguments);
|
|
37
|
-
observer.dispose();
|
|
38
|
-
doneCallback();
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
MockClass.addStatic(...args);
|
|
42
|
-
expect(doneCallback).toBeCalled();
|
|
43
|
-
});
|
|
44
|
-
it('Static Methods call should be traced with args and return value', () => {
|
|
45
|
-
const args = [1, 2, 3];
|
|
46
|
-
const doneCallback = vi.fn();
|
|
47
|
-
const observer = Trace.method({
|
|
48
|
-
object: MockClass,
|
|
49
|
-
method: MockClass.addStatic,
|
|
50
|
-
onFinished: (traceData) => {
|
|
51
|
-
expect(args).toEqual(traceData.methodArguments);
|
|
52
|
-
expect(traceData.returned).toBe(1 + 2 + 3);
|
|
53
|
-
observer.dispose();
|
|
54
|
-
doneCallback();
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
MockClass.addStatic(...args);
|
|
58
|
-
expect(doneCallback).toBeCalled();
|
|
59
|
-
});
|
|
60
|
-
it("shouldn't be triggered after observer is disposed", () => {
|
|
61
|
-
const args = [1, 2, 3];
|
|
62
|
-
const shouldNotCall = vi.fn();
|
|
63
|
-
const doneCallback = vi.fn();
|
|
64
|
-
const observer = Trace.method({
|
|
65
|
-
object: MockClass,
|
|
66
|
-
method: MockClass.addStatic,
|
|
67
|
-
onCalled: () => {
|
|
68
|
-
shouldNotCall("Shouldn't be triggered here");
|
|
69
|
-
},
|
|
70
|
-
});
|
|
71
|
-
const observer2 = Trace.method({
|
|
72
|
-
object: MockClass,
|
|
73
|
-
method: MockClass.addStatic,
|
|
74
|
-
onCalled: () => {
|
|
75
|
-
observer2.dispose();
|
|
76
|
-
doneCallback();
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
observer.dispose();
|
|
80
|
-
const returned = MockClass.addStatic(...args);
|
|
81
|
-
expect(returned).toEqual(1 + 2 + 3);
|
|
82
|
-
expect(doneCallback).toBeCalled();
|
|
83
|
-
expect(shouldNotCall).not.toBeCalled();
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
describe('Instance method traces', () => {
|
|
87
|
-
it('should be traced with arguments', () => {
|
|
88
|
-
const instance = new MockClass();
|
|
89
|
-
const args = [1, 2, 3];
|
|
90
|
-
const doneCallback = vi.fn();
|
|
91
|
-
const observer = Trace.method({
|
|
92
|
-
object: instance,
|
|
93
|
-
method: instance.addInstance,
|
|
94
|
-
onFinished: (traceData) => {
|
|
95
|
-
expect(args).toEqual(traceData.methodArguments);
|
|
96
|
-
expect(traceData.returned).toBe(1 + 2 + 3);
|
|
97
|
-
observer.dispose();
|
|
98
|
-
doneCallback();
|
|
99
|
-
},
|
|
100
|
-
});
|
|
101
|
-
instance.addInstance(...args);
|
|
102
|
-
expect(doneCallback).toBeCalled();
|
|
103
|
-
});
|
|
104
|
-
it('should be traced asynchronously', async () => {
|
|
105
|
-
const instance = new MockClass();
|
|
106
|
-
const args = [1, 2, 3];
|
|
107
|
-
const doneCallback = vi.fn();
|
|
108
|
-
const observer = Trace.method({
|
|
109
|
-
object: instance,
|
|
110
|
-
method: instance.addInstanceAsync,
|
|
111
|
-
isAsync: true,
|
|
112
|
-
onFinished: (traceData) => {
|
|
113
|
-
expect(args).toEqual(traceData.methodArguments);
|
|
114
|
-
const { returned } = traceData;
|
|
115
|
-
expect(returned).toBe(1 + 2 + 3);
|
|
116
|
-
observer.dispose();
|
|
117
|
-
doneCallback();
|
|
118
|
-
},
|
|
119
|
-
});
|
|
120
|
-
await instance.addInstanceAsync(...args);
|
|
121
|
-
expect(doneCallback).toBeCalled();
|
|
122
|
-
});
|
|
123
|
-
it("should have a valid 'this' scope", () => {
|
|
124
|
-
const instance = new MockClass('testValue');
|
|
125
|
-
const doneCallback = vi.fn();
|
|
126
|
-
const observer = Trace.method({
|
|
127
|
-
object: instance,
|
|
128
|
-
method: instance.testScope,
|
|
129
|
-
onFinished: (traceData) => {
|
|
130
|
-
if (traceData.returned) {
|
|
131
|
-
expect(traceData.returned).toBe('testValue');
|
|
132
|
-
observer.dispose();
|
|
133
|
-
doneCallback();
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
});
|
|
137
|
-
expect(instance.testScope()).toBe('testValue');
|
|
138
|
-
expect(doneCallback).toBeCalled();
|
|
139
|
-
});
|
|
140
|
-
it('should handle throwing errors', () => {
|
|
141
|
-
const instance = new MockClass('testValue');
|
|
142
|
-
const doneCallback = vi.fn();
|
|
143
|
-
const observer = Trace.method({
|
|
144
|
-
object: instance,
|
|
145
|
-
method: instance.testError,
|
|
146
|
-
onError: (traceData) => {
|
|
147
|
-
if (traceData.error) {
|
|
148
|
-
expect(traceData.error.message).toBe('message');
|
|
149
|
-
observer.dispose();
|
|
150
|
-
doneCallback();
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
});
|
|
154
|
-
expect(() => {
|
|
155
|
-
instance.testError('message');
|
|
156
|
-
}).toThrow();
|
|
157
|
-
expect(doneCallback).toBeCalled();
|
|
158
|
-
});
|
|
159
|
-
it('should handle throwing errors with asyncs', async () => {
|
|
160
|
-
const instance = new MockClass('testValue');
|
|
161
|
-
const doneCallback = vi.fn();
|
|
162
|
-
const observer = Trace.method({
|
|
163
|
-
object: instance,
|
|
164
|
-
method: instance.testErrorAsync,
|
|
165
|
-
isAsync: true,
|
|
166
|
-
onError: (traceData) => {
|
|
167
|
-
if (traceData.error) {
|
|
168
|
-
expect(traceData.error.message).toBe('message');
|
|
169
|
-
observer.dispose();
|
|
170
|
-
doneCallback();
|
|
171
|
-
}
|
|
172
|
-
},
|
|
173
|
-
});
|
|
174
|
-
try {
|
|
175
|
-
await instance.testErrorAsync('message');
|
|
176
|
-
}
|
|
177
|
-
catch (error) {
|
|
178
|
-
// ignore
|
|
179
|
-
}
|
|
180
|
-
expect(doneCallback).toBeCalled();
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
//# sourceMappingURL=trace.spec.js.map
|
package/esm/trace.spec.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace.spec.js","sourceRoot":"","sources":["../src/trace.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,MAAM,SAAS;IACO;IAApB,YAAoB,SAAkB;QAAlB,cAAS,GAAT,SAAS,CAAS;IAAG,CAAC;IAEnC,SAAS,CAAC,GAAW;QAC1B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAEM,MAAM,CAAC,SAAS,CAAa,GAAG,IAAc;QACnD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACxC,CAAC;IAEM,WAAW,CAAa,GAAG,IAAc;QAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACxC,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAa,GAAG,IAAc;QACzD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACxC,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,GAAW;QACrC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACrD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACtB,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,SAAS,CAAC,SAAS;gBAC3B,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE;oBACtB,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;oBAC/C,QAAQ,CAAC,OAAO,EAAE,CAAA;oBAClB,YAAY,EAAE,CAAA;gBAChB,CAAC;aACF,CAAC,CAAA;YACF,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAA;YAC5B,MAAM,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAA;QACnC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACtB,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,SAAS,CAAC,SAAS;gBAC3B,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE;oBACxB,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;oBAC/C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;oBAC1C,QAAQ,CAAC,OAAO,EAAE,CAAA;oBAClB,YAAY,EAAE,CAAA;gBAChB,CAAC;aACF,CAAC,CAAA;YACF,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAA;YAC5B,MAAM,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAA;QACnC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACtB,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAC7B,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,SAAS,CAAC,SAAS;gBAC3B,QAAQ,EAAE,GAAG,EAAE;oBACb,aAAa,CAAC,6BAA6B,CAAC,CAAA;gBAC9C,CAAC;aACF,CAAC,CAAA;YACF,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC7B,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,SAAS,CAAC,SAAS;gBAC3B,QAAQ,EAAE,GAAG,EAAE;oBACb,SAAS,CAAC,OAAO,EAAE,CAAA;oBACnB,YAAY,EAAE,CAAA;gBAChB,CAAC;aACF,CAAC,CAAA;YACF,QAAQ,CAAC,OAAO,EAAE,CAAA;YAClB,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAA;YAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;YACnC,MAAM,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAA;YACjC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAA;YAChC,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACtB,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,QAAQ,CAAC,WAAW;gBAC5B,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE;oBACxB,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;oBAC/C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;oBAC1C,QAAQ,CAAC,OAAO,EAAE,CAAA;oBAClB,YAAY,EAAE,CAAA;gBAChB,CAAC;aACF,CAAC,CAAA;YACF,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAA;YAC7B,MAAM,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAA;QACnC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAA;YAChC,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACtB,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,QAAQ,CAAC,gBAAgB;gBACjC,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE;oBACxB,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;oBAC/C,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAA;oBAC9B,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;oBAChC,QAAQ,CAAC,OAAO,EAAE,CAAA;oBAClB,YAAY,EAAE,CAAA;gBAChB,CAAC;aACF,CAAC,CAAA;YACF,MAAM,QAAQ,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAA;YACxC,MAAM,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAA;QACnC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,CAAA;YAC3C,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,QAAQ,CAAC,SAAS;gBAC1B,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE;oBACxB,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;wBACvB,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;wBAC5C,QAAQ,CAAC,OAAO,EAAE,CAAA;wBAClB,YAAY,EAAE,CAAA;oBAChB,CAAC;gBACH,CAAC;aACF,CAAC,CAAA;YACF,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAC9C,MAAM,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAA;QACnC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,CAAA;YAC3C,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,QAAQ,CAAC,SAAS;gBAC1B,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE;oBACrB,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;wBACpB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;wBAC/C,QAAQ,CAAC,OAAO,EAAE,CAAA;wBAClB,YAAY,EAAE,CAAA;oBAChB,CAAC;gBACH,CAAC;aACF,CAAC,CAAA;YACF,MAAM,CAAC,GAAG,EAAE;gBACV,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;YAC/B,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;YACZ,MAAM,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAA;QACnC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,CAAA;YAC3C,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,QAAQ,CAAC,cAAc;gBAC/B,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE;oBACrB,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;wBACpB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;wBAC/C,QAAQ,CAAC,OAAO,EAAE,CAAA;wBAClB,YAAY,EAAE,CAAA;oBAChB,CAAC;gBACH,CAAC;aACF,CAAC,CAAA;YACF,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YACD,MAAM,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/src/disposable.spec.ts
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest'
|
|
2
|
-
import type { Disposable } from './disposable.js'
|
|
3
|
-
import { using, usingAsync } from './disposable.js'
|
|
4
|
-
|
|
5
|
-
export class MockDisposable implements Disposable {
|
|
6
|
-
private disposed = false
|
|
7
|
-
public isDisposed = () => this.disposed
|
|
8
|
-
/**
|
|
9
|
-
* Disposes the MockDisposable instance, calls the dispose callback
|
|
10
|
-
*/
|
|
11
|
-
public dispose = () => {
|
|
12
|
-
this.disposed = true
|
|
13
|
-
this.disposeCallback && this.disposeCallback()
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Mock to throw an error
|
|
18
|
-
*/
|
|
19
|
-
public whooops() {
|
|
20
|
-
throw Error('Whooops')
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Defines the callback that will be called on dispose
|
|
25
|
-
*/
|
|
26
|
-
public disposeCallback!: () => void
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Unit tests for disposables
|
|
31
|
-
*/
|
|
32
|
-
export const disposableTests = describe('Disposable', () => {
|
|
33
|
-
it('Can be constructed', () => {
|
|
34
|
-
using(new MockDisposable(), (d) => {
|
|
35
|
-
expect(d).toBeInstanceOf(MockDisposable)
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
it('Should return a value from a callback', () => {
|
|
40
|
-
const returned = using(new MockDisposable(), () => {
|
|
41
|
-
return 1
|
|
42
|
-
})
|
|
43
|
-
expect(returned).toBe(1)
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('Should return a value from an async callback', async () => {
|
|
47
|
-
const returned = await usingAsync(new MockDisposable(), async () => {
|
|
48
|
-
return 2
|
|
49
|
-
})
|
|
50
|
-
expect(returned).toBe(2)
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
describe('isDisposed', () => {
|
|
54
|
-
it('should return a correct value before and after disposition', () => {
|
|
55
|
-
const d = new MockDisposable()
|
|
56
|
-
expect(d.isDisposed()).toBe(false)
|
|
57
|
-
d.dispose()
|
|
58
|
-
expect(d.isDisposed()).toBe(true)
|
|
59
|
-
})
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
describe('dispose()', () => {
|
|
63
|
-
it('should be called on error', () => {
|
|
64
|
-
const callbackMethod = vi.fn()
|
|
65
|
-
try {
|
|
66
|
-
using(new MockDisposable(), (d) => {
|
|
67
|
-
d.disposeCallback = () => {
|
|
68
|
-
callbackMethod()
|
|
69
|
-
}
|
|
70
|
-
d.whooops()
|
|
71
|
-
})
|
|
72
|
-
} catch {
|
|
73
|
-
/** ignore */
|
|
74
|
-
}
|
|
75
|
-
expect(callbackMethod).toBeCalled()
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
it('should be called with usingAsync()', async () => {
|
|
79
|
-
const callbackMethod = vi.fn()
|
|
80
|
-
await usingAsync(new MockDisposable(), async (d) => {
|
|
81
|
-
d.disposeCallback = () => {
|
|
82
|
-
callbackMethod()
|
|
83
|
-
}
|
|
84
|
-
return new Promise((resolve) => {
|
|
85
|
-
setTimeout(resolve, 1)
|
|
86
|
-
})
|
|
87
|
-
})
|
|
88
|
-
expect(callbackMethod).toBeCalled()
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
it('should be called when async fails', async () => {
|
|
92
|
-
const callbackMethod = vi.fn()
|
|
93
|
-
try {
|
|
94
|
-
await usingAsync(new MockDisposable(), async (d) => {
|
|
95
|
-
d.disposeCallback = () => {
|
|
96
|
-
callbackMethod()
|
|
97
|
-
}
|
|
98
|
-
return new Promise((_resolve, reject) => {
|
|
99
|
-
setTimeout(reject, 1)
|
|
100
|
-
})
|
|
101
|
-
})
|
|
102
|
-
} catch (error) {
|
|
103
|
-
/** ignore */
|
|
104
|
-
}
|
|
105
|
-
expect(callbackMethod).toBeCalled()
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
it('should await dispose for asyncs with usingAsync()', async () => {
|
|
109
|
-
class AsyncDispose {
|
|
110
|
-
/** flag */
|
|
111
|
-
public isDisposed = false
|
|
112
|
-
/** set isDisposed with a timeout */
|
|
113
|
-
public async dispose() {
|
|
114
|
-
await new Promise<void>((resolve) =>
|
|
115
|
-
setTimeout(() => {
|
|
116
|
-
this.isDisposed = true
|
|
117
|
-
resolve()
|
|
118
|
-
}, 10),
|
|
119
|
-
)
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const asyncDispose = new AsyncDispose()
|
|
124
|
-
await usingAsync(asyncDispose, async () => {
|
|
125
|
-
/** */
|
|
126
|
-
})
|
|
127
|
-
expect(asyncDispose.isDisposed).toBe(true)
|
|
128
|
-
})
|
|
129
|
-
})
|
|
130
|
-
})
|
package/src/disposable.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* You can implement *IDisposable* resources and use them with a *using()* or *usingAsync()* syntax.
|
|
4
|
-
*
|
|
5
|
-
* Usage example:
|
|
6
|
-
*
|
|
7
|
-
* ```ts
|
|
8
|
-
* class Resource implements IDisposable{
|
|
9
|
-
* dispose(){
|
|
10
|
-
* // cleanup logics
|
|
11
|
-
* }
|
|
12
|
-
* }
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* using(new Resource(), (resource)=>{
|
|
16
|
-
* // do something with the resource
|
|
17
|
-
* })
|
|
18
|
-
*
|
|
19
|
-
* usingAsync(new Resource(), async (resource)=>{
|
|
20
|
-
* // do something with the resource, allows awaiting promises
|
|
21
|
-
* })
|
|
22
|
-
* ```
|
|
23
|
-
*/
|
|
24
|
-
/** */
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Resources in using an usingAsync should implement this interface
|
|
28
|
-
*
|
|
29
|
-
*/
|
|
30
|
-
export interface Disposable {
|
|
31
|
-
/**
|
|
32
|
-
* Method called when the IDisposable is disposed.
|
|
33
|
-
*/
|
|
34
|
-
dispose: () => void | Promise<void>
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Method that accepts an IDisposable resource that will be disposed after the callback
|
|
39
|
-
* @param resource The resource that is used in the callback and will be disposed afterwards
|
|
40
|
-
* @param callback The callback that will be executed synchrounously before the resource will be disposed
|
|
41
|
-
* @returns the value that will be returned by the callback method
|
|
42
|
-
*/
|
|
43
|
-
export const using = <T extends Disposable, TReturns>(resource: T, callback: (r: T) => TReturns) => {
|
|
44
|
-
try {
|
|
45
|
-
return callback(resource)
|
|
46
|
-
} finally {
|
|
47
|
-
resource.dispose()
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Method that accepts an IDisposable resource that will be disposed after the callback
|
|
53
|
-
* @param resource The resource that is used in the callback and will be disposed afterwards
|
|
54
|
-
* @param callback The callback that will be executed asynchrounously before the resource will be disposed
|
|
55
|
-
* @returns A promise that will be resolved with a return value after the resource is disposed
|
|
56
|
-
*/
|
|
57
|
-
export const usingAsync = async <T extends Disposable, TReturns>(
|
|
58
|
-
resource: T,
|
|
59
|
-
callback: (r: T) => Promise<TReturns>,
|
|
60
|
-
) => {
|
|
61
|
-
try {
|
|
62
|
-
return await callback(resource)
|
|
63
|
-
} finally {
|
|
64
|
-
const disposeResult = resource.dispose()
|
|
65
|
-
if (disposeResult instanceof Promise) {
|
|
66
|
-
await disposeResult
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|