1*ab11e3c9SKudo Chien #include "RemoteObject.h"
2*ab11e3c9SKudo Chien #include <jsi/jsi.h>
3*ab11e3c9SKudo Chien #include "RuntimeDecorator.h"
4*ab11e3c9SKudo Chien #include "SharedParent.h"
5*ab11e3c9SKudo Chien 
6*ab11e3c9SKudo Chien using namespace facebook;
7*ab11e3c9SKudo Chien 
8*ab11e3c9SKudo Chien namespace reanimated {
9*ab11e3c9SKudo Chien 
maybeInitializeOnWorkletRuntime(jsi::Runtime & rt)10*ab11e3c9SKudo Chien void RemoteObject::maybeInitializeOnWorkletRuntime(jsi::Runtime &rt) {
11*ab11e3c9SKudo Chien   if (initializer.get() != nullptr) {
12*ab11e3c9SKudo Chien     backing = getWeakRef(rt);
13*ab11e3c9SKudo Chien     *backing.lock() = initializer->shallowClone(rt);
14*ab11e3c9SKudo Chien     initializer = nullptr;
15*ab11e3c9SKudo Chien   }
16*ab11e3c9SKudo Chien }
17*ab11e3c9SKudo Chien 
get(jsi::Runtime & rt,const jsi::PropNameID & name)18*ab11e3c9SKudo Chien jsi::Value RemoteObject::get(jsi::Runtime &rt, const jsi::PropNameID &name) {
19*ab11e3c9SKudo Chien   if (RuntimeDecorator::isWorkletRuntime(rt)) {
20*ab11e3c9SKudo Chien     return backing.lock()->getObject(rt).getProperty(rt, name);
21*ab11e3c9SKudo Chien   }
22*ab11e3c9SKudo Chien   return jsi::Value::undefined();
23*ab11e3c9SKudo Chien }
24*ab11e3c9SKudo Chien 
set(jsi::Runtime & rt,const jsi::PropNameID & name,const jsi::Value & value)25*ab11e3c9SKudo Chien void RemoteObject::set(
26*ab11e3c9SKudo Chien     jsi::Runtime &rt,
27*ab11e3c9SKudo Chien     const jsi::PropNameID &name,
28*ab11e3c9SKudo Chien     const jsi::Value &value) {
29*ab11e3c9SKudo Chien   if (RuntimeDecorator::isWorkletRuntime(rt)) {
30*ab11e3c9SKudo Chien     backing.lock()->getObject(rt).setProperty(rt, name, value);
31*ab11e3c9SKudo Chien   }
32*ab11e3c9SKudo Chien   // TODO: we should throw if trying to update remote from host runtime
33*ab11e3c9SKudo Chien }
34*ab11e3c9SKudo Chien 
getPropertyNames(jsi::Runtime & rt)35*ab11e3c9SKudo Chien std::vector<jsi::PropNameID> RemoteObject::getPropertyNames(jsi::Runtime &rt) {
36*ab11e3c9SKudo Chien   std::vector<jsi::PropNameID> res;
37*ab11e3c9SKudo Chien   auto propertyNames = backing.lock()->getObject(rt).getPropertyNames(rt);
38*ab11e3c9SKudo Chien   for (size_t i = 0, size = propertyNames.size(rt); i < size; i++) {
39*ab11e3c9SKudo Chien     res.push_back(jsi::PropNameID::forString(
40*ab11e3c9SKudo Chien         rt, propertyNames.getValueAtIndex(rt, i).asString(rt)));
41*ab11e3c9SKudo Chien   }
42*ab11e3c9SKudo Chien   return res;
43*ab11e3c9SKudo Chien }
44*ab11e3c9SKudo Chien 
45*ab11e3c9SKudo Chien } // namespace reanimated
46