diff --git a/RNTester/RNTester/RNTesterTurboModuleProvider.mm b/RNTester/RNTester/RNTesterTurboModuleProvider.mm index b93d94878fe..f25472b5689 100644 --- a/RNTester/RNTester/RNTesterTurboModuleProvider.mm +++ b/RNTester/RNTester/RNTesterTurboModuleProvider.mm @@ -11,7 +11,7 @@ #import "RNTesterTurboModuleProvider.h" #import -#import +#import // NOTE: This entire file should be codegen'ed. diff --git a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/jsireact/TurboModuleManager.cpp b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/jsireact/TurboModuleManager.cpp index 8cfa6621a72..34c30a5f00b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/jsireact/TurboModuleManager.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/jsireact/TurboModuleManager.cpp @@ -56,6 +56,11 @@ void TurboModuleManager::installJSIBindings() { } TurboModuleBinding::install(*runtime_, std::make_shared( [this](const std::string &name) { + auto cxxModule = turboModuleManagerDelegate_->cthis()->getTurboModule(name, jsCallInvoker_); + if (cxxModule) { + return cxxModule; + } + const auto moduleInstance = getJavaModule(name); return turboModuleManagerDelegate_->cthis()->getTurboModule(name, moduleInstance, jsCallInvoker_); }) diff --git a/ReactCommon/turbomodule/samples/platform/ios/NativeSampleTurboCxxModuleSpecJSI.cpp b/ReactCommon/turbomodule/samples/NativeSampleTurboCxxModuleSpecJSI.cpp similarity index 100% rename from ReactCommon/turbomodule/samples/platform/ios/NativeSampleTurboCxxModuleSpecJSI.cpp rename to ReactCommon/turbomodule/samples/NativeSampleTurboCxxModuleSpecJSI.cpp diff --git a/ReactCommon/turbomodule/samples/platform/ios/NativeSampleTurboCxxModuleSpecJSI.h b/ReactCommon/turbomodule/samples/NativeSampleTurboCxxModuleSpecJSI.h similarity index 100% rename from ReactCommon/turbomodule/samples/platform/ios/NativeSampleTurboCxxModuleSpecJSI.h rename to ReactCommon/turbomodule/samples/NativeSampleTurboCxxModuleSpecJSI.h diff --git a/ReactCommon/turbomodule/samples/SampleTurboCxxModule.cpp b/ReactCommon/turbomodule/samples/SampleTurboCxxModule.cpp new file mode 100644 index 00000000000..4062e05ed7e --- /dev/null +++ b/ReactCommon/turbomodule/samples/SampleTurboCxxModule.cpp @@ -0,0 +1,94 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "SampleTurboCxxModule.h" + +#import + +using namespace facebook; + +namespace facebook { +namespace react { + +SampleTurboCxxModule::SampleTurboCxxModule( + std::shared_ptr jsInvoker) + : NativeSampleTurboCxxModuleSpecJSI(jsInvoker) {} + +void SampleTurboCxxModule::voidFunc(jsi::Runtime &rt) { + // Nothing to do +} + +bool SampleTurboCxxModule::getBool(jsi::Runtime &rt, bool arg) { + return arg; +} + +double SampleTurboCxxModule::getNumber(jsi::Runtime &rt, double arg) { + return arg; +} + +jsi::String SampleTurboCxxModule::getString( + jsi::Runtime &rt, + const jsi::String &arg) { + return jsi::String::createFromUtf8(rt, arg.utf8(rt)); +} + +jsi::Array SampleTurboCxxModule::getArray( + jsi::Runtime &rt, + const jsi::Array &arg) { + return deepCopyJSIArray(rt, arg); +} + +jsi::Object SampleTurboCxxModule::getObject( + jsi::Runtime &rt, + const jsi::Object &arg) { + return deepCopyJSIObject(rt, arg); +} + +jsi::Object SampleTurboCxxModule::getValue( + jsi::Runtime &rt, + double x, + const jsi::String &y, + const jsi::Object &z) { + // Note: return type isn't type-safe. + jsi::Object result(rt); + result.setProperty(rt, "x", jsi::Value(x)); + result.setProperty(rt, "y", jsi::String::createFromUtf8(rt, y.utf8(rt))); + result.setProperty(rt, "z", deepCopyJSIObject(rt, z)); + return result; +} + +void SampleTurboCxxModule::getValueWithCallback( + jsi::Runtime &rt, + const jsi::Function &callback) { + callback.call(rt, jsi::String::createFromUtf8(rt, "value from callback!")); +} + +jsi::Value SampleTurboCxxModule::getValueWithPromise( + jsi::Runtime &rt, + bool error) { + return createPromiseAsJSIValue( + rt, [error](jsi::Runtime &rt2, std::shared_ptr promise) { + if (error) { + promise->reject("intentional promise rejection"); + } else { + promise->resolve(jsi::String::createFromUtf8(rt2, "result!")); + } + }); +} + +jsi::Object SampleTurboCxxModule::getConstants(jsi::Runtime &rt) { + // Note: return type isn't type-safe. + jsi::Object result(rt); + result.setProperty(rt, "const1", jsi::Value(true)); + result.setProperty(rt, "const2", jsi::Value(375)); + result.setProperty( + rt, "const3", jsi::String::createFromUtf8(rt, "something")); + return result; +} + +} // namespace react +} // namespace facebook diff --git a/ReactCommon/turbomodule/samples/SampleTurboCxxModule.h b/ReactCommon/turbomodule/samples/SampleTurboCxxModule.h new file mode 100644 index 00000000000..6275b75e11d --- /dev/null +++ b/ReactCommon/turbomodule/samples/SampleTurboCxxModule.h @@ -0,0 +1,44 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#import + +#import "NativeSampleTurboCxxModuleSpecJSI.h" + +namespace facebook { +namespace react { + +/** + * A sample implementation of the C++ spec. In practice, this class can just + * extend jsi::HostObject directly, but using the spec provides build-time + * type-safety. + */ +class SampleTurboCxxModule : public NativeSampleTurboCxxModuleSpecJSI { + public: + SampleTurboCxxModule(std::shared_ptr jsInvoker); + + void voidFunc(jsi::Runtime &rt) override; + bool getBool(jsi::Runtime &rt, bool arg) override; + double getNumber(jsi::Runtime &rt, double arg) override; + jsi::String getString(jsi::Runtime &rt, const jsi::String &arg) override; + jsi::Array getArray(jsi::Runtime &rt, const jsi::Array &arg) override; + jsi::Object getObject(jsi::Runtime &rt, const jsi::Object &arg) override; + jsi::Object getValue( + jsi::Runtime &rt, + double x, + const jsi::String &y, + const jsi::Object &z) override; + void getValueWithCallback(jsi::Runtime &rt, const jsi::Function &callback) + override; + jsi::Value getValueWithPromise(jsi::Runtime &rt, bool error) override; + jsi::Object getConstants(jsi::Runtime &rt) override; +}; + +} // namespace react +} // namespace facebook diff --git a/ReactCommon/turbomodule/samples/platform/ios/RCTSampleTurboCxxModule.h b/ReactCommon/turbomodule/samples/platform/ios/RCTSampleTurboCxxModule.h index e4fc54f788f..5987d53cd44 100644 --- a/ReactCommon/turbomodule/samples/platform/ios/RCTSampleTurboCxxModule.h +++ b/ReactCommon/turbomodule/samples/platform/ios/RCTSampleTurboCxxModule.h @@ -7,39 +7,9 @@ #pragma once -#import - #import #import -#import "NativeSampleTurboCxxModuleSpecJSI.h" - -namespace facebook { -namespace react { - -/** - * A sample implementation of the C++ spec. In practice, this class can just extend jsi::HostObject - * directly, but using the spec provides build-time type-safety. - */ -class SampleTurboCxxModule : public NativeSampleTurboCxxModuleSpecJSI { -public: - SampleTurboCxxModule(std::shared_ptr jsInvoker); - - void voidFunc(jsi::Runtime &rt) override; - bool getBool(jsi::Runtime &rt, bool arg) override; - double getNumber(jsi::Runtime &rt, double arg) override; - jsi::String getString(jsi::Runtime &rt, const jsi::String &arg) override; - jsi::Array getArray(jsi::Runtime &rt, const jsi::Array &arg) override; - jsi::Object getObject(jsi::Runtime &rt, const jsi::Object &arg) override; - jsi::Object getValue(jsi::Runtime &rt, double x, const jsi::String &y, const jsi::Object &z) override; - void getValueWithCallback(jsi::Runtime &rt, const jsi::Function &callback) override; - jsi::Value getValueWithPromise(jsi::Runtime &rt, bool error) override; - jsi::Object getConstants(jsi::Runtime &rt) override; -}; - -} // namespace react -} // namespace facebook - /** * Sample backward-compatible RCTCxxModule-based module. * With jsi::HostObject, this class is no longer necessary, but the system supports it for diff --git a/ReactCommon/turbomodule/samples/platform/ios/RCTSampleTurboCxxModule.mm b/ReactCommon/turbomodule/samples/platform/ios/RCTSampleTurboCxxModule.mm index 4fa19f1e8ba..873661c9779 100644 --- a/ReactCommon/turbomodule/samples/platform/ios/RCTSampleTurboCxxModule.mm +++ b/ReactCommon/turbomodule/samples/platform/ios/RCTSampleTurboCxxModule.mm @@ -8,78 +8,11 @@ #import "RCTSampleTurboCxxModule.h" #import -#import - +#import #import "SampleTurboCxxModuleLegacyImpl.h" using namespace facebook; -namespace facebook { -namespace react { - -SampleTurboCxxModule::SampleTurboCxxModule(std::shared_ptr jsInvoker) - : NativeSampleTurboCxxModuleSpecJSI(jsInvoker) {} - -void SampleTurboCxxModule::voidFunc(jsi::Runtime &rt) { - // Nothing to do -} - -bool SampleTurboCxxModule::getBool(jsi::Runtime &rt, bool arg) { - return arg; -} - -double SampleTurboCxxModule::getNumber(jsi::Runtime &rt, double arg) { - return arg; -} - -jsi::String SampleTurboCxxModule::getString(jsi::Runtime &rt, const jsi::String &arg) { - return jsi::String::createFromUtf8(rt, arg.utf8(rt)); -} - -jsi::Array SampleTurboCxxModule::getArray(jsi::Runtime &rt, const jsi::Array &arg) { - return deepCopyJSIArray(rt, arg); -} - -jsi::Object SampleTurboCxxModule::getObject(jsi::Runtime &rt, const jsi::Object &arg) { - return deepCopyJSIObject(rt, arg); -} - -jsi::Object SampleTurboCxxModule::getValue(jsi::Runtime &rt, double x, const jsi::String &y, const jsi::Object &z) { - // Note: return type isn't type-safe. - jsi::Object result(rt); - result.setProperty(rt, "x", jsi::Value(x)); - result.setProperty(rt, "y", jsi::String::createFromUtf8(rt, y.utf8(rt))); - result.setProperty(rt, "z", deepCopyJSIObject(rt, z)); - return result; -} - -void SampleTurboCxxModule::getValueWithCallback(jsi::Runtime &rt, const jsi::Function &callback) { - callback.call(rt, jsi::String::createFromUtf8(rt, "value from callback!")); -} - -jsi::Value SampleTurboCxxModule::getValueWithPromise(jsi::Runtime &rt, bool error) { - return createPromiseAsJSIValue(rt, [error](jsi::Runtime &rt2, std::shared_ptr promise) { - if (error) { - promise->reject("intentional promise rejection"); - } else { - promise->resolve(jsi::String::createFromUtf8(rt2, "result!")); - } - }); -} - -jsi::Object SampleTurboCxxModule::getConstants(jsi::Runtime &rt) { - // Note: return type isn't type-safe. - jsi::Object result(rt); - result.setProperty(rt, "const1", jsi::Value(true)); - result.setProperty(rt, "const2", jsi::Value(375)); - result.setProperty(rt, "const3", jsi::String::createFromUtf8(rt, "something")); - return result; -} - -} // namespace react -} // namespace facebook - - // ObjC++ wrapper. @implementation RCTSampleTurboCxxModule_v1