Saltearse al contenido

refreshSnapshot

refreshSnapshot permite actualizar el contenido que está usando un cliente en modo snapshot sin reiniciar la aplicación.

Cuando llamas a este método, el cliente ejecuta de nuevo el snapshotLoader. Si el loader devuelve un snapshot más reciente que el actual, el cliente lo adopta inmediatamente y las siguientes lecturas empiezan a usarlo.

Esto resulta útil en aplicaciones que permanecen encendidas durante mucho tiempo, como servidores SSR, workers, procesos backend o aplicaciones que no se reinician después de cada publicación.

Por ejemplo, puedes publicar un nuevo snapshot en un almacenamiento remoto y pedirle después al cliente que lo recargue:

import { createClient } from '@content-island/api-client';
const client = createClient({
accessToken: 'TU_TOKEN_DE_ACCESO',
mode: 'snapshot',
snapshotLoader: async () => {
const response = await fetch('https://storage.example.com/content-island-snapshot.json');
return response.text();
},
});
const result = await client.refreshSnapshot();
console.log(result);

Si el snapshot remoto es más reciente, el resultado tendrá este aspecto:

{
status: 'updated',
meta: {
schemaVersion: 1,
exportedAt: '2026-06-22T10:30:00.000Z',
projectId: '1',
view: 'published',
},
}

Desde ese momento, el cliente empieza a servir el contenido del nuevo snapshot.

Interfaz

refreshSnapshot no recibe parámetros.

Devuelve una promesa con un objeto de tipo SnapshotRefreshResult:

export interface ApiClient {
refreshSnapshot: () => Promise<SnapshotRefreshResult>;
}

Resultado

type SnapshotRefreshResult = {
status: 'updated' | 'unchanged';
meta: SnapshotMeta;
};

El campo status indica si el snapshot activo ha cambiado:

statusSignificado
'updated'Se encontró un snapshot más reciente y ya está activo
'unchanged'El snapshot recibido era igual o más antiguo que el actual y se ignoró

Cuando el resultado es 'unchanged', no se lanza ningún error. El cliente continúa usando el snapshot que ya tenía cargado.

Esto evita que una respuesta retrasada o una actualización fuera de orden sustituya contenido reciente por contenido antiguo.

El campo meta contiene los metadatos del snapshot que queda activo después del refresco:

interface SnapshotMeta {
schemaVersion: number;
exportedAt: string;
projectId: string;
view: 'published' | 'preview';
}

Estos metadatos tienen la misma estructura que los devueltos por getSnapshotInfo.

Cuándo puede fallar

refreshSnapshot lanza un ApiClientError con código SNAPSHOT_MODE cuando no puede cargar o aceptar el nuevo snapshot.

En todos estos casos, el snapshot anterior se conserva y las lecturas pueden seguir utilizándolo.

El refresco falla cuando:

SituaciónMotivo
el nuevo snapshot pertenece a otro projectIdun refresco no puede cambiar de proyecto
el nuevo snapshot usa otro viewun refresco no puede cambiar entre published y preview
el snapshotLoader fallano se ha podido obtener el snapshot
el contenido no es JSON válidoel cliente no puede interpretarlo
la estructura del snapshot es incorrectael contenido no cumple el formato esperado
la versión de esquema no es compatibleel cliente no puede usar ese snapshot
el cliente está en modo 'api'ese cliente no utiliza snapshots
no se configuró un snapshotLoaderno existe ninguna fuente desde la que recargar

Si el error se produce dentro del loader, el error original queda disponible en error.cause.

import { createClient, ApiClientError } from '@content-island/api-client';
const client = createClient({
accessToken: 'TU_TOKEN_DE_ACCESO',
mode: 'snapshot',
snapshotLoader: async () => fetchSnapshotFromStorage(),
});
try {
const result = await client.refreshSnapshot();
if (result.status === 'updated') {
console.log('El cliente ya está usando el nuevo snapshot');
}
} catch (error) {
if (error instanceof ApiClientError && error.code === 'SNAPSHOT_MODE') {
console.error('No se pudo actualizar el snapshot');
// El snapshot anterior continúa activo.
}
}

Seguridad durante la actualización

Actualizar el snapshot no deja al cliente en un estado intermedio.

Mientras se ejecuta refreshSnapshot, una lectura utiliza el snapshot anterior completo o el snapshot nuevo completo. Nunca se sirve un snapshot cargado solo parcialmente.

También es seguro llamar a refreshSnapshot() varias veces al mismo tiempo. El cliente agrupa las llamadas concurrentes y termina conservando el snapshot más reciente que sea válido.

Si el cliente todavía no había cargado ningún snapshot, la primera llamada a refreshSnapshot() carga el snapshot inicial y lo establece como activo.