コンテンツにスキップ
UniKVS
Esc
↑↓移動↵開く⌘Jプレビュー
このページの内容

パイプラインコンテキスト

@unikvs/core のパイプラインコンテキスト。IPipelineContext による実行時変数の読み書きと操作ごとのコンテキスト一覧を説明します。

概要

パイプラインコンテキストは操作ごとに受け渡される実行時変数 (vars) を読み書きする窓口です。すべてのコンテキストが IPipelineContext を継承し、操作の種類ごとに key・signal・source などの情報が追加されます。

プラグイン作者はフックの引数として渡されるコンテキストからキーやシグナルを取り出し、vars から動作設定を読み取ります。

変数の読み書き

get・set・setReadonly の 3 メソッドで変数を扱います。set 系は this を返すため、メソッドチェーンできます。

import type { IPipelineContext } from "@unikvs/core";

declare const ctx: IPipelineContext<{ readonly count: number }>;

const count: number = ctx.get("count"); // 型付きで取得
const unknownValue: unknown = ctx.get("anything-else"); // 未登録のキーは unknown

ctx.set("count", 1).setReadonly("count", 2); // this を返すため連鎖できる

型引数で { count: number } のように宣言すると、そのキーの取得と設定が型付けされます。宣言にないキーは unknown として扱われ、誤った型の代入は型エラーになります。

// @ts-expect-error count は number のため文字列は渡せない
ctx.set("count", "not a number");

宣言マージ

グローバルな UniKvsPipelineContextTypes への宣言マージでも型を足せます。複数のプラグインが共有する変数名を一箇所で定義するときに使います。

declare global {
  interface UniKvsPipelineContextTypes {
    readonly "test:count": number;
  }
}

declare const ctx: IPipelineContext;

const count: number = ctx.get("test:count");
ctx.set("test:count", 1); // 文字列の代入は型エラー

型引数の宣言と UniKvsPipelineContextTypes の宣言マージは結合され、どちらかにあるキーは型付きで解決されます。どちらにもないキーは unknown です。

コンテキストの階層

コンテキストは層状に継承されます。下の層ほど操作が特定され、持つ情報が増えます。

コンテキストの一覧

操作の種類ごとに含まれる情報が決まっています。

型 action 主な追加プロパティー
IMapKeyContext — key: string
IActionContext 10 種の操作 signal: AbortSignal
ILifecycleContext "open" | "close" signal
IOpenContext "open" signal
ICloseContext "close" signal
IKeyedActionContext 7 種のキー操作 key・signal
ISetContext "set" key・signal
IGetContext "get" key・signal・repair
IStreamContext "stream" key・signal・repair
IHasContext "has" key・signal
IDeleteContext "delete" key・signal
ITransferContext "copy" | "move" key・destinationKey・signal
ICopyContext "copy" key・destinationKey・signal
IMoveContext "move" key・destinationKey・signal
IClearContext "clear" signal
IEncodeContext "set" source・destination? (データ変換用)
IDecodeContext "get" source・destination? (データ変換用)
IEncodeStreamContext "set" source・destination? (IReadableStream 変換用)
IDecodeStreamContext "stream" source・destination? (IReadableStream 変換用)

キーとライフサイクル

IMapKeyContext はキー変換専用で key のみを持ちます (ミドルウェアの mapKey で使います)。signal は持ちません。

IActionContext は signal: AbortSignal と 10 種の action ("open" | "close" | "set" | "get" | "stream" | "has" | "delete" | "clear" | "copy" | "move") を持ちます。ILifecycleContext は "open" | "close" に絞られ、IOpenContext・ICloseContext はそれぞれ 1 種に絞られます。

キー操作

