提交 d9980db1 编写于 作者: W Wu Jian Ping

nodejs实现

上级 0856b034
module.exports = {
env: {
browser: true,
commonjs: true,
es2021: true
},
extends: [
'standard'
],
parserOptions: {
ecmaVersion: 'latest'
},
rules: {
}
}
# ip2region nodejs 查询客户端实现
# 使用方式
## 使用方式
# 查询测试
### 完全基于文件的查询
# bench 测试
### 缓存 `VectorIndex` 索引
### 缓存整个 `xdb` 数据
```js
const Ip2Region = require('./')
const ip2region = new Ip2Region()
// 注意:这边是同步代码,生产环境建议只执行一次初始化, 并且数据是存放在内存中的
ip2region.load('../../data/ip2region.xdb')
const info = ip2region.search('202.97.77.50')
```
## 查询测试
## bench 测试
const fs = require('fs')
// 常量定义
// 每个 vector 索引项的字节数
const VectorIndexSize = 8
// vector 索引的列数
const VectorIndexCols = 256
// vector 索引段整个的字节数
const VectorIndexLength = 256 * 256 * (4 + 4)
// 二分索引项的字节数
const SegmentIndexSize = 14
// IPv4检查正则
const IP_REGEX = /((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))/
const getStartEndPtr = Symbol('#getStartEndPtr')
const getBuffer = Symbol('#getBuffer')
const openFilePromise = Symbol('#openFilePromise')
class Searcher {
constructor (dbFile, vectorIndex, buffer) {
this._dbFile = dbFile
this._vectorIndex = vectorIndex
this._buffer = buffer
if (this._buffer) {
this._vectorIndex = this._buffer.subarray(256, 256 + VectorIndexLength)
}
}
async [getStartEndPtr] (idx, fd) {
if (this._vectorIndex) {
// 区域二分索引的开始地址
// idx 开始读取 4 个字节,用小端字节序解码得到一个整数
const sPtr = this._vectorIndex.readUInt32LE(idx)
// 二分区域索引的结束地址
// idx + 4 处读取 4 个字节,用小端字节序解码得到一个整数
const ePtr = this._vectorIndex.readUInt32LE(idx + 4)
return { sPtr, ePtr }
} else {
const buf = await this[getBuffer](256 + idx, 8, fd)
const sPtr = buf.readUInt32LE()
const ePtr = buf.readUInt32LE(4)
return { sPtr, ePtr }
}
}
async [getBuffer] (offset, length, fd) {
if (this._buffer) {
return this._buffer.subarray(offset, offset + length)
} else {
// 从文件中读取
const buf = Buffer.alloc(length)
return new Promise((resolve, reject) => {
fs.read(fd, buf, 0, length, offset, (err) => {
if (err) {
reject(err)
} else {
resolve(buf)
}
})
})
}
}
// fsPromises.open需要node.js v10.0.0以上版本才行,这边使用Promise包一下
[openFilePromise] (fileName) {
return new Promise((resolve, reject) => {
fs.open(fileName, 'r', (err, fd) => {
if (err) {
reject(err)
} else {
resolve(fd)
}
})
})
}
async search (ip) {
if (!IP_REGEX.test(ip)) {
throw new Error(`IP: ${ip} is invalid`)
}
let fd = null
// 假如不是通过newWithBuffer创建的对象,那么一定是需要依赖文件的
if (!this._buffer) {
// 不存在_buffer的情况
fd = await this[openFilePromise](this._dbFile)
}
// 切割IP
const ps = ip.split('.')
// 将各段转成int
const i0 = parseInt(ps[0])
const i1 = parseInt(ps[1])
const i2 = parseInt(ps[2])
const i3 = parseInt(ps[3])
// 假如使用移位操作的话,这边可能产生负数
const ipInt = i0 * 256 * 256 * 256 + i1 * 256 * 256 + i2 * 256 + i3
// 计算得到 vector 索引项的开始地址。
// 这里可以对比上述的 vector table 结构进行理解
const idx = i0 * VectorIndexCols * VectorIndexSize + i1 * VectorIndexSize
// 区域二分索引的开始地址和结束地址
const { sPtr, ePtr } = await this[getStartEndPtr](idx, fd)
// 二分搜索低位
let l = 0
// 二分搜索高位
// 上第一步得到的结束索引位置减去开始索引位置
// 再除以每个索引的字节大小就是这次搜索要扫描的索引的个数了。
let h = (ePtr - sPtr) / SegmentIndexSize
let result = null
while (l <= h) {
// 得到中间的那个索引
const m = (l + h) >> 1
// 计算中间索引项的指针地址
// 在起始地址 sPtr 上加上 m 的相对地址即可
const p = sPtr + m * SegmentIndexSize
// 从 p 位置开始读取 SegmentIndexSize = 14 个字节到 buff
// 得到一个完整的上述描述的二分索引项,不过为了减少不必要的操作
// 我们是按需要解码,此处 buff 为 p 开始的 14 个 byte 的数据
const buff = await this[getBuffer](p, SegmentIndexSize, fd)
// 前面 4 个字节是起始 IP
const sip = buff.readUInt32LE(0)
if (ipInt < sip) {
// 目标比 sip 小,也就是在 p 位置的左边
h = m - 1
} else {
// 4 ~ 7 之间的 4 个字节是结束 IP 地址
const eip = buff.readUInt32LE(4)
if (ipInt > eip) {
// 目标 ip 比 eip 大,也就是在 p 位置的右边
l = m + 1
} else {
// 搜索命中
// 目标 ip 正好在 sip 和 eip 之间
// 也就是找到目标 ip 了
// 8 ~ 10 两个字节是地域数据的长度
const dataLen = buff.readUInt16LE(8)
// 10 ~ 13 的 4 个字节是地域数据的地址
const dataPtr = buff.readUInt32LE(10)
const data = await this[getBuffer](dataPtr, dataLen, fd)
result = data.toString('utf-8')
break
}
}
}
if (fd) {
// 这边直接关闭,不需要等待
fs.close(fd, () => {})
}
return result
}
}
const _checkFile = dbPath => {
try {
fs.accessSync(dbPath, fs.constants.F_OK)
} catch (err) {
throw new Error(`${dbPath} ${err ? 'does not exist' : 'exists'}`)
}
try {
fs.accessSync(dbPath, fs.constants.R_OK)
} catch (err) {
throw new Error(`${dbPath} ${err ? 'is not readable' : 'is readable'}`)
}
}
const newWithFileOnly = dbPath => {
_checkFile(dbPath)
return new Searcher(dbPath, null, null)
}
const newWithVectorIndex = (dbPath, vectorIndex) => {
_checkFile(dbPath)
if (!Buffer.isBuffer(vectorIndex)) {
throw new Error('vectorIndex is invalid')
}
return new Searcher(dbPath, vectorIndex, null)
}
const newWithBuffer = buffer => {
if (!Buffer.isBuffer(buffer)) {
throw new Error('buffer is invalid')
}
return new Searcher(null, null, buffer)
}
// 从文件中获取VectorIndex数据
const loadVectorIndexFromFile = dbPath => {
const fd = fs.openSync(dbPath, 'r')
const buffer = Buffer.alloc(VectorIndexLength)
fs.readSync(fd, buffer, 0, VectorIndexLength, 256)
fs.close(fd)
return buffer
}
// 将文件转换成buffer
const loadContentFromFile = dbPath => {
const stats = fs.statSync(dbPath)
const buffer = Buffer.alloc(stats.size)
const fd = fs.openSync(dbPath, 'r')
fs.readSync(fd, buffer, 0, stats.size, 0)
fs.close(fd)
return buffer
}
module.exports = {
loadVectorIndexFromFile,
loadContentFromFile,
newWithFileOnly,
newWithVectorIndex,
newWithBuffer
}
{
"name": "ip2region",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@eslint/eslintrc": {
"version": "1.3.0",
"resolved": "http://npm.greatld.com:4873/@eslint%2feslintrc/-/eslintrc-1.3.0.tgz",
"integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^9.3.2",
"globals": "^13.15.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
"minimatch": "^3.1.2",
"strip-json-comments": "^3.1.1"
}
},
"@humanwhocodes/config-array": {
"version": "0.9.5",
"resolved": "http://npm.greatld.com:4873/@humanwhocodes%2fconfig-array/-/config-array-0.9.5.tgz",
"integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
"dev": true,
"requires": {
"@humanwhocodes/object-schema": "^1.2.1",
"debug": "^4.1.1",
"minimatch": "^3.0.4"
}
},
"@humanwhocodes/object-schema": {
"version": "1.2.1",
"resolved": "http://npm.greatld.com:4873/@humanwhocodes%2fobject-schema/-/object-schema-1.2.1.tgz",
"integrity": "sha1-tSBSnsIdjllFoYUd/Rwy6U45/0U=",
"dev": true
},
"@types/json5": {
"version": "0.0.29",
"resolved": "http://npm.greatld.com:4873/@types%2fjson5/-/json5-0.0.29.tgz",
"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
"dev": true
},
"@types/node": {
"version": "18.0.6",
"resolved": "http://npm.greatld.com:4873/@types%2fnode/-/node-18.0.6.tgz",
"integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==",
"dev": true
},
"acorn": {
"version": "8.7.1",
"resolved": "http://npm.greatld.com:4873/acorn/-/acorn-8.7.1.tgz",
"integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
"dev": true
},
"acorn-jsx": {
"version": "5.3.2",
"resolved": "http://npm.greatld.com:4873/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=",
"dev": true
},
"ajv": {
"version": "6.12.6",
"resolved": "http://npm.greatld.com:4873/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"ansi-regex": {
"version": "5.0.1",
"resolved": "http://npm.greatld.com:4873/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=",
"dev": true
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "http://npm.greatld.com:4873/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"argparse": {
"version": "2.0.1",
"resolved": "http://npm.greatld.com:4873/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=",
"dev": true
},
"array-includes": {
"version": "3.1.5",
"resolved": "http://npm.greatld.com:4873/array-includes/-/array-includes-3.1.5.tgz",
"integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.19.5",
"get-intrinsic": "^1.1.1",
"is-string": "^1.0.7"
}
},
"array.prototype.flat": {
"version": "1.3.0",
"resolved": "http://npm.greatld.com:4873/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz",
"integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.19.2",
"es-shim-unscopables": "^1.0.0"
}
},
"balanced-match": {
"version": "1.0.2",
"resolved": "http://npm.greatld.com:4873/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=",
"dev": true
},
"benchmark": {
"version": "2.1.4",
"resolved": "http://npm.greatld.com:4873/benchmark/-/benchmark-2.1.4.tgz",
"integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=",
"dev": true,
"requires": {
"lodash": "^4.17.4",
"platform": "^1.3.3"
}
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "http://npm.greatld.com:4873/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"builtins": {
"version": "5.0.1",
"resolved": "http://npm.greatld.com:4873/builtins/-/builtins-5.0.1.tgz",
"integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
"dev": true,
"requires": {
"semver": "^7.0.0"
}
},
"call-bind": {
"version": "1.0.2",
"resolved": "http://npm.greatld.com:4873/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=",
"dev": true,
"requires": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
}
},
"callsites": {
"version": "3.1.0",
"resolved": "http://npm.greatld.com:4873/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=",
"dev": true
},
"chalk": {
"version": "4.1.2",
"resolved": "http://npm.greatld.com:4873/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "http://npm.greatld.com:4873/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "http://npm.greatld.com:4873/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
"dev": true
},
"concat-map": {
"version": "0.0.1",
"resolved": "http://npm.greatld.com:4873/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"cross-spawn": {
"version": "7.0.3",
"resolved": "http://npm.greatld.com:4873/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=",
"dev": true,
"requires": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
}
},
"debug": {
"version": "4.3.4",
"resolved": "http://npm.greatld.com:4873/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
"deep-is": {
"version": "0.1.4",
"resolved": "http://npm.greatld.com:4873/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=",
"dev": true
},
"define-properties": {
"version": "1.1.4",
"resolved": "http://npm.greatld.com:4873/define-properties/-/define-properties-1.1.4.tgz",
"integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
"dev": true,
"requires": {
"has-property-descriptors": "^1.0.0",
"object-keys": "^1.1.1"
}
},
"doctrine": {
"version": "3.0.0",
"resolved": "http://npm.greatld.com:4873/doctrine/-/doctrine-3.0.0.tgz",
"integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=",
"dev": true,
"requires": {
"esutils": "^2.0.2"
}
},
"es-abstract": {
"version": "1.20.1",
"resolved": "http://npm.greatld.com:4873/es-abstract/-/es-abstract-1.20.1.tgz",
"integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"es-to-primitive": "^1.2.1",
"function-bind": "^1.1.1",
"function.prototype.name": "^1.1.5",
"get-intrinsic": "^1.1.1",
"get-symbol-description": "^1.0.0",
"has": "^1.0.3",
"has-property-descriptors": "^1.0.0",
"has-symbols": "^1.0.3",
"internal-slot": "^1.0.3",
"is-callable": "^1.2.4",
"is-negative-zero": "^2.0.2",
"is-regex": "^1.1.4",
"is-shared-array-buffer": "^1.0.2",
"is-string": "^1.0.7",
"is-weakref": "^1.0.2",
"object-inspect": "^1.12.0",
"object-keys": "^1.1.1",
"object.assign": "^4.1.2",
"regexp.prototype.flags": "^1.4.3",
"string.prototype.trimend": "^1.0.5",
"string.prototype.trimstart": "^1.0.5",
"unbox-primitive": "^1.0.2"
}
},
"es-shim-unscopables": {
"version": "1.0.0",
"resolved": "http://npm.greatld.com:4873/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
"integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
"dev": true,
"requires": {
"has": "^1.0.3"
}
},
"es-to-primitive": {
"version": "1.2.1",
"resolved": "http://npm.greatld.com:4873/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
"integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=",
"dev": true,
"requires": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
"is-symbol": "^1.0.2"
}
},
"escape-string-regexp": {
"version": "4.0.0",
"resolved": "http://npm.greatld.com:4873/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=",
"dev": true
},
"eslint": {
"version": "8.20.0",
"resolved": "http://npm.greatld.com:4873/eslint/-/eslint-8.20.0.tgz",
"integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==",
"dev": true,
"requires": {
"@eslint/eslintrc": "^1.3.0",
"@humanwhocodes/config-array": "^0.9.2",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.1.1",
"eslint-utils": "^3.0.0",
"eslint-visitor-keys": "^3.3.0",
"espree": "^9.3.2",
"esquery": "^1.4.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
"file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^6.0.1",
"globals": "^13.15.0",
"ignore": "^5.2.0",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
"regexpp": "^3.2.0",
"strip-ansi": "^6.0.1",
"strip-json-comments": "^3.1.0",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
}
},
"eslint-config-standard": {
"version": "17.0.0",
"resolved": "http://npm.greatld.com:4873/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz",
"integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==",
"dev": true
},
"eslint-import-resolver-node": {
"version": "0.3.6",
"resolved": "http://npm.greatld.com:4873/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
"integrity": "sha1-QEi5WDldqJZoJSAB29nsprg7rL0=",
"dev": true,
"requires": {
"debug": "^3.2.7",
"resolve": "^1.20.0"
},
"dependencies": {
"debug": {
"version": "3.2.7",
"resolved": "http://npm.greatld.com:4873/debug/-/debug-3.2.7.tgz",
"integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=",
"dev": true,
"requires": {
"ms": "^2.1.1"
}
}
}
},
"eslint-module-utils": {
"version": "2.7.3",
"resolved": "http://npm.greatld.com:4873/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz",
"integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==",
"dev": true,
"requires": {
"debug": "^3.2.7",
"find-up": "^2.1.0"
},
"dependencies": {
"debug": {
"version": "3.2.7",
"resolved": "http://npm.greatld.com:4873/debug/-/debug-3.2.7.tgz",
"integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=",
"dev": true,
"requires": {
"ms": "^2.1.1"
}
}
}
},
"eslint-plugin-es": {
"version": "4.1.0",
"resolved": "http://npm.greatld.com:4873/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
"integrity": "sha1-8IIvDBilNal8PnFOifiFhqdkHsk=",
"dev": true,
"requires": {
"eslint-utils": "^2.0.0",
"regexpp": "^3.0.0"
},
"dependencies": {
"eslint-utils": {
"version": "2.1.0",
"resolved": "http://npm.greatld.com:4873/eslint-utils/-/eslint-utils-2.1.0.tgz",
"integrity": "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=",
"dev": true,
"requires": {
"eslint-visitor-keys": "^1.1.0"
}
},
"eslint-visitor-keys": {
"version": "1.3.0",
"resolved": "http://npm.greatld.com:4873/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
"integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=",
"dev": true
}
}
},
"eslint-plugin-import": {
"version": "2.26.0",
"resolved": "http://npm.greatld.com:4873/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz",
"integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==",
"dev": true,
"requires": {
"array-includes": "^3.1.4",
"array.prototype.flat": "^1.2.5",
"debug": "^2.6.9",
"doctrine": "^2.1.0",
"eslint-import-resolver-node": "^0.3.6",
"eslint-module-utils": "^2.7.3",
"has": "^1.0.3",
"is-core-module": "^2.8.1",
"is-glob": "^4.0.3",
"minimatch": "^3.1.2",
"object.values": "^1.1.5",
"resolve": "^1.22.0",
"tsconfig-paths": "^3.14.1"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "http://npm.greatld.com:4873/debug/-/debug-2.6.9.tgz",
"integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"doctrine": {
"version": "2.1.0",
"resolved": "http://npm.greatld.com:4873/doctrine/-/doctrine-2.1.0.tgz",
"integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=",
"dev": true,
"requires": {
"esutils": "^2.0.2"
}
},
"ms": {
"version": "2.0.0",
"resolved": "http://npm.greatld.com:4873/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
}
}
},
"eslint-plugin-n": {
"version": "15.2.4",
"resolved": "http://npm.greatld.com:4873/eslint-plugin-n/-/eslint-plugin-n-15.2.4.tgz",
"integrity": "sha512-tjnVMv2fiXYMnuiIFI8QMtyUFI42SckEEWvi8h68SWGWshfqO6SSCASy24dGMGAiy7NUk6DZt90DM0iNUsmQ5w==",
"dev": true,
"requires": {
"builtins": "^5.0.1",
"eslint-plugin-es": "^4.1.0",
"eslint-utils": "^3.0.0",
"ignore": "^5.1.1",
"is-core-module": "^2.9.0",
"minimatch": "^3.1.2",
"resolve": "^1.10.1",
"semver": "^7.3.7"
}
},
"eslint-plugin-promise": {
"version": "6.0.0",
"resolved": "http://npm.greatld.com:4873/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz",
"integrity": "sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==",
"dev": true
},
"eslint-scope": {
"version": "7.1.1",
"resolved": "http://npm.greatld.com:4873/eslint-scope/-/eslint-scope-7.1.1.tgz",
"integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
"dev": true,
"requires": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
}
},
"eslint-utils": {
"version": "3.0.0",
"resolved": "http://npm.greatld.com:4873/eslint-utils/-/eslint-utils-3.0.0.tgz",
"integrity": "sha1-iuuvrOc0W7M1WdsKHxOh0tSMNnI=",
"dev": true,
"requires": {
"eslint-visitor-keys": "^2.0.0"
},
"dependencies": {
"eslint-visitor-keys": {
"version": "2.1.0",
"resolved": "http://npm.greatld.com:4873/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
"integrity": "sha1-9lMoJZMFknOSyTjtROsKXJsr0wM=",
"dev": true
}
}
},
"eslint-visitor-keys": {
"version": "3.3.0",
"resolved": "http://npm.greatld.com:4873/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
"dev": true
},
"espree": {
"version": "9.3.2",
"resolved": "http://npm.greatld.com:4873/espree/-/espree-9.3.2.tgz",
"integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
"dev": true,
"requires": {
"acorn": "^8.7.1",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^3.3.0"
}
},
"esquery": {
"version": "1.4.0",
"resolved": "http://npm.greatld.com:4873/esquery/-/esquery-1.4.0.tgz",
"integrity": "sha1-IUj/w4uC6McFff7UhCWz5h8PJKU=",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
}
},
"esrecurse": {
"version": "4.3.0",
"resolved": "http://npm.greatld.com:4873/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=",
"dev": true,
"requires": {
"estraverse": "^5.2.0"
}
},
"estraverse": {
"version": "5.3.0",
"resolved": "http://npm.greatld.com:4873/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=",
"dev": true
},
"esutils": {
"version": "2.0.3",
"resolved": "http://npm.greatld.com:4873/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=",
"dev": true
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "http://npm.greatld.com:4873/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=",
"dev": true
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "http://npm.greatld.com:4873/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=",
"dev": true
},
"fast-levenshtein": {
"version": "2.0.6",
"resolved": "http://npm.greatld.com:4873/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
"file-entry-cache": {
"version": "6.0.1",
"resolved": "http://npm.greatld.com:4873/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
"integrity": "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc=",
"dev": true,
"requires": {
"flat-cache": "^3.0.4"
}
},
"find-up": {
"version": "2.1.0",
"resolved": "http://npm.greatld.com:4873/find-up/-/find-up-2.1.0.tgz",
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"dev": true,
"requires": {
"locate-path": "^2.0.0"
}
},
"flat-cache": {
"version": "3.0.4",
"resolved": "http://npm.greatld.com:4873/flat-cache/-/flat-cache-3.0.4.tgz",
"integrity": "sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE=",
"dev": true,
"requires": {
"flatted": "^3.1.0",
"rimraf": "^3.0.2"
}
},
"flatted": {
"version": "3.2.6",
"resolved": "http://npm.greatld.com:4873/flatted/-/flatted-3.2.6.tgz",
"integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==",
"dev": true
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "http://npm.greatld.com:4873/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"function-bind": {
"version": "1.1.1",
"resolved": "http://npm.greatld.com:4873/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=",
"dev": true
},
"function.prototype.name": {
"version": "1.1.5",
"resolved": "http://npm.greatld.com:4873/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
"integrity": "sha1-zOBQX+H/uAUD5vnkbMZORqEqliE=",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.19.0",
"functions-have-names": "^1.2.2"
}
},
"functional-red-black-tree": {
"version": "1.0.1",
"resolved": "http://npm.greatld.com:4873/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
"functions-have-names": {
"version": "1.2.3",
"resolved": "http://npm.greatld.com:4873/functions-have-names/-/functions-have-names-1.2.3.tgz",
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
"dev": true
},
"get-intrinsic": {
"version": "1.1.2",
"resolved": "http://npm.greatld.com:4873/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
"integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
"dev": true,
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.3"
}
},
"get-symbol-description": {
"version": "1.0.0",
"resolved": "http://npm.greatld.com:4873/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
"integrity": "sha1-f9uByQAQH71WTdXxowr1qtweWNY=",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.1.1"
}
},
"glob": {
"version": "7.2.3",
"resolved": "http://npm.greatld.com:4873/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.1.1",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"glob-parent": {
"version": "6.0.2",
"resolved": "http://npm.greatld.com:4873/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha1-bSN9mQg5UMeSkPJMdkKj3poo+eM=",
"dev": true,
"requires": {
"is-glob": "^4.0.3"
}
},
"globals": {
"version": "13.16.0",
"resolved": "http://npm.greatld.com:4873/globals/-/globals-13.16.0.tgz",
"integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
}
},
"has": {
"version": "1.0.3",
"resolved": "http://npm.greatld.com:4873/has/-/has-1.0.3.tgz",
"integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
"dev": true,
"requires": {
"function-bind": "^1.1.1"
}
},
"has-bigints": {
"version": "1.0.2",
"resolved": "http://npm.greatld.com:4873/has-bigints/-/has-bigints-1.0.2.tgz",
"integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
"dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "http://npm.greatld.com:4873/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
"dev": true
},
"has-property-descriptors": {
"version": "1.0.0",
"resolved": "http://npm.greatld.com:4873/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
"integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
"dev": true,
"requires": {
"get-intrinsic": "^1.1.1"
}
},
"has-symbols": {
"version": "1.0.3",
"resolved": "http://npm.greatld.com:4873/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true
},
"has-tostringtag": {
"version": "1.0.0",
"resolved": "http://npm.greatld.com:4873/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU=",
"dev": true,
"requires": {
"has-symbols": "^1.0.2"
}
},
"ignore": {
"version": "5.2.0",
"resolved": "http://npm.greatld.com:4873/ignore/-/ignore-5.2.0.tgz",
"integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
"dev": true
},
"import-fresh": {
"version": "3.3.0",
"resolved": "http://npm.greatld.com:4873/import-fresh/-/import-fresh-3.3.0.tgz",
"integrity": "sha1-NxYsJfy566oublPVtNiM4X2eDCs=",
"dev": true,
"requires": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
}
},
"imurmurhash": {
"version": "0.1.4",
"resolved": "http://npm.greatld.com:4873/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true
},
"inflight": {
"version": "1.0.6",
"resolved": "http://npm.greatld.com:4873/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "http://npm.greatld.com:4873/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=",
"dev": true
},
"internal-slot": {
"version": "1.0.3",
"resolved": "http://npm.greatld.com:4873/internal-slot/-/internal-slot-1.0.3.tgz",
"integrity": "sha1-c0fjB97uovqsKsYgXUvH00ln9Zw=",
"dev": true,
"requires": {
"get-intrinsic": "^1.1.0",
"has": "^1.0.3",
"side-channel": "^1.0.4"
}
},
"is-bigint": {
"version": "1.0.4",
"resolved": "http://npm.greatld.com:4873/is-bigint/-/is-bigint-1.0.4.tgz",
"integrity": "sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM=",
"dev": true,
"requires": {
"has-bigints": "^1.0.1"
}
},
"is-boolean-object": {
"version": "1.1.2",
"resolved": "http://npm.greatld.com:4873/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
"integrity": "sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk=",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
}
},
"is-callable": {
"version": "1.2.4",
"resolved": "http://npm.greatld.com:4873/is-callable/-/is-callable-1.2.4.tgz",
"integrity": "sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU=",
"dev": true
},
"is-core-module": {
"version": "2.9.0",
"resolved": "http://npm.greatld.com:4873/is-core-module/-/is-core-module-2.9.0.tgz",
"integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
"dev": true,
"requires": {
"has": "^1.0.3"
}
},
"is-date-object": {
"version": "1.0.5",
"resolved": "http://npm.greatld.com:4873/is-date-object/-/is-date-object-1.0.5.tgz",
"integrity": "sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8=",
"dev": true,
"requires": {
"has-tostringtag": "^1.0.0"
}
},
"is-extglob": {
"version": "2.1.1",
"resolved": "http://npm.greatld.com:4873/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"dev": true
},
"is-glob": {
"version": "4.0.3",
"resolved": "http://npm.greatld.com:4873/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=",
"dev": true,
"requires": {
"is-extglob": "^2.1.1"
}
},
"is-negative-zero": {
"version": "2.0.2",
"resolved": "http://npm.greatld.com:4873/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
"integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
"dev": true
},
"is-number-object": {
"version": "1.0.7",
"resolved": "http://npm.greatld.com:4873/is-number-object/-/is-number-object-1.0.7.tgz",
"integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
"dev": true,
"requires": {
"has-tostringtag": "^1.0.0"
}
},
"is-regex": {
"version": "1.1.4",
"resolved": "http://npm.greatld.com:4873/is-regex/-/is-regex-1.1.4.tgz",
"integrity": "sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg=",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
}
},
"is-shared-array-buffer": {
"version": "1.0.2",
"resolved": "http://npm.greatld.com:4873/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
"integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
"dev": true,
"requires": {
"call-bind": "^1.0.2"
}
},
"is-string": {
"version": "1.0.7",
"resolved": "http://npm.greatld.com:4873/is-string/-/is-string-1.0.7.tgz",
"integrity": "sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0=",
"dev": true,
"requires": {
"has-tostringtag": "^1.0.0"
}
},
"is-symbol": {
"version": "1.0.4",
"resolved": "http://npm.greatld.com:4873/is-symbol/-/is-symbol-1.0.4.tgz",
"integrity": "sha1-ptrJO2NbBjymhyI23oiRClevE5w=",
"dev": true,
"requires": {
"has-symbols": "^1.0.2"
}
},
"is-weakref": {
"version": "1.0.2",
"resolved": "http://npm.greatld.com:4873/is-weakref/-/is-weakref-1.0.2.tgz",
"integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
"dev": true,
"requires": {
"call-bind": "^1.0.2"
}
},
"isexe": {
"version": "2.0.0",
"resolved": "http://npm.greatld.com:4873/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
"js-yaml": {
"version": "4.1.0",
"resolved": "http://npm.greatld.com:4873/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha1-wftl+PUBeQHN0slRhkuhhFihBgI=",
"dev": true,
"requires": {
"argparse": "^2.0.1"
}
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "http://npm.greatld.com:4873/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=",
"dev": true
},
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "http://npm.greatld.com:4873/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
"json5": {
"version": "1.0.1",
"resolved": "http://npm.greatld.com:4873/json5/-/json5-1.0.1.tgz",
"integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=",
"dev": true,
"requires": {
"minimist": "^1.2.0"
}
},
"levn": {
"version": "0.4.1",
"resolved": "http://npm.greatld.com:4873/levn/-/levn-0.4.1.tgz",
"integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=",
"dev": true,
"requires": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
}
},
"locate-path": {
"version": "2.0.0",
"resolved": "http://npm.greatld.com:4873/locate-path/-/locate-path-2.0.0.tgz",
"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"dev": true,
"requires": {
"p-locate": "^2.0.0",
"path-exists": "^3.0.0"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "http://npm.greatld.com:4873/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=",
"dev": true
},
"lodash.merge": {
"version": "4.6.2",
"resolved": "http://npm.greatld.com:4873/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=",
"dev": true
},
"lru-cache": {
"version": "6.0.0",
"resolved": "http://npm.greatld.com:4873/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
"dev": true,
"requires": {
"yallist": "^4.0.0"
}
},
"minimatch": {
"version": "3.1.2",
"resolved": "http://npm.greatld.com:4873/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "1.2.6",
"resolved": "http://npm.greatld.com:4873/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
"dev": true
},
"ms": {
"version": "2.1.2",
"resolved": "http://npm.greatld.com:4873/ms/-/ms-2.1.2.tgz",
"integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
"dev": true
},
"natural-compare": {
"version": "1.4.0",
"resolved": "http://npm.greatld.com:4873/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
"object-inspect": {
"version": "1.12.2",
"resolved": "http://npm.greatld.com:4873/object-inspect/-/object-inspect-1.12.2.tgz",
"integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
"dev": true
},
"object-keys": {
"version": "1.1.1",
"resolved": "http://npm.greatld.com:4873/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=",
"dev": true
},
"object.assign": {
"version": "4.1.2",
"resolved": "http://npm.greatld.com:4873/object.assign/-/object.assign-4.1.2.tgz",
"integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=",
"dev": true,
"requires": {
"call-bind": "^1.0.0",
"define-properties": "^1.1.3",
"has-symbols": "^1.0.1",
"object-keys": "^1.1.1"
}
},
"object.values": {
"version": "1.1.5",
"resolved": "http://npm.greatld.com:4873/object.values/-/object.values-1.1.5.tgz",
"integrity": "sha1-lZ9j486e8QhyAzMIITHkpFm3Fqw=",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.19.1"
}
},
"once": {
"version": "1.4.0",
"resolved": "http://npm.greatld.com:4873/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1"
}
},
"optionator": {
"version": "0.9.1",
"resolved": "http://npm.greatld.com:4873/optionator/-/optionator-0.9.1.tgz",
"integrity": "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=",
"dev": true,
"requires": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0",
"word-wrap": "^1.2.3"
}
},
"p-limit": {
"version": "1.3.0",
"resolved": "http://npm.greatld.com:4873/p-limit/-/p-limit-1.3.0.tgz",
"integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=",
"dev": true,
"requires": {
"p-try": "^1.0.0"
}
},
"p-locate": {
"version": "2.0.0",
"resolved": "http://npm.greatld.com:4873/p-locate/-/p-locate-2.0.0.tgz",
"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
"dev": true,
"requires": {
"p-limit": "^1.1.0"
}
},
"p-try": {
"version": "1.0.0",
"resolved": "http://npm.greatld.com:4873/p-try/-/p-try-1.0.0.tgz",
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
"dev": true
},
"parent-module": {
"version": "1.0.1",
"resolved": "http://npm.greatld.com:4873/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=",
"dev": true,
"requires": {
"callsites": "^3.0.0"
}
},
"path-exists": {
"version": "3.0.0",
"resolved": "http://npm.greatld.com:4873/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
"dev": true
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "http://npm.greatld.com:4873/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
"path-key": {
"version": "3.1.1",
"resolved": "http://npm.greatld.com:4873/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=",
"dev": true
},
"path-parse": {
"version": "1.0.7",
"resolved": "http://npm.greatld.com:4873/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=",
"dev": true
},
"platform": {
"version": "1.3.6",
"resolved": "http://npm.greatld.com:4873/platform/-/platform-1.3.6.tgz",
"integrity": "sha1-SLTOmDFksgnC1FoQetsx9HOm56c=",
"dev": true
},
"prelude-ls": {
"version": "1.2.1",
"resolved": "http://npm.greatld.com:4873/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=",
"dev": true
},
"punycode": {
"version": "2.1.1",
"resolved": "http://npm.greatld.com:4873/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=",
"dev": true
},
"regexp.prototype.flags": {
"version": "1.4.3",
"resolved": "http://npm.greatld.com:4873/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
"integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"functions-have-names": "^1.2.2"
}
},
"regexpp": {
"version": "3.2.0",
"resolved": "http://npm.greatld.com:4873/regexpp/-/regexpp-3.2.0.tgz",
"integrity": "sha1-BCWido2PI7rXDKS5BGH6LxIT4bI=",
"dev": true
},
"resolve": {
"version": "1.22.1",
"resolved": "http://npm.greatld.com:4873/resolve/-/resolve-1.22.1.tgz",
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"dev": true,
"requires": {
"is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
}
},
"resolve-from": {
"version": "4.0.0",
"resolved": "http://npm.greatld.com:4873/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=",
"dev": true
},
"rimraf": {
"version": "3.0.2",
"resolved": "http://npm.greatld.com:4873/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=",
"dev": true,
"requires": {
"glob": "^7.1.3"
}
},
"semver": {
"version": "7.3.7",
"resolved": "http://npm.greatld.com:4873/semver/-/semver-7.3.7.tgz",
"integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
},
"shebang-command": {
"version": "2.0.0",
"resolved": "http://npm.greatld.com:4873/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=",
"dev": true,
"requires": {
"shebang-regex": "^3.0.0"
}
},
"shebang-regex": {
"version": "3.0.0",
"resolved": "http://npm.greatld.com:4873/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=",
"dev": true
},
"side-channel": {
"version": "1.0.4",
"resolved": "http://npm.greatld.com:4873/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha1-785cj9wQTudRslxY1CkAEfpeos8=",
"dev": true,
"requires": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
}
},
"string.prototype.trimend": {
"version": "1.0.5",
"resolved": "http://npm.greatld.com:4873/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
"integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.19.5"
}
},
"string.prototype.trimstart": {
"version": "1.0.5",
"resolved": "http://npm.greatld.com:4873/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
"integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.19.5"
}
},
"strip-ansi": {
"version": "6.0.1",
"resolved": "http://npm.greatld.com:4873/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
}
},
"strip-bom": {
"version": "3.0.0",
"resolved": "http://npm.greatld.com:4873/strip-bom/-/strip-bom-3.0.0.tgz",
"integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
"dev": true
},
"strip-json-comments": {
"version": "3.1.1",
"resolved": "http://npm.greatld.com:4873/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=",
"dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "http://npm.greatld.com:4873/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "http://npm.greatld.com:4873/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
"text-table": {
"version": "0.2.0",
"resolved": "http://npm.greatld.com:4873/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
"tsconfig-paths": {
"version": "3.14.1",
"resolved": "http://npm.greatld.com:4873/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
"integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
"dev": true,
"requires": {
"@types/json5": "^0.0.29",
"json5": "^1.0.1",
"minimist": "^1.2.6",
"strip-bom": "^3.0.0"
}
},
"type-check": {
"version": "0.4.0",
"resolved": "http://npm.greatld.com:4873/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=",
"dev": true,
"requires": {
"prelude-ls": "^1.2.1"
}
},
"type-fest": {
"version": "0.20.2",
"resolved": "http://npm.greatld.com:4873/type-fest/-/type-fest-0.20.2.tgz",
"integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=",
"dev": true
},
"unbox-primitive": {
"version": "1.0.2",
"resolved": "http://npm.greatld.com:4873/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
"integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"has-bigints": "^1.0.2",
"has-symbols": "^1.0.3",
"which-boxed-primitive": "^1.0.2"
}
},
"uri-js": {
"version": "4.4.1",
"resolved": "http://npm.greatld.com:4873/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=",
"dev": true,
"requires": {
"punycode": "^2.1.0"
}
},
"v8-compile-cache": {
"version": "2.3.0",
"resolved": "http://npm.greatld.com:4873/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
"integrity": "sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4=",
"dev": true
},
"which": {
"version": "2.0.2",
"resolved": "http://npm.greatld.com:4873/which/-/which-2.0.2.tgz",
"integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=",
"dev": true,
"requires": {
"isexe": "^2.0.0"
}
},
"which-boxed-primitive": {
"version": "1.0.2",
"resolved": "http://npm.greatld.com:4873/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
"integrity": "sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY=",
"dev": true,
"requires": {
"is-bigint": "^1.0.1",
"is-boolean-object": "^1.1.0",
"is-number-object": "^1.0.4",
"is-string": "^1.0.5",
"is-symbol": "^1.0.3"
}
},
"word-wrap": {
"version": "1.2.3",
"resolved": "http://npm.greatld.com:4873/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=",
"dev": true
},
"wrappy": {
"version": "1.0.2",
"resolved": "http://npm.greatld.com:4873/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
"yallist": {
"version": "4.0.0",
"resolved": "http://npm.greatld.com:4873/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
"dev": true
}
}
}
{
"name": "ip2region",
"version": "1.0.0",
"description": "ip2region",
"main": "index.js",
"scripts": {
"test": "node ./tests/test.js"
},
"author": "",
"license": "ISC",
"devDependencies": {
"@types/node": "^18.0.6",
"benchmark": "^2.1.4",
"eslint": "^8.20.0",
"eslint-config-standard": "^17.0.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-n": "^15.2.4",
"eslint-plugin-promise": "^6.0.0"
},
"engines": {
"node": ">=8.0.0"
}
}
\ No newline at end of file
const Benchmark = require('benchmark')
const Searcher = require('..')
const dbPath = '../../../data/ip2region.xdb'
const buffer = Searcher.loadContentFromFile(dbPath)
const seacher = Searcher.newWithBuffer(buffer)
const suite = new Benchmark.Suite()
suite
.add('#search - 1', async () => {
const ip = '202.97.77.50'
return seacher.search(ip)
})
.add('#search - 2', async () => {
const ip = '218.4.167.70'
return seacher.search(ip)
})
.on('cycle', function (event) {
console.log(String(event.target)) // eslint-disable-line
})
.on('complete', function () {
console.log('Fastest is ' + this.filter('fastest').map('name')) // eslint-disable-line
})
.run({ async: true })
const path = require('path')
const Searcher = require('..')
const dbPath = path.join(__dirname, '..', '..', '..', 'data', 'ip2region.xdb')
const buffer = Searcher.loadContentFromFile(dbPath)
const seacher1 = Searcher.newWithBuffer(buffer)
const vectorIndex = Searcher.loadVectorIndexFromFile(dbPath)
const seacher2 = Searcher.newWithVectorIndex(dbPath, vectorIndex)
const seacher3 = Searcher.newWithFileOnly(dbPath)
;(async () => {
const data1 = await Promise
.all([
seacher1.search('202.97.77.50'),
seacher1.search('218.4.167.70'),
seacher1.search('112.31.187.151'),
seacher1.search('202.98.17.164'),
seacher1.search('170.148.132.136'),
seacher1.search('194.138.202.210')
])
console.log(data1)
const data2 = await Promise
.all([
seacher2.search('202.97.77.50'),
seacher2.search('218.4.167.70'),
seacher2.search('112.31.187.151'),
seacher2.search('202.98.17.164'),
seacher2.search('170.148.132.136'),
seacher2.search('194.138.202.210')
])
console.log(data2)
const data3 = await Promise
.all([
seacher3.search('202.97.77.50'),
seacher3.search('218.4.167.70'),
seacher3.search('112.31.187.151'),
seacher3.search('202.98.17.164'),
seacher3.search('170.148.132.136'),
seacher3.search('194.138.202.210')
])
console.log(data3)
})()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册