Snapshot
Snapshots passed to user-defined function that are used to compute state updates. These allow safe and performant access to the denormalized data based on the current state.
interface Snapshot {
get(schema, ...args) => DenormalizeNullable<typeof schema> | undefined;
getResponse(endpoint, ...args) => { data, expiryStatus, expiresAt };
getError(endpoint, ...args) => ErrorTypes | undefined;
fetchedAt: number;
abort: Error;
}
tip
Use Controller.snapshot() to construct a snapshot
Usage
Post
PostResource
PostItem
TotalVotes
PostList
import { resource } from '@data-client/rest'; import { Post } from './Post'; export { Post }; export const PostResource = resource({ path: '/posts/:id', searchParams: {} as { userId?: string | number } | undefined, schema: Post, }).extend('vote', { path: '/posts/:id/vote', method: 'POST', body: undefined, schema: Post, getOptimisticResponse(snapshot, { id }) { const post = snapshot.get(Post, { id }); if (!post) throw snapshot.abort; return { id, votes: post.votes + 1, }; }, });
🔴 Live Preview
Store▶
Members
get(schema, ...args)
Looks up any Queryable Schema.
getResponse(endpoint, ...args)
returns
{
data: DenormalizeNullable<E['schema']>;
expiryStatus: ExpiryStatus;
expiresAt: number;
}
Gets the (globally referentially stable) response for a given endpoint/args pair from state given.
data
The denormalize response data. Guarantees global referential stability for all members.
expiryStatus
export enum ExpiryStatus {
Invalid = 1,
InvalidIfStale,
Valid,
}
Valid
- Will never suspend.
- Might fetch if data is stale
InvalidIfStale
- Will suspend if data is stale.
- Might fetch if data is stale
Invalid
- Will always suspend
- Will always fetch
expiresAt
A number representing time when it expires. Compare to Date.now().
getError(endpoint, ...args)
Gets the error, if any, for a given endpoint. Returns undefined for no errors.
fetchedAt
When the fetch was called that resulted in this snapshot.
abort
This is an Error to be thrown in Endpoint.getOptimisticResponse() to cancel an optimistic update.