From 4be7fa178cd29fcdc95f89c06a17ef043a861a89 Mon Sep 17 00:00:00 2001 From: Halil Durak Date: Fri, 31 Oct 2025 17:18:03 +0300 Subject: [PATCH] support `Blob.arrayBuffer` Also adds support for `ArrayBuffer` to js.zig. --- src/browser/file/Blob.zig | 9 +++++++-- src/browser/js/js.zig | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/browser/file/Blob.zig b/src/browser/file/Blob.zig index bda20494..0d5eb937 100644 --- a/src/browser/file/Blob.zig +++ b/src/browser/file/Blob.zig @@ -139,8 +139,13 @@ fn writeBlobParts( } } -// TODO: Blob.arrayBuffer. -// https://developer.mozilla.org/en-US/docs/Web/API/Blob/arrayBuffer +/// Returns a Promise that resolves with the contents of the blob +/// as binary data contained in an ArrayBuffer. +pub fn _arrayBuffer(self: *const Blob, page: *Page) !js.Promise { + const resolver = page.js.createPromiseResolver(.none); + try resolver.resolve(js.ArrayBuffer{ .values = self.slice }); + return resolver.promise(); +} /// Returns a ReadableStream which upon reading returns the data /// contained within the Blob. diff --git a/src/browser/js/js.zig b/src/browser/js/js.zig index aeff6540..5471f300 100644 --- a/src/browser/js/js.zig +++ b/src/browser/js/js.zig @@ -58,6 +58,10 @@ pub fn TypedArray(comptime T: type) type { }; } +pub const ArrayBuffer = struct { + values: []const u8, +}; + pub const PromiseResolver = struct { context: *Context, resolver: v8.PromiseResolver, @@ -324,6 +328,19 @@ pub fn simpleZigValueToJs(isolate: v8.Isolate, value: anytype, comptime fail: bo }, .@"struct" => { const T = @TypeOf(value); + + if (T == ArrayBuffer) { + const values = value.values; + const len = values.len; + var array_buffer: v8.ArrayBuffer = undefined; + const backing_store = v8.BackingStore.init(isolate, len); + const data: [*]u8 = @ptrCast(@alignCast(backing_store.getData())); + @memcpy(data[0..len], @as([]const u8, @ptrCast(values))[0..len]); + array_buffer = v8.ArrayBuffer.initWithBackingStore(isolate, &backing_store.toSharedPtr()); + + return .{ .handle = array_buffer.handle }; + } + if (@hasDecl(T, "_TYPED_ARRAY_ID_KLUDGE")) { const values = value.values; const value_type = @typeInfo(@TypeOf(values)).pointer.child;