Compare commits

...

1 Commits

Author SHA1 Message Date
Jarred Sumner
83cf798a79 Remove JSC.Strong from NodeHTTPResponse 2025-04-02 16:23:29 -07:00
4 changed files with 38 additions and 38 deletions

View File

@@ -191,7 +191,7 @@ export default [
klass: {},
finalize: true,
noConstructor: true,
values: ["onAborted", "onWritable", "onData"],
values: ["onAborted", "onWritable", "onData", "promise"],
}),
define({

View File

@@ -6429,6 +6429,7 @@ pub fn NewServer(comptime NamespaceType: type, comptime ssl_enabled_: bool, comp
const vm = this.vm;
var node_http_response: ?*NodeHTTPResponse = null;
var node_response_jsvalue = JSC.JSValue.zero;
var is_async = false;
defer {
if (!is_async) {
@@ -6447,6 +6448,7 @@ pub fn NewServer(comptime NamespaceType: type, comptime ssl_enabled_: bool, comp
resp,
upgrade_ctx,
&node_http_response,
&node_response_jsvalue,
);
const HTTPResult = union(enum) {
@@ -6455,7 +6457,6 @@ pub fn NewServer(comptime NamespaceType: type, comptime ssl_enabled_: bool, comp
success: void,
pending: JSC.JSValue,
};
var strong_promise: JSC.Strong = .empty;
var needs_to_drain = true;
defer {
@@ -6463,7 +6464,6 @@ pub fn NewServer(comptime NamespaceType: type, comptime ssl_enabled_: bool, comp
vm.drainMicrotasks();
}
}
defer strong_promise.deinit();
const http_result: HTTPResult = brk: {
if (result.toError()) |err| {
break :brk .{ .exception = err };
@@ -6471,7 +6471,9 @@ pub fn NewServer(comptime NamespaceType: type, comptime ssl_enabled_: bool, comp
if (result.asAnyPromise()) |promise| {
if (promise.status(globalThis.vm()) == .pending) {
strong_promise.set(globalThis, result);
if (node_response_jsvalue != .zero) {
JSC.Codegen.JSNodeHTTPResponse.promiseSetCached(node_response_jsvalue, globalThis, result);
}
needs_to_drain = false;
vm.drainMicrotasks();
}
@@ -6489,20 +6491,12 @@ pub fn NewServer(comptime NamespaceType: type, comptime ssl_enabled_: bool, comp
globalThis.handleRejectedPromises();
if (node_http_response) |node_response| {
if (node_response.flags.request_has_completed or node_response.flags.socket_closed or node_response.flags.upgraded) {
strong_promise.deinit();
if (node_response_jsvalue != .zero)
JSC.Codegen.JSNodeHTTPResponse.promiseSetCached(node_response_jsvalue, globalThis, .zero);
break :brk .{ .success = {} };
}
const strong_self = node_response.getThisValue();
if (strong_self.isEmptyOrUndefinedOrNull()) {
strong_promise.deinit();
break :brk .{ .success = {} };
}
node_response.promise = strong_promise;
strong_promise = .empty;
result._then2(globalThis, strong_self, NodeHTTPResponse.Bun__NodeHTTPRequest__onResolve, NodeHTTPResponse.Bun__NodeHTTPRequest__onReject);
result._then2(globalThis, node_response_jsvalue, NodeHTTPResponse.Bun__NodeHTTPRequest__onResolve, NodeHTTPResponse.Bun__NodeHTTPRequest__onReject);
is_async = true;
}
@@ -7613,6 +7607,7 @@ extern fn NodeHTTPServer__onRequest_http(
response: *uws.NewApp(false).Response,
upgrade_ctx: ?*uws.uws_socket_context_t,
node_response_ptr: *?*NodeHTTPResponse,
node_response_jsvalue: *JSC.JSValue,
) JSC.JSValue;
extern fn NodeHTTPServer__onRequest_https(
@@ -7624,6 +7619,7 @@ extern fn NodeHTTPServer__onRequest_https(
response: *uws.NewApp(true).Response,
upgrade_ctx: ?*uws.uws_socket_context_t,
node_response_ptr: *?*NodeHTTPResponse,
node_response_jsvalue: *JSC.JSValue,
) JSC.JSValue;
extern fn NodeHTTP_assignOnCloseFunction(bool, *anyopaque) void;

View File

@@ -6,7 +6,6 @@ js_ref: JSC.Ref = .{},
flags: Flags = .{},
body_read_state: BodyReadState = .none,
body_read_ref: JSC.Ref = .{},
promise: JSC.Strong = .empty,
server: AnyServer,
/// When you call pause() on the node:http IncomingMessage
@@ -598,16 +597,17 @@ pub fn onRequestComplete(this: *NodeHTTPResponse) void {
pub export fn Bun__NodeHTTPRequest__onResolve(globalObject: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(JSC.conv) JSC.JSValue {
log("onResolve", .{});
const arguments = callframe.arguments_old(2).slice();
const this: *NodeHTTPResponse = arguments[1].as(NodeHTTPResponse).?;
this.promise.deinit();
const this_jsvalue = arguments[1];
const this: *NodeHTTPResponse = this_jsvalue.as(NodeHTTPResponse).?;
defer this_jsvalue.ensureStillAlive();
JSC.Codegen.JSNodeHTTPResponse.promiseSetCached(this_jsvalue, globalObject, .zero);
defer this.deref();
this.maybeStopReadingBody(globalObject.bunVM(), arguments[1]);
if (!this.flags.request_has_completed and !this.flags.socket_closed) {
const this_value = this.getThisValue();
if (this_value != .zero) {
NodeHTTPResponse.onAbortedSetCached(this_value, globalObject, .zero);
}
JSC.Codegen.JSNodeHTTPResponse.onAbortedSetCached(this_jsvalue, globalObject, .zero);
this.raw_response.clearOnData();
this.raw_response.clearOnWritable();
this.raw_response.clearTimeout();
@@ -623,17 +623,17 @@ pub export fn Bun__NodeHTTPRequest__onResolve(globalObject: *JSC.JSGlobalObject,
pub export fn Bun__NodeHTTPRequest__onReject(globalObject: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(JSC.conv) JSC.JSValue {
const arguments = callframe.arguments_old(2).slice();
const err = arguments[0];
const this: *NodeHTTPResponse = arguments[1].as(NodeHTTPResponse).?;
this.promise.deinit();
this.maybeStopReadingBody(globalObject.bunVM(), arguments[1]);
const this_jsvalue = arguments[1];
const this: *NodeHTTPResponse = this_jsvalue.as(NodeHTTPResponse).?;
defer this_jsvalue.ensureStillAlive();
const vm = globalObject.bunVM();
this.maybeStopReadingBody(vm, this_jsvalue);
JSC.Codegen.JSNodeHTTPResponse.promiseSetCached(this_jsvalue, globalObject, .zero);
defer this.deref();
if (!this.flags.request_has_completed and !this.flags.socket_closed) {
const this_value = this.getThisValue();
if (this_value != .zero) {
NodeHTTPResponse.onAbortedSetCached(this_value, globalObject, .zero);
}
JSC.Codegen.JSNodeHTTPResponse.onAbortedSetCached(this_jsvalue, globalObject, .zero);
this.raw_response.clearOnData();
this.raw_response.clearOnWritable();
this.raw_response.clearTimeout();
@@ -644,7 +644,7 @@ pub export fn Bun__NodeHTTPRequest__onReject(globalObject: *JSC.JSGlobalObject,
this.onRequestComplete();
}
_ = globalObject.bunVM().uncaughtException(globalObject, err, true);
_ = vm.uncaughtException(globalObject, err, true);
return .undefined;
}
@@ -1063,10 +1063,10 @@ pub fn deinit(this: *NodeHTTPResponse) void {
bun.debugAssert(this.flags.socket_closed or this.flags.request_has_completed);
this.buffered_request_body_data_during_pause.deinitWithAllocator(bun.default_allocator);
this.js_ref.unref(JSC.VirtualMachine.get());
this.body_read_ref.unref(JSC.VirtualMachine.get());
const vm = JSC.VirtualMachine.get();
this.js_ref.unref(vm);
this.body_read_ref.unref(vm);
this.promise.deinit();
this.destroy();
}

View File

@@ -941,7 +941,8 @@ static EncodedJSValue NodeHTTPServer__onRequest(
uWS::HttpRequest* request,
uWS::HttpResponse<isSSL>* response,
void* upgrade_ctx,
void** nodeHttpResponsePtr)
void** nodeHttpResponsePtr,
EncodedJSValue* nodeHttpResponseValue)
{
auto& vm = globalObject->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
@@ -960,6 +961,7 @@ static EncodedJSValue NodeHTTPServer__onRequest(
bool hasBody = false;
WebCore::JSNodeHTTPResponse* nodeHTTPResponseObject = jsCast<WebCore::JSNodeHTTPResponse*>(JSValue::decode(NodeHTTPResponse__createForJS(any_server, globalObject, &hasBody, request, isSSL, response, upgrade_ctx, nodeHttpResponsePtr)));
*nodeHttpResponseValue = JSValue::encode(nodeHTTPResponseObject);
args.append(nodeHTTPResponseObject);
args.append(jsBoolean(hasBody));
@@ -1188,9 +1190,10 @@ extern "C" EncodedJSValue NodeHTTPServer__onRequest_http(
uWS::HttpRequest* request,
uWS::HttpResponse<false>* response,
void* upgrade_ctx,
void** nodeHttpResponsePtr)
void** nodeHttpResponsePtr,
EncodedJSValue* nodeHttpResponseValue)
{
return NodeHTTPServer__onRequest<false>(any_server, globalObject, JSValue::decode(thisValue), JSValue::decode(callback), request, response, upgrade_ctx, nodeHttpResponsePtr);
return NodeHTTPServer__onRequest<false>(any_server, globalObject, JSValue::decode(thisValue), JSValue::decode(callback), request, response, upgrade_ctx, nodeHttpResponsePtr, nodeHttpResponseValue);
}
extern "C" EncodedJSValue NodeHTTPServer__onRequest_https(
@@ -1201,9 +1204,10 @@ extern "C" EncodedJSValue NodeHTTPServer__onRequest_https(
uWS::HttpRequest* request,
uWS::HttpResponse<true>* response,
void* upgrade_ctx,
void** nodeHttpResponsePtr)
void** nodeHttpResponsePtr,
EncodedJSValue* nodeHttpResponseValue)
{
return NodeHTTPServer__onRequest<true>(any_server, globalObject, JSValue::decode(thisValue), JSValue::decode(callback), request, response, upgrade_ctx, nodeHttpResponsePtr);
return NodeHTTPServer__onRequest<true>(any_server, globalObject, JSValue::decode(thisValue), JSValue::decode(callback), request, response, upgrade_ctx, nodeHttpResponsePtr, nodeHttpResponseValue);
}
JSC_DEFINE_HOST_FUNCTION(jsHTTPAssignHeaders, (JSGlobalObject * globalObject, CallFrame* callFrame))