#include "env-inl.h" #include "node_external_reference.h" #include "util-inl.h" #include "v8.h" #include namespace node { namespace { using v8::Context; using v8::Function; using v8::FunctionCallbackInfo; using v8::Local; using v8::Object; using v8::Value; void SetupTimers(const FunctionCallbackInfo& args) { CHECK(args[0]->IsFunction()); CHECK(args[1]->IsFunction()); auto env = Environment::GetCurrent(args); env->set_immediate_callback_function(args[0].As()); env->set_timers_callback_function(args[1].As()); } void GetLibuvNow(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); args.GetReturnValue().Set(env->GetNow()); } void ScheduleTimer(const FunctionCallbackInfo& args) { auto env = Environment::GetCurrent(args); env->ScheduleTimer(args[0]->IntegerValue(env->context()).FromJust()); } void ToggleTimerRef(const FunctionCallbackInfo& args) { Environment::GetCurrent(args)->ToggleTimerRef(args[0]->IsTrue()); } void ToggleImmediateRef(const FunctionCallbackInfo& args) { Environment::GetCurrent(args)->ToggleImmediateRef(args[0]->IsTrue()); } void Initialize(Local target, Local unused, Local context, void* priv) { Environment* env = Environment::GetCurrent(context); SetMethod(context, target, "getLibuvNow", GetLibuvNow); SetMethod(context, target, "setupTimers", SetupTimers); SetMethod(context, target, "scheduleTimer", ScheduleTimer); SetMethod(context, target, "toggleTimerRef", ToggleTimerRef); SetMethod(context, target, "toggleImmediateRef", ToggleImmediateRef); target ->Set(context, FIXED_ONE_BYTE_STRING(env->isolate(), "immediateInfo"), env->immediate_info()->fields().GetJSArray()) .Check(); target ->Set(context, FIXED_ONE_BYTE_STRING(env->isolate(), "timeoutInfo"), env->timeout_info().GetJSArray()) .Check(); } } // anonymous namespace void RegisterTimerExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(GetLibuvNow); registry->Register(SetupTimers); registry->Register(ScheduleTimer); registry->Register(ToggleTimerRef); registry->Register(ToggleImmediateRef); } } // namespace node NODE_BINDING_CONTEXT_AWARE_INTERNAL(timers, node::Initialize) NODE_BINDING_EXTERNAL_REFERENCE(timers, node::RegisterTimerExternalReferences)