UNPKG

node-geoip2-api

Version:

Node.js Restify API for the MaxMind GeoIP2 databases

108 lines (92 loc) 2.66 kB
'use strict'; var path = require('path') , restify = require('restify') , debug = require('diagnostics')('geoip2') , geo = require('maxmind-db-reader'); /** * GeoIp2API constructor. * * @param {Server} server HTTP server instance. * @param {Object} options Configuration. * @Constructor * @api public */ var GeoIp2API = module.exports = function GeoIp2API(server, options) { if (!(this instanceof GeoIp2API)) return new GeoIp2API(options); this.options = options || {}; // // Open and read the provided database. // this.db = geo.openSync( this.options.db || process.env.DB || path.join(__dirname, 'db.mmdb') ); // // Attach the server to the instance. // this.server = server; }; /** * Attach set of routes to the server * * @param {Server} server HTTP server instance. * @param {Object} options Configuration. * @api public */ GeoIp2API.prototype.routing = function routing(routes) { var api = this; routes.forEach(function addRoutes(router) { router(api); }); }; /** * Get data by IP. * * @param {String} ip IP to query. * @param {Function} done Completion callback. * @returns {GeoIp2API} * @api public */ GeoIp2API.prototype.get = function get(ip, done) { this.db.getGeoData(ip, function fetched(error, data) { if (error) return done(error); debug('Found geographical data for ip %s', ip); return done(null, data); }); return this; }; /** * Create a new restify powered GeoIp2API server. * * @param {Number} port Port to listen on. * @param {Object} options Configuration. * @returns {GeoIp2API} * @api public */ GeoIp2API.createServer = function createServer(port, options) { var api; options = 'object' === typeof port ? port : options || {}; if ('number' === typeof port) options.port = port; options.name = options.name || 'GeoIP2'; options.version = options.version || require('./package').version; options.port = options.port || process.env.PORT || 8082; // // Create a Restify server and add default Restify middleware. // api = new GeoIp2API(restify.createServer(options), options); api.server.use(restify.acceptParser(api.server.acceptable)); api.server.use(restify.queryParser()); // // Initialize the server with the provided routes. // api.routing(options.routes || [require('./server')]); // // Listen by defauly unless specifically forbidden through options. // if (options.listen !== false) { api.server.listen(options.port, function listening(error) { if (error) return console.error(error); debug('%s listening at %s', api.server.name, api.server.url); }); } return api; };