Skip to main content

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​

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.