From 114be1d2170bae2d29da749c07b45acf931e51e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Mon, 19 Apr 2021 13:13:07 -0700 Subject: [PATCH] Check existence of native methods before calling them in NativeEventEmitter Summary: Check the existence of `addListener` and `removeListeners` in the native module passed to `NativeEventEmitter` to determine if it can be used. Changelog: [General][Changed] Show warning when native module without `addListener` or `removeListeners` is passed to `NativeEventEmitter` Reviewed By: yungsters Differential Revision: D27851425 fbshipit-source-id: c0ad3ba65a9239f5bf84548dab36e8dfbc51058a --- Libraries/EventEmitter/NativeEventEmitter.js | 21 +++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Libraries/EventEmitter/NativeEventEmitter.js b/Libraries/EventEmitter/NativeEventEmitter.js index 908d1e1547b..b3f72480717 100644 --- a/Libraries/EventEmitter/NativeEventEmitter.js +++ b/Libraries/EventEmitter/NativeEventEmitter.js @@ -46,7 +46,26 @@ export default class NativeEventEmitter '`new NativeEventEmitter()` requires a non-null argument.', ); } - this._nativeModule = nativeModule; + + const hasAddListener = + !!nativeModule && typeof nativeModule.addListener === 'function'; + const hasRemoveListeners = + !!nativeModule && typeof nativeModule.removeListeners === 'function'; + + if (nativeModule && hasAddListener && hasRemoveListeners) { + this._nativeModule = nativeModule; + } else { + if (!hasAddListener) { + console.warn( + '`new NativeEventEmitter()` was called with a non-null argument without the required `addListener` method.', + ); + } + if (!hasRemoveListeners) { + console.warn( + '`new NativeEventEmitter()` was called with a non-null argument without the required `removeListeners` method.', + ); + } + } } addListener>(