From 3e7d067eeada840abc1e822bc8fe7d7f108d013f Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Thu, 10 Nov 2022 16:45:01 +0100 Subject: [PATCH] wip --- include/nodejs/node_osrm_support.hpp | 21 +++++++++++++++------ test/nodejs/index.js | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/include/nodejs/node_osrm_support.hpp b/include/nodejs/node_osrm_support.hpp index 7ab32c44f..2fefae935 100644 --- a/include/nodejs/node_osrm_support.hpp +++ b/include/nodejs/node_osrm_support.hpp @@ -76,6 +76,15 @@ template <> Napi::Value inline render(const Napi::Env& env, const ObjectOrString } } +inline bool IsUnsignedInteger(const Napi::Value &value) +{ + if (!value.IsNumber()) { + return false; + } + const auto doubleValue = value.ToNumber().DoubleValue(); + return doubleValue >= 0.0 && std::floor(doubleValue) == doubleValue; +} + inline void ParseResult(const osrm::Status &result_status, osrm::json::Object &result) { @@ -1177,17 +1186,17 @@ argumentsToTileParameters(const Napi::CallbackInfo &args, bool /*unused*/) if (x.IsEmpty() || y.IsEmpty() || z.IsEmpty()) return tile_parameters_ptr(); - if (!x.IsNumber() && !x.IsUndefined()) + if (!IsUnsignedInteger(x) && !x.IsUndefined()) { ThrowError(args.Env(), "Tile x coordinate must be unsigned interger"); return tile_parameters_ptr(); } - if (!y.IsNumber() && !y.IsUndefined()) + if (!IsUnsignedInteger(y) && !y.IsUndefined()) { ThrowError(args.Env(), "Tile y coordinate must be unsigned interger"); return tile_parameters_ptr(); } - if (!z.IsNumber() && !z.IsUndefined()) + if (!IsUnsignedInteger(z) && !z.IsUndefined()) { ThrowError(args.Env(), "Tile z coordinate must be unsigned interger"); return tile_parameters_ptr(); @@ -1225,7 +1234,7 @@ argumentsToNearestParameter(const Napi::CallbackInfo &args, Napi::Value number = obj.Get("number"); - if (!number.IsNumber()) + if (!IsUnsignedInteger(number)) { ThrowError(args.Env(), "Number must be an integer greater than or equal to 1"); return nearest_parameters_ptr(); @@ -1280,7 +1289,7 @@ argumentsToTableParameter(const Napi::CallbackInfo &args, if (source.IsEmpty()) return table_parameters_ptr(); - if (source.IsNumber()) + if (IsUnsignedInteger(source)) { size_t source_value = source.ToNumber().Uint32Value(); if (source_value >= params->coordinates.size()) @@ -1318,7 +1327,7 @@ argumentsToTableParameter(const Napi::CallbackInfo &args, if (destination.IsEmpty()) return table_parameters_ptr(); - if (destination.IsNumber()) + if (IsUnsignedInteger(destination)) { size_t destination_value = destination.ToNumber().Uint32Value(); if (destination_value >= params->coordinates.size()) diff --git a/test/nodejs/index.js b/test/nodejs/index.js index bbe58849f..f08356706 100644 --- a/test/nodejs/index.js +++ b/test/nodejs/index.js @@ -8,7 +8,7 @@ var monaco_corech_path = require('./constants').corech_data_path; test('constructor: throws if new keyword is not used', function(assert) { assert.plan(1); assert.throws(function() { OSRM(); }, - /Cannot call constructor as function, you need to use 'new' keyword/); + /Class constructors cannot be invoked without 'new'/); }); test('constructor: uses defaults with no parameter', function(assert) {