This is a data management/fetching library written for Svelte, inspired by SWR, and with built in integrations for Suspense. By keeping all requests in cache, views can be rendered instantly while refetching any potentially stale data in the background.
npm install --save @svelte-suspense/swr
SWR requires BroadcastChannel and LockManager.
Full support for those interfaces is included natively in:
- Chrome 69
- Edge 79
- FireFox 96
- Opera 56
- Safari 15.4
import { swr } from '@svelte-drama/swr'
const model = swr<ID, MODEL>({
key(id: ID) {
return `/api/endpoint/${id}`
},
async fetcher(key: string, id: ID) {
const request = fetch(key)
return request.json() as MODEL
},
})
ID
may be of type any
. MODEL
must be an object that can be cloned via the structured clone algorithm.
-
key(id: ID) => string
A function to create a unique cache when given the user defined
id
. Typically, this is the API path this data would be fetched from. -
fetcher(key: string, id: ID) => MaybePromise<MODEL>
A function to retrieve data from the server. It is passed
key
, the result of thekey
function and the sameid
passed to thekey
function. -
maxAge?: number = 0
Only use cached values that are no older than
maxAge
in milliseconds. -
name?: string = ''
Segment the cache using this as a key. Models with the same name share the same cache, so key collision must be kept in mind.
The returned object model
has several functions for fetching data.
-
model.clear() => Promise<void>
Clear all data from this cache. Note: Models with the same name share a cache.
-
model.delete(id: ID) => Promise<void>
Delete item from cache.
-
model.fetch(id: ID) => Promise<MODEL>
Returns data from cache if less than
maxAge
or performs a request using the providedfetcher
-
model.keys() => Promise<string[]>
Returns all currently cached keys, regardless of age.
-
model.live(id?: ID, susepnd?: SuspenseFn) => Readable<MODEL | undefined>
Returns a Svelte store that tracks the currently cached data. If no information is in the cache, the store will have the value
undefined
while data is requested. If the data in the cache is older thanmaxAge
, stale data will be returned while a request to update data will be performed in the background.id
may be undefined to allow for chaining inside of components. In a Svelte component, this will evaluate without errors:$: const parent = model.live(id) $: const child = model.live($parent?.foreign_key)
If integrating with @svelte-drama/suspense, the result of
createSuspense
may be passed to register this store.import { createSuspense } from '@svelte-drama/suspense' const suspend = createSuspense() const data = model.live(id, suspend)
-
model.refresh(id: ID) => Promise<MODEL>
Performs a request using the provided
fetcher
. Always makes a request, regradless of current cache status. -
model.update(id: ID, data: MODEL) => Promise<MODEL>
model.update(id: ID, fn: (data: MODEL) => MaybePromise<MODEL>) => Promise<MODEL>
Update data in the cache.
import { clear } from '@svelte-drama/swr'
clear()
Remove all data from all caches.