@agoric/internal 0.3.3-dev-bf1e645.0 → 0.3.3-dev-07f6885.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/package.json +3 -3
- package/src/utils.d.ts +3 -0
- package/src/utils.d.ts.map +1 -1
- package/src/utils.js +82 -0
- package/src/node/utils.d.ts +0 -9
- package/src/node/utils.d.ts.map +0 -1
- package/src/node/utils.js +0 -46
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agoric/internal",
|
|
3
|
-
"version": "0.3.3-dev-
|
|
3
|
+
"version": "0.3.3-dev-07f6885.0+07f6885",
|
|
4
4
|
"description": "Externally unsupported utilities internal to agoric-sdk",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.js",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"lint:types": "tsc"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@agoric/base-zone": "0.1.1-dev-
|
|
23
|
+
"@agoric/base-zone": "0.1.1-dev-07f6885.0+07f6885",
|
|
24
24
|
"@endo/common": "^1.2.5",
|
|
25
25
|
"@endo/errors": "^1.2.5",
|
|
26
26
|
"@endo/far": "^1.1.5",
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"typeCoverage": {
|
|
60
60
|
"atLeast": 93.32
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "07f6885c560333981d6564581b2a00735a6c428c"
|
|
63
63
|
}
|
package/src/utils.d.ts
CHANGED
|
@@ -32,6 +32,9 @@ export const BASIS_POINTS: 10000n;
|
|
|
32
32
|
*/
|
|
33
33
|
export const deeplyFulfilledObject: <T extends {}>(unfulfilledTerms: T) => Promise<DeeplyAwaited<T>>;
|
|
34
34
|
export function deepMapObject(obj: object, mapper: (value: any, name: string, record: object) => any): object;
|
|
35
|
+
export function PromiseAllOrErrors<T>(items: readonly (T | PromiseLike<T>)[]): Promise<T[]>;
|
|
36
|
+
export function aggregateTryFinally<T>(trier: () => Promise<T>, finalizer: (error?: unknown) => Promise<unknown>): ReturnType<() => Promise<T>>;
|
|
37
|
+
export function withDeferredCleanup<T>(fn: (addCleanup: (fn: (err?: unknown) => Promise<void>) => void) => Promise<T>): ReturnType<(addCleanup: (fn: (err?: unknown) => Promise<void>) => void) => Promise<T>>;
|
|
35
38
|
export function makeMeasureSeconds(currentTimeMillisec: typeof import("perf_hooks").performance.now): <T>(fn: () => Promise<T>) => Promise<{
|
|
36
39
|
result: T;
|
|
37
40
|
duration: number;
|
package/src/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.js"],"names":[],"mappings":"AAWA,kCAAoC;AAEpC,sCAAsC;AAEtC;;;;;GAKG;AAEH;;GAEG;AAEH;;;;;GAKG;AAEH;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,oCAFU,CAAC,CAAY,SAAF,EAAE,EAAE,gBAAgB,EAAE,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAKxE;AAgDK,mCAJI,MAAM,UACN,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,GAAG,GAC/C,MAAM,CAGuC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.js"],"names":[],"mappings":"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"}
|
package/src/utils.js
CHANGED
|
@@ -101,6 +101,88 @@ const deepMapObjectInternal = (value, name, container, mapper) => {
|
|
|
101
101
|
export const deepMapObject = (obj, mapper) =>
|
|
102
102
|
deepMapObjectInternal(obj, undefined, undefined, mapper);
|
|
103
103
|
|
|
104
|
+
/**
|
|
105
|
+
* Tolerate absence of AggregateError in e.g. xsnap.
|
|
106
|
+
*
|
|
107
|
+
* @type {(errors: Error[], message?: string, options?: object) => Error}
|
|
108
|
+
*/
|
|
109
|
+
const makeAggregateError =
|
|
110
|
+
typeof AggregateError === 'function'
|
|
111
|
+
? (errors, message, options) => AggregateError(errors, message, options)
|
|
112
|
+
: (errors, message, options) => {
|
|
113
|
+
const err = makeError(message ?? 'multiple errors', undefined, options);
|
|
114
|
+
annotateError(err, X`${errors}`);
|
|
115
|
+
return err;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* @template T
|
|
120
|
+
* @param {readonly (T | PromiseLike<T>)[]} items
|
|
121
|
+
* @returns {Promise<T[]>}
|
|
122
|
+
*/
|
|
123
|
+
export const PromiseAllOrErrors = async items => {
|
|
124
|
+
return Promise.allSettled(items).then(results => {
|
|
125
|
+
const errors = /** @type {PromiseRejectedResult[]} */ (
|
|
126
|
+
results.filter(({ status }) => status === 'rejected')
|
|
127
|
+
).map(result => result.reason);
|
|
128
|
+
if (!errors.length) {
|
|
129
|
+
return /** @type {PromiseFulfilledResult<T>[]} */ (results).map(
|
|
130
|
+
result => result.value,
|
|
131
|
+
);
|
|
132
|
+
} else if (errors.length === 1) {
|
|
133
|
+
throw errors[0];
|
|
134
|
+
} else {
|
|
135
|
+
throw makeAggregateError(errors);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @template T
|
|
142
|
+
* @param {() => Promise<T>} trier
|
|
143
|
+
* @param {(error?: unknown) => Promise<unknown>} finalizer
|
|
144
|
+
* @returns {ReturnType<trier>}
|
|
145
|
+
*/
|
|
146
|
+
export const aggregateTryFinally = async (trier, finalizer) =>
|
|
147
|
+
trier().then(
|
|
148
|
+
async result => finalizer().then(() => result),
|
|
149
|
+
async tryError =>
|
|
150
|
+
finalizer(tryError)
|
|
151
|
+
.then(
|
|
152
|
+
() => tryError,
|
|
153
|
+
finalizeError => makeAggregateError([tryError, finalizeError]),
|
|
154
|
+
)
|
|
155
|
+
.then(error => Promise.reject(error)),
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Run a function with the ability to defer last-in-first-out cleanup callbacks.
|
|
160
|
+
*
|
|
161
|
+
* @template T
|
|
162
|
+
* @param {(
|
|
163
|
+
* addCleanup: (fn: (err?: unknown) => Promise<void>) => void,
|
|
164
|
+
* ) => Promise<T>} fn
|
|
165
|
+
* @returns {ReturnType<fn>}
|
|
166
|
+
*/
|
|
167
|
+
export const withDeferredCleanup = async fn => {
|
|
168
|
+
/** @type {((err?: unknown) => unknown)[]} */
|
|
169
|
+
const cleanupsLIFO = [];
|
|
170
|
+
/** @type {(cleanup: (err?: unknown) => unknown) => void} */
|
|
171
|
+
const addCleanup = cleanup => {
|
|
172
|
+
cleanupsLIFO.unshift(cleanup);
|
|
173
|
+
};
|
|
174
|
+
/** @type {(err?: unknown) => Promise<void>} */
|
|
175
|
+
const finalizer = async err => {
|
|
176
|
+
// Run each cleanup in its own isolated stack.
|
|
177
|
+
const cleanupResults = cleanupsLIFO.map(async cleanup => {
|
|
178
|
+
await null;
|
|
179
|
+
return cleanup(err);
|
|
180
|
+
});
|
|
181
|
+
await PromiseAllOrErrors(cleanupResults);
|
|
182
|
+
};
|
|
183
|
+
return aggregateTryFinally(() => fn(addCleanup), finalizer);
|
|
184
|
+
};
|
|
185
|
+
|
|
104
186
|
/**
|
|
105
187
|
* Returns a function that uses a millisecond-based time-since-epoch capability
|
|
106
188
|
* (such as `performance.now`) to measure execution time of an async function
|
package/src/node/utils.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export function PromiseAllOrErrors<T>(items: readonly (T | PromiseLike<T>)[]): Promise<T[]>;
|
|
2
|
-
/**
|
|
3
|
-
* @type {<T>(
|
|
4
|
-
* trier: () => Promise<T>,
|
|
5
|
-
* finalizer: (error?: unknown) => Promise<void>,
|
|
6
|
-
* ) => Promise<T>}
|
|
7
|
-
*/
|
|
8
|
-
export const aggregateTryFinally: <T>(trier: () => Promise<T>, finalizer: (error?: unknown) => Promise<void>) => Promise<T>;
|
|
9
|
-
//# sourceMappingURL=utils.d.ts.map
|
package/src/node/utils.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.js"],"names":[],"mappings":"AAYO,mCAJM,CAAC,SACH,SAAS,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,GAC7B,OAAO,CAAC,CAAC,EAAE,CAAC,CAiBxB;AAED;;;;;GAKG;AACH,kCALU,CAAC,CAAC,EACX,KAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,SAAa,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,KAC1C,OAAO,CAAC,CAAC,CAAC,CAYd"}
|
package/src/node/utils.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
// @ts-check
|
|
2
|
-
// @jessie-check
|
|
3
|
-
|
|
4
|
-
// These tools seem cross platform, but they rely on AggregateError in the error
|
|
5
|
-
// handling path, which is currently not available in xsnap
|
|
6
|
-
import 'node:process';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @template T
|
|
10
|
-
* @param {readonly (T | PromiseLike<T>)[]} items
|
|
11
|
-
* @returns {Promise<T[]>}
|
|
12
|
-
*/
|
|
13
|
-
export const PromiseAllOrErrors = async items => {
|
|
14
|
-
return Promise.allSettled(items).then(results => {
|
|
15
|
-
const errors = /** @type {PromiseRejectedResult[]} */ (
|
|
16
|
-
results.filter(({ status }) => status === 'rejected')
|
|
17
|
-
).map(result => result.reason);
|
|
18
|
-
if (!errors.length) {
|
|
19
|
-
return /** @type {PromiseFulfilledResult<T>[]} */ (results).map(
|
|
20
|
-
result => result.value,
|
|
21
|
-
);
|
|
22
|
-
} else if (errors.length === 1) {
|
|
23
|
-
throw errors[0];
|
|
24
|
-
} else {
|
|
25
|
-
throw AggregateError(errors);
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* @type {<T>(
|
|
32
|
-
* trier: () => Promise<T>,
|
|
33
|
-
* finalizer: (error?: unknown) => Promise<void>,
|
|
34
|
-
* ) => Promise<T>}
|
|
35
|
-
*/
|
|
36
|
-
export const aggregateTryFinally = async (trier, finalizer) =>
|
|
37
|
-
trier().then(
|
|
38
|
-
async result => finalizer().then(() => result),
|
|
39
|
-
async tryError =>
|
|
40
|
-
finalizer(tryError)
|
|
41
|
-
.then(
|
|
42
|
-
() => tryError,
|
|
43
|
-
finalizeError => AggregateError([tryError, finalizeError]),
|
|
44
|
-
)
|
|
45
|
-
.then(error => Promise.reject(error)),
|
|
46
|
-
);
|