• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)15 static 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)23 static 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)37 inline 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