diff options
Diffstat (limited to 'op_crates/fetch')
-rw-r--r-- | op_crates/fetch/21_file.js | 344 | ||||
-rw-r--r-- | op_crates/fetch/internal.d.ts | 10 | ||||
-rw-r--r-- | op_crates/fetch/lib.deno_fetch.d.ts | 36 | ||||
-rw-r--r-- | op_crates/fetch/lib.rs | 4 |
4 files changed, 0 insertions, 394 deletions
diff --git a/op_crates/fetch/21_file.js b/op_crates/fetch/21_file.js deleted file mode 100644 index 4a052576c..000000000 --- a/op_crates/fetch/21_file.js +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. - -// @ts-check -/// <reference no-default-lib="true" /> -/// <reference path="../../core/lib.deno_core.d.ts" /> -/// <reference path="../web/internal.d.ts" /> -/// <reference path="../web/lib.deno_web.d.ts" /> -/// <reference path="./internal.d.ts" /> -/// <reference path="./lib.deno_fetch.d.ts" /> -/// <reference lib="esnext" /> -"use strict"; - -((window) => { - // TODO(lucacasonato): this needs to not be hardcoded and instead depend on - // host os. - const isWindows = false; - - /** - * @param {string} input - * @param {number} position - * @returns {{result: string, position: number}} - */ - function collectCodepointsNotCRLF(input, position) { - // See https://w3c.github.io/FileAPI/#convert-line-endings-to-native and - // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points - const start = position; - for ( - let c = input.charAt(position); - position < input.length && !(c === "\r" || c === "\n"); - c = input.charAt(++position) - ); - return { result: input.slice(start, position), position }; - } - - /** - * @param {string} s - * @returns {string} - */ - function convertLineEndingsToNative(s) { - const nativeLineEnding = isWindows ? "\r\n" : "\n"; - - let { result, position } = collectCodepointsNotCRLF(s, 0); - - while (position < s.length) { - const codePoint = s.charAt(position); - if (codePoint === "\r") { - result += nativeLineEnding; - position++; - if (position < s.length && s.charAt(position) === "\n") { - position++; - } - } else if (codePoint === "\n") { - position++; - result += nativeLineEnding; - } - const { result: token, position: newPosition } = collectCodepointsNotCRLF( - s, - position, - ); - position = newPosition; - result += token; - } - - return result; - } - - /** - * @param {...Uint8Array} bytesArrays - * @returns {Uint8Array} - */ - function concatUint8Arrays(...bytesArrays) { - let byteLength = 0; - for (const bytes of bytesArrays) { - byteLength += bytes.byteLength; - } - const finalBytes = new Uint8Array(byteLength); - let current = 0; - for (const bytes of bytesArrays) { - finalBytes.set(bytes, current); - current += bytes.byteLength; - } - return finalBytes; - } - - const utf8Encoder = new TextEncoder(); - const utf8Decoder = new TextDecoder(); - - /** @typedef {BufferSource | Blob | string} BlobPart */ - - /** - * @param {BlobPart[]} parts - * @param {string} endings - * @returns {Uint8Array} - */ - function processBlobParts(parts, endings) { - /** @type {Uint8Array[]} */ - const bytesArrays = []; - for (const element of parts) { - if (element instanceof ArrayBuffer) { - bytesArrays.push(new Uint8Array(element.slice(0))); - } else if (ArrayBuffer.isView(element)) { - const buffer = element.buffer.slice( - element.byteOffset, - element.byteOffset + element.byteLength, - ); - bytesArrays.push(new Uint8Array(buffer)); - } else if (element instanceof Blob) { - bytesArrays.push( - new Uint8Array(element[_byteSequence].buffer.slice(0)), - ); - } else if (typeof element === "string") { - let s = element; - if (endings == "native") { - s = convertLineEndingsToNative(s); - } - bytesArrays.push(utf8Encoder.encode(s)); - } else { - throw new TypeError("Unreachable code (invalild element type)"); - } - } - return concatUint8Arrays(...bytesArrays); - } - - /** - * @param {string} str - * @returns {string} - */ - function normalizeType(str) { - let normalizedType = str; - if (!/^[\x20-\x7E]*$/.test(str)) { - normalizedType = ""; - } - return normalizedType.toLowerCase(); - } - - const _byteSequence = Symbol("[[ByteSequence]]"); - - class Blob { - /** @type {string} */ - #type; - - /** @type {Uint8Array} */ - [_byteSequence]; - - /** - * @param {BlobPart[]} [blobParts] - * @param {BlobPropertyBag} [options] - */ - constructor(blobParts, options) { - if (blobParts === undefined) { - blobParts = []; - } - if (typeof blobParts !== "object") { - throw new TypeError( - `Failed to construct 'Blob'. blobParts cannot be converted to a sequence.`, - ); - } - - const parts = []; - const iterator = blobParts[Symbol.iterator]?.(); - if (iterator === undefined) { - throw new TypeError( - "Failed to construct 'Blob'. The provided value cannot be converted to a sequence", - ); - } - while (true) { - const { value: element, done } = iterator.next(); - if (done) break; - if ( - ArrayBuffer.isView(element) || element instanceof ArrayBuffer || - element instanceof Blob - ) { - parts.push(element); - } else { - parts.push(String(element)); - } - } - - if (!options || typeof options === "function") { - options = {}; - } - if (typeof options !== "object") { - throw new TypeError( - `Failed to construct 'Blob'. options is not an object.`, - ); - } - const endings = options.endings?.toString() ?? "transparent"; - const type = options.type?.toString() ?? ""; - - /** @type {Uint8Array} */ - this[_byteSequence] = processBlobParts(parts, endings); - this.#type = normalizeType(type); - } - - /** @returns {number} */ - get size() { - return this[_byteSequence].byteLength; - } - - /** @returns {string} */ - get type() { - return this.#type; - } - - /** - * @param {number} [start] - * @param {number} [end] - * @param {string} [contentType] - * @returns {Blob} - */ - slice(start, end, contentType) { - const O = this; - /** @type {number} */ - let relativeStart; - if (start === undefined) { - relativeStart = 0; - } else { - start = Number(start); - if (start < 0) { - relativeStart = Math.max(O.size + start, 0); - } else { - relativeStart = Math.min(start, O.size); - } - } - /** @type {number} */ - let relativeEnd; - if (end === undefined) { - relativeEnd = O.size; - } else { - end = Number(end); - if (end < 0) { - relativeEnd = Math.max(O.size + end, 0); - } else { - relativeEnd = Math.min(end, O.size); - } - } - /** @type {string} */ - let relativeContentType; - if (contentType === undefined) { - relativeContentType = ""; - } else { - relativeContentType = normalizeType(String(contentType)); - } - return new Blob([ - O[_byteSequence].buffer.slice(relativeStart, relativeEnd), - ], { type: relativeContentType }); - } - - /** - * @returns {ReadableStream<Uint8Array>} - */ - stream() { - const bytes = this[_byteSequence]; - const stream = new ReadableStream({ - type: "bytes", - /** @param {ReadableByteStreamController} controller */ - start(controller) { - const chunk = new Uint8Array(bytes.buffer.slice(0)); - if (chunk.byteLength > 0) controller.enqueue(chunk); - controller.close(); - }, - }); - return stream; - } - - /** - * @returns {Promise<string>} - */ - async text() { - const buffer = await this.arrayBuffer(); - return utf8Decoder.decode(buffer); - } - - /** - * @returns {Promise<ArrayBuffer>} - */ - async arrayBuffer() { - const stream = this.stream(); - let bytes = new Uint8Array(); - for await (const chunk of stream) { - bytes = concatUint8Arrays(bytes, chunk); - } - return bytes.buffer; - } - - get [Symbol.toStringTag]() { - return "Blob"; - } - } - - const _Name = Symbol("[[Name]]"); - const _LastModfied = Symbol("[[LastModified]]"); - - class File extends Blob { - /** @type {string} */ - [_Name]; - /** @type {number} */ - [_LastModfied]; - - /** - * @param {BlobPart[]} fileBits - * @param {string} fileName - * @param {FilePropertyBag} [options] - */ - constructor(fileBits, fileName, options) { - if (fileBits === undefined) { - throw new TypeError( - "Failed to construct 'File'. 2 arguments required, but first not specified.", - ); - } - if (fileName === undefined) { - throw new TypeError( - "Failed to construct 'File'. 2 arguments required, but second not specified.", - ); - } - super(fileBits, { endings: options?.endings, type: options?.type }); - /** @type {string} */ - this[_Name] = String(fileName).replaceAll("/", ":"); - if (options?.lastModified === undefined) { - /** @type {number} */ - this[_LastModfied] = new Date().getTime(); - } else { - /** @type {number} */ - this[_LastModfied] = Number(options.lastModified); - } - } - - /** @returns {string} */ - get name() { - return this[_Name]; - } - - /** @returns {number} */ - get lastModified() { - return this[_LastModfied]; - } - } - - window.__bootstrap.file = { - Blob, - _byteSequence, - File, - }; -})(this); diff --git a/op_crates/fetch/internal.d.ts b/op_crates/fetch/internal.d.ts index a474d499c..e02bc6ed2 100644 --- a/op_crates/fetch/internal.d.ts +++ b/op_crates/fetch/internal.d.ts @@ -19,16 +19,6 @@ declare namespace globalThis { Headers: typeof Headers; }; - declare var file: { - Blob: typeof Blob & { - [globalThis.__bootstrap.file._byteSequence]: Uint8Array; - }; - _byteSequence: unique symbol; - File: typeof File & { - [globalThis.__bootstrap.file._byteSequence]: Uint8Array; - }; - }; - declare var streams: { ReadableStream: typeof ReadableStream; isReadableStreamDisturbed(stream: ReadableStream): boolean; diff --git a/op_crates/fetch/lib.deno_fetch.d.ts b/op_crates/fetch/lib.deno_fetch.d.ts index 7d06fe691..af21d8c44 100644 --- a/op_crates/fetch/lib.deno_fetch.d.ts +++ b/op_crates/fetch/lib.deno_fetch.d.ts @@ -287,42 +287,6 @@ interface TransformStreamDefaultControllerTransformCallback<I, O> { ): void | PromiseLike<void>; } -type BlobPart = BufferSource | Blob | string; - -interface BlobPropertyBag { - type?: string; - endings?: "transparent" | "native"; -} - -/** A file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The File interface is based on Blob, inheriting blob functionality and expanding it to support files on the user's system. */ -declare class Blob { - constructor(blobParts?: BlobPart[], options?: BlobPropertyBag); - - readonly size: number; - readonly type: string; - arrayBuffer(): Promise<ArrayBuffer>; - slice(start?: number, end?: number, contentType?: string): Blob; - stream(): ReadableStream; - text(): Promise<string>; -} - -interface FilePropertyBag extends BlobPropertyBag { - lastModified?: number; -} - -/** Provides information about files and allows JavaScript in a web page to - * access their content. */ -declare class File extends Blob { - constructor( - fileBits: BlobPart[], - fileName: string, - options?: FilePropertyBag, - ); - - readonly lastModified: number; - readonly name: string; -} - type FormDataEntryValue = File | string; /** Provides a way to easily construct a set of key/value pairs representing diff --git a/op_crates/fetch/lib.rs b/op_crates/fetch/lib.rs index 1d36bfc09..32a5a0140 100644 --- a/op_crates/fetch/lib.rs +++ b/op_crates/fetch/lib.rs @@ -69,10 +69,6 @@ pub fn init(isolate: &mut JsRuntime) { include_str!("20_headers.js"), ), ( - "deno:op_crates/fetch/21_file.js", - include_str!("21_file.js"), - ), - ( "deno:op_crates/fetch/26_fetch.js", include_str!("26_fetch.js"), ), |