-
Notifications
You must be signed in to change notification settings - Fork 208
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(internal): new prepareAttenuator
leveraging callbacks
#7586
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Interesting approach, but I'm concerned about the cognitive overhead of having to explicitly create callbacks for the simple case of a single target.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks great! Thanks for entertaining those changes.
Remainder are only small nits that don't have any meaningful impact.
0f8ac37
to
6f460fc
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks!
(I was surprised to see how dependent this is on the Callback abstraction, but no objection)
eea8945
to
a9a0975
Compare
Hi @gibson042, I'm merging this now to unblock other work. However, if you still want to give a detailed review, please leave it here and I will address comments and implement changes in a new PR. |
e81f268
to
884fa3b
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Belated review complete.
* @param {unknown} [opts.target] The target for any methods that | ||
* weren't specified in `opts.overrides`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What is the use case for making target optional (e.g., makeAttenuator({ target: undefined, overrides })
)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you want to compose an object entirely out of callbacks, you don't need a default target.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we encourage use of makeAttenuator
for composing an object from callbacks? I would expect not, as opposed to e.g.
const makeInstance = zone.exoClass(tag, interfaceGuard, initEmpty, { ...callbacks });
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(Aside from legacy...)
Now that we have attenuators, when would we ever use callbacks? AFAICT, attenuators are just better. If so, perhaps we should try to phase out callbacks over time.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't see how attenuators supplant callbacks. Thanks to callbacks you can compose a new object of a given shape from different existing objects. They are complimentary.
// @ts-expect-error deliberately attenuated out of existence | ||
t.throws(() => atE.m3(), { message: /not a function/ }); | ||
await t.throwsAsync(() => atE.m4(), { message: /target has no method "m4"/ }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should these errors be more similar? Can they be?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The first is an engine-specific TypeError for which not a function
is the terse message you get when atE.m3
is not defined (in Node.js for this test).
The second is a rejection by the HandledPromise shim that contains much more specific information, such as the methods that do exist, and the type of target
. We could change this one, but its format is pretty deeply entrenched in Agoric SDK unit tests.
closes: Needs issue
Description
Adds a mechanism to define an exo class presenting the same external API, but backed per-instance by passable callback descriptors.
Security Considerations
Improves encapsulation; instead of marshalling raw callback descriptors (which expose their unattenuated targets), an exo ocap can be conveyed.
Scaling Considerations
Documentation Considerations
Testing Considerations