/* * Copyright (C) 2015 Canon Inc. * Copyright (C) 2015 Igalia. * * 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. ``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 * 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. */ export function initializeReadableStream( this: ReadableStream, underlyingSource: UnderlyingSource, strategy: QueuingStrategy, ) { if (underlyingSource === undefined) underlyingSource = { $bunNativeType: 0, $bunNativePtr: 0, $lazy: false } as UnderlyingSource; if (strategy === undefined) strategy = {}; if (!$isObject(underlyingSource)) throw new TypeError("ReadableStream constructor takes an object as first argument"); if (strategy !== undefined && !$isObject(strategy)) throw new TypeError("ReadableStream constructor takes an object as second argument, if any"); $putByIdDirectPrivate(this, "state", $streamReadable); $putByIdDirectPrivate(this, "reader", undefined); $putByIdDirectPrivate(this, "storedError", undefined); $putByIdDirectPrivate(this, "disturbed", false); // Initialized with null value to enable distinction with undefined case. $putByIdDirectPrivate(this, "readableStreamController", null); $putByIdDirectPrivate(this, "bunNativeType", $getByIdDirectPrivate(underlyingSource, "bunNativeType") ?? 0); $putByIdDirectPrivate(this, "bunNativePtr", $getByIdDirectPrivate(underlyingSource, "bunNativePtr") ?? 0); $putByIdDirectPrivate(this, "asyncContext", $getInternalField($asyncContext, 0)); const isDirect = underlyingSource.type === "direct"; // direct streams are always lazy const isUnderlyingSourceLazy = !!underlyingSource.$lazy; const isLazy = isDirect || isUnderlyingSourceLazy; // FIXME: We should introduce https://streams.spec.whatwg.org/#create-readable-stream. // For now, we emulate this with underlyingSource with private properties. if ($getByIdDirectPrivate(underlyingSource, "pull") !== undefined && !isLazy) { const size = $getByIdDirectPrivate(strategy, "size"); const highWaterMark = $getByIdDirectPrivate(strategy, "highWaterMark"); $putByIdDirectPrivate(this, "highWaterMark", highWaterMark); $putByIdDirectPrivate(this, "underlyingSource", undefined); $setupReadableStreamDefaultController( this, underlyingSource, size, highWaterMark !== undefined ? highWaterMark : 1, $getByIdDirectPrivate(underlyingSource, "start"), $getByIdDirectPrivate(underlyingSource, "pull"), $getByIdDirectPrivate(underlyingSource, "cancel"), ); return this; } if (isDirect) { $putByIdDirectPrivate(this, "underlyingSource", underlyingSource); $putByIdDirectPrivate(this, "highWaterMark", $getByIdDirectPrivate(strategy, "highWaterMark")); $putByIdDirectPrivate(this, "start", () => $createReadableStreamController(this, underlyingSource, strategy)); } else if (isLazy) { const autoAllocateChunkSize = underlyingSource.autoAllocateChunkSize; $putByIdDirectPrivate(this, "highWaterMark", undefined); $putByIdDirectPrivate(this, "underlyingSource", undefined); $putByIdDirectPrivate( this, "highWaterMark", autoAllocateChunkSize || $getByIdDirectPrivate(strategy, "highWaterMark"), ); $putByIdDirectPrivate(this, "start", () => { const instance = $lazyLoadStream(this, autoAllocateChunkSize); if (instance) { $createReadableStreamController(this, instance, strategy); } }); } else { $putByIdDirectPrivate(this, "underlyingSource", undefined); $putByIdDirectPrivate(this, "highWaterMark", $getByIdDirectPrivate(strategy, "highWaterMark")); $putByIdDirectPrivate(this, "start", undefined); $createReadableStreamController(this, underlyingSource, strategy); } return this; } $linkTimeConstant; export function readableStreamToArray(stream: ReadableStream): Promise { // this is a direct stream var underlyingSource = $getByIdDirectPrivate(stream, "underlyingSource"); if (underlyingSource !== undefined) { return $readableStreamToArrayDirect(stream, underlyingSource); } return $readableStreamIntoArray(stream); } $linkTimeConstant; export function readableStreamToText(stream: ReadableStream): Promise { // this is a direct stream var underlyingSource = $getByIdDirectPrivate(stream, "underlyingSource"); if (underlyingSource !== undefined) { return $readableStreamToTextDirect(stream, underlyingSource); } return $readableStreamIntoText(stream); } $linkTimeConstant; export function readableStreamToArrayBuffer(stream: ReadableStream): Promise | ArrayBuffer { // this is a direct stream var underlyingSource = $getByIdDirectPrivate(stream, "underlyingSource"); if (underlyingSource !== undefined) { return $readableStreamToArrayBufferDirect(stream, underlyingSource); } var result = Bun.readableStreamToArray(stream); if ($isPromise(result)) { // `result` is an InternalPromise, which doesn't have a `.$then` method // but `.then` isn't user-overridable, so we can use it safely. return result.then(Bun.concatArrayBuffers); } return Bun.concatArrayBuffers(result); } $linkTimeConstant; export function readableStreamToFormData( stream: ReadableStream, contentType: string | ArrayBuffer | ArrayBufferView, ): Promise { return Bun.readableStreamToBlob(stream).then(blob => { return FormData.from(blob, contentType); }); } $linkTimeConstant; export function readableStreamToJSON(stream: ReadableStream): unknown { return Bun.readableStreamToText(stream).$then(globalThis.JSON.parse); } $linkTimeConstant; export function readableStreamToBlob(stream: ReadableStream): Promise { return Promise.resolve(Bun.readableStreamToArray(stream)).$then(array => new Blob(array)); } $linkTimeConstant; export function consumeReadableStream(nativePtr, nativeType, inputStream) { const symbol = globalThis.Symbol.for("Bun.consumeReadableStreamPrototype"); var cached = globalThis[symbol]; if (!cached) { cached = globalThis[symbol] = []; } var Prototype = cached[nativeType]; if (Prototype === undefined) { var [doRead, doError, doReadMany, doClose, onClose, deinit] = $lazy(nativeType); Prototype = class NativeReadableStreamSink { handleError: any; handleClosed: any; processResult: any; constructor(reader, ptr) { this.#ptr = ptr; this.#reader = reader; this.#didClose = false; this.handleError = this._handleError.bind(this); this.handleClosed = this._handleClosed.bind(this); this.processResult = this._processResult.bind(this); reader.closed.then(this.handleClosed, this.handleError); } _handleClosed() { if (this.#didClose) return; this.#didClose = true; var ptr = this.#ptr; this.#ptr = 0; doClose(ptr); deinit(ptr); } _handleError(error) { if (this.#didClose) return; this.#didClose = true; var ptr = this.#ptr; this.#ptr = 0; doError(ptr, error); deinit(ptr); } #ptr; #didClose = false; #reader; _handleReadMany({ value, done, size }) { if (done) { this.handleClosed(); return; } if (this.#didClose) return; doReadMany(this.#ptr, value, done, size); } read() { if (!this.#ptr) return $throwTypeError("ReadableStreamSink is already closed"); return this.processResult(this.#reader.read()); } _processResult(result) { if (result && $isPromise(result)) { const flags = $getPromiseInternalField(result, $promiseFieldFlags); if (flags & $promiseStateFulfilled) { const fulfilledValue = $getPromiseInternalField(result, $promiseFieldReactionsOrResult); if (fulfilledValue) { result = fulfilledValue; } } } if (result && $isPromise(result)) { result.then(this.processResult, this.handleError); return null; } if (result.done) { this.handleClosed(); return 0; } else if (result.value) { return result.value; } else { return -1; } } readMany() { if (!this.#ptr) return $throwTypeError("ReadableStreamSink is already closed"); return this.processResult(this.#reader.readMany()); } }; const minlength = nativeType + 1; if (cached.length < minlength) { cached.length = minlength; } $putByValDirect(cached, nativeType, Prototype); } if ($isReadableStreamLocked(inputStream)) { throw new TypeError("Cannot start reading from a locked stream"); } return new Prototype(inputStream.getReader(), nativePtr); } $linkTimeConstant; export function createEmptyReadableStream() { var stream = new ReadableStream({ pull() {}, } as any); $readableStreamClose(stream); return stream; } $linkTimeConstant; export function createNativeReadableStream(nativePtr, nativeType, autoAllocateChunkSize) { return new ReadableStream({ $lazy: true, $bunNativeType: nativeType, $bunNativePtr: nativePtr, autoAllocateChunkSize: autoAllocateChunkSize, }); } export function cancel(this, reason) { if (!$isReadableStream(this)) return Promise.$reject($makeThisTypeError("ReadableStream", "cancel")); if ($isReadableStreamLocked(this)) return Promise.$reject($makeTypeError("ReadableStream is locked")); return $readableStreamCancel(this, reason); } export function getReader(this, options) { if (!$isReadableStream(this)) throw $makeThisTypeError("ReadableStream", "getReader"); const mode = $toDictionary(options, {}, "ReadableStream.getReader takes an object as first argument").mode; if (mode === undefined) { var start_ = $getByIdDirectPrivate(this, "start"); if (start_) { $putByIdDirectPrivate(this, "start", undefined); start_(); } return new ReadableStreamDefaultReader(this); } // String conversion is required by spec, hence double equals. if (mode == "byob") { return new ReadableStreamBYOBReader(this); } throw new TypeError("Invalid mode is specified"); } export function pipeThrough(this, streams, options) { const transforms = streams; const readable = transforms["readable"]; if (!$isReadableStream(readable)) throw $makeTypeError("readable should be ReadableStream"); const writable = transforms["writable"]; const internalWritable = $getInternalWritableStream(writable); if (!$isWritableStream(internalWritable)) throw $makeTypeError("writable should be WritableStream"); let preventClose = false; let preventAbort = false; let preventCancel = false; let signal; if (!$isUndefinedOrNull(options)) { if (!$isObject(options)) throw $makeTypeError("options must be an object"); preventAbort = !!options["preventAbort"]; preventCancel = !!options["preventCancel"]; preventClose = !!options["preventClose"]; signal = options["signal"]; if (signal !== undefined && !$isAbortSignal(signal)) throw $makeTypeError("options.signal must be AbortSignal"); } if (!$isReadableStream(this)) throw $makeThisTypeError("ReadableStream", "pipeThrough"); if ($isReadableStreamLocked(this)) throw $makeTypeError("ReadableStream is locked"); if ($isWritableStreamLocked(internalWritable)) throw $makeTypeError("WritableStream is locked"); $readableStreamPipeToWritableStream(this, internalWritable, preventClose, preventAbort, preventCancel, signal); return readable; } export function pipeTo(this, destination) { if (!$isReadableStream(this)) return Promise.$reject($makeThisTypeError("ReadableStream", "pipeTo")); if ($isReadableStreamLocked(this)) return Promise.$reject($makeTypeError("ReadableStream is locked")); // FIXME: https://bugs.webkit.org/show_bug.cgi?id=159869. // Built-in generator should be able to parse function signature to compute the function length correctly. let options = $argument(1); let preventClose = false; let preventAbort = false; let preventCancel = false; let signal; if (!$isUndefinedOrNull(options)) { if (!$isObject(options)) return Promise.$reject($makeTypeError("options must be an object")); try { preventAbort = !!options["preventAbort"]; preventCancel = !!options["preventCancel"]; preventClose = !!options["preventClose"]; signal = options["signal"]; } catch (e) { return Promise.$reject(e); } if (signal !== undefined && !$isAbortSignal(signal)) return Promise.$reject(new TypeError("options.signal must be AbortSignal")); } const internalDestination = $getInternalWritableStream(destination); if (!$isWritableStream(internalDestination)) return Promise.$reject(new TypeError("ReadableStream pipeTo requires a WritableStream")); if ($isWritableStreamLocked(internalDestination)) return Promise.$reject(new TypeError("WritableStream is locked")); return $readableStreamPipeToWritableStream( this, internalDestination, preventClose, preventAbort, preventCancel, signal, ); } export function tee(this) { if (!$isReadableStream(this)) throw $makeThisTypeError("ReadableStream", "tee"); return $readableStreamTee(this, false); } $getter; export function locked(this) { if (!$isReadableStream(this)) throw $makeGetterTypeError("ReadableStream", "locked"); return $isReadableStreamLocked(this); } export function values(this, options) { var prototype = ReadableStream.prototype; $readableStreamDefineLazyIterators(prototype); return prototype.values.$call(this, options); } $linkTimeConstant; export function lazyAsyncIterator(this) { var prototype = ReadableStream.prototype; $readableStreamDefineLazyIterators(prototype); return prototype[globalThis.Symbol.asyncIterator].$call(this); } tion> Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2023-08-22[ci] release (rc) (#8147)create-astro@4.0.0-rc.2astro@3.0.0-rc.5@astrojs/vue@3.0.0-rc.1@astrojs/vercel@4.0.0-rc.4@astrojs/underscore-redirects@0.3.0-rc.1@astrojs/telemetry@3.0.0-rc.3@astrojs/tailwind@5.0.0-rc.1@astrojs/svelte@4.0.0-rc.2@astrojs/solid-js@3.0.0-rc.3@astrojs/sitemap@3.0.0-rc.1@astrojs/rss@3.0.0-rc.1@astrojs/react@3.0.0-rc.4@astrojs/prism@3.0.0-rc.1@astrojs/prefetch@0.4.0-rc.1@astrojs/preact@3.0.0-rc.2@astrojs/partytown@2.0.0-rc.1@astrojs/node@6.0.0-rc.1@astrojs/netlify@3.0.0-rc.2@astrojs/mdx@1.0.0-rc.2@astrojs/markdown-remark@3.0.0-rc.1@astrojs/markdoc@0.5.0-rc.1@astrojs/lit@3.0.0-rc.1@astrojs/internal-helpers@0.2.0-rc.2@astrojs/deno@5.0.0-rc.1@astrojs/cloudflare@7.0.0-rc.3@astrojs/alpinejs@0.3.0-rc.1Gravatar Houston (Bot) 4-27/+28
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-22Fix turbolink changesetGravatar bluwy 5-5/+1
2023-08-22chore: update lock fileGravatar Emanuele Stoppa 1-9/+151
2023-08-22chore: update bug report to use the `astro info` command (#8175)Gravatar Emanuele Stoppa 1-25/+5
Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
2023-08-22Remove turbolinks integration (#8186)Gravatar Bjorn Lu 8-317/+0
2023-08-22[ci] formatGravatar ematipico 2-35/+42
2023-08-22add: config error if `outDir` is inside `publicDir` (#8152)Gravatar André Alves 3-0/+13
Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
2023-08-22Deprecate drafts feature (#8099)Gravatar Bjorn Lu 7-7/+41
Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca>
2023-08-21Use more permissive type for `defineCollection` schema option (#8163)Gravatar Chris Swithinbank 2-5/+7
Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
2023-08-21feat: style scoped hash is lowercase (#8180)Gravatar Emanuele Stoppa 4-7/+48
2023-08-21RC Release candidate (#8179)Gravatar Matthew Phillips 2-1/+32
* RC Release candidate * Use the rc tag
2023-08-21Set Markdoc integration version to a minor (#8177)Gravatar Matthew Phillips 1-1/+1
2023-08-21fix(@astrojs/node): handler should work with `express` (#8176)Gravatar Emanuele Stoppa 7-16/+221
2023-08-21[docs] deprecate build.split and build.excludeMiddleware in config ref (#8158)Gravatar Sarah Rainsberger 1-25/+7
2023-08-21chore: lock fileGravatar Emanuele Stoppa 1-0/+4
2023-08-21[ci] formatGravatar natemoo-re 4-9/+15
2023-08-21Stringify shouldn't throw on user object during rendering (#8127)Gravatar Nate Moore 9-46/+115
* fix(#7923): do not throw on user { type } object * chore: remove unused type export * chore: guess it wasn't unused
2023-08-21[ci] formatGravatar natemoo-re 1-1/+4
2023-08-21fix(dev): open to base path (#8123)Gravatar Nate Moore 2-1/+8
2023-08-21chore(gitpod): resolve potential globbing and word splitting issue (#8124)Gravatar Ben Elan 1-1/+1
Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
2023-08-21fix(#6965): fix build stats (#8122)Gravatar Nate Moore 2-1/+8
2023-08-21only update our own history entires during back navigation through view ↵Gravatar Martin Trapp 2-3/+11
transitions (#8116)
2023-08-21fix: reinsert attribute to specify direction of ViewTransition (forward / ↵Gravatar Martin Trapp 2-7/+12
back) (#8109)
2023-08-21Remove deprecated APIs (#8170)Gravatar Bjorn Lu 4-107/+5
2023-08-21Remove pre-shiki v0.14 theme names (#8169)Gravatar Bjorn Lu 6-80/+14
2023-08-21[docs] JSX framework integration READMEs (#8151)Gravatar Sarah Rainsberger 3-0/+104
2023-08-21fix(assets): Add missing type for imageConfig export (#8171)Gravatar Erika 2-1/+7
2023-08-21Deprecate simple objects from endpoints (#8132)Gravatar Bjorn Lu 20-201/+243
2023-08-18[docs] update scopedStyleStragegy default and description (#8148)Gravatar Sarah Rainsberger 1-2/+2
2023-08-18[ci] release (#8145)astro@2.10.12@astrojs/react@2.3.2@astrojs/node@5.3.5Gravatar Houston (Bot) 46-92/+98
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-18Fix missing package file regression (#8149)Gravatar Matthew Phillips 2-1/+7
2023-08-18fix(node): delegate preview's not found and error handling to core/app (#8141)Gravatar Arsh 2-9/+6
* fix(node): delegate preview's not found and error handling to core/app * add changeset --------- Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
2023-08-18Replace `class:list` implementation with `clsx` (#8142)Gravatar Nate Moore 12-68/+133
* chore: replace `class:list` implementation with `clsx` * chore: remove Set support from `class:list` test * chore: better class:list test * Update packages/astro/src/runtime/server/render/component.ts
2023-08-18[ci] formatGravatar matthewp 1-1/+4
2023-08-18fix(data collections): normalize file paths for DataEntry.id (#8144)Gravatar Arsh 2-1/+6
* normalize file paths for DataEntry.id * add changeset
2023-08-18[ci] release (beta) (#8140)astro@3.0.0-beta.4Gravatar Houston (Bot) 41-65/+72
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-18[error messages] Update image errors-data.ts (#8126)Gravatar Sarah Rainsberger 1-12/+12
Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
2023-08-18fix(polyfills): Use object shape for Stackblitz polyfill listGravatar Princesseuh 1-2/+2
2023-08-18fix: polyfill File using undici instead of node:buffer (#8139)Gravatar Erika 2-8/+9
* fix: polyfill File using undici instead of node:buffer * chore: changeset
2023-08-18[ci] release (beta) (#8073)create-astro@4.0.0-beta.1astro@3.0.0-beta.3@astrojs/vercel@4.0.0-beta.3@astrojs/telemetry@3.0.0-beta.2@astrojs/svelte@4.0.0-beta.1@astrojs/solid-js@3.0.0-beta.2@astrojs/react@3.0.0-beta.3@astrojs/mdx@1.0.0-beta.1@astrojs/cloudflare@7.0.0-beta.2Gravatar Houston (Bot) 63-117/+389
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-18[ci] release (#8138)astro@2.10.11@astrojs/react@2.3.1Gravatar Houston (Bot) 44-80/+82
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-18[ci] formatGravatar natemoo-re 1-1/+1
2023-08-18Fix 404 response leading to an infinite loop when there is no 404 page (#8136)Gravatar André Alves 2-1/+10
* fix: 404 response leads to infinite loop * chore: changeset --------- Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
2023-08-18fix(react): add missing export (#8137)Gravatar Nate Moore 2-1/+7
2023-08-18[ci] release (#8096)create-astro@3.2.2astro@2.10.10@astrojs/vercel@3.8.2@astrojs/svelte@3.1.1@astrojs/solid-js@2.2.1@astrojs/react@2.3.0Gravatar Houston (Bot) 63-197/+186
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-18changeset(next): inlineStylesheets default switch is major (#8133)Gravatar Arsh 1-1/+1
2023-08-18feat: add polyfills for stackblitz (#8130)Gravatar Erika 7-6/+86
* feat: add polyfills for Stackblitz * chore: changeset