Skip to content

Commit

Permalink
fix(ses,pass-style,marshal): tolerate platforms prior to AggregateError
Browse files Browse the repository at this point in the history
  • Loading branch information
erights committed Feb 18, 2024
1 parent 41afa7a commit bcb917d
Show file tree
Hide file tree
Showing 11 changed files with 70 additions and 12 deletions.
11 changes: 8 additions & 3 deletions packages/marshal/test/test-marshal-capdata.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,12 +154,13 @@ test('unserialize errors', t => {
});

test('unserialize extended errors', t => {
if (typeof AggregateError === 'undefined') {
t.pass('skip test on platforms prior to AggregateError');
return;
}
const { unserialize } = makeTestMarshal();
const uns = body => unserialize({ body, slots: [] });

// TODO cause, errors, and AggregateError will eventually be recognized.
// See https://github.com/endojs/endo/pull/2042

const refErr = uns(
'{"@qclass":"error","message":"msg","name":"ReferenceError","extraProp":"foo","cause":"bar","errors":["zip","zap"]}',
);
Expand Down Expand Up @@ -189,6 +190,10 @@ test('unserialize extended errors', t => {
});

test('unserialize errors w recognized extensions', t => {
if (typeof AggregateError === 'undefined') {
t.pass('skip test on platforms prior to AggregateError');
return;
}
const { unserialize } = makeTestMarshal();
const uns = body => unserialize({ body, slots: [] });

Expand Down
8 changes: 8 additions & 0 deletions packages/marshal/test/test-marshal-smallcaps.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,10 @@ test('smallcaps unserialize errors', t => {
});

test('smallcaps unserialize extended errors', t => {
if (typeof AggregateError === 'undefined') {
t.pass('skip test on platforms prior to AggregateError');
return;
}
const { unserialize } = makeTestMarshal();
const uns = body => unserialize({ body, slots: [] });

Expand Down Expand Up @@ -192,6 +196,10 @@ test('smallcaps unserialize extended errors', t => {
});

test('smallcaps unserialize errors w recognized extensions', t => {
if (typeof AggregateError === 'undefined') {
t.pass('skip test on platforms prior to AggregateError');
return;
}
const { unserialize } = makeTestMarshal();
const uns = body => unserialize({ body, slots: [] });

Expand Down
9 changes: 8 additions & 1 deletion packages/pass-style/src/error.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,17 @@ const errorConstructors = new Map(
['URIError', URIError],

// https://github.com/endojs/endo/issues/550
['AggregateError', AggregateError],
// To accommodate platforms prior to AggregateError, we comment out the
// following line and instead conditionally add it to the map below.
// ['AggregateError', AggregateError],
]),
);

if (typeof AggregateError !== 'undefined') {
// Conditional, to accommodate platforms prior to AggregateError
errorConstructors.set('AggregateError', AggregateError);
}

/**
* Because the error constructor returned by this function might be
* `AggregateError`, which has different construction parameters
Expand Down
2 changes: 1 addition & 1 deletion packages/pass-style/src/passStyleOf.js
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ export const assertPassableError = err => {
* Return a new passable error that propagates the diagnostic info of the
* original, and is linked to the original as a note.
*
* @param {Error | AggregateError} err
* @param {Error} err
* @returns {Error}
*/
export const toPassableError = err => {
Expand Down
7 changes: 5 additions & 2 deletions packages/pass-style/test/test-extended-errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ test('style of extended errors', t => {
const u3 = harden(URIError('u3', { cause: e1 }));
t.is(passStyleOf(u3), 'error');

const a4 = harden(AggregateError([e2, u3], 'a4', { cause: e1 }));
t.is(passStyleOf(a4), 'error');
if (typeof AggregateError !== 'undefined') {
// Conditional, to accommodate platforms prior to AggregateError
const a4 = harden(AggregateError([e2, u3], 'a4', { cause: e1 }));
t.is(passStyleOf(a4), 'error');
}
});
5 changes: 4 additions & 1 deletion packages/ses/src/error/assert.js
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,10 @@ const makeError = (
const messageString = getMessageString(hiddenDetails);
const opts = cause && { cause };
let error;
if (errConstructor === AggregateError) {
if (
typeof AggregateError !== 'undefined' &&
errConstructor === AggregateError
) {
error = AggregateError(errors || [], messageString, opts);
} else {
error = /** @type {ErrorConstructor} */ (errConstructor)(
Expand Down
20 changes: 16 additions & 4 deletions packages/ses/src/permits.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
/* eslint-disable no-restricted-globals */
/* eslint max-lines: 0 */

import { arrayPush } from './commons.js';

/**
* @file Exports {@code whitelist}, a recursively defined
* JSON record enumerating all intrinsics and their properties
Expand All @@ -8,8 +12,6 @@
* @author Mark S. Miller
*/

/* eslint max-lines: 0 */

/**
* constantProperties
* non-configurable, non-writable data properties of all global objects.
Expand Down Expand Up @@ -187,17 +189,27 @@ export const uniqueGlobalPropertyNames = {

// All the "subclasses" of Error. These are collectively represented in the
// ECMAScript spec by the meta variable NativeError.
export const NativeErrors = [
/** @type {GenericErrorConstructor[]} */
const NativeErrors = [
EvalError,
RangeError,
ReferenceError,
SyntaxError,
TypeError,
URIError,
// https://github.com/endojs/endo/issues/550
AggregateError,
// Commented out to accommodate platforms prior to AggregateError.
// Instead, conditional push below.
// AggregateError,
];

if (typeof AggregateError !== 'undefined') {
// Conditional, to accommodate platforms prior to AggregateError
arrayPush(NativeErrors, AggregateError);
}

export { NativeErrors };

/**
* <p>Each JSON record enumerates the disposition of the properties on
* some corresponding intrinsic object.
Expand Down
4 changes: 4 additions & 0 deletions packages/ses/test/error/test-aggregate-error-console-demo.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ import '../../index.js';
lockdown();

test('aggregate error console demo', t => {
if (typeof AggregateError === 'undefined') {
t.pass('skip test on platforms prior to AggregateError');
return;
}
const e3 = Error('e3');
const e2 = Error('e2', { cause: e3 });
const u4 = URIError('u4', { cause: e2 });
Expand Down
4 changes: 4 additions & 0 deletions packages/ses/test/error/test-aggregate-error-console.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ import { throwsAndLogs } from './throws-and-logs.js';
lockdown();

test('aggregate error console', t => {
if (typeof AggregateError === 'undefined') {
t.pass('skip test on platforms prior to AggregateError');
return;
}
const e3 = Error('e3');
const e2 = Error('e2', { cause: e3 });
const u4 = URIError('u4', { cause: e2 });
Expand Down
8 changes: 8 additions & 0 deletions packages/ses/test/error/test-aggregate-error.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ const { getOwnPropertyDescriptor } = Object;
lockdown();

test('aggregate error', t => {
if (typeof AggregateError === 'undefined') {
t.pass('skip test on platforms prior to AggregateError');
return;
}
const e1 = Error('e1');
const e2 = Error('e2', { cause: e1 });
const u3 = URIError('u3', { cause: e1 });
Expand All @@ -28,6 +32,10 @@ test('aggregate error', t => {
});

test('Promise.any aggregate error', async t => {
if (typeof AggregateError === 'undefined') {
t.pass('skip test on platforms prior to AggregateError');
return;
}
const e1 = Error('e1');
const e2 = Error('e2', { cause: e1 });
const u3 = URIError('u3', { cause: e1 });
Expand Down
4 changes: 4 additions & 0 deletions packages/ses/test/error/test-error-cause.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ test('error cause', t => {
enumerable: false,
configurable: true,
});
if (typeof AggregateError === 'undefined') {
t.pass('skip rest of test on platforms prior to AggregateError');
return;
}
const a4 = AggregateError([e2, u3], 'a4', { cause: e1 });
t.is(a4.message, 'a4');
t.is(a4.cause, e1);
Expand Down

0 comments on commit bcb917d

Please sign in to comment.