Adapter to persist store in multiple backends, using Keyv library.
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.
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,
})
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.
import { persist } from '@effector-storage/keyv'
persist({ store, ...options }): Subscription
persist({ source, target, ...options }): Subscription
- ... 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
import { adapter } from '@effector-storage/keyv'
adapter(options?): StorageAdapter
-
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
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.