@endo/eventual-send 0.15.1 → 0.15.4
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/CHANGELOG.md +26 -0
- package/package.json +4 -4
- package/src/handled-promise.js +15 -22
- package/src/track-turns.js +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,32 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
### [0.15.4](https://github.com/endojs/endo/compare/@endo/eventual-send@0.15.3...@endo/eventual-send@0.15.4) (2022-06-11)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **eventual-send:** no implicit rejection silencing; just harden ([ca07d81](https://github.com/endojs/endo/commit/ca07d8150fd1e12b9e90505a7c06ada6b25d0743))
|
|
12
|
+
* **eventual-send:** use `!Object.is(a, b)` instead of `a !== b` for NaNs ([2b7e418](https://github.com/endojs/endo/commit/2b7e4189182dcac17832bbdcfb6ac56e32fee456))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### [0.15.3](https://github.com/endojs/endo/compare/@endo/eventual-send@0.15.2...@endo/eventual-send@0.15.3) (2022-04-15)
|
|
17
|
+
|
|
18
|
+
**Note:** Version bump only for package @endo/eventual-send
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### [0.15.2](https://github.com/endojs/endo/compare/@endo/eventual-send@0.15.1...@endo/eventual-send@0.15.2) (2022-04-14)
|
|
25
|
+
|
|
26
|
+
**Note:** Version bump only for package @endo/eventual-send
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
6
32
|
### [0.15.1](https://github.com/endojs/endo/compare/@endo/eventual-send@0.15.0...@endo/eventual-send@0.15.1) (2022-04-13)
|
|
7
33
|
|
|
8
34
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@endo/eventual-send",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.4",
|
|
4
4
|
"description": "Extend a Promise class to implement the eventual-send API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/no-shim.js",
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
},
|
|
28
28
|
"homepage": "https://github.com/endojs/endo#readme",
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@endo/lockdown": "^0.1.
|
|
31
|
-
"@endo/ses-ava": "^0.2.
|
|
30
|
+
"@endo/lockdown": "^0.1.14",
|
|
31
|
+
"@endo/ses-ava": "^0.2.26",
|
|
32
32
|
"ava": "^3.12.1",
|
|
33
33
|
"c8": "^7.7.3",
|
|
34
34
|
"tsd": "^0.19.1"
|
|
@@ -62,5 +62,5 @@
|
|
|
62
62
|
],
|
|
63
63
|
"timeout": "2m"
|
|
64
64
|
},
|
|
65
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "7be9306df5e5eae280134cbbaf0d3886b4e51536"
|
|
66
66
|
}
|
package/src/handled-promise.js
CHANGED
|
@@ -26,6 +26,7 @@ const {
|
|
|
26
26
|
getPrototypeOf,
|
|
27
27
|
setPrototypeOf,
|
|
28
28
|
isFrozen,
|
|
29
|
+
is: objectIs,
|
|
29
30
|
} = Object;
|
|
30
31
|
|
|
31
32
|
const { apply, construct } = Reflect;
|
|
@@ -93,7 +94,7 @@ export const makeHandledPromise = () => {
|
|
|
93
94
|
if (presence) {
|
|
94
95
|
// Presences are final, so it is ok to propagate
|
|
95
96
|
// this upstream.
|
|
96
|
-
while (target
|
|
97
|
+
while (!objectIs(target, p)) {
|
|
97
98
|
const parent = forwardedPromiseToPromise.get(target);
|
|
98
99
|
forwardedPromiseToPromise.delete(target);
|
|
99
100
|
promiseToPendingHandler.delete(target);
|
|
@@ -104,7 +105,7 @@ export const makeHandledPromise = () => {
|
|
|
104
105
|
// We propagate p and remove all other pending handlers
|
|
105
106
|
// upstream.
|
|
106
107
|
// Note that everything except presences is covered here.
|
|
107
|
-
while (target
|
|
108
|
+
while (!objectIs(target, p)) {
|
|
108
109
|
const parent = forwardedPromiseToPromise.get(target);
|
|
109
110
|
forwardedPromiseToPromise.set(target, p);
|
|
110
111
|
promiseToPendingHandler.delete(target);
|
|
@@ -237,7 +238,7 @@ export const makeHandledPromise = () => {
|
|
|
237
238
|
targetP = presenceToPromise.get(value);
|
|
238
239
|
}
|
|
239
240
|
// Ensure our data structure is a proper tree (avoid cycles).
|
|
240
|
-
if (targetP && targetP
|
|
241
|
+
if (targetP && !objectIs(targetP, handledP)) {
|
|
241
242
|
forwardedPromiseToPromise.set(handledP, targetP);
|
|
242
243
|
} else {
|
|
243
244
|
forwardedPromiseToPromise.delete(handledP);
|
|
@@ -246,11 +247,6 @@ export const makeHandledPromise = () => {
|
|
|
246
247
|
// Remove stale pending handlers, set to canonical form.
|
|
247
248
|
shorten(handledP);
|
|
248
249
|
|
|
249
|
-
// Ensure our pendingHandler is cleaned up if not already.
|
|
250
|
-
if (promiseToPendingHandler.has(handledP)) {
|
|
251
|
-
handledP.then(_ => promiseToPendingHandler.delete(handledP));
|
|
252
|
-
}
|
|
253
|
-
|
|
254
250
|
// Finish the resolution.
|
|
255
251
|
superResolve(value);
|
|
256
252
|
resolved = true;
|
|
@@ -259,10 +255,11 @@ export const makeHandledPromise = () => {
|
|
|
259
255
|
// We're resolved, so forward any postponed operations to us.
|
|
260
256
|
continueForwarding();
|
|
261
257
|
};
|
|
262
|
-
handledReject =
|
|
258
|
+
handledReject = reason => {
|
|
263
259
|
if (resolved) {
|
|
264
260
|
return;
|
|
265
261
|
}
|
|
262
|
+
harden(reason);
|
|
266
263
|
assert(
|
|
267
264
|
!forwardedPromiseToPromise.has(handledP),
|
|
268
265
|
X`internal: already forwarded`,
|
|
@@ -270,7 +267,7 @@ export const makeHandledPromise = () => {
|
|
|
270
267
|
);
|
|
271
268
|
promiseToPendingHandler.delete(handledP);
|
|
272
269
|
resolved = true;
|
|
273
|
-
superReject(
|
|
270
|
+
superReject(reason);
|
|
274
271
|
continueForwarding();
|
|
275
272
|
};
|
|
276
273
|
};
|
|
@@ -401,7 +398,7 @@ export const makeHandledPromise = () => {
|
|
|
401
398
|
},
|
|
402
399
|
getSendOnly(target, prop) {
|
|
403
400
|
prop = coerceToObjectProperty(prop);
|
|
404
|
-
handle(target, 'getSendOnly', [prop]);
|
|
401
|
+
handle(target, 'getSendOnly', [prop]).catch(() => {});
|
|
405
402
|
},
|
|
406
403
|
applyFunction(target, args) {
|
|
407
404
|
// Ensure args is an array.
|
|
@@ -411,7 +408,7 @@ export const makeHandledPromise = () => {
|
|
|
411
408
|
applyFunctionSendOnly(target, args) {
|
|
412
409
|
// Ensure args is an array.
|
|
413
410
|
args = [...args];
|
|
414
|
-
handle(target, 'applyFunctionSendOnly', [args]);
|
|
411
|
+
handle(target, 'applyFunctionSendOnly', [args]).catch(() => {});
|
|
415
412
|
},
|
|
416
413
|
applyMethod(target, prop, args) {
|
|
417
414
|
prop = coerceToObjectProperty(prop);
|
|
@@ -423,7 +420,7 @@ export const makeHandledPromise = () => {
|
|
|
423
420
|
prop = coerceToObjectProperty(prop);
|
|
424
421
|
// Ensure args is an array.
|
|
425
422
|
args = [...args];
|
|
426
|
-
handle(target, 'applyMethodSendOnly', [prop, args]);
|
|
423
|
+
handle(target, 'applyMethodSendOnly', [prop, args]).catch(() => {});
|
|
427
424
|
},
|
|
428
425
|
resolve(value) {
|
|
429
426
|
// Resolving a Presence returns the pre-registered handled promise.
|
|
@@ -443,7 +440,7 @@ export const makeHandledPromise = () => {
|
|
|
443
440
|
const executeThen = (resolve, reject) =>
|
|
444
441
|
resolvedPromise.then(resolve, reject);
|
|
445
442
|
return harden(
|
|
446
|
-
Promise.resolve().then(
|
|
443
|
+
Promise.resolve().then(() => new HandledPromise(executeThen)),
|
|
447
444
|
);
|
|
448
445
|
},
|
|
449
446
|
};
|
|
@@ -497,6 +494,7 @@ export const makeHandledPromise = () => {
|
|
|
497
494
|
const returnedP = new HandledPromise((resolve, reject) => {
|
|
498
495
|
// We run in a future turn to prevent synchronous attacks,
|
|
499
496
|
let raceIsOver = false;
|
|
497
|
+
|
|
500
498
|
const win = (handlerName, handler, o) => {
|
|
501
499
|
if (raceIsOver) {
|
|
502
500
|
return;
|
|
@@ -504,16 +502,16 @@ export const makeHandledPromise = () => {
|
|
|
504
502
|
try {
|
|
505
503
|
resolve(trackedDoDispatch(handlerName, handler, o));
|
|
506
504
|
} catch (reason) {
|
|
507
|
-
reject(reason);
|
|
505
|
+
reject(harden(reason));
|
|
508
506
|
}
|
|
509
507
|
raceIsOver = true;
|
|
510
508
|
};
|
|
511
509
|
|
|
512
|
-
const lose =
|
|
510
|
+
const lose = reason => {
|
|
513
511
|
if (raceIsOver) {
|
|
514
512
|
return;
|
|
515
513
|
}
|
|
516
|
-
reject(
|
|
514
|
+
reject(harden(reason));
|
|
517
515
|
raceIsOver = true;
|
|
518
516
|
};
|
|
519
517
|
|
|
@@ -546,11 +544,6 @@ export const makeHandledPromise = () => {
|
|
|
546
544
|
.catch(lose);
|
|
547
545
|
});
|
|
548
546
|
|
|
549
|
-
// Harden the fulfillment and rejection, as well as a workaround for
|
|
550
|
-
// Node.js: silence "Unhandled Rejection" by default when using the static
|
|
551
|
-
// methods.
|
|
552
|
-
returnedP.then(harden, harden);
|
|
553
|
-
|
|
554
547
|
// We return a handled promise with the default pending handler. This
|
|
555
548
|
// prevents a race between the above Promise.resolves and pipelining.
|
|
556
549
|
return harden(returnedP);
|