er_memcached_data_server
Advanced tools
Comparing version 1.1.2 to 1.1.3
@@ -0,0 +0,0 @@ 'use strict'; |
{ | ||
"name": "er_memcached_data_server", | ||
"version": "1.1.2", | ||
"version": "1.1.3", | ||
"description": "Plugin for event_request that implements a memcached data server", | ||
"main": "index.js", | ||
"scripts": { | ||
"test": "node ./tests/memcached_data_server_test", | ||
"test": "nyc --reporter=lcov --reporter=text-summary node ./tests/memcached_data_server_test", | ||
"deploy": "npm run test && npm publish" | ||
@@ -29,3 +29,6 @@ }, | ||
"memcached": "^2.2.2" | ||
}, | ||
"devDependencies": { | ||
"nyc": "^15.1.0" | ||
} | ||
} |
# er_memcached_data_server | ||
[![Build Status](https://travis-ci.com/Michaelpalacce/er_memcached_data_server.svg?branch=master)](https://travis-ci.com/Michaelpalacce/er_memcached_data_server) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3582b90b7f824a73b44f67e3594a36a0)](https://app.codacy.com/manual/Michaelpalacce/er_memcached_data_server?utm_source=github.com&utm_medium=referral&utm_content=Michaelpalacce/er_memcached_data_server&utm_campaign=Badge_Grade_Dashboard) [![codecov](https://codecov.io/gh/Michaelpalacce/er_memcached_data_server/branch/master/graph/badge.svg)](https://codecov.io/gh/Michaelpalacce/er_memcached_data_server) ![Maintenance](https://img.shields.io/maintenance/yes/2020) [![Known Vulnerabilities](https://snyk.io/test/github/Michaelpalacce/er_memcached_data_server/badge.svg?targetFile=package.json)](https://snyk.io/test/github/Michaelpalacce/er_memcached_data_server?targetFile=package.json) ![GitHub top language](https://img.shields.io/github/languages/top/MichaelPalacce/er_memcached_data_server) ![npm bundle size](https://img.shields.io/bundlephobia/min/er_memcached_data_server) ![npm](https://img.shields.io/npm/dw/er_memcached_data_server) ![npm](https://img.shields.io/npm/dt/er_memcached_data_server) ![GitHub issues](https://img.shields.io/github/issues/MichaelPalacce/er_memcached_data_server) ![GitHub last commit](https://img.shields.io/github/last-commit/MichaelPalacce/er_memcached_data_server) | ||
Plugin for event_request that implements a memcached data server | ||
@@ -3,0 +6,0 @@ |
@@ -6,5 +6,5 @@ 'use strict'; | ||
module.exports = ( dataServerOptions )=>{ | ||
module.exports = ( dataServerOptions ) => { | ||
const dataServer = new DataServer( dataServerOptions ); | ||
return new DataServerPlugin( 'er_data_server', { dataServer } ); | ||
}; |
'use strict'; | ||
const DataServer = require( 'event_request/server/components/caching/data_server' ); | ||
const Memcached = require( 'memcached' ); | ||
const DataServer = require( 'event_request/server/components/caching/data_server' ); | ||
const Memcached = require( 'memcached' ); | ||
@@ -16,2 +16,5 @@ const OPTIONS_SERVER_LOCATIONS = 'serverLocations'; | ||
{ | ||
/** | ||
* @param {Object} options | ||
*/ | ||
_configure( options ) | ||
@@ -27,4 +30,4 @@ { | ||
this.defaultTtl = typeof options['ttl'] === 'number' | ||
? options['ttl'] | ||
this.defaultTtl = typeof options.ttl === 'number' | ||
? options.ttl | ||
: DEFAULT_TTL; | ||
@@ -42,3 +45,4 @@ | ||
{ | ||
this.server.end(()=>{}); | ||
/* istanbul ignore next */ | ||
this.server.end(() => {}); | ||
} | ||
@@ -51,4 +55,5 @@ | ||
{ | ||
return new Promise(( resolve, reject )=>{ | ||
return new Promise(( resolve, reject ) => { | ||
this.server.get( key, ( err, response ) => { | ||
/* istanbul ignore next */ | ||
if ( err ) | ||
@@ -58,3 +63,3 @@ reject( err ); | ||
resolve( typeof response !== 'undefined' ? response : null ); | ||
}) | ||
}); | ||
}); | ||
@@ -68,4 +73,5 @@ } | ||
{ | ||
return new Promise(( resolve, reject )=>{ | ||
this.server.set( key, value, this._getTtl( ttl ), ( error )=>{ | ||
return new Promise(( resolve, reject ) => { | ||
this.server.set( key, value, this._getTtl( ttl ), ( error ) => { | ||
/* istanbul ignore next */ | ||
if ( error ) | ||
@@ -85,4 +91,5 @@ reject( error ); | ||
{ | ||
return new Promise(( resolve, reject )=>{ | ||
this.server.del( key, ( error )=>{ | ||
return new Promise(( resolve, reject ) => { | ||
this.server.del( key, ( error ) => { | ||
/* istanbul ignore next */ | ||
if ( error ) | ||
@@ -102,4 +109,4 @@ reject( error ); | ||
{ | ||
return new Promise(( resolve, reject )=>{ | ||
this.server.incr( key, value, ( error, result )=>{ | ||
return new Promise(( resolve, reject ) => { | ||
this.server.incr( key, value, ( error, result ) => { | ||
if ( error ) | ||
@@ -122,4 +129,4 @@ resolve( false ); | ||
{ | ||
return new Promise(( resolve, reject )=>{ | ||
this.server.decr( key, value, ( error, result )=>{ | ||
return new Promise(( resolve, reject ) => { | ||
this.server.decr( key, value, ( error, result ) => { | ||
if ( error ) | ||
@@ -142,4 +149,5 @@ resolve( false ); | ||
{ | ||
return new Promise(( resolve, reject )=>{ | ||
this.server.touch( key, this._getTtl( ttl ), ( error, result )=>{ | ||
return new Promise(( resolve, reject ) => { | ||
this.server.touch( key, this._getTtl( ttl ), ( error, result ) => { | ||
/* istanbul ignore next */ | ||
if ( error ) | ||
@@ -165,3 +173,3 @@ reject( error ); | ||
return await serverAdd( key, DataServer.LOCK_VALUE, MAX_TTL ).catch(()=>{ | ||
return await serverAdd( key, DataServer.LOCK_VALUE, MAX_TTL ).catch(() => { | ||
return false; | ||
@@ -168,0 +176,0 @@ }); |
@@ -68,7 +68,3 @@ [ | ||
"refillAmount": 1, | ||
"policy": "strict", | ||
"delayTime": 1, | ||
"delayRetries": 1, | ||
"stopPropagation": false, | ||
"ipLimit": false | ||
"policy": "strict" | ||
}, | ||
@@ -75,0 +71,0 @@ { |
'use strict'; | ||
const { Server } = require( 'event_request' ); | ||
const { Server, Loggur } = require( 'event_request' ); | ||
const { test, assert, runAllTests } = require( 'event_request' ).Testing; | ||
@@ -15,3 +15,4 @@ const { request } = require( 'http' ); | ||
const dataServer = new MemcachedDataServer(); | ||
Loggur.disableDefault(); | ||
Loggur.loggers = {}; | ||
app.apply( getPlugin() ); | ||
@@ -79,3 +80,3 @@ | ||
}); | ||
}; | ||
} | ||
@@ -119,2 +120,28 @@ /** | ||
test({ | ||
message : 'MemcachedDataServer.set.sets.data.twice', | ||
test : ( done )=>{ | ||
// Wait in case the file has not been deleted from the FS | ||
setTimeout( async ()=>{ | ||
const dataServer = new MemcachedDataServer(); | ||
const key = `key${Math.random()}`; | ||
const value = 'value'; | ||
const ttl = 100; | ||
const persist = true; | ||
await dataServer.set( key, value, ttl, { persist } ) | ||
await dataServer.set( key, value, ttl, { persist } ) | ||
const dataSet = await dataServer.get( key ); | ||
assert.equal( dataSet !== null, true ); | ||
assert.equal( dataSet, value ); | ||
removeCache( dataServer ); | ||
done(); | ||
}, 10 ); | ||
} | ||
}); | ||
test({ | ||
message : 'MemcachedDataServer.set sets data without options', | ||
@@ -214,2 +241,19 @@ test : ( done )=>{ | ||
test({ | ||
message : 'MemcachedDataServer.get.when.data.does.not.exist', | ||
test : ( done )=>{ | ||
removeCache(); | ||
// Wait in case the file has not been deleted from the FS | ||
setTimeout( async ()=>{ | ||
const dataServer = new MemcachedDataServer( { persist: false } ); | ||
const dataSet = await dataServer.get( 'test' ); | ||
assert.equal( dataSet, null ); | ||
removeCache( dataServer ); | ||
done(); | ||
}, 10 ); | ||
} | ||
}); | ||
test({ | ||
message : 'MemcachedDataServer.get with invalid data', | ||
@@ -288,4 +332,57 @@ dataProvider : [ | ||
test({ | ||
message : 'MemcachedDataServer.touch.if.data.does.not.exist', | ||
test : ( done )=>{ | ||
setTimeout( async ()=>{ | ||
const dataServer = new MemcachedDataServer( { persist: false } ); | ||
const key = `key${Math.random()}`; | ||
assert.deepStrictEqual( await dataServer.touch( key, 5 ), false ); | ||
done(); | ||
}, 10 ); | ||
} | ||
}); | ||
test({ | ||
message : 'MemcachedDataServer.testWithServerAttachesSuccessfully', | ||
test : ( done )=>{ | ||
const app = new Server(); | ||
const name = '/testWithServerAttachesSuccessfully'; | ||
const key = `${name}${Math.random()}`; | ||
const value = 'test'; | ||
app.apply( getPlugin() ); | ||
app.get( name, async ( event )=>{ | ||
assert.equal( event.dataServer instanceof MemcachedDataServer, true ); | ||
await event.dataServer.set( key, value ); | ||
event.send( name ); | ||
}); | ||
app.get( `${name}GET`, async ( event )=>{ | ||
assert.equal( event.dataServer instanceof MemcachedDataServer, true ); | ||
assert.equal( await event.dataServer.get( key ), value ); | ||
event.send( `${name}GET` ); | ||
}); | ||
app.listen( 3334, ()=>{ | ||
sendServerRequest( name, 'GET', 200, '', {}, 3334 ).then(( response )=>{ | ||
assert.equal( response.body.toString(), name ); | ||
return sendServerRequest( `${name}GET`, 'GET', 200, '', {}, 3334 ); | ||
}).then(( response )=>{ | ||
assert.equal( response.body.toString(), `${name}GET` ); | ||
done(); | ||
}).catch( done ); | ||
}); | ||
} | ||
}); | ||
test({ | ||
message : 'MemcachedDataServer.touch with invalid data', | ||
dataProvider : [ | ||
@@ -585,42 +682,2 @@ ['key', '123', {}], | ||
test({ | ||
message : 'MemcachedDataServer.testWithServerAttachesSuccessfully', | ||
test : ( done )=>{ | ||
const app = new Server.class(); | ||
const name = '/testWithServerAttachesSuccessfully'; | ||
const key = `${name}${Math.random()}`; | ||
const value = 'test'; | ||
app.apply( getPlugin() ); | ||
app.get( name, async ( event )=>{ | ||
assert.equal( event.cachingServer instanceof MemcachedDataServer, true ); | ||
await event.cachingServer.set( key, value ); | ||
event.send( name ); | ||
}); | ||
app.get( `${name}GET`, async ( event )=>{ | ||
assert.equal( event.cachingServer instanceof MemcachedDataServer, true ); | ||
assert.equal( await event.cachingServer.get( key ), value ); | ||
event.send( `${name}GET` ); | ||
}); | ||
app.listen( 3334, ()=>{ | ||
sendServerRequest( name, 'GET', 200, '', {}, 3334 ).then(( response )=>{ | ||
assert.equal( response.body.toString(), name ); | ||
return sendServerRequest( `${name}GET`, 'GET', 200, '', {}, 3334 ); | ||
}).then(( response )=>{ | ||
assert.equal( response.body.toString(), `${name}GET` ); | ||
done(); | ||
}).catch( done ); | ||
}); | ||
} | ||
}); | ||
test({ | ||
message : 'MemcachedDataServer.testWithServerRateLimits', | ||
@@ -630,4 +687,4 @@ test : ( done )=>{ | ||
const appOne = new Server.class(); | ||
const appTwo = new Server.class(); | ||
const appOne = new Server(); | ||
const appTwo = new Server(); | ||
@@ -637,6 +694,6 @@ const name = 'testErRateLimitsBucketWorksCrossApps'; | ||
appOne.apply( new RateLimitsPlugin( 'rate_limits' ), { fileLocation, dataStore } ); | ||
appTwo.apply( new RateLimitsPlugin( 'rate_limits' ), { fileLocation, dataStore } ); | ||
appOne.apply( new RateLimitsPlugin( 'rate_limits' ), { fileLocation, dataStore, useFile: true } ); | ||
appTwo.apply( new RateLimitsPlugin( 'rate_limits' ), { fileLocation, dataStore, useFile: true } ); | ||
appOne.get( `/${name}`, ( event )=>{ | ||
appOne.get( `/${name}`, async ( event )=>{ | ||
event.send( name ); | ||
@@ -671,3 +728,3 @@ } ); | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -705,3 +762,3 @@ app.get( `/${name}`, ( event )=>{ | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -732,3 +789,3 @@ app.get( `/${name}`, ( event )=>{ | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -757,3 +814,3 @@ app.get( `/${name}`, ( event )=>{ | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -775,3 +832,5 @@ app.get( `/${name}`, ( event )=>{ | ||
message : 'MemcachedDataServer.testWithServerRateLimitsStrictSTRESS', | ||
skipped : true, | ||
test : ( done )=>{ | ||
// This test runs locally easily, but does not work well in the travis env | ||
const name = 'testErRateLimitsWithStrictPolicyStress'; | ||
@@ -781,3 +840,3 @@ const fileLocation = path.join( __dirname, './fixture/rate_limits.json' ); | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -804,3 +863,3 @@ app.get( `/${name}`, ( event )=>{ | ||
}).catch( done ); | ||
}, 2100 ); | ||
}, 2500 ); | ||
} | ||
@@ -816,3 +875,3 @@ }); | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -839,3 +898,3 @@ app.get( `/${name}`, ( event )=>{ | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -862,3 +921,3 @@ app.get( `/${name}`, ( event )=>{ | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -886,3 +945,3 @@ app.get( `/${name}`, ( event )=>{ | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -920,3 +979,3 @@ app.get( `/${name}`, ( event )=>{ | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -943,3 +1002,3 @@ app.get( `/${name}`, ( event )=>{ | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -966,3 +1025,3 @@ app.get( `/${name}`, ( event )=>{ | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -990,3 +1049,3 @@ app.get( `/${name}`, ( event )=>{ | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
@@ -1013,14 +1072,5 @@ app.get( `/${name}`, ( event )=>{ | ||
if ( ! app.hasPlugin( app.er_rate_limits ) ) | ||
app.apply( app.er_rate_limits, { fileLocation } ); | ||
app.apply( app.er_rate_limits, { fileLocation, useFile: true } ); | ||
app.get( `/${name}`, ( event )=>{ | ||
try | ||
{ | ||
assert.notEqual( Object.keys( event.rules[4].buckets )[0], `/${name}` ); | ||
} | ||
catch ( e ) | ||
{ | ||
return done( 'er_rate_limits with ip limit did not return as expected' ); | ||
} | ||
event.send( name ); | ||
@@ -1052,3 +1102,3 @@ } ); | ||
app.get( `/${name}`, ( event )=>{ | ||
app.get( `/${name}`, 'cache.request', ( event )=>{ | ||
if ( i === 0 ) | ||
@@ -1061,3 +1111,3 @@ { | ||
event.sendError( 'ERROR', 501 ); | ||
}, 'cache.request' ); | ||
}); | ||
@@ -1149,6 +1199,6 @@ sendServerRequest( `/${name}` ).then(( response )=>{ | ||
const name = 'testErSession'; | ||
const appTwo = new Server.class(); | ||
const appTwo = new Server(); | ||
assert.throws(()=>{ | ||
const appOne = new Server.class(); | ||
const appOne = new Server(); | ||
appOne.apply( appOne.er_session ); | ||
@@ -1179,3 +1229,3 @@ }); | ||
assert.equal( session.get( 'authenticated' ), true ); | ||
event.setHeader( 'authenticated', 1 ); | ||
event.setResponseHeader( 'authenticated', 1 ); | ||
} | ||
@@ -1222,4 +1272,44 @@ | ||
test({ | ||
message : 'MemcachedDataServer.with.custom.options', | ||
test : ( done )=>{ | ||
const dataServer = new MemcachedDataServer( { serverLocations: '', serverOptions: { poolSize: 100 }, ttl: 300 } ); | ||
dataServer.stop(); | ||
setTimeout(()=>{ | ||
done(); | ||
}, 50 ); | ||
} | ||
}); | ||
test({ | ||
message : 'MemcachedDataServer.with.ttl.-1', | ||
test : ( done )=>{ | ||
const dataServer = new MemcachedDataServer( { serverLocations: '', serverOptions: { poolSize: 100 }, ttl: -1 } ); | ||
dataServer.stop(); | ||
setTimeout(()=>{ | ||
done(); | ||
}, 50 ); | ||
} | ||
}); | ||
test({ | ||
message : 'MemcachedDataServer._getTtl', | ||
test : ( done )=>{ | ||
const dataServer = new MemcachedDataServer( { serverLocations: '', serverOptions: { poolSize: 100 }, ttl: -1 } ); | ||
dataServer.stop(); | ||
setTimeout(()=>{ | ||
assert.deepStrictEqual( dataServer._getTtl(), 2592000 ); | ||
done(); | ||
}, 50 ); | ||
} | ||
}); | ||
app.listen( 3333, async()=>{ | ||
runAllTests(); | ||
}); |
@@ -0,1 +1,4 @@ | ||
1.1.3 | ||
- Tests fix, Travis init | ||
1.1.2 | ||
@@ -2,0 +5,0 @@ - Fixed to work with newest version of event request |
84979
12
1441
22
1