1 #include <node.h> 2 #include <v8.h> 3 4 namespace { 5 6 using v8::FunctionCallbackInfo; 7 using v8::Isolate; 8 using v8::Local; 9 using v8::NewStringType; 10 using v8::Object; 11 using v8::Promise; 12 using v8::String; 13 using v8::Value; 14 ThrowError(Isolate * isolate,const char * err_msg)15static void ThrowError(Isolate* isolate, const char* err_msg) { 16 Local<String> str = String::NewFromOneByte( 17 isolate, 18 reinterpret_cast<const uint8_t*>(err_msg), 19 NewStringType::kNormal).ToLocalChecked(); 20 isolate->ThrowException(str); 21 } 22 GetPromiseField(const FunctionCallbackInfo<Value> & args)23static void GetPromiseField(const FunctionCallbackInfo<Value>& args) { 24 auto isolate = args.GetIsolate(); 25 26 if (!args[0]->IsPromise()) 27 return ThrowError(isolate, "arg is not an Promise"); 28 29 auto p = args[0].As<Promise>(); 30 if (p->InternalFieldCount() < 1) 31 return ThrowError(isolate, "Promise has no internal field"); 32 33 auto l = p->GetInternalField(0); 34 args.GetReturnValue().Set(l); 35 } 36 Initialize(v8::Local<v8::Object> binding)37inline void Initialize(v8::Local<v8::Object> binding) { 38 NODE_SET_METHOD(binding, "getPromiseField", GetPromiseField); 39 } 40 41 NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) 42 43 } // anonymous namespace 44