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