Make repository.load sync, move migrate into adapters

This commit is contained in:
Jon Staab
2024-09-27 12:46:39 -07:00
parent f27a64250e
commit 1ef7c1c59f
3 changed files with 15 additions and 25 deletions
+13 -15
View File
@@ -8,14 +8,9 @@ import type {TrustedEvent, Repository} from "@welshman/util"
import type {Tracker} from "@welshman/net"
import {withGetter, adapter, throttled, custom} from "@welshman/store"
export type IndexedDbAdapterOptions = {
migrate?: (items: any[]) => any[]
}
export type IndexedDbAdapter = {
keyPath: string
store: Writable<any[]>
options?: IndexedDbAdapterOptions
}
export let db: IDBPDatabase
@@ -53,10 +48,6 @@ export const bulkDelete = async (name: string, ids: string[]) => {
export const initIndexedDbAdapter = async (name: string, adapter: IndexedDbAdapter) => {
let prevRecords = await getAll(name)
if (adapter.options?.migrate) {
prevRecords = adapter.options.migrate(prevRecords)
}
adapter.store.set(prevRecords)
adapter.store.subscribe(
@@ -132,10 +123,14 @@ export const clearStorage = async () => {
await deleteDB(db.name)
}
export type StorageAdapterOptions = IndexedDbAdapterOptions & {
export type StorageAdapterOptions = {
throttle?: number
migrate?: (items: any[]) => any[]
}
const migrate = (data: any[], options: StorageAdapterOptions) =>
options.migrate ? options.migrate(data) : data
export const storageAdapters = {
fromObjectStore: <T>(store: Writable<Record<string, T>>, options: StorageAdapterOptions = {}) => ({
options,
@@ -143,7 +138,7 @@ export const storageAdapters = {
store: adapter({
store: throttled(options.throttle || 0, store),
forward: ($data: Record<string, T>) =>
Object.entries($data).map(([key, value]) => ({key, value})),
migrate(Object.entries($data).map(([key, value]) => ({key, value})), options),
backward: (data: {key: string, value: T}[]) =>
fromPairs(data.map(({key, value}) => [key, value])),
}),
@@ -154,7 +149,7 @@ export const storageAdapters = {
store: adapter({
store: throttled(options.throttle || 0, store),
forward: ($data: Map<string, T>) =>
Array.from($data.entries()).map(([key, value]) => ({key, value})),
migrate(Array.from($data.entries()).map(([key, value]) => ({key, value})), options),
backward: (data: {key: string, value: T}[]) =>
new Map(data.map(({key, value}) => [key, value])),
}),
@@ -165,8 +160,11 @@ export const storageAdapters = {
store: custom(setter => {
let onUpdate = () =>
setter(
Array.from(tracker.data.entries())
.map(([key, urls]) => ({key, value: Array.from(urls)}))
migrate(
Array.from(tracker.data.entries())
.map(([key, urls]) => ({key, value: Array.from(urls)})),
options
)
)
if (options.throttle) {
@@ -186,7 +184,7 @@ export const storageAdapters = {
options,
keyPath: 'id',
store: custom(setter => {
let onUpdate = () => setter(repository.dump())
let onUpdate = () => setter(migrate(repository.dump(), options))
if (options.throttle) {
onUpdate = throttle(options.throttle, onUpdate)