88#include " RuntimeSchedulerBinding.h"
99#include " SchedulerPriority.h"
1010
11+ #include < react/debug/react_native_assert.h>
1112#include < memory>
1213
1314namespace facebook ::react {
1415
1516std::shared_ptr<RuntimeSchedulerBinding>
16- RuntimeSchedulerBinding::createAndInstallIfNeeded (jsi::Runtime &runtime) {
17+ RuntimeSchedulerBinding::createAndInstallIfNeeded (
18+ jsi::Runtime &runtime,
19+ RuntimeExecutor runtimeExecutor) {
1720 auto runtimeSchedulerModuleName = " nativeRuntimeScheduler" ;
1821
1922 auto runtimeSchedulerValue =
2023 runtime.global ().getProperty (runtime, runtimeSchedulerModuleName);
2124 if (runtimeSchedulerValue.isUndefined ()) {
2225 // The global namespace does not have an instance of the binding;
2326 // we need to create, install and return it.
24- auto runtimeSchedulerBinding = std::make_shared<RuntimeSchedulerBinding>();
27+ auto runtimeSchedulerBinding = std::make_shared<RuntimeSchedulerBinding>(
28+ RuntimeScheduler (runtimeExecutor));
2529 auto object =
2630 jsi::Object::createFromHostObject (runtime, runtimeSchedulerBinding);
2731 runtime.global ().setProperty (
@@ -35,11 +39,37 @@ RuntimeSchedulerBinding::createAndInstallIfNeeded(jsi::Runtime &runtime) {
3539 return runtimeSchedulerObject.getHostObject <RuntimeSchedulerBinding>(runtime);
3640}
3741
42+ RuntimeSchedulerBinding::RuntimeSchedulerBinding (
43+ RuntimeScheduler runtimeScheduler)
44+ : runtimeScheduler_(std::move(runtimeScheduler)) {}
45+
3846jsi::Value RuntimeSchedulerBinding::get (
3947 jsi::Runtime &runtime,
4048 jsi::PropNameID const &name) {
4149 auto propertyName = name.utf8 (runtime);
4250
51+ if (propertyName == " unstable_scheduleCallback" ) {
52+ return jsi::Function::createFromHostFunction (
53+ runtime,
54+ name,
55+ 3 ,
56+ [this ](
57+ jsi::Runtime &runtime,
58+ jsi::Value const &,
59+ jsi::Value const *arguments,
60+ size_t ) noexcept -> jsi::Value {
61+ SchedulerPriority priority = fromRawValue (arguments[0 ].getNumber ());
62+ auto callback = arguments[1 ].getObject (runtime).getFunction (runtime);
63+ react_native_assert (arguments[2 ].isUndefined ());
64+
65+ auto task = std::make_shared<Task>(priority, std::move (callback));
66+ runtimeScheduler_.scheduleTask (task);
67+
68+ // TODO: return reference to the task.
69+ return jsi::Value::undefined ();
70+ });
71+ }
72+
4373 if (propertyName == " unstable_ImmediatePriority" ) {
4474 return jsi::Value (runtime, serialize (SchedulerPriority::ImmediatePriority));
4575 }
0 commit comments