@unikvs/vercel-runtime-cache
Vercel のランタイムキャッシュに値を保存する @unikvs/vercel-runtime-cache の使い方を説明します。
概要
@unikvs/vercel-runtime-cache は Vercel のランタイムキャッシュに値を保存するストレージです。
このストレージはランタイムキャッシュを自動検出して使い、見つからなければプロセス内の Map にフォールバックします。どちらの場合も TTL と最大件数による追い出しを行います。
nameはVercelRuntimeCacheです。- バックエンドを共有するときは
namespaceを指定してください。namespaceを指定した場合、clearは現在のインスタンスが追跡しているキーだけを削除します。同じ名前空間で他のインスタンスやプロセスが書き込んだキーは削除されません。 maxEntriesによる追い出しと失効したキーの削除は、インスタンスごとの追跡に基づきます。そのため、共有バックエンドはmaxEntriesを超えるキーを保持することがあります。- バックエンドの追い出しは書き込みが古い順 (FIFO) で、フォールバックの追い出しは最も古く使われた順 (LRU) です。
namespaceが空でバックエンドがclearを持つ場合は、clearはバックエンド全体を削除します。isOpenは常にtrueです。open()・close()は中断の確認のみ行います。deleteは存在しないキーを指定した場合はKeyNotFoundErrorを投げます。- ストリームの読み書きに対応しています。
インストールは次のコマンドで行います。
npm install @unikvs/vercel-runtime-cachepnpm add @unikvs/vercel-runtime-cacheyarn add @unikvs/vercel-runtime-cachebun add @unikvs/vercel-runtime-cachenub add @unikvs/vercel-runtime-cacheaube add @unikvs/vercel-runtime-cache使い方
VercelRuntimeCache は IStorage を実装しています。UniKvs には persist() で渡します。
import { VercelRuntimeCache } from "@unikvs/vercel-runtime-cache";
VercelRuntimeCache
Vercel Runtime Cache を使うストレージです。
コンストラクターの引数は次のとおりです。
ttlSeconds?number
エントリの有効期限 (秒) です。
number60maxEntries?number
保持するエントリの最大数です。未指定なら無制限です。バックエンドでは書き込みが古い順 (FIFO)、フォールバックでは最終使用が古い順 (LRU) に追い出します。
numbernamespace?string
バックエンドのキーに付与する名前空間です。複数のストレージで同じバックエンドを共有するときに使います。
string""clone?<T>(value: T) => T
値の複製に使用する関数です。既定では structuredClone を使います。
<T>(value: T) => Tbackend?VercelRuntimeCacheBackend
使用するバックエンドです。未指定のときは自動検出し、見つからなければプロセス内の Map にフォールバックします。
VercelRuntimeCacheBackendnow?() => number
現在時刻を返す関数です。テストで時刻を固定するときに使います。
() => number以下は、値を保存して読み戻す例です。
import { VercelRuntimeCache } from "@unikvs/vercel-runtime-cache";
import * as unikvs from "unikvs";
const kvs = new unikvs.Builder<{
foo: unikvs.Value<string>;
}>()
.persist(new VercelRuntimeCache())
.build();
await kvs.open();
await kvs.set("foo", "hello");
const data = await kvs.get("foo");
console.log(data); // "hello"
await kvs.close();
データ型
| 操作 | 対応するデータ型 |
|---|---|
write・read |
任意の値(文字列・オブジェクトなど) |
getWritable・getReadable のチャンク |
Uint8Array<ArrayBuffer> |
- 任意の値を保存できます。既定では
structuredCloneで複製するので、structuredCloneで複製できる値を扱います。 - 期限切れのエントリは存在しないものとして扱い、読み取り時に掃除します。
getWritableで取得したストリームは、Uint8Array<ArrayBuffer>のチャンクを蓄積し、close時にまとめて保存します。getReadableは保存値がUint8Array<ArrayBuffer>の場合のみ使えます。
エラー
このパッケージが投げるエラーは次のとおりです。
InvalidTtlSecondsError
意味
ttlSeconds が 0 より大きい有限数ではないときに、構築時に投げます。
対処方法
ttlSeconds には 0 より大きい有限数を指定します。
InvalidMaxEntriesError
意味
maxEntries が 0 以上の整数ではないときに、構築時に投げます。
対処方法
maxEntries には 0 以上の整数を指定します。
InvalidNamespaceError
意味
namespace が文字列ではないときに、構築時に投げます。
対処方法
namespace には文字列を指定します。
InvalidChunkTypeError
意味
getWritable で取得したストリームに Uint8Array<ArrayBuffer> 以外のチャンクを書き込んだとき、または getReadable の対象値が Uint8Array<ArrayBuffer> ではないときに投げます。
対処方法
ストリームで扱う値は Uint8Array<ArrayBuffer> にします。
KeyNotFoundError
意味
指定したキーが存在しないとき、または期限切れのときに read・delete が投げます。@unikvs/core の共通エラーです。
対処方法
exists で確認してから読み出します。
例
以下は、KeyNotFoundError を捕捉する例です。
import { KeyNotFoundError } from "@unikvs/vercel-runtime-cache";
try {
const data = await kvs.get("missing-key");
} catch (ex) {
if (ex instanceof KeyNotFoundError) {
console.log("キーが見つかりません");
} else {
throw ex;
}
}