Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@qiwi/primitive-storage

qiwi80MIT2.0.1TypeScript support: included

Primitive storage for basic purposes

cache, storage, persistent storage, in-memory storage

readme

@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.

  • memory-cache is good enough, but setTimeout for each entry set looks redundant (0.2.0)
  • data-store — very nice, but only synchronous saving is supported, no debouncing, no ttl (2.0.1)
  • node-cache — pretty OK. Callbacks and events are supported. But no JSON.stringify handling, no persistency out of box (4.2.0)
  • CacheFactory — brilliant. localStorage, api, docs — everything is ok, but there's no file saving mechanism.

What's needed

  • Key-Value scheme
  • Optional TTL with scheduled compaction
  • Optional value cloning
  • Cycled refs handling (JSON.safeStringify, you know)
  • Sync throttling
  • Both browser and server runtimes support

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:

  • put = set
  • del = remove
  • clear = reset

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:

  • In case of NodeJS runtime, the data would be saved as json file.
  • Browser relies on localStorage API.
      const storage = factory({path: './data.json'})

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

changelog

2.0.1 (2023-07-13)

Fixes & improvements

  • fix: mark pkg as public (b9f2c47)

2.0.0 (2023-07-13)

Fixes & improvements

  • docs: copyedits (97a6a9e)
  • refactor: move to esm and esbuild (794bacd)
  • fix(deps): update dependency push-it-to-the-limit to v2 (82b6523)

BREAKING CHANGES

1.4.14 (2023-02-16)

Fixes & improvements

  • fix(deps): update dependency @qiwi/substrate to v2 (62c663b)

1.4.13 (2022-12-21)

Fixes & improvements

1.4.12 (2022-12-01)

Fixes & improvements

  • fix: set mjs ext for esm (069dde5)

1.4.11 (2022-12-01)

Fixes & improvements

  • fix: esm related fixes (a69b22c)
  • fix: provide esm compatibility (197fa69)

1.4.10 (2022-11-30)

Fixes & improvements

  • fix: fix es6 pkg entry point (5c44c20)

1.4.9 (2022-11-30)

Fixes & improvements

1.4.8 (2022-11-18)

Fixes & improvements

  • fix: add exports pkg entry (fe821b1)

1.4.7 (2022-11-18)

Fixes & improvements

  • perf: migrate to gh actions (#98) (6b680de)

1.4.6 (2021-08-20)

Bug Fixes

  • package: update deps, fix vuls (ab955dd)

1.4.5 (2021-06-21)

Bug Fixes

  • pkg: update deps, fix vuls (567adfa)

1.4.4 (2020-04-07)

Bug Fixes

  • package: fix bundle dir layout (54ae949)

1.4.3 (2020-04-07)

Bug Fixes

  • up deps & make *Storage be compatible with IStorage (4f2f6a2)

1.4.2 (2019-09-14)

Bug Fixes

  • util: processCycledRefs should not mutate src object (19f8f75)

1.4.1 (2019-09-11)

Bug Fixes

  • facade: export ifaces and types (7a34890)
  • package: fix deps clash (186e3b7)

1.4.0 (2019-09-11)

Features

1.3.0 (2019-08-09)

Features

  • expose storage constructors (251adff), closes #36

1.2.2 (2019-08-06)

Performance Improvements

  • minor improvements, up deps, linting (a732591)

1.2.1 (2018-12-19)

Bug Fixes

  • broken localStorage ref (0087d0d)

1.2.0 (2018-06-21)

Features

  • add getTtl to obtain current value's rest of time (9e54120)

1.1.0 (2018-06-21)

Features

  • add setTtl method to refresh expiration timepoint (f6d2d9a)
  • add debouncing for syncTo (0f464b9)
  • support clone opt (18371c8)
  • support configurable clone impl (e340010)

1.1.0 (2018-06-21)

Features

  • add debouncing for syncTo (0f464b9)
  • support clone opt (18371c8)
  • support configurable clone impl (e340010)

1.0.0 (2018-05-21)

Bug Fixes

  • rollup: fix broken cjs exports (7e394b0)

Features

  • AbstractStorage: add method aliases: put, del, clear (3fc0948)
  • InMemoryStorage: add compact method (0fddb6b)
  • add size method (a01073a)
  • add persistedLocalStorage support (ff7beaa)
  • add storage factory (9e3dbe5)
  • InMemoryStorage: add compactTimer option (4adf70d)