OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 (function(global, binding, v8) { | 5 (function(global, binding, v8) { |
6 'use strict'; | 6 'use strict'; |
7 | 7 |
8 const _reader = v8.createPrivateSymbol('[[reader]]'); | 8 const _reader = v8.createPrivateSymbol('[[reader]]'); |
9 const _storedError = v8.createPrivateSymbol('[[storedError]]'); | 9 const _storedError = v8.createPrivateSymbol('[[storedError]]'); |
10 const _controller = v8.createPrivateSymbol('[[controller]]'); | 10 const _controller = v8.createPrivateSymbol('[[controller]]'); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 | 55 |
56 const Number = global.Number; | 56 const Number = global.Number; |
57 const Number_isNaN = Number.isNaN; | 57 const Number_isNaN = Number.isNaN; |
58 const Number_isFinite = Number.isFinite; | 58 const Number_isFinite = Number.isFinite; |
59 | 59 |
60 const Promise = global.Promise; | 60 const Promise = global.Promise; |
61 const thenPromise = v8.uncurryThis(Promise.prototype.then); | 61 const thenPromise = v8.uncurryThis(Promise.prototype.then); |
62 const Promise_resolve = v8.simpleBind(Promise.resolve, Promise); | 62 const Promise_resolve = v8.simpleBind(Promise.resolve, Promise); |
63 const Promise_reject = v8.simpleBind(Promise.reject, Promise); | 63 const Promise_reject = v8.simpleBind(Promise.reject, Promise); |
64 | 64 |
65 const errIllegalInvocation = 'Illegal invocation'; | 65 const streamErrors = binding.streamErrors; |
66 const errIllegalConstructor = 'Illegal constructor'; | |
67 const errCancelLockedStream = | 66 const errCancelLockedStream = |
68 'Cannot cancel a readable stream that is locked to a reader'; | 67 'Cannot cancel a readable stream that is locked to a reader'; |
69 const errEnqueueCloseRequestedStream = | 68 const errEnqueueCloseRequestedStream = |
70 'Cannot enqueue a chunk into a readable stream that is closed or has been
requested to be closed'; | 69 'Cannot enqueue a chunk into a readable stream that is closed or has been
requested to be closed'; |
71 const errCancelReleasedReader = | 70 const errCancelReleasedReader = |
72 'This readable stream reader has been released and cannot be used to cance
l its previous owner stream'; | 71 'This readable stream reader has been released and cannot be used to cance
l its previous owner stream'; |
73 const errReadReleasedReader = | 72 const errReadReleasedReader = |
74 'This readable stream reader has been released and cannot be used to read
from its previous owner stream'; | 73 'This readable stream reader has been released and cannot be used to read
from its previous owner stream'; |
75 const errCloseCloseRequestedStream = | 74 const errCloseCloseRequestedStream = |
76 'Cannot close a readable stream that has already been requested to be clos
ed'; | 75 'Cannot close a readable stream that has already been requested to be clos
ed'; |
77 const errEnqueueClosedStream = 'Cannot enqueue a chunk into a closed readable
stream'; | 76 const errEnqueueClosedStream = 'Cannot enqueue a chunk into a closed readable
stream'; |
78 const errEnqueueErroredStream = 'Cannot enqueue a chunk into an errored readab
le stream'; | 77 const errEnqueueErroredStream = 'Cannot enqueue a chunk into an errored readab
le stream'; |
79 const errCloseClosedStream = 'Cannot close a closed readable stream'; | 78 const errCloseClosedStream = 'Cannot close a closed readable stream'; |
80 const errCloseErroredStream = 'Cannot close an errored readable stream'; | 79 const errCloseErroredStream = 'Cannot close an errored readable stream'; |
81 const errErrorClosedStream = 'Cannot error a close readable stream'; | 80 const errErrorClosedStream = 'Cannot error a close readable stream'; |
82 const errErrorErroredStream = | 81 const errErrorErroredStream = |
83 'Cannot error a readable stream that is already errored'; | 82 'Cannot error a readable stream that is already errored'; |
84 const errGetReaderNotByteStream = 'This readable stream does not support BYOB
readers'; | 83 const errGetReaderNotByteStream = 'This readable stream does not support BYOB
readers'; |
85 const errGetReaderBadMode = 'Invalid reader mode given: expected undefined or
"byob"'; | 84 const errGetReaderBadMode = 'Invalid reader mode given: expected undefined or
"byob"'; |
86 const errReaderConstructorBadArgument = | 85 const errReaderConstructorBadArgument = |
87 'ReadableStreamReader constructor argument is not a readable stream'; | 86 'ReadableStreamReader constructor argument is not a readable stream'; |
88 const errReaderConstructorStreamAlreadyLocked = | 87 const errReaderConstructorStreamAlreadyLocked = |
89 'ReadableStreamReader constructor can only accept readable streams that ar
e not yet locked to a reader'; | 88 'ReadableStreamReader constructor can only accept readable streams that ar
e not yet locked to a reader'; |
90 const errReleaseReaderWithPendingRead = | 89 const errReleaseReaderWithPendingRead = |
91 'Cannot release a readable stream reader when it still has outstanding rea
d() calls that have not yet settled'; | 90 'Cannot release a readable stream reader when it still has outstanding rea
d() calls that have not yet settled'; |
92 const errReleasedReaderClosedPromise = | 91 const errReleasedReaderClosedPromise = |
93 'This readable stream reader has been released and cannot be used to monit
or the stream\'s state'; | 92 'This readable stream reader has been released and cannot be used to monit
or the stream\'s state'; |
94 const errInvalidSize = | 93 |
95 'The return value of a queuing strategy\'s size function must be a finite,
non-NaN, non-negative number'; | |
96 const errSizeNotAFunction = | |
97 'A queuing strategy\'s size property must be a function'; | |
98 const errInvalidHWM = | |
99 'A queueing strategy\'s highWaterMark property must be a nonnegative, non-
NaN number'; | |
100 const errTmplMustBeFunctionOrUndefined = name => | 94 const errTmplMustBeFunctionOrUndefined = name => |
101 `${name} must be a function or undefined`; | 95 `${name} must be a function or undefined`; |
102 | 96 |
103 class ReadableStream { | 97 class ReadableStream { |
104 constructor() { | 98 constructor() { |
105 // TODO(domenic): when V8 gets default parameters and destructuring, all | 99 // TODO(domenic): when V8 gets default parameters and destructuring, all |
106 // this can be cleaned up. | 100 // this can be cleaned up. |
107 const underlyingSource = arguments[0] === undefined ? {} : arguments[0]; | 101 const underlyingSource = arguments[0] === undefined ? {} : arguments[0]; |
108 const strategy = arguments[1] === undefined ? {} : arguments[1]; | 102 const strategy = arguments[1] === undefined ? {} : arguments[1]; |
109 const size = strategy.size; | 103 const size = strategy.size; |
(...skipping 12 matching lines...) Expand all Loading... |
122 // methods will disregard their controller argument in such situations | 116 // methods will disregard their controller argument in such situations |
123 // (but see below). | 117 // (but see below). |
124 | 118 |
125 this[_controller] = undefined; | 119 this[_controller] = undefined; |
126 | 120 |
127 const type = underlyingSource.type; | 121 const type = underlyingSource.type; |
128 const typeString = String(type); | 122 const typeString = String(type); |
129 if (typeString === 'bytes') { | 123 if (typeString === 'bytes') { |
130 throw new RangeError('bytes type is not yet implemented'); | 124 throw new RangeError('bytes type is not yet implemented'); |
131 } else if (type !== undefined) { | 125 } else if (type !== undefined) { |
132 throw new RangeError('Invalid type is specified'); | 126 throw new RangeError(streamErrors.invalidType); |
133 } | 127 } |
134 | 128 |
135 this[_controller] = | 129 this[_controller] = |
136 new ReadableStreamDefaultController(this, underlyingSource, size, high
WaterMark, arguments[2] === createWithExternalControllerSentinel); | 130 new ReadableStreamDefaultController(this, underlyingSource, size, high
WaterMark, arguments[2] === createWithExternalControllerSentinel); |
137 } | 131 } |
138 | 132 |
139 get locked() { | 133 get locked() { |
140 if (IsReadableStream(this) === false) { | 134 if (IsReadableStream(this) === false) { |
141 throw new TypeError(errIllegalInvocation); | 135 throw new TypeError(streamErrors.illegalInvocation); |
142 } | 136 } |
143 | 137 |
144 return IsReadableStreamLocked(this); | 138 return IsReadableStreamLocked(this); |
145 } | 139 } |
146 | 140 |
147 cancel(reason) { | 141 cancel(reason) { |
148 if (IsReadableStream(this) === false) { | 142 if (IsReadableStream(this) === false) { |
149 return Promise_reject(new TypeError(errIllegalInvocation)); | 143 return Promise_reject(new TypeError(streamErrors.illegalInvocation)); |
150 } | 144 } |
151 | 145 |
152 if (IsReadableStreamLocked(this) === true) { | 146 if (IsReadableStreamLocked(this) === true) { |
153 return Promise_reject(new TypeError(errCancelLockedStream)); | 147 return Promise_reject(new TypeError(errCancelLockedStream)); |
154 } | 148 } |
155 | 149 |
156 return ReadableStreamCancel(this, reason); | 150 return ReadableStreamCancel(this, reason); |
157 } | 151 } |
158 | 152 |
159 getReader({ mode } = {}) { | 153 getReader({ mode } = {}) { |
160 if (IsReadableStream(this) === false) { | 154 if (IsReadableStream(this) === false) { |
161 throw new TypeError(errIllegalInvocation); | 155 throw new TypeError(streamErrors.illegalInvocation); |
162 } | 156 } |
163 | 157 |
164 if (mode === 'byob') { | 158 if (mode === 'byob') { |
165 // TODO(ricea): When BYOB readers are supported: | 159 // TODO(ricea): When BYOB readers are supported: |
166 // | 160 // |
167 // a. If | 161 // a. If |
168 // ! IsReadableByteStreamController(this.[[_controller]]) | 162 // ! IsReadableByteStreamController(this.[[_controller]]) |
169 // is false, throw a TypeError exception. | 163 // is false, throw a TypeError exception. |
170 // b. Return ? AcquireReadableStreamBYOBReader(this). | 164 // b. Return ? AcquireReadableStreamBYOBReader(this). |
171 throw new TypeError(errGetReaderNotByteStream); | 165 throw new TypeError(errGetReaderNotByteStream); |
172 } | 166 } |
173 | 167 |
174 if (mode === undefined) { | 168 if (mode === undefined) { |
175 return AcquireReadableStreamDefaultReader(this); | 169 return AcquireReadableStreamDefaultReader(this); |
176 } | 170 } |
177 | 171 |
178 throw new RangeError(errGetReaderBadMode); | 172 throw new RangeError(errGetReaderBadMode); |
179 } | 173 } |
180 | 174 |
181 tee() { | 175 tee() { |
182 if (IsReadableStream(this) === false) { | 176 if (IsReadableStream(this) === false) { |
183 throw new TypeError(errIllegalInvocation); | 177 throw new TypeError(streamErrors.illegalInvocation); |
184 } | 178 } |
185 | 179 |
186 return ReadableStreamTee(this); | 180 return ReadableStreamTee(this); |
187 } | 181 } |
188 } | 182 } |
189 | 183 |
190 class ReadableStreamDefaultController { | 184 class ReadableStreamDefaultController { |
191 constructor(stream, underlyingSource, size, highWaterMark, isExternallyContr
olled) { | 185 constructor(stream, underlyingSource, size, highWaterMark, isExternallyContr
olled) { |
192 if (IsReadableStream(stream) === false) { | 186 if (IsReadableStream(stream) === false) { |
193 throw new TypeError(errIllegalConstructor); | 187 throw new TypeError(streamErrors.illegalConstructor); |
194 } | 188 } |
195 | 189 |
196 if (stream[_controller] !== undefined) { | 190 if (stream[_controller] !== undefined) { |
197 throw new TypeError(errIllegalConstructor); | 191 throw new TypeError(streamErrors.illegalConstructor); |
198 } | 192 } |
199 | 193 |
200 this[_controlledReadableStream] = stream; | 194 this[_controlledReadableStream] = stream; |
201 | 195 |
202 this[_underlyingSource] = underlyingSource; | 196 this[_underlyingSource] = underlyingSource; |
203 | 197 |
204 this[_queue] = new v8.InternalPackedArray(); | 198 this[_queue] = new v8.InternalPackedArray(); |
205 this[_totalQueuedSize] = 0; | 199 this[_totalQueuedSize] = 0; |
206 | 200 |
207 this[_readableStreamDefaultControllerBits] = 0b0; | 201 this[_readableStreamDefaultControllerBits] = 0b0; |
(...skipping 17 matching lines...) Expand all Loading... |
225 }, | 219 }, |
226 r => { | 220 r => { |
227 if (ReadableStreamGetState(stream) === STATE_READABLE) { | 221 if (ReadableStreamGetState(stream) === STATE_READABLE) { |
228 ReadableStreamDefaultControllerError(controller, r); | 222 ReadableStreamDefaultControllerError(controller, r); |
229 } | 223 } |
230 }); | 224 }); |
231 } | 225 } |
232 | 226 |
233 get desiredSize() { | 227 get desiredSize() { |
234 if (IsReadableStreamDefaultController(this) === false) { | 228 if (IsReadableStreamDefaultController(this) === false) { |
235 throw new TypeError(errIllegalInvocation); | 229 throw new TypeError(streamErrors.illegalInvocation); |
236 } | 230 } |
237 | 231 |
238 return ReadableStreamDefaultControllerGetDesiredSize(this); | 232 return ReadableStreamDefaultControllerGetDesiredSize(this); |
239 } | 233 } |
240 | 234 |
241 close() { | 235 close() { |
242 if (IsReadableStreamDefaultController(this) === false) { | 236 if (IsReadableStreamDefaultController(this) === false) { |
243 throw new TypeError(errIllegalInvocation); | 237 throw new TypeError(streamErrors.illegalInvocation); |
244 } | 238 } |
245 | 239 |
246 const stream = this[_controlledReadableStream]; | 240 const stream = this[_controlledReadableStream]; |
247 | 241 |
248 if (this[_readableStreamDefaultControllerBits] & CLOSE_REQUESTED) { | 242 if (this[_readableStreamDefaultControllerBits] & CLOSE_REQUESTED) { |
249 throw new TypeError(errCloseCloseRequestedStream); | 243 throw new TypeError(errCloseCloseRequestedStream); |
250 } | 244 } |
251 | 245 |
252 const state = ReadableStreamGetState(stream); | 246 const state = ReadableStreamGetState(stream); |
253 if (state === STATE_ERRORED) { | 247 if (state === STATE_ERRORED) { |
254 throw new TypeError(errCloseErroredStream); | 248 throw new TypeError(errCloseErroredStream); |
255 } | 249 } |
256 if (state === STATE_CLOSED) { | 250 if (state === STATE_CLOSED) { |
257 throw new TypeError(errCloseClosedStream); | 251 throw new TypeError(errCloseClosedStream); |
258 } | 252 } |
259 | 253 |
260 return ReadableStreamDefaultControllerClose(this); | 254 return ReadableStreamDefaultControllerClose(this); |
261 } | 255 } |
262 | 256 |
263 enqueue(chunk) { | 257 enqueue(chunk) { |
264 if (IsReadableStreamDefaultController(this) === false) { | 258 if (IsReadableStreamDefaultController(this) === false) { |
265 throw new TypeError(errIllegalInvocation); | 259 throw new TypeError(streamErrors.illegalInvocation); |
266 } | 260 } |
267 | 261 |
268 const stream = this[_controlledReadableStream]; | 262 const stream = this[_controlledReadableStream]; |
269 | 263 |
270 if (this[_readableStreamDefaultControllerBits] & CLOSE_REQUESTED) { | 264 if (this[_readableStreamDefaultControllerBits] & CLOSE_REQUESTED) { |
271 throw new TypeError(errEnqueueCloseRequestedStream); | 265 throw new TypeError(errEnqueueCloseRequestedStream); |
272 } | 266 } |
273 | 267 |
274 const state = ReadableStreamGetState(stream); | 268 const state = ReadableStreamGetState(stream); |
275 if (state === STATE_ERRORED) { | 269 if (state === STATE_ERRORED) { |
276 throw new TypeError(errEnqueueErroredStream); | 270 throw new TypeError(errEnqueueErroredStream); |
277 } | 271 } |
278 if (state === STATE_CLOSED) { | 272 if (state === STATE_CLOSED) { |
279 throw new TypeError(errEnqueueClosedStream); | 273 throw new TypeError(errEnqueueClosedStream); |
280 } | 274 } |
281 | 275 |
282 return ReadableStreamDefaultControllerEnqueue(this, chunk); | 276 return ReadableStreamDefaultControllerEnqueue(this, chunk); |
283 } | 277 } |
284 | 278 |
285 error(e) { | 279 error(e) { |
286 if (IsReadableStreamDefaultController(this) === false) { | 280 if (IsReadableStreamDefaultController(this) === false) { |
287 throw new TypeError(errIllegalInvocation); | 281 throw new TypeError(streamErrors.illegalInvocation); |
288 } | 282 } |
289 | 283 |
290 const stream = this[_controlledReadableStream]; | 284 const stream = this[_controlledReadableStream]; |
291 | 285 |
292 const state = ReadableStreamGetState(stream); | 286 const state = ReadableStreamGetState(stream); |
293 if (state === STATE_ERRORED) { | 287 if (state === STATE_ERRORED) { |
294 throw new TypeError(errErrorErroredStream); | 288 throw new TypeError(errErrorErroredStream); |
295 } | 289 } |
296 if (state === STATE_CLOSED) { | 290 if (state === STATE_CLOSED) { |
297 throw new TypeError(errErrorClosedStream); | 291 throw new TypeError(errErrorClosedStream); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 throw new TypeError(errReaderConstructorStreamAlreadyLocked); | 338 throw new TypeError(errReaderConstructorStreamAlreadyLocked); |
345 } | 339 } |
346 | 340 |
347 ReadableStreamReaderGenericInitialize(this, stream); | 341 ReadableStreamReaderGenericInitialize(this, stream); |
348 | 342 |
349 this[_readRequests] = new v8.InternalPackedArray(); | 343 this[_readRequests] = new v8.InternalPackedArray(); |
350 } | 344 } |
351 | 345 |
352 get closed() { | 346 get closed() { |
353 if (IsReadableStreamDefaultReader(this) === false) { | 347 if (IsReadableStreamDefaultReader(this) === false) { |
354 return Promise_reject(new TypeError(errIllegalInvocation)); | 348 return Promise_reject(new TypeError(streamErrors.illegalInvocation)); |
355 } | 349 } |
356 | 350 |
357 return this[_closedPromise]; | 351 return this[_closedPromise]; |
358 } | 352 } |
359 | 353 |
360 cancel(reason) { | 354 cancel(reason) { |
361 if (IsReadableStreamDefaultReader(this) === false) { | 355 if (IsReadableStreamDefaultReader(this) === false) { |
362 return Promise_reject(new TypeError(errIllegalInvocation)); | 356 return Promise_reject(new TypeError(streamErrors.illegalInvocation)); |
363 } | 357 } |
364 | 358 |
365 const stream = this[_ownerReadableStream]; | 359 const stream = this[_ownerReadableStream]; |
366 if (stream === undefined) { | 360 if (stream === undefined) { |
367 return Promise_reject(new TypeError(errCancelReleasedReader)); | 361 return Promise_reject(new TypeError(errCancelReleasedReader)); |
368 } | 362 } |
369 | 363 |
370 return ReadableStreamReaderGenericCancel(this, reason); | 364 return ReadableStreamReaderGenericCancel(this, reason); |
371 } | 365 } |
372 | 366 |
373 read() { | 367 read() { |
374 if (IsReadableStreamDefaultReader(this) === false) { | 368 if (IsReadableStreamDefaultReader(this) === false) { |
375 return Promise_reject(new TypeError(errIllegalInvocation)); | 369 return Promise_reject(new TypeError(streamErrors.illegalInvocation)); |
376 } | 370 } |
377 | 371 |
378 if (this[_ownerReadableStream] === undefined) { | 372 if (this[_ownerReadableStream] === undefined) { |
379 return Promise_reject(new TypeError(errReadReleasedReader)); | 373 return Promise_reject(new TypeError(errReadReleasedReader)); |
380 } | 374 } |
381 | 375 |
382 return ReadableStreamDefaultReaderRead(this); | 376 return ReadableStreamDefaultReaderRead(this); |
383 } | 377 } |
384 | 378 |
385 releaseLock() { | 379 releaseLock() { |
386 if (IsReadableStreamDefaultReader(this) === false) { | 380 if (IsReadableStreamDefaultReader(this) === false) { |
387 throw new TypeError(errIllegalInvocation); | 381 throw new TypeError(streamErrors.illegalInvocation); |
388 } | 382 } |
389 | 383 |
390 const stream = this[_ownerReadableStream]; | 384 const stream = this[_ownerReadableStream]; |
391 if (stream === undefined) { | 385 if (stream === undefined) { |
392 return undefined; | 386 return undefined; |
393 } | 387 } |
394 | 388 |
395 if (this[_readRequests].length > 0) { | 389 if (this[_readRequests].length > 0) { |
396 throw new TypeError(errReleaseReaderWithPendingRead); | 390 throw new TypeError(errReleaseReaderWithPendingRead); |
397 } | 391 } |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 | 795 |
802 function DequeueValue(controller) { | 796 function DequeueValue(controller) { |
803 const result = controller[_queue].shift(); | 797 const result = controller[_queue].shift(); |
804 controller[_totalQueuedSize] -= result.size; | 798 controller[_totalQueuedSize] -= result.size; |
805 return result.value; | 799 return result.value; |
806 } | 800 } |
807 | 801 |
808 function EnqueueValueWithSize(controller, value, size) { | 802 function EnqueueValueWithSize(controller, value, size) { |
809 size = Number(size); | 803 size = Number(size); |
810 if (Number_isNaN(size) || size === +Infinity || size < 0) { | 804 if (Number_isNaN(size) || size === +Infinity || size < 0) { |
811 throw new RangeError(errInvalidSize); | 805 throw new RangeError(streamErrors.invalidSize); |
812 } | 806 } |
813 | 807 |
814 controller[_totalQueuedSize] += size; | 808 controller[_totalQueuedSize] += size; |
815 controller[_queue].push({value, size}); | 809 controller[_queue].push({value, size}); |
816 } | 810 } |
817 | 811 |
818 function GetTotalQueueSize(controller) { return controller[_totalQueuedSize];
} | 812 function GetTotalQueueSize(controller) { return controller[_totalQueuedSize];
} |
819 | 813 |
820 // | 814 // |
821 // Other helpers | 815 // Other helpers |
822 // | 816 // |
823 | 817 |
824 function ValidateAndNormalizeQueuingStrategy(size, highWaterMark) { | 818 function ValidateAndNormalizeQueuingStrategy(size, highWaterMark) { |
825 if (size !== undefined && typeof size !== 'function') { | 819 if (size !== undefined && typeof size !== 'function') { |
826 throw new TypeError(errSizeNotAFunction); | 820 throw new TypeError(streamErrors.sizeNotAFunction); |
827 } | 821 } |
828 | 822 |
829 highWaterMark = Number(highWaterMark); | 823 highWaterMark = Number(highWaterMark); |
830 if (Number_isNaN(highWaterMark) || highWaterMark < 0) { | 824 if (Number_isNaN(highWaterMark)) { |
831 throw new RangeError(errInvalidHWM); | 825 throw new RangeError(streamErrors.errInvalidHWM); |
| 826 } |
| 827 if (highWaterMark < 0) { |
| 828 throw new RangeError(streamErrors.invalidHWM); |
832 } | 829 } |
833 | 830 |
834 return {size, highWaterMark}; | 831 return {size, highWaterMark}; |
835 } | 832 } |
836 | 833 |
837 // Modified from InvokeOrNoop in spec | 834 // Modified from InvokeOrNoop in spec |
838 function CallOrNoop(O, P, arg, nameForError) { | 835 function CallOrNoop(O, P, arg, nameForError) { |
839 const method = O[P]; | 836 const method = O[P]; |
840 if (method === undefined) { | 837 if (method === undefined) { |
841 return undefined; | 838 return undefined; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
905 binding.ReadableStreamDefaultControllerGetDesiredSize = ReadableStreamDefaultC
ontrollerGetDesiredSize; | 902 binding.ReadableStreamDefaultControllerGetDesiredSize = ReadableStreamDefaultC
ontrollerGetDesiredSize; |
906 binding.ReadableStreamDefaultControllerEnqueue = ReadableStreamDefaultControll
erEnqueue; | 903 binding.ReadableStreamDefaultControllerEnqueue = ReadableStreamDefaultControll
erEnqueue; |
907 binding.ReadableStreamDefaultControllerError = ReadableStreamDefaultController
Error; | 904 binding.ReadableStreamDefaultControllerError = ReadableStreamDefaultController
Error; |
908 | 905 |
909 binding.createReadableStreamWithExternalController = | 906 binding.createReadableStreamWithExternalController = |
910 (underlyingSource, strategy) => { | 907 (underlyingSource, strategy) => { |
911 return new ReadableStream( | 908 return new ReadableStream( |
912 underlyingSource, strategy, createWithExternalControllerSentinel); | 909 underlyingSource, strategy, createWithExternalControllerSentinel); |
913 }; | 910 }; |
914 }); | 911 }); |
OLD | NEW |