Skip to content

Feat/add Atom.persistedSwr for persisted stale-while-revalidate#2231

Open
rodygosset wants to merge 1 commit into
Effect-TS:mainfrom
rodygosset:feat/add-persisted-cache-atom-primitive
Open

Feat/add Atom.persistedSwr for persisted stale-while-revalidate#2231
rodygosset wants to merge 1 commit into
Effect-TS:mainfrom
rodygosset:feat/add-persisted-cache-atom-primitive

Conversation

@rodygosset
Copy link
Copy Markdown

@rodygosset rodygosset commented May 19, 2026

Type

  • Refactor
  • Feature
  • Bug Fix
  • Optimization
  • Documentation Update

Description

Adds Atom.persistedSwr, combining Atom.kvs persistence with Atom.swr for AsyncResult atoms.
Prefers a valid in-registry value over fresh persisted cache (SSR/hydration), syncs newer successes to the store immediately, and skips stale revalidation when live data is already shown.
Makes the wrapped atom serializable when needed.

Example:

import { Effect, Schema } from "effect"
import { KeyValueStore } from "effect/unstable/persistence"
import { AtomRegistry, AsyncResult, Atom } from "effect/unstable/reactivity"
import { Todo } from "@/features/todos/schemas"
import { ApiError } from "@/lib/api/definitions"

const runtime = Atom.runtime(BrowserKeyValueStore.layerLocalStorage)

class ApiClient extends AtomHttpApi.Service<ApiClient>()("ApiClient", { ... }) {}

const schema = AsyncResult.Schema({ success: Schema.Array(Todo), error: ApiError })

const todosAtom = ApiClient.query("todos", "getAll", {}).pipe(
  Atom.persistedSwr({
    key: "todos-getAll-cache",
    runtime,
    schema,
    staleTime: "1 minute",
    revalidateOnMount: false,
  })
)

// Force a network refetch:
// registry.refresh(todos)

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 19, 2026

🦋 Changeset detected

Latest commit: af03b01

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 27 packages
Name Type
effect Major
@effect/opentelemetry Major
@effect/platform-browser Major
@effect/platform-bun Major
@effect/platform-node-shared Major
@effect/platform-node Major
@effect/vitest Major
@effect/ai-anthropic Major
@effect/ai-openai-compat Major
@effect/ai-openai Major
@effect/ai-openrouter Major
@effect/atom-react Major
@effect/atom-solid Major
@effect/atom-vue Major
@effect/sql-clickhouse Major
@effect/sql-d1 Major
@effect/sql-libsql Major
@effect/sql-mssql Major
@effect/sql-mysql2 Major
@effect/sql-pg Major
@effect/sql-pglite Major
@effect/sql-sqlite-bun Major
@effect/sql-sqlite-do Major
@effect/sql-sqlite-node Major
@effect/sql-sqlite-react-native Major
@effect/sql-sqlite-wasm Major
@effect/openapi-generator Major

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@rodygosset rodygosset force-pushed the feat/add-persisted-cache-atom-primitive branch 6 times, most recently from 493955a to ff91889 Compare May 20, 2026 13:30
@rodygosset rodygosset changed the title Feat/add persisted cache atom primitive Feat/add Atom.persistedSwr for persisted stale-while-revalidate May 20, 2026
@rodygosset rodygosset force-pushed the feat/add-persisted-cache-atom-primitive branch 4 times, most recently from a3b8dfb to 4e31d55 Compare May 21, 2026 11:27
…tence with stale-while-revalidate, preferring valid registry values over fresh persisted cache for SSR and hydration.
@rodygosset rodygosset force-pushed the feat/add-persisted-cache-atom-primitive branch from 4e31d55 to af03b01 Compare May 21, 2026 11:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant