split Value.fromJson into Value.persist

This commit is contained in:
Pierre Tachoire
2025-12-25 12:07:32 +01:00
parent beef458c3c
commit 5e4e4dcbc6
4 changed files with 19 additions and 6 deletions

View File

@@ -258,8 +258,9 @@ pub fn _json(self: *Response, page: *Page) !js.Promise {
log.info(.browser, "invalid json", .{ .err = e, .source = "Request" });
return error.SyntaxError;
};
const pvalue = try value.persist(page.js);
return page.js.resolvePromise(value);
return page.js.resolvePromise(pvalue);
}
return page.js.resolvePromise(null);
}

View File

@@ -183,8 +183,9 @@ pub fn _json(self: *Response, page: *Page) !js.Promise {
log.info(.browser, "invalid json", .{ .err = e, .source = "Response" });
return error.SyntaxError;
};
const pvalue = try value.persist(page.js);
return page.js.resolvePromise(value);
return page.js.resolvePromise(pvalue);
}
return page.js.resolvePromise(null);
}

View File

@@ -161,11 +161,16 @@ pub const Value = struct {
pub fn fromJson(ctx: *Context, json: []const u8) !Value {
const json_string = v8.String.initUtf8(ctx.isolate, json);
const value = try v8.Json.parse(ctx.v8_context, json_string);
return Value{ .context = ctx, .value = value };
}
const persisted = PersistentValue.init(ctx.isolate, value);
try ctx.js_value_list.append(ctx.arena, persisted);
pub fn persist(self: Value, context: *Context) !Value {
const js_value = self.value;
return Value{ .context = ctx, .value = persisted.toValue() };
const persisted = PersistentValue.init(context.isolate, js_value);
try context.js_value_list.append(context.arena, persisted);
return Value{ .context = context, .value = persisted.toValue() };
}
};

View File

@@ -701,7 +701,13 @@ pub const XMLHttpRequest = struct {
return;
};
self.response_obj = .{ .JSON = value };
const pvalue = value.persist(page.js) catch |e| {
log.warn(.http, "persist v8 json value", .{ .err = e, .url = self.url, .source = "xhr" });
self.response_obj = .{ .Failure = {} };
return;
};
self.response_obj = .{ .JSON = pvalue };
}
pub fn get_responseText(self: *XMLHttpRequest) ![]const u8 {