Skip to content

Persistence

Stores encoded results for Persistable requests.

The Persistence service creates scoped stores keyed by each request's PrimaryKey. Stores read and write schema-encoded Exit values with optional TTLs, letting request workflows reuse expensive or idempotent results across fibers, process restarts, or workers that share a backing store.

17 exports Added in v4.0.0 Source

Converting

Converts a TTL to an absolute expiration timestamp in milliseconds.

Details

Returns null for no TTL and uses clock.currentTimeMillisUnsafe, so it is intended for backing-store internals.

Signature

declare function unsafeTtlToExpires(clock: Clock, ttl: Duration | undefined): number | null;

Errors

Error raised by persistence and backing-store operations.

Signature

declare class PersistenceError extends {
readonly _tag: "PersistenceError";
readonly cause?: unknown;
readonly message: string;
} & YieldableError<this> {
constructor(...args: [props: {
readonly _tag?: "PersistenceError";
readonly cause?: unknown;
readonly message: string;
}, options?: MakeOptions]);
readonly "~effect/persistence/Persistence/PersistenceError": "~effect/persistence/Persistence/PersistenceError";
}

Layers

layer

Added in v4.0.0 Source

Provides Persistence from BackingPersistence.

Details

The layer serializes and deserializes Persistable exits, applies per-entry TTLs, and skips writes whose TTL is zero or negative.

Signature

declare const layer: Layer<Persistence, never, BackingPersistence>;

Provides BackingPersistence using a KeyValueStore.

Details

Each store id becomes a key prefix, and values are stored as JSON with optional expiration timestamps.

Signature

declare const layerBackingKvs: Layer.Layer<BackingPersistence, never, KeyValueStore.KeyValueStore>;

Provides an in-memory BackingPersistence grouped by store id.

Details

Entries are process-local and expire according to their stored TTL.

Signature

declare const layerBackingMemory: Layer.Layer<BackingPersistence>;

Provides Redis-backed persistence.

Details

Each store id is used as a key prefix, values are JSON-encoded, and finite TTLs are stored with Redis expiration.

Signature

declare const layerBackingRedis: Layer.Layer<BackingPersistence, never, Redis.Redis>;

Provides SQL-backed persistence using a shared effect_persistence table.

Details

Rows are partitioned by store_id and store JSON-encoded values with optional expiration timestamps.

Signature

declare const layerBackingSql: Layer.Layer<BackingPersistence, never, SqlClient.SqlClient>;

Provides SQL-backed persistence using one table per store id.

Details

Each table is created if needed and stores JSON-encoded values with optional expiration timestamps.

Signature

declare const layerBackingSqlMultiTable: Layer.Layer<
BackingPersistence,
never,
SqlClient.SqlClient
>;

layerKvs

Added in v4.0.0 Source

Provides Persistence backed by the current KeyValueStore.

Signature

declare const layerKvs: Layer.Layer<Persistence, never, KeyValueStore.KeyValueStore>;

layerMemory

Added in v4.0.0 Source

Provides Persistence backed by process-local in-memory storage.

Signature

declare const layerMemory: Layer.Layer<Persistence>;

layerRedis

Added in v4.0.0 Source

Provides Persistence backed by the current Redis service.

Signature

declare const layerRedis: Layer.Layer<Persistence, never, Redis.Redis>;

layerSql

Added in v4.0.0 Source

Provides Persistence backed by SQL using a shared persistence table.

Signature

declare const layerSql: Layer.Layer<Persistence, never, SqlClient.SqlClient>;

Provides Persistence backed by SQL with one table per store id.

Signature

declare const layerSqlMultiTable: Layer.Layer<Persistence, never, SqlClient.SqlClient>;

Models

PersistenceStore interface

Added in v4.0.0 Source

Typed store for persisted Exit values keyed by Persistable requests.

Signature

interface PersistenceStore {
readonly clear: Effect<void, PersistenceError>;
readonly get: <A extends Constraint, E extends Constraint>(
key: Persistable<A, E>,
) => Effect<
Exit<A["Type"], E["Type"]> | undefined,
SchemaError | PersistenceError,
A["DecodingServices"] | E["DecodingServices"]
>;
readonly getMany: <A extends Constraint, E extends Constraint>(
keys: Iterable<Persistable<A, E>>,
) => Effect<
Array<Exit<A["Type"], E["Type"]> | undefined>,
SchemaError | PersistenceError,
A["DecodingServices"] | E["DecodingServices"]
>;
readonly remove: <A extends Constraint, E extends Constraint>(
key: Persistable<A, E>,
) => Effect<void, PersistenceError>;
readonly set: <A extends Constraint, E extends Constraint>(
key: Persistable<A, E>,
value: Exit<A["Type"], E["Type"]>,
) => Effect<void, SchemaError | PersistenceError, A["EncodingServices"] | E["EncodingServices"]>;
readonly setMany: <A extends Constraint, E extends Constraint>(
entries: Iterable<readonly [Persistable<A, E>, Exit<A["Type"], E["Type"]>]>,
) => Effect<void, SchemaError | PersistenceError, A["EncodingServices"] | E["EncodingServices"]>;
}

Services

Service for creating raw backing stores for persistence store ids.

Signature

declare class BackingPersistence extends Shape<
"effect/persistence/BackingPersistence",
{
readonly make: (storeId: string) => Effect<BackingPersistenceStore, never, Scope>;
},
this
> {
constructor(_: never);
}

BackingPersistenceStore interface

Added in v4.0.0 Source

Raw persistence backing store for JSON-compatible objects with optional TTLs.

Signature

interface BackingPersistenceStore {
readonly clear: Effect<void, PersistenceError>;
readonly get: (key: string) => Effect<object | undefined, PersistenceError>;
readonly getMany: (
keys: [string, ...Array<string>],
) => Effect<[object | undefined, ...Array<object | undefined>], PersistenceError>;
readonly remove: (key: string) => Effect<void, PersistenceError>;
readonly set: (
key: string,
value: object,
ttl: Duration | undefined,
) => Effect<void, PersistenceError>;
readonly setMany: (
entries: [
readonly [string, object, Duration | undefined],
...Array<readonly [string, object, Duration | undefined]>,
],
) => Effect<void, PersistenceError>;
}

Persistence

Added in v4.0.0 Source

Service for creating scoped stores of persisted Persistable request results.

Signature

declare class Persistence extends Shape<
"effect/persistence/Persistence",
{
readonly make: (options: {
readonly storeId: string;
readonly timeToLive?: (exit: Exit<unknown, unknown>, key: Any) => Input;
}) => Effect<PersistenceStore, never, Scope>;
},
this
> {
constructor(_: never);
}