ReadableStreamBYOBRequest
=========================

**`ReadableStreamBYOBRequest`** はストリーム API のインターフェイスで、は、コンシューマーにゼロコピーで移譲される（ストリーム内部のキューをバイパスする）基盤からのデータの「プルリクエスト」を表します。

`ReadableStreamBYOBRequest` オブジェクトは、コンシューマーがデータのリクエストを行い、ストリームの内部キューが空である場合に、「BYOBモード」で作成されます。
 （ストリームがすでにバッファーされたデータを持っている場合、ストリームはコンシューマーのリクエストを直接解決します。）
 基盤のバイトソースは、コントローラの `ReadableByteStreamController.byobRequest` プロパティを通してアクティブな BYOB リクエストにアクセスすることができます。

 「BYOB モード」に対応している基盤ソースは、 `ReadableByteStreamController.byobRequest` を調べ、存在する場合はそれを使用してデータを移譲しなければなりません。
 もし `ReadableByteStreamController.byobRequest` が `null` の時に基盤からデータが到着した場合、 `ReadableByteStreamController.enqueue()` を使用してキューに入れることができます。
 これは、ストリームの内部バッファーが空でないときに、基盤のプッシュソースが新しいデータを受信した場合に発生する可能性があります。

 基盤ソースは、 BYOB リクエストの `view` にデータを書き込んでから `respond()` を呼び出すか、 `respondWithNewView()` を呼び出して新しいビューを引数として渡すことで、リクエストを使用します。
 「新しいビュー」は、実際には元の `view` と同じバッファー上で、同じオフセットから始まるビューでなければならないことに注意してください。
 これは、基盤が元のビュー全体を満たすことができない場合に、より短いバッファーを返すために使用することができます。

 なお、 `ReadableByteStreamController` は `ReadableStream()` コンストラクターで `type="bytes"` を指定した場合のみ、が基盤ソースに対して作成されます。
 「BYOB モード」は `autoAllocateChunkSize` を `ReadableController()` コンストラクターで指定した場合、または `ReadableStreamBYOBReader` （ふつうは `ReadableStream.getReader()` に引数 `{ mode: 'byob' }` 付きで呼び出すことで構築される）を使用した場合にに有効になります。

コンストラクター
--------

なし。 `ReadableStreamBYOBRequest` インスタンスは `ReadableByteStreamController` によって必要に応じて作成されます。

インスタンスプロパティ
-----------

`ReadableStreamBYOBRequest.view` 読取専用 

 現在のビューを返します。
 `ReadableStreamBYOBRequest.respond()` が呼び出されたときにコンシューマーに移譲されるバッファーに関するビューです。


インスタンスメソッド
----------

`ReadableStreamBYOBRequest.respond()`

 関連付けられた読み取り可能なバイトストリームに、指定したバイト数が現在の `view` に書き込まれたことを通知し、コンシューマーからの待機中のリクエストを解決させます。
 このメソッドが呼び出された後、`view`は移譲され、変更できなくなることに注意してください。


`ReadableStreamBYOBRequest.respondWithNewView()`

 引数として渡された、読み取り可能なバイトストリームのコンシューマーに転送される、関連付けられた読み取り可能なストリームビューへ通知します。
 この新しいビューは、元の `view` と同じバッファーを使用し、同じオフセットから始まり、同じ長さかそれ以下でなければなりません。
 このメソッドが呼び出された後、 `view` は移譲され、変更できなくなることに注意してください。


例
-

以下のコードは、読み取り可能なバイトストリーム > 読み取り可能なソケットプッシュバイトストリームの作成のライブ例から引用したものです。

 データを移譲するプッシュ基盤バイトソースは、最初に `controller.byobRequest` が `null` でないことを調べる必要があります。
 このチェックが必要なのは、自動チャンク割り当てが有効でなく、既定のリーダーで使用する場合のみです。


```js
if (controller.byobRequest) {
  /\* code to transfer data \*/
}
```


`ReadableStreamBYOBRequest` にデータを読み込んでそれを移譲するには 2 つの方法があります。
 最初の方法は `ReadableStreamBYOBRequest.view` プロパティにデータを書き込んでから `ReadableStreamBYOBRequest.respond()` を呼び出して移譲するデータ量を示す方法です。
 処理後、 `byobRequest.view` を切り離し、リクエストを破棄すべきです。

下記のコードはこの用途を示すもので、データをビューにコピーするために `readInto()` メソッドを使用しています。


```js
const v = controller.byobRequest.view;
bytesRead = socket.readInto(v.buffer, v.byteOffset, v.byteLength);
controller.byobRequest.respond(bytesRead);
```


 他にも、 `ReadableStreamBYOBRequest.respondWithNewView()` を呼び出して、同じ基盤バッキングデータに自分自身でビューを渡す、という手法があります。
 これは単に、実際に移譲される基盤バッファー/メモリーバッキングの範囲を指定する別の方法であることに注意してください。
 上のコードと同等の `respondWithNewView` は次のようになります。


```js
const v = controller.byobRequest.view;
bytesRead = socket.readInto(v.buffer, v.byteOffset, v.byteLength);
const newView = new Uint8Array(v.buffer, v.byteOffset, bytesRead);
controller.byobRequest.respondWithNewView(newView);
```

仕様書
---

| Specification |
| --- |
| Streams Standard # rs-byob-request-class |

ブラウザーの互換性
---------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

関連情報
----

* 読み取り可能なバイトストリームの使用