Fixes problems associated with node 10 and NAN (#14847)

* Fixes problems associated with node 10 and NAN

* Follow up removal of unnecessary linking to map object

* Remove header left over from debugging
This commit is contained in:
Blake Thompson
2019-06-26 13:38:06 -05:00
committed by GitHub
parent 012ccecaa4
commit a16c67d953
4 changed files with 60 additions and 53 deletions

View File

@@ -8,11 +8,11 @@
namespace node_mbgl {
NodeRequest::NodeRequest(
NodeMap* target_,
mbgl::FileSource::Callback callback_)
: AsyncWorker(nullptr),
target(target_),
callback(std::move(callback_)) {
mbgl::FileSource::Callback callback_,
NodeAsyncRequest* asyncRequest_)
: callback(std::move(callback_)),
asyncRequest(asyncRequest_) {
asyncRequest->request = this;
}
NodeRequest::~NodeRequest() {
@@ -40,10 +40,16 @@ void NodeRequest::Init() {
void NodeRequest::New(const Nan::FunctionCallbackInfo<v8::Value>& info) {
auto target = reinterpret_cast<NodeMap*>(info[0].As<v8::External>()->Value());
auto callback = reinterpret_cast<mbgl::FileSource::Callback*>(info[1].As<v8::External>()->Value());
auto asyncRequest = reinterpret_cast<NodeAsyncRequest*>(info[2].As<v8::External>()->Value());
auto request = new NodeRequest(target, *callback);
auto request = new NodeRequest(*callback, asyncRequest);
request->Wrap(info.This());
request->Ref();
Nan::Set(info.This(), Nan::New("url").ToLocalChecked(), info[3]);
Nan::Set(info.This(), Nan::New("kind").ToLocalChecked(), info[4]);
v8::Local<v8::Value> argv[] = { info.This() };
request->asyncResource->runInAsyncScope(Nan::To<v8::Object>(target->handle()->GetInternalField(1)).ToLocalChecked(), "request", 1, argv);
info.GetReturnValue().Set(info.This());
}
@@ -52,7 +58,9 @@ void NodeRequest::HandleCallback(const Nan::FunctionCallbackInfo<v8::Value>& inf
// Move out of the object so callback() can only be fired once.
auto callback = std::move(request->callback);
request->callback = {};
if (!callback) {
request->unref();
return info.GetReturnValue().SetUndefined();
}
@@ -65,12 +73,18 @@ void NodeRequest::HandleCallback(const Nan::FunctionCallbackInfo<v8::Value>& inf
auto msg = Nan::New("message").ToLocalChecked();
if (Nan::Has(err, msg).FromJust()) {
request->SetErrorMessage(*Nan::Utf8String(
Nan::Get(err, msg).ToLocalChecked()));
response.error = std::make_unique<mbgl::Response::Error>(
mbgl::Response::Error::Reason::Other,
*Nan::Utf8String(Nan::Get(err, msg).ToLocalChecked())
);
}
} else if (info[0]->IsString()) {
request->SetErrorMessage(*Nan::Utf8String(info[0]));
response.error = std::make_unique<mbgl::Response::Error>(
mbgl::Response::Error::Reason::Other,
*Nan::Utf8String(info[0])
);
} else if (info.Length() < 2 || !info[1]->IsObject()) {
request->unref();
return Nan::ThrowTypeError("Second argument must be a response object");
} else {
auto res = Nan::To<v8::Object>(info[1]).ToLocalChecked();
@@ -104,43 +118,34 @@ void NodeRequest::HandleCallback(const Nan::FunctionCallbackInfo<v8::Value>& inf
node::Buffer::Length(data)
);
} else {
request->unref();
return Nan::ThrowTypeError("Response data must be a Buffer");
}
}
}
if (request->ErrorMessage()) {
response.error = std::make_unique<mbgl::Response::Error>(
mbgl::Response::Error::Reason::Other,
request->ErrorMessage()
);
}
// Send the response object to the NodeFileSource object
callback(response);
request->unref();
info.GetReturnValue().SetUndefined();
}
void NodeRequest::Execute() {
v8::Local<v8::Value> argv[] = { handle() };
Nan::AsyncResource res("mbgl:execute");
res.runInAsyncScope(Nan::To<v8::Object>(target->handle()->GetInternalField(1)).ToLocalChecked(), "request", 1, argv);
void NodeRequest::unref() {
Nan::HandleScope scope;
delete asyncResource;
asyncResource = nullptr;
Unref();
}
NodeRequest::NodeAsyncRequest::NodeAsyncRequest(NodeRequest* request_) : request(request_) {
assert(request);
NodeAsyncRequest::NodeAsyncRequest() : request(nullptr) {}
// Make sure the JS object has a pointer to this so that it can remove
// its pointer in the destructor
request->asyncRequest = this;
}
NodeRequest::NodeAsyncRequest::~NodeAsyncRequest() {
NodeAsyncRequest::~NodeAsyncRequest() {
if (request) {
// Remove the callback function because the AsyncRequest was
// canceled and we are no longer interested in the result.
request->callback = {};
if (request->callback) {
request->callback = {};
}
request->asyncRequest = nullptr;
}
}