[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);