trusted resolve and unverify, second try resolve

This commit is contained in:
Michael Peters 2022-10-13 22:02:48 -07:00
parent 5e4db47520
commit 1d53aa46fa
2 changed files with 53 additions and 53 deletions

View File

@ -1024,69 +1024,69 @@ describe('fetchAndVerifyIfNeeded tests', () => {
}); });
/* test('ab: a: primary with null, b: primary dedup, ab: resolve trusted fetch and unverify, second trusted with value', async () => { */ test('ab: a: primary with null, b: primary dedup, ab: resolve trusted fetch and unverify, second trusted with value', async () => {
/* const { */ const {
/* nextPrimary, nextTrusted, nextVerify, */ nextPrimary, nextTrusted, nextVerify,
/* primaryFunc, trustedFunc, verifyFunc */ primaryFunc, trustedFunc, verifyFunc
/* } = getManualsAndMocks(); */ } = getManualsAndMocks();
/* const av = new AutoVerifier(primaryFunc, trustedFunc, verifyFunc); */ const av = new AutoVerifier(primaryFunc, trustedFunc, verifyFunc);
/* const a = fetchAndVerifyIfNeededManually(av, nextPrimary, nextTrusted, nextVerify); */ const a = fetchAndVerifyIfNeededManually(av, nextPrimary, nextTrusted, nextVerify);
/* const b = fetchAndVerifyIfNeededManually(av, nextPrimary, nextTrusted, nextVerify); */ const b = fetchAndVerifyIfNeededManually(av, nextPrimary, nextTrusted, nextVerify);
/* */
/* expect(av.primaryPromise).toBe(a.primary.promise); */
/* expect(av.trustedPromise).toBe(a.trusted.promise); */
/* expect(av.trustedStatus).toBe('fetching'); */
/* expect(primaryFunc).toHaveBeenCalled(); */
/* expect(trustedFunc).toHaveBeenCalled(); */
/* a.primary.resolve(null); */ expect(av.primaryPromise).toBe(a.primary.promise);
/* await disjoint(); */ expect(av.trustedPromise).toBe(a.trusted.promise);
expect(av.trustedStatus).toBe('fetching');
expect(primaryFunc).toHaveBeenCalled();
expect(trustedFunc).toHaveBeenCalled();
/* expect(av.primaryPromise).toBe(null); */ a.primary.resolve(null);
/* expect(av.trustedPromise).toBe(a.trusted.promise); */ await disjoint();
/* expect(av.trustedStatus).toBe('verifying'); */
/* */
/* a.trusted.reject(new Error('rejected')); */
/* av.unverify() */
/* */
/* expect(av.primaryPromise).toBe(null); */
/* expect(av.trustedPromise).toBe(null); */
/* expect(av.trustedStatus).toBe('none'); */
/* await disjoint(); */ expect(av.primaryPromise).toBe(null);
expect(av.trustedPromise).toBe(a.trusted.promise);
expect(av.trustedStatus).toBe('verifying');
/* expect(av.primaryPromise).toBe(null); */ a.trusted.resolve(new BasicWE(2));
/* expect(av.trustedPromise).toBe(b.trusted.promise); */ av.unverify()
/* expect(av.trustedStatus).toBe('verifying'); */
/* expect(verifyFunc).toHaveBeenCalledTimes(0); */ expect(av.primaryPromise).toBe(null);
/* b.trusted.resolve(new BasicWE(2)); */ expect(av.trustedPromise).toBe(null);
/* await disjoint(); */ expect(av.trustedStatus).toBe('none');
/* expect(verifyFunc).toHaveBeenCalledWith(null, new BasicWE(2)); */ await disjoint();
/* expect(av.primaryPromise).toBe(null); */
/* expect(av.trustedPromise).toBe(b.trusted.promise); */
/* expect(av.trustedStatus).toBe('verifying'); */
/* expect(a.result).toBeUndefined(); */ expect(av.primaryPromise).toBe(null);
/* expect(b.result).toBeUndefined(); */ expect(av.trustedPromise).toBe(b.trusted.promise);
/* a.verify.resolve(true); */ expect(av.trustedStatus).toBe('verifying');
/* await disjoint() */
/* expect(a.result).toEqual(new BasicWE(2)); */ expect(verifyFunc).toHaveBeenCalledTimes(0);
/* expect(b.result).toEqual(new BasicWE(2)); */ b.trusted.resolve(new BasicWE(3));
/* expect(av.primaryPromise).toBe(null); */ await disjoint();
/* expect(av.trustedPromise).toBe(b.trusted.promise); */
/* expect(av.trustedStatus).toBe('verified'); */
/* await disjoint(); */ expect(verifyFunc).toHaveBeenCalledWith(null, new BasicWE(3));
expect(av.primaryPromise).toBe(null);
expect(av.trustedPromise).toBe(b.trusted.promise);
expect(av.trustedStatus).toBe('verifying');
/* expect(primaryFunc).toHaveBeenCalledTimes(1); */ expect(a.result).toBeUndefined();
/* expect(trustedFunc).toHaveBeenCalledTimes(2); */ expect(b.result).toBeUndefined();
/* expect(verifyFunc).toHaveBeenCalledTimes(1); */ a.verify.resolve(true);
/* }); */ await disjoint()
expect(a.result).toEqual(new BasicWE(3));
expect(b.result).toEqual(new BasicWE(3));
expect(av.primaryPromise).toBe(null);
expect(av.trustedPromise).toBe(b.trusted.promise);
expect(av.trustedStatus).toBe('verified');
await disjoint();
expect(primaryFunc).toHaveBeenCalledTimes(1);
expect(trustedFunc).toHaveBeenCalledTimes(2);
expect(verifyFunc).toHaveBeenCalledTimes(1);
});
// TODO: Why not have fetcher and a simple dedup wrapper to remove some complexity from this function? // TODO: Why not have fetcher and a simple dedup wrapper to remove some complexity from this function?
// This would likely make it possible to get rid of the "else" block in tryResolveTrustedPromise // This would likely make it possible to get rid of the "else" block in tryResolveTrustedPromise

View File

@ -296,7 +296,7 @@ export class AutoVerifier<T> {
try { try {
trustedResult = await origTrustedPromise; trustedResult = await origTrustedPromise;
} catch (e: unknown) { } catch (e: unknown) {
if (this.trustedPromise == origTrustedPromise) { if (this.trustedPromise === origTrustedPromise) {
throw e; throw e;
} else { } else {
console.warn('trusted promise from another path rejected after unverify', e); console.warn('trusted promise from another path rejected after unverify', e);
@ -343,8 +343,8 @@ export class AutoVerifier<T> {
await tryResolveTrustedPromise(); await tryResolveTrustedPromise();
} catch (e: unknown) { } catch (e: unknown) {
if (!resolved) { if (!resolved) {
this.trustedPromise = null; // suppress warnings about uncaught rejections
this.primaryPromise = null; // suppress warnings about uncaught rejections this.primaryPromise = null; // suppress warnings about uncaught rejections
//this.trustedPromise = null; // suppress warnings about uncaught rejections
this.verifyPromise = null; // suppress warnings about uncaught rejections this.verifyPromise = null; // suppress warnings about uncaught rejections
this.unverify(); this.unverify();
// eslint-disable-next-line prefer-promise-reject-errors // eslint-disable-next-line prefer-promise-reject-errors