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 {
getResponse(endpoint, ...args) => { data, expiryStatus, expiresAt };
getError(endpoint, ...args) => ErrorTypes | undefined;
fetchedAt: number;
}
tip
Use Controller.snapshot() to construct a snapshot
Usage
Post
PostResource
PostItem
TotalVotes
PostList
import { RestEndpoint, createResource } from '@data-client/rest'; import { AbortOptimistic } from '@data-client/rest'; import { Post } from './Post'; export { Post }; export const PostResource = createResource({ path: '/posts/:id', schema: Post, }).extend(Base => ({ vote: new RestEndpoint({ path: '/posts/:id/vote', method: 'POST', body: undefined, schema: Post, getOptimisticResponse(snapshot, { id }) { const { data } = snapshot.getResponse(Base.get, { id }); if (!data) throw new AbortOptimistic(); return { id, votes: data.votes + 1, }; }, }), }));
🔴 Live Preview
Store▶
Members
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.