30 lines
831 B
TypeScript
30 lines
831 B
TypeScript
import {writable} from "svelte/store"
|
|
import {assoc, batch} from "@welshman/lib"
|
|
import {withGetter} from "@welshman/store"
|
|
|
|
export type FreshnessUpdate = {
|
|
ns: string
|
|
key: string
|
|
ts: number
|
|
}
|
|
|
|
export const freshness = withGetter(writable<Record<string, number>>({}))
|
|
|
|
export const getFreshnessKey = (ns: string, key: string) => `${ns}:${key}`
|
|
|
|
export const getFreshness = (ns: string, key: string) =>
|
|
freshness.get()[getFreshnessKey(ns, key)] || 0
|
|
|
|
export const setFreshnessImmediate = ({ns, key, ts}: FreshnessUpdate) =>
|
|
freshness.update(assoc(getFreshnessKey(ns, key), ts))
|
|
|
|
export const setFreshnessThrottled = batch(100, (updates: FreshnessUpdate[]) =>
|
|
freshness.update($freshness => {
|
|
for (const {ns, key, ts} of updates) {
|
|
$freshness[getFreshnessKey(ns, key)] = ts
|
|
}
|
|
|
|
return $freshness
|
|
}),
|
|
)
|