Skip to content

Commit

Permalink
Editorial: add cross-links to internal slots
Browse files Browse the repository at this point in the history
As part of this, we split out the common features of readable stream readers into the ReadableStreamGenericReader mixin. Despite this changing the IDL, it has no observable behavior changes.

Inspired by #1048.
  • Loading branch information
MattiasBuelens committed Aug 13, 2020
1 parent 6cd5e81 commit 1975208
Show file tree
Hide file tree
Showing 8 changed files with 898 additions and 740 deletions.
1,548 changes: 842 additions & 706 deletions index.bs

Large diffs are not rendered by default.

22 changes: 8 additions & 14 deletions reference-implementation/lib/ReadableStreamBYOBReader-impl.js
Expand Up @@ -2,24 +2,14 @@

const { newPromise, resolvePromise, rejectPromise, promiseRejectedWith } = require('./helpers/webidl.js');
const aos = require('./abstract-ops/readable-streams.js');
const { mixin } = require('./helpers/miscellaneous.js');
const ReadableStreamGenericReaderImpl = require('./ReadableStreamGenericReader-impl.js').implementation;

exports.implementation = class ReadableStreamBYOBReaderImpl {
class ReadableStreamBYOBReaderImpl {
constructor(globalObject, [stream]) {
aos.SetUpReadableStreamBYOBReader(this, stream);
}

get closed() {
return this._closedPromise;
}

cancel(reason) {
if (this._stream === undefined) {
return promiseRejectedWith(readerLockException('cancel'));
}

return aos.ReadableStreamReaderGenericCancel(this, reason);
}

read(view) {
if (view.byteLength === 0) {
return promiseRejectedWith(new TypeError('view must have non-zero byteLength'));
Expand Down Expand Up @@ -53,7 +43,11 @@ exports.implementation = class ReadableStreamBYOBReaderImpl {

aos.ReadableStreamReaderGenericRelease(this);
}
};
}

mixin(ReadableStreamBYOBReaderImpl.prototype, ReadableStreamGenericReaderImpl.prototype);

exports.implementation = ReadableStreamBYOBReaderImpl;

function readerLockException(name) {
return new TypeError('Cannot ' + name + ' a stream using a released reader');
Expand Down
4 changes: 1 addition & 3 deletions reference-implementation/lib/ReadableStreamBYOBReader.webidl
Expand Up @@ -2,9 +2,7 @@
interface ReadableStreamBYOBReader {
constructor(ReadableStream stream);

readonly attribute Promise<void> closed;

Promise<void> cancel(optional any reason);
Promise<ReadableStreamBYOBReadResult> read(ArrayBufferView view);
void releaseLock();
};
ReadableStreamBYOBReader includes ReadableStreamGenericReader;
22 changes: 8 additions & 14 deletions reference-implementation/lib/ReadableStreamDefaultReader-impl.js
Expand Up @@ -2,24 +2,14 @@

const { newPromise, resolvePromise, rejectPromise, promiseRejectedWith } = require('./helpers/webidl.js');
const aos = require('./abstract-ops/readable-streams.js');
const { mixin } = require('./helpers/miscellaneous.js');
const ReadableStreamGenericReaderImpl = require('./ReadableStreamGenericReader-impl.js').implementation;

exports.implementation = class ReadableStreamDefaultReaderImpl {
class ReadableStreamDefaultReaderImpl {
constructor(globalObject, [stream]) {
aos.SetUpReadableStreamDefaultReader(this, stream);
}

get closed() {
return this._closedPromise;
}

cancel(reason) {
if (this._stream === undefined) {
return promiseRejectedWith(readerLockException('cancel'));
}

return aos.ReadableStreamReaderGenericCancel(this, reason);
}

read() {
if (this._stream === undefined) {
return promiseRejectedWith(readerLockException('read from'));
Expand Down Expand Up @@ -47,7 +37,11 @@ exports.implementation = class ReadableStreamDefaultReaderImpl {

aos.ReadableStreamReaderGenericRelease(this);
}
};
}

mixin(ReadableStreamDefaultReaderImpl.prototype, ReadableStreamGenericReaderImpl.prototype);

exports.implementation = ReadableStreamDefaultReaderImpl;

function readerLockException(name) {
return new TypeError('Cannot ' + name + ' a stream using a released reader');
Expand Down
Expand Up @@ -2,9 +2,7 @@
interface ReadableStreamDefaultReader {
constructor(ReadableStream stream);

readonly attribute Promise<void> closed;

Promise<void> cancel(optional any reason);
Promise<ReadableStreamDefaultReadResult> read();
void releaseLock();
};
ReadableStreamDefaultReader includes ReadableStreamGenericReader;
22 changes: 22 additions & 0 deletions reference-implementation/lib/ReadableStreamGenericReader-impl.js
@@ -0,0 +1,22 @@
'use strict';

const { promiseRejectedWith } = require('./helpers/webidl.js');
const aos = require('./abstract-ops/readable-streams.js');

exports.implementation = class ReadableStreamGenericReaderImpl {
get closed() {
return this._closedPromise;
}

cancel(reason) {
if (this._stream === undefined) {
return promiseRejectedWith(readerLockException('cancel'));
}

return aos.ReadableStreamReaderGenericCancel(this, reason);
}
};

function readerLockException(name) {
return new TypeError('Cannot ' + name + ' a stream using a released reader');
}
@@ -0,0 +1,5 @@
interface mixin ReadableStreamGenericReader {
readonly attribute Promise<void> closed;

Promise<void> cancel(optional any reason);
};
11 changes: 11 additions & 0 deletions reference-implementation/lib/helpers/miscellaneous.js
Expand Up @@ -11,3 +11,14 @@ exports.rethrowAssertionErrorRejection = e => {
}, 0);
}
};

exports.mixin = (target, source) => {
const keys = Reflect.ownKeys(source);
for (let i = 0; i < keys.length; ++i) {
if (keys[i] in target) {
continue;
}

Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i]));
}
};

0 comments on commit 1975208

Please sign in to comment.