// Copyright 2004-present Facebook. All Rights Reserved. #pragma once #include #include #include #include #include #include #include #include #include #include #include #ifndef RN_EXPORT #define RN_EXPORT __attribute__((visibility("default"))) #endif namespace facebook { namespace react { class MessageQueueThread; class RN_EXPORT JSCExecutorFactory : public JSExecutorFactory { public: JSCExecutorFactory(const folly::dynamic& jscConfig) : m_jscConfig(jscConfig) {} std::unique_ptr createJSExecutor( std::shared_ptr delegate, std::shared_ptr jsQueue) override; private: std::string m_cacheDir; folly::dynamic m_jscConfig; }; template struct ValueEncoder; class RN_EXPORT JSCExecutor : public JSExecutor { public: /** * Must be invoked from thread this Executor will run on. */ explicit JSCExecutor(std::shared_ptr delegate, std::shared_ptr messageQueueThread, const folly::dynamic& jscConfig) throw(JSException); ~JSCExecutor() override; virtual void loadApplicationScript( std::unique_ptr script, std::string sourceURL) override; virtual void setJSModulesUnbundle( std::unique_ptr unbundle) override; virtual void callFunction( const std::string& moduleId, const std::string& methodId, const folly::dynamic& arguments) override; virtual void invokeCallback( const double callbackId, const folly::dynamic& arguments) override; template Value callFunctionSync( const std::string& module, const std::string& method, T&& args) { return callFunctionSyncWithValue( module, method, ValueEncoder::type>::toValue( m_context, std::forward(args))); } virtual void setGlobalVariable( std::string propName, std::unique_ptr jsonValue) override; virtual void* getJavaScriptContext() override; virtual bool supportsProfiling() override; virtual void startProfiler(const std::string &titleString) override; virtual void stopProfiler(const std::string &titleString, const std::string &filename) override; virtual void handleMemoryPressureUiHidden() override; virtual void handleMemoryPressureModerate() override; virtual void handleMemoryPressureCritical() override; virtual void destroy() override; void setContextName(const std::string& name); private: JSGlobalContextRef m_context; std::shared_ptr m_delegate; std::shared_ptr m_isDestroyed = std::shared_ptr(new bool(false)); std::shared_ptr m_messageQueueThread; std::unique_ptr m_unbundle; JSCNativeModules m_nativeModules; folly::dynamic m_jscConfig; std::once_flag m_bindFlag; folly::Optional m_invokeCallbackAndReturnFlushedQueueJS; folly::Optional m_callFunctionReturnFlushedQueueJS; folly::Optional m_flushedQueueJS; folly::Optional m_callFunctionReturnResultAndFlushedQueueJS; void initOnJSVMThread() throw(JSException); // This method is experimental, and may be modified or removed. Value callFunctionSyncWithValue( const std::string& module, const std::string& method, Value value); void terminateOnJSVMThread(); void bindBridge() throw(JSException); void callNativeModules(Value&&); void flush(); void flushQueueImmediate(Value&&); void loadModule(uint32_t moduleId); String adoptString(std::unique_ptr); template void installNativeHook(const char* name); JSValueRef getNativeModule(JSObjectRef object, JSStringRef propertyName); JSValueRef nativeRequire( size_t argumentCount, const JSValueRef arguments[]); JSValueRef nativeFlushQueueImmediate( size_t argumentCount, const JSValueRef arguments[]); JSValueRef nativeCallSyncHook( size_t argumentCount, const JSValueRef arguments[]); }; } }