diff --git a/index.bs b/index.bs
index e41eb2f69..6ce66e637 100644
--- a/index.bs
+++ b/index.bs
@@ -6166,19 +6166,6 @@ returns a positive number.
JavaScript value |e|, perform !
[$ReadableStreamDefaultControllerError$](|stream|.[=ReadableStream/[[controller]]=], |e|).
-
- To
create a proxy for a
- {{ReadableStream}} |stream|, perform the following steps. The result will be a new
- {{ReadableStream}} object which pulls its data from |stream|, while |stream| itself becomes
- immediately [=ReadableStream/locked=] and [=ReadableStream/disturbed=].
-
- 1. Let |identityTransform| be the result of
creating an identity `TransformStream`.
- 1. Let |promise| be ! [$ReadableStreamPipeTo$](|stream|,
- |identityTransform|.[=TransformStream/[[writable]]=], false, false, false, undefined).
- 1. Set |promise|.\[[PromiseIsHandled]] to true.
- 1. Return |identityTransform|.[=TransformStream/[[readable]]=].
-
-
Reading
The following algorithms can be used on arbitrary {{ReadableStream}} instances, including ones that
@@ -6548,6 +6535,63 @@ Streams is an example of this technique, with its `sender.createEncodedSt
Despite such endpoint pairs obeying the `readable`/`writable` property contract, it never makes
sense to pass them to {{ReadableStream/pipeThrough()}}.
+Piping
+
+
+ The result of a {{ReadableStream}} |readable|
piped to a {{WritableStream}} |writable|, given an optional boolean
+
preventClose
+ (default false), an optional boolean
preventAbort (default false), an optional boolean
preventCancel (default
+ false), and an optional {{AbortSignal}}
signal, is given by performing the following steps.
+ They will return a {{Promise}} that fulfills when the pipe completes, or rejects with an exception
+ if it fails.
+
+ 1. Assert: ! [$IsReadableStreamLocked$](|readable|) is false.
+ 1. Assert: ! [$IsWritableStreamLocked$](|writable|) is false.
+ 1. Let |signalArg| be |signal| if |signal| was given, or undefined otherwise.
+ 1. Return ! [$ReadableStreamPipeTo$](|readable|, |writable|, |preventClose|, |preventAbort|,
+ |preventCancel|, |signalArg|).
+
+
If one doesn't care about the promise returned, referencing this concept can be a
+ bit awkward. The best we can suggest is "[=ReadableStream/pipe=] readable to writable".
+
+
+
+ The result of a {{ReadableStream}} |readable| piped through a {{TransformStream}} |transform|, given
+ an optional boolean preventClose (default false), an optional boolean preventAbort
+ (default false), an optional boolean preventCancel (default false), and an
+ optional {{AbortSignal}} signal, is given by performing the following steps. The result will be
+ the [=readable side=] of |transform|.
+
+ 1. Assert: ! [$IsReadableStreamLocked$](|readable|) is false.
+ 1. Assert: ! [$IsWritableStreamLocked$](|transform|.[=TransformStream/[[writable]]=]) is false.
+ 1. Let |signalArg| be |signal| if |signal| was given, or undefined otherwise.
+ 1. Let |promise| be ! [$ReadableStreamPipeTo$](|readable|,
+ |transform|.[=TransformStream/[[writable]]=], |preventClose|, |preventAbort|, |preventCancel|,
+ |signalArg|).
+ 1. Set |promise|.\[[PromiseIsHandled]] to true.
+ 1. Return |transform|.[=TransformStream/[[readable]]=].
+
+
+
+ To
create a proxy for a
+ {{ReadableStream}} |stream|, perform the following steps. The result will be a new
+ {{ReadableStream}} object which pulls its data from |stream|, while |stream| itself becomes
+ immediately [=ReadableStream/locked=] and [=ReadableStream/disturbed=].
+
+ 1. Let |identityTransform| be the result of
creating an identity `TransformStream`.
+ 1. Return the result of |stream| [=ReadableStream/piped through=] |identityTransform|.
+
+
Examples of creating streams