diff --git a/node_js/geozone.js b/node_js/geozone.js new file mode 100644 index 0000000..57c3354 --- /dev/null +++ b/node_js/geozone.js @@ -0,0 +1,27 @@ +var express = require('express'); +var zd = require('node_binding') +var router = express.Router(); + +zd.opendb("../library/timezone21.bin") + +router.get('/', function(req, res, next) { + if (typeof req.query === 'undefined') { + return res.send([]); + } + + var lat = parseFloat(req.query.lat) + var lon = parseFloat(req.query.lon) + var compact = req.query.c === "1"; + + var replacer = function(key, val) { + return val.toFixed ? Number(val.toFixed(6)) : val; + } + + var result = JSON.stringify(zd.lookup(lat, lon, !compact), replacer, compact?0:2) + + res.set('Access-Control-Allow-Origin', '*'); + res.set('Content-Type', 'application/json'); + res.send(result) +}); + +module.exports = router; diff --git a/node_js/node_binding/binding.cpp b/node_js/node_binding/binding.cpp new file mode 100644 index 0000000..bbb5eac --- /dev/null +++ b/node_js/node_binding/binding.cpp @@ -0,0 +1,130 @@ +#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) diff --git a/node_js/node_binding/binding.gyp b/node_js/node_binding/binding.gyp new file mode 100644 index 0000000..32d1e31 --- /dev/null +++ b/node_js/node_binding/binding.gyp @@ -0,0 +1,21 @@ +{ + "targets": [ + { + "target_name": "zd", + "sources": [ + "binding.cpp", + "../../library/zonedetect.c" + ], + "include_dirs": [ + "