UNPKG

forecast.io-bluebird

Version:

Lightweight wrapper for Forecast.IO weather API that returns Bluebird promises.

78 lines (58 loc) 2.2 kB
var Https = require('https'); var Bluebird = require('bluebird'); var QueryString = require('querystring'); var version = require('./package').version; var Forecast = function(options) { if (!options || !options.key) throw new Error('Dark Sky API key must be specified! Get one from "https://developer.forecast.io/".'); this.key = options.key; this.timeout = options.timeout || 2000; }; Forecast.prototype.fetch = function(latitude, longitude, time, options) { if (!latitude || !longitude) throw new Error('Latitude and longitude are required parameters!'); var path = '/forecast/' + this.key + '/' + latitude + ',' + longitude; if (typeof(time) === 'number') { path += ',' + time.toString().substr(0, 10); } else if (typeof(time) === 'object') { options = time; } if (typeof(options) === 'object') { path += '?' + QueryString.stringify(options); } var parent = this, requestOptions = { host: 'api.forecast.io', path: path, method: 'get', headers: { 'User-Agent': 'NodeJS ' + process.version + ' forecast.io-bluebird (' + version + ')' } }; return new Bluebird(function(resolve, reject) { var request = Https.request(requestOptions, function(response) { var buffer = ''; response.setEncoding('utf8'); response.on('data', function(chunk) { buffer += chunk; }); response.on('end', function() { try { resolve(JSON.parse(buffer)); } catch(error) { reject(new Error('Invalid JSON response from API!')); } }); }); request.on('error', function(error) { reject(error); }); request.on('socket', function(socket) { socket.setTimeout(parent.timeout); socket.on('timeout', function() { request.abort(); }); socket.on('error', function(error) { reject(error); }); }); request.end(); }); }; module.exports = Forecast;