#include #include #include #include "zonedetect.h" using namespace Napi; ZoneDetect* zdTimezone; Object formatOutput(Env env, ZoneDetect* database, float lat, float lon, bool withNotice) { Object obj = Object::New(env); if(lat > 90 || lat < -90 || lon > 180 || lon < -180 || std::isnan(lat) || std::isnan(lon)){ return obj; } float safezone; ZoneDetectResult* results = ZDLookup(database, lat, lon, &safezone); if(!results){ return obj; } unsigned int index = 0; std::vector sobjects; while(results[index].lookupResult != ZD_LOOKUP_END) { Object sobj = Object::New(env); sobj.Set(Napi::String::New(env, "Result"), Napi::String::New(env, ZDLookupResultToString(results[index].lookupResult))); std::string finalTimezone; for(unsigned int i=0; i 0){ oceanTimezone += "-"; oceanTimezone += std::to_string(offsetGMT); } if(offsetGMT < 0){ oceanTimezone += "+"; oceanTimezone += std::to_string(-offsetGMT); } Object sobj = Object::New(env); sobj.Set(Napi::String::New(env, "Result"), Napi::String::New(env, "In zone")); sobj.Set(Napi::String::New(env, "CountryName"), Napi::String::New(env, "High seas")); sobj.Set(Napi::String::New(env, "TimezoneId"), Napi::String::New(env, oceanTimezone)); sobjects.push_back(sobj); } Array out = Array::New(env, sobjects.size()); for(unsigned i=0; i().Utf8Value(); zdTimezone = ZDOpenDatabase(path.c_str()); } void CloseDB(const CallbackInfo& info) { ZDCloseDatabase(zdTimezone); zdTimezone = nullptr; } Object Lookup(const CallbackInfo& info) { Env env = info.Env(); float lat = info[0].As(); float lon = info[1].As(); bool withNotice = info[2].As(); if(zdTimezone){ auto country = formatOutput(env, zdTimezone, lat, lon, withNotice); return country; } return Object::New(env); } Object Init(Env env, Object exports) { exports.Set("opendb", Function::New(env, OpenDB)); exports.Set("closedb", Function::New(env, CloseDB)); exports.Set("lookup", Function::New(env, Lookup)); return exports; } NODE_API_MODULE(addon, Init)