Comparing version 1.3.10 to 1.5.0
44
index.js
@@ -31,2 +31,3 @@ /* | ||
var debug = require('debug')('51degrees'); | ||
var update = require('./update'); | ||
var TrieParser = require('./build/Release/trie.node').TrieParser; | ||
@@ -54,5 +55,5 @@ var PatternParser = require('./build/Release/pattern.node').PatternParser; | ||
function Parser(filename, properties) { | ||
function Parser(filename, properties, options) { | ||
if (!(this instanceof Parser)) | ||
return new Parser(name, options); | ||
return new Parser(filename, properties, options); | ||
@@ -85,12 +86,16 @@ if (typeof filename !== 'string') { | ||
// | ||
var options = options || {}; | ||
var extname = path.extname(filename); | ||
var props = properties.join(','); | ||
if (extname === '.trie') { | ||
this.method = 'trie'; | ||
this._parser = new TrieParser(filename, properties.join(',')); | ||
this._parser = new TrieParser(filename, props); | ||
} else if (extname === '.dat') { | ||
this.method = 'pattern'; | ||
this._parser = new PatternParser(filename, properties.join(',')); | ||
this._parser = new PatternParser(filename, props); | ||
autoUpdate(filename, props, options); | ||
} else if (extname === '') { | ||
this.method = 'pattern'; | ||
this._parser = new PatternParser(filename + '.dat', properties.join(',')); | ||
this._parser = new PatternParser(filename + '.dat', props); | ||
autoUpdate(filename + '.dat', props, options); | ||
} else { | ||
@@ -101,2 +106,10 @@ var err = new Error('failed to read file: ' + filename); | ||
} | ||
var self = this; | ||
function autoUpdate(filename, props, options) { | ||
if (!options.autoUpdate) return; | ||
setInterval(function () { | ||
self.update(filename, props, options.key, options.onupdated); | ||
}, options.interval || 30 * 60 * 1000); | ||
} | ||
} | ||
@@ -111,4 +124,23 @@ | ||
return res; | ||
} | ||
}; | ||
Parser.prototype.update = function(filename, props, key, onupdated) { | ||
var self = this; | ||
if (!key) | ||
throw new Error('key required'); | ||
update(key, filename, function onresponse(updated) { | ||
if (updated) { | ||
try { | ||
var org = self._parser; | ||
var newParser = new PatternParser(filename, props); | ||
delete self._parser; | ||
self._parser = newParser; | ||
debug('updated successfully'); | ||
} catch (err) {} | ||
} | ||
if (typeof onupdated === 'function') onupdated(updated); | ||
}); | ||
}; | ||
function capitaliseFirstLetter(str) { | ||
@@ -115,0 +147,0 @@ return str.charAt(0).toLowerCase() + str.slice(1); |
{ | ||
"name": "51degrees", | ||
"version": "1.3.10", | ||
"version": "1.5.0", | ||
"description": "51degrees c-sdk native bindings for nodejs", | ||
"main": "index.js", | ||
"scripts": { | ||
"test": "node test.js", | ||
"test": "NODE_ENV=test node test.js", | ||
"install": "node-gyp rebuild --msvs_version=2012", | ||
@@ -13,20 +13,22 @@ "build": "node-gyp configure --msvs_version=2012 && node-gyp build" | ||
"type": "git", | ||
"url": "git@github.com:yorkie/51degrees.node.git" | ||
"url": "git@github.com:51Degreesmobi/51degrees.node.git" | ||
}, | ||
"author": "Yorkie Neil <yorkiefixer@gmail.com>", | ||
"author": "Yorkie Liu <yorkiefixer@gmail.com>", | ||
"license": "MPL", | ||
"gypfile": true, | ||
"bugs": { | ||
"url": "https://github.com/yorkie/51degrees.node/issues" | ||
"url": "https://github.com/51Degreesmobi/51degrees.node/issues" | ||
}, | ||
"homepage": "https://github.com/yorkie/51degrees.node", | ||
"homepage": "https://github.com/51Degreesmobi/51degrees.node", | ||
"dependencies": { | ||
"nan": "^1.3.0", | ||
"debug": "^2.1.0" | ||
"debug": "^2.1.0", | ||
"nan": "^1.3.0" | ||
}, | ||
"devDependencies": { | ||
"csv": "^0.4.0", | ||
"httpmocker": "^1.3.4", | ||
"microtime": "^1.0.1", | ||
"sinon": "^1.12.2", | ||
"tape": "^2.14.0" | ||
} | ||
} |
@@ -18,8 +18,18 @@ | ||
##### `.Parse(filename[, properties])` | ||
##### `.Parse(filename[, properties, options])` | ||
* `filename` {String} your 51degrees data, lite or premium. | ||
* `options` {Array} optional, required properties | ||
* `properties` {Array} optional, required properties | ||
* `options` {Object} | ||
* `options.autoUpdate` {Boolean} enable/disable `autoUpdate` feature | ||
* `options.key` {String} auto-update requires a licesen key from 51Degrees | ||
* `options.interval` {Integer}, default value 30 * 60 * 1000 (half hours) | ||
* `options.onupdated` {Function} if auto updated, you will get call at this function | ||
for more information, you could move to [51degrees documentation](https://51degrees.com/Support/Documentation) | ||
@@ -43,2 +53,13 @@ | ||
##### Create an auto-updated pattern parser | ||
```js | ||
var psr = new Parser('51Degrees-Lite.dat', [], { | ||
autoUpdate: true, | ||
key: 'your license key' | ||
}); | ||
``` | ||
**Note**: this feature only is used at **pattern** data. | ||
After the above program, you will get: | ||
@@ -45,0 +66,0 @@ |
77
test.js
@@ -31,5 +31,8 @@ /* | ||
var fs = require('fs'); | ||
var zlib = require('zlib'); | ||
var path = require('path'); | ||
var Parser = require('./index').Parser; | ||
var properties = require('./index').ALL_PROPERTIES; | ||
var configmock = require('httpmocker').config; | ||
var userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36'; | ||
@@ -108,2 +111,76 @@ var ua_src = fs.readFileSync(path.join(__dirname, './benchmark/ua.txt')); | ||
test('update with 200', function(t) { | ||
var update = require('./update'); | ||
zlib.gzip(new Buffer('abcdefg', 'utf8'), function(err, data) { | ||
configmock({ | ||
'https://51degrees.com/Products/': { | ||
statusCode: 200, | ||
headers: { | ||
'content-type': 'text/plain', | ||
'content-md5': '519fdca9541cfdfbd905e3a92ec2f8ed' | ||
}, | ||
body: data | ||
} | ||
}); | ||
update('license key', 'test.update', function(updated) { | ||
t.equal(updated, true); | ||
var d = fs.readFileSync('test.update').toString(); | ||
t.equal(d, 'abcdefg'); | ||
t.end(); | ||
fs.unlinkSync('test.update'); | ||
}); | ||
}); | ||
}); | ||
test('update with 403', function(t) { | ||
var update = require('./update'); | ||
configmock({ | ||
'https://51degrees.com/Products/': { | ||
statusCode: 403 | ||
} | ||
}); | ||
update('license key', 'test.update', function(updated) { | ||
t.equal(updated, false); | ||
t.end(); | ||
}); | ||
}); | ||
test('auto update', function(t) { | ||
var sinon = require('sinon'); | ||
var clock = sinon.useFakeTimers(); | ||
var orgSrc = fs.readFileSync('51Degrees-Lite.dat'); | ||
zlib.gzip(new Buffer('abcdefg', 'utf8'), function(err, data) { | ||
configmock({ | ||
'https://51degrees.com/Products/': { | ||
statusCode: 200, | ||
headers: { | ||
'content-type': 'text/plain', | ||
'content-md5': '519fdca9541cfdfbd905e3a92ec2f8ed' | ||
}, | ||
body: data | ||
} | ||
}); | ||
psr1 = new Parser('51Degrees-Lite', properties, { | ||
autoUpdate: true, | ||
key: 'license key', | ||
onupdated: onupdated | ||
}); | ||
clock.tick(30*60*1000); | ||
}); | ||
function onupdated(updated) { | ||
t.equal(fs.readFileSync('51Degrees-Lite.dat').length, 7); | ||
end(); | ||
} | ||
function end() { | ||
fs.writeFileSync('51Degrees-Lite.dat', orgSrc); | ||
clock.restore(); | ||
t.end(); | ||
} | ||
}); | ||
test('memory leak at pattern', function(t) { | ||
@@ -110,0 +187,0 @@ var cp1 = process.memoryUsage().rss / 1024 / 1024; |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 2 instances in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
211535
25
751
163
5
2
3