1import { NativeModules } from 'react-native'; 2const NativeProxy = NativeModules.NativeUnimoduleProxy; 3const modulesConstantsKey = 'modulesConstants'; 4const exportedMethodsKey = 'exportedMethods'; 5const NativeModulesProxy = {}; 6if (NativeProxy) { 7 Object.keys(NativeProxy[exportedMethodsKey]).forEach((moduleName) => { 8 NativeModulesProxy[moduleName] = NativeProxy[modulesConstantsKey][moduleName] || {}; 9 NativeProxy[exportedMethodsKey][moduleName].forEach((methodInfo) => { 10 NativeModulesProxy[moduleName][methodInfo.name] = (...args) => { 11 const { key, argumentsCount } = methodInfo; 12 if (argumentsCount !== args.length) { 13 return Promise.reject(new Error(`Native method ${moduleName}.${methodInfo.name} expects ${argumentsCount} ${argumentsCount === 1 ? 'argument' : 'arguments'} but received ${args.length}`)); 14 } 15 return NativeProxy.callMethod(moduleName, key, args); 16 }; 17 }); 18 // These are called by EventEmitter (which is a wrapper for NativeEventEmitter) 19 // only on iOS and they use iOS-specific native module, EXReactNativeEventEmitter. 20 // 21 // On Android only {start,stop}Observing are called on the native module 22 // and these should be exported as Expo methods. 23 // 24 // Before the RN 65, addListener/removeListeners weren't called on Android. However, it no longer stays true. 25 // See https://github.com/facebook/react-native/commit/f5502fbda9fe271ff6e1d0da773a3a8ee206a453. 26 // That's why, we check if the `EXReactNativeEventEmitter` exists and only if yes, we use it in the listener implementation. 27 // Otherwise, those methods are NOOP. 28 if (NativeModules.EXReactNativeEventEmitter) { 29 NativeModulesProxy[moduleName].addListener = (...args) => NativeModules.EXReactNativeEventEmitter.addProxiedListener(moduleName, ...args); 30 NativeModulesProxy[moduleName].removeListeners = (...args) => NativeModules.EXReactNativeEventEmitter.removeProxiedListeners(moduleName, ...args); 31 } 32 else { 33 // Fixes on Android: 34 // WARN `new NativeEventEmitter()` was called with a non-null argument without the required `addListener` method. 35 // WARN `new NativeEventEmitter()` was called with a non-null argument without the required `removeListeners` method. 36 NativeModulesProxy[moduleName].addListener = () => { }; 37 NativeModulesProxy[moduleName].removeListeners = () => { }; 38 } 39 }); 40} 41else { 42 console.warn(`The "EXNativeModulesProxy" native module is not exported through NativeModules; verify that expo-modules-core's native code is linked properly`); 43} 44export default NativeModulesProxy; 45//# sourceMappingURL=NativeModulesProxy.native.js.map