@effector-storage/keyv
v2.0.0
Published
Module for Effector to sync stores using Keyv
Downloads
17
Readme
Keyv adapter
Adapter to persist store in multiple backends, using Keyv library.
Install
Depending on your package manager
# using `pnpm` ↓
$ pnpm add effector-storage @effector-storage/keyv
# using `yarn` ↓
$ yarn add effector-storage @effector-storage/keyv
# using `npm` ↓
$ 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'
// create new Redis Keyv storage adapter
const storage = new KeyvRedis({ uri: 'redis://user:pass@localhost:6379' })
// persist store `$counter` with key 'counter' in Redis
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
'spersist
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.