Keyv adapter

Adapter to persist store in multiple backends, using Keyv library.
Install
Depending on your package manager
$ pnpm add effector-storage @effector-storage/keyv
$ yarn add effector-storage @effector-storage/keyv
$ npm install --save effector-storage @effector-storage/keyv
Also, you need to install required adapters for Keyv.
Usage
Due to changes in Keyv v5, you have to create Keyv storage adapter explicitely.
Import persist
function from '@effector-storage/keyv'
module, and use it with created adapter:
import KeyvRedis from '@keyv/redis'
import { persist } from '@effector-storage/keyv'
const storage = new KeyvRedis({ uri: 'redis://user:pass@localhost:6379' })
persist({
store: $counter,
key: 'counter',
with: storage,
})
⚠️ Note, that Keyv is asynchronous.
Two (or more) different stores, persisted with the same key, will be synchronized (synchronously!), even if not connected with each other directly — each store will receive updates from another one.
Formulae
import { persist } from '@effector-storage/keyv'
persist({ store, ...options }): Subscription
persist({ source, target, ...options }): Subscription
Options
- ... all the common options from
effector-storage
's persist
function. with
?: (string | Keyv | [Keyv.Options]): Connection string for Keyv library, or Keyv instance, or Keyv options. Default = undefined
(in that case in-memory Map is used as a storage)ttl
?: (number): TTL for stored value in milliseconds. Default = undefined
Adapter
import { adapter } from '@effector-storage/keyv'
adapter(options?): StorageAdapter
Options
with
?: (Keyv | KeyvStoreAdapter | KeyvOptions | Map): Keyv instance, or Keyv storage adapter, or Keyv options. Default = undefined
(in that case Keyv uses in-memory Map as a storage)ttl
?: (number): TTL for stored value in milliseconds. Default = undefined
FAQ
How do I use custom serialization / deserialization?
Adapter doesn't provide extra serialization options, but you can use Keyv options to achieve that:
persist({
store: $counter,
key: 'counter',
with: {
store: new KeyvRedis({ uri: 'redis://user:pass@localhost:6379' }),
serialize: JSON.stringify,
deserialize: JSON.parse,
},
})
or use separate Keyv instance:
const keyv = new Keyv(
new KeyvRedis({ uri: 'redis://user:pass@localhost:6379' }),
{
serialize: JSON.stringify,
deserialize: JSON.parse,
}
)
persist({
store: $counter,
key: 'counter',
with: keyv,
})
Please, read Keyv documentation for more details.