summaryrefslogtreecommitdiff
path: root/platform/node/src
diff options
context:
space:
mode:
Diffstat (limited to 'platform/node/src')
-rw-r--r--platform/node/src/node_mapbox_gl_native.cpp27
-rw-r--r--platform/node/src/node_request.cpp68
2 files changed, 65 insertions, 30 deletions
diff --git a/platform/node/src/node_mapbox_gl_native.cpp b/platform/node/src/node_mapbox_gl_native.cpp
index dddd74aece..a51e047b92 100644
--- a/platform/node/src/node_mapbox_gl_native.cpp
+++ b/platform/node/src/node_mapbox_gl_native.cpp
@@ -56,6 +56,33 @@ void RegisterModule(v8::Local<v8::Object> target, v8::Local<v8::Object> module)
Nan::New("Resource").ToLocalChecked(),
resource);
+ // Exports ResourceStatus constants.
+ v8::Local<v8::Object> errorCode = Nan::New<v8::Object>();
+
+ Nan::Set(errorCode,
+ Nan::New("NotFound").ToLocalChecked(),
+ Nan::New(static_cast<int32_t>(mbgl::ResourceStatus::NotFoundError)));
+
+ Nan::Set(errorCode,
+ Nan::New("Server").ToLocalChecked(),
+ Nan::New(static_cast<int32_t>(mbgl::ResourceStatus::ServerError)));
+
+ Nan::Set(errorCode,
+ Nan::New("Connection").ToLocalChecked(),
+ Nan::New(static_cast<int32_t>(mbgl::ResourceStatus::ConnectionError)));
+
+ Nan::Set(errorCode,
+ Nan::New("RateLimit").ToLocalChecked(),
+ Nan::New(static_cast<int32_t>(mbgl::ResourceStatus::RateLimitError)));
+
+ Nan::Set(errorCode,
+ Nan::New("Other").ToLocalChecked(),
+ Nan::New(static_cast<int32_t>(mbgl::ResourceStatus::OtherError)));
+
+ Nan::Set(target,
+ Nan::New("ErrorCode").ToLocalChecked(),
+ errorCode);
+
// Make the exported object inherit from EventEmitter
v8::Local<v8::Function> require = Nan::Get(module,
Nan::New("require").ToLocalChecked()).ToLocalChecked().As<v8::Function>();
diff --git a/platform/node/src/node_request.cpp b/platform/node/src/node_request.cpp
index 29aaa43cd4..4246b7fc2e 100644
--- a/platform/node/src/node_request.cpp
+++ b/platform/node/src/node_request.cpp
@@ -58,43 +58,47 @@ void NodeRequest::HandleCallback(const Nan::FunctionCallbackInfo<v8::Value>& inf
mbgl::Response response;
- if (info.Length() < 1) {
- response.noContent = true;
- } else if (info[0]->IsObject()) {
+ if (info.Length() >= 1 && info[0]->BooleanValue()) {
+ // First parameter is an error argument.
auto err = Nan::To<v8::Object>(info[0]).ToLocalChecked();
- auto msg = Nan::New("message").ToLocalChecked();
-
- if (Nan::Has(err, msg).FromJust()) {
- request->SetErrorMessage(*Nan::Utf8String(
- Nan::Get(err, msg).ToLocalChecked()));
- }
- } else if (info[0]->IsString()) {
- request->SetErrorMessage(*Nan::Utf8String(info[0]));
- } else if (info.Length() < 2 || !info[1]->IsObject()) {
- return Nan::ThrowTypeError("Second argument must be a response object");
- } else {
- auto res = Nan::To<v8::Object>(info[1]).ToLocalChecked();
- if (Nan::Has(res, Nan::New("modified").ToLocalChecked()).FromJust()) {
- const double modified = Nan::To<double>(Nan::Get(res, Nan::New("modified").ToLocalChecked()).ToLocalChecked()).FromJust();
- if (!std::isnan(modified)) {
- response.modified = mbgl::Timestamp{ mbgl::Seconds(
- static_cast<mbgl::Seconds::rep>(modified / 1000)) };
+ // Extract the status code from the Error object, if it has one.
+ mbgl::ResourceStatus status = mbgl::ResourceStatus::OtherError;
+ if (Nan::Has(err, Nan::New("code").ToLocalChecked()).FromJust()) {
+ status = static_cast<mbgl::ResourceStatus>(
+ Nan::To<uint32_t>(Nan::Get(err, Nan::New("code").ToLocalChecked()).ToLocalChecked())
+ .FromMaybe(static_cast<uint32_t>(mbgl::ResourceStatus::OtherError)));
+ // Validate the enum value.
+ switch (status) {
+ case mbgl::ResourceStatus::NotFoundError:
+ case mbgl::ResourceStatus::ServerError:
+ case mbgl::ResourceStatus::ConnectionError:
+ case mbgl::ResourceStatus::RateLimitError:
+ case mbgl::ResourceStatus::OtherError:
+ // Valid error enums.
+ break;
+ default:
+ // Invalid error enums.
+ return Nan::ThrowTypeError("Invalid error code. Must be one of NotFound, server, Connection, RateLimit, or Other");
}
}
- if (Nan::Has(res, Nan::New("expires").ToLocalChecked()).FromJust()) {
- const double expires = Nan::To<double>(Nan::Get(res, Nan::New("expires").ToLocalChecked()).ToLocalChecked()).FromJust();
- if (!std::isnan(expires)) {
- response.expires = mbgl::Timestamp{ mbgl::Seconds(
- static_cast<mbgl::Seconds::rep>(expires / 1000)) };
- }
+ // Extract the error message from the Error object.
+ std::string message;
+ if (Nan::Has(err, Nan::New("message").ToLocalChecked()).FromJust()) {
+ Nan::Utf8String string(
+ Nan::Get(err, Nan::New("message").ToLocalChecked()).ToLocalChecked());
+ message.assign(*string, string.length());
+ } else {
+ Nan::Utf8String string(err);
+ message.assign(*string, string.length());
}
- if (Nan::Has(res, Nan::New("etag").ToLocalChecked()).FromJust()) {
- const Nan::Utf8String etag(Nan::Get(res, Nan::New("etag").ToLocalChecked()).ToLocalChecked());
- response.etag = std::string { *etag, size_t(etag.length()) };
- }
+ response.error = std::make_unique<mbgl::Response::Error>(status, message);
+ } else if (info.Length() >= 2) {
+ // This is a successful response. It has an object as the second parameter that
+ // may contain data.
+ auto res = Nan::To<v8::Object>(info[1]).ToLocalChecked();
if (Nan::Has(res, Nan::New("data").ToLocalChecked()).FromJust()) {
auto data = Nan::Get(res, Nan::New("data").ToLocalChecked()).ToLocalChecked();
@@ -106,7 +110,11 @@ void NodeRequest::HandleCallback(const Nan::FunctionCallbackInfo<v8::Value>& inf
} else {
return Nan::ThrowTypeError("Response data must be a Buffer");
}
+ } else {
+ response.noContent = true;
}
+ } else {
+ response.noContent = true;
}
if (request->ErrorMessage()) {