diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 8b526c001004c5..242d337fd4b110 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -253,6 +253,7 @@ const kOptions = Symbol('options'); const kOwner = owner_symbol; const kOrigin = Symbol('origin'); const kPendingRequestCalls = Symbol('kPendingRequestCalls'); +const kPendingWriteCb = Symbol('kPendingWriteCb'); const kProceed = Symbol('proceed'); const kRemoteSettings = Symbol('remote-settings'); const kRequestAsyncResource = Symbol('requestAsyncResource'); @@ -2276,10 +2277,13 @@ class Http2Stream extends Duplex { cb(err); }; const writeCallback = (err) => { + if (!waitingForWriteCallback) return; + this[kPendingWriteCb] = null; waitingForWriteCallback = false; writeCallbackErr = err; done(); }; + this[kPendingWriteCb] = writeCallback; const endCheckCallback = (err) => { waitingForEndCheck = false; endCheckCallbackErr = err; @@ -2445,6 +2449,12 @@ class Http2Stream extends Duplex { closeStream(this, code, hasHandle ? kForceRstStream : kNoRstStream); this.push(null); + const pendingWriteCb = this[kPendingWriteCb]; + if (pendingWriteCb) { + this[kPendingWriteCb] = null; + pendingWriteCb(err); + } + if (hasHandle) { handle.destroy(); sessionState.streams.delete(id);