22
33const EventEmitter = require ( 'events' ) ;
44
5- const http = require ( 'http' ) ;
6- const https = require ( 'https' ) ;
7-
85const retryCodes = [ 429 ] . concat ( ( process . env . JSON_CACHE_RETRY_CODES || '' )
96 . split ( ',' ) . map ( code => parseInt ( code . trim ( ) , 10 ) ) ) ;
107
118class JSONCache extends EventEmitter {
9+ /**
10+ * Make a new cache
11+ * @param {string } url url to fetch
12+ * @param {number } [timeout=60000] optional timeout
13+ * @param {[type] } parser optional parser to parse data. defaults to JSON.parse
14+ * @param {[type] } promiseLib optional promise library override
15+ * @param {[type] } logger optional Logger
16+ * @param {[type] } delayStart whether or not to delay starting updating the cache
17+ * until start is requested
18+ * @param {[type] } opts options to pass to the parser
19+ * @param {[type] } maxListeners maximum listeners (only applicable if leveraging emitter)
20+ * @param {[type] } useEmitter whether or not to use the optional node emitter
21+ * @param {[type] } maxRetry maximum number of attempts to retry getting data
22+ * @param {[type] } integrity optional function to check if the data is worth keeping
23+ */
1224 constructor ( url , timeout = 60000 , {
1325 parser = JSON . parse , promiseLib = Promise , logger = console , delayStart = true ,
14- opts, maxListeners = 45 , useEmitter = true , maxRetry = 30 ,
26+ opts, maxListeners = 45 , useEmitter = true , maxRetry = 30 , integrity = ( ) => true ,
1527 } = {
1628 parser : JSON . parse ,
1729 promiseLib : Promise ,
@@ -21,10 +33,12 @@ class JSONCache extends EventEmitter {
2133 maxListeners : 45 ,
2234 useEmitter : true ,
2335 maxRetry : 30 ,
36+ integrity : ( ) => true ,
2437 } ) {
2538 super ( ) ;
2639 this . url = url ;
27- this . protocol = this . url . startsWith ( 'https' ) ? https : http ;
40+ // eslint-disable-next-line global-require
41+ this . protocol = this . url . startsWith ( 'https' ) ? require ( 'https' ) : require ( 'http' ) ;
2842
2943 this . maxRetry = maxRetry ;
3044 this . timeout = timeout ;
@@ -37,6 +51,7 @@ class JSONCache extends EventEmitter {
3751 this . delayStart = delayStart ;
3852 this . opts = opts ;
3953 this . useEmitter = useEmitter ;
54+ this . integrity = integrity ;
4055 if ( useEmitter ) {
4156 this . setMaxListeners ( maxListeners ) ;
4257 }
@@ -61,7 +76,11 @@ class JSONCache extends EventEmitter {
6176
6277 update ( ) {
6378 this . updating = this . httpGet ( ) . then ( async ( data ) => {
64- this . currentData = this . parser ( data , this . opts ) ;
79+ const parsed = this . parser ( data , this . opts ) ;
80+ if ( ! this . integrity ( parsed ) ) return this . currentData ;
81+
82+ // data passed integrity check
83+ this . currentData = parsed ;
6584 if ( this . useEmitter ) {
6685 setTimeout ( async ( ) => this . emit ( 'update' , await this . currentData ) , 2000 ) ;
6786 }
0 commit comments