Skip to content

Core

Root createStorage API — options, instance methods, adapters, envelopes, and policies.

Previous: Core concepts · Next: Errors

Who is this for?

Beginners: skim Imports and createStorage options, then jump to Recipes.
Advanced: use the option tables + Adapters / Migrate sections as the source of truth next to TypeDoc.

TypeDoc

Symbol-level reference: API (TypeDoc). This page is the workflow guide.

Imports

ts
import {
  createStorage,
  createMemoryAdapter,
  createLocalStorageAdapter,
  createSessionStorageAdapter,
  ConfigurationError,
  SerializationError,
  QuotaExceededError,
  MigrationError,
  AdapterError,
  StorageError,
  isQuotaExceededError,
  packageId,
} from "@jayoncode/storage";

import type {
  CreateStorageOptions,
  JayOnCodeStorage,
  SetStorageOptions,
  StorageAdapter,
  StorageEnvelope,
  StorageEnvelopeV1,
  StoragePolicy,
  TtlDuration,
  StorageErrorCode,
  StorageErrorOptions,
} from "@jayoncode/storage";

createStorage(options)

Returns a sync JayOnCodeStorage<T> bound to one namespace + adapter.

CreateStorageOptions

OptionTypeDefaultNotes
namespacestringrequiredNon-empty; must not contain :
adapterStorageAdapterrequiredExplicit — no auto-select
ttlTtlDurationInstance default TTL
policiesRecord<string, StoragePolicy>Named write presets (ttl-only)
schemaVersionstring"1"Blank → "1"
serialize(value) => stringJSONSerializes the envelope
deserialize(raw) => unknownJSONMust yield an envelope
migrate(envelope, from) => envelope | nullRequired on version mismatch for get

Instance API

MemberSignatureNotes
namespacestringTrimmed
schemaVersionstringConfigured version
get(key)T | nullMigrates + may persist
set(key, value, options?)voidOverwrites
remove(key)voidNo parse
has(key)booleanpeek !== null — no migrate
clear()voidNeeds adapter.keys()
peek(key)StorageEnvelope<T> | nullNo migrate; lazy expiry
definePolicy(name, policy)voidRegister/replace preset

SetStorageOptions

OptionNotes
ttlHighest priority when present
policyNamed preset; validated even if ttl overrides

TTL resolution: options.ttl → policy ttl → instance ttl → none.

Physical keys

text
`${namespace}:${key}`

Keys and namespaces MUST NOT contain :.

Envelope

ts
{
  v: 1,
  schemaVersion: string,
  savedAt: number,
  expiresAt?: number,
  value: T,
}

expiresAt must be a finite number when present.

Adapters

FactoryBackend
createMemoryAdapter()In-memory Map
createLocalStorageAdapter()localStorage
createSessionStorageAdapter()sessionStorage

Custom adapters implement StorageAdapter. Implement keys() to use clear() / cleanup / snapshot / diagnostics report.

Playground

Adapters page — switch memory / local / session in the Lab.

Policies

ts
const storage = createStorage({
  namespace: "app",
  adapter: createMemoryAdapter(),
  policies: {
    preferences: { ttl: { days: 365 } },
    cache: { ttl: { minutes: 15 } },
  },
});

storage.set("theme", "dark", { policy: "preferences" });
storage.definePolicy("session", { ttl: { hours: 8 } });

Unknown policy names throw ConfigurationError. has / get / peek ignore policies.

Migrations

ts
createStorage({
  namespace: "app",
  adapter: createMemoryAdapter(),
  schemaVersion: "2",
  migrate: (envelope, fromVersion) => {
    if (fromVersion === "1") {
      return { ...envelope, schemaVersion: "2", value: upgrade(envelope.value) };
    }
    return null; // drop
  },
});

get runs migrate; has / peek do not.

Capabilities (Stable)

SubpathGuide
@jayoncode/storage/maintenanceMaintenance
@jayoncode/storage/snapshotsSnapshots
@jayoncode/storage/observableObservable
@jayoncode/storage/diagnosticsDiagnostics
@jayoncode/storage/transactionsTransactions

Next

Errors · Recipes · API (TypeDoc)

An ecosystem of independent, headless TypeScript libraries engineered for modern web development. Every package includes interactive playgrounds and documentation that evolves alongside the code.