summaryrefslogtreecommitdiff
path: root/ext/web/09_file.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/web/09_file.js')
-rw-r--r--ext/web/09_file.js51
1 files changed, 38 insertions, 13 deletions
diff --git a/ext/web/09_file.js b/ext/web/09_file.js
index 5ebef8f9d..1ecebe8a8 100644
--- a/ext/web/09_file.js
+++ b/ext/web/09_file.js
@@ -18,9 +18,13 @@ const primordials = globalThis.__bootstrap.primordials;
const {
ArrayBufferPrototype,
ArrayBufferPrototypeSlice,
+ ArrayBufferPrototypeGetByteLength,
ArrayBufferIsView,
ArrayPrototypePush,
AsyncGeneratorPrototypeNext,
+ DataViewPrototypeGetBuffer,
+ DataViewPrototypeGetByteLength,
+ DataViewPrototypeGetByteOffset,
Date,
DatePrototypeGetTime,
FinalizationRegistry,
@@ -37,6 +41,10 @@ const {
Symbol,
SymbolFor,
TypedArrayPrototypeSet,
+ TypedArrayPrototypeGetBuffer,
+ TypedArrayPrototypeGetByteLength,
+ TypedArrayPrototypeGetByteOffset,
+ TypedArrayPrototypeGetSymbolToStringTag,
TypeError,
Uint8Array,
} = primordials;
@@ -100,6 +108,7 @@ function convertLineEndingsToNative(s) {
/** @param {(BlobReference | Blob)[]} parts */
async function* toIterator(parts) {
for (let i = 0; i < parts.length; ++i) {
+ // deno-lint-ignore prefer-primordials
yield* parts[i].stream();
}
}
@@ -120,15 +129,31 @@ function processBlobParts(parts, endings) {
if (ObjectPrototypeIsPrototypeOf(ArrayBufferPrototype, element)) {
const chunk = new Uint8Array(ArrayBufferPrototypeSlice(element, 0));
ArrayPrototypePush(processedParts, BlobReference.fromUint8Array(chunk));
- size += element.byteLength;
+ size += ArrayBufferPrototypeGetByteLength(element);
} else if (ArrayBufferIsView(element)) {
- const chunk = new Uint8Array(
- element.buffer,
- element.byteOffset,
- element.byteLength,
- );
- size += element.byteLength;
- ArrayPrototypePush(processedParts, BlobReference.fromUint8Array(chunk));
+ if (TypedArrayPrototypeGetSymbolToStringTag(element) !== undefined) {
+ // TypedArray
+ const chunk = new Uint8Array(
+ TypedArrayPrototypeGetBuffer(/** @type {Uint8Array} */ (element)),
+ TypedArrayPrototypeGetByteOffset(/** @type {Uint8Array} */ (element)),
+ TypedArrayPrototypeGetByteLength(/** @type {Uint8Array} */ (element)),
+ );
+ size += TypedArrayPrototypeGetByteLength(
+ /** @type {Uint8Array} */ (element),
+ );
+ ArrayPrototypePush(processedParts, BlobReference.fromUint8Array(chunk));
+ } else {
+ // DataView
+ const chunk = new Uint8Array(
+ DataViewPrototypeGetBuffer(/** @type {DataView} */ (element)),
+ DataViewPrototypeGetByteOffset(/** @type {DataView} */ (element)),
+ DataViewPrototypeGetByteLength(/** @type {DataView} */ (element)),
+ );
+ size += DataViewPrototypeGetByteLength(
+ /** @type {DataView} */ (element),
+ );
+ ArrayPrototypePush(processedParts, BlobReference.fromUint8Array(chunk));
+ }
} else if (ObjectPrototypeIsPrototypeOf(BlobPrototype, element)) {
ArrayPrototypePush(processedParts, element);
size += element.size;
@@ -136,7 +161,7 @@ function processBlobParts(parts, endings) {
const chunk = core.encode(
endings == "native" ? convertLineEndingsToNative(element) : element,
);
- size += chunk.byteLength;
+ size += TypedArrayPrototypeGetByteLength(chunk);
ArrayPrototypePush(processedParts, BlobReference.fromUint8Array(chunk));
} else {
throw new TypeError("Unreachable code (invalid element type)");
@@ -341,7 +366,7 @@ class Blob {
partIterator,
);
if (done) return controller.close();
- if (value.byteLength > 0) {
+ if (TypedArrayPrototypeGetByteLength(value) > 0) {
return controller.enqueue(value);
}
}
@@ -368,7 +393,7 @@ class Blob {
partIterator,
);
if (done) break;
- const byteLength = value.byteLength;
+ const byteLength = TypedArrayPrototypeGetByteLength(value);
if (byteLength > 0) {
TypedArrayPrototypeSet(bytes, value, offset);
offset += byteLength;
@@ -383,7 +408,7 @@ class Blob {
async arrayBuffer() {
webidl.assertBranded(this, BlobPrototype);
const buf = await this.#u8Array(this.size);
- return buf.buffer;
+ return TypedArrayPrototypeGetBuffer(buf);
}
[SymbolFor("Deno.customInspect")](inspect) {
@@ -554,7 +579,7 @@ class BlobReference {
*/
static fromUint8Array(data) {
const id = ops.op_blob_create_part(data);
- return new BlobReference(id, data.byteLength);
+ return new BlobReference(id, TypedArrayPrototypeGetByteLength(data));
}
/**