msw 2.14.1 → 2.14.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1671,7 +1671,7 @@ Learn more about creating the Service Worker script: https://mswjs.io/docs/cli/i
1671
1671
  return registrationResult;
1672
1672
  };
1673
1673
 
1674
- // node_modules/.pnpm/rettime@0.11.7/node_modules/rettime/build/lens-list.mjs
1674
+ // node_modules/.pnpm/rettime@0.11.11/node_modules/rettime/build/lens-list.mjs
1675
1675
  var LensList = class {
1676
1676
  #list;
1677
1677
  #lens;
@@ -1713,15 +1713,17 @@ var LensList = class {
1713
1713
  }
1714
1714
  /**
1715
1715
  * Delete the value belonging to the given key.
1716
+ * Returns `true` if the value was present and removed, `false` otherwise.
1716
1717
  */
1717
1718
  delete(key, value) {
1718
- if (this.size === 0) return;
1719
- this.#list = this.#list.filter((item) => item[1] !== value);
1719
+ if (this.size === 0) return false;
1720
1720
  const values = this.#lens.get(key);
1721
- if (values) {
1722
- const index = values.indexOf(value);
1723
- if (index !== -1) values.splice(index, 1);
1724
- }
1721
+ if (!values) return false;
1722
+ const index = values.indexOf(value);
1723
+ if (index === -1) return false;
1724
+ values.splice(index, 1);
1725
+ this.#list.splice(this.#list.findIndex((item) => item[0] === key && item[1] === value), 1);
1726
+ return true;
1725
1727
  }
1726
1728
  /**
1727
1729
  * Delete all values belogning to the given key.
@@ -1744,7 +1746,7 @@ var LensList = class {
1744
1746
  }
1745
1747
  };
1746
1748
 
1747
- // node_modules/.pnpm/rettime@0.11.7/node_modules/rettime/build/index.mjs
1749
+ // node_modules/.pnpm/rettime@0.11.11/node_modules/rettime/build/index.mjs
1748
1750
  var kDefaultPrevented2 = Symbol("kDefaultPrevented");
1749
1751
  var kPropagationStopped = Symbol("kPropagationStopped");
1750
1752
  var kImmediatePropagationStopped = Symbol("kImmediatePropagationStopped");
@@ -1777,37 +1779,66 @@ var TypedEvent = class extends MessageEvent {
1777
1779
  var Emitter2 = class {
1778
1780
  #listeners;
1779
1781
  #listenerOptions;
1782
+ #listenerAbortCleanups;
1780
1783
  #typelessListeners;
1781
1784
  #hookListeners;
1782
1785
  #hookListenerOptions;
1786
+ #hookListenerAbortCleanups;
1783
1787
  hooks;
1784
1788
  constructor() {
1785
1789
  this.#listeners = new LensList();
1786
1790
  this.#listenerOptions = /* @__PURE__ */ new WeakMap();
1791
+ this.#listenerAbortCleanups = /* @__PURE__ */ new WeakMap();
1787
1792
  this.#typelessListeners = /* @__PURE__ */ new WeakSet();
1788
1793
  this.#hookListeners = new LensList();
1789
1794
  this.#hookListenerOptions = /* @__PURE__ */ new WeakMap();
1795
+ this.#hookListenerAbortCleanups = /* @__PURE__ */ new WeakMap();
1790
1796
  this.hooks = {
1791
1797
  on: (hook, callback, options) => {
1798
+ if (options?.signal?.aborted) return;
1792
1799
  if (options?.once) {
1793
1800
  const original = callback;
1794
1801
  const wrapper = ((...args) => {
1795
- this.#hookListeners.delete(hook, wrapper);
1802
+ this.#deleteHookListener(hook, wrapper);
1796
1803
  return original(...args);
1797
1804
  });
1798
1805
  callback = wrapper;
1799
1806
  }
1800
1807
  this.#hookListeners.append(hook, callback);
1801
1808
  if (options) this.#hookListenerOptions.set(callback, options);
1802
- if (options?.signal) options.signal.addEventListener("abort", () => {
1803
- this.#hookListeners.delete(hook, callback);
1804
- }, { once: true });
1809
+ if (options?.signal) {
1810
+ const { signal } = options;
1811
+ const onAbort = () => {
1812
+ this.#deleteHookListener(hook, callback);
1813
+ };
1814
+ signal.addEventListener("abort", onAbort, { once: true });
1815
+ this.#hookListenerAbortCleanups.set(callback, () => {
1816
+ signal.removeEventListener("abort", onAbort);
1817
+ });
1818
+ }
1805
1819
  },
