@unikvs/key-prefix
すべてのキーに固定文字列を付与し、テナント分離を実現するミドルウェアです。
概要
KeyPrefix はすべてのキーに固定文字列を付与し、テナント分離を実現します。Middleware
複数のテナントで 1 つのストレージを共有するときに、キーの衝突を防ぐ目的で使います。物理キーにプレフィックスを付けることで、このミドルウェアは論理キーを分離します。
nameはKeyPrefixです。isOpenは常にtrueです。mapKeyでキーにプレフィックスを付与し、useで範囲限定削除を保証できないclearを拒否します。encode・decode・encodeStream・decodeStreamはデータを透過します。
インストールは次のコマンドで行います。
npm install @unikvs/key-prefixpnpm add @unikvs/key-prefixyarn add @unikvs/key-prefixbun add @unikvs/key-prefixnub add @unikvs/key-prefixaube add @unikvs/key-prefix使い方
KeyPrefix は IMiddleware を実装しています。UniKvs には use() で渡します。
import { KeyPrefix } from "@unikvs/key-prefix";
コンストラクターの引数は次のとおりです。
prefixstring
すべてのキーに付与する固定文字列です。空文字ではキーをそのまま通します。
stringallowClear?boolean
プレフィックスが非空のときに clear を拒否するかどうかです。true では拒否し、false (既定) では透過します。
booleanfalse以下は、テナントごとにキーを分離する例です。
import { KeyPrefix } from "@unikvs/key-prefix";
import { Memory } from "@unikvs/memory";
import * as unikvs from "unikvs";
const kvs = new unikvs.Builder<{ k1: unikvs.PlainValue<string> }>()
.use(new KeyPrefix("tenant-a:"))
.persist(new Memory())
.build();
await kvs.open();
await kvs.set("k1", "hello");
console.log(await kvs.get("k1")); // "hello"
// 下流には tenant-a:k1 として保存されます
await kvs.close();
KeyPrefix
キーに固定のプレフィックスを付与するミドルウェアです。このミドルウェアは PassThrough を継承し、データ変換は行いません。
KeyPrefixOptions
KeyPrefix のコンストラクターが受け取るオプションです。allowClear の既定値は false です。
データ型
| メソッド | 入力 | 出力 |
|---|---|---|
encode |
any |
any |
decode |
any |
any |
encodeStream |
any |
any |
decodeStream |
any |
any |
encodeとdecodeは入力を同じ参照のまま出力し、変換を行いません。encodeStreamとdecodeStreamはチャンクをそのまま通し、順序と参照を保ちます。- キーの変換は
mapKeyで行い、${prefix}${key}を返します。プレフィックスが空文字のときはキーをそのまま返します。
エラー
このパッケージが投げるエラーは次のとおりです。
KeyPrefixClearDeniedError
prefixstring
拒否時点のプレフィックスです。
stringallowClearboolean
拒否時点の allowClear の値です。
boolean意味
プレフィックスが非空で allowClear が true のときに clear が呼ばれると、このエラーが投げられます。プレフィックス付きの clear は範囲限定削除を保証できず、他テナントのデータまで削除する恐れがあるため拒否します。
対処方法
共有環境では clear を呼ばず、キーごとに delete を使ってください。単一テナントで占有が保証できる場合や、全体削除を意図している場合は allowClear を false (既定) にして透過させてください。
例
以下は、KeyPrefixClearDeniedError を捕捉する例です。
import { KeyPrefix, KeyPrefixClearDeniedError } from "@unikvs/key-prefix";
const prefix = new KeyPrefix("tenant-a:", { allowClear: true });
try {
await kvs.clear();
} catch (ex) {
if (ex instanceof KeyPrefixClearDeniedError) {
console.log(ex.meta); // { prefix: "tenant-a:", allowClear: true }
} else {
throw ex;
}
}