From 41b6884a1bdfceddb04c43c55714c04578c351ac Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Mon, 1 Feb 2021 17:47:09 -0800 Subject: [PATCH] RN: Implements `EventSubscription` Summary: Changes the to-be-legacy `_EventSubscription` and `_EmitterSubscription` classes to implement the event-agnostic `EventSubscription` interface. This interface is valuable because it abstracts away the event definitions. Changelog: [Internal] Reviewed By: lunaleaps Differential Revision: D26155911 fbshipit-source-id: f94280976d4f9219f4780ac8fae0d5fbc1865386 --- Libraries/vendor/emitter/EventEmitter.js | 6 +++--- Libraries/vendor/emitter/EventSubscription.js | 19 +++++++++++++++++++ .../vendor/emitter/_EmitterSubscription.js | 12 ++++++------ .../vendor/emitter/_EventSubscription.js | 6 ++++-- 4 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 Libraries/vendor/emitter/EventSubscription.js diff --git a/Libraries/vendor/emitter/EventEmitter.js b/Libraries/vendor/emitter/EventEmitter.js index 380aedabb35..4084ce9e8e0 100644 --- a/Libraries/vendor/emitter/EventEmitter.js +++ b/Libraries/vendor/emitter/EventEmitter.js @@ -12,8 +12,8 @@ const EventEmitter = require('./_EventEmitter'); +import type {EventSubscription} from './EventSubscription'; + export default EventEmitter; -export interface EventSubscription { - remove(): void; -} +export type {EventSubscription}; diff --git a/Libraries/vendor/emitter/EventSubscription.js b/Libraries/vendor/emitter/EventSubscription.js new file mode 100644 index 00000000000..c6e9501598a --- /dev/null +++ b/Libraries/vendor/emitter/EventSubscription.js @@ -0,0 +1,19 @@ +/** + * 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 strict + * @format + */ + +'use strict'; + +// This exists as a separate file only to avoid circular dependencies from +// using this in `_EmitterSubscription`. Combine this back into `EventEmitter` +// after migration and cleanup is done. + +export interface EventSubscription { + remove(): void; +} diff --git a/Libraries/vendor/emitter/_EmitterSubscription.js b/Libraries/vendor/emitter/_EmitterSubscription.js index e78af30b2e8..eba91d9a4f8 100644 --- a/Libraries/vendor/emitter/_EmitterSubscription.js +++ b/Libraries/vendor/emitter/_EmitterSubscription.js @@ -11,16 +11,16 @@ 'use strict'; import type EventEmitter from './EventEmitter'; -import EventSubscription from './_EventSubscription'; +import _EventSubscription from './_EventSubscription'; import type EventSubscriptionVendor from './_EventSubscriptionVendor'; +import {type EventSubscription} from './EventSubscription'; /** * EmitterSubscription represents a subscription with listener and context data. */ -class EmitterSubscription< - EventDefinitions: {...}, - K: $Keys, -> extends EventSubscription { +class EmitterSubscription> + extends _EventSubscription + implements EventSubscription { emitter: EventEmitter; listener: ?(...$ElementType) => mixed; context: ?$FlowFixMe; @@ -49,7 +49,7 @@ class EmitterSubscription< /** * Removes this subscription from the emitter that registered it. - * Note: we're overriding the `remove()` method of EventSubscription here + * Note: we're overriding the `remove()` method of _EventSubscription here * but deliberately not calling `super.remove()` as the responsibility * for removing the subscription lies with the EventEmitter. */ diff --git a/Libraries/vendor/emitter/_EventSubscription.js b/Libraries/vendor/emitter/_EventSubscription.js index 7a4243811e3..446cf2f049f 100644 --- a/Libraries/vendor/emitter/_EventSubscription.js +++ b/Libraries/vendor/emitter/_EventSubscription.js @@ -10,13 +10,15 @@ 'use strict'; +import {type EventSubscription} from './EventSubscription'; import type EventSubscriptionVendor from './_EventSubscriptionVendor'; /** * EventSubscription represents a subscription to a particular event. It can * remove its own subscription. */ -class EventSubscription> { +class _EventSubscription> + implements EventSubscription { eventType: K; key: number; subscriber: EventSubscriptionVendor; @@ -39,4 +41,4 @@ class EventSubscription> { } } -module.exports = EventSubscription; +module.exports = _EventSubscription;