IKeyedActionContext は key: string を加え、action を "set" | "get" | "stream" | "has" | "delete" | "copy" | "move" の 7 種に絞ります。以降の ISetContext・IGetContext・IStreamContext・IHasContext・IDeleteContext は action を 1 種に固定します。ITransferContext は action を "copy" | "move" に絞り、コピー先・移動先の destinationKey を加えます。ICopyContext と IMoveContext はそれぞれ action を "copy"・"move" に固定します。IClearContext はキーを伴わないため IKeyedActionContext ではなく IActionContext を直接継承し、action は "clear" です。

ミドルウェアの use フックはこれら 8 種 (set・get・stream・has・delete・copy・move・clear) をまとめて受けます。action で絞り込むと、各操作の key や repair、destinationKey に型安全に触れます。

import type { IMiddleware } from "@unikvs/core";

export function describe(use: IMiddleware.UseContext): string {
  switch (use.action) {
    case "set":
    case "get":
    case "stream":
    case "has":
    case "delete":
    case "copy":
    case "move": {
      return `${use.action}: ${use.key}`;
    }
    case "clear": {
      return "clear";
    }
  }
}

変換

ITransformContext は変換前後の値を運びます。source が入力で、destination (任意) に変換結果を代入します。

型 action source destination
IEncodeContext "set" 生データ エンコード後
IDecodeContext "get" 保存値 デコード後
IEncodeStreamContext "set" 読み取りストリーム (生チャンク) 変換後の読み取りストリーム
IDecodeStreamContext "stream" 読み取りストリーム (保存チャンク) 変換後の読み取りストリーム

データ変換 (ITransformDataContext 系) の source と destination は値そのものです。一方、ストリーム変換 (ITransformStreamContext 系) の source と destination は IReadableStream です。値かチャンクかを型引数で確認します。詳しくはストリームを参照してください。

書き戻し

IGetContext と IStreamContext は読み取り時の書き戻し (repair) 要求を持ちます。後段のストレージで見つかった値を前段へ書き戻すかどうかが入ります。

import type { IGetContext } from "@unikvs/core";

declare const ctx: IGetContext;

if (ctx.repair.enabled) {
  console.log(ctx.repair.targets); // readonly [string, ...string[]] (1 件以上)
} else {
  console.log(ctx.repair.targets); // readonly [] (空)
}

enabled が false のとき targets は空配列、true のとき 1 件以上の表示名の配列です。enabled で絞り込むと targets の中身に型安全に触れます。書き戻しが拒否された場合は RepairNotAllowedError が使われます。可否は @unikvs/allow-repair で制御します。

API リファレンス

シンボルごとのリファレンスです。各メンバーの行にも直接リンクできます。

IPipelineContext

実行時変数 (vars) を読み書きする窓口です。すべてのコンテキストが継承します。

プロパティ型
getget<const TName extends ParamName<TTypes>>(name: TName): ParamValue<TTypes, TName>

変数を取得します。

型get<const TName extends ParamName<TTypes>>(name: TName): ParamValue<TTypes, TName>
setset<const TName extends ParamName<TTypes>>(name: TName, value: ParamValue<TTypes, TName>): this

変数を設定します。`this` を返します。

型set<const TName extends ParamName<TTypes>>(name: TName, value: ParamValue<TTypes, TName>): this
setReadonlysetReadonly<const TName extends ParamName<TTypes>>(name: TName, value: ParamValue<TTypes, TName>): this

変数を読み取り専用で設定します。`this` を返します。

型setReadonly<const TName extends ParamName<TTypes>>(name: TName, value: ParamValue<TTypes, TName>): this

IMapKeyContext

キー変換専用のコンテキストです。key のみを持ちます。

プロパティ型
keystring

変換対象のキーです。

型string

IActionContext

signal と 10 種の action を持つ、すべての操作に共通するコンテキストです。

プロパティ型
signalAbortSignal

操作の中断信号です。

型AbortSignal
action"open" | "close" | "set" | "get" | "stream" | "has" | "delete" | "clear" | "copy" | "move"

操作の種類です。

