From c52b23271acf9d96b317d75edd8a21b7eba2dc41 Mon Sep 17 00:00:00 2001 From: Efra Espada Date: Sun, 25 Oct 2026 04:55:43 +0100 Subject: [PATCH 1/3] bugfix-692-runtime-predecessor-queue-can-deadlock-per-pr-workflows-on-shared-runners: fix runtime predecessor deadlocks with verified native coordination --- README.md | 5 + build/cli/index.js | 1388 ++++++++--------- build/github_action/index.js | 1388 ++++++++--------- docs/features.mdx | 19 +- docs/pull-requests/workflow-setup.mdx | 11 + specs/CATALOG.md | 10 +- specs/catalog.json | 24 +- ...ecution-admission-queue-and-publication.md | 170 +- src/actions/__tests__/common_action.test.ts | 109 ++ src/actions/common_action.ts | 10 +- src/actions/main_run_lifecycle.ts | 18 +- ...ative_workflow_coordination_policy.test.ts | 61 + .../native_workflow_coordination_policy.ts | 42 + src/application/ports/workflow_run_ports.ts | 16 + ...or_previous_workflow_runs_use_case.test.ts | 43 + ...ait_for_previous_workflow_runs_use_case.ts | 11 + ...e_workflow_coordination_repository.test.ts | 87 ++ ...native_workflow_coordination_repository.ts | 48 + .../workflow_queue_composition_root.ts | 18 +- .../ports/github_workflow_provider_ports.ts | 8 + ..._workflow_polling_observer_adapter.test.ts | 2 + ...ogger_workflow_polling_observer_adapter.ts | 4 + 22 files changed, 1954 insertions(+), 1538 deletions(-) create mode 100644 src/application/policies/__tests__/native_workflow_coordination_policy.test.ts create mode 100644 src/application/policies/native_workflow_coordination_policy.ts create mode 100644 src/data/repository/workflow/__tests__/native_workflow_coordination_repository.test.ts create mode 100644 src/data/repository/workflow/native_workflow_coordination_repository.ts diff --git a/README.md b/README.md index 8917d7d1c..02a72f41d 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,11 @@ flowchart LR AI capabilities require a configured agent runtime, an allowed model, and working authentication on the selected runner. Code-changing requests require repository write authority and run configured verification before commit/push. Release promotion follows the repository's merge policy. Installing Copilot does not grant permission to merge or deploy. +On shared runners, the runtime verifies the executing workflow's native PR or +branch concurrency before setup, so unrelated PRs can proceed independently. +Custom and legacy workflows retain the conservative predecessor queue. See +[workflow coordination and recovery](https://docs.page/vypdev/copilot/features#workflow-concurrency-and-sequential-execution). + ## Start with the web assistant Use **Node.js 24 or newer**, `pnpm`, and a working checkout of the repository you want to configure: diff --git a/build/cli/index.js b/build/cli/index.js index 0960966fa..51fd20e99 100755 --- a/build/cli/index.js +++ b/build/cli/index.js @@ -2140,7 +2140,7 @@ exports.getProxyAgentDispatcher = getProxyAgentDispatcher; exports.getProxyFetch = getProxyFetch; exports.getApiBaseUrl = getApiBaseUrl; const httpClient = __importStar(__nccwpck_require__(75784)); -const undici_1 = __nccwpck_require__(31241); +const undici_1 = __nccwpck_require__(18381); function getAuthString(token, options) { if (!token && !options.auth) { throw new Error('Parameter token or opts.auth is required'); @@ -2392,7 +2392,7 @@ const http = __importStar(__nccwpck_require__(13685)); const https = __importStar(__nccwpck_require__(95687)); const pm = __importStar(__nccwpck_require__(34583)); const tunnel = __importStar(__nccwpck_require__(64249)); -const undici_1 = __nccwpck_require__(31241); +const undici_1 = __nccwpck_require__(18381); var HttpCodes; (function (HttpCodes) { HttpCodes[HttpCodes["OK"] = 200] = "OK"; @@ -8504,34 +8504,34 @@ exports.debug = debug; // for test /***/ }), -/***/ 31241: +/***/ 18381: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const Client = __nccwpck_require__(6237) -const Dispatcher = __nccwpck_require__(32171) -const Pool = __nccwpck_require__(49771) -const BalancedPool = __nccwpck_require__(88214) -const Agent = __nccwpck_require__(1880) -const ProxyAgent = __nccwpck_require__(57912) -const EnvHttpProxyAgent = __nccwpck_require__(42547) -const RetryAgent = __nccwpck_require__(42626) -const errors = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) +const Client = __nccwpck_require__(85849) +const Dispatcher = __nccwpck_require__(66071) +const Pool = __nccwpck_require__(80229) +const BalancedPool = __nccwpck_require__(68255) +const Agent = __nccwpck_require__(73274) +const ProxyAgent = __nccwpck_require__(87187) +const EnvHttpProxyAgent = __nccwpck_require__(29941) +const RetryAgent = __nccwpck_require__(55184) +const errors = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) const { InvalidArgumentError } = errors -const api = __nccwpck_require__(39663) -const buildConnector = __nccwpck_require__(63447) -const MockClient = __nccwpck_require__(69636) -const MockAgent = __nccwpck_require__(89937) -const MockPool = __nccwpck_require__(40660) -const mockErrors = __nccwpck_require__(33519) -const RetryHandler = __nccwpck_require__(12671) -const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(53139) -const DecoratorHandler = __nccwpck_require__(59280) -const RedirectHandler = __nccwpck_require__(90008) -const createRedirectInterceptor = __nccwpck_require__(91467) +const api = __nccwpck_require__(20617) +const buildConnector = __nccwpck_require__(41429) +const MockClient = __nccwpck_require__(4227) +const MockAgent = __nccwpck_require__(46432) +const MockPool = __nccwpck_require__(36575) +const mockErrors = __nccwpck_require__(19329) +const RetryHandler = __nccwpck_require__(64524) +const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(19405) +const DecoratorHandler = __nccwpck_require__(41738) +const RedirectHandler = __nccwpck_require__(64014) +const createRedirectInterceptor = __nccwpck_require__(40928) Object.assign(Dispatcher.prototype, api) @@ -8549,10 +8549,10 @@ module.exports.DecoratorHandler = DecoratorHandler module.exports.RedirectHandler = RedirectHandler module.exports.createRedirectInterceptor = createRedirectInterceptor module.exports.interceptors = { - redirect: __nccwpck_require__(42182), - retry: __nccwpck_require__(17389), - dump: __nccwpck_require__(9408), - dns: __nccwpck_require__(26290) + redirect: __nccwpck_require__(74872), + retry: __nccwpck_require__(79637), + dump: __nccwpck_require__(12493), + dns: __nccwpck_require__(20346) } module.exports.buildConnector = buildConnector @@ -8614,7 +8614,7 @@ function makeDispatcher (fn) { module.exports.setGlobalDispatcher = setGlobalDispatcher module.exports.getGlobalDispatcher = getGlobalDispatcher -const fetchImpl = (__nccwpck_require__(87321).fetch) +const fetchImpl = (__nccwpck_require__(78329).fetch) module.exports.fetch = async function fetch (init, options = undefined) { try { return await fetchImpl(init, options) @@ -8626,39 +8626,39 @@ module.exports.fetch = async function fetch (init, options = undefined) { throw err } } -module.exports.Headers = __nccwpck_require__(33924).Headers -module.exports.Response = __nccwpck_require__(63042).Response -module.exports.Request = __nccwpck_require__(11192).Request -module.exports.FormData = __nccwpck_require__(59550).FormData +module.exports.Headers = __nccwpck_require__(10561).Headers +module.exports.Response = __nccwpck_require__(51132).Response +module.exports.Request = __nccwpck_require__(83211).Request +module.exports.FormData = __nccwpck_require__(62598).FormData module.exports.File = globalThis.File ?? (__nccwpck_require__(72254).File) -module.exports.FileReader = __nccwpck_require__(62596).FileReader +module.exports.FileReader = __nccwpck_require__(65153).FileReader -const { setGlobalOrigin, getGlobalOrigin } = __nccwpck_require__(22407) +const { setGlobalOrigin, getGlobalOrigin } = __nccwpck_require__(13924) module.exports.setGlobalOrigin = setGlobalOrigin module.exports.getGlobalOrigin = getGlobalOrigin -const { CacheStorage } = __nccwpck_require__(13256) -const { kConstruct } = __nccwpck_require__(275) +const { CacheStorage } = __nccwpck_require__(11069) +const { kConstruct } = __nccwpck_require__(50591) // Cache & CacheStorage are tightly coupled with fetch. Even if it may run // in an older version of Node, it doesn't have any use without fetch. module.exports.caches = new CacheStorage(kConstruct) -const { deleteCookie, getCookies, getSetCookies, setCookie } = __nccwpck_require__(84245) +const { deleteCookie, getCookies, getSetCookies, setCookie } = __nccwpck_require__(15855) module.exports.deleteCookie = deleteCookie module.exports.getCookies = getCookies module.exports.getSetCookies = getSetCookies module.exports.setCookie = setCookie -const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(68889) +const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(96730) module.exports.parseMIMEType = parseMIMEType module.exports.serializeAMimeType = serializeAMimeType -const { CloseEvent, ErrorEvent, MessageEvent } = __nccwpck_require__(85021) -module.exports.WebSocket = __nccwpck_require__(43590).WebSocket +const { CloseEvent, ErrorEvent, MessageEvent } = __nccwpck_require__(69459) +module.exports.WebSocket = __nccwpck_require__(16416).WebSocket module.exports.CloseEvent = CloseEvent module.exports.ErrorEvent = ErrorEvent module.exports.MessageEvent = MessageEvent @@ -8674,18 +8674,18 @@ module.exports.MockPool = MockPool module.exports.MockAgent = MockAgent module.exports.mockErrors = mockErrors -const { EventSource } = __nccwpck_require__(74292) +const { EventSource } = __nccwpck_require__(6731) module.exports.EventSource = EventSource /***/ }), -/***/ 44378: +/***/ 97433: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const { addAbortListener } = __nccwpck_require__(31014) -const { RequestAbortedError } = __nccwpck_require__(47926) +const { addAbortListener } = __nccwpck_require__(50011) +const { RequestAbortedError } = __nccwpck_require__(35990) const kListener = Symbol('kListener') const kSignal = Symbol('kSignal') @@ -8745,7 +8745,7 @@ module.exports = { /***/ }), -/***/ 48105: +/***/ 93671: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -8753,9 +8753,9 @@ module.exports = { const assert = __nccwpck_require__(98061) const { AsyncResource } = __nccwpck_require__(92761) -const { InvalidArgumentError, SocketError } = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) -const { addSignal, removeSignal } = __nccwpck_require__(44378) +const { InvalidArgumentError, SocketError } = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) +const { addSignal, removeSignal } = __nccwpck_require__(97433) class ConnectHandler extends AsyncResource { constructor (opts, callback) { @@ -8861,7 +8861,7 @@ module.exports = connect /***/ }), -/***/ 25050: +/***/ 281: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -8876,10 +8876,10 @@ const { InvalidArgumentError, InvalidReturnValueError, RequestAbortedError -} = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) +} = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) const { AsyncResource } = __nccwpck_require__(92761) -const { addSignal, removeSignal } = __nccwpck_require__(44378) +const { addSignal, removeSignal } = __nccwpck_require__(97433) const assert = __nccwpck_require__(98061) const kResume = Symbol('resume') @@ -9120,17 +9120,17 @@ module.exports = pipeline /***/ }), -/***/ 53067: +/***/ 26562: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { Readable } = __nccwpck_require__(67646) -const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) -const { getResolveErrorBodyCallback } = __nccwpck_require__(78393) +const { Readable } = __nccwpck_require__(93401) +const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) +const { getResolveErrorBodyCallback } = __nccwpck_require__(80710) const { AsyncResource } = __nccwpck_require__(92761) class RequestHandler extends AsyncResource { @@ -9342,7 +9342,7 @@ module.exports.RequestHandler = RequestHandler /***/ }), -/***/ 21890: +/***/ 75059: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -9350,11 +9350,11 @@ module.exports.RequestHandler = RequestHandler const assert = __nccwpck_require__(98061) const { finished, PassThrough } = __nccwpck_require__(84492) -const { InvalidArgumentError, InvalidReturnValueError } = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) -const { getResolveErrorBodyCallback } = __nccwpck_require__(78393) +const { InvalidArgumentError, InvalidReturnValueError } = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) +const { getResolveErrorBodyCallback } = __nccwpck_require__(80710) const { AsyncResource } = __nccwpck_require__(92761) -const { addSignal, removeSignal } = __nccwpck_require__(44378) +const { addSignal, removeSignal } = __nccwpck_require__(97433) class StreamHandler extends AsyncResource { constructor (opts, factory, callback) { @@ -9570,16 +9570,16 @@ module.exports = stream /***/ }), -/***/ 94422: +/***/ 23792: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { InvalidArgumentError, SocketError } = __nccwpck_require__(47926) +const { InvalidArgumentError, SocketError } = __nccwpck_require__(35990) const { AsyncResource } = __nccwpck_require__(92761) -const util = __nccwpck_require__(31014) -const { addSignal, removeSignal } = __nccwpck_require__(44378) +const util = __nccwpck_require__(50011) +const { addSignal, removeSignal } = __nccwpck_require__(97433) const assert = __nccwpck_require__(98061) class UpgradeHandler extends AsyncResource { @@ -9686,22 +9686,22 @@ module.exports = upgrade /***/ }), -/***/ 39663: +/***/ 20617: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -module.exports.request = __nccwpck_require__(53067) -module.exports.stream = __nccwpck_require__(21890) -module.exports.pipeline = __nccwpck_require__(25050) -module.exports.upgrade = __nccwpck_require__(94422) -module.exports.connect = __nccwpck_require__(48105) +module.exports.request = __nccwpck_require__(26562) +module.exports.stream = __nccwpck_require__(75059) +module.exports.pipeline = __nccwpck_require__(281) +module.exports.upgrade = __nccwpck_require__(23792) +module.exports.connect = __nccwpck_require__(93671) /***/ }), -/***/ 67646: +/***/ 93401: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -9711,9 +9711,9 @@ module.exports.connect = __nccwpck_require__(48105) const assert = __nccwpck_require__(98061) const { Readable } = __nccwpck_require__(84492) -const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) -const { ReadableStreamFrom } = __nccwpck_require__(31014) +const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) +const { ReadableStreamFrom } = __nccwpck_require__(50011) const kConsume = Symbol('kConsume') const kReading = Symbol('kReading') @@ -10094,15 +10094,15 @@ module.exports = { Readable: BodyReadable, chunksDecode } /***/ }), -/***/ 78393: +/***/ 80710: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { const assert = __nccwpck_require__(98061) const { ResponseStatusCodeError -} = __nccwpck_require__(47926) +} = __nccwpck_require__(35990) -const { chunksDecode } = __nccwpck_require__(67646) +const { chunksDecode } = __nccwpck_require__(93401) const CHUNK_LIMIT = 128 * 1024 async function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) { @@ -10194,7 +10194,7 @@ module.exports = { /***/ }), -/***/ 63447: +/***/ 41429: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -10202,9 +10202,9 @@ module.exports = { const net = __nccwpck_require__(87503) const assert = __nccwpck_require__(98061) -const util = __nccwpck_require__(31014) -const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(47926) -const timers = __nccwpck_require__(63125) +const util = __nccwpck_require__(50011) +const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(35990) +const timers = __nccwpck_require__(77512) function noop () {} @@ -10442,7 +10442,7 @@ module.exports = buildConnector /***/ }), -/***/ 91362: +/***/ 53451: /***/ ((module) => { "use strict"; @@ -10568,7 +10568,7 @@ module.exports = { /***/ }), -/***/ 96005: +/***/ 65543: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -10778,7 +10778,7 @@ module.exports = { /***/ }), -/***/ 47926: +/***/ 35990: /***/ ((module) => { "use strict"; @@ -11211,7 +11211,7 @@ module.exports = { /***/ }), -/***/ 82075: +/***/ 13484: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -11220,7 +11220,7 @@ module.exports = { const { InvalidArgumentError, NotSupportedError -} = __nccwpck_require__(47926) +} = __nccwpck_require__(35990) const assert = __nccwpck_require__(98061) const { isValidHTTPToken, @@ -11235,9 +11235,9 @@ const { validateHandler, getServerName, normalizedMethodRecords -} = __nccwpck_require__(31014) -const { channels } = __nccwpck_require__(96005) -const { headerNameLowerCasedRecord } = __nccwpck_require__(91362) +} = __nccwpck_require__(50011) +const { channels } = __nccwpck_require__(65543) +const { headerNameLowerCasedRecord } = __nccwpck_require__(53451) // Verifies that a given path is valid does not contain control chars \x00 to \x20 const invalidPathRegex = /[^\u0021-\u00ff]/ @@ -11480,77 +11480,11 @@ class Request { } } - /** - * @param {number|null} statusCode - * @param {Buffer[]|null} headers - * @param {import('node:stream').Duplex} socket - * @param {string} [statusText] - */ - onUpgrade (statusCode, headers, socket, statusText = '') { - this.onFinally() - + onUpgrade (statusCode, headers, socket) { assert(!this.aborted) assert(!this.completed) - if (statusCode !== null) { - this.#publishUpgradeHeaders(statusCode, headers, statusText) - } - - const result = this[kHandler].onUpgrade(statusCode, headers, socket) - - if (!this.aborted) { - this.completed = true - if (statusCode !== null) { - this.#publishUpgradeTrailers() - } - } - - return result - } - - /** - * @param {number} statusCode - * @param {import('node:http2').IncomingHttpHeaders} headers - * @param {(headers: import('node:http2').IncomingHttpHeaders) => Buffer[]} parseHeaders - * @param {string} [statusText] - */ - onUpgradeResponse (statusCode, headers, parseHeaders, statusText = '') { - assert(!this.aborted) - assert(this.completed) - - if (channels.headers.hasSubscribers) { - this.#publishUpgradeHeaders(statusCode, parseHeaders(headers), statusText) - } - this.#publishUpgradeTrailers() - } - - /** - * @param {Error} error - */ - onUpgradeError (error) { - assert(!this.aborted) - assert(this.completed) - - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }) - } - } - - /** - * @param {number} statusCode - * @param {Buffer[]} headers - * @param {string} statusText - */ - #publishUpgradeHeaders (statusCode, headers, statusText) { - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) - } - } - - #publishUpgradeTrailers () { - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers: [] }) - } + return this[kHandler].onUpgrade(statusCode, headers, socket) } onComplete (trailers) { @@ -11701,7 +11635,7 @@ module.exports = Request /***/ }), -/***/ 94822: +/***/ 13638: /***/ ((module) => { module.exports = { @@ -11775,7 +11709,7 @@ module.exports = { /***/ }), -/***/ 52731: +/***/ 30723: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -11784,7 +11718,7 @@ module.exports = { const { wellknownHeaderNames, headerNameLowerCasedRecord -} = __nccwpck_require__(91362) +} = __nccwpck_require__(53451) class TstNode { /** @type {any} */ @@ -11935,14 +11869,14 @@ module.exports = { /***/ }), -/***/ 31014: +/***/ 50011: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { kDestroyed, kBodyUsed, kListeners, kBody } = __nccwpck_require__(94822) +const { kDestroyed, kBodyUsed, kListeners, kBody } = __nccwpck_require__(13638) const { IncomingMessage } = __nccwpck_require__(88849) const stream = __nccwpck_require__(84492) const net = __nccwpck_require__(87503) @@ -11950,9 +11884,9 @@ const { Blob } = __nccwpck_require__(72254) const nodeUtil = __nccwpck_require__(47261) const { stringify } = __nccwpck_require__(39630) const { EventEmitter: EE } = __nccwpck_require__(15673) -const { InvalidArgumentError } = __nccwpck_require__(47926) -const { headerNameLowerCasedRecord } = __nccwpck_require__(91362) -const { tree } = __nccwpck_require__(52731) +const { InvalidArgumentError } = __nccwpck_require__(35990) +const { headerNameLowerCasedRecord } = __nccwpck_require__(53451) +const { tree } = __nccwpck_require__(30723) const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) @@ -12662,19 +12596,19 @@ module.exports = { /***/ }), -/***/ 1880: +/***/ 73274: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { InvalidArgumentError } = __nccwpck_require__(47926) -const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(94822) -const DispatcherBase = __nccwpck_require__(26844) -const Pool = __nccwpck_require__(49771) -const Client = __nccwpck_require__(6237) -const util = __nccwpck_require__(31014) -const createRedirectInterceptor = __nccwpck_require__(91467) +const { InvalidArgumentError } = __nccwpck_require__(35990) +const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(13638) +const DispatcherBase = __nccwpck_require__(39504) +const Pool = __nccwpck_require__(80229) +const Client = __nccwpck_require__(85849) +const util = __nccwpck_require__(50011) +const createRedirectInterceptor = __nccwpck_require__(40928) const kOnConnect = Symbol('onConnect') const kOnDisconnect = Symbol('onDisconnect') @@ -12691,7 +12625,7 @@ function defaultFactory (origin, opts) { } class Agent extends DispatcherBase { - constructor ({ factory = defaultFactory, maxRedirections = 0, connect, tls, ...options } = {}) { + constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { if (typeof factory !== 'function') { throw new InvalidArgumentError('factory must be a function.') } @@ -12710,15 +12644,11 @@ class Agent extends DispatcherBase { connect = { ...connect } } - if (tls && typeof tls !== 'function') { - tls = { ...tls } - } - this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })] - this[kOptions] = { ...util.deepClone(options), connect, tls } + this[kOptions] = { ...util.deepClone(options), connect } this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : undefined @@ -12803,7 +12733,7 @@ module.exports = Agent /***/ }), -/***/ 88214: +/***/ 68255: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -12812,7 +12742,7 @@ module.exports = Agent const { BalancedPoolMissingUpstreamError, InvalidArgumentError -} = __nccwpck_require__(47926) +} = __nccwpck_require__(35990) const { PoolBase, kClients, @@ -12820,10 +12750,10 @@ const { kAddClient, kRemoveClient, kGetDispatcher -} = __nccwpck_require__(97367) -const Pool = __nccwpck_require__(49771) -const { kUrl, kInterceptors } = __nccwpck_require__(94822) -const { parseOrigin } = __nccwpck_require__(31014) +} = __nccwpck_require__(1467) +const Pool = __nccwpck_require__(80229) +const { kUrl, kInterceptors } = __nccwpck_require__(13638) +const { parseOrigin } = __nccwpck_require__(50011) const kFactory = Symbol('factory') const kOptions = Symbol('options') @@ -13020,7 +12950,7 @@ module.exports = BalancedPool /***/ }), -/***/ 78365: +/***/ 14429: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -13029,9 +12959,9 @@ module.exports = BalancedPool /* global WebAssembly */ const assert = __nccwpck_require__(98061) -const util = __nccwpck_require__(31014) -const { channels } = __nccwpck_require__(96005) -const timers = __nccwpck_require__(63125) +const util = __nccwpck_require__(50011) +const { channels } = __nccwpck_require__(65543) +const timers = __nccwpck_require__(77512) const { RequestContentLengthMismatchError, ResponseContentLengthMismatchError, @@ -13044,7 +12974,7 @@ const { BodyTimeoutError, HTTPParserError, ResponseExceededMaxSizeError -} = __nccwpck_require__(47926) +} = __nccwpck_require__(35990) const { kUrl, kReset, @@ -13077,9 +13007,9 @@ const { kOnError, kResume, kHTTPContext -} = __nccwpck_require__(94822) +} = __nccwpck_require__(13638) -const constants = __nccwpck_require__(27692) +const constants = __nccwpck_require__(41721) const EMPTY_BUF = Buffer.alloc(0) const FastBuffer = Buffer[Symbol.species] const addListener = util.addListener @@ -13091,11 +13021,11 @@ const kSocketUsed = Symbol('kSocketUsed') let extractBody async function lazyllhttp () { - const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(84888) : undefined + const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(46081) : undefined let mod try { - mod = await WebAssembly.compile(__nccwpck_require__(31445)) + mod = await WebAssembly.compile(__nccwpck_require__(97877)) } catch (e) { /* istanbul ignore next */ @@ -13103,7 +13033,7 @@ async function lazyllhttp () { // being enabled, but the occurring of this other error // * https://github.com/emscripten-core/emscripten/issues/11495 // got me to remove that check to avoid breaking Node 12. - mod = await WebAssembly.compile(llhttpWasmData || __nccwpck_require__(84888)) + mod = await WebAssembly.compile(llhttpWasmData || __nccwpck_require__(46081)) } return await WebAssembly.instantiate(mod, { @@ -13458,7 +13388,7 @@ class Parser { } onUpgrade (head) { - const { upgrade, client, socket, headers, statusCode, statusText } = this + const { upgrade, client, socket, headers, statusCode } = this assert(upgrade) assert(client[kSocket] === socket) @@ -13493,10 +13423,9 @@ class Parser { client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')) try { - request.onUpgrade(statusCode, headers, socket, statusText) - } catch (error) { - util.errorRequest(client, request, error) - util.destroy(socket, error) + request.onUpgrade(statusCode, headers, socket) + } catch (err) { + util.destroy(socket, err) } client[kResume]() @@ -13753,6 +13682,8 @@ async function connectH1 (client, socket) { socket[kParser] = new Parser(client, socket, llhttpInstance) addListener(socket, 'error', function (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') + const parser = this[kParser] // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded @@ -14018,7 +13949,7 @@ function writeH1 (client, request) { if (util.isFormDataLike(body)) { if (!extractBody) { - extractBody = (__nccwpck_require__(48203).extractBody) + extractBody = (__nccwpck_require__(12749).extractBody) } const [bodyStream, contentType] = extractBody(body) @@ -14075,22 +14006,12 @@ function writeH1 (client, request) { const socket = client[kSocket] clearIdleSocketValidation(socket) - /** - * @param {Error} [error] - */ - const abort = (error) => { - if (request.aborted) { - return - } - - if (request.completed) { - if (request.upgrade || request.method === 'CONNECT') { - util.destroy(socket, new InformationalError('aborted')) - } + const abort = (err) => { + if (request.aborted || request.completed) { return } - util.errorRequest(client, request, error || new RequestAbortedError()) + util.errorRequest(client, request, err || new RequestAbortedError()) util.destroy(body) util.destroy(socket, new InformationalError('aborted')) @@ -14541,22 +14462,21 @@ module.exports = connectH1 /***/ }), -/***/ 55267: +/***/ 34879: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { errorMonitor } = __nccwpck_require__(15673) const { pipeline } = __nccwpck_require__(84492) -const util = __nccwpck_require__(31014) +const util = __nccwpck_require__(50011) const { RequestContentLengthMismatchError, RequestAbortedError, SocketError, InformationalError -} = __nccwpck_require__(47926) +} = __nccwpck_require__(35990) const { kUrl, kReset, @@ -14575,7 +14495,7 @@ const { kResume, kSize, kHTTPContext -} = __nccwpck_require__(94822) +} = __nccwpck_require__(13638) const kOpenStreams = Symbol('open streams') @@ -14625,15 +14545,6 @@ function parseH2Headers (headers) { return result } -/** - * @param {import('node:http2').IncomingHttpHeaders} headers - * @returns {Buffer[]} - */ -function parseH2ResponseHeaders (headers) { - const { [HTTP2_HEADER_STATUS]: _statusCode, ...realHeaders } = headers - return parseH2Headers(realHeaders) -} - async function connectH2 (client, socket) { client[kSocket] = socket @@ -14683,6 +14594,8 @@ async function connectH2 (client, socket) { socket[kHTTP2Session] = session util.addListener(socket, 'error', function (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') + this[kError] = err this[kClient][kOnError](err) @@ -14756,6 +14669,8 @@ function resumeH2 (client) { } function onHttp2SessionError (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') + this[kSocket][kError] = err this[kClient][kOnError](err) } @@ -14850,32 +14765,22 @@ function writeH2 (client, request) { headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}` headers[HTTP2_HEADER_METHOD] = method - /** - * @param {Error} [error] - */ - const abort = (error) => { - if (request.aborted) { + const abort = (err) => { + if (request.aborted || request.completed) { return } - if (request.completed) { - if (method === 'CONNECT' && stream != null) { - util.destroy(stream, error || new RequestAbortedError()) - } - return - } - - error = error || new RequestAbortedError() + err = err || new RequestAbortedError() - util.errorRequest(client, request, error) + util.errorRequest(client, request, err) if (stream != null) { - util.destroy(stream, error) + util.destroy(stream, err) } // We do not destroy the socket as we can continue using the session // the stream get's destroyed and the session remains to create new streams - util.destroy(body, error) + util.destroy(body, err) client[kQueue][client[kRunningIdx]++] = null client[kResume]() } @@ -14894,57 +14799,25 @@ function writeH2 (client, request) { if (method === 'CONNECT') { session.ref() + // We are already connected, streams are pending, first request + // will create a new stream. We trigger a request to create the stream and wait until + // `ready` event is triggered // We disabled endStream to allow the user to write to the stream stream = session.request(headers, { endStream: false, signal }) - let upgradeResponseFinished = false - - /** - * @param {import('node:http2').IncomingHttpHeaders} headers - */ - const onResponse = (headers) => { - upgradeResponseFinished = true - stream.off(errorMonitor, onUpgradeError) - request.onUpgradeResponse(Number(headers[HTTP2_HEADER_STATUS]), headers, parseH2ResponseHeaders) - } - - /** - * @param {Error} error - */ - const onUpgradeError = (error) => { - upgradeResponseFinished = true - stream.off('response', onResponse) - request.onUpgradeError(error) - } - const onReady = () => { - try { - request.onUpgrade(null, null, stream) - } catch (error) { - stream.off('response', onResponse) - abort(error) - return - } - - if (request.aborted) { - return - } - - stream.off('error', abort) - stream.once(errorMonitor, onUpgradeError) + if (stream.id && !stream.pending) { + request.onUpgrade(null, null, stream) + ++session[kOpenStreams] client[kQueue][client[kRunningIdx]++] = null + } else { + stream.once('ready', () => { + request.onUpgrade(null, null, stream) + ++session[kOpenStreams] + client[kQueue][client[kRunningIdx]++] = null + }) } - stream.once('response', onResponse) - stream.once('error', abort) - ++session[kOpenStreams] - onReady() - stream.once('close', () => { - if (!upgradeResponseFinished && request.completed) { - stream.off('response', onResponse) - stream.off(errorMonitor, onUpgradeError) - request.onUpgradeError(new InformationalError(`HTTP/2: "stream error" received - code ${stream.rstCode}`)) - } session[kOpenStreams] -= 1 if (session[kOpenStreams] === 0) session.unref() }) @@ -14981,7 +14854,7 @@ function writeH2 (client, request) { let contentLength = util.bodyLength(body) if (util.isFormDataLike(body)) { - extractBody ??= (__nccwpck_require__(48203).extractBody) + extractBody ??= (__nccwpck_require__(12749).extractBody) const [bodyStream, contentType] = extractBody(body) headers['content-type'] = contentType @@ -15341,7 +15214,7 @@ module.exports = connectH2 /***/ }), -/***/ 6237: +/***/ 85849: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -15352,16 +15225,16 @@ module.exports = connectH2 const assert = __nccwpck_require__(98061) const net = __nccwpck_require__(87503) const http = __nccwpck_require__(88849) -const util = __nccwpck_require__(31014) -const { channels } = __nccwpck_require__(96005) -const Request = __nccwpck_require__(82075) -const DispatcherBase = __nccwpck_require__(26844) +const util = __nccwpck_require__(50011) +const { channels } = __nccwpck_require__(65543) +const Request = __nccwpck_require__(13484) +const DispatcherBase = __nccwpck_require__(39504) const { InvalidArgumentError, InformationalError, ClientDestroyedError -} = __nccwpck_require__(47926) -const buildConnector = __nccwpck_require__(63447) +} = __nccwpck_require__(35990) +const buildConnector = __nccwpck_require__(41429) const { kUrl, kServerName, @@ -15403,9 +15276,9 @@ const { kHTTPContext, kMaxConcurrentStreams, kResume -} = __nccwpck_require__(94822) -const connectH1 = __nccwpck_require__(78365) -const connectH2 = __nccwpck_require__(55267) +} = __nccwpck_require__(13638) +const connectH1 = __nccwpck_require__(14429) +const connectH2 = __nccwpck_require__(34879) let deprecatedInterceptorWarned = false const kClosedResolve = Symbol('kClosedResolve') @@ -15454,10 +15327,9 @@ class Client extends DispatcherBase { // h2 maxConcurrentStreams, allowH2, - webSocket, - eventSource + webSocket } = {}) { - super({ webSocket, eventSource }) + super({ webSocket }) if (keepAlive !== undefined) { throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') @@ -15713,7 +15585,7 @@ class Client extends DispatcherBase { } } -const createRedirectInterceptor = __nccwpck_require__(91467) +const createRedirectInterceptor = __nccwpck_require__(40928) function onError (client, err) { if ( @@ -15973,26 +15845,24 @@ module.exports = Client /***/ }), -/***/ 26844: +/***/ 39504: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const buffer = __nccwpck_require__(72254) -const Dispatcher = __nccwpck_require__(32171) +const Dispatcher = __nccwpck_require__(66071) const { ClientDestroyedError, ClientClosedError, InvalidArgumentError -} = __nccwpck_require__(47926) -const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = __nccwpck_require__(94822) +} = __nccwpck_require__(35990) +const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = __nccwpck_require__(13638) const kOnDestroyed = Symbol('onDestroyed') const kOnClosed = Symbol('onClosed') const kInterceptedDispatch = Symbol('Intercepted Dispatch') const kWebSocketOptions = Symbol('webSocketOptions') -const kEventSourceOptions = Symbol('eventSourceOptions') class DispatcherBase extends Dispatcher { constructor (opts) { @@ -16003,7 +15873,6 @@ class DispatcherBase extends Dispatcher { this[kClosed] = false this[kOnClosed] = [] this[kWebSocketOptions] = opts?.webSocket ?? {} - this[kEventSourceOptions] = opts?.eventSource ?? {} } get webSocketOptions () { @@ -16013,12 +15882,6 @@ class DispatcherBase extends Dispatcher { } } - get eventSourceOptions () { - return { - maxEventSize: this[kEventSourceOptions].maxEventSize ?? buffer.kStringMaxLength - } - } - get destroyed () { return this[kDestroyed] } @@ -16189,7 +16052,7 @@ module.exports = DispatcherBase /***/ }), -/***/ 32171: +/***/ 66071: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -16262,16 +16125,16 @@ module.exports = Dispatcher /***/ }), -/***/ 42547: +/***/ 29941: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const DispatcherBase = __nccwpck_require__(26844) -const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = __nccwpck_require__(94822) -const ProxyAgent = __nccwpck_require__(57912) -const Agent = __nccwpck_require__(1880) +const DispatcherBase = __nccwpck_require__(39504) +const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = __nccwpck_require__(13638) +const ProxyAgent = __nccwpck_require__(87187) +const Agent = __nccwpck_require__(73274) const DEFAULT_PORTS = { 'http:': 80, @@ -16430,7 +16293,7 @@ module.exports = EnvHttpProxyAgent /***/ }), -/***/ 94856: +/***/ 27092: /***/ ((module) => { "use strict"; @@ -16555,16 +16418,16 @@ module.exports = class FixedQueue { /***/ }), -/***/ 97367: +/***/ 1467: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const DispatcherBase = __nccwpck_require__(26844) -const FixedQueue = __nccwpck_require__(94856) -const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(94822) -const PoolStats = __nccwpck_require__(61279) +const DispatcherBase = __nccwpck_require__(39504) +const FixedQueue = __nccwpck_require__(27092) +const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(13638) +const PoolStats = __nccwpck_require__(48309) const kClients = Symbol('clients') const kNeedDrain = Symbol('needDrain') @@ -16757,10 +16620,10 @@ module.exports = { /***/ }), -/***/ 61279: +/***/ 48309: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(94822) +const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(13638) const kPool = Symbol('pool') class PoolStats { @@ -16798,7 +16661,7 @@ module.exports = PoolStats /***/ }), -/***/ 49771: +/***/ 80229: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -16810,14 +16673,14 @@ const { kNeedDrain, kAddClient, kGetDispatcher -} = __nccwpck_require__(97367) -const Client = __nccwpck_require__(6237) +} = __nccwpck_require__(1467) +const Client = __nccwpck_require__(85849) const { InvalidArgumentError -} = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) -const { kUrl, kInterceptors } = __nccwpck_require__(94822) -const buildConnector = __nccwpck_require__(63447) +} = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) +const { kUrl, kInterceptors } = __nccwpck_require__(13638) +const buildConnector = __nccwpck_require__(41429) const kOptions = Symbol('options') const kConnections = Symbol('connections') @@ -16913,20 +16776,20 @@ module.exports = Pool /***/ }), -/***/ 57912: +/***/ 87187: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(94822) +const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(13638) const { URL } = __nccwpck_require__(41041) -const Agent = __nccwpck_require__(1880) -const Pool = __nccwpck_require__(49771) -const DispatcherBase = __nccwpck_require__(26844) -const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = __nccwpck_require__(47926) -const buildConnector = __nccwpck_require__(63447) -const Client = __nccwpck_require__(6237) +const Agent = __nccwpck_require__(73274) +const Pool = __nccwpck_require__(80229) +const DispatcherBase = __nccwpck_require__(39504) +const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = __nccwpck_require__(35990) +const buildConnector = __nccwpck_require__(41429) +const Client = __nccwpck_require__(85849) const kAgent = Symbol('proxy agent') const kClient = Symbol('proxy client') @@ -17195,14 +17058,14 @@ module.exports = ProxyAgent /***/ }), -/***/ 42626: +/***/ 55184: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const Dispatcher = __nccwpck_require__(32171) -const RetryHandler = __nccwpck_require__(12671) +const Dispatcher = __nccwpck_require__(66071) +const RetryHandler = __nccwpck_require__(64524) class RetryAgent extends Dispatcher { #agent = null @@ -17238,7 +17101,7 @@ module.exports = RetryAgent /***/ }), -/***/ 53139: +/***/ 19405: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -17247,8 +17110,8 @@ module.exports = RetryAgent // We include a version number for the Dispatcher API. In case of breaking changes, // this version number must be increased to avoid conflicts. const globalDispatcher = Symbol.for('undici.globalDispatcher.1') -const { InvalidArgumentError } = __nccwpck_require__(47926) -const Agent = __nccwpck_require__(1880) +const { InvalidArgumentError } = __nccwpck_require__(35990) +const Agent = __nccwpck_require__(73274) if (getGlobalDispatcher() === undefined) { setGlobalDispatcher(new Agent()) @@ -17278,7 +17141,7 @@ module.exports = { /***/ }), -/***/ 59280: +/***/ 41738: /***/ ((module) => { "use strict"; @@ -17330,16 +17193,16 @@ module.exports = class DecoratorHandler { /***/ }), -/***/ 90008: +/***/ 64014: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(31014) -const { kBodyUsed } = __nccwpck_require__(94822) +const util = __nccwpck_require__(50011) +const { kBodyUsed } = __nccwpck_require__(13638) const assert = __nccwpck_require__(98061) -const { InvalidArgumentError } = __nccwpck_require__(47926) +const { InvalidArgumentError } = __nccwpck_require__(35990) const EE = __nccwpck_require__(15673) const redirectableStatusCodes = [300, 301, 302, 303, 307, 308] @@ -17570,21 +17433,21 @@ module.exports = RedirectHandler /***/ }), -/***/ 12671: +/***/ 64524: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { kRetryHandlerDefaultRetry } = __nccwpck_require__(94822) -const { RequestRetryError } = __nccwpck_require__(47926) +const { kRetryHandlerDefaultRetry } = __nccwpck_require__(13638) +const { RequestRetryError } = __nccwpck_require__(35990) const { isDisturbed, parseHeaders, parseRangeHeader, wrapRequestBody -} = __nccwpck_require__(31014) +} = __nccwpck_require__(50011) function calculateRetryAfterHeader (retryAfter) { const current = Date.now() @@ -17781,10 +17644,7 @@ class RetryHandler { this.retryCount += 1 if (statusCode >= 300) { - // Only expose a response if no earlier attempt has reached the caller. - // Otherwise abort this attempt so the error settles the existing body - // instead of replacing it with a new response. - if (!this.headersSent && this.retryOpts.statusCodes.includes(statusCode) === false) { + if (this.retryOpts.statusCodes.includes(statusCode) === false) { this.headersSent = true this.checkpointResponseEnd(headers, resume) return this.handler.onHeaders( @@ -18015,15 +17875,15 @@ module.exports = RetryHandler /***/ }), -/***/ 26290: +/***/ 20346: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { isIP } = __nccwpck_require__(87503) const { lookup } = __nccwpck_require__(30604) -const DecoratorHandler = __nccwpck_require__(59280) -const { InvalidArgumentError, InformationalError } = __nccwpck_require__(47926) +const DecoratorHandler = __nccwpck_require__(41738) +const { InvalidArgumentError, InformationalError } = __nccwpck_require__(35990) const maxInt = Math.pow(2, 31) - 1 class DNSInstance { @@ -18398,15 +18258,15 @@ module.exports = interceptorOpts => { /***/ }), -/***/ 9408: +/***/ 12493: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(31014) -const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(47926) -const DecoratorHandler = __nccwpck_require__(59280) +const util = __nccwpck_require__(50011) +const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(35990) +const DecoratorHandler = __nccwpck_require__(41738) class DumpHandler extends DecoratorHandler { #maxSize = 1024 * 1024 @@ -18529,13 +18389,13 @@ module.exports = createDumpInterceptor /***/ }), -/***/ 91467: +/***/ 40928: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const RedirectHandler = __nccwpck_require__(90008) +const RedirectHandler = __nccwpck_require__(64014) function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { return (dispatch) => { @@ -18558,12 +18418,12 @@ module.exports = createRedirectInterceptor /***/ }), -/***/ 42182: +/***/ 74872: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const RedirectHandler = __nccwpck_require__(90008) +const RedirectHandler = __nccwpck_require__(64014) module.exports = opts => { const globalMaxRedirections = opts?.maxRedirections @@ -18590,12 +18450,12 @@ module.exports = opts => { /***/ }), -/***/ 17389: +/***/ 79637: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const RetryHandler = __nccwpck_require__(12671) +const RetryHandler = __nccwpck_require__(64524) module.exports = globalOpts => { return dispatch => { @@ -18617,14 +18477,14 @@ module.exports = globalOpts => { /***/ }), -/***/ 27692: +/***/ 41721: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; -const utils_1 = __nccwpck_require__(5608); +const utils_1 = __nccwpck_require__(69573); // C headers var ERROR; (function (ERROR) { @@ -18902,7 +18762,7 @@ exports.SPECIAL_HEADERS = { /***/ }), -/***/ 84888: +/***/ 46081: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -18915,7 +18775,7 @@ module.exports = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f3 /***/ }), -/***/ 31445: +/***/ 97877: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -18928,7 +18788,7 @@ module.exports = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f3 /***/ }), -/***/ 5608: +/***/ 69573: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -18950,14 +18810,14 @@ exports.enumToMap = enumToMap; /***/ }), -/***/ 89937: +/***/ 46432: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kClients } = __nccwpck_require__(94822) -const Agent = __nccwpck_require__(1880) +const { kClients } = __nccwpck_require__(13638) +const Agent = __nccwpck_require__(73274) const { kAgent, kMockAgentSet, @@ -18968,14 +18828,14 @@ const { kGetNetConnect, kOptions, kFactory -} = __nccwpck_require__(89083) -const MockClient = __nccwpck_require__(69636) -const MockPool = __nccwpck_require__(40660) -const { matchValue, buildMockOptions } = __nccwpck_require__(16826) -const { InvalidArgumentError, UndiciError } = __nccwpck_require__(47926) -const Dispatcher = __nccwpck_require__(32171) -const Pluralizer = __nccwpck_require__(69437) -const PendingInterceptorsFormatter = __nccwpck_require__(9965) +} = __nccwpck_require__(63822) +const MockClient = __nccwpck_require__(4227) +const MockPool = __nccwpck_require__(36575) +const { matchValue, buildMockOptions } = __nccwpck_require__(38053) +const { InvalidArgumentError, UndiciError } = __nccwpck_require__(35990) +const Dispatcher = __nccwpck_require__(66071) +const Pluralizer = __nccwpck_require__(97472) +const PendingInterceptorsFormatter = __nccwpck_require__(56155) class MockAgent extends Dispatcher { constructor (opts) { @@ -19118,15 +18978,15 @@ module.exports = MockAgent /***/ }), -/***/ 69636: +/***/ 4227: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { promisify } = __nccwpck_require__(47261) -const Client = __nccwpck_require__(6237) -const { buildMockDispatch } = __nccwpck_require__(16826) +const Client = __nccwpck_require__(85849) +const { buildMockDispatch } = __nccwpck_require__(38053) const { kDispatches, kMockAgent, @@ -19135,10 +18995,10 @@ const { kOrigin, kOriginalDispatch, kConnected -} = __nccwpck_require__(89083) -const { MockInterceptor } = __nccwpck_require__(73387) -const Symbols = __nccwpck_require__(94822) -const { InvalidArgumentError } = __nccwpck_require__(47926) +} = __nccwpck_require__(63822) +const { MockInterceptor } = __nccwpck_require__(9238) +const Symbols = __nccwpck_require__(13638) +const { InvalidArgumentError } = __nccwpck_require__(35990) /** * MockClient provides an API that extends the Client to influence the mockDispatches. @@ -19185,13 +19045,13 @@ module.exports = MockClient /***/ }), -/***/ 33519: +/***/ 19329: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { UndiciError } = __nccwpck_require__(47926) +const { UndiciError } = __nccwpck_require__(35990) const kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED') @@ -19221,13 +19081,13 @@ module.exports = { /***/ }), -/***/ 73387: +/***/ 9238: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(16826) +const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(38053) const { kDispatches, kDispatchKey, @@ -19235,9 +19095,9 @@ const { kDefaultTrailers, kContentLength, kMockDispatch -} = __nccwpck_require__(89083) -const { InvalidArgumentError } = __nccwpck_require__(47926) -const { buildURL } = __nccwpck_require__(31014) +} = __nccwpck_require__(63822) +const { InvalidArgumentError } = __nccwpck_require__(35990) +const { buildURL } = __nccwpck_require__(50011) /** * Defines the scope API for an interceptor reply @@ -19436,15 +19296,15 @@ module.exports.MockScope = MockScope /***/ }), -/***/ 40660: +/***/ 36575: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { promisify } = __nccwpck_require__(47261) -const Pool = __nccwpck_require__(49771) -const { buildMockDispatch } = __nccwpck_require__(16826) +const Pool = __nccwpck_require__(80229) +const { buildMockDispatch } = __nccwpck_require__(38053) const { kDispatches, kMockAgent, @@ -19453,10 +19313,10 @@ const { kOrigin, kOriginalDispatch, kConnected -} = __nccwpck_require__(89083) -const { MockInterceptor } = __nccwpck_require__(73387) -const Symbols = __nccwpck_require__(94822) -const { InvalidArgumentError } = __nccwpck_require__(47926) +} = __nccwpck_require__(63822) +const { MockInterceptor } = __nccwpck_require__(9238) +const Symbols = __nccwpck_require__(13638) +const { InvalidArgumentError } = __nccwpck_require__(35990) /** * MockPool provides an API that extends the Pool to influence the mockDispatches. @@ -19503,7 +19363,7 @@ module.exports = MockPool /***/ }), -/***/ 89083: +/***/ 63822: /***/ ((module) => { "use strict"; @@ -19534,21 +19394,21 @@ module.exports = { /***/ }), -/***/ 16826: +/***/ 38053: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { MockNotMatchedError } = __nccwpck_require__(33519) +const { MockNotMatchedError } = __nccwpck_require__(19329) const { kDispatches, kMockAgent, kOriginalDispatch, kOrigin, kGetNetConnect -} = __nccwpck_require__(89083) -const { buildURL } = __nccwpck_require__(31014) +} = __nccwpck_require__(63822) +const { buildURL } = __nccwpck_require__(50011) const { STATUS_CODES } = __nccwpck_require__(88849) const { types: { @@ -19909,7 +19769,7 @@ module.exports = { /***/ }), -/***/ 9965: +/***/ 56155: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -19960,7 +19820,7 @@ module.exports = class PendingInterceptorsFormatter { /***/ }), -/***/ 69437: +/***/ 97472: /***/ ((module) => { "use strict"; @@ -19997,7 +19857,7 @@ module.exports = class Pluralizer { /***/ }), -/***/ 63125: +/***/ 77512: /***/ ((module) => { "use strict"; @@ -20428,21 +20288,21 @@ module.exports = { /***/ }), -/***/ 37917: +/***/ 12714: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kConstruct } = __nccwpck_require__(275) -const { urlEquals, getFieldValues } = __nccwpck_require__(40424) -const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(31014) -const { webidl } = __nccwpck_require__(96163) -const { Response, cloneResponse, fromInnerResponse } = __nccwpck_require__(63042) -const { Request, fromInnerRequest } = __nccwpck_require__(11192) -const { kState } = __nccwpck_require__(23200) -const { fetching } = __nccwpck_require__(87321) -const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(40667) +const { kConstruct } = __nccwpck_require__(50591) +const { urlEquals, getFieldValues } = __nccwpck_require__(99205) +const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(50011) +const { webidl } = __nccwpck_require__(2227) +const { Response, cloneResponse, fromInnerResponse } = __nccwpck_require__(51132) +const { Request, fromInnerRequest } = __nccwpck_require__(83211) +const { kState } = __nccwpck_require__(14935) +const { fetching } = __nccwpck_require__(78329) +const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(98730) const assert = __nccwpck_require__(98061) /** @@ -21295,16 +21155,16 @@ module.exports = { /***/ }), -/***/ 13256: +/***/ 11069: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kConstruct } = __nccwpck_require__(275) -const { Cache } = __nccwpck_require__(37917) -const { webidl } = __nccwpck_require__(96163) -const { kEnumerableProperty } = __nccwpck_require__(31014) +const { kConstruct } = __nccwpck_require__(50591) +const { Cache } = __nccwpck_require__(12714) +const { webidl } = __nccwpck_require__(2227) +const { kEnumerableProperty } = __nccwpck_require__(50011) class CacheStorage { /** @@ -21455,28 +21315,28 @@ module.exports = { /***/ }), -/***/ 275: +/***/ 50591: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; module.exports = { - kConstruct: (__nccwpck_require__(94822).kConstruct) + kConstruct: (__nccwpck_require__(13638).kConstruct) } /***/ }), -/***/ 40424: +/***/ 99205: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { URLSerializer } = __nccwpck_require__(68889) -const { isValidHeaderName } = __nccwpck_require__(40667) +const { URLSerializer } = __nccwpck_require__(96730) +const { isValidHeaderName } = __nccwpck_require__(98730) /** * @see https://url.spec.whatwg.org/#concept-url-equals @@ -21521,7 +21381,7 @@ module.exports = { /***/ }), -/***/ 40503: +/***/ 16155: /***/ ((module) => { "use strict"; @@ -21541,16 +21401,16 @@ module.exports = { /***/ }), -/***/ 84245: +/***/ 15855: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { parseSetCookie } = __nccwpck_require__(89386) -const { stringify } = __nccwpck_require__(74600) -const { webidl } = __nccwpck_require__(96163) -const { Headers } = __nccwpck_require__(33924) +const { parseSetCookie } = __nccwpck_require__(80742) +const { stringify } = __nccwpck_require__(93989) +const { webidl } = __nccwpck_require__(2227) +const { Headers } = __nccwpck_require__(10561) /** * @typedef {Object} Cookie @@ -21733,15 +21593,15 @@ module.exports = { /***/ }), -/***/ 89386: +/***/ 80742: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(40503) -const { isCTLExcludingHtab } = __nccwpck_require__(74600) -const { collectASequenceOfCodePointsFast } = __nccwpck_require__(68889) +const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(16155) +const { isCTLExcludingHtab } = __nccwpck_require__(93989) +const { collectASequenceOfCodePointsFast } = __nccwpck_require__(96730) const assert = __nccwpck_require__(98061) /** @@ -22051,7 +21911,7 @@ module.exports = { /***/ }), -/***/ 74600: +/***/ 93989: /***/ ((module) => { "use strict"; @@ -22411,14 +22271,13 @@ module.exports = { /***/ }), -/***/ 71054: +/***/ 41408: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const buffer = __nccwpck_require__(72254) const { Transform } = __nccwpck_require__(84492) -const { isASCIINumber, isValidLastEventId } = __nccwpck_require__(97409) +const { isASCIINumber, isValidLastEventId } = __nccwpck_require__(19079) /** * @type {number[]} BOM @@ -22441,19 +22300,11 @@ const COLON = 0x3A */ const SPACE = 0x20 -const defaultMaxEventSize = buffer.kStringMaxLength - const DATA = Buffer.from('data') const EVENT = Buffer.from('event') const ID = Buffer.from('id') const RETRY = Buffer.from('retry') -// Each data field creates a string node, and each unconsumed input chunk keeps -// a Buffer wrapper. The absolute ceiling protects the large default byte limit. -const minParserItems = 1024 -const maxParserItems = 131072 -const bytesPerParserItem = 128 - function isASCIINumberBytes (buffer, start) { if (start >= buffer.length) { return false @@ -22492,12 +22343,6 @@ function isFieldName (line, length, field) { return true } -function createMaxEventSizeExceededError () { - const error = new Error('EventSource message size exceeded') - error.aborted = false - return error -} - /** * @typedef {object} EventSourceStreamEvent * @type {object} @@ -22546,13 +22391,6 @@ class EventSourceStream extends Transform { pos = 0 lineChunkIndex = 0 linePos = 0 - lineLength = 0 - eventSize = 0 - eventFieldSizes = { data: 0, event: 0, id: 0, retry: 0 } - dataLineCount = 0 - maxEventSize - maxDataLines - maxBufferedChunks event = { data: undefined, @@ -22563,7 +22401,6 @@ class EventSourceStream extends Transform { /** * @param {object} options - * @param {number} [options.maxEventSize] * @param {eventSourceSettings} options.eventSourceSettings * @param {Function} [options.push] */ @@ -22575,12 +22412,6 @@ class EventSourceStream extends Transform { super(options) this.state = options.eventSourceSettings || {} - this.maxEventSize = options.maxEventSize ?? defaultMaxEventSize - const parserItemLimit = this.maxEventSize > 0 - ? Math.min(maxParserItems, Math.max(minParserItems, Math.floor(this.maxEventSize / bytesPerParserItem))) - : 0 - this.maxDataLines = parserItemLimit - this.maxBufferedChunks = parserItemLimit if (options.push) { this.push = options.push } @@ -22598,14 +22429,6 @@ class EventSourceStream extends Transform { return } - // A leading line ending can immediately release the currently buffered - // line, even when it uses the final allowed chunk slot. - if (this.maxEventSize > 0 && - this.chunks.length >= this.maxBufferedChunks && - chunk[0] !== LF && chunk[0] !== CR) { - callback(createMaxEventSizeExceededError()) - return - } this.chunks.push(chunk) // Strip leading byte-order-mark if we opened the stream and started @@ -22684,12 +22507,7 @@ class EventSourceStream extends Transform { // In any case, we can process the line as we reached an // end-of-line character - try { - this.parseLine(this.readLine(), this.event) - } catch (error) { - callback(error) - return - } + this.parseLine(this.readLine(), this.event) this.consumeCurrentByte() // A line was processed and this could be the end of the event. We need // to check if the next line is empty to determine if the event is @@ -22698,28 +22516,15 @@ class EventSourceStream extends Transform { continue } - // readLine() is only called after CR or LF. Reject an unfinished line - // before it can retain an unbounded number of decoded chunks. The seven - // extra bytes allow the longest field prefix ("event: " or "retry: "). - if (this.maxEventSize > 0 && ++this.lineLength > this.maxEventSize + 7) { - callback(createMaxEventSizeExceededError()) - return - } this.advanceCursor() } callback() } - _destroy (error, callback) { - this.chunks.length = 0 - this.clearEvent() - super._destroy(error, callback) - } - /** * @param {Buffer} line - * @param {EventSourceStreamEvent} event + * @param {EventStreamEvent} event */ parseLine (line, event) { // If the line is empty (a blank line) @@ -22753,13 +22558,6 @@ class EventSourceStream extends Transform { } if (isFieldName(line, fieldLength, DATA)) { - if (this.maxEventSize > 0 && this.dataLineCount >= this.maxDataLines) { - throw createMaxEventSizeExceededError() - } - const valueBytes = line.length - valueStart - const dataSize = this.eventFieldSizes.data + (event.data === undefined ? 0 : 1) + valueBytes - this.setEventFieldSize('data', dataSize) - const value = line.toString('utf8', valueStart) if (event.data === undefined) { @@ -22767,13 +22565,11 @@ class EventSourceStream extends Transform { } else { event.data += `\n${value}` } - this.dataLineCount++ return } if (isFieldName(line, fieldLength, RETRY)) { if (isASCIINumberBytes(line, valueStart)) { - this.setEventFieldSize('retry', line.length - valueStart) event.retry = line.toString('utf8', valueStart) } return @@ -22781,27 +22577,18 @@ class EventSourceStream extends Transform { if (isFieldName(line, fieldLength, ID)) { if (isValidLastEventIdBytes(line, valueStart)) { - this.setEventFieldSize('id', line.length - valueStart) event.id = line.toString('utf8', valueStart) } return } if (isFieldName(line, fieldLength, EVENT)) { - if (valueStart < line.length) { - this.setEventFieldSize('event', line.length - valueStart) - event.event = line.toString('utf8', valueStart) - } - } - } + const value = line.toString('utf8', valueStart) - setEventFieldSize (field, size) { - const eventSize = this.eventSize - this.eventFieldSizes[field] + size - if (this.maxEventSize > 0 && eventSize > this.maxEventSize) { - throw createMaxEventSizeExceededError() + if (value.length > 0) { + event.event = value + } } - this.eventSize = eventSize - this.eventFieldSizes[field] = size } /** @@ -22834,12 +22621,6 @@ class EventSourceStream extends Transform { this.event.event = undefined this.event.id = undefined this.event.retry = undefined - this.eventSize = 0 - this.dataLineCount = 0 - this.eventFieldSizes.data = 0 - this.eventFieldSizes.event = 0 - this.eventFieldSizes.id = 0 - this.eventFieldSizes.retry = 0 } hasPendingEvent () { @@ -22875,16 +22656,14 @@ class EventSourceStream extends Transform { syncLineStartToCursor () { this.lineChunkIndex = this.chunkIndex this.linePos = this.pos - this.lineLength = 0 this.dropConsumedChunks() } dropConsumedChunks () { - if (this.lineChunkIndex > 0) { - const consumed = this.lineChunkIndex - this.chunks.splice(0, consumed) - this.lineChunkIndex = 0 - this.chunkIndex -= consumed + while (this.lineChunkIndex > 0) { + this.chunks.shift() + this.lineChunkIndex-- + this.chunkIndex-- } if (this.chunkIndex === this.chunks.length) { @@ -22993,24 +22772,23 @@ module.exports = { /***/ }), -/***/ 74292: +/***/ 6731: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { pipeline } = __nccwpck_require__(84492) -const { fetching } = __nccwpck_require__(87321) -const { makeRequest } = __nccwpck_require__(11192) -const { webidl } = __nccwpck_require__(96163) -const { EventSourceStream } = __nccwpck_require__(71054) -const { parseMIMEType } = __nccwpck_require__(68889) -const { createFastMessageEvent } = __nccwpck_require__(85021) -const { isNetworkError } = __nccwpck_require__(63042) -const { delay } = __nccwpck_require__(97409) -const { kEnumerableProperty } = __nccwpck_require__(31014) -const { environmentSettingsObject } = __nccwpck_require__(40667) -const { getGlobalDispatcher } = __nccwpck_require__(53139) +const { fetching } = __nccwpck_require__(78329) +const { makeRequest } = __nccwpck_require__(83211) +const { webidl } = __nccwpck_require__(2227) +const { EventSourceStream } = __nccwpck_require__(41408) +const { parseMIMEType } = __nccwpck_require__(96730) +const { createFastMessageEvent } = __nccwpck_require__(69459) +const { isNetworkError } = __nccwpck_require__(51132) +const { delay } = __nccwpck_require__(19079) +const { kEnumerableProperty } = __nccwpck_require__(50011) +const { environmentSettingsObject } = __nccwpck_require__(98730) let experimentalWarned = false @@ -23292,7 +23070,6 @@ class EventSource extends EventTarget { const eventSourceStream = new EventSourceStream({ eventSourceSettings: this.#state, - maxEventSize: this.#dispatcher.eventSourceOptions?.maxEventSize, push: (event) => { this.dispatchEvent(createFastMessageEvent( event.type, @@ -23471,8 +23248,7 @@ webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([ }, { key: 'dispatcher', // undici only - converter: webidl.converters.any, - defaultValue: () => getGlobalDispatcher() + converter: webidl.converters.any } ]) @@ -23484,7 +23260,7 @@ module.exports = { /***/ }), -/***/ 97409: +/***/ 19079: /***/ ((module) => { "use strict"; @@ -23529,13 +23305,13 @@ module.exports = { /***/ }), -/***/ 48203: +/***/ 12749: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(31014) +const util = __nccwpck_require__(50011) const { ReadableStreamFrom, isBlobLike, @@ -23545,16 +23321,16 @@ const { fullyReadBody, extractMimeType, utf8DecodeBytes -} = __nccwpck_require__(40667) -const { FormData } = __nccwpck_require__(59550) -const { kState } = __nccwpck_require__(23200) -const { webidl } = __nccwpck_require__(96163) +} = __nccwpck_require__(98730) +const { FormData } = __nccwpck_require__(62598) +const { kState } = __nccwpck_require__(14935) +const { webidl } = __nccwpck_require__(2227) const { Blob } = __nccwpck_require__(72254) const assert = __nccwpck_require__(98061) const { isErrored, isDisturbed } = __nccwpck_require__(84492) const { isArrayBuffer } = __nccwpck_require__(93746) -const { serializeAMimeType } = __nccwpck_require__(68889) -const { multipartFormDataParser } = __nccwpck_require__(95600) +const { serializeAMimeType } = __nccwpck_require__(96730) +const { multipartFormDataParser } = __nccwpck_require__(25152) let random try { @@ -24066,7 +23842,7 @@ module.exports = { /***/ }), -/***/ 49316: +/***/ 54823: /***/ ((module) => { "use strict"; @@ -24198,7 +23974,7 @@ module.exports = { /***/ }), -/***/ 68889: +/***/ 96730: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -24950,13 +24726,13 @@ module.exports = { /***/ }), -/***/ 65895: +/***/ 61451: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kConnected, kSize } = __nccwpck_require__(94822) +const { kConnected, kSize } = __nccwpck_require__(13638) class CompatWeakRef { constructor (value) { @@ -25004,15 +24780,15 @@ module.exports = function () { /***/ }), -/***/ 5583: +/***/ 60027: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { Blob, File } = __nccwpck_require__(72254) -const { kState } = __nccwpck_require__(23200) -const { webidl } = __nccwpck_require__(96163) +const { kState } = __nccwpck_require__(14935) +const { webidl } = __nccwpck_require__(2227) // TODO(@KhafraDev): remove class FileLike { @@ -25138,17 +24914,17 @@ module.exports = { FileLike, isFileLike } /***/ }), -/***/ 95600: +/***/ 25152: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { isUSVString, bufferToLowerCasedHeaderName } = __nccwpck_require__(31014) -const { utf8DecodeBytes } = __nccwpck_require__(40667) -const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = __nccwpck_require__(68889) -const { isFileLike } = __nccwpck_require__(5583) -const { makeEntry } = __nccwpck_require__(59550) +const { isUSVString, bufferToLowerCasedHeaderName } = __nccwpck_require__(50011) +const { utf8DecodeBytes } = __nccwpck_require__(98730) +const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = __nccwpck_require__(96730) +const { isFileLike } = __nccwpck_require__(60027) +const { makeEntry } = __nccwpck_require__(62598) const assert = __nccwpck_require__(98061) const { File: NodeFile } = __nccwpck_require__(72254) @@ -25620,17 +25396,17 @@ module.exports = { /***/ }), -/***/ 59550: +/***/ 62598: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { isBlobLike, iteratorMixin } = __nccwpck_require__(40667) -const { kState } = __nccwpck_require__(23200) -const { kEnumerableProperty } = __nccwpck_require__(31014) -const { FileLike, isFileLike } = __nccwpck_require__(5583) -const { webidl } = __nccwpck_require__(96163) +const { isBlobLike, iteratorMixin } = __nccwpck_require__(98730) +const { kState } = __nccwpck_require__(14935) +const { kEnumerableProperty } = __nccwpck_require__(50011) +const { FileLike, isFileLike } = __nccwpck_require__(60027) +const { webidl } = __nccwpck_require__(2227) const { File: NativeFile } = __nccwpck_require__(72254) const nodeUtil = __nccwpck_require__(47261) @@ -25880,7 +25656,7 @@ module.exports = { FormData, makeEntry } /***/ }), -/***/ 22407: +/***/ 13924: /***/ ((module) => { "use strict"; @@ -25928,7 +25704,7 @@ module.exports = { /***/ }), -/***/ 33924: +/***/ 10561: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -25936,14 +25712,14 @@ module.exports = { -const { kConstruct } = __nccwpck_require__(94822) -const { kEnumerableProperty } = __nccwpck_require__(31014) +const { kConstruct } = __nccwpck_require__(13638) +const { kEnumerableProperty } = __nccwpck_require__(50011) const { iteratorMixin, isValidHeaderName, isValidHeaderValue -} = __nccwpck_require__(40667) -const { webidl } = __nccwpck_require__(96163) +} = __nccwpck_require__(98730) +const { webidl } = __nccwpck_require__(2227) const assert = __nccwpck_require__(98061) const util = __nccwpck_require__(47261) @@ -26623,7 +26399,7 @@ module.exports = { /***/ }), -/***/ 87321: +/***/ 78329: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -26637,9 +26413,9 @@ const { filterResponse, makeResponse, fromInnerResponse -} = __nccwpck_require__(63042) -const { HeadersList } = __nccwpck_require__(33924) -const { Request, cloneRequest } = __nccwpck_require__(11192) +} = __nccwpck_require__(51132) +const { HeadersList } = __nccwpck_require__(10561) +const { Request, cloneRequest } = __nccwpck_require__(83211) const zlib = __nccwpck_require__(65628) const { bytesMatch, @@ -26675,23 +26451,23 @@ const { buildContentRange, createInflate, extractMimeType -} = __nccwpck_require__(40667) -const { kState, kDispatcher } = __nccwpck_require__(23200) +} = __nccwpck_require__(98730) +const { kState, kDispatcher } = __nccwpck_require__(14935) const assert = __nccwpck_require__(98061) -const { safelyExtractBody, extractBody } = __nccwpck_require__(48203) +const { safelyExtractBody, extractBody } = __nccwpck_require__(12749) const { redirectStatusSet, nullBodyStatus, safeMethodsSet, requestBodyHeader, subresourceSet -} = __nccwpck_require__(49316) +} = __nccwpck_require__(54823) const EE = __nccwpck_require__(15673) const { Readable, pipeline, finished } = __nccwpck_require__(84492) -const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = __nccwpck_require__(31014) -const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = __nccwpck_require__(68889) -const { getGlobalDispatcher } = __nccwpck_require__(53139) -const { webidl } = __nccwpck_require__(96163) +const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = __nccwpck_require__(50011) +const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = __nccwpck_require__(96730) +const { getGlobalDispatcher } = __nccwpck_require__(19405) +const { webidl } = __nccwpck_require__(2227) const { STATUS_CODES } = __nccwpck_require__(88849) const GET_OR_HEAD = ['GET', 'HEAD'] @@ -28579,10 +28355,8 @@ async function httpNetworkFetch ( // 19. Run these steps in parallel: // 1. Run these steps, but abort when fetchParams is canceled: - if (!fetchParams.controller.resume) { - fetchParams.controller.on('terminated', onAborted) - } - + fetchParams.controller.onAborted = onAborted + fetchParams.controller.on('terminated', onAborted) fetchParams.controller.resume = async () => { // 1. While true while (true) { @@ -28751,6 +28525,8 @@ async function httpNetworkFetch ( } location = headersList.get('location', true) + this.body = new Readable({ read: resume }) + const decoders = [] const willFollow = location && request.redirect === 'follow' && @@ -28768,7 +28544,7 @@ async function httpNetworkFetch ( // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206). const maxContentEncodings = 5 if (codings.length > maxContentEncodings) { - this.abort(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)) + reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)) return true } @@ -28801,8 +28577,6 @@ async function httpNetworkFetch ( } } - this.body = new Readable({ read: resume }) - const onError = this.onError.bind(this) resolve({ @@ -28849,6 +28623,10 @@ async function httpNetworkFetch ( fetchParams.controller.off('terminated', this.abort) } + if (fetchParams.controller.onAborted) { + fetchParams.controller.off('terminated', fetchParams.controller.onAborted) + } + fetchParams.controller.ended = true this.body.push(null) @@ -28901,7 +28679,7 @@ module.exports = { /***/ }), -/***/ 11192: +/***/ 83211: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -28909,16 +28687,16 @@ module.exports = { -const { extractBody, mixinBody, cloneBody, bodyUnusable } = __nccwpck_require__(48203) -const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = __nccwpck_require__(33924) -const { FinalizationRegistry } = __nccwpck_require__(65895)() -const util = __nccwpck_require__(31014) +const { extractBody, mixinBody, cloneBody, bodyUnusable } = __nccwpck_require__(12749) +const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = __nccwpck_require__(10561) +const { FinalizationRegistry } = __nccwpck_require__(61451)() +const util = __nccwpck_require__(50011) const nodeUtil = __nccwpck_require__(47261) const { isValidHTTPToken, sameOrigin, environmentSettingsObject -} = __nccwpck_require__(40667) +} = __nccwpck_require__(98730) const { forbiddenMethodsSet, corsSafeListedMethodsSet, @@ -28928,12 +28706,12 @@ const { requestCredentials, requestCache, requestDuplex -} = __nccwpck_require__(49316) +} = __nccwpck_require__(54823) const { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util -const { kHeaders, kSignal, kState, kDispatcher } = __nccwpck_require__(23200) -const { webidl } = __nccwpck_require__(96163) -const { URLSerializer } = __nccwpck_require__(68889) -const { kConstruct } = __nccwpck_require__(94822) +const { kHeaders, kSignal, kState, kDispatcher } = __nccwpck_require__(14935) +const { webidl } = __nccwpck_require__(2227) +const { URLSerializer } = __nccwpck_require__(96730) +const { kConstruct } = __nccwpck_require__(13638) const assert = __nccwpck_require__(98061) const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(15673) @@ -29946,15 +29724,15 @@ module.exports = { Request, makeRequest, fromInnerRequest, cloneRequest } /***/ }), -/***/ 63042: +/***/ 51132: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = __nccwpck_require__(33924) -const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = __nccwpck_require__(48203) -const util = __nccwpck_require__(31014) +const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = __nccwpck_require__(10561) +const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = __nccwpck_require__(12749) +const util = __nccwpck_require__(50011) const nodeUtil = __nccwpck_require__(47261) const { kEnumerableProperty } = util const { @@ -29966,16 +29744,16 @@ const { isErrorLike, isomorphicEncode, environmentSettingsObject: relevantRealm -} = __nccwpck_require__(40667) +} = __nccwpck_require__(98730) const { redirectStatusSet, nullBodyStatus -} = __nccwpck_require__(49316) -const { kState, kHeaders } = __nccwpck_require__(23200) -const { webidl } = __nccwpck_require__(96163) -const { FormData } = __nccwpck_require__(59550) -const { URLSerializer } = __nccwpck_require__(68889) -const { kConstruct } = __nccwpck_require__(94822) +} = __nccwpck_require__(54823) +const { kState, kHeaders } = __nccwpck_require__(14935) +const { webidl } = __nccwpck_require__(2227) +const { FormData } = __nccwpck_require__(62598) +const { URLSerializer } = __nccwpck_require__(96730) +const { kConstruct } = __nccwpck_require__(13638) const assert = __nccwpck_require__(98061) const { types } = __nccwpck_require__(47261) @@ -30564,7 +30342,7 @@ module.exports = { /***/ }), -/***/ 23200: +/***/ 14935: /***/ ((module) => { "use strict"; @@ -30581,7 +30359,7 @@ module.exports = { /***/ }), -/***/ 40667: +/***/ 98730: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -30589,14 +30367,14 @@ module.exports = { const { Transform } = __nccwpck_require__(84492) const zlib = __nccwpck_require__(65628) -const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = __nccwpck_require__(49316) -const { getGlobalOrigin } = __nccwpck_require__(22407) -const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = __nccwpck_require__(68889) +const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = __nccwpck_require__(54823) +const { getGlobalOrigin } = __nccwpck_require__(13924) +const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = __nccwpck_require__(96730) const { performance } = __nccwpck_require__(38846) -const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = __nccwpck_require__(31014) +const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = __nccwpck_require__(50011) const assert = __nccwpck_require__(98061) const { isUint8Array } = __nccwpck_require__(93746) -const { webidl } = __nccwpck_require__(96163) +const { webidl } = __nccwpck_require__(2227) let supportedHashes = [] @@ -32221,7 +31999,7 @@ module.exports = { /***/ }), -/***/ 96163: +/***/ 2227: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -32229,7 +32007,7 @@ module.exports = { const { types, inspect } = __nccwpck_require__(47261) const { markAsUncloneable } = __nccwpck_require__(24086) -const { toUSVString } = __nccwpck_require__(31014) +const { toUSVString } = __nccwpck_require__(50011) /** @type {import('../../../types/webidl').Webidl} */ const webidl = {} @@ -32924,7 +32702,7 @@ module.exports = { /***/ }), -/***/ 73760: +/***/ 74973: /***/ ((module) => { "use strict"; @@ -33222,7 +33000,7 @@ module.exports = { /***/ }), -/***/ 62596: +/***/ 65153: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -33232,16 +33010,16 @@ const { staticPropertyDescriptors, readOperation, fireAProgressEvent -} = __nccwpck_require__(86751) +} = __nccwpck_require__(24277) const { kState, kError, kResult, kEvents, kAborted -} = __nccwpck_require__(42047) -const { webidl } = __nccwpck_require__(96163) -const { kEnumerableProperty } = __nccwpck_require__(31014) +} = __nccwpck_require__(30010) +const { webidl } = __nccwpck_require__(2227) +const { kEnumerableProperty } = __nccwpck_require__(50011) class FileReader extends EventTarget { constructor () { @@ -33574,13 +33352,13 @@ module.exports = { /***/ }), -/***/ 30183: +/***/ 53788: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(96163) +const { webidl } = __nccwpck_require__(2227) const kState = Symbol('ProgressEvent state') @@ -33660,7 +33438,7 @@ module.exports = { /***/ }), -/***/ 42047: +/***/ 30010: /***/ ((module) => { "use strict"; @@ -33678,7 +33456,7 @@ module.exports = { /***/ }), -/***/ 86751: +/***/ 24277: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -33690,10 +33468,10 @@ const { kResult, kAborted, kLastProgressEventFired -} = __nccwpck_require__(42047) -const { ProgressEvent } = __nccwpck_require__(30183) -const { getEncoding } = __nccwpck_require__(73760) -const { serializeAMimeType, parseMIMEType } = __nccwpck_require__(68889) +} = __nccwpck_require__(30010) +const { ProgressEvent } = __nccwpck_require__(53788) +const { getEncoding } = __nccwpck_require__(74973) +const { serializeAMimeType, parseMIMEType } = __nccwpck_require__(96730) const { types } = __nccwpck_require__(47261) const { StringDecoder } = __nccwpck_require__(71576) const { btoa } = __nccwpck_require__(72254) @@ -34077,28 +33855,28 @@ module.exports = { /***/ }), -/***/ 47524: +/***/ 17299: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = __nccwpck_require__(56004) +const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = __nccwpck_require__(44285) const { kReadyState, kSentClose, kByteParser, kReceivedClose, kResponse -} = __nccwpck_require__(23992) -const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = __nccwpck_require__(82487) -const { channels } = __nccwpck_require__(96005) -const { CloseEvent } = __nccwpck_require__(85021) -const { makeRequest } = __nccwpck_require__(11192) -const { fetching } = __nccwpck_require__(87321) -const { Headers, getHeadersList } = __nccwpck_require__(33924) -const { getDecodeSplit } = __nccwpck_require__(40667) -const { WebsocketFrameSend } = __nccwpck_require__(4712) +} = __nccwpck_require__(34939) +const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = __nccwpck_require__(93194) +const { channels } = __nccwpck_require__(65543) +const { CloseEvent } = __nccwpck_require__(69459) +const { makeRequest } = __nccwpck_require__(83211) +const { fetching } = __nccwpck_require__(78329) +const { Headers, getHeadersList } = __nccwpck_require__(10561) +const { getDecodeSplit } = __nccwpck_require__(98730) +const { WebsocketFrameSend } = __nccwpck_require__(84618) /** @type {import('crypto')} */ let crypto @@ -34456,7 +34234,7 @@ module.exports = { /***/ }), -/***/ 56004: +/***/ 44285: /***/ ((module) => { "use strict"; @@ -34530,15 +34308,15 @@ module.exports = { /***/ }), -/***/ 85021: +/***/ 69459: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(96163) -const { kEnumerableProperty } = __nccwpck_require__(31014) -const { kConstruct } = __nccwpck_require__(94822) +const { webidl } = __nccwpck_require__(2227) +const { kEnumerableProperty } = __nccwpck_require__(50011) +const { kConstruct } = __nccwpck_require__(13638) const { MessagePort } = __nccwpck_require__(24086) /** @@ -34867,13 +34645,13 @@ module.exports = { /***/ }), -/***/ 4712: +/***/ 84618: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { maxUnsigned16Bit } = __nccwpck_require__(56004) +const { maxUnsigned16Bit } = __nccwpck_require__(44285) const BUFFER_SIZE = 16386 @@ -34971,15 +34749,15 @@ module.exports = { /***/ }), -/***/ 93711: +/***/ 7133: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { createInflateRaw, Z_DEFAULT_WINDOWBITS } = __nccwpck_require__(65628) -const { isValidClientWindowBits } = __nccwpck_require__(82487) -const { MessageSizeExceededError } = __nccwpck_require__(47926) +const { isValidClientWindowBits } = __nccwpck_require__(93194) +const { MessageSizeExceededError } = __nccwpck_require__(35990) const tail = Buffer.from([0x00, 0x00, 0xff, 0xff]) const kBuffer = Symbol('kBuffer') @@ -35084,7 +34862,7 @@ module.exports = { PerMessageDeflate } /***/ }), -/***/ 44894: +/***/ 46080: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -35092,9 +34870,9 @@ module.exports = { PerMessageDeflate } const { Writable } = __nccwpck_require__(84492) const assert = __nccwpck_require__(98061) -const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = __nccwpck_require__(56004) -const { kReadyState, kSentClose, kResponse, kReceivedClose } = __nccwpck_require__(23992) -const { channels } = __nccwpck_require__(96005) +const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = __nccwpck_require__(44285) +const { kReadyState, kSentClose, kResponse, kReceivedClose } = __nccwpck_require__(34939) +const { channels } = __nccwpck_require__(65543) const { isValidStatusCode, isValidOpcode, @@ -35104,11 +34882,11 @@ const { isControlFrame, isTextBinaryFrame, isContinuationFrame -} = __nccwpck_require__(82487) -const { WebsocketFrameSend } = __nccwpck_require__(4712) -const { closeWebSocketConnection } = __nccwpck_require__(47524) -const { PerMessageDeflate } = __nccwpck_require__(93711) -const { MessageSizeExceededError } = __nccwpck_require__(47926) +} = __nccwpck_require__(93194) +const { WebsocketFrameSend } = __nccwpck_require__(84618) +const { closeWebSocketConnection } = __nccwpck_require__(17299) +const { PerMessageDeflate } = __nccwpck_require__(7133) +const { MessageSizeExceededError } = __nccwpck_require__(35990) function failWebsocketConnectionWithCode (ws, code, reason) { closeWebSocketConnection(ws, code, reason, Buffer.byteLength(reason)) @@ -35339,20 +35117,6 @@ class ByteParser extends Writable { if (isControlFrame(this.#info.opcode)) { this.#loop = this.parseControlFrame(body) this.#state = parserStates.INFO - - // If the automatic PONG/CLOSE reply filled the socket's write buffer, - // stop parsing and resume on drain so a PING flood cannot grow the - // outbound queue without bound. - const socket = this.ws[kResponse].socket - if (this.#loop && socket.writableNeedDrain) { - this.#loop = false - socket.once('drain', () => { - if (this.destroyed) return - this.#loop = true - this.run(callback) - }) - return - } } else { if (!this.#info.compressed) { if (!this.writeFragments(body)) { @@ -35619,15 +35383,15 @@ module.exports = { /***/ }), -/***/ 10243: +/***/ 26515: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { WebsocketFrameSend } = __nccwpck_require__(4712) -const { opcodes, sendHints } = __nccwpck_require__(56004) -const FixedQueue = __nccwpck_require__(94856) +const { WebsocketFrameSend } = __nccwpck_require__(84618) +const { opcodes, sendHints } = __nccwpck_require__(44285) +const FixedQueue = __nccwpck_require__(27092) /** @type {typeof Uint8Array} */ const FastBuffer = Buffer[Symbol.species] @@ -35731,7 +35495,7 @@ module.exports = { SendQueue } /***/ }), -/***/ 23992: +/***/ 34939: /***/ ((module) => { "use strict"; @@ -35751,17 +35515,17 @@ module.exports = { /***/ }), -/***/ 82487: +/***/ 93194: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = __nccwpck_require__(23992) -const { states, opcodes } = __nccwpck_require__(56004) -const { ErrorEvent, createFastMessageEvent } = __nccwpck_require__(85021) +const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = __nccwpck_require__(34939) +const { states, opcodes } = __nccwpck_require__(44285) +const { ErrorEvent, createFastMessageEvent } = __nccwpck_require__(69459) const { isUtf8 } = __nccwpck_require__(72254) -const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = __nccwpck_require__(68889) +const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = __nccwpck_require__(96730) /* globals Blob */ @@ -36081,16 +35845,16 @@ module.exports = { /***/ }), -/***/ 43590: +/***/ 16416: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(96163) -const { URLSerializer } = __nccwpck_require__(68889) -const { environmentSettingsObject } = __nccwpck_require__(40667) -const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = __nccwpck_require__(56004) +const { webidl } = __nccwpck_require__(2227) +const { URLSerializer } = __nccwpck_require__(96730) +const { environmentSettingsObject } = __nccwpck_require__(98730) +const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = __nccwpck_require__(44285) const { kWebSocketURL, kReadyState, @@ -36099,21 +35863,21 @@ const { kResponse, kSentClose, kByteParser -} = __nccwpck_require__(23992) +} = __nccwpck_require__(34939) const { isConnecting, isEstablished, isClosing, isValidSubprotocol, fireEvent -} = __nccwpck_require__(82487) -const { establishWebSocketConnection, closeWebSocketConnection } = __nccwpck_require__(47524) -const { ByteParser } = __nccwpck_require__(44894) -const { kEnumerableProperty, isBlobLike } = __nccwpck_require__(31014) -const { getGlobalDispatcher } = __nccwpck_require__(53139) +} = __nccwpck_require__(93194) +const { establishWebSocketConnection, closeWebSocketConnection } = __nccwpck_require__(17299) +const { ByteParser } = __nccwpck_require__(46080) +const { kEnumerableProperty, isBlobLike } = __nccwpck_require__(50011) +const { getGlobalDispatcher } = __nccwpck_require__(19405) const { types } = __nccwpck_require__(47261) -const { ErrorEvent, CloseEvent } = __nccwpck_require__(85021) -const { SendQueue } = __nccwpck_require__(10243) +const { ErrorEvent, CloseEvent } = __nccwpck_require__(69459) +const { SendQueue } = __nccwpck_require__(26515) // https://websockets.spec.whatwg.org/#interface-definition class WebSocket extends EventTarget { @@ -36822,10 +36586,12 @@ async function mainRun(execution, projectBoardCommandPort, latestTagQueryPort, c (0, logger_1.logInfo)('GitHub Action: starting main run.'); (0, logger_1.logDebugInfo)(`Event: ${execution.eventName}, actor: ${execution.actor}, repo: ${repository.owner}/${repository.repo}, debug: ${execution.debug}`); if (process.env.GITHUB_ACTIONS === 'true' && !execution.singleAction.isPublishIssueCommentAction) { - // Every GitHub workflow invocation queues before setup or route work so - // executions of the same workflow file cannot overlap mutations. A - // failure notification must remain runnable when that queue gate fails. - await (0, main_run_lifecycle_1.waitForPreviousWorkflowRuns)(execution.tokens.token, repository); + // Verify native resource/lane coordination or retain the predecessor + // fence before setup. Failure notifications must remain runnable. + await (0, main_run_lifecycle_1.waitForPreviousWorkflowRuns)(execution.tokens.token, repository, { + isSingleAction: execution.isSingleAction, + pullRequestNumber: execution.inputs?.pull_request?.number, + }); } const setupExecution = (0, execution_setup_composition_root_1.createSetupExecutionUseCase)(latestTagQueryPort, { owner: repository.owner, @@ -37672,19 +37438,29 @@ class WorkflowQueueFailureError extends Error { } } exports.WorkflowQueueFailureError = WorkflowQueueFailureError; -function buildPreviousWorkflowRunsQuery(repository) { +function buildPreviousWorkflowRunsQuery(repository, event) { const workflowIdentifier = (0, workflow_context_1.resolveWorkflowIdentifier)(process.env.GITHUB_WORKFLOW_REF); const query = { owner: repository.owner, repository: repository.repo, - currentRunId: Number.parseInt(process.env.GITHUB_RUN_ID ?? '', 10), + currentRunId: Number(process.env.GITHUB_RUN_ID ?? Number.NaN), ...(workflowIdentifier ? { workflowIdentifier } : {}), + ...(event && !event.isSingleAction && process.env.GITHUB_WORKFLOW_SHA && process.env.GITHUB_JOB ? { + nativeCoordination: Object.freeze({ + workflowRef: process.env.GITHUB_WORKFLOW_REF ?? '', + workflowRevision: process.env.GITHUB_WORKFLOW_SHA, + jobId: process.env.GITHUB_JOB, + eventName: process.env.GITHUB_EVENT_NAME ?? '', + ref: process.env.GITHUB_REF, + pullRequestNumber: event.pullRequestNumber, + }), + } : {}), }; return query; } -async function waitForPreviousWorkflowRuns(token, repository) { - const query = buildPreviousWorkflowRunsQuery(repository); - if (process.env.GITHUB_ACTIONS === 'true' && !Number.isSafeInteger(query.currentRunId)) { +async function waitForPreviousWorkflowRuns(token, repository, event) { + const query = buildPreviousWorkflowRunsQuery(repository, event); + if (process.env.GITHUB_ACTIONS === 'true' && (!Number.isSafeInteger(query.currentRunId) || query.currentRunId <= 0)) { throw new Error('GitHub workflow identity is unavailable; refusing to bypass sequential execution.'); } if (process.env.GITHUB_ACTIONS === 'true' && !query.workflowIdentifier) { @@ -44668,6 +44444,59 @@ function mergeSetupOverrides(fileOverrides, flagOverrides) { } +/***/ }), + +/***/ 70998: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.expectedNativeWorkflowGroup = expectedNativeWorkflowGroup; +exports.hasNativeWorkflowCoordination = hasNativeWorkflowCoordination; +const PUSH_GROUP = 'copilot-push-${{ github.repository }}-${{ github.ref_name }}'; +const PR_GROUP = 'copilot-pr-${{ github.repository }}-${{ github.event.pull_request.number }}'; +/** Closed recognition of the installed contract, without evaluating expressions. */ +function expectedNativeWorkflowGroup(query) { + const native = query.nativeCoordination; + if (!native || !Number.isSafeInteger(query.currentRunId) || query.currentRunId <= 0 + || !/^[\w.-]+\.ya?ml$/u.test(query.workflowIdentifier ?? '') + || !native.workflowRef.startsWith(`${query.owner}/${query.repository}/.github/workflows/${query.workflowIdentifier}@`) + || native.workflowRef.endsWith('@') + || !/^[a-f\d]{40}$/iu.test(native.workflowRevision) + || !/^[a-zA-Z_][\w-]*$/u.test(native.jobId)) + return undefined; + if (native.eventName === 'push' && native.ref?.startsWith('refs/heads/') + && native.ref.length > 'refs/heads/'.length) + return PUSH_GROUP; + if (!Number.isSafeInteger(native.pullRequestNumber) || (native.pullRequestNumber ?? 0) <= 0) + return undefined; + if (native.eventName === 'pull_request') + return `${PR_GROUP}-analysis`; + if (native.eventName === 'pull_request_review') + return `${PR_GROUP}-review-state`; + return undefined; +} +function hasNativeWorkflowCoordination(workflow, jobId, expectedGroup) { + const definition = record(workflow); + const jobs = record(definition?.jobs); + const job = record(jobs?.[jobId]); + const concurrency = record(job?.concurrency); + // Custom/reusable/workflow-level contracts retain conservative polling. + // A single direct job also avoids confusing a reusable callee's job ID + // with a different protected job in its caller's workflow context. + return definition?.concurrency === undefined && jobs !== undefined && Object.keys(jobs).length === 1 + && Array.isArray(job?.steps) + && job?.uses === undefined && concurrency?.group === expectedGroup + && concurrency?.['cancel-in-progress'] === true + && (concurrency.queue === undefined || concurrency.queue === 'single'); +} +function record(value) { + return value !== null && typeof value === 'object' && !Array.isArray(value) + ? value : undefined; +} + + /***/ }), /***/ 70628: @@ -67060,7 +66889,7 @@ async function resolveParentCommentBody(param, contextPorts) { /***/ }), -/***/ 281: +/***/ 37685: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -73353,18 +73182,28 @@ const application_error_1 = __nccwpck_require__(75999); const SYSTEM_CLOCK = { nowMilliseconds: () => Date.now() }; const SYSTEM_RANDOM = { next: () => Math.random() }; class WaitForPreviousWorkflowRunsUseCase { - constructor(queryPort, delayPort, observerPort, policy = workflow_queue_policy_1.WORKFLOW_QUEUE_POLICY, clock = SYSTEM_CLOCK, random = SYSTEM_RANDOM) { + constructor(queryPort, delayPort, observerPort, policy = workflow_queue_policy_1.WORKFLOW_QUEUE_POLICY, clock = SYSTEM_CLOCK, random = SYSTEM_RANDOM, nativeCoordination) { this.queryPort = queryPort; this.delayPort = delayPort; this.observerPort = observerPort; this.policy = policy; this.clock = clock; this.random = random; + this.nativeCoordination = nativeCoordination; this.taskId = 'WaitForPreviousWorkflowRunsUseCase'; } async invoke(query) { const deadlineAtMilliseconds = this.clock.nowMilliseconds() + this.policy.maximumQueueWaitMilliseconds; let pollIndex = 0; + if (this.nativeCoordination && this.clock.nowMilliseconds() < deadlineAtMilliseconds) { + const coordinated = await this.nativeCoordination.isCoordinated(query, { deadlineAtMilliseconds }); + if (this.clock.nowMilliseconds() >= deadlineAtMilliseconds) + throw queueTimeoutError(); + if (coordinated) { + this.observerPort.nativeCoordinationVerified?.(); + return; + } + } while (true) { if (this.clock.nowMilliseconds() >= deadlineAtMilliseconds) { throw queueTimeoutError(); @@ -82638,7 +82477,7 @@ exports.BranchNameRepository = BranchNameRepository; /***/ }), -/***/ 80742: +/***/ 54874: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -82728,7 +82567,7 @@ function uniqueValidDependencies(candidates) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.BranchDependencyRepository = void 0; -const branch_dependency_policy_1 = __nccwpck_require__(80742); +const branch_dependency_policy_1 = __nccwpck_require__(54874); const OPEN_DEPENDENCIES_QUERY = ` query BranchSyncDependencies($owner: String!, $repo: String!, $issuesCursor: String, $pullsCursor: String) { repository(owner: $owner, name: $repo) { @@ -89585,6 +89424,55 @@ function isActivePreviousRun(run, query) { } +/***/ }), + +/***/ 74039: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NativeWorkflowCoordinationRepository = void 0; +const js_yaml_1 = __nccwpck_require__(783); +const native_workflow_coordination_policy_1 = __nccwpck_require__(70998); +const workflow_runs_retry_1 = __nccwpck_require__(86434); +const MAX_WORKFLOW_BYTES = 256 * 1024; +/** Reads the workflow GitHub executed, never the possibly modified checkout. */ +class NativeWorkflowCoordinationRepository { + constructor(client, retry) { + this.client = client; + this.retry = retry; + } + async isCoordinated(query, context) { + const group = (0, native_workflow_coordination_policy_1.expectedNativeWorkflowGroup)(query); + const native = query.nativeCoordination; + if (!group || !native) + return false; + const response = await (0, workflow_runs_retry_1.withWorkflowRunsRetry)(() => this.client.rest.repos.getContent({ + owner: query.owner, + repo: query.repository, + path: `.github/workflows/${query.workflowIdentifier}`, + ref: native.workflowRevision, + }), { ...this.retry, policy: this.retry.policy ?? workflow_runs_retry_1.WORKFLOW_RUNS_RETRY_POLICY, + deadlineAtMilliseconds: context.deadlineAtMilliseconds }); + const file = response.data; + if (!file || Array.isArray(file) || file.type !== 'file' || file.encoding !== 'base64' + || typeof file.content !== 'string' || file.content.length > MAX_WORKFLOW_BYTES * 2) { + throw new Error('Executing workflow content is unavailable.'); + } + const encoded = file.content.replace(/\s/gu, ''); + const bytes = Buffer.from(encoded, 'base64'); + if (bytes.toString('base64') !== encoded) + throw new Error('Executing workflow encoding is invalid.'); + if (bytes.length > MAX_WORKFLOW_BYTES) + throw new Error('Executing workflow exceeds the inspection limit.'); + const workflow = (0, js_yaml_1.load)(bytes.toString('utf8'), { schema: js_yaml_1.JSON_SCHEMA }); + return (0, native_workflow_coordination_policy_1.hasNativeWorkflowCoordination)(workflow, native.jobId, group); + } +} +exports.NativeWorkflowCoordinationRepository = NativeWorkflowCoordinationRepository; + + /***/ }), /***/ 29509: @@ -96715,7 +96603,7 @@ const check_changes_issue_size_use_case_1 = __nccwpck_require__(28356); const change_size_project_membership_composition_root_1 = __nccwpck_require__(99375); const bugbot_autofix_use_case_1 = __nccwpck_require__(45446); const detect_bugbot_fix_intent_use_case_1 = __nccwpck_require__(76234); -const dismiss_bugbot_findings_use_case_1 = __nccwpck_require__(281); +const dismiss_bugbot_findings_use_case_1 = __nccwpck_require__(37685); const remember_bugbot_rule_use_case_1 = __nccwpck_require__(17437); const detect_potential_problems_use_case_1 = __nccwpck_require__(6287); const notify_new_commit_on_issue_use_case_1 = __nccwpck_require__(33276); @@ -97677,12 +97565,17 @@ const timer_workflow_polling_delay_adapter_1 = __nccwpck_require__(10339); const logger_workflow_polling_observer_adapter_1 = __nccwpck_require__(52883); const system_workflow_queue_clock_adapter_1 = __nccwpck_require__(49664); const system_workflow_polling_random_adapter_1 = __nccwpck_require__(32679); -const github_workflow_client_factory_1 = __nccwpck_require__(29839); +const native_workflow_coordination_repository_1 = __nccwpck_require__(74039); +const octokit_client_resolver_1 = __nccwpck_require__(54047); function createWaitForPreviousWorkflowRunsUseCase(token) { - const client = (0, github_workflow_client_factory_1.createWorkflowRunsClient)().getClient(token); + const client = (0, octokit_client_resolver_1.getOctokitClient)(token); const delayPort = new timer_workflow_polling_delay_adapter_1.TimerWorkflowPollingDelayAdapter(); const observerPort = new logger_workflow_polling_observer_adapter_1.LoggerWorkflowPollingObserverAdapter(); - return new wait_for_previous_workflow_runs_use_case_1.WaitForPreviousWorkflowRunsUseCase(new active_previous_workflow_runs_repository_1.ActivePreviousWorkflowRunsRepository(client, delayPort, undefined, new system_workflow_queue_clock_adapter_1.SystemWorkflowQueueClockAdapter(), new system_workflow_polling_random_adapter_1.SystemWorkflowPollingRandomAdapter(), observerPort), delayPort, observerPort); + const clock = new system_workflow_queue_clock_adapter_1.SystemWorkflowQueueClockAdapter(); + const random = new system_workflow_polling_random_adapter_1.SystemWorkflowPollingRandomAdapter(); + return new wait_for_previous_workflow_runs_use_case_1.WaitForPreviousWorkflowRunsUseCase(new active_previous_workflow_runs_repository_1.ActivePreviousWorkflowRunsRepository(client, delayPort, undefined, clock, random, observerPort), delayPort, observerPort, undefined, clock, random, new native_workflow_coordination_repository_1.NativeWorkflowCoordinationRepository(client, { + delayPort, clock, random, observer: observerPort, + })); } @@ -98983,6 +98876,9 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.LoggerWorkflowPollingObserverAdapter = void 0; const logger_1 = __nccwpck_require__(91151); class LoggerWorkflowPollingObserverAdapter { + nativeCoordinationVerified() { + (0, logger_1.logInfo)('Native workflow resource/lane coordination verified; continuing before setup.'); + } noActivePreviousRuns() { (0, logger_1.logDebugInfo)('✅ No previous runs active. Continuing...'); } diff --git a/build/github_action/index.js b/build/github_action/index.js index 2fd7f15bf..ef1e4c702 100644 --- a/build/github_action/index.js +++ b/build/github_action/index.js @@ -2139,7 +2139,7 @@ exports.getProxyAgentDispatcher = getProxyAgentDispatcher; exports.getProxyFetch = getProxyFetch; exports.getApiBaseUrl = getApiBaseUrl; const httpClient = __importStar(__nccwpck_require__(75784)); -const undici_1 = __nccwpck_require__(31241); +const undici_1 = __nccwpck_require__(18381); function getAuthString(token, options) { if (!token && !options.auth) { throw new Error('Parameter token or opts.auth is required'); @@ -2391,7 +2391,7 @@ const http = __importStar(__nccwpck_require__(13685)); const https = __importStar(__nccwpck_require__(95687)); const pm = __importStar(__nccwpck_require__(34583)); const tunnel = __importStar(__nccwpck_require__(64249)); -const undici_1 = __nccwpck_require__(31241); +const undici_1 = __nccwpck_require__(18381); var HttpCodes; (function (HttpCodes) { HttpCodes[HttpCodes["OK"] = 200] = "OK"; @@ -8503,34 +8503,34 @@ exports.debug = debug; // for test /***/ }), -/***/ 31241: +/***/ 18381: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const Client = __nccwpck_require__(6237) -const Dispatcher = __nccwpck_require__(32171) -const Pool = __nccwpck_require__(49771) -const BalancedPool = __nccwpck_require__(88214) -const Agent = __nccwpck_require__(1880) -const ProxyAgent = __nccwpck_require__(57912) -const EnvHttpProxyAgent = __nccwpck_require__(42547) -const RetryAgent = __nccwpck_require__(42626) -const errors = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) +const Client = __nccwpck_require__(85849) +const Dispatcher = __nccwpck_require__(66071) +const Pool = __nccwpck_require__(80229) +const BalancedPool = __nccwpck_require__(68255) +const Agent = __nccwpck_require__(73274) +const ProxyAgent = __nccwpck_require__(87187) +const EnvHttpProxyAgent = __nccwpck_require__(29941) +const RetryAgent = __nccwpck_require__(55184) +const errors = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) const { InvalidArgumentError } = errors -const api = __nccwpck_require__(39663) -const buildConnector = __nccwpck_require__(63447) -const MockClient = __nccwpck_require__(69636) -const MockAgent = __nccwpck_require__(89937) -const MockPool = __nccwpck_require__(40660) -const mockErrors = __nccwpck_require__(33519) -const RetryHandler = __nccwpck_require__(12671) -const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(53139) -const DecoratorHandler = __nccwpck_require__(59280) -const RedirectHandler = __nccwpck_require__(90008) -const createRedirectInterceptor = __nccwpck_require__(91467) +const api = __nccwpck_require__(20617) +const buildConnector = __nccwpck_require__(41429) +const MockClient = __nccwpck_require__(4227) +const MockAgent = __nccwpck_require__(46432) +const MockPool = __nccwpck_require__(36575) +const mockErrors = __nccwpck_require__(19329) +const RetryHandler = __nccwpck_require__(64524) +const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(19405) +const DecoratorHandler = __nccwpck_require__(41738) +const RedirectHandler = __nccwpck_require__(64014) +const createRedirectInterceptor = __nccwpck_require__(40928) Object.assign(Dispatcher.prototype, api) @@ -8548,10 +8548,10 @@ module.exports.DecoratorHandler = DecoratorHandler module.exports.RedirectHandler = RedirectHandler module.exports.createRedirectInterceptor = createRedirectInterceptor module.exports.interceptors = { - redirect: __nccwpck_require__(42182), - retry: __nccwpck_require__(17389), - dump: __nccwpck_require__(9408), - dns: __nccwpck_require__(26290) + redirect: __nccwpck_require__(74872), + retry: __nccwpck_require__(79637), + dump: __nccwpck_require__(12493), + dns: __nccwpck_require__(20346) } module.exports.buildConnector = buildConnector @@ -8613,7 +8613,7 @@ function makeDispatcher (fn) { module.exports.setGlobalDispatcher = setGlobalDispatcher module.exports.getGlobalDispatcher = getGlobalDispatcher -const fetchImpl = (__nccwpck_require__(87321).fetch) +const fetchImpl = (__nccwpck_require__(78329).fetch) module.exports.fetch = async function fetch (init, options = undefined) { try { return await fetchImpl(init, options) @@ -8625,39 +8625,39 @@ module.exports.fetch = async function fetch (init, options = undefined) { throw err } } -module.exports.Headers = __nccwpck_require__(33924).Headers -module.exports.Response = __nccwpck_require__(63042).Response -module.exports.Request = __nccwpck_require__(11192).Request -module.exports.FormData = __nccwpck_require__(59550).FormData +module.exports.Headers = __nccwpck_require__(10561).Headers +module.exports.Response = __nccwpck_require__(51132).Response +module.exports.Request = __nccwpck_require__(83211).Request +module.exports.FormData = __nccwpck_require__(62598).FormData module.exports.File = globalThis.File ?? (__nccwpck_require__(72254).File) -module.exports.FileReader = __nccwpck_require__(62596).FileReader +module.exports.FileReader = __nccwpck_require__(65153).FileReader -const { setGlobalOrigin, getGlobalOrigin } = __nccwpck_require__(22407) +const { setGlobalOrigin, getGlobalOrigin } = __nccwpck_require__(13924) module.exports.setGlobalOrigin = setGlobalOrigin module.exports.getGlobalOrigin = getGlobalOrigin -const { CacheStorage } = __nccwpck_require__(13256) -const { kConstruct } = __nccwpck_require__(275) +const { CacheStorage } = __nccwpck_require__(11069) +const { kConstruct } = __nccwpck_require__(50591) // Cache & CacheStorage are tightly coupled with fetch. Even if it may run // in an older version of Node, it doesn't have any use without fetch. module.exports.caches = new CacheStorage(kConstruct) -const { deleteCookie, getCookies, getSetCookies, setCookie } = __nccwpck_require__(84245) +const { deleteCookie, getCookies, getSetCookies, setCookie } = __nccwpck_require__(15855) module.exports.deleteCookie = deleteCookie module.exports.getCookies = getCookies module.exports.getSetCookies = getSetCookies module.exports.setCookie = setCookie -const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(68889) +const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(96730) module.exports.parseMIMEType = parseMIMEType module.exports.serializeAMimeType = serializeAMimeType -const { CloseEvent, ErrorEvent, MessageEvent } = __nccwpck_require__(85021) -module.exports.WebSocket = __nccwpck_require__(43590).WebSocket +const { CloseEvent, ErrorEvent, MessageEvent } = __nccwpck_require__(69459) +module.exports.WebSocket = __nccwpck_require__(16416).WebSocket module.exports.CloseEvent = CloseEvent module.exports.ErrorEvent = ErrorEvent module.exports.MessageEvent = MessageEvent @@ -8673,18 +8673,18 @@ module.exports.MockPool = MockPool module.exports.MockAgent = MockAgent module.exports.mockErrors = mockErrors -const { EventSource } = __nccwpck_require__(74292) +const { EventSource } = __nccwpck_require__(6731) module.exports.EventSource = EventSource /***/ }), -/***/ 44378: +/***/ 97433: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const { addAbortListener } = __nccwpck_require__(31014) -const { RequestAbortedError } = __nccwpck_require__(47926) +const { addAbortListener } = __nccwpck_require__(50011) +const { RequestAbortedError } = __nccwpck_require__(35990) const kListener = Symbol('kListener') const kSignal = Symbol('kSignal') @@ -8744,7 +8744,7 @@ module.exports = { /***/ }), -/***/ 48105: +/***/ 93671: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -8752,9 +8752,9 @@ module.exports = { const assert = __nccwpck_require__(98061) const { AsyncResource } = __nccwpck_require__(92761) -const { InvalidArgumentError, SocketError } = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) -const { addSignal, removeSignal } = __nccwpck_require__(44378) +const { InvalidArgumentError, SocketError } = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) +const { addSignal, removeSignal } = __nccwpck_require__(97433) class ConnectHandler extends AsyncResource { constructor (opts, callback) { @@ -8860,7 +8860,7 @@ module.exports = connect /***/ }), -/***/ 25050: +/***/ 281: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -8875,10 +8875,10 @@ const { InvalidArgumentError, InvalidReturnValueError, RequestAbortedError -} = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) +} = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) const { AsyncResource } = __nccwpck_require__(92761) -const { addSignal, removeSignal } = __nccwpck_require__(44378) +const { addSignal, removeSignal } = __nccwpck_require__(97433) const assert = __nccwpck_require__(98061) const kResume = Symbol('resume') @@ -9119,17 +9119,17 @@ module.exports = pipeline /***/ }), -/***/ 53067: +/***/ 26562: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { Readable } = __nccwpck_require__(67646) -const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) -const { getResolveErrorBodyCallback } = __nccwpck_require__(78393) +const { Readable } = __nccwpck_require__(93401) +const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) +const { getResolveErrorBodyCallback } = __nccwpck_require__(80710) const { AsyncResource } = __nccwpck_require__(92761) class RequestHandler extends AsyncResource { @@ -9341,7 +9341,7 @@ module.exports.RequestHandler = RequestHandler /***/ }), -/***/ 21890: +/***/ 75059: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -9349,11 +9349,11 @@ module.exports.RequestHandler = RequestHandler const assert = __nccwpck_require__(98061) const { finished, PassThrough } = __nccwpck_require__(84492) -const { InvalidArgumentError, InvalidReturnValueError } = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) -const { getResolveErrorBodyCallback } = __nccwpck_require__(78393) +const { InvalidArgumentError, InvalidReturnValueError } = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) +const { getResolveErrorBodyCallback } = __nccwpck_require__(80710) const { AsyncResource } = __nccwpck_require__(92761) -const { addSignal, removeSignal } = __nccwpck_require__(44378) +const { addSignal, removeSignal } = __nccwpck_require__(97433) class StreamHandler extends AsyncResource { constructor (opts, factory, callback) { @@ -9569,16 +9569,16 @@ module.exports = stream /***/ }), -/***/ 94422: +/***/ 23792: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { InvalidArgumentError, SocketError } = __nccwpck_require__(47926) +const { InvalidArgumentError, SocketError } = __nccwpck_require__(35990) const { AsyncResource } = __nccwpck_require__(92761) -const util = __nccwpck_require__(31014) -const { addSignal, removeSignal } = __nccwpck_require__(44378) +const util = __nccwpck_require__(50011) +const { addSignal, removeSignal } = __nccwpck_require__(97433) const assert = __nccwpck_require__(98061) class UpgradeHandler extends AsyncResource { @@ -9685,22 +9685,22 @@ module.exports = upgrade /***/ }), -/***/ 39663: +/***/ 20617: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -module.exports.request = __nccwpck_require__(53067) -module.exports.stream = __nccwpck_require__(21890) -module.exports.pipeline = __nccwpck_require__(25050) -module.exports.upgrade = __nccwpck_require__(94422) -module.exports.connect = __nccwpck_require__(48105) +module.exports.request = __nccwpck_require__(26562) +module.exports.stream = __nccwpck_require__(75059) +module.exports.pipeline = __nccwpck_require__(281) +module.exports.upgrade = __nccwpck_require__(23792) +module.exports.connect = __nccwpck_require__(93671) /***/ }), -/***/ 67646: +/***/ 93401: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -9710,9 +9710,9 @@ module.exports.connect = __nccwpck_require__(48105) const assert = __nccwpck_require__(98061) const { Readable } = __nccwpck_require__(84492) -const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) -const { ReadableStreamFrom } = __nccwpck_require__(31014) +const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) +const { ReadableStreamFrom } = __nccwpck_require__(50011) const kConsume = Symbol('kConsume') const kReading = Symbol('kReading') @@ -10093,15 +10093,15 @@ module.exports = { Readable: BodyReadable, chunksDecode } /***/ }), -/***/ 78393: +/***/ 80710: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { const assert = __nccwpck_require__(98061) const { ResponseStatusCodeError -} = __nccwpck_require__(47926) +} = __nccwpck_require__(35990) -const { chunksDecode } = __nccwpck_require__(67646) +const { chunksDecode } = __nccwpck_require__(93401) const CHUNK_LIMIT = 128 * 1024 async function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) { @@ -10193,7 +10193,7 @@ module.exports = { /***/ }), -/***/ 63447: +/***/ 41429: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -10201,9 +10201,9 @@ module.exports = { const net = __nccwpck_require__(87503) const assert = __nccwpck_require__(98061) -const util = __nccwpck_require__(31014) -const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(47926) -const timers = __nccwpck_require__(63125) +const util = __nccwpck_require__(50011) +const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(35990) +const timers = __nccwpck_require__(77512) function noop () {} @@ -10441,7 +10441,7 @@ module.exports = buildConnector /***/ }), -/***/ 91362: +/***/ 53451: /***/ ((module) => { "use strict"; @@ -10567,7 +10567,7 @@ module.exports = { /***/ }), -/***/ 96005: +/***/ 65543: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -10777,7 +10777,7 @@ module.exports = { /***/ }), -/***/ 47926: +/***/ 35990: /***/ ((module) => { "use strict"; @@ -11210,7 +11210,7 @@ module.exports = { /***/ }), -/***/ 82075: +/***/ 13484: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -11219,7 +11219,7 @@ module.exports = { const { InvalidArgumentError, NotSupportedError -} = __nccwpck_require__(47926) +} = __nccwpck_require__(35990) const assert = __nccwpck_require__(98061) const { isValidHTTPToken, @@ -11234,9 +11234,9 @@ const { validateHandler, getServerName, normalizedMethodRecords -} = __nccwpck_require__(31014) -const { channels } = __nccwpck_require__(96005) -const { headerNameLowerCasedRecord } = __nccwpck_require__(91362) +} = __nccwpck_require__(50011) +const { channels } = __nccwpck_require__(65543) +const { headerNameLowerCasedRecord } = __nccwpck_require__(53451) // Verifies that a given path is valid does not contain control chars \x00 to \x20 const invalidPathRegex = /[^\u0021-\u00ff]/ @@ -11479,77 +11479,11 @@ class Request { } } - /** - * @param {number|null} statusCode - * @param {Buffer[]|null} headers - * @param {import('node:stream').Duplex} socket - * @param {string} [statusText] - */ - onUpgrade (statusCode, headers, socket, statusText = '') { - this.onFinally() - + onUpgrade (statusCode, headers, socket) { assert(!this.aborted) assert(!this.completed) - if (statusCode !== null) { - this.#publishUpgradeHeaders(statusCode, headers, statusText) - } - - const result = this[kHandler].onUpgrade(statusCode, headers, socket) - - if (!this.aborted) { - this.completed = true - if (statusCode !== null) { - this.#publishUpgradeTrailers() - } - } - - return result - } - - /** - * @param {number} statusCode - * @param {import('node:http2').IncomingHttpHeaders} headers - * @param {(headers: import('node:http2').IncomingHttpHeaders) => Buffer[]} parseHeaders - * @param {string} [statusText] - */ - onUpgradeResponse (statusCode, headers, parseHeaders, statusText = '') { - assert(!this.aborted) - assert(this.completed) - - if (channels.headers.hasSubscribers) { - this.#publishUpgradeHeaders(statusCode, parseHeaders(headers), statusText) - } - this.#publishUpgradeTrailers() - } - - /** - * @param {Error} error - */ - onUpgradeError (error) { - assert(!this.aborted) - assert(this.completed) - - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }) - } - } - - /** - * @param {number} statusCode - * @param {Buffer[]} headers - * @param {string} statusText - */ - #publishUpgradeHeaders (statusCode, headers, statusText) { - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) - } - } - - #publishUpgradeTrailers () { - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers: [] }) - } + return this[kHandler].onUpgrade(statusCode, headers, socket) } onComplete (trailers) { @@ -11700,7 +11634,7 @@ module.exports = Request /***/ }), -/***/ 94822: +/***/ 13638: /***/ ((module) => { module.exports = { @@ -11774,7 +11708,7 @@ module.exports = { /***/ }), -/***/ 52731: +/***/ 30723: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -11783,7 +11717,7 @@ module.exports = { const { wellknownHeaderNames, headerNameLowerCasedRecord -} = __nccwpck_require__(91362) +} = __nccwpck_require__(53451) class TstNode { /** @type {any} */ @@ -11934,14 +11868,14 @@ module.exports = { /***/ }), -/***/ 31014: +/***/ 50011: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { kDestroyed, kBodyUsed, kListeners, kBody } = __nccwpck_require__(94822) +const { kDestroyed, kBodyUsed, kListeners, kBody } = __nccwpck_require__(13638) const { IncomingMessage } = __nccwpck_require__(88849) const stream = __nccwpck_require__(84492) const net = __nccwpck_require__(87503) @@ -11949,9 +11883,9 @@ const { Blob } = __nccwpck_require__(72254) const nodeUtil = __nccwpck_require__(47261) const { stringify } = __nccwpck_require__(39630) const { EventEmitter: EE } = __nccwpck_require__(15673) -const { InvalidArgumentError } = __nccwpck_require__(47926) -const { headerNameLowerCasedRecord } = __nccwpck_require__(91362) -const { tree } = __nccwpck_require__(52731) +const { InvalidArgumentError } = __nccwpck_require__(35990) +const { headerNameLowerCasedRecord } = __nccwpck_require__(53451) +const { tree } = __nccwpck_require__(30723) const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) @@ -12661,19 +12595,19 @@ module.exports = { /***/ }), -/***/ 1880: +/***/ 73274: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { InvalidArgumentError } = __nccwpck_require__(47926) -const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(94822) -const DispatcherBase = __nccwpck_require__(26844) -const Pool = __nccwpck_require__(49771) -const Client = __nccwpck_require__(6237) -const util = __nccwpck_require__(31014) -const createRedirectInterceptor = __nccwpck_require__(91467) +const { InvalidArgumentError } = __nccwpck_require__(35990) +const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(13638) +const DispatcherBase = __nccwpck_require__(39504) +const Pool = __nccwpck_require__(80229) +const Client = __nccwpck_require__(85849) +const util = __nccwpck_require__(50011) +const createRedirectInterceptor = __nccwpck_require__(40928) const kOnConnect = Symbol('onConnect') const kOnDisconnect = Symbol('onDisconnect') @@ -12690,7 +12624,7 @@ function defaultFactory (origin, opts) { } class Agent extends DispatcherBase { - constructor ({ factory = defaultFactory, maxRedirections = 0, connect, tls, ...options } = {}) { + constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { if (typeof factory !== 'function') { throw new InvalidArgumentError('factory must be a function.') } @@ -12709,15 +12643,11 @@ class Agent extends DispatcherBase { connect = { ...connect } } - if (tls && typeof tls !== 'function') { - tls = { ...tls } - } - this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })] - this[kOptions] = { ...util.deepClone(options), connect, tls } + this[kOptions] = { ...util.deepClone(options), connect } this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : undefined @@ -12802,7 +12732,7 @@ module.exports = Agent /***/ }), -/***/ 88214: +/***/ 68255: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -12811,7 +12741,7 @@ module.exports = Agent const { BalancedPoolMissingUpstreamError, InvalidArgumentError -} = __nccwpck_require__(47926) +} = __nccwpck_require__(35990) const { PoolBase, kClients, @@ -12819,10 +12749,10 @@ const { kAddClient, kRemoveClient, kGetDispatcher -} = __nccwpck_require__(97367) -const Pool = __nccwpck_require__(49771) -const { kUrl, kInterceptors } = __nccwpck_require__(94822) -const { parseOrigin } = __nccwpck_require__(31014) +} = __nccwpck_require__(1467) +const Pool = __nccwpck_require__(80229) +const { kUrl, kInterceptors } = __nccwpck_require__(13638) +const { parseOrigin } = __nccwpck_require__(50011) const kFactory = Symbol('factory') const kOptions = Symbol('options') @@ -13019,7 +12949,7 @@ module.exports = BalancedPool /***/ }), -/***/ 78365: +/***/ 14429: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -13028,9 +12958,9 @@ module.exports = BalancedPool /* global WebAssembly */ const assert = __nccwpck_require__(98061) -const util = __nccwpck_require__(31014) -const { channels } = __nccwpck_require__(96005) -const timers = __nccwpck_require__(63125) +const util = __nccwpck_require__(50011) +const { channels } = __nccwpck_require__(65543) +const timers = __nccwpck_require__(77512) const { RequestContentLengthMismatchError, ResponseContentLengthMismatchError, @@ -13043,7 +12973,7 @@ const { BodyTimeoutError, HTTPParserError, ResponseExceededMaxSizeError -} = __nccwpck_require__(47926) +} = __nccwpck_require__(35990) const { kUrl, kReset, @@ -13076,9 +13006,9 @@ const { kOnError, kResume, kHTTPContext -} = __nccwpck_require__(94822) +} = __nccwpck_require__(13638) -const constants = __nccwpck_require__(27692) +const constants = __nccwpck_require__(41721) const EMPTY_BUF = Buffer.alloc(0) const FastBuffer = Buffer[Symbol.species] const addListener = util.addListener @@ -13090,11 +13020,11 @@ const kSocketUsed = Symbol('kSocketUsed') let extractBody async function lazyllhttp () { - const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(84888) : undefined + const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(46081) : undefined let mod try { - mod = await WebAssembly.compile(__nccwpck_require__(31445)) + mod = await WebAssembly.compile(__nccwpck_require__(97877)) } catch (e) { /* istanbul ignore next */ @@ -13102,7 +13032,7 @@ async function lazyllhttp () { // being enabled, but the occurring of this other error // * https://github.com/emscripten-core/emscripten/issues/11495 // got me to remove that check to avoid breaking Node 12. - mod = await WebAssembly.compile(llhttpWasmData || __nccwpck_require__(84888)) + mod = await WebAssembly.compile(llhttpWasmData || __nccwpck_require__(46081)) } return await WebAssembly.instantiate(mod, { @@ -13457,7 +13387,7 @@ class Parser { } onUpgrade (head) { - const { upgrade, client, socket, headers, statusCode, statusText } = this + const { upgrade, client, socket, headers, statusCode } = this assert(upgrade) assert(client[kSocket] === socket) @@ -13492,10 +13422,9 @@ class Parser { client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')) try { - request.onUpgrade(statusCode, headers, socket, statusText) - } catch (error) { - util.errorRequest(client, request, error) - util.destroy(socket, error) + request.onUpgrade(statusCode, headers, socket) + } catch (err) { + util.destroy(socket, err) } client[kResume]() @@ -13752,6 +13681,8 @@ async function connectH1 (client, socket) { socket[kParser] = new Parser(client, socket, llhttpInstance) addListener(socket, 'error', function (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') + const parser = this[kParser] // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded @@ -14017,7 +13948,7 @@ function writeH1 (client, request) { if (util.isFormDataLike(body)) { if (!extractBody) { - extractBody = (__nccwpck_require__(48203).extractBody) + extractBody = (__nccwpck_require__(12749).extractBody) } const [bodyStream, contentType] = extractBody(body) @@ -14074,22 +14005,12 @@ function writeH1 (client, request) { const socket = client[kSocket] clearIdleSocketValidation(socket) - /** - * @param {Error} [error] - */ - const abort = (error) => { - if (request.aborted) { - return - } - - if (request.completed) { - if (request.upgrade || request.method === 'CONNECT') { - util.destroy(socket, new InformationalError('aborted')) - } + const abort = (err) => { + if (request.aborted || request.completed) { return } - util.errorRequest(client, request, error || new RequestAbortedError()) + util.errorRequest(client, request, err || new RequestAbortedError()) util.destroy(body) util.destroy(socket, new InformationalError('aborted')) @@ -14540,22 +14461,21 @@ module.exports = connectH1 /***/ }), -/***/ 55267: +/***/ 34879: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { errorMonitor } = __nccwpck_require__(15673) const { pipeline } = __nccwpck_require__(84492) -const util = __nccwpck_require__(31014) +const util = __nccwpck_require__(50011) const { RequestContentLengthMismatchError, RequestAbortedError, SocketError, InformationalError -} = __nccwpck_require__(47926) +} = __nccwpck_require__(35990) const { kUrl, kReset, @@ -14574,7 +14494,7 @@ const { kResume, kSize, kHTTPContext -} = __nccwpck_require__(94822) +} = __nccwpck_require__(13638) const kOpenStreams = Symbol('open streams') @@ -14624,15 +14544,6 @@ function parseH2Headers (headers) { return result } -/** - * @param {import('node:http2').IncomingHttpHeaders} headers - * @returns {Buffer[]} - */ -function parseH2ResponseHeaders (headers) { - const { [HTTP2_HEADER_STATUS]: _statusCode, ...realHeaders } = headers - return parseH2Headers(realHeaders) -} - async function connectH2 (client, socket) { client[kSocket] = socket @@ -14682,6 +14593,8 @@ async function connectH2 (client, socket) { socket[kHTTP2Session] = session util.addListener(socket, 'error', function (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') + this[kError] = err this[kClient][kOnError](err) @@ -14755,6 +14668,8 @@ function resumeH2 (client) { } function onHttp2SessionError (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') + this[kSocket][kError] = err this[kClient][kOnError](err) } @@ -14849,32 +14764,22 @@ function writeH2 (client, request) { headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}` headers[HTTP2_HEADER_METHOD] = method - /** - * @param {Error} [error] - */ - const abort = (error) => { - if (request.aborted) { + const abort = (err) => { + if (request.aborted || request.completed) { return } - if (request.completed) { - if (method === 'CONNECT' && stream != null) { - util.destroy(stream, error || new RequestAbortedError()) - } - return - } - - error = error || new RequestAbortedError() + err = err || new RequestAbortedError() - util.errorRequest(client, request, error) + util.errorRequest(client, request, err) if (stream != null) { - util.destroy(stream, error) + util.destroy(stream, err) } // We do not destroy the socket as we can continue using the session // the stream get's destroyed and the session remains to create new streams - util.destroy(body, error) + util.destroy(body, err) client[kQueue][client[kRunningIdx]++] = null client[kResume]() } @@ -14893,57 +14798,25 @@ function writeH2 (client, request) { if (method === 'CONNECT') { session.ref() + // We are already connected, streams are pending, first request + // will create a new stream. We trigger a request to create the stream and wait until + // `ready` event is triggered // We disabled endStream to allow the user to write to the stream stream = session.request(headers, { endStream: false, signal }) - let upgradeResponseFinished = false - - /** - * @param {import('node:http2').IncomingHttpHeaders} headers - */ - const onResponse = (headers) => { - upgradeResponseFinished = true - stream.off(errorMonitor, onUpgradeError) - request.onUpgradeResponse(Number(headers[HTTP2_HEADER_STATUS]), headers, parseH2ResponseHeaders) - } - - /** - * @param {Error} error - */ - const onUpgradeError = (error) => { - upgradeResponseFinished = true - stream.off('response', onResponse) - request.onUpgradeError(error) - } - const onReady = () => { - try { - request.onUpgrade(null, null, stream) - } catch (error) { - stream.off('response', onResponse) - abort(error) - return - } - - if (request.aborted) { - return - } - - stream.off('error', abort) - stream.once(errorMonitor, onUpgradeError) + if (stream.id && !stream.pending) { + request.onUpgrade(null, null, stream) + ++session[kOpenStreams] client[kQueue][client[kRunningIdx]++] = null + } else { + stream.once('ready', () => { + request.onUpgrade(null, null, stream) + ++session[kOpenStreams] + client[kQueue][client[kRunningIdx]++] = null + }) } - stream.once('response', onResponse) - stream.once('error', abort) - ++session[kOpenStreams] - onReady() - stream.once('close', () => { - if (!upgradeResponseFinished && request.completed) { - stream.off('response', onResponse) - stream.off(errorMonitor, onUpgradeError) - request.onUpgradeError(new InformationalError(`HTTP/2: "stream error" received - code ${stream.rstCode}`)) - } session[kOpenStreams] -= 1 if (session[kOpenStreams] === 0) session.unref() }) @@ -14980,7 +14853,7 @@ function writeH2 (client, request) { let contentLength = util.bodyLength(body) if (util.isFormDataLike(body)) { - extractBody ??= (__nccwpck_require__(48203).extractBody) + extractBody ??= (__nccwpck_require__(12749).extractBody) const [bodyStream, contentType] = extractBody(body) headers['content-type'] = contentType @@ -15340,7 +15213,7 @@ module.exports = connectH2 /***/ }), -/***/ 6237: +/***/ 85849: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -15351,16 +15224,16 @@ module.exports = connectH2 const assert = __nccwpck_require__(98061) const net = __nccwpck_require__(87503) const http = __nccwpck_require__(88849) -const util = __nccwpck_require__(31014) -const { channels } = __nccwpck_require__(96005) -const Request = __nccwpck_require__(82075) -const DispatcherBase = __nccwpck_require__(26844) +const util = __nccwpck_require__(50011) +const { channels } = __nccwpck_require__(65543) +const Request = __nccwpck_require__(13484) +const DispatcherBase = __nccwpck_require__(39504) const { InvalidArgumentError, InformationalError, ClientDestroyedError -} = __nccwpck_require__(47926) -const buildConnector = __nccwpck_require__(63447) +} = __nccwpck_require__(35990) +const buildConnector = __nccwpck_require__(41429) const { kUrl, kServerName, @@ -15402,9 +15275,9 @@ const { kHTTPContext, kMaxConcurrentStreams, kResume -} = __nccwpck_require__(94822) -const connectH1 = __nccwpck_require__(78365) -const connectH2 = __nccwpck_require__(55267) +} = __nccwpck_require__(13638) +const connectH1 = __nccwpck_require__(14429) +const connectH2 = __nccwpck_require__(34879) let deprecatedInterceptorWarned = false const kClosedResolve = Symbol('kClosedResolve') @@ -15453,10 +15326,9 @@ class Client extends DispatcherBase { // h2 maxConcurrentStreams, allowH2, - webSocket, - eventSource + webSocket } = {}) { - super({ webSocket, eventSource }) + super({ webSocket }) if (keepAlive !== undefined) { throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') @@ -15712,7 +15584,7 @@ class Client extends DispatcherBase { } } -const createRedirectInterceptor = __nccwpck_require__(91467) +const createRedirectInterceptor = __nccwpck_require__(40928) function onError (client, err) { if ( @@ -15972,26 +15844,24 @@ module.exports = Client /***/ }), -/***/ 26844: +/***/ 39504: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const buffer = __nccwpck_require__(72254) -const Dispatcher = __nccwpck_require__(32171) +const Dispatcher = __nccwpck_require__(66071) const { ClientDestroyedError, ClientClosedError, InvalidArgumentError -} = __nccwpck_require__(47926) -const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = __nccwpck_require__(94822) +} = __nccwpck_require__(35990) +const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = __nccwpck_require__(13638) const kOnDestroyed = Symbol('onDestroyed') const kOnClosed = Symbol('onClosed') const kInterceptedDispatch = Symbol('Intercepted Dispatch') const kWebSocketOptions = Symbol('webSocketOptions') -const kEventSourceOptions = Symbol('eventSourceOptions') class DispatcherBase extends Dispatcher { constructor (opts) { @@ -16002,7 +15872,6 @@ class DispatcherBase extends Dispatcher { this[kClosed] = false this[kOnClosed] = [] this[kWebSocketOptions] = opts?.webSocket ?? {} - this[kEventSourceOptions] = opts?.eventSource ?? {} } get webSocketOptions () { @@ -16012,12 +15881,6 @@ class DispatcherBase extends Dispatcher { } } - get eventSourceOptions () { - return { - maxEventSize: this[kEventSourceOptions].maxEventSize ?? buffer.kStringMaxLength - } - } - get destroyed () { return this[kDestroyed] } @@ -16188,7 +16051,7 @@ module.exports = DispatcherBase /***/ }), -/***/ 32171: +/***/ 66071: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -16261,16 +16124,16 @@ module.exports = Dispatcher /***/ }), -/***/ 42547: +/***/ 29941: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const DispatcherBase = __nccwpck_require__(26844) -const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = __nccwpck_require__(94822) -const ProxyAgent = __nccwpck_require__(57912) -const Agent = __nccwpck_require__(1880) +const DispatcherBase = __nccwpck_require__(39504) +const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = __nccwpck_require__(13638) +const ProxyAgent = __nccwpck_require__(87187) +const Agent = __nccwpck_require__(73274) const DEFAULT_PORTS = { 'http:': 80, @@ -16429,7 +16292,7 @@ module.exports = EnvHttpProxyAgent /***/ }), -/***/ 94856: +/***/ 27092: /***/ ((module) => { "use strict"; @@ -16554,16 +16417,16 @@ module.exports = class FixedQueue { /***/ }), -/***/ 97367: +/***/ 1467: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const DispatcherBase = __nccwpck_require__(26844) -const FixedQueue = __nccwpck_require__(94856) -const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(94822) -const PoolStats = __nccwpck_require__(61279) +const DispatcherBase = __nccwpck_require__(39504) +const FixedQueue = __nccwpck_require__(27092) +const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(13638) +const PoolStats = __nccwpck_require__(48309) const kClients = Symbol('clients') const kNeedDrain = Symbol('needDrain') @@ -16756,10 +16619,10 @@ module.exports = { /***/ }), -/***/ 61279: +/***/ 48309: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(94822) +const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(13638) const kPool = Symbol('pool') class PoolStats { @@ -16797,7 +16660,7 @@ module.exports = PoolStats /***/ }), -/***/ 49771: +/***/ 80229: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -16809,14 +16672,14 @@ const { kNeedDrain, kAddClient, kGetDispatcher -} = __nccwpck_require__(97367) -const Client = __nccwpck_require__(6237) +} = __nccwpck_require__(1467) +const Client = __nccwpck_require__(85849) const { InvalidArgumentError -} = __nccwpck_require__(47926) -const util = __nccwpck_require__(31014) -const { kUrl, kInterceptors } = __nccwpck_require__(94822) -const buildConnector = __nccwpck_require__(63447) +} = __nccwpck_require__(35990) +const util = __nccwpck_require__(50011) +const { kUrl, kInterceptors } = __nccwpck_require__(13638) +const buildConnector = __nccwpck_require__(41429) const kOptions = Symbol('options') const kConnections = Symbol('connections') @@ -16912,20 +16775,20 @@ module.exports = Pool /***/ }), -/***/ 57912: +/***/ 87187: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(94822) +const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(13638) const { URL } = __nccwpck_require__(41041) -const Agent = __nccwpck_require__(1880) -const Pool = __nccwpck_require__(49771) -const DispatcherBase = __nccwpck_require__(26844) -const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = __nccwpck_require__(47926) -const buildConnector = __nccwpck_require__(63447) -const Client = __nccwpck_require__(6237) +const Agent = __nccwpck_require__(73274) +const Pool = __nccwpck_require__(80229) +const DispatcherBase = __nccwpck_require__(39504) +const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = __nccwpck_require__(35990) +const buildConnector = __nccwpck_require__(41429) +const Client = __nccwpck_require__(85849) const kAgent = Symbol('proxy agent') const kClient = Symbol('proxy client') @@ -17194,14 +17057,14 @@ module.exports = ProxyAgent /***/ }), -/***/ 42626: +/***/ 55184: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const Dispatcher = __nccwpck_require__(32171) -const RetryHandler = __nccwpck_require__(12671) +const Dispatcher = __nccwpck_require__(66071) +const RetryHandler = __nccwpck_require__(64524) class RetryAgent extends Dispatcher { #agent = null @@ -17237,7 +17100,7 @@ module.exports = RetryAgent /***/ }), -/***/ 53139: +/***/ 19405: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -17246,8 +17109,8 @@ module.exports = RetryAgent // We include a version number for the Dispatcher API. In case of breaking changes, // this version number must be increased to avoid conflicts. const globalDispatcher = Symbol.for('undici.globalDispatcher.1') -const { InvalidArgumentError } = __nccwpck_require__(47926) -const Agent = __nccwpck_require__(1880) +const { InvalidArgumentError } = __nccwpck_require__(35990) +const Agent = __nccwpck_require__(73274) if (getGlobalDispatcher() === undefined) { setGlobalDispatcher(new Agent()) @@ -17277,7 +17140,7 @@ module.exports = { /***/ }), -/***/ 59280: +/***/ 41738: /***/ ((module) => { "use strict"; @@ -17329,16 +17192,16 @@ module.exports = class DecoratorHandler { /***/ }), -/***/ 90008: +/***/ 64014: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(31014) -const { kBodyUsed } = __nccwpck_require__(94822) +const util = __nccwpck_require__(50011) +const { kBodyUsed } = __nccwpck_require__(13638) const assert = __nccwpck_require__(98061) -const { InvalidArgumentError } = __nccwpck_require__(47926) +const { InvalidArgumentError } = __nccwpck_require__(35990) const EE = __nccwpck_require__(15673) const redirectableStatusCodes = [300, 301, 302, 303, 307, 308] @@ -17569,21 +17432,21 @@ module.exports = RedirectHandler /***/ }), -/***/ 12671: +/***/ 64524: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { kRetryHandlerDefaultRetry } = __nccwpck_require__(94822) -const { RequestRetryError } = __nccwpck_require__(47926) +const { kRetryHandlerDefaultRetry } = __nccwpck_require__(13638) +const { RequestRetryError } = __nccwpck_require__(35990) const { isDisturbed, parseHeaders, parseRangeHeader, wrapRequestBody -} = __nccwpck_require__(31014) +} = __nccwpck_require__(50011) function calculateRetryAfterHeader (retryAfter) { const current = Date.now() @@ -17780,10 +17643,7 @@ class RetryHandler { this.retryCount += 1 if (statusCode >= 300) { - // Only expose a response if no earlier attempt has reached the caller. - // Otherwise abort this attempt so the error settles the existing body - // instead of replacing it with a new response. - if (!this.headersSent && this.retryOpts.statusCodes.includes(statusCode) === false) { + if (this.retryOpts.statusCodes.includes(statusCode) === false) { this.headersSent = true this.checkpointResponseEnd(headers, resume) return this.handler.onHeaders( @@ -18014,15 +17874,15 @@ module.exports = RetryHandler /***/ }), -/***/ 26290: +/***/ 20346: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { isIP } = __nccwpck_require__(87503) const { lookup } = __nccwpck_require__(30604) -const DecoratorHandler = __nccwpck_require__(59280) -const { InvalidArgumentError, InformationalError } = __nccwpck_require__(47926) +const DecoratorHandler = __nccwpck_require__(41738) +const { InvalidArgumentError, InformationalError } = __nccwpck_require__(35990) const maxInt = Math.pow(2, 31) - 1 class DNSInstance { @@ -18397,15 +18257,15 @@ module.exports = interceptorOpts => { /***/ }), -/***/ 9408: +/***/ 12493: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(31014) -const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(47926) -const DecoratorHandler = __nccwpck_require__(59280) +const util = __nccwpck_require__(50011) +const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(35990) +const DecoratorHandler = __nccwpck_require__(41738) class DumpHandler extends DecoratorHandler { #maxSize = 1024 * 1024 @@ -18528,13 +18388,13 @@ module.exports = createDumpInterceptor /***/ }), -/***/ 91467: +/***/ 40928: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const RedirectHandler = __nccwpck_require__(90008) +const RedirectHandler = __nccwpck_require__(64014) function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { return (dispatch) => { @@ -18557,12 +18417,12 @@ module.exports = createRedirectInterceptor /***/ }), -/***/ 42182: +/***/ 74872: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const RedirectHandler = __nccwpck_require__(90008) +const RedirectHandler = __nccwpck_require__(64014) module.exports = opts => { const globalMaxRedirections = opts?.maxRedirections @@ -18589,12 +18449,12 @@ module.exports = opts => { /***/ }), -/***/ 17389: +/***/ 79637: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const RetryHandler = __nccwpck_require__(12671) +const RetryHandler = __nccwpck_require__(64524) module.exports = globalOpts => { return dispatch => { @@ -18616,14 +18476,14 @@ module.exports = globalOpts => { /***/ }), -/***/ 27692: +/***/ 41721: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; -const utils_1 = __nccwpck_require__(5608); +const utils_1 = __nccwpck_require__(69573); // C headers var ERROR; (function (ERROR) { @@ -18901,7 +18761,7 @@ exports.SPECIAL_HEADERS = { /***/ }), -/***/ 84888: +/***/ 46081: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -18914,7 +18774,7 @@ module.exports = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f3 /***/ }), -/***/ 31445: +/***/ 97877: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -18927,7 +18787,7 @@ module.exports = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f3 /***/ }), -/***/ 5608: +/***/ 69573: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -18949,14 +18809,14 @@ exports.enumToMap = enumToMap; /***/ }), -/***/ 89937: +/***/ 46432: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kClients } = __nccwpck_require__(94822) -const Agent = __nccwpck_require__(1880) +const { kClients } = __nccwpck_require__(13638) +const Agent = __nccwpck_require__(73274) const { kAgent, kMockAgentSet, @@ -18967,14 +18827,14 @@ const { kGetNetConnect, kOptions, kFactory -} = __nccwpck_require__(89083) -const MockClient = __nccwpck_require__(69636) -const MockPool = __nccwpck_require__(40660) -const { matchValue, buildMockOptions } = __nccwpck_require__(16826) -const { InvalidArgumentError, UndiciError } = __nccwpck_require__(47926) -const Dispatcher = __nccwpck_require__(32171) -const Pluralizer = __nccwpck_require__(69437) -const PendingInterceptorsFormatter = __nccwpck_require__(9965) +} = __nccwpck_require__(63822) +const MockClient = __nccwpck_require__(4227) +const MockPool = __nccwpck_require__(36575) +const { matchValue, buildMockOptions } = __nccwpck_require__(38053) +const { InvalidArgumentError, UndiciError } = __nccwpck_require__(35990) +const Dispatcher = __nccwpck_require__(66071) +const Pluralizer = __nccwpck_require__(97472) +const PendingInterceptorsFormatter = __nccwpck_require__(56155) class MockAgent extends Dispatcher { constructor (opts) { @@ -19117,15 +18977,15 @@ module.exports = MockAgent /***/ }), -/***/ 69636: +/***/ 4227: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { promisify } = __nccwpck_require__(47261) -const Client = __nccwpck_require__(6237) -const { buildMockDispatch } = __nccwpck_require__(16826) +const Client = __nccwpck_require__(85849) +const { buildMockDispatch } = __nccwpck_require__(38053) const { kDispatches, kMockAgent, @@ -19134,10 +18994,10 @@ const { kOrigin, kOriginalDispatch, kConnected -} = __nccwpck_require__(89083) -const { MockInterceptor } = __nccwpck_require__(73387) -const Symbols = __nccwpck_require__(94822) -const { InvalidArgumentError } = __nccwpck_require__(47926) +} = __nccwpck_require__(63822) +const { MockInterceptor } = __nccwpck_require__(9238) +const Symbols = __nccwpck_require__(13638) +const { InvalidArgumentError } = __nccwpck_require__(35990) /** * MockClient provides an API that extends the Client to influence the mockDispatches. @@ -19184,13 +19044,13 @@ module.exports = MockClient /***/ }), -/***/ 33519: +/***/ 19329: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { UndiciError } = __nccwpck_require__(47926) +const { UndiciError } = __nccwpck_require__(35990) const kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED') @@ -19220,13 +19080,13 @@ module.exports = { /***/ }), -/***/ 73387: +/***/ 9238: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(16826) +const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(38053) const { kDispatches, kDispatchKey, @@ -19234,9 +19094,9 @@ const { kDefaultTrailers, kContentLength, kMockDispatch -} = __nccwpck_require__(89083) -const { InvalidArgumentError } = __nccwpck_require__(47926) -const { buildURL } = __nccwpck_require__(31014) +} = __nccwpck_require__(63822) +const { InvalidArgumentError } = __nccwpck_require__(35990) +const { buildURL } = __nccwpck_require__(50011) /** * Defines the scope API for an interceptor reply @@ -19435,15 +19295,15 @@ module.exports.MockScope = MockScope /***/ }), -/***/ 40660: +/***/ 36575: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { promisify } = __nccwpck_require__(47261) -const Pool = __nccwpck_require__(49771) -const { buildMockDispatch } = __nccwpck_require__(16826) +const Pool = __nccwpck_require__(80229) +const { buildMockDispatch } = __nccwpck_require__(38053) const { kDispatches, kMockAgent, @@ -19452,10 +19312,10 @@ const { kOrigin, kOriginalDispatch, kConnected -} = __nccwpck_require__(89083) -const { MockInterceptor } = __nccwpck_require__(73387) -const Symbols = __nccwpck_require__(94822) -const { InvalidArgumentError } = __nccwpck_require__(47926) +} = __nccwpck_require__(63822) +const { MockInterceptor } = __nccwpck_require__(9238) +const Symbols = __nccwpck_require__(13638) +const { InvalidArgumentError } = __nccwpck_require__(35990) /** * MockPool provides an API that extends the Pool to influence the mockDispatches. @@ -19502,7 +19362,7 @@ module.exports = MockPool /***/ }), -/***/ 89083: +/***/ 63822: /***/ ((module) => { "use strict"; @@ -19533,21 +19393,21 @@ module.exports = { /***/ }), -/***/ 16826: +/***/ 38053: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { MockNotMatchedError } = __nccwpck_require__(33519) +const { MockNotMatchedError } = __nccwpck_require__(19329) const { kDispatches, kMockAgent, kOriginalDispatch, kOrigin, kGetNetConnect -} = __nccwpck_require__(89083) -const { buildURL } = __nccwpck_require__(31014) +} = __nccwpck_require__(63822) +const { buildURL } = __nccwpck_require__(50011) const { STATUS_CODES } = __nccwpck_require__(88849) const { types: { @@ -19908,7 +19768,7 @@ module.exports = { /***/ }), -/***/ 9965: +/***/ 56155: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -19959,7 +19819,7 @@ module.exports = class PendingInterceptorsFormatter { /***/ }), -/***/ 69437: +/***/ 97472: /***/ ((module) => { "use strict"; @@ -19996,7 +19856,7 @@ module.exports = class Pluralizer { /***/ }), -/***/ 63125: +/***/ 77512: /***/ ((module) => { "use strict"; @@ -20427,21 +20287,21 @@ module.exports = { /***/ }), -/***/ 37917: +/***/ 12714: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kConstruct } = __nccwpck_require__(275) -const { urlEquals, getFieldValues } = __nccwpck_require__(40424) -const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(31014) -const { webidl } = __nccwpck_require__(96163) -const { Response, cloneResponse, fromInnerResponse } = __nccwpck_require__(63042) -const { Request, fromInnerRequest } = __nccwpck_require__(11192) -const { kState } = __nccwpck_require__(23200) -const { fetching } = __nccwpck_require__(87321) -const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(40667) +const { kConstruct } = __nccwpck_require__(50591) +const { urlEquals, getFieldValues } = __nccwpck_require__(99205) +const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(50011) +const { webidl } = __nccwpck_require__(2227) +const { Response, cloneResponse, fromInnerResponse } = __nccwpck_require__(51132) +const { Request, fromInnerRequest } = __nccwpck_require__(83211) +const { kState } = __nccwpck_require__(14935) +const { fetching } = __nccwpck_require__(78329) +const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(98730) const assert = __nccwpck_require__(98061) /** @@ -21294,16 +21154,16 @@ module.exports = { /***/ }), -/***/ 13256: +/***/ 11069: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kConstruct } = __nccwpck_require__(275) -const { Cache } = __nccwpck_require__(37917) -const { webidl } = __nccwpck_require__(96163) -const { kEnumerableProperty } = __nccwpck_require__(31014) +const { kConstruct } = __nccwpck_require__(50591) +const { Cache } = __nccwpck_require__(12714) +const { webidl } = __nccwpck_require__(2227) +const { kEnumerableProperty } = __nccwpck_require__(50011) class CacheStorage { /** @@ -21454,28 +21314,28 @@ module.exports = { /***/ }), -/***/ 275: +/***/ 50591: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; module.exports = { - kConstruct: (__nccwpck_require__(94822).kConstruct) + kConstruct: (__nccwpck_require__(13638).kConstruct) } /***/ }), -/***/ 40424: +/***/ 99205: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { URLSerializer } = __nccwpck_require__(68889) -const { isValidHeaderName } = __nccwpck_require__(40667) +const { URLSerializer } = __nccwpck_require__(96730) +const { isValidHeaderName } = __nccwpck_require__(98730) /** * @see https://url.spec.whatwg.org/#concept-url-equals @@ -21520,7 +21380,7 @@ module.exports = { /***/ }), -/***/ 40503: +/***/ 16155: /***/ ((module) => { "use strict"; @@ -21540,16 +21400,16 @@ module.exports = { /***/ }), -/***/ 84245: +/***/ 15855: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { parseSetCookie } = __nccwpck_require__(89386) -const { stringify } = __nccwpck_require__(74600) -const { webidl } = __nccwpck_require__(96163) -const { Headers } = __nccwpck_require__(33924) +const { parseSetCookie } = __nccwpck_require__(80742) +const { stringify } = __nccwpck_require__(93989) +const { webidl } = __nccwpck_require__(2227) +const { Headers } = __nccwpck_require__(10561) /** * @typedef {Object} Cookie @@ -21732,15 +21592,15 @@ module.exports = { /***/ }), -/***/ 89386: +/***/ 80742: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(40503) -const { isCTLExcludingHtab } = __nccwpck_require__(74600) -const { collectASequenceOfCodePointsFast } = __nccwpck_require__(68889) +const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(16155) +const { isCTLExcludingHtab } = __nccwpck_require__(93989) +const { collectASequenceOfCodePointsFast } = __nccwpck_require__(96730) const assert = __nccwpck_require__(98061) /** @@ -22050,7 +21910,7 @@ module.exports = { /***/ }), -/***/ 74600: +/***/ 93989: /***/ ((module) => { "use strict"; @@ -22410,14 +22270,13 @@ module.exports = { /***/ }), -/***/ 71054: +/***/ 41408: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const buffer = __nccwpck_require__(72254) const { Transform } = __nccwpck_require__(84492) -const { isASCIINumber, isValidLastEventId } = __nccwpck_require__(97409) +const { isASCIINumber, isValidLastEventId } = __nccwpck_require__(19079) /** * @type {number[]} BOM @@ -22440,19 +22299,11 @@ const COLON = 0x3A */ const SPACE = 0x20 -const defaultMaxEventSize = buffer.kStringMaxLength - const DATA = Buffer.from('data') const EVENT = Buffer.from('event') const ID = Buffer.from('id') const RETRY = Buffer.from('retry') -// Each data field creates a string node, and each unconsumed input chunk keeps -// a Buffer wrapper. The absolute ceiling protects the large default byte limit. -const minParserItems = 1024 -const maxParserItems = 131072 -const bytesPerParserItem = 128 - function isASCIINumberBytes (buffer, start) { if (start >= buffer.length) { return false @@ -22491,12 +22342,6 @@ function isFieldName (line, length, field) { return true } -function createMaxEventSizeExceededError () { - const error = new Error('EventSource message size exceeded') - error.aborted = false - return error -} - /** * @typedef {object} EventSourceStreamEvent * @type {object} @@ -22545,13 +22390,6 @@ class EventSourceStream extends Transform { pos = 0 lineChunkIndex = 0 linePos = 0 - lineLength = 0 - eventSize = 0 - eventFieldSizes = { data: 0, event: 0, id: 0, retry: 0 } - dataLineCount = 0 - maxEventSize - maxDataLines - maxBufferedChunks event = { data: undefined, @@ -22562,7 +22400,6 @@ class EventSourceStream extends Transform { /** * @param {object} options - * @param {number} [options.maxEventSize] * @param {eventSourceSettings} options.eventSourceSettings * @param {Function} [options.push] */ @@ -22574,12 +22411,6 @@ class EventSourceStream extends Transform { super(options) this.state = options.eventSourceSettings || {} - this.maxEventSize = options.maxEventSize ?? defaultMaxEventSize - const parserItemLimit = this.maxEventSize > 0 - ? Math.min(maxParserItems, Math.max(minParserItems, Math.floor(this.maxEventSize / bytesPerParserItem))) - : 0 - this.maxDataLines = parserItemLimit - this.maxBufferedChunks = parserItemLimit if (options.push) { this.push = options.push } @@ -22597,14 +22428,6 @@ class EventSourceStream extends Transform { return } - // A leading line ending can immediately release the currently buffered - // line, even when it uses the final allowed chunk slot. - if (this.maxEventSize > 0 && - this.chunks.length >= this.maxBufferedChunks && - chunk[0] !== LF && chunk[0] !== CR) { - callback(createMaxEventSizeExceededError()) - return - } this.chunks.push(chunk) // Strip leading byte-order-mark if we opened the stream and started @@ -22683,12 +22506,7 @@ class EventSourceStream extends Transform { // In any case, we can process the line as we reached an // end-of-line character - try { - this.parseLine(this.readLine(), this.event) - } catch (error) { - callback(error) - return - } + this.parseLine(this.readLine(), this.event) this.consumeCurrentByte() // A line was processed and this could be the end of the event. We need // to check if the next line is empty to determine if the event is @@ -22697,28 +22515,15 @@ class EventSourceStream extends Transform { continue } - // readLine() is only called after CR or LF. Reject an unfinished line - // before it can retain an unbounded number of decoded chunks. The seven - // extra bytes allow the longest field prefix ("event: " or "retry: "). - if (this.maxEventSize > 0 && ++this.lineLength > this.maxEventSize + 7) { - callback(createMaxEventSizeExceededError()) - return - } this.advanceCursor() } callback() } - _destroy (error, callback) { - this.chunks.length = 0 - this.clearEvent() - super._destroy(error, callback) - } - /** * @param {Buffer} line - * @param {EventSourceStreamEvent} event + * @param {EventStreamEvent} event */ parseLine (line, event) { // If the line is empty (a blank line) @@ -22752,13 +22557,6 @@ class EventSourceStream extends Transform { } if (isFieldName(line, fieldLength, DATA)) { - if (this.maxEventSize > 0 && this.dataLineCount >= this.maxDataLines) { - throw createMaxEventSizeExceededError() - } - const valueBytes = line.length - valueStart - const dataSize = this.eventFieldSizes.data + (event.data === undefined ? 0 : 1) + valueBytes - this.setEventFieldSize('data', dataSize) - const value = line.toString('utf8', valueStart) if (event.data === undefined) { @@ -22766,13 +22564,11 @@ class EventSourceStream extends Transform { } else { event.data += `\n${value}` } - this.dataLineCount++ return } if (isFieldName(line, fieldLength, RETRY)) { if (isASCIINumberBytes(line, valueStart)) { - this.setEventFieldSize('retry', line.length - valueStart) event.retry = line.toString('utf8', valueStart) } return @@ -22780,27 +22576,18 @@ class EventSourceStream extends Transform { if (isFieldName(line, fieldLength, ID)) { if (isValidLastEventIdBytes(line, valueStart)) { - this.setEventFieldSize('id', line.length - valueStart) event.id = line.toString('utf8', valueStart) } return } if (isFieldName(line, fieldLength, EVENT)) { - if (valueStart < line.length) { - this.setEventFieldSize('event', line.length - valueStart) - event.event = line.toString('utf8', valueStart) - } - } - } + const value = line.toString('utf8', valueStart) - setEventFieldSize (field, size) { - const eventSize = this.eventSize - this.eventFieldSizes[field] + size - if (this.maxEventSize > 0 && eventSize > this.maxEventSize) { - throw createMaxEventSizeExceededError() + if (value.length > 0) { + event.event = value + } } - this.eventSize = eventSize - this.eventFieldSizes[field] = size } /** @@ -22833,12 +22620,6 @@ class EventSourceStream extends Transform { this.event.event = undefined this.event.id = undefined this.event.retry = undefined - this.eventSize = 0 - this.dataLineCount = 0 - this.eventFieldSizes.data = 0 - this.eventFieldSizes.event = 0 - this.eventFieldSizes.id = 0 - this.eventFieldSizes.retry = 0 } hasPendingEvent () { @@ -22874,16 +22655,14 @@ class EventSourceStream extends Transform { syncLineStartToCursor () { this.lineChunkIndex = this.chunkIndex this.linePos = this.pos - this.lineLength = 0 this.dropConsumedChunks() } dropConsumedChunks () { - if (this.lineChunkIndex > 0) { - const consumed = this.lineChunkIndex - this.chunks.splice(0, consumed) - this.lineChunkIndex = 0 - this.chunkIndex -= consumed + while (this.lineChunkIndex > 0) { + this.chunks.shift() + this.lineChunkIndex-- + this.chunkIndex-- } if (this.chunkIndex === this.chunks.length) { @@ -22992,24 +22771,23 @@ module.exports = { /***/ }), -/***/ 74292: +/***/ 6731: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { pipeline } = __nccwpck_require__(84492) -const { fetching } = __nccwpck_require__(87321) -const { makeRequest } = __nccwpck_require__(11192) -const { webidl } = __nccwpck_require__(96163) -const { EventSourceStream } = __nccwpck_require__(71054) -const { parseMIMEType } = __nccwpck_require__(68889) -const { createFastMessageEvent } = __nccwpck_require__(85021) -const { isNetworkError } = __nccwpck_require__(63042) -const { delay } = __nccwpck_require__(97409) -const { kEnumerableProperty } = __nccwpck_require__(31014) -const { environmentSettingsObject } = __nccwpck_require__(40667) -const { getGlobalDispatcher } = __nccwpck_require__(53139) +const { fetching } = __nccwpck_require__(78329) +const { makeRequest } = __nccwpck_require__(83211) +const { webidl } = __nccwpck_require__(2227) +const { EventSourceStream } = __nccwpck_require__(41408) +const { parseMIMEType } = __nccwpck_require__(96730) +const { createFastMessageEvent } = __nccwpck_require__(69459) +const { isNetworkError } = __nccwpck_require__(51132) +const { delay } = __nccwpck_require__(19079) +const { kEnumerableProperty } = __nccwpck_require__(50011) +const { environmentSettingsObject } = __nccwpck_require__(98730) let experimentalWarned = false @@ -23291,7 +23069,6 @@ class EventSource extends EventTarget { const eventSourceStream = new EventSourceStream({ eventSourceSettings: this.#state, - maxEventSize: this.#dispatcher.eventSourceOptions?.maxEventSize, push: (event) => { this.dispatchEvent(createFastMessageEvent( event.type, @@ -23470,8 +23247,7 @@ webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([ }, { key: 'dispatcher', // undici only - converter: webidl.converters.any, - defaultValue: () => getGlobalDispatcher() + converter: webidl.converters.any } ]) @@ -23483,7 +23259,7 @@ module.exports = { /***/ }), -/***/ 97409: +/***/ 19079: /***/ ((module) => { "use strict"; @@ -23528,13 +23304,13 @@ module.exports = { /***/ }), -/***/ 48203: +/***/ 12749: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(31014) +const util = __nccwpck_require__(50011) const { ReadableStreamFrom, isBlobLike, @@ -23544,16 +23320,16 @@ const { fullyReadBody, extractMimeType, utf8DecodeBytes -} = __nccwpck_require__(40667) -const { FormData } = __nccwpck_require__(59550) -const { kState } = __nccwpck_require__(23200) -const { webidl } = __nccwpck_require__(96163) +} = __nccwpck_require__(98730) +const { FormData } = __nccwpck_require__(62598) +const { kState } = __nccwpck_require__(14935) +const { webidl } = __nccwpck_require__(2227) const { Blob } = __nccwpck_require__(72254) const assert = __nccwpck_require__(98061) const { isErrored, isDisturbed } = __nccwpck_require__(84492) const { isArrayBuffer } = __nccwpck_require__(93746) -const { serializeAMimeType } = __nccwpck_require__(68889) -const { multipartFormDataParser } = __nccwpck_require__(95600) +const { serializeAMimeType } = __nccwpck_require__(96730) +const { multipartFormDataParser } = __nccwpck_require__(25152) let random try { @@ -24065,7 +23841,7 @@ module.exports = { /***/ }), -/***/ 49316: +/***/ 54823: /***/ ((module) => { "use strict"; @@ -24197,7 +23973,7 @@ module.exports = { /***/ }), -/***/ 68889: +/***/ 96730: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -24949,13 +24725,13 @@ module.exports = { /***/ }), -/***/ 65895: +/***/ 61451: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kConnected, kSize } = __nccwpck_require__(94822) +const { kConnected, kSize } = __nccwpck_require__(13638) class CompatWeakRef { constructor (value) { @@ -25003,15 +24779,15 @@ module.exports = function () { /***/ }), -/***/ 5583: +/***/ 60027: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { Blob, File } = __nccwpck_require__(72254) -const { kState } = __nccwpck_require__(23200) -const { webidl } = __nccwpck_require__(96163) +const { kState } = __nccwpck_require__(14935) +const { webidl } = __nccwpck_require__(2227) // TODO(@KhafraDev): remove class FileLike { @@ -25137,17 +24913,17 @@ module.exports = { FileLike, isFileLike } /***/ }), -/***/ 95600: +/***/ 25152: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { isUSVString, bufferToLowerCasedHeaderName } = __nccwpck_require__(31014) -const { utf8DecodeBytes } = __nccwpck_require__(40667) -const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = __nccwpck_require__(68889) -const { isFileLike } = __nccwpck_require__(5583) -const { makeEntry } = __nccwpck_require__(59550) +const { isUSVString, bufferToLowerCasedHeaderName } = __nccwpck_require__(50011) +const { utf8DecodeBytes } = __nccwpck_require__(98730) +const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = __nccwpck_require__(96730) +const { isFileLike } = __nccwpck_require__(60027) +const { makeEntry } = __nccwpck_require__(62598) const assert = __nccwpck_require__(98061) const { File: NodeFile } = __nccwpck_require__(72254) @@ -25619,17 +25395,17 @@ module.exports = { /***/ }), -/***/ 59550: +/***/ 62598: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { isBlobLike, iteratorMixin } = __nccwpck_require__(40667) -const { kState } = __nccwpck_require__(23200) -const { kEnumerableProperty } = __nccwpck_require__(31014) -const { FileLike, isFileLike } = __nccwpck_require__(5583) -const { webidl } = __nccwpck_require__(96163) +const { isBlobLike, iteratorMixin } = __nccwpck_require__(98730) +const { kState } = __nccwpck_require__(14935) +const { kEnumerableProperty } = __nccwpck_require__(50011) +const { FileLike, isFileLike } = __nccwpck_require__(60027) +const { webidl } = __nccwpck_require__(2227) const { File: NativeFile } = __nccwpck_require__(72254) const nodeUtil = __nccwpck_require__(47261) @@ -25879,7 +25655,7 @@ module.exports = { FormData, makeEntry } /***/ }), -/***/ 22407: +/***/ 13924: /***/ ((module) => { "use strict"; @@ -25927,7 +25703,7 @@ module.exports = { /***/ }), -/***/ 33924: +/***/ 10561: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -25935,14 +25711,14 @@ module.exports = { -const { kConstruct } = __nccwpck_require__(94822) -const { kEnumerableProperty } = __nccwpck_require__(31014) +const { kConstruct } = __nccwpck_require__(13638) +const { kEnumerableProperty } = __nccwpck_require__(50011) const { iteratorMixin, isValidHeaderName, isValidHeaderValue -} = __nccwpck_require__(40667) -const { webidl } = __nccwpck_require__(96163) +} = __nccwpck_require__(98730) +const { webidl } = __nccwpck_require__(2227) const assert = __nccwpck_require__(98061) const util = __nccwpck_require__(47261) @@ -26622,7 +26398,7 @@ module.exports = { /***/ }), -/***/ 87321: +/***/ 78329: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -26636,9 +26412,9 @@ const { filterResponse, makeResponse, fromInnerResponse -} = __nccwpck_require__(63042) -const { HeadersList } = __nccwpck_require__(33924) -const { Request, cloneRequest } = __nccwpck_require__(11192) +} = __nccwpck_require__(51132) +const { HeadersList } = __nccwpck_require__(10561) +const { Request, cloneRequest } = __nccwpck_require__(83211) const zlib = __nccwpck_require__(65628) const { bytesMatch, @@ -26674,23 +26450,23 @@ const { buildContentRange, createInflate, extractMimeType -} = __nccwpck_require__(40667) -const { kState, kDispatcher } = __nccwpck_require__(23200) +} = __nccwpck_require__(98730) +const { kState, kDispatcher } = __nccwpck_require__(14935) const assert = __nccwpck_require__(98061) -const { safelyExtractBody, extractBody } = __nccwpck_require__(48203) +const { safelyExtractBody, extractBody } = __nccwpck_require__(12749) const { redirectStatusSet, nullBodyStatus, safeMethodsSet, requestBodyHeader, subresourceSet -} = __nccwpck_require__(49316) +} = __nccwpck_require__(54823) const EE = __nccwpck_require__(15673) const { Readable, pipeline, finished } = __nccwpck_require__(84492) -const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = __nccwpck_require__(31014) -const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = __nccwpck_require__(68889) -const { getGlobalDispatcher } = __nccwpck_require__(53139) -const { webidl } = __nccwpck_require__(96163) +const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = __nccwpck_require__(50011) +const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = __nccwpck_require__(96730) +const { getGlobalDispatcher } = __nccwpck_require__(19405) +const { webidl } = __nccwpck_require__(2227) const { STATUS_CODES } = __nccwpck_require__(88849) const GET_OR_HEAD = ['GET', 'HEAD'] @@ -28578,10 +28354,8 @@ async function httpNetworkFetch ( // 19. Run these steps in parallel: // 1. Run these steps, but abort when fetchParams is canceled: - if (!fetchParams.controller.resume) { - fetchParams.controller.on('terminated', onAborted) - } - + fetchParams.controller.onAborted = onAborted + fetchParams.controller.on('terminated', onAborted) fetchParams.controller.resume = async () => { // 1. While true while (true) { @@ -28750,6 +28524,8 @@ async function httpNetworkFetch ( } location = headersList.get('location', true) + this.body = new Readable({ read: resume }) + const decoders = [] const willFollow = location && request.redirect === 'follow' && @@ -28767,7 +28543,7 @@ async function httpNetworkFetch ( // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206). const maxContentEncodings = 5 if (codings.length > maxContentEncodings) { - this.abort(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)) + reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)) return true } @@ -28800,8 +28576,6 @@ async function httpNetworkFetch ( } } - this.body = new Readable({ read: resume }) - const onError = this.onError.bind(this) resolve({ @@ -28848,6 +28622,10 @@ async function httpNetworkFetch ( fetchParams.controller.off('terminated', this.abort) } + if (fetchParams.controller.onAborted) { + fetchParams.controller.off('terminated', fetchParams.controller.onAborted) + } + fetchParams.controller.ended = true this.body.push(null) @@ -28900,7 +28678,7 @@ module.exports = { /***/ }), -/***/ 11192: +/***/ 83211: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -28908,16 +28686,16 @@ module.exports = { -const { extractBody, mixinBody, cloneBody, bodyUnusable } = __nccwpck_require__(48203) -const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = __nccwpck_require__(33924) -const { FinalizationRegistry } = __nccwpck_require__(65895)() -const util = __nccwpck_require__(31014) +const { extractBody, mixinBody, cloneBody, bodyUnusable } = __nccwpck_require__(12749) +const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = __nccwpck_require__(10561) +const { FinalizationRegistry } = __nccwpck_require__(61451)() +const util = __nccwpck_require__(50011) const nodeUtil = __nccwpck_require__(47261) const { isValidHTTPToken, sameOrigin, environmentSettingsObject -} = __nccwpck_require__(40667) +} = __nccwpck_require__(98730) const { forbiddenMethodsSet, corsSafeListedMethodsSet, @@ -28927,12 +28705,12 @@ const { requestCredentials, requestCache, requestDuplex -} = __nccwpck_require__(49316) +} = __nccwpck_require__(54823) const { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util -const { kHeaders, kSignal, kState, kDispatcher } = __nccwpck_require__(23200) -const { webidl } = __nccwpck_require__(96163) -const { URLSerializer } = __nccwpck_require__(68889) -const { kConstruct } = __nccwpck_require__(94822) +const { kHeaders, kSignal, kState, kDispatcher } = __nccwpck_require__(14935) +const { webidl } = __nccwpck_require__(2227) +const { URLSerializer } = __nccwpck_require__(96730) +const { kConstruct } = __nccwpck_require__(13638) const assert = __nccwpck_require__(98061) const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(15673) @@ -29945,15 +29723,15 @@ module.exports = { Request, makeRequest, fromInnerRequest, cloneRequest } /***/ }), -/***/ 63042: +/***/ 51132: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = __nccwpck_require__(33924) -const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = __nccwpck_require__(48203) -const util = __nccwpck_require__(31014) +const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = __nccwpck_require__(10561) +const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = __nccwpck_require__(12749) +const util = __nccwpck_require__(50011) const nodeUtil = __nccwpck_require__(47261) const { kEnumerableProperty } = util const { @@ -29965,16 +29743,16 @@ const { isErrorLike, isomorphicEncode, environmentSettingsObject: relevantRealm -} = __nccwpck_require__(40667) +} = __nccwpck_require__(98730) const { redirectStatusSet, nullBodyStatus -} = __nccwpck_require__(49316) -const { kState, kHeaders } = __nccwpck_require__(23200) -const { webidl } = __nccwpck_require__(96163) -const { FormData } = __nccwpck_require__(59550) -const { URLSerializer } = __nccwpck_require__(68889) -const { kConstruct } = __nccwpck_require__(94822) +} = __nccwpck_require__(54823) +const { kState, kHeaders } = __nccwpck_require__(14935) +const { webidl } = __nccwpck_require__(2227) +const { FormData } = __nccwpck_require__(62598) +const { URLSerializer } = __nccwpck_require__(96730) +const { kConstruct } = __nccwpck_require__(13638) const assert = __nccwpck_require__(98061) const { types } = __nccwpck_require__(47261) @@ -30563,7 +30341,7 @@ module.exports = { /***/ }), -/***/ 23200: +/***/ 14935: /***/ ((module) => { "use strict"; @@ -30580,7 +30358,7 @@ module.exports = { /***/ }), -/***/ 40667: +/***/ 98730: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -30588,14 +30366,14 @@ module.exports = { const { Transform } = __nccwpck_require__(84492) const zlib = __nccwpck_require__(65628) -const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = __nccwpck_require__(49316) -const { getGlobalOrigin } = __nccwpck_require__(22407) -const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = __nccwpck_require__(68889) +const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = __nccwpck_require__(54823) +const { getGlobalOrigin } = __nccwpck_require__(13924) +const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = __nccwpck_require__(96730) const { performance } = __nccwpck_require__(38846) -const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = __nccwpck_require__(31014) +const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = __nccwpck_require__(50011) const assert = __nccwpck_require__(98061) const { isUint8Array } = __nccwpck_require__(93746) -const { webidl } = __nccwpck_require__(96163) +const { webidl } = __nccwpck_require__(2227) let supportedHashes = [] @@ -32220,7 +31998,7 @@ module.exports = { /***/ }), -/***/ 96163: +/***/ 2227: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -32228,7 +32006,7 @@ module.exports = { const { types, inspect } = __nccwpck_require__(47261) const { markAsUncloneable } = __nccwpck_require__(24086) -const { toUSVString } = __nccwpck_require__(31014) +const { toUSVString } = __nccwpck_require__(50011) /** @type {import('../../../types/webidl').Webidl} */ const webidl = {} @@ -32923,7 +32701,7 @@ module.exports = { /***/ }), -/***/ 73760: +/***/ 74973: /***/ ((module) => { "use strict"; @@ -33221,7 +32999,7 @@ module.exports = { /***/ }), -/***/ 62596: +/***/ 65153: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -33231,16 +33009,16 @@ const { staticPropertyDescriptors, readOperation, fireAProgressEvent -} = __nccwpck_require__(86751) +} = __nccwpck_require__(24277) const { kState, kError, kResult, kEvents, kAborted -} = __nccwpck_require__(42047) -const { webidl } = __nccwpck_require__(96163) -const { kEnumerableProperty } = __nccwpck_require__(31014) +} = __nccwpck_require__(30010) +const { webidl } = __nccwpck_require__(2227) +const { kEnumerableProperty } = __nccwpck_require__(50011) class FileReader extends EventTarget { constructor () { @@ -33573,13 +33351,13 @@ module.exports = { /***/ }), -/***/ 30183: +/***/ 53788: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(96163) +const { webidl } = __nccwpck_require__(2227) const kState = Symbol('ProgressEvent state') @@ -33659,7 +33437,7 @@ module.exports = { /***/ }), -/***/ 42047: +/***/ 30010: /***/ ((module) => { "use strict"; @@ -33677,7 +33455,7 @@ module.exports = { /***/ }), -/***/ 86751: +/***/ 24277: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -33689,10 +33467,10 @@ const { kResult, kAborted, kLastProgressEventFired -} = __nccwpck_require__(42047) -const { ProgressEvent } = __nccwpck_require__(30183) -const { getEncoding } = __nccwpck_require__(73760) -const { serializeAMimeType, parseMIMEType } = __nccwpck_require__(68889) +} = __nccwpck_require__(30010) +const { ProgressEvent } = __nccwpck_require__(53788) +const { getEncoding } = __nccwpck_require__(74973) +const { serializeAMimeType, parseMIMEType } = __nccwpck_require__(96730) const { types } = __nccwpck_require__(47261) const { StringDecoder } = __nccwpck_require__(71576) const { btoa } = __nccwpck_require__(72254) @@ -34076,28 +33854,28 @@ module.exports = { /***/ }), -/***/ 47524: +/***/ 17299: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = __nccwpck_require__(56004) +const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = __nccwpck_require__(44285) const { kReadyState, kSentClose, kByteParser, kReceivedClose, kResponse -} = __nccwpck_require__(23992) -const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = __nccwpck_require__(82487) -const { channels } = __nccwpck_require__(96005) -const { CloseEvent } = __nccwpck_require__(85021) -const { makeRequest } = __nccwpck_require__(11192) -const { fetching } = __nccwpck_require__(87321) -const { Headers, getHeadersList } = __nccwpck_require__(33924) -const { getDecodeSplit } = __nccwpck_require__(40667) -const { WebsocketFrameSend } = __nccwpck_require__(4712) +} = __nccwpck_require__(34939) +const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = __nccwpck_require__(93194) +const { channels } = __nccwpck_require__(65543) +const { CloseEvent } = __nccwpck_require__(69459) +const { makeRequest } = __nccwpck_require__(83211) +const { fetching } = __nccwpck_require__(78329) +const { Headers, getHeadersList } = __nccwpck_require__(10561) +const { getDecodeSplit } = __nccwpck_require__(98730) +const { WebsocketFrameSend } = __nccwpck_require__(84618) /** @type {import('crypto')} */ let crypto @@ -34455,7 +34233,7 @@ module.exports = { /***/ }), -/***/ 56004: +/***/ 44285: /***/ ((module) => { "use strict"; @@ -34529,15 +34307,15 @@ module.exports = { /***/ }), -/***/ 85021: +/***/ 69459: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(96163) -const { kEnumerableProperty } = __nccwpck_require__(31014) -const { kConstruct } = __nccwpck_require__(94822) +const { webidl } = __nccwpck_require__(2227) +const { kEnumerableProperty } = __nccwpck_require__(50011) +const { kConstruct } = __nccwpck_require__(13638) const { MessagePort } = __nccwpck_require__(24086) /** @@ -34866,13 +34644,13 @@ module.exports = { /***/ }), -/***/ 4712: +/***/ 84618: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { maxUnsigned16Bit } = __nccwpck_require__(56004) +const { maxUnsigned16Bit } = __nccwpck_require__(44285) const BUFFER_SIZE = 16386 @@ -34970,15 +34748,15 @@ module.exports = { /***/ }), -/***/ 93711: +/***/ 7133: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { createInflateRaw, Z_DEFAULT_WINDOWBITS } = __nccwpck_require__(65628) -const { isValidClientWindowBits } = __nccwpck_require__(82487) -const { MessageSizeExceededError } = __nccwpck_require__(47926) +const { isValidClientWindowBits } = __nccwpck_require__(93194) +const { MessageSizeExceededError } = __nccwpck_require__(35990) const tail = Buffer.from([0x00, 0x00, 0xff, 0xff]) const kBuffer = Symbol('kBuffer') @@ -35083,7 +34861,7 @@ module.exports = { PerMessageDeflate } /***/ }), -/***/ 44894: +/***/ 46080: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -35091,9 +34869,9 @@ module.exports = { PerMessageDeflate } const { Writable } = __nccwpck_require__(84492) const assert = __nccwpck_require__(98061) -const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = __nccwpck_require__(56004) -const { kReadyState, kSentClose, kResponse, kReceivedClose } = __nccwpck_require__(23992) -const { channels } = __nccwpck_require__(96005) +const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = __nccwpck_require__(44285) +const { kReadyState, kSentClose, kResponse, kReceivedClose } = __nccwpck_require__(34939) +const { channels } = __nccwpck_require__(65543) const { isValidStatusCode, isValidOpcode, @@ -35103,11 +34881,11 @@ const { isControlFrame, isTextBinaryFrame, isContinuationFrame -} = __nccwpck_require__(82487) -const { WebsocketFrameSend } = __nccwpck_require__(4712) -const { closeWebSocketConnection } = __nccwpck_require__(47524) -const { PerMessageDeflate } = __nccwpck_require__(93711) -const { MessageSizeExceededError } = __nccwpck_require__(47926) +} = __nccwpck_require__(93194) +const { WebsocketFrameSend } = __nccwpck_require__(84618) +const { closeWebSocketConnection } = __nccwpck_require__(17299) +const { PerMessageDeflate } = __nccwpck_require__(7133) +const { MessageSizeExceededError } = __nccwpck_require__(35990) function failWebsocketConnectionWithCode (ws, code, reason) { closeWebSocketConnection(ws, code, reason, Buffer.byteLength(reason)) @@ -35338,20 +35116,6 @@ class ByteParser extends Writable { if (isControlFrame(this.#info.opcode)) { this.#loop = this.parseControlFrame(body) this.#state = parserStates.INFO - - // If the automatic PONG/CLOSE reply filled the socket's write buffer, - // stop parsing and resume on drain so a PING flood cannot grow the - // outbound queue without bound. - const socket = this.ws[kResponse].socket - if (this.#loop && socket.writableNeedDrain) { - this.#loop = false - socket.once('drain', () => { - if (this.destroyed) return - this.#loop = true - this.run(callback) - }) - return - } } else { if (!this.#info.compressed) { if (!this.writeFragments(body)) { @@ -35618,15 +35382,15 @@ module.exports = { /***/ }), -/***/ 10243: +/***/ 26515: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { WebsocketFrameSend } = __nccwpck_require__(4712) -const { opcodes, sendHints } = __nccwpck_require__(56004) -const FixedQueue = __nccwpck_require__(94856) +const { WebsocketFrameSend } = __nccwpck_require__(84618) +const { opcodes, sendHints } = __nccwpck_require__(44285) +const FixedQueue = __nccwpck_require__(27092) /** @type {typeof Uint8Array} */ const FastBuffer = Buffer[Symbol.species] @@ -35730,7 +35494,7 @@ module.exports = { SendQueue } /***/ }), -/***/ 23992: +/***/ 34939: /***/ ((module) => { "use strict"; @@ -35750,17 +35514,17 @@ module.exports = { /***/ }), -/***/ 82487: +/***/ 93194: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = __nccwpck_require__(23992) -const { states, opcodes } = __nccwpck_require__(56004) -const { ErrorEvent, createFastMessageEvent } = __nccwpck_require__(85021) +const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = __nccwpck_require__(34939) +const { states, opcodes } = __nccwpck_require__(44285) +const { ErrorEvent, createFastMessageEvent } = __nccwpck_require__(69459) const { isUtf8 } = __nccwpck_require__(72254) -const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = __nccwpck_require__(68889) +const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = __nccwpck_require__(96730) /* globals Blob */ @@ -36080,16 +35844,16 @@ module.exports = { /***/ }), -/***/ 43590: +/***/ 16416: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(96163) -const { URLSerializer } = __nccwpck_require__(68889) -const { environmentSettingsObject } = __nccwpck_require__(40667) -const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = __nccwpck_require__(56004) +const { webidl } = __nccwpck_require__(2227) +const { URLSerializer } = __nccwpck_require__(96730) +const { environmentSettingsObject } = __nccwpck_require__(98730) +const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = __nccwpck_require__(44285) const { kWebSocketURL, kReadyState, @@ -36098,21 +35862,21 @@ const { kResponse, kSentClose, kByteParser -} = __nccwpck_require__(23992) +} = __nccwpck_require__(34939) const { isConnecting, isEstablished, isClosing, isValidSubprotocol, fireEvent -} = __nccwpck_require__(82487) -const { establishWebSocketConnection, closeWebSocketConnection } = __nccwpck_require__(47524) -const { ByteParser } = __nccwpck_require__(44894) -const { kEnumerableProperty, isBlobLike } = __nccwpck_require__(31014) -const { getGlobalDispatcher } = __nccwpck_require__(53139) +} = __nccwpck_require__(93194) +const { establishWebSocketConnection, closeWebSocketConnection } = __nccwpck_require__(17299) +const { ByteParser } = __nccwpck_require__(46080) +const { kEnumerableProperty, isBlobLike } = __nccwpck_require__(50011) +const { getGlobalDispatcher } = __nccwpck_require__(19405) const { types } = __nccwpck_require__(47261) -const { ErrorEvent, CloseEvent } = __nccwpck_require__(85021) -const { SendQueue } = __nccwpck_require__(10243) +const { ErrorEvent, CloseEvent } = __nccwpck_require__(69459) +const { SendQueue } = __nccwpck_require__(26515) // https://websockets.spec.whatwg.org/#interface-definition class WebSocket extends EventTarget { @@ -36807,10 +36571,12 @@ async function mainRun(execution, projectBoardCommandPort, latestTagQueryPort, c (0, logger_1.logInfo)('GitHub Action: starting main run.'); (0, logger_1.logDebugInfo)(`Event: ${execution.eventName}, actor: ${execution.actor}, repo: ${repository.owner}/${repository.repo}, debug: ${execution.debug}`); if (process.env.GITHUB_ACTIONS === 'true' && !execution.singleAction.isPublishIssueCommentAction) { - // Every GitHub workflow invocation queues before setup or route work so - // executions of the same workflow file cannot overlap mutations. A - // failure notification must remain runnable when that queue gate fails. - await (0, main_run_lifecycle_1.waitForPreviousWorkflowRuns)(execution.tokens.token, repository); + // Verify native resource/lane coordination or retain the predecessor + // fence before setup. Failure notifications must remain runnable. + await (0, main_run_lifecycle_1.waitForPreviousWorkflowRuns)(execution.tokens.token, repository, { + isSingleAction: execution.isSingleAction, + pullRequestNumber: execution.inputs?.pull_request?.number, + }); } const setupExecution = (0, execution_setup_composition_root_1.createSetupExecutionUseCase)(latestTagQueryPort, { owner: repository.owner, @@ -38253,19 +38019,29 @@ class WorkflowQueueFailureError extends Error { } } exports.WorkflowQueueFailureError = WorkflowQueueFailureError; -function buildPreviousWorkflowRunsQuery(repository) { +function buildPreviousWorkflowRunsQuery(repository, event) { const workflowIdentifier = (0, workflow_context_1.resolveWorkflowIdentifier)(process.env.GITHUB_WORKFLOW_REF); const query = { owner: repository.owner, repository: repository.repo, - currentRunId: Number.parseInt(process.env.GITHUB_RUN_ID ?? '', 10), + currentRunId: Number(process.env.GITHUB_RUN_ID ?? Number.NaN), ...(workflowIdentifier ? { workflowIdentifier } : {}), + ...(event && !event.isSingleAction && process.env.GITHUB_WORKFLOW_SHA && process.env.GITHUB_JOB ? { + nativeCoordination: Object.freeze({ + workflowRef: process.env.GITHUB_WORKFLOW_REF ?? '', + workflowRevision: process.env.GITHUB_WORKFLOW_SHA, + jobId: process.env.GITHUB_JOB, + eventName: process.env.GITHUB_EVENT_NAME ?? '', + ref: process.env.GITHUB_REF, + pullRequestNumber: event.pullRequestNumber, + }), + } : {}), }; return query; } -async function waitForPreviousWorkflowRuns(token, repository) { - const query = buildPreviousWorkflowRunsQuery(repository); - if (process.env.GITHUB_ACTIONS === 'true' && !Number.isSafeInteger(query.currentRunId)) { +async function waitForPreviousWorkflowRuns(token, repository, event) { + const query = buildPreviousWorkflowRunsQuery(repository, event); + if (process.env.GITHUB_ACTIONS === 'true' && (!Number.isSafeInteger(query.currentRunId) || query.currentRunId <= 0)) { throw new Error('GitHub workflow identity is unavailable; refusing to bypass sequential execution.'); } if (process.env.GITHUB_ACTIONS === 'true' && !query.workflowIdentifier) { @@ -46209,6 +45985,59 @@ function boundedMergeQueueDiagnostic(value) { } +/***/ }), + +/***/ 70998: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.expectedNativeWorkflowGroup = expectedNativeWorkflowGroup; +exports.hasNativeWorkflowCoordination = hasNativeWorkflowCoordination; +const PUSH_GROUP = 'copilot-push-${{ github.repository }}-${{ github.ref_name }}'; +const PR_GROUP = 'copilot-pr-${{ github.repository }}-${{ github.event.pull_request.number }}'; +/** Closed recognition of the installed contract, without evaluating expressions. */ +function expectedNativeWorkflowGroup(query) { + const native = query.nativeCoordination; + if (!native || !Number.isSafeInteger(query.currentRunId) || query.currentRunId <= 0 + || !/^[\w.-]+\.ya?ml$/u.test(query.workflowIdentifier ?? '') + || !native.workflowRef.startsWith(`${query.owner}/${query.repository}/.github/workflows/${query.workflowIdentifier}@`) + || native.workflowRef.endsWith('@') + || !/^[a-f\d]{40}$/iu.test(native.workflowRevision) + || !/^[a-zA-Z_][\w-]*$/u.test(native.jobId)) + return undefined; + if (native.eventName === 'push' && native.ref?.startsWith('refs/heads/') + && native.ref.length > 'refs/heads/'.length) + return PUSH_GROUP; + if (!Number.isSafeInteger(native.pullRequestNumber) || (native.pullRequestNumber ?? 0) <= 0) + return undefined; + if (native.eventName === 'pull_request') + return `${PR_GROUP}-analysis`; + if (native.eventName === 'pull_request_review') + return `${PR_GROUP}-review-state`; + return undefined; +} +function hasNativeWorkflowCoordination(workflow, jobId, expectedGroup) { + const definition = record(workflow); + const jobs = record(definition?.jobs); + const job = record(jobs?.[jobId]); + const concurrency = record(job?.concurrency); + // Custom/reusable/workflow-level contracts retain conservative polling. + // A single direct job also avoids confusing a reusable callee's job ID + // with a different protected job in its caller's workflow context. + return definition?.concurrency === undefined && jobs !== undefined && Object.keys(jobs).length === 1 + && Array.isArray(job?.steps) + && job?.uses === undefined && concurrency?.group === expectedGroup + && concurrency?.['cancel-in-progress'] === true + && (concurrency.queue === undefined || concurrency.queue === 'single'); +} +function record(value) { + return value !== null && typeof value === 'object' && !Array.isArray(value) + ? value : undefined; +} + + /***/ }), /***/ 70628: @@ -62248,7 +62077,7 @@ async function resolveParentCommentBody(param, contextPorts) { /***/ }), -/***/ 281: +/***/ 37685: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -69055,18 +68884,28 @@ const application_error_1 = __nccwpck_require__(75999); const SYSTEM_CLOCK = { nowMilliseconds: () => Date.now() }; const SYSTEM_RANDOM = { next: () => Math.random() }; class WaitForPreviousWorkflowRunsUseCase { - constructor(queryPort, delayPort, observerPort, policy = workflow_queue_policy_1.WORKFLOW_QUEUE_POLICY, clock = SYSTEM_CLOCK, random = SYSTEM_RANDOM) { + constructor(queryPort, delayPort, observerPort, policy = workflow_queue_policy_1.WORKFLOW_QUEUE_POLICY, clock = SYSTEM_CLOCK, random = SYSTEM_RANDOM, nativeCoordination) { this.queryPort = queryPort; this.delayPort = delayPort; this.observerPort = observerPort; this.policy = policy; this.clock = clock; this.random = random; + this.nativeCoordination = nativeCoordination; this.taskId = 'WaitForPreviousWorkflowRunsUseCase'; } async invoke(query) { const deadlineAtMilliseconds = this.clock.nowMilliseconds() + this.policy.maximumQueueWaitMilliseconds; let pollIndex = 0; + if (this.nativeCoordination && this.clock.nowMilliseconds() < deadlineAtMilliseconds) { + const coordinated = await this.nativeCoordination.isCoordinated(query, { deadlineAtMilliseconds }); + if (this.clock.nowMilliseconds() >= deadlineAtMilliseconds) + throw queueTimeoutError(); + if (coordinated) { + this.observerPort.nativeCoordinationVerified?.(); + return; + } + } while (true) { if (this.clock.nowMilliseconds() >= deadlineAtMilliseconds) { throw queueTimeoutError(); @@ -73118,7 +72957,7 @@ exports.BranchNameRepository = BranchNameRepository; /***/ }), -/***/ 80742: +/***/ 54874: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -73208,7 +73047,7 @@ function uniqueValidDependencies(candidates) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.BranchDependencyRepository = void 0; -const branch_dependency_policy_1 = __nccwpck_require__(80742); +const branch_dependency_policy_1 = __nccwpck_require__(54874); const OPEN_DEPENDENCIES_QUERY = ` query BranchSyncDependencies($owner: String!, $repo: String!, $issuesCursor: String, $pullsCursor: String) { repository(owner: $owner, name: $repo) { @@ -80097,6 +79936,55 @@ function isActivePreviousRun(run, query) { } +/***/ }), + +/***/ 74039: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NativeWorkflowCoordinationRepository = void 0; +const js_yaml_1 = __nccwpck_require__(783); +const native_workflow_coordination_policy_1 = __nccwpck_require__(70998); +const workflow_runs_retry_1 = __nccwpck_require__(86434); +const MAX_WORKFLOW_BYTES = 256 * 1024; +/** Reads the workflow GitHub executed, never the possibly modified checkout. */ +class NativeWorkflowCoordinationRepository { + constructor(client, retry) { + this.client = client; + this.retry = retry; + } + async isCoordinated(query, context) { + const group = (0, native_workflow_coordination_policy_1.expectedNativeWorkflowGroup)(query); + const native = query.nativeCoordination; + if (!group || !native) + return false; + const response = await (0, workflow_runs_retry_1.withWorkflowRunsRetry)(() => this.client.rest.repos.getContent({ + owner: query.owner, + repo: query.repository, + path: `.github/workflows/${query.workflowIdentifier}`, + ref: native.workflowRevision, + }), { ...this.retry, policy: this.retry.policy ?? workflow_runs_retry_1.WORKFLOW_RUNS_RETRY_POLICY, + deadlineAtMilliseconds: context.deadlineAtMilliseconds }); + const file = response.data; + if (!file || Array.isArray(file) || file.type !== 'file' || file.encoding !== 'base64' + || typeof file.content !== 'string' || file.content.length > MAX_WORKFLOW_BYTES * 2) { + throw new Error('Executing workflow content is unavailable.'); + } + const encoded = file.content.replace(/\s/gu, ''); + const bytes = Buffer.from(encoded, 'base64'); + if (bytes.toString('base64') !== encoded) + throw new Error('Executing workflow encoding is invalid.'); + if (bytes.length > MAX_WORKFLOW_BYTES) + throw new Error('Executing workflow exceeds the inspection limit.'); + const workflow = (0, js_yaml_1.load)(bytes.toString('utf8'), { schema: js_yaml_1.JSON_SCHEMA }); + return (0, native_workflow_coordination_policy_1.hasNativeWorkflowCoordination)(workflow, native.jobId, group); + } +} +exports.NativeWorkflowCoordinationRepository = NativeWorkflowCoordinationRepository; + + /***/ }), /***/ 29509: @@ -87253,7 +87141,7 @@ const check_changes_issue_size_use_case_1 = __nccwpck_require__(28356); const change_size_project_membership_composition_root_1 = __nccwpck_require__(99375); const bugbot_autofix_use_case_1 = __nccwpck_require__(45446); const detect_bugbot_fix_intent_use_case_1 = __nccwpck_require__(76234); -const dismiss_bugbot_findings_use_case_1 = __nccwpck_require__(281); +const dismiss_bugbot_findings_use_case_1 = __nccwpck_require__(37685); const remember_bugbot_rule_use_case_1 = __nccwpck_require__(17437); const detect_potential_problems_use_case_1 = __nccwpck_require__(6287); const notify_new_commit_on_issue_use_case_1 = __nccwpck_require__(33276); @@ -88044,12 +87932,17 @@ const timer_workflow_polling_delay_adapter_1 = __nccwpck_require__(10339); const logger_workflow_polling_observer_adapter_1 = __nccwpck_require__(52883); const system_workflow_queue_clock_adapter_1 = __nccwpck_require__(49664); const system_workflow_polling_random_adapter_1 = __nccwpck_require__(32679); -const github_workflow_client_factory_1 = __nccwpck_require__(29839); +const native_workflow_coordination_repository_1 = __nccwpck_require__(74039); +const octokit_client_resolver_1 = __nccwpck_require__(54047); function createWaitForPreviousWorkflowRunsUseCase(token) { - const client = (0, github_workflow_client_factory_1.createWorkflowRunsClient)().getClient(token); + const client = (0, octokit_client_resolver_1.getOctokitClient)(token); const delayPort = new timer_workflow_polling_delay_adapter_1.TimerWorkflowPollingDelayAdapter(); const observerPort = new logger_workflow_polling_observer_adapter_1.LoggerWorkflowPollingObserverAdapter(); - return new wait_for_previous_workflow_runs_use_case_1.WaitForPreviousWorkflowRunsUseCase(new active_previous_workflow_runs_repository_1.ActivePreviousWorkflowRunsRepository(client, delayPort, undefined, new system_workflow_queue_clock_adapter_1.SystemWorkflowQueueClockAdapter(), new system_workflow_polling_random_adapter_1.SystemWorkflowPollingRandomAdapter(), observerPort), delayPort, observerPort); + const clock = new system_workflow_queue_clock_adapter_1.SystemWorkflowQueueClockAdapter(); + const random = new system_workflow_polling_random_adapter_1.SystemWorkflowPollingRandomAdapter(); + return new wait_for_previous_workflow_runs_use_case_1.WaitForPreviousWorkflowRunsUseCase(new active_previous_workflow_runs_repository_1.ActivePreviousWorkflowRunsRepository(client, delayPort, undefined, clock, random, observerPort), delayPort, observerPort, undefined, clock, random, new native_workflow_coordination_repository_1.NativeWorkflowCoordinationRepository(client, { + delayPort, clock, random, observer: observerPort, + })); } @@ -89058,6 +88951,9 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.LoggerWorkflowPollingObserverAdapter = void 0; const logger_1 = __nccwpck_require__(91151); class LoggerWorkflowPollingObserverAdapter { + nativeCoordinationVerified() { + (0, logger_1.logInfo)('Native workflow resource/lane coordination verified; continuing before setup.'); + } noActivePreviousRuns() { (0, logger_1.logDebugInfo)('✅ No previous runs active. Continuing...'); } diff --git a/docs/features.mdx b/docs/features.mdx index 8339fd373..8acd72fbc 100644 --- a/docs/features.mdx +++ b/docs/features.mdx @@ -166,7 +166,7 @@ decorative media or expose configuration for it. ## Workflow concurrency and sequential execution - **Coordination policies:** issue and comment mutation workflows preserve admitted events in a workflow-local queue. Deployment mutations use a shared issue-scoped native queue. Commit and Pull Request each have a separate repository/branch latest-revision lane, so paired events cannot cancel one another. + **Coordination policies:** issue and comment mutation workflows preserve admitted events in a workflow-local queue. Deployment mutations use a shared issue-scoped native queue. Commit uses a branch lane; PR analysis and review-state use separate lanes per PR number. The runtime verifies those native lanes before setup, so unrelated PRs do not wait for each other while occupying shared runners. GitHub's native [concurrency](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#concurrency) can cancel in-progress runs when a newer one starts. Its default `queue: single` retains only one pending run; `queue: max` allows up to 100 pending jobs or workflow runs when `cancel-in-progress` is `false` or omitted. The replaceable event jobs therefore use event-specific keys: Commit uses `copilot-push-${{ github.repository }}-${{ github.ref_name }}`; Pull Request code/lifecycle analysis uses the repository and PR number with an `analysis` suffix; and the dedicated review-state workflow uses the same PR-number key with a `review-state` suffix. Different PRs sharing a head branch cannot cancel one another. Each PR lane cancels only its own obsolete revision. Commit still synchronizes issue progress, then Bugbot performs a read-only exact-head lookup because a `push` payload does not contain PR identity. A validated open same-repository PR makes the push stop before review-context loading or agent invocation; the PR `synchronize` event exclusively owns review for that head. This prevents duplicate reviews without letting a push or review-state event cancel useful PR analysis. Branches without an open PR retain push-time Bugbot. Metadata-only `pull_request: edited` events are not subscribed because Copilot changes the PR body itself; excluding them prevents self-generated run cascades and preserves human metadata edits. Application-level head guards prevent an older run from updating a newer PR, and the next code/lifecycle run repairs any durable half-transition discovered after cancellation. Fixed workflow/job names expose analysis and review-state checks without leaking an unevaluated expression when GitHub skips bot-authored events. A separate merge-group workflow avoids a skipped duplicate on normal PRs while deliberately preserving the exact `Copilot - Pull Request` required-check context for branch-protection compatibility. @@ -184,10 +184,19 @@ is no alternate queue-only Action mode or direct/local deployment mutation path. ### How it works 1. For a GitHub Action run with a PAT, the action first compares the event actor with the authenticated PAT user. A normal run from the same account completes successfully before project composition, agent provisioning, setup, or queue polling. A valid explicit single action continues through the normal lifecycle. -2. An admitted run resolves the current workflow file from `GITHUB_WORKFLOW_REF` and queries the workflow-scoped endpoint concurrently for `in_progress`, `queued`, `requested`, `waiting`, and `pending` runs with `per_page: 100`. It then keeps only runs with a **lower run ID** (i.e. started earlier). Completed history and unrelated workflows are never included. -3. Provider failures fail closed. Transient 408/5xx/network errors use bounded exponential retry; HTTP 429 and rate-limited 403 responses honor `Retry-After` or `x-ratelimit-reset`, then use a slower bounded fallback. Diagnostics contain only the retry reason, attempt, delay, and safe reset timestamp metadata. -4. If any such run exists, the action polls immediately and then uses adaptive 5s, 10s, 20s, 40s, and 60s maximum delays with bounded ±20% jitter. The absolute queue wait is limited to 90 minutes. -5. When no earlier active run in the mutation queue remains, the action continues. A provider failure or queue deadline never becomes an empty result, so setup and mutation work cannot proceed with an unknown queue state. +2. Before setup, an admitted normal branch push, PR or review-state run can prove native coordination. Copilot reads the workflow from the current repository at `GITHUB_WORKFLOW_SHA`, uses `GITHUB_JOB` to select the executing job, and requires its exact group above with literal `cancel-in-progress: true`. It reads GitHub's pinned source using existing repository contents-read access, never the checkout or a moving branch. Proven jobs log `Native workflow resource/lane coordination verified; continuing before setup.` and use GitHub's existing resource/lane fence without polling other runs. The checks and findings still run normally. +3. Without proof, the existing workflow queue applies: this includes legacy/custom groups, reusable or multi-job workflows, missing metadata, single actions and unrelated event types. Copilot resolves the workflow file from `GITHUB_WORKFLOW_REF` and queries the workflow-scoped endpoint concurrently for `in_progress`, `queued`, `requested`, `waiting`, and `pending` runs with `per_page: 100`. It keeps only runs with a **lower run ID**. Completed history and unrelated workflows are never included. A matching filename alone does not establish native coordination. +4. Provider failures fail closed for both native inspection and predecessor queries. Transient 408/5xx/network errors use bounded exponential retry; HTTP 429 and rate-limited 403 responses honor `Retry-After` or `x-ratelimit-reset`, then use a slower bounded fallback. Diagnostics contain only the retry reason, attempt, delay, and safe reset timestamp metadata. +5. If any predecessor exists, the action polls immediately and then uses adaptive 5s, 10s, 20s, 40s, and 60s maximum delays with bounded ±20% jitter. Native inspection and polling share the absolute 90-minute queue budget. +6. When no earlier active run in the mutation queue remains, the action continues. A provider failure, malformed workflow source or queue deadline never grants permission to execute, so setup and mutation work cannot proceed with an unknown coordination state. + +After upgrading the runtime, installations already using the current exact +groups need no workflow change or new Variable. If an older runtime is already +waiting while occupying a shared runner, inspect the waiting run and its +predecessors in Actions. Preserve necessary predecessor callbacks and rerun the +affected workflow after the fix is available; a running older process cannot +adopt the new policy. Legacy/custom workflows retain conservative serialization. +Do not remove their queue or weaken checks to recover runner capacity. The queue deliberately traverses every page in each active-status subset because exact counting must detect a matching run on a later page. Querying only active diff --git a/docs/pull-requests/workflow-setup.mdx b/docs/pull-requests/workflow-setup.mdx index 0ef51e1ee..1adde09e5 100644 --- a/docs/pull-requests/workflow-setup.mdx +++ b/docs/pull-requests/workflow-setup.mdx @@ -129,6 +129,17 @@ reviewed maintenance PR. Update analysis and review-state together and retain project-specific setup/release customizations. No new Variable, Secret or permission is required. Current-head checks and review remain the merge gate. +The runtime verifies these native groups before setup by reading the executing +workflow at GitHub's `GITHUB_WORKFLOW_SHA` and selecting `GITHUB_JOB`. Existing +repository contents-read access is required. Verified PR lanes do not poll +queued runs for other PRs, which prevents a later job from holding a shared +runner while its predecessor needs that same pool. Same-PR/lane replacement +and all application freshness, findings and permission checks remain in force. +There is no queue-bypass setting. Missing metadata or custom concurrency uses +the conservative workflow queue; a workflow-read failure stops before setup. +See [coordination and recovery](/features#workflow-concurrency-and-sequential-execution) +for upgrading and rerunning affected older jobs. + - **`token`** is required (use a fine-grained PAT with repo and project permissions; see [Authentication](/authentication)). - **`project-ids`** is optional but needed if you want PRs linked to GitHub Project boards and moved to columns (e.g. "In Progress"). - The conditional fetch downloads only the two commit objects needed by the incremental reviewer. Keep it when `synchronize` is enabled; a full-history checkout is not required. diff --git a/specs/CATALOG.md b/specs/CATALOG.md index a0d046df3..c445d59b6 100644 --- a/specs/CATALOG.md +++ b/specs/CATALOG.md @@ -14,7 +14,7 @@ debt or convert unknown historic intent into a design decision. | `release-orchestration` | Implemented | Release and hotfix promotion, publication, bounded merge readiness recovery, and receipt-verified reconciliation without republication | [Configurable production-first release orchestration](./configurable-release-orchestration.md) + 2 companion | 59 paths · 2026-10-16 | | `merge-queue-readiness` | Implemented | Fail-closed validation of required checks and merge-group workflow support; optional manual-only RepoWise analysis with independent CI and verified required-check migration; cached RepoWise exports and bounded full-history secret processing with truthful completeness and resource evidence | [Merge queue readiness and effective target rules](./merge-queue-readiness.md) | 29 paths · 2026-10-21 | | `bugbot-review-state-reconciliation` | Implemented | Reconcile review snapshots, findings, threads, comments, and check conclusions | [Bugbot review-state reconciliation](./bugbot-review-state-reconciliation.md) | 74 paths · 2026-10-24 | -| `execution-lifecycle` | Implemented | Shared GitHub Action lifecycle from event admission through durable user-facing results | [Execution admission, queueing, routing, and result publication](./execution-admission-queue-and-publication.md) + 3 companion | 105 paths · 2026-10-21 | +| `execution-lifecycle` | Implemented | Shared GitHub Action lifecycle with pinned native resource/lane coordination proof, conservative predecessor fencing, routing and durable user-facing results | [Execution admission, queueing, routing, and result publication](./execution-admission-queue-and-publication.md) + 3 companion | 119 paths · 2026-10-25 | | `architecture-quality-hardening` | Implemented | Close verified concurrency, error-contract, context-coupling, fan-out, setup/doctor, and provider-policy risks in dependency order | [Architecture quality and scalability hardening](./architecture-quality-and-scalability-hardening.md) + 1 companion | 72 paths · 2026-10-13 | | `setup-and-doctor` | Implemented | Plan, validate, provision, and audit a repository installation without exposing credentials | [Setup, configuration, credentials, and doctor](./setup-configuration-credentials-and-doctor.md) + 6 companion | 332 paths · 2026-10-24 | | `local-web-setup-assistant` | Proposed | Offer a packaged, loopback-only Svelte setup interface over the existing engine with four-language guidance, English CLI help, basic/custom first-run paths, editable question and plan review, source-labelled GitHub facts, assisted CI and Project evidence, role-separated PATs, and truthful itemized outcomes; inspect existing configuration and apply independent, scope-aware runtime adjustments with permission, drift and read-back verification | [Local web setup assistant](./local-web-setup-assistant.md) + 2 companion | 247 paths · 2026-10-21 | @@ -81,13 +81,13 @@ debt or convert unknown historic intent into a design decision. ### `execution-lifecycle` — Execution admission, queueing, routing, and result publication - Owner: Copilot maintainers -- Last verified: 2026-10-21 +- Last verified: 2026-10-25 - Specifications: [`specs/execution-admission-queue-and-publication.md`](./execution-admission-queue-and-publication.md) · [`specs/execution-error-and-context-hardening.md`](./execution-error-and-context-hardening.md) · [`specs/execution-boundary-closure-audit.md`](./execution-boundary-closure-audit.md) · [`specs/push-and-single-action-context-hardening.md`](./push-and-single-action-context-hardening.md) - Workflows: [`.github/workflows/copilot_issue.yml`](../.github/workflows/copilot_issue.yml) · [`.github/workflows/copilot_issue_comment.yml`](../.github/workflows/copilot_issue_comment.yml) · [`.github/workflows/copilot_pull_request.yml`](../.github/workflows/copilot_pull_request.yml) · [`.github/workflows/copilot_pull_request_comment.yml`](../.github/workflows/copilot_pull_request_comment.yml) · [`.github/workflows/copilot_commit.yml`](../.github/workflows/copilot_commit.yml) - Entrypoints: [`src/actions/github_action.ts`](../src/actions/github_action.ts) · [`src/actions/common_action.ts`](../src/actions/common_action.ts) -- Core code: [`scripts/coverage-budgets.json`](../scripts/coverage-budgets.json) · [`scripts/validate-coverage-budgets.cjs`](../scripts/validate-coverage-budgets.cjs) · [`src/actions/main_run_lifecycle.ts`](../src/actions/main_run_lifecycle.ts) · [`src/actions/main_run_route.ts`](../src/actions/main_run_route.ts) · [`src/actions/github_action_completion.ts`](../src/actions/github_action_completion.ts) · [`src/api.ts`](../src/api.ts) · [`src/data/model/application_error.ts`](../src/data/model/application_error.ts) · [`src/application/errors/application_error.ts`](../src/application/errors/application_error.ts) · [`src/application/errors/application_error_context.ts`](../src/application/errors/application_error_context.ts) · [`src/application/policies/application_error_message_catalog.ts`](../src/application/policies/application_error_message_catalog.ts) · [`src/application/policies/application_error_presentation_policy.ts`](../src/application/policies/application_error_presentation_policy.ts) · [`src/application/policies/bugbot_result_finding_state_projection_policy.ts`](../src/application/policies/bugbot_result_finding_state_projection_policy.ts) · [`src/application/policies/bugbot_telemetry_projection_policy.ts`](../src/application/policies/bugbot_telemetry_projection_policy.ts) · [`src/application/policies/action_summary_policy.ts`](../src/application/policies/action_summary_policy.ts) · [`src/application/policies/copilot_evidence_policy.ts`](../src/application/policies/copilot_evidence_policy.ts) · [`src/application/policies/lifecycle_state_policy.ts`](../src/application/policies/lifecycle_state_policy.ts) · [`src/application/policies/status_command_policy.ts`](../src/application/policies/status_command_policy.ts) · [`src/application/policies/github_execution_admission_policy.ts`](../src/application/policies/github_execution_admission_policy.ts) · [`src/application/policies/workflow_queue_policy.ts`](../src/application/policies/workflow_queue_policy.ts) · [`src/application/usecases/actions/lifecycle_synchronization_context.ts`](../src/application/usecases/actions/lifecycle_synchronization_context.ts) · [`src/application/usecases/actions/synchronize_lifecycle_state_use_case.ts`](../src/application/usecases/actions/synchronize_lifecycle_state_use_case.ts) · [`src/application/usecases/steps/commit/bugbot/bugbot_review_operation_context.ts`](../src/application/usecases/steps/commit/bugbot/bugbot_review_operation_context.ts) · [`src/application/policies/semantic_result_publication_policy.ts`](../src/application/policies/semantic_result_publication_policy.ts) · [`src/application/usecases/steps/common/status_card_publication_workflow.ts`](../src/application/usecases/steps/common/status_card_publication_workflow.ts) · [`src/application/usecases/comment_automation_context.ts`](../src/application/usecases/comment_automation_context.ts) · [`src/application/usecases/issue_workflow_context.ts`](../src/application/usecases/issue_workflow_context.ts) · [`src/application/usecases/pull_request_workflow_context.ts`](../src/application/usecases/pull_request_workflow_context.ts) · [`src/application/usecases/push_single_action_contexts.ts`](../src/application/usecases/push_single_action_contexts.ts) · [`src/application/usecases/steps/common/check_permissions_workflow.ts`](../src/application/usecases/steps/common/check_permissions_workflow.ts) · [`src/application/usecases/steps/common/comment_language_translation_workflow.ts`](../src/application/usecases/steps/common/comment_language_translation_workflow.ts) · [`src/application/usecases/steps/common/think_workflow.ts`](../src/application/usecases/steps/common/think_workflow.ts) · [`src/application/usecases/steps/common/update_title_workflow.ts`](../src/application/usecases/steps/common/update_title_workflow.ts) · [`src/application/usecases/steps/common/project_content_link_workflow.ts`](../src/application/usecases/steps/common/project_content_link_workflow.ts) · [`src/application/usecases/steps/common/publish_resume_workflow.ts`](../src/application/usecases/steps/common/publish_resume_workflow.ts) · [`src/application/usecases/steps/common/store_configuration_use_case.ts`](../src/application/usecases/steps/common/store_configuration_use_case.ts) · [`src/infrastructure/composition/shared_capability_port_binding.ts`](../src/infrastructure/composition/shared_capability_port_binding.ts) · [`src/infrastructure/composition/lifecycle_capability_port_binding.ts`](../src/infrastructure/composition/lifecycle_capability_port_binding.ts) · [`src/infrastructure/composition/lifecycle_state_composition_root.ts`](../src/infrastructure/composition/lifecycle_state_composition_root.ts) · [`src/infrastructure/composition/push_single_action_capability_port_binding.ts`](../src/infrastructure/composition/push_single_action_capability_port_binding.ts) · [`src/infrastructure/composition/main_run_route_composition_root.ts`](../src/infrastructure/composition/main_run_route_composition_root.ts) · [`src/application/policies/configuration_persistence_policy.ts`](../src/application/policies/configuration_persistence_policy.ts) · [`src/application/ports/project_board_query_ports.ts`](../src/application/ports/project_board_query_ports.ts) · [`src/application/usecases/steps/commit/check_changes_issue_size_use_case.ts`](../src/application/usecases/steps/commit/check_changes_issue_size_use_case.ts) · [`src/application/usecases/steps/commit/check_changes_issue_size_workflow.ts`](../src/application/usecases/steps/commit/check_changes_issue_size_workflow.ts) · [`src/application/usecases/steps/commit/update_change_size_labels.ts`](../src/application/usecases/steps/commit/update_change_size_labels.ts) · [`src/data/repository/project/project_board_item_query.ts`](../src/data/repository/project/project_board_item_query.ts) · [`src/infrastructure/composition/change_size_project_membership_composition_root.ts`](../src/infrastructure/composition/change_size_project_membership_composition_root.ts) · [`src/manager/description/configuration_handler.ts`](../src/manager/description/configuration_handler.ts) · [`src/manager/description/configuration_markers.ts`](../src/manager/description/configuration_markers.ts) · [`src/data/repository/issue/issue_content_repository.ts`](../src/data/repository/issue/issue_content_repository.ts) · [`src/data/repository/github/github_error_policy.ts`](../src/data/repository/github/github_error_policy.ts) -- Tests: [`src/tooling/__tests__/coverage_budget_validator.test.ts`](../src/tooling/__tests__/coverage_budget_validator.test.ts) · [`src/__tests__/api.test.ts`](../src/__tests__/api.test.ts) · [`src/actions/__tests__/github_action.test.ts`](../src/actions/__tests__/github_action.test.ts) · [`src/actions/__tests__/github_action_completion.test.ts`](../src/actions/__tests__/github_action_completion.test.ts) · [`src/application/errors/__tests__/application_error.test.ts`](../src/application/errors/__tests__/application_error.test.ts) · [`src/application/policies/__tests__/application_error_message_catalog.test.ts`](../src/application/policies/__tests__/application_error_message_catalog.test.ts) · [`src/application/policies/__tests__/application_error_presentation_policy.test.ts`](../src/application/policies/__tests__/application_error_presentation_policy.test.ts) · [`src/application/policies/__tests__/bugbot_result_finding_state_projection_policy.test.ts`](../src/application/policies/__tests__/bugbot_result_finding_state_projection_policy.test.ts) · [`src/application/policies/__tests__/bugbot_telemetry_projection_policy.test.ts`](../src/application/policies/__tests__/bugbot_telemetry_projection_policy.test.ts) · [`src/application/policies/__tests__/action_summary_policy.test.ts`](../src/application/policies/__tests__/action_summary_policy.test.ts) · [`src/application/policies/__tests__/copilot_evidence_policy.test.ts`](../src/application/policies/__tests__/copilot_evidence_policy.test.ts) · [`src/application/policies/__tests__/lifecycle_state_policy.test.ts`](../src/application/policies/__tests__/lifecycle_state_policy.test.ts) · [`src/application/policies/__tests__/status_command_policy.test.ts`](../src/application/policies/__tests__/status_command_policy.test.ts) · [`src/application/usecases/actions/__tests__/lifecycle_synchronization_context.test.ts`](../src/application/usecases/actions/__tests__/lifecycle_synchronization_context.test.ts) · [`src/application/usecases/actions/__tests__/synchronize_lifecycle_state_use_case.test.ts`](../src/application/usecases/actions/__tests__/synchronize_lifecycle_state_use_case.test.ts) · [`src/application/usecases/actions/__tests__/lifecycle_event_replay.integration.test.ts`](../src/application/usecases/actions/__tests__/lifecycle_event_replay.integration.test.ts) · [`src/architecture/__tests__/execution_import_ratchet.test.ts`](../src/architecture/__tests__/execution_import_ratchet.test.ts) · [`src/architecture/__tests__/raw_error_logging_boundaries.test.ts`](../src/architecture/__tests__/raw_error_logging_boundaries.test.ts) · [`src/application/usecases/steps/commit/bugbot/__tests__/bugbot_review_operation_context.test.ts`](../src/application/usecases/steps/commit/bugbot/__tests__/bugbot_review_operation_context.test.ts) · [`src/application/usecases/steps/common/__tests__/shared_capability_context_projection.test.ts`](../src/application/usecases/steps/common/__tests__/shared_capability_context_projection.test.ts) · [`src/application/usecases/steps/common/__tests__/publish_resume_use_case.test.ts`](../src/application/usecases/steps/common/__tests__/publish_resume_use_case.test.ts) · [`src/infrastructure/composition/__tests__/shared_capability_port_binding.test.ts`](../src/infrastructure/composition/__tests__/shared_capability_port_binding.test.ts) · [`src/application/usecases/__tests__/issue_pull_request_context_projection.test.ts`](../src/application/usecases/__tests__/issue_pull_request_context_projection.test.ts) · [`src/infrastructure/composition/__tests__/lifecycle_capability_port_binding.test.ts`](../src/infrastructure/composition/__tests__/lifecycle_capability_port_binding.test.ts) · [`src/infrastructure/composition/__tests__/lifecycle_state_composition_root.test.ts`](../src/infrastructure/composition/__tests__/lifecycle_state_composition_root.test.ts) · [`src/application/usecases/__tests__/push_single_action_contexts.test.ts`](../src/application/usecases/__tests__/push_single_action_contexts.test.ts) · [`src/application/usecases/__tests__/single_action_workflow.test.ts`](../src/application/usecases/__tests__/single_action_workflow.test.ts) · [`src/infrastructure/composition/__tests__/push_single_action_capability_port_binding.test.ts`](../src/infrastructure/composition/__tests__/push_single_action_capability_port_binding.test.ts) · [`src/application/usecases/execution/__tests__/resolve_github_execution_admission_use_case.test.ts`](../src/application/usecases/execution/__tests__/resolve_github_execution_admission_use_case.test.ts) · [`src/application/usecases/workflow/__tests__/wait_for_previous_workflow_runs_use_case.test.ts`](../src/application/usecases/workflow/__tests__/wait_for_previous_workflow_runs_use_case.test.ts) · [`src/application/policies/__tests__/configuration_persistence_policy.test.ts`](../src/application/policies/__tests__/configuration_persistence_policy.test.ts) · [`src/application/usecases/steps/commit/__tests__/check_changes_issue_size_use_case.test.ts`](../src/application/usecases/steps/commit/__tests__/check_changes_issue_size_use_case.test.ts) · [`src/application/usecases/steps/commit/__tests__/update_change_size_labels.test.ts`](../src/application/usecases/steps/commit/__tests__/update_change_size_labels.test.ts) · [`src/data/repository/project/__tests__/project_board_visibility_recovery.test.ts`](../src/data/repository/project/__tests__/project_board_visibility_recovery.test.ts) · [`src/infrastructure/composition/__tests__/change_size_project_membership_composition_root.test.ts`](../src/infrastructure/composition/__tests__/change_size_project_membership_composition_root.test.ts) · [`src/manager/description/__tests__/configuration_recovery.test.ts`](../src/manager/description/__tests__/configuration_recovery.test.ts) · [`src/manager/description/__tests__/configuration_handler.test.ts`](../src/manager/description/__tests__/configuration_handler.test.ts) · [`src/data/repository/issue/__tests__/issue_content_repository.test.ts`](../src/data/repository/issue/__tests__/issue_content_repository.test.ts) -- User documentation: [`docs/overview.mdx`](../docs/overview.mdx) · [`docs/bugbot/programmatic-api.mdx`](../docs/bugbot/programmatic-api.mdx) · [`docs/security-operations/operations/error-reference.mdx`](../docs/security-operations/operations/error-reference.mdx) · [`docs/security-operations/operations/troubleshooting.mdx`](../docs/security-operations/operations/troubleshooting.mdx) · [`docs/bugbot/quality-observability.mdx`](../docs/bugbot/quality-observability.mdx) · [`docs/bugbot/failure-scenarios.mdx`](../docs/bugbot/failure-scenarios.mdx) · [`docs/development/architecture.mdx`](../docs/development/architecture.mdx) · [`docs/issues/assignees-and-projects.mdx`](../docs/issues/assignees-and-projects.mdx) · [`docs/configuration.mdx`](../docs/configuration.mdx) +- Core code: [`scripts/coverage-budgets.json`](../scripts/coverage-budgets.json) · [`scripts/validate-coverage-budgets.cjs`](../scripts/validate-coverage-budgets.cjs) · [`src/actions/main_run_lifecycle.ts`](../src/actions/main_run_lifecycle.ts) · [`src/actions/main_run_route.ts`](../src/actions/main_run_route.ts) · [`src/actions/github_action_completion.ts`](../src/actions/github_action_completion.ts) · [`src/api.ts`](../src/api.ts) · [`src/data/model/application_error.ts`](../src/data/model/application_error.ts) · [`src/application/errors/application_error.ts`](../src/application/errors/application_error.ts) · [`src/application/errors/application_error_context.ts`](../src/application/errors/application_error_context.ts) · [`src/application/policies/application_error_message_catalog.ts`](../src/application/policies/application_error_message_catalog.ts) · [`src/application/policies/application_error_presentation_policy.ts`](../src/application/policies/application_error_presentation_policy.ts) · [`src/application/policies/bugbot_result_finding_state_projection_policy.ts`](../src/application/policies/bugbot_result_finding_state_projection_policy.ts) · [`src/application/policies/bugbot_telemetry_projection_policy.ts`](../src/application/policies/bugbot_telemetry_projection_policy.ts) · [`src/application/policies/action_summary_policy.ts`](../src/application/policies/action_summary_policy.ts) · [`src/application/policies/copilot_evidence_policy.ts`](../src/application/policies/copilot_evidence_policy.ts) · [`src/application/policies/lifecycle_state_policy.ts`](../src/application/policies/lifecycle_state_policy.ts) · [`src/application/policies/status_command_policy.ts`](../src/application/policies/status_command_policy.ts) · [`src/application/policies/github_execution_admission_policy.ts`](../src/application/policies/github_execution_admission_policy.ts) · [`src/application/policies/workflow_queue_policy.ts`](../src/application/policies/workflow_queue_policy.ts) · [`src/application/usecases/actions/lifecycle_synchronization_context.ts`](../src/application/usecases/actions/lifecycle_synchronization_context.ts) · [`src/application/usecases/actions/synchronize_lifecycle_state_use_case.ts`](../src/application/usecases/actions/synchronize_lifecycle_state_use_case.ts) · [`src/application/usecases/steps/commit/bugbot/bugbot_review_operation_context.ts`](../src/application/usecases/steps/commit/bugbot/bugbot_review_operation_context.ts) · [`src/application/policies/semantic_result_publication_policy.ts`](../src/application/policies/semantic_result_publication_policy.ts) · [`src/application/usecases/steps/common/status_card_publication_workflow.ts`](../src/application/usecases/steps/common/status_card_publication_workflow.ts) · [`src/application/usecases/comment_automation_context.ts`](../src/application/usecases/comment_automation_context.ts) · [`src/application/usecases/issue_workflow_context.ts`](../src/application/usecases/issue_workflow_context.ts) · [`src/application/usecases/pull_request_workflow_context.ts`](../src/application/usecases/pull_request_workflow_context.ts) · [`src/application/usecases/push_single_action_contexts.ts`](../src/application/usecases/push_single_action_contexts.ts) · [`src/application/usecases/steps/common/check_permissions_workflow.ts`](../src/application/usecases/steps/common/check_permissions_workflow.ts) · [`src/application/usecases/steps/common/comment_language_translation_workflow.ts`](../src/application/usecases/steps/common/comment_language_translation_workflow.ts) · [`src/application/usecases/steps/common/think_workflow.ts`](../src/application/usecases/steps/common/think_workflow.ts) · [`src/application/usecases/steps/common/update_title_workflow.ts`](../src/application/usecases/steps/common/update_title_workflow.ts) · [`src/application/usecases/steps/common/project_content_link_workflow.ts`](../src/application/usecases/steps/common/project_content_link_workflow.ts) · [`src/application/usecases/steps/common/publish_resume_workflow.ts`](../src/application/usecases/steps/common/publish_resume_workflow.ts) · [`src/application/usecases/steps/common/store_configuration_use_case.ts`](../src/application/usecases/steps/common/store_configuration_use_case.ts) · [`src/infrastructure/composition/shared_capability_port_binding.ts`](../src/infrastructure/composition/shared_capability_port_binding.ts) · [`src/infrastructure/composition/lifecycle_capability_port_binding.ts`](../src/infrastructure/composition/lifecycle_capability_port_binding.ts) · [`src/infrastructure/composition/lifecycle_state_composition_root.ts`](../src/infrastructure/composition/lifecycle_state_composition_root.ts) · [`src/infrastructure/composition/push_single_action_capability_port_binding.ts`](../src/infrastructure/composition/push_single_action_capability_port_binding.ts) · [`src/infrastructure/composition/main_run_route_composition_root.ts`](../src/infrastructure/composition/main_run_route_composition_root.ts) · [`src/application/policies/configuration_persistence_policy.ts`](../src/application/policies/configuration_persistence_policy.ts) · [`src/application/ports/project_board_query_ports.ts`](../src/application/ports/project_board_query_ports.ts) · [`src/application/usecases/steps/commit/check_changes_issue_size_use_case.ts`](../src/application/usecases/steps/commit/check_changes_issue_size_use_case.ts) · [`src/application/usecases/steps/commit/check_changes_issue_size_workflow.ts`](../src/application/usecases/steps/commit/check_changes_issue_size_workflow.ts) · [`src/application/usecases/steps/commit/update_change_size_labels.ts`](../src/application/usecases/steps/commit/update_change_size_labels.ts) · [`src/data/repository/project/project_board_item_query.ts`](../src/data/repository/project/project_board_item_query.ts) · [`src/infrastructure/composition/change_size_project_membership_composition_root.ts`](../src/infrastructure/composition/change_size_project_membership_composition_root.ts) · [`src/manager/description/configuration_handler.ts`](../src/manager/description/configuration_handler.ts) · [`src/manager/description/configuration_markers.ts`](../src/manager/description/configuration_markers.ts) · [`src/data/repository/issue/issue_content_repository.ts`](../src/data/repository/issue/issue_content_repository.ts) · [`src/data/repository/github/github_error_policy.ts`](../src/data/repository/github/github_error_policy.ts) · [`src/application/policies/native_workflow_coordination_policy.ts`](../src/application/policies/native_workflow_coordination_policy.ts) · [`src/application/ports/workflow_run_ports.ts`](../src/application/ports/workflow_run_ports.ts) · [`src/application/usecases/workflow/wait_for_previous_workflow_runs_use_case.ts`](../src/application/usecases/workflow/wait_for_previous_workflow_runs_use_case.ts) · [`src/data/repository/workflow/active_previous_workflow_runs_repository.ts`](../src/data/repository/workflow/active_previous_workflow_runs_repository.ts) · [`src/data/repository/workflow/native_workflow_coordination_repository.ts`](../src/data/repository/workflow/native_workflow_coordination_repository.ts) · [`src/infrastructure/composition/workflow_queue_composition_root.ts`](../src/infrastructure/composition/workflow_queue_composition_root.ts) +- Tests: [`src/tooling/__tests__/coverage_budget_validator.test.ts`](../src/tooling/__tests__/coverage_budget_validator.test.ts) · [`src/__tests__/api.test.ts`](../src/__tests__/api.test.ts) · [`src/actions/__tests__/github_action.test.ts`](../src/actions/__tests__/github_action.test.ts) · [`src/actions/__tests__/github_action_completion.test.ts`](../src/actions/__tests__/github_action_completion.test.ts) · [`src/application/errors/__tests__/application_error.test.ts`](../src/application/errors/__tests__/application_error.test.ts) · [`src/application/policies/__tests__/application_error_message_catalog.test.ts`](../src/application/policies/__tests__/application_error_message_catalog.test.ts) · [`src/application/policies/__tests__/application_error_presentation_policy.test.ts`](../src/application/policies/__tests__/application_error_presentation_policy.test.ts) · [`src/application/policies/__tests__/bugbot_result_finding_state_projection_policy.test.ts`](../src/application/policies/__tests__/bugbot_result_finding_state_projection_policy.test.ts) · [`src/application/policies/__tests__/bugbot_telemetry_projection_policy.test.ts`](../src/application/policies/__tests__/bugbot_telemetry_projection_policy.test.ts) · [`src/application/policies/__tests__/action_summary_policy.test.ts`](../src/application/policies/__tests__/action_summary_policy.test.ts) · [`src/application/policies/__tests__/copilot_evidence_policy.test.ts`](../src/application/policies/__tests__/copilot_evidence_policy.test.ts) · [`src/application/policies/__tests__/lifecycle_state_policy.test.ts`](../src/application/policies/__tests__/lifecycle_state_policy.test.ts) · [`src/application/policies/__tests__/status_command_policy.test.ts`](../src/application/policies/__tests__/status_command_policy.test.ts) · [`src/application/usecases/actions/__tests__/lifecycle_synchronization_context.test.ts`](../src/application/usecases/actions/__tests__/lifecycle_synchronization_context.test.ts) · [`src/application/usecases/actions/__tests__/synchronize_lifecycle_state_use_case.test.ts`](../src/application/usecases/actions/__tests__/synchronize_lifecycle_state_use_case.test.ts) · [`src/application/usecases/actions/__tests__/lifecycle_event_replay.integration.test.ts`](../src/application/usecases/actions/__tests__/lifecycle_event_replay.integration.test.ts) · [`src/architecture/__tests__/execution_import_ratchet.test.ts`](../src/architecture/__tests__/execution_import_ratchet.test.ts) · [`src/architecture/__tests__/raw_error_logging_boundaries.test.ts`](../src/architecture/__tests__/raw_error_logging_boundaries.test.ts) · [`src/application/usecases/steps/commit/bugbot/__tests__/bugbot_review_operation_context.test.ts`](../src/application/usecases/steps/commit/bugbot/__tests__/bugbot_review_operation_context.test.ts) · [`src/application/usecases/steps/common/__tests__/shared_capability_context_projection.test.ts`](../src/application/usecases/steps/common/__tests__/shared_capability_context_projection.test.ts) · [`src/application/usecases/steps/common/__tests__/publish_resume_use_case.test.ts`](../src/application/usecases/steps/common/__tests__/publish_resume_use_case.test.ts) · [`src/infrastructure/composition/__tests__/shared_capability_port_binding.test.ts`](../src/infrastructure/composition/__tests__/shared_capability_port_binding.test.ts) · [`src/application/usecases/__tests__/issue_pull_request_context_projection.test.ts`](../src/application/usecases/__tests__/issue_pull_request_context_projection.test.ts) · [`src/infrastructure/composition/__tests__/lifecycle_capability_port_binding.test.ts`](../src/infrastructure/composition/__tests__/lifecycle_capability_port_binding.test.ts) · [`src/infrastructure/composition/__tests__/lifecycle_state_composition_root.test.ts`](../src/infrastructure/composition/__tests__/lifecycle_state_composition_root.test.ts) · [`src/application/usecases/__tests__/push_single_action_contexts.test.ts`](../src/application/usecases/__tests__/push_single_action_contexts.test.ts) · [`src/application/usecases/__tests__/single_action_workflow.test.ts`](../src/application/usecases/__tests__/single_action_workflow.test.ts) · [`src/infrastructure/composition/__tests__/push_single_action_capability_port_binding.test.ts`](../src/infrastructure/composition/__tests__/push_single_action_capability_port_binding.test.ts) · [`src/application/usecases/execution/__tests__/resolve_github_execution_admission_use_case.test.ts`](../src/application/usecases/execution/__tests__/resolve_github_execution_admission_use_case.test.ts) · [`src/application/usecases/workflow/__tests__/wait_for_previous_workflow_runs_use_case.test.ts`](../src/application/usecases/workflow/__tests__/wait_for_previous_workflow_runs_use_case.test.ts) · [`src/application/policies/__tests__/configuration_persistence_policy.test.ts`](../src/application/policies/__tests__/configuration_persistence_policy.test.ts) · [`src/application/usecases/steps/commit/__tests__/check_changes_issue_size_use_case.test.ts`](../src/application/usecases/steps/commit/__tests__/check_changes_issue_size_use_case.test.ts) · [`src/application/usecases/steps/commit/__tests__/update_change_size_labels.test.ts`](../src/application/usecases/steps/commit/__tests__/update_change_size_labels.test.ts) · [`src/data/repository/project/__tests__/project_board_visibility_recovery.test.ts`](../src/data/repository/project/__tests__/project_board_visibility_recovery.test.ts) · [`src/infrastructure/composition/__tests__/change_size_project_membership_composition_root.test.ts`](../src/infrastructure/composition/__tests__/change_size_project_membership_composition_root.test.ts) · [`src/manager/description/__tests__/configuration_recovery.test.ts`](../src/manager/description/__tests__/configuration_recovery.test.ts) · [`src/manager/description/__tests__/configuration_handler.test.ts`](../src/manager/description/__tests__/configuration_handler.test.ts) · [`src/data/repository/issue/__tests__/issue_content_repository.test.ts`](../src/data/repository/issue/__tests__/issue_content_repository.test.ts) · [`src/application/policies/__tests__/native_workflow_coordination_policy.test.ts`](../src/application/policies/__tests__/native_workflow_coordination_policy.test.ts) · [`src/data/repository/workflow/__tests__/native_workflow_coordination_repository.test.ts`](../src/data/repository/workflow/__tests__/native_workflow_coordination_repository.test.ts) · [`src/data/repository/workflow/__tests__/active_previous_workflow_runs_repository.test.ts`](../src/data/repository/workflow/__tests__/active_previous_workflow_runs_repository.test.ts) · [`src/actions/__tests__/common_action.test.ts`](../src/actions/__tests__/common_action.test.ts) · [`src/tooling/__tests__/validate_workflow_contract.test.ts`](../src/tooling/__tests__/validate_workflow_contract.test.ts) +- User documentation: [`docs/overview.mdx`](../docs/overview.mdx) · [`docs/bugbot/programmatic-api.mdx`](../docs/bugbot/programmatic-api.mdx) · [`docs/security-operations/operations/error-reference.mdx`](../docs/security-operations/operations/error-reference.mdx) · [`docs/security-operations/operations/troubleshooting.mdx`](../docs/security-operations/operations/troubleshooting.mdx) · [`docs/bugbot/quality-observability.mdx`](../docs/bugbot/quality-observability.mdx) · [`docs/bugbot/failure-scenarios.mdx`](../docs/bugbot/failure-scenarios.mdx) · [`docs/development/architecture.mdx`](../docs/development/architecture.mdx) · [`docs/issues/assignees-and-projects.mdx`](../docs/issues/assignees-and-projects.mdx) · [`docs/configuration.mdx`](../docs/configuration.mdx) · [`README.md`](../README.md) · [`docs/features.mdx`](../docs/features.mdx) · [`docs/pull-requests/workflow-setup.mdx`](../docs/pull-requests/workflow-setup.mdx) ### `architecture-quality-hardening` — Architecture quality and scalability hardening diff --git a/specs/catalog.json b/specs/catalog.json index 57b8cf4ab..9c42e0fd1 100644 --- a/specs/catalog.json +++ b/specs/catalog.json @@ -533,9 +533,9 @@ "id": "execution-lifecycle", "title": "Execution admission, queueing, routing, and result publication", "status": "implemented", - "scope": "Shared GitHub Action lifecycle from event admission through durable user-facing results", + "scope": "Shared GitHub Action lifecycle with pinned native resource/lane coordination proof, conservative predecessor fencing, routing and durable user-facing results", "owner": "Copilot maintainers", - "lastVerified": "2026-10-21", + "lastVerified": "2026-10-25", "specs": [ "specs/execution-admission-queue-and-publication.md", "specs/execution-error-and-context-hardening.md", @@ -604,7 +604,13 @@ "src/manager/description/configuration_handler.ts", "src/manager/description/configuration_markers.ts", "src/data/repository/issue/issue_content_repository.ts", - "src/data/repository/github/github_error_policy.ts" + "src/data/repository/github/github_error_policy.ts", + "src/application/policies/native_workflow_coordination_policy.ts", + "src/application/ports/workflow_run_ports.ts", + "src/application/usecases/workflow/wait_for_previous_workflow_runs_use_case.ts", + "src/data/repository/workflow/active_previous_workflow_runs_repository.ts", + "src/data/repository/workflow/native_workflow_coordination_repository.ts", + "src/infrastructure/composition/workflow_queue_composition_root.ts" ], "tests": [ "src/tooling/__tests__/coverage_budget_validator.test.ts", @@ -644,7 +650,12 @@ "src/infrastructure/composition/__tests__/change_size_project_membership_composition_root.test.ts", "src/manager/description/__tests__/configuration_recovery.test.ts", "src/manager/description/__tests__/configuration_handler.test.ts", - "src/data/repository/issue/__tests__/issue_content_repository.test.ts" + "src/data/repository/issue/__tests__/issue_content_repository.test.ts", + "src/application/policies/__tests__/native_workflow_coordination_policy.test.ts", + "src/data/repository/workflow/__tests__/native_workflow_coordination_repository.test.ts", + "src/data/repository/workflow/__tests__/active_previous_workflow_runs_repository.test.ts", + "src/actions/__tests__/common_action.test.ts", + "src/tooling/__tests__/validate_workflow_contract.test.ts" ], "documentation": [ "docs/overview.mdx", @@ -655,7 +666,10 @@ "docs/bugbot/failure-scenarios.mdx", "docs/development/architecture.mdx", "docs/issues/assignees-and-projects.mdx", - "docs/configuration.mdx" + "docs/configuration.mdx", + "README.md", + "docs/features.mdx", + "docs/pull-requests/workflow-setup.mdx" ] }, { diff --git a/specs/execution-admission-queue-and-publication.md b/specs/execution-admission-queue-and-publication.md index 89c5b7070..bcfc1f154 100644 --- a/specs/execution-admission-queue-and-publication.md +++ b/specs/execution-admission-queue-and-publication.md @@ -1,21 +1,23 @@ # Execution Admission, Queueing, Routing, and Result Publication -- Status: As-built baseline with implemented review-evidence ownership hardening +- Status: As-built baseline with review-evidence and native coordination hardening - Date: 2026-09-15 -- Last verified: 2026-09-15 on `develop` plus PR workflow UX implementation branch +- Last verified: 2026-10-25; issue #692 coordination regression verification - Owners: Copilot maintainers - Scope: the shared GitHub Action lifecycle from an incoming event to visible results and persisted execution state - Related issues/PRs: architecture quality and scalability hardening SDD; [PR #363](https://github.com/vypdev/copilot/pull/363); - [PR #378](https://github.com/vypdev/copilot/pull/378); historic motivation + [PR #378](https://github.com/vypdev/copilot/pull/378); + [issue #692](https://github.com/vypdev/copilot/issues/692); historic motivation before that live evidence is not recoverable from repository evidence - Required review gates: product UX, architecture, testing, documentation, security/operations - Open decisions blocking readiness: none for the baseline; see known debt and limitations ## 1. Executive summary -Copilot admits an event before expensive setup, serializes mutation-capable runs -per workflow, resolves one application route, and publishes a bounded result to +Copilot admits an event before expensive setup, verifies native resource/lane +coordination or serializes mutation-capable runs per workflow, resolves one +application route, and publishes a bounded result to the relevant GitHub conversation and Job Summary. A run created by the account behind the workflow PAT is ignored unless it is an explicit valid single action. The native `Copilot / Review` name is reserved for results carrying exactly one @@ -49,8 +51,10 @@ create inconsistent authorization and failure behavior. 2. Bot-authored normal events are discarded; valid explicit single actions pass. 3. Only agent roles reachable by the event are prepared, subject to `ai-members-only` authorization. -4. `mainRun` waits for older active runs of the same workflow, except the - dedicated failure-comment action. +4. Before setup, `mainRun` verifies the executing job's native resource/lane + coordination as specified in §6.4. Without that proof it waits for older + active runs of the same workflow. The dedicated failure-comment action stays + runnable when queue verification fails. 5. Setup restores issue, branch, and durable operation state; the route policy selects exactly one of issue, issue-comment, PR, review-comment, push, or single-action. @@ -69,7 +73,8 @@ create inconsistent authorization and failure behavior. - Observed behavior: `src/actions/github_action.ts`, `common_action.ts`, `main_run_lifecycle.ts`, `main_run_route.ts`, and `github_action_completion.ts`. -- Intentional contract: early bot-loop admission, workflow-scoped serialization, +- Intentional contract: early bot-loop admission, verified native resource/lane + coordination with workflow-scoped serialization as the conservative fallback, single-route ownership, sanitized publication, and fail-closed errors. - Known debt and limitations: queue state is polled and bounded by a 90-minute internal budget; optional Check Run publication is best-effort; 26 production @@ -83,8 +88,10 @@ create inconsistent authorization and failure behavior. [`execution-error-and-context-hardening.md`](./execution-error-and-context-hardening.md), under the sequencing and cross-cutting gates in [`architecture-quality-and-scalability-hardening.md`](./architecture-quality-and-scalability-hardening.md). - Changes to queue ownership or durable event processing beyond that proposal - require a separate design; they are not part of this baseline. + Issue #692 corrects a verified scheduler inversion: a later PR job occupied a + shared runner while waiting for an older queued job for a different PR. That + predecessor needed a runner from the same finite pool. The solution below + recognizes the existing native lanes rather than increasing the wait budget. ## 3. Actors, surfaces, and terminology @@ -104,7 +111,8 @@ presentation adapters decide where that fact appears. ### 4.1 Goals 1. Every accepted event MUST resolve to at most one top-level route. -2. Mutation-capable workflow runs MUST wait for older active runs or fail. +2. Mutation-capable workflow runs MUST have verified native resource/lane + coordination, wait for older active workflow runs, or fail before setup. 3. Results MUST remain understandable without raw logs. 4. A named native Check MUST represent only its semantic capability; a metadata result MUST NOT supersede a same-head review in GitHub's latest-by-name view. @@ -133,7 +141,7 @@ presentation adapters decide where that fact appears. | Stage | Pre-baseline understanding | As-built contract | Effect | |---|---|---|---| | Admission | implicit in entrypoint | explicit identity decision | bot loops stop early | -| Queue | implementation detail | fail-closed workflow gate | mutations do not overlap | +| Queue | every run polls the entire workflow | verify native lane before setup; otherwise fail-closed workflow gate | unrelated PRs do not hold runners waiting for each other | | Routing | spread across handlers | one route policy | predictable ownership | | Completion | comments only were assumed | route-owned comment when applicable + summary + optional check + state | evidence is inspectable without duplicate discussion noise | | Review evidence | every PR completion could reuse the Review name | exact-head telemetry owns Review; metadata keeps workflow/summary only | latest-by-name remains truthful | @@ -176,6 +184,60 @@ neutral. Duplicate events are tolerated through route-specific idempotency and persisted markers; this shared layer does not itself deduplicate GitHub deliveries. +### 6.4 Native coordination recognition — issue #692 + +The recommended installed Commit, PR analysis and PR review-state jobs already +declare native job concurrency. The runtime MUST recognize that exact contract +before setup, without a user-controlled bypass input and without enumerating +older runs when native coordination is proven. + +```text +Validate run/workflow identity + -> eligible normal event + pinned workflow/job metadata? + -> read executing workflow at GITHUB_WORKFLOW_SHA + -> exact job concurrency proven? -> setup -> existing guarded route + -> custom/legacy shape? -> existing predecessor queue -> setup + -> no eligible metadata? -> existing predecessor queue -> setup + -> provider/parse error or deadline -> fail before setup +``` + +Text equivalent: native proof delegates coordination to GitHub; missing proof +retains the predecessor fence; errors never grant permission to execute. + +| Normal event/resource | Required literal job group | Native cancellation | +|---|---|---| +| Branch `push` | `copilot-push-${{ github.repository }}-${{ github.ref_name }}` | `true` | +| `pull_request` with positive safe-integer PR number | `copilot-pr-${{ github.repository }}-${{ github.event.pull_request.number }}-analysis` | `true` | +| `pull_request_review` with positive safe-integer PR number | `copilot-pr-${{ github.repository }}-${{ github.event.pull_request.number }}-review-state` | `true` | + +The entrypoint MUST use GitHub's workflow ref, workflow commit SHA and current +job ID, bound to the current repository, rather than a checked-out file, workflow +display name or filename allowlist. Single actions, missing/invalid metadata, +tag pushes, unrelated events, reusable or multi-job workflows, workflow-level concurrency and +nonmatching groups MUST retain the existing workflow queue. The source read is +limited to a normal YAML workflow file at a full 40-hex commit SHA, at most +256 KiB. Parsing uses the JSON schema and executes no expressions or tags. +Recognition requires one direct job, preventing a reusable callee's job ID from +being mistaken for another protected job in the caller's workflow context. +Missing/malformed provider content, YAML errors, provider errors and exhausted +retry/deadline budgets MUST fail closed through the existing sanitized queue +failure. There is no disk fallback or read from a moving branch. + +GitHub's native key owns serialization/replacement within the same resource and +lane; PR identity keeps two PRs sharing a head branch independent. No runtime +comparison of `head_branch` substitutes for PR identity. Existing head/base, +finding, permission, publication and deployment fences remain mandatory. +Durable issue/comment mutations and legacy/custom jobs retain active-status +pagination, same-workflow predecessor ordering, retries and the 90-minute bound. +The recognition read and any fallback queue share that absolute deadline. + +No extra comments, checks or labels are introduced. A proven job logs +`Native workflow resource/lane coordination verified; continuing before setup.` +Legacy waiting and sanitized failures keep their existing messages. The run +and Job Summary remain the operator navigation surfaces. Cancellation before +setup leaves no application mutation; cancellation after setup retains the +existing route recovery rules. + ## 7. User-facing configuration | Input | Type | Recommended default | Allowed values | Scope/persistence | @@ -190,6 +252,11 @@ jitter, admission rules, route precedence, and error-to-exit mapping are not configurable. Inputs use Action values; stored issue configuration restores operation facts but never secrets. +Native recognition adds no public configuration or persisted state. Recommended +setup uses the three exact job groups in §6.4; a custom workflow without those +groups is a supported conservative alternative. Missing or future metadata +selects the existing queue, never a permissive mode. + ## 8. Clean Architecture design | Boundary | Owns | Must not own/import | @@ -216,6 +283,15 @@ application use cases decide; provider adapters satisfy ports; renderers expose sanitized results. Architecture and cycle tests MUST prevent inward layers from importing concrete infrastructure. +The entrypoint projects immutable workflow/job/event metadata before setup. The +waiting use case asks a semantic native-coordination query port once, then either +continues or uses its existing predecessor port. The GitHub adapter reads and +parses the pinned workflow; a pure application policy recognizes the exact group +and cancellation contract. Only infrastructure owns YAML/Octokit and environment +access stays at the entrypoint. Architecture import tests, workflow parser +contracts and the integrated scheduler-inversion regression enforce these +boundaries. No provider DTO or `Execution` dependency enters the pure policy. + ## 9. UI/UX and content contract The first view MUST say status, completed facts, next step, action, impact, and @@ -285,13 +361,22 @@ as `invalid`, never as zero findings. ## 13. Compatibility, migration, rollout, and rollback -This document records the repository behavior at the audit commit. There are no -installed users or real in-flight markers to preserve. The linked hardening work -therefore makes a clean cut: removed API/marker/result shapes are rejected and -no compatibility parser, migration, deprecation window, or dual reader ships. -After first real use, already completed provider mutations are never hidden or -rewound; incompatible future state fails closed and recovery starts from -inspectable provider facts. +For issue #692, consumers with the current native groups need only the fixed +runtime; workflow changes are unnecessary. Older/custom workflows keep the +queue. Roll out through a reviewed PR and the normal release process. A run +already waiting in an older runtime cannot adopt the fix in place; inspect its +predecessors and rerun after the fix is available. Changing concurrency keys +during an active run may overlap an old key, so existing freshness/idempotency +guards remain essential. Rollback restores the earlier runtime and its global +wait behavior; it does not undo provider mutations. Live consumer cancellation, +deployment and release are outside this issue's implementation authorization. + +The native coordination increment changes no installed input or durable marker +schema. Existing production consumers retain their workflow groups and operation +state. Already completed provider mutations are never hidden or rewound; +incompatible state fails closed and recovery starts from inspectable provider +facts. The historical evidence-schema cutover remains documented in the linked +hardening specifications; it is not a migration introduced by issue #692. ## 14. Testing strategy and numeric budget @@ -311,6 +396,20 @@ Tests use fake clocks/randomness/providers and no live waits. Golden Markdown needs semantic assertions. Human evidence remains required for desktop/mobile, light/dark, and screen-reader order. +Issue #692 adds a minimum **24 distinct cases**, derived from the new proof +boundary: **12 pure policy/context** cases (three lanes, same-owner stability, +invalid resources/metadata, single actions and custom groups), **6 adapter** +cases (pinned contents, malformed content/YAML, endpoint errors, safe fallback +and bounds), **4 orchestration/integration** cases (scheduler inversion before +setup, retained mutation fence, native failure before setup and deadline), and +**2 shipped/setup workflow replays** proving different-PR independence and +same-resource/lane stability. Existing predecessor pagination/retry/error and +workflow mutant cases remain required. New pure policy targets at least 95% +branch coverage; changed adapters/use cases target at least 90% lines. Fake +providers, clocks and delays exercise the race without live runner sleeps. +No new graphical UI exists, so human visual captures are not needed for this +increment; native log copy is checked semantically. + ## 15. Documentation and discoverability | Audience | Artifact | Contract | @@ -320,11 +419,16 @@ light/dark, and screen-reader order. | Operator | troubleshooting | timeout, partial publication, retry | | Contributor | architecture + this SDD | boundaries and route ownership | +Issue #692 updates `docs/features.mdx`, `docs/pull-requests/workflow-setup.mdx` +and the README with native proof, conservative custom fallback, pinned-content +read permissions, shared-runner recovery and unchanged safety guards. + ## 16. Acceptance scenarios 1. Given a PAT-authored normal event, the run exits before queue or mutation. 2. Given a valid explicit single action from that account, it executes. -3. Given older active runs, the current run waits with bounded jitter. +3. Given older active runs without native coordination proof, the current run + waits with bounded jitter. 4. Given unavailable workflow identity on GitHub Actions, queueing fails closed. 5. Given a known event, exactly one route owns it. 6. Given successful core work and failed optional check publication, the summary @@ -350,6 +454,20 @@ light/dark, and screen-reader order. telemetry, the telemetry-set and finding-state projections are invalid; no Review Check is published and every other current-state consumer fails or blocks instead of reporting success. +16. Given an older queued PR A and a later executing PR B on a finite shared + pool, a proven native job reaches setup without enumerating predecessors + or waiting; the shipped and setup workflow fixtures reproduce this. +17. Given successive events for the same PR/lane, GitHub's exact group stays + stable; different PRs and analysis/review-state lanes remain independent. +18. Given a legacy/custom job, missing metadata, tag push or single action, the + original predecessor fence blocks setup until older active runs finish. +19. Given malformed source, unreadable workflow content or an expired proof + deadline, setup/routes do not run and raw provider diagnostics are absent + from the public queue failure. +20. Given a misleading filename, different checkout or moving branch, native + recognition uses only the executing repository/workflow SHA/job and rejects + nonmatching contracts. Policy and adapter tests enforce the inspection bound + and prohibit executable YAML tags. ## 17. Requirements traceability @@ -357,6 +475,7 @@ light/dark, and screen-reader order. |---|---|---|---| | admission invariants | admission policy/use case | admission tests | overview | | serialization | queue policy/use case/adapters | queue + workflow tests | troubleshooting | +| §6.4 native proof and conservative fallback | native coordination policy/port/adapter + waiting use case | policy/context, pinned-content, scheduler-inversion and failure/deadline cases; shipped/setup replays | features and PR workflow setup | | one route | route policy/dispatcher | route tests | architecture | | safe publication | completion/presentation policies | completion tests | overview | | metadata noise bound | explicit generic-comment publication mode | metadata-edit context/use-case/completion negatives | workflow setup and troubleshooting | @@ -374,6 +493,10 @@ light/dark, and screen-reader order. ## 19. Definition of Done +- [x] Issue #692: the additional 24-case budget, policy/adapter coverage, + scheduler inversion, same-resource contracts, sanitized failures, + documentation, typecheck/lint, workflow and specification validation pass. + - [x] Normative changes have acceptance and traceability. - [x] Architecture, workflow, catalog, and cycle checks pass. - [x] The 70-case risk budget and repository coverage gates pass; both shared @@ -387,6 +510,13 @@ light/dark, and screen-reader order. ## 20. References and decisions - Primary sources: catalogued code, workflows, tests, and documentation. +- Issue #692 primary provider contracts: [native job concurrency](https://docs.github.com/en/actions/how-tos/write-workflows/choose-when-workflows-run/control-workflow-concurrency), + [workflow SHA and job metadata](https://docs.github.com/en/actions/reference/workflows-and-actions/variables), + and [repository content at a ref](https://docs.github.com/en/rest/repos/contents#get-repository-content). + Decision: prove the executing job's existing native contract, then delegate + to GitHub. Reject a filename-only allowlist, a caller bypass flag, checked-out + YAML, branch-name predecessor filtering and larger timeouts: none establishes + safe PR identity and native fencing before setup. - Related specs: release orchestration, merge-queue readiness, Bugbot reconciliation. - Planned hardening: `execution-error-and-context-hardening.md` owns the semantic error boundary and `Execution` context replacement; the architecture hardening diff --git a/src/actions/__tests__/common_action.test.ts b/src/actions/__tests__/common_action.test.ts index 3693afd2e..a875915a8 100644 --- a/src/actions/__tests__/common_action.test.ts +++ b/src/actions/__tests__/common_action.test.ts @@ -20,6 +20,12 @@ import type { Execution } from '../../data/model/execution'; import type { SynchronizeAgentActivityUseCase } from '../../application/usecases/actions/synchronize_agent_activity_use_case'; import { Result } from '../../data/model/result'; import { logInfo } from '../../utils/logger'; +import { readFileSync } from 'node:fs'; +import { buildPreviousWorkflowRunsQuery } from '../main_run_lifecycle'; +import { WaitForPreviousWorkflowRunsUseCase } from '../../application/usecases/workflow/wait_for_previous_workflow_runs_use_case'; +import { NativeWorkflowCoordinationRepository } from '../../data/repository/workflow/native_workflow_coordination_repository'; +import { ActivePreviousWorkflowRunsRepository } from '../../data/repository/workflow/active_previous_workflow_runs_repository'; +import type { PreviousWorkflowRunsQuery } from '../../application/ports/workflow_run_ports'; jest.mock('@actions/core', () => ({ setFailed: jest.fn(), @@ -244,6 +250,8 @@ const originalRunId = process.env.GITHUB_RUN_ID; const originalWorkflow = process.env.GITHUB_WORKFLOW; const originalWorkflowRef = process.env.GITHUB_WORKFLOW_REF; const originalGithubActions = process.env.GITHUB_ACTIONS; +const nativeEnvironment = ['GITHUB_WORKFLOW_SHA', 'GITHUB_JOB', 'GITHUB_EVENT_NAME', 'GITHUB_REF'] as const; +const originalNativeEnvironment = nativeEnvironment.map(name => [name, process.env[name]] as const); function restoreEnvironmentVariable(name: string, value: string | undefined): void { if (value === undefined) { @@ -262,6 +270,7 @@ describe('mainRun', () => { delete process.env.GITHUB_WORKFLOW; delete process.env.GITHUB_WORKFLOW_REF; delete process.env.GITHUB_ACTIONS; + for (const name of nativeEnvironment) delete process.env[name]; mockWaitForPreviousWorkflowRunsInvoke.mockResolvedValue(undefined); mockSingleActionInvoke.mockResolvedValue([]); mockIssueCommentInvoke.mockResolvedValue([]); @@ -280,6 +289,7 @@ describe('mainRun', () => { restoreEnvironmentVariable('GITHUB_WORKFLOW', originalWorkflow); restoreEnvironmentVariable('GITHUB_WORKFLOW_REF', originalWorkflowRef); restoreEnvironmentVariable('GITHUB_ACTIONS', originalGithubActions); + for (const [name, value] of originalNativeEnvironment) restoreEnvironmentVariable(name, value); }); it('delegates setup to the composed use case and clears accumulated logs', async () => { @@ -326,6 +336,105 @@ describe('mainRun', () => { }); }); + function nativeRunEnvironment() { + Object.assign(process.env, { + GITHUB_ACTIONS: 'true', GITHUB_RUN_ID: '200', GITHUB_EVENT_NAME: 'pull_request', + GITHUB_WORKFLOW_REF: 'org/repo/.github/workflows/copilot_pull_request.yml@refs/heads/main', + GITHUB_WORKFLOW_SHA: 'a'.repeat(40), GITHUB_JOB: 'copilot-pull-requests', + }); + } + + it.each(['.github/workflows', 'setup/workflows'])( + 'replays scheduler inversion before setup using the native contract in %s', async directory => { + nativeRunEnvironment(); + const order: string[] = []; + const source = readFileSync(`${directory}/copilot_pull_request.yml`, 'utf8'); + const getContent = jest.fn(async () => { + order.push('proof'); + return { data: { type: 'file', encoding: 'base64', content: Buffer.from(source).toString('base64') } }; + }); + // An older PR A is queued and cannot acquire this runner while B holds it. + const iterator = jest.fn(async function* () { + yield { data: { workflow_runs: [{ id: 199, status: 'queued' }] } }; + }); + const delay = { wait: jest.fn() }; + const clock = { nowMilliseconds: () => 0 }; + const native = new NativeWorkflowCoordinationRepository({ rest: { repos: { getContent } } }, { + delayPort: delay, clock, random: { next: () => 0.5 }, + }); + const predecessors = new ActivePreviousWorkflowRunsRepository({ + rest: { actions: { listWorkflowRuns: jest.fn() } }, paginate: { iterator }, + }); + mockWaitForPreviousWorkflowRunsInvoke.mockImplementation((query: PreviousWorkflowRunsQuery) => + new WaitForPreviousWorkflowRunsUseCase(predecessors, delay, { + noActivePreviousRuns: jest.fn(), waitingForPreviousRuns: jest.fn(), + }, undefined, clock, undefined, native).invoke(query)); + mockSetupExecutionInvoke.mockImplementation(async context => { + order.push('setup'); return unresolvedSetupResult(context); + }); + await runMain(mockExecution({ isPullRequest: true, eventName: 'pull_request', inputs: { pull_request: { number: 22 } } })); + expect(order).toEqual(['proof', 'setup']); + expect(iterator).not.toHaveBeenCalled(); + expect(delay.wait).not.toHaveBeenCalled(); + expect(mockPullRequestInvoke).toHaveBeenCalledTimes(1); + expect(getContent).toHaveBeenCalledWith({ owner: 'org', repo: 'repo', + path: '.github/workflows/copilot_pull_request.yml', ref: 'a'.repeat(40) }); + }, + ); + + it('retains the mutation fence before setup for a custom job without native coordination', async () => { + nativeRunEnvironment(); + const order: string[] = []; + let predecessorActive = true; + const iterator = jest.fn(async function* () { + yield { data: { workflow_runs: predecessorActive ? [{ id: 199, status: 'queued' }] : [] } }; + }); + const delay = { wait: jest.fn(async () => { order.push('wait'); predecessorActive = false; }) }; + const clock = { nowMilliseconds: () => 0 }; + const native = new NativeWorkflowCoordinationRepository({ rest: { repos: { + getContent: jest.fn().mockResolvedValue({ data: { type: 'file', encoding: 'base64', + content: Buffer.from('jobs: { copilot-pull-requests: { steps: [] } }').toString('base64') } }), + } } }, { delayPort: delay, clock, random: { next: () => 0.5 } }); + const predecessors = new ActivePreviousWorkflowRunsRepository({ + rest: { actions: { listWorkflowRuns: jest.fn() } }, paginate: { iterator }, + }, undefined, undefined, clock); + mockWaitForPreviousWorkflowRunsInvoke.mockImplementation((query: PreviousWorkflowRunsQuery) => + new WaitForPreviousWorkflowRunsUseCase(predecessors, delay, { + noActivePreviousRuns: jest.fn(), waitingForPreviousRuns: jest.fn(), + }, undefined, clock, { next: () => 0.5 }, native).invoke(query)); + mockSetupExecutionInvoke.mockImplementation(async context => { + expect(predecessorActive).toBe(false); order.push('setup'); return unresolvedSetupResult(context); + }); + await runMain(mockExecution({ inputs: { pull_request: { number: 21 } } })); + expect(order).toEqual(['wait', 'setup']); + }); + + it('fails before setup with sanitized diagnostics when native proof cannot be read', async () => { + nativeRunEnvironment(); + const native = new NativeWorkflowCoordinationRepository({ rest: { repos: { + getContent: jest.fn().mockRejectedValue({ status: 403, message: 'secret-provider-body' }), + } } }, { delayPort: { wait: jest.fn() }, clock: { nowMilliseconds: () => 0 }, random: { next: () => 0.5 } }); + mockWaitForPreviousWorkflowRunsInvoke.mockImplementation((query: PreviousWorkflowRunsQuery) => + new WaitForPreviousWorkflowRunsUseCase({ countActivePreviousRuns: jest.fn() }, { wait: jest.fn() }, { + noActivePreviousRuns: jest.fn(), waitingForPreviousRuns: jest.fn(), + }, undefined, { nowMilliseconds: () => 0 }, undefined, native).invoke(query)); + await expect(runMain(mockExecution({ inputs: { pull_request: { number: 21 } } }))) + .rejects.toThrow('Workflow queue check failed; sequential execution was not bypassed.'); + expect(mockSetupExecutionInvoke).not.toHaveBeenCalled(); + expect(mockPullRequestInvoke).not.toHaveBeenCalled(); + expect(logger.logError).not.toHaveBeenCalledWith(expect.stringContaining('secret-provider-body')); + }); + + it('projects only GitHub workflow metadata and omits native delegation for single actions', () => { + nativeRunEnvironment(); + const repository = { owner: 'org', repo: 'repo' }; + const query = buildPreviousWorkflowRunsQuery(repository, { isSingleAction: false, pullRequestNumber: 21 }); + expect(query.nativeCoordination).toMatchObject({ workflowRevision: 'a'.repeat(40), + jobId: 'copilot-pull-requests', eventName: 'pull_request', pullRequestNumber: 21 }); + expect(Object.isFrozen(query.nativeCoordination)).toBe(true); + expect(buildPreviousWorkflowRunsQuery(repository, { isSingleAction: true }).nativeCoordination).toBeUndefined(); + }); + it('does not queue the issue-comment single action so a failed queue gate can still report', async () => { process.env.GITHUB_ACTIONS = 'true'; delete process.env.GITHUB_RUN_ID; diff --git a/src/actions/common_action.ts b/src/actions/common_action.ts index 9f36dda99..11a514405 100644 --- a/src/actions/common_action.ts +++ b/src/actions/common_action.ts @@ -59,10 +59,12 @@ export async function mainRun( logDebugInfo(`Event: ${execution.eventName}, actor: ${execution.actor}, repo: ${repository.owner}/${repository.repo}, debug: ${execution.debug}`); if (process.env.GITHUB_ACTIONS === 'true' && !execution.singleAction.isPublishIssueCommentAction) { - // Every GitHub workflow invocation queues before setup or route work so - // executions of the same workflow file cannot overlap mutations. A - // failure notification must remain runnable when that queue gate fails. - await waitForPreviousWorkflowRuns(execution.tokens.token, repository); + // Verify native resource/lane coordination or retain the predecessor + // fence before setup. Failure notifications must remain runnable. + await waitForPreviousWorkflowRuns(execution.tokens.token, repository, { + isSingleAction: execution.isSingleAction, + pullRequestNumber: execution.inputs?.pull_request?.number, + }); } const setupExecution = createSetupExecutionUseCase(latestTagQueryPort, { diff --git a/src/actions/main_run_lifecycle.ts b/src/actions/main_run_lifecycle.ts index 1fb40018e..881aa1771 100644 --- a/src/actions/main_run_lifecycle.ts +++ b/src/actions/main_run_lifecycle.ts @@ -28,13 +28,24 @@ export class WorkflowQueueFailureError extends Error { export function buildPreviousWorkflowRunsQuery( repository: RepositoryCoordinates, + event?: { readonly isSingleAction: boolean; readonly pullRequestNumber?: number }, ): PreviousWorkflowRunsQuery { const workflowIdentifier = resolveWorkflowIdentifier(process.env.GITHUB_WORKFLOW_REF); const query: PreviousWorkflowRunsQuery = { owner: repository.owner, repository: repository.repo, - currentRunId: Number.parseInt(process.env.GITHUB_RUN_ID ?? '', 10), + currentRunId: Number(process.env.GITHUB_RUN_ID ?? Number.NaN), ...(workflowIdentifier ? { workflowIdentifier } : {}), + ...(event && !event.isSingleAction && process.env.GITHUB_WORKFLOW_SHA && process.env.GITHUB_JOB ? { + nativeCoordination: Object.freeze({ + workflowRef: process.env.GITHUB_WORKFLOW_REF ?? '', + workflowRevision: process.env.GITHUB_WORKFLOW_SHA, + jobId: process.env.GITHUB_JOB, + eventName: process.env.GITHUB_EVENT_NAME ?? '', + ref: process.env.GITHUB_REF, + pullRequestNumber: event.pullRequestNumber, + }), + } : {}), }; return query; } @@ -42,9 +53,10 @@ export function buildPreviousWorkflowRunsQuery( export async function waitForPreviousWorkflowRuns( token: string, repository: RepositoryCoordinates, + event?: { readonly isSingleAction: boolean; readonly pullRequestNumber?: number }, ): Promise { - const query = buildPreviousWorkflowRunsQuery(repository); - if (process.env.GITHUB_ACTIONS === 'true' && !Number.isSafeInteger(query.currentRunId)) { + const query = buildPreviousWorkflowRunsQuery(repository, event); + if (process.env.GITHUB_ACTIONS === 'true' && (!Number.isSafeInteger(query.currentRunId) || query.currentRunId <= 0)) { throw new Error('GitHub workflow identity is unavailable; refusing to bypass sequential execution.'); } if (process.env.GITHUB_ACTIONS === 'true' && !query.workflowIdentifier) { diff --git a/src/application/policies/__tests__/native_workflow_coordination_policy.test.ts b/src/application/policies/__tests__/native_workflow_coordination_policy.test.ts new file mode 100644 index 000000000..6834f0e30 --- /dev/null +++ b/src/application/policies/__tests__/native_workflow_coordination_policy.test.ts @@ -0,0 +1,61 @@ +import { expectedNativeWorkflowGroup, hasNativeWorkflowCoordination } from '../native_workflow_coordination_policy'; +import type { PreviousWorkflowRunsQuery } from '../../ports/workflow_run_ports'; + +const group = 'copilot-pr-${{ github.repository }}-${{ github.event.pull_request.number }}-analysis'; +const native = { + workflowRef: 'org/repo/.github/workflows/custom.yml@refs/heads/main', + workflowRevision: 'a'.repeat(40), jobId: 'review', eventName: 'pull_request', pullRequestNumber: 21, +}; +const query: PreviousWorkflowRunsQuery = { + owner: 'org', repository: 'repo', currentRunId: 200, workflowIdentifier: 'custom.yml', nativeCoordination: native, +}; +const workflow = (concurrency: unknown = { group, 'cancel-in-progress': true }) => ({ + jobs: { review: { steps: [], concurrency } }, +}); + +describe('native workflow coordination policy', () => { + it.each([ + ['pull_request', undefined, 21, group], + ['pull_request_review', undefined, 21, group.replace('analysis', 'review-state')], + ['push', 'refs/heads/feature/work', undefined, 'copilot-push-${{ github.repository }}-${{ github.ref_name }}'], + ])('recognizes the exact %s lane with valid resource identity', (eventName, ref, pullRequestNumber, expected) => { + expect(expectedNativeWorkflowGroup({ ...query, nativeCoordination: { ...native, eventName, ref, pullRequestNumber } })).toBe(expected); + expect(hasNativeWorkflowCoordination(workflow({ group: expected, 'cancel-in-progress': true }), 'review', expected)).toBe(true); + }); + + it.each([ + { nativeCoordination: undefined }, + { currentRunId: Number.NaN }, { currentRunId: 0 }, + { workflowIdentifier: '../custom.yml' }, { workflowIdentifier: undefined }, + { nativeCoordination: { ...native, workflowRef: 'elsewhere/repo/.github/workflows/custom.yml@main' } }, + { nativeCoordination: { ...native, workflowRef: 'org/repo/.github/workflows/custom.yml@' } }, + { nativeCoordination: { ...native, workflowRevision: 'main' } }, + { nativeCoordination: { ...native, jobId: '' } }, + { nativeCoordination: { ...native, pullRequestNumber: 0 } }, + { nativeCoordination: { ...native, pullRequestNumber: undefined } }, + { nativeCoordination: { ...native, pullRequestNumber: 1.5 } }, + { nativeCoordination: { ...native, eventName: 'issues' } }, + { nativeCoordination: { ...native, eventName: 'push', ref: 'refs/tags/v3' } }, + { nativeCoordination: { ...native, eventName: 'push', ref: undefined } }, + { nativeCoordination: { ...native, eventName: 'push', ref: 'refs/heads/', pullRequestNumber: undefined } }, + ])('retains the conservative queue for invalid or unrelated metadata %j', patch => { + expect(expectedNativeWorkflowGroup({ ...query, ...patch })).toBeUndefined(); + }); + + it.each([ + undefined, null, [], {}, { concurrency: {} }, { jobs: [] }, { jobs: { review: null } }, + { jobs: { review: { uses: 'org/repo/workflow.yml@v1', concurrency: { group, 'cancel-in-progress': true } } } }, + { ...workflow(), concurrency: 'outer' }, + { jobs: { ...workflow().jobs, other: { uses: 'org/repo/workflow.yml@v1' } } }, + workflow('custom'), workflow({ group: 'custom', 'cancel-in-progress': true }), + workflow({ group, 'cancel-in-progress': false }), + workflow({ group, 'cancel-in-progress': '${{ true }}' }), + workflow({ group, 'cancel-in-progress': true, queue: 'max' }), + ])('does not infer native protection from a custom or incomplete workflow %j', value => { + expect(hasNativeWorkflowCoordination(value, 'review', group)).toBe(false); + }); + + it('accepts explicit single-pending native queue semantics', () => { + expect(hasNativeWorkflowCoordination(workflow({ group, 'cancel-in-progress': true, queue: 'single' }), 'review', group)).toBe(true); + }); +}); diff --git a/src/application/policies/native_workflow_coordination_policy.ts b/src/application/policies/native_workflow_coordination_policy.ts new file mode 100644 index 000000000..4559c1290 --- /dev/null +++ b/src/application/policies/native_workflow_coordination_policy.ts @@ -0,0 +1,42 @@ +import type { PreviousWorkflowRunsQuery } from '../ports/workflow_run_ports'; + +const PUSH_GROUP = 'copilot-push-${{ github.repository }}-${{ github.ref_name }}'; +const PR_GROUP = 'copilot-pr-${{ github.repository }}-${{ github.event.pull_request.number }}'; + +/** Closed recognition of the installed contract, without evaluating expressions. */ +export function expectedNativeWorkflowGroup(query: PreviousWorkflowRunsQuery): string | undefined { + const native = query.nativeCoordination; + if (!native || !Number.isSafeInteger(query.currentRunId) || query.currentRunId <= 0 + || !/^[\w.-]+\.ya?ml$/u.test(query.workflowIdentifier ?? '') + || !native.workflowRef.startsWith(`${query.owner}/${query.repository}/.github/workflows/${query.workflowIdentifier}@`) + || native.workflowRef.endsWith('@') + || !/^[a-f\d]{40}$/iu.test(native.workflowRevision) + || !/^[a-zA-Z_][\w-]*$/u.test(native.jobId)) return undefined; + + if (native.eventName === 'push' && native.ref?.startsWith('refs/heads/') + && native.ref.length > 'refs/heads/'.length) return PUSH_GROUP; + if (!Number.isSafeInteger(native.pullRequestNumber) || (native.pullRequestNumber ?? 0) <= 0) return undefined; + if (native.eventName === 'pull_request') return `${PR_GROUP}-analysis`; + if (native.eventName === 'pull_request_review') return `${PR_GROUP}-review-state`; + return undefined; +} + +export function hasNativeWorkflowCoordination(workflow: unknown, jobId: string, expectedGroup: string): boolean { + const definition = record(workflow); + const jobs = record(definition?.jobs); + const job = record(jobs?.[jobId]); + const concurrency = record(job?.concurrency); + // Custom/reusable/workflow-level contracts retain conservative polling. + // A single direct job also avoids confusing a reusable callee's job ID + // with a different protected job in its caller's workflow context. + return definition?.concurrency === undefined && jobs !== undefined && Object.keys(jobs).length === 1 + && Array.isArray(job?.steps) + && job?.uses === undefined && concurrency?.group === expectedGroup + && concurrency?.['cancel-in-progress'] === true + && (concurrency.queue === undefined || concurrency.queue === 'single'); +} + +function record(value: unknown): Record | undefined { + return value !== null && typeof value === 'object' && !Array.isArray(value) + ? value as Record : undefined; +} diff --git a/src/application/ports/workflow_run_ports.ts b/src/application/ports/workflow_run_ports.ts index 2f56f1cd8..35f8f1f58 100644 --- a/src/application/ports/workflow_run_ports.ts +++ b/src/application/ports/workflow_run_ports.ts @@ -4,6 +4,21 @@ export interface PreviousWorkflowRunsQuery { currentRunId: number; /** Workflow file name accepted by GitHub to scope the queue query. */ workflowIdentifier?: string; + /** GitHub-provided executing workflow metadata; never an opt-out flag. */ + nativeCoordination?: NativeWorkflowCoordinationContext; +} + +export interface NativeWorkflowCoordinationContext { + readonly workflowRef: string; + readonly workflowRevision: string; + readonly jobId: string; + readonly eventName: string; + readonly ref?: string; + readonly pullRequestNumber?: number; +} + +export interface NativeWorkflowCoordinationQueryPort { + isCoordinated(query: PreviousWorkflowRunsQuery, context: WorkflowQueueRequestContext): Promise; } export interface WorkflowQueueRequestContext { @@ -34,6 +49,7 @@ export interface WorkflowProviderRetryObservation { } export interface WorkflowPollingObserverPort { + nativeCoordinationVerified?(): void; noActivePreviousRuns(): void; waitingForPreviousRuns(activeRunCount: number, delayMilliseconds: number): void; providerRetry?(observation: WorkflowProviderRetryObservation): void; diff --git a/src/application/usecases/workflow/__tests__/wait_for_previous_workflow_runs_use_case.test.ts b/src/application/usecases/workflow/__tests__/wait_for_previous_workflow_runs_use_case.test.ts index 1170158a9..b4b79168a 100644 --- a/src/application/usecases/workflow/__tests__/wait_for_previous_workflow_runs_use_case.test.ts +++ b/src/application/usecases/workflow/__tests__/wait_for_previous_workflow_runs_use_case.test.ts @@ -29,6 +29,49 @@ function policy(overrides: Partial = {}): WorkflowPolling } describe('WaitForPreviousWorkflowRunsUseCase', () => { + it('delegates to proven native coordination without enumerating or waiting for queued predecessors', async () => { + const predecessors = { countActivePreviousRuns: jest.fn().mockResolvedValue(1) }; + const native = { isCoordinated: jest.fn().mockResolvedValue(true) }; + const delay = { wait: jest.fn() }; + const observed = { ...observer(), nativeCoordinationVerified: jest.fn() }; + await new WaitForPreviousWorkflowRunsUseCase(predecessors, delay, observed, undefined, + { nowMilliseconds: () => 0 }, undefined, native).invoke(query); + expect(native.isCoordinated).toHaveBeenCalledWith(query, { deadlineAtMilliseconds: 5400000 }); + expect(predecessors.countActivePreviousRuns).not.toHaveBeenCalled(); + expect(delay.wait).not.toHaveBeenCalled(); + expect(observed.nativeCoordinationVerified).toHaveBeenCalledTimes(1); + expect(observed.noActivePreviousRuns).not.toHaveBeenCalled(); + }); + + it('keeps the predecessor fence when native proof is absent and inspects proof only once', async () => { + const predecessors = { countActivePreviousRuns: jest.fn().mockResolvedValueOnce(1).mockResolvedValue(0) }; + const native = { isCoordinated: jest.fn().mockResolvedValue(false) }; + const delay = { wait: jest.fn() }; + await new WaitForPreviousWorkflowRunsUseCase(predecessors, delay, observer(), undefined, + { nowMilliseconds: () => 0 }, { next: () => 0.5 }, native).invoke(query); + expect(predecessors.countActivePreviousRuns).toHaveBeenCalledTimes(2); + expect(delay.wait).toHaveBeenCalledWith(5000); + expect(native.isCoordinated).toHaveBeenCalledTimes(1); + }); + + it('propagates proof errors without treating the predecessor queue as empty', async () => { + const predecessors = { countActivePreviousRuns: jest.fn() }; + const native = { isCoordinated: jest.fn().mockRejectedValue(new Error('denied')) }; + await expect(new WaitForPreviousWorkflowRunsUseCase(predecessors, { wait: jest.fn() }, observer(), + undefined, { nowMilliseconds: () => 0 }, undefined, native).invoke(query)).rejects.toThrow('denied'); + expect(predecessors.countActivePreviousRuns).not.toHaveBeenCalled(); + }); + + it('includes native proof in the absolute queue deadline', async () => { + let now = 0; + const predecessors = { countActivePreviousRuns: jest.fn() }; + const native = { isCoordinated: jest.fn(async () => { now = 100; return true; }) }; + await expect(new WaitForPreviousWorkflowRunsUseCase(predecessors, { wait: jest.fn() }, observer(), + policy({ maximumQueueWaitMilliseconds: 100 }), { nowMilliseconds: () => now }, undefined, native) + .invoke(query)).rejects.toThrow('Timeout'); + expect(predecessors.countActivePreviousRuns).not.toHaveBeenCalled(); + }); + it('queries immediately and reports when no previous runs are active', async () => { const queryPort: PreviousWorkflowRunsQueryPort = { countActivePreviousRuns: jest.fn().mockResolvedValue(0), diff --git a/src/application/usecases/workflow/wait_for_previous_workflow_runs_use_case.ts b/src/application/usecases/workflow/wait_for_previous_workflow_runs_use_case.ts index 309d99792..8676ff815 100644 --- a/src/application/usecases/workflow/wait_for_previous_workflow_runs_use_case.ts +++ b/src/application/usecases/workflow/wait_for_previous_workflow_runs_use_case.ts @@ -1,5 +1,6 @@ import type { PreviousWorkflowRunsQuery, + NativeWorkflowCoordinationQueryPort, PreviousWorkflowRunsQueryPort, WorkflowPollingDelayPort, WorkflowPollingObserverPort, @@ -27,12 +28,22 @@ export class WaitForPreviousWorkflowRunsUseCase implements ParamUseCase { const deadlineAtMilliseconds = this.clock.nowMilliseconds() + this.policy.maximumQueueWaitMilliseconds; let pollIndex = 0; + if (this.nativeCoordination && this.clock.nowMilliseconds() < deadlineAtMilliseconds) { + const coordinated = await this.nativeCoordination.isCoordinated(query, { deadlineAtMilliseconds }); + if (this.clock.nowMilliseconds() >= deadlineAtMilliseconds) throw queueTimeoutError(); + if (coordinated) { + this.observerPort.nativeCoordinationVerified?.(); + return; + } + } + while (true) { if (this.clock.nowMilliseconds() >= deadlineAtMilliseconds) { throw queueTimeoutError(); diff --git a/src/data/repository/workflow/__tests__/native_workflow_coordination_repository.test.ts b/src/data/repository/workflow/__tests__/native_workflow_coordination_repository.test.ts new file mode 100644 index 000000000..a003ac904 --- /dev/null +++ b/src/data/repository/workflow/__tests__/native_workflow_coordination_repository.test.ts @@ -0,0 +1,87 @@ +import { NativeWorkflowCoordinationRepository } from '../native_workflow_coordination_repository'; +import type { PreviousWorkflowRunsQuery } from '../../../../application/ports/workflow_run_ports'; + +const group = 'copilot-pr-${{ github.repository }}-${{ github.event.pull_request.number }}-analysis'; +const source = `jobs:\n review:\n steps: []\n concurrency:\n group: ${group}\n cancel-in-progress: true\n`; +const query: PreviousWorkflowRunsQuery = { + owner: 'org', repository: 'repo', currentRunId: 200, workflowIdentifier: 'custom.yml', + nativeCoordination: { + workflowRef: 'org/repo/.github/workflows/custom.yml@refs/pull/21/merge', + workflowRevision: 'a'.repeat(40), jobId: 'review', eventName: 'pull_request', pullRequestNumber: 21, + }, +}; +const context = { deadlineAtMilliseconds: 100000 }; +const content = (text: string) => ({ data: { type: 'file', encoding: 'base64', content: Buffer.from(text).toString('base64') } }); + +function setup() { + const getContent = jest.fn().mockResolvedValue(content(source)); + const delayPort = { wait: jest.fn().mockResolvedValue(undefined) }; + const repository = new NativeWorkflowCoordinationRepository({ rest: { repos: { getContent } } }, { + clock: { nowMilliseconds: () => 0 }, random: { next: () => 0.5 }, delayPort, + }); + return { repository, getContent, delayPort }; +} + +describe('NativeWorkflowCoordinationRepository', () => { + it('reads the executing workflow revision and current job rather than a branch or checkout', async () => { + const { repository, getContent } = setup(); + await expect(repository.isCoordinated(query, context)).resolves.toBe(true); + expect(getContent).toHaveBeenCalledWith({ owner: 'org', repo: 'repo', path: '.github/workflows/custom.yml', ref: 'a'.repeat(40) }); + }); + + it('does not perform a content read for legacy metadata', async () => { + const { repository, getContent } = setup(); + await expect(repository.isCoordinated({ ...query, nativeCoordination: undefined }, context)).resolves.toBe(false); + expect(getContent).not.toHaveBeenCalled(); + }); + + it('retains polling for a valid but nonmatching workflow, even with the usual filename', async () => { + const { repository, getContent } = setup(); + getContent.mockResolvedValue(content('jobs: { review: { steps: [] } }')); + await expect(repository.isCoordinated(query, context)).resolves.toBe(false); + }); + + it.each([null, [], { type: 'dir' }, { type: 'file', encoding: 'base64' }, + { type: 'file', encoding: 'utf8', content: source }, + { type: 'file', encoding: 'base64', content: 'A'.repeat(256 * 1024 * 2 + 1) }, + ])('fails closed for malformed or oversized provider content %#', async value => { + const { repository, getContent } = setup(); + getContent.mockResolvedValue({ data: value }); + await expect(repository.isCoordinated(query, context)).rejects.toThrow('content is unavailable'); + }); + + it('rejects decoded content over the bound', async () => { + const { repository, getContent } = setup(); + getContent.mockResolvedValue(content('a'.repeat(256 * 1024 + 1))); + await expect(repository.isCoordinated(query, context)).rejects.toThrow('inspection limit'); + }); + + it('rejects malformed base64 instead of silently discarding invalid characters', async () => { + const { repository, getContent } = setup(); + const invalid = content(source); + invalid.data.content += '!'; + getContent.mockResolvedValue(invalid); + await expect(repository.isCoordinated(query, context)).rejects.toThrow('encoding is invalid'); + }); + + it.each(['jobs: [', 'jobs: !!js/function function() {}'])('rejects invalid YAML or executable tags', async text => { + const { repository, getContent } = setup(); + getContent.mockResolvedValue(content(text)); + await expect(repository.isCoordinated(query, context)).rejects.toThrow(); + }); + + it('retries a transient proof read using the existing bounded retry policy', async () => { + const { repository, getContent, delayPort } = setup(); + getContent.mockRejectedValueOnce({ status: 500 }); + await expect(repository.isCoordinated(query, context)).resolves.toBe(true); + expect(getContent).toHaveBeenCalledTimes(2); + expect(delayPort.wait).toHaveBeenCalledTimes(1); + }); + + it('does not turn a permanent proof-read failure into permission to proceed', async () => { + const { repository, getContent, delayPort } = setup(); + getContent.mockRejectedValue({ status: 403 }); + await expect(repository.isCoordinated(query, context)).rejects.toEqual({ status: 403 }); + expect(delayPort.wait).not.toHaveBeenCalled(); + }); +}); diff --git a/src/data/repository/workflow/native_workflow_coordination_repository.ts b/src/data/repository/workflow/native_workflow_coordination_repository.ts new file mode 100644 index 000000000..e3085aa25 --- /dev/null +++ b/src/data/repository/workflow/native_workflow_coordination_repository.ts @@ -0,0 +1,48 @@ +import { JSON_SCHEMA, load } from 'js-yaml'; +import type { + NativeWorkflowCoordinationQueryPort, + PreviousWorkflowRunsQuery, + WorkflowQueueRequestContext, +} from '../../../application/ports/workflow_run_ports'; +import { + expectedNativeWorkflowGroup, + hasNativeWorkflowCoordination, +} from '../../../application/policies/native_workflow_coordination_policy'; +import type { GithubWorkflowDefinitionClient } from '../../../infrastructure/github/ports/github_workflow_provider_ports'; +import { withWorkflowRunsRetry, WORKFLOW_RUNS_RETRY_POLICY, type WorkflowRunsRetryPolicy } from './workflow_runs_retry'; + +const MAX_WORKFLOW_BYTES = 256 * 1024; +type RetryDependencies = Parameters[1]; + +/** Reads the workflow GitHub executed, never the possibly modified checkout. */ +export class NativeWorkflowCoordinationRepository implements NativeWorkflowCoordinationQueryPort { + constructor( + private readonly client: GithubWorkflowDefinitionClient, + private readonly retry: Omit & { policy?: WorkflowRunsRetryPolicy }, + ) {} + + async isCoordinated(query: PreviousWorkflowRunsQuery, context: WorkflowQueueRequestContext): Promise { + const group = expectedNativeWorkflowGroup(query); + const native = query.nativeCoordination; + if (!group || !native) return false; + + const response = await withWorkflowRunsRetry(() => this.client.rest.repos.getContent({ + owner: query.owner, + repo: query.repository, + path: `.github/workflows/${query.workflowIdentifier}`, + ref: native.workflowRevision, + }), { ...this.retry, policy: this.retry.policy ?? WORKFLOW_RUNS_RETRY_POLICY, + deadlineAtMilliseconds: context.deadlineAtMilliseconds }); + const file = response.data as { type?: string; encoding?: string; content?: string } | null; + if (!file || Array.isArray(file) || file.type !== 'file' || file.encoding !== 'base64' + || typeof file.content !== 'string' || file.content.length > MAX_WORKFLOW_BYTES * 2) { + throw new Error('Executing workflow content is unavailable.'); + } + const encoded = file.content.replace(/\s/gu, ''); + const bytes = Buffer.from(encoded, 'base64'); + if (bytes.toString('base64') !== encoded) throw new Error('Executing workflow encoding is invalid.'); + if (bytes.length > MAX_WORKFLOW_BYTES) throw new Error('Executing workflow exceeds the inspection limit.'); + const workflow: unknown = load(bytes.toString('utf8'), { schema: JSON_SCHEMA }); + return hasNativeWorkflowCoordination(workflow, native.jobId, group); + } +} diff --git a/src/infrastructure/composition/workflow_queue_composition_root.ts b/src/infrastructure/composition/workflow_queue_composition_root.ts index f1f1ad9d5..2baada013 100644 --- a/src/infrastructure/composition/workflow_queue_composition_root.ts +++ b/src/infrastructure/composition/workflow_queue_composition_root.ts @@ -4,23 +4,33 @@ import { TimerWorkflowPollingDelayAdapter } from '../time/timer_workflow_polling import { LoggerWorkflowPollingObserverAdapter } from '../logging/logger_workflow_polling_observer_adapter'; import { SystemWorkflowQueueClockAdapter } from '../time/system_workflow_queue_clock_adapter'; import { SystemWorkflowPollingRandomAdapter } from '../time/system_workflow_polling_random_adapter'; -import { createWorkflowRunsClient } from './github_workflow_client_factory'; +import { NativeWorkflowCoordinationRepository } from '../../data/repository/workflow/native_workflow_coordination_repository'; +import { getOctokitClient } from '../github/octokit_client_resolver'; +import type { GithubWorkflowDefinitionClient, GithubWorkflowRunsClient } from '../github/ports/github_workflow_provider_ports'; export function createWaitForPreviousWorkflowRunsUseCase(token: string): WaitForPreviousWorkflowRunsUseCase { - const client = createWorkflowRunsClient().getClient(token); + const client = getOctokitClient(token); const delayPort = new TimerWorkflowPollingDelayAdapter(); const observerPort = new LoggerWorkflowPollingObserverAdapter(); + const clock = new SystemWorkflowQueueClockAdapter(); + const random = new SystemWorkflowPollingRandomAdapter(); return new WaitForPreviousWorkflowRunsUseCase( new ActivePreviousWorkflowRunsRepository( client, delayPort, undefined, - new SystemWorkflowQueueClockAdapter(), - new SystemWorkflowPollingRandomAdapter(), + clock, + random, observerPort, ), delayPort, observerPort, + undefined, + clock, + random, + new NativeWorkflowCoordinationRepository(client, { + delayPort, clock, random, observer: observerPort, + }), ); } diff --git a/src/infrastructure/github/ports/github_workflow_provider_ports.ts b/src/infrastructure/github/ports/github_workflow_provider_ports.ts index 58183b549..d70689c67 100644 --- a/src/infrastructure/github/ports/github_workflow_provider_ports.ts +++ b/src/infrastructure/github/ports/github_workflow_provider_ports.ts @@ -6,6 +6,14 @@ export interface GithubWorkflowRunsParameters { status?: string; } +export interface GithubWorkflowDefinitionClient { + rest: { + repos: { + getContent(parameters: { owner: string; repo: string; path: string; ref: string }): Promise<{ data: unknown }>; + }; + }; +} + export interface GithubWorkflowRunsResponse { data: { workflow_runs: GithubWorkflowRun[] } | GithubWorkflowRun[]; } diff --git a/src/infrastructure/logging/__tests__/logger_workflow_polling_observer_adapter.test.ts b/src/infrastructure/logging/__tests__/logger_workflow_polling_observer_adapter.test.ts index f87737c2a..e7d7a6ecc 100644 --- a/src/infrastructure/logging/__tests__/logger_workflow_polling_observer_adapter.test.ts +++ b/src/infrastructure/logging/__tests__/logger_workflow_polling_observer_adapter.test.ts @@ -13,9 +13,11 @@ describe('LoggerWorkflowPollingObserverAdapter', () => { const observer = new LoggerWorkflowPollingObserverAdapter(); observer.noActivePreviousRuns(); + observer.nativeCoordinationVerified(); observer.waitingForPreviousRuns(2, 2000); expect(logDebugInfo).toHaveBeenNthCalledWith(1, '✅ No previous runs active. Continuing...'); + expect(logInfo).toHaveBeenCalledWith('Native workflow resource/lane coordination verified; continuing before setup.'); expect(logInfo).toHaveBeenCalledWith( '⏳ Found 2 previous run(s) still active. Waiting 2s...', ); diff --git a/src/infrastructure/logging/logger_workflow_polling_observer_adapter.ts b/src/infrastructure/logging/logger_workflow_polling_observer_adapter.ts index f3f31ff0a..2a028aee8 100644 --- a/src/infrastructure/logging/logger_workflow_polling_observer_adapter.ts +++ b/src/infrastructure/logging/logger_workflow_polling_observer_adapter.ts @@ -2,6 +2,10 @@ import type { WorkflowPollingObserverPort } from '../../application/ports/workfl import { logDebugInfo, logInfo } from '../../utils/logger'; export class LoggerWorkflowPollingObserverAdapter implements WorkflowPollingObserverPort { + nativeCoordinationVerified(): void { + logInfo('Native workflow resource/lane coordination verified; continuing before setup.'); + } + noActivePreviousRuns(): void { logDebugInfo('✅ No previous runs active. Continuing...'); } From 7bc15649503fff9d3ec59128bd071cae430bb280 Mon Sep 17 00:00:00 2001 From: Efra Espada Date: Sun, 25 Oct 2026 05:11:16 +0100 Subject: [PATCH 2/3] bugfix-692-runtime-predecessor-queue-can-deadlock-per-pr-workflows-on-shared-runners: rebuild runtime bundles with locked dependencies --- build/cli/index.js | 1230 ++++++++++++++++++++-------------- build/github_action/index.js | 1230 ++++++++++++++++++++-------------- 2 files changed, 1466 insertions(+), 994 deletions(-) diff --git a/build/cli/index.js b/build/cli/index.js index 51fd20e99..e54e4976e 100755 --- a/build/cli/index.js +++ b/build/cli/index.js @@ -2140,7 +2140,7 @@ exports.getProxyAgentDispatcher = getProxyAgentDispatcher; exports.getProxyFetch = getProxyFetch; exports.getApiBaseUrl = getApiBaseUrl; const httpClient = __importStar(__nccwpck_require__(75784)); -const undici_1 = __nccwpck_require__(18381); +const undici_1 = __nccwpck_require__(31241); function getAuthString(token, options) { if (!token && !options.auth) { throw new Error('Parameter token or opts.auth is required'); @@ -2392,7 +2392,7 @@ const http = __importStar(__nccwpck_require__(13685)); const https = __importStar(__nccwpck_require__(95687)); const pm = __importStar(__nccwpck_require__(34583)); const tunnel = __importStar(__nccwpck_require__(64249)); -const undici_1 = __nccwpck_require__(18381); +const undici_1 = __nccwpck_require__(31241); var HttpCodes; (function (HttpCodes) { HttpCodes[HttpCodes["OK"] = 200] = "OK"; @@ -8504,34 +8504,34 @@ exports.debug = debug; // for test /***/ }), -/***/ 18381: +/***/ 31241: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const Client = __nccwpck_require__(85849) -const Dispatcher = __nccwpck_require__(66071) -const Pool = __nccwpck_require__(80229) -const BalancedPool = __nccwpck_require__(68255) -const Agent = __nccwpck_require__(73274) -const ProxyAgent = __nccwpck_require__(87187) -const EnvHttpProxyAgent = __nccwpck_require__(29941) -const RetryAgent = __nccwpck_require__(55184) -const errors = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) +const Client = __nccwpck_require__(6237) +const Dispatcher = __nccwpck_require__(32171) +const Pool = __nccwpck_require__(49771) +const BalancedPool = __nccwpck_require__(88214) +const Agent = __nccwpck_require__(1880) +const ProxyAgent = __nccwpck_require__(57912) +const EnvHttpProxyAgent = __nccwpck_require__(42547) +const RetryAgent = __nccwpck_require__(42626) +const errors = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) const { InvalidArgumentError } = errors -const api = __nccwpck_require__(20617) -const buildConnector = __nccwpck_require__(41429) -const MockClient = __nccwpck_require__(4227) -const MockAgent = __nccwpck_require__(46432) -const MockPool = __nccwpck_require__(36575) -const mockErrors = __nccwpck_require__(19329) -const RetryHandler = __nccwpck_require__(64524) -const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(19405) -const DecoratorHandler = __nccwpck_require__(41738) -const RedirectHandler = __nccwpck_require__(64014) -const createRedirectInterceptor = __nccwpck_require__(40928) +const api = __nccwpck_require__(39663) +const buildConnector = __nccwpck_require__(63447) +const MockClient = __nccwpck_require__(69636) +const MockAgent = __nccwpck_require__(89937) +const MockPool = __nccwpck_require__(40660) +const mockErrors = __nccwpck_require__(33519) +const RetryHandler = __nccwpck_require__(12671) +const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(53139) +const DecoratorHandler = __nccwpck_require__(59280) +const RedirectHandler = __nccwpck_require__(90008) +const createRedirectInterceptor = __nccwpck_require__(91467) Object.assign(Dispatcher.prototype, api) @@ -8549,10 +8549,10 @@ module.exports.DecoratorHandler = DecoratorHandler module.exports.RedirectHandler = RedirectHandler module.exports.createRedirectInterceptor = createRedirectInterceptor module.exports.interceptors = { - redirect: __nccwpck_require__(74872), - retry: __nccwpck_require__(79637), - dump: __nccwpck_require__(12493), - dns: __nccwpck_require__(20346) + redirect: __nccwpck_require__(42182), + retry: __nccwpck_require__(17389), + dump: __nccwpck_require__(9408), + dns: __nccwpck_require__(26290) } module.exports.buildConnector = buildConnector @@ -8614,7 +8614,7 @@ function makeDispatcher (fn) { module.exports.setGlobalDispatcher = setGlobalDispatcher module.exports.getGlobalDispatcher = getGlobalDispatcher -const fetchImpl = (__nccwpck_require__(78329).fetch) +const fetchImpl = (__nccwpck_require__(87321).fetch) module.exports.fetch = async function fetch (init, options = undefined) { try { return await fetchImpl(init, options) @@ -8626,39 +8626,39 @@ module.exports.fetch = async function fetch (init, options = undefined) { throw err } } -module.exports.Headers = __nccwpck_require__(10561).Headers -module.exports.Response = __nccwpck_require__(51132).Response -module.exports.Request = __nccwpck_require__(83211).Request -module.exports.FormData = __nccwpck_require__(62598).FormData +module.exports.Headers = __nccwpck_require__(33924).Headers +module.exports.Response = __nccwpck_require__(63042).Response +module.exports.Request = __nccwpck_require__(11192).Request +module.exports.FormData = __nccwpck_require__(59550).FormData module.exports.File = globalThis.File ?? (__nccwpck_require__(72254).File) -module.exports.FileReader = __nccwpck_require__(65153).FileReader +module.exports.FileReader = __nccwpck_require__(62596).FileReader -const { setGlobalOrigin, getGlobalOrigin } = __nccwpck_require__(13924) +const { setGlobalOrigin, getGlobalOrigin } = __nccwpck_require__(22407) module.exports.setGlobalOrigin = setGlobalOrigin module.exports.getGlobalOrigin = getGlobalOrigin -const { CacheStorage } = __nccwpck_require__(11069) -const { kConstruct } = __nccwpck_require__(50591) +const { CacheStorage } = __nccwpck_require__(13256) +const { kConstruct } = __nccwpck_require__(275) // Cache & CacheStorage are tightly coupled with fetch. Even if it may run // in an older version of Node, it doesn't have any use without fetch. module.exports.caches = new CacheStorage(kConstruct) -const { deleteCookie, getCookies, getSetCookies, setCookie } = __nccwpck_require__(15855) +const { deleteCookie, getCookies, getSetCookies, setCookie } = __nccwpck_require__(84245) module.exports.deleteCookie = deleteCookie module.exports.getCookies = getCookies module.exports.getSetCookies = getSetCookies module.exports.setCookie = setCookie -const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(96730) +const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(68889) module.exports.parseMIMEType = parseMIMEType module.exports.serializeAMimeType = serializeAMimeType -const { CloseEvent, ErrorEvent, MessageEvent } = __nccwpck_require__(69459) -module.exports.WebSocket = __nccwpck_require__(16416).WebSocket +const { CloseEvent, ErrorEvent, MessageEvent } = __nccwpck_require__(85021) +module.exports.WebSocket = __nccwpck_require__(43590).WebSocket module.exports.CloseEvent = CloseEvent module.exports.ErrorEvent = ErrorEvent module.exports.MessageEvent = MessageEvent @@ -8674,18 +8674,18 @@ module.exports.MockPool = MockPool module.exports.MockAgent = MockAgent module.exports.mockErrors = mockErrors -const { EventSource } = __nccwpck_require__(6731) +const { EventSource } = __nccwpck_require__(74292) module.exports.EventSource = EventSource /***/ }), -/***/ 97433: +/***/ 44378: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const { addAbortListener } = __nccwpck_require__(50011) -const { RequestAbortedError } = __nccwpck_require__(35990) +const { addAbortListener } = __nccwpck_require__(31014) +const { RequestAbortedError } = __nccwpck_require__(47926) const kListener = Symbol('kListener') const kSignal = Symbol('kSignal') @@ -8745,7 +8745,7 @@ module.exports = { /***/ }), -/***/ 93671: +/***/ 48105: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -8753,9 +8753,9 @@ module.exports = { const assert = __nccwpck_require__(98061) const { AsyncResource } = __nccwpck_require__(92761) -const { InvalidArgumentError, SocketError } = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) -const { addSignal, removeSignal } = __nccwpck_require__(97433) +const { InvalidArgumentError, SocketError } = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) +const { addSignal, removeSignal } = __nccwpck_require__(44378) class ConnectHandler extends AsyncResource { constructor (opts, callback) { @@ -8861,7 +8861,7 @@ module.exports = connect /***/ }), -/***/ 281: +/***/ 25050: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -8876,10 +8876,10 @@ const { InvalidArgumentError, InvalidReturnValueError, RequestAbortedError -} = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) +} = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) const { AsyncResource } = __nccwpck_require__(92761) -const { addSignal, removeSignal } = __nccwpck_require__(97433) +const { addSignal, removeSignal } = __nccwpck_require__(44378) const assert = __nccwpck_require__(98061) const kResume = Symbol('resume') @@ -9120,17 +9120,17 @@ module.exports = pipeline /***/ }), -/***/ 26562: +/***/ 53067: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { Readable } = __nccwpck_require__(93401) -const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) -const { getResolveErrorBodyCallback } = __nccwpck_require__(80710) +const { Readable } = __nccwpck_require__(67646) +const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) +const { getResolveErrorBodyCallback } = __nccwpck_require__(78393) const { AsyncResource } = __nccwpck_require__(92761) class RequestHandler extends AsyncResource { @@ -9342,7 +9342,7 @@ module.exports.RequestHandler = RequestHandler /***/ }), -/***/ 75059: +/***/ 21890: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -9350,11 +9350,11 @@ module.exports.RequestHandler = RequestHandler const assert = __nccwpck_require__(98061) const { finished, PassThrough } = __nccwpck_require__(84492) -const { InvalidArgumentError, InvalidReturnValueError } = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) -const { getResolveErrorBodyCallback } = __nccwpck_require__(80710) +const { InvalidArgumentError, InvalidReturnValueError } = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) +const { getResolveErrorBodyCallback } = __nccwpck_require__(78393) const { AsyncResource } = __nccwpck_require__(92761) -const { addSignal, removeSignal } = __nccwpck_require__(97433) +const { addSignal, removeSignal } = __nccwpck_require__(44378) class StreamHandler extends AsyncResource { constructor (opts, factory, callback) { @@ -9570,16 +9570,16 @@ module.exports = stream /***/ }), -/***/ 23792: +/***/ 94422: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { InvalidArgumentError, SocketError } = __nccwpck_require__(35990) +const { InvalidArgumentError, SocketError } = __nccwpck_require__(47926) const { AsyncResource } = __nccwpck_require__(92761) -const util = __nccwpck_require__(50011) -const { addSignal, removeSignal } = __nccwpck_require__(97433) +const util = __nccwpck_require__(31014) +const { addSignal, removeSignal } = __nccwpck_require__(44378) const assert = __nccwpck_require__(98061) class UpgradeHandler extends AsyncResource { @@ -9686,22 +9686,22 @@ module.exports = upgrade /***/ }), -/***/ 20617: +/***/ 39663: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -module.exports.request = __nccwpck_require__(26562) -module.exports.stream = __nccwpck_require__(75059) -module.exports.pipeline = __nccwpck_require__(281) -module.exports.upgrade = __nccwpck_require__(23792) -module.exports.connect = __nccwpck_require__(93671) +module.exports.request = __nccwpck_require__(53067) +module.exports.stream = __nccwpck_require__(21890) +module.exports.pipeline = __nccwpck_require__(25050) +module.exports.upgrade = __nccwpck_require__(94422) +module.exports.connect = __nccwpck_require__(48105) /***/ }), -/***/ 93401: +/***/ 67646: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -9711,9 +9711,9 @@ module.exports.connect = __nccwpck_require__(93671) const assert = __nccwpck_require__(98061) const { Readable } = __nccwpck_require__(84492) -const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) -const { ReadableStreamFrom } = __nccwpck_require__(50011) +const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) +const { ReadableStreamFrom } = __nccwpck_require__(31014) const kConsume = Symbol('kConsume') const kReading = Symbol('kReading') @@ -10094,15 +10094,15 @@ module.exports = { Readable: BodyReadable, chunksDecode } /***/ }), -/***/ 80710: +/***/ 78393: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { const assert = __nccwpck_require__(98061) const { ResponseStatusCodeError -} = __nccwpck_require__(35990) +} = __nccwpck_require__(47926) -const { chunksDecode } = __nccwpck_require__(93401) +const { chunksDecode } = __nccwpck_require__(67646) const CHUNK_LIMIT = 128 * 1024 async function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) { @@ -10194,7 +10194,7 @@ module.exports = { /***/ }), -/***/ 41429: +/***/ 63447: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -10202,9 +10202,9 @@ module.exports = { const net = __nccwpck_require__(87503) const assert = __nccwpck_require__(98061) -const util = __nccwpck_require__(50011) -const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(35990) -const timers = __nccwpck_require__(77512) +const util = __nccwpck_require__(31014) +const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(47926) +const timers = __nccwpck_require__(63125) function noop () {} @@ -10442,7 +10442,7 @@ module.exports = buildConnector /***/ }), -/***/ 53451: +/***/ 91362: /***/ ((module) => { "use strict"; @@ -10568,7 +10568,7 @@ module.exports = { /***/ }), -/***/ 65543: +/***/ 96005: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -10778,7 +10778,7 @@ module.exports = { /***/ }), -/***/ 35990: +/***/ 47926: /***/ ((module) => { "use strict"; @@ -11211,7 +11211,7 @@ module.exports = { /***/ }), -/***/ 13484: +/***/ 82075: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -11220,7 +11220,7 @@ module.exports = { const { InvalidArgumentError, NotSupportedError -} = __nccwpck_require__(35990) +} = __nccwpck_require__(47926) const assert = __nccwpck_require__(98061) const { isValidHTTPToken, @@ -11235,9 +11235,9 @@ const { validateHandler, getServerName, normalizedMethodRecords -} = __nccwpck_require__(50011) -const { channels } = __nccwpck_require__(65543) -const { headerNameLowerCasedRecord } = __nccwpck_require__(53451) +} = __nccwpck_require__(31014) +const { channels } = __nccwpck_require__(96005) +const { headerNameLowerCasedRecord } = __nccwpck_require__(91362) // Verifies that a given path is valid does not contain control chars \x00 to \x20 const invalidPathRegex = /[^\u0021-\u00ff]/ @@ -11480,11 +11480,77 @@ class Request { } } - onUpgrade (statusCode, headers, socket) { + /** + * @param {number|null} statusCode + * @param {Buffer[]|null} headers + * @param {import('node:stream').Duplex} socket + * @param {string} [statusText] + */ + onUpgrade (statusCode, headers, socket, statusText = '') { + this.onFinally() + assert(!this.aborted) assert(!this.completed) - return this[kHandler].onUpgrade(statusCode, headers, socket) + if (statusCode !== null) { + this.#publishUpgradeHeaders(statusCode, headers, statusText) + } + + const result = this[kHandler].onUpgrade(statusCode, headers, socket) + + if (!this.aborted) { + this.completed = true + if (statusCode !== null) { + this.#publishUpgradeTrailers() + } + } + + return result + } + + /** + * @param {number} statusCode + * @param {import('node:http2').IncomingHttpHeaders} headers + * @param {(headers: import('node:http2').IncomingHttpHeaders) => Buffer[]} parseHeaders + * @param {string} [statusText] + */ + onUpgradeResponse (statusCode, headers, parseHeaders, statusText = '') { + assert(!this.aborted) + assert(this.completed) + + if (channels.headers.hasSubscribers) { + this.#publishUpgradeHeaders(statusCode, parseHeaders(headers), statusText) + } + this.#publishUpgradeTrailers() + } + + /** + * @param {Error} error + */ + onUpgradeError (error) { + assert(!this.aborted) + assert(this.completed) + + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }) + } + } + + /** + * @param {number} statusCode + * @param {Buffer[]} headers + * @param {string} statusText + */ + #publishUpgradeHeaders (statusCode, headers, statusText) { + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) + } + } + + #publishUpgradeTrailers () { + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers: [] }) + } } onComplete (trailers) { @@ -11635,7 +11701,7 @@ module.exports = Request /***/ }), -/***/ 13638: +/***/ 94822: /***/ ((module) => { module.exports = { @@ -11709,7 +11775,7 @@ module.exports = { /***/ }), -/***/ 30723: +/***/ 52731: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -11718,7 +11784,7 @@ module.exports = { const { wellknownHeaderNames, headerNameLowerCasedRecord -} = __nccwpck_require__(53451) +} = __nccwpck_require__(91362) class TstNode { /** @type {any} */ @@ -11869,14 +11935,14 @@ module.exports = { /***/ }), -/***/ 50011: +/***/ 31014: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { kDestroyed, kBodyUsed, kListeners, kBody } = __nccwpck_require__(13638) +const { kDestroyed, kBodyUsed, kListeners, kBody } = __nccwpck_require__(94822) const { IncomingMessage } = __nccwpck_require__(88849) const stream = __nccwpck_require__(84492) const net = __nccwpck_require__(87503) @@ -11884,9 +11950,9 @@ const { Blob } = __nccwpck_require__(72254) const nodeUtil = __nccwpck_require__(47261) const { stringify } = __nccwpck_require__(39630) const { EventEmitter: EE } = __nccwpck_require__(15673) -const { InvalidArgumentError } = __nccwpck_require__(35990) -const { headerNameLowerCasedRecord } = __nccwpck_require__(53451) -const { tree } = __nccwpck_require__(30723) +const { InvalidArgumentError } = __nccwpck_require__(47926) +const { headerNameLowerCasedRecord } = __nccwpck_require__(91362) +const { tree } = __nccwpck_require__(52731) const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) @@ -12596,19 +12662,19 @@ module.exports = { /***/ }), -/***/ 73274: +/***/ 1880: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { InvalidArgumentError } = __nccwpck_require__(35990) -const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(13638) -const DispatcherBase = __nccwpck_require__(39504) -const Pool = __nccwpck_require__(80229) -const Client = __nccwpck_require__(85849) -const util = __nccwpck_require__(50011) -const createRedirectInterceptor = __nccwpck_require__(40928) +const { InvalidArgumentError } = __nccwpck_require__(47926) +const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(94822) +const DispatcherBase = __nccwpck_require__(26844) +const Pool = __nccwpck_require__(49771) +const Client = __nccwpck_require__(6237) +const util = __nccwpck_require__(31014) +const createRedirectInterceptor = __nccwpck_require__(91467) const kOnConnect = Symbol('onConnect') const kOnDisconnect = Symbol('onDisconnect') @@ -12625,7 +12691,7 @@ function defaultFactory (origin, opts) { } class Agent extends DispatcherBase { - constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { + constructor ({ factory = defaultFactory, maxRedirections = 0, connect, tls, ...options } = {}) { if (typeof factory !== 'function') { throw new InvalidArgumentError('factory must be a function.') } @@ -12644,11 +12710,15 @@ class Agent extends DispatcherBase { connect = { ...connect } } + if (tls && typeof tls !== 'function') { + tls = { ...tls } + } + this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })] - this[kOptions] = { ...util.deepClone(options), connect } + this[kOptions] = { ...util.deepClone(options), connect, tls } this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : undefined @@ -12733,7 +12803,7 @@ module.exports = Agent /***/ }), -/***/ 68255: +/***/ 88214: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -12742,7 +12812,7 @@ module.exports = Agent const { BalancedPoolMissingUpstreamError, InvalidArgumentError -} = __nccwpck_require__(35990) +} = __nccwpck_require__(47926) const { PoolBase, kClients, @@ -12750,10 +12820,10 @@ const { kAddClient, kRemoveClient, kGetDispatcher -} = __nccwpck_require__(1467) -const Pool = __nccwpck_require__(80229) -const { kUrl, kInterceptors } = __nccwpck_require__(13638) -const { parseOrigin } = __nccwpck_require__(50011) +} = __nccwpck_require__(97367) +const Pool = __nccwpck_require__(49771) +const { kUrl, kInterceptors } = __nccwpck_require__(94822) +const { parseOrigin } = __nccwpck_require__(31014) const kFactory = Symbol('factory') const kOptions = Symbol('options') @@ -12950,7 +13020,7 @@ module.exports = BalancedPool /***/ }), -/***/ 14429: +/***/ 78365: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -12959,9 +13029,9 @@ module.exports = BalancedPool /* global WebAssembly */ const assert = __nccwpck_require__(98061) -const util = __nccwpck_require__(50011) -const { channels } = __nccwpck_require__(65543) -const timers = __nccwpck_require__(77512) +const util = __nccwpck_require__(31014) +const { channels } = __nccwpck_require__(96005) +const timers = __nccwpck_require__(63125) const { RequestContentLengthMismatchError, ResponseContentLengthMismatchError, @@ -12974,7 +13044,7 @@ const { BodyTimeoutError, HTTPParserError, ResponseExceededMaxSizeError -} = __nccwpck_require__(35990) +} = __nccwpck_require__(47926) const { kUrl, kReset, @@ -13007,9 +13077,9 @@ const { kOnError, kResume, kHTTPContext -} = __nccwpck_require__(13638) +} = __nccwpck_require__(94822) -const constants = __nccwpck_require__(41721) +const constants = __nccwpck_require__(27692) const EMPTY_BUF = Buffer.alloc(0) const FastBuffer = Buffer[Symbol.species] const addListener = util.addListener @@ -13021,11 +13091,11 @@ const kSocketUsed = Symbol('kSocketUsed') let extractBody async function lazyllhttp () { - const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(46081) : undefined + const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(84888) : undefined let mod try { - mod = await WebAssembly.compile(__nccwpck_require__(97877)) + mod = await WebAssembly.compile(__nccwpck_require__(31445)) } catch (e) { /* istanbul ignore next */ @@ -13033,7 +13103,7 @@ async function lazyllhttp () { // being enabled, but the occurring of this other error // * https://github.com/emscripten-core/emscripten/issues/11495 // got me to remove that check to avoid breaking Node 12. - mod = await WebAssembly.compile(llhttpWasmData || __nccwpck_require__(46081)) + mod = await WebAssembly.compile(llhttpWasmData || __nccwpck_require__(84888)) } return await WebAssembly.instantiate(mod, { @@ -13388,7 +13458,7 @@ class Parser { } onUpgrade (head) { - const { upgrade, client, socket, headers, statusCode } = this + const { upgrade, client, socket, headers, statusCode, statusText } = this assert(upgrade) assert(client[kSocket] === socket) @@ -13423,9 +13493,10 @@ class Parser { client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')) try { - request.onUpgrade(statusCode, headers, socket) - } catch (err) { - util.destroy(socket, err) + request.onUpgrade(statusCode, headers, socket, statusText) + } catch (error) { + util.errorRequest(client, request, error) + util.destroy(socket, error) } client[kResume]() @@ -13682,8 +13753,6 @@ async function connectH1 (client, socket) { socket[kParser] = new Parser(client, socket, llhttpInstance) addListener(socket, 'error', function (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - const parser = this[kParser] // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded @@ -13949,7 +14018,7 @@ function writeH1 (client, request) { if (util.isFormDataLike(body)) { if (!extractBody) { - extractBody = (__nccwpck_require__(12749).extractBody) + extractBody = (__nccwpck_require__(48203).extractBody) } const [bodyStream, contentType] = extractBody(body) @@ -14006,12 +14075,22 @@ function writeH1 (client, request) { const socket = client[kSocket] clearIdleSocketValidation(socket) - const abort = (err) => { - if (request.aborted || request.completed) { + /** + * @param {Error} [error] + */ + const abort = (error) => { + if (request.aborted) { + return + } + + if (request.completed) { + if (request.upgrade || request.method === 'CONNECT') { + util.destroy(socket, new InformationalError('aborted')) + } return } - util.errorRequest(client, request, err || new RequestAbortedError()) + util.errorRequest(client, request, error || new RequestAbortedError()) util.destroy(body) util.destroy(socket, new InformationalError('aborted')) @@ -14462,21 +14541,22 @@ module.exports = connectH1 /***/ }), -/***/ 34879: +/***/ 55267: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) +const { errorMonitor } = __nccwpck_require__(15673) const { pipeline } = __nccwpck_require__(84492) -const util = __nccwpck_require__(50011) +const util = __nccwpck_require__(31014) const { RequestContentLengthMismatchError, RequestAbortedError, SocketError, InformationalError -} = __nccwpck_require__(35990) +} = __nccwpck_require__(47926) const { kUrl, kReset, @@ -14495,7 +14575,7 @@ const { kResume, kSize, kHTTPContext -} = __nccwpck_require__(13638) +} = __nccwpck_require__(94822) const kOpenStreams = Symbol('open streams') @@ -14545,6 +14625,15 @@ function parseH2Headers (headers) { return result } +/** + * @param {import('node:http2').IncomingHttpHeaders} headers + * @returns {Buffer[]} + */ +function parseH2ResponseHeaders (headers) { + const { [HTTP2_HEADER_STATUS]: _statusCode, ...realHeaders } = headers + return parseH2Headers(realHeaders) +} + async function connectH2 (client, socket) { client[kSocket] = socket @@ -14594,8 +14683,6 @@ async function connectH2 (client, socket) { socket[kHTTP2Session] = session util.addListener(socket, 'error', function (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - this[kError] = err this[kClient][kOnError](err) @@ -14669,8 +14756,6 @@ function resumeH2 (client) { } function onHttp2SessionError (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - this[kSocket][kError] = err this[kClient][kOnError](err) } @@ -14765,22 +14850,32 @@ function writeH2 (client, request) { headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}` headers[HTTP2_HEADER_METHOD] = method - const abort = (err) => { - if (request.aborted || request.completed) { + /** + * @param {Error} [error] + */ + const abort = (error) => { + if (request.aborted) { + return + } + + if (request.completed) { + if (method === 'CONNECT' && stream != null) { + util.destroy(stream, error || new RequestAbortedError()) + } return } - err = err || new RequestAbortedError() + error = error || new RequestAbortedError() - util.errorRequest(client, request, err) + util.errorRequest(client, request, error) if (stream != null) { - util.destroy(stream, err) + util.destroy(stream, error) } // We do not destroy the socket as we can continue using the session // the stream get's destroyed and the session remains to create new streams - util.destroy(body, err) + util.destroy(body, error) client[kQueue][client[kRunningIdx]++] = null client[kResume]() } @@ -14799,25 +14894,57 @@ function writeH2 (client, request) { if (method === 'CONNECT') { session.ref() - // We are already connected, streams are pending, first request - // will create a new stream. We trigger a request to create the stream and wait until - // `ready` event is triggered // We disabled endStream to allow the user to write to the stream stream = session.request(headers, { endStream: false, signal }) + let upgradeResponseFinished = false - if (stream.id && !stream.pending) { - request.onUpgrade(null, null, stream) - ++session[kOpenStreams] - client[kQueue][client[kRunningIdx]++] = null - } else { - stream.once('ready', () => { + /** + * @param {import('node:http2').IncomingHttpHeaders} headers + */ + const onResponse = (headers) => { + upgradeResponseFinished = true + stream.off(errorMonitor, onUpgradeError) + request.onUpgradeResponse(Number(headers[HTTP2_HEADER_STATUS]), headers, parseH2ResponseHeaders) + } + + /** + * @param {Error} error + */ + const onUpgradeError = (error) => { + upgradeResponseFinished = true + stream.off('response', onResponse) + request.onUpgradeError(error) + } + + const onReady = () => { + try { request.onUpgrade(null, null, stream) - ++session[kOpenStreams] - client[kQueue][client[kRunningIdx]++] = null - }) + } catch (error) { + stream.off('response', onResponse) + abort(error) + return + } + + if (request.aborted) { + return + } + + stream.off('error', abort) + stream.once(errorMonitor, onUpgradeError) + client[kQueue][client[kRunningIdx]++] = null } + stream.once('response', onResponse) + stream.once('error', abort) + ++session[kOpenStreams] + onReady() + stream.once('close', () => { + if (!upgradeResponseFinished && request.completed) { + stream.off('response', onResponse) + stream.off(errorMonitor, onUpgradeError) + request.onUpgradeError(new InformationalError(`HTTP/2: "stream error" received - code ${stream.rstCode}`)) + } session[kOpenStreams] -= 1 if (session[kOpenStreams] === 0) session.unref() }) @@ -14854,7 +14981,7 @@ function writeH2 (client, request) { let contentLength = util.bodyLength(body) if (util.isFormDataLike(body)) { - extractBody ??= (__nccwpck_require__(12749).extractBody) + extractBody ??= (__nccwpck_require__(48203).extractBody) const [bodyStream, contentType] = extractBody(body) headers['content-type'] = contentType @@ -15214,7 +15341,7 @@ module.exports = connectH2 /***/ }), -/***/ 85849: +/***/ 6237: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -15225,16 +15352,16 @@ module.exports = connectH2 const assert = __nccwpck_require__(98061) const net = __nccwpck_require__(87503) const http = __nccwpck_require__(88849) -const util = __nccwpck_require__(50011) -const { channels } = __nccwpck_require__(65543) -const Request = __nccwpck_require__(13484) -const DispatcherBase = __nccwpck_require__(39504) +const util = __nccwpck_require__(31014) +const { channels } = __nccwpck_require__(96005) +const Request = __nccwpck_require__(82075) +const DispatcherBase = __nccwpck_require__(26844) const { InvalidArgumentError, InformationalError, ClientDestroyedError -} = __nccwpck_require__(35990) -const buildConnector = __nccwpck_require__(41429) +} = __nccwpck_require__(47926) +const buildConnector = __nccwpck_require__(63447) const { kUrl, kServerName, @@ -15276,9 +15403,9 @@ const { kHTTPContext, kMaxConcurrentStreams, kResume -} = __nccwpck_require__(13638) -const connectH1 = __nccwpck_require__(14429) -const connectH2 = __nccwpck_require__(34879) +} = __nccwpck_require__(94822) +const connectH1 = __nccwpck_require__(78365) +const connectH2 = __nccwpck_require__(55267) let deprecatedInterceptorWarned = false const kClosedResolve = Symbol('kClosedResolve') @@ -15327,9 +15454,10 @@ class Client extends DispatcherBase { // h2 maxConcurrentStreams, allowH2, - webSocket + webSocket, + eventSource } = {}) { - super({ webSocket }) + super({ webSocket, eventSource }) if (keepAlive !== undefined) { throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') @@ -15585,7 +15713,7 @@ class Client extends DispatcherBase { } } -const createRedirectInterceptor = __nccwpck_require__(40928) +const createRedirectInterceptor = __nccwpck_require__(91467) function onError (client, err) { if ( @@ -15845,24 +15973,26 @@ module.exports = Client /***/ }), -/***/ 39504: +/***/ 26844: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const Dispatcher = __nccwpck_require__(66071) +const buffer = __nccwpck_require__(72254) +const Dispatcher = __nccwpck_require__(32171) const { ClientDestroyedError, ClientClosedError, InvalidArgumentError -} = __nccwpck_require__(35990) -const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = __nccwpck_require__(13638) +} = __nccwpck_require__(47926) +const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = __nccwpck_require__(94822) const kOnDestroyed = Symbol('onDestroyed') const kOnClosed = Symbol('onClosed') const kInterceptedDispatch = Symbol('Intercepted Dispatch') const kWebSocketOptions = Symbol('webSocketOptions') +const kEventSourceOptions = Symbol('eventSourceOptions') class DispatcherBase extends Dispatcher { constructor (opts) { @@ -15873,6 +16003,7 @@ class DispatcherBase extends Dispatcher { this[kClosed] = false this[kOnClosed] = [] this[kWebSocketOptions] = opts?.webSocket ?? {} + this[kEventSourceOptions] = opts?.eventSource ?? {} } get webSocketOptions () { @@ -15882,6 +16013,12 @@ class DispatcherBase extends Dispatcher { } } + get eventSourceOptions () { + return { + maxEventSize: this[kEventSourceOptions].maxEventSize ?? buffer.kStringMaxLength + } + } + get destroyed () { return this[kDestroyed] } @@ -16052,7 +16189,7 @@ module.exports = DispatcherBase /***/ }), -/***/ 66071: +/***/ 32171: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -16125,16 +16262,16 @@ module.exports = Dispatcher /***/ }), -/***/ 29941: +/***/ 42547: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const DispatcherBase = __nccwpck_require__(39504) -const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = __nccwpck_require__(13638) -const ProxyAgent = __nccwpck_require__(87187) -const Agent = __nccwpck_require__(73274) +const DispatcherBase = __nccwpck_require__(26844) +const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = __nccwpck_require__(94822) +const ProxyAgent = __nccwpck_require__(57912) +const Agent = __nccwpck_require__(1880) const DEFAULT_PORTS = { 'http:': 80, @@ -16293,7 +16430,7 @@ module.exports = EnvHttpProxyAgent /***/ }), -/***/ 27092: +/***/ 94856: /***/ ((module) => { "use strict"; @@ -16418,16 +16555,16 @@ module.exports = class FixedQueue { /***/ }), -/***/ 1467: +/***/ 97367: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const DispatcherBase = __nccwpck_require__(39504) -const FixedQueue = __nccwpck_require__(27092) -const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(13638) -const PoolStats = __nccwpck_require__(48309) +const DispatcherBase = __nccwpck_require__(26844) +const FixedQueue = __nccwpck_require__(94856) +const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(94822) +const PoolStats = __nccwpck_require__(61279) const kClients = Symbol('clients') const kNeedDrain = Symbol('needDrain') @@ -16620,10 +16757,10 @@ module.exports = { /***/ }), -/***/ 48309: +/***/ 61279: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(13638) +const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(94822) const kPool = Symbol('pool') class PoolStats { @@ -16661,7 +16798,7 @@ module.exports = PoolStats /***/ }), -/***/ 80229: +/***/ 49771: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -16673,14 +16810,14 @@ const { kNeedDrain, kAddClient, kGetDispatcher -} = __nccwpck_require__(1467) -const Client = __nccwpck_require__(85849) +} = __nccwpck_require__(97367) +const Client = __nccwpck_require__(6237) const { InvalidArgumentError -} = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) -const { kUrl, kInterceptors } = __nccwpck_require__(13638) -const buildConnector = __nccwpck_require__(41429) +} = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) +const { kUrl, kInterceptors } = __nccwpck_require__(94822) +const buildConnector = __nccwpck_require__(63447) const kOptions = Symbol('options') const kConnections = Symbol('connections') @@ -16776,20 +16913,20 @@ module.exports = Pool /***/ }), -/***/ 87187: +/***/ 57912: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(13638) +const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(94822) const { URL } = __nccwpck_require__(41041) -const Agent = __nccwpck_require__(73274) -const Pool = __nccwpck_require__(80229) -const DispatcherBase = __nccwpck_require__(39504) -const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = __nccwpck_require__(35990) -const buildConnector = __nccwpck_require__(41429) -const Client = __nccwpck_require__(85849) +const Agent = __nccwpck_require__(1880) +const Pool = __nccwpck_require__(49771) +const DispatcherBase = __nccwpck_require__(26844) +const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = __nccwpck_require__(47926) +const buildConnector = __nccwpck_require__(63447) +const Client = __nccwpck_require__(6237) const kAgent = Symbol('proxy agent') const kClient = Symbol('proxy client') @@ -17058,14 +17195,14 @@ module.exports = ProxyAgent /***/ }), -/***/ 55184: +/***/ 42626: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const Dispatcher = __nccwpck_require__(66071) -const RetryHandler = __nccwpck_require__(64524) +const Dispatcher = __nccwpck_require__(32171) +const RetryHandler = __nccwpck_require__(12671) class RetryAgent extends Dispatcher { #agent = null @@ -17101,7 +17238,7 @@ module.exports = RetryAgent /***/ }), -/***/ 19405: +/***/ 53139: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -17110,8 +17247,8 @@ module.exports = RetryAgent // We include a version number for the Dispatcher API. In case of breaking changes, // this version number must be increased to avoid conflicts. const globalDispatcher = Symbol.for('undici.globalDispatcher.1') -const { InvalidArgumentError } = __nccwpck_require__(35990) -const Agent = __nccwpck_require__(73274) +const { InvalidArgumentError } = __nccwpck_require__(47926) +const Agent = __nccwpck_require__(1880) if (getGlobalDispatcher() === undefined) { setGlobalDispatcher(new Agent()) @@ -17141,7 +17278,7 @@ module.exports = { /***/ }), -/***/ 41738: +/***/ 59280: /***/ ((module) => { "use strict"; @@ -17193,16 +17330,16 @@ module.exports = class DecoratorHandler { /***/ }), -/***/ 64014: +/***/ 90008: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(50011) -const { kBodyUsed } = __nccwpck_require__(13638) +const util = __nccwpck_require__(31014) +const { kBodyUsed } = __nccwpck_require__(94822) const assert = __nccwpck_require__(98061) -const { InvalidArgumentError } = __nccwpck_require__(35990) +const { InvalidArgumentError } = __nccwpck_require__(47926) const EE = __nccwpck_require__(15673) const redirectableStatusCodes = [300, 301, 302, 303, 307, 308] @@ -17433,21 +17570,21 @@ module.exports = RedirectHandler /***/ }), -/***/ 64524: +/***/ 12671: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { kRetryHandlerDefaultRetry } = __nccwpck_require__(13638) -const { RequestRetryError } = __nccwpck_require__(35990) +const { kRetryHandlerDefaultRetry } = __nccwpck_require__(94822) +const { RequestRetryError } = __nccwpck_require__(47926) const { isDisturbed, parseHeaders, parseRangeHeader, wrapRequestBody -} = __nccwpck_require__(50011) +} = __nccwpck_require__(31014) function calculateRetryAfterHeader (retryAfter) { const current = Date.now() @@ -17644,7 +17781,10 @@ class RetryHandler { this.retryCount += 1 if (statusCode >= 300) { - if (this.retryOpts.statusCodes.includes(statusCode) === false) { + // Only expose a response if no earlier attempt has reached the caller. + // Otherwise abort this attempt so the error settles the existing body + // instead of replacing it with a new response. + if (!this.headersSent && this.retryOpts.statusCodes.includes(statusCode) === false) { this.headersSent = true this.checkpointResponseEnd(headers, resume) return this.handler.onHeaders( @@ -17875,15 +18015,15 @@ module.exports = RetryHandler /***/ }), -/***/ 20346: +/***/ 26290: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { isIP } = __nccwpck_require__(87503) const { lookup } = __nccwpck_require__(30604) -const DecoratorHandler = __nccwpck_require__(41738) -const { InvalidArgumentError, InformationalError } = __nccwpck_require__(35990) +const DecoratorHandler = __nccwpck_require__(59280) +const { InvalidArgumentError, InformationalError } = __nccwpck_require__(47926) const maxInt = Math.pow(2, 31) - 1 class DNSInstance { @@ -18258,15 +18398,15 @@ module.exports = interceptorOpts => { /***/ }), -/***/ 12493: +/***/ 9408: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(50011) -const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(35990) -const DecoratorHandler = __nccwpck_require__(41738) +const util = __nccwpck_require__(31014) +const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(47926) +const DecoratorHandler = __nccwpck_require__(59280) class DumpHandler extends DecoratorHandler { #maxSize = 1024 * 1024 @@ -18389,13 +18529,13 @@ module.exports = createDumpInterceptor /***/ }), -/***/ 40928: +/***/ 91467: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const RedirectHandler = __nccwpck_require__(64014) +const RedirectHandler = __nccwpck_require__(90008) function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { return (dispatch) => { @@ -18418,12 +18558,12 @@ module.exports = createRedirectInterceptor /***/ }), -/***/ 74872: +/***/ 42182: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const RedirectHandler = __nccwpck_require__(64014) +const RedirectHandler = __nccwpck_require__(90008) module.exports = opts => { const globalMaxRedirections = opts?.maxRedirections @@ -18450,12 +18590,12 @@ module.exports = opts => { /***/ }), -/***/ 79637: +/***/ 17389: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const RetryHandler = __nccwpck_require__(64524) +const RetryHandler = __nccwpck_require__(12671) module.exports = globalOpts => { return dispatch => { @@ -18477,14 +18617,14 @@ module.exports = globalOpts => { /***/ }), -/***/ 41721: +/***/ 27692: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; -const utils_1 = __nccwpck_require__(69573); +const utils_1 = __nccwpck_require__(5608); // C headers var ERROR; (function (ERROR) { @@ -18762,7 +18902,7 @@ exports.SPECIAL_HEADERS = { /***/ }), -/***/ 46081: +/***/ 84888: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -18775,7 +18915,7 @@ module.exports = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f3 /***/ }), -/***/ 97877: +/***/ 31445: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -18788,7 +18928,7 @@ module.exports = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f3 /***/ }), -/***/ 69573: +/***/ 5608: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -18810,14 +18950,14 @@ exports.enumToMap = enumToMap; /***/ }), -/***/ 46432: +/***/ 89937: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kClients } = __nccwpck_require__(13638) -const Agent = __nccwpck_require__(73274) +const { kClients } = __nccwpck_require__(94822) +const Agent = __nccwpck_require__(1880) const { kAgent, kMockAgentSet, @@ -18828,14 +18968,14 @@ const { kGetNetConnect, kOptions, kFactory -} = __nccwpck_require__(63822) -const MockClient = __nccwpck_require__(4227) -const MockPool = __nccwpck_require__(36575) -const { matchValue, buildMockOptions } = __nccwpck_require__(38053) -const { InvalidArgumentError, UndiciError } = __nccwpck_require__(35990) -const Dispatcher = __nccwpck_require__(66071) -const Pluralizer = __nccwpck_require__(97472) -const PendingInterceptorsFormatter = __nccwpck_require__(56155) +} = __nccwpck_require__(89083) +const MockClient = __nccwpck_require__(69636) +const MockPool = __nccwpck_require__(40660) +const { matchValue, buildMockOptions } = __nccwpck_require__(16826) +const { InvalidArgumentError, UndiciError } = __nccwpck_require__(47926) +const Dispatcher = __nccwpck_require__(32171) +const Pluralizer = __nccwpck_require__(69437) +const PendingInterceptorsFormatter = __nccwpck_require__(9965) class MockAgent extends Dispatcher { constructor (opts) { @@ -18978,15 +19118,15 @@ module.exports = MockAgent /***/ }), -/***/ 4227: +/***/ 69636: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { promisify } = __nccwpck_require__(47261) -const Client = __nccwpck_require__(85849) -const { buildMockDispatch } = __nccwpck_require__(38053) +const Client = __nccwpck_require__(6237) +const { buildMockDispatch } = __nccwpck_require__(16826) const { kDispatches, kMockAgent, @@ -18995,10 +19135,10 @@ const { kOrigin, kOriginalDispatch, kConnected -} = __nccwpck_require__(63822) -const { MockInterceptor } = __nccwpck_require__(9238) -const Symbols = __nccwpck_require__(13638) -const { InvalidArgumentError } = __nccwpck_require__(35990) +} = __nccwpck_require__(89083) +const { MockInterceptor } = __nccwpck_require__(73387) +const Symbols = __nccwpck_require__(94822) +const { InvalidArgumentError } = __nccwpck_require__(47926) /** * MockClient provides an API that extends the Client to influence the mockDispatches. @@ -19045,13 +19185,13 @@ module.exports = MockClient /***/ }), -/***/ 19329: +/***/ 33519: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { UndiciError } = __nccwpck_require__(35990) +const { UndiciError } = __nccwpck_require__(47926) const kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED') @@ -19081,13 +19221,13 @@ module.exports = { /***/ }), -/***/ 9238: +/***/ 73387: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(38053) +const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(16826) const { kDispatches, kDispatchKey, @@ -19095,9 +19235,9 @@ const { kDefaultTrailers, kContentLength, kMockDispatch -} = __nccwpck_require__(63822) -const { InvalidArgumentError } = __nccwpck_require__(35990) -const { buildURL } = __nccwpck_require__(50011) +} = __nccwpck_require__(89083) +const { InvalidArgumentError } = __nccwpck_require__(47926) +const { buildURL } = __nccwpck_require__(31014) /** * Defines the scope API for an interceptor reply @@ -19296,15 +19436,15 @@ module.exports.MockScope = MockScope /***/ }), -/***/ 36575: +/***/ 40660: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { promisify } = __nccwpck_require__(47261) -const Pool = __nccwpck_require__(80229) -const { buildMockDispatch } = __nccwpck_require__(38053) +const Pool = __nccwpck_require__(49771) +const { buildMockDispatch } = __nccwpck_require__(16826) const { kDispatches, kMockAgent, @@ -19313,10 +19453,10 @@ const { kOrigin, kOriginalDispatch, kConnected -} = __nccwpck_require__(63822) -const { MockInterceptor } = __nccwpck_require__(9238) -const Symbols = __nccwpck_require__(13638) -const { InvalidArgumentError } = __nccwpck_require__(35990) +} = __nccwpck_require__(89083) +const { MockInterceptor } = __nccwpck_require__(73387) +const Symbols = __nccwpck_require__(94822) +const { InvalidArgumentError } = __nccwpck_require__(47926) /** * MockPool provides an API that extends the Pool to influence the mockDispatches. @@ -19363,7 +19503,7 @@ module.exports = MockPool /***/ }), -/***/ 63822: +/***/ 89083: /***/ ((module) => { "use strict"; @@ -19394,21 +19534,21 @@ module.exports = { /***/ }), -/***/ 38053: +/***/ 16826: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { MockNotMatchedError } = __nccwpck_require__(19329) +const { MockNotMatchedError } = __nccwpck_require__(33519) const { kDispatches, kMockAgent, kOriginalDispatch, kOrigin, kGetNetConnect -} = __nccwpck_require__(63822) -const { buildURL } = __nccwpck_require__(50011) +} = __nccwpck_require__(89083) +const { buildURL } = __nccwpck_require__(31014) const { STATUS_CODES } = __nccwpck_require__(88849) const { types: { @@ -19769,7 +19909,7 @@ module.exports = { /***/ }), -/***/ 56155: +/***/ 9965: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -19820,7 +19960,7 @@ module.exports = class PendingInterceptorsFormatter { /***/ }), -/***/ 97472: +/***/ 69437: /***/ ((module) => { "use strict"; @@ -19857,7 +19997,7 @@ module.exports = class Pluralizer { /***/ }), -/***/ 77512: +/***/ 63125: /***/ ((module) => { "use strict"; @@ -20288,21 +20428,21 @@ module.exports = { /***/ }), -/***/ 12714: +/***/ 37917: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kConstruct } = __nccwpck_require__(50591) -const { urlEquals, getFieldValues } = __nccwpck_require__(99205) -const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(50011) -const { webidl } = __nccwpck_require__(2227) -const { Response, cloneResponse, fromInnerResponse } = __nccwpck_require__(51132) -const { Request, fromInnerRequest } = __nccwpck_require__(83211) -const { kState } = __nccwpck_require__(14935) -const { fetching } = __nccwpck_require__(78329) -const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(98730) +const { kConstruct } = __nccwpck_require__(275) +const { urlEquals, getFieldValues } = __nccwpck_require__(40424) +const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(31014) +const { webidl } = __nccwpck_require__(96163) +const { Response, cloneResponse, fromInnerResponse } = __nccwpck_require__(63042) +const { Request, fromInnerRequest } = __nccwpck_require__(11192) +const { kState } = __nccwpck_require__(23200) +const { fetching } = __nccwpck_require__(87321) +const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(40667) const assert = __nccwpck_require__(98061) /** @@ -21155,16 +21295,16 @@ module.exports = { /***/ }), -/***/ 11069: +/***/ 13256: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kConstruct } = __nccwpck_require__(50591) -const { Cache } = __nccwpck_require__(12714) -const { webidl } = __nccwpck_require__(2227) -const { kEnumerableProperty } = __nccwpck_require__(50011) +const { kConstruct } = __nccwpck_require__(275) +const { Cache } = __nccwpck_require__(37917) +const { webidl } = __nccwpck_require__(96163) +const { kEnumerableProperty } = __nccwpck_require__(31014) class CacheStorage { /** @@ -21315,28 +21455,28 @@ module.exports = { /***/ }), -/***/ 50591: +/***/ 275: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; module.exports = { - kConstruct: (__nccwpck_require__(13638).kConstruct) + kConstruct: (__nccwpck_require__(94822).kConstruct) } /***/ }), -/***/ 99205: +/***/ 40424: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { URLSerializer } = __nccwpck_require__(96730) -const { isValidHeaderName } = __nccwpck_require__(98730) +const { URLSerializer } = __nccwpck_require__(68889) +const { isValidHeaderName } = __nccwpck_require__(40667) /** * @see https://url.spec.whatwg.org/#concept-url-equals @@ -21381,7 +21521,7 @@ module.exports = { /***/ }), -/***/ 16155: +/***/ 40503: /***/ ((module) => { "use strict"; @@ -21401,16 +21541,16 @@ module.exports = { /***/ }), -/***/ 15855: +/***/ 84245: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { parseSetCookie } = __nccwpck_require__(80742) -const { stringify } = __nccwpck_require__(93989) -const { webidl } = __nccwpck_require__(2227) -const { Headers } = __nccwpck_require__(10561) +const { parseSetCookie } = __nccwpck_require__(89386) +const { stringify } = __nccwpck_require__(74600) +const { webidl } = __nccwpck_require__(96163) +const { Headers } = __nccwpck_require__(33924) /** * @typedef {Object} Cookie @@ -21593,15 +21733,15 @@ module.exports = { /***/ }), -/***/ 80742: +/***/ 89386: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(16155) -const { isCTLExcludingHtab } = __nccwpck_require__(93989) -const { collectASequenceOfCodePointsFast } = __nccwpck_require__(96730) +const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(40503) +const { isCTLExcludingHtab } = __nccwpck_require__(74600) +const { collectASequenceOfCodePointsFast } = __nccwpck_require__(68889) const assert = __nccwpck_require__(98061) /** @@ -21911,7 +22051,7 @@ module.exports = { /***/ }), -/***/ 93989: +/***/ 74600: /***/ ((module) => { "use strict"; @@ -22271,13 +22411,14 @@ module.exports = { /***/ }), -/***/ 41408: +/***/ 71054: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; +const buffer = __nccwpck_require__(72254) const { Transform } = __nccwpck_require__(84492) -const { isASCIINumber, isValidLastEventId } = __nccwpck_require__(19079) +const { isASCIINumber, isValidLastEventId } = __nccwpck_require__(97409) /** * @type {number[]} BOM @@ -22300,11 +22441,19 @@ const COLON = 0x3A */ const SPACE = 0x20 +const defaultMaxEventSize = buffer.kStringMaxLength + const DATA = Buffer.from('data') const EVENT = Buffer.from('event') const ID = Buffer.from('id') const RETRY = Buffer.from('retry') +// Each data field creates a string node, and each unconsumed input chunk keeps +// a Buffer wrapper. The absolute ceiling protects the large default byte limit. +const minParserItems = 1024 +const maxParserItems = 131072 +const bytesPerParserItem = 128 + function isASCIINumberBytes (buffer, start) { if (start >= buffer.length) { return false @@ -22343,6 +22492,12 @@ function isFieldName (line, length, field) { return true } +function createMaxEventSizeExceededError () { + const error = new Error('EventSource message size exceeded') + error.aborted = false + return error +} + /** * @typedef {object} EventSourceStreamEvent * @type {object} @@ -22391,6 +22546,13 @@ class EventSourceStream extends Transform { pos = 0 lineChunkIndex = 0 linePos = 0 + lineLength = 0 + eventSize = 0 + eventFieldSizes = { data: 0, event: 0, id: 0, retry: 0 } + dataLineCount = 0 + maxEventSize + maxDataLines + maxBufferedChunks event = { data: undefined, @@ -22401,6 +22563,7 @@ class EventSourceStream extends Transform { /** * @param {object} options + * @param {number} [options.maxEventSize] * @param {eventSourceSettings} options.eventSourceSettings * @param {Function} [options.push] */ @@ -22412,6 +22575,12 @@ class EventSourceStream extends Transform { super(options) this.state = options.eventSourceSettings || {} + this.maxEventSize = options.maxEventSize ?? defaultMaxEventSize + const parserItemLimit = this.maxEventSize > 0 + ? Math.min(maxParserItems, Math.max(minParserItems, Math.floor(this.maxEventSize / bytesPerParserItem))) + : 0 + this.maxDataLines = parserItemLimit + this.maxBufferedChunks = parserItemLimit if (options.push) { this.push = options.push } @@ -22429,6 +22598,14 @@ class EventSourceStream extends Transform { return } + // A leading line ending can immediately release the currently buffered + // line, even when it uses the final allowed chunk slot. + if (this.maxEventSize > 0 && + this.chunks.length >= this.maxBufferedChunks && + chunk[0] !== LF && chunk[0] !== CR) { + callback(createMaxEventSizeExceededError()) + return + } this.chunks.push(chunk) // Strip leading byte-order-mark if we opened the stream and started @@ -22507,7 +22684,12 @@ class EventSourceStream extends Transform { // In any case, we can process the line as we reached an // end-of-line character - this.parseLine(this.readLine(), this.event) + try { + this.parseLine(this.readLine(), this.event) + } catch (error) { + callback(error) + return + } this.consumeCurrentByte() // A line was processed and this could be the end of the event. We need // to check if the next line is empty to determine if the event is @@ -22516,15 +22698,28 @@ class EventSourceStream extends Transform { continue } + // readLine() is only called after CR or LF. Reject an unfinished line + // before it can retain an unbounded number of decoded chunks. The seven + // extra bytes allow the longest field prefix ("event: " or "retry: "). + if (this.maxEventSize > 0 && ++this.lineLength > this.maxEventSize + 7) { + callback(createMaxEventSizeExceededError()) + return + } this.advanceCursor() } callback() } + _destroy (error, callback) { + this.chunks.length = 0 + this.clearEvent() + super._destroy(error, callback) + } + /** * @param {Buffer} line - * @param {EventStreamEvent} event + * @param {EventSourceStreamEvent} event */ parseLine (line, event) { // If the line is empty (a blank line) @@ -22558,6 +22753,13 @@ class EventSourceStream extends Transform { } if (isFieldName(line, fieldLength, DATA)) { + if (this.maxEventSize > 0 && this.dataLineCount >= this.maxDataLines) { + throw createMaxEventSizeExceededError() + } + const valueBytes = line.length - valueStart + const dataSize = this.eventFieldSizes.data + (event.data === undefined ? 0 : 1) + valueBytes + this.setEventFieldSize('data', dataSize) + const value = line.toString('utf8', valueStart) if (event.data === undefined) { @@ -22565,11 +22767,13 @@ class EventSourceStream extends Transform { } else { event.data += `\n${value}` } + this.dataLineCount++ return } if (isFieldName(line, fieldLength, RETRY)) { if (isASCIINumberBytes(line, valueStart)) { + this.setEventFieldSize('retry', line.length - valueStart) event.retry = line.toString('utf8', valueStart) } return @@ -22577,20 +22781,29 @@ class EventSourceStream extends Transform { if (isFieldName(line, fieldLength, ID)) { if (isValidLastEventIdBytes(line, valueStart)) { + this.setEventFieldSize('id', line.length - valueStart) event.id = line.toString('utf8', valueStart) } return } if (isFieldName(line, fieldLength, EVENT)) { - const value = line.toString('utf8', valueStart) - - if (value.length > 0) { - event.event = value + if (valueStart < line.length) { + this.setEventFieldSize('event', line.length - valueStart) + event.event = line.toString('utf8', valueStart) } } } + setEventFieldSize (field, size) { + const eventSize = this.eventSize - this.eventFieldSizes[field] + size + if (this.maxEventSize > 0 && eventSize > this.maxEventSize) { + throw createMaxEventSizeExceededError() + } + this.eventSize = eventSize + this.eventFieldSizes[field] = size + } + /** * @param {EventSourceStreamEvent} event */ @@ -22621,6 +22834,12 @@ class EventSourceStream extends Transform { this.event.event = undefined this.event.id = undefined this.event.retry = undefined + this.eventSize = 0 + this.dataLineCount = 0 + this.eventFieldSizes.data = 0 + this.eventFieldSizes.event = 0 + this.eventFieldSizes.id = 0 + this.eventFieldSizes.retry = 0 } hasPendingEvent () { @@ -22656,14 +22875,16 @@ class EventSourceStream extends Transform { syncLineStartToCursor () { this.lineChunkIndex = this.chunkIndex this.linePos = this.pos + this.lineLength = 0 this.dropConsumedChunks() } dropConsumedChunks () { - while (this.lineChunkIndex > 0) { - this.chunks.shift() - this.lineChunkIndex-- - this.chunkIndex-- + if (this.lineChunkIndex > 0) { + const consumed = this.lineChunkIndex + this.chunks.splice(0, consumed) + this.lineChunkIndex = 0 + this.chunkIndex -= consumed } if (this.chunkIndex === this.chunks.length) { @@ -22772,23 +22993,24 @@ module.exports = { /***/ }), -/***/ 6731: +/***/ 74292: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { pipeline } = __nccwpck_require__(84492) -const { fetching } = __nccwpck_require__(78329) -const { makeRequest } = __nccwpck_require__(83211) -const { webidl } = __nccwpck_require__(2227) -const { EventSourceStream } = __nccwpck_require__(41408) -const { parseMIMEType } = __nccwpck_require__(96730) -const { createFastMessageEvent } = __nccwpck_require__(69459) -const { isNetworkError } = __nccwpck_require__(51132) -const { delay } = __nccwpck_require__(19079) -const { kEnumerableProperty } = __nccwpck_require__(50011) -const { environmentSettingsObject } = __nccwpck_require__(98730) +const { fetching } = __nccwpck_require__(87321) +const { makeRequest } = __nccwpck_require__(11192) +const { webidl } = __nccwpck_require__(96163) +const { EventSourceStream } = __nccwpck_require__(71054) +const { parseMIMEType } = __nccwpck_require__(68889) +const { createFastMessageEvent } = __nccwpck_require__(85021) +const { isNetworkError } = __nccwpck_require__(63042) +const { delay } = __nccwpck_require__(97409) +const { kEnumerableProperty } = __nccwpck_require__(31014) +const { environmentSettingsObject } = __nccwpck_require__(40667) +const { getGlobalDispatcher } = __nccwpck_require__(53139) let experimentalWarned = false @@ -23070,6 +23292,7 @@ class EventSource extends EventTarget { const eventSourceStream = new EventSourceStream({ eventSourceSettings: this.#state, + maxEventSize: this.#dispatcher.eventSourceOptions?.maxEventSize, push: (event) => { this.dispatchEvent(createFastMessageEvent( event.type, @@ -23248,7 +23471,8 @@ webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([ }, { key: 'dispatcher', // undici only - converter: webidl.converters.any + converter: webidl.converters.any, + defaultValue: () => getGlobalDispatcher() } ]) @@ -23260,7 +23484,7 @@ module.exports = { /***/ }), -/***/ 19079: +/***/ 97409: /***/ ((module) => { "use strict"; @@ -23305,13 +23529,13 @@ module.exports = { /***/ }), -/***/ 12749: +/***/ 48203: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(50011) +const util = __nccwpck_require__(31014) const { ReadableStreamFrom, isBlobLike, @@ -23321,16 +23545,16 @@ const { fullyReadBody, extractMimeType, utf8DecodeBytes -} = __nccwpck_require__(98730) -const { FormData } = __nccwpck_require__(62598) -const { kState } = __nccwpck_require__(14935) -const { webidl } = __nccwpck_require__(2227) +} = __nccwpck_require__(40667) +const { FormData } = __nccwpck_require__(59550) +const { kState } = __nccwpck_require__(23200) +const { webidl } = __nccwpck_require__(96163) const { Blob } = __nccwpck_require__(72254) const assert = __nccwpck_require__(98061) const { isErrored, isDisturbed } = __nccwpck_require__(84492) const { isArrayBuffer } = __nccwpck_require__(93746) -const { serializeAMimeType } = __nccwpck_require__(96730) -const { multipartFormDataParser } = __nccwpck_require__(25152) +const { serializeAMimeType } = __nccwpck_require__(68889) +const { multipartFormDataParser } = __nccwpck_require__(95600) let random try { @@ -23842,7 +24066,7 @@ module.exports = { /***/ }), -/***/ 54823: +/***/ 49316: /***/ ((module) => { "use strict"; @@ -23974,7 +24198,7 @@ module.exports = { /***/ }), -/***/ 96730: +/***/ 68889: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -24726,13 +24950,13 @@ module.exports = { /***/ }), -/***/ 61451: +/***/ 65895: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kConnected, kSize } = __nccwpck_require__(13638) +const { kConnected, kSize } = __nccwpck_require__(94822) class CompatWeakRef { constructor (value) { @@ -24780,15 +25004,15 @@ module.exports = function () { /***/ }), -/***/ 60027: +/***/ 5583: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { Blob, File } = __nccwpck_require__(72254) -const { kState } = __nccwpck_require__(14935) -const { webidl } = __nccwpck_require__(2227) +const { kState } = __nccwpck_require__(23200) +const { webidl } = __nccwpck_require__(96163) // TODO(@KhafraDev): remove class FileLike { @@ -24914,17 +25138,17 @@ module.exports = { FileLike, isFileLike } /***/ }), -/***/ 25152: +/***/ 95600: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { isUSVString, bufferToLowerCasedHeaderName } = __nccwpck_require__(50011) -const { utf8DecodeBytes } = __nccwpck_require__(98730) -const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = __nccwpck_require__(96730) -const { isFileLike } = __nccwpck_require__(60027) -const { makeEntry } = __nccwpck_require__(62598) +const { isUSVString, bufferToLowerCasedHeaderName } = __nccwpck_require__(31014) +const { utf8DecodeBytes } = __nccwpck_require__(40667) +const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = __nccwpck_require__(68889) +const { isFileLike } = __nccwpck_require__(5583) +const { makeEntry } = __nccwpck_require__(59550) const assert = __nccwpck_require__(98061) const { File: NodeFile } = __nccwpck_require__(72254) @@ -25396,17 +25620,17 @@ module.exports = { /***/ }), -/***/ 62598: +/***/ 59550: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { isBlobLike, iteratorMixin } = __nccwpck_require__(98730) -const { kState } = __nccwpck_require__(14935) -const { kEnumerableProperty } = __nccwpck_require__(50011) -const { FileLike, isFileLike } = __nccwpck_require__(60027) -const { webidl } = __nccwpck_require__(2227) +const { isBlobLike, iteratorMixin } = __nccwpck_require__(40667) +const { kState } = __nccwpck_require__(23200) +const { kEnumerableProperty } = __nccwpck_require__(31014) +const { FileLike, isFileLike } = __nccwpck_require__(5583) +const { webidl } = __nccwpck_require__(96163) const { File: NativeFile } = __nccwpck_require__(72254) const nodeUtil = __nccwpck_require__(47261) @@ -25656,7 +25880,7 @@ module.exports = { FormData, makeEntry } /***/ }), -/***/ 13924: +/***/ 22407: /***/ ((module) => { "use strict"; @@ -25704,7 +25928,7 @@ module.exports = { /***/ }), -/***/ 10561: +/***/ 33924: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -25712,14 +25936,14 @@ module.exports = { -const { kConstruct } = __nccwpck_require__(13638) -const { kEnumerableProperty } = __nccwpck_require__(50011) +const { kConstruct } = __nccwpck_require__(94822) +const { kEnumerableProperty } = __nccwpck_require__(31014) const { iteratorMixin, isValidHeaderName, isValidHeaderValue -} = __nccwpck_require__(98730) -const { webidl } = __nccwpck_require__(2227) +} = __nccwpck_require__(40667) +const { webidl } = __nccwpck_require__(96163) const assert = __nccwpck_require__(98061) const util = __nccwpck_require__(47261) @@ -26399,7 +26623,7 @@ module.exports = { /***/ }), -/***/ 78329: +/***/ 87321: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -26413,9 +26637,9 @@ const { filterResponse, makeResponse, fromInnerResponse -} = __nccwpck_require__(51132) -const { HeadersList } = __nccwpck_require__(10561) -const { Request, cloneRequest } = __nccwpck_require__(83211) +} = __nccwpck_require__(63042) +const { HeadersList } = __nccwpck_require__(33924) +const { Request, cloneRequest } = __nccwpck_require__(11192) const zlib = __nccwpck_require__(65628) const { bytesMatch, @@ -26451,23 +26675,23 @@ const { buildContentRange, createInflate, extractMimeType -} = __nccwpck_require__(98730) -const { kState, kDispatcher } = __nccwpck_require__(14935) +} = __nccwpck_require__(40667) +const { kState, kDispatcher } = __nccwpck_require__(23200) const assert = __nccwpck_require__(98061) -const { safelyExtractBody, extractBody } = __nccwpck_require__(12749) +const { safelyExtractBody, extractBody } = __nccwpck_require__(48203) const { redirectStatusSet, nullBodyStatus, safeMethodsSet, requestBodyHeader, subresourceSet -} = __nccwpck_require__(54823) +} = __nccwpck_require__(49316) const EE = __nccwpck_require__(15673) const { Readable, pipeline, finished } = __nccwpck_require__(84492) -const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = __nccwpck_require__(50011) -const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = __nccwpck_require__(96730) -const { getGlobalDispatcher } = __nccwpck_require__(19405) -const { webidl } = __nccwpck_require__(2227) +const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = __nccwpck_require__(31014) +const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = __nccwpck_require__(68889) +const { getGlobalDispatcher } = __nccwpck_require__(53139) +const { webidl } = __nccwpck_require__(96163) const { STATUS_CODES } = __nccwpck_require__(88849) const GET_OR_HEAD = ['GET', 'HEAD'] @@ -28355,8 +28579,10 @@ async function httpNetworkFetch ( // 19. Run these steps in parallel: // 1. Run these steps, but abort when fetchParams is canceled: - fetchParams.controller.onAborted = onAborted - fetchParams.controller.on('terminated', onAborted) + if (!fetchParams.controller.resume) { + fetchParams.controller.on('terminated', onAborted) + } + fetchParams.controller.resume = async () => { // 1. While true while (true) { @@ -28525,8 +28751,6 @@ async function httpNetworkFetch ( } location = headersList.get('location', true) - this.body = new Readable({ read: resume }) - const decoders = [] const willFollow = location && request.redirect === 'follow' && @@ -28544,7 +28768,7 @@ async function httpNetworkFetch ( // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206). const maxContentEncodings = 5 if (codings.length > maxContentEncodings) { - reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)) + this.abort(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)) return true } @@ -28577,6 +28801,8 @@ async function httpNetworkFetch ( } } + this.body = new Readable({ read: resume }) + const onError = this.onError.bind(this) resolve({ @@ -28623,10 +28849,6 @@ async function httpNetworkFetch ( fetchParams.controller.off('terminated', this.abort) } - if (fetchParams.controller.onAborted) { - fetchParams.controller.off('terminated', fetchParams.controller.onAborted) - } - fetchParams.controller.ended = true this.body.push(null) @@ -28679,7 +28901,7 @@ module.exports = { /***/ }), -/***/ 83211: +/***/ 11192: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -28687,16 +28909,16 @@ module.exports = { -const { extractBody, mixinBody, cloneBody, bodyUnusable } = __nccwpck_require__(12749) -const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = __nccwpck_require__(10561) -const { FinalizationRegistry } = __nccwpck_require__(61451)() -const util = __nccwpck_require__(50011) +const { extractBody, mixinBody, cloneBody, bodyUnusable } = __nccwpck_require__(48203) +const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = __nccwpck_require__(33924) +const { FinalizationRegistry } = __nccwpck_require__(65895)() +const util = __nccwpck_require__(31014) const nodeUtil = __nccwpck_require__(47261) const { isValidHTTPToken, sameOrigin, environmentSettingsObject -} = __nccwpck_require__(98730) +} = __nccwpck_require__(40667) const { forbiddenMethodsSet, corsSafeListedMethodsSet, @@ -28706,12 +28928,12 @@ const { requestCredentials, requestCache, requestDuplex -} = __nccwpck_require__(54823) +} = __nccwpck_require__(49316) const { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util -const { kHeaders, kSignal, kState, kDispatcher } = __nccwpck_require__(14935) -const { webidl } = __nccwpck_require__(2227) -const { URLSerializer } = __nccwpck_require__(96730) -const { kConstruct } = __nccwpck_require__(13638) +const { kHeaders, kSignal, kState, kDispatcher } = __nccwpck_require__(23200) +const { webidl } = __nccwpck_require__(96163) +const { URLSerializer } = __nccwpck_require__(68889) +const { kConstruct } = __nccwpck_require__(94822) const assert = __nccwpck_require__(98061) const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(15673) @@ -29724,15 +29946,15 @@ module.exports = { Request, makeRequest, fromInnerRequest, cloneRequest } /***/ }), -/***/ 51132: +/***/ 63042: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = __nccwpck_require__(10561) -const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = __nccwpck_require__(12749) -const util = __nccwpck_require__(50011) +const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = __nccwpck_require__(33924) +const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = __nccwpck_require__(48203) +const util = __nccwpck_require__(31014) const nodeUtil = __nccwpck_require__(47261) const { kEnumerableProperty } = util const { @@ -29744,16 +29966,16 @@ const { isErrorLike, isomorphicEncode, environmentSettingsObject: relevantRealm -} = __nccwpck_require__(98730) +} = __nccwpck_require__(40667) const { redirectStatusSet, nullBodyStatus -} = __nccwpck_require__(54823) -const { kState, kHeaders } = __nccwpck_require__(14935) -const { webidl } = __nccwpck_require__(2227) -const { FormData } = __nccwpck_require__(62598) -const { URLSerializer } = __nccwpck_require__(96730) -const { kConstruct } = __nccwpck_require__(13638) +} = __nccwpck_require__(49316) +const { kState, kHeaders } = __nccwpck_require__(23200) +const { webidl } = __nccwpck_require__(96163) +const { FormData } = __nccwpck_require__(59550) +const { URLSerializer } = __nccwpck_require__(68889) +const { kConstruct } = __nccwpck_require__(94822) const assert = __nccwpck_require__(98061) const { types } = __nccwpck_require__(47261) @@ -30342,7 +30564,7 @@ module.exports = { /***/ }), -/***/ 14935: +/***/ 23200: /***/ ((module) => { "use strict"; @@ -30359,7 +30581,7 @@ module.exports = { /***/ }), -/***/ 98730: +/***/ 40667: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -30367,14 +30589,14 @@ module.exports = { const { Transform } = __nccwpck_require__(84492) const zlib = __nccwpck_require__(65628) -const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = __nccwpck_require__(54823) -const { getGlobalOrigin } = __nccwpck_require__(13924) -const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = __nccwpck_require__(96730) +const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = __nccwpck_require__(49316) +const { getGlobalOrigin } = __nccwpck_require__(22407) +const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = __nccwpck_require__(68889) const { performance } = __nccwpck_require__(38846) -const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = __nccwpck_require__(50011) +const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = __nccwpck_require__(31014) const assert = __nccwpck_require__(98061) const { isUint8Array } = __nccwpck_require__(93746) -const { webidl } = __nccwpck_require__(2227) +const { webidl } = __nccwpck_require__(96163) let supportedHashes = [] @@ -31999,7 +32221,7 @@ module.exports = { /***/ }), -/***/ 2227: +/***/ 96163: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -32007,7 +32229,7 @@ module.exports = { const { types, inspect } = __nccwpck_require__(47261) const { markAsUncloneable } = __nccwpck_require__(24086) -const { toUSVString } = __nccwpck_require__(50011) +const { toUSVString } = __nccwpck_require__(31014) /** @type {import('../../../types/webidl').Webidl} */ const webidl = {} @@ -32702,7 +32924,7 @@ module.exports = { /***/ }), -/***/ 74973: +/***/ 73760: /***/ ((module) => { "use strict"; @@ -33000,7 +33222,7 @@ module.exports = { /***/ }), -/***/ 65153: +/***/ 62596: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -33010,16 +33232,16 @@ const { staticPropertyDescriptors, readOperation, fireAProgressEvent -} = __nccwpck_require__(24277) +} = __nccwpck_require__(86751) const { kState, kError, kResult, kEvents, kAborted -} = __nccwpck_require__(30010) -const { webidl } = __nccwpck_require__(2227) -const { kEnumerableProperty } = __nccwpck_require__(50011) +} = __nccwpck_require__(42047) +const { webidl } = __nccwpck_require__(96163) +const { kEnumerableProperty } = __nccwpck_require__(31014) class FileReader extends EventTarget { constructor () { @@ -33352,13 +33574,13 @@ module.exports = { /***/ }), -/***/ 53788: +/***/ 30183: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(2227) +const { webidl } = __nccwpck_require__(96163) const kState = Symbol('ProgressEvent state') @@ -33438,7 +33660,7 @@ module.exports = { /***/ }), -/***/ 30010: +/***/ 42047: /***/ ((module) => { "use strict"; @@ -33456,7 +33678,7 @@ module.exports = { /***/ }), -/***/ 24277: +/***/ 86751: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -33468,10 +33690,10 @@ const { kResult, kAborted, kLastProgressEventFired -} = __nccwpck_require__(30010) -const { ProgressEvent } = __nccwpck_require__(53788) -const { getEncoding } = __nccwpck_require__(74973) -const { serializeAMimeType, parseMIMEType } = __nccwpck_require__(96730) +} = __nccwpck_require__(42047) +const { ProgressEvent } = __nccwpck_require__(30183) +const { getEncoding } = __nccwpck_require__(73760) +const { serializeAMimeType, parseMIMEType } = __nccwpck_require__(68889) const { types } = __nccwpck_require__(47261) const { StringDecoder } = __nccwpck_require__(71576) const { btoa } = __nccwpck_require__(72254) @@ -33855,28 +34077,28 @@ module.exports = { /***/ }), -/***/ 17299: +/***/ 47524: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = __nccwpck_require__(44285) +const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = __nccwpck_require__(56004) const { kReadyState, kSentClose, kByteParser, kReceivedClose, kResponse -} = __nccwpck_require__(34939) -const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = __nccwpck_require__(93194) -const { channels } = __nccwpck_require__(65543) -const { CloseEvent } = __nccwpck_require__(69459) -const { makeRequest } = __nccwpck_require__(83211) -const { fetching } = __nccwpck_require__(78329) -const { Headers, getHeadersList } = __nccwpck_require__(10561) -const { getDecodeSplit } = __nccwpck_require__(98730) -const { WebsocketFrameSend } = __nccwpck_require__(84618) +} = __nccwpck_require__(23992) +const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = __nccwpck_require__(82487) +const { channels } = __nccwpck_require__(96005) +const { CloseEvent } = __nccwpck_require__(85021) +const { makeRequest } = __nccwpck_require__(11192) +const { fetching } = __nccwpck_require__(87321) +const { Headers, getHeadersList } = __nccwpck_require__(33924) +const { getDecodeSplit } = __nccwpck_require__(40667) +const { WebsocketFrameSend } = __nccwpck_require__(4712) /** @type {import('crypto')} */ let crypto @@ -34234,7 +34456,7 @@ module.exports = { /***/ }), -/***/ 44285: +/***/ 56004: /***/ ((module) => { "use strict"; @@ -34308,15 +34530,15 @@ module.exports = { /***/ }), -/***/ 69459: +/***/ 85021: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(2227) -const { kEnumerableProperty } = __nccwpck_require__(50011) -const { kConstruct } = __nccwpck_require__(13638) +const { webidl } = __nccwpck_require__(96163) +const { kEnumerableProperty } = __nccwpck_require__(31014) +const { kConstruct } = __nccwpck_require__(94822) const { MessagePort } = __nccwpck_require__(24086) /** @@ -34645,13 +34867,13 @@ module.exports = { /***/ }), -/***/ 84618: +/***/ 4712: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { maxUnsigned16Bit } = __nccwpck_require__(44285) +const { maxUnsigned16Bit } = __nccwpck_require__(56004) const BUFFER_SIZE = 16386 @@ -34749,15 +34971,15 @@ module.exports = { /***/ }), -/***/ 7133: +/***/ 93711: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { createInflateRaw, Z_DEFAULT_WINDOWBITS } = __nccwpck_require__(65628) -const { isValidClientWindowBits } = __nccwpck_require__(93194) -const { MessageSizeExceededError } = __nccwpck_require__(35990) +const { isValidClientWindowBits } = __nccwpck_require__(82487) +const { MessageSizeExceededError } = __nccwpck_require__(47926) const tail = Buffer.from([0x00, 0x00, 0xff, 0xff]) const kBuffer = Symbol('kBuffer') @@ -34862,7 +35084,7 @@ module.exports = { PerMessageDeflate } /***/ }), -/***/ 46080: +/***/ 44894: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -34870,9 +35092,9 @@ module.exports = { PerMessageDeflate } const { Writable } = __nccwpck_require__(84492) const assert = __nccwpck_require__(98061) -const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = __nccwpck_require__(44285) -const { kReadyState, kSentClose, kResponse, kReceivedClose } = __nccwpck_require__(34939) -const { channels } = __nccwpck_require__(65543) +const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = __nccwpck_require__(56004) +const { kReadyState, kSentClose, kResponse, kReceivedClose } = __nccwpck_require__(23992) +const { channels } = __nccwpck_require__(96005) const { isValidStatusCode, isValidOpcode, @@ -34882,11 +35104,11 @@ const { isControlFrame, isTextBinaryFrame, isContinuationFrame -} = __nccwpck_require__(93194) -const { WebsocketFrameSend } = __nccwpck_require__(84618) -const { closeWebSocketConnection } = __nccwpck_require__(17299) -const { PerMessageDeflate } = __nccwpck_require__(7133) -const { MessageSizeExceededError } = __nccwpck_require__(35990) +} = __nccwpck_require__(82487) +const { WebsocketFrameSend } = __nccwpck_require__(4712) +const { closeWebSocketConnection } = __nccwpck_require__(47524) +const { PerMessageDeflate } = __nccwpck_require__(93711) +const { MessageSizeExceededError } = __nccwpck_require__(47926) function failWebsocketConnectionWithCode (ws, code, reason) { closeWebSocketConnection(ws, code, reason, Buffer.byteLength(reason)) @@ -35117,6 +35339,20 @@ class ByteParser extends Writable { if (isControlFrame(this.#info.opcode)) { this.#loop = this.parseControlFrame(body) this.#state = parserStates.INFO + + // If the automatic PONG/CLOSE reply filled the socket's write buffer, + // stop parsing and resume on drain so a PING flood cannot grow the + // outbound queue without bound. + const socket = this.ws[kResponse].socket + if (this.#loop && socket.writableNeedDrain) { + this.#loop = false + socket.once('drain', () => { + if (this.destroyed) return + this.#loop = true + this.run(callback) + }) + return + } } else { if (!this.#info.compressed) { if (!this.writeFragments(body)) { @@ -35383,15 +35619,15 @@ module.exports = { /***/ }), -/***/ 26515: +/***/ 10243: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { WebsocketFrameSend } = __nccwpck_require__(84618) -const { opcodes, sendHints } = __nccwpck_require__(44285) -const FixedQueue = __nccwpck_require__(27092) +const { WebsocketFrameSend } = __nccwpck_require__(4712) +const { opcodes, sendHints } = __nccwpck_require__(56004) +const FixedQueue = __nccwpck_require__(94856) /** @type {typeof Uint8Array} */ const FastBuffer = Buffer[Symbol.species] @@ -35495,7 +35731,7 @@ module.exports = { SendQueue } /***/ }), -/***/ 34939: +/***/ 23992: /***/ ((module) => { "use strict"; @@ -35515,17 +35751,17 @@ module.exports = { /***/ }), -/***/ 93194: +/***/ 82487: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = __nccwpck_require__(34939) -const { states, opcodes } = __nccwpck_require__(44285) -const { ErrorEvent, createFastMessageEvent } = __nccwpck_require__(69459) +const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = __nccwpck_require__(23992) +const { states, opcodes } = __nccwpck_require__(56004) +const { ErrorEvent, createFastMessageEvent } = __nccwpck_require__(85021) const { isUtf8 } = __nccwpck_require__(72254) -const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = __nccwpck_require__(96730) +const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = __nccwpck_require__(68889) /* globals Blob */ @@ -35845,16 +36081,16 @@ module.exports = { /***/ }), -/***/ 16416: +/***/ 43590: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(2227) -const { URLSerializer } = __nccwpck_require__(96730) -const { environmentSettingsObject } = __nccwpck_require__(98730) -const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = __nccwpck_require__(44285) +const { webidl } = __nccwpck_require__(96163) +const { URLSerializer } = __nccwpck_require__(68889) +const { environmentSettingsObject } = __nccwpck_require__(40667) +const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = __nccwpck_require__(56004) const { kWebSocketURL, kReadyState, @@ -35863,21 +36099,21 @@ const { kResponse, kSentClose, kByteParser -} = __nccwpck_require__(34939) +} = __nccwpck_require__(23992) const { isConnecting, isEstablished, isClosing, isValidSubprotocol, fireEvent -} = __nccwpck_require__(93194) -const { establishWebSocketConnection, closeWebSocketConnection } = __nccwpck_require__(17299) -const { ByteParser } = __nccwpck_require__(46080) -const { kEnumerableProperty, isBlobLike } = __nccwpck_require__(50011) -const { getGlobalDispatcher } = __nccwpck_require__(19405) +} = __nccwpck_require__(82487) +const { establishWebSocketConnection, closeWebSocketConnection } = __nccwpck_require__(47524) +const { ByteParser } = __nccwpck_require__(44894) +const { kEnumerableProperty, isBlobLike } = __nccwpck_require__(31014) +const { getGlobalDispatcher } = __nccwpck_require__(53139) const { types } = __nccwpck_require__(47261) -const { ErrorEvent, CloseEvent } = __nccwpck_require__(69459) -const { SendQueue } = __nccwpck_require__(26515) +const { ErrorEvent, CloseEvent } = __nccwpck_require__(85021) +const { SendQueue } = __nccwpck_require__(10243) // https://websockets.spec.whatwg.org/#interface-definition class WebSocket extends EventTarget { @@ -66889,7 +67125,7 @@ async function resolveParentCommentBody(param, contextPorts) { /***/ }), -/***/ 37685: +/***/ 281: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -82477,7 +82713,7 @@ exports.BranchNameRepository = BranchNameRepository; /***/ }), -/***/ 54874: +/***/ 80742: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -82567,7 +82803,7 @@ function uniqueValidDependencies(candidates) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.BranchDependencyRepository = void 0; -const branch_dependency_policy_1 = __nccwpck_require__(54874); +const branch_dependency_policy_1 = __nccwpck_require__(80742); const OPEN_DEPENDENCIES_QUERY = ` query BranchSyncDependencies($owner: String!, $repo: String!, $issuesCursor: String, $pullsCursor: String) { repository(owner: $owner, name: $repo) { @@ -96603,7 +96839,7 @@ const check_changes_issue_size_use_case_1 = __nccwpck_require__(28356); const change_size_project_membership_composition_root_1 = __nccwpck_require__(99375); const bugbot_autofix_use_case_1 = __nccwpck_require__(45446); const detect_bugbot_fix_intent_use_case_1 = __nccwpck_require__(76234); -const dismiss_bugbot_findings_use_case_1 = __nccwpck_require__(37685); +const dismiss_bugbot_findings_use_case_1 = __nccwpck_require__(281); const remember_bugbot_rule_use_case_1 = __nccwpck_require__(17437); const detect_potential_problems_use_case_1 = __nccwpck_require__(6287); const notify_new_commit_on_issue_use_case_1 = __nccwpck_require__(33276); diff --git a/build/github_action/index.js b/build/github_action/index.js index ef1e4c702..fdef61464 100644 --- a/build/github_action/index.js +++ b/build/github_action/index.js @@ -2139,7 +2139,7 @@ exports.getProxyAgentDispatcher = getProxyAgentDispatcher; exports.getProxyFetch = getProxyFetch; exports.getApiBaseUrl = getApiBaseUrl; const httpClient = __importStar(__nccwpck_require__(75784)); -const undici_1 = __nccwpck_require__(18381); +const undici_1 = __nccwpck_require__(31241); function getAuthString(token, options) { if (!token && !options.auth) { throw new Error('Parameter token or opts.auth is required'); @@ -2391,7 +2391,7 @@ const http = __importStar(__nccwpck_require__(13685)); const https = __importStar(__nccwpck_require__(95687)); const pm = __importStar(__nccwpck_require__(34583)); const tunnel = __importStar(__nccwpck_require__(64249)); -const undici_1 = __nccwpck_require__(18381); +const undici_1 = __nccwpck_require__(31241); var HttpCodes; (function (HttpCodes) { HttpCodes[HttpCodes["OK"] = 200] = "OK"; @@ -8503,34 +8503,34 @@ exports.debug = debug; // for test /***/ }), -/***/ 18381: +/***/ 31241: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const Client = __nccwpck_require__(85849) -const Dispatcher = __nccwpck_require__(66071) -const Pool = __nccwpck_require__(80229) -const BalancedPool = __nccwpck_require__(68255) -const Agent = __nccwpck_require__(73274) -const ProxyAgent = __nccwpck_require__(87187) -const EnvHttpProxyAgent = __nccwpck_require__(29941) -const RetryAgent = __nccwpck_require__(55184) -const errors = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) +const Client = __nccwpck_require__(6237) +const Dispatcher = __nccwpck_require__(32171) +const Pool = __nccwpck_require__(49771) +const BalancedPool = __nccwpck_require__(88214) +const Agent = __nccwpck_require__(1880) +const ProxyAgent = __nccwpck_require__(57912) +const EnvHttpProxyAgent = __nccwpck_require__(42547) +const RetryAgent = __nccwpck_require__(42626) +const errors = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) const { InvalidArgumentError } = errors -const api = __nccwpck_require__(20617) -const buildConnector = __nccwpck_require__(41429) -const MockClient = __nccwpck_require__(4227) -const MockAgent = __nccwpck_require__(46432) -const MockPool = __nccwpck_require__(36575) -const mockErrors = __nccwpck_require__(19329) -const RetryHandler = __nccwpck_require__(64524) -const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(19405) -const DecoratorHandler = __nccwpck_require__(41738) -const RedirectHandler = __nccwpck_require__(64014) -const createRedirectInterceptor = __nccwpck_require__(40928) +const api = __nccwpck_require__(39663) +const buildConnector = __nccwpck_require__(63447) +const MockClient = __nccwpck_require__(69636) +const MockAgent = __nccwpck_require__(89937) +const MockPool = __nccwpck_require__(40660) +const mockErrors = __nccwpck_require__(33519) +const RetryHandler = __nccwpck_require__(12671) +const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(53139) +const DecoratorHandler = __nccwpck_require__(59280) +const RedirectHandler = __nccwpck_require__(90008) +const createRedirectInterceptor = __nccwpck_require__(91467) Object.assign(Dispatcher.prototype, api) @@ -8548,10 +8548,10 @@ module.exports.DecoratorHandler = DecoratorHandler module.exports.RedirectHandler = RedirectHandler module.exports.createRedirectInterceptor = createRedirectInterceptor module.exports.interceptors = { - redirect: __nccwpck_require__(74872), - retry: __nccwpck_require__(79637), - dump: __nccwpck_require__(12493), - dns: __nccwpck_require__(20346) + redirect: __nccwpck_require__(42182), + retry: __nccwpck_require__(17389), + dump: __nccwpck_require__(9408), + dns: __nccwpck_require__(26290) } module.exports.buildConnector = buildConnector @@ -8613,7 +8613,7 @@ function makeDispatcher (fn) { module.exports.setGlobalDispatcher = setGlobalDispatcher module.exports.getGlobalDispatcher = getGlobalDispatcher -const fetchImpl = (__nccwpck_require__(78329).fetch) +const fetchImpl = (__nccwpck_require__(87321).fetch) module.exports.fetch = async function fetch (init, options = undefined) { try { return await fetchImpl(init, options) @@ -8625,39 +8625,39 @@ module.exports.fetch = async function fetch (init, options = undefined) { throw err } } -module.exports.Headers = __nccwpck_require__(10561).Headers -module.exports.Response = __nccwpck_require__(51132).Response -module.exports.Request = __nccwpck_require__(83211).Request -module.exports.FormData = __nccwpck_require__(62598).FormData +module.exports.Headers = __nccwpck_require__(33924).Headers +module.exports.Response = __nccwpck_require__(63042).Response +module.exports.Request = __nccwpck_require__(11192).Request +module.exports.FormData = __nccwpck_require__(59550).FormData module.exports.File = globalThis.File ?? (__nccwpck_require__(72254).File) -module.exports.FileReader = __nccwpck_require__(65153).FileReader +module.exports.FileReader = __nccwpck_require__(62596).FileReader -const { setGlobalOrigin, getGlobalOrigin } = __nccwpck_require__(13924) +const { setGlobalOrigin, getGlobalOrigin } = __nccwpck_require__(22407) module.exports.setGlobalOrigin = setGlobalOrigin module.exports.getGlobalOrigin = getGlobalOrigin -const { CacheStorage } = __nccwpck_require__(11069) -const { kConstruct } = __nccwpck_require__(50591) +const { CacheStorage } = __nccwpck_require__(13256) +const { kConstruct } = __nccwpck_require__(275) // Cache & CacheStorage are tightly coupled with fetch. Even if it may run // in an older version of Node, it doesn't have any use without fetch. module.exports.caches = new CacheStorage(kConstruct) -const { deleteCookie, getCookies, getSetCookies, setCookie } = __nccwpck_require__(15855) +const { deleteCookie, getCookies, getSetCookies, setCookie } = __nccwpck_require__(84245) module.exports.deleteCookie = deleteCookie module.exports.getCookies = getCookies module.exports.getSetCookies = getSetCookies module.exports.setCookie = setCookie -const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(96730) +const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(68889) module.exports.parseMIMEType = parseMIMEType module.exports.serializeAMimeType = serializeAMimeType -const { CloseEvent, ErrorEvent, MessageEvent } = __nccwpck_require__(69459) -module.exports.WebSocket = __nccwpck_require__(16416).WebSocket +const { CloseEvent, ErrorEvent, MessageEvent } = __nccwpck_require__(85021) +module.exports.WebSocket = __nccwpck_require__(43590).WebSocket module.exports.CloseEvent = CloseEvent module.exports.ErrorEvent = ErrorEvent module.exports.MessageEvent = MessageEvent @@ -8673,18 +8673,18 @@ module.exports.MockPool = MockPool module.exports.MockAgent = MockAgent module.exports.mockErrors = mockErrors -const { EventSource } = __nccwpck_require__(6731) +const { EventSource } = __nccwpck_require__(74292) module.exports.EventSource = EventSource /***/ }), -/***/ 97433: +/***/ 44378: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const { addAbortListener } = __nccwpck_require__(50011) -const { RequestAbortedError } = __nccwpck_require__(35990) +const { addAbortListener } = __nccwpck_require__(31014) +const { RequestAbortedError } = __nccwpck_require__(47926) const kListener = Symbol('kListener') const kSignal = Symbol('kSignal') @@ -8744,7 +8744,7 @@ module.exports = { /***/ }), -/***/ 93671: +/***/ 48105: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -8752,9 +8752,9 @@ module.exports = { const assert = __nccwpck_require__(98061) const { AsyncResource } = __nccwpck_require__(92761) -const { InvalidArgumentError, SocketError } = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) -const { addSignal, removeSignal } = __nccwpck_require__(97433) +const { InvalidArgumentError, SocketError } = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) +const { addSignal, removeSignal } = __nccwpck_require__(44378) class ConnectHandler extends AsyncResource { constructor (opts, callback) { @@ -8860,7 +8860,7 @@ module.exports = connect /***/ }), -/***/ 281: +/***/ 25050: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -8875,10 +8875,10 @@ const { InvalidArgumentError, InvalidReturnValueError, RequestAbortedError -} = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) +} = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) const { AsyncResource } = __nccwpck_require__(92761) -const { addSignal, removeSignal } = __nccwpck_require__(97433) +const { addSignal, removeSignal } = __nccwpck_require__(44378) const assert = __nccwpck_require__(98061) const kResume = Symbol('resume') @@ -9119,17 +9119,17 @@ module.exports = pipeline /***/ }), -/***/ 26562: +/***/ 53067: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { Readable } = __nccwpck_require__(93401) -const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) -const { getResolveErrorBodyCallback } = __nccwpck_require__(80710) +const { Readable } = __nccwpck_require__(67646) +const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) +const { getResolveErrorBodyCallback } = __nccwpck_require__(78393) const { AsyncResource } = __nccwpck_require__(92761) class RequestHandler extends AsyncResource { @@ -9341,7 +9341,7 @@ module.exports.RequestHandler = RequestHandler /***/ }), -/***/ 75059: +/***/ 21890: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -9349,11 +9349,11 @@ module.exports.RequestHandler = RequestHandler const assert = __nccwpck_require__(98061) const { finished, PassThrough } = __nccwpck_require__(84492) -const { InvalidArgumentError, InvalidReturnValueError } = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) -const { getResolveErrorBodyCallback } = __nccwpck_require__(80710) +const { InvalidArgumentError, InvalidReturnValueError } = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) +const { getResolveErrorBodyCallback } = __nccwpck_require__(78393) const { AsyncResource } = __nccwpck_require__(92761) -const { addSignal, removeSignal } = __nccwpck_require__(97433) +const { addSignal, removeSignal } = __nccwpck_require__(44378) class StreamHandler extends AsyncResource { constructor (opts, factory, callback) { @@ -9569,16 +9569,16 @@ module.exports = stream /***/ }), -/***/ 23792: +/***/ 94422: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { InvalidArgumentError, SocketError } = __nccwpck_require__(35990) +const { InvalidArgumentError, SocketError } = __nccwpck_require__(47926) const { AsyncResource } = __nccwpck_require__(92761) -const util = __nccwpck_require__(50011) -const { addSignal, removeSignal } = __nccwpck_require__(97433) +const util = __nccwpck_require__(31014) +const { addSignal, removeSignal } = __nccwpck_require__(44378) const assert = __nccwpck_require__(98061) class UpgradeHandler extends AsyncResource { @@ -9685,22 +9685,22 @@ module.exports = upgrade /***/ }), -/***/ 20617: +/***/ 39663: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -module.exports.request = __nccwpck_require__(26562) -module.exports.stream = __nccwpck_require__(75059) -module.exports.pipeline = __nccwpck_require__(281) -module.exports.upgrade = __nccwpck_require__(23792) -module.exports.connect = __nccwpck_require__(93671) +module.exports.request = __nccwpck_require__(53067) +module.exports.stream = __nccwpck_require__(21890) +module.exports.pipeline = __nccwpck_require__(25050) +module.exports.upgrade = __nccwpck_require__(94422) +module.exports.connect = __nccwpck_require__(48105) /***/ }), -/***/ 93401: +/***/ 67646: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -9710,9 +9710,9 @@ module.exports.connect = __nccwpck_require__(93671) const assert = __nccwpck_require__(98061) const { Readable } = __nccwpck_require__(84492) -const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) -const { ReadableStreamFrom } = __nccwpck_require__(50011) +const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) +const { ReadableStreamFrom } = __nccwpck_require__(31014) const kConsume = Symbol('kConsume') const kReading = Symbol('kReading') @@ -10093,15 +10093,15 @@ module.exports = { Readable: BodyReadable, chunksDecode } /***/ }), -/***/ 80710: +/***/ 78393: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { const assert = __nccwpck_require__(98061) const { ResponseStatusCodeError -} = __nccwpck_require__(35990) +} = __nccwpck_require__(47926) -const { chunksDecode } = __nccwpck_require__(93401) +const { chunksDecode } = __nccwpck_require__(67646) const CHUNK_LIMIT = 128 * 1024 async function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) { @@ -10193,7 +10193,7 @@ module.exports = { /***/ }), -/***/ 41429: +/***/ 63447: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -10201,9 +10201,9 @@ module.exports = { const net = __nccwpck_require__(87503) const assert = __nccwpck_require__(98061) -const util = __nccwpck_require__(50011) -const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(35990) -const timers = __nccwpck_require__(77512) +const util = __nccwpck_require__(31014) +const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(47926) +const timers = __nccwpck_require__(63125) function noop () {} @@ -10441,7 +10441,7 @@ module.exports = buildConnector /***/ }), -/***/ 53451: +/***/ 91362: /***/ ((module) => { "use strict"; @@ -10567,7 +10567,7 @@ module.exports = { /***/ }), -/***/ 65543: +/***/ 96005: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -10777,7 +10777,7 @@ module.exports = { /***/ }), -/***/ 35990: +/***/ 47926: /***/ ((module) => { "use strict"; @@ -11210,7 +11210,7 @@ module.exports = { /***/ }), -/***/ 13484: +/***/ 82075: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -11219,7 +11219,7 @@ module.exports = { const { InvalidArgumentError, NotSupportedError -} = __nccwpck_require__(35990) +} = __nccwpck_require__(47926) const assert = __nccwpck_require__(98061) const { isValidHTTPToken, @@ -11234,9 +11234,9 @@ const { validateHandler, getServerName, normalizedMethodRecords -} = __nccwpck_require__(50011) -const { channels } = __nccwpck_require__(65543) -const { headerNameLowerCasedRecord } = __nccwpck_require__(53451) +} = __nccwpck_require__(31014) +const { channels } = __nccwpck_require__(96005) +const { headerNameLowerCasedRecord } = __nccwpck_require__(91362) // Verifies that a given path is valid does not contain control chars \x00 to \x20 const invalidPathRegex = /[^\u0021-\u00ff]/ @@ -11479,11 +11479,77 @@ class Request { } } - onUpgrade (statusCode, headers, socket) { + /** + * @param {number|null} statusCode + * @param {Buffer[]|null} headers + * @param {import('node:stream').Duplex} socket + * @param {string} [statusText] + */ + onUpgrade (statusCode, headers, socket, statusText = '') { + this.onFinally() + assert(!this.aborted) assert(!this.completed) - return this[kHandler].onUpgrade(statusCode, headers, socket) + if (statusCode !== null) { + this.#publishUpgradeHeaders(statusCode, headers, statusText) + } + + const result = this[kHandler].onUpgrade(statusCode, headers, socket) + + if (!this.aborted) { + this.completed = true + if (statusCode !== null) { + this.#publishUpgradeTrailers() + } + } + + return result + } + + /** + * @param {number} statusCode + * @param {import('node:http2').IncomingHttpHeaders} headers + * @param {(headers: import('node:http2').IncomingHttpHeaders) => Buffer[]} parseHeaders + * @param {string} [statusText] + */ + onUpgradeResponse (statusCode, headers, parseHeaders, statusText = '') { + assert(!this.aborted) + assert(this.completed) + + if (channels.headers.hasSubscribers) { + this.#publishUpgradeHeaders(statusCode, parseHeaders(headers), statusText) + } + this.#publishUpgradeTrailers() + } + + /** + * @param {Error} error + */ + onUpgradeError (error) { + assert(!this.aborted) + assert(this.completed) + + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }) + } + } + + /** + * @param {number} statusCode + * @param {Buffer[]} headers + * @param {string} statusText + */ + #publishUpgradeHeaders (statusCode, headers, statusText) { + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) + } + } + + #publishUpgradeTrailers () { + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers: [] }) + } } onComplete (trailers) { @@ -11634,7 +11700,7 @@ module.exports = Request /***/ }), -/***/ 13638: +/***/ 94822: /***/ ((module) => { module.exports = { @@ -11708,7 +11774,7 @@ module.exports = { /***/ }), -/***/ 30723: +/***/ 52731: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -11717,7 +11783,7 @@ module.exports = { const { wellknownHeaderNames, headerNameLowerCasedRecord -} = __nccwpck_require__(53451) +} = __nccwpck_require__(91362) class TstNode { /** @type {any} */ @@ -11868,14 +11934,14 @@ module.exports = { /***/ }), -/***/ 50011: +/***/ 31014: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { kDestroyed, kBodyUsed, kListeners, kBody } = __nccwpck_require__(13638) +const { kDestroyed, kBodyUsed, kListeners, kBody } = __nccwpck_require__(94822) const { IncomingMessage } = __nccwpck_require__(88849) const stream = __nccwpck_require__(84492) const net = __nccwpck_require__(87503) @@ -11883,9 +11949,9 @@ const { Blob } = __nccwpck_require__(72254) const nodeUtil = __nccwpck_require__(47261) const { stringify } = __nccwpck_require__(39630) const { EventEmitter: EE } = __nccwpck_require__(15673) -const { InvalidArgumentError } = __nccwpck_require__(35990) -const { headerNameLowerCasedRecord } = __nccwpck_require__(53451) -const { tree } = __nccwpck_require__(30723) +const { InvalidArgumentError } = __nccwpck_require__(47926) +const { headerNameLowerCasedRecord } = __nccwpck_require__(91362) +const { tree } = __nccwpck_require__(52731) const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) @@ -12595,19 +12661,19 @@ module.exports = { /***/ }), -/***/ 73274: +/***/ 1880: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { InvalidArgumentError } = __nccwpck_require__(35990) -const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(13638) -const DispatcherBase = __nccwpck_require__(39504) -const Pool = __nccwpck_require__(80229) -const Client = __nccwpck_require__(85849) -const util = __nccwpck_require__(50011) -const createRedirectInterceptor = __nccwpck_require__(40928) +const { InvalidArgumentError } = __nccwpck_require__(47926) +const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(94822) +const DispatcherBase = __nccwpck_require__(26844) +const Pool = __nccwpck_require__(49771) +const Client = __nccwpck_require__(6237) +const util = __nccwpck_require__(31014) +const createRedirectInterceptor = __nccwpck_require__(91467) const kOnConnect = Symbol('onConnect') const kOnDisconnect = Symbol('onDisconnect') @@ -12624,7 +12690,7 @@ function defaultFactory (origin, opts) { } class Agent extends DispatcherBase { - constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { + constructor ({ factory = defaultFactory, maxRedirections = 0, connect, tls, ...options } = {}) { if (typeof factory !== 'function') { throw new InvalidArgumentError('factory must be a function.') } @@ -12643,11 +12709,15 @@ class Agent extends DispatcherBase { connect = { ...connect } } + if (tls && typeof tls !== 'function') { + tls = { ...tls } + } + this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })] - this[kOptions] = { ...util.deepClone(options), connect } + this[kOptions] = { ...util.deepClone(options), connect, tls } this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : undefined @@ -12732,7 +12802,7 @@ module.exports = Agent /***/ }), -/***/ 68255: +/***/ 88214: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -12741,7 +12811,7 @@ module.exports = Agent const { BalancedPoolMissingUpstreamError, InvalidArgumentError -} = __nccwpck_require__(35990) +} = __nccwpck_require__(47926) const { PoolBase, kClients, @@ -12749,10 +12819,10 @@ const { kAddClient, kRemoveClient, kGetDispatcher -} = __nccwpck_require__(1467) -const Pool = __nccwpck_require__(80229) -const { kUrl, kInterceptors } = __nccwpck_require__(13638) -const { parseOrigin } = __nccwpck_require__(50011) +} = __nccwpck_require__(97367) +const Pool = __nccwpck_require__(49771) +const { kUrl, kInterceptors } = __nccwpck_require__(94822) +const { parseOrigin } = __nccwpck_require__(31014) const kFactory = Symbol('factory') const kOptions = Symbol('options') @@ -12949,7 +13019,7 @@ module.exports = BalancedPool /***/ }), -/***/ 14429: +/***/ 78365: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -12958,9 +13028,9 @@ module.exports = BalancedPool /* global WebAssembly */ const assert = __nccwpck_require__(98061) -const util = __nccwpck_require__(50011) -const { channels } = __nccwpck_require__(65543) -const timers = __nccwpck_require__(77512) +const util = __nccwpck_require__(31014) +const { channels } = __nccwpck_require__(96005) +const timers = __nccwpck_require__(63125) const { RequestContentLengthMismatchError, ResponseContentLengthMismatchError, @@ -12973,7 +13043,7 @@ const { BodyTimeoutError, HTTPParserError, ResponseExceededMaxSizeError -} = __nccwpck_require__(35990) +} = __nccwpck_require__(47926) const { kUrl, kReset, @@ -13006,9 +13076,9 @@ const { kOnError, kResume, kHTTPContext -} = __nccwpck_require__(13638) +} = __nccwpck_require__(94822) -const constants = __nccwpck_require__(41721) +const constants = __nccwpck_require__(27692) const EMPTY_BUF = Buffer.alloc(0) const FastBuffer = Buffer[Symbol.species] const addListener = util.addListener @@ -13020,11 +13090,11 @@ const kSocketUsed = Symbol('kSocketUsed') let extractBody async function lazyllhttp () { - const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(46081) : undefined + const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(84888) : undefined let mod try { - mod = await WebAssembly.compile(__nccwpck_require__(97877)) + mod = await WebAssembly.compile(__nccwpck_require__(31445)) } catch (e) { /* istanbul ignore next */ @@ -13032,7 +13102,7 @@ async function lazyllhttp () { // being enabled, but the occurring of this other error // * https://github.com/emscripten-core/emscripten/issues/11495 // got me to remove that check to avoid breaking Node 12. - mod = await WebAssembly.compile(llhttpWasmData || __nccwpck_require__(46081)) + mod = await WebAssembly.compile(llhttpWasmData || __nccwpck_require__(84888)) } return await WebAssembly.instantiate(mod, { @@ -13387,7 +13457,7 @@ class Parser { } onUpgrade (head) { - const { upgrade, client, socket, headers, statusCode } = this + const { upgrade, client, socket, headers, statusCode, statusText } = this assert(upgrade) assert(client[kSocket] === socket) @@ -13422,9 +13492,10 @@ class Parser { client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')) try { - request.onUpgrade(statusCode, headers, socket) - } catch (err) { - util.destroy(socket, err) + request.onUpgrade(statusCode, headers, socket, statusText) + } catch (error) { + util.errorRequest(client, request, error) + util.destroy(socket, error) } client[kResume]() @@ -13681,8 +13752,6 @@ async function connectH1 (client, socket) { socket[kParser] = new Parser(client, socket, llhttpInstance) addListener(socket, 'error', function (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - const parser = this[kParser] // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded @@ -13948,7 +14017,7 @@ function writeH1 (client, request) { if (util.isFormDataLike(body)) { if (!extractBody) { - extractBody = (__nccwpck_require__(12749).extractBody) + extractBody = (__nccwpck_require__(48203).extractBody) } const [bodyStream, contentType] = extractBody(body) @@ -14005,12 +14074,22 @@ function writeH1 (client, request) { const socket = client[kSocket] clearIdleSocketValidation(socket) - const abort = (err) => { - if (request.aborted || request.completed) { + /** + * @param {Error} [error] + */ + const abort = (error) => { + if (request.aborted) { + return + } + + if (request.completed) { + if (request.upgrade || request.method === 'CONNECT') { + util.destroy(socket, new InformationalError('aborted')) + } return } - util.errorRequest(client, request, err || new RequestAbortedError()) + util.errorRequest(client, request, error || new RequestAbortedError()) util.destroy(body) util.destroy(socket, new InformationalError('aborted')) @@ -14461,21 +14540,22 @@ module.exports = connectH1 /***/ }), -/***/ 34879: +/***/ 55267: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) +const { errorMonitor } = __nccwpck_require__(15673) const { pipeline } = __nccwpck_require__(84492) -const util = __nccwpck_require__(50011) +const util = __nccwpck_require__(31014) const { RequestContentLengthMismatchError, RequestAbortedError, SocketError, InformationalError -} = __nccwpck_require__(35990) +} = __nccwpck_require__(47926) const { kUrl, kReset, @@ -14494,7 +14574,7 @@ const { kResume, kSize, kHTTPContext -} = __nccwpck_require__(13638) +} = __nccwpck_require__(94822) const kOpenStreams = Symbol('open streams') @@ -14544,6 +14624,15 @@ function parseH2Headers (headers) { return result } +/** + * @param {import('node:http2').IncomingHttpHeaders} headers + * @returns {Buffer[]} + */ +function parseH2ResponseHeaders (headers) { + const { [HTTP2_HEADER_STATUS]: _statusCode, ...realHeaders } = headers + return parseH2Headers(realHeaders) +} + async function connectH2 (client, socket) { client[kSocket] = socket @@ -14593,8 +14682,6 @@ async function connectH2 (client, socket) { socket[kHTTP2Session] = session util.addListener(socket, 'error', function (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - this[kError] = err this[kClient][kOnError](err) @@ -14668,8 +14755,6 @@ function resumeH2 (client) { } function onHttp2SessionError (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - this[kSocket][kError] = err this[kClient][kOnError](err) } @@ -14764,22 +14849,32 @@ function writeH2 (client, request) { headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}` headers[HTTP2_HEADER_METHOD] = method - const abort = (err) => { - if (request.aborted || request.completed) { + /** + * @param {Error} [error] + */ + const abort = (error) => { + if (request.aborted) { + return + } + + if (request.completed) { + if (method === 'CONNECT' && stream != null) { + util.destroy(stream, error || new RequestAbortedError()) + } return } - err = err || new RequestAbortedError() + error = error || new RequestAbortedError() - util.errorRequest(client, request, err) + util.errorRequest(client, request, error) if (stream != null) { - util.destroy(stream, err) + util.destroy(stream, error) } // We do not destroy the socket as we can continue using the session // the stream get's destroyed and the session remains to create new streams - util.destroy(body, err) + util.destroy(body, error) client[kQueue][client[kRunningIdx]++] = null client[kResume]() } @@ -14798,25 +14893,57 @@ function writeH2 (client, request) { if (method === 'CONNECT') { session.ref() - // We are already connected, streams are pending, first request - // will create a new stream. We trigger a request to create the stream and wait until - // `ready` event is triggered // We disabled endStream to allow the user to write to the stream stream = session.request(headers, { endStream: false, signal }) + let upgradeResponseFinished = false - if (stream.id && !stream.pending) { - request.onUpgrade(null, null, stream) - ++session[kOpenStreams] - client[kQueue][client[kRunningIdx]++] = null - } else { - stream.once('ready', () => { + /** + * @param {import('node:http2').IncomingHttpHeaders} headers + */ + const onResponse = (headers) => { + upgradeResponseFinished = true + stream.off(errorMonitor, onUpgradeError) + request.onUpgradeResponse(Number(headers[HTTP2_HEADER_STATUS]), headers, parseH2ResponseHeaders) + } + + /** + * @param {Error} error + */ + const onUpgradeError = (error) => { + upgradeResponseFinished = true + stream.off('response', onResponse) + request.onUpgradeError(error) + } + + const onReady = () => { + try { request.onUpgrade(null, null, stream) - ++session[kOpenStreams] - client[kQueue][client[kRunningIdx]++] = null - }) + } catch (error) { + stream.off('response', onResponse) + abort(error) + return + } + + if (request.aborted) { + return + } + + stream.off('error', abort) + stream.once(errorMonitor, onUpgradeError) + client[kQueue][client[kRunningIdx]++] = null } + stream.once('response', onResponse) + stream.once('error', abort) + ++session[kOpenStreams] + onReady() + stream.once('close', () => { + if (!upgradeResponseFinished && request.completed) { + stream.off('response', onResponse) + stream.off(errorMonitor, onUpgradeError) + request.onUpgradeError(new InformationalError(`HTTP/2: "stream error" received - code ${stream.rstCode}`)) + } session[kOpenStreams] -= 1 if (session[kOpenStreams] === 0) session.unref() }) @@ -14853,7 +14980,7 @@ function writeH2 (client, request) { let contentLength = util.bodyLength(body) if (util.isFormDataLike(body)) { - extractBody ??= (__nccwpck_require__(12749).extractBody) + extractBody ??= (__nccwpck_require__(48203).extractBody) const [bodyStream, contentType] = extractBody(body) headers['content-type'] = contentType @@ -15213,7 +15340,7 @@ module.exports = connectH2 /***/ }), -/***/ 85849: +/***/ 6237: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -15224,16 +15351,16 @@ module.exports = connectH2 const assert = __nccwpck_require__(98061) const net = __nccwpck_require__(87503) const http = __nccwpck_require__(88849) -const util = __nccwpck_require__(50011) -const { channels } = __nccwpck_require__(65543) -const Request = __nccwpck_require__(13484) -const DispatcherBase = __nccwpck_require__(39504) +const util = __nccwpck_require__(31014) +const { channels } = __nccwpck_require__(96005) +const Request = __nccwpck_require__(82075) +const DispatcherBase = __nccwpck_require__(26844) const { InvalidArgumentError, InformationalError, ClientDestroyedError -} = __nccwpck_require__(35990) -const buildConnector = __nccwpck_require__(41429) +} = __nccwpck_require__(47926) +const buildConnector = __nccwpck_require__(63447) const { kUrl, kServerName, @@ -15275,9 +15402,9 @@ const { kHTTPContext, kMaxConcurrentStreams, kResume -} = __nccwpck_require__(13638) -const connectH1 = __nccwpck_require__(14429) -const connectH2 = __nccwpck_require__(34879) +} = __nccwpck_require__(94822) +const connectH1 = __nccwpck_require__(78365) +const connectH2 = __nccwpck_require__(55267) let deprecatedInterceptorWarned = false const kClosedResolve = Symbol('kClosedResolve') @@ -15326,9 +15453,10 @@ class Client extends DispatcherBase { // h2 maxConcurrentStreams, allowH2, - webSocket + webSocket, + eventSource } = {}) { - super({ webSocket }) + super({ webSocket, eventSource }) if (keepAlive !== undefined) { throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') @@ -15584,7 +15712,7 @@ class Client extends DispatcherBase { } } -const createRedirectInterceptor = __nccwpck_require__(40928) +const createRedirectInterceptor = __nccwpck_require__(91467) function onError (client, err) { if ( @@ -15844,24 +15972,26 @@ module.exports = Client /***/ }), -/***/ 39504: +/***/ 26844: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const Dispatcher = __nccwpck_require__(66071) +const buffer = __nccwpck_require__(72254) +const Dispatcher = __nccwpck_require__(32171) const { ClientDestroyedError, ClientClosedError, InvalidArgumentError -} = __nccwpck_require__(35990) -const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = __nccwpck_require__(13638) +} = __nccwpck_require__(47926) +const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = __nccwpck_require__(94822) const kOnDestroyed = Symbol('onDestroyed') const kOnClosed = Symbol('onClosed') const kInterceptedDispatch = Symbol('Intercepted Dispatch') const kWebSocketOptions = Symbol('webSocketOptions') +const kEventSourceOptions = Symbol('eventSourceOptions') class DispatcherBase extends Dispatcher { constructor (opts) { @@ -15872,6 +16002,7 @@ class DispatcherBase extends Dispatcher { this[kClosed] = false this[kOnClosed] = [] this[kWebSocketOptions] = opts?.webSocket ?? {} + this[kEventSourceOptions] = opts?.eventSource ?? {} } get webSocketOptions () { @@ -15881,6 +16012,12 @@ class DispatcherBase extends Dispatcher { } } + get eventSourceOptions () { + return { + maxEventSize: this[kEventSourceOptions].maxEventSize ?? buffer.kStringMaxLength + } + } + get destroyed () { return this[kDestroyed] } @@ -16051,7 +16188,7 @@ module.exports = DispatcherBase /***/ }), -/***/ 66071: +/***/ 32171: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -16124,16 +16261,16 @@ module.exports = Dispatcher /***/ }), -/***/ 29941: +/***/ 42547: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const DispatcherBase = __nccwpck_require__(39504) -const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = __nccwpck_require__(13638) -const ProxyAgent = __nccwpck_require__(87187) -const Agent = __nccwpck_require__(73274) +const DispatcherBase = __nccwpck_require__(26844) +const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = __nccwpck_require__(94822) +const ProxyAgent = __nccwpck_require__(57912) +const Agent = __nccwpck_require__(1880) const DEFAULT_PORTS = { 'http:': 80, @@ -16292,7 +16429,7 @@ module.exports = EnvHttpProxyAgent /***/ }), -/***/ 27092: +/***/ 94856: /***/ ((module) => { "use strict"; @@ -16417,16 +16554,16 @@ module.exports = class FixedQueue { /***/ }), -/***/ 1467: +/***/ 97367: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const DispatcherBase = __nccwpck_require__(39504) -const FixedQueue = __nccwpck_require__(27092) -const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(13638) -const PoolStats = __nccwpck_require__(48309) +const DispatcherBase = __nccwpck_require__(26844) +const FixedQueue = __nccwpck_require__(94856) +const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(94822) +const PoolStats = __nccwpck_require__(61279) const kClients = Symbol('clients') const kNeedDrain = Symbol('needDrain') @@ -16619,10 +16756,10 @@ module.exports = { /***/ }), -/***/ 48309: +/***/ 61279: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(13638) +const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(94822) const kPool = Symbol('pool') class PoolStats { @@ -16660,7 +16797,7 @@ module.exports = PoolStats /***/ }), -/***/ 80229: +/***/ 49771: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -16672,14 +16809,14 @@ const { kNeedDrain, kAddClient, kGetDispatcher -} = __nccwpck_require__(1467) -const Client = __nccwpck_require__(85849) +} = __nccwpck_require__(97367) +const Client = __nccwpck_require__(6237) const { InvalidArgumentError -} = __nccwpck_require__(35990) -const util = __nccwpck_require__(50011) -const { kUrl, kInterceptors } = __nccwpck_require__(13638) -const buildConnector = __nccwpck_require__(41429) +} = __nccwpck_require__(47926) +const util = __nccwpck_require__(31014) +const { kUrl, kInterceptors } = __nccwpck_require__(94822) +const buildConnector = __nccwpck_require__(63447) const kOptions = Symbol('options') const kConnections = Symbol('connections') @@ -16775,20 +16912,20 @@ module.exports = Pool /***/ }), -/***/ 87187: +/***/ 57912: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(13638) +const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(94822) const { URL } = __nccwpck_require__(41041) -const Agent = __nccwpck_require__(73274) -const Pool = __nccwpck_require__(80229) -const DispatcherBase = __nccwpck_require__(39504) -const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = __nccwpck_require__(35990) -const buildConnector = __nccwpck_require__(41429) -const Client = __nccwpck_require__(85849) +const Agent = __nccwpck_require__(1880) +const Pool = __nccwpck_require__(49771) +const DispatcherBase = __nccwpck_require__(26844) +const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = __nccwpck_require__(47926) +const buildConnector = __nccwpck_require__(63447) +const Client = __nccwpck_require__(6237) const kAgent = Symbol('proxy agent') const kClient = Symbol('proxy client') @@ -17057,14 +17194,14 @@ module.exports = ProxyAgent /***/ }), -/***/ 55184: +/***/ 42626: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const Dispatcher = __nccwpck_require__(66071) -const RetryHandler = __nccwpck_require__(64524) +const Dispatcher = __nccwpck_require__(32171) +const RetryHandler = __nccwpck_require__(12671) class RetryAgent extends Dispatcher { #agent = null @@ -17100,7 +17237,7 @@ module.exports = RetryAgent /***/ }), -/***/ 19405: +/***/ 53139: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -17109,8 +17246,8 @@ module.exports = RetryAgent // We include a version number for the Dispatcher API. In case of breaking changes, // this version number must be increased to avoid conflicts. const globalDispatcher = Symbol.for('undici.globalDispatcher.1') -const { InvalidArgumentError } = __nccwpck_require__(35990) -const Agent = __nccwpck_require__(73274) +const { InvalidArgumentError } = __nccwpck_require__(47926) +const Agent = __nccwpck_require__(1880) if (getGlobalDispatcher() === undefined) { setGlobalDispatcher(new Agent()) @@ -17140,7 +17277,7 @@ module.exports = { /***/ }), -/***/ 41738: +/***/ 59280: /***/ ((module) => { "use strict"; @@ -17192,16 +17329,16 @@ module.exports = class DecoratorHandler { /***/ }), -/***/ 64014: +/***/ 90008: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(50011) -const { kBodyUsed } = __nccwpck_require__(13638) +const util = __nccwpck_require__(31014) +const { kBodyUsed } = __nccwpck_require__(94822) const assert = __nccwpck_require__(98061) -const { InvalidArgumentError } = __nccwpck_require__(35990) +const { InvalidArgumentError } = __nccwpck_require__(47926) const EE = __nccwpck_require__(15673) const redirectableStatusCodes = [300, 301, 302, 303, 307, 308] @@ -17432,21 +17569,21 @@ module.exports = RedirectHandler /***/ }), -/***/ 64524: +/***/ 12671: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { kRetryHandlerDefaultRetry } = __nccwpck_require__(13638) -const { RequestRetryError } = __nccwpck_require__(35990) +const { kRetryHandlerDefaultRetry } = __nccwpck_require__(94822) +const { RequestRetryError } = __nccwpck_require__(47926) const { isDisturbed, parseHeaders, parseRangeHeader, wrapRequestBody -} = __nccwpck_require__(50011) +} = __nccwpck_require__(31014) function calculateRetryAfterHeader (retryAfter) { const current = Date.now() @@ -17643,7 +17780,10 @@ class RetryHandler { this.retryCount += 1 if (statusCode >= 300) { - if (this.retryOpts.statusCodes.includes(statusCode) === false) { + // Only expose a response if no earlier attempt has reached the caller. + // Otherwise abort this attempt so the error settles the existing body + // instead of replacing it with a new response. + if (!this.headersSent && this.retryOpts.statusCodes.includes(statusCode) === false) { this.headersSent = true this.checkpointResponseEnd(headers, resume) return this.handler.onHeaders( @@ -17874,15 +18014,15 @@ module.exports = RetryHandler /***/ }), -/***/ 20346: +/***/ 26290: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { isIP } = __nccwpck_require__(87503) const { lookup } = __nccwpck_require__(30604) -const DecoratorHandler = __nccwpck_require__(41738) -const { InvalidArgumentError, InformationalError } = __nccwpck_require__(35990) +const DecoratorHandler = __nccwpck_require__(59280) +const { InvalidArgumentError, InformationalError } = __nccwpck_require__(47926) const maxInt = Math.pow(2, 31) - 1 class DNSInstance { @@ -18257,15 +18397,15 @@ module.exports = interceptorOpts => { /***/ }), -/***/ 12493: +/***/ 9408: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(50011) -const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(35990) -const DecoratorHandler = __nccwpck_require__(41738) +const util = __nccwpck_require__(31014) +const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(47926) +const DecoratorHandler = __nccwpck_require__(59280) class DumpHandler extends DecoratorHandler { #maxSize = 1024 * 1024 @@ -18388,13 +18528,13 @@ module.exports = createDumpInterceptor /***/ }), -/***/ 40928: +/***/ 91467: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const RedirectHandler = __nccwpck_require__(64014) +const RedirectHandler = __nccwpck_require__(90008) function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { return (dispatch) => { @@ -18417,12 +18557,12 @@ module.exports = createRedirectInterceptor /***/ }), -/***/ 74872: +/***/ 42182: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const RedirectHandler = __nccwpck_require__(64014) +const RedirectHandler = __nccwpck_require__(90008) module.exports = opts => { const globalMaxRedirections = opts?.maxRedirections @@ -18449,12 +18589,12 @@ module.exports = opts => { /***/ }), -/***/ 79637: +/***/ 17389: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const RetryHandler = __nccwpck_require__(64524) +const RetryHandler = __nccwpck_require__(12671) module.exports = globalOpts => { return dispatch => { @@ -18476,14 +18616,14 @@ module.exports = globalOpts => { /***/ }), -/***/ 41721: +/***/ 27692: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; -const utils_1 = __nccwpck_require__(69573); +const utils_1 = __nccwpck_require__(5608); // C headers var ERROR; (function (ERROR) { @@ -18761,7 +18901,7 @@ exports.SPECIAL_HEADERS = { /***/ }), -/***/ 46081: +/***/ 84888: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -18774,7 +18914,7 @@ module.exports = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f3 /***/ }), -/***/ 97877: +/***/ 31445: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -18787,7 +18927,7 @@ module.exports = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f3 /***/ }), -/***/ 69573: +/***/ 5608: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -18809,14 +18949,14 @@ exports.enumToMap = enumToMap; /***/ }), -/***/ 46432: +/***/ 89937: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kClients } = __nccwpck_require__(13638) -const Agent = __nccwpck_require__(73274) +const { kClients } = __nccwpck_require__(94822) +const Agent = __nccwpck_require__(1880) const { kAgent, kMockAgentSet, @@ -18827,14 +18967,14 @@ const { kGetNetConnect, kOptions, kFactory -} = __nccwpck_require__(63822) -const MockClient = __nccwpck_require__(4227) -const MockPool = __nccwpck_require__(36575) -const { matchValue, buildMockOptions } = __nccwpck_require__(38053) -const { InvalidArgumentError, UndiciError } = __nccwpck_require__(35990) -const Dispatcher = __nccwpck_require__(66071) -const Pluralizer = __nccwpck_require__(97472) -const PendingInterceptorsFormatter = __nccwpck_require__(56155) +} = __nccwpck_require__(89083) +const MockClient = __nccwpck_require__(69636) +const MockPool = __nccwpck_require__(40660) +const { matchValue, buildMockOptions } = __nccwpck_require__(16826) +const { InvalidArgumentError, UndiciError } = __nccwpck_require__(47926) +const Dispatcher = __nccwpck_require__(32171) +const Pluralizer = __nccwpck_require__(69437) +const PendingInterceptorsFormatter = __nccwpck_require__(9965) class MockAgent extends Dispatcher { constructor (opts) { @@ -18977,15 +19117,15 @@ module.exports = MockAgent /***/ }), -/***/ 4227: +/***/ 69636: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { promisify } = __nccwpck_require__(47261) -const Client = __nccwpck_require__(85849) -const { buildMockDispatch } = __nccwpck_require__(38053) +const Client = __nccwpck_require__(6237) +const { buildMockDispatch } = __nccwpck_require__(16826) const { kDispatches, kMockAgent, @@ -18994,10 +19134,10 @@ const { kOrigin, kOriginalDispatch, kConnected -} = __nccwpck_require__(63822) -const { MockInterceptor } = __nccwpck_require__(9238) -const Symbols = __nccwpck_require__(13638) -const { InvalidArgumentError } = __nccwpck_require__(35990) +} = __nccwpck_require__(89083) +const { MockInterceptor } = __nccwpck_require__(73387) +const Symbols = __nccwpck_require__(94822) +const { InvalidArgumentError } = __nccwpck_require__(47926) /** * MockClient provides an API that extends the Client to influence the mockDispatches. @@ -19044,13 +19184,13 @@ module.exports = MockClient /***/ }), -/***/ 19329: +/***/ 33519: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { UndiciError } = __nccwpck_require__(35990) +const { UndiciError } = __nccwpck_require__(47926) const kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED') @@ -19080,13 +19220,13 @@ module.exports = { /***/ }), -/***/ 9238: +/***/ 73387: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(38053) +const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(16826) const { kDispatches, kDispatchKey, @@ -19094,9 +19234,9 @@ const { kDefaultTrailers, kContentLength, kMockDispatch -} = __nccwpck_require__(63822) -const { InvalidArgumentError } = __nccwpck_require__(35990) -const { buildURL } = __nccwpck_require__(50011) +} = __nccwpck_require__(89083) +const { InvalidArgumentError } = __nccwpck_require__(47926) +const { buildURL } = __nccwpck_require__(31014) /** * Defines the scope API for an interceptor reply @@ -19295,15 +19435,15 @@ module.exports.MockScope = MockScope /***/ }), -/***/ 36575: +/***/ 40660: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { promisify } = __nccwpck_require__(47261) -const Pool = __nccwpck_require__(80229) -const { buildMockDispatch } = __nccwpck_require__(38053) +const Pool = __nccwpck_require__(49771) +const { buildMockDispatch } = __nccwpck_require__(16826) const { kDispatches, kMockAgent, @@ -19312,10 +19452,10 @@ const { kOrigin, kOriginalDispatch, kConnected -} = __nccwpck_require__(63822) -const { MockInterceptor } = __nccwpck_require__(9238) -const Symbols = __nccwpck_require__(13638) -const { InvalidArgumentError } = __nccwpck_require__(35990) +} = __nccwpck_require__(89083) +const { MockInterceptor } = __nccwpck_require__(73387) +const Symbols = __nccwpck_require__(94822) +const { InvalidArgumentError } = __nccwpck_require__(47926) /** * MockPool provides an API that extends the Pool to influence the mockDispatches. @@ -19362,7 +19502,7 @@ module.exports = MockPool /***/ }), -/***/ 63822: +/***/ 89083: /***/ ((module) => { "use strict"; @@ -19393,21 +19533,21 @@ module.exports = { /***/ }), -/***/ 38053: +/***/ 16826: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { MockNotMatchedError } = __nccwpck_require__(19329) +const { MockNotMatchedError } = __nccwpck_require__(33519) const { kDispatches, kMockAgent, kOriginalDispatch, kOrigin, kGetNetConnect -} = __nccwpck_require__(63822) -const { buildURL } = __nccwpck_require__(50011) +} = __nccwpck_require__(89083) +const { buildURL } = __nccwpck_require__(31014) const { STATUS_CODES } = __nccwpck_require__(88849) const { types: { @@ -19768,7 +19908,7 @@ module.exports = { /***/ }), -/***/ 56155: +/***/ 9965: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -19819,7 +19959,7 @@ module.exports = class PendingInterceptorsFormatter { /***/ }), -/***/ 97472: +/***/ 69437: /***/ ((module) => { "use strict"; @@ -19856,7 +19996,7 @@ module.exports = class Pluralizer { /***/ }), -/***/ 77512: +/***/ 63125: /***/ ((module) => { "use strict"; @@ -20287,21 +20427,21 @@ module.exports = { /***/ }), -/***/ 12714: +/***/ 37917: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kConstruct } = __nccwpck_require__(50591) -const { urlEquals, getFieldValues } = __nccwpck_require__(99205) -const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(50011) -const { webidl } = __nccwpck_require__(2227) -const { Response, cloneResponse, fromInnerResponse } = __nccwpck_require__(51132) -const { Request, fromInnerRequest } = __nccwpck_require__(83211) -const { kState } = __nccwpck_require__(14935) -const { fetching } = __nccwpck_require__(78329) -const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(98730) +const { kConstruct } = __nccwpck_require__(275) +const { urlEquals, getFieldValues } = __nccwpck_require__(40424) +const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(31014) +const { webidl } = __nccwpck_require__(96163) +const { Response, cloneResponse, fromInnerResponse } = __nccwpck_require__(63042) +const { Request, fromInnerRequest } = __nccwpck_require__(11192) +const { kState } = __nccwpck_require__(23200) +const { fetching } = __nccwpck_require__(87321) +const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(40667) const assert = __nccwpck_require__(98061) /** @@ -21154,16 +21294,16 @@ module.exports = { /***/ }), -/***/ 11069: +/***/ 13256: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kConstruct } = __nccwpck_require__(50591) -const { Cache } = __nccwpck_require__(12714) -const { webidl } = __nccwpck_require__(2227) -const { kEnumerableProperty } = __nccwpck_require__(50011) +const { kConstruct } = __nccwpck_require__(275) +const { Cache } = __nccwpck_require__(37917) +const { webidl } = __nccwpck_require__(96163) +const { kEnumerableProperty } = __nccwpck_require__(31014) class CacheStorage { /** @@ -21314,28 +21454,28 @@ module.exports = { /***/ }), -/***/ 50591: +/***/ 275: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; module.exports = { - kConstruct: (__nccwpck_require__(13638).kConstruct) + kConstruct: (__nccwpck_require__(94822).kConstruct) } /***/ }), -/***/ 99205: +/***/ 40424: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(98061) -const { URLSerializer } = __nccwpck_require__(96730) -const { isValidHeaderName } = __nccwpck_require__(98730) +const { URLSerializer } = __nccwpck_require__(68889) +const { isValidHeaderName } = __nccwpck_require__(40667) /** * @see https://url.spec.whatwg.org/#concept-url-equals @@ -21380,7 +21520,7 @@ module.exports = { /***/ }), -/***/ 16155: +/***/ 40503: /***/ ((module) => { "use strict"; @@ -21400,16 +21540,16 @@ module.exports = { /***/ }), -/***/ 15855: +/***/ 84245: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { parseSetCookie } = __nccwpck_require__(80742) -const { stringify } = __nccwpck_require__(93989) -const { webidl } = __nccwpck_require__(2227) -const { Headers } = __nccwpck_require__(10561) +const { parseSetCookie } = __nccwpck_require__(89386) +const { stringify } = __nccwpck_require__(74600) +const { webidl } = __nccwpck_require__(96163) +const { Headers } = __nccwpck_require__(33924) /** * @typedef {Object} Cookie @@ -21592,15 +21732,15 @@ module.exports = { /***/ }), -/***/ 80742: +/***/ 89386: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(16155) -const { isCTLExcludingHtab } = __nccwpck_require__(93989) -const { collectASequenceOfCodePointsFast } = __nccwpck_require__(96730) +const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(40503) +const { isCTLExcludingHtab } = __nccwpck_require__(74600) +const { collectASequenceOfCodePointsFast } = __nccwpck_require__(68889) const assert = __nccwpck_require__(98061) /** @@ -21910,7 +22050,7 @@ module.exports = { /***/ }), -/***/ 93989: +/***/ 74600: /***/ ((module) => { "use strict"; @@ -22270,13 +22410,14 @@ module.exports = { /***/ }), -/***/ 41408: +/***/ 71054: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; +const buffer = __nccwpck_require__(72254) const { Transform } = __nccwpck_require__(84492) -const { isASCIINumber, isValidLastEventId } = __nccwpck_require__(19079) +const { isASCIINumber, isValidLastEventId } = __nccwpck_require__(97409) /** * @type {number[]} BOM @@ -22299,11 +22440,19 @@ const COLON = 0x3A */ const SPACE = 0x20 +const defaultMaxEventSize = buffer.kStringMaxLength + const DATA = Buffer.from('data') const EVENT = Buffer.from('event') const ID = Buffer.from('id') const RETRY = Buffer.from('retry') +// Each data field creates a string node, and each unconsumed input chunk keeps +// a Buffer wrapper. The absolute ceiling protects the large default byte limit. +const minParserItems = 1024 +const maxParserItems = 131072 +const bytesPerParserItem = 128 + function isASCIINumberBytes (buffer, start) { if (start >= buffer.length) { return false @@ -22342,6 +22491,12 @@ function isFieldName (line, length, field) { return true } +function createMaxEventSizeExceededError () { + const error = new Error('EventSource message size exceeded') + error.aborted = false + return error +} + /** * @typedef {object} EventSourceStreamEvent * @type {object} @@ -22390,6 +22545,13 @@ class EventSourceStream extends Transform { pos = 0 lineChunkIndex = 0 linePos = 0 + lineLength = 0 + eventSize = 0 + eventFieldSizes = { data: 0, event: 0, id: 0, retry: 0 } + dataLineCount = 0 + maxEventSize + maxDataLines + maxBufferedChunks event = { data: undefined, @@ -22400,6 +22562,7 @@ class EventSourceStream extends Transform { /** * @param {object} options + * @param {number} [options.maxEventSize] * @param {eventSourceSettings} options.eventSourceSettings * @param {Function} [options.push] */ @@ -22411,6 +22574,12 @@ class EventSourceStream extends Transform { super(options) this.state = options.eventSourceSettings || {} + this.maxEventSize = options.maxEventSize ?? defaultMaxEventSize + const parserItemLimit = this.maxEventSize > 0 + ? Math.min(maxParserItems, Math.max(minParserItems, Math.floor(this.maxEventSize / bytesPerParserItem))) + : 0 + this.maxDataLines = parserItemLimit + this.maxBufferedChunks = parserItemLimit if (options.push) { this.push = options.push } @@ -22428,6 +22597,14 @@ class EventSourceStream extends Transform { return } + // A leading line ending can immediately release the currently buffered + // line, even when it uses the final allowed chunk slot. + if (this.maxEventSize > 0 && + this.chunks.length >= this.maxBufferedChunks && + chunk[0] !== LF && chunk[0] !== CR) { + callback(createMaxEventSizeExceededError()) + return + } this.chunks.push(chunk) // Strip leading byte-order-mark if we opened the stream and started @@ -22506,7 +22683,12 @@ class EventSourceStream extends Transform { // In any case, we can process the line as we reached an // end-of-line character - this.parseLine(this.readLine(), this.event) + try { + this.parseLine(this.readLine(), this.event) + } catch (error) { + callback(error) + return + } this.consumeCurrentByte() // A line was processed and this could be the end of the event. We need // to check if the next line is empty to determine if the event is @@ -22515,15 +22697,28 @@ class EventSourceStream extends Transform { continue } + // readLine() is only called after CR or LF. Reject an unfinished line + // before it can retain an unbounded number of decoded chunks. The seven + // extra bytes allow the longest field prefix ("event: " or "retry: "). + if (this.maxEventSize > 0 && ++this.lineLength > this.maxEventSize + 7) { + callback(createMaxEventSizeExceededError()) + return + } this.advanceCursor() } callback() } + _destroy (error, callback) { + this.chunks.length = 0 + this.clearEvent() + super._destroy(error, callback) + } + /** * @param {Buffer} line - * @param {EventStreamEvent} event + * @param {EventSourceStreamEvent} event */ parseLine (line, event) { // If the line is empty (a blank line) @@ -22557,6 +22752,13 @@ class EventSourceStream extends Transform { } if (isFieldName(line, fieldLength, DATA)) { + if (this.maxEventSize > 0 && this.dataLineCount >= this.maxDataLines) { + throw createMaxEventSizeExceededError() + } + const valueBytes = line.length - valueStart + const dataSize = this.eventFieldSizes.data + (event.data === undefined ? 0 : 1) + valueBytes + this.setEventFieldSize('data', dataSize) + const value = line.toString('utf8', valueStart) if (event.data === undefined) { @@ -22564,11 +22766,13 @@ class EventSourceStream extends Transform { } else { event.data += `\n${value}` } + this.dataLineCount++ return } if (isFieldName(line, fieldLength, RETRY)) { if (isASCIINumberBytes(line, valueStart)) { + this.setEventFieldSize('retry', line.length - valueStart) event.retry = line.toString('utf8', valueStart) } return @@ -22576,20 +22780,29 @@ class EventSourceStream extends Transform { if (isFieldName(line, fieldLength, ID)) { if (isValidLastEventIdBytes(line, valueStart)) { + this.setEventFieldSize('id', line.length - valueStart) event.id = line.toString('utf8', valueStart) } return } if (isFieldName(line, fieldLength, EVENT)) { - const value = line.toString('utf8', valueStart) - - if (value.length > 0) { - event.event = value + if (valueStart < line.length) { + this.setEventFieldSize('event', line.length - valueStart) + event.event = line.toString('utf8', valueStart) } } } + setEventFieldSize (field, size) { + const eventSize = this.eventSize - this.eventFieldSizes[field] + size + if (this.maxEventSize > 0 && eventSize > this.maxEventSize) { + throw createMaxEventSizeExceededError() + } + this.eventSize = eventSize + this.eventFieldSizes[field] = size + } + /** * @param {EventSourceStreamEvent} event */ @@ -22620,6 +22833,12 @@ class EventSourceStream extends Transform { this.event.event = undefined this.event.id = undefined this.event.retry = undefined + this.eventSize = 0 + this.dataLineCount = 0 + this.eventFieldSizes.data = 0 + this.eventFieldSizes.event = 0 + this.eventFieldSizes.id = 0 + this.eventFieldSizes.retry = 0 } hasPendingEvent () { @@ -22655,14 +22874,16 @@ class EventSourceStream extends Transform { syncLineStartToCursor () { this.lineChunkIndex = this.chunkIndex this.linePos = this.pos + this.lineLength = 0 this.dropConsumedChunks() } dropConsumedChunks () { - while (this.lineChunkIndex > 0) { - this.chunks.shift() - this.lineChunkIndex-- - this.chunkIndex-- + if (this.lineChunkIndex > 0) { + const consumed = this.lineChunkIndex + this.chunks.splice(0, consumed) + this.lineChunkIndex = 0 + this.chunkIndex -= consumed } if (this.chunkIndex === this.chunks.length) { @@ -22771,23 +22992,24 @@ module.exports = { /***/ }), -/***/ 6731: +/***/ 74292: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { pipeline } = __nccwpck_require__(84492) -const { fetching } = __nccwpck_require__(78329) -const { makeRequest } = __nccwpck_require__(83211) -const { webidl } = __nccwpck_require__(2227) -const { EventSourceStream } = __nccwpck_require__(41408) -const { parseMIMEType } = __nccwpck_require__(96730) -const { createFastMessageEvent } = __nccwpck_require__(69459) -const { isNetworkError } = __nccwpck_require__(51132) -const { delay } = __nccwpck_require__(19079) -const { kEnumerableProperty } = __nccwpck_require__(50011) -const { environmentSettingsObject } = __nccwpck_require__(98730) +const { fetching } = __nccwpck_require__(87321) +const { makeRequest } = __nccwpck_require__(11192) +const { webidl } = __nccwpck_require__(96163) +const { EventSourceStream } = __nccwpck_require__(71054) +const { parseMIMEType } = __nccwpck_require__(68889) +const { createFastMessageEvent } = __nccwpck_require__(85021) +const { isNetworkError } = __nccwpck_require__(63042) +const { delay } = __nccwpck_require__(97409) +const { kEnumerableProperty } = __nccwpck_require__(31014) +const { environmentSettingsObject } = __nccwpck_require__(40667) +const { getGlobalDispatcher } = __nccwpck_require__(53139) let experimentalWarned = false @@ -23069,6 +23291,7 @@ class EventSource extends EventTarget { const eventSourceStream = new EventSourceStream({ eventSourceSettings: this.#state, + maxEventSize: this.#dispatcher.eventSourceOptions?.maxEventSize, push: (event) => { this.dispatchEvent(createFastMessageEvent( event.type, @@ -23247,7 +23470,8 @@ webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([ }, { key: 'dispatcher', // undici only - converter: webidl.converters.any + converter: webidl.converters.any, + defaultValue: () => getGlobalDispatcher() } ]) @@ -23259,7 +23483,7 @@ module.exports = { /***/ }), -/***/ 19079: +/***/ 97409: /***/ ((module) => { "use strict"; @@ -23304,13 +23528,13 @@ module.exports = { /***/ }), -/***/ 12749: +/***/ 48203: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(50011) +const util = __nccwpck_require__(31014) const { ReadableStreamFrom, isBlobLike, @@ -23320,16 +23544,16 @@ const { fullyReadBody, extractMimeType, utf8DecodeBytes -} = __nccwpck_require__(98730) -const { FormData } = __nccwpck_require__(62598) -const { kState } = __nccwpck_require__(14935) -const { webidl } = __nccwpck_require__(2227) +} = __nccwpck_require__(40667) +const { FormData } = __nccwpck_require__(59550) +const { kState } = __nccwpck_require__(23200) +const { webidl } = __nccwpck_require__(96163) const { Blob } = __nccwpck_require__(72254) const assert = __nccwpck_require__(98061) const { isErrored, isDisturbed } = __nccwpck_require__(84492) const { isArrayBuffer } = __nccwpck_require__(93746) -const { serializeAMimeType } = __nccwpck_require__(96730) -const { multipartFormDataParser } = __nccwpck_require__(25152) +const { serializeAMimeType } = __nccwpck_require__(68889) +const { multipartFormDataParser } = __nccwpck_require__(95600) let random try { @@ -23841,7 +24065,7 @@ module.exports = { /***/ }), -/***/ 54823: +/***/ 49316: /***/ ((module) => { "use strict"; @@ -23973,7 +24197,7 @@ module.exports = { /***/ }), -/***/ 96730: +/***/ 68889: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -24725,13 +24949,13 @@ module.exports = { /***/ }), -/***/ 61451: +/***/ 65895: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kConnected, kSize } = __nccwpck_require__(13638) +const { kConnected, kSize } = __nccwpck_require__(94822) class CompatWeakRef { constructor (value) { @@ -24779,15 +25003,15 @@ module.exports = function () { /***/ }), -/***/ 60027: +/***/ 5583: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { Blob, File } = __nccwpck_require__(72254) -const { kState } = __nccwpck_require__(14935) -const { webidl } = __nccwpck_require__(2227) +const { kState } = __nccwpck_require__(23200) +const { webidl } = __nccwpck_require__(96163) // TODO(@KhafraDev): remove class FileLike { @@ -24913,17 +25137,17 @@ module.exports = { FileLike, isFileLike } /***/ }), -/***/ 25152: +/***/ 95600: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { isUSVString, bufferToLowerCasedHeaderName } = __nccwpck_require__(50011) -const { utf8DecodeBytes } = __nccwpck_require__(98730) -const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = __nccwpck_require__(96730) -const { isFileLike } = __nccwpck_require__(60027) -const { makeEntry } = __nccwpck_require__(62598) +const { isUSVString, bufferToLowerCasedHeaderName } = __nccwpck_require__(31014) +const { utf8DecodeBytes } = __nccwpck_require__(40667) +const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = __nccwpck_require__(68889) +const { isFileLike } = __nccwpck_require__(5583) +const { makeEntry } = __nccwpck_require__(59550) const assert = __nccwpck_require__(98061) const { File: NodeFile } = __nccwpck_require__(72254) @@ -25395,17 +25619,17 @@ module.exports = { /***/ }), -/***/ 62598: +/***/ 59550: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { isBlobLike, iteratorMixin } = __nccwpck_require__(98730) -const { kState } = __nccwpck_require__(14935) -const { kEnumerableProperty } = __nccwpck_require__(50011) -const { FileLike, isFileLike } = __nccwpck_require__(60027) -const { webidl } = __nccwpck_require__(2227) +const { isBlobLike, iteratorMixin } = __nccwpck_require__(40667) +const { kState } = __nccwpck_require__(23200) +const { kEnumerableProperty } = __nccwpck_require__(31014) +const { FileLike, isFileLike } = __nccwpck_require__(5583) +const { webidl } = __nccwpck_require__(96163) const { File: NativeFile } = __nccwpck_require__(72254) const nodeUtil = __nccwpck_require__(47261) @@ -25655,7 +25879,7 @@ module.exports = { FormData, makeEntry } /***/ }), -/***/ 13924: +/***/ 22407: /***/ ((module) => { "use strict"; @@ -25703,7 +25927,7 @@ module.exports = { /***/ }), -/***/ 10561: +/***/ 33924: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -25711,14 +25935,14 @@ module.exports = { -const { kConstruct } = __nccwpck_require__(13638) -const { kEnumerableProperty } = __nccwpck_require__(50011) +const { kConstruct } = __nccwpck_require__(94822) +const { kEnumerableProperty } = __nccwpck_require__(31014) const { iteratorMixin, isValidHeaderName, isValidHeaderValue -} = __nccwpck_require__(98730) -const { webidl } = __nccwpck_require__(2227) +} = __nccwpck_require__(40667) +const { webidl } = __nccwpck_require__(96163) const assert = __nccwpck_require__(98061) const util = __nccwpck_require__(47261) @@ -26398,7 +26622,7 @@ module.exports = { /***/ }), -/***/ 78329: +/***/ 87321: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -26412,9 +26636,9 @@ const { filterResponse, makeResponse, fromInnerResponse -} = __nccwpck_require__(51132) -const { HeadersList } = __nccwpck_require__(10561) -const { Request, cloneRequest } = __nccwpck_require__(83211) +} = __nccwpck_require__(63042) +const { HeadersList } = __nccwpck_require__(33924) +const { Request, cloneRequest } = __nccwpck_require__(11192) const zlib = __nccwpck_require__(65628) const { bytesMatch, @@ -26450,23 +26674,23 @@ const { buildContentRange, createInflate, extractMimeType -} = __nccwpck_require__(98730) -const { kState, kDispatcher } = __nccwpck_require__(14935) +} = __nccwpck_require__(40667) +const { kState, kDispatcher } = __nccwpck_require__(23200) const assert = __nccwpck_require__(98061) -const { safelyExtractBody, extractBody } = __nccwpck_require__(12749) +const { safelyExtractBody, extractBody } = __nccwpck_require__(48203) const { redirectStatusSet, nullBodyStatus, safeMethodsSet, requestBodyHeader, subresourceSet -} = __nccwpck_require__(54823) +} = __nccwpck_require__(49316) const EE = __nccwpck_require__(15673) const { Readable, pipeline, finished } = __nccwpck_require__(84492) -const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = __nccwpck_require__(50011) -const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = __nccwpck_require__(96730) -const { getGlobalDispatcher } = __nccwpck_require__(19405) -const { webidl } = __nccwpck_require__(2227) +const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = __nccwpck_require__(31014) +const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = __nccwpck_require__(68889) +const { getGlobalDispatcher } = __nccwpck_require__(53139) +const { webidl } = __nccwpck_require__(96163) const { STATUS_CODES } = __nccwpck_require__(88849) const GET_OR_HEAD = ['GET', 'HEAD'] @@ -28354,8 +28578,10 @@ async function httpNetworkFetch ( // 19. Run these steps in parallel: // 1. Run these steps, but abort when fetchParams is canceled: - fetchParams.controller.onAborted = onAborted - fetchParams.controller.on('terminated', onAborted) + if (!fetchParams.controller.resume) { + fetchParams.controller.on('terminated', onAborted) + } + fetchParams.controller.resume = async () => { // 1. While true while (true) { @@ -28524,8 +28750,6 @@ async function httpNetworkFetch ( } location = headersList.get('location', true) - this.body = new Readable({ read: resume }) - const decoders = [] const willFollow = location && request.redirect === 'follow' && @@ -28543,7 +28767,7 @@ async function httpNetworkFetch ( // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206). const maxContentEncodings = 5 if (codings.length > maxContentEncodings) { - reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)) + this.abort(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)) return true } @@ -28576,6 +28800,8 @@ async function httpNetworkFetch ( } } + this.body = new Readable({ read: resume }) + const onError = this.onError.bind(this) resolve({ @@ -28622,10 +28848,6 @@ async function httpNetworkFetch ( fetchParams.controller.off('terminated', this.abort) } - if (fetchParams.controller.onAborted) { - fetchParams.controller.off('terminated', fetchParams.controller.onAborted) - } - fetchParams.controller.ended = true this.body.push(null) @@ -28678,7 +28900,7 @@ module.exports = { /***/ }), -/***/ 83211: +/***/ 11192: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -28686,16 +28908,16 @@ module.exports = { -const { extractBody, mixinBody, cloneBody, bodyUnusable } = __nccwpck_require__(12749) -const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = __nccwpck_require__(10561) -const { FinalizationRegistry } = __nccwpck_require__(61451)() -const util = __nccwpck_require__(50011) +const { extractBody, mixinBody, cloneBody, bodyUnusable } = __nccwpck_require__(48203) +const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = __nccwpck_require__(33924) +const { FinalizationRegistry } = __nccwpck_require__(65895)() +const util = __nccwpck_require__(31014) const nodeUtil = __nccwpck_require__(47261) const { isValidHTTPToken, sameOrigin, environmentSettingsObject -} = __nccwpck_require__(98730) +} = __nccwpck_require__(40667) const { forbiddenMethodsSet, corsSafeListedMethodsSet, @@ -28705,12 +28927,12 @@ const { requestCredentials, requestCache, requestDuplex -} = __nccwpck_require__(54823) +} = __nccwpck_require__(49316) const { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util -const { kHeaders, kSignal, kState, kDispatcher } = __nccwpck_require__(14935) -const { webidl } = __nccwpck_require__(2227) -const { URLSerializer } = __nccwpck_require__(96730) -const { kConstruct } = __nccwpck_require__(13638) +const { kHeaders, kSignal, kState, kDispatcher } = __nccwpck_require__(23200) +const { webidl } = __nccwpck_require__(96163) +const { URLSerializer } = __nccwpck_require__(68889) +const { kConstruct } = __nccwpck_require__(94822) const assert = __nccwpck_require__(98061) const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(15673) @@ -29723,15 +29945,15 @@ module.exports = { Request, makeRequest, fromInnerRequest, cloneRequest } /***/ }), -/***/ 51132: +/***/ 63042: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = __nccwpck_require__(10561) -const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = __nccwpck_require__(12749) -const util = __nccwpck_require__(50011) +const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = __nccwpck_require__(33924) +const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = __nccwpck_require__(48203) +const util = __nccwpck_require__(31014) const nodeUtil = __nccwpck_require__(47261) const { kEnumerableProperty } = util const { @@ -29743,16 +29965,16 @@ const { isErrorLike, isomorphicEncode, environmentSettingsObject: relevantRealm -} = __nccwpck_require__(98730) +} = __nccwpck_require__(40667) const { redirectStatusSet, nullBodyStatus -} = __nccwpck_require__(54823) -const { kState, kHeaders } = __nccwpck_require__(14935) -const { webidl } = __nccwpck_require__(2227) -const { FormData } = __nccwpck_require__(62598) -const { URLSerializer } = __nccwpck_require__(96730) -const { kConstruct } = __nccwpck_require__(13638) +} = __nccwpck_require__(49316) +const { kState, kHeaders } = __nccwpck_require__(23200) +const { webidl } = __nccwpck_require__(96163) +const { FormData } = __nccwpck_require__(59550) +const { URLSerializer } = __nccwpck_require__(68889) +const { kConstruct } = __nccwpck_require__(94822) const assert = __nccwpck_require__(98061) const { types } = __nccwpck_require__(47261) @@ -30341,7 +30563,7 @@ module.exports = { /***/ }), -/***/ 14935: +/***/ 23200: /***/ ((module) => { "use strict"; @@ -30358,7 +30580,7 @@ module.exports = { /***/ }), -/***/ 98730: +/***/ 40667: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -30366,14 +30588,14 @@ module.exports = { const { Transform } = __nccwpck_require__(84492) const zlib = __nccwpck_require__(65628) -const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = __nccwpck_require__(54823) -const { getGlobalOrigin } = __nccwpck_require__(13924) -const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = __nccwpck_require__(96730) +const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = __nccwpck_require__(49316) +const { getGlobalOrigin } = __nccwpck_require__(22407) +const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = __nccwpck_require__(68889) const { performance } = __nccwpck_require__(38846) -const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = __nccwpck_require__(50011) +const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = __nccwpck_require__(31014) const assert = __nccwpck_require__(98061) const { isUint8Array } = __nccwpck_require__(93746) -const { webidl } = __nccwpck_require__(2227) +const { webidl } = __nccwpck_require__(96163) let supportedHashes = [] @@ -31998,7 +32220,7 @@ module.exports = { /***/ }), -/***/ 2227: +/***/ 96163: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -32006,7 +32228,7 @@ module.exports = { const { types, inspect } = __nccwpck_require__(47261) const { markAsUncloneable } = __nccwpck_require__(24086) -const { toUSVString } = __nccwpck_require__(50011) +const { toUSVString } = __nccwpck_require__(31014) /** @type {import('../../../types/webidl').Webidl} */ const webidl = {} @@ -32701,7 +32923,7 @@ module.exports = { /***/ }), -/***/ 74973: +/***/ 73760: /***/ ((module) => { "use strict"; @@ -32999,7 +33221,7 @@ module.exports = { /***/ }), -/***/ 65153: +/***/ 62596: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -33009,16 +33231,16 @@ const { staticPropertyDescriptors, readOperation, fireAProgressEvent -} = __nccwpck_require__(24277) +} = __nccwpck_require__(86751) const { kState, kError, kResult, kEvents, kAborted -} = __nccwpck_require__(30010) -const { webidl } = __nccwpck_require__(2227) -const { kEnumerableProperty } = __nccwpck_require__(50011) +} = __nccwpck_require__(42047) +const { webidl } = __nccwpck_require__(96163) +const { kEnumerableProperty } = __nccwpck_require__(31014) class FileReader extends EventTarget { constructor () { @@ -33351,13 +33573,13 @@ module.exports = { /***/ }), -/***/ 53788: +/***/ 30183: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(2227) +const { webidl } = __nccwpck_require__(96163) const kState = Symbol('ProgressEvent state') @@ -33437,7 +33659,7 @@ module.exports = { /***/ }), -/***/ 30010: +/***/ 42047: /***/ ((module) => { "use strict"; @@ -33455,7 +33677,7 @@ module.exports = { /***/ }), -/***/ 24277: +/***/ 86751: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -33467,10 +33689,10 @@ const { kResult, kAborted, kLastProgressEventFired -} = __nccwpck_require__(30010) -const { ProgressEvent } = __nccwpck_require__(53788) -const { getEncoding } = __nccwpck_require__(74973) -const { serializeAMimeType, parseMIMEType } = __nccwpck_require__(96730) +} = __nccwpck_require__(42047) +const { ProgressEvent } = __nccwpck_require__(30183) +const { getEncoding } = __nccwpck_require__(73760) +const { serializeAMimeType, parseMIMEType } = __nccwpck_require__(68889) const { types } = __nccwpck_require__(47261) const { StringDecoder } = __nccwpck_require__(71576) const { btoa } = __nccwpck_require__(72254) @@ -33854,28 +34076,28 @@ module.exports = { /***/ }), -/***/ 17299: +/***/ 47524: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = __nccwpck_require__(44285) +const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = __nccwpck_require__(56004) const { kReadyState, kSentClose, kByteParser, kReceivedClose, kResponse -} = __nccwpck_require__(34939) -const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = __nccwpck_require__(93194) -const { channels } = __nccwpck_require__(65543) -const { CloseEvent } = __nccwpck_require__(69459) -const { makeRequest } = __nccwpck_require__(83211) -const { fetching } = __nccwpck_require__(78329) -const { Headers, getHeadersList } = __nccwpck_require__(10561) -const { getDecodeSplit } = __nccwpck_require__(98730) -const { WebsocketFrameSend } = __nccwpck_require__(84618) +} = __nccwpck_require__(23992) +const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = __nccwpck_require__(82487) +const { channels } = __nccwpck_require__(96005) +const { CloseEvent } = __nccwpck_require__(85021) +const { makeRequest } = __nccwpck_require__(11192) +const { fetching } = __nccwpck_require__(87321) +const { Headers, getHeadersList } = __nccwpck_require__(33924) +const { getDecodeSplit } = __nccwpck_require__(40667) +const { WebsocketFrameSend } = __nccwpck_require__(4712) /** @type {import('crypto')} */ let crypto @@ -34233,7 +34455,7 @@ module.exports = { /***/ }), -/***/ 44285: +/***/ 56004: /***/ ((module) => { "use strict"; @@ -34307,15 +34529,15 @@ module.exports = { /***/ }), -/***/ 69459: +/***/ 85021: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(2227) -const { kEnumerableProperty } = __nccwpck_require__(50011) -const { kConstruct } = __nccwpck_require__(13638) +const { webidl } = __nccwpck_require__(96163) +const { kEnumerableProperty } = __nccwpck_require__(31014) +const { kConstruct } = __nccwpck_require__(94822) const { MessagePort } = __nccwpck_require__(24086) /** @@ -34644,13 +34866,13 @@ module.exports = { /***/ }), -/***/ 84618: +/***/ 4712: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { maxUnsigned16Bit } = __nccwpck_require__(44285) +const { maxUnsigned16Bit } = __nccwpck_require__(56004) const BUFFER_SIZE = 16386 @@ -34748,15 +34970,15 @@ module.exports = { /***/ }), -/***/ 7133: +/***/ 93711: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { createInflateRaw, Z_DEFAULT_WINDOWBITS } = __nccwpck_require__(65628) -const { isValidClientWindowBits } = __nccwpck_require__(93194) -const { MessageSizeExceededError } = __nccwpck_require__(35990) +const { isValidClientWindowBits } = __nccwpck_require__(82487) +const { MessageSizeExceededError } = __nccwpck_require__(47926) const tail = Buffer.from([0x00, 0x00, 0xff, 0xff]) const kBuffer = Symbol('kBuffer') @@ -34861,7 +35083,7 @@ module.exports = { PerMessageDeflate } /***/ }), -/***/ 46080: +/***/ 44894: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; @@ -34869,9 +35091,9 @@ module.exports = { PerMessageDeflate } const { Writable } = __nccwpck_require__(84492) const assert = __nccwpck_require__(98061) -const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = __nccwpck_require__(44285) -const { kReadyState, kSentClose, kResponse, kReceivedClose } = __nccwpck_require__(34939) -const { channels } = __nccwpck_require__(65543) +const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = __nccwpck_require__(56004) +const { kReadyState, kSentClose, kResponse, kReceivedClose } = __nccwpck_require__(23992) +const { channels } = __nccwpck_require__(96005) const { isValidStatusCode, isValidOpcode, @@ -34881,11 +35103,11 @@ const { isControlFrame, isTextBinaryFrame, isContinuationFrame -} = __nccwpck_require__(93194) -const { WebsocketFrameSend } = __nccwpck_require__(84618) -const { closeWebSocketConnection } = __nccwpck_require__(17299) -const { PerMessageDeflate } = __nccwpck_require__(7133) -const { MessageSizeExceededError } = __nccwpck_require__(35990) +} = __nccwpck_require__(82487) +const { WebsocketFrameSend } = __nccwpck_require__(4712) +const { closeWebSocketConnection } = __nccwpck_require__(47524) +const { PerMessageDeflate } = __nccwpck_require__(93711) +const { MessageSizeExceededError } = __nccwpck_require__(47926) function failWebsocketConnectionWithCode (ws, code, reason) { closeWebSocketConnection(ws, code, reason, Buffer.byteLength(reason)) @@ -35116,6 +35338,20 @@ class ByteParser extends Writable { if (isControlFrame(this.#info.opcode)) { this.#loop = this.parseControlFrame(body) this.#state = parserStates.INFO + + // If the automatic PONG/CLOSE reply filled the socket's write buffer, + // stop parsing and resume on drain so a PING flood cannot grow the + // outbound queue without bound. + const socket = this.ws[kResponse].socket + if (this.#loop && socket.writableNeedDrain) { + this.#loop = false + socket.once('drain', () => { + if (this.destroyed) return + this.#loop = true + this.run(callback) + }) + return + } } else { if (!this.#info.compressed) { if (!this.writeFragments(body)) { @@ -35382,15 +35618,15 @@ module.exports = { /***/ }), -/***/ 26515: +/***/ 10243: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { WebsocketFrameSend } = __nccwpck_require__(84618) -const { opcodes, sendHints } = __nccwpck_require__(44285) -const FixedQueue = __nccwpck_require__(27092) +const { WebsocketFrameSend } = __nccwpck_require__(4712) +const { opcodes, sendHints } = __nccwpck_require__(56004) +const FixedQueue = __nccwpck_require__(94856) /** @type {typeof Uint8Array} */ const FastBuffer = Buffer[Symbol.species] @@ -35494,7 +35730,7 @@ module.exports = { SendQueue } /***/ }), -/***/ 34939: +/***/ 23992: /***/ ((module) => { "use strict"; @@ -35514,17 +35750,17 @@ module.exports = { /***/ }), -/***/ 93194: +/***/ 82487: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = __nccwpck_require__(34939) -const { states, opcodes } = __nccwpck_require__(44285) -const { ErrorEvent, createFastMessageEvent } = __nccwpck_require__(69459) +const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = __nccwpck_require__(23992) +const { states, opcodes } = __nccwpck_require__(56004) +const { ErrorEvent, createFastMessageEvent } = __nccwpck_require__(85021) const { isUtf8 } = __nccwpck_require__(72254) -const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = __nccwpck_require__(96730) +const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = __nccwpck_require__(68889) /* globals Blob */ @@ -35844,16 +36080,16 @@ module.exports = { /***/ }), -/***/ 16416: +/***/ 43590: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(2227) -const { URLSerializer } = __nccwpck_require__(96730) -const { environmentSettingsObject } = __nccwpck_require__(98730) -const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = __nccwpck_require__(44285) +const { webidl } = __nccwpck_require__(96163) +const { URLSerializer } = __nccwpck_require__(68889) +const { environmentSettingsObject } = __nccwpck_require__(40667) +const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = __nccwpck_require__(56004) const { kWebSocketURL, kReadyState, @@ -35862,21 +36098,21 @@ const { kResponse, kSentClose, kByteParser -} = __nccwpck_require__(34939) +} = __nccwpck_require__(23992) const { isConnecting, isEstablished, isClosing, isValidSubprotocol, fireEvent -} = __nccwpck_require__(93194) -const { establishWebSocketConnection, closeWebSocketConnection } = __nccwpck_require__(17299) -const { ByteParser } = __nccwpck_require__(46080) -const { kEnumerableProperty, isBlobLike } = __nccwpck_require__(50011) -const { getGlobalDispatcher } = __nccwpck_require__(19405) +} = __nccwpck_require__(82487) +const { establishWebSocketConnection, closeWebSocketConnection } = __nccwpck_require__(47524) +const { ByteParser } = __nccwpck_require__(44894) +const { kEnumerableProperty, isBlobLike } = __nccwpck_require__(31014) +const { getGlobalDispatcher } = __nccwpck_require__(53139) const { types } = __nccwpck_require__(47261) -const { ErrorEvent, CloseEvent } = __nccwpck_require__(69459) -const { SendQueue } = __nccwpck_require__(26515) +const { ErrorEvent, CloseEvent } = __nccwpck_require__(85021) +const { SendQueue } = __nccwpck_require__(10243) // https://websockets.spec.whatwg.org/#interface-definition class WebSocket extends EventTarget { @@ -62077,7 +62313,7 @@ async function resolveParentCommentBody(param, contextPorts) { /***/ }), -/***/ 37685: +/***/ 281: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -72957,7 +73193,7 @@ exports.BranchNameRepository = BranchNameRepository; /***/ }), -/***/ 54874: +/***/ 80742: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -73047,7 +73283,7 @@ function uniqueValidDependencies(candidates) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.BranchDependencyRepository = void 0; -const branch_dependency_policy_1 = __nccwpck_require__(54874); +const branch_dependency_policy_1 = __nccwpck_require__(80742); const OPEN_DEPENDENCIES_QUERY = ` query BranchSyncDependencies($owner: String!, $repo: String!, $issuesCursor: String, $pullsCursor: String) { repository(owner: $owner, name: $repo) { @@ -87141,7 +87377,7 @@ const check_changes_issue_size_use_case_1 = __nccwpck_require__(28356); const change_size_project_membership_composition_root_1 = __nccwpck_require__(99375); const bugbot_autofix_use_case_1 = __nccwpck_require__(45446); const detect_bugbot_fix_intent_use_case_1 = __nccwpck_require__(76234); -const dismiss_bugbot_findings_use_case_1 = __nccwpck_require__(37685); +const dismiss_bugbot_findings_use_case_1 = __nccwpck_require__(281); const remember_bugbot_rule_use_case_1 = __nccwpck_require__(17437); const detect_potential_problems_use_case_1 = __nccwpck_require__(6287); const notify_new_commit_on_issue_use_case_1 = __nccwpck_require__(33276); From 972023cff8ece814dd1cd3eb3a3efff43d23ef94 Mon Sep 17 00:00:00 2001 From: Efra Espada Date: Sun, 25 Oct 2026 05:49:03 +0100 Subject: [PATCH 3/3] bugfix-692-runtime-predecessor-queue-can-deadlock-per-pr-workflows-on-shared-runners: fully cover native coordination and queue boundaries --- build/cli/index.js | 3 +- build/github_action/index.js | 3 +- src/actions/__tests__/common_action.test.ts | 100 ++++++++++++++++++ .../native_workflow_coordination_policy.ts | 3 +- ...or_previous_workflow_runs_use_case.test.ts | 50 +++++++++ ..._workflow_polling_observer_adapter.test.ts | 10 ++ 6 files changed, 166 insertions(+), 3 deletions(-) diff --git a/build/cli/index.js b/build/cli/index.js index e54e4976e..bc1e7e6e4 100755 --- a/build/cli/index.js +++ b/build/cli/index.js @@ -44705,7 +44705,8 @@ function expectedNativeWorkflowGroup(query) { if (native.eventName === 'push' && native.ref?.startsWith('refs/heads/') && native.ref.length > 'refs/heads/'.length) return PUSH_GROUP; - if (!Number.isSafeInteger(native.pullRequestNumber) || (native.pullRequestNumber ?? 0) <= 0) + const pullRequestNumber = native.pullRequestNumber; + if (typeof pullRequestNumber !== 'number' || !Number.isSafeInteger(pullRequestNumber) || pullRequestNumber <= 0) return undefined; if (native.eventName === 'pull_request') return `${PR_GROUP}-analysis`; diff --git a/build/github_action/index.js b/build/github_action/index.js index fdef61464..333bc5dcc 100644 --- a/build/github_action/index.js +++ b/build/github_action/index.js @@ -46246,7 +46246,8 @@ function expectedNativeWorkflowGroup(query) { if (native.eventName === 'push' && native.ref?.startsWith('refs/heads/') && native.ref.length > 'refs/heads/'.length) return PUSH_GROUP; - if (!Number.isSafeInteger(native.pullRequestNumber) || (native.pullRequestNumber ?? 0) <= 0) + const pullRequestNumber = native.pullRequestNumber; + if (typeof pullRequestNumber !== 'number' || !Number.isSafeInteger(pullRequestNumber) || pullRequestNumber <= 0) return undefined; if (native.eventName === 'pull_request') return `${PR_GROUP}-analysis`; diff --git a/src/actions/__tests__/common_action.test.ts b/src/actions/__tests__/common_action.test.ts index a875915a8..3f000fa4f 100644 --- a/src/actions/__tests__/common_action.test.ts +++ b/src/actions/__tests__/common_action.test.ts @@ -22,6 +22,7 @@ import { Result } from '../../data/model/result'; import { logInfo } from '../../utils/logger'; import { readFileSync } from 'node:fs'; import { buildPreviousWorkflowRunsQuery } from '../main_run_lifecycle'; +import * as issueWorkflowRuntimePolicy from '../../domain/issue_workflow_runtime_policy'; import { WaitForPreviousWorkflowRunsUseCase } from '../../application/usecases/workflow/wait_for_previous_workflow_runs_use_case'; import { NativeWorkflowCoordinationRepository } from '../../data/repository/workflow/native_workflow_coordination_repository'; import { ActivePreviousWorkflowRunsRepository } from '../../data/repository/workflow/active_previous_workflow_runs_repository'; @@ -435,6 +436,40 @@ describe('mainRun', () => { expect(buildPreviousWorkflowRunsQuery(repository, { isSingleAction: true }).nativeCoordination).toBeUndefined(); }); + it('refuses admission before setup when pinned metadata lacks the workflow identity', async () => { + nativeRunEnvironment(); + delete process.env.GITHUB_WORKFLOW_REF; + delete process.env.GITHUB_EVENT_NAME; + + const query = buildPreviousWorkflowRunsQuery({ owner: 'org', repo: 'repo' }, { isSingleAction: false }); + expect(query.nativeCoordination).toMatchObject({ workflowRef: '', eventName: '' }); + expect(query.workflowIdentifier).toBeUndefined(); + await expect(runMain(mockExecution())).rejects.toThrow('GitHub workflow identifier is unavailable'); + expect(createWaitForPreviousWorkflowRunsUseCase).not.toHaveBeenCalled(); + expect(mockSetupExecutionInvoke).not.toHaveBeenCalled(); + }); + + it('retains the predecessor fence when runner metadata has no event name', async () => { + nativeRunEnvironment(); + delete process.env.GITHUB_EVENT_NAME; + const countActivePreviousRuns = jest.fn().mockResolvedValue(0); + const getContent = jest.fn(); + const clock = { nowMilliseconds: () => 0 }; + const native = new NativeWorkflowCoordinationRepository({ rest: { repos: { getContent } } }, { + clock, delayPort: { wait: jest.fn() }, random: { next: () => 0.5 }, + }); + mockWaitForPreviousWorkflowRunsInvoke.mockImplementation(query => + new WaitForPreviousWorkflowRunsUseCase({ countActivePreviousRuns }, { wait: jest.fn() }, { + noActivePreviousRuns: jest.fn(), waitingForPreviousRuns: jest.fn(), providerRetry: jest.fn(), + }, undefined, clock, undefined, native).invoke(query)); + + await runMain(mockExecution({ isPullRequest: true, inputs: { pull_request: { number: 21 } } })); + + expect(getContent).not.toHaveBeenCalled(); + expect(countActivePreviousRuns).toHaveBeenCalledTimes(1); + expect(mockSetupExecutionInvoke).toHaveBeenCalledTimes(1); + }); + it('does not queue the issue-comment single action so a failed queue gate can still report', async () => { process.env.GITHUB_ACTIONS = 'true'; delete process.env.GITHUB_RUN_ID; @@ -903,6 +938,71 @@ describe('mainRun', () => { expect(execution.labels.currentIssueLabels).toEqual(['state:ready']); }); + it.each([ + undefined, + { labels: ['state:ready'] }, + { target: { kind: 'issue', number: 42 } }, + ])('leaves label caches intact when activity returns no complete patch (%j)', async outcome => { + mockAgentActivityStart.mockResolvedValue(outcome); + mockAgentActivityFinish.mockResolvedValue(outcome); + const execution = mockExecution({ + eventName: 'push', isPush: true, commit: { commits: [{ id: 'commit-1' }] }, + ai: { + getAgentConfiguration: jest.fn(() => ({ model: 'model' })), + getPullRequestDescriptionMode: jest.fn(() => 'disabled'), + }, + }); + + await runMainWithActivity(execution); + + expect(mockAgentActivityStart).toHaveBeenCalledTimes(1); + expect(mockAgentActivityFinish).toHaveBeenCalledTimes(1); + expect(mockCommitInvoke).toHaveBeenCalledWith(execution); + expect(execution.labels.currentIssueLabels).toEqual([]); + expect(execution.labels.currentPullRequestLabels).toEqual([]); + }); + + it.each([ + ['in-progress', false], + ['deploy', false], + ['unrelated', true], + ])('blocks explicit disabled-work intent for %s while leaving unrelated callbacks idle', async (labelAdded, success) => { + const execution = mockExecution({ + eventName: 'issues', isIssue: true, + issue: { labeled: true, labelAdded }, + }); + execution.labels.deploy = 'deploy'; + mockSetupExecutionInvoke.mockImplementation(async context => configuredSetupResult( + context, { status: 'disabled', kind: 'feature' }, + )); + + const results = await runMain(execution); + + expect(results).toHaveLength(1); + expect(results[0]).toMatchObject({ id: 'IssueWorkflowAdmission', success, executed: false }); + expect(mockIssueInvoke).not.toHaveBeenCalled(); + }); + + it('renders a bounded fallback when an admission decision has no optional message', async () => { + const decision = jest.spyOn(issueWorkflowRuntimePolicy, 'decideIssueWorkflowRuntime') + .mockReturnValueOnce({ mode: 'noop' }); + try { + const results = await runMain(mockExecution()); + expect(results[0].steps).toEqual(['⏭️ Issue workflow admission stopped this run.']); + expect(mockIssueInvoke).not.toHaveBeenCalled(); + } finally { + decision.mockRestore(); + } + }); + + it('summarizes route results that omit optional step details', async () => { + const results = [{ id: 'push', success: true, executed: true }] as Result[]; + mockCommitInvoke.mockResolvedValue(results); + + expect(await runMain(mockExecution({ isPush: true }))).toEqual(results); + expect(logInfo).toHaveBeenCalledWith('Main run finished. Results: 1, total steps: 0.'); + }); + it.each(['help', 'status'])('dispatches deterministic %s without an agent activity mutation', async command => { const execution = mockExecution({ eventName: 'issue_comment', isIssue: true, diff --git a/src/application/policies/native_workflow_coordination_policy.ts b/src/application/policies/native_workflow_coordination_policy.ts index 4559c1290..338c09c51 100644 --- a/src/application/policies/native_workflow_coordination_policy.ts +++ b/src/application/policies/native_workflow_coordination_policy.ts @@ -15,7 +15,8 @@ export function expectedNativeWorkflowGroup(query: PreviousWorkflowRunsQuery): s if (native.eventName === 'push' && native.ref?.startsWith('refs/heads/') && native.ref.length > 'refs/heads/'.length) return PUSH_GROUP; - if (!Number.isSafeInteger(native.pullRequestNumber) || (native.pullRequestNumber ?? 0) <= 0) return undefined; + const pullRequestNumber = native.pullRequestNumber; + if (typeof pullRequestNumber !== 'number' || !Number.isSafeInteger(pullRequestNumber) || pullRequestNumber <= 0) return undefined; if (native.eventName === 'pull_request') return `${PR_GROUP}-analysis`; if (native.eventName === 'pull_request_review') return `${PR_GROUP}-review-state`; return undefined; diff --git a/src/application/usecases/workflow/__tests__/wait_for_previous_workflow_runs_use_case.test.ts b/src/application/usecases/workflow/__tests__/wait_for_previous_workflow_runs_use_case.test.ts index b4b79168a..04ce5eb46 100644 --- a/src/application/usecases/workflow/__tests__/wait_for_previous_workflow_runs_use_case.test.ts +++ b/src/application/usecases/workflow/__tests__/wait_for_previous_workflow_runs_use_case.test.ts @@ -29,6 +29,32 @@ function policy(overrides: Partial = {}): WorkflowPolling } describe('WaitForPreviousWorkflowRunsUseCase', () => { + afterEach(() => jest.restoreAllMocks()); + + it('uses the system clock and random source for bounded polling by default', async () => { + jest.spyOn(Date, 'now').mockReturnValue(1000); + const random = jest.spyOn(Math, 'random').mockReturnValue(0.5); + const predecessors = { countActivePreviousRuns: jest.fn().mockResolvedValueOnce(1).mockResolvedValue(0) }; + const delay = { wait: jest.fn().mockResolvedValue(undefined) }; + const observed = observer(); + + await new WaitForPreviousWorkflowRunsUseCase(predecessors, delay, observed).invoke(query); + + expect(predecessors.countActivePreviousRuns).toHaveBeenCalledWith(query, { deadlineAtMilliseconds: 5401000 }); + expect(delay.wait).toHaveBeenCalledWith(5000); + expect(random).toHaveBeenCalledTimes(1); + expect(observed.noActivePreviousRuns).toHaveBeenCalledTimes(1); + }); + + it('does not require a native-coordination observer to delegate safely', async () => { + const predecessors = { countActivePreviousRuns: jest.fn() }; + const delay = { wait: jest.fn() }; + await new WaitForPreviousWorkflowRunsUseCase(predecessors, delay, observer(), undefined, + { nowMilliseconds: () => 0 }, undefined, { isCoordinated: jest.fn().mockResolvedValue(true) }).invoke(query); + expect(predecessors.countActivePreviousRuns).not.toHaveBeenCalled(); + expect(delay.wait).not.toHaveBeenCalled(); + }); + it('delegates to proven native coordination without enumerating or waiting for queued predecessors', async () => { const predecessors = { countActivePreviousRuns: jest.fn().mockResolvedValue(1) }; const native = { isCoordinated: jest.fn().mockResolvedValue(true) }; @@ -188,4 +214,28 @@ describe('WaitForPreviousWorkflowRunsUseCase', () => { ).invoke(query)).rejects.toThrow('Timeout waiting for previous runs to finish.'); expect(queryPort.countActivePreviousRuns).not.toHaveBeenCalled(); }); + + it('does not start native proof when the queue deadline has already expired', async () => { + const queryPort = { countActivePreviousRuns: jest.fn() }; + const native = { isCoordinated: jest.fn() }; + await expect(new WaitForPreviousWorkflowRunsUseCase(queryPort, { wait: jest.fn() }, observer(), + policy({ maximumQueueWaitMilliseconds: 100 }), + { nowMilliseconds: jest.fn().mockReturnValueOnce(0).mockReturnValue(100) }, undefined, native, + ).invoke(query)).rejects.toThrow('Timeout waiting for previous runs to finish.'); + expect(native.isCoordinated).not.toHaveBeenCalled(); + expect(queryPort.countActivePreviousRuns).not.toHaveBeenCalled(); + }); + + it.each([0, 1])('rejects a provider result arriving at the deadline, even with %i predecessors', async active => { + let now = 0; + const queryPort = { countActivePreviousRuns: jest.fn(async () => { now = 100; return active; }) }; + const delay = { wait: jest.fn() }; + const observed = observer(); + await expect(new WaitForPreviousWorkflowRunsUseCase(queryPort, delay, observed, + policy({ maximumQueueWaitMilliseconds: 100 }), { nowMilliseconds: () => now }, + ).invoke(query)).rejects.toThrow('Timeout waiting for previous runs to finish.'); + expect(observed.noActivePreviousRuns).not.toHaveBeenCalled(); + expect(observed.waitingForPreviousRuns).not.toHaveBeenCalled(); + expect(delay.wait).not.toHaveBeenCalled(); + }); }); diff --git a/src/infrastructure/logging/__tests__/logger_workflow_polling_observer_adapter.test.ts b/src/infrastructure/logging/__tests__/logger_workflow_polling_observer_adapter.test.ts index e7d7a6ecc..1608b8d7b 100644 --- a/src/infrastructure/logging/__tests__/logger_workflow_polling_observer_adapter.test.ts +++ b/src/infrastructure/logging/__tests__/logger_workflow_polling_observer_adapter.test.ts @@ -22,4 +22,14 @@ describe('LoggerWorkflowPollingObserverAdapter', () => { '⏳ Found 2 previous run(s) still active. Waiting 2s...', ); }); + + it.each([ + { reason: 'transient' as const, attempt: 1, delayMilliseconds: 1000 }, + { reason: 'rate_limit' as const, attempt: 2, delayMilliseconds: 2000, resetEpochSeconds: 1700000000 }, + ])('reports bounded retry metadata for $reason', observation => { + new LoggerWorkflowPollingObserverAdapter().providerRetry(observation); + + expect(logDebugInfo).toHaveBeenCalledWith('GitHub workflow polling retry scheduled.', false, observation); + expect(logInfo).not.toHaveBeenCalled(); + }); });