1806
1820
  removeListener: (hook, callback) => {
1807
- this.#hookListeners.delete(hook, callback);
1821
+ this.#deleteHookListener(hook, callback);
1808
1822
  }
1809
1823
  };
1810
1824
  }
1825
+ #deleteHookListener(hook, callback) {
1826
+ this.#hookListeners.delete(hook, callback);
1827
+ const cleanup = this.#hookListenerAbortCleanups.get(callback);
1828
+ if (cleanup) {
1829
+ cleanup();
1830
+ this.#hookListenerAbortCleanups.delete(callback);
1831
+ }
1832
+ }
1833
+ #deleteListener(type, listener) {
1834
+ const removed = this.#listeners.delete(type, listener);
1835
+ const cleanup = this.#listenerAbortCleanups.get(listener);
1836
+ if (cleanup) {
1837
+ cleanup();
1838
+ this.#listenerAbortCleanups.delete(listener);
1839
+ }
1840
+ return removed;
1841
+ }
1811
1842
  /**
1812
1843
  * Adds a listener for the given event type.
1813
1844
  */
@@ -1909,8 +1940,8 @@ var Emitter2 = class {
1909
1940
  */
1910
1941
  removeListener(type, listener) {
1911
1942
  const options = this.#listenerOptions.get(listener);
1912
- this.#listeners.delete(type, listener);
1913
- for (const hook of this.#hookListeners.get("removeListener")) hook(type, listener, options);
1943
+ if (!this.#deleteListener(type, listener)) return;
1944
+ for (const hook of this.#hookListeners.get("removeListener").slice()) hook(type, listener, options);
1914
1945
  }
1915
1946
  /**
1916
1947
  * Removes all listeners for the given event type.
@@ -1918,11 +1949,12 @@ var Emitter2 = class {
1918
1949
  */
1919
1950
  removeAllListeners(type) {
1920
1951
  if (type == null) {
1921
- this.#listeners.clear();
1922
- for (const [hookType, hookListener] of this.#hookListeners) if (!this.#hookListenerOptions.get(hookListener)?.persist) this.#hookListeners.delete(hookType, hookListener);
1952
+ for (const [listenerType, listeners$1] of this.#listeners.entries()) while (listeners$1.length > 0) this.removeListener(listenerType, listeners$1[0]);
1953
+ for (const [hookType, hookListener] of [...this.#hookListeners]) if (!this.#hookListenerOptions.get(hookListener)?.persist) this.#deleteHookListener(hookType, hookListener);
1923
1954
  return;
1924
1955
  }
1925
- this.#listeners.deleteAll(type);
1956
+ const listeners = this.listeners(type);
1957
+ while (listeners.length > 0) this.removeListener(type, listeners[0]);
1926
1958
  }
1927
1959
  /**
1928
1960
  * Returns the list of listeners for the given event type.
@@ -1941,15 +1973,23 @@ var Emitter2 = class {
1941
1973
  return this.listeners(type).length;
1942
1974
  }
1943
1975
  #addListener(type, listener, options, insertMode = "append") {
1944
- for (const hook of this.#hookListeners.get("newListener")) hook(type, listener, options);
1976
+ if (options?.signal?.aborted) return;
1977
+ for (const hook of this.#hookListeners.get("newListener").slice()) hook(type, listener, options);
1945
1978
  if (type === "*") this.#typelessListeners.add(listener);
1946
1979
  if (insertMode === "prepend") this.#listeners.prepend(type, listener);
1947
1980
  else this.#listeners.append(type, listener);
1948
1981
  if (options) {
1949
1982
  this.#listenerOptions.set(listener, options);
1950
- if (options.signal) options.signal.addEventListener("abort", () => {
1951
- this.removeListener(type, listener);
1952
- }, { once: true });
1983
+ if (options.signal) {
1984
+ const { signal } = options;
1985
+ const onAbort = () => {
1986
+ this.removeListener(type, listener);
1987
+ };
1988
+ signal.addEventListener("abort", onAbort, { once: true });
1989
+ this.#listenerAbortCleanups.set(listener, () => {
1990
+ signal.removeEventListener("abort", onAbort);
1991
+ });
1992
+ }
1953
1993
  }
1954
1994
  }
1955
1995
  #proxyEvent(event) {
@@ -1966,22 +2006,27 @@ var Emitter2 = class {
1966
2006
  };
1967
2007
  }
1968
2008
  #callListener(event, listener) {
1969
- for (const hook of this.#hookListeners.get("beforeEmit")) if (hook(event) === false) return;
2009
+ for (const hook of this.#hookListeners.get("beforeEmit").slice()) if (hook(event) === false) return;
1970
2010
  const returnValue = listener.call(this, event);
1971
2011
  const options = this.#listenerOptions.get(listener);
1972
2012
  if (options?.once) {
1973
2013
  const type = this.#isTypelessListener(listener) ? "*" : event.type;
1974
- this.#listeners.delete(type, listener);
1975
- for (const hook of this.#hookListeners.get("removeListener")) hook(type, listener, options);
2014
+ if (this.#deleteListener(type, listener)) for (const hook of this.#hookListeners.get("removeListener").slice()) hook(type, listener, options);
1976
2015
  }
1977
2016
  return returnValue;
1978
2017
  }
1979
2018
  /**
1980
2019
  * Return a list of all event listeners relevant for the given event type.
1981
2020
  * This includes the explicit event listeners and also typeless event listeners.
2021
+ *
2022
+ * @note Snapshot the matching listeners before yielding. Listeners can add or
2023
+ * remove other listeners during emission (e.g. `earlyOn` unshifts `#list`),
2024
+ * which would otherwise shift the live iterator and re-yield prior entries.
1982
2025
  */
1983
2026
  *#matchListeners(type) {
1984
- for (const [key, listener] of this.#listeners) if (key === "*" || key === type) yield listener;
2027
+ const snapshot = [];
2028
+ for (const [key, listener] of this.#listeners) if (key === "*" || key === type) snapshot.push(listener);
2029
+ yield* snapshot;
1985
2030
  }
1986
2031
  #isTypelessListener(listener) {
1987
2032
  return this.#typelessListeners.has(listener);
@@ -2295,11 +2340,12 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
2295
2340
  }
2296
2341
  async #handleResponse(event) {
2297
2342
  const { request, response, isMockedResponse } = event.data;
2343
+ const frame = this.#frames.get(request.id);
2298
2344
  if (response.type?.includes("opaque")) {
2299
2345
  this.#frames.delete(request.id);
2346
+ frame?.events.removeAllListeners();
2300
2347
  return;
2301
2348
  }
2302
- const frame = this.#frames.get(request.id);
2303
2349
  this.#frames.delete(request.id);
2304
2350
  if (frame == null) {
2305
2351
  return;
@@ -2323,17 +2369,21 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
2323
2369
  url: request.url
2324
2370
  }
2325
2371
  );
2326
- frame.events.emit(
2327
- new import_http_frame.ResponseEvent(
2328
- isMockedResponse ? "response:mocked" : "response:bypass",
2329
- {
2330
- requestId: frame.data.id,
2331
- request: fetchRequest,
2332
- response: fetchResponse,
2333
- isMockedResponse
2334
- }
2335
- )
2336
- );
2372
+ try {
2373
+ frame.events.emit(
2374
+ new import_http_frame.ResponseEvent(
2375
+ isMockedResponse ? "response:mocked" : "response:bypass",
2376
+ {
2377
+ requestId: frame.data.id,
2378
+ request: fetchRequest,
2379
+ response: fetchResponse,
2380
+ isMockedResponse
2381
+ }
2382
+ )
2383
+ );
2384
+ } finally {
2385
+ frame.events.removeAllListeners();
2386
+ }
2337
2387
  }
2338
2388
  #defaultFindWorker = (workerUrl, mockServiceWorkerUrl) => {
2339
2389
  return workerUrl === mockServiceWorkerUrl;