[Client] Enable calling playground.runStream() and .cli() from the client #2688
+317
−1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation for the change, related issues
Makes
playground.cli()
andplayground.runStream()
available for Playground integrators.Without this PR, these methods can only be called from the same JavaScript process where the PHP is running. If you try to call it over Comlink, you get an error
TypeError: Unserializable return value
as Comlink doesn't know how to transfer aStreamedPHPResponse
object over to another worker..With this PR, you can call both these methods on a PHP Client and Comlink will correctly transfer the
StreamedPHPResponse
object.This unlocks exposing a XTerm.js widget with WP-CLI and Composer commands.
Implementation details
Implements a new transfer handle that uses a few lengthy utility methods to convert between promises and streams and MessagePort instances. On most browsers, it uses the transferable property of a ReadableStream. On Safari, it falls back to MessagePorts.
Testing Instructions (or ideally a Blueprint)
CI – this PR ships a new E2E test.
Also, try this in devtools:
You should se "hi!".
cc @mho22 @brandonpayton