-
Notifications
You must be signed in to change notification settings - Fork 73
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(ses): shim ArrayBuffer.prototype.transfer #2417
Conversation
4822621
to
2911043
Compare
2911043
to
4dd9bf8
Compare
b324de6
to
fc32323
Compare
4dd9bf8
to
d19e509
Compare
fc32323
to
4825656
Compare
d19e509
to
585042f
Compare
a3840c7
to
ca4b5fb
Compare
Closes: #2418 Refs: #2417 #1308 ## Description Adapted from #2419 (review) below The platform compatibility test specifically validates that SES works on Node.js 12 and can be deleted since it has vanished into history. Node.js 12 required special consideration because of its experimental ESM support. Delete the `test:platform-compatibility` script in the ses `package.json`, as well as the `test/package` fixture in ci.yml Immediate motivation explained in #2418 , #2417 broken the platform-compatibility-test tests because it depends on the platform providing either `Array.prototype.transfer` or `structuredClone`. Node supports `transfer` starting with Node 22, but supports `structuredClone` starting in Node 18. That should be fine, since that is our declared support floor. This PR changes our one known remaining dependence on Node 12. ### Security Considerations none ### Scaling Considerations none ### Documentation Considerations none beyond the need to explain our platform requirements, which this PR does not change. ### Testing Considerations The point. This PR only affects tests, not production code. Reviewers, should this PR be labeled `test:` instead of `fix:`? ### Compatibility and Upgrade Considerations After this PR, we will no longer notice further breakage on Node < 18. That fits with our declared support floor.
585042f
to
c874e3c
Compare
13e80da
to
8dce401
Compare
8dce401
to
06e15fe
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.
Please consider removing the unnecessary slice
call as brand check, and improve support for when the new length doesn't match.
PTAL |
Done |
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.
Thanks for addressing the previous feedback. There is indeed a better way to copy an array buffer,
Staged on #2419
Closes: #XXXX
Refs: #2414 #2418 #2419
Description
#2414 by itself does not work on Node 18 and Node 20 because
Array.prototype.transfer
, so feat(pass-style,marshal): ByteArray, a binary Passable #2414 must usestructuredClone
insteadstructuredClone
does exist on Node >= 18, so it should be on supported platforms (though see The ses-shim tests on Node 12 despite our min support being Node 18 #2418 ). However,structuredClone
itself is dangerous and so must not be added to the shared intrinsics. As a result, in feat(pass-style,marshal): ByteArray, a binary Passable #2414 , when@endo/pass-style
is initialized in a created compartment, it fails to find eitherArray.prototype.transfer
and `structuredCloneTo solve this, @kriskowal suggested that we also shim
Array.prototype.transfer
if needed duringlockdown
, along with other repairs. We are avoiding similarly shimmingArray.prototype.transferToImmutable
because it is not yet standard. ButArray.prototype.transfer
is standard, and solockdown
can globally shim it before hardening the shared intrinsics.This PR implements @kriskowal 's suggestion.
Security Considerations
none
Scaling Considerations
by itself, none
Documentation Considerations
nothing signicant.
Testing Considerations
See #2418 . Aside from that, none
Compatibility and Upgrade Considerations
On platforms with neither
Array.prototype.transfer
nor a globalstructuredClone
, the ses-shim will currently not install an emulation ofArray.prototype.transfer
. However, once we verify that endo is not intended to support platforms without both, we may change lockdown to throw, failing to lock down.