From 9ea6c8f278c9a901b932903035c2f465d79cdb41 Mon Sep 17 00:00:00 2001 From: Basilisk-Dev Date: Sat, 9 May 2026 11:28:20 -0400 Subject: [PATCH] Acknowledge port-backed readable close --- js/src/builtin/Stream.cpp | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/js/src/builtin/Stream.cpp b/js/src/builtin/Stream.cpp index cf2c0f016d..4b1c9e5411 100644 --- a/js/src/builtin/Stream.cpp +++ b/js/src/builtin/Stream.cpp @@ -7104,14 +7104,15 @@ js::InitStreamExtras(JSContext* cx, HandleObject global) var posted = tryPostReadableTransferPort(record.port, { type: "error", value: error }); if (!posted) { - tryPostReadableTransferPort(record.port, { + posted = tryPostReadableTransferPort(record.port, { type: "error", name: error && error.name, message: error && error.message }); } record.closed = true; - closeReadableTransferPort(record.port); + if (!posted) + closeReadableTransferPort(record.port); } function requestReadableTransferPortChunk(state) { @@ -7160,8 +7161,8 @@ js::InitStreamExtras(JSContext* cx, HandleObject global) if (result.done) { record.closed = true; - tryPostReadableTransferPort(record.port, { type: "close" }); - closeReadableTransferPort(record.port); + if (!tryPostReadableTransferPort(record.port, { type: "close" })) + closeReadableTransferPort(record.port); return; } @@ -7208,7 +7209,16 @@ js::InitStreamExtras(JSContext* cx, HandleObject global) record.port.onmessage = function(event) { var message = event.data; - if (!message || record.closed || record.canceled) + if (!message || record.canceled) + return; + + if (message.type === "closed") { + record.closed = true; + closeReadableTransferPort(record.port); + return; + } + + if (record.closed) return; if (message.type === "pull") { @@ -7282,13 +7292,22 @@ js::InitStreamExtras(JSContext* cx, HandleObject global) if (message.type === "close") { state.closed = true; try { state.controller.close(); } catch (e) {} + tryPostReadableTransferPort(port, { type: "closed" }); closeReadableTransferPort(port); return; } if (message.type === "error") { - errorReadableTransferPortState( - state, errorFromReadableTransferPortMessage(message)); + if (!state.errored) { + state.errored = true; + try { + if (state.controller) + state.controller.error( + errorFromReadableTransferPortMessage(message)); + } catch (e) {} + } + tryPostReadableTransferPort(port, { type: "closed" }); + closeReadableTransferPort(port); } };