whatwg/streams

Symbol.clone to ease-out structuredClone implicit conversion

WebReflection opened this issue · 1 comments

What problem are you trying to solve?

The complexity of cross-realms interactions is very high these days:

  • Workers and postMessage implicitly use structuredClone to pass values around
  • Proxy used in foreign worlds can't survive any postMessage dance without explicit user interaction (i.e. use ad-hoc API to transform that proxy into something consumable elsewhere)
  • classes defined in a world cannot be cloned in any other world, including the very same realm they'd like to be cloned

What solutions exist today?

None, but we historically have toJSON convention to automatically transform any class into its JSON representation. Times are different these days though, and while structuredClone works wonderfully for all its allowed types, it's impossible from a library author point of view to grant some data can cross boundaries or be cloned properly, as opposite of throwing errors.

How would you solve it?

const ref = {
  // implicitly invoked when `structuredClone(ref)` happens
  // or during the conversion / clone algorithm is applied
  [Symbol.clone]() {
    // returns any structured-clone compatible value
    return new Map(Object.entries(this));
  }
};

The algorithm should look for non primitive values to a Symbol.clone special property that should return the cloned representation of the underlying proxy, class, complex data, and so on.

For this proposal, it would be a developers concern to "reconstruct" or understand returned data, simply screening in a recursive way whatever was cloned, simplifying ad-hoc clones for API calls, or cross-proxy related use cases.

Anything else?

As library author, I could dictate how any reference the library creates could be cloned or even throw if some reference should actually never be cloned (authentication / credentials / passwords / security related things / ... and so on).

This was (wrongly) posted also in TC39 in case some extra thoughts are needed: https://es.discourse.group/t/symbol-clone-to-ease-out-structuredclone-implicit-conversion/2035

Dupe of whatwg/html#7428 in the wrong repository.