diff --git a/binding.gyp b/binding.gyp index 98e0f4e1c..6cf0d1cd6 100644 --- a/binding.gyp +++ b/binding.gyp @@ -19,8 +19,6 @@ 'platform/node/src/node_mapbox_gl_native.cpp', 'platform/node/src/node_log.hpp', 'platform/node/src/node_log.cpp', - 'platform/node/src/node_file_source.hpp', - 'platform/node/src/node_file_source.cpp', 'platform/node/src/node_map.hpp', 'platform/node/src/node_map.cpp', 'platform/node/src/node_request.hpp', diff --git a/platform/node/src/node_file_source.cpp b/platform/node/src/node_file_source.cpp deleted file mode 100644 index 5d7973f85..000000000 --- a/platform/node/src/node_file_source.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "node_file_source.hpp" -#include "node_request.hpp" -#include "node_mapbox_gl_native.hpp" - -namespace node_mbgl { - -class NodeFileSourceRequest : public mbgl::FileRequest { -public: - std::unique_ptr workRequest; -}; - -NodeFileSource::NodeFileSource(v8::Local options_) { - options.Reset(options_); -} - -NodeFileSource::~NodeFileSource() { - options.Reset(); -} - -std::unique_ptr NodeFileSource::request(const mbgl::Resource& resource, Callback callback) { - auto req = std::make_unique(); - - // This function can be called from any thread. Make sure we're executing the - // JS implementation in the node event loop. - req->workRequest = NodeRunLoop().invokeWithCallback([this] (mbgl::Resource res, Callback cb) { - Nan::HandleScope scope; - - auto requestHandle = NodeRequest::Create(res, cb)->ToObject(); - auto callbackHandle = Nan::GetFunction(Nan::New(NodeRequest::Respond, requestHandle)).ToLocalChecked(); - - v8::Local argv[] = { requestHandle, callbackHandle }; - Nan::MakeCallback(Nan::New(options), "request", 2, argv); - }, callback, resource); - - return std::move(req); -} - -} diff --git a/platform/node/src/node_file_source.hpp b/platform/node/src/node_file_source.hpp deleted file mode 100644 index 2ce673fb5..000000000 --- a/platform/node/src/node_file_source.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" -#pragma GCC diagnostic ignored "-Wshadow" -#pragma GCC diagnostic ignored "-Wnested-anon-types" -#include -#pragma GCC diagnostic pop - -namespace node_mbgl { - -class NodeFileSource : public mbgl::FileSource { -public: - NodeFileSource(v8::Local); - ~NodeFileSource(); - - std::unique_ptr request(const mbgl::Resource&, Callback); - -private: - Nan::Persistent options; -}; - -} diff --git a/platform/node/src/node_map.cpp b/platform/node/src/node_map.cpp index 6e9230287..99fbb919e 100644 --- a/platform/node/src/node_map.cpp +++ b/platform/node/src/node_map.cpp @@ -1,8 +1,11 @@ #include "node_map.hpp" +#include "node_request.hpp" +#include "node_mapbox_gl_native.hpp" #include #include #include +#include #include @@ -42,7 +45,7 @@ const static char* releasedMessage() { NAN_MODULE_INIT(NodeMap::Init) { v8::Local tpl = Nan::New(New); - tpl->InstanceTemplate()->SetInternalFieldCount(1); + tpl->InstanceTemplate()->SetInternalFieldCount(2); tpl->SetClassName(Nan::New("Map").ToLocalChecked()); Nan::SetPrototypeMethod(tpl, "load", Load); @@ -124,6 +127,8 @@ NAN_METHOD(NodeMap::New) { return Nan::ThrowError("Options object 'ratio' property must be a number"); } + info.This()->SetInternalField(1, options); + try { auto nodeMap = new NodeMap(options); nodeMap->Wrap(info.This()); @@ -427,8 +432,7 @@ NodeMap::NodeMap(v8::Local options) : Nan::HandleScope scope; return Nan::Has(options, Nan::New("ratio").ToLocalChecked()).FromJust() ? Nan::Get(options, Nan::New("ratio").ToLocalChecked()).ToLocalChecked()->NumberValue() : 1.0; }()), - fs(options), - map(std::make_unique(view, fs, mbgl::MapMode::Still)), + map(std::make_unique(view, *this, mbgl::MapMode::Still)), async(new uv_async_t) { async->data = this; @@ -444,4 +448,27 @@ NodeMap::~NodeMap() { if (valid) release(); } +class NodeFileSourceRequest : public mbgl::FileRequest { +public: + std::unique_ptr workRequest; +}; + +std::unique_ptr NodeMap::request(const mbgl::Resource& resource, Callback cb1) { + auto req = std::make_unique(); + + // This function can be called from any thread. Make sure we're executing the + // JS implementation in the node event loop. + req->workRequest = NodeRunLoop().invokeWithCallback([this] (mbgl::Resource res, Callback cb2) { + Nan::HandleScope scope; + + auto requestHandle = NodeRequest::Create(res, cb2)->ToObject(); + auto callbackHandle = Nan::GetFunction(Nan::New(NodeRequest::Respond, requestHandle)).ToLocalChecked(); + + v8::Local argv[] = { requestHandle, callbackHandle }; + Nan::MakeCallback(handle()->GetInternalField(1)->ToObject(), "request", 2, argv); + }, cb1, resource); + + return std::move(req); +} + } diff --git a/platform/node/src/node_map.hpp b/platform/node/src/node_map.hpp index 91cada17d..f610408d3 100644 --- a/platform/node/src/node_map.hpp +++ b/platform/node/src/node_map.hpp @@ -1,8 +1,7 @@ #pragma once -#include "node_file_source.hpp" - #include +#include #include #pragma GCC diagnostic push @@ -16,7 +15,8 @@ namespace node_mbgl { -class NodeMap : public Nan::ObjectWrap { +class NodeMap : public Nan::ObjectWrap, + public mbgl::FileSource { public: struct RenderOptions; class RenderWorker; @@ -43,8 +43,9 @@ public: NodeMap(v8::Local); ~NodeMap(); + std::unique_ptr request(const mbgl::Resource&, Callback); + mbgl::HeadlessView view; - NodeFileSource fs; std::unique_ptr map; std::exception_ptr error; diff --git a/platform/node/src/node_request.cpp b/platform/node/src/node_request.cpp index e08e4ffd1..4575d42a7 100644 --- a/platform/node/src/node_request.cpp +++ b/platform/node/src/node_request.cpp @@ -1,5 +1,4 @@ #include "node_request.hpp" -#include "node_file_source.hpp" #include #include