From c7f575cdbea867f14b5ffe5f751461adcb6b9946 Mon Sep 17 00:00:00 2001 From: Basilisk-Dev Date: Fri, 8 May 2026 19:20:29 -0400 Subject: [PATCH] Suppress internal stream release rejections --- js/src/builtin/Stream.cpp | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/js/src/builtin/Stream.cpp b/js/src/builtin/Stream.cpp index daa3558b56..cd58798417 100644 --- a/js/src/builtin/Stream.cpp +++ b/js/src/builtin/Stream.cpp @@ -5965,6 +5965,24 @@ js::InitStreamExtras(JSContext* cx, HandleObject global) return Promise.reject(error); } + function silenceRejection(promise) { + try { + if (promise && typeof promise.catch === "function") + promise.catch(function() {}); + } catch (e) {} + } + + function releaseReaderLock(reader) { + try { silenceRejection(reader.closed); } catch (e) {} + try { reader.releaseLock(); } catch (e) {} + } + + function releaseWriterLock(writer) { + try { silenceRejection(writer.closed); } catch (e) {} + try { silenceRejection(writer.ready); } catch (e) {} + try { writer.releaseLock(); } catch (e) {} + } + function syncWritableWriterWithStream(writer, state) { var ws = writerState.get(writer); if (!ws || ws.stream === undefined) @@ -6530,8 +6548,8 @@ js::InitStreamExtras(JSContext* cx, HandleObject global) if (closed) return; closed = true; - try { reader.releaseLock(); } catch (e) {} - try { writer.releaseLock(); } catch (e) {} + releaseReaderLock(reader); + releaseWriterLock(writer); if (signal && signal.removeEventListener) signal.removeEventListener("abort", onAbort); } @@ -6704,12 +6722,12 @@ js::InitStreamExtras(JSContext* cx, HandleObject global) return this._reader.read().then(function(result) { if (result.done) { self._done = true; - self._reader.releaseLock(); + releaseReaderLock(self._reader); } return result; }, function(error) { self._done = true; - try { self._reader.releaseLock(); } catch (e) {} + releaseReaderLock(self._reader); throw error; }); }; @@ -6720,14 +6738,14 @@ js::InitStreamExtras(JSContext* cx, HandleObject global) this._done = true; var reader = this._reader; if (this._preventCancel) { - reader.releaseLock(); + releaseReaderLock(reader); return Promise.resolve({ value: value, done: true }); } return reader.cancel(value).then(function() { - reader.releaseLock(); + releaseReaderLock(reader); return { value: value, done: true }; }, function(error) { - try { reader.releaseLock(); } catch (e) {} + releaseReaderLock(reader); throw error; }); };