1*4440fb50SKudo Chien /** 2*4440fb50SKudo Chien * Copyright (c) Facebook, Inc. and its affiliates. 3*4440fb50SKudo Chien * 4*4440fb50SKudo Chien * This source code is licensed under the MIT license found in the 5*4440fb50SKudo Chien * LICENSE file in the root directory of this source tree. 6*4440fb50SKudo Chien */ 7*4440fb50SKudo Chien 8*4440fb50SKudo Chien #pragma once 9*4440fb50SKudo Chien 10*4440fb50SKudo Chien #include <ReactCommon/CallInvoker.h> 11*4440fb50SKudo Chien #include <jsi/jsi.h> 12*4440fb50SKudo Chien #include <memory> 13*4440fb50SKudo Chien #include <string> 14*4440fb50SKudo Chien #include <unordered_map> 15*4440fb50SKudo Chien 16*4440fb50SKudo Chien namespace facebook { 17*4440fb50SKudo Chien namespace react { 18*4440fb50SKudo Chien 19*4440fb50SKudo Chien /** 20*4440fb50SKudo Chien * For now, support the same set of return types as existing impl. 21*4440fb50SKudo Chien * This can be improved to support richer typed objects. 22*4440fb50SKudo Chien */ 23*4440fb50SKudo Chien enum TurboModuleMethodValueKind { 24*4440fb50SKudo Chien VoidKind, 25*4440fb50SKudo Chien BooleanKind, 26*4440fb50SKudo Chien NumberKind, 27*4440fb50SKudo Chien StringKind, 28*4440fb50SKudo Chien ObjectKind, 29*4440fb50SKudo Chien ArrayKind, 30*4440fb50SKudo Chien FunctionKind, 31*4440fb50SKudo Chien PromiseKind, 32*4440fb50SKudo Chien }; 33*4440fb50SKudo Chien 34*4440fb50SKudo Chien /** 35*4440fb50SKudo Chien * Base HostObject class for every module to be exposed to JS 36*4440fb50SKudo Chien */ 37*4440fb50SKudo Chien class JSI_EXPORT TurboModule : public facebook::jsi::HostObject { 38*4440fb50SKudo Chien public: 39*4440fb50SKudo Chien TurboModule(const std::string &name, std::shared_ptr<CallInvoker> jsInvoker); 40*4440fb50SKudo Chien virtual ~TurboModule(); 41*4440fb50SKudo Chien 42*4440fb50SKudo Chien facebook::jsi::Value get( 43*4440fb50SKudo Chien facebook::jsi::Runtime &runtime, 44*4440fb50SKudo Chien const facebook::jsi::PropNameID &propName) override; 45*4440fb50SKudo Chien 46*4440fb50SKudo Chien const std::string name_; 47*4440fb50SKudo Chien std::shared_ptr<CallInvoker> jsInvoker_; 48*4440fb50SKudo Chien 49*4440fb50SKudo Chien protected: 50*4440fb50SKudo Chien struct MethodMetadata { 51*4440fb50SKudo Chien size_t argCount; 52*4440fb50SKudo Chien facebook::jsi::Value (*invoker)( 53*4440fb50SKudo Chien facebook::jsi::Runtime &rt, 54*4440fb50SKudo Chien TurboModule &turboModule, 55*4440fb50SKudo Chien const facebook::jsi::Value *args, 56*4440fb50SKudo Chien size_t count); 57*4440fb50SKudo Chien }; 58*4440fb50SKudo Chien 59*4440fb50SKudo Chien std::unordered_map<std::string, MethodMetadata> methodMap_; 60*4440fb50SKudo Chien }; 61*4440fb50SKudo Chien 62*4440fb50SKudo Chien /** 63*4440fb50SKudo Chien * An app/platform-specific provider function to get an instance of a module 64*4440fb50SKudo Chien * given a name. 65*4440fb50SKudo Chien */ 66*4440fb50SKudo Chien using TurboModuleProviderFunctionType = 67*4440fb50SKudo Chien std::function<std::shared_ptr<TurboModule>(const std::string &name)>; 68*4440fb50SKudo Chien 69*4440fb50SKudo Chien } // namespace react 70*4440fb50SKudo Chien } // namespace facebook 71