diff --git a/src/browser/webapi/encoding/TextDecoderStream.zig b/src/browser/webapi/encoding/TextDecoderStream.zig index 2ba1e501..a5b2dc9a 100644 --- a/src/browser/webapi/encoding/TextDecoderStream.zig +++ b/src/browser/webapi/encoding/TextDecoderStream.zig @@ -47,7 +47,24 @@ pub fn init(label_: ?[]const u8, opts_: ?InitOpts, page: *Page) !TextDecoderStre } const opts = opts_ orelse InitOpts{}; - const transform = try TransformStream.initWithZigTransform(&decodeTransform, page); + const decodeFn: TransformStream.ZigTransformFn = blk: { + if (opts.ignoreBOM) { + break :blk struct { + fn decode(controller: *TransformStream.DefaultController, chunk: js.Value) !void { + return decodeTransform(controller, chunk, true); + } + }.decode; + } else { + break :blk struct { + fn decode(controller: *TransformStream.DefaultController, chunk: js.Value) !void { + return decodeTransform(controller, chunk, false); + } + }.decode; + } + }; + + const transform = try TransformStream.initWithZigTransform(decodeFn, page); + return .{ ._transform = transform, ._fatal = opts.fatal, @@ -55,13 +72,13 @@ pub fn init(label_: ?[]const u8, opts_: ?InitOpts, page: *Page) !TextDecoderStre }; } -fn decodeTransform(controller: *TransformStream.DefaultController, chunk: js.Value) !void { +fn decodeTransform(controller: *TransformStream.DefaultController, chunk: js.Value, ignoreBOM: bool) !void { // chunk should be a Uint8Array; decode it as UTF-8 string const typed_array = try chunk.toZig(js.TypedArray(u8)); var input = typed_array.values; // Strip UTF-8 BOM if present - if (std.mem.startsWith(u8, input, &.{ 0xEF, 0xBB, 0xBF })) { + if (ignoreBOM == false and std.mem.startsWith(u8, input, &.{ 0xEF, 0xBB, 0xBF })) { input = input[3..]; } diff --git a/src/browser/webapi/streams/TransformStream.zig b/src/browser/webapi/streams/TransformStream.zig index 7d5eacbe..1805da2d 100644 --- a/src/browser/webapi/streams/TransformStream.zig +++ b/src/browser/webapi/streams/TransformStream.zig @@ -27,7 +27,7 @@ const TransformStream = @This(); pub const DefaultController = TransformStreamDefaultController; -const ZigTransformFn = *const fn (*TransformStreamDefaultController, js.Value) anyerror!void; +pub const ZigTransformFn = *const fn (*TransformStreamDefaultController, js.Value) anyerror!void; _readable: *ReadableStream, _writable: *WritableStream,