Fetch | Потоки

Fetch | Потоки

08 ноября 2020 года этот документ последний раз входил в пункт 2.10 стандарта Fetch.

 

Этот раздел может быть интегрирован в другие стандарты, например в сам Streams. Смотрите whatwg/streams # 372. (https://github.com/whatwg/streams/issues/372)

В этом разделе мы определяем общие операции для объектов ReadableStream. [STREAMS]

 

Чтобы поставить (enqueue) chunk (кусок) в очередь в «stream» объекта ReadableStream, выполните следующие действия:

1. Вызовите ReadableStreamDefaultControllerEnqueue(stream.[[readableStreamController]], chunk).

 

Чтобы закрыть (close) поток «stream» объекта ReadableStream, выполните следующие действия:

1. Вызовите ReadableStreamDefaultControllerClose(stream.[[readableStreamController]]).

 

Чтобы получить ошибку (error) объекта ReadableStream «stream» с указанной «reason», выполните следующие действия:

1. Вызовите ReadableStreamDefaultControllerError(stream.[[readableStreamController]]), reason).

 

 

Чтобы создать (construct) объект ReadableStream (необязательно) с помощью алгоритма «highWaterMark», «sizeAlgorithm», действия «pull» и «cancel», выполните следующие действия:

1. Пусть «startAlgorithm» будет алгоритмом, который возвращает значение «undefined»

2. Если pull не задан, установите для него действие, которое ничего не делает

3. Пусть «pullAlgorithm» будет алгоритмом, который выполняет следующие шаги:

3.1 Запустите pull.

3.2 Верните обещание promise, разрешенное с помощью undefined

4. Если отмена cancel не задана, установите для нее действие, которое ничего не делает

5. Пусть «cancelAlgorithm» будет алгоритмом, который выполняет следующие шаги:

5.1 Запустите cancel

5.2 Вернуть обещание promise, разрешенное с помощью undefined.

6. Если «highWaterMark» не указан, установите его на 1.

7. Если «sizeAlgorithm» не указан, установите для него алгоритм, возвращающий 1.

8. Верните CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm).

 

Чтобы создать фиксированный объект (construct a fixed object) ReadableStream с заданными фрагментами, выполните следующие действия:

1. Пусть «stream» будет результатом создания объекта ReadableStream.

2. Для каждого фрагмента «chunk» в фрагментах «chunks» ставьте «chunk» в очередь в поток «stream».

3. Закройте «stream»

4. Верните «stream»

 

Чтобы получить средство чтения (get a reader) из потока «stream» объекта ReadableStream, выполните следующие действия:

1. Пусть «reader» будет результатом вызова Acquire ReadableStreamDefaultReader(stream).

2. Верните «reader»

 

Чтобы прочитать фрагмент (read a chunk) из объекта ReadableStream с помощью средства чтения, учитывая запрос чтения «readRequest«, выполните ReadableStreamDefaultReaderRead (reader, readRequest).

 

Чтобы прочитать все байты (read all bytes) из объекта ReadableStream с помощью «reader», выполните следующие действия:

1. Пусть «promise» будет новым обещанием.

2. Пусть «bytes» будут пустой последовательностью байтов.

3. Цикл чтения задан для «reader», «bytes» и «promise».

4. Верните «promise»

 

Чтобы выполнить цикл чтения (read-loop) для данного «reader», «bytes» и «promise»:

1. Пусть «readRequest» будет новым запросом на чтение со следующими элементами:

шаги фрагмента, переданный chunk

1. Утверждение: chunk (чанк)  — это объект Uint8Array.

2. Добавьте chunk к bytes

3. Цикл чтения задан для «reader», «bytes» и «promise».

шаги закрытия

1. Примите «promise» с «bytes» (при помощи «bytes»).

шаги ошибки, учитывая e

1. Отклоните «promise» с  «e» (при помощи «e«).

2. Выполните ReadableStreamDefaultReaderRead(reader, readRequest).

Поскольку читатель предоставляет эксклюзивный доступ, фактический механизм чтения не может быть замечен. Если это удобно, реализации могут использовать более прямой механизм.

 

Чтобы отменить (cancel) поток «stream» объекта ReadableStream с указанием причины «reason», верните результат вызова ReadableStreamCancel(stream, reason).

 

Чтобы создать (tee) поток «stream» объектов ReadableStream, выполните следующие действия:

1. Вернуть результат вызова ReadableStreamTee(stream, true).

 

Пустой объект ReadableStream (empty)- это результат создания фиксированного объекта ReadableStream с пустым списком.

Создание пустого объекта ReadableStream не вызовет исключения.

 

Считается, что поток «stream» объекта ReadableStream доступен для чтения, если stream.[[state]] является «читаемым» (readable).

Считается, что поток «stream» объекта ReadableStream закрыт, если stream.[[state]] является «закрытым» (closed).

Считается, что поток «stream» объекта ReadableStream ошибочен, если stream.[[state]] имеет ошибку (errored).

Считается, что поток «stream» объекта ReadableStream заблокирован, если результат вызова IsReadableStreamLocked(stream) является true. (locked)

Считается, что потоку «stream» объекта ReadableStream требуется больше данных, если выполняются следующие условия (need more data):

  • stream доступен для чтения
  • Результат вызова ReadableStreamDefaultControllerGetDesiredSize(stream.[[readableStreamController]]) положительный (позитивный)

Считается, что поток «stream» объекта ReadableStream нарушен, если результат вызова IsReadableStreamDisturbed(stream) является true. (disturbed)

 

Информационные ссылки

Стандарт Fetchhttps://fetch.spec.whatwg.org

Стандарт Streamshttps://streams.spec.whatwg.org

Перевод стандарта Fetch — https://efim360.ru/fetch/