From c6e82d5af6053196f5aceccfe7fe5288029a69a5 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Mon, 1 Sep 2025 06:58:51 -0700 Subject: [PATCH] add json response method --- src/browser/fetch/Response.zig | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/browser/fetch/Response.zig b/src/browser/fetch/Response.zig index 159dfbf4..dffbfc57 100644 --- a/src/browser/fetch/Response.zig +++ b/src/browser/fetch/Response.zig @@ -17,15 +17,16 @@ // along with this program. If not, see . const std = @import("std"); -const URL = @import("../../url.zig").URL; -const Page = @import("../page.zig").Page; -const Env = @import("../env.zig").Env; +const log = @import("../../log.zig"); const v8 = @import("v8"); -const Http = @import("../../http/Http.zig"); const HttpClient = @import("../../http/Client.zig"); +const Http = @import("../../http/Http.zig"); +const URL = @import("../../url.zig").URL; +const Env = @import("../env.zig").Env; const Mime = @import("../mime.zig").Mime; +const Page = @import("../page.zig").Page; // https://developer.mozilla.org/en-US/docs/Web/API/Response const Response = @This(); @@ -81,6 +82,26 @@ pub fn _text(self: *const Response, page: *Page) !Env.Promise { return resolver.promise(); } +pub fn _json(self: *const Response, page: *Page) !Env.Promise { + const resolver = Env.PromiseResolver{ + .js_context = page.main_context, + .resolver = v8.PromiseResolver.init(page.main_context.v8_context), + }; + + const p = std.json.parseFromSliceLeaky( + std.json.Value, + page.arena, + self.body, + .{}, + ) catch |e| { + log.warn(.browser, "invalid json", .{ .err = e, .source = "fetch" }); + return error.SyntaxError; + }; + + try resolver.resolve(p); + return resolver.promise(); +} + const testing = @import("../../testing.zig"); test "fetch: response" { var runner = try testing.jsRunner(testing.tracking_allocator, .{ .url = "https://lightpanda.io" });