geoip-lite2 2.1.28 → 2.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -53,9 +53,6 @@ binary file to lookup IP addresses and return the country, region and city that
53
53
  Both IPv4 and IPv6 addresses are supported, however since the GeoLite IPv6 database does not currently contain any city or region
54
54
  information, city, region and postal code lookups are only supported for IPv4.
55
55
 
56
- > [!WARNING]
57
- > **You SHOULD update the data files after installation.** The MaxMind license does not allow us to distribute the latest version of the data files with this package. Follow the instructions under update the datafiles for details.
58
-
59
56
 
60
57
  ## 📚 Philosophy
61
58
  I was really aiming for a fast JavaScript native implementation for geomapping of IPs.
@@ -265,7 +262,7 @@ If your use-case requires doing less than 100 queries through the lifetime of yo
265
262
 
266
263
  ## 👥 Copyright
267
264
  `GeoIP-Lite` is Copyright 2011-2018 **Philip Tellis** <philip@bluesmoon.info>
268
- `GeoIP-Lite2` is Copyright 2023 **Sefinek** <contact@sefinek.net> (https://sefinek.net)
265
+ `GeoIP-Lite2` is Copyright 2023-2024 **Sefinek** <contact@sefinek.net> (https://sefinek.net)
269
266
 
270
267
 
271
268
  ## 🔐 License
@@ -1 +1 @@
1
- 5955a2f56113f064cf0cae0dc8814ce0535a544f9c97141b36d8a79b436aaebe GeoLite2-City-CSV_20240206.zip
1
+ 37524a3c6634d8cff35a19a64aed8130baa377fe6e55c01e4ca8e89ddb5fed4b GeoLite2-City-CSV_20240223.zip
@@ -1 +1 @@
1
- 71daf1381a6f4b4cd0017752e4921a19c678dbc4fe048f76309ec3bbf29ea5a1 GeoLite2-Country-CSV_20240206.zip
1
+ 4a6b4ebdaef25266591af3e538d386b6343c5c3aeb0ecd5d5675fdd6fab21630 GeoLite2-Country-CSV_20240223.zip
Binary file
Binary file
Binary file
Binary file
Binary file
package/lib/main.js CHANGED
@@ -1 +1 @@
1
- const e=require('fs'),t=require('net'),r=require('path'),n=require('async'),i=require('./utils.js'),o=require('./fsWatcher.js'),{version:a}=require('../package.json');e.existsSync=e.existsSync||r.existsSync;const c='dataWatcher',f=r.resolve(__dirname,global.geoDataDir||process.env.geoDataDIR||'../data/'),s={city:r.join(f,'geoip-city.dat'),city6:r.join(f,'geoip-city6.dat'),cityNames:r.join(f,'geoip-city-names.dat'),country:r.join(f,'geoip-country.dat'),country6:r.join(f,'geoip-country6.dat')},l=[[i.aton4('10.0.0.0'),i.aton4('10.255.255.255')],[i.aton4('172.16.0.0'),i.aton4('172.31.255.255')],[i.aton4('192.168.0.0'),i.aton4('192.168.255.255')]],u={firstIP:null,lastIP:null,lastLine:0,locationBuffer:null,locationRecordSize:88,mainBuffer:null,recordSize:24},d={firstIP:null,lastIP:null,lastLine:0,mainBuffer:null,recordSize:48};let y=JSON.parse(JSON.stringify(u)),S=JSON.parse(JSON.stringify(d));const p={range:'',country:'',region:'',eu:'',timezone:'',city:'',ll:[0,0]},B=e=>{let t,r,n=0,i=y.lastIP,o=y.lastLine,a=y.firstIP;const c=y.mainBuffer,f=y.locationBuffer,s=l,u=y.recordSize,d=y.locationRecordSize;let S;if(e>y.lastIP||e<y.firstIP)return null;for(S=0;S<s.length;S++)if(e>=s[S][0]&&e<=s[S][1])return null;for(;;){if(t=Math.round((o-n)/2)+n,i=c.readUInt32BE(t*u),a=c.readUInt32BE(t*u+4),i<=e&&a>=e)return p.range=[i,a],10===u?p.country=c.toString('utf8',t*u+8,t*u+10):(r=c.readUInt32BE(t*u+8),-1>>>0>r&&(p.country=f.toString('utf8',r*d,r*d+2).replace(/\u0000.*/,''),p.region=f.toString('utf8',r*d+2,r*d+5).replace(/\u0000.*/,''),p.metro=f.readInt32BE(r*d+5),p.ll[0]=c.readInt32BE(t*u+12)/1e4,p.ll[1]=c.readInt32BE(t*u+16)/1e4,p.area=c.readUInt32BE(t*u+20),p.eu=f.toString('utf8',r*d+9,r*d+10).replace(/\u0000.*/,''),p.timezone=f.toString('utf8',r*d+10,r*d+42).replace(/\u0000.*/,''),p.city=f.toString('utf8',r*d+42,r*d+d).replace(/\u0000.*/,''))),p;if(n===o)return null;n===o-1?t===n?n=o:o=n:i>e?o=t:a<e&&(n=t)}},I=['0:0:0:0:0:FFFF:','::FFFF:'];function g(t){let r,i;const o=JSON.parse(JSON.stringify(u));if('function'==typeof arguments[0])n.series([t=>{n.series([t=>{e.open(s.cityNames,'r',((e,n)=>{r=n,t(e)}))},t=>{e.fstat(r,((e,r)=>{i=r.size,o.locationBuffer=Buffer.alloc(i),t(e)}))},t=>{e.read(r,o.locationBuffer,0,i,0,t)},t=>{e.close(r,t)},t=>{e.open(s.city,'r',((e,n)=>{r=n,t(e)}))},t=>{e.fstat(r,((e,r)=>{i=r.size,t(e)}))}],(n=>{if(n){if('ENOENT'!==n.code&&'EBADF'!==n.code)throw n;e.open(s.country,'r',((n,a)=>{n?t(n):(r=a,e.fstat(r,((e,r)=>{i=r.size,o.recordSize=10,t()})))}))}else t()}))},()=>{o.mainBuffer=Buffer.alloc(i),n.series([t=>{e.read(r,o.mainBuffer,0,i,0,t)},t=>{e.close(r,t)}],(e=>{e||(o.lastLine=i/o.recordSize-1,o.lastIP=o.mainBuffer.readUInt32BE(o.lastLine*o.recordSize+4),o.firstIP=o.mainBuffer.readUInt32BE(0),y=o),t(e)}))}]);else{try{if(r=e.openSync(s.cityNames,'r'),i=e.fstatSync(r).size,0===i)throw{code:'EMPTY_FILE'};y.locationBuffer=Buffer.alloc(i),e.readSync(r,y.locationBuffer,0,i,0),e.closeSync(r),r=e.openSync(s.city,'r'),i=e.fstatSync(r).size}catch(t){if('ENOENT'!==t.code&&'EBADF'!==t.code&&'EMPTY_FILE'!==t.code)throw t;r=e.openSync(s.country,'r'),i=e.fstatSync(r).size,y.recordSize=10}y.mainBuffer=Buffer.alloc(i),e.readSync(r,y.mainBuffer,0,i,0),e.closeSync(r),y.lastLine=i/y.recordSize-1,y.lastIP=y.mainBuffer.readUInt32BE(y.lastLine*y.recordSize+4),y.firstIP=y.mainBuffer.readUInt32BE(0)}}function m(t){let r,i;const o=JSON.parse(JSON.stringify(d));if('function'==typeof arguments[0])n.series([t=>{n.series([t=>{e.open(s.city6,'r',((e,n)=>{r=n,t(e)}))},t=>{e.fstat(r,((e,r)=>{i=r.size,t(e)}))}],(n=>{if(n){if('ENOENT'!==n.code&&'EBADF'!==n.code)throw n;e.open(s.country6,'r',((n,a)=>{n?t(n):(r=a,e.fstat(r,((e,r)=>{i=r.size,o.recordSize=34,t()})))}))}else t()}))},()=>{o.mainBuffer=Buffer.alloc(i),n.series([t=>{e.read(r,o.mainBuffer,0,i,0,t)},t=>{e.close(r,t)}],(e=>{e||(o.lastLine=i/o.recordSize-1,S=o),t(e)}))}]);else{try{if(r=e.openSync(s.city6,'r'),i=e.fstatSync(r).size,0===i)throw{code:'EMPTY_FILE'}}catch(t){if('ENOENT'!==t.code&&'EBADF'!==t.code&&'EMPTY_FILE'!==t.code)throw t;r=e.openSync(s.country6,'r'),i=e.fstatSync(r).size,S.recordSize=34}S.mainBuffer=Buffer.alloc(i),e.readSync(r,S.mainBuffer,0,i,0),e.closeSync(r),S.lastLine=i/S.recordSize-1}}module.exports={cmp:i.cmp,lookup:e=>{if(!e)return null;if('number'==typeof e)return B(e);if(4===t.isIP(e))return B(i.aton4(e));if(6===t.isIP(e)){const t=(e=>{const t=e.toUpperCase();for(let e=0;e<I.length;e++){const r=I[e];if(0===t.indexOf(r))return t.substring(r.length)}return null})(e);return t?B(i.aton4(t)):(e=>{const t=S.mainBuffer,r=S.recordSize,n=y.locationBuffer,o=y.locationRecordSize,a=(e,n)=>{let i;const o=[];for(i=0;i<2;i++)o.push(t.readUInt32BE(e*r+16*n+4*i));return o};S.lastIP=a(S.lastLine,1),S.firstIP=a(0,0);let c,f,s=0,l=S.lastIP,u=S.lastLine,d=S.firstIP;if(i.cmp6(e,S.lastIP)>0||i.cmp6(e,S.firstIP)<0)return null;for(;;){if(c=Math.round((u-s)/2)+s,l=a(c,0),d=a(c,1),i.cmp6(l,e)<=0&&i.cmp6(d,e)>=0)return 34===r?p.country=t.toString('utf8',c*r+32,c*r+34).replace(/\u0000.*/,''):(f=t.readUInt32BE(c*r+32),-1>>>0>f&&(p.country=n.toString('utf8',f*o,f*o+2).replace(/\u0000.*/,''),p.region=n.toString('utf8',f*o+2,f*o+5).replace(/\u0000.*/,''),p.metro=n.readInt32BE(f*o+5),p.ll[0]=t.readInt32BE(c*r+36)/1e4,p.ll[1]=t.readInt32BE(c*r+40)/1e4,p.area=t.readUInt32BE(c*r+44),p.eu=n.toString('utf8',f*o+9,f*o+10).replace(/\u0000.*/,''),p.timezone=n.toString('utf8',f*o+10,f*o+42).replace(/\u0000.*/,''),p.city=n.toString('utf8',f*o+42,f*o+o).replace(/\u0000.*/,''))),p;if(s===u)return null;s===u-1?c===s?s=u:u=s:i.cmp6(l,e)>0?u=c:i.cmp6(d,e)<0&&(s=c)}})(i.aton6(e))}return null},pretty:e=>'string'==typeof e?e:'number'==typeof e?i.ntoa4(e):Array.isArray(e)?i.ntoa6(e):e,startWatchingDataUpdate:e=>{o.makeFsWatchFilter(c,f,6e4,(()=>{n.series([e=>{g(e)},e=>{m(e)}],e)}))},stopWatchingDataUpdate:()=>{o.stopWatching(c)},clear:()=>{y=JSON.parse(JSON.stringify(u)),S=JSON.parse(JSON.stringify(d))},reloadDataSync:()=>{g(),m()},reloadData:e=>{n.series([e=>{g(e)},e=>{m(e)}],e)},version:a},g(),m();
1
+ const e=require('fs'),t=require('net'),r=require('path'),n=require('async'),i=require('./utils.js'),a=require('./fsWatcher.js'),{version:o}=require('../package.json');e.existsSync=e.existsSync||r.existsSync;const c='dataWatcher',s=r.resolve(__dirname,global.geoDataDir||process.env.geoDataDIR||'../data/'),f={city:r.join(s,'geoip-city.dat'),city6:r.join(s,'geoip-city6.dat'),cityNames:r.join(s,'geoip-city-names.dat'),country:r.join(s,'geoip-country.dat'),country6:r.join(s,'geoip-country6.dat')},l=[[i.aton4('10.0.0.0'),i.aton4('10.255.255.255')],[i.aton4('172.16.0.0'),i.aton4('172.31.255.255')],[i.aton4('192.168.0.0'),i.aton4('192.168.255.255')]],u={firstIP:null,lastIP:null,lastLine:0,locationBuffer:null,locationRecordSize:88,mainBuffer:null,recordSize:24},d={firstIP:null,lastIP:null,lastLine:0,mainBuffer:null,recordSize:48};let y=JSON.parse(JSON.stringify(u)),S=JSON.parse(JSON.stringify(d));const p={range:'',country:'',region:'',eu:'',timezone:'',city:'',ll:[0,0]},B=e=>{let t,r,n=0,i=y.lastIP,a=y.lastLine,o=y.firstIP;const c=y.mainBuffer,s=y.locationBuffer,f=l,u=y.recordSize,d=y.locationRecordSize;let S;if(e>y.lastIP||e<y.firstIP)return null;for(S=0;S<f.length;S++)if(e>=f[S][0]&&e<=f[S][1])return null;for(;;){if(t=Math.round((a-n)/2)+n,i=c.readUInt32BE(t*u),o=c.readUInt32BE(t*u+4),i<=e&&o>=e)return p.range=[i,o],10===u?p.country=c.toString('utf8',t*u+8,t*u+10):(r=c.readUInt32BE(t*u+8),-1>>>0>r&&(p.country=s.toString('utf8',r*d,r*d+2).replace(/\u0000.*/,''),p.region=s.toString('utf8',r*d+2,r*d+5).replace(/\u0000.*/,''),p.metro=s.readInt32BE(r*d+5),p.ll[0]=c.readInt32BE(t*u+12)/1e4,p.ll[1]=c.readInt32BE(t*u+16)/1e4,p.area=c.readUInt32BE(t*u+20),p.eu=s.toString('utf8',r*d+9,r*d+10).replace(/\u0000.*/,''),p.timezone=s.toString('utf8',r*d+10,r*d+42).replace(/\u0000.*/,''),p.city=s.toString('utf8',r*d+42,r*d+d).replace(/\u0000.*/,''))),p;if(n===a)return null;n===a-1?t===n?n=a:a=n:i>e?a=t:o<e&&(n=t)}},I=['0:0:0:0:0:FFFF:','::FFFF:'];function g(t){let r,i;const a=JSON.parse(JSON.stringify(u));if('function'==typeof arguments[0])n.series([t=>{n.series([t=>{e.open(f.cityNames,'r',((e,n)=>{r=n,t(e)}))},t=>{e.fstat(r,((e,r)=>{i=r.size,a.locationBuffer=Buffer.alloc(i),t(e)}))},t=>{e.read(r,a.locationBuffer,0,i,0,t)},t=>{e.close(r,t)},t=>{e.open(f.city,'r',((e,n)=>{r=n,t(e)}))},t=>{e.fstat(r,((e,r)=>{i=r.size,t(e)}))}],(n=>{if(n){if('ENOENT'!==n.code&&'EBADF'!==n.code)throw n;e.open(f.country,'r',((n,o)=>{n?t(n):(r=o,e.fstat(r,((e,r)=>{i=r.size,a.recordSize=10,t()})))}))}else t()}))},()=>{a.mainBuffer=Buffer.alloc(i),n.series([t=>{e.read(r,a.mainBuffer,0,i,0,t)},t=>{e.close(r,t)}],(e=>{e||(a.lastLine=i/a.recordSize-1,a.lastIP=a.mainBuffer.readUInt32BE(a.lastLine*a.recordSize+4),a.firstIP=a.mainBuffer.readUInt32BE(0),y=a),t(e)}))}]);else{try{if(r=e.openSync(f.cityNames,'r'),i=e.fstatSync(r).size,0===i)throw{code:'EMPTY_FILE'};y.locationBuffer=Buffer.alloc(i),e.readSync(r,y.locationBuffer,0,i,0),e.closeSync(r),r=e.openSync(f.city,'r'),i=e.fstatSync(r).size}catch(t){if('ENOENT'!==t.code&&'EBADF'!==t.code&&'EMPTY_FILE'!==t.code)throw t;r=e.openSync(f.country,'r'),i=e.fstatSync(r).size,y.recordSize=10}y.mainBuffer=Buffer.alloc(i),e.readSync(r,y.mainBuffer,0,i,0),e.closeSync(r),y.lastLine=i/y.recordSize-1,y.lastIP=y.mainBuffer.readUInt32BE(y.lastLine*y.recordSize+4),y.firstIP=y.mainBuffer.readUInt32BE(0)}}function m(t){let r,i;const a=JSON.parse(JSON.stringify(d));if('function'==typeof arguments[0])n.series([t=>{n.series([t=>{e.open(f.city6,'r',((e,n)=>{r=n,t(e)}))},t=>{e.fstat(r,((e,r)=>{i=r.size,t(e)}))}],(n=>{if(n){if('ENOENT'!==n.code&&'EBADF'!==n.code)throw n;e.open(f.country6,'r',((n,o)=>{n?t(n):(r=o,e.fstat(r,((e,r)=>{i=r.size,a.recordSize=34,t()})))}))}else t()}))},()=>{a.mainBuffer=Buffer.alloc(i),n.series([t=>{e.read(r,a.mainBuffer,0,i,0,t)},t=>{e.close(r,t)}],(e=>{e||(a.lastLine=i/a.recordSize-1,S=a),t(e)}))}]);else{try{if(r=e.openSync(f.city6,'r'),i=e.fstatSync(r).size,0===i)throw{code:'EMPTY_FILE'}}catch(t){if('ENOENT'!==t.code&&'EBADF'!==t.code&&'EMPTY_FILE'!==t.code)throw t;r=e.openSync(f.country6,'r'),i=e.fstatSync(r).size,S.recordSize=34}S.mainBuffer=Buffer.alloc(i),e.readSync(r,S.mainBuffer,0,i,0),e.closeSync(r),S.lastLine=i/S.recordSize-1}}module.exports={cmp:i.cmp,lookup:e=>{if(!e)return null;if('number'==typeof e)return B(e);if(4===t.isIP(e))return B(i.aton4(e));if(6===t.isIP(e)){const t=(e=>{const t=e.toUpperCase();for(let e=0;e<I.length;e++){const r=I[e];if(0===t.indexOf(r))return t.substring(r.length)}return null})(e);return t?B(i.aton4(t)):(e=>{const t=S.mainBuffer,r=S.recordSize,n=y.locationBuffer,a=y.locationRecordSize,o=(e,n)=>{let i;const a=[];for(i=0;i<2;i++)a.push(t.readUInt32BE(e*r+16*n+4*i));return a};S.lastIP=o(S.lastLine,1),S.firstIP=o(0,0);let c,s,f=0,l=S.lastIP,u=S.lastLine,d=S.firstIP;if(i.cmp6(e,S.lastIP)>0||i.cmp6(e,S.firstIP)<0)return null;for(;;){if(c=Math.round((u-f)/2)+f,l=o(c,0),d=o(c,1),i.cmp6(l,e)<=0&&i.cmp6(d,e)>=0)return 34===r?p.country=t.toString('utf8',c*r+32,c*r+34).replace(/\u0000.*/,''):(s=t.readUInt32BE(c*r+32),-1>>>0>s&&(p.country=n.toString('utf8',s*a,s*a+2).replace(/\u0000.*/,''),p.region=n.toString('utf8',s*a+2,s*a+5).replace(/\u0000.*/,''),p.metro=n.readInt32BE(s*a+5),p.ll[0]=t.readInt32BE(c*r+36)/1e4,p.ll[1]=t.readInt32BE(c*r+40)/1e4,p.area=t.readUInt32BE(c*r+44),p.eu=n.toString('utf8',s*a+9,s*a+10).replace(/\u0000.*/,''),p.timezone=n.toString('utf8',s*a+10,s*a+42).replace(/\u0000.*/,''),p.city=n.toString('utf8',s*a+42,s*a+a).replace(/\u0000.*/,''))),p;if(f===u)return null;f===u-1?c===f?f=u:u=f:i.cmp6(l,e)>0?u=c:i.cmp6(d,e)<0&&(f=c)}})(i.aton6(e))}return null},pretty:e=>'string'==typeof e?e:'number'==typeof e?i.ntoa4(e):Array.isArray(e)?i.ntoa6(e):e,startWatchingDataUpdate:e=>{a.makeFsWatchFilter(c,s,6e4,(async()=>{await n.series([e=>{g(e)},e=>{m(e)}],e)}))},stopWatchingDataUpdate:()=>{a.stopWatching(c)},clear:()=>{y=JSON.parse(JSON.stringify(u)),S=JSON.parse(JSON.stringify(d))},reloadDataSync:()=>{g(),m()},reloadData:async e=>{await n.series([e=>{g(e)},e=>{m(e)}],e)},version:o},g(),m();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "geoip-lite2",
3
- "version": "2.1.28",
3
+ "version": "2.1.30",
4
4
  "description": "A light weight native JavaScript implementation of GeoIP API from MaxMind. Improved and faster version by Sefinek.",
5
5
  "keywords": [
6
6
  "city",
@@ -56,7 +56,7 @@
56
56
  },
57
57
  "devDependencies": {
58
58
  "jest": "^29.7.0",
59
- "terser": "^5.27.0"
59
+ "terser": "^5.28.1"
60
60
  },
61
61
  "engines": {
62
62
  "node": ">=10.3.0"
@@ -1 +1 @@
1
- const e=require('../lib/main.js');describe('GeoIP2',(()=>{describe('#testLookup()',(()=>{it('should return data about IPv4',(()=>{const t=e.lookup('1.1.1.1');expect(t).toBeTruthy()})),it('should return data about IPv6',(()=>{const t=e.lookup('2606:4700:4700::64');expect(t).toBeTruthy()}))})),describe('#testDataIP4()',(()=>{it('should match data for IPv4 - US',(()=>{const t=e.lookup('72.229.28.185');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('US'),expect(t.region).toBe('NY'),expect(t.eu).toBe('0'),expect(t.timezone).toBe('America/New_York'),expect(t.city).toBe('New York'),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(501),expect(t.area).toBe(5)})),it('should match data for IPv4 - JP',(()=>{const t=e.lookup('210.138.184.59');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('JP'),expect(t.region).toBe('13'),expect(t.eu).toBe('0'),expect(t.timezone).toBe('Asia/Tokyo'),expect(t.city).toBe(''),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(0),expect(t.area).toBe(500)})),it('should match data for IPv4 - PL',(()=>{const t=e.lookup('104.113.255.255');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('PL'),expect(t.region).toBe('14'),expect(t.eu).toBe('1'),expect(t.timezone).toBe('Europe/Warsaw'),expect(t.city).toBe('Warsaw'),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(0),expect(t.area).toBe(20)})),it('should match data for IPv4 - RU',(()=>{const t=e.lookup('109.108.63.255');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('RU'),expect(t.region).toBe('IVA'),expect(t.eu).toBe('0'),expect(t.timezone).toBe('Europe/Moscow'),expect(t.city).toBe('Ivanovo'),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(0),expect(t.area).toBe(100)}))})),describe('#testDataIP6()',(()=>{it('should match data for IPv6',(()=>{const t=e.lookup('2001:1c04:400::1');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('NL'),expect(t.region).toBe('NH'),expect(t.eu).toBe('1'),expect(t.timezone).toBe('Europe/Amsterdam'),expect(t.city).toBe('Zandvoort'),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(0),expect(t.area).toBe(5)})),it('should match data for IPv4 - JP',(()=>{const t=e.lookup('2400:8500:1302:814:a163:44:173:238f');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('JP'),expect(t.region).toBe(''),expect(t.eu).toBe('0'),expect(t.timezone).toBe('Asia/Tokyo'),expect(t.city).toBe(''),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(0),expect(t.area).toBe(500)})),it('should match data for IPv4 - JP',(()=>{const t=e.lookup('1.79.255.115');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('JP'),expect(t.region).toBe(''),expect(t.eu).toBe('0'),expect(t.timezone).toBe('Asia/Tokyo'),expect(t.city).toBe(''),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(0),expect(t.area).toBe(500)}))})),describe('#testUTF8()',(()=>{it('should return UTF8 city name',(()=>{const t=e.lookup('2.139.175.1');expect(t).toBeTruthy(),expect(t.city).toBe('Madrid')}))})),describe('#testMetro()',(()=>{it('should match metro data',(()=>{const t=e.lookup('23.240.63.68');expect(t.metro).toBe(803)}))})),describe('#testIPv4MappedIPv6()',(()=>{it('should match IPv4 mapped IPv6 data',(()=>{const t=e.lookup('195.16.170.74');expect(t.metro).toBe(0)}))})),describe('#testSyncReload()',(()=>{it('should reload data synchronously',(()=>{const t=e.lookup('75.82.117.180');expect(t).not.toBeNull();const o=e.lookup('::ffff:173.185.182.82');expect(o).not.toBeNull(),e.clear();const c=e.lookup('75.82.117.180');expect(c).toBeNull();const l=e.lookup('::ffff:173.185.182.82');expect(l).toBeNull(),e.reloadDataSync();const p=e.lookup('75.82.117.180');expect(t).toEqual(p);const r=e.lookup('::ffff:173.185.182.82');expect(o).toEqual(r)}))})),describe('#testAsyncReload()',(()=>{it('should reload data asynchronously',(t=>{const o=e.lookup('75.82.117.180');expect(o).not.toBeNull();const c=e.lookup('::ffff:173.185.182.82');expect(c).not.toBeNull(),e.clear();const l=e.lookup('75.82.117.180');expect(l).toBeNull();const p=e.lookup('::ffff:173.185.182.82');expect(p).toBeNull(),e.reloadData((()=>{const l=e.lookup('75.82.117.180');expect(o).toEqual(l);const p=e.lookup('::ffff:173.185.182.82');expect(c).toEqual(p),t()}))}))})),describe('#testInvalidIP()',(()=>{it('should return null for an invalid IP address',(()=>{const t=e.lookup('invalid_ip_address');expect(t).toBeNull()}))})),describe('#testEmptyIP()',(()=>{it('should return null for an empty IP address',(()=>{const t=e.lookup('');expect(t).toBeNull()}))})),describe('#testNullIP()',(()=>{it('should return null for a null IP address',(()=>{const t=e.lookup(null);expect(t).toBeNull()}))})),describe('#testUnknownIP()',(()=>{it('should return null for an unknown IP address',(()=>{const t=e.lookup('192.168.1.1');expect(t).toBeNull()}))})),describe('#testNoDataForIP()',(()=>{it('should return null for an IP address with no data',(()=>{const t=e.lookup('203.0.113.0');expect(t).toBeNull()}))})),describe('#testSpecialCharactersIP()',(()=>{it('should return null for an IP address with special characters',(()=>{const t=e.lookup('1.2.3.@');expect(t).toBeNull()}))}))}));
1
+ const e=require('../lib/main.js');describe('GeoIP2',(()=>{describe('#testLookup()',(()=>{it('should return data about IPv4',(()=>{const t=e.lookup('1.1.1.1');expect(t).toBeTruthy()})),it('should return data about IPv6',(()=>{const t=e.lookup('2606:4700:4700::64');expect(t).toBeTruthy()}))})),describe('#testDataIP4()',(()=>{it('should match data for IPv4 - US',(()=>{const t=e.lookup('72.229.28.185');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('US'),expect(t.region).toBe('NY'),expect(t.eu).toBe('0'),expect(t.timezone).toBe('America/New_York'),expect(t.city).toBe('New York'),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(501),expect(t.area).toBe(5)})),it('should match data for IPv4 - JP',(()=>{const t=e.lookup('210.138.184.59');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('JP'),expect(t.region).toBe('13'),expect(t.eu).toBe('0'),expect(t.timezone).toBe('Asia/Tokyo'),expect(t.city).toBe(''),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(0),expect(t.area).toBe(500)})),it('should match data for IPv4 - PL',(()=>{const t=e.lookup('104.113.255.255');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('PL'),expect(t.region).toBe('14'),expect(t.eu).toBe('1'),expect(t.timezone).toBe('Europe/Warsaw'),expect(t.city).toBe('Warsaw'),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(0),expect(t.area).toBe(20)})),it('should match data for IPv4 - RU',(()=>{const t=e.lookup('109.108.63.255');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('RU'),expect(t.region).toBe('IVA'),expect(t.eu).toBe('0'),expect(t.timezone).toBe('Europe/Moscow'),expect(t.city).toBe('Ivanovo'),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(0),expect(t.area).toBe(100)}))})),describe('#testDataIP6()',(()=>{it('should match data for IPv6',(()=>{const t=e.lookup('2001:1c04:400::1');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('NL'),expect(t.region).toBe('NH'),expect(t.eu).toBe('1'),expect(t.timezone).toBe('Europe/Amsterdam'),expect(t.city).toBe('Zandvoort'),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(0),expect(t.area).toBe(20)})),it('should match data for IPv4 - JP',(()=>{const t=e.lookup('2400:8500:1302:814:a163:44:173:238f');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('JP'),expect(t.region).toBe(''),expect(t.eu).toBe('0'),expect(t.timezone).toBe('Asia/Tokyo'),expect(t.city).toBe(''),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(0),expect(t.area).toBe(500)})),it('should match data for IPv4 - JP',(()=>{const t=e.lookup('1.79.255.115');expect(void 0!==t.range).toBe(!0),expect(t.country).toBe('JP'),expect(t.region).toBe(''),expect(t.eu).toBe('0'),expect(t.timezone).toBe('Asia/Tokyo'),expect(t.city).toBe(''),expect(t.ll).toBeTruthy(),expect(t.metro).toBe(0),expect(t.area).toBe(500)}))})),describe('#testUTF8()',(()=>{it('should return UTF8 city name',(()=>{const t=e.lookup('2.139.175.1');expect(t).toBeTruthy(),expect(t.city).toBe('Madrid')}))})),describe('#testMetro()',(()=>{it('should match metro data',(()=>{const t=e.lookup('23.240.63.68');expect(t.metro).toBe(803)}))})),describe('#testIPv4MappedIPv6()',(()=>{it('should match IPv4 mapped IPv6 data',(()=>{const t=e.lookup('195.16.170.74');expect(t.metro).toBe(0)}))})),describe('#testSyncReload()',(()=>{it('should reload data synchronously',(()=>{const t=e.lookup('75.82.117.180');expect(t).not.toBeNull();const o=e.lookup('::ffff:173.185.182.82');expect(o).not.toBeNull(),e.clear();const c=e.lookup('75.82.117.180');expect(c).toBeNull();const l=e.lookup('::ffff:173.185.182.82');expect(l).toBeNull(),e.reloadDataSync();const p=e.lookup('75.82.117.180');expect(t).toEqual(p);const r=e.lookup('::ffff:173.185.182.82');expect(o).toEqual(r)}))})),describe('#testAsyncReload()',(()=>{it('should reload data asynchronously',(t=>{const o=e.lookup('75.82.117.180');expect(o).not.toBeNull();const c=e.lookup('::ffff:173.185.182.82');expect(c).not.toBeNull(),e.clear();const l=e.lookup('75.82.117.180');expect(l).toBeNull();const p=e.lookup('::ffff:173.185.182.82');expect(p).toBeNull(),e.reloadData((()=>{const l=e.lookup('75.82.117.180');expect(o).toEqual(l);const p=e.lookup('::ffff:173.185.182.82');expect(c).toEqual(p),t()}))}))})),describe('#testInvalidIP()',(()=>{it('should return null for an invalid IP address',(()=>{const t=e.lookup('invalid_ip_address');expect(t).toBeNull()}))})),describe('#testEmptyIP()',(()=>{it('should return null for an empty IP address',(()=>{const t=e.lookup('');expect(t).toBeNull()}))})),describe('#testNullIP()',(()=>{it('should return null for a null IP address',(()=>{const t=e.lookup(null);expect(t).toBeNull()}))})),describe('#testUnknownIP()',(()=>{it('should return null for an unknown IP address',(()=>{const t=e.lookup('192.168.1.1');expect(t).toBeNull()}))})),describe('#testNoDataForIP()',(()=>{it('should return null for an IP address with no data',(()=>{const t=e.lookup('203.0.113.0');expect(t).toBeNull()}))})),describe('#testSpecialCharactersIP()',(()=>{it('should return null for an IP address with special characters',(()=>{const t=e.lookup('1.2.3.@');expect(t).toBeNull()}))}))}));
package/utils/updatedb.js CHANGED
@@ -1 +1 @@
1
- 'use strict';const{name:e,version:t}=require('../package.json'),n=`Mozilla/5.0 (compatible; ${e}/${t}; +https://sefinek.net)`,r=require('fs'),o=require('http'),s=require('https'),i=require('path'),c=require('zlib'),a=require('readline');r.existsSync=r.existsSync||i.existsSync;const l=require('async'),d=require('kleur'),u=require('iconv-lite'),p=require('rimraf').sync,f=require('adm-zip'),g=require('../lib/utils.js'),{Address6:h,Address4:w}=require('ip-address'),m=process.argv.slice(2);let y=m.find((e=>null!==e.match(/^license_key=[a-zA-Z0-9]+/)));void 0===y&&void 0!==process.env.LICENSE_KEY&&(y=`license_key=${process.env.LICENSE_KEY}`);let I=m.find((e=>null!==e.match(/^geoDataDir=[\w./]+/)));void 0===I&&void 0!==process.env.GEODATADIR&&(I=`geoDataDir=${process.env.GEODATADIR}`);let S=i.resolve(__dirname,'..','data');void 0!==I&&(S=i.resolve(process.cwd(),I.split('=')[1]),r.existsSync(S)||(console.log(d.red('ERROR')+': Directory doesn\'t exist: '+S),process.exit(1)));const v=process.env.GEOTMPDIR?process.env.GEOTMPDIR:i.resolve(__dirname,'..','tmp'),E={},x={NaN:-1},k=[{type:'country',url:`https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&suffix=zip&${y}`,checksum:`https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&suffix=zip.sha256&${y}`,fileName:'GeoLite2-Country-CSV.zip',src:['GeoLite2-Country-Locations-en.csv','GeoLite2-Country-Blocks-IPv4.csv','GeoLite2-Country-Blocks-IPv6.csv'],dest:['','geoip-country.dat','geoip-country6.dat']},{type:'city',url:`https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City-CSV&suffix=zip&${y}`,checksum:`https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City-CSV&suffix=zip.sha256&${y}`,fileName:'GeoLite2-City-CSV.zip',src:['GeoLite2-City-Locations-en.csv','GeoLite2-City-Blocks-IPv4.csv','GeoLite2-City-Blocks-IPv6.csv'],dest:['geoip-city-names.dat','geoip-city.dat','geoip-city6.dat']}];function D(e){const t=i.dirname(e);r.existsSync(t)||r.mkdirSync(t)}const R=/^\s*(?:'[^'\\]*(?:\\[\S\s][^'\\]*)*'|"[^"\\]*(?:\\[\S\s][^"\\]*)*"|[^,'"\s\\]*(?:\s+[^,'"\s\\]+)*)\s*(?:,\s*(?:'[^'\\]*(?:\\[\S\s][^'\\]*)*'|"[^"\\]*(?:\\[\S\s][^"\\]*)*"|[^,'"\s\\]*(?:\s+[^,'"\s\\]+)*)\s*)*$/,C=/(?!\s*$)\s*(?:'([^'\\]*(?:\\[\S\s][^'\\]*)*)'|"([^"\\]*(?:\\[\S\s][^"\\]*)*)"|([^,'"\s\\]*(?:\s+[^,'"\s\\]+)*))\s*(?:,|$)/g;function B(e){if(!R.test(e)&&(e=function(e){let t=0,n=-1;for(e=e.replace(/""/,'\\"').replace(/'/g,'\\\'');t<e.length&&n<e.length;)t=n,n=e.indexOf(',',t+1),n<0&&(n=e.length),e.indexOf('\'',t||0)>-1&&e.indexOf('\'',t)<n&&'"'!=e[t+1]&&'"'!=e[n-1]&&(n=(e=e.substr(0,t+1)+'"'+e.substr(t+1,n-t-1)+'"'+e.substr(n,e.length-n)).indexOf(',',n+1),n<0&&(n=e.length));return e}(e),!R.test(e)))return null;const t=[];return e.replace(C,((e,n,r,o)=>(void 0!==n?t.push(n.replace(/\\'/g,'\'')):void 0!==r?t.push(r.replace(/\\"/g,'"').replace(/\\'/g,'\'')):void 0!==o&&t.push(o),''))),/,\s*$/.test(e)&&t.push(''),t}function _(e){const t=new URL(e),r={protocol:t.protocol,host:t.host,path:t.pathname+t.search,headers:{'User-Agent':n}};if(process.env.http_proxy||process.env.https_proxy)try{const e=require('https-proxy-agent');r.agent=new e(process.env.http_proxy||process.env.https_proxy)}catch(e){console.error('Install https-proxy-agent to use an HTTP/HTTPS proxy'),process.exit(-1)}return r}function b(e,t){if(-1!==m.indexOf('force'))return t(null,e);const n=e.checksum;if(void 0===n)return t(null,e);r.readFile(i.join(S,`${e.type}.checksum`),{encoding:'utf8'},((r,i)=>{!r&&i&&i.length&&(e.checkValue=i),console.log('Checking',e.fileName);var c=s.get(_(n),(function(n){const r=n.statusCode;200!==r&&(console.error(d.red('ERROR')+n.data),console.error(d.red('ERROR')+': HTTP Request Failed [%d %s]',r,o.STATUS_CODES[r]),c.end(),process.exit(1));let s='';n.on('data',(e=>{s+=e})),n.on('end',(()=>{s&&s.length?s===e.checkValue?(console.log(d.green('Database "'+e.type+'" is up to date')),e.skip=!0):(console.log(d.green('Database '+e.type+' has new data')),e.checkValue=s):(console.error(d.red('ERROR')+': Could not retrieve checksum for',e.type,d.red('Aborting')),console.error('Run with "force" to update without checksum'),c.end(),process.exit(1)),t(null,e)}))}))}))}function O(e,t){if(e.skip)return t(null,null,null,e);const n=e.url;let a=e.fileName;const l='.gz'===i.extname(a);l&&(a=a.replace('.gz',''));const u=i.join(v,a);if(r.existsSync(u))return t(null,u,a,e);console.log('Fetching',a),D(u);var p=s.get(_(n),(function(n){const s=n.statusCode;let i;200!==s&&(console.error(d.red('ERROR')+': HTTP Request Failed [%d %s]',s,o.STATUS_CODES[s]),p.end(),process.exit(1));const f=r.createWriteStream(u);i=l?n.pipe(c.createGunzip()).pipe(f):n.pipe(f),i.on('close',(()=>{console.log(d.green(' DONE')),t(null,u,a,e)}))}));process.stdout.write(`Retrieving ${a}...`)}function A(e,t,n,o){if(n.skip)return o(null,n);if('.zip'!==i.extname(t))o(null,n);else{process.stdout.write('Extracting '+t+'...');new f(e).getEntries().forEach((e=>{if(e.isDirectory)return;const t=e.entryName.split('/'),n=t[t.length-1],o=i.join(v,n);r.writeFileSync(o,e.getData())})),console.log(d.green(' DONE')),o(null,n)}}function q(e,t){const n=i.join(v,e);process.stdout.write('Processing lookup data (may take a moment)...');const o=a.createInterface({input:r.createReadStream(n).pipe(u.decodeStream('latin1')),output:process.stdout,terminal:!1});let s=0;o.on('line',(e=>{s>0&&function(e){const t=B(e);!t||t.length<6?console.log('Weird line: %s::',e):E[t[0]]=t[4]}(e),s++})),o.on('close',(()=>{console.log(d.green(' DONE')),t()}))}async function G(e,t){let n=0;function o(e){const t=B(e);if(!t||t.length<6)return console.warn('weird line: %s::',e);let r,o,s;n++;const i=E[t[1]];let c,a,d;if(i){if(t[0].match(/:/)){for(a=34,s=new h(t[0]),r=g.aton6(s.startAddress().correctForm()),o=g.aton6(s.endAddress().correctForm()),c=Buffer.alloc(a),d=0;d<r.length;d++)c.writeUInt32BE(r[d],4*d);for(d=0;d<o.length;d++)c.writeUInt32BE(o[d],16+4*d)}else a=10,s=new w(t[0]),r=parseInt(s.startAddress().bigInteger(),10),o=parseInt(s.endAddress().bigInteger(),10),c=Buffer.alloc(a),c.fill(0),c.writeUInt32BE(r,0),c.writeUInt32BE(o,4);return c.write(i,a-2),Date.now()-l>5e3&&(l=Date.now(),process.stdout.write('\nStill working ('+n+')...')),u._writableState.needDrain?new Promise((e=>{u.write(c,e)})):u.write(c)}}const s=i.join(S,t),c=i.join(v,e);p(s),D(s),process.stdout.write('\nProcessing data (may take a moment)...');var l=Date.now(),u=r.createWriteStream(s);const f=a.createInterface({input:r.createReadStream(c),crlfDelay:1/0});let m=0;for await(const e of f)m++,1!==m&&await o(e);u.close(),console.log(d.green(' DONE'))}async function L(e,t){let n=0;async function o(e){if(e.match(/^Copyright/)||!e.match(/\d/))return;const t=B(e);if(!t)return console.warn('Weird line: %s::',e);let r,o,s,i,c,a,u,p,f,m;if(n++,t[0].match(/:/)){let e=0;for(a=48,s=new h(t[0]),r=g.aton6(s.startAddress().correctForm()),o=g.aton6(s.endAddress().correctForm()),i=parseInt(t[1],10),i=x[i],c=Buffer.alloc(a),c.fill(0),m=0;m<r.length;m++)c.writeUInt32BE(r[m],e),e+=4;for(m=0;m<o.length;m++)c.writeUInt32BE(o[m],e),e+=4;c.writeUInt32BE(i>>>0,32),u=Math.round(1e4*parseFloat(t[7])),p=Math.round(1e4*parseFloat(t[8])),f=parseInt(t[9],10),c.writeInt32BE(u,36),c.writeInt32BE(p,40),c.writeInt32BE(f,44)}else a=24,s=new w(t[0]),r=parseInt(s.startAddress().bigInteger(),10),o=parseInt(s.endAddress().bigInteger(),10),i=parseInt(t[1],10),i=x[i],c=Buffer.alloc(a),c.fill(0),c.writeUInt32BE(r>>>0,0),c.writeUInt32BE(o>>>0,4),c.writeUInt32BE(i>>>0,8),u=Math.round(1e4*parseFloat(t[7])),p=Math.round(1e4*parseFloat(t[8])),f=parseInt(t[9],10),c.writeInt32BE(u,12),c.writeInt32BE(p,16),c.writeInt32BE(f,20);return Date.now()-l>5e3&&(l=Date.now(),process.stdout.write('\nStill working ('+n+')...')),d._writableState.needDrain?new Promise((e=>{d.write(c,e)})):d.write(c)}const s=i.join(S,t),c=i.join(v,e);p(s),process.stdout.write('\nProcessing data (may take a moment)...');var l=Date.now(),d=r.createWriteStream(s);const u=a.createInterface({input:r.createReadStream(c),crlfDelay:1/0});let f=0;for await(const e of u)f++,1!==f&&await o(e);d.close()}function F(e,t,n){let o=null,s=0;const c=i.join(S,t),l=i.join(v,e);p(c);var d=r.openSync(c,'w');const f=a.createInterface({input:r.createReadStream(l).pipe(u.decodeStream('utf-8')),output:process.stdout,terminal:!1});let g=0;f.on('line',(e=>{g>0&&function(e){if(e.match(/^Copyright/)||!e.match(/\d/))return;const t=Buffer.alloc(88),n=B(e);if(!n)return void console.warn('Weird line: %s::',e);o=parseInt(n[0]),x[o]=s;const i=n[4],c=n[6],a=n[10],l=parseInt(n[11]),u=n[12],p=n[13];t.fill(0),t.write(i,0),t.write(c,2),l&&t.writeInt32BE(l,5),t.write(p,9),t.write(u,10),t.write(a,42),r.writeSync(d,t,0,t.length,null),s++}(e),g++})),f.on('close',n)}function T(e,t){if(e.skip)return t(null,e);const n=e.type,r=e.src,o=e.dest;'country'===n?Array.isArray(r)?q(r[0],(()=>{G(r[1],o[1]).then((()=>G(r[2],o[2]))).then((()=>{t(null,e)}))})):G(r,o):'city'===n&&F(r[0],o[0],(()=>{L(r[1],o[1]).then((()=>(console.log('\nCity data processed'),L(r[2],o[2])))).then((()=>{console.log(d.green(' DONE')),t(null,e)}))}))}function N(e,t){if(e.skip||!e.checkValue)return t();r.writeFile(i.join(S,e.type+'.checksum'),e.checkValue,'utf8',(n=>{n&&console.log(d.red('Failed to Update checksums!'),'Database:',e.type),t()}))}y||(console.error(d.red('ERROR:'),'Missing license_key'),process.exit(1)),p(v),D(v),l.eachSeries(k,((e,t)=>{l.seq(b,O,A,T,N)(e,t)}),(e=>{e?(console.error(d.red('Failed to update databases from MaxMind'),e),process.exit(1)):(console.log(d.green('Successfully updated databases from MaxMind')),-1!==m.indexOf('debug')?console.debug(d.blue.bold('Notice: temporary files are not deleted for debug purposes')):p(v),process.exit(0))}));
1
+ 'use strict';const{name:e,version:t}=require('../package.json'),n=`Mozilla/5.0 (compatible; ${e}/${t}; +https://sefinek.net)`,r=require('fs'),o=require('http'),s=require('https'),i=require('path'),c=require('zlib'),a=require('readline');r.existsSync=r.existsSync||i.existsSync;const l=require('async'),d=require('kleur'),u=require('iconv-lite'),p=require('rimraf').sync,f=require('adm-zip'),g=require('../lib/utils.js'),{Address6:h,Address4:w}=require('ip-address'),m=process.argv.slice(2);let y=m.find((e=>null!==e.match(/^license_key=[a-zA-Z0-9]+/)));void 0===y&&void 0!==process.env.LICENSE_KEY&&(y=`license_key=${process.env.LICENSE_KEY}`);let I=m.find((e=>null!==e.match(/^geoDataDir=[\w./]+/)));void 0===I&&void 0!==process.env.GEODATADIR&&(I=`geoDataDir=${process.env.GEODATADIR}`);let S=i.resolve(__dirname,'..','data');void 0!==I&&(S=i.resolve(process.cwd(),I.split('=')[1]),r.existsSync(S)||(console.log(d.red('ERROR')+': Directory doesn\'t exist: '+S),process.exit(1)));const v=process.env.GEOTMPDIR?process.env.GEOTMPDIR:i.resolve(__dirname,'..','tmp'),E={},x={NaN:-1},k=[{type:'country',url:`https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&suffix=zip&${y}`,checksum:`https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&suffix=zip.sha256&${y}`,fileName:'GeoLite2-Country-CSV.zip',src:['GeoLite2-Country-Locations-en.csv','GeoLite2-Country-Blocks-IPv4.csv','GeoLite2-Country-Blocks-IPv6.csv'],dest:['','geoip-country.dat','geoip-country6.dat']},{type:'city',url:`https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City-CSV&suffix=zip&${y}`,checksum:`https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City-CSV&suffix=zip.sha256&${y}`,fileName:'GeoLite2-City-CSV.zip',src:['GeoLite2-City-Locations-en.csv','GeoLite2-City-Blocks-IPv4.csv','GeoLite2-City-Blocks-IPv6.csv'],dest:['geoip-city-names.dat','geoip-city.dat','geoip-city6.dat']}];function D(e){const t=i.dirname(e);r.existsSync(t)||r.mkdirSync(t)}const R=/^\s*(?:'[^'\\]*(?:\\[\S\s][^'\\]*)*'|"[^"\\]*(?:\\[\S\s][^"\\]*)*"|[^,'"\s\\]*(?:\s+[^,'"\s\\]+)*)\s*(?:,\s*(?:'[^'\\]*(?:\\[\S\s][^'\\]*)*'|"[^"\\]*(?:\\[\S\s][^"\\]*)*"|[^,'"\s\\]*(?:\s+[^,'"\s\\]+)*)\s*)*$/,C=/(?!\s*$)\s*(?:'([^'\\]*(?:\\[\S\s][^'\\]*)*)'|"([^"\\]*(?:\\[\S\s][^"\\]*)*)"|([^,'"\s\\]*(?:\s+[^,'"\s\\]+)*))\s*(?:,|$)/g;function B(e){if(!R.test(e)&&(e=function(e){let t=0,n=-1;for(e=e.replace(/""/,'\\"').replace(/'/g,'\\\'');t<e.length&&n<e.length;)t=n,n=e.indexOf(',',t+1),n<0&&(n=e.length),e.indexOf('\'',t||0)>-1&&e.indexOf('\'',t)<n&&'"'!=e[t+1]&&'"'!=e[n-1]&&(n=(e=e.substr(0,t+1)+'"'+e.substr(t+1,n-t-1)+'"'+e.substr(n,e.length-n)).indexOf(',',n+1),n<0&&(n=e.length));return e}(e),!R.test(e)))return null;const t=[];return e.replace(C,((e,n,r,o)=>(void 0!==n?t.push(n.replace(/\\'/g,'\'')):void 0!==r?t.push(r.replace(/\\"/g,'"').replace(/\\'/g,'\'')):void 0!==o&&t.push(o),''))),/,\s*$/.test(e)&&t.push(''),t}function _(e){const t=new URL(e),r={protocol:t.protocol,host:t.host,path:t.pathname+t.search,headers:{'User-Agent':n}};if(process.env.http_proxy||process.env.https_proxy)try{const e=require('https-proxy-agent');r.agent=new e(process.env.http_proxy||process.env.https_proxy)}catch(e){console.error('Install https-proxy-agent to use an HTTP/HTTPS proxy'),process.exit(-1)}return r}function b(e,t){if(-1!==m.indexOf('force'))return t(null,e);const n=e.checksum;if(void 0===n)return t(null,e);r.readFile(i.join(S,`${e.type}.checksum`),{encoding:'utf8'},((r,i)=>{!r&&i&&i.length&&(e.checkValue=i),console.log('Checking',e.fileName);var c=s.get(_(n),(function n(r){const i=r.statusCode;if([301,302,303,307,308].includes(i))return s.get(_(r.headers.location),n);200!==i&&(console.error(d.red('ERROR')+r.data),console.error(d.red('ERROR')+': HTTP Request Failed [%d %s]',i,o.STATUS_CODES[i]),c.end(),process.exit(1));let a='';r.on('data',(e=>{a+=e})),r.on('end',(()=>{a&&a.length?a===e.checkValue?(console.log(d.green('Database "'+e.type+'" is up to date')),e.skip=!0):(console.log(d.green('Database '+e.type+' has new data')),e.checkValue=a):(console.error(d.red('ERROR')+': Could not retrieve checksum for',e.type,d.red('Aborting')),console.error('Run with "force" to update without checksum'),c.end(),process.exit(1)),t(null,e)}))}))}))}function O(e,t){if(e.skip)return t(null,null,null,e);const n=e.url;let a=e.fileName;const l='.gz'===i.extname(a);l&&(a=a.replace('.gz',''));const u=i.join(v,a);if(r.existsSync(u))return t(null,u,a,e);console.log('Fetching',a),D(u);var p=s.get(_(n),(function n(i){const f=i.statusCode;if([301,302,303,307,308].includes(f))return s.get(_(i.headers.location),n);let g;200!==f&&(console.error(d.red('ERROR')+': HTTP Request Failed [%d %s]',f,o.STATUS_CODES[f]),p.end(),process.exit(1));const h=r.createWriteStream(u);g=l?i.pipe(c.createGunzip()).pipe(h):i.pipe(h),g.on('close',(()=>{console.log(d.green(' DONE')),t(null,u,a,e)}))}));process.stdout.write(`Retrieving ${a}...`)}function A(e,t,n,o){if(n.skip)return o(null,n);if('.zip'!==i.extname(t))o(null,n);else{process.stdout.write('Extracting '+t+'...');new f(e).getEntries().forEach((e=>{if(e.isDirectory)return;const t=e.entryName.split('/'),n=t[t.length-1],o=i.join(v,n);r.writeFileSync(o,e.getData())})),console.log(d.green(' DONE')),o(null,n)}}function q(e,t){const n=i.join(v,e);process.stdout.write('Processing lookup data (may take a moment)...');const o=a.createInterface({input:r.createReadStream(n).pipe(u.decodeStream('latin1')),output:process.stdout,terminal:!1});let s=0;o.on('line',(e=>{s>0&&function(e){const t=B(e);!t||t.length<6?console.log('Weird line: %s::',e):E[t[0]]=t[4]}(e),s++})),o.on('close',(()=>{console.log(d.green(' DONE')),t()}))}async function G(e,t){let n=0;function o(e){const t=B(e);if(!t||t.length<6)return console.warn('weird line: %s::',e);let r,o,s;n++;const i=E[t[1]];let c,a,d;if(i){if(t[0].match(/:/)){for(a=34,s=new h(t[0]),r=g.aton6(s.startAddress().correctForm()),o=g.aton6(s.endAddress().correctForm()),c=Buffer.alloc(a),d=0;d<r.length;d++)c.writeUInt32BE(r[d],4*d);for(d=0;d<o.length;d++)c.writeUInt32BE(o[d],16+4*d)}else a=10,s=new w(t[0]),r=parseInt(s.startAddress().bigInteger(),10),o=parseInt(s.endAddress().bigInteger(),10),c=Buffer.alloc(a),c.fill(0),c.writeUInt32BE(r,0),c.writeUInt32BE(o,4);return c.write(i,a-2),Date.now()-l>5e3&&(l=Date.now(),process.stdout.write('\nStill working ('+n+')...')),u._writableState.needDrain?new Promise((e=>{u.write(c,e)})):u.write(c)}}const s=i.join(S,t),c=i.join(v,e);p(s),D(s),process.stdout.write('\nProcessing data (may take a moment)...');var l=Date.now(),u=r.createWriteStream(s);const f=a.createInterface({input:r.createReadStream(c),crlfDelay:1/0});let m=0;for await(const e of f)m++,1!==m&&await o(e);u.close(),console.log(d.green(' DONE'))}async function L(e,t){let n=0;async function o(e){if(e.match(/^Copyright/)||!e.match(/\d/))return;const t=B(e);if(!t)return console.warn('Weird line: %s::',e);let r,o,s,i,c,a,u,p,f,m;if(n++,t[0].match(/:/)){let e=0;for(a=48,s=new h(t[0]),r=g.aton6(s.startAddress().correctForm()),o=g.aton6(s.endAddress().correctForm()),i=parseInt(t[1],10),i=x[i],c=Buffer.alloc(a),c.fill(0),m=0;m<r.length;m++)c.writeUInt32BE(r[m],e),e+=4;for(m=0;m<o.length;m++)c.writeUInt32BE(o[m],e),e+=4;c.writeUInt32BE(i>>>0,32),u=Math.round(1e4*parseFloat(t[7])),p=Math.round(1e4*parseFloat(t[8])),f=parseInt(t[9],10),c.writeInt32BE(u,36),c.writeInt32BE(p,40),c.writeInt32BE(f,44)}else a=24,s=new w(t[0]),r=parseInt(s.startAddress().bigInteger(),10),o=parseInt(s.endAddress().bigInteger(),10),i=parseInt(t[1],10),i=x[i],c=Buffer.alloc(a),c.fill(0),c.writeUInt32BE(r>>>0,0),c.writeUInt32BE(o>>>0,4),c.writeUInt32BE(i>>>0,8),u=Math.round(1e4*parseFloat(t[7])),p=Math.round(1e4*parseFloat(t[8])),f=parseInt(t[9],10),c.writeInt32BE(u,12),c.writeInt32BE(p,16),c.writeInt32BE(f,20);return Date.now()-l>5e3&&(l=Date.now(),process.stdout.write('\nStill working ('+n+')...')),d._writableState.needDrain?new Promise((e=>{d.write(c,e)})):d.write(c)}const s=i.join(S,t),c=i.join(v,e);p(s),process.stdout.write('\nProcessing data (may take a moment)...');var l=Date.now(),d=r.createWriteStream(s);const u=a.createInterface({input:r.createReadStream(c),crlfDelay:1/0});let f=0;for await(const e of u)f++,1!==f&&await o(e);d.close()}function F(e,t,n){let o=null,s=0;const c=i.join(S,t),l=i.join(v,e);p(c);var d=r.openSync(c,'w');const f=a.createInterface({input:r.createReadStream(l).pipe(u.decodeStream('utf-8')),output:process.stdout,terminal:!1});let g=0;f.on('line',(e=>{g>0&&function(e){if(e.match(/^Copyright/)||!e.match(/\d/))return;const t=Buffer.alloc(88),n=B(e);if(!n)return void console.warn('Weird line: %s::',e);o=parseInt(n[0]),x[o]=s;const i=n[4],c=n[6],a=n[10],l=parseInt(n[11]),u=n[12],p=n[13];t.fill(0),t.write(i,0),t.write(c,2),l&&t.writeInt32BE(l,5),t.write(p,9),t.write(u,10),t.write(a,42),r.writeSync(d,t,0,t.length,null),s++}(e),g++})),f.on('close',n)}function T(e,t){if(e.skip)return t(null,e);const n=e.type,r=e.src,o=e.dest;'country'===n?Array.isArray(r)?q(r[0],(()=>{G(r[1],o[1]).then((()=>G(r[2],o[2]))).then((()=>{t(null,e)}))})):G(r,o):'city'===n&&F(r[0],o[0],(()=>{L(r[1],o[1]).then((()=>(console.log('\nCity data processed'),L(r[2],o[2])))).then((()=>{console.log(d.green(' DONE')),t(null,e)}))}))}function N(e,t){if(e.skip||!e.checkValue)return t();r.writeFile(i.join(S,e.type+'.checksum'),e.checkValue,'utf8',(n=>{n&&console.log(d.red('Failed to Update checksums!'),'Database:',e.type),t()}))}y||(console.error(d.red('ERROR:'),'Missing license_key'),process.exit(1)),p(v),D(v),l.eachSeries(k,((e,t)=>{l.seq(b,O,A,T,N)(e,t)}),(e=>{e?(console.error(d.red('Failed to update databases from MaxMind'),e),process.exit(1)):(console.log(d.green('Successfully updated databases from MaxMind')),-1!==m.indexOf('debug')?console.debug(d.blue.bold('Notice: temporary files are not deleted for debug purposes')):p(v),process.exit(0))}));