/* * Copyright (C) 2020 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ // @internal function isTransformStream(stream) { "use strict"; return @isObject(stream) && !!@getByIdDirectPrivate(stream, "readable"); } function isTransformStreamDefaultController(controller) { "use strict"; return @isObject(controller) && !!@getByIdDirectPrivate(controller, "transformAlgorithm"); } function createTransformStream(startAlgorithm, transformAlgorithm, flushAlgorithm, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm) { if (writableHighWaterMark === @undefined) writableHighWaterMark = 1; if (writableSizeAlgorithm === @undefined) writableSizeAlgorithm = () => 1; if (readableHighWaterMark === @undefined) readableHighWaterMark = 0; if (readableSizeAlgorithm === @undefined) readableSizeAlgorithm = () => 1; @assert(writableHighWaterMark >= 0); @assert(readableHighWaterMark >= 0); const transform = {}; @putByIdDirectPrivate(transform, "TransformStream", true); const stream = new @TransformStream(transform); const startPromiseCapability = @newPromiseCapability(@Promise); @initializeTransformStream(stream, startPromiseCapability.@promise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm); const controller = new @TransformStreamDefaultController(); @setUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm); startAlgorithm().@then(() => { startPromiseCapability.@resolve.@call(); }, (error) => { startPromiseCapability.@reject.@call(@undefined, error); }); return stream; } function initializeTransformStream(stream, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm) { "use strict"; const startAlgorithm = () => { return startPromise; }; const writeAlgorithm = (chunk) => { return @transformStreamDefaultSinkWriteAlgorithm(stream, chunk); } const abortAlgorithm = (reason) => { return @transformStreamDefaultSinkAbortAlgorithm(stream, reason); } const closeAlgorithm = () => { return @transformStreamDefaultSinkCloseAlgorithm(stream); } const writable = @createWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, writableHighWaterMark, writableSizeAlgorithm); const pullAlgorithm = () => { return @transformStreamDefaultSourcePullAlgorithm(stream); }; const cancelAlgorithm = (reason) => { @transformStreamErrorWritableAndUnblockWrite(stream, reason); return @Promise.@resolve(); }; const underlyingSource = { }; @putByIdDirectPrivate(underlyingSource, "start", startAlgorithm); @putByIdDirectPrivate(underlyingSource, "pull", pullAlgorithm); @putByIdDirectPrivate(underlyingSource, "cancel", cancelAlgorithm); const options = { }; @putByIdDirectPrivate(options, "size", readableSizeAlgorithm); @putByIdDirectPrivate(options, "highWaterMark", readableHighWaterMark); const readable = new @ReadableStream(underlyingSource, options); // The writable to expose to JS through writable getter. @putByIdDirectPrivate(stream, "writable", writable); // The writable to use for the actual transform algorithms. @putByIdDirectPrivate(stream, "internalWritable", @getInternalWritableStream(writable)); @putByIdDirectPrivate(stream, "readable", readable); @putByIdDirectPrivate(stream, "backpressure", @undefined); @putByIdDirectPrivate(stream, "backpressureChangePromise", @undefined); @transformStreamSetBackpressure(stream, true); @putByIdDirectPrivate(stream, "controller", @undefined); } function transformStreamError(stream, e) { "use strict"; const readable = @getByIdDirectPrivate(stream, "readable"); const readableController = @getByIdDirectPrivate(readable, "readableStreamController"); @readableStreamDefaultControllerError(readableController, e); @transformStreamErrorWritableAndUnblockWrite(stream, e); } function transformStreamErrorWritableAndUnblockWrite(stream, e) { "use strict"; @transformStreamDefaultControllerClearAlgorithms(@getByIdDirectPrivate(stream, "controller")); const writable = @getByIdDirectPrivate(stream, "internalWritable"); @writableStreamDefaultControllerErrorIfNeeded(@getByIdDirectPrivate(writable, "controller"), e); if (@getByIdDirectPrivate(stream, "backpressure")) @transformStreamSetBackpressure(stream, false); } function transformStreamSetBackpressure(stream, backpressure) { "use strict"; @assert(@getByIdDirectPrivate(stream, "backpressure") !== backpressure); const backpressureChangePromise = @getByIdDirectPrivate(stream, "backpressureChangePromise"); if (backpressureChangePromise !== @undefined) backpressureChangePromise.@resolve.@call(); @putByIdDirectPrivate(stream, "backpressureChangePromise", @newPromiseCapability(@Promise)); @putByIdDirectPrivate(stream, "backpressure", backpressure); } function setUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm) { "use strict"; @assert(@isTransformStream(stream)); @assert(@getByIdDirectPrivate(stream, "controller") === @undefined); @putByIdDirectPrivate(controller, "stream", stream); @putByIdDirectPrivate(stream, "controller", controller); @putByIdDirectPrivate(controller, "transformAlgorithm", transformAlgorithm); @putByIdDirectPrivate(controller, "flushAlgorithm", flushAlgorithm); } function setUpTransformStreamDefaultControllerFromTransformer(stream, transformer, transformerDict) { "use strict"; const controller = new @TransformStreamDefaultController(); let transformAlgorithm = (chunk) => { try { @transformStreamDefaultControllerEnqueue(controller, chunk); } catch (e) { return @Promise.@reject(e); } return @Promise.@resolve(); }; let flushAlgorithm = () => { return @Promise.@resolve(); }; if ("transform" in transformerDict) transformAlgorithm = (chunk) => { return @promiseInvokeOrNoopMethod(transformer, transformerDict["transform"], [chunk, controller]); }; if ("flush" in transformerDict) { flushAlgorithm = () => { return @promiseInvokeOrNoopMethod(transformer, transformerDict["flush"], [controller]); }; } @setUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm); } function transformStreamDefaultControllerClearAlgorithms(controller) { "use strict"; // We set transformAlgorithm to true to allow GC but keep the isTransformStreamDefaultController check. @putByIdDirectPrivate(controller, "transformAlgorithm", true); @putByIdDirectPrivate(controller, "flushAlgorithm", @undefined); } function transformStreamDefaultControllerEnqueue(controller, chunk) { "use strict"; const stream = @getByIdDirectPrivate(controller, "stream"); const readable = @getByIdDirectPrivate(stream, "readable"); const readableController = @getByIdDirectPrivate(readable, "readableStreamController"); @assert(readableController !== @undefined); if (!@readableStreamDefaultControllerCanCloseOrEnqueue(readableController)) @throwTypeError("TransformStream.readable cannot close or enqueue"); try { @readableStreamDefaultControllerEnqueue(readableController, chunk); } catch (e) { @transformStreamErrorWritableAndUnblockWrite(stream, e); throw @getByIdDirectPrivate(readable, "storedError"); } const backpressure = !@readableStreamDefaultControllerShouldCallPull(readableController); if (backpressure !== @getByIdDirectPrivate(stream, "backpressure")) { @assert(backpressure); @transformStreamSetBackpressure(stream, true); } } function transformStreamDefaultControllerError(controller, e) { "use strict"; @transformStreamError(@getByIdDirectPrivate(controller, "stream"), e); } function transformStreamDefaultControllerPerformTransform(controller, chunk) { "use strict"; const promiseCapability = @newPromiseCapability(@Promise); const transformPromise = @getByIdDirectPrivate(controller, "transformAlgorithm").@call(@undefined, chunk); transformPromise.@then(() => { promiseCapability.@resolve(); }, (r) => { @transformStreamError(@getByIdDirectPrivate(controller, "stream"), r); promiseCapability.@reject.@call(@undefined, r); }); return promiseCapability.@promise; } function transformStreamDefaultControllerTerminate(controller) { "use strict"; const stream = @getByIdDirectPrivate(controller, "stream"); const readable = @getByIdDirectPrivate(stream, "readable"); const readableController = @getByIdDirectPrivate(readable, "readableStreamController"); // FIXME: Update readableStreamDefaultControllerClose to make this check. if (@readableStreamDefaultControllerCanCloseOrEnqueue(readableController)) @readableStreamDefaultControllerClose(readableController); const error = @makeTypeError("the stream has been terminated"); @transformStreamErrorWritableAndUnblockWrite(stream, error); } function transformStreamDefaultSinkWriteAlgorithm(stream, chunk) { "use strict"; const writable = @getByIdDirectPrivate(stream, "internalWritable"); @assert(@getByIdDirectPrivate(writable, "state") === "writable"); const controller = @getByIdDirectPrivate(stream, "controller"); if (@getByIdDirectPrivate(stream, "backpressure")) { const promiseCapability = @newPromiseCapability(@Promise); const backpressureChangePromise = @getByIdDirectPrivate(stream, "backpressureChangePromise"); @assert(backpressureChangePromise !== @undefined); backpressureChangePromise.@promise.@then(() => { const state = @getByIdDirectPrivate(writable, "state"); if (state === "erroring") { promiseCapability.@reject.@call(@undefined, @getByIdDirectPrivate(writable, "storedError")); return; } @assert(state === "writable"); @transformStreamDefaultControllerPerformTransform(controller, chunk).@then(() => { promiseCapability.@resolve(); }, (e) => { promiseCapability.@reject.@call(@undefined, e); }); }, (e) => { promiseCapability.@reject.@call(@undefined, e); }); return promiseCapability.@promise; } return @transformStreamDefaultControllerPerformTransform(controller, chunk); } function transformStreamDefaultSinkAbortAlgorithm(stream, reason) { "use strict"; @transformStreamError(stream, reason); return @Promise.@resolve(); } function transformStreamDefaultSinkCloseAlgorithm(stream) { "use strict"; const readable = @getByIdDirectPrivate(stream, "readable"); const controller = @getByIdDirectPrivate(stream, "controller"); const readableController = @getByIdDirectPrivate(readable, "readableStreamController"); const flushAlgorithm = @getByIdDirectPrivate(controller, "flushAlgorithm"); @assert(flushAlgorithm !== @undefined); const flushPromise = @getByIdDirectPrivate(controller, "flushAlgorithm").@call(); @transformStreamDefaultControllerClearAlgorithms(controller); const promiseCapability = @newPromiseCapability(@Promise); flushPromise.@then(() => { if (@getByIdDirectPrivate(readable, "state") === @streamErrored) { promiseCapability.@reject.@call(@undefined, @getByIdDirectPrivate(readable, "storedError")); return; } // FIXME: Update readableStreamDefaultControllerClose to make this check. if (@readableStreamDefaultControllerCanCloseOrEnqueue(readableController)) @readableStreamDefaultControllerClose(readableController); promiseCapability.@resolve(); }, (r) => { @transformStreamError(@getByIdDirectPrivate(controller, "stream"), r); promiseCapability.@reject.@call(@undefined, @getByIdDirectPrivate(readable, "storedError")); }); return promiseCapability.@promise; } function transformStreamDefaultSourcePullAlgorithm(stream) { "use strict"; @assert(@getByIdDirectPrivate(stream, "backpressure")); @assert(@getByIdDirectPrivate(stream, "backpressureChangePromise") !== @undefined); @transformStreamSetBackpressure(stream, false); return @getByIdDirectPrivate(stream, "backpressureChangePromise").@promise; } r'>author
path: root/integration/snippets/void-shouldnt-delete-call-expressions.js (unfollow)
AgeCommit message (Collapse)AuthorFilesLines
2021-10-16Update js_ast.zigGravatar Jarred Sumner 1-0/+17
2021-10-16Support GitHub repositories, transform package.json to better fit Bun's usageGravatar Jarred Sumner 3-404/+1180
2021-10-16more stringsGravatar Jarred Sumner 2-3/+28
2021-10-16Ensure `self` is always definedGravatar Jarred Sumner 1-0/+1
2021-10-16Fix edgecase in Transfer-Encoding chunkedGravatar Jarred Sumner 1-3/+2
2021-10-15CleanupGravatar Jarred Sumner 5-7/+9
2021-10-15Bump the versionbun-v0.0.35Gravatar Jarred Sumner 2-2/+2
2021-10-15LatestGravatar Jarred Sumner 5-14/+1360
2021-10-15:camera:Gravatar Jarred Sumner 2-2/+4
2021-10-15Fix static libarchive buildGravatar Jarred Sumner 1-2/+5
2021-10-15Bump s2n-tlsGravatar Jarred Sumner 1-0/+0
2021-10-15Linux build fixesGravatar Jarred SUmner 11-1377/+154
2021-10-15Update MakefileGravatar Jarred Sumner 1-1/+2
2021-10-15Cleanup makefile to get libiconv setup for linuxGravatar Jarred Sumner 4-2416/+9
2021-10-15Update MakefileGravatar Jarred Sumner 1-5/+5
2021-10-15Update MakefileGravatar Jarred Sumner 1-1/+1
2021-10-15update makefilejarred/genGravatar Jarred Sumner 3-16/+23
2021-10-15PolishGravatar Jarred Sumner 13-208/+2907
2021-10-14:sparkle:Gravatar Jarred Sumner 11-18245/+296
2021-10-14Update README.mdGravatar Jarred Sumner 1-2/+2
2021-10-14Update README.mdGravatar Jarred Sumner 1-2/+9
2021-10-14Update README.mdGravatar Jarred Sumner 1-9/+8
2021-10-14Update README.mdGravatar Jarred Sumner 1-0/+3
2021-10-14Update README.mdGravatar Jarred Sumner 1-1/+2
2021-10-14Update README.mdGravatar Jarred Sumner 1-107/+107
2021-10-14Support local templatesGravatar Jarred Sumner 8-145/+558
2021-10-14Update router.zigGravatar Jarred Sumner 1-0/+212
2021-10-14Support passing an absolute pathGravatar Jarred Sumner 4-171/+313
2021-10-14Update bun-create.mdGravatar Jarred Sumner 1-2/+6
2021-10-14Update bun-create.mdGravatar Jarred Sumner 1-1/+1
2021-10-14Add doc explaining bun-createGravatar Jarred Sumner 3-3/+60
2021-10-14`bun create react app` is almost doneGravatar Jarred Sumner 27-57/+1561
2021-10-13v0.0.0v0.0.0Gravatar Jarred Sumner 1-1/+2
2021-10-13[fetch] Slight perf improvementGravatar Jarred Sumner 1-0/+4
2021-10-13`--turbo` mode for fetch cli, which disables sending TLS shutdownGravatar Jarred Sumner 2-2/+5
2021-10-13[fetch] Support Transfer-Encoding: chunkedGravatar Jarred Sumner 5-39/+135
2021-10-13Update build.zigGravatar Jarred Sumner 1-2/+3
2021-10-13Clean up examples a littleGravatar Jarred Sumner 42-102/+7
2021-10-13Add TLS 1.3 support, improve fetch() HTTPS performanceGravatar Jarred Sumner 16-287/+751