qiwi / primitive-storage

Basic storage implementations.
MIT License
5 stars 2 forks source link
js-platform

@qiwi/primitive-storage

CI Maintainability Test Coverage npm (tag)

kv storage for basic purposes

Motivation

In 2018 2023 it's easier to write own storage implementation than to find a suitable one.

What's needed

Install

    npm i @qiwi/primitive-storage
    yarn add @qiwi/primitive-storage

JS/TS API

interface IStorage {
  get(key: string): any,
  set(key: string, value: any, ttl?: number): void,
  remove(key: string): void,
  reset(): void
}
import factory from '@antongolub/primitive-storage'

const storage = factory({defaultTtl: 60000})

storage.set('foo', 'bar')
storage.get('foo')  // 'bar'

// A minute later
storage.get('foo')  // undefined

Common aliases were also added for convenience:

Configuration

Option Type Def Description
defaultTtl number - If defined, the value would be applied as default ttl
for every set() call
debounce Object - Options for persistent storage sync debounce.
If empty no delay processed. IDebounceOpts:
{
   delay: number,
   maxDelay?: number,
   leading?: boolean
   trailing?: boolean
}
path string - Filepath (NodeJS) or localStorage scope (Browser)
compactTimer number - Period (ms) of automated compact method invocation
If undefined, no periodic task is running
clone bool/fn false true means that values are copied to storage on set.
Default copier (JSON.parse(JSON.str(...))) may be replaced
with custom.

Persistent data

It's very simple: if path property declared in opts, the data is being persisted:

Compaction

Current impl is dumb: every n milliseconds the job filters out expired entries from the storage. You're able to set compactTimer in storage opts, or just trigger compact method by hand.

License

MIT