google-maps-services-node
Version:
Node library for accessing the Google Maps Web Services
86 lines (67 loc) • 3.13 kB
JavaScript
;
var _ = require("lodash"),
any = _.any,
extend = _.extend,
defaults = _.defaults,
request = require("request"),
GoogleMapsApiError = require("./google-maps-error"),
Q = require("q");
var defaultConfig = {
checkInputs: true,
baseUrl: "https://maps.googleapis.com",
defaultParams: {
format: "json"
}
};
module.exports = function(config) {
config.defaultParams = defaults(config.defaultParams || {}, defaultConfig.defaultParams);
config = defaults(config, defaultConfig);
return {
distanceMatrix: function distanceMatrix(origins, destinations, params, cb) {
return Q.Promise(function(resolve, reject) {
params = defaults(params, defaultConfig.defaultParams);
if (config.checkInputs) {
if (any(origins, function(origin) { return !!~origin.indexOf("|"); }))
throw new Error("Invalid character in origin address");
if (any(destinations, function(destination) { return !!~destination.indexOf("|"); }))
throw new Error("Invalid character in destination address");
}
var urlOrigins = origins.join("|"),
urlDestinations = destinations.join("|");
request({
url: config.baseUrl + "/maps/api/distancematrix/" + params.format + "?",
qs: extend({ origins: urlOrigins, destinations: urlDestinations }, params),
json: true
}, function(err, httpIM, response) {
if (err)
return reject(err);
if (response.status!=="OK")
return reject(new GoogleMapsApiError(response));
resolve(response);
});
}).nodeify(cb);
},
directions: function directions(origin, destination, params, cb) {
return Q.Promise(function(resolve, reject) {
params = defaults(params, defaultConfig.defaultParams);
if (config.checkInputs) {
if (any([origin], function(origin) { return !!~origin.indexOf("|"); }))
throw new Error("Invalid character in origin address");
if (any([destination], function(destination) { return !!~destination.indexOf("|"); }))
throw new Error("Invalid character in destination address");
}
request({
url: config.baseUrl + "/maps/api/directions/" + params.format + "?",
qs: extend({ origin: origin, destination: destination }, params),
json: true
}, function(err, httpIM, response) {
if (err)
return reject(err);
if (response.status!=="OK")
return reject(new GoogleMapsApiError(response));
resolve(response);
});
}).nodeify(cb);
}
};
};