From fd3a6f052056947ade35ee3f5499cac8c508a655 Mon Sep 17 00:00:00 2001 From: Michael FIG Date: Thu, 13 Jun 2024 23:58:10 -0600 Subject: [PATCH] fixup! fix(vow): correct the typing of `unwrap` --- packages/internal/src/types.d.ts | 9 ++++++++- packages/vow/src/E.js | 28 +++++++++++++++------------- packages/vow/src/types.js | 12 ++++-------- packages/vow/src/when.js | 8 ++++---- 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/packages/internal/src/types.d.ts b/packages/internal/src/types.d.ts index 9130d2a39e93..62fcf446617f 100644 --- a/packages/internal/src/types.d.ts +++ b/packages/internal/src/types.d.ts @@ -1,5 +1,5 @@ /* eslint-disable max-classes-per-file */ -import type { RemotableBrand } from '@endo/eventual-send'; +import type { ERef, RemotableBrand } from '@endo/eventual-send'; import type { Primitive } from '@endo/pass-style'; import type { Callable } from './utils.js'; @@ -56,3 +56,10 @@ export type DataOnly = export type Remote> = | Primary | RemotableBrand; + +/** + * Potentially remote promises or settled references. + */ +export type FarRef> = ERef< + Remote +>; diff --git a/packages/vow/src/E.js b/packages/vow/src/E.js index 14017fe3056a..35c0143bce56 100644 --- a/packages/vow/src/E.js +++ b/packages/vow/src/E.js @@ -9,7 +9,7 @@ const onSend = makeMessageBreakpointTester('ENDO_SEND_BREAKPOINTS'); /** * @import { HandledPromiseConstructor, RemotableBrand } from '@endo/eventual-send' - * @import { Unwrap } from './types.js' + * @import { EUnwrap } from './types.js' */ /** @typedef {(...args: unknown[]) => any} Callable */ @@ -43,7 +43,7 @@ const baseFreezableProxyHandler = { * * @param {any} recipient Any value passed to E(x) * @param {HandledPromiseConstructor} HandledPromise - * @param {(x: T) => Promise>} unwrap + * @param {(x: T) => Promise>} unwrap * @returns {ProxyHandler} the Proxy handler */ const makeEProxyHandler = (recipient, HandledPromise, unwrap) => @@ -108,7 +108,7 @@ const makeEProxyHandler = (recipient, HandledPromise, unwrap) => * * @param {any} recipient Any value passed to E.sendOnly(x) * @param {HandledPromiseConstructor} HandledPromise - * @param {(x: T) => Promise>} unwrap + * @param {(x: T) => Promise>} unwrap * @returns {ProxyHandler} the Proxy handler */ const makeESendOnlyProxyHandler = (recipient, HandledPromise, unwrap) => @@ -171,7 +171,7 @@ const makeESendOnlyProxyHandler = (recipient, HandledPromise, unwrap) => * * @param {any} x Any value passed to E.get(x) * @param {HandledPromiseConstructor} HandledPromise - * @param {(x: T) => Promise>} unwrap + * @param {(x: T) => Promise>} unwrap * @returns {ProxyHandler} the Proxy handler */ const makeEGetProxyHandler = (x, HandledPromise, unwrap) => @@ -188,7 +188,7 @@ const resolve = x => HandledPromise.resolve(x); * @template [A={}] * @param {HandledPromiseConstructor} HandledPromise * @param {object} [powers] - * @param {(x: T) => Promise>} [powers.unwrap] + * @param {(x: T) => Promise>} [powers.unwrap] * @param {A} [powers.additional] */ const makeE = (HandledPromise, powers = {}) => { @@ -265,10 +265,10 @@ const makeE = (HandledPromise, powers = {}) => { * unwrap(x).then(onfulfilled, onrejected) * * @template T - * @template [TResult1=Unwrap] + * @template [TResult1=EUnwrap] * @template [TResult2=never] * @param {ERef} x value to convert to a handled promise - * @param {(value: Unwrap) => ERef} [onfulfilled] + * @param {(value: EUnwrap) => ERef} [onfulfilled] * @param {(reason: any) => ERef} [onrejected] * @returns {Promise} * @readonly @@ -309,11 +309,11 @@ export default makeE; /** * @template {Callable} T * @typedef {( - * ReturnType extends Unwrap> + * ReturnType extends EUnwrap> * ? (...args: Parameters) => Promise> - * : ReturnType extends Promise>> + * : ReturnType extends Promise>> * ? T - * : (...args: Parameters) => Promise>> + * : (...args: Parameters) => Promise>> * )} ECallable */ @@ -390,6 +390,8 @@ export default makeE; * @typedef {( * T extends Callable * ? (...args: Parameters) => ReturnType // a root callable, no methods + * : FilteredKeys extends never + * ? never * : Pick> // any callable methods * )} PickCallable */ @@ -399,9 +401,9 @@ export default makeE; * * @template T * @typedef {( - * T extends RemotableBrand // if a given T will settle to some remote interface R + * EUnwrap extends RemotableBrand // if a given T will settle to some remote interface R * ? PickCallable // then return the callable properties of R - * : PickCallable> // otherwise return the callable properties of the settled T + * : PickCallable> // otherwise return the callable properties of the settled T * )} RemoteFunctions */ @@ -410,7 +412,7 @@ export default makeE; * @typedef {( * T extends RemotableBrand * ? L - * : Unwrap + * : EUnwrap * )} LocalRecord */ diff --git a/packages/vow/src/types.js b/packages/vow/src/types.js index 3c7aa73e0016..f76fa76a3b1a 100644 --- a/packages/vow/src/types.js +++ b/packages/vow/src/types.js @@ -2,10 +2,9 @@ export {}; /** - * @import {RemotableBrand} from '@endo/eventual-send' * @import {CopyTagged} from '@endo/pass-style' * @import {RemotableObject} from '@endo/pass-style'; - * @import {IsPrimitive, Remote} from '@agoric/internal'; + * @import {Remote} from '@agoric/internal'; * @import {prepareVowTools} from './tools.js' */ @@ -35,13 +34,10 @@ export {}; * This is used within E, so we must narrow the type to its remote form. * @template T * @typedef {( - * T extends Vow ? Unwrap : - * T extends Promise ? Unwrap : - * T extends PromiseLike ? Unwrap : - * IsPrimitive extends true ? T : - * T extends RemotableBrand ? Local & T : + * T extends Vow ? EUnwrap : + * T extends PromiseLike ? EUnwrap : * T - * )} Unwrap + * )} EUnwrap */ /** diff --git a/packages/vow/src/when.js b/packages/vow/src/when.js index ef1a6bad3c32..ffc47165a5c7 100644 --- a/packages/vow/src/when.js +++ b/packages/vow/src/when.js @@ -1,7 +1,7 @@ // @ts-check import { getVowPayload, basicE } from './vow-utils.js'; -/** @import { IsRetryableReason, Unwrap } from './types.js' */ +/** @import { IsRetryableReason, EUnwrap } from './types.js' */ /** * @param {IsRetryableReason} [isRetryableReason] @@ -13,10 +13,10 @@ export const makeWhen = ( * Shorten `specimenP` until we achieve a final result. * * @template T - * @template [TResult1=Unwrap] + * @template [TResult1=EUnwrap] * @template [TResult2=never] * @param {T} specimenP value to unwrap - * @param {(value: Unwrap) => TResult1 | PromiseLike} [onFulfilled] + * @param {(value: EUnwrap) => TResult1 | PromiseLike} [onFulfilled] * @param {(reason: any) => TResult2 | PromiseLike} [onRejected] * @returns {Promise} */ @@ -50,7 +50,7 @@ export const makeWhen = ( payload = getVowPayload(result); } - const unwrapped = /** @type {Unwrap} */ (result); + const unwrapped = /** @type {EUnwrap} */ (result); // We've extracted the final result. if (onFulfilled == null && onRejected == null) {