diff --git a/binding.cc b/binding.cc index 4db8cf0..0b05e64 100644 --- a/binding.cc +++ b/binding.cc @@ -95,6 +95,28 @@ static bool IsObject (napi_env env, napi_value value) { return type == napi_object; } +std::string toString(napi_env& env, const napi_value& from) { + size_t size = 0; + if (IsString(env, from)) { + napi_get_value_string_utf8(env, from, NULL, 0, &size); + if (size < 4096) { + char store[4096]; + napi_get_value_string_utf8(env, from, store, 4096, &size); + return std::string(store, size); + } else { + std::unique_ptr store(new char[size + 1]); + napi_get_value_string_utf8(env, from, store.get(), size + 1, &size); + return std::string(store.get(), size); + } + } else if (IsBuffer(env, from)) { + char* data = nullptr; + napi_get_buffer_info(env, from, reinterpret_cast(&data), &size); + return std::string(data, size); + } + + return ""; +} + /** * Create an error object. */ @@ -259,10 +281,7 @@ static std::optional RangeOption (napi_env env, napi_value opts, co napi_value value = GetProperty(env, opts, name); if (StringOrBufferLength(env, value) >= 0) { - LD_STRING_OR_BUFFER_TO_COPY(env, value, to); - auto str = std::string(toCh_, toSz_); - delete[] toCh_; - return str; + return toString(env, value); } } @@ -284,9 +303,7 @@ static std::vector* KeyArray (napi_env env, napi_value arr) { if (napi_get_element(env, arr, i, &element) == napi_ok && StringOrBufferLength(env, element) >= 0) { - LD_STRING_OR_BUFFER_TO_COPY(env, element, to); - result->emplace_back(toCh_, toSz_); - delete [] toCh_; + result->push_back(toString(env, element)); } } }