From dd754e69cd226cb7938035256b9006bbc0cdbdaa Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Thu, 3 Feb 2022 15:14:09 -0800 Subject: [PATCH 01/17] ReactNativeEventTelemetryPlugin: new event perf profiling mechanism outside of Pressability to capture all touch events, and other event types --- .../react-native-renderer/src/ReactNativeEventPluginOrder.js | 1 + .../react-native-renderer/src/ReactNativeInjectionShared.js | 2 ++ .../Libraries/ReactPrivate/ReactNativePrivateInterface.js | 3 +++ 3 files changed, 6 insertions(+) diff --git a/packages/react-native-renderer/src/ReactNativeEventPluginOrder.js b/packages/react-native-renderer/src/ReactNativeEventPluginOrder.js index a2b5f97588ed..ec1914d17c8a 100644 --- a/packages/react-native-renderer/src/ReactNativeEventPluginOrder.js +++ b/packages/react-native-renderer/src/ReactNativeEventPluginOrder.js @@ -8,6 +8,7 @@ */ const ReactNativeEventPluginOrder = [ + 'ReactNativeEventTelemetryPlugin', // We want telemetry to get a chance to run before any real work is done. 'ResponderEventPlugin', 'ReactNativeBridgeEventPlugin', ]; diff --git a/packages/react-native-renderer/src/ReactNativeInjectionShared.js b/packages/react-native-renderer/src/ReactNativeInjectionShared.js index 7470d98f3480..e066fc99cb1c 100644 --- a/packages/react-native-renderer/src/ReactNativeInjectionShared.js +++ b/packages/react-native-renderer/src/ReactNativeInjectionShared.js @@ -22,6 +22,7 @@ import { injectEventPluginsByName, } from './legacy-events/EventPluginRegistry'; +import ReactNativeEventTelemetryPlugin from './ReactNativeEventTelemetryPlugin'; import ReactNativeBridgeEventPlugin from './ReactNativeBridgeEventPlugin'; import ReactNativeEventPluginOrder from './ReactNativeEventPluginOrder'; @@ -35,6 +36,7 @@ injectEventPluginOrder(ReactNativeEventPluginOrder); * them). */ injectEventPluginsByName({ + ReactNativeEventTelemetryPlugin: ReactNativeEventTelemetryPlugin, ResponderEventPlugin: ResponderEventPlugin, ReactNativeBridgeEventPlugin: ReactNativeBridgeEventPlugin, }); diff --git a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js index 3def12a904f6..ff028d2ae41b 100644 --- a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js +++ b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js @@ -41,4 +41,7 @@ module.exports = { get legacySendAccessibilityEvent() { return require('./legacySendAccessibilityEvent'); }, + get RawEventTelemetryEventEmitter() { + return require('./RawEventTelemetryEventEmitter'); + }, }; From ac7915f76f89b89536c96a943b7d8e31d86b1f01 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Fri, 4 Feb 2022 13:08:20 -0800 Subject: [PATCH 02/17] sync --- .../src/ReactNativeEventPluginOrder.js | 2 +- .../src/ReactNativeEventTelemetryPlugin.js | 19 +++++++++++++++++++ .../RawEventTelemetryEventEmitter.js | 14 ++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 packages/react-native-renderer/src/ReactNativeEventTelemetryPlugin.js create mode 100644 packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js diff --git a/packages/react-native-renderer/src/ReactNativeEventPluginOrder.js b/packages/react-native-renderer/src/ReactNativeEventPluginOrder.js index ec1914d17c8a..f69c10d36057 100644 --- a/packages/react-native-renderer/src/ReactNativeEventPluginOrder.js +++ b/packages/react-native-renderer/src/ReactNativeEventPluginOrder.js @@ -8,7 +8,7 @@ */ const ReactNativeEventPluginOrder = [ - 'ReactNativeEventTelemetryPlugin', // We want telemetry to get a chance to run before any real work is done. + 'ReactNativeEventTelemetryPlugin', // We want telemetry to run before any other work is done. 'ResponderEventPlugin', 'ReactNativeBridgeEventPlugin', ]; diff --git a/packages/react-native-renderer/src/ReactNativeEventTelemetryPlugin.js b/packages/react-native-renderer/src/ReactNativeEventTelemetryPlugin.js new file mode 100644 index 000000000000..2b5a4afbda05 --- /dev/null +++ b/packages/react-native-renderer/src/ReactNativeEventTelemetryPlugin.js @@ -0,0 +1,19 @@ +import {RawEventTelemetryEventEmitter} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; + +const ReactNativeEventTelemetryPlugin = { + extractEvents: function( + topLevelType, + targetInst, + nativeEvent, + nativeEventTarget, + eventSystemFlags + ) { + RawEventTelemetryEventEmitter.emitEvent(topLevelType, nativeEvent); + + // We never extract events here, we just forward to the telemetry system. + // Thus, returning null here unconditionally is optimal. + return null; + } +}; + +export default ReactNativeEventTelemetryPlugin; diff --git a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js new file mode 100644 index 000000000000..887a03a16437 --- /dev/null +++ b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js @@ -0,0 +1,14 @@ +/** + * 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. + */ + +'use strict'; + +const RawEventTelemetryEventEmitter = { + emitEvent: jest.fn(), +}; + +module.exports = RawEventTelemetryEventEmitter; From 01253552a340dbb317599a0d57c5f0f7f8a26c99 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 11:00:15 -0800 Subject: [PATCH 03/17] concise notation --- .../src/ReactNativeEventTelemetryPlugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native-renderer/src/ReactNativeEventTelemetryPlugin.js b/packages/react-native-renderer/src/ReactNativeEventTelemetryPlugin.js index 2b5a4afbda05..7bdec665f1bc 100644 --- a/packages/react-native-renderer/src/ReactNativeEventTelemetryPlugin.js +++ b/packages/react-native-renderer/src/ReactNativeEventTelemetryPlugin.js @@ -1,7 +1,7 @@ import {RawEventTelemetryEventEmitter} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; const ReactNativeEventTelemetryPlugin = { - extractEvents: function( + extractEvents( topLevelType, targetInst, nativeEvent, From d04781d7bbd9b2f83d0e3a06cb52a042ab83066d Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 11:08:02 -0800 Subject: [PATCH 04/17] Move event telemetry event emitter call from Plugin to ReactFabricEventEmitter, to reduce reliance on the plugin system and move the emit call further into the core --- .../src/ReactFabricEventEmitter.js | 4 ++++ .../src/ReactNativeEventTelemetryPlugin.js | 19 ------------------- .../src/ReactNativeInjectionShared.js | 2 -- 3 files changed, 4 insertions(+), 21 deletions(-) delete mode 100644 packages/react-native-renderer/src/ReactNativeEventTelemetryPlugin.js diff --git a/packages/react-native-renderer/src/ReactFabricEventEmitter.js b/packages/react-native-renderer/src/ReactFabricEventEmitter.js index 15798d8f777e..a307569f741d 100644 --- a/packages/react-native-renderer/src/ReactFabricEventEmitter.js +++ b/packages/react-native-renderer/src/ReactFabricEventEmitter.js @@ -21,6 +21,8 @@ import {plugins} from './legacy-events/EventPluginRegistry'; import getListener from './ReactNativeGetListener'; import {runEventsInBatch} from './legacy-events/EventBatching'; +import {RawEventTelemetryEventEmitter} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; + export {getListener, registrationNameModules as registrationNames}; /** @@ -88,6 +90,8 @@ export function dispatchEvent( } batchedUpdates(function() { + RawEventTelemetryEventEmitter.emitEvent(topLevelType, nativeEvent); + // Heritage plugin event system runExtractedPluginEventsInBatch( topLevelType, diff --git a/packages/react-native-renderer/src/ReactNativeEventTelemetryPlugin.js b/packages/react-native-renderer/src/ReactNativeEventTelemetryPlugin.js deleted file mode 100644 index 7bdec665f1bc..000000000000 --- a/packages/react-native-renderer/src/ReactNativeEventTelemetryPlugin.js +++ /dev/null @@ -1,19 +0,0 @@ -import {RawEventTelemetryEventEmitter} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; - -const ReactNativeEventTelemetryPlugin = { - extractEvents( - topLevelType, - targetInst, - nativeEvent, - nativeEventTarget, - eventSystemFlags - ) { - RawEventTelemetryEventEmitter.emitEvent(topLevelType, nativeEvent); - - // We never extract events here, we just forward to the telemetry system. - // Thus, returning null here unconditionally is optimal. - return null; - } -}; - -export default ReactNativeEventTelemetryPlugin; diff --git a/packages/react-native-renderer/src/ReactNativeInjectionShared.js b/packages/react-native-renderer/src/ReactNativeInjectionShared.js index e066fc99cb1c..7470d98f3480 100644 --- a/packages/react-native-renderer/src/ReactNativeInjectionShared.js +++ b/packages/react-native-renderer/src/ReactNativeInjectionShared.js @@ -22,7 +22,6 @@ import { injectEventPluginsByName, } from './legacy-events/EventPluginRegistry'; -import ReactNativeEventTelemetryPlugin from './ReactNativeEventTelemetryPlugin'; import ReactNativeBridgeEventPlugin from './ReactNativeBridgeEventPlugin'; import ReactNativeEventPluginOrder from './ReactNativeEventPluginOrder'; @@ -36,7 +35,6 @@ injectEventPluginOrder(ReactNativeEventPluginOrder); * them). */ injectEventPluginsByName({ - ReactNativeEventTelemetryPlugin: ReactNativeEventTelemetryPlugin, ResponderEventPlugin: ResponderEventPlugin, ReactNativeBridgeEventPlugin: ReactNativeBridgeEventPlugin, }); From 4b72b078690fb88c6c32de4dc988e2bafc4804a6 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 11:10:27 -0800 Subject: [PATCH 05/17] Backout changes to ReactNativeEventPluginOrder --- .../react-native-renderer/src/ReactNativeEventPluginOrder.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/react-native-renderer/src/ReactNativeEventPluginOrder.js b/packages/react-native-renderer/src/ReactNativeEventPluginOrder.js index f69c10d36057..a2b5f97588ed 100644 --- a/packages/react-native-renderer/src/ReactNativeEventPluginOrder.js +++ b/packages/react-native-renderer/src/ReactNativeEventPluginOrder.js @@ -8,7 +8,6 @@ */ const ReactNativeEventPluginOrder = [ - 'ReactNativeEventTelemetryPlugin', // We want telemetry to run before any other work is done. 'ResponderEventPlugin', 'ReactNativeBridgeEventPlugin', ]; From 7e76ce682b6cf70f7be115a06ca8e781ee16094b Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 11:23:44 -0800 Subject: [PATCH 06/17] Properly flow typing event emitter, and emit event to two channels: named and catchall --- .../src/ReactFabricEventEmitter.js | 4 +++- .../ReactPrivate/RawEventTelemetryEventEmitter.js | 2 +- scripts/flow/react-native-host-hooks.js | 11 +++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/react-native-renderer/src/ReactFabricEventEmitter.js b/packages/react-native-renderer/src/ReactFabricEventEmitter.js index a307569f741d..27b1fb6c388e 100644 --- a/packages/react-native-renderer/src/ReactFabricEventEmitter.js +++ b/packages/react-native-renderer/src/ReactFabricEventEmitter.js @@ -90,7 +90,9 @@ export function dispatchEvent( } batchedUpdates(function() { - RawEventTelemetryEventEmitter.emitEvent(topLevelType, nativeEvent); + const event = {eventName: topLevelType, nativeEvent}; + RawEventTelemetryEventEmitter.emit(topLevelType, event); + RawEventTelemetryEventEmitter.emit('*', event); // Heritage plugin event system runExtractedPluginEventsInBatch( diff --git a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js index 887a03a16437..3e8445f27921 100644 --- a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js +++ b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js @@ -8,7 +8,7 @@ 'use strict'; const RawEventTelemetryEventEmitter = { - emitEvent: jest.fn(), + emit: jest.fn(), }; module.exports = RawEventTelemetryEventEmitter; diff --git a/scripts/flow/react-native-host-hooks.js b/scripts/flow/react-native-host-hooks.js index 770b77a84082..4a0f130aa50d 100644 --- a/scripts/flow/react-native-host-hooks.js +++ b/scripts/flow/react-native-host-hooks.js @@ -21,6 +21,13 @@ import type {CapturedError} from 'react-reconciler/src/ReactCapturedValue'; import type {Fiber} from 'react-reconciler/src/ReactInternalTypes'; type DeepDifferOptions = {|+unsafelyIgnoreFunctions?: boolean|}; +type RawEventTelemetryEvent = $ReadOnly<{| + eventName: string, + // We expect, but do not/cannot require, that nativeEvent is an object + // with the properties: key, elementType (string), type (string), tag (numeric), + // and a stateNode of the native element/Fiber the event was emitted to. + nativeEvent: {[string]: mixed}, +|}>; declare module 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface' { declare export function deepDiffer( @@ -127,6 +134,10 @@ declare module 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface' get: (name: string) => ReactNativeBaseComponentViewConfig, ... }; + declare export var RawEventTelemetryEventEmitter: { + emit: (channel: string, event: RawEventTelemetryEvent) => string, + ... + }; } declare module 'react-native/Libraries/ReactPrivate/ReactNativePrivateInitializeCore' { From 97a1b0f5b7d2cf9bc871436323226d175fbc4e3b Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 11:48:10 -0800 Subject: [PATCH 07/17] fix typing for event name string --- .../react-native-renderer/src/ReactFabricEventEmitter.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/react-native-renderer/src/ReactFabricEventEmitter.js b/packages/react-native-renderer/src/ReactFabricEventEmitter.js index 27b1fb6c388e..979f8ec769d0 100644 --- a/packages/react-native-renderer/src/ReactFabricEventEmitter.js +++ b/packages/react-native-renderer/src/ReactFabricEventEmitter.js @@ -21,6 +21,7 @@ import {plugins} from './legacy-events/EventPluginRegistry'; import getListener from './ReactNativeGetListener'; import {runEventsInBatch} from './legacy-events/EventBatching'; +import {unsafeCastDOMTopLevelTypeToString} from './legacy-events/TopLevelEventTypes'; import {RawEventTelemetryEventEmitter} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; export {getListener, registrationNameModules as registrationNames}; @@ -90,8 +91,9 @@ export function dispatchEvent( } batchedUpdates(function() { - const event = {eventName: topLevelType, nativeEvent}; - RawEventTelemetryEventEmitter.emit(topLevelType, event); + const topLevelTypeStr = unsafeCastDOMTopLevelTypeToString(topLevelType); + const event = {eventName: topLevelTypeStr, nativeEvent}; + RawEventTelemetryEventEmitter.emit(topLevelTypeStr, event); RawEventTelemetryEventEmitter.emit('*', event); // Heritage plugin event system From a6deda3b8d36080b1bec87f6ddd67c6f692d9a93 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 11:59:45 -0800 Subject: [PATCH 08/17] fix typing for event name string --- packages/react-native-renderer/src/ReactFabricEventEmitter.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/react-native-renderer/src/ReactFabricEventEmitter.js b/packages/react-native-renderer/src/ReactFabricEventEmitter.js index 979f8ec769d0..301aab76286c 100644 --- a/packages/react-native-renderer/src/ReactFabricEventEmitter.js +++ b/packages/react-native-renderer/src/ReactFabricEventEmitter.js @@ -21,7 +21,6 @@ import {plugins} from './legacy-events/EventPluginRegistry'; import getListener from './ReactNativeGetListener'; import {runEventsInBatch} from './legacy-events/EventBatching'; -import {unsafeCastDOMTopLevelTypeToString} from './legacy-events/TopLevelEventTypes'; import {RawEventTelemetryEventEmitter} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; export {getListener, registrationNameModules as registrationNames}; @@ -91,7 +90,7 @@ export function dispatchEvent( } batchedUpdates(function() { - const topLevelTypeStr = unsafeCastDOMTopLevelTypeToString(topLevelType); + const topLevelTypeStr = (topLevelType: string); const event = {eventName: topLevelTypeStr, nativeEvent}; RawEventTelemetryEventEmitter.emit(topLevelTypeStr, event); RawEventTelemetryEventEmitter.emit('*', event); From bc6905c1f60bc52865ef4f2ef029c4defc2c3e63 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 13:46:04 -0800 Subject: [PATCH 09/17] fix flow --- .../react-native-renderer/src/ReactFabricEventEmitter.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/react-native-renderer/src/ReactFabricEventEmitter.js b/packages/react-native-renderer/src/ReactFabricEventEmitter.js index 301aab76286c..5482676b89ee 100644 --- a/packages/react-native-renderer/src/ReactFabricEventEmitter.js +++ b/packages/react-native-renderer/src/ReactFabricEventEmitter.js @@ -90,7 +90,13 @@ export function dispatchEvent( } batchedUpdates(function() { - const topLevelTypeStr = (topLevelType: string); + // Emit event to the event telemetry system. + // We emit two events here: one for listeners to this specific event, + // and one for the catchall listener '*', for any listeners that want + // to be notified for all events. + // Note that extracted events are *not* emitted into the telemetry system, + // only events that have a 1:1 mapping with a native event, at least for now. + const topLevelTypeStr: string = ((topLevelType: any): string); const event = {eventName: topLevelTypeStr, nativeEvent}; RawEventTelemetryEventEmitter.emit(topLevelTypeStr, event); RawEventTelemetryEventEmitter.emit('*', event); From d9a85fe73c726185ed5c67c6fae24b959aedf1d3 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 14:40:49 -0800 Subject: [PATCH 10/17] Add more comments about how the event telemetry system works --- .../react-native-renderer/src/ReactFabricEventEmitter.js | 9 +++++++++ .../ReactPrivate/RawEventTelemetryEventEmitter.js | 2 ++ 2 files changed, 11 insertions(+) diff --git a/packages/react-native-renderer/src/ReactFabricEventEmitter.js b/packages/react-native-renderer/src/ReactFabricEventEmitter.js index 5482676b89ee..d7522f6e4ab4 100644 --- a/packages/react-native-renderer/src/ReactFabricEventEmitter.js +++ b/packages/react-native-renderer/src/ReactFabricEventEmitter.js @@ -91,6 +91,15 @@ export function dispatchEvent( batchedUpdates(function() { // Emit event to the event telemetry system. + // + // NOTE: this event telemetry system does *nothing* without explicit, + // per-application opt-in, and merely emits events into the local + // EventEmitter below. If *you* do not add listeners to the `RawEventTelemetryEventEmitter`, + // then all of these emitted events will just blackhole and are no-ops. + // It is available (although not officially supported... yet) if you want to collect + // telemetry on event latency in your application, and could also be useful for debugging + // low-level events issues. + // // We emit two events here: one for listeners to this specific event, // and one for the catchall listener '*', for any listeners that want // to be notified for all events. diff --git a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js index 3e8445f27921..a22a80d9a899 100644 --- a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js +++ b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js @@ -7,6 +7,8 @@ 'use strict'; +// See the react-native repository for a full implementation. +// However, this is just an EventEmitter. const RawEventTelemetryEventEmitter = { emit: jest.fn(), }; From 229595d7a8502b51750ee78d3dc70afd5b71e657 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 14:43:40 -0800 Subject: [PATCH 11/17] Add more comments about how the event telemetry system works --- .../react-native-renderer/src/ReactFabricEventEmitter.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/react-native-renderer/src/ReactFabricEventEmitter.js b/packages/react-native-renderer/src/ReactFabricEventEmitter.js index d7522f6e4ab4..5059af2170af 100644 --- a/packages/react-native-renderer/src/ReactFabricEventEmitter.js +++ b/packages/react-native-renderer/src/ReactFabricEventEmitter.js @@ -100,6 +100,11 @@ export function dispatchEvent( // telemetry on event latency in your application, and could also be useful for debugging // low-level events issues. // + // If you do not have any event telemetry and are extremely concerned about event perf, + // it is safe to disable these "emit" statements; it will prevent checking the size of + // an empty array twice and prevent two no-ops. Practically the overhead is so low that + // we don't think it's worth thinking about in prod; your perf issues probably lie elsewhere. + // // We emit two events here: one for listeners to this specific event, // and one for the catchall listener '*', for any listeners that want // to be notified for all events. From 1825e073d53b036171f7916fd1d3fbb4a4d57560 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 14:48:26 -0800 Subject: [PATCH 12/17] rename to RawEventTelemetryEventEmitterOffByDefault --- .../react-native-renderer/src/ReactFabricEventEmitter.js | 6 +++--- ...tter.js => RawEventTelemetryEventEmitterOffByDefault.js} | 4 ++-- .../Libraries/ReactPrivate/ReactNativePrivateInterface.js | 4 ++-- scripts/flow/react-native-host-hooks.js | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) rename packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/{RawEventTelemetryEventEmitter.js => RawEventTelemetryEventEmitterOffByDefault.js} (72%) diff --git a/packages/react-native-renderer/src/ReactFabricEventEmitter.js b/packages/react-native-renderer/src/ReactFabricEventEmitter.js index 5059af2170af..48ecef262c9f 100644 --- a/packages/react-native-renderer/src/ReactFabricEventEmitter.js +++ b/packages/react-native-renderer/src/ReactFabricEventEmitter.js @@ -21,7 +21,7 @@ import {plugins} from './legacy-events/EventPluginRegistry'; import getListener from './ReactNativeGetListener'; import {runEventsInBatch} from './legacy-events/EventBatching'; -import {RawEventTelemetryEventEmitter} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; +import {RawEventTelemetryEventEmitterOffByDefault} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; export {getListener, registrationNameModules as registrationNames}; @@ -112,8 +112,8 @@ export function dispatchEvent( // only events that have a 1:1 mapping with a native event, at least for now. const topLevelTypeStr: string = ((topLevelType: any): string); const event = {eventName: topLevelTypeStr, nativeEvent}; - RawEventTelemetryEventEmitter.emit(topLevelTypeStr, event); - RawEventTelemetryEventEmitter.emit('*', event); + RawEventTelemetryEventEmitterOffByDefault.emit(topLevelTypeStr, event); + RawEventTelemetryEventEmitterOffByDefault.emit('*', event); // Heritage plugin event system runExtractedPluginEventsInBatch( diff --git a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitterOffByDefault.js similarity index 72% rename from packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js rename to packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitterOffByDefault.js index a22a80d9a899..ccb792d8911b 100644 --- a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitter.js +++ b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitterOffByDefault.js @@ -9,8 +9,8 @@ // See the react-native repository for a full implementation. // However, this is just an EventEmitter. -const RawEventTelemetryEventEmitter = { +const RawEventTelemetryEventEmitterOffByDefault = { emit: jest.fn(), }; -module.exports = RawEventTelemetryEventEmitter; +module.exports = { default: RawEventTelemetryEventEmitterOffByDefault }; diff --git a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js index ff028d2ae41b..609a4448d856 100644 --- a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js +++ b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js @@ -41,7 +41,7 @@ module.exports = { get legacySendAccessibilityEvent() { return require('./legacySendAccessibilityEvent'); }, - get RawEventTelemetryEventEmitter() { - return require('./RawEventTelemetryEventEmitter'); + get RawEventTelemetryEventEmitterOffByDefault() { + return require('./RawEventTelemetryEventEmitterOffByDefault').default; }, }; diff --git a/scripts/flow/react-native-host-hooks.js b/scripts/flow/react-native-host-hooks.js index 4a0f130aa50d..d9951b34670e 100644 --- a/scripts/flow/react-native-host-hooks.js +++ b/scripts/flow/react-native-host-hooks.js @@ -134,7 +134,7 @@ declare module 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface' get: (name: string) => ReactNativeBaseComponentViewConfig, ... }; - declare export var RawEventTelemetryEventEmitter: { + declare export var RawEventTelemetryEventEmitterOffByDefault: { emit: (channel: string, event: RawEventTelemetryEvent) => string, ... }; From 0eef8e9472dee5740920b2dcdb1a25ab1f0959da Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 15:09:41 -0800 Subject: [PATCH 13/17] yarn prettier-all --- .../ReactPrivate/RawEventTelemetryEventEmitterOffByDefault.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitterOffByDefault.js b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitterOffByDefault.js index ccb792d8911b..a602f94b8d48 100644 --- a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitterOffByDefault.js +++ b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitterOffByDefault.js @@ -13,4 +13,4 @@ const RawEventTelemetryEventEmitterOffByDefault = { emit: jest.fn(), }; -module.exports = { default: RawEventTelemetryEventEmitterOffByDefault }; +module.exports = {default: RawEventTelemetryEventEmitterOffByDefault}; From bbf3f7879d94a0909292070057662b66bc6cee2b Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 16:25:23 -0800 Subject: [PATCH 14/17] rename event --- .../src/ReactFabricEventEmitter.js | 8 ++++---- .../RawEventTelemetryEventEmitterOffByDefault.js | 16 ---------------- .../ReactPrivate/ReactNativePrivateInterface.js | 4 ++-- scripts/flow/react-native-host-hooks.js | 6 +++--- 4 files changed, 9 insertions(+), 25 deletions(-) delete mode 100644 packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitterOffByDefault.js diff --git a/packages/react-native-renderer/src/ReactFabricEventEmitter.js b/packages/react-native-renderer/src/ReactFabricEventEmitter.js index 48ecef262c9f..7222b3595ce8 100644 --- a/packages/react-native-renderer/src/ReactFabricEventEmitter.js +++ b/packages/react-native-renderer/src/ReactFabricEventEmitter.js @@ -21,7 +21,7 @@ import {plugins} from './legacy-events/EventPluginRegistry'; import getListener from './ReactNativeGetListener'; import {runEventsInBatch} from './legacy-events/EventBatching'; -import {RawEventTelemetryEventEmitterOffByDefault} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; +import {RawEventEmitter} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; export {getListener, registrationNameModules as registrationNames}; @@ -94,7 +94,7 @@ export function dispatchEvent( // // NOTE: this event telemetry system does *nothing* without explicit, // per-application opt-in, and merely emits events into the local - // EventEmitter below. If *you* do not add listeners to the `RawEventTelemetryEventEmitter`, + // EventEmitter below. If *you* do not add listeners to the `RawEventEmitter`, // then all of these emitted events will just blackhole and are no-ops. // It is available (although not officially supported... yet) if you want to collect // telemetry on event latency in your application, and could also be useful for debugging @@ -112,8 +112,8 @@ export function dispatchEvent( // only events that have a 1:1 mapping with a native event, at least for now. const topLevelTypeStr: string = ((topLevelType: any): string); const event = {eventName: topLevelTypeStr, nativeEvent}; - RawEventTelemetryEventEmitterOffByDefault.emit(topLevelTypeStr, event); - RawEventTelemetryEventEmitterOffByDefault.emit('*', event); + RawEventEmitter.emit(topLevelTypeStr, event); + RawEventEmitter.emit('*', event); // Heritage plugin event system runExtractedPluginEventsInBatch( diff --git a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitterOffByDefault.js b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitterOffByDefault.js deleted file mode 100644 index a602f94b8d48..000000000000 --- a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventTelemetryEventEmitterOffByDefault.js +++ /dev/null @@ -1,16 +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. - */ - -'use strict'; - -// See the react-native repository for a full implementation. -// However, this is just an EventEmitter. -const RawEventTelemetryEventEmitterOffByDefault = { - emit: jest.fn(), -}; - -module.exports = {default: RawEventTelemetryEventEmitterOffByDefault}; diff --git a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js index 609a4448d856..3eaf3a5a3805 100644 --- a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js +++ b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js @@ -41,7 +41,7 @@ module.exports = { get legacySendAccessibilityEvent() { return require('./legacySendAccessibilityEvent'); }, - get RawEventTelemetryEventEmitterOffByDefault() { - return require('./RawEventTelemetryEventEmitterOffByDefault').default; + get RawEventEmitter() { + return require('./RawEventEmitter').default; }, }; diff --git a/scripts/flow/react-native-host-hooks.js b/scripts/flow/react-native-host-hooks.js index d9951b34670e..c7a2fc8dc321 100644 --- a/scripts/flow/react-native-host-hooks.js +++ b/scripts/flow/react-native-host-hooks.js @@ -21,7 +21,7 @@ import type {CapturedError} from 'react-reconciler/src/ReactCapturedValue'; import type {Fiber} from 'react-reconciler/src/ReactInternalTypes'; type DeepDifferOptions = {|+unsafelyIgnoreFunctions?: boolean|}; -type RawEventTelemetryEvent = $ReadOnly<{| +type RawEventEmitterEvent = $ReadOnly<{| eventName: string, // We expect, but do not/cannot require, that nativeEvent is an object // with the properties: key, elementType (string), type (string), tag (numeric), @@ -134,8 +134,8 @@ declare module 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface' get: (name: string) => ReactNativeBaseComponentViewConfig, ... }; - declare export var RawEventTelemetryEventEmitterOffByDefault: { - emit: (channel: string, event: RawEventTelemetryEvent) => string, + declare export var RawEventEmitter: { + emit: (channel: string, event: RawEventEmitterEvent) => string, ... }; } From bff359e916fda5cd262294e4169f1ecab2e88d47 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 16:27:27 -0800 Subject: [PATCH 15/17] comments --- .../src/ReactFabricEventEmitter.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/react-native-renderer/src/ReactFabricEventEmitter.js b/packages/react-native-renderer/src/ReactFabricEventEmitter.js index 7222b3595ce8..265d4408be1b 100644 --- a/packages/react-native-renderer/src/ReactFabricEventEmitter.js +++ b/packages/react-native-renderer/src/ReactFabricEventEmitter.js @@ -90,17 +90,18 @@ export function dispatchEvent( } batchedUpdates(function() { - // Emit event to the event telemetry system. + // Emit event to the RawEventEmitter. This is an unused-by-default EventEmitter + // that can be used to instrument event performance monitoring (primarily - could be useful + // for other things too). // - // NOTE: this event telemetry system does *nothing* without explicit, - // per-application opt-in, and merely emits events into the local - // EventEmitter below. If *you* do not add listeners to the `RawEventEmitter`, + // NOTE: this merely emits events into the EventEmitter below. + // If *you* do not add listeners to the `RawEventEmitter`, // then all of these emitted events will just blackhole and are no-ops. // It is available (although not officially supported... yet) if you want to collect - // telemetry on event latency in your application, and could also be useful for debugging + // perf data on event latency in your application, and could also be useful for debugging // low-level events issues. // - // If you do not have any event telemetry and are extremely concerned about event perf, + // If you do not have any event perf monitoring and are extremely concerned about event perf, // it is safe to disable these "emit" statements; it will prevent checking the size of // an empty array twice and prevent two no-ops. Practically the overhead is so low that // we don't think it's worth thinking about in prod; your perf issues probably lie elsewhere. @@ -108,7 +109,7 @@ export function dispatchEvent( // We emit two events here: one for listeners to this specific event, // and one for the catchall listener '*', for any listeners that want // to be notified for all events. - // Note that extracted events are *not* emitted into the telemetry system, + // Note that extracted events are *not* emitted, // only events that have a 1:1 mapping with a native event, at least for now. const topLevelTypeStr: string = ((topLevelType: any): string); const event = {eventName: topLevelTypeStr, nativeEvent}; From 62124f3129dcf1a941188ebac8a92e4928887326 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 16:28:43 -0800 Subject: [PATCH 16/17] improve flow types --- .../react-native-renderer/src/ReactFabricEventEmitter.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/react-native-renderer/src/ReactFabricEventEmitter.js b/packages/react-native-renderer/src/ReactFabricEventEmitter.js index 265d4408be1b..d8492156fdc7 100644 --- a/packages/react-native-renderer/src/ReactFabricEventEmitter.js +++ b/packages/react-native-renderer/src/ReactFabricEventEmitter.js @@ -75,7 +75,7 @@ function runExtractedPluginEventsInBatch( export function dispatchEvent( target: null | Object, - topLevelType: TopLevelType, + topLevelType: RNTopLevelEventType, nativeEvent: AnyNativeEvent, ) { const targetFiber = (target: null | Fiber); @@ -111,9 +111,8 @@ export function dispatchEvent( // to be notified for all events. // Note that extracted events are *not* emitted, // only events that have a 1:1 mapping with a native event, at least for now. - const topLevelTypeStr: string = ((topLevelType: any): string); - const event = {eventName: topLevelTypeStr, nativeEvent}; - RawEventEmitter.emit(topLevelTypeStr, event); + const event = {eventName: topLevelType, nativeEvent}; + RawEventEmitter.emit(topLevelType, event); RawEventEmitter.emit('*', event); // Heritage plugin event system From 143b04bc437ca2c521ed1a080a17d2e1eaf40ed8 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 7 Feb 2022 16:50:14 -0800 Subject: [PATCH 17/17] renamed file --- .../Libraries/ReactPrivate/RawEventEmitter.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventEmitter.js diff --git a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventEmitter.js b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventEmitter.js new file mode 100644 index 000000000000..abb419842bee --- /dev/null +++ b/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/RawEventEmitter.js @@ -0,0 +1,16 @@ +/** + * 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. + */ + +'use strict'; + +// See the react-native repository for a full implementation. +// However, this is just an EventEmitter. +const RawEventEmitter = { + emit: jest.fn(), +}; + +module.exports = {default: RawEventEmitter};