maxmind 4.2.0 → 4.3.3
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 +6 -2
- package/lib/fs.d.ts +1 -2
- package/lib/fs.js +1 -2
- package/lib/fs.js.map +1 -1
- package/lib/index.d.ts +3 -3
- package/lib/index.js +28 -14
- package/lib/index.js.map +1 -1
- package/package.json +12 -11
- package/lib/decoder.d.ts +0 -24
- package/lib/decoder.js +0 -206
- package/lib/decoder.js.map +0 -1
- package/lib/metadata.d.ts +0 -17
- package/lib/metadata.js +0 -55
- package/lib/metadata.js.map +0 -1
- package/lib/reader/response.d.ts +0 -111
- package/lib/reader/response.js +0 -3
- package/lib/reader/response.js.map +0 -1
- package/lib/reader/walker.d.ts +0 -8
- package/lib/reader/walker.js +0 -24
- package/lib/reader/walker.js.map +0 -1
- package/lib/reader.d.ts +0 -18
- package/lib/reader.js +0 -76
- package/lib/reader.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# node-maxmind
|
|
1
|
+
# node-maxmind
|
|
2
2
|
|
|
3
3
|
Javascript module for Geo IP lookup using Maxmind binary databases (aka mmdb or geoip2).
|
|
4
4
|
Fastest Maxmind lookup library available - up to [17,000% faster](https://github.com/runk/node-maxmind-benchmark) than other libraries. Module has 100% test coverage with comprehensive test suite. It natively works with binary Maxmind database format and doesn't require any "CSV - {specific lib format}" conversions as some other modules do. Maxmind binary databases are highly optimized for size and performance so there's no point using other formats.
|
|
@@ -90,6 +90,10 @@ _maxmind.open(filepath, [options])_
|
|
|
90
90
|
- `watchForUpdatesNonPersistent`: `<boolean>` Controlls wether the watcher should be persistent or not. If it is persistent, a node process will be blocked in watching state if the watcher is the only thing still running in the program. _Default_: `false`.
|
|
91
91
|
- `watchForUpdatesHook`: `<Function>` Hook function that is fired on database update. _Default_: `null`.
|
|
92
92
|
|
|
93
|
+
## Does it work in browser?
|
|
94
|
+
|
|
95
|
+
Current module is designed to work in node.js environment. Check out [mmdb-lib](https://github.com/runk/mmdb-lib) that's used under the bonnet - it's environment agnostic and does work in browser.
|
|
96
|
+
|
|
93
97
|
## IP addresses validation
|
|
94
98
|
|
|
95
99
|
Module supports validation for both IPv4 and IPv6:
|
|
@@ -108,7 +112,7 @@ In case you want to use legacy GeoIP binary databases you should use [maxmind@0.
|
|
|
108
112
|
|
|
109
113
|
## References
|
|
110
114
|
|
|
111
|
-
-
|
|
115
|
+
- [MMDB library](https://github.com/runk/mmdb-lib)
|
|
112
116
|
- MaxMind DB file format specification http://maxmind.github.io/MaxMind-DB/
|
|
113
117
|
- MaxMind test/sample DB files https://github.com/maxmind/MaxMind-DB
|
|
114
118
|
- GeoLite2 Free Downloadable Databases http://dev.maxmind.com/geoip/geoip2/geolite2/
|
package/lib/fs.d.ts
CHANGED
package/lib/fs.js
CHANGED
|
@@ -8,7 +8,6 @@ const util_1 = __importDefault(require("util"));
|
|
|
8
8
|
exports.default = {
|
|
9
9
|
existsSync: fs_1.default.existsSync,
|
|
10
10
|
readFile: util_1.default.promisify(fs_1.default.readFile),
|
|
11
|
-
|
|
12
|
-
watch: fs_1.default.watch,
|
|
11
|
+
watchFile: fs_1.default.watchFile,
|
|
13
12
|
};
|
|
14
13
|
//# sourceMappingURL=fs.js.map
|
package/lib/fs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAExB,kBAAe;IACb,UAAU,EAAE,YAAE,CAAC,UAAU;IACzB,QAAQ,EAAE,cAAI,CAAC,SAAS,CAAC,YAAE,CAAC,QAAQ,CAAC;IACrC,
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAExB,kBAAe;IACb,UAAU,EAAE,YAAE,CAAC,UAAU;IACzB,QAAQ,EAAE,cAAI,CAAC,SAAS,CAAC,YAAE,CAAC,QAAQ,CAAC;IACrC,SAAS,EAAE,YAAE,CAAC,SAAS;CACxB,CAAC"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Reader from '
|
|
1
|
+
import Reader from 'mmdb-lib';
|
|
2
2
|
declare type Callback = () => void;
|
|
3
3
|
export interface OpenOpts {
|
|
4
4
|
cache?: {
|
|
@@ -12,7 +12,7 @@ export declare const open: <T>(filepath: string, opts?: OpenOpts | undefined, cb
|
|
|
12
12
|
export declare const openSync: () => never;
|
|
13
13
|
export declare const init: () => never;
|
|
14
14
|
export declare const validate: (ip: string) => boolean;
|
|
15
|
-
export * from '
|
|
15
|
+
export * from 'mmdb-lib';
|
|
16
16
|
declare const _default: {
|
|
17
17
|
init: () => never;
|
|
18
18
|
open: <T>(filepath: string, opts?: OpenOpts | undefined, cb?: Callback | undefined) => Promise<Reader<T>>;
|
|
@@ -20,4 +20,4 @@ declare const _default: {
|
|
|
20
20
|
validate: (ip: string) => boolean;
|
|
21
21
|
};
|
|
22
22
|
export default _default;
|
|
23
|
-
export {
|
|
23
|
+
export { Reader };
|
package/lib/index.js
CHANGED
|
@@ -15,18 +15,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
16
|
exports.Reader = exports.validate = exports.init = exports.openSync = exports.open = void 0;
|
|
17
17
|
const assert_1 = __importDefault(require("assert"));
|
|
18
|
+
const tiny_lru_1 = __importDefault(require("tiny-lru"));
|
|
19
|
+
const mmdb_lib_1 = __importDefault(require("mmdb-lib"));
|
|
20
|
+
exports.Reader = mmdb_lib_1.default;
|
|
18
21
|
const fs_1 = __importDefault(require("./fs"));
|
|
19
22
|
const ip_1 = __importDefault(require("./ip"));
|
|
20
23
|
const is_gzip_1 = __importDefault(require("./is-gzip"));
|
|
21
|
-
const reader_1 = __importDefault(require("./reader"));
|
|
22
24
|
const utils_1 = __importDefault(require("./utils"));
|
|
23
|
-
|
|
24
|
-
assert_1.default(!cb, utils_1.default.legacyErrorMessage);
|
|
25
|
+
const open = async (filepath, opts, cb) => {
|
|
26
|
+
(0, assert_1.default)(!cb, utils_1.default.legacyErrorMessage);
|
|
25
27
|
const database = await fs_1.default.readFile(filepath);
|
|
26
|
-
if (is_gzip_1.default(database)) {
|
|
28
|
+
if ((0, is_gzip_1.default)(database)) {
|
|
27
29
|
throw new Error('Looks like you are passing in a file in gzip format, please use mmdb database instead.');
|
|
28
30
|
}
|
|
29
|
-
const
|
|
31
|
+
const cache = (0, tiny_lru_1.default)((opts && opts.cache && opts.cache.max) || 6000);
|
|
32
|
+
const reader = new mmdb_lib_1.default(database, { cache });
|
|
30
33
|
if (opts && !!opts.watchForUpdates) {
|
|
31
34
|
if (opts.watchForUpdatesHook &&
|
|
32
35
|
typeof opts.watchForUpdatesHook !== 'function') {
|
|
@@ -35,12 +38,22 @@ exports.open = async (filepath, opts, cb) => {
|
|
|
35
38
|
const watcherOptions = {
|
|
36
39
|
persistent: opts.watchForUpdatesNonPersistent !== true,
|
|
37
40
|
};
|
|
38
|
-
fs_1.default.
|
|
39
|
-
|
|
41
|
+
fs_1.default.watchFile(filepath, watcherOptions, async () => {
|
|
42
|
+
const waitExists = async () => {
|
|
43
|
+
for (let i = 0; i < 3; i++) {
|
|
44
|
+
if (fs_1.default.existsSync(filepath)) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
await new Promise(a => setTimeout(a, 500));
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
};
|
|
51
|
+
if (!(await waitExists())) {
|
|
40
52
|
return;
|
|
41
53
|
}
|
|
42
|
-
const
|
|
43
|
-
|
|
54
|
+
const updatedDatabase = await fs_1.default.readFile(filepath);
|
|
55
|
+
cache.clear();
|
|
56
|
+
reader.load(updatedDatabase);
|
|
44
57
|
if (opts.watchForUpdatesHook) {
|
|
45
58
|
opts.watchForUpdatesHook();
|
|
46
59
|
}
|
|
@@ -48,20 +61,21 @@ exports.open = async (filepath, opts, cb) => {
|
|
|
48
61
|
}
|
|
49
62
|
return reader;
|
|
50
63
|
};
|
|
51
|
-
exports.
|
|
64
|
+
exports.open = open;
|
|
65
|
+
const openSync = () => {
|
|
52
66
|
throw new Error(utils_1.default.legacyErrorMessage);
|
|
53
67
|
};
|
|
54
|
-
exports.
|
|
68
|
+
exports.openSync = openSync;
|
|
69
|
+
const init = () => {
|
|
55
70
|
throw new Error(utils_1.default.legacyErrorMessage);
|
|
56
71
|
};
|
|
72
|
+
exports.init = init;
|
|
57
73
|
exports.validate = ip_1.default.validate;
|
|
58
|
-
__exportStar(require("
|
|
74
|
+
__exportStar(require("mmdb-lib"), exports);
|
|
59
75
|
exports.default = {
|
|
60
76
|
init: exports.init,
|
|
61
77
|
open: exports.open,
|
|
62
78
|
openSync: exports.openSync,
|
|
63
79
|
validate: ip_1.default.validate,
|
|
64
80
|
};
|
|
65
|
-
var reader_2 = require("./reader");
|
|
66
|
-
Object.defineProperty(exports, "Reader", { enumerable: true, get: function () { return __importDefault(reader_2).default; } });
|
|
67
81
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAA4B;AAC5B,8CAAsB;AACtB,8CAAsB;AACtB,wDAA+B;AAC/B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAA4B;AAC5B,wDAA2B;AAC3B,wDAA6B;AA8FpB,iBA9FF,kBAAM,CA8FE;AA7Ff,8CAAsB;AACtB,8CAAsB;AACtB,wDAA+B;AAC/B,oDAA4B;AAarB,MAAM,IAAI,GAAG,KAAK,EACvB,QAAgB,EAChB,IAAe,EACf,EAAa,EACO,EAAE;IACtB,IAAA,gBAAM,EAAC,CAAC,EAAE,EAAE,eAAK,CAAC,kBAAkB,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE7C,IAAI,IAAA,iBAAM,EAAC,QAAQ,CAAC,EAAE;QACpB,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;KACH;IAED,MAAM,KAAK,GAAG,IAAA,kBAAG,EAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,kBAAM,CAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAElD,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE;QAClC,IACE,IAAI,CAAC,mBAAmB;YACxB,OAAO,IAAI,CAAC,mBAAmB,KAAK,UAAU,EAC9C;YACA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;SAClE;QACD,MAAM,cAAc,GAAG;YACrB,UAAU,EAAE,IAAI,CAAC,4BAA4B,KAAK,IAAI;SACvD,CAAC;QAEF,YAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE;YAGhD,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;gBAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC1B,IAAI,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;wBAC3B,OAAO,IAAI,CAAC;qBACb;oBAED,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;iBAC5C;gBAED,OAAO,KAAK,CAAC;YACf,CAAC,CAAA;YACD,IAAI,CAAC,CAAC,MAAM,UAAU,EAAE,CAAC,EAAE;gBACzB,OAAO;aACR;YACD,MAAM,eAAe,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpD,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC7B,IAAI,IAAI,CAAC,mBAAmB,EAAE;gBAC5B,IAAI,CAAC,mBAAmB,EAAE,CAAC;aAC5B;QACH,CAAC,CAAC,CAAC;KACJ;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAxDW,QAAA,IAAI,QAwDf;AAEK,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,MAAM,IAAI,KAAK,CAAC,eAAK,CAAC,kBAAkB,CAAC,CAAC;AAC5C,CAAC,CAAC;AAFW,QAAA,QAAQ,YAEnB;AAEK,MAAM,IAAI,GAAG,GAAG,EAAE;IACvB,MAAM,IAAI,KAAK,CAAC,eAAK,CAAC,kBAAkB,CAAC,CAAC;AAC5C,CAAC,CAAC;AAFW,QAAA,IAAI,QAEf;AAEW,QAAA,QAAQ,GAAG,YAAE,CAAC,QAAQ,CAAC;AAEpC,2CAAyB;AAEzB,kBAAe;IACb,IAAI,EAAJ,YAAI;IACJ,IAAI,EAAJ,YAAI;IACJ,QAAQ,EAAR,gBAAQ;IACR,QAAQ,EAAE,YAAE,CAAC,QAAQ;CACtB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "maxmind",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.3",
|
|
4
4
|
"homepage": "https://github.com/runk/node-maxmind",
|
|
5
5
|
"description": "IP lookup using Maxmind databases",
|
|
6
6
|
"keywords": [
|
|
@@ -26,20 +26,21 @@
|
|
|
26
26
|
"Gregory Oschwald @oschwald"
|
|
27
27
|
],
|
|
28
28
|
"dependencies": {
|
|
29
|
+
"mmdb-lib": "1.3.1",
|
|
29
30
|
"tiny-lru": "7.0.6"
|
|
30
31
|
},
|
|
31
32
|
"devDependencies": {
|
|
32
|
-
"@types/ip-address": "
|
|
33
|
-
"@types/jest": "
|
|
34
|
-
"@types/node": "
|
|
35
|
-
"@types/sinon": "
|
|
36
|
-
"ip-address": "
|
|
37
|
-
"jest": "
|
|
38
|
-
"
|
|
39
|
-
"
|
|
33
|
+
"@types/ip-address": "6.0.0",
|
|
34
|
+
"@types/jest": "27.0.3",
|
|
35
|
+
"@types/node": "16.11.14",
|
|
36
|
+
"@types/sinon": "10.0.6",
|
|
37
|
+
"ip-address": "8.1.0",
|
|
38
|
+
"jest": "27.4.5",
|
|
39
|
+
"semantic-release": "18.0.1",
|
|
40
|
+
"sinon": "12.0.1",
|
|
41
|
+
"ts-jest": "27.1.2",
|
|
40
42
|
"tslint": "6.1.3",
|
|
41
|
-
"typescript": "4.
|
|
42
|
-
"semantic-release": "17.1.2"
|
|
43
|
+
"typescript": "4.5.4"
|
|
43
44
|
},
|
|
44
45
|
"repository": {
|
|
45
46
|
"type": "git",
|
package/lib/decoder.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { OpenOpts } from '.';
|
|
3
|
-
export default class Decoder {
|
|
4
|
-
telemetry: Record<string, any>;
|
|
5
|
-
private db;
|
|
6
|
-
private baseOffset;
|
|
7
|
-
private cache;
|
|
8
|
-
constructor(db: Buffer, baseOffset?: number, opts?: OpenOpts);
|
|
9
|
-
decode(offset: number): any;
|
|
10
|
-
decodeFast(offset: number): any;
|
|
11
|
-
private decodeByType;
|
|
12
|
-
private sizeFromCtrlByte;
|
|
13
|
-
private decodeBytes;
|
|
14
|
-
private decodePointer;
|
|
15
|
-
private decodeArray;
|
|
16
|
-
private decodeBoolean;
|
|
17
|
-
private decodeDouble;
|
|
18
|
-
private decodeFloat;
|
|
19
|
-
private decodeMap;
|
|
20
|
-
private decodeInt32;
|
|
21
|
-
private decodeUint;
|
|
22
|
-
private decodeString;
|
|
23
|
-
private decodeBigUint;
|
|
24
|
-
}
|
package/lib/decoder.js
DELETED
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const assert_1 = __importDefault(require("assert"));
|
|
7
|
-
const tiny_lru_1 = __importDefault(require("tiny-lru"));
|
|
8
|
-
const utils_1 = __importDefault(require("./utils"));
|
|
9
|
-
assert_1.default(typeof BigInt !== 'undefined', 'Apparently you are using old version of node. Please upgrade to node 10.4.x or above.');
|
|
10
|
-
var DataType;
|
|
11
|
-
(function (DataType) {
|
|
12
|
-
DataType[DataType["Extended"] = 0] = "Extended";
|
|
13
|
-
DataType[DataType["Pointer"] = 1] = "Pointer";
|
|
14
|
-
DataType[DataType["Utf8String"] = 2] = "Utf8String";
|
|
15
|
-
DataType[DataType["Double"] = 3] = "Double";
|
|
16
|
-
DataType[DataType["Bytes"] = 4] = "Bytes";
|
|
17
|
-
DataType[DataType["Uint16"] = 5] = "Uint16";
|
|
18
|
-
DataType[DataType["Uint32"] = 6] = "Uint32";
|
|
19
|
-
DataType[DataType["Map"] = 7] = "Map";
|
|
20
|
-
DataType[DataType["Int32"] = 8] = "Int32";
|
|
21
|
-
DataType[DataType["Uint64"] = 9] = "Uint64";
|
|
22
|
-
DataType[DataType["Uint128"] = 10] = "Uint128";
|
|
23
|
-
DataType[DataType["Array"] = 11] = "Array";
|
|
24
|
-
DataType[DataType["Container"] = 12] = "Container";
|
|
25
|
-
DataType[DataType["EndMarker"] = 13] = "EndMarker";
|
|
26
|
-
DataType[DataType["Boolean"] = 14] = "Boolean";
|
|
27
|
-
DataType[DataType["Float"] = 15] = "Float";
|
|
28
|
-
})(DataType || (DataType = {}));
|
|
29
|
-
const pointerValueOffset = [0, 2048, 526336, 0];
|
|
30
|
-
const cursor = (value, offset) => ({ value, offset });
|
|
31
|
-
class Decoder {
|
|
32
|
-
constructor(db, baseOffset = 0, opts) {
|
|
33
|
-
this.telemetry = {};
|
|
34
|
-
assert_1.default((this.db = db), 'File stream is required');
|
|
35
|
-
this.baseOffset = baseOffset;
|
|
36
|
-
this.cache = tiny_lru_1.default(opts && opts.cache && opts.cache.max ? opts.cache.max : 6000);
|
|
37
|
-
}
|
|
38
|
-
decode(offset) {
|
|
39
|
-
let tmp;
|
|
40
|
-
const ctrlByte = this.db[offset++];
|
|
41
|
-
let type = ctrlByte >> 5;
|
|
42
|
-
if (type === DataType.Pointer) {
|
|
43
|
-
tmp = this.decodePointer(ctrlByte, offset);
|
|
44
|
-
return cursor(this.decodeFast(tmp.value).value, tmp.offset);
|
|
45
|
-
}
|
|
46
|
-
if (type === DataType.Extended) {
|
|
47
|
-
tmp = this.db[offset] + 7;
|
|
48
|
-
if (tmp < 8) {
|
|
49
|
-
throw new Error('Invalid Extended Type at offset ' + offset + ' val ' + tmp);
|
|
50
|
-
}
|
|
51
|
-
type = tmp;
|
|
52
|
-
offset++;
|
|
53
|
-
}
|
|
54
|
-
const size = this.sizeFromCtrlByte(ctrlByte, offset);
|
|
55
|
-
return this.decodeByType(type, size.offset, size.value);
|
|
56
|
-
}
|
|
57
|
-
decodeFast(offset) {
|
|
58
|
-
const cached = this.cache.get(offset);
|
|
59
|
-
if (cached) {
|
|
60
|
-
return cached;
|
|
61
|
-
}
|
|
62
|
-
const result = this.decode(offset);
|
|
63
|
-
this.cache.set(offset, result);
|
|
64
|
-
return result;
|
|
65
|
-
}
|
|
66
|
-
decodeByType(type, offset, size) {
|
|
67
|
-
const newOffset = offset + size;
|
|
68
|
-
switch (type) {
|
|
69
|
-
case DataType.Utf8String:
|
|
70
|
-
return cursor(this.decodeString(offset, size), newOffset);
|
|
71
|
-
case DataType.Map:
|
|
72
|
-
return this.decodeMap(size, offset);
|
|
73
|
-
case DataType.Uint32:
|
|
74
|
-
return cursor(this.decodeUint(offset, size), newOffset);
|
|
75
|
-
case DataType.Double:
|
|
76
|
-
return cursor(this.decodeDouble(offset), newOffset);
|
|
77
|
-
case DataType.Array:
|
|
78
|
-
return this.decodeArray(size, offset);
|
|
79
|
-
case DataType.Boolean:
|
|
80
|
-
return cursor(this.decodeBoolean(size), offset);
|
|
81
|
-
case DataType.Float:
|
|
82
|
-
return cursor(this.decodeFloat(offset), newOffset);
|
|
83
|
-
case DataType.Bytes:
|
|
84
|
-
return cursor(this.decodeBytes(offset, size), newOffset);
|
|
85
|
-
case DataType.Uint16:
|
|
86
|
-
return cursor(this.decodeUint(offset, size), newOffset);
|
|
87
|
-
case DataType.Int32:
|
|
88
|
-
return cursor(this.decodeInt32(offset, size), newOffset);
|
|
89
|
-
case DataType.Uint64:
|
|
90
|
-
return cursor(this.decodeUint(offset, size), newOffset);
|
|
91
|
-
case DataType.Uint128:
|
|
92
|
-
return cursor(this.decodeUint(offset, size), newOffset);
|
|
93
|
-
}
|
|
94
|
-
throw new Error('Unknown type ' + type + ' at offset ' + offset);
|
|
95
|
-
}
|
|
96
|
-
sizeFromCtrlByte(ctrlByte, offset) {
|
|
97
|
-
const size = ctrlByte & 0x1f;
|
|
98
|
-
if (size < 29) {
|
|
99
|
-
return cursor(size, offset);
|
|
100
|
-
}
|
|
101
|
-
if (size === 29) {
|
|
102
|
-
return cursor(29 + this.db[offset], offset + 1);
|
|
103
|
-
}
|
|
104
|
-
if (size === 30) {
|
|
105
|
-
return cursor(285 + this.db.readUInt16BE(offset, false), offset + 2);
|
|
106
|
-
}
|
|
107
|
-
return cursor(65821 +
|
|
108
|
-
utils_1.default.concat3(this.db[offset], this.db[offset + 1], this.db[offset + 2]), offset + 3);
|
|
109
|
-
}
|
|
110
|
-
decodeBytes(offset, size) {
|
|
111
|
-
return this.db.slice(offset, offset + size);
|
|
112
|
-
}
|
|
113
|
-
decodePointer(ctrlByte, offset) {
|
|
114
|
-
const pointerSize = (ctrlByte >> 3) & 3;
|
|
115
|
-
const pointer = this.baseOffset + pointerValueOffset[pointerSize];
|
|
116
|
-
let packed = 0;
|
|
117
|
-
if (pointerSize === 0) {
|
|
118
|
-
packed = utils_1.default.concat2(ctrlByte & 7, this.db[offset]);
|
|
119
|
-
}
|
|
120
|
-
else if (pointerSize === 1) {
|
|
121
|
-
packed = utils_1.default.concat3(ctrlByte & 7, this.db[offset], this.db[offset + 1]);
|
|
122
|
-
}
|
|
123
|
-
else if (pointerSize === 2) {
|
|
124
|
-
packed = utils_1.default.concat4(ctrlByte & 7, this.db[offset], this.db[offset + 1], this.db[offset + 2]);
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
packed = this.db.readUInt32BE(offset, true);
|
|
128
|
-
}
|
|
129
|
-
offset += pointerSize + 1;
|
|
130
|
-
return cursor(pointer + packed, offset);
|
|
131
|
-
}
|
|
132
|
-
decodeArray(size, offset) {
|
|
133
|
-
let tmp;
|
|
134
|
-
const array = [];
|
|
135
|
-
for (let i = 0; i < size; i++) {
|
|
136
|
-
tmp = this.decode(offset);
|
|
137
|
-
offset = tmp.offset;
|
|
138
|
-
array.push(tmp.value);
|
|
139
|
-
}
|
|
140
|
-
return cursor(array, offset);
|
|
141
|
-
}
|
|
142
|
-
decodeBoolean(size) {
|
|
143
|
-
return size !== 0;
|
|
144
|
-
}
|
|
145
|
-
decodeDouble(offset) {
|
|
146
|
-
return this.db.readDoubleBE(offset, true);
|
|
147
|
-
}
|
|
148
|
-
decodeFloat(offset) {
|
|
149
|
-
return this.db.readFloatBE(offset, true);
|
|
150
|
-
}
|
|
151
|
-
decodeMap(size, offset) {
|
|
152
|
-
let tmp;
|
|
153
|
-
let key;
|
|
154
|
-
const map = {};
|
|
155
|
-
for (let i = 0; i < size; i++) {
|
|
156
|
-
tmp = this.decode(offset);
|
|
157
|
-
key = tmp.value;
|
|
158
|
-
tmp = this.decode(tmp.offset);
|
|
159
|
-
offset = tmp.offset;
|
|
160
|
-
map[key] = tmp.value;
|
|
161
|
-
}
|
|
162
|
-
return cursor(map, offset);
|
|
163
|
-
}
|
|
164
|
-
decodeInt32(offset, size) {
|
|
165
|
-
if (size === 0) {
|
|
166
|
-
return 0;
|
|
167
|
-
}
|
|
168
|
-
return this.db.readInt32BE(offset, true);
|
|
169
|
-
}
|
|
170
|
-
decodeUint(offset, size) {
|
|
171
|
-
switch (size) {
|
|
172
|
-
case 0:
|
|
173
|
-
return 0;
|
|
174
|
-
case 1:
|
|
175
|
-
return this.db[offset];
|
|
176
|
-
case 2:
|
|
177
|
-
return utils_1.default.concat2(this.db[offset + 0], this.db[offset + 1]);
|
|
178
|
-
case 3:
|
|
179
|
-
return utils_1.default.concat3(this.db[offset + 0], this.db[offset + 1], this.db[offset + 2]);
|
|
180
|
-
case 4:
|
|
181
|
-
return utils_1.default.concat4(this.db[offset + 0], this.db[offset + 1], this.db[offset + 2], this.db[offset + 3]);
|
|
182
|
-
case 8:
|
|
183
|
-
return this.decodeBigUint(offset, size);
|
|
184
|
-
case 16:
|
|
185
|
-
return this.decodeBigUint(offset, size);
|
|
186
|
-
}
|
|
187
|
-
return 0;
|
|
188
|
-
}
|
|
189
|
-
decodeString(offset, size) {
|
|
190
|
-
return this.db.utf8Slice(offset, offset + size);
|
|
191
|
-
}
|
|
192
|
-
decodeBigUint(offset, size) {
|
|
193
|
-
const buffer = Buffer.alloc(size);
|
|
194
|
-
this.db.copy(buffer, 0, offset, offset + size);
|
|
195
|
-
let integer = BigInt(0);
|
|
196
|
-
const numberOfLongs = size / 4;
|
|
197
|
-
for (let i = 0; i < numberOfLongs; i++) {
|
|
198
|
-
integer =
|
|
199
|
-
integer * BigInt(4294967296) +
|
|
200
|
-
BigInt(buffer.readUInt32BE(i << 2, true));
|
|
201
|
-
}
|
|
202
|
-
return integer.toString();
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
exports.default = Decoder;
|
|
206
|
-
//# sourceMappingURL=decoder.js.map
|
package/lib/decoder.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decoder.js","sourceRoot":"","sources":["../src/decoder.ts"],"names":[],"mappings":"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"}
|
package/lib/metadata.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
export interface Metadata {
|
|
3
|
-
readonly binaryFormatMajorVersion: number;
|
|
4
|
-
readonly binaryFormatMinorVersion: number;
|
|
5
|
-
readonly buildEpoch: Date;
|
|
6
|
-
readonly databaseType: string;
|
|
7
|
-
readonly languages: string[];
|
|
8
|
-
readonly description: any;
|
|
9
|
-
readonly ipVersion: number;
|
|
10
|
-
readonly nodeCount: number;
|
|
11
|
-
readonly recordSize: number;
|
|
12
|
-
readonly nodeByteSize: number;
|
|
13
|
-
readonly searchTreeSize: number;
|
|
14
|
-
readonly treeDepth: number;
|
|
15
|
-
}
|
|
16
|
-
export declare const parseMetadata: (db: Buffer) => Metadata;
|
|
17
|
-
export declare const isLegacyFormat: (db: Buffer) => boolean;
|
package/lib/metadata.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.isLegacyFormat = exports.parseMetadata = void 0;
|
|
7
|
-
const assert_1 = __importDefault(require("assert"));
|
|
8
|
-
const decoder_1 = __importDefault(require("./decoder"));
|
|
9
|
-
const utils_1 = __importDefault(require("./utils"));
|
|
10
|
-
const METADATA_START_MARKER = Buffer.from('ABCDEF4D61784D696E642E636F6D', 'hex');
|
|
11
|
-
exports.parseMetadata = (db) => {
|
|
12
|
-
const offset = findStart(db);
|
|
13
|
-
const decoder = new decoder_1.default(db, offset);
|
|
14
|
-
const metadata = decoder.decode(offset).value;
|
|
15
|
-
if (!metadata) {
|
|
16
|
-
throw new Error(exports.isLegacyFormat(db)
|
|
17
|
-
? utils_1.default.legacyErrorMessage
|
|
18
|
-
: 'Cannot parse binary database');
|
|
19
|
-
}
|
|
20
|
-
assert_1.default([24, 28, 32].indexOf(metadata.record_size) > -1, 'Unsupported record size');
|
|
21
|
-
return {
|
|
22
|
-
binaryFormatMajorVersion: metadata.binary_format_major_version,
|
|
23
|
-
binaryFormatMinorVersion: metadata.binary_format_minor_version,
|
|
24
|
-
buildEpoch: new Date(metadata.build_epoch * 1000),
|
|
25
|
-
databaseType: metadata.database_type,
|
|
26
|
-
description: metadata.description,
|
|
27
|
-
ipVersion: metadata.ip_version,
|
|
28
|
-
languages: metadata.languages,
|
|
29
|
-
nodeByteSize: metadata.record_size / 4,
|
|
30
|
-
nodeCount: metadata.node_count,
|
|
31
|
-
recordSize: metadata.record_size,
|
|
32
|
-
searchTreeSize: (metadata.node_count * metadata.record_size) / 4,
|
|
33
|
-
treeDepth: Math.pow(2, metadata.ip_version + 1),
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
const findStart = (db) => {
|
|
37
|
-
let found = 0;
|
|
38
|
-
let fsize = db.length - 1;
|
|
39
|
-
const mlen = METADATA_START_MARKER.length - 1;
|
|
40
|
-
while (found <= mlen && fsize-- > 0) {
|
|
41
|
-
found += db[fsize] === METADATA_START_MARKER[mlen - found] ? 1 : -found;
|
|
42
|
-
}
|
|
43
|
-
return fsize + found;
|
|
44
|
-
};
|
|
45
|
-
exports.isLegacyFormat = (db) => {
|
|
46
|
-
const structureInfoMaxSize = 20;
|
|
47
|
-
for (let i = 0; i < structureInfoMaxSize; i++) {
|
|
48
|
-
const delim = db.slice(db.length - 3 - i, db.length - i);
|
|
49
|
-
if (delim[0] === 255 && delim[1] === 255 && delim[2] === 255) {
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return false;
|
|
54
|
-
};
|
|
55
|
-
//# sourceMappingURL=metadata.js.map
|
package/lib/metadata.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,wDAAgC;AAChC,oDAA4B;AAE5B,MAAM,qBAAqB,GAAG,MAAM,CAAC,IAAI,CACvC,8BAA8B,EAC9B,KAAK,CACN,CAAC;AAiBW,QAAA,aAAa,GAAG,CAAC,EAAU,EAAY,EAAE;IACpD,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;IAE9C,IAAI,CAAC,QAAQ,EAAE;QACb,MAAM,IAAI,KAAK,CACb,sBAAc,CAAC,EAAE,CAAC;YAChB,CAAC,CAAC,eAAK,CAAC,kBAAkB;YAC1B,CAAC,CAAC,8BAA8B,CACnC,CAAC;KACH;IAED,gBAAM,CACJ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAC/C,yBAAyB,CAC1B,CAAC;IAEF,OAAO;QACL,wBAAwB,EAAE,QAAQ,CAAC,2BAA2B;QAC9D,wBAAwB,EAAE,QAAQ,CAAC,2BAA2B;QAC9D,UAAU,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;QACjD,YAAY,EAAE,QAAQ,CAAC,aAAa;QACpC,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,SAAS,EAAE,QAAQ,CAAC,UAAU;QAC9B,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,YAAY,EAAE,QAAQ,CAAC,WAAW,GAAG,CAAC;QACtC,SAAS,EAAE,QAAQ,CAAC,UAAU;QAC9B,UAAU,EAAE,QAAQ,CAAC,WAAW;QAChC,cAAc,EAAE,CAAC,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC;QAEhE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;KAChD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,EAAU,EAAU,EAAE;IACvC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9C,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,GAAG,CAAC,EAAE;QACnC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,qBAAqB,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;KACzE;IACD,OAAO,KAAK,GAAG,KAAK,CAAC;AACvB,CAAC,CAAC;AAEW,QAAA,cAAc,GAAG,CAAC,EAAU,EAAW,EAAE;IACpD,MAAM,oBAAoB,GAAG,EAAE,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAGzD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;YAC5D,OAAO,IAAI,CAAC;SACb;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
|
package/lib/reader/response.d.ts
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
interface Names {
|
|
2
|
-
readonly de?: string;
|
|
3
|
-
readonly en: string;
|
|
4
|
-
readonly es?: string;
|
|
5
|
-
readonly fr?: string;
|
|
6
|
-
readonly ja?: string;
|
|
7
|
-
readonly 'pt-BR'?: string;
|
|
8
|
-
readonly ru?: string;
|
|
9
|
-
readonly 'zh-CN'?: string;
|
|
10
|
-
}
|
|
11
|
-
interface CityRecord {
|
|
12
|
-
readonly confidence?: number;
|
|
13
|
-
readonly geoname_id: number;
|
|
14
|
-
readonly names: Names;
|
|
15
|
-
}
|
|
16
|
-
interface ContinentRecord {
|
|
17
|
-
readonly code: 'AF' | 'AN' | 'AS' | 'EU' | 'NA' | 'OC' | 'SA';
|
|
18
|
-
readonly geoname_id: number;
|
|
19
|
-
readonly names: Names;
|
|
20
|
-
}
|
|
21
|
-
interface RegisteredCountryRecord {
|
|
22
|
-
readonly geoname_id: number;
|
|
23
|
-
readonly is_in_european_union?: boolean;
|
|
24
|
-
readonly iso_code: string;
|
|
25
|
-
readonly names: Names;
|
|
26
|
-
}
|
|
27
|
-
interface CountryRecord extends RegisteredCountryRecord {
|
|
28
|
-
readonly confidence?: number;
|
|
29
|
-
}
|
|
30
|
-
interface LocationRecord {
|
|
31
|
-
readonly accuracy_radius: number;
|
|
32
|
-
readonly average_income?: number;
|
|
33
|
-
readonly latitude: number;
|
|
34
|
-
readonly longitude: number;
|
|
35
|
-
readonly metro_code?: number;
|
|
36
|
-
readonly population_density?: number;
|
|
37
|
-
readonly time_zone?: string;
|
|
38
|
-
}
|
|
39
|
-
interface PostalRecord {
|
|
40
|
-
readonly code: string;
|
|
41
|
-
readonly confidence?: number;
|
|
42
|
-
}
|
|
43
|
-
interface RepresentedCountryRecord extends RegisteredCountryRecord {
|
|
44
|
-
readonly type: string;
|
|
45
|
-
}
|
|
46
|
-
interface SubdivisionsRecord {
|
|
47
|
-
readonly confidence?: number;
|
|
48
|
-
readonly geoname_id: number;
|
|
49
|
-
readonly iso_code: string;
|
|
50
|
-
readonly names: Names;
|
|
51
|
-
}
|
|
52
|
-
interface TraitsRecord {
|
|
53
|
-
readonly autonomous_system_number?: number;
|
|
54
|
-
readonly autonomous_system_organization?: string;
|
|
55
|
-
readonly connection_type?: string;
|
|
56
|
-
readonly domain?: string;
|
|
57
|
-
ip_address?: string;
|
|
58
|
-
readonly is_anonymous?: boolean;
|
|
59
|
-
readonly is_anonymous_proxy?: boolean;
|
|
60
|
-
readonly is_anonymous_vpn?: boolean;
|
|
61
|
-
readonly is_hosting_provider?: boolean;
|
|
62
|
-
readonly is_legitimate_proxy?: boolean;
|
|
63
|
-
readonly is_public_proxy?: boolean;
|
|
64
|
-
readonly is_satellite_provider?: boolean;
|
|
65
|
-
readonly is_tor_exit_node?: boolean;
|
|
66
|
-
readonly isp?: string;
|
|
67
|
-
readonly organization?: string;
|
|
68
|
-
readonly user_type?: 'business' | 'cafe' | 'cellular' | 'college' | 'content_delivery_network' | 'dialup' | 'government' | 'hosting' | 'library' | 'military' | 'residential' | 'router' | 'school' | 'search_engine_spider' | 'traveler';
|
|
69
|
-
}
|
|
70
|
-
export interface CountryResponse {
|
|
71
|
-
readonly continent?: ContinentRecord;
|
|
72
|
-
readonly country?: CountryRecord;
|
|
73
|
-
readonly registered_country?: RegisteredCountryRecord;
|
|
74
|
-
readonly represented_country?: RepresentedCountryRecord;
|
|
75
|
-
readonly traits?: TraitsRecord;
|
|
76
|
-
}
|
|
77
|
-
export interface CityResponse extends CountryResponse {
|
|
78
|
-
readonly city?: CityRecord;
|
|
79
|
-
readonly location?: LocationRecord;
|
|
80
|
-
readonly postal?: PostalRecord;
|
|
81
|
-
readonly subdivisions?: SubdivisionsRecord[];
|
|
82
|
-
}
|
|
83
|
-
export interface AnonymousIPResponse {
|
|
84
|
-
ip_address?: string;
|
|
85
|
-
readonly is_anonymous?: boolean;
|
|
86
|
-
readonly is_anonymous_proxy?: boolean;
|
|
87
|
-
readonly is_anonymous_vpn?: boolean;
|
|
88
|
-
readonly is_hosting_provider?: boolean;
|
|
89
|
-
readonly is_public_proxy?: boolean;
|
|
90
|
-
readonly is_residential_proxy?: boolean;
|
|
91
|
-
readonly is_tor_exit_node?: boolean;
|
|
92
|
-
}
|
|
93
|
-
export interface AsnResponse {
|
|
94
|
-
readonly autonomous_system_number: number;
|
|
95
|
-
readonly autonomous_system_organization: string;
|
|
96
|
-
ip_address?: string;
|
|
97
|
-
}
|
|
98
|
-
export interface ConnectionTypeResponse {
|
|
99
|
-
readonly connection_type: string;
|
|
100
|
-
ip_address?: string;
|
|
101
|
-
}
|
|
102
|
-
export interface DomainResponse {
|
|
103
|
-
readonly domain: string;
|
|
104
|
-
ip_address?: string;
|
|
105
|
-
}
|
|
106
|
-
export interface IspResponse extends AsnResponse {
|
|
107
|
-
readonly isp: string;
|
|
108
|
-
readonly organization: string;
|
|
109
|
-
}
|
|
110
|
-
export declare type Response = CountryResponse | CityResponse | AnonymousIPResponse | AsnResponse | ConnectionTypeResponse | DomainResponse | IspResponse;
|
|
111
|
-
export {};
|
package/lib/reader/response.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/reader/response.ts"],"names":[],"mappings":""}
|
package/lib/reader/walker.d.ts
DELETED
package/lib/reader/walker.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const utils_1 = __importDefault(require("../utils"));
|
|
7
|
-
const readNodeRight24 = (db) => (offset) => utils_1.default.concat3(db[offset + 3], db[offset + 4], db[offset + 5]);
|
|
8
|
-
const readNodeLeft24 = (db) => (offset) => utils_1.default.concat3(db[offset], db[offset + 1], db[offset + 2]);
|
|
9
|
-
const readNodeLeft28 = (db) => (offset) => utils_1.default.concat4(db[offset + 3] >> 4, db[offset], db[offset + 1], db[offset + 2]);
|
|
10
|
-
const readNodeRight28 = (db) => (offset) => utils_1.default.concat4(db[offset + 3] & 0x0f, db[offset + 4], db[offset + 5], db[offset + 6]);
|
|
11
|
-
const readNodeLeft32 = (db) => (offset) => db.readUInt32BE(offset, true);
|
|
12
|
-
const readNodeRight32 = (db) => (offset) => db.readUInt32BE(offset + 4, true);
|
|
13
|
-
exports.default = (db, recordSize) => {
|
|
14
|
-
switch (recordSize) {
|
|
15
|
-
case 24:
|
|
16
|
-
return { left: readNodeLeft24(db), right: readNodeRight24(db) };
|
|
17
|
-
case 28:
|
|
18
|
-
return { left: readNodeLeft28(db), right: readNodeRight28(db) };
|
|
19
|
-
case 32:
|
|
20
|
-
return { left: readNodeLeft32(db), right: readNodeRight32(db) };
|
|
21
|
-
}
|
|
22
|
-
throw new Error('Unsupported record size');
|
|
23
|
-
};
|
|
24
|
-
//# sourceMappingURL=walker.js.map
|
package/lib/reader/walker.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"walker.js","sourceRoot":"","sources":["../../src/reader/walker.ts"],"names":[],"mappings":";;;;;AAAA,qDAA6B;AAS7B,MAAM,eAAe,GAAG,CAAC,EAAU,EAAc,EAAE,CAAC,CAAC,MAAc,EAAU,EAAE,CAC7E,eAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAEhE,MAAM,cAAc,GAAG,CAAC,EAAU,EAAc,EAAE,CAAC,CAAC,MAAc,EAAU,EAAE,CAC5E,eAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAE5D,MAAM,cAAc,GAAG,CAAC,EAAU,EAAc,EAAE,CAAC,CAAC,MAAc,EAAU,EAAE,CAC5E,eAAK,CAAC,OAAO,CACX,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,EACnB,EAAE,CAAC,MAAM,CAAC,EACV,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EACd,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CACf,CAAC;AAEJ,MAAM,eAAe,GAAG,CAAC,EAAU,EAAc,EAAE,CAAC,CAAC,MAAc,EAAU,EAAE,CAC7E,eAAK,CAAC,OAAO,CACX,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EACrB,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EACd,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EACd,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CACf,CAAC;AAEJ,MAAM,cAAc,GAAG,CAAC,EAAU,EAAc,EAAE,CAAC,CAAC,MAAc,EAAU,EAAE,CAC5E,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAEhC,MAAM,eAAe,GAAG,CAAC,EAAU,EAAc,EAAE,CAAC,CAAC,MAAc,EAAU,EAAE,CAC7E,EAAE,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAEpC,kBAAe,CAAC,EAAU,EAAE,UAAkB,EAAU,EAAE;IACxD,QAAQ,UAAU,EAAE;QAClB,KAAK,EAAE;YACL,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC;QAClE,KAAK,EAAE;YACL,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC;QAClE,KAAK,EAAE;YACL,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC;KACnE;IACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC7C,CAAC,CAAC"}
|
package/lib/reader.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { OpenOpts } from '.';
|
|
3
|
-
import { Metadata } from './metadata';
|
|
4
|
-
import { Response } from './reader/response';
|
|
5
|
-
export default class Reader<T extends Response> {
|
|
6
|
-
metadata: Metadata;
|
|
7
|
-
private decoder;
|
|
8
|
-
private db;
|
|
9
|
-
private ipv4StartNodeNumber;
|
|
10
|
-
private walker;
|
|
11
|
-
constructor(db: Buffer, opts?: OpenOpts);
|
|
12
|
-
load(db: Buffer, opts: object): void;
|
|
13
|
-
get(ipAddress: string): T | null;
|
|
14
|
-
getWithPrefixLength(ipAddress: string): [T | null, number];
|
|
15
|
-
private findAddressInTree;
|
|
16
|
-
private resolveDataPointer;
|
|
17
|
-
private ipv4Start;
|
|
18
|
-
}
|
package/lib/reader.js
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const decoder_1 = __importDefault(require("./decoder"));
|
|
7
|
-
const ip_1 = __importDefault(require("./ip"));
|
|
8
|
-
const metadata_1 = require("./metadata");
|
|
9
|
-
const walker_1 = __importDefault(require("./reader/walker"));
|
|
10
|
-
const DATA_SECTION_SEPARATOR_SIZE = 16;
|
|
11
|
-
class Reader {
|
|
12
|
-
constructor(db, opts) {
|
|
13
|
-
opts = opts || {};
|
|
14
|
-
this.db = db;
|
|
15
|
-
this.metadata = metadata_1.parseMetadata(this.db);
|
|
16
|
-
this.decoder = new decoder_1.default(this.db, this.metadata.searchTreeSize + DATA_SECTION_SEPARATOR_SIZE, opts);
|
|
17
|
-
this.walker = walker_1.default(this.db, this.metadata.recordSize);
|
|
18
|
-
this.ipv4StartNodeNumber = this.ipv4Start();
|
|
19
|
-
}
|
|
20
|
-
load(db, opts) {
|
|
21
|
-
this.db = db;
|
|
22
|
-
this.metadata = metadata_1.parseMetadata(this.db);
|
|
23
|
-
this.decoder = new decoder_1.default(this.db, this.metadata.searchTreeSize + DATA_SECTION_SEPARATOR_SIZE, opts);
|
|
24
|
-
this.walker = walker_1.default(this.db, this.metadata.recordSize);
|
|
25
|
-
this.ipv4StartNodeNumber = this.ipv4Start();
|
|
26
|
-
}
|
|
27
|
-
get(ipAddress) {
|
|
28
|
-
const [data] = this.getWithPrefixLength(ipAddress);
|
|
29
|
-
return data;
|
|
30
|
-
}
|
|
31
|
-
getWithPrefixLength(ipAddress) {
|
|
32
|
-
const [pointer, prefixLength] = this.findAddressInTree(ipAddress);
|
|
33
|
-
const data = pointer ? this.resolveDataPointer(pointer) : null;
|
|
34
|
-
return [data, prefixLength];
|
|
35
|
-
}
|
|
36
|
-
findAddressInTree(ipAddress) {
|
|
37
|
-
const rawAddress = ip_1.default.parse(ipAddress);
|
|
38
|
-
const nodeCount = this.metadata.nodeCount;
|
|
39
|
-
const bitLength = rawAddress.length * 8;
|
|
40
|
-
let bit;
|
|
41
|
-
let nodeNumber = 0;
|
|
42
|
-
let offset;
|
|
43
|
-
let depth = 0;
|
|
44
|
-
if (rawAddress.length === 4) {
|
|
45
|
-
nodeNumber = this.ipv4StartNodeNumber;
|
|
46
|
-
}
|
|
47
|
-
for (; depth < bitLength && nodeNumber < nodeCount; depth++) {
|
|
48
|
-
bit = ip_1.default.bitAt(rawAddress, depth);
|
|
49
|
-
offset = nodeNumber * this.metadata.nodeByteSize;
|
|
50
|
-
nodeNumber = bit ? this.walker.right(offset) : this.walker.left(offset);
|
|
51
|
-
}
|
|
52
|
-
if (nodeNumber > nodeCount) {
|
|
53
|
-
return [nodeNumber, depth];
|
|
54
|
-
}
|
|
55
|
-
return [null, depth];
|
|
56
|
-
}
|
|
57
|
-
resolveDataPointer(pointer) {
|
|
58
|
-
const resolved = pointer - this.metadata.nodeCount + this.metadata.searchTreeSize;
|
|
59
|
-
return this.decoder.decodeFast(resolved).value;
|
|
60
|
-
}
|
|
61
|
-
ipv4Start() {
|
|
62
|
-
if (this.metadata.ipVersion === 4) {
|
|
63
|
-
return 0;
|
|
64
|
-
}
|
|
65
|
-
const nodeCount = this.metadata.nodeCount;
|
|
66
|
-
let pointer = 0;
|
|
67
|
-
let i = 0;
|
|
68
|
-
for (; i < 96 && pointer < nodeCount; i++) {
|
|
69
|
-
const offset = pointer * this.metadata.nodeByteSize;
|
|
70
|
-
pointer = this.walker.left(offset);
|
|
71
|
-
}
|
|
72
|
-
return pointer;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
exports.default = Reader;
|
|
76
|
-
//# sourceMappingURL=reader.js.map
|
package/lib/reader.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"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"}
|