%PDF- %PDF-
Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/test/addons/async-resource/ |
Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/test/addons/async-resource/binding.cc |
#include "node.h" #include <assert.h> #include <vector> namespace { using node::AsyncResource; using v8::External; using v8::Function; using v8::FunctionCallbackInfo; using v8::Integer; using v8::Isolate; using v8::Local; using v8::MaybeLocal; using v8::Object; using v8::String; using v8::Value; int custom_async_resource_destructor_calls = 0; class CustomAsyncResource : public AsyncResource { public: CustomAsyncResource(Isolate* isolate, Local<Object> resource) : AsyncResource(isolate, resource, "CustomAsyncResource") {} ~CustomAsyncResource() { custom_async_resource_destructor_calls++; } }; void CreateAsyncResource(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); assert(args[0]->IsObject()); AsyncResource* r; if (args[1]->IsInt32()) { r = new AsyncResource(isolate, args[0].As<Object>(), "foobär", args[1].As<Integer>()->Value()); } else { r = new AsyncResource(isolate, args[0].As<Object>(), "foobär"); } args.GetReturnValue().Set( External::New(isolate, static_cast<void*>(r))); } void DestroyAsyncResource(const FunctionCallbackInfo<Value>& args) { assert(args[0]->IsExternal()); auto r = static_cast<AsyncResource*>(args[0].As<External>()->Value()); delete r; } void CallViaFunction(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); assert(args[0]->IsExternal()); auto r = static_cast<AsyncResource*>(args[0].As<External>()->Value()); Local<String> name = String::NewFromUtf8(isolate, "methöd").ToLocalChecked(); Local<Value> fn = r->get_resource()->Get(isolate->GetCurrentContext(), name) .ToLocalChecked(); assert(fn->IsFunction()); Local<Value> arg = Integer::New(isolate, 42); MaybeLocal<Value> ret = r->MakeCallback(fn.As<Function>(), 1, &arg); args.GetReturnValue().Set(ret.FromMaybe(Local<Value>())); } void CallViaString(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); assert(args[0]->IsExternal()); auto r = static_cast<AsyncResource*>(args[0].As<External>()->Value()); Local<String> name = String::NewFromUtf8(isolate, "methöd").ToLocalChecked(); Local<Value> arg = Integer::New(isolate, 42); MaybeLocal<Value> ret = r->MakeCallback(name, 1, &arg); args.GetReturnValue().Set(ret.FromMaybe(Local<Value>())); } void CallViaUtf8Name(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); assert(args[0]->IsExternal()); auto r = static_cast<AsyncResource*>(args[0].As<External>()->Value()); Local<Value> arg = Integer::New(isolate, 42); MaybeLocal<Value> ret = r->MakeCallback("methöd", 1, &arg); args.GetReturnValue().Set(ret.FromMaybe(Local<Value>())); } void GetAsyncId(const FunctionCallbackInfo<Value>& args) { assert(args[0]->IsExternal()); auto r = static_cast<AsyncResource*>(args[0].As<External>()->Value()); args.GetReturnValue().Set(r->get_async_id()); } void GetTriggerAsyncId(const FunctionCallbackInfo<Value>& args) { assert(args[0]->IsExternal()); auto r = static_cast<AsyncResource*>(args[0].As<External>()->Value()); args.GetReturnValue().Set(r->get_trigger_async_id()); } void GetResource(const FunctionCallbackInfo<Value>& args) { assert(args[0]->IsExternal()); auto r = static_cast<AsyncResource*>(args[0].As<External>()->Value()); args.GetReturnValue().Set(r->get_resource()); } void RunSubclassTest(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); Local<Object> obj = Object::New(isolate); assert(custom_async_resource_destructor_calls == 0); CustomAsyncResource* resource = new CustomAsyncResource(isolate, obj); delete static_cast<AsyncResource*>(resource); assert(custom_async_resource_destructor_calls == 1); } void Initialize(Local<Object> exports) { NODE_SET_METHOD(exports, "createAsyncResource", CreateAsyncResource); NODE_SET_METHOD(exports, "destroyAsyncResource", DestroyAsyncResource); NODE_SET_METHOD(exports, "callViaFunction", CallViaFunction); NODE_SET_METHOD(exports, "callViaString", CallViaString); NODE_SET_METHOD(exports, "callViaUtf8Name", CallViaUtf8Name); NODE_SET_METHOD(exports, "getAsyncId", GetAsyncId); NODE_SET_METHOD(exports, "getTriggerAsyncId", GetTriggerAsyncId); NODE_SET_METHOD(exports, "getResource", GetResource); NODE_SET_METHOD(exports, "runSubclassTest", RunSubclassTest); } } // anonymous namespace NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)