型"open" | "close" | "set" | "get" | "stream" | "has" | "delete" | "clear" | "copy" | "move"

ILifecycleContext

action を "open" | "close" に絞ったライフサイクル用コンテキストです。

プロパティ型
action"open" | "close"

操作の種類です。

型"open" | "close"

IOpenContext

action を "open" に固定した初期化用コンテキストです。

プロパティ型
action"open"

操作の種類です。

型"open"

ICloseContext

action を "close" に固定した終了処理用コンテキストです。

プロパティ型
action"close"

操作の種類です。

型"close"

IKeyedActionContext

key を加え、action をキー操作の 7 種に絞ったコンテキストです。

プロパティ型
action"set" | "get" | "stream" | "has" | "delete" | "copy" | "move"

操作の種類です。

型"set" | "get" | "stream" | "has" | "delete" | "copy" | "move"
keystring

操作対象のキーです。

型string

ISetContext

action を "set" に固定した書き込み用コンテキストです。

プロパティ型
action"set"

操作の種類です。

型"set"

IGetContext

action を "get" に固定した読み取り用コンテキストです。書き戻し (repair) 要求を持ちます。

プロパティ型
action"get"

操作の種類です。

型"get"

IStreamContext

action を "stream" に固定したストリーム読み取り用コンテキストです。書き戻し (repair) 要求を持ちます。

プロパティ型
action"stream"

操作の種類です。

型"stream"

IHasContext

action を "has" に固定した存在確認用コンテキストです。

プロパティ型
action"has"

操作の種類です。

型"has"

IDeleteContext

action を "delete" に固定した削除用コンテキストです。

プロパティ型
action"delete"

操作の種類です。

型"delete"

ITransferContext

コピー・移動に共通するコンテキストです。action は "copy" | "move" で、key がコピー元・移動元、destinationKey がコピー先・移動先です。

プロパティ型
action"copy" | "move"

操作の種類です。

型"copy" | "move"
keystring

コピー元または移動元のキーです。

型string
destinationKeystring

コピー先または移動先のキーです。

型string

ICopyContext

action を "copy" に固定したコピー用コンテキストです。key と destinationKey は ITransferContext から継承します。

プロパティ型
action"copy"

操作の種類です。

型"copy"

IMoveContext

action を "move" に固定した移動用コンテキストです。key と destinationKey は ITransferContext から継承します。

プロパティ型
action"move"

操作の種類です。

型"move"

IClearContext

action を "clear" に固定した全削除用コンテキストです。キーを伴いません。

プロパティ型
action"clear"

操作の種類です。

型"clear"

ITransformContext

変換前後の値を運ぶコンテキストです。source が入力で、destination に変換結果を代入します。

プロパティ型
action"set" | "get" | "stream"

操作の種類です。

型"set" | "get" | "stream"
sourceTSource

変換前の値です。

型TSource
destination?TDestination | undefined

変換結果の代入先です。

型TDestination | undefined

ITransformDataContext

値そのものを変換するデータ変換用コンテキストです。

プロパティ型
action"set" | "get"

操作の種類です。

型"set" | "get"

IEncodeContext

action を "set" に固定したエンコード用コンテキストです。

プロパティ型
action"set"

操作の種類です。

型"set"

IDecodeContext

action を "get" に固定したデコード用コンテキストです。

プロパティ型
action"get"

操作の種類です。

型"get"

ITransformStreamContext

ストリームを変換するコンテキストです。source と destination は IReadableStream です。

プロパティ型
action"set" | "stream"

操作の種類です。

型"set" | "stream"

IEncodeStreamContext

action を "set" に固定したストリームエンコード用コンテキストです。

プロパティ型
action"set"

操作の種類です。

型"set"

IDecodeStreamContext

action を "stream" に固定したストリームデコード用コンテキストです。

プロパティ型
action"stream"

操作の種類です。

型"stream"

このページは役に立ちましたか?