From 973aa963f917df2c20a05dfea1b3af7314677e06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Fri, 20 Apr 2018 16:40:17 +0300 Subject: [PATCH] [node] move to Nan 2.10.0 --- package.json | 2 +- platform/node/src/node_expression.cpp | 2 +- platform/node/src/node_map.cpp | 38 +++++++++++++++++++-------- platform/node/src/node_map.hpp | 4 ++- platform/node/src/node_request.cpp | 3 ++- 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 977cd2b09..c3f0d7b8a 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ }, "license": "BSD-2-Clause", "dependencies": { - "nan": "~2.8", + "nan": "~2.10", "node-pre-gyp": "^0.6.37", "npm-run-all": "^4.0.2" }, diff --git a/platform/node/src/node_expression.cpp b/platform/node/src/node_expression.cpp index 27866ccbe..9faa41d8b 100644 --- a/platform/node/src/node_expression.cpp +++ b/platform/node/src/node_expression.cpp @@ -52,7 +52,7 @@ type::Type parseType(v8::Local type) { v8::Local Nkey = Nan::New("N").ToLocalChecked(); if (Nan::Has(type, Nkey).FromMaybe(false)) { - N = Nan::Get(type, Nkey).ToLocalChecked()->ToInt32()->Value(); + N = Nan::To(Nan::Get(type, Nkey).ToLocalChecked()).ToLocalChecked()->Value(); } return type::Array(itemType, N); } diff --git a/platform/node/src/node_map.cpp b/platform/node/src/node_map.cpp index 521cca1a5..bc40d56f4 100644 --- a/platform/node/src/node_map.cpp +++ b/platform/node/src/node_map.cpp @@ -353,6 +353,18 @@ NodeMap::RenderOptions NodeMap::ParseOptions(v8::Local obj) { return options; } +class RenderRequest : public Nan::AsyncResource { +public: + RenderRequest(v8::Local callback_) : AsyncResource("mbgl:RenderRequest") { + callback.Reset(callback_); + } + ~RenderRequest() { + callback.Reset(); + } + + Nan::Persistent callback; +}; + /** * Render an image from the currently-loaded style * @@ -385,15 +397,16 @@ void NodeMap::Render(const Nan::FunctionCallbackInfo& info) { return Nan::ThrowTypeError("Style is not loaded"); } - if (nodeMap->callback) { + if (nodeMap->req) { return Nan::ThrowError("Map is currently rendering an image"); } try { auto options = ParseOptions(Nan::To(info[0]).ToLocalChecked()); - assert(!nodeMap->callback); + assert(!nodeMap->req); assert(!nodeMap->image.data); - nodeMap->callback = std::make_unique(info[1].As()); + nodeMap->req = std::make_unique(Nan::To(info[1]).ToLocalChecked()); + nodeMap->startRender(std::move(options)); } catch (mbgl::style::conversion::Error& err) { return Nan::ThrowTypeError(err.message.c_str()); @@ -463,14 +476,17 @@ void NodeMap::renderFinished() { Unref(); // Move the callback and image out of the way so that the callback can start a new render call. - auto cb = std::move(callback); + auto request = std::move(req); auto img = std::move(image); - assert(cb); + assert(request); // These have to be empty to be prepared for the next render call. - assert(!callback); + assert(!req); assert(!image.data); + v8::Local callback = Nan::New(request->callback); + v8::Local target = Nan::New(); + if (error) { std::string errorMessage; @@ -488,7 +504,7 @@ void NodeMap::renderFinished() { error = nullptr; assert(!error); - cb->Call(1, argv); + request->runInAsyncScope(target, callback, 1, argv); } else if (img.data) { v8::Local pixels = Nan::NewBuffer( reinterpret_cast(img.data.get()), img.bytes(), @@ -504,12 +520,12 @@ void NodeMap::renderFinished() { Nan::Null(), pixels }; - cb->Call(2, argv); + request->runInAsyncScope(target, callback, 2, argv); } else { v8::Local argv[] = { Nan::Error("Didn't get an image") }; - cb->Call(1, argv); + request->runInAsyncScope(target, callback, 1, argv); } } @@ -552,7 +568,7 @@ void NodeMap::Cancel(const Nan::FunctionCallbackInfo& info) { auto nodeMap = Nan::ObjectWrap::Unwrap(info.Holder()); if (!nodeMap->map) return Nan::ThrowError(releasedMessage()); - if (!nodeMap->callback) return Nan::ThrowError("No render in progress"); + if (!nodeMap->req) return Nan::ThrowError("No render in progress"); try { nodeMap->cancel(); @@ -1198,7 +1214,7 @@ std::unique_ptr NodeMap::request(const mbgl::Resource& resou Nan::New(&callback_) }; - auto instance = Nan::New(NodeRequest::constructor)->NewInstance(2, argv); + auto instance = Nan::NewInstance(Nan::New(NodeRequest::constructor), 2, argv).ToLocalChecked(); Nan::Set(instance, Nan::New("url").ToLocalChecked(), Nan::New(resource.url).ToLocalChecked()); Nan::Set(instance, Nan::New("kind").ToLocalChecked(), Nan::New(resource.kind)); diff --git a/platform/node/src/node_map.hpp b/platform/node/src/node_map.hpp index 7fe23ad86..19df09548 100644 --- a/platform/node/src/node_map.hpp +++ b/platform/node/src/node_map.hpp @@ -25,6 +25,8 @@ class NodeMapObserver : public mbgl::MapObserver { void onDidFailLoadingMap(std::exception_ptr) override; }; +class RenderRequest; + class NodeMap : public Nan::ObjectWrap, public mbgl::FileSource { public: @@ -84,7 +86,7 @@ public: std::exception_ptr error; mbgl::PremultipliedImage image; - std::unique_ptr callback; + std::unique_ptr req; // Async for delivering the notifications of render completion. uv_async_t *async; diff --git a/platform/node/src/node_request.cpp b/platform/node/src/node_request.cpp index de16710f7..8c26d4458 100644 --- a/platform/node/src/node_request.cpp +++ b/platform/node/src/node_request.cpp @@ -124,7 +124,8 @@ void NodeRequest::HandleCallback(const Nan::FunctionCallbackInfo& inf void NodeRequest::Execute() { v8::Local argv[] = { handle() }; - Nan::MakeCallback(Nan::To(target->handle()->GetInternalField(1)).ToLocalChecked(), "request", 1, argv); + Nan::AsyncResource res("mbgl:execute"); + res.runInAsyncScope(Nan::To(target->handle()->GetInternalField(1)).ToLocalChecked(), "request", 1, argv); } NodeRequest::NodeAsyncRequest::NodeAsyncRequest(NodeRequest* request_) : request(request_) {