var stream = require("stream"); var util = require("util"); var Promise = require("promise"); function isInBbox(position, bbox) { if(position.lat > bbox.top || position.lat < bbox.bottom) return false; if(bbox.right < bbox.left) // bbox spans over lon = 180 return (position.lon > bbox.left || position.lon < bbox.right); else return (position.lon > bbox.left && position.lon < bbox.right); } function filterStream(inStream, filterFunction) { var ret = new stream.Readable({ objectMode: true }); inStream.on("data", function(data) { var data = filterFunction(data); if(data != null) ret.push(data); }).on("end", function() { ret.push(); }).on("error", function(err) { ret.emit("error", err); }); ret._read = function() { }; return ret; } function filterStreamPromise(inStream, filterFunction) { var error = false; var ret = new stream.Readable({ objectMode: true }); var running = false; var queue = [ ]; function handleQueue() { if(error || running) return; if(queue.length > 0) { var next = queue.shift(); if(next == null) { ret.push(null); } else { running = true; Promise.nodeify(filterFunction)(next, function(err, newData) { running = false; if(error) return; if(err) { error = true; ret.emit("error", err); } else if(newData != null) { ret.push(newData); } setImmediate(handleQueue); }); } } } inStream.on("data", function(data) { if(data != null) queue.push(data); handleQueue(); }).on("end", function() { queue.push(null); handleQueue(); }).on("error", function(err) { ret.emit("error", err); }); ret._read = function() { }; return ret; } function extend(obj1, obj2) { if(obj1 == null) return null; for(var i=1; i/g, '>').replace(/"/g, '"'); } function isoDate(date) { if(!date) date = new Date(); function pad(number, length) { number = "" + number; while(number.length < length) number = "0" + number; return number; } return pad(date.getUTCFullYear(), 4) + '-' + pad(date.getUTCMonth()+1, 2) + '-' + pad(date.getUTCDate(), 2) + 'T' + pad(date.getUTCHours(), 2) + ':' + pad(date.getUTCMinutes(), 2) + ':' + pad(date.getUTCSeconds(), 2) + 'Z'; } module.exports = { isInBbox : isInBbox, filterStream : filterStream, filterStreamPromise : filterStreamPromise, extend : extend, calculateDistance : calculateDistance, generateRandomId : generateRandomId, stripObject : stripObject, ArrayStream : ArrayStream, streamEachPromise : streamEachPromise, escapeXml : escapeXml, isoDate : isoDate };