Comparing version 0.0.0 to 0.1.0
{ | ||
"name": "keyv", | ||
"version": "0.0.0", | ||
"version": "0.1.0", | ||
"description": "Simple key/value store with support for multiple backends", | ||
@@ -10,2 +10,5 @@ "main": "src/index.js", | ||
}, | ||
"xo": { | ||
"extends": "xo-lukechilds" | ||
}, | ||
"repository": { | ||
@@ -32,2 +35,4 @@ "type": "git", | ||
"coveralls": "^2.13.1", | ||
"delay": "^2.0.0", | ||
"eslint-config-xo-lukechilds": "^1.0.0", | ||
"nyc": "^10.3.2", | ||
@@ -34,0 +39,0 @@ "xo": "^0.19.0" |
'use strict'; | ||
class keyv {} | ||
class Keyv { | ||
constructor(opts) { | ||
this.opts = opts || {}; | ||
this.opts.store = this.opts.store || new Map(); | ||
} | ||
module.exports = keyv; | ||
get(key) { | ||
return Promise.resolve(this.opts.store.get(key)).then(data => { | ||
if (!data) { | ||
return undefined; | ||
} | ||
if (!this.opts.store.ttlSupport && Date.now() > data.expires) { | ||
this.delete(key); | ||
return undefined; | ||
} | ||
return this.opts.store.ttlSupport ? data : data.value; | ||
}); | ||
} | ||
set(key, value, ttl) { | ||
ttl = ttl || this.opts.ttl; | ||
let set; | ||
if (this.opts.store.ttlSupport) { | ||
set = this.opts.store.set(key, value, ttl); | ||
} else { | ||
const expires = (typeof ttl === 'number') ? (Date.now() + ttl) : undefined; | ||
const data = { value, expires }; | ||
set = this.opts.store.set(key, data); | ||
} | ||
return Promise.resolve(set).then(() => value); | ||
} | ||
delete(key) { | ||
return Promise.resolve(this.opts.store.delete(key)); | ||
} | ||
} | ||
module.exports = Keyv; |
import test from 'ava'; | ||
import keyv from '../'; | ||
import delay from 'delay'; | ||
import Keyv from '../'; | ||
test('keyv is a function', t => { | ||
t.is(typeof keyv, 'function'); | ||
test('Keyv is a class', t => { | ||
t.is(typeof Keyv, 'function'); | ||
t.throws(() => Keyv()); // eslint-disable-line new-cap | ||
t.notThrows(() => new Keyv()); | ||
}); | ||
test('Keyv accepts storage adapters', async t => { | ||
const store = new Map(); | ||
const keyv = new Keyv({ store }); | ||
await keyv.set('foo', 'bar'); | ||
t.is(await keyv.get('foo'), 'bar'); | ||
t.true(store.has('foo')); | ||
}); | ||
test('Keyv hands tll functionality over to ttl supporting stores', async t => { | ||
t.plan(4); | ||
const store = new Map(); | ||
store.ttlSupport = true; | ||
const storeSet = store.set; | ||
store.set = (key, val, ttl) => { | ||
t.is(ttl, 100); | ||
storeSet.call(store, key, val, ttl); | ||
}; | ||
const keyv = new Keyv({ store }); | ||
await keyv.set('foo', 'bar', 100); | ||
t.is(await keyv.get('foo'), 'bar'); | ||
t.is(store.get('foo'), 'bar'); | ||
await delay(100); | ||
t.is(await keyv.get('foo'), 'bar'); | ||
}); | ||
test('Keyv respects default tll option', async t => { | ||
const store = new Map(); | ||
const keyv = new Keyv({ store, ttl: 100 }); | ||
await keyv.set('foo', 'bar'); | ||
t.is(await keyv.get('foo'), 'bar'); | ||
await delay(100); | ||
t.is(await keyv.get('foo'), undefined); | ||
}); | ||
test('.set(key, val, ttl) overwrites default tll option', async t => { | ||
const store = new Map(); | ||
const keyv = new Keyv({ store, ttl: 100 }); | ||
await keyv.set('foo', 'bar'); | ||
await keyv.set('fizz', 'buzz', 50); | ||
await keyv.set('ping', 'pong', 150); | ||
t.is(await keyv.get('foo'), 'bar'); | ||
t.is(await keyv.get('fizz'), 'buzz'); | ||
t.is(await keyv.get('ping'), 'pong'); | ||
await delay(50); | ||
t.is(await keyv.get('foo'), 'bar'); | ||
t.is(await keyv.get('fizz'), undefined); | ||
t.is(await keyv.get('ping'), 'pong'); | ||
await delay(50); | ||
t.is(await keyv.get('foo'), undefined); | ||
t.is(await keyv.get('ping'), 'pong'); | ||
await delay(50); | ||
t.is(await keyv.get('ping'), undefined); | ||
}); |
Trivial Package
Supply chain riskPackages less than 10 lines of code are easily copied into your own project and may not warrant the additional supply chain risk of an external dependency.
Found 1 instance in 1 package
7875
8
137
0
6