[whatwg-streams] Fixes for readable byte streams (#27375)

* ReadableByteStreamController.enqueue accepts any ArrayBufferView

See step 5 in https://streams.spec.whatwg.org/#rbs-controller-enqueue

* ReadableStreamBYOBRequest.view is always a Uint8Array

See step 2b in https://streams.spec.whatwg.org/#rbs-controller-byob-request

* ReadableByteStreamController.byobRequest may be undefined

See step 2 in https://streams.spec.whatwg.org/#rbs-controller-byob-request

* Remove unused type parameter on ReadableByteStreamSource and related classes

* Fix tests

* Replace IteratorResult with own interface to avoid dependency on ES2015 types
This commit is contained in:
Mattias Buelens
2018-07-20 17:27:47 -07:00
committed by Wesley Wigham
parent d00d623d95
commit 1d3d5b231a
2 changed files with 18 additions and 13 deletions
+16 -11
View File
@@ -12,9 +12,9 @@ export interface ReadableStreamSource<R = ArrayBufferView> {
cancel?(reason: any): void | Promise<any>;
}
export interface ReadableByteStreamSource<R = ArrayBufferView> {
start?(controller: ReadableByteStreamController<R>): void | Promise<any>;
pull?(controller: ReadableByteStreamController<R>): void | Promise<any>;
export interface ReadableByteStreamSource {
start?(controller: ReadableByteStreamController): void | Promise<any>;
pull?(controller: ReadableByteStreamController): void | Promise<any>;
cancel?(reason: any): void | Promise<any>;
type: "bytes";
@@ -37,9 +37,14 @@ export interface WritableReadablePair<T extends WritableStream<any>, U extends R
readable: U;
}
export interface ReadResult<T> {
done: boolean;
value: T;
}
declare class ReadableStream<R = ArrayBufferView> {
constructor(underlyingSource?: ReadableStreamSource<R>, strategy?: QueuingStrategy<R>);
constructor(underlyingSource?: ReadableByteStreamSource<R>, strategy?: QueuingStrategy<R>);
constructor(underlyingSource?: ReadableByteStreamSource, strategy?: QueuingStrategy<R>);
readonly locked: boolean;
@@ -57,7 +62,7 @@ declare class ReadableStreamDefaultReader<R = ArrayBufferView> {
readonly closed: Promise<void>;
cancel(reason: any): Promise<void>;
read(): Promise<IteratorResult<R>>;
read(): Promise<ReadResult<R>>;
releaseLock(): void;
}
@@ -67,7 +72,7 @@ declare class ReadableStreamBYOBReader<R = ArrayBufferView> {
readonly closed: Promise<void>;
cancel(reason: any): Promise<void>;
read<T extends ArrayBufferView>(view: T): Promise<IteratorResult<T>>;
read<T extends ArrayBufferView>(view: T): Promise<ReadResult<T>>;
releaseLock(): void;
}
@@ -79,17 +84,17 @@ declare class ReadableStreamDefaultController<R = ArrayBufferView> {
error(e: any): void;
}
declare class ReadableByteStreamController<R = ArrayBufferView> {
readonly byobRequest: ReadableStreamBYOBRequest<R>;
declare class ReadableByteStreamController {
readonly byobRequest: ReadableStreamBYOBRequest | undefined;
readonly desiredSize: number | null;
close(): void;
enqueue(chunk: R): void;
enqueue(chunk: ArrayBufferView): void;
error(e: any): void;
}
declare class ReadableStreamBYOBRequest<R = ArrayBufferView> {
readonly view: R;
declare class ReadableStreamBYOBRequest {
readonly view: Uint8Array;
respond(bytesWritten: number): void;
respondWithNewView(view: ArrayBufferView): void;
+2 -2
View File
@@ -187,14 +187,14 @@ function makeReadableByteFileStream(filename: string) {
pull(controller: ReadableByteStreamController) {
// Even when the consumer is using the default reader, the auto-allocation
// feature allocates a buffer and passes it to us via byobRequest.
const v = controller.byobRequest.view;
const v = controller.byobRequest!.view;
return fs.read(fd, <any>v.buffer, v.byteOffset, v.byteLength, position).then(bytesRead => {
if (bytesRead === 0) {
return fs.close(fd).then(() => controller.close());
} else {
position += bytesRead;
controller.byobRequest.respond(bytesRead);
controller.byobRequest!.respond(bytesRead);
}
});
},