From 5f4ae2fd8c492a291481a722ea560db572e968b9 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Thu, 2 Apr 2026 10:45:02 +0800 Subject: [PATCH] support 'blob' binaryType --- src/browser/tests/net/websocket.html | 40 +++++++++++++++++++++++ src/browser/webapi/event/MessageEvent.zig | 2 ++ src/browser/webapi/net/WebSocket.zig | 12 +++++-- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/browser/tests/net/websocket.html b/src/browser/tests/net/websocket.html index 257c2136..dbfc0c4a 100644 --- a/src/browser/tests/net/websocket.html +++ b/src/browser/tests/net/websocket.html @@ -544,3 +544,43 @@ }); } + + diff --git a/src/browser/webapi/event/MessageEvent.zig b/src/browser/webapi/event/MessageEvent.zig index 66ffd8c6..dfd813d5 100644 --- a/src/browser/webapi/event/MessageEvent.zig +++ b/src/browser/webapi/event/MessageEvent.zig @@ -44,6 +44,7 @@ pub const Data = union(enum) { value: js.Value.Temp, string: []const u8, arraybuffer: js.ArrayBuffer, + blob: *@import("../Blob.zig"), }; const Options = Event.inheritOptions(MessageEvent, MessageEventOptions); @@ -83,6 +84,7 @@ pub fn deinit(self: *MessageEvent, session: *Session) void { if (self._data) |d| { switch (d) { .value => |js_val| js_val.release(), + .blob => |blob| blob.releaseRef(session), .string, .arraybuffer => {}, } } diff --git a/src/browser/webapi/net/WebSocket.zig b/src/browser/webapi/net/WebSocket.zig index dc19728e..7fa390e4 100644 --- a/src/browser/webapi/net/WebSocket.zig +++ b/src/browser/webapi/net/WebSocket.zig @@ -410,13 +410,19 @@ fn dispatchOpenEvent(self: *WebSocket) !void { } fn dispatchMessageEvent(self: *WebSocket, data: []const u8, frame_type: http.WsFrameType) !void { - std.debug.print("{any} {s}\n", .{ frame_type, data }); const page = self._page; const target = self.asEventTarget(); if (page._event_manager.hasDirectListeners(target, "message", self._on_message)) { - const msg_data: MessageEvent.Data = if (frame_type == .binary and self._binary_type == .arraybuffer) - .{ .arraybuffer = .{ .values = data } } + const msg_data: MessageEvent.Data = if (frame_type == .binary) + switch (self._binary_type) { + .arraybuffer => .{ .arraybuffer = .{ .values = data } }, + .blob => blk: { + const blob = try Blob.init(&.{data}, .{}, page); + blob.acquireRef(); + break :blk .{ .blob = blob }; + }, + } else .{ .string = data };