@samitouri / QOS-React-2 / commits / 60b5271a9a

[Flight] Call finishHaltedTask on sync aborted tasks in stream abort listeners (#33743)

This is the same as we do for currently rendering tasks. They get effectively sync aborted when the listener is invoked. We potentially miss out on some debug info in that case but that would only apply to any entries inside the stream which doesn't really have their own debug info anyway.

Sebastian Markbåge committed Jul 9, 2025 at 10:43 UTC 60b5271a9ad0e9eec2489b999ce774d39d09285b
1 file changed +6 -2
packages/react-server/src/ReactFlightServer.js
+6 -2
@@ -1079,8 +1079,9 @@ function serializeReadableStream(
1079 signal.removeEventListener('abort', abortStream);
1080 const reason = signal.reason;
1081 if (enableHalt && request.type === PRERENDER) {
1082 - haltTask(streamTask, request);
1082 request.abortableTasks.delete(streamTask);
1083 + haltTask(streamTask, request);
1084 + finishHaltedTask(streamTask, request);
1085 } else {
1086 // TODO: Make this use abortTask() instead.
1087 erroredTask(request, streamTask, reason);
@@ -1208,8 +1209,9 @@ function serializeAsyncIterable(
1209 signal.removeEventListener('abort', abortIterable);
1210 const reason = signal.reason;
1211 if (enableHalt && request.type === PRERENDER) {
1211 - haltTask(streamTask, request);
1212 request.abortableTasks.delete(streamTask);
1213 + haltTask(streamTask, request);
1214 + finishHaltedTask(streamTask, request);
1215 } else {
1216 // TODO: Make this use abortTask() instead.
1217 erroredTask(request, streamTask, signal.reason);
@@ -2968,7 +2970,9 @@ function serializeBlob(request: Request, blob: Blob): string {
2970 signal.removeEventListener('abort', abortBlob);
2971 const reason = signal.reason;
2972 if (enableHalt && request.type === PRERENDER) {
2973 + request.abortableTasks.delete(newTask);
2974 haltTask(newTask, request);
2975 + finishHaltedTask(newTask, request);
2976 } else {
2977 // TODO: Make this use abortTask() instead.
2978 erroredTask(request, newTask, reason);