Acknowledge port-backed readable close

This commit is contained in:
Basilisk-Dev 2026-05-09 11:28:20 -04:00 • committed by wuggy
commit 9ea6c8f278

View file

@ -7104,14 +7104,15 @@ js::InitStreamExtras(JSContext* cx, HandleObject global)
var posted = tryPostReadableTransferPort(record.port, var posted = tryPostReadableTransferPort(record.port,
{ type: "error", value: error }); { type: "error", value: error });
if (!posted) { if (!posted) {
tryPostReadableTransferPort(record.port, { posted = tryPostReadableTransferPort(record.port, {
type: "error", type: "error",
name: error && error.name, name: error && error.name,
message: error && error.message message: error && error.message
}); });
} }
record.closed = true; record.closed = true;
closeReadableTransferPort(record.port); if (!posted)
closeReadableTransferPort(record.port);
} }
function requestReadableTransferPortChunk(state) { function requestReadableTransferPortChunk(state) {
@ -7160,8 +7161,8 @@ js::InitStreamExtras(JSContext* cx, HandleObject global)
if (result.done) { if (result.done) {
record.closed = true; record.closed = true;
tryPostReadableTransferPort(record.port, { type: "close" }); if (!tryPostReadableTransferPort(record.port, { type: "close" }))
closeReadableTransferPort(record.port); closeReadableTransferPort(record.port);
return; return;
} }
@ -7208,7 +7209,16 @@ js::InitStreamExtras(JSContext* cx, HandleObject global)
record.port.onmessage = function(event) { record.port.onmessage = function(event) {
var message = event.data; 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; return;
if (message.type === "pull") { if (message.type === "pull") {
@ -7282,13 +7292,22 @@ js::InitStreamExtras(JSContext* cx, HandleObject global)
if (message.type === "close") { if (message.type === "close") {
state.closed = true; state.closed = true;
try { state.controller.close(); } catch (e) {} try { state.controller.close(); } catch (e) {}
tryPostReadableTransferPort(port, { type: "closed" });
closeReadableTransferPort(port); closeReadableTransferPort(port);
return; return;
} }
if (message.type === "error") { if (message.type === "error") {
errorReadableTransferPortState( if (!state.errored) {
state, errorFromReadableTransferPortMessage(message)); state.errored = true;
try {
if (state.controller)
state.controller.error(
errorFromReadableTransferPortMessage(message));
} catch (e) {}
}
tryPostReadableTransferPort(port, { type: "closed" });
closeReadableTransferPort(port);
} }
}; };