From 6745d481accb2fc40a1abdd5c4fd78b74d6e699d Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Wed, 6 Apr 2022 16:37:16 -0400 Subject: [PATCH 1/9] Add fallback shim for AbortController --- .../ReactDOMFizzServerBrowser-test.js | 1 - .../src/ReactAbortController.js | 138 ++++++++++++++++++ .../src/ReactFiberCacheComponent.new.js | 1 + .../src/ReactFiberCacheComponent.old.js | 1 + scripts/jest/setupEnvironment.js | 4 - 5 files changed, 140 insertions(+), 5 deletions(-) create mode 100644 packages/react-reconciler/src/ReactAbortController.js diff --git a/packages/react-dom/src/__tests__/ReactDOMFizzServerBrowser-test.js b/packages/react-dom/src/__tests__/ReactDOMFizzServerBrowser-test.js index 278a15306017..792b9611f29f 100644 --- a/packages/react-dom/src/__tests__/ReactDOMFizzServerBrowser-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMFizzServerBrowser-test.js @@ -12,7 +12,6 @@ // Polyfills for test environment global.ReadableStream = require('web-streams-polyfill/ponyfill/es6').ReadableStream; global.TextEncoder = require('util').TextEncoder; -global.AbortController = require('abort-controller'); let React; let ReactDOMFizzServer; diff --git a/packages/react-reconciler/src/ReactAbortController.js b/packages/react-reconciler/src/ReactAbortController.js new file mode 100644 index 000000000000..581e77bfbc46 --- /dev/null +++ b/packages/react-reconciler/src/ReactAbortController.js @@ -0,0 +1,138 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + */ + +import {enableCache} from 'shared/ReactFeatureFlags'; + +const PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + +const signals: Map< + AbortControllerShim, + AbortSignalShim, +> = (new PossiblyWeakMap(): any); + +const abortedFlags: Map< + AbortSignalShim, + boolean, +> = (new PossiblyWeakMap(): any); + +type Listener = { + listener: any => void, + next: Listener | null, +}; + +const listenersMap: Map< + AbortSignalShim, + Map, +> = (new PossiblyWeakMap(): any); + +function getListeners(target): Map { + const listeners = listenersMap.get(target); + if (listeners == null) { + // eslint-disable-next-line react-internal/prod-error-codes + throw new Error( + 'Listeners should already be registered. This is a bug in React.', + ); + } + return listeners; +} + +class AbortSignalShim { + constructor() { + listenersMap.set(this, new Map()); + } + get aborted() { + return !!abortedFlags.get(this); + } + + addEventListener(type, listener) { + const listeners = getListeners(this); + let node = listeners.get(type); + + const newNode = {listener, next: null}; + if (node === undefined) { + listeners.set(type, newNode); + return; + } + + let prev = null; + while (node != null) { + prev = node; + node = node.next; + } + if (prev != null) { + prev.next = newNode; + } + } + + removeEventListener(eventName, listener) { + const listeners = getListeners(this); + let node = listeners.get(eventName); + + let prev = null; + while (node != null) { + if (node.listener === listener) { + if (prev !== null) { + prev.next = node.next; + } else if (node.next !== null) { + listeners.set(eventName, node.next); + } else { + listeners.delete(eventName); + } + return; + } + + prev = node; + node = node.next; + } + } + + dispatchEvent(event) { + const listeners = getListeners(this); + let node = listeners.get(event.type); + while (node != null) { + node.listener(event); + node = node.next; + } + } +} + +class AbortControllerShim { + constructor() { + const signal = new AbortSignalShim(); + abortedFlags.set(signal, false); + signals.set(this, signal); + } + + get signal() { + return signals.get(this); + } + + abort() { + const signal = signals.get(this); + if (signal == null) { + // eslint-disable-next-line react-internal/prod-error-codes + throw new Error( + 'Aborted signal was not registered. This is a bug in React.', + ); + } + if (abortedFlags.get(signal) !== false) { + return; + } + abortedFlags.set(signal, true); + signal.dispatchEvent({type: 'abort'}); + } +} + +// In environments without AbortController (e.g. tests) +// replace it with a lightweight shim that only has the features we use. +export default enableCache + ? typeof AbortController !== 'undefined' + ? AbortController + : (AbortControllerShim: AbortController) + : (null: any); diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.new.js b/packages/react-reconciler/src/ReactFiberCacheComponent.new.js index 67588c3219a9..fc2b232d47ff 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.new.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.new.js @@ -11,6 +11,7 @@ import type {ReactContext} from 'shared/ReactTypes'; import {enableCache} from 'shared/ReactFeatureFlags'; import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols'; +import AbortController from './ReactAbortController'; import {pushProvider, popProvider} from './ReactFiberNewContext.new'; import * as Scheduler from 'scheduler'; diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.old.js b/packages/react-reconciler/src/ReactFiberCacheComponent.old.js index e530619d4166..0b76584629c3 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.old.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.old.js @@ -11,6 +11,7 @@ import type {ReactContext} from 'shared/ReactTypes'; import {enableCache} from 'shared/ReactFeatureFlags'; import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols'; +import AbortController from './ReactAbortController'; import {pushProvider, popProvider} from './ReactFiberNewContext.old'; import * as Scheduler from 'scheduler'; diff --git a/scripts/jest/setupEnvironment.js b/scripts/jest/setupEnvironment.js index d2d510088c45..2ba88b156169 100644 --- a/scripts/jest/setupEnvironment.js +++ b/scripts/jest/setupEnvironment.js @@ -1,7 +1,5 @@ /* eslint-disable */ -const AbortController = require('abort-controller'); - const NODE_ENV = process.env.NODE_ENV; if (NODE_ENV !== 'development' && NODE_ENV !== 'production') { throw new Error('NODE_ENV must either be set to development or production.'); @@ -23,8 +21,6 @@ global.__EXPERIMENTAL__ = global.__VARIANT__ = !!process.env.VARIANT; -global.AbortController = AbortController; - if (typeof window !== 'undefined') { global.requestIdleCallback = function(callback) { return setTimeout(() => { From fc32cffc6dd72a84521072a8be8d0ddb7cdb6dee Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Thu, 7 Apr 2022 13:50:19 -0400 Subject: [PATCH 2/9] Replace shim with a minimal stub --- .../src/ReactAbortController.js | 138 ------------------ .../src/ReactFiberCacheComponent.new.js | 27 +++- 2 files changed, 24 insertions(+), 141 deletions(-) delete mode 100644 packages/react-reconciler/src/ReactAbortController.js diff --git a/packages/react-reconciler/src/ReactAbortController.js b/packages/react-reconciler/src/ReactAbortController.js deleted file mode 100644 index 581e77bfbc46..000000000000 --- a/packages/react-reconciler/src/ReactAbortController.js +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @flow - */ - -import {enableCache} from 'shared/ReactFeatureFlags'; - -const PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; - -const signals: Map< - AbortControllerShim, - AbortSignalShim, -> = (new PossiblyWeakMap(): any); - -const abortedFlags: Map< - AbortSignalShim, - boolean, -> = (new PossiblyWeakMap(): any); - -type Listener = { - listener: any => void, - next: Listener | null, -}; - -const listenersMap: Map< - AbortSignalShim, - Map, -> = (new PossiblyWeakMap(): any); - -function getListeners(target): Map { - const listeners = listenersMap.get(target); - if (listeners == null) { - // eslint-disable-next-line react-internal/prod-error-codes - throw new Error( - 'Listeners should already be registered. This is a bug in React.', - ); - } - return listeners; -} - -class AbortSignalShim { - constructor() { - listenersMap.set(this, new Map()); - } - get aborted() { - return !!abortedFlags.get(this); - } - - addEventListener(type, listener) { - const listeners = getListeners(this); - let node = listeners.get(type); - - const newNode = {listener, next: null}; - if (node === undefined) { - listeners.set(type, newNode); - return; - } - - let prev = null; - while (node != null) { - prev = node; - node = node.next; - } - if (prev != null) { - prev.next = newNode; - } - } - - removeEventListener(eventName, listener) { - const listeners = getListeners(this); - let node = listeners.get(eventName); - - let prev = null; - while (node != null) { - if (node.listener === listener) { - if (prev !== null) { - prev.next = node.next; - } else if (node.next !== null) { - listeners.set(eventName, node.next); - } else { - listeners.delete(eventName); - } - return; - } - - prev = node; - node = node.next; - } - } - - dispatchEvent(event) { - const listeners = getListeners(this); - let node = listeners.get(event.type); - while (node != null) { - node.listener(event); - node = node.next; - } - } -} - -class AbortControllerShim { - constructor() { - const signal = new AbortSignalShim(); - abortedFlags.set(signal, false); - signals.set(this, signal); - } - - get signal() { - return signals.get(this); - } - - abort() { - const signal = signals.get(this); - if (signal == null) { - // eslint-disable-next-line react-internal/prod-error-codes - throw new Error( - 'Aborted signal was not registered. This is a bug in React.', - ); - } - if (abortedFlags.get(signal) !== false) { - return; - } - abortedFlags.set(signal, true); - signal.dispatchEvent({type: 'abort'}); - } -} - -// In environments without AbortController (e.g. tests) -// replace it with a lightweight shim that only has the features we use. -export default enableCache - ? typeof AbortController !== 'undefined' - ? AbortController - : (AbortControllerShim: AbortController) - : (null: any); diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.new.js b/packages/react-reconciler/src/ReactFiberCacheComponent.new.js index fc2b232d47ff..993b8ef0b77f 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.new.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.new.js @@ -11,13 +11,34 @@ import type {ReactContext} from 'shared/ReactTypes'; import {enableCache} from 'shared/ReactFeatureFlags'; import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols'; -import AbortController from './ReactAbortController'; import {pushProvider, popProvider} from './ReactFiberNewContext.new'; import * as Scheduler from 'scheduler'; +// In environments without AbortController (e.g. tests) +// replace it with a lightweight shim that only has the features we use. +const AbortControllerLocal = enableCache + ? typeof AbortController !== 'undefined' + ? AbortController + : (function AbortControllerShim() { + this.listeners = []; + this.signal = { + aborted: false, + }; + + this.signal.addEventListener = (type, listener) => { + this.listeners.push(listener); + }; + + this.abort = () => { + this.signal.aborted = true; + this.listeners.forEach(listener => listener()); + }; + }: AbortController) + : (null: any); + export type Cache = {| - controller: AbortController, + controller: AbortControllerLocal, data: Map<() => mixed, mixed>, refCount: number, |}; @@ -67,7 +88,7 @@ export function createCache(): Cache { return (null: any); } const cache: Cache = { - controller: new AbortController(), + controller: new AbortControllerLocal(), data: new Map(), refCount: 0, }; From 514ab3e20d7c05f6685ed8e1a62644cb78608a12 Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Thu, 7 Apr 2022 14:01:06 -0400 Subject: [PATCH 3/9] replace-fork --- .../src/ReactFiberCacheComponent.old.js | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.old.js b/packages/react-reconciler/src/ReactFiberCacheComponent.old.js index 0b76584629c3..f9fed8a1bb6f 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.old.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.old.js @@ -11,13 +11,34 @@ import type {ReactContext} from 'shared/ReactTypes'; import {enableCache} from 'shared/ReactFeatureFlags'; import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols'; -import AbortController from './ReactAbortController'; import {pushProvider, popProvider} from './ReactFiberNewContext.old'; import * as Scheduler from 'scheduler'; +// In environments without AbortController (e.g. tests) +// replace it with a lightweight shim that only has the features we use. +const AbortControllerLocal = enableCache + ? typeof AbortController !== 'undefined' + ? AbortController + : (function AbortControllerShim() { + this.listeners = []; + this.signal = { + aborted: false, + }; + + this.signal.addEventListener = (type, listener) => { + this.listeners.push(listener); + }; + + this.abort = () => { + this.signal.aborted = true; + this.listeners.forEach(listener => listener()); + }; + }: AbortController) + : (null: any); + export type Cache = {| - controller: AbortController, + controller: AbortControllerLocal, data: Map<() => mixed, mixed>, refCount: number, |}; @@ -67,7 +88,7 @@ export function createCache(): Cache { return (null: any); } const cache: Cache = { - controller: new AbortController(), + controller: new AbortControllerLocal(), data: new Map(), refCount: 0, }; From 6cb52c82e8f9d9d54c34b69eb20a553439c44d26 Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Thu, 7 Apr 2022 14:53:11 -0400 Subject: [PATCH 4/9] Better minification --- .../src/ReactFiberCacheComponent.new.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.new.js b/packages/react-reconciler/src/ReactFiberCacheComponent.new.js index 993b8ef0b77f..69a70bbcd597 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.new.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.new.js @@ -21,18 +21,18 @@ const AbortControllerLocal = enableCache ? typeof AbortController !== 'undefined' ? AbortController : (function AbortControllerShim() { - this.listeners = []; - this.signal = { + const listeners = (this.listeners = []); + const signal = (this.signal = { aborted: false, - }; + }); - this.signal.addEventListener = (type, listener) => { - this.listeners.push(listener); + signal.addEventListener = (type, listener) => { + listeners.push(listener); }; this.abort = () => { - this.signal.aborted = true; - this.listeners.forEach(listener => listener()); + signal.aborted = true; + listeners.forEach(listener => listener()); }; }: AbortController) : (null: any); From 8d50df66f9f6ab6d12ca8de2a4aa172b6a5567ea Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Thu, 7 Apr 2022 14:57:56 -0400 Subject: [PATCH 5/9] Fix flow --- .../src/ReactFiberCacheComponent.new.js | 7 +++---- .../src/ReactFiberCacheComponent.old.js | 17 ++++++++--------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.new.js b/packages/react-reconciler/src/ReactFiberCacheComponent.new.js index 69a70bbcd597..9b18de197636 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.new.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.new.js @@ -24,12 +24,11 @@ const AbortControllerLocal = enableCache const listeners = (this.listeners = []); const signal = (this.signal = { aborted: false, + addEventListener: (type, listener) => { + listeners.push(listener); + }, }); - signal.addEventListener = (type, listener) => { - listeners.push(listener); - }; - this.abort = () => { signal.aborted = true; listeners.forEach(listener => listener()); diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.old.js b/packages/react-reconciler/src/ReactFiberCacheComponent.old.js index f9fed8a1bb6f..47f6eaefa8c2 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.old.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.old.js @@ -21,18 +21,17 @@ const AbortControllerLocal = enableCache ? typeof AbortController !== 'undefined' ? AbortController : (function AbortControllerShim() { - this.listeners = []; - this.signal = { + const listeners = (this.listeners = []); + const signal = (this.signal = { aborted: false, - }; - - this.signal.addEventListener = (type, listener) => { - this.listeners.push(listener); - }; + addEventListener: (type, listener) => { + listeners.push(listener); + }, + }); this.abort = () => { - this.signal.aborted = true; - this.listeners.forEach(listener => listener()); + signal.aborted = true; + listeners.forEach(listener => listener()); }; }: AbortController) : (null: any); From 5b6f406a8d7182d4d2a3ebb14af908e87120d427 Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Fri, 8 Apr 2022 11:15:17 -0400 Subject: [PATCH 6/9] Even smaller --- .../src/ReactFiberCacheComponent.new.js | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.new.js b/packages/react-reconciler/src/ReactFiberCacheComponent.new.js index 9b18de197636..78e24420acb8 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.new.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.new.js @@ -15,29 +15,33 @@ import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols'; import {pushProvider, popProvider} from './ReactFiberNewContext.new'; import * as Scheduler from 'scheduler'; -// In environments without AbortController (e.g. tests) +function createFallbackController() { + const listeners = []; + const signal = { + aborted: false, + addEventListener(type, listener) { + listeners.push(listener); + }, + }; + return { + signal, + abort() { + signal.aborted = true; + listeners.forEach(listener => listener()); + }, + }; +} + +// In environments without AbortController (e.g. tests in Node < 16) // replace it with a lightweight shim that only has the features we use. -const AbortControllerLocal = enableCache +const createController: () => AbortController = enableCache ? typeof AbortController !== 'undefined' - ? AbortController - : (function AbortControllerShim() { - const listeners = (this.listeners = []); - const signal = (this.signal = { - aborted: false, - addEventListener: (type, listener) => { - listeners.push(listener); - }, - }); - - this.abort = () => { - signal.aborted = true; - listeners.forEach(listener => listener()); - }; - }: AbortController) + ? () => new AbortController() + : (createFallbackController: any) : (null: any); export type Cache = {| - controller: AbortControllerLocal, + controller: AbortController, data: Map<() => mixed, mixed>, refCount: number, |}; @@ -87,7 +91,7 @@ export function createCache(): Cache { return (null: any); } const cache: Cache = { - controller: new AbortControllerLocal(), + controller: createController(), data: new Map(), refCount: 0, }; From d038e296c0a9fd210178bb925165a5fe26dce799 Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Fri, 8 Apr 2022 11:37:32 -0400 Subject: [PATCH 7/9] replace-fork --- .../src/ReactFiberCacheComponent.old.js | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.old.js b/packages/react-reconciler/src/ReactFiberCacheComponent.old.js index 47f6eaefa8c2..27dc50247dfa 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.old.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.old.js @@ -15,29 +15,33 @@ import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols'; import {pushProvider, popProvider} from './ReactFiberNewContext.old'; import * as Scheduler from 'scheduler'; -// In environments without AbortController (e.g. tests) +function createFallbackController() { + const listeners = []; + const signal = { + aborted: false, + addEventListener(type, listener) { + listeners.push(listener); + }, + }; + return { + signal, + abort() { + signal.aborted = true; + listeners.forEach(listener => listener()); + }, + }; +} + +// In environments without AbortController (e.g. tests in Node < 16) // replace it with a lightweight shim that only has the features we use. -const AbortControllerLocal = enableCache +const createController: () => AbortController = enableCache ? typeof AbortController !== 'undefined' - ? AbortController - : (function AbortControllerShim() { - const listeners = (this.listeners = []); - const signal = (this.signal = { - aborted: false, - addEventListener: (type, listener) => { - listeners.push(listener); - }, - }); - - this.abort = () => { - signal.aborted = true; - listeners.forEach(listener => listener()); - }; - }: AbortController) + ? () => new AbortController() + : (createFallbackController: any) : (null: any); export type Cache = {| - controller: AbortControllerLocal, + controller: AbortController, data: Map<() => mixed, mixed>, refCount: number, |}; @@ -87,7 +91,7 @@ export function createCache(): Cache { return (null: any); } const cache: Cache = { - controller: new AbortControllerLocal(), + controller: createController(), data: new Map(), refCount: 0, }; From 492474ba88faf1aeb01ca1d9b8967896dfe39b52 Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Fri, 8 Apr 2022 13:51:12 -0400 Subject: [PATCH 8/9] Revert back to object constructor --- .../src/ReactFiberCacheComponent.new.js | 42 +++++++++---------- .../src/ReactFiberCacheComponent.old.js | 42 +++++++++---------- 2 files changed, 38 insertions(+), 46 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.new.js b/packages/react-reconciler/src/ReactFiberCacheComponent.new.js index 78e24420acb8..268f8c02f825 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.new.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.new.js @@ -15,33 +15,29 @@ import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols'; import {pushProvider, popProvider} from './ReactFiberNewContext.new'; import * as Scheduler from 'scheduler'; -function createFallbackController() { - const listeners = []; - const signal = { - aborted: false, - addEventListener(type, listener) { - listeners.push(listener); - }, - }; - return { - signal, - abort() { - signal.aborted = true; - listeners.forEach(listener => listener()); - }, - }; -} - -// In environments without AbortController (e.g. tests in Node < 16) +// In environments without AbortController (e.g. tests) // replace it with a lightweight shim that only has the features we use. -const createController: () => AbortController = enableCache +const AbortControllerLocal = enableCache ? typeof AbortController !== 'undefined' - ? () => new AbortController() - : (createFallbackController: any) + ? AbortController + : (function AbortControllerShim() { + const listeners = []; + const signal = (this.signal = { + aborted: false, + addEventListener: (type, listener) => { + listeners.push(listener); + }, + }); + + this.abort = () => { + signal.aborted = true; + listeners.forEach(listener => listener()); + }; + }: AbortController) : (null: any); export type Cache = {| - controller: AbortController, + controller: AbortControllerLocal, data: Map<() => mixed, mixed>, refCount: number, |}; @@ -91,7 +87,7 @@ export function createCache(): Cache { return (null: any); } const cache: Cache = { - controller: createController(), + controller: new AbortControllerLocal(), data: new Map(), refCount: 0, }; diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.old.js b/packages/react-reconciler/src/ReactFiberCacheComponent.old.js index 27dc50247dfa..47f6eaefa8c2 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.old.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.old.js @@ -15,33 +15,29 @@ import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols'; import {pushProvider, popProvider} from './ReactFiberNewContext.old'; import * as Scheduler from 'scheduler'; -function createFallbackController() { - const listeners = []; - const signal = { - aborted: false, - addEventListener(type, listener) { - listeners.push(listener); - }, - }; - return { - signal, - abort() { - signal.aborted = true; - listeners.forEach(listener => listener()); - }, - }; -} - -// In environments without AbortController (e.g. tests in Node < 16) +// In environments without AbortController (e.g. tests) // replace it with a lightweight shim that only has the features we use. -const createController: () => AbortController = enableCache +const AbortControllerLocal = enableCache ? typeof AbortController !== 'undefined' - ? () => new AbortController() - : (createFallbackController: any) + ? AbortController + : (function AbortControllerShim() { + const listeners = (this.listeners = []); + const signal = (this.signal = { + aborted: false, + addEventListener: (type, listener) => { + listeners.push(listener); + }, + }); + + this.abort = () => { + signal.aborted = true; + listeners.forEach(listener => listener()); + }; + }: AbortController) : (null: any); export type Cache = {| - controller: AbortController, + controller: AbortControllerLocal, data: Map<() => mixed, mixed>, refCount: number, |}; @@ -91,7 +87,7 @@ export function createCache(): Cache { return (null: any); } const cache: Cache = { - controller: createController(), + controller: new AbortControllerLocal(), data: new Map(), refCount: 0, }; From afe0c82b6c7e3823de9723256d89078ee0ba71c8 Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Fri, 8 Apr 2022 13:54:37 -0400 Subject: [PATCH 9/9] replace-fork --- packages/react-reconciler/src/ReactFiberCacheComponent.old.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.old.js b/packages/react-reconciler/src/ReactFiberCacheComponent.old.js index 47f6eaefa8c2..ff141e2389fe 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.old.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.old.js @@ -21,7 +21,7 @@ const AbortControllerLocal = enableCache ? typeof AbortController !== 'undefined' ? AbortController : (function AbortControllerShim() { - const listeners = (this.listeners = []); + const listeners = []; const signal = (this.signal = { aborted: false, addEventListener: (type, listener) => {