unikvs 0.0.13 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +84 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +103 -68
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
- package/src/_middleware.ts +5 -5
- package/src/_pipeline-graph.helpers.ts +2 -2
- package/src/_storage.ts +8 -8
- package/src/_streams.schemas.ts +3 -3
- package/src/_unikvs-branch.ts +16 -24
- package/src/_unikvs.schemas.ts +71 -85
- package/src/_value-schemas.ts +7 -8
- package/src/_value-validation.ts +11 -11
- package/src/errors.ts +34 -0
- package/src/index.ts +2 -0
- package/src/unikvs-branch.ts +22 -15
- package/src/unikvs-builder.ts +121 -34
- package/src/unikvs.ts +982 -982
- package/src/unikvs.types.ts +4 -4
- package/src/value-schemas.ts +14 -14
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_initProto","_applyDecs","_setFunctionName","_toPropertyKey","_checkInRHS","_toPrimitive","instances","this","this","denial","safeParse"],"sources":["../src/errors.ts","../src/_plugin-lifecycle.ts","../src/_middleware.ts","../src/_streams.ts","../src/_valibot.ts","../src/_streams.schemas.ts","../src/_storage.ts","../src/_unikvs-branch.ts","../src/unikvs-branch.ts","../src/_contexts.ts","../src/_logger.ts","../src/_pipeline-graph.helpers.ts","../src/_pipeline-leaf-resolver.ts","../src/_pipeline-graph.ts","../src/_unikvs.schemas.ts","../src/_value-schemas.ts","../src/_to-value-stream.ts","../src/_value-validation.ts","../src/unikvs.ts","../src/unikvs-builder.ts","../src/value-schemas.ts"],"sourcesContent":["import {\n type ErrorOptions,\n ErrorBase,\n setErrorMessage,\n KeyNotFoundError,\n InvalidUsageErrorBase,\n} from \"@unikvs/core\";\nimport type { BaseIssue } from \"valibot\";\n\nexport { KeyNotFoundError, InvalidUsageErrorBase };\nexport type { KeyNotFoundErrorArgs, KeyNotFoundErrorMeta } from \"@unikvs/core\";\n\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type Issue = BaseIssue<unknown>;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type InvalidInputErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly input: unknown;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly issues: readonly [Issue, ...Issue[]];\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type InvalidInputErrorArgs = ErrorOptions & {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly value: unknown;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly issues: readonly [Issue, ...Issue[]];\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class InvalidInputError extends InvalidUsageErrorBase<InvalidInputErrorMeta> {\n static {\n this.prototype.name = \"UniKvsInvalidInputError\";\n }\n\n public constructor(args: InvalidInputErrorArgs) {\n const { value: input, issues, ...options } = args;\n const meta: InvalidInputErrorMeta = {\n input,\n issues,\n };\n super(\n meta,\n ({ issues: messageIssues }) => messageIssues.map((i) => i.message).join(\": \"),\n options,\n );\n }\n}\n\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type InvalidOutputErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly output: unknown;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly issues: readonly [Issue, ...Issue[]];\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type InvalidOutputErrorArgs = ErrorOptions & {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly value: unknown;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly issues: readonly [Issue, ...Issue[]];\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class InvalidOutputError extends InvalidUsageErrorBase<InvalidOutputErrorMeta> {\n static {\n this.prototype.name = \"UniKvsInvalidOutputError\";\n }\n\n public constructor(args: InvalidOutputErrorArgs) {\n const { value: output, issues, ...options } = args;\n const meta: InvalidOutputErrorMeta = {\n issues,\n output,\n };\n super(\n meta,\n ({ issues: messageIssues }) => messageIssues.map((i) => i.message).join(\": \"),\n options,\n );\n }\n}\n\n// -------------------------------------------------------------------------------------------------。\n//\n// UniKvs。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class UniKvsIsOpenError extends ErrorBase<undefined> {\n static {\n this.prototype.name = \"UniKvsIsOpenError\";\n }\n\n public constructor(options?: ErrorOptions) {\n super(\"UniKvs is open\", options);\n }\n}\n\nsetErrorMessage(UniKvsIsOpenError, \"UniKvs は開いています\", \"ja\");\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class UniKvsIsNotOpenError extends ErrorBase<undefined> {\n static {\n this.prototype.name = \"UniKvsIsNotOpenError\";\n }\n\n public constructor(options?: ErrorOptions) {\n super(\"UniKvs is not open\", options);\n }\n}\n\nsetErrorMessage(UniKvsIsNotOpenError, \"UniKvs は開いていません\", \"ja\");\n\n// -------------------------------------------------------------------------------------------------。\n//\n// ストレージ。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type StorageIsNotOpenErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type StorageIsNotOpenErrorArgs = ErrorOptions & StorageIsNotOpenErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class StorageIsNotOpenError extends ErrorBase<StorageIsNotOpenErrorMeta> {\n static {\n this.prototype.name = \"UniKvsStorageIsNotOpenError\";\n }\n\n public constructor(args: StorageIsNotOpenErrorArgs) {\n const { name, ...options } = args;\n const meta: StorageIsNotOpenErrorMeta = { name };\n super(meta, ({ name: messageName }) => `Storage \"${messageName}\" is not open`, options);\n }\n}\n\nsetErrorMessage(StorageIsNotOpenError, ({ name }) => `ストレージ \"${name}\" は開いていません`, \"ja\");\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type WritableStreamNotSupportedErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type WritableStreamNotSupportedErrorArgs = ErrorOptions &\n WritableStreamNotSupportedErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class WritableStreamNotSupportedError extends ErrorBase<WritableStreamNotSupportedErrorMeta> {\n static {\n this.prototype.name = \"UniKvsWritableStreamNotSupportedError\";\n }\n\n public constructor(args: WritableStreamNotSupportedErrorArgs) {\n const { name, ...options } = args;\n const meta: WritableStreamNotSupportedErrorMeta = { name };\n super(\n meta,\n ({ name: messageName }) => `Storage \"${messageName}\" does not support writable stream`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n WritableStreamNotSupportedError,\n ({ name }) => `ストレージ \"${name}\" は書き込み可能なストリームをサポートしていません`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type ReadableStreamNotSupportedErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type ReadableStreamNotSupportedErrorArgs = ErrorOptions &\n ReadableStreamNotSupportedErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class ReadableStreamNotSupportedError extends ErrorBase<ReadableStreamNotSupportedErrorMeta> {\n static {\n this.prototype.name = \"UniKvsReadableStreamNotSupportedError\";\n }\n\n public constructor(args: ReadableStreamNotSupportedErrorArgs) {\n const { name, ...options } = args;\n const meta: ReadableStreamNotSupportedErrorMeta = { name };\n super(\n meta,\n ({ name: messageName }) => `Storage \"${messageName}\" does not support readable stream`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n ReadableStreamNotSupportedError,\n ({ name }) => `ストレージ \"${name}\" は読み取り可能なストリームをサポートしていません`,\n \"ja\",\n);\n\n/**\n * MultipartWriteNotSupportedError に付与されるメタデータです。\n */\nexport type MultipartWriteNotSupportedErrorMeta = {\n /**\n * 対象のストレージの名前です。\n */\n readonly name: string;\n};\n\n/**\n * MultipartWriteNotSupportedError のコンストラクター引数です。\n *\n * エラーの追加情報 (`cause`) も含みます。\n */\nexport type MultipartWriteNotSupportedErrorArgs = ErrorOptions &\n MultipartWriteNotSupportedErrorMeta;\n\n/**\n * ストレージがマルチパート書き込みをサポートしていない場合に投げられるエラーです。\n */\nexport class MultipartWriteNotSupportedError extends ErrorBase<MultipartWriteNotSupportedErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMultipartWriteNotSupportedError\";\n }\n\n public constructor(args: MultipartWriteNotSupportedErrorArgs) {\n const { name, ...options } = args;\n const meta: MultipartWriteNotSupportedErrorMeta = { name };\n super(\n meta,\n ({ name: messageName }) => `Storage \"${messageName}\" does not support multipart-write`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n MultipartWriteNotSupportedError,\n ({ name }) => `ストレージ \"${name}\" はマルチパート書き込みをサポートしていません`,\n \"ja\",\n);\n\n// -------------------------------------------------------------------------------------------------。\n//\n// ミドルウェア。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareIsNotOpenErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareIsNotOpenErrorArgs = ErrorOptions & MiddlewareIsNotOpenErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MiddlewareIsNotOpenError extends ErrorBase<MiddlewareIsNotOpenErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMiddlewareIsNotOpenError\";\n }\n\n public constructor(args: MiddlewareIsNotOpenErrorArgs) {\n const { name, ...options } = args;\n const meta: MiddlewareIsNotOpenErrorMeta = { name };\n super(meta, ({ name: messageName }) => `Middleware \"${messageName}\" is not open`, options);\n }\n}\n\nsetErrorMessage(\n MiddlewareIsNotOpenError,\n ({ name }) => `ミドルウェア \"${name}\" は開いていません`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareDestinationMissingErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly operation: \"encode\" | \"decode\";\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareDestinationMissingErrorArgs = ErrorOptions &\n MiddlewareDestinationMissingErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MiddlewareDestinationMissingError extends ErrorBase<MiddlewareDestinationMissingErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMiddlewareDestinationMissingError\";\n }\n\n public constructor(args: MiddlewareDestinationMissingErrorArgs) {\n const { name, operation, ...options } = args;\n const meta: MiddlewareDestinationMissingErrorMeta = {\n name,\n operation,\n };\n super(\n meta,\n ({ name: messageName, operation: messageOperation }) =>\n `Middleware \"${messageName}\" did not set destination for ${messageOperation}.`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n MiddlewareDestinationMissingError,\n ({ name, operation }) =>\n `ミドルウェア \"${name}\" は ${operation} の destination を設定しませんでした。`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareDestinationFrozenErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly action: \"set\" | \"get\" | \"stream\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly key: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareDestinationFrozenErrorArgs = ErrorOptions &\n MiddlewareDestinationFrozenErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MiddlewareDestinationFrozenError extends ErrorBase<MiddlewareDestinationFrozenErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMiddlewareDestinationFrozenError\";\n }\n\n public constructor(args: MiddlewareDestinationFrozenErrorArgs) {\n const { key, action, ...options } = args;\n const meta: MiddlewareDestinationFrozenErrorMeta = {\n key,\n action,\n };\n super(\n meta,\n ({ key: messageKey, action: messageAction }) =>\n `Cannot set destination after next() was called for ${messageAction} operation on key ${JSON.stringify(messageKey)}.`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n MiddlewareDestinationFrozenError,\n ({ key: messageKey, action: messageAction }) =>\n `next() を呼び出した後に destination を設定できません(${messageAction} 操作、キー ${JSON.stringify(messageKey)})。`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareNextNotCalledErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly operation: \"encode\" | \"decode\" | \"use\";\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareNextNotCalledErrorArgs = ErrorOptions & MiddlewareNextNotCalledErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MiddlewareNextNotCalledError extends ErrorBase<MiddlewareNextNotCalledErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMiddlewareNextNotCalledError\";\n }\n\n public constructor(args: MiddlewareNextNotCalledErrorArgs) {\n const { name, operation, ...options } = args;\n const meta: MiddlewareNextNotCalledErrorMeta = {\n name,\n operation,\n };\n super(\n meta,\n ({ name: messageName, operation: messageOperation }) =>\n `Middleware \"${messageName}\" did not call next() for ${messageOperation}.`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n MiddlewareNextNotCalledError,\n ({ name, operation }) => `ミドルウェア \"${name}\" は ${operation} で next() を呼びませんでした。`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareNextNotAwaitedErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly operation: \"encode\" | \"decode\" | \"use\";\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareNextNotAwaitedErrorArgs = ErrorOptions & MiddlewareNextNotAwaitedErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MiddlewareNextNotAwaitedError extends ErrorBase<MiddlewareNextNotAwaitedErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMiddlewareNextNotAwaitedError\";\n }\n\n public constructor(args: MiddlewareNextNotAwaitedErrorArgs) {\n const { name, operation, ...options } = args;\n const meta: MiddlewareNextNotAwaitedErrorMeta = {\n name,\n operation,\n };\n super(\n meta,\n ({ name: messageName, operation: messageOperation }) =>\n `Middleware \"${messageName}\" did not await next() for ${messageOperation}.`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n MiddlewareNextNotAwaitedError,\n ({ name, operation }) =>\n `ミドルウェア \"${name}\" は ${operation} で next() を await しませんでした。`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareNextCalledMultipleTimesErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly operation: \"encode\" | \"decode\" | \"use\";\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareNextCalledMultipleTimesErrorArgs = ErrorOptions &\n MiddlewareNextCalledMultipleTimesErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MiddlewareNextCalledMultipleTimesError extends ErrorBase<MiddlewareNextCalledMultipleTimesErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMiddlewareNextCalledMultipleTimesError\";\n }\n\n public constructor(args: MiddlewareNextCalledMultipleTimesErrorArgs) {\n const { name, operation, ...options } = args;\n const meta: MiddlewareNextCalledMultipleTimesErrorMeta = {\n name,\n operation,\n };\n super(\n meta,\n ({ name: messageName, operation: messageOperation }) =>\n `Middleware \"${messageName}\" called next() multiple times for ${messageOperation}.`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n MiddlewareNextCalledMultipleTimesError,\n ({ name, operation }) => `ミドルウェア \"${name}\" は ${operation} で next() を複数回呼びました。`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type StreamEncodingNotSupportedErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type StreamEncodingNotSupportedErrorArgs = ErrorOptions &\n StreamEncodingNotSupportedErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class StreamEncodingNotSupportedError extends ErrorBase<StreamEncodingNotSupportedErrorMeta> {\n static {\n this.prototype.name = \"UniKvsStreamEncodingNotSupportedError\";\n }\n\n public constructor(args: StreamEncodingNotSupportedErrorArgs) {\n const { name, ...options } = args;\n const meta: StreamEncodingNotSupportedErrorMeta = { name };\n super(\n meta,\n ({ name: messageName }) => `Middleware \"${messageName}\" does not support stream encoding.`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n StreamEncodingNotSupportedError,\n ({ name }) => `ミドルウェア \"${name}\" はストリームのエンコードをサポートしていません。`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type StreamDecodingNotSupportedErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type StreamDecodingNotSupportedErrorArgs = ErrorOptions &\n StreamDecodingNotSupportedErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class StreamDecodingNotSupportedError extends ErrorBase<StreamDecodingNotSupportedErrorMeta> {\n static {\n this.prototype.name = \"UniKvsStreamDecodingNotSupportedError\";\n }\n\n public constructor(args: StreamDecodingNotSupportedErrorArgs) {\n const { name, ...options } = args;\n const meta: StreamDecodingNotSupportedErrorMeta = { name };\n super(\n meta,\n ({ name: messageName }) => `Middleware \"${messageName}\" does not support decodable stream`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n StreamDecodingNotSupportedError,\n ({ name }) => `ミドルウェア \"${name}\" はデコード可能なストリームをサポートしていません`,\n \"ja\",\n);\n\n// -------------------------------------------------------------------------------------------------。\n//\n// ストレージ / ミドルウェア。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type PluginOperationAggregateErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly plugin: \"plugin\" | \"storage\" | \"middleware\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly action: \"open\" | \"close\" | \"write\" | \"read\" | \"delete\" | \"clear\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly errors: readonly {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly plugin: \"storage\" | \"middleware\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name?: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly index?: number;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly reason: unknown;\n }[];\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type PluginOperationAggregateErrorArgs = ErrorOptions & {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly plugin?: \"storage\" | \"middleware\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly action: \"open\" | \"close\" | \"write\" | \"read\" | \"delete\" | \"clear\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly errors: readonly {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly plugin?: \"storage\" | \"middleware\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name?: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly index?: number;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly reason: unknown;\n }[];\n};\n\n/**\n * プラグイン種別を正規化します。\n *\n * @param plugin 種別名です。\n *\n * @returns 正規化された種別を返します。\n */\nfunction normalizePlugin(plugin: string): \"storage\" | \"middleware\" {\n return plugin as \"storage\" | \"middleware\";\n}\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class PluginOperationAggregateError extends ErrorBase<PluginOperationAggregateErrorMeta> {\n static {\n this.prototype.name = \"UniKvsPluginOperationAggregateError\";\n }\n\n public constructor(args: PluginOperationAggregateErrorArgs) {\n const { action, errors, plugin, ...options } = args;\n const normalizedErrors = errors.map((error) => ({\n plugin: normalizePlugin((error.plugin ?? plugin ?? \"\") as string),\n ...(error.name !== undefined ? { name: error.name } : {}),\n ...(error.index !== undefined ? { index: error.index } : {}),\n reason: error.reason,\n }));\n const plugins = [...new Set(normalizedErrors.map((error) => error.plugin))];\n const [onlyPlugin] = plugins;\n const meta: PluginOperationAggregateErrorMeta = {\n action,\n errors: normalizedErrors,\n plugin: plugins.length === 1 && onlyPlugin !== undefined ? onlyPlugin : \"plugin\",\n };\n super(\n meta,\n ({ action: messageAction, errors: messageErrors, plugin: messagePlugin }) =>\n `${messageErrors.length} ${messagePlugin}(s) fail ${messageAction} operation`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n PluginOperationAggregateError,\n ({ action, errors, plugin }) =>\n `${errors.length} 個の${\n {\n plugin: \"プラグイン\",\n storage: \"ストレージ\",\n middleware: \"ミドルウェア\",\n }[plugin]\n }が ${action} 操作に失敗`,\n \"ja\",\n);\n\n// -------------------------------------------------------------------------------------------------。\n//\n// その他。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MissingStorageError extends ErrorBase<undefined> {\n static {\n this.prototype.name = \"UniKvsMissingStorageError\";\n }\n\n public constructor(options?: ErrorOptions) {\n super(\"At least one storage is required to use UniKvs\", options);\n }\n}\n\nsetErrorMessage(\n MissingStorageError,\n \"UniKvs を使用するためには最低 1 つのストレージが必要です\",\n \"ja\",\n);\n","import type { MaybePromise } from \"maypromise\";\n\n/**\n * 参照カウントで管理するプラグインの操作対象です。\n *\n * @template TOpenContext オープンコンテキストの型です。\n * @template TCloseContext クローズコンテキストの型です。\n */\ninterface IPlugin<TOpenContext, TCloseContext> {\n /**\n * プラグインが開かれているかどうかです。\n */\n get isOpen(): boolean;\n\n /**\n * プラグインを開く関数です。未定義のときは `open` を持たないものとして扱います。\n */\n open?(c: TOpenContext): MaybePromise<void>;\n\n /**\n * プラグインを閉じる関数です。未定義のときは `close` を持たないものとして扱います。\n */\n close?(c: TCloseContext): MaybePromise<void>;\n}\n\n/**\n * 共有プラグインの参照カウントと実 `close` の再試行を管理します。\n *\n * 同じプラグインを共有する利用者のうち、最初の `open` だけが実際に開き、最後の `close` だけが実際に閉じます。\n * 実 `close` に失敗したときは所有権を残し、次の `close` で再試行できるようにします。\n *\n * @template TOpenContext オープンコンテキストの型です。\n * @template TCloseContext クローズコンテキストの型です。\n */\nexport class PluginLifecycle<TOpenContext, TCloseContext> {\n /**\n * 参照カウントの対象です。\n */\n readonly #plugin: IPlugin<TOpenContext, TCloseContext>;\n\n /**\n * `open` した利用者の数です。最初の `open` だけが実際に開き、最後の `close` だけが実際に閉じます。\n * `close` を持たないプラグインは閉じられないため数えません。\n */\n #references: number;\n\n /**\n * 実 `close` に失敗したまま利用者の数が 0 になったかどうかです。\n *\n * このフラグが立っている間は、外部で開かれたプラグインではなく、閉じきれていない所有権が残っています。\n * 次の `open` が所有権を引き継ぎ、次の `close` が実 `close` を再試行します。\n */\n #closeFailed: boolean;\n\n public constructor(plugin: IPlugin<TOpenContext, TCloseContext>) {\n this.#plugin = plugin;\n this.#references = 0;\n this.#closeFailed = false;\n }\n\n /**\n * プラグインを開きます。\n *\n * 同じプラグインを共有する利用者のうち、最初の 1 回だけ実際の `open` を呼びます。\n * この管理対象外で既に開かれているプラグインは open/close の対象外にします。\n * 参照が残っていても実体が閉じられているときは、既存の参照を失わずに実 open へフォールバックします。\n * `close` を持たないプラグインは閉じられないため、参照を数えません。\n *\n * @param c オープンコンテキストです。\n */\n public async open(c: TOpenContext): Promise<void> {\n if (this.#plugin.open === undefined) {\n return;\n }\n\n // `close` を持たないプラグインは開いたままにしかできないため、参照を数えず、未 open のときだけ実 open します。\n if (this.#plugin.close === undefined) {\n if (this.#plugin.isOpen) {\n return;\n }\n\n await this.#plugin.open(c);\n\n return;\n }\n\n // この管理対象外の外部 open は対象外です。\n // 直前の close に失敗した所有権 (#closeFailed) がある間は、外部 open とみなしません。\n if (this.#plugin.isOpen && this.#references === 0 && !this.#closeFailed) {\n return;\n }\n\n if (this.#references > 0 || this.#closeFailed) {\n if (this.#plugin.isOpen) {\n // 既存の参照を失わずに加算します。close 失敗分の所有権もここで引き継ぎます。\n this.#references += 1;\n this.#closeFailed = false;\n\n return;\n }\n\n // 参照があるのに実体が閉じられているときは、実 open にフォールバックし、既存の参照を失わずに加算します。\n await this.#plugin.open(c);\n this.#references += 1;\n this.#closeFailed = false;\n\n return;\n }\n\n await this.#plugin.open(c);\n this.#references += 1;\n }\n\n /**\n * プラグインを閉じます。\n *\n * 同じプラグインを共有する利用者のうち、最後の 1 回だけ実際の `close` を呼びます。\n * 各呼び出しで参照を 1 つ減らし、実 `close` は全参照が解放されたときにだけ呼びます。\n * 実 `close` に失敗したときは所有権を残し、次の `close` で再試行できるようにします。\n * `close` を持たないプラグインは open で参照を数えないため、ここでは何もしません。\n * 実 `close` へ渡すコンテキストは最後に閉じる利用者のものであり、最初に開いた利用者の vars/signal は保持しません。\n *\n * @param c クローズコンテキストです。\n */\n public async close(c: TCloseContext): Promise<void> {\n if (this.#plugin.close === undefined) {\n return;\n }\n\n if (this.#references === 0 && !this.#closeFailed) {\n // この管理対象外のプラグインは閉じません。\n return;\n }\n\n if (this.#references > 0) {\n this.#references -= 1;\n }\n\n if (this.#references > 0) {\n // まだ利用者が残っているため、実体は閉じません。\n return;\n }\n\n if (!this.#plugin.isOpen) {\n // 既に外部で閉じられているため、未解放の所有権を解消します。\n this.#closeFailed = false;\n\n return;\n }\n\n await this.#closeReal(c);\n }\n\n /**\n * 失敗した実 `close` だけを再試行します。\n *\n * 通常の `close` と違い参照を減らしません。close 失敗後に新しい `open` が所有権を引き継いでいる場合は何もしません。\n * 実体が既に閉じられているときは失敗状態だけを解消します。\n *\n * @param c クローズコンテキストです。\n */\n public async retryClose(c: TCloseContext): Promise<void> {\n if (this.#plugin.close === undefined) {\n return;\n }\n\n // 新しい open が所有権を引き継いでいる場合は、その参照を解放しないよう何もしません。\n if (!this.#closeFailed || this.#references > 0) {\n return;\n }\n\n if (!this.#plugin.isOpen) {\n // 既に外部で閉じられているため、未解放の所有権を解消します。\n this.#closeFailed = false;\n\n return;\n }\n\n await this.#closeReal(c);\n }\n\n /**\n * 実 `close` を実行し、失敗したかどうかを記録します。\n *\n * @param c クローズコンテキストです。\n */\n async #closeReal(c: TCloseContext): Promise<void> {\n if (this.#plugin.close === undefined) {\n return;\n }\n\n try {\n await this.#plugin.close(c);\n this.#closeFailed = false;\n } catch (ex) {\n // 閉じるのに失敗したときは未解放として記録し、次の close で再試行できるようにします。\n this.#closeFailed = true;\n throw ex;\n }\n }\n}\n","import type { IMiddleware } from \"@unikvs/core\";\nimport { asyncmux } from \"asyncmux\";\nimport { callFnOnce } from \"call-fn-once\";\n\nimport { PluginLifecycle } from \"./_plugin-lifecycle.js\";\nimport {\n MiddlewareIsNotOpenError,\n StreamDecodingNotSupportedError,\n StreamEncodingNotSupportedError,\n} from \"./errors.js\";\n\n/**\n * 同じオブジェクトに対して同じ `UniKvsMiddleware` インスタンスを返すためのメモです。\n */\nconst instances = /* #__PURE__ */ new WeakMap<IMiddleware, UniKvsMiddleware>();\n\n/**\n * `IMiddleware` を `UniKvs` 内部から扱うためのラッパーです。\n *\n * ミドルウェアを安全に使うための検証などの処理が集約されています。\n */\nexport default class UniKvsMiddleware {\n /**\n * ラップするミドルウェアです。\n */\n readonly #mw: IMiddleware;\n\n /**\n * 参照カウントと実 `close` の再試行を管理します。\n */\n readonly #lifecycle: PluginLifecycle<IMiddleware.OpenContext, IMiddleware.CloseContext>;\n\n /**\n * ミドルウェアの名前です。\n */\n public readonly name: string;\n\n private constructor(middleware: IMiddleware) {\n this.#mw = middleware;\n this.#lifecycle = new PluginLifecycle(middleware);\n this.name = middleware.name;\n }\n\n /**\n * `IMiddleware` から `UniKvs` 内部から扱うためのミドルウェアを作成します。\n *\n * @param middleware 元となるミドルウェアです。\n *\n * @returns 検証などの機能が集約されたミドルウェアです。\n */\n public static from(middleware: IMiddleware): UniKvsMiddleware {\n return callFnOnce(instances, middleware, () => new UniKvsMiddleware(middleware));\n }\n\n /**\n * ミドルウェアを開きます。\n *\n * @param c オープンコンテキストです。\n */\n @asyncmux\n public async open(c: IMiddleware.OpenContext): Promise<void> {\n await this.#lifecycle.open(c);\n }\n\n /**\n * ミドルウェアを閉じます。\n *\n * @param c クローズコンテキストです。\n */\n @asyncmux\n public async close(c: IMiddleware.CloseContext): Promise<void> {\n await this.#lifecycle.close(c);\n }\n\n /**\n * 失敗した実 `close` だけを再試行します。\n *\n * @param c クローズコンテキストです。\n */\n @asyncmux\n public async retryClose(c: IMiddleware.CloseContext): Promise<void> {\n await this.#lifecycle.retryClose(c);\n }\n\n /**\n * キーを写像します。\n *\n * @param c キー写像コンテキストです。\n *\n * @returns 写像後のキーを返します。\n */\n public mapKey(c: IMiddleware.MapKeyContext): string {\n if (!this.#mw.isOpen) {\n throw new MiddlewareIsNotOpenError({ name: this.name });\n }\n\n if (this.#mw.mapKey === undefined) {\n // 既定ではキーをそのまま似します。\n return c.key;\n }\n\n return this.#mw.mapKey(c);\n }\n\n /**\n * 任意の操作に割り込みます。\n *\n * @param c 操作コンテキストです。\n * @param next 後段の処理です。\n */\n public async use(c: IMiddleware.UseContext, next: IMiddleware.INext): Promise<void> {\n if (!this.#mw.isOpen) {\n throw new MiddlewareIsNotOpenError({ name: this.name });\n }\n\n if (this.#mw.use === undefined) {\n // 既定では後段の処理を実行します。\n await next();\n } else {\n await this.#mw.use(c, next);\n }\n }\n\n /**\n * データをエンコードします。\n *\n * @param c エンコードコンテキストです。\n * @param next 後段の処理です。\n */\n public async encode(c: IMiddleware.EncodeContext, next: IMiddleware.INext): Promise<void> {\n if (!this.#mw.isOpen) {\n throw new MiddlewareIsNotOpenError({ name: this.name });\n }\n\n if (this.#mw.encode === undefined) {\n // 既定ではデータを素通りさせます。\n c.destination = c.source;\n\n await next();\n } else {\n await this.#mw.encode(c, next);\n }\n }\n\n /**\n * データをデコードします。\n *\n * @param c デコードコンテキストです。\n * @param next 後段の処理です。\n */\n public async decode(c: IMiddleware.DecodeContext, next: IMiddleware.INext): Promise<void> {\n if (!this.#mw.isOpen) {\n throw new MiddlewareIsNotOpenError({ name: this.name });\n }\n\n if (this.#mw.decode === undefined) {\n // 既定ではデータを素通りさせます。\n c.destination = c.source;\n\n await next();\n } else {\n await this.#mw.decode(c, next);\n }\n }\n\n /**\n * ストリームをエンコードします。\n *\n * @param c エンコードストリームコンテキストです。\n * @param next 後段の処理です。\n */\n public async encodeStream(\n c: IMiddleware.EncodeStreamContext,\n next: IMiddleware.INext,\n ): Promise<void> {\n if (!this.#mw.isOpen) {\n throw new MiddlewareIsNotOpenError({ name: this.name });\n }\n\n if (this.#mw.encodeStream === undefined) {\n throw new StreamEncodingNotSupportedError({ name: this.name });\n }\n\n await this.#mw.encodeStream(c, next);\n }\n\n /**\n * ストリームをデコードします。\n *\n * @param c デコードストリームコンテキストです。\n * @param next 後段の処理です。\n */\n public async decodeStream(\n c: IMiddleware.DecodeStreamContext,\n next: IMiddleware.INext,\n ): Promise<void> {\n if (!this.#mw.isOpen) {\n throw new MiddlewareIsNotOpenError({ name: this.name });\n }\n\n if (this.#mw.decodeStream === undefined) {\n throw new StreamDecodingNotSupportedError({ name: this.name });\n }\n\n await this.#mw.decodeStream(c, next);\n }\n}\n","import type { IReadableStream, IWritableStream } from \"@unikvs/core\";\n\n/**\n * 値が `ReadableStream` のインターフェースを満たすかどうかを判定します。\n *\n * ランタイムによっては `ReadableStream` クラスを継承せずに同じインターフェースを備えたオブジェクトが存在するため、`instanceof` ではなく必要なメソッドの有無で判定します。\n *\n * @param input 判定する値です。\n *\n * @returns `ReadableStream` のインターフェースを満たす場合は `true` を返します。\n */\nexport function isReadableStream(input: unknown): input is IReadableStream {\n if (typeof input !== \"object\" || input === null) {\n return false;\n }\n\n const stream = input as Partial<IReadableStream>;\n\n return (\n typeof stream.tee === \"function\" &&\n typeof stream.cancel === \"function\" &&\n typeof stream.pipeTo === \"function\" &&\n typeof stream.getReader === \"function\" &&\n typeof stream.pipeThrough === \"function\"\n );\n}\n\n/**\n * 値が `WritableStream` のインターフェースを満たすかどうかを判定します。\n *\n * ランタイムによっては `WritableStream` クラスを継承せずに同じインターフェースを備えたオブジェクトが存在するため、`instanceof` ではなく必要なメソッドの有無で判定します。\n *\n * @param input 判定する値です。\n *\n * @returns `WritableStream` のインターフェースを満たす場合は `true` を返します。\n */\nexport function isWritableStream(input: unknown): input is IWritableStream {\n if (typeof input !== \"object\" || input === null) {\n return false;\n }\n\n const stream = input as Partial<IWritableStream>;\n\n return (\n typeof stream.abort === \"function\" &&\n typeof stream.close === \"function\" &&\n typeof stream.getWriter === \"function\"\n );\n}\n\n/**\n * ストリームの重複を除いてキャンセルします。\n *\n * 個々のキャンセルに失敗しても無視し、元の例外を優先して伝えます。\n *\n * @param streams キャンセルするストリームです。\n * @param reason キャンセル理由です。\n */\nexport async function cancelStreams(\n streams: Iterable<IReadableStream>,\n reason: unknown,\n): Promise<void> {\n // 同じ参照は 1 回だけキャンセルします。\n await Promise.all(\n [...new Set(streams)].map(async (stream) => {\n try {\n await stream.cancel(reason);\n } catch {\n // キャンセルに失敗しても元の例外の伝播を優先します。\n }\n }),\n );\n}\n","import { tryCaptureStackTrace } from \"try-capture-stack-trace\";\nimport { type InferOutput, safeParse } from \"valibot\";\n\nimport {\n type InvalidInputErrorArgs,\n type InvalidOutputErrorArgs,\n InvalidInputError,\n InvalidOutputError,\n} from \"./errors.js\";\n\nexport type { InferInput, InferOutput, GenericSchema } from \"valibot\";\nexport {\n any,\n omit,\n pipe,\n check,\n union,\n custom,\n number,\n string,\n symbol,\n boolean,\n unknown,\n instance,\n minValue,\n optional,\n safeParse,\n safeInteger,\n} from \"valibot\";\n\nexport { array, tuple, object, record, transform } from \"@tai-kun/valibot-extra-lab\";\n\ntype BaseSchema = typeof safeParse extends (schema: infer S, ...args: any) => any ? S : never;\n\nexport interface IParseInputErrorConstructor {\n new (args: InvalidInputErrorArgs): Error;\n}\n\nexport function parseInput<const TSchema extends BaseSchema>(\n schema: TSchema,\n value: unknown,\n Error: IParseInputErrorConstructor = InvalidInputError,\n): InferOutput<TSchema> {\n const result = safeParse(schema, value);\n\n if (result.success) {\n return result.output;\n }\n\n const error = new Error({\n value,\n issues: result.issues,\n });\n tryCaptureStackTrace(error, parseInput);\n\n throw error;\n}\n\nexport interface ParseOutputErrorConstructor {\n new (args: InvalidOutputErrorArgs): Error;\n}\n\nexport function parseOutput<const TSchema extends BaseSchema>(\n schema: TSchema,\n value: unknown,\n Error: ParseOutputErrorConstructor = InvalidOutputError,\n): InferOutput<TSchema> {\n const result = safeParse(schema, value);\n\n if (result.success) {\n return result.output;\n }\n\n const error = new Error({\n value,\n issues: result.issues,\n });\n tryCaptureStackTrace(error, parseOutput);\n\n throw error;\n}\n","import type { IReadableStream, IWritableStream } from \"@unikvs/core\";\nimport type { CustomIssue, CustomSchema, ErrorMessage } from \"valibot\";\n\nimport { isReadableStream, isWritableStream } from \"./_streams.js\";\nimport { custom } from \"./_valibot.js\";\n\n/**\n * `ReadableStream` のインターフェースを満たすかを検証するためのスキーマです。\n */\nexport const ReadableStreamSchema: CustomSchema<\n IReadableStream,\n ErrorMessage<CustomIssue> | undefined\n> = custom<IReadableStream>(isReadableStream, \"Expected a ReadableStream\");\n\n/**\n * `WritableStream` のインターフェースを満たすかを検証するためのスキーマです。\n */\nexport const WritableStreamSchema: CustomSchema<\n IWritableStream,\n ErrorMessage<CustomIssue> | undefined\n> = custom<IWritableStream>(isWritableStream, \"Expected a WritableStream\");\n","import type { IStorage, IReadableStream, IWritableStream } from \"@unikvs/core\";\nimport { asyncmux } from \"asyncmux\";\nimport { callFnOnce } from \"call-fn-once\";\n\nimport { PluginLifecycle } from \"./_plugin-lifecycle.js\";\nimport { ReadableStreamSchema, WritableStreamSchema } from \"./_streams.schemas.js\";\nimport { parseOutput } from \"./_valibot.js\";\nimport {\n type PluginOperationAggregateError,\n StorageIsNotOpenError,\n ReadableStreamNotSupportedError,\n WritableStreamNotSupportedError,\n} from \"./errors.js\";\n\n/**\n * 同じオブジェクトに対して同じ `UniKvsStorage` インスタンスを返すためのメモです。\n */\nconst instances = /* #__PURE__ */ new WeakMap<IStorage, UniKvsStorage>();\n\n/**\n * `IStorage` を `UniKvs` 内部から扱うためのラッパーです。\n *\n * ストレージを安全に使うための検証などの処理が集約されています。\n */\nexport default class UniKvsStorage {\n /**\n * ラップするストレージです。\n */\n readonly #io: IStorage;\n\n /**\n * 参照カウントと実 `close` の再試行を管理します。\n */\n readonly #lifecycle: PluginLifecycle<IStorage.OpenContext, IStorage.CloseContext>;\n\n /**\n * ストレージの名前です。\n */\n public readonly name: string;\n\n private constructor(storage: IStorage) {\n this.#io = storage;\n this.#lifecycle = new PluginLifecycle(storage);\n this.name = storage.name;\n }\n\n /**\n * `IStorage` から `UniKvs` 内部から扱うためのストレージを作成します。\n *\n * @param storage 元となるストレージです。\n *\n * @returns 検証などの機能が集約されたストレージです。\n */\n public static from(storage: IStorage): UniKvsStorage {\n return callFnOnce(instances, storage, () => new UniKvsStorage(storage));\n }\n\n /**\n * ストレージを開きます。\n *\n * @param c オープンコンテキストです。\n */\n @asyncmux\n public async open(c: IStorage.OpenContext): Promise<void> {\n await this.#lifecycle.open(c);\n }\n\n /**\n * ストレージを閉じます。\n *\n * @param c クローズコンテキストです。\n */\n @asyncmux\n public async close(c: IStorage.CloseContext): Promise<void> {\n await this.#lifecycle.close(c);\n }\n\n /**\n * 失敗した実 `close` だけを再試行します。\n *\n * @param c クローズコンテキストです。\n */\n @asyncmux\n public async retryClose(c: IStorage.CloseContext): Promise<void> {\n await this.#lifecycle.retryClose(c);\n }\n\n /**\n * データを書き込みます。\n *\n * @param c 書き込みコンテキストです。\n * @param data 書き込むデータです。\n */\n public async write(c: IStorage.WriteContext, data: unknown): Promise<void> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n await this.#io.write(c, data);\n }\n\n /**\n * データを読み取ります。\n *\n * @param c 読み取りコンテキストです。\n *\n * @returns 読み取ったデータを返します。\n */\n public async read(c: IStorage.ReadContext): Promise<unknown> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n return await this.#io.read(c);\n }\n\n /**\n * データの存在を確認します。\n *\n * @param c 存在確認コンテキストです。\n *\n * @returns 存在する場合は `true` を返します。\n */\n public async exists(c: IStorage.ExistsContext): Promise<boolean> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n const output = await this.#io.exists(c);\n\n return output;\n }\n\n /**\n * データを削除します。\n *\n * @param c 削除コンテキストです。\n */\n public async delete(c: IStorage.DeleteContext): Promise<void> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n await this.#io.delete(c);\n }\n\n /**\n * データをすべて削除します。\n *\n * @param c クリアコンテキストです。\n */\n public async clear(c: IStorage.ClearContext): Promise<void> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n await this.#io.clear(c);\n }\n\n /**\n * 読み取り用のストリームを取得します。\n *\n * @param c ストリーム取得コンテキストです。\n *\n * @returns 読み取り用のストリームを返します。\n */\n public async getReadable(c: IStorage.GetReadableContext): Promise<IReadableStream> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n if (this.#io.getReadable === undefined) {\n throw new ReadableStreamNotSupportedError({ name: this.name });\n }\n\n const output = await this.#io.getReadable(c);\n\n return parseOutput(ReadableStreamSchema, output);\n }\n\n /**\n * 書き込み用のストリームを取得します。\n *\n * @param c ストリーム取得コンテキストです。\n *\n * @returns 書き込み用のストリームを返します。\n */\n public async getWritable(c: IStorage.GetWritableContext): Promise<IWritableStream> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n if (this.#io.getWritable === undefined) {\n throw new WritableStreamNotSupportedError({ name: this.name });\n }\n\n const output = await this.#io.getWritable(c);\n\n return parseOutput(WritableStreamSchema, output);\n }\n\n /**\n * 他のストレージへの書き込み失敗を通知します。\n *\n * @param c 書き込み失敗通知コンテキストです。\n * @param err 集約エラーです。\n */\n public async onOtherWriteError(\n c: IStorage.OtherWriteErrorHandlerContext,\n err: PluginOperationAggregateError,\n ): Promise<void> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n if (this.#io.onOtherWriteError === undefined) {\n return;\n }\n\n await this.#io.onOtherWriteError(c, [\n {\n errors: (\n err.meta.errors as readonly {\n readonly plugin: \"storage\";\n readonly reason: unknown;\n }[]\n ).map((error) => ({\n plugin: \"storage\" as const,\n reason: error.reason,\n })),\n plugin: \"storage\",\n },\n ]);\n }\n}\n","import type UniKvsMiddleware from \"./_middleware.js\";\nimport type UniKvsStorage from \"./_storage.js\";\nimport type { IUniKvsBranch } from \"./unikvs-branch.js\";\n\n/**\n * `fork` で親に引き継がれる分岐先の情報です。\n */\ntype BranchDestination = {\n /**\n * データの永続化先です。\n */\n readonly storage: UniKvsStorage;\n\n /**\n * ストレージに対するパイプラインです。\n * 登録順に保持します。\n */\n readonly middlewares: readonly UniKvsMiddleware[];\n};\n\n/**\n * `UniKvsBranch` のインスタンスごとの内部状態です。\n * ネイティブの `#` フィールドの代わりに `WeakMap` に保持することで、別モジュールの `UniKvsBuilder` から内部アクセサー経由で参照できます。\n * `branchStates` 自体は外部に公開しません。\n */\nexport type BranchState = {\n /**\n * 自前の相対パイプラインです。\n * 登録順に保持します。\n */\n readonly middlewares: UniKvsMiddleware[];\n\n /**\n * 自前の分岐先と各登録時点の相対パイプラインのスナップショットです。\n */\n readonly destinations: BranchDestination[];\n};\n\n/**\n * インスタンスと内部状態の対応表です。\n * コンパイラーによる `#` フィールドのダウンレベルと同様に、`WeakMap` をブランド兼ストレージとして使います。\n */\nexport const branchStates: WeakMap<IUniKvsBranch, BranchState> = /* #__PURE__ */ new WeakMap<\n IUniKvsBranch,\n BranchState\n>();\n\n/**\n * 分岐先のスナップショットを返します。\n *\n * 親の `fork` で接頭辞付加するために使用します。\n * `new Branch()` で作成された分岐以外の値が渡されたときは例外を投げます。\n * 外部からは使用しません。\n *\n * @param branch スナップショットを取得する分岐です。\n *\n * @returns 分岐先のコピーを返します。\n */\nexport function getBranchDestinationsForFork(branch: IUniKvsBranch): BranchDestination[] {\n const state = branchStates.get(branch);\n\n if (!state) {\n throw new TypeError(\"fork() expects a branch created by new Branch().\");\n }\n\n // コピーを返します。親の fork で接頭辞を付けても、元の分岐は変更されません。\n return state.destinations.map((dest) => ({\n storage: dest.storage,\n middlewares: [...dest.middlewares],\n }));\n}\n\n/**\n * 分岐先を親の接頭辞付きで追加します。\n *\n * @param destinations 追加先の分岐先列です。\n * @param prefix 親のミドルウェア列です。\n * @param branch 追加する分岐です。\n */\nexport function appendForkDestinations(\n destinations: BranchDestination[],\n prefix: readonly UniKvsMiddleware[],\n branch: IUniKvsBranch,\n): void {\n const prefixSnapshot = [...prefix];\n\n for (const dest of getBranchDestinationsForFork(branch)) {\n destinations.push({\n storage: dest.storage,\n // fork 時点の親チェーンを接頭辞として各分岐先の先頭に付け、ブランチのミドルウェアを結合します。\n middlewares: [...prefixSnapshot, ...dest.middlewares],\n });\n }\n}\n","import type { IStorage, IMiddleware } from \"@unikvs/core\";\n\nimport UniKvsMiddleware from \"./_middleware.js\";\nimport UniKvsStorage from \"./_storage.js\";\nimport type {\n $IsUnknown,\n $CheckForkDecodeData,\n $CheckForkEncodeData,\n $InferReadDataOutput,\n $InferWriteDataInput,\n $CheckForkDecodeChunk,\n $CheckForkEncodeChunk,\n $InferDecodeDataInput,\n $InferEncodeDataInput,\n $InferReadChunkOutput,\n $InferWriteChunkInput,\n $InferDecodeChunkInput,\n $InferDecodeDataOutput,\n $InferEncodeChunkInput,\n $InferEncodeDataOutput,\n $InferDecodeChunkOutput,\n $InferEncodeChunkOutput,\n} from \"./_types.js\";\nimport { type BranchState, branchStates, appendForkDestinations } from \"./_unikvs-branch.js\";\nimport type { Value } from \"./value-schemas.js\";\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport type KeyValueMapping<T = any> = Readonly<Record<string, Value<T>>>;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport interface IUniKvsBranch<\n TKeyValueMapping extends KeyValueMapping = KeyValueMapping,\n TBranchChunkInput = any,\n TBranchChunkOutput = any,\n THeadEncodeDataInput = unknown,\n THeadDecodeDataOutput = unknown,\n THeadEncodeChunkInput = unknown,\n THeadDecodeChunkOutput = unknown,\n TLastDecodeDataInput = any,\n TLastEncodeDataOutput = any,\n TLastDecodeChunkInput = any,\n TLastEncodeChunkOutput = any,\n TBranchHasPersist extends boolean = false,\n> {\n fork<\n TSubChunkInput,\n TSubChunkOutput,\n TSubHeadEncodeDataInput,\n TSubHeadDecodeDataOutput,\n TSubHeadEncodeChunkInput,\n TSubHeadDecodeChunkOutput,\n TSubLastDecodeDataInput,\n TSubLastEncodeDataOutput,\n TSubLastDecodeChunkInput,\n TSubLastEncodeChunkOutput,\n TSubHasPersist extends boolean,\n >(\n branch: IUniKvsBranch<\n any,\n TSubChunkInput,\n TSubChunkOutput,\n TSubHeadEncodeDataInput,\n TSubHeadDecodeDataOutput,\n TSubHeadEncodeChunkInput,\n TSubHeadDecodeChunkOutput,\n TSubLastDecodeDataInput,\n TSubLastEncodeDataOutput,\n TSubLastDecodeChunkInput,\n TSubLastEncodeChunkOutput,\n TSubHasPersist\n > &\n (TSubHasPersist extends true\n ? $CheckForkEncodeData<TLastEncodeDataOutput, TSubHeadEncodeDataInput>\n : unknown) &\n (TSubHasPersist extends true\n ? $CheckForkDecodeData<TLastDecodeDataInput, TSubHeadDecodeDataOutput>\n : unknown) &\n (TSubHasPersist extends true\n ? $CheckForkEncodeChunk<TLastEncodeChunkOutput, TSubHeadEncodeChunkInput>\n : unknown) &\n (TSubHasPersist extends true\n ? $CheckForkDecodeChunk<TLastDecodeChunkInput, TSubHeadDecodeChunkOutput>\n : unknown),\n ): IUniKvsBranch<\n TKeyValueMapping,\n TSubHasPersist extends true\n ? [TBranchChunkInput] extends [never]\n ? never\n : [TSubChunkInput] extends [never]\n ? never\n : TBranchChunkInput\n : TBranchChunkInput,\n TSubHasPersist extends true\n ? [TBranchChunkOutput] extends [never]\n ? never\n : [TSubChunkOutput] extends [never]\n ? never\n : TBranchChunkOutput\n : TBranchChunkOutput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadEncodeDataInput> extends true\n ? TSubHeadEncodeDataInput\n : THeadEncodeDataInput\n : THeadEncodeDataInput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadDecodeDataOutput> extends true\n ? TSubHeadDecodeDataOutput\n : THeadDecodeDataOutput\n : THeadDecodeDataOutput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadEncodeChunkInput> extends true\n ? TSubHeadEncodeChunkInput\n : THeadEncodeChunkInput\n : THeadEncodeChunkInput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadDecodeChunkOutput> extends true\n ? TSubHeadDecodeChunkOutput\n : THeadDecodeChunkOutput\n : THeadDecodeChunkOutput,\n TLastDecodeDataInput,\n TLastEncodeDataOutput,\n TLastDecodeChunkInput,\n TLastEncodeChunkOutput,\n TBranchHasPersist extends true ? true : TSubHasPersist\n >;\n\n use<\n TMiddleware extends IMiddleware<\n [TLastEncodeDataOutput] extends [never] ? any : TLastEncodeDataOutput,\n any,\n [TLastEncodeChunkOutput] extends [never] ? any : TLastEncodeChunkOutput\n >,\n >(\n middleware: TMiddleware,\n ): IUniKvsBranch<\n TKeyValueMapping,\n [TBranchChunkInput] extends [never]\n ? never\n : [$InferDecodeChunkInput<TMiddleware>] extends [never]\n ? never\n : TBranchChunkInput,\n [TBranchChunkOutput] extends [never]\n ? never\n : [$InferEncodeChunkOutput<TMiddleware>] extends [never]\n ? never\n : TBranchChunkOutput,\n $IsUnknown<THeadEncodeDataInput> extends true\n ? $InferEncodeDataInput<TMiddleware>\n : THeadEncodeDataInput,\n $IsUnknown<THeadDecodeDataOutput> extends true\n ? $InferDecodeDataOutput<TMiddleware>\n : THeadDecodeDataOutput,\n $IsUnknown<THeadEncodeChunkInput> extends true\n ? $InferEncodeChunkInput<TMiddleware>\n : THeadEncodeChunkInput,\n $IsUnknown<THeadDecodeChunkOutput> extends true\n ? $InferDecodeChunkOutput<TMiddleware>\n : THeadDecodeChunkOutput,\n $InferDecodeDataInput<TMiddleware>,\n $InferEncodeDataOutput<TMiddleware>,\n $InferDecodeChunkInput<TMiddleware>,\n $InferEncodeChunkOutput<TMiddleware>,\n TBranchHasPersist\n >;\n\n persist<\n TStorage extends IStorage<\n [TLastEncodeDataOutput] extends [never] ? any : TLastEncodeDataOutput,\n [TLastDecodeDataInput] extends [never] ? any : TLastDecodeDataInput,\n [TLastEncodeChunkOutput] extends [never] ? any : TLastEncodeChunkOutput,\n [TLastDecodeChunkInput] extends [never] ? any : TLastDecodeChunkInput\n >,\n >(\n storage: TStorage,\n ): IUniKvsBranch<\n TKeyValueMapping,\n [TBranchChunkInput] extends [never]\n ? never\n : [$InferWriteChunkInput<TStorage>] extends [never]\n ? never\n : TBranchChunkInput,\n [TBranchChunkOutput] extends [never]\n ? never\n : [$InferReadChunkOutput<TStorage>] extends [never]\n ? never\n : TBranchChunkOutput,\n $IsUnknown<THeadEncodeDataInput> extends true\n ? $InferWriteDataInput<TStorage>\n : THeadEncodeDataInput,\n $IsUnknown<THeadDecodeDataOutput> extends true\n ? $InferReadDataOutput<TStorage>\n : THeadDecodeDataOutput,\n $IsUnknown<THeadEncodeChunkInput> extends true\n ? $InferWriteChunkInput<TStorage>\n : THeadEncodeChunkInput,\n $IsUnknown<THeadDecodeChunkOutput> extends true\n ? $InferReadChunkOutput<TStorage>\n : THeadDecodeChunkOutput,\n TLastDecodeDataInput,\n TLastEncodeDataOutput,\n TLastDecodeChunkInput,\n TLastEncodeChunkOutput,\n true\n >;\n}\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport default class UniKvsBranch<\n TKeyValueMapping extends KeyValueMapping = KeyValueMapping,\n TBranchChunkInput = any,\n TBranchChunkOutput = any,\n THeadEncodeDataInput = unknown,\n THeadDecodeDataOutput = unknown,\n THeadEncodeChunkInput = unknown,\n THeadDecodeChunkOutput = unknown,\n TLastDecodeDataInput = any,\n TLastEncodeDataOutput = any,\n TLastDecodeChunkInput = any,\n TLastEncodeChunkOutput = any,\n TBranchHasPersist extends boolean = false,\n> implements IUniKvsBranch<\n TKeyValueMapping,\n TBranchChunkInput,\n TBranchChunkOutput,\n THeadEncodeDataInput,\n THeadDecodeDataOutput,\n THeadEncodeChunkInput,\n THeadDecodeChunkOutput,\n TLastDecodeDataInput,\n TLastEncodeDataOutput,\n TLastDecodeChunkInput,\n TLastEncodeChunkOutput,\n TBranchHasPersist\n> {\n public constructor() {\n branchStates.set(this, {\n middlewares: [],\n destinations: [],\n });\n }\n\n /**\n * この分岐の構築状態を取得します。\n *\n * @returns 構築状態を返します。\n */\n #branchState(): BranchState {\n const state = branchStates.get(this);\n\n if (state === undefined) {\n throw new Error(\"分岐の構築状態が見つかりません。\");\n }\n\n return state;\n }\n\n public fork<\n TSubChunkInput,\n TSubChunkOutput,\n TSubHeadEncodeDataInput,\n TSubHeadDecodeDataOutput,\n TSubHeadEncodeChunkInput,\n TSubHeadDecodeChunkOutput,\n TSubLastDecodeDataInput,\n TSubLastEncodeDataOutput,\n TSubLastDecodeChunkInput,\n TSubLastEncodeChunkOutput,\n TSubHasPersist extends boolean,\n >(\n branch: IUniKvsBranch<\n any,\n TSubChunkInput,\n TSubChunkOutput,\n TSubHeadEncodeDataInput,\n TSubHeadDecodeDataOutput,\n TSubHeadEncodeChunkInput,\n TSubHeadDecodeChunkOutput,\n TSubLastDecodeDataInput,\n TSubLastEncodeDataOutput,\n TSubLastDecodeChunkInput,\n TSubLastEncodeChunkOutput,\n TSubHasPersist\n > &\n (TSubHasPersist extends true\n ? $CheckForkEncodeData<TLastEncodeDataOutput, TSubHeadEncodeDataInput>\n : unknown) &\n (TSubHasPersist extends true\n ? $CheckForkDecodeData<TLastDecodeDataInput, TSubHeadDecodeDataOutput>\n : unknown) &\n (TSubHasPersist extends true\n ? $CheckForkEncodeChunk<TLastEncodeChunkOutput, TSubHeadEncodeChunkInput>\n : unknown) &\n (TSubHasPersist extends true\n ? $CheckForkDecodeChunk<TLastDecodeChunkInput, TSubHeadDecodeChunkOutput>\n : unknown),\n ): IUniKvsBranch<\n TKeyValueMapping,\n TSubHasPersist extends true\n ? [TBranchChunkInput] extends [never]\n ? never\n : [TSubChunkInput] extends [never]\n ? never\n : TBranchChunkInput\n : TBranchChunkInput,\n TSubHasPersist extends true\n ? [TBranchChunkOutput] extends [never]\n ? never\n : [TSubChunkOutput] extends [never]\n ? never\n : TBranchChunkOutput\n : TBranchChunkOutput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadEncodeDataInput> extends true\n ? TSubHeadEncodeDataInput\n : THeadEncodeDataInput\n : THeadEncodeDataInput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadDecodeDataOutput> extends true\n ? TSubHeadDecodeDataOutput\n : THeadDecodeDataOutput\n : THeadDecodeDataOutput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadEncodeChunkInput> extends true\n ? TSubHeadEncodeChunkInput\n : THeadEncodeChunkInput\n : THeadEncodeChunkInput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadDecodeChunkOutput> extends true\n ? TSubHeadDecodeChunkOutput\n : THeadDecodeChunkOutput\n : THeadDecodeChunkOutput,\n TLastDecodeDataInput,\n TLastEncodeDataOutput,\n TLastDecodeChunkInput,\n TLastEncodeChunkOutput,\n TBranchHasPersist extends true ? true : TSubHasPersist\n >;\n public fork(branch: IUniKvsBranch): IUniKvsBranch {\n const state = this.#branchState();\n appendForkDestinations(state.destinations, state.middlewares, branch);\n\n return this;\n }\n\n public use<\n TMiddleware extends IMiddleware<\n [TLastEncodeDataOutput] extends [never] ? any : TLastEncodeDataOutput,\n any,\n [TLastEncodeChunkOutput] extends [never] ? any : TLastEncodeChunkOutput\n >,\n >(\n middleware: TMiddleware,\n ): IUniKvsBranch<\n TKeyValueMapping,\n [TBranchChunkInput] extends [never]\n ? never\n : [$InferDecodeChunkInput<TMiddleware>] extends [never]\n ? never\n : TBranchChunkInput,\n [TBranchChunkOutput] extends [never]\n ? never\n : [$InferEncodeChunkOutput<TMiddleware>] extends [never]\n ? never\n : TBranchChunkOutput,\n $IsUnknown<THeadEncodeDataInput> extends true\n ? $InferEncodeDataInput<TMiddleware>\n : THeadEncodeDataInput,\n $IsUnknown<THeadDecodeDataOutput> extends true\n ? $InferDecodeDataOutput<TMiddleware>\n : THeadDecodeDataOutput,\n $IsUnknown<THeadEncodeChunkInput> extends true\n ? $InferEncodeChunkInput<TMiddleware>\n : THeadEncodeChunkInput,\n $IsUnknown<THeadDecodeChunkOutput> extends true\n ? $InferDecodeChunkOutput<TMiddleware>\n : THeadDecodeChunkOutput,\n $InferDecodeDataInput<TMiddleware>,\n $InferEncodeDataOutput<TMiddleware>,\n $InferDecodeChunkInput<TMiddleware>,\n $InferEncodeChunkOutput<TMiddleware>,\n TBranchHasPersist\n >;\n public use(middleware: IMiddleware): IUniKvsBranch {\n const state = this.#branchState();\n state.middlewares.push(UniKvsMiddleware.from(middleware));\n\n return this;\n }\n\n public persist<\n TStorage extends IStorage<\n [TLastEncodeDataOutput] extends [never] ? any : TLastEncodeDataOutput,\n [TLastDecodeDataInput] extends [never] ? any : TLastDecodeDataInput,\n [TLastEncodeChunkOutput] extends [never] ? any : TLastEncodeChunkOutput,\n [TLastDecodeChunkInput] extends [never] ? any : TLastDecodeChunkInput\n >,\n >(\n storage: TStorage,\n ): IUniKvsBranch<\n TKeyValueMapping,\n [TBranchChunkInput] extends [never]\n ? never\n : [$InferWriteChunkInput<TStorage>] extends [never]\n ? never\n : TBranchChunkInput,\n [TBranchChunkOutput] extends [never]\n ? never\n : [$InferReadChunkOutput<TStorage>] extends [never]\n ? never\n : TBranchChunkOutput,\n $IsUnknown<THeadEncodeDataInput> extends true\n ? $InferWriteDataInput<TStorage>\n : THeadEncodeDataInput,\n $IsUnknown<THeadDecodeDataOutput> extends true\n ? $InferReadDataOutput<TStorage>\n : THeadDecodeDataOutput,\n $IsUnknown<THeadEncodeChunkInput> extends true\n ? $InferWriteChunkInput<TStorage>\n : THeadEncodeChunkInput,\n $IsUnknown<THeadDecodeChunkOutput> extends true\n ? $InferReadChunkOutput<TStorage>\n : THeadDecodeChunkOutput,\n TLastDecodeDataInput,\n TLastEncodeDataOutput,\n TLastDecodeChunkInput,\n TLastEncodeChunkOutput,\n true\n >;\n public persist(storage: IStorage): IUniKvsBranch {\n const state = this.#branchState();\n state.destinations.push({\n storage: UniKvsStorage.from(storage),\n // 登録時点のチェーンをスナップショットして保持するため、以降の use はこの登録に影響しません。\n middlewares: [...state.middlewares],\n });\n\n return this;\n }\n}\n","import {\n type IGetContext,\n type IHasContext,\n type ISetContext,\n type IOpenContext,\n type IClearContext,\n type ICloseContext,\n type IActionContext,\n type IDecodeContext,\n type IDeleteContext,\n type IEncodeContext,\n type IMapKeyContext,\n type IStreamContext,\n type IReadableStream,\n type IPipelineContext,\n type ILifecycleContext,\n type ITransformContext,\n type IKeyedActionContext,\n type IDecodeStreamContext,\n type IEncodeStreamContext,\n type ITransformDataContext,\n type ITransformStreamContext,\n ReadonlyVariableError,\n} from \"@unikvs/core\";\n\n/**\n * 実行時変数の 1 件分の形式です。\n */\nexport type VariablesEntry = readonly [name: string, value: unknown];\n\n/**\n * 実行時変数の初期値に使えるマップ形式です。\n *\n * レコードまたはエントリーの反復子を受け付けます。\n */\nexport type VariablesInit = Readonly<Record<string, unknown>> | Iterable<VariablesEntry>;\n\n/**\n * 実行時変数の初期値をエントリー列に正規化します。\n *\n * レコードは `Object.entries` で展開します。\n * 反復子はそのまま返します。\n *\n * @param vars 初期値です。\n *\n * @returns エントリー列を返します。\n */\nfunction normalizeVariablesInit(vars: VariablesInit | undefined): Iterable<VariablesEntry> {\n if (!vars) {\n return [];\n }\n\n if (Symbol.iterator in vars) {\n return vars;\n }\n\n return Object.entries(vars);\n}\n\n/**\n * 複数のコンテキスト間で共有される変数ストアです。\n *\n * オニオン実行では操作内の全コンテキストが同一ストアを参照します。\n * 下流の `set` を上流が `await next()` の後に `get` で参照できます。\n */\nexport type VariablesStore = {\n /**\n * 変数のマップです。\n */\n readonly data: Map<string, unknown>;\n\n /**\n * 読み取り専用の変数名の集合です。\n */\n readonly readonly: Set<string>;\n};\n\n/**\n * 新しい空の変数ストアを作成します。\n *\n * @param vars 初期値です。\n *\n * @returns 空ストアを返します。\n */\nexport function createVariablesStore(\n vars: readonly VariablesEntry[] | undefined = [],\n): VariablesStore {\n return {\n data: new Map(vars),\n readonly: new Set(),\n };\n}\n\n/**\n * `PipelineContext` の初期値です。\n */\ntype PipelineContextInit = {\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n};\n\n/**\n * 実行時変数を保持する基底コンテキストです。\n */\nclass PipelineContext implements IPipelineContext {\n /**\n * 変数のマップです。共有ストアの参照である場合があります。\n */\n readonly #data: Map<string, unknown>;\n\n /**\n * 読み取り専用の変数名の集合です。共有ストアの参照である場合があります。\n */\n readonly #readonly: Set<string>;\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: PipelineContextInit) {\n const { store } = init;\n\n if (store) {\n // 共有ストアを参照し、下流の変更が上流に見えるようにします。\n this.#data = store.data;\n this.#readonly = store.readonly;\n } else {\n this.#data = new Map();\n this.#readonly = new Set();\n }\n\n const vars = normalizeVariablesInit(init.vars);\n\n for (const [name, value] of vars) {\n this.#data.set(name, value);\n }\n }\n\n /**\n * 変数の値を読み取ります。\n *\n * @param name 変数名です。\n *\n * @returns 変数の値を返します。\n */\n public get(name: string): unknown {\n return this.#data.get(name);\n }\n\n /**\n * 変数の値を書き込みます。\n *\n * @param name 変数名です。\n * @param value 設定する値です。\n *\n * @returns 自身を返します。\n */\n public set(name: string, value: unknown): this {\n if (this.#readonly.has(name)) {\n throw new ReadonlyVariableError({ name });\n }\n\n this.#data.set(name, value);\n\n return this;\n }\n\n /**\n * 変数の値を設定し、読み取り専用にします。\n *\n * @param name 変数名です。\n * @param value 設定する値です。\n *\n * @returns 自身を返します。\n */\n public setReadonly(name: string, value: unknown): this {\n if (this.#readonly.has(name)) {\n throw new ReadonlyVariableError({ name });\n }\n\n this.#data.set(name, value);\n this.#readonly.add(name);\n\n return this;\n }\n}\n\n/**\n * `MapKeyContext` の初期値です。\n */\ntype MapKeyContextInit = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\nexport class MapKeyContext extends PipelineContext implements IMapKeyContext {\n /**\n * 対象のキーです。\n */\n public readonly key: string;\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: MapKeyContextInit) {\n const { key, vars, store } = init;\n super({\n vars,\n store,\n });\n this.key = key;\n }\n}\n\n/**\n * `ActionContext` の初期値です。\n */\ntype ActionContextInit<TAction extends IActionContext[\"action\"]> = {\n /**\n * 実行する操作の種別です。\n */\n readonly action: TAction;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\nclass ActionContext<const TAction extends IActionContext[\"action\"]>\n extends PipelineContext\n implements IActionContext\n{\n /**\n * 実行する操作の種別です。\n */\n public readonly action: TAction;\n\n /**\n * 中断を知らせるシグナルです。\n */\n public readonly signal: AbortSignal;\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: ActionContextInit<TAction>) {\n const { vars, store, action, signal } = init;\n super({\n vars,\n store,\n });\n this.action = action;\n this.signal = signal;\n }\n}\n\nclass LifecycleContext<const TAction extends ILifecycleContext[\"action\"]>\n extends ActionContext<TAction>\n implements ILifecycleContext {}\n\n/**\n * `OpenContext` の初期値です。\n */\ntype OpenContextInit = {\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 開始処理のコンテキストです。\n */\nexport class OpenContext extends LifecycleContext<\"open\"> implements IOpenContext {\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: OpenContextInit) {\n super({\n ...init,\n action: \"open\",\n });\n }\n}\n\n/**\n * `CloseContext` の初期値です。\n */\ntype CloseContextInit = {\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 終了処理のコンテキストです。\n */\nexport class CloseContext extends LifecycleContext<\"close\"> implements ICloseContext {\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: CloseContextInit) {\n super({\n ...init,\n action: \"close\",\n });\n }\n}\n\n/**\n * `KeyedActionContext` の初期値です。\n */\ntype KeyedActionContextInit<TAction extends IKeyedActionContext[\"action\"]> = {\n /**\n * 実行する操作の種別です。\n */\n readonly action: TAction;\n\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\nclass KeyedActionContext<TAction extends IKeyedActionContext[\"action\"]>\n extends ActionContext<TAction>\n implements IKeyedActionContext\n{\n /**\n * 対象のキーです。\n */\n public readonly key: string;\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: KeyedActionContextInit<TAction>) {\n const { key, ...superInit } = init;\n super(superInit);\n this.key = key;\n }\n}\n\n/**\n * `SetContext` の初期値です。\n */\ntype SetContextInit = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 書き込み処理のコンテキストです。\n */\nexport class SetContext extends KeyedActionContext<\"set\"> implements ISetContext {\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: SetContextInit) {\n super({\n ...init,\n action: \"set\",\n });\n }\n}\n\n/**\n * `GetContext` の初期値です。\n */\ntype GetContextInit = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 修復の条件です。\n *\n * 省略時は修復しません。\n */\n readonly repair?: IGetContext[\"repair\"] | undefined;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 読み取り処理のコンテキストです。\n */\nexport class GetContext extends KeyedActionContext<\"get\"> implements IGetContext {\n /**\n * 修復の条件です。\n */\n public readonly repair: IGetContext[\"repair\"];\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: GetContextInit) {\n const {\n repair = {\n enabled: false,\n targets: [],\n },\n ...superInit\n } = init;\n super({\n ...superInit,\n action: \"get\",\n });\n this.repair = repair;\n }\n}\n\n/**\n * `StreamContext` の初期値です。\n */\ntype StreamContextInit = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 修復の条件です。\n *\n * 省略時は修復しません。\n */\n readonly repair?: IStreamContext[\"repair\"] | undefined;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * ストリーム処理のコンテキストです。\n */\nexport class StreamContext extends KeyedActionContext<\"stream\"> implements IStreamContext {\n /**\n * 修復の条件です。\n */\n public readonly repair: IStreamContext[\"repair\"];\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: StreamContextInit) {\n const {\n repair = {\n enabled: false,\n targets: [],\n },\n ...superInit\n } = init;\n super({\n ...superInit,\n action: \"stream\",\n });\n this.repair = repair;\n }\n}\n\n/**\n * `HasContext` の初期値です。\n */\ntype HasContextInit = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 存在確認のコンテキストです。\n */\nexport class HasContext extends KeyedActionContext<\"has\"> implements IHasContext {\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: HasContextInit) {\n super({\n ...init,\n action: \"has\",\n });\n }\n}\n\n/**\n * `DeleteContext` の初期値です。\n */\ntype DeleteContextInit = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 削除処理のコンテキストです。\n */\nexport class DeleteContext extends KeyedActionContext<\"delete\"> implements IDeleteContext {\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: DeleteContextInit) {\n super({\n ...init,\n action: \"delete\",\n });\n }\n}\n\n/**\n * `ClearContext` の初期値です。\n */\ntype ClearContextInit = {\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 全削除のコンテキストです。\n */\nexport class ClearContext extends ActionContext<\"clear\"> implements IClearContext {\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: ClearContextInit) {\n super({\n ...init,\n action: \"clear\",\n });\n }\n}\n\n/**\n * `TransformContext` の初期値です。\n */\ntype TransformContextInit<TAction extends ITransformContext[\"action\"], TSource = any> = {\n /**\n * 実行する操作の種別です。\n */\n readonly action: TAction;\n\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 変換前の値です。\n */\n readonly source: TSource;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 値変換の基底コンテキストです。\n */\nclass TransformContext<\n const TAction extends ITransformContext[\"action\"],\n TSource = any,\n TDestination = TSource,\n>\n extends KeyedActionContext<TAction>\n implements ITransformContext<TSource, TDestination>\n{\n /**\n * 変換前の値です。\n */\n public readonly source: TSource;\n\n /**\n * 変換後の値です。\n *\n * ミドルウェアが設定します。\n * 存在しない場合は未設定を表します。\n * `next` の実行後は凍結され、読み取りはできますが設定すると `MiddlewareDestinationFrozenError` を投げます。\n */\n public destination?: TDestination;\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: TransformContextInit<TAction, TSource>) {\n const { source, ...superInit } = init;\n super(superInit);\n this.source = source;\n }\n}\n\n/**\n * データ変換の基底コンテキストです。\n */\nclass TransformDataContext<\n const TAction extends ITransformDataContext[\"action\"],\n TSourceData = any,\n TDestinationData = TSourceData,\n>\n extends TransformContext<TAction, TSourceData, TDestinationData>\n implements ITransformDataContext<TSourceData, TDestinationData> {}\n\n/**\n * `EncodeContext` の初期値です。\n */\ntype EncodeContextInit<TRawData = any> = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 変換前の値です。\n */\n readonly source: TRawData;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 符号化のコンテキストです。\n */\nexport class EncodeContext<TRawData = any, TEncodedData = TRawData>\n extends TransformDataContext<\"set\", TRawData, TEncodedData>\n implements IEncodeContext<TRawData, TEncodedData>\n{\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: EncodeContextInit<TRawData>) {\n super({\n ...init,\n action: \"set\",\n });\n }\n}\n\n/**\n * `DecodeContext` の初期値です。\n */\ntype DecodeContextInit<TRawData = any> = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 変換前の値です。\n */\n readonly source: TRawData;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 復号のコンテキストです。\n */\nexport class DecodeContext<TRawData = any, TDecodedData = TRawData>\n extends TransformDataContext<\"get\", TRawData, TDecodedData>\n implements IDecodeContext<TRawData, TDecodedData>\n{\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: DecodeContextInit<TRawData>) {\n super({\n ...init,\n action: \"get\",\n });\n }\n}\n\n/**\n * ストリーム変換の基底コンテキストです。\n */\nclass TransformStreamContext<\n TAction extends ITransformStreamContext[\"action\"],\n TSourceChunk = any,\n TDestinationChunk = TSourceChunk,\n>\n extends TransformContext<\n TAction,\n IReadableStream<TSourceChunk>,\n IReadableStream<TDestinationChunk>\n >\n implements ITransformStreamContext<TSourceChunk, TDestinationChunk> {}\n\n/**\n * `EncodeStreamContext` の初期値です。\n */\ntype EncodeStreamContextInit<TRawChunk = any> = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 変換前のストリームです。\n */\n readonly source: IReadableStream<TRawChunk>;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * ストリーム符号化のコンテキストです。\n */\nexport class EncodeStreamContext<TRawChunk = any, TEncodedChunk = TRawChunk>\n extends TransformStreamContext<\"set\", TRawChunk, TEncodedChunk>\n implements IEncodeStreamContext<TRawChunk, TEncodedChunk>\n{\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: EncodeStreamContextInit<TRawChunk>) {\n super({\n ...init,\n action: \"set\",\n });\n }\n}\n\n/**\n * `DecodeStreamContext` の初期値です。\n */\ntype DecodeStreamContextInit<TRawChunk = any> = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 変換前のストリームです。\n */\n readonly source: IReadableStream<TRawChunk>;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * ストリーム復号のコンテキストです。\n */\nexport class DecodeStreamContext<TRawChunk = any, TDecodedChunk = TRawChunk>\n extends TransformStreamContext<\"stream\", TRawChunk, TDecodedChunk>\n implements IDecodeStreamContext<TRawChunk, TDecodedChunk>\n{\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: DecodeStreamContextInit<TRawChunk>) {\n super({\n ...init,\n action: \"stream\",\n });\n }\n}\n","import { type Logger, getLogger } from \"@logtape/logtape\";\n\n// 既定のロガーです。\nexport const logger: Logger = getLogger(\"unikvs\");\n\n// 書き戻しに関する警告専用のロガーです。\nexport const repairLogger: Logger = getLogger([\"@unikvs/*\", \"@unikvs/allow-repair\"]);\n","import { type IReadableStream, type ITransformContext } from \"@unikvs/core\";\n\nimport {\n type DecodeContext,\n type EncodeContext,\n type DecodeStreamContext,\n type EncodeStreamContext,\n MapKeyContext,\n} from \"./_contexts.js\";\nimport type UniKvsMiddleware from \"./_middleware.js\";\nimport type {\n PipelineLeaf,\n PipelineNode,\n PipelineEntry,\n OperationScope,\n IActiveLeafChecker,\n} from \"./_pipeline-graph.types.js\";\nimport { ReadableStreamSchema } from \"./_streams.schemas.js\";\nimport { parseOutput } from \"./_valibot.js\";\nimport { MiddlewareDestinationFrozenError, MiddlewareDestinationMissingError } from \"./errors.js\";\n\n/**\n * 対象判定に通る葉だけを登録順に絞ります。\n *\n * 全葉が対象なら複製せず `node.allLeaves` を返します。\n *\n * @param node 対象の節です。\n * @param isActive 書き込み対象とする葉を判定します。\n *\n * @returns 対象の葉を登録順に返します。\n */\nexport function activeLeavesOf(\n node: PipelineNode,\n isActive: IActiveLeafChecker,\n): readonly PipelineLeaf[] {\n const active = node.allLeaves.filter(isActive);\n\n if (active.length === node.allLeaves.length) {\n return node.allLeaves;\n }\n\n return active;\n}\n\n/**\n * 葉と節を登録順に並べた静的な項目列を作成します。\n *\n * 各操作の走査はこの並びをそのまま読みます。\n * 並べ替え用の順序は項目に保持せず、作成時のローカル変数で解決します。\n *\n * @param leaves この節で終端する葉です。\n * @param children 子の節です。\n *\n * @returns 登録順に並べた項目列を返します。\n */\nexport function createEntries(\n leaves: readonly PipelineLeaf[],\n children: readonly PipelineNode[],\n): PipelineEntry[] {\n return [\n ...leaves.map((leaf) => ({\n entry: {\n kind: \"leaf\" as const,\n leaf,\n },\n order: leaf.index,\n })),\n ...children.map((child) => {\n const [firstLeaf] = child.allLeaves;\n\n if (firstLeaf === undefined) {\n throw new Error(\"子節に葉が存在しません。\");\n }\n\n return {\n entry: {\n kind: \"node\" as const,\n node: child,\n },\n order: firstLeaf.index,\n };\n }),\n ]\n .toSorted((a, b) => a.order - b.order)\n .map((item) => item.entry);\n}\n\n/**\n * 変換後のデータが設定されていることを検証し、変換後のデータを返します。\n *\n * ミドルウェアが `destination` を設定しなかったときに投げます。\n *\n * @param middleware 対象のミドルウェアです。\n * @param ctx 検証するコンテキストです。\n * @param operation エラーに付与する操作名です。\n *\n * @returns 変換後のデータを返します。\n */\nexport function requireDestination(\n middleware: UniKvsMiddleware,\n ctx: EncodeContext | DecodeContext | EncodeStreamContext | DecodeStreamContext,\n operation: \"encode\" | \"decode\",\n): unknown {\n if (\"destination\" in ctx) {\n return ctx.destination;\n }\n\n throw new MiddlewareDestinationMissingError({\n name: middleware.name,\n operation,\n });\n}\n\n/**\n * 変換後のストリームが設定されていることを検証し、型を検証したストリームを返します。\n *\n * ミドルウェアが `destination` を設定しなかったときに投げます。\n * ストリームの場合は存在確認に加えて `ReadableStream` の型も検証します。\n *\n * @param middleware 対象のミドルウェアです。\n * @param ctx 検証するコンテキストです。\n * @param operation エラーに付与する操作名です。\n *\n * @returns 変換後のストリームを返します。\n */\nexport function requireStreamDestination(\n middleware: UniKvsMiddleware,\n ctx: EncodeStreamContext | DecodeStreamContext,\n operation: \"encode\" | \"decode\",\n): IReadableStream {\n const destination = requireDestination(middleware, ctx, operation);\n\n return parseOutput(ReadableStreamSchema, destination);\n}\n\n/**\n * コンテキストの `destination` を凍結します。\n *\n * パイプラインの `next` から同期的に呼び出します。\n * 凍結後の読み取りはできますが、書き込むと `MiddlewareDestinationFrozenError` を投げます。\n *\n * @param ctx 凍結するコンテキストです。\n */\nexport function freezeDestination(ctx: ITransformContext): void {\n const { destination } = ctx;\n Object.defineProperty(ctx, \"destination\", {\n get() {\n return destination;\n },\n set() {\n throw new MiddlewareDestinationFrozenError({\n key: ctx.key,\n action: ctx.action,\n });\n },\n enumerable: true,\n configurable: true,\n });\n}\n\n/**\n * 単一ミドルウェアの `mapKey` を実行します。\n *\n * 共有ストアを参照するため、カスタム変数の下流変更が写像にも見えます。\n *\n * @param middleware 対象のミドルウェアです。\n * @param key 写像前のキーです。\n * @param scope 操作共通の実行時情報です。\n *\n * @returns 写像後のキーを返します。\n */\nexport function applyMapKey(\n middleware: UniKvsMiddleware,\n key: string,\n scope: OperationScope,\n): string {\n const c = new MapKeyContext({\n key,\n store: scope.store,\n });\n\n return middleware.mapKey(c);\n}\n","import { applyMapKey } from \"./_pipeline-graph.helpers.js\";\nimport type {\n PipelineLeaf,\n PipelineNode,\n ResolvedLeaf,\n OperationScope,\n} from \"./_pipeline-graph.types.js\";\n\n/**\n * 単一操作のスコープで葉の写像キーを解決します。\n *\n * 新 `mapKey` は同期的であり、中断シグナルも受け付けないため、共有節の写像は操作内で 1 回だけ実行され、結果を使い回します。\n * 並行解決でも `Map` キャッシュにより重複しません (`resolve` 自体が同期的であるため、競合しません)。\n */\nexport class LeafResolver {\n /**\n * 根のキーです。\n */\n readonly #rootKey: string;\n\n /**\n * 操作共通の実行時情報です (共有ストアを含みます)。\n */\n readonly #scope: OperationScope;\n\n /**\n * 節ごとの解決結果のキャッシュです。\n */\n readonly #nodeCache: Map<PipelineNode, string>;\n\n /**\n * 通常は `PipelineGraph.createResolver` から生成します。\n *\n * @param scope 操作共通の実行時情報です。\n */\n public constructor(scope: OperationScope) {\n this.#rootKey = scope.key;\n this.#scope = scope;\n this.#nodeCache = new Map();\n }\n\n /**\n * 葉の写像キーを解決します。\n *\n * @param leaf 解決する葉です。\n *\n * @returns 解決済みの葉を返します。\n */\n public resolve(leaf: PipelineLeaf): ResolvedLeaf {\n let key = this.#rootKey;\n\n for (const node of leaf.path) {\n const cached = this.#nodeCache.get(node);\n\n if (cached !== undefined) {\n key = cached;\n continue;\n }\n\n const mapped = applyMapKey(node.middleware, key, this.#scope);\n this.#nodeCache.set(node, mapped);\n key = mapped;\n }\n\n return {\n key,\n leaf,\n };\n }\n}\n","import { type IReadableStream, RepairNotAllowedError } from \"@unikvs/core\";\n\nimport {\n DecodeContext,\n EncodeContext,\n DecodeStreamContext,\n EncodeStreamContext,\n} from \"./_contexts.js\";\nimport { logger, repairLogger } from \"./_logger.js\";\nimport type UniKvsMiddleware from \"./_middleware.js\";\nimport {\n applyMapKey,\n createEntries,\n activeLeavesOf,\n freezeDestination,\n requireDestination,\n requireStreamDestination,\n} from \"./_pipeline-graph.helpers.js\";\nimport type {\n MutableNode,\n EncodeTarget,\n PipelineLeaf,\n PipelineNode,\n PipelineEntry,\n OperationScope,\n StreamEncodeTree,\n StreamEncodeTarget,\n PipelineDestination,\n BuildEncodeTreeOptions,\n} from \"./_pipeline-graph.types.js\";\nimport { LeafResolver } from \"./_pipeline-leaf-resolver.js\";\nimport { cancelStreams } from \"./_streams.js\";\nimport {\n MiddlewareNextNotCalledError,\n MiddlewareNextNotAwaitedError,\n MiddlewareDestinationFrozenError,\n MiddlewareDestinationMissingError,\n MiddlewareNextCalledMultipleTimesError,\n} from \"./errors.js\";\n\n/**\n * 節を前順で列挙するための再帰ヘルパーです。\n *\n * @param node 列挙を開始する節です。\n *\n * @yields 前順の節です。\n */\nfunction* visit(node: PipelineNode): IterableIterator<PipelineNode> {\n yield node;\n for (const entry of node.entries) {\n if (entry.kind === \"node\") {\n yield* visit(entry.node);\n }\n }\n}\n\n/**\n * 直通区間をまとめて葉名簿と全葉を確定します。\n *\n * @param node 確定する節です。\n */\nfunction finalize(node: MutableNode): void {\n // 直通の節は子の葉名簿と全葉を共有します。\n if (node.leaves.length === 0 && node.children.length === 1) {\n const [child] = node.children;\n\n if (child === undefined) {\n throw new Error(\"直通区間の子節が存在しません。\");\n }\n\n finalize(child);\n node.entries = [\n {\n kind: \"node\",\n node: child,\n },\n ];\n node.allLeaves = child.allLeaves;\n node.leafNames = child.leafNames;\n } else {\n const leaves = [...node.leaves];\n\n for (const child of node.children) {\n finalize(child);\n leaves.push(...child.allLeaves);\n }\n\n leaves.sort((a, b) => a.index - b.index);\n\n const [singleLeaf] = leaves;\n\n node.entries = createEntries(node.leaves, node.children);\n node.allLeaves = leaves;\n if (leaves.length === 1 && singleLeaf !== undefined) {\n node.leafNames = singleLeaf.nameNames;\n } else {\n node.leafNames = Object.freeze(leaves.map((leaf) => leaf.name));\n }\n }\n}\n\n/**\n * コンパイル済みのパイプライン・グラフです。\n *\n * 宛先の変換チェーンをミドルウェアのインスタンス同一性で共有する根付き木として保持し、操作ごとの走査・エンコード・書き戻し・ストリーム構築を提供します。\n *\n * 不変条件 :\n * - 葉(`leaves`)と各節の項目(`entries`)は宛先の登録順です。\n * - 名簿(`leafNames` / `nameNames`)は凍結された配列で、直通区間では参照を共有します。\n * - 共有節は 1 操作内で 1 回だけ `encode`/`encodeStream`/`mapKey` を実行します。分岐点ではプレーン値のエンコード結果を共有し、ストリームは tee で分岐します。\n * - 書き戻しの拒否は、走査中と書き込み中の 2 経路で分類します。いずれも即時に確定します。\n */\n\nexport class PipelineGraph {\n /**\n * 全葉です。\n * 登録順に保持します。\n */\n readonly #leaves: readonly PipelineLeaf[];\n\n /**\n * 根直下の葉と節を登録順に列挙した静的な項目列です。\n */\n readonly #entries: readonly PipelineEntry[];\n\n /**\n * `open`/`close`/`use` の対象となるミドルウェアです。初出順に保持します。\n */\n readonly #middlewares: readonly UniKvsMiddleware[];\n\n /**\n * 全葉数が 1 件かどうかです。\n */\n readonly #isSingleLeaf: boolean;\n\n private constructor(\n leaves: readonly PipelineLeaf[],\n entries: readonly PipelineEntry[],\n middlewares: readonly UniKvsMiddleware[],\n ) {\n this.#leaves = leaves;\n this.#entries = entries;\n this.#middlewares = middlewares;\n this.#isSingleLeaf = leaves.length === 1;\n }\n\n /**\n * 宛先定義の列を trie にコンパイルします。\n *\n * ミドルウェアはインスタンス同一性で共有します。同一インスタンスが複数の節に現れても、`open`/`close`/`use` の対象には初出の 1 件だけを保持します。\n *\n * @param destinations コンパイルする宛先定義です。\n *\n * @returns コンパイル済みのパイプライン・グラフを返します。\n */\n public static compile(destinations: readonly PipelineDestination[]): PipelineGraph {\n const rootLeaves: PipelineLeaf[] = [];\n const rootChildren: MutableNode[] = [];\n const allLeaves: PipelineLeaf[] = [];\n const middlewares: UniKvsMiddleware[] = [];\n const seenMiddlewares = new Set<UniKvsMiddleware>();\n\n for (const dest of destinations) {\n // 葉の index は登録順のもとです。名簿・書き込み順・エラー識別の基準になります。\n const index = allLeaves.length;\n const name = dest.storage.name;\n const path: PipelineNode[] = [];\n let parent: MutableNode | null = null;\n let canRepair = false;\n\n let siblings = rootChildren;\n\n for (const middleware of dest.middlewares) {\n // 共有はインスタンス同一性だけで判定し、同構造でも別インスタンスは共有しません。\n let node = siblings.find((candidate) => candidate.middleware === middleware);\n\n if (node === undefined) {\n node = {\n leaves: [],\n entries: [],\n children: [],\n allLeaves: [],\n leafNames: [],\n middleware,\n };\n siblings.push(node);\n\n // open/close/use の重複実行を避けるため、初出のインスタンスだけを保持します。\n if (!seenMiddlewares.has(middleware)) {\n seenMiddlewares.add(middleware);\n middlewares.push(middleware);\n }\n }\n // canRepair は経路上の AllowRepair の有無の論理和で、葉ごとに確定します。\n if (middleware.name === \"AllowRepair\") {\n canRepair = true;\n }\n\n path.push(node);\n parent = node;\n siblings = node.children;\n }\n\n const leaf: PipelineLeaf = {\n name,\n path,\n index,\n storage: dest.storage,\n canRepair,\n nameNames: Object.freeze([name]),\n };\n\n if (parent === null) {\n rootLeaves.push(leaf);\n } else {\n parent.leaves.push(leaf);\n }\n\n allLeaves.push(leaf);\n }\n\n for (const child of rootChildren) {\n finalize(child);\n }\n\n let rootEntries: readonly PipelineEntry[];\n let rootAllLeaves: readonly PipelineLeaf[];\n\n if (rootLeaves.length === 0 && rootChildren.length === 1) {\n const [child] = rootChildren;\n\n if (child === undefined) {\n throw new Error(\"根直下の子節が存在しません。\");\n }\n\n rootEntries = [\n {\n kind: \"node\",\n node: child,\n },\n ];\n rootAllLeaves = child.allLeaves;\n } else {\n const collected = [...rootLeaves];\n\n for (const child of rootChildren) {\n collected.push(...child.allLeaves);\n }\n\n rootEntries = createEntries(rootLeaves, rootChildren);\n rootAllLeaves = collected.toSorted((a, b) => a.index - b.index);\n }\n\n return new PipelineGraph(rootAllLeaves, rootEntries, middlewares);\n }\n\n /**\n * 全葉です。登録順に保持します。\n */\n public get leaves(): readonly PipelineLeaf[] {\n return this.#leaves;\n }\n\n /**\n * `open`/`close`/`use` の対象となるミドルウェアです。\n * 初出順・重複なしです。\n */\n public get middlewares(): readonly UniKvsMiddleware[] {\n return this.#middlewares;\n }\n\n /**\n * 全葉数が 1 件かどうかです。\n */\n public get isSingleLeaf(): boolean {\n return this.#isSingleLeaf;\n }\n\n /**\n * 葉数です。\n */\n public get size(): number {\n return this.#leaves.length;\n }\n\n /**\n * 葉を登録順に列挙します。\n */\n public [Symbol.iterator](): IterableIterator<PipelineLeaf> {\n return this.#leaves[Symbol.iterator]();\n }\n\n /**\n * 節を根から前順 (親が子より前、兄弟は登録順) に列挙します。\n *\n * 構造の確認・保守用です。操作の走査には使用しません。\n *\n * @yields 前順の節です。\n */\n public *nodes(): IterableIterator<PipelineNode> {\n for (const entry of this.#entries) {\n if (entry.kind === \"node\") {\n yield* visit(entry.node);\n }\n }\n }\n\n /**\n * 単一操作のスコープでキー写像をメモ化するリゾルバーを生成します。\n *\n * 新 `mapKey` は同期的であるため、リゾルバーも同期的です。共有節の写像は操作内で 1 回だけ実行されます。\n *\n * @param key 根のキー (論理キー) です。\n * @param vars 根の実行時変数です。\n *\n * @returns 葉リゾルバーを返します。\n */\n public createResolver(scope: OperationScope): LeafResolver {\n return new LeafResolver(scope);\n }\n\n /**\n * 葉の経路のミドルウェアを逆順に適用してデータをデコードします。\n *\n * 各段の前後で中断を確認します。\n *\n * @param leaf デコード元の葉です。\n * @param scope 操作共通の実行時情報です。`key` は論理キーです。\n * @param data デコードするデータです。\n *\n * @returns デコード済みのデータを返します。\n */\n public async decode(leaf: PipelineLeaf, scope: OperationScope, data: unknown): Promise<unknown> {\n // 経路を逆順 (葉→根) にネスト実行し、下流 (根側) の `set` が上流 (葉側) の `await next()` 後に見えるようにします。\n // データは外側から内側へ鎖状に渡し、最終結果を外側へ伝播させます。\n const reversed = leaf.path.toReversed();\n\n async function run(index: number, input: unknown): Promise<unknown> {\n const maybeNode = reversed[index];\n\n if (maybeNode === undefined) {\n return input;\n }\n\n const node: PipelineNode = maybeNode;\n\n const ctx = new DecodeContext({\n key: scope.key,\n store: scope.store,\n signal: scope.signal,\n source: input,\n });\n let downstreamResult: unknown;\n let hasDownstream = false;\n let nextCalled = false;\n let nextSettled = false;\n\n function next(): Promise<void> {\n if (nextCalled) {\n return Promise.reject(\n new MiddlewareNextCalledMultipleTimesError({\n name: node.middleware.name,\n operation: \"decode\",\n }),\n );\n }\n\n nextCalled = true;\n\n // next() の実行後、即座に destination の確認と凍結を行います。\n let decoded: unknown;\n\n try {\n decoded = requireDestination(node.middleware, ctx, \"decode\");\n freezeDestination(ctx);\n } catch (ex) {\n return Promise.reject(ex);\n }\n\n return Promise.try(async () => {\n try {\n downstreamResult = await run(index + 1, decoded);\n hasDownstream = true;\n } finally {\n nextSettled = true;\n }\n });\n }\n\n await node.middleware.decode(ctx, next);\n\n scope.signal.throwIfAborted();\n if (!nextCalled) {\n throw new MiddlewareNextNotCalledError({\n name: node.middleware.name,\n operation: \"decode\",\n });\n }\n\n if (!nextSettled) {\n throw new MiddlewareNextNotAwaitedError({\n name: node.middleware.name,\n operation: \"decode\",\n });\n }\n\n const destination = requireDestination(node.middleware, ctx, \"decode\");\n\n // 下流が実行されたときはその最終結果を返し、そうでなければ自らの出力を返す。\n // (下流の失敗を握り潰したミドルウェアでは自らの出力が最終となる。)。\n if (hasDownstream) {\n return downstreamResult;\n }\n\n return destination;\n }\n\n return run(0, data);\n }\n\n /**\n * 葉の経路のミドルウェアを逆順に `pipeThrough` してストリームをデコードします。\n *\n * @param leaf デコード元の葉です。\n * @param scope 操作共通の実行時情報です。`key` は論理キーです。\n * @param source 入力ストリームです。\n *\n * @returns デコード済みのストリームを返します。\n */\n public async decodeStream(\n leaf: PipelineLeaf,\n scope: OperationScope,\n source: IReadableStream,\n ): Promise<IReadableStream> {\n // 途中で失敗したときは構築済みのパイプを解放し、ソースストリームがロックされたまま残らないようにします。\n const pipes: IReadableStream[] = [];\n\n try {\n const reversed = leaf.path.toReversed();\n\n async function run(index: number, input: IReadableStream): Promise<IReadableStream> {\n const maybeNode = reversed[index];\n\n if (maybeNode === undefined) {\n return input;\n }\n\n const node: PipelineNode = maybeNode;\n\n const ctx = new DecodeStreamContext({\n key: scope.key,\n store: scope.store,\n signal: scope.signal,\n source: input,\n });\n let downstreamResult: IReadableStream | undefined;\n let nextCalled = false;\n let nextSettled = false;\n\n function next(): Promise<void> {\n if (nextCalled) {\n return Promise.reject(\n new MiddlewareNextCalledMultipleTimesError({\n name: node.middleware.name,\n operation: \"decode\",\n }),\n );\n }\n\n nextCalled = true;\n\n // next() の実行後、即座に destination の確認と凍結を行います。\n let decoded: IReadableStream;\n\n try {\n decoded = requireStreamDestination(node.middleware, ctx, \"decode\");\n freezeDestination(ctx);\n } catch (ex) {\n return Promise.reject(ex);\n }\n\n return Promise.try(async () => {\n try {\n downstreamResult = await run(index + 1, decoded);\n } finally {\n nextSettled = true;\n }\n });\n }\n\n try {\n await node.middleware.decodeStream(ctx, next);\n scope.signal.throwIfAborted();\n if (!nextCalled) {\n throw new MiddlewareNextNotCalledError({\n name: node.middleware.name,\n operation: \"decode\",\n });\n }\n\n if (!nextSettled) {\n throw new MiddlewareNextNotAwaitedError({\n name: node.middleware.name,\n operation: \"decode\",\n });\n }\n\n const output = requireStreamDestination(node.middleware, ctx, \"decode\");\n pipes.push(output);\n\n if (downstreamResult !== undefined) {\n return downstreamResult;\n }\n\n return output;\n } catch (ex) {\n // ミドルウェアが設定した destination は `pipes` に未登録のことがあるため、投げる前に解放対象へ加えます。\n // `source.pipeThrough(...)` で入力をロックした出力は、ここで収集しないと呼び出し側から解放できません。\n // abort 判定より前に加えることで、next() 完了後の abort でもロックした出力を解放できます。\n if (ctx.destination !== undefined) {\n pipes.push(ctx.destination);\n }\n\n throw ex;\n }\n }\n\n return await run(0, source);\n } catch (ex) {\n await cancelStreams(pipes, ex);\n throw ex;\n }\n }\n\n /**\n * 共有節を 1 回だけ実行しながら、全葉向けのプレーン値をエンコードします。\n *\n * エンコード中の失敗は生の例外として投げます。\n *\n * @param scope 操作共通の実行時情報です。`key` は論理キーです。\n * @param data エンコードするデータです。\n *\n * @returns 登録順のエンコード結果を返します。\n */\n public async encode(scope: OperationScope, data: unknown): Promise<EncodeTarget[]> {\n // 共有節は 1 回だけ encode し、得られた値は全分岐で参照を共有します(複製しません)。\n // オニオン実行により、下流の `set` が上流の `await next()` 後の `get` に見えます (共有ストアのため)。\n const targets: EncodeTarget[] = [];\n\n async function walk(node: PipelineNode, input: unknown, parentKey: string): Promise<void> {\n scope.signal.throwIfAborted();\n\n // 親コンテキストを共有ストアで作成し、`next` 内で子の入力として `destination` を参照します。\n // ミドルウェアは `destination` を設定してから `next` を呼ぶため、`next` 実行時点では親出力が確定しています。\n const ctx = new EncodeContext({\n key: scope.key,\n store: scope.store,\n signal: scope.signal,\n source: input,\n });\n let nodeKey = parentKey;\n let nextCalled = false;\n let nextSettled = false;\n\n function next(): Promise<void> {\n if (nextCalled) {\n return Promise.reject(\n new MiddlewareNextCalledMultipleTimesError({\n name: node.middleware.name,\n operation: \"encode\",\n }),\n );\n }\n\n nextCalled = true;\n\n // next() の実行後、即座に destination の確認と凍結を行います。\n let encoded: unknown;\n\n try {\n encoded = requireDestination(node.middleware, ctx, \"encode\");\n freezeDestination(ctx);\n } catch (ex) {\n return Promise.reject(ex);\n }\n\n return Promise.try(async () => {\n try {\n // `mapKey` は親出力確定後に、共有ストアで適用します。\n nodeKey = applyMapKey(node.middleware, parentKey, scope);\n for (const entry of node.entries) {\n if (entry.kind === \"node\") {\n await walk(entry.node, encoded, nodeKey);\n } else {\n targets.push({\n key: nodeKey,\n data: encoded,\n leaf: entry.leaf,\n });\n }\n }\n } finally {\n nextSettled = true;\n }\n });\n }\n\n await node.middleware.encode(ctx, next);\n\n scope.signal.throwIfAborted();\n if (!nextCalled) {\n throw new MiddlewareNextNotCalledError({\n name: node.middleware.name,\n operation: \"encode\",\n });\n }\n\n if (!nextSettled) {\n throw new MiddlewareNextNotAwaitedError({\n name: node.middleware.name,\n operation: \"encode\",\n });\n }\n }\n\n for (const entry of this.#entries) {\n if (entry.kind === \"node\") {\n await walk(entry.node, data, scope.key);\n } else {\n targets.push({\n key: scope.key,\n data,\n leaf: entry.leaf,\n });\n }\n }\n\n // 登録順に整列し、並列書き込みの開始順を安定させます。\n targets.sort((a, b) => a.leaf.index - b.leaf.index);\n\n return targets;\n }\n\n /**\n * 書き戻し対象の葉へ、共有節を 1 回だけ実行しながら再エンコードして書き込みます。\n *\n * 葉への書き込みは並列に開始し、対象単位の拒否は記録だけして他の対象の開始を止めません。\n * 走査中に確定した拒否は即座に投げます。書き込み中に判明した拒否も、応答のない他の書き込みを待たずに確定させます。\n * 拒否がなければ全タスクの終了を待ちます。\n *\n * @param scope 操作共通の実行時情報です。`key` は論理キーです。\n * @param targets 書き戻し対象の葉です。登録順に渡します。\n * @param throwOnRepairDenied 書き戻し拒否をエラーとして投げるかどうかです。\n * @param data デコード済みの原データです。\n * @param write 葉への書き込み処理です。\n */\n public async repair(\n scope: OperationScope,\n targets: readonly PipelineLeaf[],\n throwOnRepairDenied: boolean,\n data: unknown,\n write: (leaf: PipelineLeaf, key: string, data: unknown) => Promise<void>,\n ): Promise<void> {\n if (targets.length === 0) {\n return;\n }\n\n const targetSet = new Set(targets);\n const isTarget = (leaf: PipelineLeaf): boolean => targetSet.has(leaf);\n const writeTasks: Promise<void>[] = [];\n // 拒否は 2 経路です。走査中の拒否は即時に確定するため、書き込みの待機で get を止めません。\n let traversalDenial: RepairNotAllowedError | null = null;\n // 書き込み中の拒否は 1 件目のシグナルで確定し、応答のない他タスクを待ちません。\n const writeDenials: RepairNotAllowedError[] = [];\n const writeDenialSignal = Promise.withResolvers<void>();\n\n // 葉書き込みは待機せず開始し、各タスクが自身の失敗を処理して allSettled で確定します。\n const writeLeaf = (leaf: PipelineLeaf, input: unknown, writeKey: string): void => {\n writeTasks.push(\n (async (): Promise<void> => {\n try {\n await write(leaf, writeKey, input);\n } catch (ex) {\n // 意図的な中断時はエラーではありません。\n if (scope.signal.aborted) {\n return;\n }\n\n if (ex instanceof RepairNotAllowedError) {\n repairLogger.warn`Failed to repair a storage: ${ex}`;\n\n if (throwOnRepairDenied) {\n writeDenials.push(\n new RepairNotAllowedError({\n cause: ex,\n names: [leaf.name],\n }),\n );\n // 他の書き込みの完了を待たずに拒否を確定させます。resolve は冪等です。\n writeDenialSignal.resolve();\n }\n\n return;\n }\n\n logger.error`Failed to repair a storage: ${ex}`;\n }\n })(),\n );\n };\n\n const recordTraversalDenial = (denied: RepairNotAllowedError): void => {\n traversalDenial ??= denied;\n };\n\n const skipDenied = (leaf: PipelineLeaf): void => {\n // 意図的な中断時はエラーではありません。\n if (scope.signal.aborted) {\n return;\n }\n\n repairLogger.warn`Skipped repair for a storage without AllowRepair: ${leaf.name}`;\n\n if (throwOnRepairDenied) {\n recordTraversalDenial(new RepairNotAllowedError({ names: [leaf.name] }));\n }\n };\n\n const walk = async (node: PipelineNode, input: unknown, parentKey: string): Promise<void> => {\n const activeLeaves = activeLeavesOf(node, isTarget);\n\n const [firstLeaf] = activeLeaves;\n\n if (firstLeaf === undefined) {\n return;\n }\n\n const shared = activeLeaves.length >= 2;\n\n // 単一対象の節でも許可があれば再エンコードを行います。\n // 許可がなければ書き込みに到達しないため、副作用のないスキップに正規化しています。\n // ミドルウェアを実行せず、下流へそのまま伝播します。\n if (!(shared || firstLeaf.canRepair)) {\n scope.signal.throwIfAborted();\n\n for (const entry of node.entries) {\n if (entry.kind === \"node\") {\n await walk(entry.node, input, parentKey);\n } else {\n if (!isTarget(entry.leaf)) {\n continue;\n }\n\n if (!entry.leaf.canRepair) {\n skipDenied(entry.leaf);\n continue;\n }\n\n writeLeaf(entry.leaf, input, parentKey);\n }\n }\n\n return;\n }\n\n scope.signal.throwIfAborted();\n\n // オニオン実行により、下流の `set` が上流の `await next()` 後の `get` に見えます (共有ストアのため)。\n // 子走査は `next()` 内で行い、親ミドルウェアの後段としてネスト実行します。\n const ctx = new EncodeContext({\n key: scope.key,\n store: scope.store,\n signal: scope.signal,\n source: input,\n });\n let nodeKey = parentKey;\n let nextCalled = false;\n let nextSettled = false;\n let downstreamStarted = false;\n\n function next(): Promise<void> {\n if (nextCalled) {\n return Promise.reject(\n new MiddlewareNextCalledMultipleTimesError({\n name: node.middleware.name,\n operation: \"encode\",\n }),\n );\n }\n\n nextCalled = true;\n\n // next() の実行後、即座に destination の確認と凍結を行います。\n let encoded: unknown;\n\n try {\n encoded = requireDestination(node.middleware, ctx, \"encode\");\n freezeDestination(ctx);\n } catch (ex) {\n return Promise.reject(ex);\n }\n\n return Promise.try(async () => {\n try {\n // `mapKey` は親出力確定後に、共有ストアで適用します。\n // ここでの失敗は節固有のセットアップ失敗であり、下流開始前として扱います。\n nodeKey = applyMapKey(node.middleware, parentKey, scope);\n scope.signal.throwIfAborted();\n downstreamStarted = true;\n\n for (const entry of node.entries) {\n if (entry.kind === \"node\") {\n await walk(entry.node, encoded, nodeKey);\n } else {\n if (!isTarget(entry.leaf)) {\n continue;\n }\n\n if (!entry.leaf.canRepair) {\n skipDenied(entry.leaf);\n continue;\n }\n\n writeLeaf(entry.leaf, encoded, nodeKey);\n }\n }\n } finally {\n nextSettled = true;\n }\n });\n }\n\n try {\n await node.middleware.encode(ctx, next);\n scope.signal.throwIfAborted();\n if (!nextCalled) {\n throw new MiddlewareNextNotCalledError({\n name: node.middleware.name,\n operation: \"encode\",\n });\n }\n\n if (!nextSettled) {\n throw new MiddlewareNextNotAwaitedError({\n name: node.middleware.name,\n operation: \"encode\",\n });\n }\n } catch (ex) {\n // 意図的な中断時は中断理由で失敗します。\n if (scope.signal.aborted) {\n if (shared) {\n throw ex;\n }\n\n return;\n }\n // 規約違反はプログラミングエラーであり、握り潰さずに投げます。\n if (\n ex instanceof MiddlewareNextNotCalledError ||\n ex instanceof MiddlewareNextNotAwaitedError ||\n ex instanceof MiddlewareNextCalledMultipleTimesError ||\n ex instanceof MiddlewareDestinationMissingError ||\n ex instanceof MiddlewareDestinationFrozenError\n ) {\n throw ex;\n }\n // 下流開始後の失敗は子節で確定済み (単一拒否は記録、共有拒否は投げ) です。\n // repair は補助処理のため、拒否以外の失敗は記録に留め、読み取りは成功させます。\n if (downstreamStarted) {\n if (ex instanceof RepairNotAllowedError) {\n if (throwOnRepairDenied) {\n throw ex;\n }\n\n // 拒否をエラーにしない指定では、下流開始前と同じく警告に留めて読み取りを成功させます。\n repairLogger.warn`Failed to repair a storage: ${ex}`;\n\n return;\n }\n\n logger.error`Failed to repair a storage: ${ex}`;\n\n return;\n }\n\n if (ex instanceof RepairNotAllowedError) {\n repairLogger.warn`Failed to repair a storage: ${ex}`;\n\n if (throwOnRepairDenied) {\n const denied = new RepairNotAllowedError({\n cause: ex,\n names: activeLeaves.map((leaf) => leaf.name),\n });\n // 複数対象が共有する節の拒否は、旧実装同様に書き込み開始前に確定させます。\n if (shared) {\n throw denied;\n }\n\n recordTraversalDenial(denied);\n }\n } else {\n logger.error`Failed to repair a storage: ${ex}`;\n }\n }\n };\n\n for (const entry of this.#entries) {\n if (entry.kind === \"node\") {\n await walk(entry.node, data, scope.key);\n } else {\n if (!isTarget(entry.leaf)) {\n continue;\n }\n\n if (!entry.leaf.canRepair) {\n skipDenied(entry.leaf);\n continue;\n }\n\n writeLeaf(entry.leaf, data, scope.key);\n }\n }\n\n // 走査中の拒否は開始済みの書き込みを待たずに投げます。タスクは自身で例外を処理します。\n if (traversalDenial !== null) {\n const denial: RepairNotAllowedError = traversalDenial;\n\n throw denial;\n }\n\n // 書き込み中の拒否はシグナルで確定し、拒否がなければ全タスクの終了を待ちます。\n await Promise.race([Promise.allSettled(writeTasks), writeDenialSignal.promise]);\n\n const [firstDenial] = writeDenials;\n\n if (firstDenial !== undefined) {\n throw firstDenial;\n }\n }\n\n /**\n * 共有節を 1 回だけ実行しながらストリームエンコード木を構築します。\n *\n * 新 Middleware の `encodeStream` は `c.source.pipeThrough(...)` で変換し `c.destination` に設定します。\n * 共有節の実行は 1 回だけであり、分岐点では tee で入力を分けます。\n * 計画段階の失敗は何も構築せずに伝播するため、呼び出し側が `streams` のソースをキャンセルします。\n * tee とパイプの構築後の失敗は、`streams` に収集したストリーム (分割した読み取り側を含む) を内部でキャンセルしてから伝播します。\n * 呼び出し側はどちらの失敗でも `streams` をキャンセルできます。\n *\n * @param scope 操作共通の実行時情報です。`key` は論理キーです。\n * @param source 入力ストリームです。\n * @param streams 構築したストリームを収集する集合です。呼び出し側がソースを事前に追加します。\n * @param options 構築オプションです。\n *\n * @returns 構築結果を返します。\n */\n public async buildEncodeTree(\n scope: OperationScope,\n source: IReadableStream,\n streams: Set<IReadableStream>,\n options: BuildEncodeTreeOptions = {},\n ): Promise<StreamEncodeTree> {\n const { isActive, onNodeError } = options;\n const targets: StreamEncodeTarget[] = [];\n let readStream = source;\n\n // 段階 1 は共有節の単一実行と tee 分岐です。対象外の部分木は作りません。\n // 旧 `planNode` + `buildGraph` の 2 段階を、新 `encodeStream` の直接実行に統合しています。\n // オニオン実行により、下流の `set` が上流の `await next()` 後の `get` に見えます (共有ストアのため)。\n // 子走査と tee 分岐は `next()` 内で行い、親ミドルウェアの後段としてネスト実行します。\n const walk = async (\n node: PipelineNode,\n input: IReadableStream,\n parentKey: string,\n ): Promise<{\n readonly key: string;\n readonly output: IReadableStream;\n } | null> => {\n const activeLeaves = isActive === undefined ? node.allLeaves : activeLeavesOf(node, isActive);\n\n if (activeLeaves.length === 0) {\n return null;\n }\n\n scope.signal.throwIfAborted();\n\n const ctx = new EncodeStreamContext({\n key: scope.key,\n store: scope.store,\n signal: scope.signal,\n source: input,\n });\n let nodeKey: string = parentKey;\n let output: IReadableStream | undefined;\n let nextCalled = false;\n let nextSettled = false;\n let downstreamStarted = false;\n let downstreamError: unknown;\n let hasDownstreamError = false;\n let emptyBranches = false;\n\n function next(): Promise<void> {\n if (nextCalled) {\n return Promise.reject(\n new MiddlewareNextCalledMultipleTimesError({\n name: node.middleware.name,\n operation: \"encode\",\n }),\n );\n }\n\n nextCalled = true;\n\n // next() の実行後、即座に destination の確認と凍結を行います。\n let encoded: IReadableStream;\n\n try {\n encoded = requireStreamDestination(node.middleware, ctx, \"encode\");\n freezeDestination(ctx);\n } catch (ex) {\n return Promise.reject(ex);\n }\n\n return Promise.try(async () => {\n try {\n // pipeThrough で入力をロックした出力は、以降の失敗でも解放できるよう先に収集します。\n output = encoded;\n streams.add(output);\n\n // `mapKey` は親出力確定後に、共有ストアで適用します。\n // ここでの失敗は節固有のセットアップ失敗であり、下流開始前として扱います。\n nodeKey = applyMapKey(node.middleware, parentKey, scope);\n scope.signal.throwIfAborted();\n downstreamStarted = true;\n\n // 直下の分岐を登録順に tee で割り当てます。最後の分岐は tee せず残りを使います。\n const branchEntries = node.entries.filter((entry) => {\n if (entry.kind === \"leaf\") {\n return isActive === undefined || isActive(entry.leaf);\n }\n\n const leaves = entry.node.allLeaves;\n\n return isActive === undefined || leaves.some(isActive);\n });\n\n if (branchEntries.length === 0) {\n emptyBranches = true;\n\n return;\n }\n\n const assigned: IReadableStream[] = [];\n let current = output;\n\n for (let i = 0; i < branchEntries.length; i++) {\n if (i < branchEntries.length - 1) {\n const [branch, rest] = current.tee();\n streams.add(branch);\n streams.add(rest);\n assigned.push(branch);\n current = rest;\n } else {\n assigned.push(current);\n }\n }\n\n for (let i = 0; i < branchEntries.length; i++) {\n const entry = branchEntries[i];\n const stream = assigned[i];\n\n if (entry === undefined || stream === undefined) {\n throw new Error(\"分岐の項目またはストリームが存在しません。\");\n }\n\n if (entry.kind === \"leaf\") {\n targets.push({\n key: nodeKey,\n leaf: entry.leaf,\n stream,\n });\n } else {\n const child = await walk(entry.node, stream, nodeKey);\n\n if (child === null) {\n // スキップされた部分木の分岐は解放します。tee の cancel は兄弟分岐の cancel/drain まで解決しないため、開始だけして構築を止めません (未処理 rejection も残しません)。\n // oxlint-disable-next-line promise/prefer-await-to-then\n Promise.try(() => stream.cancel(new Error(\"Skipped branch\"))).catch(() => {});\n }\n }\n }\n } catch (ex) {\n // 下流のセットアップ失敗を親の後処理失敗と取り違えないよう、由来を記録します。\n downstreamError = ex;\n hasDownstreamError = true;\n throw ex;\n } finally {\n nextSettled = true;\n }\n });\n }\n\n try {\n await node.middleware.encodeStream(ctx, next);\n scope.signal.throwIfAborted();\n if (!nextCalled) {\n throw new MiddlewareNextNotCalledError({\n name: node.middleware.name,\n operation: \"encode\",\n });\n }\n\n if (!nextSettled) {\n throw new MiddlewareNextNotAwaitedError({\n name: node.middleware.name,\n operation: \"encode\",\n });\n }\n } catch (ex) {\n // next() を呼ぶ前に設定された destination は `streams` に未登録のため、投げる前に解放対象へ加えます。\n // pipeThrough で入力をロックした出力は、呼び出し側の `streams` のキャンセルでしか解放できません。\n // abort 判定・規約違反判定より前に加えることで、どちらの失敗でもロックした出力を解放できます。\n if (ctx.destination !== undefined) {\n streams.add(ctx.destination);\n }\n\n // 意図的な中断時は中断理由で失敗します。\n if (scope.signal.aborted) {\n throw ex;\n }\n // 規約違反はプログラミングエラーであり、`onNodeError` を経由せずに投げます。\n if (\n ex instanceof MiddlewareNextNotCalledError ||\n ex instanceof MiddlewareNextNotAwaitedError ||\n ex instanceof MiddlewareNextCalledMultipleTimesError ||\n ex instanceof MiddlewareDestinationMissingError ||\n ex instanceof MiddlewareDestinationFrozenError\n ) {\n throw ex;\n }\n\n // 下流開始後の失敗は子節で確定済みのため、そのまま伝播し、根直下で `onNodeError` に分類させます。\n if (downstreamStarted) {\n // 子節のセットアップ失敗は、親の後処理失敗ではないため repair でも握り潰しません。\n if (hasDownstreamError && ex === downstreamError) {\n throw ex;\n }\n\n // repair は補助処理のため、下流開始後の拒否以外の失敗は記録に留め、読み取りは成功させます。\n if (onNodeError !== undefined) {\n if (ex instanceof RepairNotAllowedError) {\n if (onNodeError(ex, activeLeaves)) {\n // 書き戻しの分岐は既に構築済みのため、そのまま読み取りを続けます。\n return output === undefined\n ? null\n : {\n key: nodeKey,\n output,\n };\n }\n }\n\n logger.error`Failed to repair a storage: ${ex}`;\n\n return output === undefined\n ? null\n : {\n key: nodeKey,\n output,\n };\n }\n\n throw ex;\n }\n\n if (onNodeError !== undefined && onNodeError(ex, activeLeaves)) {\n // 構築済みの出力は親の入力を pipeThrough でロックしており、親側からの解放は失敗するため、出力側からキャンセルを伝播させます。\n // next() 前の失敗で output が未確定のときは、設定済みの destination を直接キャンセルします。\n // tee の cancel は兄弟分岐の cancel/drain まで解決しないため、開始だけして構築を止めません (未処理 rejection も残しません)。\n const abandoned = output ?? ctx.destination;\n\n if (abandoned !== undefined) {\n // oxlint-disable-next-line promise/prefer-await-to-then\n Promise.try(() => abandoned.cancel(ex)).catch(() => {});\n }\n\n return null;\n }\n\n throw ex;\n }\n\n if (emptyBranches || output === undefined) {\n return null;\n }\n\n return {\n key: nodeKey,\n output,\n };\n };\n\n try {\n // 読み取り側は不変に保ち、書き戻し側だけを木へ通します。\n let rootInput = source;\n\n if (options.splitRead === true) {\n const [repairInput, read] = source.tee();\n streams.add(repairInput);\n streams.add(read);\n rootInput = repairInput;\n readStream = read;\n }\n\n // 根直下の分岐を登録順に tee で割り当てます。\n const rootActives = this.#leaves.filter((leaf) => isActive === undefined || isActive(leaf));\n\n if (rootActives.length === 0 && this.#entries.length === 0) {\n return {\n targets,\n readStream,\n };\n }\n\n const rootBranchEntries = this.#entries.filter((entry) => {\n if (entry.kind === \"leaf\") {\n return isActive === undefined || isActive(entry.leaf);\n }\n\n return isActive === undefined || entry.node.allLeaves.some(isActive);\n });\n\n if (rootBranchEntries.length > 0) {\n const assigned: IReadableStream[] = [];\n let current = rootInput;\n\n for (let i = 0; i < rootBranchEntries.length; i++) {\n if (i < rootBranchEntries.length - 1) {\n const [branch, rest] = current.tee();\n streams.add(branch);\n streams.add(rest);\n assigned.push(branch);\n current = rest;\n } else {\n assigned.push(current);\n }\n }\n\n for (let i = 0; i < rootBranchEntries.length; i++) {\n const entry = rootBranchEntries[i];\n const stream = assigned[i];\n\n if (entry === undefined || stream === undefined) {\n throw new Error(\"分岐の項目またはストリームが存在しません。\");\n }\n\n if (entry.kind === \"leaf\") {\n if (isActive === undefined || isActive(entry.leaf)) {\n targets.push({\n key: scope.key,\n leaf: entry.leaf,\n stream,\n });\n }\n } else {\n try {\n const child = await walk(entry.node, stream, scope.key);\n\n if (child === null) {\n // tee の cancel は兄弟分岐の cancel/drain まで解決しないため、開始だけして構築を止めません (未処理 rejection も残しません)。\n // oxlint-disable-next-line promise/prefer-await-to-then\n Promise.try(() => stream.cancel(new Error(\"Skipped branch\"))).catch(() => {});\n }\n } catch (ex) {\n if (onNodeError) {\n const leaves = entry.node.allLeaves.filter(\n (leaf) => isActive === undefined || isActive(leaf),\n );\n\n if (onNodeError(ex, leaves)) {\n // tee の cancel は兄弟分岐の cancel/drain まで解決しないため、開始だけして構築を止めません (未処理 rejection も残しません)。\n // oxlint-disable-next-line promise/prefer-await-to-then\n Promise.try(() => stream.cancel(ex)).catch(() => {});\n continue;\n }\n }\n\n throw ex;\n }\n }\n }\n }\n } catch (ex) {\n // 構築途中で失敗した場合は、tee の両分岐を含む構築済みストリームを解放してから伝播します。\n await cancelStreams(streams, ex);\n throw ex;\n }\n\n targets.sort((a, b) => a.leaf.index - b.leaf.index);\n\n return {\n targets,\n readStream,\n };\n }\n}\n","import type { TupleSchema, ObjectSchema } from \"@tai-kun/valibot-extra-lab\";\nimport type {\n StringSchema,\n BooleanSchema,\n GenericSchema,\n UnknownSchema,\n InstanceSchema,\n OptionalSchema,\n} from \"valibot\";\n\nimport type { VariablesEntry } from \"./_contexts.js\";\nimport {\n omit,\n pipe,\n tuple,\n union,\n custom,\n object,\n record,\n string,\n boolean,\n unknown,\n instance,\n optional,\n transform,\n} from \"./_valibot.js\";\n\nexport const VariablesKeySchema: StringSchema<undefined> = string();\n\nexport const VariablesInitSchema: GenericSchema<any, readonly VariablesEntry[]> = pipe(\n union([\n custom<Iterable<VariablesEntry>>(\n // 各アイテムの検証は今後の課題です。\n (input) => typeof input === \"object\" && input !== null && Symbol.iterator in input,\n \"Expected a Iterable object\",\n ),\n record(VariablesKeySchema, unknown()),\n ]),\n transform(\n (input: Iterable<VariablesEntry> | Record<string, unknown>): readonly VariablesEntry[] => {\n if (Symbol.iterator in input) {\n return [...input];\n }\n\n return Object.entries(input);\n },\n ),\n);\n\nexport const VariablesArgsSchema: TupleSchema<[typeof VariablesInitSchema], undefined> = tuple([\n VariablesInitSchema,\n]);\n\nexport const OpenOptionsSchema: ObjectSchema<\n {\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n },\n undefined\n> = object({\n /**\n * 処理の中断を通知するためのシグナルです。\n */\n signal: optional(instance(AbortSignal)),\n\n /**\n * 実行時の変数です。\n */\n vars: optional(VariablesInitSchema),\n});\n\nexport const OpenArgsSchema: TupleSchema<\n [OptionalSchema<typeof OpenOptionsSchema, undefined>],\n undefined\n> = tuple([optional(OpenOptionsSchema)]);\n\nexport const CloseOptionsSchema: ObjectSchema<\n {\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n },\n undefined\n> = object({\n /**\n * 処理の中断を通知するためのシグナルです。\n */\n signal: optional(instance(AbortSignal)),\n\n /**\n * 実行時の変数です。\n */\n vars: optional(VariablesInitSchema),\n});\n\nexport const CloseArgsSchema: TupleSchema<\n [OptionalSchema<typeof CloseOptionsSchema, undefined>],\n undefined\n> = tuple([optional(CloseOptionsSchema)]);\n\nexport const SetOptionsSchema: ObjectSchema<\n {\n readonly key: StringSchema<undefined>;\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly value: UnknownSchema;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n },\n undefined\n> = object({\n key: string(),\n vars: optional(VariablesInitSchema),\n value: unknown(),\n signal: optional(instance(AbortSignal)),\n});\n\nexport const SetArgsSchema: GenericSchema<\n any,\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly value: unknown;\n readonly signal?: AbortSignal | undefined;\n },\n ]\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly value: unknown;\n readonly signal?: AbortSignal | undefined;\n },\n ]\n> = union([\n tuple([SetOptionsSchema]),\n pipe(\n tuple([\n SetOptionsSchema.entries.key,\n SetOptionsSchema.entries.value,\n optional(omit(SetOptionsSchema, [\"key\", \"value\"])),\n ]),\n transform(\n ([key, value, options]: [\n string,\n unknown,\n (\n | {\n vars?: readonly VariablesEntry[] | undefined;\n signal?: AbortSignal | undefined;\n }\n | undefined\n ),\n ]): [\n {\n key: string;\n vars?: readonly VariablesEntry[] | undefined;\n value: unknown;\n signal?: AbortSignal | undefined;\n },\n ] => [\n {\n ...options,\n key,\n value,\n },\n ],\n ),\n ),\n]);\n\nexport const GetOptionsSchema: ObjectSchema<\n {\n readonly key: StringSchema<undefined>;\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly repair: OptionalSchema<BooleanSchema<undefined>, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n readonly throwOnRepairDenied: OptionalSchema<BooleanSchema<undefined>, undefined>;\n },\n undefined\n> = object({\n key: string(),\n vars: optional(VariablesInitSchema),\n repair: optional(boolean()),\n signal: optional(instance(AbortSignal)),\n throwOnRepairDenied: optional(boolean()),\n});\n\nexport const GetArgsSchema: GenericSchema<\n any,\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly repair?: boolean | undefined;\n readonly signal?: AbortSignal | undefined;\n readonly throwOnRepairDenied?: boolean | undefined;\n },\n ]\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly repair?: boolean | undefined;\n readonly signal?: AbortSignal | undefined;\n readonly throwOnRepairDenied?: boolean | undefined;\n },\n ]\n> = union([\n tuple([GetOptionsSchema]),\n pipe(\n tuple([GetOptionsSchema.entries.key, optional(omit(GetOptionsSchema, [\"key\"]))]),\n transform(\n ([key, options]: [\n string,\n (\n | {\n vars?: readonly VariablesEntry[] | undefined;\n repair?: boolean | undefined;\n signal?: AbortSignal | undefined;\n throwOnRepairDenied?: boolean | undefined;\n }\n | undefined\n ),\n ]): [\n {\n key: string;\n vars?: readonly VariablesEntry[] | undefined;\n repair?: boolean | undefined;\n signal?: AbortSignal | undefined;\n throwOnRepairDenied?: boolean | undefined;\n },\n ] => [\n {\n ...options,\n key,\n },\n ],\n ),\n ),\n]);\n\nexport const StreamOptionsSchema: ObjectSchema<\n {\n readonly key: StringSchema<undefined>;\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly repair: OptionalSchema<BooleanSchema<undefined>, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n readonly throwOnRepairDenied: OptionalSchema<BooleanSchema<undefined>, undefined>;\n },\n undefined\n> = object({\n key: string(),\n vars: optional(VariablesInitSchema),\n repair: optional(boolean()),\n signal: optional(instance(AbortSignal)),\n throwOnRepairDenied: optional(boolean()),\n});\n\nexport const StreamArgsSchema: GenericSchema<\n any,\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly repair?: boolean | undefined;\n readonly signal?: AbortSignal | undefined;\n readonly throwOnRepairDenied?: boolean | undefined;\n },\n ]\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly repair?: boolean | undefined;\n readonly signal?: AbortSignal | undefined;\n readonly throwOnRepairDenied?: boolean | undefined;\n },\n ]\n> = union([\n tuple([StreamOptionsSchema]),\n pipe(\n tuple([StreamOptionsSchema.entries.key, optional(omit(StreamOptionsSchema, [\"key\"]))]),\n transform(\n ([key, options]: [\n string,\n (\n | {\n vars?: readonly VariablesEntry[] | undefined;\n repair?: boolean | undefined;\n signal?: AbortSignal | undefined;\n throwOnRepairDenied?: boolean | undefined;\n }\n | undefined\n ),\n ]): [\n {\n key: string;\n vars?: readonly VariablesEntry[] | undefined;\n repair?: boolean | undefined;\n signal?: AbortSignal | undefined;\n throwOnRepairDenied?: boolean | undefined;\n },\n ] => [\n {\n ...options,\n key,\n },\n ],\n ),\n ),\n]);\n\nexport const HasOptionsSchema: ObjectSchema<\n {\n readonly key: StringSchema<undefined>;\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n },\n undefined\n> = object({\n key: string(),\n vars: optional(VariablesInitSchema),\n signal: optional(instance(AbortSignal)),\n});\n\nexport const HasArgsSchema: GenericSchema<\n any,\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly signal?: AbortSignal | undefined;\n },\n ]\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly signal?: AbortSignal | undefined;\n },\n ]\n> = union([\n tuple([HasOptionsSchema]),\n pipe(\n tuple([HasOptionsSchema.entries.key, optional(omit(HasOptionsSchema, [\"key\"]))]),\n transform(\n ([key, options]: [\n string,\n (\n | {\n vars?: readonly VariablesEntry[] | undefined;\n signal?: AbortSignal | undefined;\n }\n | undefined\n ),\n ]): [\n {\n key: string;\n vars?: readonly VariablesEntry[] | undefined;\n signal?: AbortSignal | undefined;\n },\n ] => [\n {\n ...options,\n key,\n },\n ],\n ),\n ),\n]);\n\nexport const DeleteOptionsSchema: ObjectSchema<\n {\n readonly key: StringSchema<undefined>;\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n },\n undefined\n> = object({\n key: string(),\n vars: optional(VariablesInitSchema),\n signal: optional(instance(AbortSignal)),\n});\n\nexport const DeleteArgsSchema: GenericSchema<\n any,\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly signal?: AbortSignal | undefined;\n },\n ]\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly signal?: AbortSignal | undefined;\n },\n ]\n> = union([\n tuple([DeleteOptionsSchema]),\n pipe(\n tuple([DeleteOptionsSchema.entries.key, optional(omit(DeleteOptionsSchema, [\"key\"]))]),\n transform(\n ([key, options]: [\n string,\n (\n | {\n vars?: readonly VariablesEntry[] | undefined;\n signal?: AbortSignal | undefined;\n }\n | undefined\n ),\n ]): [\n {\n key: string;\n vars?: readonly VariablesEntry[] | undefined;\n signal?: AbortSignal | undefined;\n },\n ] => [\n {\n ...options,\n key,\n },\n ],\n ),\n ),\n]);\n\nexport const ClearOptionsSchema: ObjectSchema<\n {\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n },\n undefined\n> = object({\n /**\n * 処理の中断を通知するためのシグナルです。\n */\n signal: optional(instance(AbortSignal)),\n\n /**\n * 実行時の変数です。\n */\n vars: optional(VariablesInitSchema),\n});\n\nexport const ClearArgsSchema: TupleSchema<\n [OptionalSchema<typeof ClearOptionsSchema, undefined>],\n undefined\n> = tuple([optional(ClearOptionsSchema)]);\n","import type { GenericSchema } from \"./_valibot.js\";\nimport { union, safeParse } from \"./_valibot.js\";\nimport { InvalidInputError } from \"./errors.js\";\nimport type { PlainValue, StreamValue } from \"./value-schemas.js\";\n\n// -------------------------------------------------------------------------------------------------。\n//\n// 値の型。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * PlainValue 型から内部のデータ型を抽出します。\n *\n * @template TPlainValue 対象となる PlainValue 型です。\n */\nexport type $InferPlainValueData<TPlainValue> =\n TPlainValue extends PlainValue<infer TData, any> ? TData : never;\n\n/**\n * PlainValue 型から入力データの型を抽出します。\n *\n * @template TPlainValue 対象となる PlainValue 型です。\n */\nexport type $InferPlainValueInput<TPlainValue> =\n TPlainValue extends PlainValue<any, infer TInput> ? TInput : never;\n\n/**\n * StreamValue 型から内部のチャンクデータ型を抽出します。\n *\n * @template TStreamValue 対象となる StreamValue 型です。\n */\nexport type $InferStreamValueChunkData<TStreamValue> =\n TStreamValue extends StreamValue<infer TChunkData, any> ? TChunkData : never;\n\n/**\n * StreamValue 型から入力チャンクデータの型を抽出します。\n *\n * @template TStreamValue 対象となる StreamValue 型です。\n */\nexport type $InferStreamValueChunkInput<TStreamValue> =\n TStreamValue extends StreamValue<any, infer TChunkInput> ? TChunkInput : never;\n\n/**\n * スキーマ付きの値であることを識別するためのブランドです。\n *\n * 同じライブラリーが複数読み込まれた環境でも認識できるようにグローバルシンボルを使用します。\n */\nexport const VALUE_SCHEMA_BRAND: unique symbol = /* #__PURE__ */ Symbol.for(\n \"unikvs:VALUE_SCHEMA_BRAND\",\n);\n\n/**\n * スキーマ付きの値が扱うデータの種類です。\n *\n * - `\"plain\"`: プレーンな値のみを扱います。\n * - `\"stream\"`: ストリーム形式の値のみを扱います。\n * - `\"any\"`: プレーンな値とストリーム形式の値のどちらも扱います。\n */\nexport type ValueSchemaKind = \"plain\" | \"stream\" | \"any\";\n\n/**\n * キーに対応する値のスキーマ情報です。\n */\nexport type ValueSchemaInfo = {\n /**\n * 扱うデータの種類です。\n */\n readonly kind: ValueSchemaKind;\n\n /**\n * データの検証に使用するスキーマです。\n */\n readonly schema: GenericSchema;\n};\n\n// -------------------------------------------------------------------------------------------------。\n//\n// スキーマ定義。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * 検証済みのオブジェクト形式のスキーマ定義です。\n */\ntype UniKvsSchemaInfoRecord = Readonly<Record<string, ValueSchemaInfo>>;\n\n/**\n * 検証済みの配列形式のスキーマ定義です。\n */\ntype UniKvsSchemaInfoEntries = readonly (readonly [GenericSchema, ValueSchemaInfo])[];\n\n/**\n * 検証済みのスキーマ定義です。\n */\ntype UniKvsSchemaInfo = UniKvsSchemaInfoRecord | UniKvsSchemaInfoEntries;\n\n// -------------------------------------------------------------------------------------------------。\n//\n// スキーマリゾルバー。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * キーに対応する値のスキーマ情報を解決するインターフェースです。\n */\nexport interface IValueSchemaResolver {\n /**\n * キーに対応する値のスキーマ情報を返します。\n *\n * @param key 解決するキーです。\n *\n * @returns 対応するスキーマ情報を返します。対応する定義がない場合は `undefined` を返します。\n *\n * @throws キーがどのキースキーマにも一致しない場合に `InvalidInputError` を投げます。\n */\n resolve(key: string): ValueSchemaInfo | undefined;\n}\n\n/**\n * オブジェクト形式のスキーマ定義からスキーマ情報を解決します。\n */\nclass RecordValueSchemaResolver implements IValueSchemaResolver {\n readonly #entries: Map<string, ValueSchemaInfo>;\n\n public constructor(entries: UniKvsSchemaInfoRecord) {\n this.#entries = new Map(Object.entries(entries));\n }\n\n public resolve(key: string): ValueSchemaInfo | undefined {\n return this.#entries.get(key);\n }\n}\n\n/**\n * 配列形式のスキーマ定義からスキーマ情報を解決します。\n *\n * キースキーマに最初に一致した定義を採用します。\n */\nclass EntriesValueSchemaResolver implements IValueSchemaResolver {\n readonly #entries: UniKvsSchemaInfoEntries;\n\n readonly #keySchema: GenericSchema | undefined;\n\n public constructor(entries: UniKvsSchemaInfoEntries) {\n this.#entries = entries;\n if (entries.length > 0) {\n this.#keySchema = union(entries.map(([keySchema]) => keySchema));\n }\n }\n\n public resolve(key: string): ValueSchemaInfo | undefined {\n let resolved: ValueSchemaInfo | undefined;\n\n for (const [keySchema, valueSchema] of this.#entries) {\n const result = safeParse(keySchema, key);\n\n if (result.success) {\n resolved = valueSchema;\n break;\n }\n }\n\n if (resolved === undefined && this.#keySchema) {\n const result = safeParse(this.#keySchema, key);\n\n if (!result.success) {\n throw new InvalidInputError({\n value: key,\n issues: result.issues,\n });\n }\n }\n\n return resolved;\n }\n}\n\n/**\n * 検証済みのスキーマ定義からスキーマリゾルバーを生成します。\n *\n * @param schema 検証済みのスキーマ定義です。\n *\n * @returns スキーマリゾルバーを返します。\n */\nexport function createValueSchemaResolver(schema: UniKvsSchemaInfo): IValueSchemaResolver {\n if (Array.isArray(schema)) {\n return new EntriesValueSchemaResolver(schema);\n }\n\n return new RecordValueSchemaResolver(schema);\n}\n","import type { IReadableStream } from \"@unikvs/core\";\nimport { callAsyncableFnOnce } from \"call-fn-once\";\n\nimport { logger } from \"./_logger.js\";\nimport type { IValueStream } from \"./types.js\";\n\n/**\n * 与えられた `IReadableStream` を `IValueStream` に変換します。\n *\n * @template T ストリームが保持する値の型です。\n *\n * @param readableStream 変換対象となる `IReadableStream` インスタンスです。\n * @param onAsyncDispose ストリーム破棄時の処理です。\n * @param onBeforeDispose ソースストリームをキャンセルする前に呼ばれる処理です。\n *\n * @returns 非同期イテレーターが付与された `ValueStream` インスタンスを返します。\n */\nexport default function toValueStream<T>(\n readableStream: IReadableStream<T>,\n onAsyncDispose: () => Promise<void>,\n onBeforeDispose?: () => void,\n): IValueStream<T> {\n const cacheMap = new Map();\n const reader = readableStream.getReader();\n\n async function disposeValueStream(): Promise<void> {\n await callAsyncableFnOnce(cacheMap, \"dispose\", async () => {\n try {\n // ソースストリームのキャンセルが他の分岐の解放を待つ場合、先に分岐を中断しないと破棄が停止します。\n onBeforeDispose?.();\n await reader.cancel();\n } catch (ex) {\n logger.error`Failed to cancel the source stream: ${ex}`;\n }\n\n await onAsyncDispose();\n });\n }\n\n // cancel・エラー・早期 break であっても dispose されるように、readable 側のキャンセルを直接フックしたストリームを返します。\n const valueStream = new ReadableStream<T>({\n async pull(controller): Promise<void> {\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n // ストリームが正常に完了したことも dispose 対象とし、完了を通知する前に破棄を完了させます。\n await disposeValueStream();\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (ex) {\n // ソースエラー時も dispose (ロック解放など) を行わないと、ストリームを放棄した consumer に対してキーの I/O ロックがリークします。\n // dispose 自体が失敗しても元の例外の伝播を壊さないように、失敗はログに残すだけにします。\n await disposeValueStream().catch((disposeError) => {\n logger.error`Failed to dispose value stream: ${disposeError}`;\n });\n controller.error(ex);\n }\n },\n\n async cancel(): Promise<void> {\n await disposeValueStream();\n },\n });\n\n const stream = Object.assign(\n valueStream,\n\n // AsyncDisposable。\n {\n [Symbol.asyncDispose]: disposeValueStream,\n },\n\n // { dispose(): Promise<void> }\n {\n dispose: disposeValueStream,\n },\n\n // AsyncIterable<T, void, unknown>。\n {\n async *[Symbol.asyncIterator](this: ReadableStream<T>) {\n const r = this.getReader();\n\n try {\n // ストリームが終了するまでループを回し、チャンクを読み取ります。\n while (true) {\n const { done, value } = await r.read();\n\n if (done) {\n break;\n }\n\n yield value;\n }\n } catch (ex) {\n // エラーが発生した場合は、リーダーのキャンセルを試みます。\n try {\n await r.cancel(ex);\n } catch (cancelError) {\n logger.error`Failed to cancel reader: ${cancelError}`;\n }\n\n throw ex;\n } finally {\n // cancel・エラー・早期 break など完了方法に関係なくストリームを破棄し、キーの読み取りロックがリークしないようにします (2 回目以降は no-op)。\n try {\n await disposeValueStream();\n } catch (ex) {\n logger.error`Failed to dispose value stream: ${ex}`;\n }\n\n // 最後に必ずリーダーのロックを解放し、ストリームを再利用可能な状態にします。\n try {\n r.releaseLock();\n } catch (ex) {\n logger.error`Failed to release reader's lock: ${ex}`;\n }\n }\n },\n },\n );\n\n return stream;\n}\n","import { isReadableStream } from \"./_streams.js\";\nimport { pipe, check, unknown, parseInput } from \"./_valibot.js\";\nimport type { ValueSchemaInfo } from \"./_value-schemas.js\";\n\n/**\n * プレーン値専用のスキーマに ReadableStream が渡されたことを報告するためのスキーマです。\n */\nconst PlainValueInputSchema = pipe(\n unknown(),\n check(\n (input) => !isReadableStream(input),\n \"Expected a plain value, but received a ReadableStream\",\n ),\n);\n\n/**\n * ストリーム専用のスキーマにプレーン値が渡されたことを報告するためのスキーマです。\n */\nconst StreamValueInputSchema = pipe(\n unknown(),\n check(isReadableStream, \"Expected a ReadableStream, but received a plain value\"),\n);\n\n/**\n * スキーマ情報に基づいて `set` の入力値を検証します。\n *\n * プレーン値はその場で検証し、ストリームはチャンクごとに検証するストリームに変換します。\n *\n * @param info キーに対応するスキーマ情報です。\n * @param value 検証する入力値です。\n *\n * @returns 検証済みの入力値を返します。\n */\nexport function parseSetValue(info: ValueSchemaInfo, value: unknown): unknown {\n if (isReadableStream(value)) {\n if (info.kind === \"plain\") {\n // 必ず検証に失敗するため、InvalidInputError が投げられます。\n parseInput(PlainValueInputSchema, value);\n }\n\n // 入力チャンクを検証し、変換後の値を後続のパイプラインへ流します。\n return value.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n controller.enqueue(parseInput(info.schema, chunk));\n },\n }),\n );\n }\n\n if (info.kind === \"stream\") {\n // 必ず検証に失敗するため、InvalidInputError が投げられます。\n parseInput(StreamValueInputSchema, value);\n }\n\n return parseInput(info.schema, value);\n}\n","import { type IMiddleware, type IReadableStream, RepairNotAllowedError } from \"@unikvs/core\";\nimport { combineSignals, throwIfAborted } from \"abort-signal-utils\";\nimport { type AsyncmuxLock, Asyncmux, asyncmux } from \"asyncmux\";\n\nimport {\n type VariablesInit,\n type VariablesEntry,\n type VariablesStore,\n GetContext,\n HasContext,\n SetContext,\n OpenContext,\n ClearContext,\n CloseContext,\n DeleteContext,\n StreamContext,\n createVariablesStore,\n} from \"./_contexts.js\";\nimport { logger, repairLogger } from \"./_logger.js\";\nimport type UniKvsMiddleware from \"./_middleware.js\";\nimport type { PipelineGraph } from \"./_pipeline-graph.js\";\nimport type { PipelineLeaf, ResolvedLeaf, StreamEncodeTarget } from \"./_pipeline-graph.types.js\";\nimport { cancelStreams, isReadableStream } from \"./_streams.js\";\nimport toValueStream from \"./_to-value-stream.js\";\nimport {\n GetArgsSchema,\n HasArgsSchema,\n SetArgsSchema,\n OpenArgsSchema,\n ClearArgsSchema,\n CloseArgsSchema,\n DeleteArgsSchema,\n StreamArgsSchema,\n VariablesArgsSchema,\n} from \"./_unikvs.schemas.js\";\nimport { parseInput, parseOutput } from \"./_valibot.js\";\nimport type {\n ValueSchemaInfo,\n $InferPlainValueData,\n IValueSchemaResolver,\n $InferStreamValueChunkData,\n} from \"./_value-schemas.js\";\nimport { parseSetValue } from \"./_value-validation.js\";\nimport {\n type KeyNotFoundErrorArgs,\n KeyNotFoundError,\n UniKvsIsOpenError,\n UniKvsIsNotOpenError,\n MiddlewareNextNotCalledError,\n MiddlewareNextNotAwaitedError,\n PluginOperationAggregateError,\n MiddlewareNextCalledMultipleTimesError,\n} from \"./errors.js\";\nimport type { IValueStream } from \"./types.js\";\nimport type { KeyValueMapping } from \"./unikvs-branch.js\";\nimport type {\n SetValue,\n GetOptions,\n HasOptions,\n SetOptions,\n OpenOptions,\n ClearOptions,\n CloseOptions,\n DeleteOptions,\n StreamOptions,\n KeyofKeyValueMapping,\n KeyofKeyValueMappingHasPlainValue,\n KeyofKeyValueMappingHasStreamValue,\n} from \"./unikvs.types.js\";\n\n/**\n * ストリームの読み取りロックを自動解放するための FinalizationRegistry です。\n */\nconst ioLockRegistry =\n typeof FinalizationRegistry !== \"function\"\n ? null\n : new FinalizationRegistry<IoLockRegistryHeld>((held) => {\n if (!held.lock.released) {\n held.lock.release();\n }\n\n // GC で回収された ValueStream のロックを解放し、ソースのリソースも破棄します。\n // dispose は valueStream を参照しないため、GC を妨げません。失敗したときはログに残すだけにします。\n // oxlint-disable-next-line promise/prefer-await-to-then\n held.dispose().catch((ex) => {\n logger.error`Failed to dispose value stream: ${ex}`;\n });\n });\n\ntype IoLockRegistryHeld = {\n /**\n * stream 操作で取得したキーの読み取りロックです。\n */\n readonly lock: AsyncmuxLock;\n\n /**\n * {@linkcode ValueStream.dispose} です。ソースストリームのキャンセルとロック解放を行います。\n */\n readonly dispose: () => Promise<void>;\n};\n\n/**\n * 接続状態を管理する内部オブジェクトです。\n */\ntype Connection = {\n /**\n * 接続全体を管理する AbortController です。\n */\n readonly ac: AbortController;\n\n /**\n * I/O の多重化を制御する Asyncmux インスタンスです。\n */\n readonly io: Asyncmux;\n};\n\n/**\n * プラグイン操作の失敗を集約するための 1 件分の記録です。\n */\ntype PluginErrorRecord = {\n /**\n * 失敗したプラグインの名前です。\n */\n readonly name: string;\n\n /**\n * 宛先またはプラグインの登録順 (0 起点) です。\n */\n readonly index: number;\n\n /**\n * 失敗の理由です。\n */\n readonly reason: unknown;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#client-operations)\n */\nexport default class UniKvs<TKeyValueMapping extends KeyValueMapping = KeyValueMapping> {\n /**\n * 現在の接続状態です。非接続時は null となります。\n */\n #con: Connection | null;\n\n readonly #acSet: Set<AbortController>;\n\n /**\n * 基本となる実行変数情報です。\n *\n * コンストラクターで受け取った初期値をエントリー列で保持します。操作ごとに複写して使用します。\n */\n #baseVars: readonly VariablesEntry[];\n\n /**\n * コンパイル済みのパイプライン・グラフです。\n */\n readonly #pipeline: PipelineGraph;\n\n /**\n * キーに対応する値のスキーマ情報を解決するリゾルバーです。スキーマ未設定時は null となります。\n */\n readonly #valueSchemaResolver: IValueSchemaResolver | null;\n\n /**\n * @internal\n */\n public constructor(\n vars: readonly VariablesEntry[],\n pipeline: PipelineGraph,\n valueSchemaResolver: IValueSchemaResolver | null = null,\n ) {\n this.#con = null;\n this.#acSet = new Set();\n this.#baseVars = vars;\n this.#pipeline = pipeline;\n this.#valueSchemaResolver = valueSchemaResolver;\n }\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-set-vars)\n */\n public setVars(vars: VariablesInit): this;\n public setVars(...args: unknown[]): this {\n const [vars] = parseInput(VariablesArgsSchema, args);\n this.#baseVars = vars;\n\n return this;\n }\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-assign-vars)\n */\n public assignVars(vars: VariablesInit): this;\n public assignVars(...args: unknown[]): this {\n const [vars] = parseInput(VariablesArgsSchema, args);\n\n const map = new Map(this.#baseVars);\n\n for (const [name, value] of vars) {\n map.set(name, value);\n }\n\n this.#baseVars = [...map];\n\n return this;\n }\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-defaults-vars)\n */\n public defaultsVars(vars: VariablesInit): this;\n public defaultsVars(...args: unknown[]): this {\n const [vars] = parseInput(VariablesArgsSchema, args);\n\n const map = new Map(vars);\n\n for (const [name, value] of this.#baseVars) {\n map.set(name, value);\n }\n\n this.#baseVars = [...map];\n\n return this;\n }\n\n /**\n * 基本変数と操作固有変数を結合した実行時変数マップを作成します。\n *\n * @param vars 操作固有の変数です。\n *\n * @returns 結合した変数マップを返します。\n */\n #createOperationVars(vars: readonly VariablesEntry[] | undefined): Map<string, unknown> {\n const map = new Map(this.#baseVars);\n\n if (vars) {\n for (const [k, v] of vars) {\n map.set(k, v);\n }\n }\n\n return map;\n }\n\n /**\n * 操作内で共有される変数ストアを作成します。\n *\n * 同一操作内の全コンテキスト (`use`/`encode`/`decode`/ ストレージ) で共有され、下流の `set` が上流の `await next()` 後の `get` に見えます。\n *\n * @param vars 操作固有の変数です。\n *\n * @returns 共有ストアを返します。\n */\n #createOperationStore(vars: readonly VariablesEntry[] | undefined): VariablesStore {\n return createVariablesStore([...this.#baseVars, ...(vars ?? [])]);\n }\n\n /**\n * キーに対応する値のスキーマ情報を解決します。\n *\n * @param key 解決するキーです。\n *\n * @returns 対応するスキーマ情報を返します。スキーマ未設定または対応する定義がない場合は `undefined` を返します。\n */\n #resolveValueSchema(key: string): ValueSchemaInfo | undefined {\n return this.#valueSchemaResolver?.resolve(key);\n }\n\n /**\n * すべての宛先で読み取りに失敗したときのエラーを組み立てます。\n *\n * @param key 読み取ったキーです。\n * @param errors 収集した失敗です。\n *\n * @returns `KeyNotFoundError` を返します。\n */\n #notFound(key: string, errors: readonly PluginErrorRecord[]): KeyNotFoundError {\n const args: KeyNotFoundErrorArgs = { key };\n\n switch (errors.length) {\n case 0: {\n break;\n }\n\n case 1: {\n const [firstError] = errors;\n\n if (firstError !== undefined) {\n args.cause = firstError.reason;\n }\n\n break;\n }\n\n default: {\n args.cause = new PluginOperationAggregateError({\n action: \"read\",\n errors,\n plugin: \"storage\",\n });\n }\n }\n\n return new KeyNotFoundError(args);\n }\n\n public get isOpen(): boolean {\n return this.#con !== null;\n }\n\n public open(options?: OpenOptions): Promise<void>;\n public async open(...args: any): Promise<void> {\n if (this.#con !== null) {\n throw new UniKvsIsOpenError();\n }\n\n const [options = {}] = parseInput(OpenArgsSchema, args);\n const { vars: varsOption, signal: signalOption } = options;\n\n const ac = new AbortController();\n const signal = combineSignals([ac.signal, signalOption]);\n\n const operationVars = this.#createOperationVars(varsOption);\n throwIfAborted(signal);\n this.#acSet.add(ac);\n\n const dispose: (() => Promise<void>)[] = [];\n\n try {\n using _lock = await asyncmux(this, signal);\n\n try {\n if (this.#con !== null) {\n throw new UniKvsIsOpenError();\n }\n\n const openFns: [\n () => Promise<void>,\n plugin: \"storage\" | \"middleware\",\n name: string,\n index: number,\n ][] = [];\n\n // open/close 用の vars はプラグインごとに複製し、並列実行中の変更が他に見えないようにします。\n for (const [index, leaf] of this.#pipeline.leaves.entries()) {\n openFns.push([\n async (): Promise<void> => {\n const pluginVars = new Map(operationVars);\n const c = new OpenContext({\n vars: pluginVars.entries(),\n signal,\n });\n await leaf.storage.open(c);\n dispose.push(async () => {\n try {\n const cc = new CloseContext({\n vars: pluginVars.entries(),\n signal,\n });\n await leaf.storage.close(cc);\n } catch (ex) {\n logger.error`Failed to close storage: ${ex}`;\n }\n });\n },\n \"storage\",\n leaf.name,\n index,\n ]);\n }\n\n // 各ミドルウェアのオープン処理をリストに追加します。\n // ストレージと同様にプラグインごとに複製し、並列実行中の変更が互いに見えないようにします。\n for (const [index, middleware] of this.#pipeline.middlewares.entries()) {\n openFns.push([\n async (): Promise<void> => {\n const pluginVars = new Map(operationVars);\n const c = new OpenContext({\n vars: pluginVars.entries(),\n signal,\n });\n await middleware.open(c);\n dispose.push(async () => {\n try {\n const cc = new CloseContext({\n vars: pluginVars.entries(),\n signal,\n });\n await middleware.close(cc);\n } catch (ex) {\n logger.error`Failed to close middleware: ${ex}`;\n }\n });\n },\n \"middleware\",\n middleware.name,\n index,\n ]);\n }\n\n // すべての処理を並列に実行し、エラーが発生した場合は集約します。\n const errors: {\n name: string;\n index: number;\n plugin: \"storage\" | \"middleware\";\n reason: unknown;\n }[] = [];\n await Promise.all(\n openFns.map(async ([f, plugin, name, index]) => {\n try {\n await f();\n } catch (ex) {\n errors.push({\n name,\n index,\n plugin,\n reason: ex,\n });\n }\n }),\n );\n\n if (errors.length > 0) {\n // 中断以外の失敗が混ざっていないときは、abort 理由が集約エラーに埋もれないようそのまま投げます。\n if (signal.aborted && errors.every((error) => error.reason === signal.reason)) {\n throw signal.reason;\n }\n\n throw new PluginOperationAggregateError({\n action: \"open\",\n errors,\n });\n }\n\n // すべてのプラグインのオープンが成功した後も、待機中に中断されていないか最終確認します。\n // 中断済みのシグナルを持つ接続を作ると、isOpen が true なのに以降の操作がすべて即座に失敗する不整合な状態になります。\n throwIfAborted(signal);\n\n this.#con = {\n ac,\n io: new Asyncmux(),\n };\n } catch (ex) {\n if (dispose.length > 0) {\n await Promise.all(\n dispose.map(async (f) => {\n await f();\n }),\n );\n }\n\n throw ex;\n }\n } finally {\n this.#acSet.delete(ac);\n }\n }\n\n async #close(\n operationVars: Map<string, unknown>,\n signal: AbortSignal,\n con: Connection,\n progress: { pluginsStarted: boolean },\n ): Promise<void> {\n using _lock = await asyncmux(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con !== con) {\n throw new UniKvsIsNotOpenError();\n }\n\n const { io } = this.#con;\n using _ioLock = await io.lock({ signal });\n const closeFns: [\n () => Promise<void>,\n () => Promise<void>,\n plugin: \"storage\" | \"middleware\",\n name: string,\n index: number,\n ][] = [];\n\n // ストレージのクローズ処理を登録します。\n // open と同じ方針でプラグインごとに複製し、並列実行中の変更が互いに見えないようにします。\n for (const [index, leaf] of this.#pipeline.leaves.entries()) {\n const createContext = (): CloseContext =>\n new CloseContext({\n vars: new Map(operationVars).entries(),\n signal,\n });\n // 再試行は通常 close の失敗 (操作 signal の abort など) に引きずられないよう、新しいタイムアウト signal を使います。\n const createRetryContext = (): CloseContext =>\n new CloseContext({\n vars: new Map(operationVars).entries(),\n signal: AbortSignal.timeout(10e3),\n });\n closeFns.push([\n (): Promise<void> => leaf.storage.close(createContext()),\n (): Promise<void> => leaf.storage.retryClose(createRetryContext()),\n \"storage\",\n leaf.name,\n index,\n ]);\n }\n\n // ミドルウェアのクローズ処理を登録します。\n for (const [index, plugin] of this.#pipeline.middlewares.entries()) {\n const createContext = (): CloseContext =>\n new CloseContext({\n vars: new Map(operationVars).entries(),\n signal,\n });\n // 再試行は通常 close の失敗 (操作 signal の abort など) に引きずられないよう、新しいタイムアウト signal を使います。\n const createRetryContext = (): CloseContext =>\n new CloseContext({\n vars: new Map(operationVars).entries(),\n signal: AbortSignal.timeout(10e3),\n });\n closeFns.push([\n (): Promise<void> => plugin.close(createContext()),\n (): Promise<void> => plugin.retryClose(createRetryContext()),\n \"middleware\",\n plugin.name,\n index,\n ]);\n }\n\n // すべての処理を並列に実行し、エラーが発生した場合は集約します。\n progress.pluginsStarted = true;\n const errors: {\n name: string;\n index: number;\n plugin: \"storage\" | \"middleware\";\n reason: unknown;\n }[] = [];\n const retries: (() => Promise<void>)[] = [];\n await Promise.all(\n closeFns.map(async ([f, retry, plugin, name, index]) => {\n try {\n await f();\n } catch (ex) {\n errors.push({\n name,\n index,\n plugin,\n reason: ex,\n });\n // 通常の close で再試行すると、close 失敗後に別の利用者が引き継いだ参照まで解放してしまいます。\n retries.push(retry);\n }\n }),\n );\n\n if (errors.length > 0) {\n // 失敗したプラグインだけを 1 回再試行します。\n // 成功済みのプラグインを再 close すると、参照カウントが二重に解放され、共有している他の利用者の実体まで閉じてしまうためです。\n await Promise.all(\n retries.map(async (f) => {\n try {\n await f();\n } catch (ex) {\n logger.error`Failed to retry closing a plugin: ${ex}`;\n }\n }),\n );\n\n throw new PluginOperationAggregateError({\n action: \"close\",\n errors,\n });\n }\n\n this.#con = null;\n }\n\n public close(options?: CloseOptions): Promise<void>;\n public close(...args: any): Promise<void> {\n try {\n const [options = {}] = parseInput(CloseArgsSchema, args);\n const { vars: varsOption, signal = AbortSignal.timeout(10e3) } = options;\n\n const operationVars = this.#createOperationVars(varsOption);\n\n if (this.#con === null) {\n const acArr = [...this.#acSet];\n\n this.#acSet.clear();\n\n for (const ac of acArr) {\n if (!ac.signal.aborted) {\n ac.abort(new UniKvsIsNotOpenError());\n }\n }\n\n throw new UniKvsIsNotOpenError();\n }\n\n const con = this.#con;\n const { ac } = con;\n const acArr = [ac, ...this.#acSet];\n\n this.#acSet.clear();\n\n for (const targetAc of acArr) {\n if (!targetAc.signal.aborted) {\n targetAc.abort(new UniKvsIsNotOpenError());\n }\n }\n\n const progress = { pluginsStarted: false };\n\n return this.#close(operationVars, signal, con, progress).catch(async (closeError) => {\n // #close が失敗した場合、コネクションの AbortController はすでに abort 済みで、以降の操作がすべて即座に失敗する不整合な状態になります。\n // そこで接続を破棄して isOpen=false の一貫した状態に戻します。\n if (this.#con === con) {\n this.#con = null;\n\n // プラグインの close 段階まで到達していれば、成功分の参照は解放済みで、失敗分は #close が再試行済みです。\n // ここで全プラグインを再度閉じると参照を二重解放してしまうため、close 段階に到達できなかったときだけ破棄します。\n if (!progress.pluginsStarted) {\n const disposeSignal = AbortSignal.timeout(10e3);\n await Promise.all(\n [\n ...this.#pipeline.leaves.map((leaf) => leaf.storage),\n ...this.#pipeline.middlewares,\n ].map(async (plugin) => {\n try {\n const c = new CloseContext({\n vars: new Map(operationVars).entries(),\n signal: disposeSignal,\n });\n await plugin.close(c);\n } catch (disposeError) {\n logger.error`Failed to close plugin after close failure: ${disposeError}`;\n }\n }),\n );\n }\n }\n\n throw closeError;\n });\n } catch (ex) {\n return Promise.reject(ex);\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n if (!this.isOpen) {\n return;\n }\n\n await this.close({\n signal: AbortSignal.timeout(10e3),\n });\n }\n\n /**\n * 書き込み失敗の集約と、成功した宛先への通知を行います。\n *\n * @param targets 書き込みを試みた対象です。\n * @param failed 失敗した葉の集合です。\n * @param errors 集約する失敗です。\n * @param signal 中断シグナルです。\n */\n async #finishWrites(\n targets: readonly {\n readonly key: string;\n readonly leaf: PipelineLeaf;\n }[],\n store: VariablesStore,\n failed: ReadonlySet<PipelineLeaf>,\n errors: PluginErrorRecord[],\n signal: AbortSignal,\n ): Promise<void> {\n if (errors.length === 0) {\n return;\n }\n\n const error = new PluginOperationAggregateError({\n action: \"write\",\n errors,\n plugin: \"storage\",\n });\n const notifyErrors: unknown[] = [];\n await Promise.all(\n targets.map(async (target) => {\n // 失敗した宛先を除いたすべての宛先へ通知します。通知に失敗しても元の集約エラーは置き換えません。\n if (failed.has(target.leaf)) {\n return;\n }\n\n try {\n const c = new SetContext({\n key: target.key,\n store,\n signal,\n });\n await target.leaf.storage.onOtherWriteError(c, error);\n } catch (ex) {\n notifyErrors.push(ex);\n }\n }),\n );\n\n if (notifyErrors.length > 0) {\n logger.error(new AggregateError(notifyErrors, \"Failed to handle error\"));\n }\n\n throw error;\n }\n\n /**\n * ミドルウェアの `use` をオニオン実行し、失敗時は集約して投げます。\n *\n * 同一コンテキストオブジェクトを全ミドルウェアで共有し、`next` で下流をネスト実行するため、下流の `set` が上流の `await next()` 後の `get` に見えます。\n * `encode`/`decode` と同じく `next()` の呼び出し規約を検証し、違反したときは操作を実行せず失敗させます (fail-close)。\n * いずれかのミドルウェアが投げたときは即時に確定し、後段は実行しません (fail-fast)。\n * 失敗は集約エラー (単一件) として投げます。\n *\n * @param action 集約エラーに付与する操作名です。\n * @param c 共有の `use` コンテキストです。\n */\n async #use(\n action: \"read\" | \"write\" | \"delete\" | \"clear\",\n c: IMiddleware.UseContext,\n ): Promise<void> {\n throwIfAborted(c.signal);\n\n const middlewares = this.#pipeline.middlewares;\n const dispatch = async (index: number): Promise<void> => {\n const maybeMiddleware = middlewares[index];\n\n if (maybeMiddleware === undefined) {\n return;\n }\n\n const middleware: UniKvsMiddleware = maybeMiddleware;\n\n let nextCalled = false;\n let nextSettled = false;\n let downstreamError: unknown;\n let hasDownstreamError = false;\n\n function next(): Promise<void> {\n if (nextCalled) {\n // 2 回目以降の `next()` は下流を実行せず拒否だけを返します。\n const rejection = Promise.reject(\n new MiddlewareNextCalledMultipleTimesError({\n name: middleware.name,\n operation: \"use\",\n }),\n );\n // 呼び出し側が切り離した場合の未処理 rejection を防ぎます。await したときは従来どおり拒否されます。\n // oxlint-disable-next-line promise/prefer-await-to-then\n rejection.catch(() => {});\n\n return rejection;\n }\n\n nextCalled = true;\n\n const promise = Promise.try(async () => {\n try {\n await dispatch(index + 1);\n } catch (ex) {\n // 下流の失敗を親自身の失敗と取り違えないよう、由来を記録します。\n downstreamError = ex;\n hasDownstreamError = true;\n throw ex;\n } finally {\n nextSettled = true;\n }\n });\n // 呼び出し側が切り離した場合の未処理 rejection を防ぎます。await したときは従来どおり拒否されます。\n // oxlint-disable-next-line promise/prefer-await-to-then\n promise.catch(() => {});\n\n return promise;\n }\n\n try {\n await middleware.use(c, next);\n throwIfAborted(c.signal);\n if (!nextCalled) {\n throw new MiddlewareNextNotCalledError({\n name: middleware.name,\n operation: \"use\",\n });\n }\n\n if (!nextSettled) {\n throw new MiddlewareNextNotAwaitedError({\n name: middleware.name,\n operation: \"use\",\n });\n }\n } catch (ex) {\n // 中断による失敗はそのまま投げます。\n if (c.signal.aborted && ex === c.signal.reason) {\n throw ex;\n }\n\n // 規約違反はプログラミングエラーであり、集約せずに投げます。\n if (\n ex instanceof MiddlewareNextNotCalledError ||\n ex instanceof MiddlewareNextNotAwaitedError ||\n ex instanceof MiddlewareNextCalledMultipleTimesError\n ) {\n throw ex;\n }\n\n // `next()` から伝播した下流の失敗は再集約せず、そのまま投げます。\n if (hasDownstreamError && ex === downstreamError) {\n throw ex;\n }\n\n throw new PluginOperationAggregateError({\n action,\n errors: [\n {\n name: middleware.name,\n index,\n reason: ex,\n },\n ],\n plugin: \"middleware\",\n });\n }\n };\n await dispatch(0);\n }\n\n /**\n * プレーン値の並列書き込みを行います。\n *\n * @param io 多重化インスタンスです。\n * @param signal 中断シグナルです。\n * @param key 書き込みキーです。\n * @param store 操作内で共有される変数ストアです。\n * @param value 書き込む値です.\n */\n async #setPlain(\n io: Asyncmux,\n signal: AbortSignal,\n key: string,\n store: VariablesStore,\n value: unknown,\n ): Promise<void> {\n const targets = await this.#pipeline.encode(\n {\n key,\n store,\n signal,\n },\n value,\n );\n using _ioLock = await io.lock({\n key,\n signal,\n });\n const errors: PluginErrorRecord[] = [];\n const failed = new Set<PipelineLeaf>();\n await Promise.all(\n targets.map(async (target) => {\n try {\n const c = new SetContext({\n key: target.key,\n store,\n signal,\n });\n await target.leaf.storage.write(c, target.data);\n } catch (ex) {\n errors.push({\n name: target.leaf.name,\n index: target.leaf.index,\n reason: ex,\n });\n failed.add(target.leaf);\n }\n }),\n );\n await this.#finishWrites(targets, store, failed, errors, signal);\n }\n\n /**\n * ストリーム値の並列書き込みを行います。\n *\n * @param io 多重化インスタンスです。\n * @param signal 中断シグナルです。\n * @param key 書き込みキーです。\n * @param store 操作内で共有される変数ストアです。\n * @param value 書き込むストリームです。\n */\n async #setStream(\n io: Asyncmux,\n signal: AbortSignal,\n key: string,\n store: VariablesStore,\n value: IReadableStream,\n ): Promise<void> {\n const streams = new Set<IReadableStream>([value]);\n let tree;\n\n try {\n tree = await this.#pipeline.buildEncodeTree(\n {\n key,\n store,\n signal,\n },\n value,\n streams,\n );\n } catch (ex) {\n await cancelStreams(streams, ex);\n throw ex;\n }\n\n using _ioLock = await io\n .lock({\n key,\n signal,\n })\n .catch(async (ex) => {\n // キーロックの待機中に中断されたときも、構築済みのストリームをキャンセルします。\n // ソースストリームをロックしたまま残さないためです。\n await cancelStreams(streams, ex);\n throw ex;\n });\n\n const errors: PluginErrorRecord[] = [];\n const failed = new Set<PipelineLeaf>();\n await Promise.all(\n tree.targets.map(async (target) => {\n try {\n const c = new SetContext({\n key: target.key,\n store,\n signal,\n });\n const w = await target.leaf.storage.getWritable(c);\n await target.stream.pipeTo(w, { signal });\n } catch (ex) {\n // tee で分岐したストリームは、片方の分岐をキャンセルするまで他方が読み取ったチャンクを保持し続けるため、失敗時に放棄した分岐は確実にキャンセルします。\n try {\n await target.stream.cancel(ex);\n } catch {\n // キャンセルに失敗してもエラー集約を優先します。\n }\n\n errors.push({\n name: target.leaf.name,\n index: target.leaf.index,\n reason: ex,\n });\n failed.add(target.leaf);\n }\n }),\n );\n await this.#finishWrites(tree.targets, store, failed, errors, signal);\n }\n\n public set<const TKey extends KeyofKeyValueMapping<TKeyValueMapping>>(\n options: SetOptions<TKeyValueMapping, TKey>,\n ): Promise<void>;\n public set<const TKey extends KeyofKeyValueMapping<TKeyValueMapping>>(\n key: TKey,\n value: SetValue<TKeyValueMapping[TKey]>,\n options?: Omit<SetOptions, \"key\" | \"value\">,\n ): Promise<void>;\n public async set(...args: any): Promise<void> {\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n const [options] = parseInput(SetArgsSchema, args);\n const { key, vars: varsOption, signal: signalOption } = options;\n\n const valueSchema = this.#resolveValueSchema(key);\n // スキーマ検証はロック取得前に済ませ、無効な入力ではロックを取得しません。\n const value = valueSchema ? parseSetValue(valueSchema, options.value) : options.value;\n\n const { ac, io } = this.#con;\n const signal = combineSignals([ac.signal, signalOption]);\n\n const store = this.#createOperationStore(varsOption);\n\n // `#setStream` へ所有権を渡す前の失敗では、ソースをロックしたままにしないよう派生ストリームをキャンセルします。\n const stream = isReadableStream(value) ? value : null;\n let ownsStream = stream !== null;\n\n try {\n using _lock = await asyncmux.readonly(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n // 書き込み前の `use` による検証を行います。変異は後続のエンコード・書き込みに引き継がれます。\n const useContext = new SetContext({\n key,\n store,\n signal,\n });\n await this.#use(\"write\", useContext);\n // `use` の完了直後に中断を確認し、後続処理での検出に依存しないようにします。\n throwIfAborted(signal);\n // `use` による変異を操作変数に反映します。\n // ロックはインスタンス (読み取り) からキーの順で取得し、逆順で解放します。\n if (stream !== null) {\n // これ以降の後始末は `#setStream` が所有します。\n ownsStream = false;\n await this.#setStream(io, signal, key, store, stream);\n } else {\n await this.#setPlain(io, signal, key, store, value);\n }\n } catch (ex) {\n if (ownsStream && stream !== null) {\n // 消費されないストリームをキャンセルし、ソースの解放を伝播させます。\n try {\n await stream.cancel(ex);\n } catch {\n // キャンセルに失敗しても元の例外の伝播を優先します。\n }\n }\n\n throw ex;\n }\n }\n\n /**\n * 読み取り元のチェーン全体を逆順にデコードし、書き戻し対象向けに再エンコードして書き込みます。\n *\n * @param data 読み取ったデータです。\n * @param hit 読み取り元の葉です。\n * @param missing 読み取りに失敗または不在だった葉です。\n * @param store 操作内で共有される変数ストアです。\n * @param key キーです。\n * @param signal 中断シグナルです。\n * @param throwOnRepairDenied 書き戻し拒否をエラーとして投げるかどうかです。\n *\n * @returns デコード済みの原データを返します。\n */\n async #repairPlain(\n data: unknown,\n hit: ResolvedLeaf,\n missing: readonly PipelineLeaf[],\n store: VariablesStore,\n key: string,\n signal: AbortSignal,\n throwOnRepairDenied: boolean,\n ): Promise<unknown> {\n const raw = await this.#pipeline.decode(\n hit.leaf,\n {\n key,\n store,\n signal,\n },\n data,\n );\n await this.#pipeline.repair(\n {\n key,\n store,\n signal,\n },\n missing,\n throwOnRepairDenied,\n raw,\n async (leaf, writeKey, input) => {\n const c = new SetContext({\n key: writeKey,\n store,\n signal,\n });\n await leaf.storage.write(c, input);\n },\n );\n\n throwIfAborted(signal);\n\n return raw;\n }\n\n public get<const TKey extends KeyofKeyValueMappingHasPlainValue<TKeyValueMapping>>(\n options: GetOptions<TKey>,\n ): Promise<$InferPlainValueData<TKeyValueMapping[TKey]>>;\n public get<const TKey extends KeyofKeyValueMappingHasPlainValue<TKeyValueMapping>>(\n key: TKey,\n options?: Omit<GetOptions, \"key\">,\n ): Promise<$InferPlainValueData<TKeyValueMapping[TKey]>>;\n public async get(...args: any): Promise<unknown> {\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n const [options] = parseInput(GetArgsSchema, args);\n const {\n key,\n vars: varsOption,\n repair = false,\n signal: signalOption,\n throwOnRepairDenied = false,\n } = options;\n\n const valueSchema = this.#resolveValueSchema(key);\n\n const { ac, io } = this.#con;\n const signal = combineSignals([ac.signal, signalOption]);\n\n const store = this.#createOperationStore(varsOption);\n\n using _lock = await asyncmux.readonly(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n // 読み取り前の `use` による検証を行います。書き戻し要求は `repair` フィールドで伝えます。\n const leafNames = this.#pipeline.leaves.map((leaf) => leaf.name);\n const useContext = new GetContext({\n key,\n store,\n repair: repair\n ? {\n enabled: true,\n targets: leafNames as [string, ...string[]],\n }\n : {\n enabled: false,\n targets: [],\n },\n signal,\n });\n await this.#use(\"read\", useContext);\n // `use` の完了直後に中断を確認し、後続処理での検出に依存しないようにします。\n throwIfAborted(signal);\n let data: unknown = undefined;\n let hit: ResolvedLeaf | null = null;\n const missing: PipelineLeaf[] = [];\n const errors: PluginErrorRecord[] = [];\n\n // 書き戻し時は、読み取りから書き込みまでを同じキーの書き込みと直列化するため、書き込みロックを取得します。\n {\n using _ioLock = await (repair\n ? io.lock({\n key,\n signal,\n })\n : io.rLock({\n key,\n signal,\n }));\n // 登録順が読み取りの優先順です。先頭で見つかればそこで終え、失敗したときは次の宛先を試します。\n const resolver = this.#pipeline.createResolver({\n key,\n store,\n signal,\n });\n\n for (const leaf of this.#pipeline) {\n const resolved = resolver.resolve(leaf);\n const existsContext = new HasContext({\n key: resolved.key,\n store,\n signal,\n });\n const readRepair = repair\n ? {\n enabled: true as const,\n targets: leafNames as [string, ...string[]],\n }\n : {\n enabled: false as const,\n targets: [] as const,\n };\n const readContext = new GetContext({\n key: resolved.key,\n store,\n repair: readRepair,\n signal,\n });\n\n try {\n if (!(await leaf.storage.exists(existsContext))) {\n missing.push(leaf);\n continue;\n }\n\n data = await leaf.storage.read(readContext);\n hit = resolved;\n break;\n } catch (ex) {\n if (signal.aborted) {\n throw ex;\n }\n\n errors.push({\n name: leaf.name,\n index: leaf.index,\n reason: ex,\n });\n logger.error`Failed to read from a storage: ${ex}`;\n }\n }\n\n if (hit === null) {\n throw this.#notFound(key, errors);\n }\n\n if (repair) {\n // 後段で見つかったデータをすべてデコードして原データに戻します。\n data = await this.#repairPlain(data, hit, missing, store, key, signal, throwOnRepairDenied);\n }\n }\n\n if (!repair) {\n // 見つかったストレージ専用の前段パイプラインを逆順に適用して、データをデコードします。\n data = await this.#pipeline.decode(\n hit.leaf,\n {\n key,\n store,\n signal,\n },\n data,\n );\n }\n\n // デコード後のデータを検証します。\n if (valueSchema) {\n data = parseOutput(valueSchema.schema, data);\n }\n\n return data;\n }\n\n public stream<const TKey extends KeyofKeyValueMappingHasStreamValue<TKeyValueMapping>>(\n options: StreamOptions<TKey>,\n ): Promise<IValueStream<$InferStreamValueChunkData<TKeyValueMapping[TKey]>>>;\n public stream<const TKey extends KeyofKeyValueMappingHasStreamValue<TKeyValueMapping>>(\n key: TKey,\n options?: Omit<StreamOptions, \"key\">,\n ): Promise<IValueStream<$InferStreamValueChunkData<TKeyValueMapping[TKey]>>>;\n public async stream(...args: any): Promise<IValueStream> {\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n const [options] = parseInput(StreamArgsSchema, args);\n const {\n key,\n vars: varsOption,\n repair = false,\n signal: signalOption,\n throwOnRepairDenied = false,\n } = options;\n\n const valueSchema = this.#resolveValueSchema(key);\n\n const { ac, io } = this.#con;\n const signal = combineSignals([ac.signal, signalOption]);\n\n const store = this.#createOperationStore(varsOption);\n\n {\n using _lock = await asyncmux.readonly(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n // 読み取り前の `use` による検証を行います。書き戻し要求は `repair` フィールドで伝えます。\n const leafNames = this.#pipeline.leaves.map((leaf) => leaf.name);\n const useContext = new StreamContext({\n key,\n store,\n repair: repair\n ? {\n enabled: true,\n targets: leafNames as [string, ...string[]],\n }\n : {\n enabled: false,\n targets: [],\n },\n signal,\n });\n await this.#use(\"read\", useContext);\n // `use` の完了直後に中断を確認し、後続処理での検出に依存しないようにします。\n throwIfAborted(signal);\n // NONE は getReadable の呼び出し前を表す番兵値です。\n const NONE: any = {};\n let r: IReadableStream = NONE;\n let hit: ResolvedLeaf | null = null;\n const missing: PipelineLeaf[] = [];\n const errors: PluginErrorRecord[] = [];\n const fillBranches: IReadableStream[] = [];\n const fillTasks: Promise<void>[] = [];\n let repairAc: AbortController | null = null;\n let cancelFills: ((reason: unknown) => Promise<void>) | null = null;\n\n // 書き戻し時は、読み取りから書き込みまでを同じキーの書き込みと直列化するため、書き込みロックを取得します。\n // キーロックは ValueStream の dispose まで保持するため、明示的に解放します。\n const ioLock = await (repair\n ? io.lock({\n key,\n signal,\n })\n : io.rLock({\n key,\n signal,\n }));\n\n try {\n // 登録順が読み取りの優先順です。先頭で見つかればそこで終え、失敗したときは次の宛先を試します。\n const resolver = this.#pipeline.createResolver({\n key,\n store,\n signal,\n });\n\n for (const leaf of this.#pipeline) {\n const resolved = resolver.resolve(leaf);\n const existsContext = new HasContext({\n key: resolved.key,\n store,\n signal,\n });\n const readableRepair = repair\n ? {\n enabled: true as const,\n targets: leafNames as [string, ...string[]],\n }\n : {\n enabled: false as const,\n targets: [] as const,\n };\n const readableContext = new StreamContext({\n key: resolved.key,\n store,\n repair: readableRepair,\n signal,\n });\n\n try {\n if (!(await leaf.storage.exists(existsContext))) {\n missing.push(leaf);\n continue;\n }\n\n r = await leaf.storage.getReadable(readableContext);\n hit = resolved;\n break;\n } catch (ex) {\n if (signal.aborted) {\n throw ex;\n }\n\n errors.push({\n name: leaf.name,\n index: leaf.index,\n reason: ex,\n });\n logger.error`Failed to read from a storage: ${ex}`;\n }\n }\n\n if (hit === null) {\n throw this.#notFound(key, errors);\n }\n\n // 書き戻しが有効なときだけ、ストリームが途中で破棄されたら進行中の書き戻しも中断できるようにします。\n repairAc = repair ? new AbortController() : null;\n const repairSignal = repairAc ? combineSignals([signal, repairAc.signal]) : signal;\n\n // 書き戻しはできる範囲で行います。失敗してもログに残すだけで、読み取りは続けます。\n const fill = (target: StreamEncodeTarget): void => {\n fillBranches.push(target.stream);\n fillTasks.push(\n (async (): Promise<void> => {\n try {\n const wc = new SetContext({\n key: target.key,\n store,\n signal: repairSignal,\n });\n const w = await target.leaf.storage.getWritable(wc);\n await target.stream.pipeTo(w, { signal: repairSignal });\n } catch (ex) {\n // パイプが中断されたときは分岐を解放し、tee が後続のチャンクを保持し続けないようにします。\n try {\n await target.stream.cancel(ex);\n } catch {\n // 解放に失敗しても書き戻しの失敗処理を優先します。\n }\n\n // 意図的な中断時はエラーではありません。\n if (repairSignal.aborted) {\n return;\n }\n\n if (ex instanceof RepairNotAllowedError) {\n repairLogger.warn`Failed to repair a storage: ${ex}`;\n\n return;\n }\n\n logger.error`Failed to repair a storage: ${ex}`;\n }\n })(),\n );\n };\n\n // セットアップに失敗したときは、構築済みの分岐と進行中の書き戻しを中断します。\n cancelFills = async (reason: unknown): Promise<void> => {\n repairAc?.abort(reason);\n await Promise.all(\n fillBranches.map(async (branch) => {\n try {\n await branch.cancel(reason);\n } catch {\n // 解放に失敗しても残りの分岐の解放を優先します。\n }\n }),\n );\n await Promise.all(fillTasks);\n };\n\n // 読み取り元をすべてデコードして原データに戻します。\n // 書き戻しの分岐は読み取りパスと分離します。\n r = await this.#pipeline.decodeStream(\n hit.leaf,\n {\n key,\n store,\n signal,\n },\n r,\n );\n\n if (repair) {\n // 許可のない宛先を先に除外します。throwOnRepairDenied が真のときはここでエラーを確定します。\n const repairSet = new Set<PipelineLeaf>();\n\n for (const leaf of missing) {\n if (!leaf.canRepair) {\n // 意図的な中断時はエラーではありません。\n if (signal.aborted) {\n continue;\n }\n\n repairLogger.warn`Skipped repair for a storage without AllowRepair: ${leaf.name}`;\n\n if (throwOnRepairDenied) {\n throw new RepairNotAllowedError({ names: [leaf.name] });\n }\n\n continue;\n }\n\n repairSet.add(leaf);\n }\n\n if (repairSet.size > 0) {\n // 読み取りパスを変更しないよう、書き戻し側だけを構築して分岐後の読み取り側を返します。\n const streams = new Set<IReadableStream>([r]);\n const tree = await this.#pipeline.buildEncodeTree(\n {\n key,\n store,\n signal,\n },\n r,\n streams,\n {\n isActive: (leaf: PipelineLeaf) => repairSet.has(leaf),\n splitRead: true,\n onNodeError: (ex: unknown, activeLeaves: readonly PipelineLeaf[]) => {\n // 意図的な中断時は中断理由で失敗します。\n throwIfAborted(signal);\n\n if (ex instanceof RepairNotAllowedError) {\n repairLogger.warn`Failed to repair a storage: ${ex}`;\n\n if (throwOnRepairDenied) {\n throw new RepairNotAllowedError({\n cause: ex,\n names: activeLeaves.map((leaf) => leaf.name),\n });\n }\n\n return true;\n }\n\n logger.error`Failed to repair a storage: ${ex}`;\n\n throw ex;\n },\n },\n );\n r = tree.readStream;\n\n for (const target of tree.targets) {\n fill(target);\n }\n }\n\n throwIfAborted(signal);\n }\n\n // デコード後のチャンクを検証します。\n if (valueSchema) {\n r = r.pipeThrough(\n new TransformStream({\n transform(chunk, controller): void {\n controller.enqueue(parseOutput(valueSchema.schema, chunk));\n },\n }),\n );\n }\n\n // ストリームを読み切ったかを監視します。読み切ったときは書き戻しの完了を待ち、途中で破棄されたときは書き戻しを中断します。\n let completed = false;\n\n if (repairAc) {\n r = r.pipeThrough(\n new TransformStream({\n flush(): void {\n completed = true;\n },\n transform(chunk, controller): void {\n controller.enqueue(chunk);\n },\n }),\n );\n }\n\n // 破棄時は、ソースストリームをキャンセルする前に進行中の書き戻しを中断します。\n // tee で分岐したストリームはすべての分岐のキャンセルが揃うまで元のキャンセルが完了しないためです。\n const beforeDispose = (): void => {\n if (!completed) {\n repairAc?.abort(signal.reason);\n }\n };\n\n // キーロックは ValueStream の dispose まで保持します。fill の完了を待ってから解放します。\n const dispose = async (): Promise<void> => {\n try {\n await Promise.all(fillTasks);\n } finally {\n try {\n ioLock.release();\n } catch {\n // 解放済みでも dispose を失敗させません。\n }\n }\n };\n\n if (!ioLockRegistry) {\n return toValueStream(r, dispose, beforeDispose);\n }\n\n const unregisterToken = {};\n const valueStream = toValueStream(\n r,\n async () => {\n try {\n ioLockRegistry.unregister(unregisterToken);\n } catch {\n // 未登録でも dispose を失敗させません。\n }\n\n await dispose();\n },\n beforeDispose,\n );\n\n // valueStream が GC される時点でストリームが終わっていなければロックを自動解放します。あわせて、ソースストリームが保持するリソース (S3 レスポンスボディなど) を解放できるよう dispose を記録します。\n ioLockRegistry.register(\n valueStream,\n {\n lock: ioLock,\n dispose: valueStream.dispose,\n },\n unregisterToken,\n );\n\n return valueStream;\n } catch (ex) {\n await cancelFills?.(ex);\n\n if (r !== NONE) {\n // getReadable の成功後にセットアップで失敗したときは、ソースストリームが保持するリソース (S3 レスポンスボディなど) を解放するためキャンセルします。\n try {\n await r.cancel(ex);\n } catch {\n // キャンセルに失敗しても元の例外の伝播を優先します。\n }\n }\n\n ioLock.release();\n\n throw ex;\n }\n }\n }\n\n public has(options: HasOptions<KeyofKeyValueMapping<TKeyValueMapping>>): Promise<boolean>;\n public has(\n key: KeyofKeyValueMapping<TKeyValueMapping>,\n options?: Omit<HasOptions, \"key\">,\n ): Promise<boolean>;\n public async has(...args: any): Promise<boolean> {\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n const [options] = parseInput(HasArgsSchema, args);\n const { key, vars: varsOption, signal: signalOption } = options;\n\n // キーがキースキーマに一致するかを検証します。\n this.#resolveValueSchema(key);\n\n const { ac, io } = this.#con;\n const signal = combineSignals([ac.signal, signalOption]);\n\n const store = this.#createOperationStore(varsOption);\n\n using _lock = await asyncmux.readonly(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n // 存在確認に先立ち、各ミドルウェアの `use` を実行します。\n // `use` による vars の変更は後続の解決・走査に引き継がれます。\n const useContext = new HasContext({\n key,\n store,\n signal,\n });\n await this.#use(\"read\", useContext);\n // `use` の完了直後に中断を確認し、後続処理での検出に依存しないようにします。\n throwIfAborted(signal);\n\n using _ioLock = await io.rLock({\n key,\n signal,\n });\n // 登録順に走査し、いずれかのストレージに存在すれば true を返します。\n // exists に失敗したときは次のストレージを試します。\n const errors: PluginErrorRecord[] = [];\n const resolver = this.#pipeline.createResolver({\n key,\n store,\n signal,\n });\n\n for (const leaf of this.#pipeline) {\n const resolved = resolver.resolve(leaf);\n\n try {\n const c = new HasContext({\n key: resolved.key,\n store,\n signal,\n });\n\n if (await leaf.storage.exists(c)) {\n return true;\n }\n } catch (ex) {\n if (signal.aborted) {\n throw ex;\n }\n\n errors.push({\n name: leaf.name,\n index: leaf.index,\n reason: ex,\n });\n\n logger.error`Failed to check existence in a storage: ${ex}`;\n }\n }\n\n // すべてのストレージで存在を確認できなかったときは結果が不明なため、get() と同様にエラーとして報告します。\n if (errors.length > 0) {\n throw this.#notFound(key, errors);\n }\n\n return false;\n }\n\n public delete(options: DeleteOptions<KeyofKeyValueMapping<TKeyValueMapping>>): Promise<void>;\n public delete(\n key: KeyofKeyValueMapping<TKeyValueMapping>,\n options?: Omit<DeleteOptions, \"key\">,\n ): Promise<void>;\n public async delete(...args: any): Promise<void> {\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n const [options] = parseInput(DeleteArgsSchema, args);\n const { key, vars: varsOption, signal: signalOption } = options;\n\n // キーがキースキーマに一致するかを検証します。\n this.#resolveValueSchema(key);\n\n const { ac, io } = this.#con;\n const signal = combineSignals([ac.signal, signalOption]);\n\n const store = this.#createOperationStore(varsOption);\n\n using _lock = await asyncmux.readonly(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n // 削除に先立ち、各ミドルウェアの `use` を実行します。\n // `use` による vars の変更は後続の解決・削除に引き継がれます。\n const useContext = new DeleteContext({\n key,\n store,\n signal,\n });\n await this.#use(\"delete\", useContext);\n\n using _ioLock = await io.lock({\n key,\n // `use` の完了直後に中断を確認し、後続処理での検出に依存しないようにします。\n signal,\n });\n // 全宛先を並列に削除し、失敗は宛先の index 付きで集約します。\n const errors: PluginErrorRecord[] = [];\n const resolver = this.#pipeline.createResolver({\n key,\n store,\n signal,\n });\n await Promise.all(\n this.#pipeline.leaves.map(async (leaf) => {\n const resolved = resolver.resolve(leaf);\n const existsContext = new HasContext({\n key: resolved.key,\n store,\n signal,\n });\n const deleteContext = new DeleteContext({\n key: resolved.key,\n store,\n signal,\n });\n\n try {\n if (await leaf.storage.exists(existsContext)) {\n await leaf.storage.delete(deleteContext);\n }\n } catch (ex) {\n errors.push({\n name: leaf.name,\n index: leaf.index,\n reason: ex,\n });\n }\n }),\n );\n\n if (errors.length > 0) {\n throw new PluginOperationAggregateError({\n action: \"delete\",\n errors,\n plugin: \"storage\",\n });\n }\n }\n\n public async clear(options?: ClearOptions): Promise<void>;\n public async clear(...args: any): Promise<void> {\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n const [options = {}] = parseInput(ClearArgsSchema, args);\n const { vars: varsOption, signal: signalOption } = options;\n\n const { ac, io } = this.#con;\n const signal = combineSignals([ac.signal, signalOption]);\n\n const store = this.#createOperationStore(varsOption);\n\n using _lock = await asyncmux.readonly(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n using _ioLock = await io.lock({ signal });\n // 全ミドルウェアの `use` を実行します。\n const useContext = new ClearContext({\n store,\n signal,\n });\n await this.#use(\"clear\", useContext);\n // `use` の完了直後に中断を確認し、後続処理での検出に依存しないようにします。\n throwIfAborted(signal);\n // 一括削除は全宛先で並列に実行し、失敗は宛先の index 付きで集約します。\n const errors: PluginErrorRecord[] = [];\n await Promise.all(\n this.#pipeline.leaves.map(async (leaf, index) => {\n try {\n const c = new ClearContext({\n store,\n signal,\n });\n await leaf.storage.clear(c);\n } catch (ex) {\n errors.push({\n name: leaf.name,\n index,\n reason: ex,\n });\n }\n }),\n );\n\n if (errors.length > 0) {\n throw new PluginOperationAggregateError({\n action: \"clear\",\n errors,\n plugin: \"storage\",\n });\n }\n }\n}\n","import type { IStorage, IMiddleware } from \"@unikvs/core\";\n\nimport type { VariablesInit } from \"./_contexts.js\";\nimport UniKvsMiddleware from \"./_middleware.js\";\nimport { PipelineGraph } from \"./_pipeline-graph.js\";\nimport UniKvsStorage from \"./_storage.js\";\nimport type {\n ValueOf,\n $CheckForkDecodeData,\n $CheckForkEncodeData,\n $CheckForkDecodeChunk,\n $CheckForkEncodeChunk,\n $InferDecodeDataInput,\n $InferReadChunkOutput,\n $InferWriteChunkInput,\n $InferDecodeChunkInput,\n $InferEncodeDataOutput,\n $InferEncodeChunkOutput,\n} from \"./_types.js\";\nimport { appendForkDestinations } from \"./_unikvs-branch.js\";\nimport { VariablesArgsSchema, VariablesInitSchema } from \"./_unikvs.schemas.js\";\nimport type { GenericSchema } from \"./_valibot.js\";\nimport {\n array,\n tuple,\n union,\n custom,\n object,\n record,\n string,\n optional,\n parseInput,\n} from \"./_valibot.js\";\nimport {\n type ValueSchemaInfo,\n type $InferPlainValueData,\n type IValueSchemaResolver,\n type $InferStreamValueChunkData,\n VALUE_SCHEMA_BRAND,\n createValueSchemaResolver,\n} from \"./_value-schemas.js\";\nimport { MissingStorageError } from \"./errors.js\";\nimport type { IUniKvsBranch, KeyValueMapping } from \"./unikvs-branch.js\";\nimport UniKvs from \"./unikvs.js\";\nimport type { Value } from \"./value-schemas.js\";\n\ntype KeyofKVMap<TKeyValueMapping extends KeyValueMapping = KeyValueMapping> = Extract<\n keyof TKeyValueMapping,\n string\n>;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport interface IUniKvsBuilder<\n TKeyValueMapping extends KeyValueMapping = KeyValueMapping,\n TUniKvsDataInput = ValueOf<{\n [TKey in KeyofKVMap<TKeyValueMapping>]: $InferPlainValueData<TKeyValueMapping[TKey]>;\n }>,\n TUniKvsDataOutput = TUniKvsDataInput,\n TUniKvsChunkInput = ValueOf<{\n [TKey in KeyofKVMap<TKeyValueMapping>]: $InferStreamValueChunkData<TKeyValueMapping[TKey]>;\n }>,\n TUniKvsChunkOutput = TUniKvsChunkInput,\n TLastMiddlewareDecodeDataInput = TUniKvsDataOutput,\n TLastMiddlewareEncodeDataOutput = TUniKvsDataInput,\n TLastMiddlewareDecodeChunkInput = TUniKvsChunkOutput,\n TLastMiddlewareEncodeChunkOutput = TUniKvsChunkInput,\n> {\n fork<\n TBranchChunkInput,\n TBranchChunkOutput,\n TBranchHeadEncodeDataInput,\n TBranchHeadDecodeDataOutput,\n TBranchHeadEncodeChunkInput,\n TBranchHeadDecodeChunkOutput,\n TBranchLastDecodeDataInput,\n TBranchLastEncodeDataOutput,\n TBranchLastDecodeChunkInput,\n TBranchLastEncodeChunkOutput,\n TBranchHasPersist extends boolean,\n >(\n branch: IUniKvsBranch<\n any,\n TBranchChunkInput,\n TBranchChunkOutput,\n TBranchHeadEncodeDataInput,\n TBranchHeadDecodeDataOutput,\n TBranchHeadEncodeChunkInput,\n TBranchHeadDecodeChunkOutput,\n TBranchLastDecodeDataInput,\n TBranchLastEncodeDataOutput,\n TBranchLastDecodeChunkInput,\n TBranchLastEncodeChunkOutput,\n TBranchHasPersist\n > &\n (TBranchHasPersist extends true\n ? $CheckForkEncodeData<TLastMiddlewareEncodeDataOutput, TBranchHeadEncodeDataInput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkDecodeData<TLastMiddlewareDecodeDataInput, TBranchHeadDecodeDataOutput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkEncodeChunk<TLastMiddlewareEncodeChunkOutput, TBranchHeadEncodeChunkInput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkDecodeChunk<TLastMiddlewareDecodeChunkInput, TBranchHeadDecodeChunkOutput>\n : unknown),\n ): IUniKvsBuilder<\n TKeyValueMapping,\n TUniKvsDataInput,\n TUniKvsDataOutput,\n TBranchHasPersist extends true\n ? [TUniKvsChunkInput] extends [never]\n ? never\n : [TBranchChunkInput] extends [never]\n ? never\n : TUniKvsChunkInput\n : TUniKvsChunkInput,\n TBranchHasPersist extends true\n ? [TUniKvsChunkOutput] extends [never]\n ? never\n : [TBranchChunkOutput] extends [never]\n ? never\n : TUniKvsChunkOutput\n : TUniKvsChunkOutput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n >;\n\n use<\n TMiddleware extends IMiddleware<\n [TLastMiddlewareEncodeDataOutput] extends [never] ? any : TLastMiddlewareEncodeDataOutput,\n any,\n [TLastMiddlewareEncodeChunkOutput] extends [never] ? any : TLastMiddlewareEncodeChunkOutput\n >,\n >(\n middleware: TMiddleware,\n ): IUniKvsBuilder<\n TKeyValueMapping,\n TUniKvsDataInput,\n TUniKvsDataOutput,\n [TUniKvsChunkInput] extends [never]\n ? never\n : [$InferDecodeChunkInput<TMiddleware>] extends [never]\n ? never\n : TUniKvsChunkInput,\n [TUniKvsChunkOutput] extends [never]\n ? never\n : [$InferEncodeChunkOutput<TMiddleware>] extends [never]\n ? never\n : TUniKvsChunkOutput,\n $InferDecodeDataInput<TMiddleware>,\n $InferEncodeDataOutput<TMiddleware>,\n $InferDecodeChunkInput<TMiddleware>,\n $InferEncodeChunkOutput<TMiddleware>\n >;\n\n persist<\n TStorage extends IStorage<\n [TLastMiddlewareEncodeDataOutput] extends [never] ? any : TLastMiddlewareEncodeDataOutput,\n [TLastMiddlewareDecodeDataInput] extends [never] ? any : TLastMiddlewareDecodeDataInput,\n [TLastMiddlewareEncodeChunkOutput] extends [never] ? any : TLastMiddlewareEncodeChunkOutput,\n [TLastMiddlewareDecodeChunkInput] extends [never] ? any : TLastMiddlewareDecodeChunkInput\n >,\n >(\n storage: TStorage,\n ): IUniKvsBuilderFinalizer<\n TKeyValueMapping,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeDataInput,\n [TLastMiddlewareEncodeChunkOutput] extends [never]\n ? never\n : [$InferWriteChunkInput<TStorage>] extends [never]\n ? never\n : TLastMiddlewareEncodeChunkOutput,\n [TLastMiddlewareDecodeChunkInput] extends [never]\n ? never\n : [$InferReadChunkOutput<TStorage>] extends [never]\n ? never\n : TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n >;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-set-vars)\n */\n setVars(vars: VariablesInit): this;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-assign-vars)\n */\n assignVars(vars: VariablesInit): this;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-defaults-vars)\n */\n defaultsVars(vars: VariablesInit): this;\n}\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport interface IUniKvsBuilderFinalizer<\n TKeyValueMapping extends KeyValueMapping = KeyValueMapping,\n TWriteDataInput = any,\n TReadDataOutput = any,\n TWriteChunkInput = any,\n TReadChunkOutput = any,\n TLastMiddlewareDecodeDataInput = TReadDataOutput,\n TLastMiddlewareEncodeDataOutput = TWriteDataInput,\n TLastMiddlewareDecodeChunkInput = TReadChunkOutput,\n TLastMiddlewareEncodeChunkOutput = TWriteChunkInput,\n> {\n fork<\n TBranchChunkInput,\n TBranchChunkOutput,\n TBranchHeadEncodeDataInput,\n TBranchHeadDecodeDataOutput,\n TBranchHeadEncodeChunkInput,\n TBranchHeadDecodeChunkOutput,\n TBranchLastDecodeDataInput,\n TBranchLastEncodeDataOutput,\n TBranchLastDecodeChunkInput,\n TBranchLastEncodeChunkOutput,\n TBranchHasPersist extends boolean,\n >(\n branch: IUniKvsBranch<\n any,\n TBranchChunkInput,\n TBranchChunkOutput,\n TBranchHeadEncodeDataInput,\n TBranchHeadDecodeDataOutput,\n TBranchHeadEncodeChunkInput,\n TBranchHeadDecodeChunkOutput,\n TBranchLastDecodeDataInput,\n TBranchLastEncodeDataOutput,\n TBranchLastDecodeChunkInput,\n TBranchLastEncodeChunkOutput,\n TBranchHasPersist\n > &\n (TBranchHasPersist extends true\n ? $CheckForkEncodeData<TLastMiddlewareEncodeDataOutput, TBranchHeadEncodeDataInput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkDecodeData<TLastMiddlewareDecodeDataInput, TBranchHeadDecodeDataOutput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkEncodeChunk<TLastMiddlewareEncodeChunkOutput, TBranchHeadEncodeChunkInput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkDecodeChunk<TLastMiddlewareDecodeChunkInput, TBranchHeadDecodeChunkOutput>\n : unknown),\n ): IUniKvsBuilderFinalizer<\n TKeyValueMapping,\n TWriteDataInput,\n TReadDataOutput,\n TBranchHasPersist extends true\n ? [TWriteChunkInput] extends [never]\n ? never\n : [TBranchChunkInput] extends [never]\n ? never\n : TWriteChunkInput\n : TWriteChunkInput,\n TBranchHasPersist extends true\n ? [TReadChunkOutput] extends [never]\n ? never\n : [TBranchChunkOutput] extends [never]\n ? never\n : TReadChunkOutput\n : TReadChunkOutput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n >;\n\n use<\n TMiddleware extends IMiddleware<\n [TLastMiddlewareEncodeDataOutput] extends [never] ? any : TLastMiddlewareEncodeDataOutput,\n any,\n [TLastMiddlewareEncodeChunkOutput] extends [never] ? any : TLastMiddlewareEncodeChunkOutput\n >,\n >(\n middleware: TMiddleware,\n ): IUniKvsBuilderFinalizer<\n TKeyValueMapping,\n TWriteDataInput,\n TReadDataOutput,\n TWriteChunkInput,\n TReadChunkOutput,\n $InferDecodeDataInput<TMiddleware>,\n $InferEncodeDataOutput<TMiddleware>,\n $InferDecodeChunkInput<TMiddleware>,\n $InferEncodeChunkOutput<TMiddleware>\n >;\n\n persist<\n TStorage extends IStorage<\n [TLastMiddlewareEncodeDataOutput] extends [never] ? any : TLastMiddlewareEncodeDataOutput,\n [TLastMiddlewareDecodeDataInput] extends [never] ? any : TLastMiddlewareDecodeDataInput,\n [TLastMiddlewareEncodeChunkOutput] extends [never] ? any : TLastMiddlewareEncodeChunkOutput,\n [TLastMiddlewareDecodeChunkInput] extends [never] ? any : TLastMiddlewareDecodeChunkInput\n >,\n >(\n storage: TStorage,\n ): IUniKvsBuilderFinalizer<\n TKeyValueMapping,\n TWriteDataInput,\n TReadDataOutput,\n [TWriteChunkInput] extends [never]\n ? never\n : [$InferWriteChunkInput<TStorage>] extends [never]\n ? never\n : TWriteChunkInput,\n [TReadChunkOutput] extends [never]\n ? never\n : [$InferReadChunkOutput<TStorage>] extends [never]\n ? never\n : TReadChunkOutput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n >;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-set-vars)\n */\n setVars(vars: VariablesInit): this;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-assign-vars)\n */\n assignVars(vars: VariablesInit): this;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-defaults-vars)\n */\n defaultsVars(vars: VariablesInit): this;\n\n build(): UniKvs<TKeyValueMapping>;\n}\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport type UniKvsBuilderOptions = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars)\n */\n readonly vars?: VariablesInit | undefined;\n readonly schema?: UniKvsSchema | undefined;\n};\n\n/**\n * オブジェクト形式のスキーマ定義です。キーをそのままキーとして扱います。\n */\nexport type UniKvsSchemaRecord = Readonly<Record<string, Value>>;\n\n/**\n * 配列形式のスキーマ定義です。キーのスキーマと値のスキーマの組を並べます。\n */\nexport type UniKvsSchemaEntries = readonly (readonly [GenericSchema, Value])[];\n\n/**\n * `new Builder()` の `schema` オプションに指定できるスキーマ定義です。\n */\nexport type UniKvsSchema = UniKvsSchemaRecord | UniKvsSchemaEntries;\n\n/**\n * スキーマ定義からキーと値のマッピング型を推論します。\n *\n * @template TSchema 対象となるスキーマ定義の型です。\n */\nexport type $InferKeyValueMapping<TSchema extends UniKvsSchema> =\n TSchema extends readonly (readonly [GenericSchema, infer TValue extends Value])[]\n ? Readonly<Record<string, TValue>>\n : TSchema extends Readonly<Record<string, Value>>\n ? { readonly [TKey in keyof TSchema]: TSchema[TKey] }\n : never;\n\n/**\n * 値が Valibot のスキーマであるかどうかを判定します。\n */\nfunction isGenericSchema(input: unknown): input is GenericSchema {\n return (\n typeof input === \"object\" &&\n input !== null &&\n // GenericSchema は関数 \"~run\" を持ちます。\n \"~run\" in input &&\n typeof input[\"~run\"] === \"function\"\n );\n}\n\n/**\n * 値がスキーマ情報であるかどうかを判定します。\n */\nfunction isValueSchemaInfo(input: unknown): input is ValueSchemaInfo {\n return (\n typeof input === \"object\" &&\n input !== null &&\n VALUE_SCHEMA_BRAND in input &&\n input[VALUE_SCHEMA_BRAND] === true\n );\n}\n\nconst UniKvsBuilderOptionsSchema = object({\n /**\n * キーと値のスキーマ定義です。\n */\n schema: optional(\n union([\n array(\n tuple([custom<GenericSchema>(isGenericSchema), custom<ValueSchemaInfo>(isValueSchemaInfo)]),\n ),\n record(string(), custom<ValueSchemaInfo>(isValueSchemaInfo)),\n ]),\n ),\n\n /**\n * 基本となる実行時変数です。\n */\n vars: optional(VariablesInitSchema),\n});\n\nconst UniKvsBuilderArgsSchema = tuple([optional(UniKvsBuilderOptionsSchema)]);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport default class UniKvsBuilder<\n const TInit extends KeyValueMapping | UniKvsSchema = KeyValueMapping,\n TKeyValueMapping extends KeyValueMapping = $InferKeyValueMapping<TInit>,\n TUniKvsDataInput = ValueOf<{\n [TKey in KeyofKVMap<TKeyValueMapping>]: $InferPlainValueData<TKeyValueMapping[TKey]>;\n }>,\n TUniKvsDataOutput = TUniKvsDataInput,\n TUniKvsChunkInput = ValueOf<{\n [TKey in KeyofKVMap<TKeyValueMapping>]: $InferStreamValueChunkData<TKeyValueMapping[TKey]>;\n }>,\n TUniKvsChunkOutput = TUniKvsChunkInput,\n TLastMiddlewareDecodeDataInput = TUniKvsDataOutput,\n TLastMiddlewareEncodeDataOutput = TUniKvsDataInput,\n TLastMiddlewareDecodeChunkInput = TUniKvsChunkOutput,\n TLastMiddlewareEncodeChunkOutput = TUniKvsChunkInput,\n> implements IUniKvsBuilder<\n TKeyValueMapping,\n TUniKvsDataInput,\n TUniKvsDataOutput,\n TUniKvsChunkInput,\n TUniKvsChunkOutput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n> {\n /**\n * 登録済みストレージと各登録時点のパイプラインのスナップショットです。\n */\n readonly #destinations: {\n /**\n * データの永続化先です。\n */\n readonly storage: UniKvsStorage;\n\n /**\n * ストレージに対するパイプラインです。\n * 登録順に保持します。\n */\n readonly middlewares: readonly UniKvsMiddleware[];\n }[];\n\n /**\n * 現在のメインのパイプラインです。\n * 登録順に保持します。\n */\n readonly #middlewares: UniKvsMiddleware[];\n\n /**\n * キーに対応する値のスキーマ情報を解決するリゾルバーです。\n */\n readonly #valueSchemaResolver: IValueSchemaResolver | null;\n\n /**\n * 基本となる実行時変数です。\n *\n * 各操作の `vars` と結合して使用されます。\n */\n readonly #vars: Map<string, unknown>;\n\n public constructor(options?: Omit<UniKvsBuilderOptions, \"schema\"> & { readonly schema?: TInit });\n public constructor(...args: unknown[]) {\n const [options = {}] = parseInput(UniKvsBuilderArgsSchema, args);\n const { vars, schema } = options;\n\n this.#destinations = [];\n this.#middlewares = [];\n this.#valueSchemaResolver = null;\n this.#vars = new Map(vars);\n if (schema) {\n this.#valueSchemaResolver = createValueSchemaResolver(schema);\n }\n }\n\n fork<\n TBranchChunkInput,\n TBranchChunkOutput,\n TBranchHeadEncodeDataInput,\n TBranchHeadDecodeDataOutput,\n TBranchHeadEncodeChunkInput,\n TBranchHeadDecodeChunkOutput,\n TBranchLastDecodeDataInput,\n TBranchLastEncodeDataOutput,\n TBranchLastDecodeChunkInput,\n TBranchLastEncodeChunkOutput,\n TBranchHasPersist extends boolean,\n >(\n branch: IUniKvsBranch<\n any,\n TBranchChunkInput,\n TBranchChunkOutput,\n TBranchHeadEncodeDataInput,\n TBranchHeadDecodeDataOutput,\n TBranchHeadEncodeChunkInput,\n TBranchHeadDecodeChunkOutput,\n TBranchLastDecodeDataInput,\n TBranchLastEncodeDataOutput,\n TBranchLastDecodeChunkInput,\n TBranchLastEncodeChunkOutput,\n TBranchHasPersist\n > &\n (TBranchHasPersist extends true\n ? $CheckForkEncodeData<TLastMiddlewareEncodeDataOutput, TBranchHeadEncodeDataInput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkDecodeData<TLastMiddlewareDecodeDataInput, TBranchHeadDecodeDataOutput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkEncodeChunk<TLastMiddlewareEncodeChunkOutput, TBranchHeadEncodeChunkInput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkDecodeChunk<TLastMiddlewareDecodeChunkInput, TBranchHeadDecodeChunkOutput>\n : unknown),\n ): IUniKvsBuilder<\n TKeyValueMapping,\n TUniKvsDataInput,\n TUniKvsDataOutput,\n TBranchHasPersist extends true\n ? [TUniKvsChunkInput] extends [never]\n ? never\n : [TBranchChunkInput] extends [never]\n ? never\n : TUniKvsChunkInput\n : TUniKvsChunkInput,\n TBranchHasPersist extends true\n ? [TUniKvsChunkOutput] extends [never]\n ? never\n : [TBranchChunkOutput] extends [never]\n ? never\n : TUniKvsChunkOutput\n : TUniKvsChunkOutput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n >;\n public fork(branch: IUniKvsBranch): IUniKvsBuilder {\n appendForkDestinations(this.#destinations, this.#middlewares, branch);\n\n return this;\n }\n\n use<\n TMiddleware extends IMiddleware<\n [TLastMiddlewareEncodeDataOutput] extends [never] ? any : TLastMiddlewareEncodeDataOutput,\n any,\n [TLastMiddlewareEncodeChunkOutput] extends [never] ? any : TLastMiddlewareEncodeChunkOutput\n >,\n >(\n middleware: TMiddleware,\n ): IUniKvsBuilder<\n TKeyValueMapping,\n TUniKvsDataInput,\n TUniKvsDataOutput,\n [TUniKvsChunkInput] extends [never]\n ? never\n : [$InferDecodeChunkInput<TMiddleware>] extends [never]\n ? never\n : TUniKvsChunkInput,\n [TUniKvsChunkOutput] extends [never]\n ? never\n : [$InferEncodeChunkOutput<TMiddleware>] extends [never]\n ? never\n : TUniKvsChunkOutput,\n $InferDecodeDataInput<TMiddleware>,\n $InferEncodeDataOutput<TMiddleware>,\n $InferDecodeChunkInput<TMiddleware>,\n $InferEncodeChunkOutput<TMiddleware>\n >;\n public use(middleware: IMiddleware): IUniKvsBuilder {\n this.#middlewares.push(UniKvsMiddleware.from(middleware));\n\n return this;\n }\n\n persist<\n TStorage extends IStorage<\n [TLastMiddlewareEncodeDataOutput] extends [never] ? any : TLastMiddlewareEncodeDataOutput,\n [TLastMiddlewareDecodeDataInput] extends [never] ? any : TLastMiddlewareDecodeDataInput,\n [TLastMiddlewareEncodeChunkOutput] extends [never] ? any : TLastMiddlewareEncodeChunkOutput,\n [TLastMiddlewareDecodeChunkInput] extends [never] ? any : TLastMiddlewareDecodeChunkInput\n >,\n >(\n storage: TStorage,\n ): IUniKvsBuilderFinalizer<\n TKeyValueMapping,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeDataInput,\n [TLastMiddlewareEncodeChunkOutput] extends [never]\n ? never\n : [$InferWriteChunkInput<TStorage>] extends [never]\n ? never\n : TLastMiddlewareEncodeChunkOutput,\n [TLastMiddlewareDecodeChunkInput] extends [never]\n ? never\n : [$InferReadChunkOutput<TStorage>] extends [never]\n ? never\n : TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n >;\n public persist(storage: IStorage): IUniKvsBuilder {\n this.#destinations.push({\n storage: UniKvsStorage.from(storage),\n // 登録時点のチェーンをスナップショットして保持するため、以降の use はこの登録に影響しません。\n middlewares: [...this.#middlewares],\n });\n\n return this;\n }\n\n public setVars(vars: VariablesInit): this;\n public setVars(...args: unknown[]): this {\n const [vars] = parseInput(VariablesArgsSchema, args);\n\n this.#vars.clear();\n for (const [name, value] of vars) {\n this.#vars.set(name, value);\n }\n\n return this;\n }\n\n public assignVars(vars: VariablesInit): this;\n public assignVars(...args: unknown[]): this {\n const [vars] = parseInput(VariablesArgsSchema, args);\n\n const target = this.#vars;\n const source = vars;\n\n for (const [name, value] of source) {\n target.set(name, value);\n }\n\n return this;\n }\n\n public defaultsVars(vars: VariablesInit): this;\n public defaultsVars(...args: unknown[]): this {\n const [vars] = parseInput(VariablesArgsSchema, args);\n\n const target = new Map(vars);\n const source = this.#vars;\n\n for (const [name, value] of source) {\n target.set(name, value);\n }\n\n this.setVars(target);\n\n return this;\n }\n\n public build(): UniKvs<TKeyValueMapping> {\n // ストレージが空の場合は UniKvs として機能できないため、例外を投げます。\n if (this.#destinations.length === 0) {\n throw new MissingStorageError();\n }\n\n return new UniKvs(\n [...this.#vars.entries()],\n // ビルダーを再利用できるよう、build のたびに trie をコンパイルします。コンパイル後の登録内容は変更しません。\n // 同じミドルウェアインスタンスに対するラッパーは共有します。\n PipelineGraph.compile([...this.#destinations]),\n this.#valueSchemaResolver,\n );\n }\n}\n","import type { InferInput, InferOutput, GenericSchema } from \"./_valibot.js\";\nimport {\n type ValueSchemaInfo,\n type ValueSchemaKind,\n VALUE_SCHEMA_BRAND,\n} from \"./_value-schemas.js\";\n\n/**\n * スキーマ付きの値を表す内部オブジェクトです。\n */\ntype ValueSchemaDescriptor = ValueSchemaInfo & {\n readonly [VALUE_SCHEMA_BRAND]: true;\n};\n\n/**\n * スキーマ情報を内部オブジェクトとして生成します。\n */\nfunction createValueSchemaDescriptor(\n kind: ValueSchemaKind,\n schema: GenericSchema,\n): ValueSchemaDescriptor {\n return {\n [VALUE_SCHEMA_BRAND]: true,\n kind,\n schema,\n };\n}\n\n/**\n * プレーンな値を識別するための固有のシンボルです。\n */\ndeclare const PLAIN_VALUE: unique symbol;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport type PlainValue<TData = any, TInput = TData> = [\n Type: typeof PLAIN_VALUE,\n Data: TData,\n Input: TInput,\n];\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport function PlainValue<const TSchema extends GenericSchema>(\n schema: TSchema,\n): PlainValue<InferOutput<TSchema>, InferInput<TSchema>> {\n return createValueSchemaDescriptor(\"plain\", schema) as unknown as PlainValue<\n InferOutput<TSchema>,\n InferInput<TSchema>\n >;\n}\n\n/**\n * ストリーム形式の値を識別するための固有のシンボルです。\n */\ndeclare const STREAM_VALUE: unique symbol;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport type StreamValue<TChunkData = any, TChunkInput = TChunkData> = [\n Type: typeof STREAM_VALUE,\n ChunkData: TChunkData,\n ChunkInput: TChunkInput,\n];\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport function StreamValue<const TSchema extends GenericSchema>(\n schema: TSchema,\n): StreamValue<InferOutput<TSchema>, InferInput<TSchema>> {\n return createValueSchemaDescriptor(\"stream\", schema) as unknown as StreamValue<\n InferOutput<TSchema>,\n InferInput<TSchema>\n >;\n}\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport type Value<TDataAndChunkData = any, TInput = TDataAndChunkData> =\n | PlainValue<TDataAndChunkData, TInput>\n | StreamValue<TDataAndChunkData, TInput>;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport function Value<const TSchema extends GenericSchema>(\n schema: TSchema,\n): Value<InferOutput<TSchema>, InferInput<TSchema>> {\n return createValueSchemaDescriptor(\"any\", schema) as unknown as Value<\n InferOutput<TSchema>,\n InferInput<TSchema>\n >;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,IAAa,oBAAb,cAAuC,sBAA6C;CAKlF,YAAmB,MAA6B;EAC9C,MAAM,EAAE,OAAO,OAAO,QAAQ,GAAG,YAAY;EAK7C,MACE;GAJA;GACA;EAGA,IACC,EAAE,QAAQ,oBAAoB,cAAc,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,GAC5E,OACF;CACF;AACF;;AAfI,mBAAK,UAAU,OAAO;;;;AAoD1B,IAAa,qBAAb,cAAwC,sBAA8C;CAKpF,YAAmB,MAA8B;EAC/C,MAAM,EAAE,OAAO,QAAQ,QAAQ,GAAG,YAAY;EAK9C,MACE;GAJA;GACA;EAGA,IACC,EAAE,QAAQ,oBAAoB,cAAc,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,GAC5E,OACF;CACF;AACF;;AAfI,oBAAK,UAAU,OAAO;;;;AA0B1B,IAAa,oBAAb,cAAuC,UAAqB;CAK1D,YAAmB,SAAwB;EACzC,MAAM,kBAAkB,OAAO;CACjC;AACF;;AANI,mBAAK,UAAU,OAAO;AAQ1B,gBAAgB,mBAAmB,kBAAkB,IAAI;;;;AAKzD,IAAa,uBAAb,cAA0C,UAAqB;CAK7D,YAAmB,SAAwB;EACzC,MAAM,sBAAsB,OAAO;CACrC;AACF;;AANI,sBAAK,UAAU,OAAO;AAQ1B,gBAAgB,sBAAsB,mBAAmB,IAAI;;;;AA0B7D,IAAa,wBAAb,cAA2C,UAAqC;CAK9E,YAAmB,MAAiC;EAClD,MAAM,EAAE,MAAM,GAAG,YAAY;EAE7B,MAAM,EADoC,KACpC,IAAO,EAAE,MAAM,kBAAkB,YAAY,YAAW,gBAAiB,OAAO;CACxF;AACF;;AARI,uBAAK,UAAU,OAAO;AAU1B,gBAAgB,wBAAwB,EAAE,WAAW,UAAU,KAAI,aAAc,IAAI;;;;AAqBrF,IAAa,kCAAb,cAAqD,UAA+C;CAKlG,YAAmB,MAA2C;EAC5D,MAAM,EAAE,MAAM,GAAG,YAAY;EAE7B,MACE,EAFkD,KAElD,IACC,EAAE,MAAM,kBAAkB,YAAY,YAAW,qCAClD,OACF;CACF;AACF;;AAZI,iCAAK,UAAU,OAAO;AAc1B,gBACE,kCACC,EAAE,WAAW,UAAU,KAAI,6BAC5B,IACF;;;;AAqBA,IAAa,kCAAb,cAAqD,UAA+C;CAKlG,YAAmB,MAA2C;EAC5D,MAAM,EAAE,MAAM,GAAG,YAAY;EAE7B,MACE,EAFkD,KAElD,IACC,EAAE,MAAM,kBAAkB,YAAY,YAAW,qCAClD,OACF;CACF;AACF;;AAZI,iCAAK,UAAU,OAAO;AAc1B,gBACE,kCACC,EAAE,WAAW,UAAU,KAAI,6BAC5B,IACF;;;;AAuBA,IAAa,kCAAb,cAAqD,UAA+C;CAKlG,YAAmB,MAA2C;EAC5D,MAAM,EAAE,MAAM,GAAG,YAAY;EAE7B,MACE,EAFkD,KAElD,IACC,EAAE,MAAM,kBAAkB,YAAY,YAAW,qCAClD,OACF;CACF;AACF;;AAZI,iCAAK,UAAU,OAAO;AAc1B,gBACE,kCACC,EAAE,WAAW,UAAU,KAAI,2BAC5B,IACF;;;;AA0BA,IAAa,2BAAb,cAA8C,UAAwC;CAKpF,YAAmB,MAAoC;EACrD,MAAM,EAAE,MAAM,GAAG,YAAY;EAE7B,MAAM,EADuC,KACvC,IAAO,EAAE,MAAM,kBAAkB,eAAe,YAAW,gBAAiB,OAAO;CAC3F;AACF;;AARI,0BAAK,UAAU,OAAO;AAU1B,gBACE,2BACC,EAAE,WAAW,WAAW,KAAI,aAC7B,IACF;;;;AA0BA,IAAa,oCAAb,cAAuD,UAAiD;CAKtG,YAAmB,MAA6C;EAC9D,MAAM,EAAE,MAAM,WAAW,GAAG,YAAY;EAKxC,MACE;GAJA;GACA;EAGA,IACC,EAAE,MAAM,aAAa,WAAW,uBAC/B,eAAe,YAAW,gCAAiC,iBAAgB,IAC7E,OACF;CACF;AACF;;AAhBI,mCAAK,UAAU,OAAO;AAkB1B,gBACE,oCACC,EAAE,MAAM,gBACP,WAAW,KAAI,MAAO,UAAS,6BACjC,IACF;;;;AA0BA,IAAa,mCAAb,cAAsD,UAAgD;CAKpG,YAAmB,MAA4C;EAC7D,MAAM,EAAE,KAAK,QAAQ,GAAG,YAAY;EAKpC,MACE;GAJA;GACA;EAGA,IACC,EAAE,KAAK,YAAY,QAAQ,oBAC1B,sDAAsD,cAAa,oBAAqB,KAAK,UAAU,UAAU,EAAC,IACpH,OACF;CACF;AACF;;AAhBI,kCAAK,UAAU,OAAO;AAkB1B,gBACE,mCACC,EAAE,KAAK,YAAY,QAAQ,oBAC1B,wCAAwC,cAAa,SAAU,KAAK,UAAU,UAAU,EAAC,KAC3F,IACF;;;;AAyBA,IAAa,+BAAb,cAAkD,UAA4C;CAK5F,YAAmB,MAAwC;EACzD,MAAM,EAAE,MAAM,WAAW,GAAG,YAAY;EAKxC,MACE;GAJA;GACA;EAGA,IACC,EAAE,MAAM,aAAa,WAAW,uBAC/B,eAAe,YAAW,4BAA6B,iBAAgB,IACzE,OACF;CACF;AACF;;AAhBI,8BAAK,UAAU,OAAO;AAkB1B,gBACE,+BACC,EAAE,MAAM,gBAAgB,WAAW,KAAI,MAAO,UAAS,uBACxD,IACF;;;;AAyBA,IAAa,gCAAb,cAAmD,UAA6C;CAK9F,YAAmB,MAAyC;EAC1D,MAAM,EAAE,MAAM,WAAW,GAAG,YAAY;EAKxC,MACE;GAJA;GACA;EAGA,IACC,EAAE,MAAM,aAAa,WAAW,uBAC/B,eAAe,YAAW,6BAA8B,iBAAgB,IAC1E,OACF;CACF;AACF;;AAhBI,+BAAK,UAAU,OAAO;AAkB1B,gBACE,gCACC,EAAE,MAAM,gBACP,WAAW,KAAI,MAAO,UAAS,6BACjC,IACF;;;;AA0BA,IAAa,yCAAb,cAA4D,UAAsD;CAKhH,YAAmB,MAAkD;EACnE,MAAM,EAAE,MAAM,WAAW,GAAG,YAAY;EAKxC,MACE;GAJA;GACA;EAGA,IACC,EAAE,MAAM,aAAa,WAAW,uBAC/B,eAAe,YAAW,qCAAsC,iBAAgB,IAClF,OACF;CACF;AACF;;AAhBI,wCAAK,UAAU,OAAO;AAkB1B,gBACE,yCACC,EAAE,MAAM,gBAAgB,WAAW,KAAI,MAAO,UAAS,uBACxD,IACF;;;;AAqBA,IAAa,kCAAb,cAAqD,UAA+C;CAKlG,YAAmB,MAA2C;EAC5D,MAAM,EAAE,MAAM,GAAG,YAAY;EAE7B,MACE,EAFkD,KAElD,IACC,EAAE,MAAM,kBAAkB,eAAe,YAAW,sCACrD,OACF;CACF;AACF;;AAZI,iCAAK,UAAU,OAAO;AAc1B,gBACE,kCACC,EAAE,WAAW,WAAW,KAAI,6BAC7B,IACF;;;;AAqBA,IAAa,kCAAb,cAAqD,UAA+C;CAKlG,YAAmB,MAA2C;EAC5D,MAAM,EAAE,MAAM,GAAG,YAAY;EAE7B,MACE,EAFkD,KAElD,IACC,EAAE,MAAM,kBAAkB,eAAe,YAAW,sCACrD,OACF;CACF;AACF;;AAZI,iCAAK,UAAU,OAAO;AAc1B,gBACE,kCACC,EAAE,WAAW,WAAW,KAAI,6BAC7B,IACF;;;;;;;;AA+FA,SAAS,gBAAgB,QAA0C;CACjE,OAAO;AACT;;;;AAKA,IAAa,gCAAb,cAAmD,UAA6C;CAK9F,YAAmB,MAAyC;EAC1D,MAAM,EAAE,QAAQ,QAAQ,QAAQ,GAAG,YAAY;EAC/C,MAAM,mBAAmB,OAAO,KAAK,WAAW;GAC9C,QAAQ,gBAAiB,MAAM,UAAU,UAAU,EAAa;GAChE,GAAI,MAAM,SAAS,KAAA,IAAY,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;GACvD,GAAI,MAAM,UAAU,KAAA,IAAY,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;GAC1D,QAAQ,MAAM;EAChB,EAAE;EACF,MAAM,UAAU,CAAC,GAAG,IAAI,IAAI,iBAAiB,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;EAC1E,MAAM,CAAC,cAAc;EACrB,MAAM,OAA0C;GAC9C;GACA,QAAQ;GACR,QAAQ,QAAQ,WAAW,KAAK,eAAe,KAAA,IAAY,aAAa;EAC1E;EACA,MACE,OACC,EAAE,QAAQ,eAAe,QAAQ,eAAe,QAAQ,oBACvD,GAAG,cAAc,OAAM,GAAI,cAAa,WAAY,cAAa,aACnE,OACF;CACF;AACF;;AAzBI,+BAAK,UAAU,OAAO;AA2B1B,gBACE,gCACC,EAAE,QAAQ,QAAQ,aACjB,GAAG,OAAO,OAAM,KACd;CACE,QAAQ;CACR,SAAS;CACT,YAAY;AACd,EAAE,QAAO,IACN,OAAM,SACb,IACF;;;;AAWA,IAAa,sBAAb,cAAyC,UAAqB;CAK5D,YAAmB,SAAwB;EACzC,MAAM,kDAAkD,OAAO;CACjE;AACF;;AANI,qBAAK,UAAU,OAAO;AAQ1B,gBACE,qBACA,qCACA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9zBA,IAAa,kBAAb,MAA0D;CAoBxD,YAAmB,QAA8C;;;;;EAC/D,uBAAA,SAAA,MAAe,MAAA;EACf,uBAAA,aAAA,MAAmB,CAAA;EACnB,uBAAA,cAAA,MAAoB,KAAA;CACtB;;;;;;;;;;;CAYA,MAAa,KAAK,GAAgC;EAChD,IAAA,uBAAA,SAAI,IAAA,CAAA,CAAa,SAAS,KAAA,GACxB;EAIF,IAAA,uBAAA,SAAI,IAAA,CAAA,CAAa,UAAU,KAAA,GAAW;GACpC,IAAA,uBAAA,SAAI,IAAA,CAAA,CAAa,QACf;GAGF,MAAA,uBAAA,SAAM,IAAA,CAAA,CAAa,KAAK,CAAC;GAEzB;EACF;EAIA,IAAA,uBAAA,SAAI,IAAA,CAAA,CAAa,UAAA,uBAAA,aAAU,IAAA,MAAqB,KAAK,CAAA,uBAAA,cAAC,IAAA,GACpD;EAGF,IAAA,uBAAA,aAAI,IAAA,IAAmB,KAAA,uBAAA,cAAK,IAAA,GAAmB;GAC7C,IAAA,uBAAA,SAAI,IAAA,CAAA,CAAa,QAAQ;IAEvB,uBAAA,aAAA,MAAA,uBAAA,aAAA,IAAA,IAAoB,CAAA;IACpB,uBAAA,cAAA,MAAoB,KAAA;IAEpB;GACF;GAGA,MAAA,uBAAA,SAAM,IAAA,CAAA,CAAa,KAAK,CAAC;GACzB,uBAAA,aAAA,MAAA,uBAAA,aAAA,IAAA,IAAoB,CAAA;GACpB,uBAAA,cAAA,MAAoB,KAAA;GAEpB;EACF;EAEA,MAAA,uBAAA,SAAM,IAAA,CAAA,CAAa,KAAK,CAAC;EACzB,uBAAA,aAAA,MAAA,uBAAA,aAAA,IAAA,IAAoB,CAAA;CACtB;;;;;;;;;;;;CAaA,MAAa,MAAM,GAAiC;EAClD,IAAA,uBAAA,SAAI,IAAA,CAAA,CAAa,UAAU,KAAA,GACzB;EAGF,IAAA,uBAAA,aAAI,IAAA,MAAqB,KAAK,CAAA,uBAAA,cAAC,IAAA,GAE7B;EAGF,IAAA,uBAAA,aAAI,IAAA,IAAmB,GACrB,uBAAA,aAAA,MAAA,uBAAA,aAAA,IAAA,IAAoB,CAAA;EAGtB,IAAA,uBAAA,aAAI,IAAA,IAAmB,GAErB;EAGF,IAAI,CAAA,uBAAA,SAAC,IAAA,CAAA,CAAa,QAAQ;GAExB,uBAAA,cAAA,MAAoB,KAAA;GAEpB;EACF;EAEA,MAAA,kBAAA,wBAAM,MAAA,UAAA,CAAA,CAAA,KAAA,MAAgB,CAAC;CACzB;;;;;;;;;CAUA,MAAa,WAAW,GAAiC;EACvD,IAAA,uBAAA,SAAI,IAAA,CAAA,CAAa,UAAU,KAAA,GACzB;EAIF,IAAI,CAAA,uBAAA,cAAC,IAAA,KAAA,uBAAA,aAAqB,IAAA,IAAmB,GAC3C;EAGF,IAAI,CAAA,uBAAA,SAAC,IAAA,CAAA,CAAa,QAAQ;GAExB,uBAAA,cAAA,MAAoB,KAAA;GAEpB;EACF;EAEA,MAAA,kBAAA,wBAAM,MAAA,UAAA,CAAA,CAAA,KAAA,MAAgB,CAAC;CACzB;AAqBF;;;;;;AAdE,eAAA,WAAiB,GAAiC;CAChD,IAAA,uBAAA,SAAI,IAAA,CAAA,CAAa,UAAU,KAAA,GACzB;CAGF,IAAI;EACF,MAAA,uBAAA,SAAM,IAAA,CAAA,CAAa,MAAM,CAAC;EAC1B,uBAAA,cAAA,MAAoB,KAAA;CACtB,SAAS,IAAI;EAEX,uBAAA,cAAA,MAAoB,IAAA;EACpB,MAAM;CACR;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzLF,MAAMM,8BAA4B,IAAI,QAAuC;;;;;;;;AAO7E,IAAqB,mBAArB,MAAqB,iBAAiB;CAgBpC,YAAoB,YAAyB;EAZpB,2BAAA,MAAA,KAAA,KAAAN,aAAA,IAAA,CAAA;;EAavB,uBAAA,KAAA,MAAW,UAAA;EACX,uBAAA,cAAA,MAAkB,IAAI,gBAAgB,UAAU,CAAA;EAChD,KAAK,OAAO,WAAW;CACzB;;;;;;;;CASA,OAAc,KAAK,YAA2C;EAC5D,OAAO,WAAWM,aAAW,kBAAkB,IAAI,iBAAiB,UAAU,CAAC;CACjF;;;;;;CAOA,MACa,KAAK,GAA2C;EAC3D,MAAA,uBAAA,cAAM,IAAA,CAAA,CAAgB,KAAK,CAAC;CAC9B;;;;;;CAOA,MACa,MAAM,GAA4C;EAC7D,MAAA,uBAAA,cAAM,IAAA,CAAA,CAAgB,MAAM,CAAC;CAC/B;;;;;;CAOA,MACa,WAAW,GAA4C;EAClE,MAAA,uBAAA,cAAM,IAAA,CAAA,CAAgB,WAAW,CAAC;CACpC;;;;;;;;CASA,OAAc,GAAsC;EAClD,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,yBAAyB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGxD,IAAA,uBAAA,KAAI,IAAA,CAAA,CAAS,WAAW,KAAA,GAEtB,OAAO,EAAE;EAGX,OAAA,uBAAA,KAAO,IAAA,CAAA,CAAS,OAAO,CAAC;CAC1B;;;;;;;CAQA,MAAa,IAAI,GAA2B,MAAwC;EAClF,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,yBAAyB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGxD,IAAA,uBAAA,KAAI,IAAA,CAAA,CAAS,QAAQ,KAAA,GAEnB,MAAM,KAAK;OAEX,MAAA,uBAAA,KAAM,IAAA,CAAA,CAAS,IAAI,GAAG,IAAI;CAE9B;;;;;;;CAQA,MAAa,OAAO,GAA8B,MAAwC;EACxF,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,yBAAyB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGxD,IAAA,uBAAA,KAAI,IAAA,CAAA,CAAS,WAAW,KAAA,GAAW;GAEjC,EAAE,cAAc,EAAE;GAElB,MAAM,KAAK;EACb,OACE,MAAA,uBAAA,KAAM,IAAA,CAAA,CAAS,OAAO,GAAG,IAAI;CAEjC;;;;;;;CAQA,MAAa,OAAO,GAA8B,MAAwC;EACxF,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,yBAAyB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGxD,IAAA,uBAAA,KAAI,IAAA,CAAA,CAAS,WAAW,KAAA,GAAW;GAEjC,EAAE,cAAc,EAAE;GAElB,MAAM,KAAK;EACb,OACE,MAAA,uBAAA,KAAM,IAAA,CAAA,CAAS,OAAO,GAAG,IAAI;CAEjC;;;;;;;CAQA,MAAa,aACX,GACA,MACe;EACf,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,yBAAyB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGxD,IAAA,uBAAA,KAAI,IAAA,CAAA,CAAS,iBAAiB,KAAA,GAC5B,MAAM,IAAI,gCAAgC,EAAE,MAAM,KAAK,KAAK,CAAC;EAG/D,MAAA,uBAAA,KAAM,IAAA,CAAA,CAAS,aAAa,GAAG,IAAI;CACrC;;;;;;;CAQA,MAAa,aACX,GACA,MACe;EACf,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,yBAAyB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGxD,IAAA,uBAAA,KAAI,IAAA,CAAA,CAAS,iBAAiB,KAAA,GAC5B,MAAM,IAAI,gCAAgC,EAAE,MAAM,KAAK,KAAK,CAAC;EAG/D,MAAA,uBAAA,KAAM,IAAA,CAAA,CAAS,aAAa,GAAG,IAAI;CACrC;AACF;;AAzLsC,CAAAN,gBAAAC,aAAAM,mBAAA,CAAA,GAAA;CAAA;EAsCnC;EAAQ;EAAA;CAAA;CAAA;EAUR;EAAQ;EAAA;CAAA;CAAA;EAUR;EAAQ;EAAA;CAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;ACpEX,SAAgB,iBAAiB,OAA0C;CACzE,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,SAAS;CAEf,OACE,OAAO,OAAO,QAAQ,cACtB,OAAO,OAAO,WAAW,cACzB,OAAO,OAAO,WAAW,cACzB,OAAO,OAAO,cAAc,cAC5B,OAAO,OAAO,gBAAgB;AAElC;;;;;;;;;;AAWA,SAAgB,iBAAiB,OAA0C;CACzE,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,SAAS;CAEf,OACE,OAAO,OAAO,UAAU,cACxB,OAAO,OAAO,UAAU,cACxB,OAAO,OAAO,cAAc;AAEhC;;;;;;;;;AAUA,eAAsB,cACpB,SACA,QACe;CAEf,MAAM,QAAQ,IACZ,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,WAAW;EAC1C,IAAI;GACF,MAAM,OAAO,OAAO,MAAM;EAC5B,QAAQ,CACN;CAEJ,CAAC,CACH;AACF;;;AClCA,SAAgB,WACd,QACA,OACA,QAAqC,mBACf;CACtB,MAAM,SAAS,UAAU,QAAQ,KAAK;CAEtC,IAAI,OAAO,SACT,OAAO,OAAO;CAGhB,MAAM,QAAQ,IAAI,MAAM;EACtB;EACA,QAAQ,OAAO;CACjB,CAAC;CACD,qBAAqB,OAAO,UAAU;CAEtC,MAAM;AACR;AAMA,SAAgB,YACd,QACA,OACA,QAAqC,oBACf;CACtB,MAAM,SAAS,UAAU,QAAQ,KAAK;CAEtC,IAAI,OAAO,SACT,OAAO,OAAO;CAGhB,MAAM,QAAQ,IAAI,MAAM;EACtB;EACA,QAAQ,OAAO;CACjB,CAAC;CACD,qBAAqB,OAAO,WAAW;CAEvC,MAAM;AACR;;;;;;ACvEA,MAAa,uBAGT,OAAwB,kBAAkB,2BAA2B;;;;AAKzE,MAAa,uBAGT,OAAwB,kBAAkB,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACHzE,MAAM,4BAA4B,IAAI,QAAiC;;;;;;;;AAOvE,IAAqB,gBAArB,MAAqB,cAAc;CAgBjC,YAAoB,SAAmB;EAZjB,2BAAA,MAAA,KAAA,KAAA,WAAA,IAAA,CAAA;;EAapB,uBAAA,KAAA,MAAW,OAAA;EACX,uBAAA,YAAA,MAAkB,IAAI,gBAAgB,OAAO,CAAA;EAC7C,KAAK,OAAO,QAAQ;CACtB;;;;;;;;CASA,OAAc,KAAK,SAAkC;EACnD,OAAO,WAAW,WAAW,eAAe,IAAI,cAAc,OAAO,CAAC;CACxE;;;;;;CAOA,MACa,KAAK,GAAwC;EACxD,MAAA,uBAAA,YAAM,IAAA,CAAA,CAAgB,KAAK,CAAC;CAC9B;;;;;;CAOA,MACa,MAAM,GAAyC;EAC1D,MAAA,uBAAA,YAAM,IAAA,CAAA,CAAgB,MAAM,CAAC;CAC/B;;;;;;CAOA,MACa,WAAW,GAAyC;EAC/D,MAAA,uBAAA,YAAM,IAAA,CAAA,CAAgB,WAAW,CAAC;CACpC;;;;;;;CAQA,MAAa,MAAM,GAA0B,MAA8B;EACzE,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,sBAAsB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGrD,MAAA,uBAAA,KAAM,IAAA,CAAA,CAAS,MAAM,GAAG,IAAI;CAC9B;;;;;;;;CASA,MAAa,KAAK,GAA2C;EAC3D,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,sBAAsB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGrD,OAAO,MAAA,uBAAA,KAAM,IAAA,CAAA,CAAS,KAAK,CAAC;CAC9B;;;;;;;;CASA,MAAa,OAAO,GAA6C;EAC/D,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,sBAAsB,EAAE,MAAM,KAAK,KAAK,CAAC;EAKrD,OAAO,MAAA,uBAAA,KAFc,IAAA,CAAA,CAAS,OAAO,CAAC;CAGxC;;;;;;CAOA,MAAa,OAAO,GAA0C;EAC5D,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,sBAAsB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGrD,MAAA,uBAAA,KAAM,IAAA,CAAA,CAAS,OAAO,CAAC;CACzB;;;;;;CAOA,MAAa,MAAM,GAAyC;EAC1D,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,sBAAsB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGrD,MAAA,uBAAA,KAAM,IAAA,CAAA,CAAS,MAAM,CAAC;CACxB;;;;;;;;CASA,MAAa,YAAY,GAA0D;EACjF,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,sBAAsB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGrD,IAAA,uBAAA,KAAI,IAAA,CAAA,CAAS,gBAAgB,KAAA,GAC3B,MAAM,IAAI,gCAAgC,EAAE,MAAM,KAAK,KAAK,CAAC;EAG/D,MAAM,SAAS,MAAA,uBAAA,KAAM,IAAA,CAAA,CAAS,YAAY,CAAC;EAE3C,OAAO,YAAY,sBAAsB,MAAM;CACjD;;;;;;;;CASA,MAAa,YAAY,GAA0D;EACjF,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,sBAAsB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGrD,IAAA,uBAAA,KAAI,IAAA,CAAA,CAAS,gBAAgB,KAAA,GAC3B,MAAM,IAAI,gCAAgC,EAAE,MAAM,KAAK,KAAK,CAAC;EAG/D,MAAM,SAAS,MAAA,uBAAA,KAAM,IAAA,CAAA,CAAS,YAAY,CAAC;EAE3C,OAAO,YAAY,sBAAsB,MAAM;CACjD;;;;;;;CAQA,MAAa,kBACX,GACA,KACe;EACf,IAAI,CAAA,uBAAA,KAAC,IAAA,CAAA,CAAS,QACZ,MAAM,IAAI,sBAAsB,EAAE,MAAM,KAAK,KAAK,CAAC;EAGrD,IAAA,uBAAA,KAAI,IAAA,CAAA,CAAS,sBAAsB,KAAA,GACjC;EAGF,MAAA,uBAAA,KAAM,IAAA,CAAA,CAAS,kBAAkB,GAAG,CAClC;GACE,QACE,IAAI,KAAK,OAIT,KAAK,WAAW;IAChB,QAAQ;IACR,QAAQ,MAAM;GAChB,EAAE;GACF,QAAQ;EACV,CAAC,CACF;CACH;AACF;;AAlNmC,CAAA,cAAA,WAAAC,gBAAA,CAAA,GAAA;CAAA;EAsChC;EAAQ;EAAA;CAAA;CAAA;EAUR;EAAQ;EAAA;CAAA;CAAA;EAUR;EAAQ;EAAA;CAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;ACxCX,MAAa,+BAAoE,IAAI,QAGnF;;;;;;;;;;;;AAaF,SAAgB,6BAA6B,QAA4C;CACvF,MAAM,QAAQ,aAAa,IAAI,MAAM;CAErC,IAAI,CAAC,OACH,MAAM,IAAI,UAAU,kDAAkD;CAIxE,OAAO,MAAM,aAAa,KAAK,UAAU;EACvC,SAAS,KAAK;EACd,aAAa,CAAC,GAAG,KAAK,WAAW;CACnC,EAAE;AACJ;;;;;;;;AASA,SAAgB,uBACd,cACA,QACA,QACM;CACN,MAAM,iBAAiB,CAAC,GAAG,MAAM;CAEjC,KAAK,MAAM,QAAQ,6BAA6B,MAAM,GACpD,aAAa,KAAK;EAChB,SAAS,KAAK;EAEd,aAAa,CAAC,GAAG,gBAAgB,GAAG,KAAK,WAAW;CACtD,CAAC;AAEL;;;;;;;ACwHA,IAAqB,eAArB,MA0BE;CACA,cAAqB;;EACnB,aAAa,IAAI,MAAM;GACrB,aAAa,CAAA;GACb,cAAc,CAAA;EAChB,CAAC;CACH;CAkGA,KAAY,QAAsC;EAChD,MAAM,QAAA,kBAAA,qBAAQ,MAAA,YAAA,CAAA,CAAA,KAAA,IAAkB;EAChC,uBAAuB,MAAM,cAAc,MAAM,aAAa,MAAM;EAEpE,OAAO;CACT;CAwCA,IAAW,YAAwC;EAEjD,kBAAA,qBADc,MAAA,YAAA,CAAA,CAAA,KAAA,IACd,CAAK,CAAC,YAAY,KAAK,iBAAiB,KAAK,UAAU,CAAC;EAExD,OAAO;CACT;CAyCA,QAAe,SAAkC;EAC/C,MAAM,QAAA,kBAAA,qBAAQ,MAAA,YAAA,CAAA,CAAA,KAAA,IAAkB;EAChC,MAAM,aAAa,KAAK;GACtB,SAAS,cAAc,KAAK,OAAO;GAEnC,aAAa,CAAC,GAAG,MAAM,WAAW;EACpC,CAAC;EAED,OAAO;CACT;AACF;;;;;;AAhME,SAAA,eAA4B;CAC1B,MAAM,QAAQ,aAAa,IAAI,IAAI;CAEnC,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MAAM,kBAAkB;CAGpC,OAAO;AACT;;;;;;;;;;;;;ACrNF,SAAS,uBAAuB,MAA2D;CACzF,IAAI,CAAC,MACH,OAAO,CAAA;CAGT,IAAI,OAAO,YAAY,MACrB,OAAO;CAGT,OAAO,OAAO,QAAQ,IAAI;AAC5B;;;;;;;;AA2BA,SAAgB,qBACd,OAA8C,CAAA,GAC9B;CAChB,OAAO;EACL,MAAM,IAAI,IAAI,IAAI;EAClB,0BAAU,IAAI,IAAI;CACpB;AACF;;;;;;AAyBA,IAAM,kBAAN,MAAkD;;;;;;CAgBhD,YAAmB,MAA2B;;;EAC5C,MAAM,EAAE,UAAU;EAElB,IAAI,OAAO;GAET,uBAAA,OAAA,MAAa,MAAM,IAAA;GACnB,uBAAA,WAAA,MAAiB,MAAM,QAAA;EACzB,OAAO;GACL,uBAAA,OAAA,sBAAa,IAAI,IAAI,CAAA;GACrB,uBAAA,WAAA,sBAAiB,IAAI,IAAI,CAAA;EAC3B;EAEA,MAAM,OAAO,uBAAuB,KAAK,IAAI;EAE7C,KAAK,MAAM,CAAC,MAAM,UAAU,MAC1B,uBAAA,OAAA,IAAA,CAAA,CAAW,IAAI,MAAM,KAAK;CAE9B;;;;;;;;CASA,IAAW,MAAuB;EAChC,OAAA,uBAAA,OAAO,IAAA,CAAA,CAAW,IAAI,IAAI;CAC5B;;;;;;;;;CAUA,IAAW,MAAc,OAAsB;EAC7C,IAAA,uBAAA,WAAI,IAAA,CAAA,CAAe,IAAI,IAAI,GACzB,MAAM,IAAI,sBAAsB,EAAE,KAAK,CAAC;EAG1C,uBAAA,OAAA,IAAA,CAAA,CAAW,IAAI,MAAM,KAAK;EAE1B,OAAO;CACT;;;;;;;;;CAUA,YAAmB,MAAc,OAAsB;EACrD,IAAA,uBAAA,WAAI,IAAA,CAAA,CAAe,IAAI,IAAI,GACzB,MAAM,IAAI,sBAAsB,EAAE,KAAK,CAAC;EAG1C,uBAAA,OAAA,IAAA,CAAA,CAAW,IAAI,MAAM,KAAK;EAC1B,uBAAA,WAAA,IAAA,CAAA,CAAe,IAAI,IAAI;EAEvB,OAAO;CACT;AACF;AA2BA,IAAa,gBAAb,cAAmC,gBAA0C;;;;;;CAW3E,YAAmB,MAAyB;EAC1C,MAAM,EAAE,KAAK,MAAM,UAAU;EAC7B,MAAM;GACJ;GACA;EACF,CAAC;EACD,KAAK,MAAM;CACb;AACF;AAgCA,IAAM,gBAAN,cACU,gBAEV;;;;;;CAgBE,YAAmB,MAAkC;EACnD,MAAM,EAAE,MAAM,OAAO,QAAQ,WAAW;EACxC,MAAM;GACJ;GACA;EACF,CAAC;EACD,KAAK,SAAS;EACd,KAAK,SAAS;CAChB;AACF;AAEA,IAAM,mBAAN,cACU,cACqB,CAAA;;;;AA8B/B,IAAa,cAAb,cAAiC,iBAAiD;;;;;;CAMhF,YAAmB,MAAuB;EACxC,MAAM;GACJ,GAAG;GACH,QAAQ;EACV,CAAC;CACH;AACF;;;;AA8BA,IAAa,eAAb,cAAkC,iBAAmD;;;;;;CAMnF,YAAmB,MAAwB;EACzC,MAAM;GACJ,GAAG;GACH,QAAQ;EACV,CAAC;CACH;AACF;AAqCA,IAAM,qBAAN,cACU,cAEV;;;;;;CAWE,YAAmB,MAAuC;EACxD,MAAM,EAAE,KAAK,GAAG,cAAc;EAC9B,MAAM,SAAS;EACf,KAAK,MAAM;CACb;AACF;;;;AAmCA,IAAa,aAAb,cAAgC,mBAAiD;;;;;;CAM/E,YAAmB,MAAsB;EACvC,MAAM;GACJ,GAAG;GACH,QAAQ;EACV,CAAC;CACH;AACF;;;;AA0CA,IAAa,aAAb,cAAgC,mBAAiD;;;;;;CAW/E,YAAmB,MAAsB;EACvC,MAAM,EACJ,SAAS;GACP,SAAS;GACT,SAAS,CAAA;EACX,GACA,GAAG,cACD;EACJ,MAAM;GACJ,GAAG;GACH,QAAQ;EACV,CAAC;EACD,KAAK,SAAS;CAChB;AACF;;;;AA0CA,IAAa,gBAAb,cAAmC,mBAAuD;;;;;;CAWxF,YAAmB,MAAyB;EAC1C,MAAM,EACJ,SAAS;GACP,SAAS;GACT,SAAS,CAAA;EACX,GACA,GAAG,cACD;EACJ,MAAM;GACJ,GAAG;GACH,QAAQ;EACV,CAAC;EACD,KAAK,SAAS;CAChB;AACF;;;;AAmCA,IAAa,aAAb,cAAgC,mBAAiD;;;;;;CAM/E,YAAmB,MAAsB;EACvC,MAAM;GACJ,GAAG;GACH,QAAQ;EACV,CAAC;CACH;AACF;;;;AAmCA,IAAa,gBAAb,cAAmC,mBAAuD;;;;;;CAMxF,YAAmB,MAAyB;EAC1C,MAAM;GACJ,GAAG;GACH,QAAQ;EACV,CAAC;CACH;AACF;;;;AA8BA,IAAa,eAAb,cAAkC,cAAgD;;;;;;CAMhF,YAAmB,MAAwB;EACzC,MAAM;GACJ,GAAG;GACH,QAAQ;EACV,CAAC;CACH;AACF;;;;AA6CA,IAAM,mBAAN,cAKU,mBAEV;;;;;;CAoBE,YAAmB,MAA8C;EAC/D,MAAM,EAAE,QAAQ,GAAG,cAAc;EACjC,MAAM,SAAS;EACf,KAAK,SAAS;CAChB;AACF;;;;AAKA,IAAM,uBAAN,cAKU,iBACwD,CAAA;;;;AAwClE,IAAa,gBAAb,cACU,qBAEV;;;;;;CAME,YAAmB,MAAmC;EACpD,MAAM;GACJ,GAAG;GACH,QAAQ;EACV,CAAC;CACH;AACF;;;;AAwCA,IAAa,gBAAb,cACU,qBAEV;;;;;;CAME,YAAmB,MAAmC;EACpD,MAAM;GACJ,GAAG;GACH,QAAQ;EACV,CAAC;CACH;AACF;;;;AAKA,IAAM,yBAAN,cAKU,iBAK4D,CAAA;;;;AAwCtE,IAAa,sBAAb,cACU,uBAEV;;;;;;CAME,YAAmB,MAA0C;EAC3D,MAAM;GACJ,GAAG;GACH,QAAQ;EACV,CAAC;CACH;AACF;;;;AAwCA,IAAa,sBAAb,cACU,uBAEV;;;;;;CAME,YAAmB,MAA0C;EAC3D,MAAM;GACJ,GAAG;GACH,QAAQ;EACV,CAAC;CACH;AACF;;;AC7jCA,MAAa,SAAiB,UAAU,QAAQ;AAGhD,MAAa,eAAuB,UAAU,CAAC,aAAa,sBAAsB,CAAC;;;;;;;;;;;;;ACyBnF,SAAgB,eACd,MACA,UACyB;CACzB,MAAM,SAAS,KAAK,UAAU,OAAO,QAAQ;CAE7C,IAAI,OAAO,WAAW,KAAK,UAAU,QACnC,OAAO,KAAK;CAGd,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,cACd,QACA,UACiB;CACjB,OAAO,CACL,GAAG,OAAO,KAAK,UAAU;EACvB,OAAO;GACL,MAAM;GACN;EACF;EACA,OAAO,KAAK;CACd,EAAE,GACF,GAAG,SAAS,KAAK,UAAU;EACzB,MAAM,CAAC,aAAa,MAAM;EAE1B,IAAI,cAAc,KAAA,GAChB,MAAM,IAAI,MAAM,cAAc;EAGhC,OAAO;GACL,OAAO;IACL,MAAM;IACN,MAAM;GACR;GACA,OAAO,UAAU;EACnB;CACF,CAAC,CAAC,CACH,CACE,UAAU,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CACrC,KAAK,SAAS,KAAK,KAAK;AAC7B;;;;;;;;;;;;AAaA,SAAgB,mBACd,YACA,KACA,WACS;CACT,IAAI,iBAAiB,KACnB,OAAO,IAAI;CAGb,MAAM,IAAI,kCAAkC;EAC1C,MAAM,WAAW;EACjB;CACF,CAAC;AACH;;;;;;;;;;;;;AAcA,SAAgB,yBACd,YACA,KACA,WACiB;CACjB,MAAM,cAAc,mBAAmB,YAAY,KAAK,SAAS;CAEjE,OAAO,YAAY,sBAAsB,WAAW;AACtD;;;;;;;;;AAUA,SAAgB,kBAAkB,KAA8B;CAC9D,MAAM,EAAE,gBAAgB;CACxB,OAAO,eAAe,KAAK,eAAe;EACxC,MAAM;GACJ,OAAO;EACT;EACA,MAAM;GACJ,MAAM,IAAI,iCAAiC;IACzC,KAAK,IAAI;IACT,QAAQ,IAAI;GACd,CAAC;EACH;EACA,YAAY;EACZ,cAAc;CAChB,CAAC;AACH;;;;;;;;;;;;AAaA,SAAgB,YACd,YACA,KACA,OACQ;CACR,MAAM,IAAI,IAAI,cAAc;EAC1B;EACA,OAAO,MAAM;CACf,CAAC;CAED,OAAO,WAAW,OAAO,CAAC;AAC5B;;;;;;;;;;;;ACxKA,IAAa,eAAb,MAA0B;;;;;;CAqBxB,YAAmB,OAAuB;;;;EACxC,uBAAA,UAAA,MAAgB,MAAM,GAAA;EACtB,uBAAA,QAAA,MAAc,KAAA;EACd,uBAAA,YAAA,sBAAkB,IAAI,IAAI,CAAA;CAC5B;;;;;;;;CASA,QAAe,MAAkC;EAC/C,IAAI,MAAA,uBAAA,UAAM,IAAA;EAEV,KAAK,MAAM,QAAQ,KAAK,MAAM;GAC5B,MAAM,SAAA,uBAAA,YAAS,IAAA,CAAA,CAAgB,IAAI,IAAI;GAEvC,IAAI,WAAW,KAAA,GAAW;IACxB,MAAM;IACN;GACF;GAEA,MAAM,SAAS,YAAY,KAAK,YAAY,KAAA,uBAAA,QAAK,IAAA,CAAW;GAC5D,uBAAA,YAAA,IAAA,CAAA,CAAgB,IAAI,MAAM,MAAM;GAChC,MAAM;EACR;EAEA,OAAO;GACL;GACA;EACF;CACF;AACF;;;;;;;;;;;ACtBA,UAAU,MAAM,MAAoD;CAClE,MAAM;CACN,KAAK,MAAM,SAAS,KAAK,SACvB,IAAI,MAAM,SAAS,QACjB,OAAO,MAAM,MAAM,IAAI;AAG7B;;;;;;AAOA,SAAS,SAAS,MAAyB;CAEzC,IAAI,KAAK,OAAO,WAAW,KAAK,KAAK,SAAS,WAAW,GAAG;EAC1D,MAAM,CAAC,SAAS,KAAK;EAErB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MAAM,iBAAiB;EAGnC,SAAS,KAAK;EACd,KAAK,UAAU,CACb;GACE,MAAM;GACN,MAAM;EACR,CAAC;EAEH,KAAK,YAAY,MAAM;EACvB,KAAK,YAAY,MAAM;CACzB,OAAO;EACL,MAAM,SAAS,CAAC,GAAG,KAAK,MAAM;EAE9B,KAAK,MAAM,SAAS,KAAK,UAAU;GACjC,SAAS,KAAK;GACd,OAAO,KAAK,GAAG,MAAM,SAAS;EAChC;EAEA,OAAO,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;EAEvC,MAAM,CAAC,cAAc;EAErB,KAAK,UAAU,cAAc,KAAK,QAAQ,KAAK,QAAQ;EACvD,KAAK,YAAY;EACjB,IAAI,OAAO,WAAW,KAAK,eAAe,KAAA,GACxC,KAAK,YAAY,WAAW;OAE5B,KAAK,YAAY,OAAO,OAAO,OAAO,KAAK,SAAS,KAAK,IAAI,CAAC;CAElE;AACF;;;;;AA6LU,mBAAA,OAAO;;;;;;;;;;;;AA/KjB,IAAa,gBAAb,MAAa,cAAc;CAsBzB,YACE,QACA,SACA,aACA;;;;;EACA,uBAAA,SAAA,MAAe,MAAA;EACf,uBAAA,YAAA,MAAgB,OAAA;EAChB,uBAAA,gBAAA,MAAoB,WAAA;EACpB,uBAAA,eAAA,MAAqB,OAAO,WAAW,CAAA;CACzC;;;;;;;;;;CAWA,OAAc,QAAQ,cAA6D;EACjF,MAAM,aAA6B,CAAA;EACnC,MAAM,eAA8B,CAAA;EACpC,MAAM,YAA4B,CAAA;EAClC,MAAM,cAAkC,CAAA;EACxC,MAAM,kCAAkB,IAAI,IAAsB;EAElD,KAAK,MAAM,QAAQ,cAAc;GAE/B,MAAM,QAAQ,UAAU;GACxB,MAAM,OAAO,KAAK,QAAQ;GAC1B,MAAM,OAAuB,CAAA;GAC7B,IAAI,SAA6B;GACjC,IAAI,YAAY;GAEhB,IAAI,WAAW;GAEf,KAAK,MAAM,cAAc,KAAK,aAAa;IAEzC,IAAI,OAAO,SAAS,MAAM,cAAc,UAAU,eAAe,UAAU;IAE3E,IAAI,SAAS,KAAA,GAAW;KACtB,OAAO;MACL,QAAQ,CAAA;MACR,SAAS,CAAA;MACT,UAAU,CAAA;MACV,WAAW,CAAA;MACX,WAAW,CAAA;MACX;KACF;KACA,SAAS,KAAK,IAAI;KAGlB,IAAI,CAAC,gBAAgB,IAAI,UAAU,GAAG;MACpC,gBAAgB,IAAI,UAAU;MAC9B,YAAY,KAAK,UAAU;KAC7B;IACF;IAEA,IAAI,WAAW,SAAS,eACtB,YAAY;IAGd,KAAK,KAAK,IAAI;IACd,SAAS;IACT,WAAW,KAAK;GAClB;GAEA,MAAM,OAAqB;IACzB;IACA;IACA;IACA,SAAS,KAAK;IACd;IACA,WAAW,OAAO,OAAO,CAAC,IAAI,CAAC;GACjC;GAEA,IAAI,WAAW,MACb,WAAW,KAAK,IAAI;QAEpB,OAAO,OAAO,KAAK,IAAI;GAGzB,UAAU,KAAK,IAAI;EACrB;EAEA,KAAK,MAAM,SAAS,cAClB,SAAS,KAAK;EAGhB,IAAI;EACJ,IAAI;EAEJ,IAAI,WAAW,WAAW,KAAK,aAAa,WAAW,GAAG;GACxD,MAAM,CAAC,SAAS;GAEhB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MAAM,gBAAgB;GAGlC,cAAc,CACZ;IACE,MAAM;IACN,MAAM;GACR,CAAC;GAEH,gBAAgB,MAAM;EACxB,OAAO;GACL,MAAM,YAAY,CAAC,GAAG,UAAU;GAEhC,KAAK,MAAM,SAAS,cAClB,UAAU,KAAK,GAAG,MAAM,SAAS;GAGnC,cAAc,cAAc,YAAY,YAAY;GACpD,gBAAgB,UAAU,UAAU,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;EAChE;EAEA,OAAO,IAAI,cAAc,eAAe,aAAa,WAAW;CAClE;;;;CAKA,IAAW,SAAkC;EAC3C,OAAA,uBAAA,SAAO,IAAA;CACT;;;;;CAMA,IAAW,cAA2C;EACpD,OAAA,uBAAA,gBAAO,IAAA;CACT;;;;CAKA,IAAW,eAAwB;EACjC,OAAA,uBAAA,eAAO,IAAA;CACT;;;;CAKA,IAAW,OAAe;EACxB,OAAA,uBAAA,SAAO,IAAA,CAAA,CAAa;CACtB;;;;CAKA,CAAA,oBAA2D;EACzD,OAAA,uBAAA,SAAO,IAAA,CAAA,CAAa,OAAO,SAAS,CAAC;CACvC;;;;;;;;CASA,CAAQ,QAAwC;EAC9C,KAAK,MAAM,SAAA,uBAAA,YAAS,IAAA,GAClB,IAAI,MAAM,SAAS,QACjB,OAAO,MAAM,MAAM,IAAI;CAG7B;;;;;;;;;;;CAYA,eAAsB,OAAqC;EACzD,OAAO,IAAI,aAAa,KAAK;CAC/B;;;;;;;;;;;;CAaA,MAAa,OAAO,MAAoB,OAAuB,MAAiC;EAG9F,MAAM,WAAW,KAAK,KAAK,WAAW;EAEtC,eAAe,IAAI,OAAe,OAAkC;GAClE,MAAM,YAAY,SAAS;GAE3B,IAAI,cAAc,KAAA,GAChB,OAAO;GAGT,MAAM,OAAqB;GAE3B,MAAM,MAAM,IAAI,cAAc;IAC5B,KAAK,MAAM;IACX,OAAO,MAAM;IACb,QAAQ,MAAM;IACd,QAAQ;GACV,CAAC;GACD,IAAI;GACJ,IAAI,gBAAgB;GACpB,IAAI,aAAa;GACjB,IAAI,cAAc;GAElB,SAAS,OAAsB;IAC7B,IAAI,YACF,OAAO,QAAQ,OACb,IAAI,uCAAuC;KACzC,MAAM,KAAK,WAAW;KACtB,WAAW;IACb,CAAC,CACH;IAGF,aAAa;IAGb,IAAI;IAEJ,IAAI;KACF,UAAU,mBAAmB,KAAK,YAAY,KAAK,QAAQ;KAC3D,kBAAkB,GAAG;IACvB,SAAS,IAAI;KACX,OAAO,QAAQ,OAAO,EAAE;IAC1B;IAEA,OAAO,QAAQ,IAAI,YAAY;KAC7B,IAAI;MACF,mBAAmB,MAAM,IAAI,QAAQ,GAAG,OAAO;MAC/C,gBAAgB;KAClB,UAAU;MACR,cAAc;KAChB;IACF,CAAC;GACH;GAEA,MAAM,KAAK,WAAW,OAAO,KAAK,IAAI;GAEtC,MAAM,OAAO,eAAe;GAC5B,IAAI,CAAC,YACH,MAAM,IAAI,6BAA6B;IACrC,MAAM,KAAK,WAAW;IACtB,WAAW;GACb,CAAC;GAGH,IAAI,CAAC,aACH,MAAM,IAAI,8BAA8B;IACtC,MAAM,KAAK,WAAW;IACtB,WAAW;GACb,CAAC;GAGH,MAAM,cAAc,mBAAmB,KAAK,YAAY,KAAK,QAAQ;GAIrE,IAAI,eACF,OAAO;GAGT,OAAO;EACT;EAEA,OAAO,IAAI,GAAG,IAAI;CACpB;;;;;;;;;;CAWA,MAAa,aACX,MACA,OACA,QAC0B;EAE1B,MAAM,QAA2B,CAAA;EAEjC,IAAI;GACF,MAAM,WAAW,KAAK,KAAK,WAAW;GAEtC,eAAe,IAAI,OAAe,OAAkD;IAClF,MAAM,YAAY,SAAS;IAE3B,IAAI,cAAc,KAAA,GAChB,OAAO;IAGT,MAAM,OAAqB;IAE3B,MAAM,MAAM,IAAI,oBAAoB;KAClC,KAAK,MAAM;KACX,OAAO,MAAM;KACb,QAAQ,MAAM;KACd,QAAQ;IACV,CAAC;IACD,IAAI;IACJ,IAAI,aAAa;IACjB,IAAI,cAAc;IAElB,SAAS,OAAsB;KAC7B,IAAI,YACF,OAAO,QAAQ,OACb,IAAI,uCAAuC;MACzC,MAAM,KAAK,WAAW;MACtB,WAAW;KACb,CAAC,CACH;KAGF,aAAa;KAGb,IAAI;KAEJ,IAAI;MACF,UAAU,yBAAyB,KAAK,YAAY,KAAK,QAAQ;MACjE,kBAAkB,GAAG;KACvB,SAAS,IAAI;MACX,OAAO,QAAQ,OAAO,EAAE;KAC1B;KAEA,OAAO,QAAQ,IAAI,YAAY;MAC7B,IAAI;OACF,mBAAmB,MAAM,IAAI,QAAQ,GAAG,OAAO;MACjD,UAAU;OACR,cAAc;MAChB;KACF,CAAC;IACH;IAEA,IAAI;KACF,MAAM,KAAK,WAAW,aAAa,KAAK,IAAI;KAC5C,MAAM,OAAO,eAAe;KAC5B,IAAI,CAAC,YACH,MAAM,IAAI,6BAA6B;MACrC,MAAM,KAAK,WAAW;MACtB,WAAW;KACb,CAAC;KAGH,IAAI,CAAC,aACH,MAAM,IAAI,8BAA8B;MACtC,MAAM,KAAK,WAAW;MACtB,WAAW;KACb,CAAC;KAGH,MAAM,SAAS,yBAAyB,KAAK,YAAY,KAAK,QAAQ;KACtE,MAAM,KAAK,MAAM;KAEjB,IAAI,qBAAqB,KAAA,GACvB,OAAO;KAGT,OAAO;IACT,SAAS,IAAI;KAIX,IAAI,IAAI,gBAAgB,KAAA,GACtB,MAAM,KAAK,IAAI,WAAW;KAG5B,MAAM;IACR;GACF;GAEA,OAAO,MAAM,IAAI,GAAG,MAAM;EAC5B,SAAS,IAAI;GACX,MAAM,cAAc,OAAO,EAAE;GAC7B,MAAM;EACR;CACF;;;;;;;;;;;CAYA,MAAa,OAAO,OAAuB,MAAwC;EAGjF,MAAM,UAA0B,CAAA;EAEhC,eAAe,KAAK,MAAoB,OAAgB,WAAkC;GACxF,MAAM,OAAO,eAAe;GAI5B,MAAM,MAAM,IAAI,cAAc;IAC5B,KAAK,MAAM;IACX,OAAO,MAAM;IACb,QAAQ,MAAM;IACd,QAAQ;GACV,CAAC;GACD,IAAI,UAAU;GACd,IAAI,aAAa;GACjB,IAAI,cAAc;GAElB,SAAS,OAAsB;IAC7B,IAAI,YACF,OAAO,QAAQ,OACb,IAAI,uCAAuC;KACzC,MAAM,KAAK,WAAW;KACtB,WAAW;IACb,CAAC,CACH;IAGF,aAAa;IAGb,IAAI;IAEJ,IAAI;KACF,UAAU,mBAAmB,KAAK,YAAY,KAAK,QAAQ;KAC3D,kBAAkB,GAAG;IACvB,SAAS,IAAI;KACX,OAAO,QAAQ,OAAO,EAAE;IAC1B;IAEA,OAAO,QAAQ,IAAI,YAAY;KAC7B,IAAI;MAEF,UAAU,YAAY,KAAK,YAAY,WAAW,KAAK;MACvD,KAAK,MAAM,SAAS,KAAK,SACvB,IAAI,MAAM,SAAS,QACjB,MAAM,KAAK,MAAM,MAAM,SAAS,OAAO;WAEvC,QAAQ,KAAK;OACX,KAAK;OACL,MAAM;OACN,MAAM,MAAM;MACd,CAAC;KAGP,UAAU;MACR,cAAc;KAChB;IACF,CAAC;GACH;GAEA,MAAM,KAAK,WAAW,OAAO,KAAK,IAAI;GAEtC,MAAM,OAAO,eAAe;GAC5B,IAAI,CAAC,YACH,MAAM,IAAI,6BAA6B;IACrC,MAAM,KAAK,WAAW;IACtB,WAAW;GACb,CAAC;GAGH,IAAI,CAAC,aACH,MAAM,IAAI,8BAA8B;IACtC,MAAM,KAAK,WAAW;IACtB,WAAW;GACb,CAAC;EAEL;EAEA,KAAK,MAAM,SAAA,uBAAA,YAAS,IAAA,GAClB,IAAI,MAAM,SAAS,QACjB,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,GAAG;OAEtC,QAAQ,KAAK;GACX,KAAK,MAAM;GACX;GACA,MAAM,MAAM;EACd,CAAC;EAKL,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK;EAElD,OAAO;CACT;;;;;;;;;;;;;;CAeA,MAAa,OACX,OACA,SACA,qBACA,MACA,OACe;EACf,IAAI,QAAQ,WAAW,GACrB;EAGF,MAAM,YAAY,IAAI,IAAI,OAAO;EACjC,MAAM,YAAY,SAAgC,UAAU,IAAI,IAAI;EACpE,MAAM,aAA8B,CAAA;EAEpC,IAAI,kBAAgD;EAEpD,MAAM,eAAwC,CAAA;EAC9C,MAAM,oBAAoB,QAAQ,cAAoB;EAGtD,MAAM,aAAa,MAAoB,OAAgB,aAA2B;GAChF,WAAW,MACR,YAA2B;IAC1B,IAAI;KACF,MAAM,MAAM,MAAM,UAAU,KAAK;IACnC,SAAS,IAAI;KAEX,IAAI,MAAM,OAAO,SACf;KAGF,IAAI,cAAc,uBAAuB;MACvC,aAAa,IAAI,+BAA+B;MAEhD,IAAI,qBAAqB;OACvB,aAAa,KACX,IAAI,sBAAsB;QACxB,OAAO;QACP,OAAO,CAAC,KAAK,IAAI;OACnB,CAAC,CACH;OAEA,kBAAkB,QAAQ;MAC5B;MAEA;KACF;KAEA,OAAO,KAAK,+BAA+B;IAC7C;GACF,EAAA,CAAG,CACL;EACF;EAEA,MAAM,yBAAyB,WAAwC;GACrE,oBAAA,kBAAoB;EACtB;EAEA,MAAM,cAAc,SAA6B;GAE/C,IAAI,MAAM,OAAO,SACf;GAGF,aAAa,IAAI,qDAAqD,KAAK;GAE3E,IAAI,qBACF,sBAAsB,IAAI,sBAAsB,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;EAE3E;EAEA,MAAM,OAAO,OAAO,MAAoB,OAAgB,cAAqC;GAC3F,MAAM,eAAe,eAAe,MAAM,QAAQ;GAElD,MAAM,CAAC,aAAa;GAEpB,IAAI,cAAc,KAAA,GAChB;GAGF,MAAM,SAAS,aAAa,UAAU;GAKtC,IAAI,EAAE,UAAU,UAAU,YAAY;IACpC,MAAM,OAAO,eAAe;IAE5B,KAAK,MAAM,SAAS,KAAK,SACvB,IAAI,MAAM,SAAS,QACjB,MAAM,KAAK,MAAM,MAAM,OAAO,SAAS;SAClC;KACL,IAAI,CAAC,SAAS,MAAM,IAAI,GACtB;KAGF,IAAI,CAAC,MAAM,KAAK,WAAW;MACzB,WAAW,MAAM,IAAI;MACrB;KACF;KAEA,UAAU,MAAM,MAAM,OAAO,SAAS;IACxC;IAGF;GACF;GAEA,MAAM,OAAO,eAAe;GAI5B,MAAM,MAAM,IAAI,cAAc;IAC5B,KAAK,MAAM;IACX,OAAO,MAAM;IACb,QAAQ,MAAM;IACd,QAAQ;GACV,CAAC;GACD,IAAI,UAAU;GACd,IAAI,aAAa;GACjB,IAAI,cAAc;GAClB,IAAI,oBAAoB;GAExB,SAAS,OAAsB;IAC7B,IAAI,YACF,OAAO,QAAQ,OACb,IAAI,uCAAuC;KACzC,MAAM,KAAK,WAAW;KACtB,WAAW;IACb,CAAC,CACH;IAGF,aAAa;IAGb,IAAI;IAEJ,IAAI;KACF,UAAU,mBAAmB,KAAK,YAAY,KAAK,QAAQ;KAC3D,kBAAkB,GAAG;IACvB,SAAS,IAAI;KACX,OAAO,QAAQ,OAAO,EAAE;IAC1B;IAEA,OAAO,QAAQ,IAAI,YAAY;KAC7B,IAAI;MAGF,UAAU,YAAY,KAAK,YAAY,WAAW,KAAK;MACvD,MAAM,OAAO,eAAe;MAC5B,oBAAoB;MAEpB,KAAK,MAAM,SAAS,KAAK,SACvB,IAAI,MAAM,SAAS,QACjB,MAAM,KAAK,MAAM,MAAM,SAAS,OAAO;WAClC;OACL,IAAI,CAAC,SAAS,MAAM,IAAI,GACtB;OAGF,IAAI,CAAC,MAAM,KAAK,WAAW;QACzB,WAAW,MAAM,IAAI;QACrB;OACF;OAEA,UAAU,MAAM,MAAM,SAAS,OAAO;MACxC;KAEJ,UAAU;MACR,cAAc;KAChB;IACF,CAAC;GACH;GAEA,IAAI;IACF,MAAM,KAAK,WAAW,OAAO,KAAK,IAAI;IACtC,MAAM,OAAO,eAAe;IAC5B,IAAI,CAAC,YACH,MAAM,IAAI,6BAA6B;KACrC,MAAM,KAAK,WAAW;KACtB,WAAW;IACb,CAAC;IAGH,IAAI,CAAC,aACH,MAAM,IAAI,8BAA8B;KACtC,MAAM,KAAK,WAAW;KACtB,WAAW;IACb,CAAC;GAEL,SAAS,IAAI;IAEX,IAAI,MAAM,OAAO,SAAS;KACxB,IAAI,QACF,MAAM;KAGR;IACF;IAEA,IACE,cAAc,gCACd,cAAc,iCACd,cAAc,0CACd,cAAc,qCACd,cAAc,kCAEd,MAAM;IAIR,IAAI,mBAAmB;KACrB,IAAI,cAAc,uBAAuB;MACvC,IAAI,qBACF,MAAM;MAIR,aAAa,IAAI,+BAA+B;MAEhD;KACF;KAEA,OAAO,KAAK,+BAA+B;KAE3C;IACF;IAEA,IAAI,cAAc,uBAAuB;KACvC,aAAa,IAAI,+BAA+B;KAEhD,IAAI,qBAAqB;MACvB,MAAM,SAAS,IAAI,sBAAsB;OACvC,OAAO;OACP,OAAO,aAAa,KAAK,SAAS,KAAK,IAAI;MAC7C,CAAC;MAED,IAAI,QACF,MAAM;MAGR,sBAAsB,MAAM;KAC9B;IACF,OACE,OAAO,KAAK,+BAA+B;GAE/C;EACF;EAEA,KAAK,MAAM,SAAA,uBAAA,YAAS,IAAA,GAClB,IAAI,MAAM,SAAS,QACjB,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,GAAG;OACjC;GACL,IAAI,CAAC,SAAS,MAAM,IAAI,GACtB;GAGF,IAAI,CAAC,MAAM,KAAK,WAAW;IACzB,WAAW,MAAM,IAAI;IACrB;GACF;GAEA,UAAU,MAAM,MAAM,MAAM,MAAM,GAAG;EACvC;EAIF,IAAI,oBAAoB,MAGtB,MAAMC;EAIR,MAAM,QAAQ,KAAK,CAAC,QAAQ,WAAW,UAAU,GAAG,kBAAkB,OAAO,CAAC;EAE9E,MAAM,CAAC,eAAe;EAEtB,IAAI,gBAAgB,KAAA,GAClB,MAAM;CAEV;;;;;;;;;;;;;;;;;CAkBA,MAAa,gBACX,OACA,QACA,SACA,UAAkC,CAAC,GACR;EAC3B,MAAM,EAAE,UAAU,gBAAgB;EAClC,MAAM,UAAgC,CAAA;EACtC,IAAI,aAAa;EAMjB,MAAM,OAAO,OACX,MACA,OACA,cAIW;GACX,MAAM,eAAe,aAAa,KAAA,IAAY,KAAK,YAAY,eAAe,MAAM,QAAQ;GAE5F,IAAI,aAAa,WAAW,GAC1B,OAAO;GAGT,MAAM,OAAO,eAAe;GAE5B,MAAM,MAAM,IAAI,oBAAoB;IAClC,KAAK,MAAM;IACX,OAAO,MAAM;IACb,QAAQ,MAAM;IACd,QAAQ;GACV,CAAC;GACD,IAAI,UAAkB;GACtB,IAAI;GACJ,IAAI,aAAa;GACjB,IAAI,cAAc;GAClB,IAAI,oBAAoB;GACxB,IAAI;GACJ,IAAI,qBAAqB;GACzB,IAAI,gBAAgB;GAEpB,SAAS,OAAsB;IAC7B,IAAI,YACF,OAAO,QAAQ,OACb,IAAI,uCAAuC;KACzC,MAAM,KAAK,WAAW;KACtB,WAAW;IACb,CAAC,CACH;IAGF,aAAa;IAGb,IAAI;IAEJ,IAAI;KACF,UAAU,yBAAyB,KAAK,YAAY,KAAK,QAAQ;KACjE,kBAAkB,GAAG;IACvB,SAAS,IAAI;KACX,OAAO,QAAQ,OAAO,EAAE;IAC1B;IAEA,OAAO,QAAQ,IAAI,YAAY;KAC7B,IAAI;MAEF,SAAS;MACT,QAAQ,IAAI,MAAM;MAIlB,UAAU,YAAY,KAAK,YAAY,WAAW,KAAK;MACvD,MAAM,OAAO,eAAe;MAC5B,oBAAoB;MAGpB,MAAM,gBAAgB,KAAK,QAAQ,QAAQ,UAAU;OACnD,IAAI,MAAM,SAAS,QACjB,OAAO,aAAa,KAAA,KAAa,SAAS,MAAM,IAAI;OAGtD,MAAM,SAAS,MAAM,KAAK;OAE1B,OAAO,aAAa,KAAA,KAAa,OAAO,KAAK,QAAQ;MACvD,CAAC;MAED,IAAI,cAAc,WAAW,GAAG;OAC9B,gBAAgB;OAEhB;MACF;MAEA,MAAM,WAA8B,CAAA;MACpC,IAAI,UAAU;MAEd,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KACxC,IAAI,IAAI,cAAc,SAAS,GAAG;OAChC,MAAM,CAAC,QAAQ,QAAQ,QAAQ,IAAI;OACnC,QAAQ,IAAI,MAAM;OAClB,QAAQ,IAAI,IAAI;OAChB,SAAS,KAAK,MAAM;OACpB,UAAU;MACZ,OACE,SAAS,KAAK,OAAO;MAIzB,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;OAC7C,MAAM,QAAQ,cAAc;OAC5B,MAAM,SAAS,SAAS;OAExB,IAAI,UAAU,KAAA,KAAa,WAAW,KAAA,GACpC,MAAM,IAAI,MAAM,uBAAuB;OAGzC,IAAI,MAAM,SAAS,QACjB,QAAQ,KAAK;QACX,KAAK;QACL,MAAM,MAAM;QACZ;OACF,CAAC;YAID,IAAI,MAFgB,KAAK,MAAM,MAAM,QAAQ,OAAO,MAEtC,MAGZ,QAAQ,UAAU,OAAO,uBAAO,IAAI,MAAM,gBAAgB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;MAGlF;KACF,SAAS,IAAI;MAEX,kBAAkB;MAClB,qBAAqB;MACrB,MAAM;KACR,UAAU;MACR,cAAc;KAChB;IACF,CAAC;GACH;GAEA,IAAI;IACF,MAAM,KAAK,WAAW,aAAa,KAAK,IAAI;IAC5C,MAAM,OAAO,eAAe;IAC5B,IAAI,CAAC,YACH,MAAM,IAAI,6BAA6B;KACrC,MAAM,KAAK,WAAW;KACtB,WAAW;IACb,CAAC;IAGH,IAAI,CAAC,aACH,MAAM,IAAI,8BAA8B;KACtC,MAAM,KAAK,WAAW;KACtB,WAAW;IACb,CAAC;GAEL,SAAS,IAAI;IAIX,IAAI,IAAI,gBAAgB,KAAA,GACtB,QAAQ,IAAI,IAAI,WAAW;IAI7B,IAAI,MAAM,OAAO,SACf,MAAM;IAGR,IACE,cAAc,gCACd,cAAc,iCACd,cAAc,0CACd,cAAc,qCACd,cAAc,kCAEd,MAAM;IAIR,IAAI,mBAAmB;KAErB,IAAI,sBAAsB,OAAO,iBAC/B,MAAM;KAIR,IAAI,gBAAgB,KAAA,GAAW;MAC7B,IAAI,cAAc,uBACZ;WAAA,YAAY,IAAI,YAAY,GAE9B,OAAO,WAAW,KAAA,IACd,OACA;QACE,KAAK;QACL;OACF;MAAA;MAIR,OAAO,KAAK,+BAA+B;MAE3C,OAAO,WAAW,KAAA,IACd,OACA;OACE,KAAK;OACL;MACF;KACN;KAEA,MAAM;IACR;IAEA,IAAI,gBAAgB,KAAA,KAAa,YAAY,IAAI,YAAY,GAAG;KAI9D,MAAM,YAAY,UAAU,IAAI;KAEhC,IAAI,cAAc,KAAA,GAEhB,QAAQ,UAAU,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;KAGxD,OAAO;IACT;IAEA,MAAM;GACR;GAEA,IAAI,iBAAiB,WAAW,KAAA,GAC9B,OAAO;GAGT,OAAO;IACL,KAAK;IACL;GACF;EACF;EAEA,IAAI;GAEF,IAAI,YAAY;GAEhB,IAAI,QAAQ,cAAc,MAAM;IAC9B,MAAM,CAAC,aAAa,QAAQ,OAAO,IAAI;IACvC,QAAQ,IAAI,WAAW;IACvB,QAAQ,IAAI,IAAI;IAChB,YAAY;IACZ,aAAa;GACf;GAKA,IAAA,uBAAA,SAFoB,IAAA,CAAA,CAAa,QAAQ,SAAS,aAAa,KAAA,KAAa,SAAS,IAAI,CAErF,CAAW,CAAC,WAAW,KAAA,uBAAA,YAAK,IAAA,CAAA,CAAc,WAAW,GACvD,OAAO;IACL;IACA;GACF;GAGF,MAAM,oBAAA,uBAAA,YAAoB,IAAA,CAAA,CAAc,QAAQ,UAAU;IACxD,IAAI,MAAM,SAAS,QACjB,OAAO,aAAa,KAAA,KAAa,SAAS,MAAM,IAAI;IAGtD,OAAO,aAAa,KAAA,KAAa,MAAM,KAAK,UAAU,KAAK,QAAQ;GACrE,CAAC;GAED,IAAI,kBAAkB,SAAS,GAAG;IAChC,MAAM,WAA8B,CAAA;IACpC,IAAI,UAAU;IAEd,KAAK,IAAI,IAAI,GAAG,IAAI,kBAAkB,QAAQ,KAC5C,IAAI,IAAI,kBAAkB,SAAS,GAAG;KACpC,MAAM,CAAC,QAAQ,QAAQ,QAAQ,IAAI;KACnC,QAAQ,IAAI,MAAM;KAClB,QAAQ,IAAI,IAAI;KAChB,SAAS,KAAK,MAAM;KACpB,UAAU;IACZ,OACE,SAAS,KAAK,OAAO;IAIzB,KAAK,IAAI,IAAI,GAAG,IAAI,kBAAkB,QAAQ,KAAK;KACjD,MAAM,QAAQ,kBAAkB;KAChC,MAAM,SAAS,SAAS;KAExB,IAAI,UAAU,KAAA,KAAa,WAAW,KAAA,GACpC,MAAM,IAAI,MAAM,uBAAuB;KAGzC,IAAI,MAAM,SAAS,QACb;UAAA,aAAa,KAAA,KAAa,SAAS,MAAM,IAAI,GAC/C,QAAQ,KAAK;OACX,KAAK,MAAM;OACX,MAAM,MAAM;OACZ;MACF,CAAC;KAAA,OAGH,IAAI;MAGF,IAAI,MAFgB,KAAK,MAAM,MAAM,QAAQ,MAAM,GAAG,MAExC,MAGZ,QAAQ,UAAU,OAAO,uBAAO,IAAI,MAAM,gBAAgB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;KAEhF,SAAS,IAAI;MACX,IAAI,aAKE;WAAA,YAAY,IAJD,MAAM,KAAK,UAAU,QACjC,SAAS,aAAa,KAAA,KAAa,SAAS,IAAI,CAG/B,CAAM,GAAG;QAG3B,QAAQ,UAAU,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACnD;OACF;;MAGF,MAAM;KACR;IAEJ;GACF;EACF,SAAS,IAAI;GAEX,MAAM,cAAc,SAAS,EAAE;GAC/B,MAAM;EACR;EAEA,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK;EAElD,OAAO;GACL;GACA;EACF;CACF;AACF;;;AC/vCA,MAAa,qBAA8C,OAAO;AAElE,MAAa,sBAAqE,KAChF,MAAM,CACJ,QAEG,UAAU,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,YAAY,OAC7E,4BACF,GACA,OAAO,oBAAoB,QAAQ,CAAC,CAAC,CACtC,GACD,WACG,UAAyF;CACxF,IAAI,OAAO,YAAY,OACrB,OAAO,CAAC,GAAG,KAAK;CAGlB,OAAO,OAAO,QAAQ,KAAK;AAC7B,CACF,CACF;AAEA,MAAa,sBAA4E,MAAM,CAC7F,mBAAmB,CACpB;AAED,MAAa,oBAMT,OAAO;;;;CAIT,QAAQ,SAAS,SAAS,WAAW,CAAC;;;;CAKtC,MAAM,SAAS,mBAAmB;AACpC,CAAC;AAED,MAAa,iBAGT,MAAM,CAAC,SAAS,iBAAiB,CAAC,CAAC;AAEvC,MAAa,qBAMT,OAAO;;;;CAIT,QAAQ,SAAS,SAAS,WAAW,CAAC;;;;CAKtC,MAAM,SAAS,mBAAmB;AACpC,CAAC;AAED,MAAa,kBAGT,MAAM,CAAC,SAAS,kBAAkB,CAAC,CAAC;AAExC,MAAa,mBAQT,OAAO;CACT,KAAK,OAAO;CACZ,MAAM,SAAS,mBAAmB;CAClC,OAAO,QAAQ;CACf,QAAQ,SAAS,SAAS,WAAW,CAAC;AACxC,CAAC;AAED,MAAa,gBAkBT,MAAM,CACR,MAAM,CAAC,gBAAgB,CAAC,GACxB,KACE,MAAM;CACJ,iBAAiB,QAAQ;CACzB,iBAAiB,QAAQ;CACzB,SAAS,KAAK,kBAAkB,CAAC,OAAO,OAAO,CAAC,CAAC;AAAC,CACnD,GACD,WACG,CAAC,KAAK,OAAO,aAiBT,CACH;CACE,GAAG;CACH;CACA;AACF,CAAC,CAEL,CACF,CAAC,CACF;AAED,MAAa,mBAST,OAAO;CACT,KAAK,OAAO;CACZ,MAAM,SAAS,mBAAmB;CAClC,QAAQ,SAAS,QAAQ,CAAC;CAC1B,QAAQ,SAAS,SAAS,WAAW,CAAC;CACtC,qBAAqB,SAAS,QAAQ,CAAC;AACzC,CAAC;AAED,MAAa,gBAoBT,MAAM,CACR,MAAM,CAAC,gBAAgB,CAAC,GACxB,KACE,MAAM,CAAC,iBAAiB,QAAQ,KAAK,SAAS,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAC/E,WACG,CAAC,KAAK,aAmBF,CACH;CACE,GAAG;CACH;AACF,CAAC,CAEL,CACF,CAAC,CACF;AAED,MAAa,sBAST,OAAO;CACT,KAAK,OAAO;CACZ,MAAM,SAAS,mBAAmB;CAClC,QAAQ,SAAS,QAAQ,CAAC;CAC1B,QAAQ,SAAS,SAAS,WAAW,CAAC;CACtC,qBAAqB,SAAS,QAAQ,CAAC;AACzC,CAAC;AAED,MAAa,mBAoBT,MAAM,CACR,MAAM,CAAC,mBAAmB,CAAC,GAC3B,KACE,MAAM,CAAC,oBAAoB,QAAQ,KAAK,SAAS,KAAK,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GACrF,WACG,CAAC,KAAK,aAmBF,CACH;CACE,GAAG;CACH;AACF,CAAC,CAEL,CACF,CAAC,CACF;AAED,MAAa,mBAOT,OAAO;CACT,KAAK,OAAO;CACZ,MAAM,SAAS,mBAAmB;CAClC,QAAQ,SAAS,SAAS,WAAW,CAAC;AACxC,CAAC;AAED,MAAa,gBAgBT,MAAM,CACR,MAAM,CAAC,gBAAgB,CAAC,GACxB,KACE,MAAM,CAAC,iBAAiB,QAAQ,KAAK,SAAS,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAC/E,WACG,CAAC,KAAK,aAeF,CACH;CACE,GAAG;CACH;AACF,CAAC,CAEL,CACF,CAAC,CACF;AAED,MAAa,sBAOT,OAAO;CACT,KAAK,OAAO;CACZ,MAAM,SAAS,mBAAmB;CAClC,QAAQ,SAAS,SAAS,WAAW,CAAC;AACxC,CAAC;AAED,MAAa,mBAgBT,MAAM,CACR,MAAM,CAAC,mBAAmB,CAAC,GAC3B,KACE,MAAM,CAAC,oBAAoB,QAAQ,KAAK,SAAS,KAAK,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GACrF,WACG,CAAC,KAAK,aAeF,CACH;CACE,GAAG;CACH;AACF,CAAC,CAEL,CACF,CAAC,CACF;AAED,MAAa,qBAMT,OAAO;;;;CAIT,QAAQ,SAAS,SAAS,WAAW,CAAC;;;;CAKtC,MAAM,SAAS,mBAAmB;AACpC,CAAC;AAED,MAAa,kBAGT,MAAM,CAAC,SAAS,kBAAkB,CAAC,CAAC;;;;;;;;AClZxC,MAAa,qBAAoD,uBAAO,IACtE,2BACF;;;;;AAwEA,IAAM,4BAAN,MAAgE;CAG9D,YAAmB,SAAiC;;EAClD,uBAAA,UAAA,MAAgB,IAAI,IAAI,OAAO,QAAQ,OAAO,CAAC,CAAA;CACjD;CAEA,QAAe,KAA0C;EACvD,OAAA,uBAAA,UAAO,IAAA,CAAA,CAAc,IAAI,GAAG;CAC9B;AACF;;;;;;;;AAOA,IAAM,6BAAN,MAAiE;CAK/D,YAAmB,SAAkC;;;EACnD,uBAAA,WAAA,MAAgB,OAAA;EAChB,IAAI,QAAQ,SAAS,GACnB,uBAAA,YAAA,MAAkB,MAAM,QAAQ,KAAK,CAAC,eAAe,SAAS,CAAC,CAAA;CAEnE;CAEA,QAAe,KAA0C;EACvD,IAAI;EAEJ,KAAK,MAAM,CAAC,WAAW,gBAAA,uBAAA,WAAgB,IAAA,GAGrC,IAFeC,YAAU,WAAW,GAEhC,CAAM,CAAC,SAAS;GAClB,WAAW;GACX;EACF;EAGF,IAAI,aAAa,KAAA,KAAA,uBAAA,YAAa,IAAA,GAAiB;GAC7C,MAAM,SAASA,YAAAA,uBAAAA,YAAU,IAAA,GAAiB,GAAG;GAE7C,IAAI,CAAC,OAAO,SACV,MAAM,IAAI,kBAAkB;IAC1B,OAAO;IACP,QAAQ,OAAO;GACjB,CAAC;EAEL;EAEA,OAAO;CACT;AACF;;;;;;;;AASA,SAAgB,0BAA0B,QAAgD;CACxF,IAAI,MAAM,QAAQ,MAAM,GACtB,OAAO,IAAI,2BAA2B,MAAM;CAG9C,OAAO,IAAI,0BAA0B,MAAM;AAC7C;;;;;;;;;;;;;;AC9KA,SAAwB,cACtB,gBACA,gBACA,iBACiB;CACjB,MAAM,2BAAW,IAAI,IAAI;CACzB,MAAM,SAAS,eAAe,UAAU;CAExC,eAAe,qBAAoC;EACjD,MAAM,oBAAoB,UAAU,WAAW,YAAY;GACzD,IAAI;IAEF,kBAAkB;IAClB,MAAM,OAAO,OAAO;GACtB,SAAS,IAAI;IACX,OAAO,KAAK,uCAAuC;GACrD;GAEA,MAAM,eAAe;EACvB,CAAC;CACH;CAGA,MAAM,cAAc,IAAI,eAAkB;EACxC,MAAM,KAAK,YAA2B;GACpC,IAAI;IACF,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;IAE1C,IAAI,MAAM;KAER,MAAM,mBAAmB;KACzB,WAAW,MAAM;IACnB,OACE,WAAW,QAAQ,KAAK;GAE5B,SAAS,IAAI;IAGX,MAAM,mBAAmB,CAAC,CAAC,OAAO,iBAAiB;KACjD,OAAO,KAAK,mCAAmC;IACjD,CAAC;IACD,WAAW,MAAM,EAAE;GACrB;EACF;EAEA,MAAM,SAAwB;GAC5B,MAAM,mBAAmB;EAC3B;CACF,CAAC;CA2DD,OAzDe,OAAO,OACpB,aAGA,GACG,OAAO,eAAe,mBACzB,GAGA,EACE,SAAS,mBACX,GAGA,EACE,QAAQ,OAAO,iBAAwC;EACrD,MAAM,IAAI,KAAK,UAAU;EAEzB,IAAI;GAEF,OAAO,MAAM;IACX,MAAM,EAAE,MAAM,UAAU,MAAM,EAAE,KAAK;IAErC,IAAI,MACF;IAGF,MAAM;GACR;EACF,SAAS,IAAI;GAEX,IAAI;IACF,MAAM,EAAE,OAAO,EAAE;GACnB,SAAS,aAAa;IACpB,OAAO,KAAK,4BAA4B;GAC1C;GAEA,MAAM;EACR,UAAU;GAER,IAAI;IACF,MAAM,mBAAmB;GAC3B,SAAS,IAAI;IACX,OAAO,KAAK,mCAAmC;GACjD;GAGA,IAAI;IACF,EAAE,YAAY;GAChB,SAAS,IAAI;IACX,OAAO,KAAK,oCAAoC;GAClD;EACF;CACF,EACF,CAGK;AACT;;;;;;ACtHA,MAAM,wBAAwB,KAC5B,QAAQ,GACR,OACG,UAAU,CAAC,iBAAiB,KAAK,GAClC,uDACF,CACF;;;;AAKA,MAAM,yBAAyB,KAC7B,QAAQ,GACR,MAAM,kBAAkB,uDAAuD,CACjF;;;;;;;;;;;AAYA,SAAgB,cAAc,MAAuB,OAAyB;CAC5E,IAAI,iBAAiB,KAAK,GAAG;EAC3B,IAAI,KAAK,SAAS,SAEhB,WAAW,uBAAuB,KAAK;EAIzC,OAAO,MAAM,YACX,IAAI,gBAAgB,EAClB,UAAU,OAAO,YAAY;GAC3B,WAAW,QAAQ,WAAW,KAAK,QAAQ,KAAK,CAAC;EACnD,EACF,CAAC,CACH;CACF;CAEA,IAAI,KAAK,SAAS,UAEhB,WAAW,wBAAwB,KAAK;CAG1C,OAAO,WAAW,KAAK,QAAQ,KAAK;AACtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACiBA,MAAM,iBACJ,OAAO,yBAAyB,aAC5B,OACA,IAAI,sBAA0C,SAAS;CACrD,IAAI,CAAC,KAAK,KAAK,UACb,KAAK,KAAK,QAAQ;CAMpB,KAAK,QAAQ,CAAC,CAAC,OAAO,OAAO;EAC3B,OAAO,KAAK,mCAAmC;CACjD,CAAC;AACH,CAAC;;;;;;;AA+iBE,uBAAA,OAAO;;;;AA3fhB,IAAqB,SAArB,MAAwF;;;;CA4BtF,YACE,MACA,UACA,sBAAmD,MACnD;;;;;;;EACA,uBAAA,MAAA,MAAY,IAAA;EACZ,uBAAA,QAAA,sBAAc,IAAI,IAAI,CAAA;EACtB,uBAAA,WAAA,MAAiB,IAAA;EACjB,uBAAA,WAAA,MAAiB,QAAA;EACjB,uBAAA,wBAAA,MAA4B,mBAAA;CAC9B;CAMA,QAAe,GAAG,MAAuB;EACvC,MAAM,CAAC,QAAQ,WAAW,qBAAqB,IAAI;EACnD,uBAAA,WAAA,MAAiB,IAAA;EAEjB,OAAO;CACT;CAMA,WAAkB,GAAG,MAAuB;EAC1C,MAAM,CAAC,QAAQ,WAAW,qBAAqB,IAAI;EAEnD,MAAM,MAAM,IAAI,IAAA,uBAAA,WAAI,IAAA,CAAc;EAElC,KAAK,MAAM,CAAC,MAAM,UAAU,MAC1B,IAAI,IAAI,MAAM,KAAK;EAGrB,uBAAA,WAAA,MAAiB,CAAC,GAAG,GAAG,CAAA;EAExB,OAAO;CACT;CAMA,aAAoB,GAAG,MAAuB;EAC5C,MAAM,CAAC,QAAQ,WAAW,qBAAqB,IAAI;EAEnD,MAAM,MAAM,IAAI,IAAI,IAAI;EAExB,KAAK,MAAM,CAAC,MAAM,UAAA,uBAAA,WAAU,IAAA,GAC1B,IAAI,IAAI,MAAM,KAAK;EAGrB,uBAAA,WAAA,MAAiB,CAAC,GAAG,GAAG,CAAA;EAExB,OAAO;CACT;CAmFA,IAAW,SAAkB;EAC3B,OAAA,uBAAA,MAAO,IAAA,MAAc;CACvB;CAGA,MAAa,KAAK,GAAG,MAA0B;EAC7C,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,kBAAkB;EAG9B,MAAM,CAAC,UAAU,CAAC,KAAK,WAAW,gBAAgB,IAAI;EACtD,MAAM,EAAE,MAAM,YAAY,QAAQ,iBAAiB;EAEnD,MAAM,KAAK,IAAI,gBAAgB;EAC/B,MAAM,SAAS,eAAe,CAAC,GAAG,QAAQ,YAAY,CAAC;EAEvD,MAAM,gBAAA,kBAAA,eAAgB,MAAA,oBAAA,CAAA,CAAA,KAAA,MAA0B,UAAU;EAC1D,eAAe,MAAM;EACrB,uBAAA,QAAA,IAAA,CAAA,CAAY,IAAI,EAAE;EAElB,MAAM,UAAmC,CAAA;EAEzC,IAAI;;;IACY,YAAA,EAAA,MAAM,SAAS,MAAM,MAAM,CAAA;IAEzC,IAAI;KACF,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,kBAAkB;KAG9B,MAAM,UAKA,CAAA;KAGN,KAAK,MAAM,CAAC,OAAO,SAAA,uBAAA,WAAS,IAAA,CAAA,CAAe,OAAO,QAAQ,GACxD,QAAQ,KAAK;MACX,YAA2B;OACzB,MAAM,aAAa,IAAI,IAAI,aAAa;OACxC,MAAM,IAAI,IAAI,YAAY;QACxB,MAAM,WAAW,QAAQ;QACzB;OACF,CAAC;OACD,MAAM,KAAK,QAAQ,KAAK,CAAC;OACzB,QAAQ,KAAK,YAAY;QACvB,IAAI;SACF,MAAM,KAAK,IAAI,aAAa;UAC1B,MAAM,WAAW,QAAQ;UACzB;SACF,CAAC;SACD,MAAM,KAAK,QAAQ,MAAM,EAAE;QAC7B,SAAS,IAAI;SACX,OAAO,KAAK,4BAA4B;QAC1C;OACF,CAAC;MACH;MACA;MACA,KAAK;MACL;KAAK,CACN;KAKH,KAAK,MAAM,CAAC,OAAO,eAAA,uBAAA,WAAe,IAAA,CAAA,CAAe,YAAY,QAAQ,GACnE,QAAQ,KAAK;MACX,YAA2B;OACzB,MAAM,aAAa,IAAI,IAAI,aAAa;OACxC,MAAM,IAAI,IAAI,YAAY;QACxB,MAAM,WAAW,QAAQ;QACzB;OACF,CAAC;OACD,MAAM,WAAW,KAAK,CAAC;OACvB,QAAQ,KAAK,YAAY;QACvB,IAAI;SACF,MAAM,KAAK,IAAI,aAAa;UAC1B,MAAM,WAAW,QAAQ;UACzB;SACF,CAAC;SACD,MAAM,WAAW,MAAM,EAAE;QAC3B,SAAS,IAAI;SACX,OAAO,KAAK,+BAA+B;QAC7C;OACF,CAAC;MACH;MACA;MACA,WAAW;MACX;KAAK,CACN;KAIH,MAAM,SAKA,CAAA;KACN,MAAM,QAAQ,IACZ,QAAQ,IAAI,OAAO,CAAC,GAAG,QAAQ,MAAM,WAAW;MAC9C,IAAI;OACF,MAAM,EAAE;MACV,SAAS,IAAI;OACX,OAAO,KAAK;QACV;QACA;QACA;QACA,QAAQ;OACV,CAAC;MACH;KACF,CAAC,CACH;KAEA,IAAI,OAAO,SAAS,GAAG;MAErB,IAAI,OAAO,WAAW,OAAO,OAAO,UAAU,MAAM,WAAW,OAAO,MAAM,GAC1E,MAAM,OAAO;MAGf,MAAM,IAAI,8BAA8B;OACtC,QAAQ;OACR;MACF,CAAC;KACH;KAIA,eAAe,MAAM;KAErB,uBAAA,MAAA,MAAY;MACV;MACA,IAAI,IAAI,SAAS;KACnB,CAAA;IACF,SAAS,IAAI;KACX,IAAI,QAAQ,SAAS,GACnB,MAAM,QAAQ,IACZ,QAAQ,IAAI,OAAO,MAAM;MACvB,MAAM,EAAE;KACV,CAAC,CACH;KAGF,MAAM;IACR;;;;;;EACF,UAAU;GACR,uBAAA,QAAA,IAAA,CAAA,CAAY,OAAO,EAAE;EACvB;CACF;CAsHA,MAAa,GAAG,MAA0B;EACxC,IAAI;GACF,MAAM,CAAC,UAAU,CAAC,KAAK,WAAW,iBAAiB,IAAI;GACvD,MAAM,EAAE,MAAM,YAAY,SAAS,YAAY,QAAQ,GAAI,MAAM;GAEjE,MAAM,gBAAA,kBAAA,eAAgB,MAAA,oBAAA,CAAA,CAAA,KAAA,MAA0B,UAAU;GAE1D,IAAA,uBAAA,MAAI,IAAA,MAAc,MAAM;IACtB,MAAM,QAAQ,CAAC,GAAA,uBAAA,QAAG,IAAA,CAAW;IAE7B,uBAAA,QAAA,IAAA,CAAA,CAAY,MAAM;IAElB,KAAK,MAAM,MAAM,OACf,IAAI,CAAC,GAAG,OAAO,SACb,GAAG,MAAM,IAAI,qBAAqB,CAAC;IAIvC,MAAM,IAAI,qBAAqB;GACjC;GAEA,MAAM,MAAA,uBAAA,MAAM,IAAA;GACZ,MAAM,EAAE,OAAO;GACf,MAAM,QAAQ,CAAC,IAAI,GAAA,uBAAA,QAAG,IAAA,CAAW;GAEjC,uBAAA,QAAA,IAAA,CAAA,CAAY,MAAM;GAElB,KAAK,MAAM,YAAY,OACrB,IAAI,CAAC,SAAS,OAAO,SACnB,SAAS,MAAM,IAAI,qBAAqB,CAAC;GAI7C,MAAM,WAAW,EAAE,gBAAgB,MAAM;GAEzC,OAAA,kBAAA,eAAO,MAAA,MAAA,CAAA,CAAA,KAAA,MAAY,eAAe,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,OAAO,eAAe;IAGnF,IAAA,uBAAA,MAAI,IAAA,MAAc,KAAK;KACrB,uBAAA,MAAA,MAAY,IAAA;KAIZ,IAAI,CAAC,SAAS,gBAAgB;MAC5B,MAAM,gBAAgB,YAAY,QAAQ,GAAI;MAC9C,MAAM,QAAQ,IACZ,CACE,GAAA,uBAAA,WAAG,IAAA,CAAA,CAAe,OAAO,KAAK,SAAS,KAAK,OAAO,GACnD,GAAA,uBAAA,WAAG,IAAA,CAAA,CAAe,WAAW,CAC9B,CAAC,IAAI,OAAO,WAAW;OACtB,IAAI;QACF,MAAM,IAAI,IAAI,aAAa;SACzB,MAAM,IAAI,IAAI,aAAa,CAAC,CAAC,QAAQ;SACrC,QAAQ;QACV,CAAC;QACD,MAAM,OAAO,MAAM,CAAC;OACtB,SAAS,cAAc;QACrB,OAAO,KAAK,+CAA+C;OAC7D;MACF,CAAC,CACH;KACF;IACF;IAEA,MAAM;GACR,CAAC;EACH,SAAS,IAAI;GACX,OAAO,QAAQ,OAAO,EAAE;EAC1B;CACF;CAEA,OAAA,wBAA6C;EAC3C,IAAI,CAAC,KAAK,QACR;EAGF,MAAM,KAAK,MAAM,EACf,QAAQ,YAAY,QAAQ,GAAI,EAClC,CAAC;CACH;CA4TA,MAAa,IAAI,GAAG,MAA0B;EAC5C,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,qBAAqB;EAGjC,MAAM,CAAC,WAAW,WAAW,eAAe,IAAI;EAChD,MAAM,EAAE,KAAK,MAAM,YAAY,QAAQ,iBAAiB;EAExD,MAAM,cAAA,kBAAA,eAAc,MAAA,mBAAA,CAAA,CAAA,KAAA,MAAyB,GAAG;EAEhD,MAAM,QAAQ,cAAc,cAAc,aAAa,QAAQ,KAAK,IAAI,QAAQ;EAEhF,MAAM,EAAE,IAAI,OAAA,uBAAA,MAAO,IAAA;EACnB,MAAM,SAAS,eAAe,CAAC,GAAG,QAAQ,YAAY,CAAC;EAEvD,MAAM,QAAA,kBAAA,eAAQ,MAAA,qBAAA,CAAA,CAAA,KAAA,MAA2B,UAAU;EAGnD,MAAM,SAAS,iBAAiB,KAAK,IAAI,QAAQ;EACjD,IAAI,aAAa,WAAW;EAE5B,IAAI;;;IACY,WAAA,EAAA,MAAM,SAAS,SAAS,MAAM,MAAM,CAAA;IAElD,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,qBAAqB;IAIjC,MAAM,aAAa,IAAI,WAAW;KAChC;KACA;KACA;IACF,CAAC;IACD,MAAA,kBAAA,eAAM,MAAA,IAAA,CAAA,CAAA,KAAA,MAAU,SAAS,UAAU;IAEnC,eAAe,MAAM;IAGrB,IAAI,WAAW,MAAM;KAEnB,aAAa;KACb,MAAA,kBAAA,eAAM,MAAA,UAAA,CAAA,CAAA,KAAA,MAAgB,IAAI,QAAQ,KAAK,OAAO,MAAM;IACtD,OACE,MAAA,kBAAA,eAAM,MAAA,SAAA,CAAA,CAAA,KAAA,MAAe,IAAI,QAAQ,KAAK,OAAO,KAAK;;;;;;EAEtD,SAAS,IAAI;GACX,IAAI,cAAc,WAAW,MAE3B,IAAI;IACF,MAAM,OAAO,OAAO,EAAE;GACxB,QAAQ,CACN;GAIJ,MAAM;EACR;CACF;CAgEA,MAAa,IAAI,GAAG,MAA6B;;;GAC/C,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,qBAAqB;GAGjC,MAAM,CAAC,WAAW,WAAW,eAAe,IAAI;GAChD,MAAM,EACJ,KACA,MAAM,YACN,SAAS,OACT,QAAQ,cACR,sBAAsB,UACpB;GAEJ,MAAM,cAAA,kBAAA,eAAc,MAAA,mBAAA,CAAA,CAAA,KAAA,MAAyB,GAAG;GAEhD,MAAM,EAAE,IAAI,OAAA,uBAAA,MAAO,IAAA;GACnB,MAAM,SAAS,eAAe,CAAC,GAAG,QAAQ,YAAY,CAAC;GAEvD,MAAM,QAAA,kBAAA,eAAQ,MAAA,qBAAA,CAAA,CAAA,KAAA,MAA2B,UAAU;GAErC,WAAA,EAAA,MAAM,SAAS,SAAS,MAAM,MAAM,CAAA;GAElD,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,qBAAqB;GAIjC,MAAM,YAAA,uBAAA,WAAY,IAAA,CAAA,CAAe,OAAO,KAAK,SAAS,KAAK,IAAI;GAC/D,MAAM,aAAa,IAAI,WAAW;IAChC;IACA;IACA,QAAQ,SACJ;KACE,SAAS;KACT,SAAS;IACX,IACA;KACE,SAAS;KACT,SAAS,CAAA;IACX;IACJ;GACF,CAAC;GACD,MAAA,kBAAA,eAAM,MAAA,IAAA,CAAA,CAAA,KAAA,MAAU,QAAQ,UAAU;GAElC,eAAe,MAAM;GACrB,IAAI,OAAgB,KAAA;GACpB,IAAI,MAA2B;GAC/B,MAAM,UAA0B,CAAA;GAChC,MAAM,SAA8B,CAAA;GAGpC,IAAA;;IACkB,WAAA,EAAA,OAAO,SACnB,GAAG,KAAK;KACN;KACA;IACF,CAAC,IACD,GAAG,MAAM;KACP;KACA;IACF,CAAC,EAAA;IAEL,MAAM,WAAA,uBAAA,WAAW,IAAA,CAAA,CAAe,eAAe;KAC7C;KACA;KACA;IACF,CAAC;IAED,KAAK,MAAM,QAAA,uBAAA,WAAQ,IAAA,GAAgB;KACjC,MAAM,WAAW,SAAS,QAAQ,IAAI;KACtC,MAAM,gBAAgB,IAAI,WAAW;MACnC,KAAK,SAAS;MACd;MACA;KACF,CAAC;KACD,MAAM,aAAa,SACf;MACE,SAAS;MACT,SAAS;KACX,IACA;MACE,SAAS;MACT,SAAS,CAAA;KACX;KACJ,MAAM,cAAc,IAAI,WAAW;MACjC,KAAK,SAAS;MACd;MACA,QAAQ;MACR;KACF,CAAC;KAED,IAAI;MACF,IAAI,CAAE,MAAM,KAAK,QAAQ,OAAO,aAAa,GAAI;OAC/C,QAAQ,KAAK,IAAI;OACjB;MACF;MAEA,OAAO,MAAM,KAAK,QAAQ,KAAK,WAAW;MAC1C,MAAM;MACN;KACF,SAAS,IAAI;MACX,IAAI,OAAO,SACT,MAAM;MAGR,OAAO,KAAK;OACV,MAAM,KAAK;OACX,OAAO,KAAK;OACZ,QAAQ;MACV,CAAC;MACD,OAAO,KAAK,kCAAkC;KAChD;IACF;IAEA,IAAI,QAAQ,MACV,MAAA,kBAAA,eAAM,MAAA,SAAA,CAAA,CAAA,KAAA,MAAe,KAAK,MAAM;IAGlC,IAAI,QAEF,OAAO,MAAA,kBAAA,eAAM,MAAA,YAAA,CAAA,CAAA,KAAA,MAAkB,MAAM,KAAK,SAAS,OAAO,KAAK,QAAQ,mBAAmB;;;;;;GAI9F,IAAI,CAAC,QAEH,OAAO,MAAA,uBAAA,WAAM,IAAA,CAAA,CAAe,OAC1B,IAAI,MACJ;IACE;IACA;IACA;GACF,GACA,IACF;GAIF,IAAI,aACF,OAAO,YAAY,YAAY,QAAQ,IAAI;GAG7C,OAAO;;;;;;CACT;CASA,MAAa,OAAO,GAAG,MAAkC;EACvD,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,qBAAqB;EAGjC,MAAM,CAAC,WAAW,WAAW,kBAAkB,IAAI;EACnD,MAAM,EACJ,KACA,MAAM,YACN,SAAS,OACT,QAAQ,cACR,sBAAsB,UACpB;EAEJ,MAAM,cAAA,kBAAA,eAAc,MAAA,mBAAA,CAAA,CAAA,KAAA,MAAyB,GAAG;EAEhD,MAAM,EAAE,IAAI,OAAA,uBAAA,MAAO,IAAA;EACnB,MAAM,SAAS,eAAe,CAAC,GAAG,QAAQ,YAAY,CAAC;EAEvD,MAAM,QAAA,kBAAA,eAAQ,MAAA,qBAAA,CAAA,CAAA,KAAA,MAA2B,UAAU;EAEnD,IAAA;;GACgB,WAAA,EAAA,MAAM,SAAS,SAAS,MAAM,MAAM,CAAA;GAElD,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,qBAAqB;GAIjC,MAAM,YAAA,uBAAA,WAAY,IAAA,CAAA,CAAe,OAAO,KAAK,SAAS,KAAK,IAAI;GAC/D,MAAM,aAAa,IAAI,cAAc;IACnC;IACA;IACA,QAAQ,SACJ;KACE,SAAS;KACT,SAAS;IACX,IACA;KACE,SAAS;KACT,SAAS,CAAA;IACX;IACJ;GACF,CAAC;GACD,MAAA,kBAAA,eAAM,MAAA,IAAA,CAAA,CAAA,KAAA,MAAU,QAAQ,UAAU;GAElC,eAAe,MAAM;GAErB,MAAM,OAAY,CAAC;GACnB,IAAI,IAAqB;GACzB,IAAI,MAA2B;GAC/B,MAAM,UAA0B,CAAA;GAChC,MAAM,SAA8B,CAAA;GACpC,MAAM,eAAkC,CAAA;GACxC,MAAM,YAA6B,CAAA;GACnC,IAAI,WAAmC;GACvC,IAAI,cAA2D;GAI/D,MAAM,SAAS,OAAO,SAClB,GAAG,KAAK;IACN;IACA;GACF,CAAC,IACD,GAAG,MAAM;IACP;IACA;GACF,CAAC;GAEL,IAAI;IAEF,MAAM,WAAA,uBAAA,WAAW,IAAA,CAAA,CAAe,eAAe;KAC7C;KACA;KACA;IACF,CAAC;IAED,KAAK,MAAM,QAAA,uBAAA,WAAQ,IAAA,GAAgB;KACjC,MAAM,WAAW,SAAS,QAAQ,IAAI;KACtC,MAAM,gBAAgB,IAAI,WAAW;MACnC,KAAK,SAAS;MACd;MACA;KACF,CAAC;KACD,MAAM,iBAAiB,SACnB;MACE,SAAS;MACT,SAAS;KACX,IACA;MACE,SAAS;MACT,SAAS,CAAA;KACX;KACJ,MAAM,kBAAkB,IAAI,cAAc;MACxC,KAAK,SAAS;MACd;MACA,QAAQ;MACR;KACF,CAAC;KAED,IAAI;MACF,IAAI,CAAE,MAAM,KAAK,QAAQ,OAAO,aAAa,GAAI;OAC/C,QAAQ,KAAK,IAAI;OACjB;MACF;MAEA,IAAI,MAAM,KAAK,QAAQ,YAAY,eAAe;MAClD,MAAM;MACN;KACF,SAAS,IAAI;MACX,IAAI,OAAO,SACT,MAAM;MAGR,OAAO,KAAK;OACV,MAAM,KAAK;OACX,OAAO,KAAK;OACZ,QAAQ;MACV,CAAC;MACD,OAAO,KAAK,kCAAkC;KAChD;IACF;IAEA,IAAI,QAAQ,MACV,MAAA,kBAAA,eAAM,MAAA,SAAA,CAAA,CAAA,KAAA,MAAe,KAAK,MAAM;IAIlC,WAAW,SAAS,IAAI,gBAAgB,IAAI;IAC5C,MAAM,eAAe,WAAW,eAAe,CAAC,QAAQ,SAAS,MAAM,CAAC,IAAI;IAG5E,MAAM,QAAQ,WAAqC;KACjD,aAAa,KAAK,OAAO,MAAM;KAC/B,UAAU,MACP,YAA2B;MAC1B,IAAI;OACF,MAAM,KAAK,IAAI,WAAW;QACxB,KAAK,OAAO;QACZ;QACA,QAAQ;OACV,CAAC;OACD,MAAM,IAAI,MAAM,OAAO,KAAK,QAAQ,YAAY,EAAE;OAClD,MAAM,OAAO,OAAO,OAAO,GAAG,EAAE,QAAQ,aAAa,CAAC;MACxD,SAAS,IAAI;OAEX,IAAI;QACF,MAAM,OAAO,OAAO,OAAO,EAAE;OAC/B,QAAQ,CACN;OAIF,IAAI,aAAa,SACf;OAGF,IAAI,cAAc,uBAAuB;QACvC,aAAa,IAAI,+BAA+B;QAEhD;OACF;OAEA,OAAO,KAAK,+BAA+B;MAC7C;KACF,EAAA,CAAG,CACL;IACF;IAGA,cAAc,OAAO,WAAmC;KACtD,UAAU,MAAM,MAAM;KACtB,MAAM,QAAQ,IACZ,aAAa,IAAI,OAAO,WAAW;MACjC,IAAI;OACF,MAAM,OAAO,OAAO,MAAM;MAC5B,QAAQ,CACN;KAEJ,CAAC,CACH;KACA,MAAM,QAAQ,IAAI,SAAS;IAC7B;IAIA,IAAI,MAAA,uBAAA,WAAM,IAAA,CAAA,CAAe,aACvB,IAAI,MACJ;KACE;KACA;KACA;IACF,GACA,CACF;IAEA,IAAI,QAAQ;KAEV,MAAM,4BAAY,IAAI,IAAkB;KAExC,KAAK,MAAM,QAAQ,SAAS;MAC1B,IAAI,CAAC,KAAK,WAAW;OAEnB,IAAI,OAAO,SACT;OAGF,aAAa,IAAI,qDAAqD,KAAK;OAE3E,IAAI,qBACF,MAAM,IAAI,sBAAsB,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;OAGxD;MACF;MAEA,UAAU,IAAI,IAAI;KACpB;KAEA,IAAI,UAAU,OAAO,GAAG;MAEtB,MAAM,0BAAU,IAAI,IAAqB,CAAC,CAAC,CAAC;MAC5C,MAAM,OAAO,MAAA,uBAAA,WAAM,IAAA,CAAA,CAAe,gBAChC;OACE;OACA;OACA;MACF,GACA,GACA,SACA;OACE,WAAW,SAAuB,UAAU,IAAI,IAAI;OACpD,WAAW;OACX,cAAc,IAAa,iBAA0C;QAEnE,eAAe,MAAM;QAErB,IAAI,cAAc,uBAAuB;SACvC,aAAa,IAAI,+BAA+B;SAEhD,IAAI,qBACF,MAAM,IAAI,sBAAsB;UAC9B,OAAO;UACP,OAAO,aAAa,KAAK,SAAS,KAAK,IAAI;SAC7C,CAAC;SAGH,OAAO;QACT;QAEA,OAAO,KAAK,+BAA+B;QAE3C,MAAM;OACR;MACF,CACF;MACA,IAAI,KAAK;MAET,KAAK,MAAM,UAAU,KAAK,SACxB,KAAK,MAAM;KAEf;KAEA,eAAe,MAAM;IACvB;IAGA,IAAI,aACF,IAAI,EAAE,YACJ,IAAI,gBAAgB,EAClB,UAAU,OAAO,YAAkB;KACjC,WAAW,QAAQ,YAAY,YAAY,QAAQ,KAAK,CAAC;IAC3D,EACF,CAAC,CACH;IAIF,IAAI,YAAY;IAEhB,IAAI,UACF,IAAI,EAAE,YACJ,IAAI,gBAAgB;KAClB,QAAc;MACZ,YAAY;KACd;KACA,UAAU,OAAO,YAAkB;MACjC,WAAW,QAAQ,KAAK;KAC1B;IACF,CAAC,CACH;IAKF,MAAM,sBAA4B;KAChC,IAAI,CAAC,WACH,UAAU,MAAM,OAAO,MAAM;IAEjC;IAGA,MAAM,UAAU,YAA2B;KACzC,IAAI;MACF,MAAM,QAAQ,IAAI,SAAS;KAC7B,UAAU;MACR,IAAI;OACF,OAAO,QAAQ;MACjB,QAAQ,CACN;KAEJ;IACF;IAEA,IAAI,CAAC,gBACH,OAAO,cAAc,GAAG,SAAS,aAAa;IAGhD,MAAM,kBAAkB,CAAC;IACzB,MAAM,cAAc,cAClB,GACA,YAAY;KACV,IAAI;MACF,eAAe,WAAW,eAAe;KAC3C,QAAQ,CACN;KAGF,MAAM,QAAQ;IAChB,GACA,aACF;IAGA,eAAe,SACb,aACA;KACE,MAAM;KACN,SAAS,YAAY;IACvB,GACA,eACF;IAEA,OAAO;GACT,SAAS,IAAI;IACX,MAAM,cAAc,EAAE;IAEtB,IAAI,MAAM,MAER,IAAI;KACF,MAAM,EAAE,OAAO,EAAE;IACnB,QAAQ,CACN;IAIJ,OAAO,QAAQ;IAEf,MAAM;GACR;;;;;;CAEJ;CAOA,MAAa,IAAI,GAAG,MAA6B;;;GAC/C,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,qBAAqB;GAGjC,MAAM,CAAC,WAAW,WAAW,eAAe,IAAI;GAChD,MAAM,EAAE,KAAK,MAAM,YAAY,QAAQ,iBAAiB;GAGxD,kBAAA,eAAA,MAAA,mBAAA,CAAA,CAAA,KAAA,MAAyB,GAAG;GAE5B,MAAM,EAAE,IAAI,OAAA,uBAAA,MAAO,IAAA;GACnB,MAAM,SAAS,eAAe,CAAC,GAAG,QAAQ,YAAY,CAAC;GAEvD,MAAM,QAAA,kBAAA,eAAQ,MAAA,qBAAA,CAAA,CAAA,KAAA,MAA2B,UAAU;GAErC,YAAA,EAAA,MAAM,SAAS,SAAS,MAAM,MAAM,CAAA;GAElD,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,qBAAqB;GAKjC,MAAM,aAAa,IAAI,WAAW;IAChC;IACA;IACA;GACF,CAAC;GACD,MAAA,kBAAA,eAAM,MAAA,IAAA,CAAA,CAAA,KAAA,MAAU,QAAQ,UAAU;GAElC,eAAe,MAAM;GAEL,YAAA,EAAA,MAAM,GAAG,MAAM;IAC7B;IACA;GACF,CAAC,CAAA;GAGD,MAAM,SAA8B,CAAA;GACpC,MAAM,WAAA,uBAAA,WAAW,IAAA,CAAA,CAAe,eAAe;IAC7C;IACA;IACA;GACF,CAAC;GAED,KAAK,MAAM,QAAA,uBAAA,WAAQ,IAAA,GAAgB;IACjC,MAAM,WAAW,SAAS,QAAQ,IAAI;IAEtC,IAAI;KACF,MAAM,IAAI,IAAI,WAAW;MACvB,KAAK,SAAS;MACd;MACA;KACF,CAAC;KAED,IAAI,MAAM,KAAK,QAAQ,OAAO,CAAC,GAC7B,OAAO;IAEX,SAAS,IAAI;KACX,IAAI,OAAO,SACT,MAAM;KAGR,OAAO,KAAK;MACV,MAAM,KAAK;MACX,OAAO,KAAK;MACZ,QAAQ;KACV,CAAC;KAED,OAAO,KAAK,2CAA2C;IACzD;GACF;GAGA,IAAI,OAAO,SAAS,GAClB,MAAA,kBAAA,eAAM,MAAA,SAAA,CAAA,CAAA,KAAA,MAAe,KAAK,MAAM;GAGlC,OAAO;;;;;;CACT;CAOA,MAAa,OAAO,GAAG,MAA0B;;;GAC/C,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,qBAAqB;GAGjC,MAAM,CAAC,WAAW,WAAW,kBAAkB,IAAI;GACnD,MAAM,EAAE,KAAK,MAAM,YAAY,QAAQ,iBAAiB;GAGxD,kBAAA,eAAA,MAAA,mBAAA,CAAA,CAAA,KAAA,MAAyB,GAAG;GAE5B,MAAM,EAAE,IAAI,OAAA,uBAAA,MAAO,IAAA;GACnB,MAAM,SAAS,eAAe,CAAC,GAAG,QAAQ,YAAY,CAAC;GAEvD,MAAM,QAAA,kBAAA,eAAQ,MAAA,qBAAA,CAAA,CAAA,KAAA,MAA2B,UAAU;GAErC,YAAA,EAAA,MAAM,SAAS,SAAS,MAAM,MAAM,CAAA;GAElD,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,qBAAqB;GAKjC,MAAM,aAAa,IAAI,cAAc;IACnC;IACA;IACA;GACF,CAAC;GACD,MAAA,kBAAA,eAAM,MAAA,IAAA,CAAA,CAAA,KAAA,MAAU,UAAU,UAAU;GAEpB,YAAA,EAAA,MAAM,GAAG,KAAK;IAC5B;IAEA;GACF,CAAC,CAAA;GAED,MAAM,SAA8B,CAAA;GACpC,MAAM,WAAA,uBAAA,WAAW,IAAA,CAAA,CAAe,eAAe;IAC7C;IACA;IACA;GACF,CAAC;GACD,MAAM,QAAQ,IAAA,uBAAA,WACZ,IAAA,CAAA,CAAe,OAAO,IAAI,OAAO,SAAS;IACxC,MAAM,WAAW,SAAS,QAAQ,IAAI;IACtC,MAAM,gBAAgB,IAAI,WAAW;KACnC,KAAK,SAAS;KACd;KACA;IACF,CAAC;IACD,MAAM,gBAAgB,IAAI,cAAc;KACtC,KAAK,SAAS;KACd;KACA;IACF,CAAC;IAED,IAAI;KACF,IAAI,MAAM,KAAK,QAAQ,OAAO,aAAa,GACzC,MAAM,KAAK,QAAQ,OAAO,aAAa;IAE3C,SAAS,IAAI;KACX,OAAO,KAAK;MACV,MAAM,KAAK;MACX,OAAO,KAAK;MACZ,QAAQ;KACV,CAAC;IACH;GACF,CAAC,CACH;GAEA,IAAI,OAAO,SAAS,GAClB,MAAM,IAAI,8BAA8B;IACtC,QAAQ;IACR;IACA,QAAQ;GACV,CAAC;;;;;;CAEL;CAGA,MAAa,MAAM,GAAG,MAA0B;;;GAC9C,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,qBAAqB;GAGjC,MAAM,CAAC,UAAU,CAAC,KAAK,WAAW,iBAAiB,IAAI;GACvD,MAAM,EAAE,MAAM,YAAY,QAAQ,iBAAiB;GAEnD,MAAM,EAAE,IAAI,OAAA,uBAAA,MAAO,IAAA;GACnB,MAAM,SAAS,eAAe,CAAC,GAAG,QAAQ,YAAY,CAAC;GAEvD,MAAM,QAAA,kBAAA,eAAQ,MAAA,qBAAA,CAAA,CAAA,KAAA,MAA2B,UAAU;GAErC,YAAA,EAAA,MAAM,SAAS,SAAS,MAAM,MAAM,CAAA;GAElD,IAAA,uBAAA,MAAI,IAAA,MAAc,MAChB,MAAM,IAAI,qBAAqB;GAGjB,YAAA,EAAA,MAAM,GAAG,KAAK,EAAE,OAAO,CAAC,CAAA;GAExC,MAAM,aAAa,IAAI,aAAa;IAClC;IACA;GACF,CAAC;GACD,MAAA,kBAAA,eAAM,MAAA,IAAA,CAAA,CAAA,KAAA,MAAU,SAAS,UAAU;GAEnC,eAAe,MAAM;GAErB,MAAM,SAA8B,CAAA;GACpC,MAAM,QAAQ,IAAA,uBAAA,WACZ,IAAA,CAAA,CAAe,OAAO,IAAI,OAAO,MAAM,UAAU;IAC/C,IAAI;KACF,MAAM,IAAI,IAAI,aAAa;MACzB;MACA;KACF,CAAC;KACD,MAAM,KAAK,QAAQ,MAAM,CAAC;IAC5B,SAAS,IAAI;KACX,OAAO,KAAK;MACV,MAAM,KAAK;MACX;MACA,QAAQ;KACV,CAAC;IACH;GACF,CAAC,CACH;GAEA,IAAI,OAAO,SAAS,GAClB,MAAM,IAAI,8BAA8B;IACtC,QAAQ;IACR;IACA,QAAQ;GACV,CAAC;;;;;;CAEL;AACF;;;;;;;;AArkDE,SAAA,qBAAqB,MAAmE;CACtF,MAAM,MAAM,IAAI,IAAA,uBAAA,WAAI,IAAA,CAAc;CAElC,IAAI,MACF,KAAK,MAAM,CAAC,GAAG,MAAM,MACnB,IAAI,IAAI,GAAG,CAAC;CAIhB,OAAO;AACT;;;;;;;;;;AAWA,SAAA,sBAAsB,MAA6D;CACjF,OAAO,qBAAqB,CAAC,GAAA,uBAAA,WAAG,IAAA,GAAgB,GAAI,QAAQ,CAAA,CAAG,CAAC;AAClE;;;;;;;;AASA,SAAA,oBAAoB,KAA0C;CAC5D,OAAA,uBAAA,wBAAO,IAAA,CAAA,EAA2B,QAAQ,GAAG;AAC/C;;;;;;;;;AAUA,SAAA,UAAU,KAAa,QAAwD;CAC7E,MAAM,OAA6B,EAAE,IAAI;CAEzC,QAAQ,OAAO,QAAf;EACE,KAAK,GACH;EAGF,KAAK,GAAG;GACN,MAAM,CAAC,cAAc;GAErB,IAAI,eAAe,KAAA,GACjB,KAAK,QAAQ,WAAW;GAG1B;EACF;EAEA,SACE,KAAK,QAAQ,IAAI,8BAA8B;GAC7C,QAAQ;GACR;GACA,QAAQ;EACV,CAAC;CAEL;CAEA,OAAO,IAAI,iBAAiB,IAAI;AAClC;AA0JA,eAAA,OACE,eACA,QACA,KACA,UACe;;;EACD,WAAA,EAAA,MAAM,SAAS,MAAM,MAAM,CAAA;EAEzC,IAAA,uBAAA,MAAI,IAAA,MAAc,KAChB,MAAM,IAAI,qBAAqB;EAGjC,MAAM,EAAE,OAAA,uBAAA,MAAO,IAAA;EACC,WAAA,EAAA,MAAM,GAAG,KAAK,EAAE,OAAO,CAAC,CAAA;EACxC,MAAM,WAMA,CAAA;EAIN,KAAK,MAAM,CAAC,OAAO,SAAA,uBAAA,WAAS,IAAA,CAAA,CAAe,OAAO,QAAQ,GAAG;GAC3D,MAAM,sBACJ,IAAI,aAAa;IACf,MAAM,IAAI,IAAI,aAAa,CAAC,CAAC,QAAQ;IACrC;GACF,CAAC;GAEH,MAAM,2BACJ,IAAI,aAAa;IACf,MAAM,IAAI,IAAI,aAAa,CAAC,CAAC,QAAQ;IACrC,QAAQ,YAAY,QAAQ,GAAI;GAClC,CAAC;GACH,SAAS,KAAK;UACS,KAAK,QAAQ,MAAM,cAAc,CAAC;UAClC,KAAK,QAAQ,WAAW,mBAAmB,CAAC;IACjE;IACA,KAAK;IACL;GAAK,CACN;EACH;EAGA,KAAK,MAAM,CAAC,OAAO,WAAA,uBAAA,WAAW,IAAA,CAAA,CAAe,YAAY,QAAQ,GAAG;GAClE,MAAM,sBACJ,IAAI,aAAa;IACf,MAAM,IAAI,IAAI,aAAa,CAAC,CAAC,QAAQ;IACrC;GACF,CAAC;GAEH,MAAM,2BACJ,IAAI,aAAa;IACf,MAAM,IAAI,IAAI,aAAa,CAAC,CAAC,QAAQ;IACrC,QAAQ,YAAY,QAAQ,GAAI;GAClC,CAAC;GACH,SAAS,KAAK;UACS,OAAO,MAAM,cAAc,CAAC;UAC5B,OAAO,WAAW,mBAAmB,CAAC;IAC3D;IACA,OAAO;IACP;GAAK,CACN;EACH;EAGA,SAAS,iBAAiB;EAC1B,MAAM,SAKA,CAAA;EACN,MAAM,UAAmC,CAAA;EACzC,MAAM,QAAQ,IACZ,SAAS,IAAI,OAAO,CAAC,GAAG,OAAO,QAAQ,MAAM,WAAW;GACtD,IAAI;IACF,MAAM,EAAE;GACV,SAAS,IAAI;IACX,OAAO,KAAK;KACV;KACA;KACA;KACA,QAAQ;IACV,CAAC;IAED,QAAQ,KAAK,KAAK;GACpB;EACF,CAAC,CACH;EAEA,IAAI,OAAO,SAAS,GAAG;GAGrB,MAAM,QAAQ,IACZ,QAAQ,IAAI,OAAO,MAAM;IACvB,IAAI;KACF,MAAM,EAAE;IACV,SAAS,IAAI;KACX,OAAO,KAAK,qCAAqC;IACnD;GACF,CAAC,CACH;GAEA,MAAM,IAAI,8BAA8B;IACtC,QAAQ;IACR;GACF,CAAC;EACH;EAEA,uBAAA,MAAA,MAAY,IAAA;;;;;;AACd;;;;;;;;;AA4FA,eAAA,cACE,SAIA,OACA,QACA,QACA,QACe;CACf,IAAI,OAAO,WAAW,GACpB;CAGF,MAAM,QAAQ,IAAI,8BAA8B;EAC9C,QAAQ;EACR;EACA,QAAQ;CACV,CAAC;CACD,MAAM,eAA0B,CAAA;CAChC,MAAM,QAAQ,IACZ,QAAQ,IAAI,OAAO,WAAW;EAE5B,IAAI,OAAO,IAAI,OAAO,IAAI,GACxB;EAGF,IAAI;GACF,MAAM,IAAI,IAAI,WAAW;IACvB,KAAK,OAAO;IACZ;IACA;GACF,CAAC;GACD,MAAM,OAAO,KAAK,QAAQ,kBAAkB,GAAG,KAAK;EACtD,SAAS,IAAI;GACX,aAAa,KAAK,EAAE;EACtB;CACF,CAAC,CACH;CAEA,IAAI,aAAa,SAAS,GACxB,OAAO,MAAM,IAAI,eAAe,cAAc,wBAAwB,CAAC;CAGzE,MAAM;AACR;;;;;;;;;;;;AAaA,eAAA,KACE,QACA,GACe;CACf,eAAe,EAAE,MAAM;CAEvB,MAAM,cAAA,uBAAA,WAAc,IAAA,CAAA,CAAe;CACnC,MAAM,WAAW,OAAO,UAAiC;EACvD,MAAM,kBAAkB,YAAY;EAEpC,IAAI,oBAAoB,KAAA,GACtB;EAGF,MAAM,aAA+B;EAErC,IAAI,aAAa;EACjB,IAAI,cAAc;EAClB,IAAI;EACJ,IAAI,qBAAqB;EAEzB,SAAS,OAAsB;GAC7B,IAAI,YAAY;IAEd,MAAM,YAAY,QAAQ,OACxB,IAAI,uCAAuC;KACzC,MAAM,WAAW;KACjB,WAAW;IACb,CAAC,CACH;IAGA,UAAU,YAAY,CAAC,CAAC;IAExB,OAAO;GACT;GAEA,aAAa;GAEb,MAAM,UAAU,QAAQ,IAAI,YAAY;IACtC,IAAI;KACF,MAAM,SAAS,QAAQ,CAAC;IAC1B,SAAS,IAAI;KAEX,kBAAkB;KAClB,qBAAqB;KACrB,MAAM;IACR,UAAU;KACR,cAAc;IAChB;GACF,CAAC;GAGD,QAAQ,YAAY,CAAC,CAAC;GAEtB,OAAO;EACT;EAEA,IAAI;GACF,MAAM,WAAW,IAAI,GAAG,IAAI;GAC5B,eAAe,EAAE,MAAM;GACvB,IAAI,CAAC,YACH,MAAM,IAAI,6BAA6B;IACrC,MAAM,WAAW;IACjB,WAAW;GACb,CAAC;GAGH,IAAI,CAAC,aACH,MAAM,IAAI,8BAA8B;IACtC,MAAM,WAAW;IACjB,WAAW;GACb,CAAC;EAEL,SAAS,IAAI;GAEX,IAAI,EAAE,OAAO,WAAW,OAAO,EAAE,OAAO,QACtC,MAAM;GAIR,IACE,cAAc,gCACd,cAAc,iCACd,cAAc,wCAEd,MAAM;GAIR,IAAI,sBAAsB,OAAO,iBAC/B,MAAM;GAGR,MAAM,IAAI,8BAA8B;IACtC;IACA,QAAQ,CACN;KACE,MAAM,WAAW;KACjB;KACA,QAAQ;IACV,CAAC;IAEH,QAAQ;GACV,CAAC;EACH;CACF;CACA,MAAM,SAAS,CAAC;AAClB;;;;;;;;;;AAWA,eAAA,UACE,IACA,QACA,KACA,OACA,OACe;;;EACf,MAAM,UAAU,MAAA,uBAAA,WAAM,IAAA,CAAA,CAAe,OACnC;GACE;GACA;GACA;EACF,GACA,KACF;EACgB,WAAA,EAAA,MAAM,GAAG,KAAK;GAC5B;GACA;EACF,CAAC,CAAA;EACD,MAAM,SAA8B,CAAA;EACpC,MAAM,yBAAS,IAAI,IAAkB;EACrC,MAAM,QAAQ,IACZ,QAAQ,IAAI,OAAO,WAAW;GAC5B,IAAI;IACF,MAAM,IAAI,IAAI,WAAW;KACvB,KAAK,OAAO;KACZ;KACA;IACF,CAAC;IACD,MAAM,OAAO,KAAK,QAAQ,MAAM,GAAG,OAAO,IAAI;GAChD,SAAS,IAAI;IACX,OAAO,KAAK;KACV,MAAM,OAAO,KAAK;KAClB,OAAO,OAAO,KAAK;KACnB,QAAQ;IACV,CAAC;IACD,OAAO,IAAI,OAAO,IAAI;GACxB;EACF,CAAC,CACH;EACA,MAAA,kBAAA,eAAM,MAAA,aAAA,CAAA,CAAA,KAAA,MAAmB,SAAS,OAAO,QAAQ,QAAQ,MAAM;;;;;;AACjE;;;;;;;;;;AAWA,eAAA,WACE,IACA,QACA,KACA,OACA,OACe;;;EACf,MAAM,0BAAU,IAAI,IAAqB,CAAC,KAAK,CAAC;EAChD,IAAI;EAEJ,IAAI;GACF,OAAO,MAAA,uBAAA,WAAM,IAAA,CAAA,CAAe,gBAC1B;IACE;IACA;IACA;GACF,GACA,OACA,OACF;EACF,SAAS,IAAI;GACX,MAAM,cAAc,SAAS,EAAE;GAC/B,MAAM;EACR;EAEgB,WAAA,EAAA,MAAM,GACnB,KAAK;GACJ;GACA;EACF,CAAC,CAAC,CACD,MAAM,OAAO,OAAO;GAGnB,MAAM,cAAc,SAAS,EAAE;GAC/B,MAAM;EACR,CAAC,CAAA;EAEH,MAAM,SAA8B,CAAA;EACpC,MAAM,yBAAS,IAAI,IAAkB;EACrC,MAAM,QAAQ,IACZ,KAAK,QAAQ,IAAI,OAAO,WAAW;GACjC,IAAI;IACF,MAAM,IAAI,IAAI,WAAW;KACvB,KAAK,OAAO;KACZ;KACA;IACF,CAAC;IACD,MAAM,IAAI,MAAM,OAAO,KAAK,QAAQ,YAAY,CAAC;IACjD,MAAM,OAAO,OAAO,OAAO,GAAG,EAAE,OAAO,CAAC;GAC1C,SAAS,IAAI;IAEX,IAAI;KACF,MAAM,OAAO,OAAO,OAAO,EAAE;IAC/B,QAAQ,CACN;IAGF,OAAO,KAAK;KACV,MAAM,OAAO,KAAK;KAClB,OAAO,OAAO,KAAK;KACnB,QAAQ;IACV,CAAC;IACD,OAAO,IAAI,OAAO,IAAI;GACxB;EACF,CAAC,CACH;EACA,MAAA,kBAAA,eAAM,MAAA,aAAA,CAAA,CAAA,KAAA,MAAmB,KAAK,SAAS,OAAO,QAAQ,QAAQ,MAAM;;;;;;AACtE;;;;;;;;;;;;;;AAmFA,eAAA,aACE,MACA,KACA,SACA,OACA,KACA,QACA,qBACkB;CAClB,MAAM,MAAM,MAAA,uBAAA,WAAM,IAAA,CAAA,CAAe,OAC/B,IAAI,MACJ;EACE;EACA;EACA;CACF,GACA,IACF;CACA,MAAA,uBAAA,WAAM,IAAA,CAAA,CAAe,OACnB;EACE;EACA;EACA;CACF,GACA,SACA,qBACA,KACA,OAAO,MAAM,UAAU,UAAU;EAC/B,MAAM,IAAI,IAAI,WAAW;GACvB,KAAK;GACL;GACA;EACF,CAAC;EACD,MAAM,KAAK,QAAQ,MAAM,GAAG,KAAK;CACnC,CACF;CAEA,eAAe,MAAM;CAErB,OAAO;AACT;;;;;;ACrrBF,SAAS,gBAAgB,OAAwC;CAC/D,OACE,OAAO,UAAU,YACjB,UAAU,QAEV,UAAU,SACV,OAAO,MAAM,YAAY;AAE7B;;;;AAKA,SAAS,kBAAkB,OAA0C;CACnE,OACE,OAAO,UAAU,YACjB,UAAU,QACV,sBAAsB,SACtB,MAAM,wBAAwB;AAElC;AAEA,MAAM,6BAA6B,OAAO;;;;CAIxC,QAAQ,SACN,MAAM,CACJ,MACE,MAAM,CAAC,OAAsB,eAAe,GAAG,OAAwB,iBAAiB,CAAC,CAAC,CAC5F,GACA,OAAO,OAAO,GAAG,OAAwB,iBAAiB,CAAC,CAAC,CAC7D,CACH;;;;CAKA,MAAM,SAAS,mBAAmB;AACpC,CAAC;AAED,MAAM,0BAA0B,MAAM,CAAC,SAAS,0BAA0B,CAAC,CAAC;;;;;;;;AAK5E,IAAqB,gBAArB,MAyBE;CAoCA,YAAmB,GAAG,MAAiB;;;;;EACrC,MAAM,CAAC,UAAU,CAAC,KAAK,WAAW,yBAAyB,IAAI;EAC/D,MAAM,EAAE,MAAM,WAAW;EAEzB,uBAAA,eAAA,MAAqB,CAAA,CAAA;EACrB,uBAAA,cAAA,MAAoB,CAAA,CAAA;EACpB,uBAAA,sBAAA,MAA4B,IAAA;EAC5B,uBAAA,OAAA,MAAa,IAAI,IAAI,IAAI,CAAA;EACzB,IAAI,QACF,uBAAA,sBAAA,MAA4B,0BAA0B,MAAM,CAAA;CAEhE;CAgEA,KAAY,QAAuC;EACjD,uBAAA,uBAAA,eAAuB,IAAA,GAAA,uBAAA,cAAoB,IAAA,GAAmB,MAAM;EAEpE,OAAO;CACT;CA6BA,IAAW,YAAyC;EAClD,uBAAA,cAAA,IAAA,CAAA,CAAkB,KAAK,iBAAiB,KAAK,UAAU,CAAC;EAExD,OAAO;CACT;CA8BA,QAAe,SAAmC;EAChD,uBAAA,eAAA,IAAA,CAAA,CAAmB,KAAK;GACtB,SAAS,cAAc,KAAK,OAAO;GAEnC,aAAa,CAAC,GAAA,uBAAA,cAAG,IAAA,CAAiB;EACpC,CAAC;EAED,OAAO;CACT;CAGA,QAAe,GAAG,MAAuB;EACvC,MAAM,CAAC,QAAQ,WAAW,qBAAqB,IAAI;EAEnD,uBAAA,OAAA,IAAA,CAAA,CAAW,MAAM;EACjB,KAAK,MAAM,CAAC,MAAM,UAAU,MAC1B,uBAAA,OAAA,IAAA,CAAA,CAAW,IAAI,MAAM,KAAK;EAG5B,OAAO;CACT;CAGA,WAAkB,GAAG,MAAuB;EAC1C,MAAM,CAAC,QAAQ,WAAW,qBAAqB,IAAI;EAEnD,MAAM,SAAA,uBAAA,OAAS,IAAA;EACf,MAAM,SAAS;EAEf,KAAK,MAAM,CAAC,MAAM,UAAU,QAC1B,OAAO,IAAI,MAAM,KAAK;EAGxB,OAAO;CACT;CAGA,aAAoB,GAAG,MAAuB;EAC5C,MAAM,CAAC,QAAQ,WAAW,qBAAqB,IAAI;EAEnD,MAAM,SAAS,IAAI,IAAI,IAAI;EAC3B,MAAM,SAAA,uBAAA,OAAS,IAAA;EAEf,KAAK,MAAM,CAAC,MAAM,UAAU,QAC1B,OAAO,IAAI,MAAM,KAAK;EAGxB,KAAK,QAAQ,MAAM;EAEnB,OAAO;CACT;CAEA,QAAyC;EAEvC,IAAA,uBAAA,eAAI,IAAA,CAAA,CAAmB,WAAW,GAChC,MAAM,IAAI,oBAAoB;EAGhC,OAAO,IAAI,OACT,CAAC,GAAA,uBAAA,OAAG,IAAA,CAAA,CAAW,QAAQ,CAAC,GAGxB,cAAc,QAAQ,CAAC,GAAA,uBAAA,eAAG,IAAA,CAAkB,CAAC,GAAA,uBAAA,sBAC7C,IAAA,CACF;CACF;AACF;;;;;;AChrBA,SAAS,4BACP,MACA,QACuB;CACvB,OAAO;GACJ,qBAAqB;EACtB;EACA;CACF;AACF;;;;AAmBA,SAAgB,WACd,QACuD;CACvD,OAAO,4BAA4B,SAAS,MAAM;AAIpD;;;;AAmBA,SAAgB,YACd,QACwD;CACxD,OAAO,4BAA4B,UAAU,MAAM;AAIrD;;;;AAYA,SAAgB,MACd,QACkD;CAClD,OAAO,4BAA4B,OAAO,MAAM;AAIlD"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_initProto","_applyDecs","_setFunctionName","_toPropertyKey","_checkInRHS","_toPrimitive","instances","this","v.custom","v.parseOutput","this","v.parseOutput","denial","v.string","v.pipe","v.union","v.custom","v.record","v.unknown","v.transform","v.tuple","v.object","v.optional","v.instance","v.omit","v.boolean","v.union","v.safeParse","v.pipe","v.unknown","v.check","v.parseInput","v.parseInput","v.parseOutput","v.object","v.optional","v.union","v.array","v.tuple","v.custom","v.record","v.string","v.parseInput"],"sources":["../src/errors.ts","../src/_plugin-lifecycle.ts","../src/_middleware.ts","../src/_streams.ts","../src/_valibot.ts","../src/_streams.schemas.ts","../src/_storage.ts","../src/_unikvs-branch.ts","../src/unikvs-branch.ts","../src/_contexts.ts","../src/_logger.ts","../src/_pipeline-graph.helpers.ts","../src/_pipeline-leaf-resolver.ts","../src/_pipeline-graph.ts","../src/_unikvs.schemas.ts","../src/_value-schemas.ts","../src/_to-value-stream.ts","../src/_value-validation.ts","../src/unikvs.ts","../src/unikvs-builder.ts","../src/value-schemas.ts"],"sourcesContent":["import {\n type ErrorOptions,\n ErrorBase,\n setErrorMessage,\n KeyNotFoundError,\n InvalidUsageErrorBase,\n} from \"@unikvs/core\";\nimport type { BaseIssue } from \"valibot\";\n\nexport { KeyNotFoundError, InvalidUsageErrorBase };\nexport type { KeyNotFoundErrorArgs, KeyNotFoundErrorMeta } from \"@unikvs/core\";\n\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type Issue = BaseIssue<unknown>;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type InvalidInputErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly input: unknown;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly issues: readonly [Issue, ...Issue[]];\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type InvalidInputErrorArgs = ErrorOptions & {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly value: unknown;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly issues: readonly [Issue, ...Issue[]];\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class InvalidInputError extends InvalidUsageErrorBase<InvalidInputErrorMeta> {\n static {\n this.prototype.name = \"UniKvsInvalidInputError\";\n }\n\n public constructor(args: InvalidInputErrorArgs) {\n const { value: input, issues, ...options } = args;\n const meta: InvalidInputErrorMeta = {\n input,\n issues,\n };\n super(\n meta,\n ({ issues: messageIssues }) => messageIssues.map((i) => i.message).join(\": \"),\n options,\n );\n }\n}\n\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type InvalidOutputErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly output: unknown;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly issues: readonly [Issue, ...Issue[]];\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type InvalidOutputErrorArgs = ErrorOptions & {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly value: unknown;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly issues: readonly [Issue, ...Issue[]];\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class InvalidOutputError extends InvalidUsageErrorBase<InvalidOutputErrorMeta> {\n static {\n this.prototype.name = \"UniKvsInvalidOutputError\";\n }\n\n public constructor(args: InvalidOutputErrorArgs) {\n const { value: output, issues, ...options } = args;\n const meta: InvalidOutputErrorMeta = {\n issues,\n output,\n };\n super(\n meta,\n ({ issues: messageIssues }) => messageIssues.map((i) => i.message).join(\": \"),\n options,\n );\n }\n}\n\n// -------------------------------------------------------------------------------------------------。\n//\n// UniKvs。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class UniKvsIsOpenError extends ErrorBase<undefined> {\n static {\n this.prototype.name = \"UniKvsIsOpenError\";\n }\n\n public constructor(options?: ErrorOptions) {\n super(\"UniKvs is open\", options);\n }\n}\n\nsetErrorMessage(UniKvsIsOpenError, \"UniKvs は開いています\", \"ja\");\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class UniKvsIsNotOpenError extends ErrorBase<undefined> {\n static {\n this.prototype.name = \"UniKvsIsNotOpenError\";\n }\n\n public constructor(options?: ErrorOptions) {\n super(\"UniKvs is not open\", options);\n }\n}\n\nsetErrorMessage(UniKvsIsNotOpenError, \"UniKvs は開いていません\", \"ja\");\n\n// -------------------------------------------------------------------------------------------------。\n//\n// ストレージ。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type StorageIsNotOpenErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type StorageIsNotOpenErrorArgs = ErrorOptions & StorageIsNotOpenErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class StorageIsNotOpenError extends ErrorBase<StorageIsNotOpenErrorMeta> {\n static {\n this.prototype.name = \"UniKvsStorageIsNotOpenError\";\n }\n\n public constructor(args: StorageIsNotOpenErrorArgs) {\n const { name, ...options } = args;\n const meta: StorageIsNotOpenErrorMeta = { name };\n super(meta, ({ name: messageName }) => `Storage \"${messageName}\" is not open`, options);\n }\n}\n\nsetErrorMessage(StorageIsNotOpenError, ({ name }) => `ストレージ \"${name}\" は開いていません`, \"ja\");\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type WritableStreamNotSupportedErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type WritableStreamNotSupportedErrorArgs = ErrorOptions &\n WritableStreamNotSupportedErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class WritableStreamNotSupportedError extends ErrorBase<WritableStreamNotSupportedErrorMeta> {\n static {\n this.prototype.name = \"UniKvsWritableStreamNotSupportedError\";\n }\n\n public constructor(args: WritableStreamNotSupportedErrorArgs) {\n const { name, ...options } = args;\n const meta: WritableStreamNotSupportedErrorMeta = { name };\n super(\n meta,\n ({ name: messageName }) => `Storage \"${messageName}\" does not support writable stream`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n WritableStreamNotSupportedError,\n ({ name }) => `ストレージ \"${name}\" は書き込み可能なストリームをサポートしていません`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type ReadableStreamNotSupportedErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type ReadableStreamNotSupportedErrorArgs = ErrorOptions &\n ReadableStreamNotSupportedErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class ReadableStreamNotSupportedError extends ErrorBase<ReadableStreamNotSupportedErrorMeta> {\n static {\n this.prototype.name = \"UniKvsReadableStreamNotSupportedError\";\n }\n\n public constructor(args: ReadableStreamNotSupportedErrorArgs) {\n const { name, ...options } = args;\n const meta: ReadableStreamNotSupportedErrorMeta = { name };\n super(\n meta,\n ({ name: messageName }) => `Storage \"${messageName}\" does not support readable stream`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n ReadableStreamNotSupportedError,\n ({ name }) => `ストレージ \"${name}\" は読み取り可能なストリームをサポートしていません`,\n \"ja\",\n);\n\n/**\n * MultipartWriteNotSupportedError に付与されるメタデータです。\n */\nexport type MultipartWriteNotSupportedErrorMeta = {\n /**\n * 対象のストレージの名前です。\n */\n readonly name: string;\n};\n\n/**\n * MultipartWriteNotSupportedError のコンストラクター引数です。\n *\n * エラーの追加情報 (`cause`) も含みます。\n */\nexport type MultipartWriteNotSupportedErrorArgs = ErrorOptions &\n MultipartWriteNotSupportedErrorMeta;\n\n/**\n * ストレージがマルチパート書き込みをサポートしていない場合に投げられるエラーです。\n */\nexport class MultipartWriteNotSupportedError extends ErrorBase<MultipartWriteNotSupportedErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMultipartWriteNotSupportedError\";\n }\n\n public constructor(args: MultipartWriteNotSupportedErrorArgs) {\n const { name, ...options } = args;\n const meta: MultipartWriteNotSupportedErrorMeta = { name };\n super(\n meta,\n ({ name: messageName }) => `Storage \"${messageName}\" does not support multipart-write`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n MultipartWriteNotSupportedError,\n ({ name }) => `ストレージ \"${name}\" はマルチパート書き込みをサポートしていません`,\n \"ja\",\n);\n\n// -------------------------------------------------------------------------------------------------。\n//\n// ミドルウェア。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareIsNotOpenErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareIsNotOpenErrorArgs = ErrorOptions & MiddlewareIsNotOpenErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MiddlewareIsNotOpenError extends ErrorBase<MiddlewareIsNotOpenErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMiddlewareIsNotOpenError\";\n }\n\n public constructor(args: MiddlewareIsNotOpenErrorArgs) {\n const { name, ...options } = args;\n const meta: MiddlewareIsNotOpenErrorMeta = { name };\n super(meta, ({ name: messageName }) => `Middleware \"${messageName}\" is not open`, options);\n }\n}\n\nsetErrorMessage(\n MiddlewareIsNotOpenError,\n ({ name }) => `ミドルウェア \"${name}\" は開いていません`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareDestinationMissingErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly operation: \"encode\" | \"decode\";\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareDestinationMissingErrorArgs = ErrorOptions &\n MiddlewareDestinationMissingErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MiddlewareDestinationMissingError extends ErrorBase<MiddlewareDestinationMissingErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMiddlewareDestinationMissingError\";\n }\n\n public constructor(args: MiddlewareDestinationMissingErrorArgs) {\n const { name, operation, ...options } = args;\n const meta: MiddlewareDestinationMissingErrorMeta = {\n name,\n operation,\n };\n super(\n meta,\n ({ name: messageName, operation: messageOperation }) =>\n `Middleware \"${messageName}\" did not set destination for ${messageOperation}.`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n MiddlewareDestinationMissingError,\n ({ name, operation }) =>\n `ミドルウェア \"${name}\" は ${operation} の destination を設定しませんでした。`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareDestinationFrozenErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly action: \"set\" | \"get\" | \"stream\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly key: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareDestinationFrozenErrorArgs = ErrorOptions &\n MiddlewareDestinationFrozenErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MiddlewareDestinationFrozenError extends ErrorBase<MiddlewareDestinationFrozenErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMiddlewareDestinationFrozenError\";\n }\n\n public constructor(args: MiddlewareDestinationFrozenErrorArgs) {\n const { key, action, ...options } = args;\n const meta: MiddlewareDestinationFrozenErrorMeta = {\n key,\n action,\n };\n super(\n meta,\n ({ key: messageKey, action: messageAction }) =>\n `Cannot set destination after next() was called for ${messageAction} operation on key ${JSON.stringify(messageKey)}.`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n MiddlewareDestinationFrozenError,\n ({ key: messageKey, action: messageAction }) =>\n `next() を呼び出した後に destination を設定できません(${messageAction} 操作、キー ${JSON.stringify(messageKey)})。`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareNextNotCalledErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly operation: \"encode\" | \"decode\" | \"use\";\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareNextNotCalledErrorArgs = ErrorOptions & MiddlewareNextNotCalledErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MiddlewareNextNotCalledError extends ErrorBase<MiddlewareNextNotCalledErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMiddlewareNextNotCalledError\";\n }\n\n public constructor(args: MiddlewareNextNotCalledErrorArgs) {\n const { name, operation, ...options } = args;\n const meta: MiddlewareNextNotCalledErrorMeta = {\n name,\n operation,\n };\n super(\n meta,\n ({ name: messageName, operation: messageOperation }) =>\n `Middleware \"${messageName}\" did not call next() for ${messageOperation}.`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n MiddlewareNextNotCalledError,\n ({ name, operation }) => `ミドルウェア \"${name}\" は ${operation} で next() を呼びませんでした。`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareNextNotAwaitedErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly operation: \"encode\" | \"decode\" | \"use\";\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareNextNotAwaitedErrorArgs = ErrorOptions & MiddlewareNextNotAwaitedErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MiddlewareNextNotAwaitedError extends ErrorBase<MiddlewareNextNotAwaitedErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMiddlewareNextNotAwaitedError\";\n }\n\n public constructor(args: MiddlewareNextNotAwaitedErrorArgs) {\n const { name, operation, ...options } = args;\n const meta: MiddlewareNextNotAwaitedErrorMeta = {\n name,\n operation,\n };\n super(\n meta,\n ({ name: messageName, operation: messageOperation }) =>\n `Middleware \"${messageName}\" did not await next() for ${messageOperation}.`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n MiddlewareNextNotAwaitedError,\n ({ name, operation }) =>\n `ミドルウェア \"${name}\" は ${operation} で next() を await しませんでした。`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareNextCalledMultipleTimesErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly operation: \"encode\" | \"decode\" | \"use\";\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type MiddlewareNextCalledMultipleTimesErrorArgs = ErrorOptions &\n MiddlewareNextCalledMultipleTimesErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MiddlewareNextCalledMultipleTimesError extends ErrorBase<MiddlewareNextCalledMultipleTimesErrorMeta> {\n static {\n this.prototype.name = \"UniKvsMiddlewareNextCalledMultipleTimesError\";\n }\n\n public constructor(args: MiddlewareNextCalledMultipleTimesErrorArgs) {\n const { name, operation, ...options } = args;\n const meta: MiddlewareNextCalledMultipleTimesErrorMeta = {\n name,\n operation,\n };\n super(\n meta,\n ({ name: messageName, operation: messageOperation }) =>\n `Middleware \"${messageName}\" called next() multiple times for ${messageOperation}.`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n MiddlewareNextCalledMultipleTimesError,\n ({ name, operation }) => `ミドルウェア \"${name}\" は ${operation} で next() を複数回呼びました。`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type StreamEncodingNotSupportedErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type StreamEncodingNotSupportedErrorArgs = ErrorOptions &\n StreamEncodingNotSupportedErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class StreamEncodingNotSupportedError extends ErrorBase<StreamEncodingNotSupportedErrorMeta> {\n static {\n this.prototype.name = \"UniKvsStreamEncodingNotSupportedError\";\n }\n\n public constructor(args: StreamEncodingNotSupportedErrorArgs) {\n const { name, ...options } = args;\n const meta: StreamEncodingNotSupportedErrorMeta = { name };\n super(\n meta,\n ({ name: messageName }) => `Middleware \"${messageName}\" does not support stream encoding.`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n StreamEncodingNotSupportedError,\n ({ name }) => `ミドルウェア \"${name}\" はストリームのエンコードをサポートしていません。`,\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type StreamDecodingNotSupportedErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type StreamDecodingNotSupportedErrorArgs = ErrorOptions &\n StreamDecodingNotSupportedErrorMeta;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class StreamDecodingNotSupportedError extends ErrorBase<StreamDecodingNotSupportedErrorMeta> {\n static {\n this.prototype.name = \"UniKvsStreamDecodingNotSupportedError\";\n }\n\n public constructor(args: StreamDecodingNotSupportedErrorArgs) {\n const { name, ...options } = args;\n const meta: StreamDecodingNotSupportedErrorMeta = { name };\n super(\n meta,\n ({ name: messageName }) => `Middleware \"${messageName}\" does not support decodable stream`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n StreamDecodingNotSupportedError,\n ({ name }) => `ミドルウェア \"${name}\" はデコード可能なストリームをサポートしていません`,\n \"ja\",\n);\n\n// -------------------------------------------------------------------------------------------------。\n//\n// ストレージ / ミドルウェア。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type PluginOperationAggregateErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly plugin: \"plugin\" | \"storage\" | \"middleware\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly action: \"open\" | \"close\" | \"write\" | \"read\" | \"delete\" | \"clear\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly errors: readonly {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly plugin: \"storage\" | \"middleware\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name?: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly index?: number;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly reason: unknown;\n }[];\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport type PluginOperationAggregateErrorArgs = ErrorOptions & {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly plugin?: \"storage\" | \"middleware\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly action: \"open\" | \"close\" | \"write\" | \"read\" | \"delete\" | \"clear\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly errors: readonly {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly plugin?: \"storage\" | \"middleware\";\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly name?: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly index?: number;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\n readonly reason: unknown;\n }[];\n};\n\n/**\n * プラグイン種別を正規化します。\n *\n * @param plugin 種別名です。\n *\n * @returns 正規化された種別を返します。\n */\nfunction normalizePlugin(plugin: string): \"storage\" | \"middleware\" {\n return plugin as \"storage\" | \"middleware\";\n}\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class PluginOperationAggregateError extends ErrorBase<PluginOperationAggregateErrorMeta> {\n static {\n this.prototype.name = \"UniKvsPluginOperationAggregateError\";\n }\n\n public constructor(args: PluginOperationAggregateErrorArgs) {\n const { action, errors, plugin, ...options } = args;\n const normalizedErrors = errors.map((error) => ({\n plugin: normalizePlugin((error.plugin ?? plugin ?? \"\") as string),\n ...(error.name !== undefined ? { name: error.name } : {}),\n ...(error.index !== undefined ? { index: error.index } : {}),\n reason: error.reason,\n }));\n const plugins = [...new Set(normalizedErrors.map((error) => error.plugin))];\n const [onlyPlugin] = plugins;\n const meta: PluginOperationAggregateErrorMeta = {\n action,\n errors: normalizedErrors,\n plugin: plugins.length === 1 && onlyPlugin !== undefined ? onlyPlugin : \"plugin\",\n };\n super(\n meta,\n ({ action: messageAction, errors: messageErrors, plugin: messagePlugin }) =>\n `${messageErrors.length} ${messagePlugin}(s) fail ${messageAction} operation`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n PluginOperationAggregateError,\n ({ action, errors, plugin }) =>\n `${errors.length} 個の${\n {\n plugin: \"プラグイン\",\n storage: \"ストレージ\",\n middleware: \"ミドルウェア\",\n }[plugin]\n }が ${action} 操作に失敗`,\n \"ja\",\n);\n\n// -------------------------------------------------------------------------------------------------。\n//\n// その他。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class InvalidForkError extends ErrorBase<undefined> {\n static {\n this.prototype.name = \"UniKvsInvalidForkError\";\n }\n\n public constructor(options?: ErrorOptions) {\n super(\"A forked branch does not reach any storage\", options);\n }\n}\n\nsetErrorMessage(InvalidForkError, \"ストレージに到達しない分岐があります\", \"ja\");\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class MissingStorageError extends ErrorBase<undefined> {\n static {\n this.prototype.name = \"UniKvsMissingStorageError\";\n }\n\n public constructor(options?: ErrorOptions) {\n super(\"At least one storage is required to use UniKvs\", options);\n }\n}\n\nsetErrorMessage(\n MissingStorageError,\n \"UniKvs を使用するためには最低 1 つのストレージが必要です\",\n \"ja\",\n);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#errors)\n */\nexport class UnterminatedPipelineError extends ErrorBase<undefined> {\n static {\n this.prototype.name = \"UniKvsUnterminatedPipelineError\";\n }\n\n public constructor(options?: ErrorOptions) {\n super(\"The pipeline does not end with a storage\", options);\n }\n}\n\nsetErrorMessage(\n UnterminatedPipelineError,\n \"パイプラインがストレージで終わっていません。use() の後に persist() または fork() を呼び出してください\",\n \"ja\",\n);\n","import type { MaybePromise } from \"maypromise\";\n\n/**\n * 参照カウントで管理するプラグインの操作対象です。\n *\n * @template TOpenContext オープンコンテキストの型です。\n * @template TCloseContext クローズコンテキストの型です。\n */\ninterface IPlugin<TOpenContext, TCloseContext> {\n /**\n * プラグインが開かれているかどうかです。\n */\n get isOpen(): boolean;\n\n /**\n * プラグインを開く関数です。未定義のときは `open` を持たないものとして扱います。\n */\n open?(c: TOpenContext): MaybePromise<void>;\n\n /**\n * プラグインを閉じる関数です。未定義のときは `close` を持たないものとして扱います。\n */\n close?(c: TCloseContext): MaybePromise<void>;\n}\n\n/**\n * 共有プラグインの参照カウントと実 `close` の再試行を管理します。\n *\n * 同じプラグインを共有する利用者のうち、最初の `open` だけが実際に開き、最後の `close` だけが実際に閉じます。\n * 実 `close` に失敗したときは所有権を残し、次の `close` で再試行できるようにします。\n *\n * @template TOpenContext オープンコンテキストの型です。\n * @template TCloseContext クローズコンテキストの型です。\n */\nexport class PluginLifecycle<TOpenContext, TCloseContext> {\n /**\n * 参照カウントの対象です。\n */\n readonly #plugin: IPlugin<TOpenContext, TCloseContext>;\n\n /**\n * `open` した利用者の数です。最初の `open` だけが実際に開き、最後の `close` だけが実際に閉じます。\n * `close` を持たないプラグインは閉じられないため数えません。\n */\n #references: number;\n\n /**\n * 実 `close` に失敗したまま利用者の数が 0 になったかどうかです。\n *\n * このフラグが立っている間は、外部で開かれたプラグインではなく、閉じきれていない所有権が残っています。\n * 次の `open` が所有権を引き継ぎ、次の `close` が実 `close` を再試行します。\n */\n #closeFailed: boolean;\n\n public constructor(plugin: IPlugin<TOpenContext, TCloseContext>) {\n this.#plugin = plugin;\n this.#references = 0;\n this.#closeFailed = false;\n }\n\n /**\n * プラグインを開きます。\n *\n * 同じプラグインを共有する利用者のうち、最初の 1 回だけ実際の `open` を呼びます。\n * この管理対象外で既に開かれているプラグインは open/close の対象外にします。\n * 参照が残っていても実体が閉じられているときは、既存の参照を失わずに実 open へフォールバックします。\n * `close` を持たないプラグインは閉じられないため、参照を数えません。\n *\n * @param c オープンコンテキストです。\n */\n public async open(c: TOpenContext): Promise<void> {\n if (this.#plugin.open === undefined) {\n return;\n }\n\n // `close` を持たないプラグインは開いたままにしかできないため、参照を数えず、未 open のときだけ実 open します。\n if (this.#plugin.close === undefined) {\n if (this.#plugin.isOpen) {\n return;\n }\n\n await this.#plugin.open(c);\n\n return;\n }\n\n // この管理対象外の外部 open は対象外です。\n // 直前の close に失敗した所有権 (#closeFailed) がある間は、外部 open とみなしません。\n if (this.#plugin.isOpen && this.#references === 0 && !this.#closeFailed) {\n return;\n }\n\n if (this.#references > 0 || this.#closeFailed) {\n if (this.#plugin.isOpen) {\n // 既存の参照を失わずに加算します。close 失敗分の所有権もここで引き継ぎます。\n this.#references += 1;\n this.#closeFailed = false;\n\n return;\n }\n\n // 参照があるのに実体が閉じられているときは、実 open にフォールバックし、既存の参照を失わずに加算します。\n await this.#plugin.open(c);\n this.#references += 1;\n this.#closeFailed = false;\n\n return;\n }\n\n await this.#plugin.open(c);\n this.#references += 1;\n }\n\n /**\n * プラグインを閉じます。\n *\n * 同じプラグインを共有する利用者のうち、最後の 1 回だけ実際の `close` を呼びます。\n * 各呼び出しで参照を 1 つ減らし、実 `close` は全参照が解放されたときにだけ呼びます。\n * 実 `close` に失敗したときは所有権を残し、次の `close` で再試行できるようにします。\n * `close` を持たないプラグインは open で参照を数えないため、ここでは何もしません。\n * 実 `close` へ渡すコンテキストは最後に閉じる利用者のものであり、最初に開いた利用者の vars/signal は保持しません。\n *\n * @param c クローズコンテキストです。\n */\n public async close(c: TCloseContext): Promise<void> {\n if (this.#plugin.close === undefined) {\n return;\n }\n\n if (this.#references === 0 && !this.#closeFailed) {\n // この管理対象外のプラグインは閉じません。\n return;\n }\n\n if (this.#references > 0) {\n this.#references -= 1;\n }\n\n if (this.#references > 0) {\n // まだ利用者が残っているため、実体は閉じません。\n return;\n }\n\n if (!this.#plugin.isOpen) {\n // 既に外部で閉じられているため、未解放の所有権を解消します。\n this.#closeFailed = false;\n\n return;\n }\n\n await this.#closeReal(c);\n }\n\n /**\n * 失敗した実 `close` だけを再試行します。\n *\n * 通常の `close` と違い参照を減らしません。close 失敗後に新しい `open` が所有権を引き継いでいる場合は何もしません。\n * 実体が既に閉じられているときは失敗状態だけを解消します。\n *\n * @param c クローズコンテキストです。\n */\n public async retryClose(c: TCloseContext): Promise<void> {\n if (this.#plugin.close === undefined) {\n return;\n }\n\n // 新しい open が所有権を引き継いでいる場合は、その参照を解放しないよう何もしません。\n if (!this.#closeFailed || this.#references > 0) {\n return;\n }\n\n if (!this.#plugin.isOpen) {\n // 既に外部で閉じられているため、未解放の所有権を解消します。\n this.#closeFailed = false;\n\n return;\n }\n\n await this.#closeReal(c);\n }\n\n /**\n * 実 `close` を実行し、失敗したかどうかを記録します。\n *\n * @param c クローズコンテキストです。\n */\n async #closeReal(c: TCloseContext): Promise<void> {\n if (this.#plugin.close === undefined) {\n return;\n }\n\n try {\n await this.#plugin.close(c);\n this.#closeFailed = false;\n } catch (ex) {\n // 閉じるのに失敗したときは未解放として記録し、次の close で再試行できるようにします。\n this.#closeFailed = true;\n throw ex;\n }\n }\n}\n","import type { IMiddleware } from \"@unikvs/core\";\nimport { asyncmux } from \"asyncmux\";\nimport { callFnOnce } from \"call-fn-once\";\n\nimport { PluginLifecycle } from \"./_plugin-lifecycle.js\";\nimport {\n MiddlewareIsNotOpenError,\n StreamDecodingNotSupportedError,\n StreamEncodingNotSupportedError,\n} from \"./errors.js\";\n\n/**\n * 同じオブジェクトに対して同じ `UniKvsMiddleware` インスタンスを返すためのメモです。\n */\nconst instances = /* #__PURE__ */ new WeakMap<IMiddleware, UniKvsMiddleware>();\n\n/**\n * `IMiddleware` を `UniKvs` 内部から扱うためのラッパーです。\n *\n * ミドルウェアを安全に使うための検証などの処理が集約されています。\n */\nexport default class UniKvsMiddleware {\n /**\n * ミドルウェアの名前です。\n */\n public readonly name: string;\n\n /**\n * ラップするミドルウェアです。\n */\n readonly #mw: IMiddleware;\n\n /**\n * 参照カウントと実 `close` の再試行を管理します。\n */\n readonly #lifecycle: PluginLifecycle<IMiddleware.OpenContext, IMiddleware.CloseContext>;\n\n private constructor(middleware: IMiddleware) {\n this.#mw = middleware;\n this.#lifecycle = new PluginLifecycle(middleware);\n this.name = middleware.name;\n }\n\n /**\n * `IMiddleware` から `UniKvs` 内部から扱うためのミドルウェアを作成します。\n *\n * @param middleware 元となるミドルウェアです。\n *\n * @returns 検証などの機能が集約されたミドルウェアです。\n */\n public static from(middleware: IMiddleware): UniKvsMiddleware {\n return callFnOnce(instances, middleware, () => new UniKvsMiddleware(middleware));\n }\n\n /**\n * ミドルウェアを開きます。\n *\n * @param c オープンコンテキストです。\n */\n @asyncmux\n public async open(c: IMiddleware.OpenContext): Promise<void> {\n await this.#lifecycle.open(c);\n }\n\n /**\n * ミドルウェアを閉じます。\n *\n * @param c クローズコンテキストです。\n */\n @asyncmux\n public async close(c: IMiddleware.CloseContext): Promise<void> {\n await this.#lifecycle.close(c);\n }\n\n /**\n * 失敗した実 `close` だけを再試行します。\n *\n * @param c クローズコンテキストです。\n */\n @asyncmux\n public async retryClose(c: IMiddleware.CloseContext): Promise<void> {\n await this.#lifecycle.retryClose(c);\n }\n\n /**\n * キーを写像します。\n *\n * @param c キー写像コンテキストです。\n *\n * @returns 写像後のキーを返します。\n */\n public mapKey(c: IMiddleware.MapKeyContext): string {\n if (!this.#mw.isOpen) {\n throw new MiddlewareIsNotOpenError({ name: this.name });\n }\n\n if (this.#mw.mapKey === undefined) {\n // 既定ではキーをそのまま似します。\n return c.key;\n }\n\n return this.#mw.mapKey(c);\n }\n\n /**\n * 任意の操作に割り込みます。\n *\n * @param c 操作コンテキストです。\n * @param next 後段の処理です。\n */\n public async use(c: IMiddleware.UseContext, next: IMiddleware.INext): Promise<void> {\n if (!this.#mw.isOpen) {\n throw new MiddlewareIsNotOpenError({ name: this.name });\n }\n\n if (this.#mw.use === undefined) {\n // 既定では後段の処理を実行します。\n await next();\n } else {\n await this.#mw.use(c, next);\n }\n }\n\n /**\n * データをエンコードします。\n *\n * @param c エンコードコンテキストです。\n * @param next 後段の処理です。\n */\n public async encode(c: IMiddleware.EncodeContext, next: IMiddleware.INext): Promise<void> {\n if (!this.#mw.isOpen) {\n throw new MiddlewareIsNotOpenError({ name: this.name });\n }\n\n if (this.#mw.encode === undefined) {\n // 既定ではデータを素通りさせます。\n c.destination = c.source;\n\n await next();\n } else {\n await this.#mw.encode(c, next);\n }\n }\n\n /**\n * データをデコードします。\n *\n * @param c デコードコンテキストです。\n * @param next 後段の処理です。\n */\n public async decode(c: IMiddleware.DecodeContext, next: IMiddleware.INext): Promise<void> {\n if (!this.#mw.isOpen) {\n throw new MiddlewareIsNotOpenError({ name: this.name });\n }\n\n if (this.#mw.decode === undefined) {\n // 既定ではデータを素通りさせます。\n c.destination = c.source;\n\n await next();\n } else {\n await this.#mw.decode(c, next);\n }\n }\n\n /**\n * ストリームをエンコードします。\n *\n * @param c エンコードストリームコンテキストです。\n * @param next 後段の処理です。\n */\n public async encodeStream(\n c: IMiddleware.EncodeStreamContext,\n next: IMiddleware.INext,\n ): Promise<void> {\n if (!this.#mw.isOpen) {\n throw new MiddlewareIsNotOpenError({ name: this.name });\n }\n\n if (this.#mw.encodeStream === undefined) {\n throw new StreamEncodingNotSupportedError({ name: this.name });\n }\n\n await this.#mw.encodeStream(c, next);\n }\n\n /**\n * ストリームをデコードします。\n *\n * @param c デコードストリームコンテキストです。\n * @param next 後段の処理です。\n */\n public async decodeStream(\n c: IMiddleware.DecodeStreamContext,\n next: IMiddleware.INext,\n ): Promise<void> {\n if (!this.#mw.isOpen) {\n throw new MiddlewareIsNotOpenError({ name: this.name });\n }\n\n if (this.#mw.decodeStream === undefined) {\n throw new StreamDecodingNotSupportedError({ name: this.name });\n }\n\n await this.#mw.decodeStream(c, next);\n }\n}\n","import type { IReadableStream, IWritableStream } from \"@unikvs/core\";\n\n/**\n * 値が `ReadableStream` のインターフェースを満たすかどうかを判定します。\n *\n * ランタイムによっては `ReadableStream` クラスを継承せずに同じインターフェースを備えたオブジェクトが存在するため、`instanceof` ではなく必要なメソッドの有無で判定します。\n *\n * @param input 判定する値です。\n *\n * @returns `ReadableStream` のインターフェースを満たす場合は `true` を返します。\n */\nexport function isReadableStream(input: unknown): input is IReadableStream {\n if (typeof input !== \"object\" || input === null) {\n return false;\n }\n\n const stream = input as Partial<IReadableStream>;\n\n return (\n typeof stream.tee === \"function\" &&\n typeof stream.cancel === \"function\" &&\n typeof stream.pipeTo === \"function\" &&\n typeof stream.getReader === \"function\" &&\n typeof stream.pipeThrough === \"function\"\n );\n}\n\n/**\n * 値が `WritableStream` のインターフェースを満たすかどうかを判定します。\n *\n * ランタイムによっては `WritableStream` クラスを継承せずに同じインターフェースを備えたオブジェクトが存在するため、`instanceof` ではなく必要なメソッドの有無で判定します。\n *\n * @param input 判定する値です。\n *\n * @returns `WritableStream` のインターフェースを満たす場合は `true` を返します。\n */\nexport function isWritableStream(input: unknown): input is IWritableStream {\n if (typeof input !== \"object\" || input === null) {\n return false;\n }\n\n const stream = input as Partial<IWritableStream>;\n\n return (\n typeof stream.abort === \"function\" &&\n typeof stream.close === \"function\" &&\n typeof stream.getWriter === \"function\"\n );\n}\n\n/**\n * ストリームの重複を除いてキャンセルします。\n *\n * 個々のキャンセルに失敗しても無視し、元の例外を優先して伝えます。\n *\n * @param streams キャンセルするストリームです。\n * @param reason キャンセル理由です。\n */\nexport async function cancelStreams(\n streams: Iterable<IReadableStream>,\n reason: unknown,\n): Promise<void> {\n // 同じ参照は 1 回だけキャンセルします。\n await Promise.all(\n [...new Set(streams)].map(async (stream) => {\n try {\n await stream.cancel(reason);\n } catch {\n // キャンセルに失敗しても元の例外の伝播を優先します。\n }\n }),\n );\n}\n","import { tryCaptureStackTrace } from \"try-capture-stack-trace\";\nimport { type InferOutput, safeParse } from \"valibot\";\n\nimport {\n type InvalidInputErrorArgs,\n type InvalidOutputErrorArgs,\n InvalidInputError,\n InvalidOutputError,\n} from \"./errors.js\";\n\nexport type { InferInput, InferOutput, GenericSchema } from \"valibot\";\nexport {\n any,\n omit,\n pipe,\n check,\n union,\n custom,\n number,\n string,\n symbol,\n boolean,\n unknown,\n instance,\n minValue,\n optional,\n safeParse,\n safeInteger,\n} from \"valibot\";\n\nexport { array, tuple, object, record, transform } from \"@tai-kun/valibot-extra-lab\";\n\ntype BaseSchema = typeof safeParse extends (schema: infer S, ...args: any) => any ? S : never;\n\nexport interface IParseInputErrorConstructor {\n new (args: InvalidInputErrorArgs): Error;\n}\n\nexport function parseInput<const TSchema extends BaseSchema>(\n schema: TSchema,\n value: unknown,\n Error: IParseInputErrorConstructor = InvalidInputError,\n): InferOutput<TSchema> {\n const result = safeParse(schema, value);\n\n if (result.success) {\n return result.output;\n }\n\n const error = new Error({\n value,\n issues: result.issues,\n });\n tryCaptureStackTrace(error, parseInput);\n\n throw error;\n}\n\nexport interface ParseOutputErrorConstructor {\n new (args: InvalidOutputErrorArgs): Error;\n}\n\nexport function parseOutput<const TSchema extends BaseSchema>(\n schema: TSchema,\n value: unknown,\n Error: ParseOutputErrorConstructor = InvalidOutputError,\n): InferOutput<TSchema> {\n const result = safeParse(schema, value);\n\n if (result.success) {\n return result.output;\n }\n\n const error = new Error({\n value,\n issues: result.issues,\n });\n tryCaptureStackTrace(error, parseOutput);\n\n throw error;\n}\n","import type { IReadableStream, IWritableStream } from \"@unikvs/core\";\nimport type { CustomIssue, CustomSchema, ErrorMessage } from \"valibot\";\n\nimport { isReadableStream, isWritableStream } from \"./_streams.js\";\nimport * as v from \"./_valibot.js\";\n\n/**\n * `ReadableStream` のインターフェースを満たすかを検証するためのスキーマです。\n */\nexport const ReadableStreamSchema: CustomSchema<\n IReadableStream,\n ErrorMessage<CustomIssue> | undefined\n> = v.custom<IReadableStream>(isReadableStream, \"Expected a ReadableStream\");\n\n/**\n * `WritableStream` のインターフェースを満たすかを検証するためのスキーマです。\n */\nexport const WritableStreamSchema: CustomSchema<\n IWritableStream,\n ErrorMessage<CustomIssue> | undefined\n> = v.custom<IWritableStream>(isWritableStream, \"Expected a WritableStream\");\n","import type { IStorage, IReadableStream, IWritableStream } from \"@unikvs/core\";\nimport { asyncmux } from \"asyncmux\";\nimport { callFnOnce } from \"call-fn-once\";\n\nimport { PluginLifecycle } from \"./_plugin-lifecycle.js\";\nimport { ReadableStreamSchema, WritableStreamSchema } from \"./_streams.schemas.js\";\nimport * as v from \"./_valibot.js\";\nimport {\n type PluginOperationAggregateError,\n StorageIsNotOpenError,\n ReadableStreamNotSupportedError,\n WritableStreamNotSupportedError,\n} from \"./errors.js\";\n\n/**\n * 同じオブジェクトに対して同じ `UniKvsStorage` インスタンスを返すためのメモです。\n */\nconst instances = /* #__PURE__ */ new WeakMap<IStorage, UniKvsStorage>();\n\n/**\n * `IStorage` を `UniKvs` 内部から扱うためのラッパーです。\n *\n * ストレージを安全に使うための検証などの処理が集約されています。\n */\nexport default class UniKvsStorage {\n /**\n * ストレージの名前です。\n */\n public readonly name: string;\n\n /**\n * ラップするストレージです。\n */\n readonly #io: IStorage;\n\n /**\n * 参照カウントと実 `close` の再試行を管理します。\n */\n readonly #lifecycle: PluginLifecycle<IStorage.OpenContext, IStorage.CloseContext>;\n\n private constructor(storage: IStorage) {\n this.#io = storage;\n this.#lifecycle = new PluginLifecycle(storage);\n this.name = storage.name;\n }\n\n /**\n * `IStorage` から `UniKvs` 内部から扱うためのストレージを作成します。\n *\n * @param storage 元となるストレージです。\n *\n * @returns 検証などの機能が集約されたストレージです。\n */\n public static from(storage: IStorage): UniKvsStorage {\n return callFnOnce(instances, storage, () => new UniKvsStorage(storage));\n }\n\n /**\n * ストレージを開きます。\n *\n * @param c オープンコンテキストです。\n */\n @asyncmux\n public async open(c: IStorage.OpenContext): Promise<void> {\n await this.#lifecycle.open(c);\n }\n\n /**\n * ストレージを閉じます。\n *\n * @param c クローズコンテキストです。\n */\n @asyncmux\n public async close(c: IStorage.CloseContext): Promise<void> {\n await this.#lifecycle.close(c);\n }\n\n /**\n * 失敗した実 `close` だけを再試行します。\n *\n * @param c クローズコンテキストです。\n */\n @asyncmux\n public async retryClose(c: IStorage.CloseContext): Promise<void> {\n await this.#lifecycle.retryClose(c);\n }\n\n /**\n * データを書き込みます。\n *\n * @param c 書き込みコンテキストです。\n * @param data 書き込むデータです。\n */\n public async write(c: IStorage.WriteContext, data: unknown): Promise<void> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n await this.#io.write(c, data);\n }\n\n /**\n * データを読み取ります。\n *\n * @param c 読み取りコンテキストです。\n *\n * @returns 読み取ったデータを返します。\n */\n public async read(c: IStorage.ReadContext): Promise<unknown> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n return await this.#io.read(c);\n }\n\n /**\n * データの存在を確認します。\n *\n * @param c 存在確認コンテキストです。\n *\n * @returns 存在する場合は `true` を返します。\n */\n public async exists(c: IStorage.ExistsContext): Promise<boolean> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n const output = await this.#io.exists(c);\n\n return output;\n }\n\n /**\n * データを削除します。\n *\n * @param c 削除コンテキストです。\n */\n public async delete(c: IStorage.DeleteContext): Promise<void> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n await this.#io.delete(c);\n }\n\n /**\n * データをすべて削除します。\n *\n * @param c クリアコンテキストです。\n */\n public async clear(c: IStorage.ClearContext): Promise<void> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n await this.#io.clear(c);\n }\n\n /**\n * 読み取り用のストリームを取得します。\n *\n * @param c ストリーム取得コンテキストです。\n *\n * @returns 読み取り用のストリームを返します。\n */\n public async getReadable(c: IStorage.GetReadableContext): Promise<IReadableStream> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n if (this.#io.getReadable === undefined) {\n throw new ReadableStreamNotSupportedError({ name: this.name });\n }\n\n const output = await this.#io.getReadable(c);\n\n return v.parseOutput(ReadableStreamSchema, output);\n }\n\n /**\n * 書き込み用のストリームを取得します。\n *\n * @param c ストリーム取得コンテキストです。\n *\n * @returns 書き込み用のストリームを返します。\n */\n public async getWritable(c: IStorage.GetWritableContext): Promise<IWritableStream> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n if (this.#io.getWritable === undefined) {\n throw new WritableStreamNotSupportedError({ name: this.name });\n }\n\n const output = await this.#io.getWritable(c);\n\n return v.parseOutput(WritableStreamSchema, output);\n }\n\n /**\n * 他のストレージへの書き込み失敗を通知します。\n *\n * @param c 書き込み失敗通知コンテキストです。\n * @param err 集約エラーです。\n */\n public async onOtherWriteError(\n c: IStorage.OtherWriteErrorHandlerContext,\n err: PluginOperationAggregateError,\n ): Promise<void> {\n if (!this.#io.isOpen) {\n throw new StorageIsNotOpenError({ name: this.name });\n }\n\n if (this.#io.onOtherWriteError === undefined) {\n return;\n }\n\n await this.#io.onOtherWriteError(c, [\n {\n errors: (\n err.meta.errors as readonly {\n readonly plugin: \"storage\";\n readonly reason: unknown;\n }[]\n ).map((error) => ({\n plugin: \"storage\" as const,\n reason: error.reason,\n })),\n plugin: \"storage\",\n },\n ]);\n }\n}\n","import type UniKvsMiddleware from \"./_middleware.js\";\nimport type UniKvsStorage from \"./_storage.js\";\nimport { InvalidForkError } from \"./errors.js\";\nimport type { IUniKvsBranch } from \"./unikvs-branch.js\";\n\n/**\n * `fork` で親に引き継がれる分岐先の情報です。\n */\ntype BranchDestination = {\n /**\n * データの永続化先です。\n */\n readonly storage: UniKvsStorage;\n\n /**\n * ストレージに対するパイプラインです。\n * 登録順に保持します。\n */\n readonly middlewares: readonly UniKvsMiddleware[];\n};\n\n/**\n * `UniKvsBranch` のインスタンスごとの内部状態です。\n * ネイティブの `#` フィールドの代わりに `WeakMap` に保持することで、別モジュールの `UniKvsBuilder` から内部アクセサー経由で参照できます。\n * `branchStates` 自体は外部に公開しません。\n */\nexport type BranchState = {\n /**\n * 自前の相対パイプラインです。\n * 登録順に保持します。\n */\n readonly middlewares: UniKvsMiddleware[];\n\n /**\n * 自前の分岐先と各登録時点の相対パイプラインのスナップショットです。\n */\n readonly destinations: BranchDestination[];\n};\n\n/**\n * インスタンスと内部状態の対応表です。\n * コンパイラーによる `#` フィールドのダウンレベルと同様に、`WeakMap` をブランド兼ストレージとして使います。\n */\nexport const branchStates: WeakMap<IUniKvsBranch, BranchState> = /* #__PURE__ */ new WeakMap<\n IUniKvsBranch,\n BranchState\n>();\n\n/**\n * 分岐先を親の接頭辞付きで追加します。\n *\n * `new Branch()` で作成された分岐以外の値が渡されたときは例外を投げます。\n * 外部からは使用しません。\n *\n * @param destinations 追加先の分岐先列です。\n * @param prefix 親のミドルウェア列です。\n * @param branch 追加する分岐です。\n *\n * @throws 分岐がストレージに到達しない場合に `InvalidForkError` を投げます。\n */\nexport function appendForkDestinations(\n destinations: BranchDestination[],\n prefix: readonly UniKvsMiddleware[],\n branch: IUniKvsBranch,\n): void {\n const state = branchStates.get(branch);\n\n if (!state) {\n throw new TypeError(\"fork() expects a branch created by new Branch().\");\n }\n\n if (state.destinations.length === 0) {\n throw new InvalidForkError();\n }\n\n const prefixSnapshot = [...prefix];\n\n for (const dest of state.destinations) {\n destinations.push({\n storage: dest.storage,\n // コピーして追加します。親の fork で接頭辞を付けても、元の分岐は変更されません。\n // fork 時点の親チェーンを接頭辞として各分岐先の先頭に付け、ブランチのミドルウェアを結合します。\n middlewares: [...prefixSnapshot, ...dest.middlewares],\n });\n }\n}\n","import type { IStorage, IMiddleware } from \"@unikvs/core\";\n\nimport UniKvsMiddleware from \"./_middleware.js\";\nimport UniKvsStorage from \"./_storage.js\";\nimport type {\n $IsUnknown,\n $CheckForkDecodeData,\n $CheckForkEncodeData,\n $InferReadDataOutput,\n $InferWriteDataInput,\n $CheckForkDecodeChunk,\n $CheckForkEncodeChunk,\n $InferDecodeDataInput,\n $InferEncodeDataInput,\n $InferReadChunkOutput,\n $InferWriteChunkInput,\n $InferDecodeChunkInput,\n $InferDecodeDataOutput,\n $InferEncodeChunkInput,\n $InferEncodeDataOutput,\n $InferDecodeChunkOutput,\n $InferEncodeChunkOutput,\n} from \"./_types.js\";\nimport { type BranchState, branchStates, appendForkDestinations } from \"./_unikvs-branch.js\";\nimport type { Value } from \"./value-schemas.js\";\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport type KeyValueMapping<T = any> = Readonly<Record<string, Value<T>>>;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport interface IUniKvsBranch<\n TKeyValueMapping extends KeyValueMapping = KeyValueMapping,\n TBranchChunkInput = any,\n TBranchChunkOutput = any,\n THeadEncodeDataInput = unknown,\n THeadDecodeDataOutput = unknown,\n THeadEncodeChunkInput = unknown,\n THeadDecodeChunkOutput = unknown,\n TLastDecodeDataInput = any,\n TLastEncodeDataOutput = any,\n TLastDecodeChunkInput = any,\n TLastEncodeChunkOutput = any,\n TBranchHasPersist extends boolean = false,\n> {\n /**\n * 分岐したパイプラインを追加します。\n *\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder-fork)\n *\n * @throws 分岐がストレージに到達しない場合に `InvalidForkError` を投げます。\n */\n fork<\n TSubChunkInput,\n TSubChunkOutput,\n TSubHeadEncodeDataInput,\n TSubHeadDecodeDataOutput,\n TSubHeadEncodeChunkInput,\n TSubHeadDecodeChunkOutput,\n TSubLastDecodeDataInput,\n TSubLastEncodeDataOutput,\n TSubLastDecodeChunkInput,\n TSubLastEncodeChunkOutput,\n TSubHasPersist extends boolean,\n >(\n branch: IUniKvsBranch<\n any,\n TSubChunkInput,\n TSubChunkOutput,\n TSubHeadEncodeDataInput,\n TSubHeadDecodeDataOutput,\n TSubHeadEncodeChunkInput,\n TSubHeadDecodeChunkOutput,\n TSubLastDecodeDataInput,\n TSubLastEncodeDataOutput,\n TSubLastDecodeChunkInput,\n TSubLastEncodeChunkOutput,\n TSubHasPersist\n > &\n (TSubHasPersist extends true\n ? $CheckForkEncodeData<TLastEncodeDataOutput, TSubHeadEncodeDataInput>\n : unknown) &\n (TSubHasPersist extends true\n ? $CheckForkDecodeData<TLastDecodeDataInput, TSubHeadDecodeDataOutput>\n : unknown) &\n (TSubHasPersist extends true\n ? $CheckForkEncodeChunk<TLastEncodeChunkOutput, TSubHeadEncodeChunkInput>\n : unknown) &\n (TSubHasPersist extends true\n ? $CheckForkDecodeChunk<TLastDecodeChunkInput, TSubHeadDecodeChunkOutput>\n : unknown),\n ): IUniKvsBranch<\n TKeyValueMapping,\n TSubHasPersist extends true\n ? [TBranchChunkInput] extends [never]\n ? never\n : [TSubChunkInput] extends [never]\n ? never\n : TBranchChunkInput\n : TBranchChunkInput,\n TSubHasPersist extends true\n ? [TBranchChunkOutput] extends [never]\n ? never\n : [TSubChunkOutput] extends [never]\n ? never\n : TBranchChunkOutput\n : TBranchChunkOutput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadEncodeDataInput> extends true\n ? TSubHeadEncodeDataInput\n : THeadEncodeDataInput\n : THeadEncodeDataInput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadDecodeDataOutput> extends true\n ? TSubHeadDecodeDataOutput\n : THeadDecodeDataOutput\n : THeadDecodeDataOutput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadEncodeChunkInput> extends true\n ? TSubHeadEncodeChunkInput\n : THeadEncodeChunkInput\n : THeadEncodeChunkInput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadDecodeChunkOutput> extends true\n ? TSubHeadDecodeChunkOutput\n : THeadDecodeChunkOutput\n : THeadDecodeChunkOutput,\n TLastDecodeDataInput,\n TLastEncodeDataOutput,\n TLastDecodeChunkInput,\n TLastEncodeChunkOutput,\n TBranchHasPersist extends true ? true : TSubHasPersist\n >;\n\n use<\n TMiddleware extends IMiddleware<\n [TLastEncodeDataOutput] extends [never] ? any : TLastEncodeDataOutput,\n any,\n [TLastEncodeChunkOutput] extends [never] ? any : TLastEncodeChunkOutput\n >,\n >(\n middleware: TMiddleware,\n ): IUniKvsBranch<\n TKeyValueMapping,\n [TBranchChunkInput] extends [never]\n ? never\n : [$InferDecodeChunkInput<TMiddleware>] extends [never]\n ? never\n : TBranchChunkInput,\n [TBranchChunkOutput] extends [never]\n ? never\n : [$InferEncodeChunkOutput<TMiddleware>] extends [never]\n ? never\n : TBranchChunkOutput,\n $IsUnknown<THeadEncodeDataInput> extends true\n ? $InferEncodeDataInput<TMiddleware>\n : THeadEncodeDataInput,\n $IsUnknown<THeadDecodeDataOutput> extends true\n ? $InferDecodeDataOutput<TMiddleware>\n : THeadDecodeDataOutput,\n $IsUnknown<THeadEncodeChunkInput> extends true\n ? $InferEncodeChunkInput<TMiddleware>\n : THeadEncodeChunkInput,\n $IsUnknown<THeadDecodeChunkOutput> extends true\n ? $InferDecodeChunkOutput<TMiddleware>\n : THeadDecodeChunkOutput,\n $InferDecodeDataInput<TMiddleware>,\n $InferEncodeDataOutput<TMiddleware>,\n $InferDecodeChunkInput<TMiddleware>,\n $InferEncodeChunkOutput<TMiddleware>,\n TBranchHasPersist\n >;\n\n persist<\n TStorage extends IStorage<\n [TLastEncodeDataOutput] extends [never] ? any : TLastEncodeDataOutput,\n [TLastDecodeDataInput] extends [never] ? any : TLastDecodeDataInput,\n [TLastEncodeChunkOutput] extends [never] ? any : TLastEncodeChunkOutput,\n [TLastDecodeChunkInput] extends [never] ? any : TLastDecodeChunkInput\n >,\n >(\n storage: TStorage,\n ): IUniKvsBranch<\n TKeyValueMapping,\n [TBranchChunkInput] extends [never]\n ? never\n : [$InferWriteChunkInput<TStorage>] extends [never]\n ? never\n : TBranchChunkInput,\n [TBranchChunkOutput] extends [never]\n ? never\n : [$InferReadChunkOutput<TStorage>] extends [never]\n ? never\n : TBranchChunkOutput,\n $IsUnknown<THeadEncodeDataInput> extends true\n ? $InferWriteDataInput<TStorage>\n : THeadEncodeDataInput,\n $IsUnknown<THeadDecodeDataOutput> extends true\n ? $InferReadDataOutput<TStorage>\n : THeadDecodeDataOutput,\n $IsUnknown<THeadEncodeChunkInput> extends true\n ? $InferWriteChunkInput<TStorage>\n : THeadEncodeChunkInput,\n $IsUnknown<THeadDecodeChunkOutput> extends true\n ? $InferReadChunkOutput<TStorage>\n : THeadDecodeChunkOutput,\n TLastDecodeDataInput,\n TLastEncodeDataOutput,\n TLastDecodeChunkInput,\n TLastEncodeChunkOutput,\n true\n >;\n}\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport default class UniKvsBranch<\n TKeyValueMapping extends KeyValueMapping = KeyValueMapping,\n TBranchChunkInput = any,\n TBranchChunkOutput = any,\n THeadEncodeDataInput = unknown,\n THeadDecodeDataOutput = unknown,\n THeadEncodeChunkInput = unknown,\n THeadDecodeChunkOutput = unknown,\n TLastDecodeDataInput = any,\n TLastEncodeDataOutput = any,\n TLastDecodeChunkInput = any,\n TLastEncodeChunkOutput = any,\n TBranchHasPersist extends boolean = false,\n> implements IUniKvsBranch<\n TKeyValueMapping,\n TBranchChunkInput,\n TBranchChunkOutput,\n THeadEncodeDataInput,\n THeadDecodeDataOutput,\n THeadEncodeChunkInput,\n THeadDecodeChunkOutput,\n TLastDecodeDataInput,\n TLastEncodeDataOutput,\n TLastDecodeChunkInput,\n TLastEncodeChunkOutput,\n TBranchHasPersist\n> {\n public constructor() {\n branchStates.set(this, {\n middlewares: [],\n destinations: [],\n });\n }\n\n public fork<\n TSubChunkInput,\n TSubChunkOutput,\n TSubHeadEncodeDataInput,\n TSubHeadDecodeDataOutput,\n TSubHeadEncodeChunkInput,\n TSubHeadDecodeChunkOutput,\n TSubLastDecodeDataInput,\n TSubLastEncodeDataOutput,\n TSubLastDecodeChunkInput,\n TSubLastEncodeChunkOutput,\n TSubHasPersist extends boolean,\n >(\n branch: IUniKvsBranch<\n any,\n TSubChunkInput,\n TSubChunkOutput,\n TSubHeadEncodeDataInput,\n TSubHeadDecodeDataOutput,\n TSubHeadEncodeChunkInput,\n TSubHeadDecodeChunkOutput,\n TSubLastDecodeDataInput,\n TSubLastEncodeDataOutput,\n TSubLastDecodeChunkInput,\n TSubLastEncodeChunkOutput,\n TSubHasPersist\n > &\n (TSubHasPersist extends true\n ? $CheckForkEncodeData<TLastEncodeDataOutput, TSubHeadEncodeDataInput>\n : unknown) &\n (TSubHasPersist extends true\n ? $CheckForkDecodeData<TLastDecodeDataInput, TSubHeadDecodeDataOutput>\n : unknown) &\n (TSubHasPersist extends true\n ? $CheckForkEncodeChunk<TLastEncodeChunkOutput, TSubHeadEncodeChunkInput>\n : unknown) &\n (TSubHasPersist extends true\n ? $CheckForkDecodeChunk<TLastDecodeChunkInput, TSubHeadDecodeChunkOutput>\n : unknown),\n ): IUniKvsBranch<\n TKeyValueMapping,\n TSubHasPersist extends true\n ? [TBranchChunkInput] extends [never]\n ? never\n : [TSubChunkInput] extends [never]\n ? never\n : TBranchChunkInput\n : TBranchChunkInput,\n TSubHasPersist extends true\n ? [TBranchChunkOutput] extends [never]\n ? never\n : [TSubChunkOutput] extends [never]\n ? never\n : TBranchChunkOutput\n : TBranchChunkOutput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadEncodeDataInput> extends true\n ? TSubHeadEncodeDataInput\n : THeadEncodeDataInput\n : THeadEncodeDataInput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadDecodeDataOutput> extends true\n ? TSubHeadDecodeDataOutput\n : THeadDecodeDataOutput\n : THeadDecodeDataOutput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadEncodeChunkInput> extends true\n ? TSubHeadEncodeChunkInput\n : THeadEncodeChunkInput\n : THeadEncodeChunkInput,\n TSubHasPersist extends true\n ? $IsUnknown<THeadDecodeChunkOutput> extends true\n ? TSubHeadDecodeChunkOutput\n : THeadDecodeChunkOutput\n : THeadDecodeChunkOutput,\n TLastDecodeDataInput,\n TLastEncodeDataOutput,\n TLastDecodeChunkInput,\n TLastEncodeChunkOutput,\n TBranchHasPersist extends true ? true : TSubHasPersist\n >;\n public fork(branch: IUniKvsBranch): IUniKvsBranch {\n const state = this.#branchState();\n appendForkDestinations(state.destinations, state.middlewares, branch);\n\n return this;\n }\n\n public use<\n TMiddleware extends IMiddleware<\n [TLastEncodeDataOutput] extends [never] ? any : TLastEncodeDataOutput,\n any,\n [TLastEncodeChunkOutput] extends [never] ? any : TLastEncodeChunkOutput\n >,\n >(\n middleware: TMiddleware,\n ): IUniKvsBranch<\n TKeyValueMapping,\n [TBranchChunkInput] extends [never]\n ? never\n : [$InferDecodeChunkInput<TMiddleware>] extends [never]\n ? never\n : TBranchChunkInput,\n [TBranchChunkOutput] extends [never]\n ? never\n : [$InferEncodeChunkOutput<TMiddleware>] extends [never]\n ? never\n : TBranchChunkOutput,\n $IsUnknown<THeadEncodeDataInput> extends true\n ? $InferEncodeDataInput<TMiddleware>\n : THeadEncodeDataInput,\n $IsUnknown<THeadDecodeDataOutput> extends true\n ? $InferDecodeDataOutput<TMiddleware>\n : THeadDecodeDataOutput,\n $IsUnknown<THeadEncodeChunkInput> extends true\n ? $InferEncodeChunkInput<TMiddleware>\n : THeadEncodeChunkInput,\n $IsUnknown<THeadDecodeChunkOutput> extends true\n ? $InferDecodeChunkOutput<TMiddleware>\n : THeadDecodeChunkOutput,\n $InferDecodeDataInput<TMiddleware>,\n $InferEncodeDataOutput<TMiddleware>,\n $InferDecodeChunkInput<TMiddleware>,\n $InferEncodeChunkOutput<TMiddleware>,\n TBranchHasPersist\n >;\n public use(middleware: IMiddleware): IUniKvsBranch {\n const state = this.#branchState();\n state.middlewares.push(UniKvsMiddleware.from(middleware));\n\n return this;\n }\n\n public persist<\n TStorage extends IStorage<\n [TLastEncodeDataOutput] extends [never] ? any : TLastEncodeDataOutput,\n [TLastDecodeDataInput] extends [never] ? any : TLastDecodeDataInput,\n [TLastEncodeChunkOutput] extends [never] ? any : TLastEncodeChunkOutput,\n [TLastDecodeChunkInput] extends [never] ? any : TLastDecodeChunkInput\n >,\n >(\n storage: TStorage,\n ): IUniKvsBranch<\n TKeyValueMapping,\n [TBranchChunkInput] extends [never]\n ? never\n : [$InferWriteChunkInput<TStorage>] extends [never]\n ? never\n : TBranchChunkInput,\n [TBranchChunkOutput] extends [never]\n ? never\n : [$InferReadChunkOutput<TStorage>] extends [never]\n ? never\n : TBranchChunkOutput,\n $IsUnknown<THeadEncodeDataInput> extends true\n ? $InferWriteDataInput<TStorage>\n : THeadEncodeDataInput,\n $IsUnknown<THeadDecodeDataOutput> extends true\n ? $InferReadDataOutput<TStorage>\n : THeadDecodeDataOutput,\n $IsUnknown<THeadEncodeChunkInput> extends true\n ? $InferWriteChunkInput<TStorage>\n : THeadEncodeChunkInput,\n $IsUnknown<THeadDecodeChunkOutput> extends true\n ? $InferReadChunkOutput<TStorage>\n : THeadDecodeChunkOutput,\n TLastDecodeDataInput,\n TLastEncodeDataOutput,\n TLastDecodeChunkInput,\n TLastEncodeChunkOutput,\n true\n >;\n public persist(storage: IStorage): IUniKvsBranch {\n const state = this.#branchState();\n state.destinations.push({\n storage: UniKvsStorage.from(storage),\n // 登録時点のチェーンをスナップショットして保持するため、以降の use はこの登録に影響しません。\n middlewares: [...state.middlewares],\n });\n\n return this;\n }\n\n /**\n * この分岐の構築状態を取得します。\n *\n * @returns 構築状態を返します。\n */\n #branchState(): BranchState {\n const state = branchStates.get(this);\n\n if (state === undefined) {\n throw new Error(\"分岐の構築状態が見つかりません。\");\n }\n\n return state;\n }\n}\n","import {\n type IGetContext,\n type IHasContext,\n type ISetContext,\n type IOpenContext,\n type IClearContext,\n type ICloseContext,\n type IActionContext,\n type IDecodeContext,\n type IDeleteContext,\n type IEncodeContext,\n type IMapKeyContext,\n type IStreamContext,\n type IReadableStream,\n type IPipelineContext,\n type ILifecycleContext,\n type ITransformContext,\n type IKeyedActionContext,\n type IDecodeStreamContext,\n type IEncodeStreamContext,\n type ITransformDataContext,\n type ITransformStreamContext,\n ReadonlyVariableError,\n} from \"@unikvs/core\";\n\n/**\n * 実行時変数の 1 件分の形式です。\n */\nexport type VariablesEntry = readonly [name: string, value: unknown];\n\n/**\n * 実行時変数の初期値に使えるマップ形式です。\n *\n * レコードまたはエントリーの反復子を受け付けます。\n */\nexport type VariablesInit = Readonly<Record<string, unknown>> | Iterable<VariablesEntry>;\n\n/**\n * 実行時変数の初期値をエントリー列に正規化します。\n *\n * レコードは `Object.entries` で展開します。\n * 反復子はそのまま返します。\n *\n * @param vars 初期値です。\n *\n * @returns エントリー列を返します。\n */\nfunction normalizeVariablesInit(vars: VariablesInit | undefined): Iterable<VariablesEntry> {\n if (!vars) {\n return [];\n }\n\n if (Symbol.iterator in vars) {\n return vars;\n }\n\n return Object.entries(vars);\n}\n\n/**\n * 複数のコンテキスト間で共有される変数ストアです。\n *\n * オニオン実行では操作内の全コンテキストが同一ストアを参照します。\n * 下流の `set` を上流が `await next()` の後に `get` で参照できます。\n */\nexport type VariablesStore = {\n /**\n * 変数のマップです。\n */\n readonly data: Map<string, unknown>;\n\n /**\n * 読み取り専用の変数名の集合です。\n */\n readonly readonly: Set<string>;\n};\n\n/**\n * 新しい空の変数ストアを作成します。\n *\n * @param vars 初期値です。\n *\n * @returns 空ストアを返します。\n */\nexport function createVariablesStore(\n vars: readonly VariablesEntry[] | undefined = [],\n): VariablesStore {\n return {\n data: new Map(vars),\n readonly: new Set(),\n };\n}\n\n/**\n * `PipelineContext` の初期値です。\n */\ntype PipelineContextInit = {\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n};\n\n/**\n * 実行時変数を保持する基底コンテキストです。\n */\nclass PipelineContext implements IPipelineContext {\n /**\n * 変数のマップです。共有ストアの参照である場合があります。\n */\n readonly #data: Map<string, unknown>;\n\n /**\n * 読み取り専用の変数名の集合です。共有ストアの参照である場合があります。\n */\n readonly #readonly: Set<string>;\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: PipelineContextInit) {\n const { store } = init;\n\n if (store) {\n // 共有ストアを参照し、下流の変更が上流に見えるようにします。\n this.#data = store.data;\n this.#readonly = store.readonly;\n } else {\n this.#data = new Map();\n this.#readonly = new Set();\n }\n\n const vars = normalizeVariablesInit(init.vars);\n\n for (const [name, value] of vars) {\n this.#data.set(name, value);\n }\n }\n\n /**\n * 変数の値を読み取ります。\n *\n * @param name 変数名です。\n *\n * @returns 変数の値を返します。\n */\n public get(name: string): unknown {\n return this.#data.get(name);\n }\n\n /**\n * 変数の値を書き込みます。\n *\n * @param name 変数名です。\n * @param value 設定する値です。\n *\n * @returns 自身を返します。\n */\n public set(name: string, value: unknown): this {\n if (this.#readonly.has(name)) {\n throw new ReadonlyVariableError({ name });\n }\n\n this.#data.set(name, value);\n\n return this;\n }\n\n /**\n * 変数の値を設定し、読み取り専用にします。\n *\n * @param name 変数名です。\n * @param value 設定する値です。\n *\n * @returns 自身を返します。\n */\n public setReadonly(name: string, value: unknown): this {\n if (this.#readonly.has(name)) {\n throw new ReadonlyVariableError({ name });\n }\n\n this.#data.set(name, value);\n this.#readonly.add(name);\n\n return this;\n }\n}\n\n/**\n * `MapKeyContext` の初期値です。\n */\ntype MapKeyContextInit = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\nexport class MapKeyContext extends PipelineContext implements IMapKeyContext {\n /**\n * 対象のキーです。\n */\n public readonly key: string;\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: MapKeyContextInit) {\n const { key, vars, store } = init;\n super({\n vars,\n store,\n });\n this.key = key;\n }\n}\n\n/**\n * `ActionContext` の初期値です。\n */\ntype ActionContextInit<TAction extends IActionContext[\"action\"]> = {\n /**\n * 実行する操作の種別です。\n */\n readonly action: TAction;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\nclass ActionContext<const TAction extends IActionContext[\"action\"]>\n extends PipelineContext\n implements IActionContext\n{\n /**\n * 実行する操作の種別です。\n */\n public readonly action: TAction;\n\n /**\n * 中断を知らせるシグナルです。\n */\n public readonly signal: AbortSignal;\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: ActionContextInit<TAction>) {\n const { vars, store, action, signal } = init;\n super({\n vars,\n store,\n });\n this.action = action;\n this.signal = signal;\n }\n}\n\nclass LifecycleContext<const TAction extends ILifecycleContext[\"action\"]>\n extends ActionContext<TAction>\n implements ILifecycleContext {}\n\n/**\n * `OpenContext` の初期値です。\n */\ntype OpenContextInit = {\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 開始処理のコンテキストです。\n */\nexport class OpenContext extends LifecycleContext<\"open\"> implements IOpenContext {\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: OpenContextInit) {\n super({\n ...init,\n action: \"open\",\n });\n }\n}\n\n/**\n * `CloseContext` の初期値です。\n */\ntype CloseContextInit = {\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 終了処理のコンテキストです。\n */\nexport class CloseContext extends LifecycleContext<\"close\"> implements ICloseContext {\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: CloseContextInit) {\n super({\n ...init,\n action: \"close\",\n });\n }\n}\n\n/**\n * `KeyedActionContext` の初期値です。\n */\ntype KeyedActionContextInit<TAction extends IKeyedActionContext[\"action\"]> = {\n /**\n * 実行する操作の種別です。\n */\n readonly action: TAction;\n\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\nclass KeyedActionContext<TAction extends IKeyedActionContext[\"action\"]>\n extends ActionContext<TAction>\n implements IKeyedActionContext\n{\n /**\n * 対象のキーです。\n */\n public readonly key: string;\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: KeyedActionContextInit<TAction>) {\n const { key, ...superInit } = init;\n super(superInit);\n this.key = key;\n }\n}\n\n/**\n * `SetContext` の初期値です。\n */\ntype SetContextInit = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 書き込み処理のコンテキストです。\n */\nexport class SetContext extends KeyedActionContext<\"set\"> implements ISetContext {\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: SetContextInit) {\n super({\n ...init,\n action: \"set\",\n });\n }\n}\n\n/**\n * `GetContext` の初期値です。\n */\ntype GetContextInit = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 修復の条件です。\n *\n * 省略時は修復しません。\n */\n readonly repair?: IGetContext[\"repair\"] | undefined;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 読み取り処理のコンテキストです。\n */\nexport class GetContext extends KeyedActionContext<\"get\"> implements IGetContext {\n /**\n * 修復の条件です。\n */\n public readonly repair: IGetContext[\"repair\"];\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: GetContextInit) {\n const {\n repair = {\n enabled: false,\n targets: [],\n },\n ...superInit\n } = init;\n super({\n ...superInit,\n action: \"get\",\n });\n this.repair = repair;\n }\n}\n\n/**\n * `StreamContext` の初期値です。\n */\ntype StreamContextInit = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 修復の条件です。\n *\n * 省略時は修復しません。\n */\n readonly repair?: IStreamContext[\"repair\"] | undefined;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * ストリーム処理のコンテキストです。\n */\nexport class StreamContext extends KeyedActionContext<\"stream\"> implements IStreamContext {\n /**\n * 修復の条件です。\n */\n public readonly repair: IStreamContext[\"repair\"];\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: StreamContextInit) {\n const {\n repair = {\n enabled: false,\n targets: [],\n },\n ...superInit\n } = init;\n super({\n ...superInit,\n action: \"stream\",\n });\n this.repair = repair;\n }\n}\n\n/**\n * `HasContext` の初期値です。\n */\ntype HasContextInit = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 存在確認のコンテキストです。\n */\nexport class HasContext extends KeyedActionContext<\"has\"> implements IHasContext {\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: HasContextInit) {\n super({\n ...init,\n action: \"has\",\n });\n }\n}\n\n/**\n * `DeleteContext` の初期値です。\n */\ntype DeleteContextInit = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 削除処理のコンテキストです。\n */\nexport class DeleteContext extends KeyedActionContext<\"delete\"> implements IDeleteContext {\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: DeleteContextInit) {\n super({\n ...init,\n action: \"delete\",\n });\n }\n}\n\n/**\n * `ClearContext` の初期値です。\n */\ntype ClearContextInit = {\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 全削除のコンテキストです。\n */\nexport class ClearContext extends ActionContext<\"clear\"> implements IClearContext {\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: ClearContextInit) {\n super({\n ...init,\n action: \"clear\",\n });\n }\n}\n\n/**\n * `TransformContext` の初期値です。\n */\ntype TransformContextInit<TAction extends ITransformContext[\"action\"], TSource = any> = {\n /**\n * 実行する操作の種別です。\n */\n readonly action: TAction;\n\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 変換前の値です。\n */\n readonly source: TSource;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 値変換の基底コンテキストです。\n */\nclass TransformContext<\n const TAction extends ITransformContext[\"action\"],\n TSource = any,\n TDestination = TSource,\n>\n extends KeyedActionContext<TAction>\n implements ITransformContext<TSource, TDestination>\n{\n /**\n * 変換前の値です。\n */\n public readonly source: TSource;\n\n /**\n * 変換後の値です。\n *\n * ミドルウェアが設定します。\n * 存在しない場合は未設定を表します。\n * `next` の実行後は凍結され、読み取りはできますが設定すると `MiddlewareDestinationFrozenError` を投げます。\n */\n public destination?: TDestination;\n\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: TransformContextInit<TAction, TSource>) {\n const { source, ...superInit } = init;\n super(superInit);\n this.source = source;\n }\n}\n\n/**\n * データ変換の基底コンテキストです。\n */\nclass TransformDataContext<\n const TAction extends ITransformDataContext[\"action\"],\n TSourceData = any,\n TDestinationData = TSourceData,\n>\n extends TransformContext<TAction, TSourceData, TDestinationData>\n implements ITransformDataContext<TSourceData, TDestinationData> {}\n\n/**\n * `EncodeContext` の初期値です。\n */\ntype EncodeContextInit<TRawData = any> = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 変換前の値です。\n */\n readonly source: TRawData;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 符号化のコンテキストです。\n */\nexport class EncodeContext<TRawData = any, TEncodedData = TRawData>\n extends TransformDataContext<\"set\", TRawData, TEncodedData>\n implements IEncodeContext<TRawData, TEncodedData>\n{\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: EncodeContextInit<TRawData>) {\n super({\n ...init,\n action: \"set\",\n });\n }\n}\n\n/**\n * `DecodeContext` の初期値です。\n */\ntype DecodeContextInit<TRawData = any> = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 変換前の値です。\n */\n readonly source: TRawData;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * 復号のコンテキストです。\n */\nexport class DecodeContext<TRawData = any, TDecodedData = TRawData>\n extends TransformDataContext<\"get\", TRawData, TDecodedData>\n implements IDecodeContext<TRawData, TDecodedData>\n{\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: DecodeContextInit<TRawData>) {\n super({\n ...init,\n action: \"get\",\n });\n }\n}\n\n/**\n * ストリーム変換の基底コンテキストです。\n */\nclass TransformStreamContext<\n TAction extends ITransformStreamContext[\"action\"],\n TSourceChunk = any,\n TDestinationChunk = TSourceChunk,\n>\n extends TransformContext<\n TAction,\n IReadableStream<TSourceChunk>,\n IReadableStream<TDestinationChunk>\n >\n implements ITransformStreamContext<TSourceChunk, TDestinationChunk> {}\n\n/**\n * `EncodeStreamContext` の初期値です。\n */\ntype EncodeStreamContextInit<TRawChunk = any> = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 変換前のストリームです。\n */\n readonly source: IReadableStream<TRawChunk>;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * ストリーム符号化のコンテキストです。\n */\nexport class EncodeStreamContext<TRawChunk = any, TEncodedChunk = TRawChunk>\n extends TransformStreamContext<\"set\", TRawChunk, TEncodedChunk>\n implements IEncodeStreamContext<TRawChunk, TEncodedChunk>\n{\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: EncodeStreamContextInit<TRawChunk>) {\n super({\n ...init,\n action: \"set\",\n });\n }\n}\n\n/**\n * `DecodeStreamContext` の初期値です。\n */\ntype DecodeStreamContextInit<TRawChunk = any> = {\n /**\n * 対象のキーです。\n */\n readonly key: string;\n\n /**\n * 中断を知らせるシグナルです。\n */\n readonly signal: AbortSignal;\n\n /**\n * 変換前のストリームです。\n */\n readonly source: IReadableStream<TRawChunk>;\n\n /**\n * 共有する変数ストアです。\n *\n * 指定したときは `vars` を複写せず、ストアの参照を共有します。\n * 下流の `set` は上流の `get` に見えます。\n * オニオン実行のネストで使用します。\n * 省略時は独立したストアを作成します。\n */\n readonly store?: VariablesStore | undefined;\n\n /**\n * 実行時変数の初期値です。\n */\n readonly vars?: VariablesInit | undefined;\n};\n\n/**\n * ストリーム復号のコンテキストです。\n */\nexport class DecodeStreamContext<TRawChunk = any, TDecodedChunk = TRawChunk>\n extends TransformStreamContext<\"stream\", TRawChunk, TDecodedChunk>\n implements IDecodeStreamContext<TRawChunk, TDecodedChunk>\n{\n /**\n * コンテキストを作成します。\n *\n * @param init 初期値です。\n */\n public constructor(init: DecodeStreamContextInit<TRawChunk>) {\n super({\n ...init,\n action: \"stream\",\n });\n }\n}\n","import { type Logger, getLogger } from \"@logtape/logtape\";\n\n// 既定のロガーです。\nexport const logger: Logger = getLogger(\"unikvs\");\n\n// 書き戻しに関する警告専用のロガーです。\nexport const repairLogger: Logger = getLogger([\"@unikvs/*\", \"@unikvs/allow-repair\"]);\n","import { type IReadableStream, type ITransformContext } from \"@unikvs/core\";\n\nimport {\n type DecodeContext,\n type EncodeContext,\n type DecodeStreamContext,\n type EncodeStreamContext,\n MapKeyContext,\n} from \"./_contexts.js\";\nimport type UniKvsMiddleware from \"./_middleware.js\";\nimport type {\n PipelineLeaf,\n PipelineNode,\n PipelineEntry,\n OperationScope,\n IActiveLeafChecker,\n} from \"./_pipeline-graph.types.js\";\nimport { ReadableStreamSchema } from \"./_streams.schemas.js\";\nimport * as v from \"./_valibot.js\";\nimport { MiddlewareDestinationFrozenError, MiddlewareDestinationMissingError } from \"./errors.js\";\n\n/**\n * 対象判定に通る葉だけを登録順に絞ります。\n *\n * 全葉が対象なら複製せず `node.allLeaves` を返します。\n *\n * @param node 対象の節です。\n * @param isActive 書き込み対象とする葉を判定します。\n *\n * @returns 対象の葉を登録順に返します。\n */\nexport function activeLeavesOf(\n node: PipelineNode,\n isActive: IActiveLeafChecker,\n): readonly PipelineLeaf[] {\n const active = node.allLeaves.filter(isActive);\n\n if (active.length === node.allLeaves.length) {\n return node.allLeaves;\n }\n\n return active;\n}\n\n/**\n * 葉と節を登録順に並べた静的な項目列を作成します。\n *\n * 各操作の走査はこの並びをそのまま読みます。\n * 並べ替え用の順序は項目に保持せず、作成時のローカル変数で解決します。\n *\n * @param leaves この節で終端する葉です。\n * @param children 子の節です。\n *\n * @returns 登録順に並べた項目列を返します。\n */\nexport function createEntries(\n leaves: readonly PipelineLeaf[],\n children: readonly PipelineNode[],\n): PipelineEntry[] {\n return [\n ...leaves.map((leaf) => ({\n entry: {\n kind: \"leaf\" as const,\n leaf,\n },\n order: leaf.index,\n })),\n ...children.map((child) => {\n const [firstLeaf] = child.allLeaves;\n\n if (firstLeaf === undefined) {\n throw new Error(\"子節に葉が存在しません。\");\n }\n\n return {\n entry: {\n kind: \"node\" as const,\n node: child,\n },\n order: firstLeaf.index,\n };\n }),\n ]\n .toSorted((a, b) => a.order - b.order)\n .map((item) => item.entry);\n}\n\n/**\n * 変換後のデータが設定されていることを検証し、変換後のデータを返します。\n *\n * ミドルウェアが `destination` を設定しなかったときに投げます。\n *\n * @param middleware 対象のミドルウェアです。\n * @param ctx 検証するコンテキストです。\n * @param operation エラーに付与する操作名です。\n *\n * @returns 変換後のデータを返します。\n */\nexport function requireDestination(\n middleware: UniKvsMiddleware,\n ctx: EncodeContext | DecodeContext | EncodeStreamContext | DecodeStreamContext,\n operation: \"encode\" | \"decode\",\n): unknown {\n if (\"destination\" in ctx) {\n return ctx.destination;\n }\n\n throw new MiddlewareDestinationMissingError({\n name: middleware.name,\n operation,\n });\n}\n\n/**\n * 変換後のストリームが設定されていることを検証し、型を検証したストリームを返します。\n *\n * ミドルウェアが `destination` を設定しなかったときに投げます。\n * ストリームの場合は存在確認に加えて `ReadableStream` の型も検証します。\n *\n * @param middleware 対象のミドルウェアです。\n * @param ctx 検証するコンテキストです。\n * @param operation エラーに付与する操作名です。\n *\n * @returns 変換後のストリームを返します。\n */\nexport function requireStreamDestination(\n middleware: UniKvsMiddleware,\n ctx: EncodeStreamContext | DecodeStreamContext,\n operation: \"encode\" | \"decode\",\n): IReadableStream {\n const destination = requireDestination(middleware, ctx, operation);\n\n return v.parseOutput(ReadableStreamSchema, destination);\n}\n\n/**\n * コンテキストの `destination` を凍結します。\n *\n * パイプラインの `next` から同期的に呼び出します。\n * 凍結後の読み取りはできますが、書き込むと `MiddlewareDestinationFrozenError` を投げます。\n *\n * @param ctx 凍結するコンテキストです。\n */\nexport function freezeDestination(ctx: ITransformContext): void {\n const { destination } = ctx;\n Object.defineProperty(ctx, \"destination\", {\n get() {\n return destination;\n },\n set() {\n throw new MiddlewareDestinationFrozenError({\n key: ctx.key,\n action: ctx.action,\n });\n },\n enumerable: true,\n configurable: true,\n });\n}\n\n/**\n * 単一ミドルウェアの `mapKey` を実行します。\n *\n * 共有ストアを参照するため、カスタム変数の下流変更が写像にも見えます。\n *\n * @param middleware 対象のミドルウェアです。\n * @param key 写像前のキーです。\n * @param scope 操作共通の実行時情報です。\n *\n * @returns 写像後のキーを返します。\n */\nexport function applyMapKey(\n middleware: UniKvsMiddleware,\n key: string,\n scope: OperationScope,\n): string {\n const c = new MapKeyContext({\n key,\n store: scope.store,\n });\n\n return middleware.mapKey(c);\n}\n","import { applyMapKey } from \"./_pipeline-graph.helpers.js\";\nimport type {\n PipelineLeaf,\n PipelineNode,\n ResolvedLeaf,\n OperationScope,\n} from \"./_pipeline-graph.types.js\";\n\n/**\n * 単一操作のスコープで葉の写像キーを解決します。\n *\n * 新 `mapKey` は同期的であり、中断シグナルも受け付けないため、共有節の写像は操作内で 1 回だけ実行され、結果を使い回します。\n * 並行解決でも `Map` キャッシュにより重複しません (`resolve` 自体が同期的であるため、競合しません)。\n */\nexport class LeafResolver {\n /**\n * 根のキーです。\n */\n readonly #rootKey: string;\n\n /**\n * 操作共通の実行時情報です (共有ストアを含みます)。\n */\n readonly #scope: OperationScope;\n\n /**\n * 節ごとの解決結果のキャッシュです。\n */\n readonly #nodeCache: Map<PipelineNode, string>;\n\n /**\n * 通常は `PipelineGraph.createResolver` から生成します。\n *\n * @param scope 操作共通の実行時情報です。\n */\n public constructor(scope: OperationScope) {\n this.#rootKey = scope.key;\n this.#scope = scope;\n this.#nodeCache = new Map();\n }\n\n /**\n * 葉の写像キーを解決します。\n *\n * @param leaf 解決する葉です。\n *\n * @returns 解決済みの葉を返します。\n */\n public resolve(leaf: PipelineLeaf): ResolvedLeaf {\n let key = this.#rootKey;\n\n for (const node of leaf.path) {\n const cached = this.#nodeCache.get(node);\n\n if (cached !== undefined) {\n key = cached;\n continue;\n }\n\n const mapped = applyMapKey(node.middleware, key, this.#scope);\n this.#nodeCache.set(node, mapped);\n key = mapped;\n }\n\n return {\n key,\n leaf,\n };\n }\n}\n","import { type IReadableStream, RepairNotAllowedError } from \"@unikvs/core\";\n\nimport {\n DecodeContext,\n EncodeContext,\n DecodeStreamContext,\n EncodeStreamContext,\n} from \"./_contexts.js\";\nimport { logger, repairLogger } from \"./_logger.js\";\nimport type UniKvsMiddleware from \"./_middleware.js\";\nimport {\n applyMapKey,\n createEntries,\n activeLeavesOf,\n freezeDestination,\n requireDestination,\n requireStreamDestination,\n} from \"./_pipeline-graph.helpers.js\";\nimport type {\n MutableNode,\n EncodeTarget,\n PipelineLeaf,\n PipelineNode,\n PipelineEntry,\n OperationScope,\n StreamEncodeTree,\n StreamEncodeTarget,\n PipelineDestination,\n BuildEncodeTreeOptions,\n} from \"./_pipeline-graph.types.js\";\nimport { LeafResolver } from \"./_pipeline-leaf-resolver.js\";\nimport { cancelStreams } from \"./_streams.js\";\nimport {\n MiddlewareNextNotCalledError,\n MiddlewareNextNotAwaitedError,\n MiddlewareDestinationFrozenError,\n MiddlewareDestinationMissingError,\n MiddlewareNextCalledMultipleTimesError,\n} from \"./errors.js\";\n\n/**\n * 節を前順で列挙するための再帰ヘルパーです。\n *\n * @param node 列挙を開始する節です。\n *\n * @yields 前順の節です。\n */\nfunction* visit(node: PipelineNode): IterableIterator<PipelineNode> {\n yield node;\n for (const entry of node.entries) {\n if (entry.kind === \"node\") {\n yield* visit(entry.node);\n }\n }\n}\n\n/**\n * 直通区間をまとめて葉名簿と全葉を確定します。\n *\n * @param node 確定する節です。\n */\nfunction finalize(node: MutableNode): void {\n // 直通の節は子の葉名簿と全葉を共有します。\n if (node.leaves.length === 0 && node.children.length === 1) {\n const [child] = node.children;\n\n if (child === undefined) {\n throw new Error(\"直通区間の子節が存在しません。\");\n }\n\n finalize(child);\n node.entries = [\n {\n kind: \"node\",\n node: child,\n },\n ];\n node.allLeaves = child.allLeaves;\n node.leafNames = child.leafNames;\n } else {\n const leaves = [...node.leaves];\n\n for (const child of node.children) {\n finalize(child);\n leaves.push(...child.allLeaves);\n }\n\n leaves.sort((a, b) => a.index - b.index);\n\n const [singleLeaf] = leaves;\n\n node.entries = createEntries(node.leaves, node.children);\n node.allLeaves = leaves;\n if (leaves.length === 1 && singleLeaf !== undefined) {\n node.leafNames = singleLeaf.nameNames;\n } else {\n node.leafNames = Object.freeze(leaves.map((leaf) => leaf.name));\n }\n }\n}\n\n/**\n * コンパイル済みのパイプライン・グラフです。\n *\n * 宛先の変換チェーンをミドルウェアのインスタンス同一性で共有する根付き木として保持し、操作ごとの走査・エンコード・書き戻し・ストリーム構築を提供します。\n *\n * 不変条件 :\n * - 葉(`leaves`)と各節の項目(`entries`)は宛先の登録順です。\n * - 名簿(`leafNames` / `nameNames`)は凍結された配列で、直通区間では参照を共有します。\n * - 共有節は 1 操作内で 1 回だけ `encode`/`encodeStream`/`mapKey` を実行します。分岐点ではプレーン値のエンコード結果を共有し、ストリームは tee で分岐します。\n * - 書き戻しの拒否は、走査中と書き込み中の 2 経路で分類します。いずれも即時に確定します。\n */\n\nexport class PipelineGraph {\n /**\n * 全葉です。\n * 登録順に保持します。\n */\n readonly #leaves: readonly PipelineLeaf[];\n\n /**\n * 根直下の葉と節を登録順に列挙した静的な項目列です。\n */\n readonly #entries: readonly PipelineEntry[];\n\n /**\n * `open`/`close`/`use` の対象となるミドルウェアです。初出順に保持します。\n */\n readonly #middlewares: readonly UniKvsMiddleware[];\n\n /**\n * 全葉数が 1 件かどうかです。\n */\n readonly #isSingleLeaf: boolean;\n\n private constructor(\n leaves: readonly PipelineLeaf[],\n entries: readonly PipelineEntry[],\n middlewares: readonly UniKvsMiddleware[],\n ) {\n this.#leaves = leaves;\n this.#entries = entries;\n this.#middlewares = middlewares;\n this.#isSingleLeaf = leaves.length === 1;\n }\n\n /**\n * 宛先定義の列を trie にコンパイルします。\n *\n * ミドルウェアはインスタンス同一性で共有します。同一インスタンスが複数の節に現れても、`open`/`close`/`use` の対象には初出の 1 件だけを保持します。\n *\n * @param destinations コンパイルする宛先定義です。\n *\n * @returns コンパイル済みのパイプライン・グラフを返します。\n */\n public static compile(destinations: readonly PipelineDestination[]): PipelineGraph {\n const rootLeaves: PipelineLeaf[] = [];\n const rootChildren: MutableNode[] = [];\n const allLeaves: PipelineLeaf[] = [];\n const middlewares: UniKvsMiddleware[] = [];\n const seenMiddlewares = new Set<UniKvsMiddleware>();\n\n for (const dest of destinations) {\n // 葉の index は登録順のもとです。名簿・書き込み順・エラー識別の基準になります。\n const index = allLeaves.length;\n const name = dest.storage.name;\n const path: PipelineNode[] = [];\n let parent: MutableNode | null = null;\n let canRepair = false;\n\n let siblings = rootChildren;\n\n for (const middleware of dest.middlewares) {\n // 共有はインスタンス同一性だけで判定し、同構造でも別インスタンスは共有しません。\n let node = siblings.find((candidate) => candidate.middleware === middleware);\n\n if (node === undefined) {\n node = {\n leaves: [],\n entries: [],\n children: [],\n allLeaves: [],\n leafNames: [],\n middleware,\n };\n siblings.push(node);\n\n // open/close/use の重複実行を避けるため、初出のインスタンスだけを保持します。\n if (!seenMiddlewares.has(middleware)) {\n seenMiddlewares.add(middleware);\n middlewares.push(middleware);\n }\n }\n // canRepair は経路上の AllowRepair の有無の論理和で、葉ごとに確定します。\n if (middleware.name === \"AllowRepair\") {\n canRepair = true;\n }\n\n path.push(node);\n parent = node;\n siblings = node.children;\n }\n\n const leaf: PipelineLeaf = {\n name,\n path,\n index,\n storage: dest.storage,\n canRepair,\n nameNames: Object.freeze([name]),\n };\n\n if (parent === null) {\n rootLeaves.push(leaf);\n } else {\n parent.leaves.push(leaf);\n }\n\n allLeaves.push(leaf);\n }\n\n for (const child of rootChildren) {\n finalize(child);\n }\n\n let rootEntries: readonly PipelineEntry[];\n let rootAllLeaves: readonly PipelineLeaf[];\n\n if (rootLeaves.length === 0 && rootChildren.length === 1) {\n const [child] = rootChildren;\n\n if (child === undefined) {\n throw new Error(\"根直下の子節が存在しません。\");\n }\n\n rootEntries = [\n {\n kind: \"node\",\n node: child,\n },\n ];\n rootAllLeaves = child.allLeaves;\n } else {\n const collected = [...rootLeaves];\n\n for (const child of rootChildren) {\n collected.push(...child.allLeaves);\n }\n\n rootEntries = createEntries(rootLeaves, rootChildren);\n rootAllLeaves = collected.toSorted((a, b) => a.index - b.index);\n }\n\n return new PipelineGraph(rootAllLeaves, rootEntries, middlewares);\n }\n\n /**\n * 全葉です。登録順に保持します。\n */\n public get leaves(): readonly PipelineLeaf[] {\n return this.#leaves;\n }\n\n /**\n * `open`/`close`/`use` の対象となるミドルウェアです。\n * 初出順・重複なしです。\n */\n public get middlewares(): readonly UniKvsMiddleware[] {\n return this.#middlewares;\n }\n\n /**\n * 全葉数が 1 件かどうかです。\n */\n public get isSingleLeaf(): boolean {\n return this.#isSingleLeaf;\n }\n\n /**\n * 葉数です。\n */\n public get size(): number {\n return this.#leaves.length;\n }\n\n /**\n * 葉を登録順に列挙します。\n */\n public [Symbol.iterator](): IterableIterator<PipelineLeaf> {\n return this.#leaves[Symbol.iterator]();\n }\n\n /**\n * 節を根から前順 (親が子より前、兄弟は登録順) に列挙します。\n *\n * 構造の確認・保守用です。操作の走査には使用しません。\n *\n * @yields 前順の節です。\n */\n public *nodes(): IterableIterator<PipelineNode> {\n for (const entry of this.#entries) {\n if (entry.kind === \"node\") {\n yield* visit(entry.node);\n }\n }\n }\n\n /**\n * 単一操作のスコープでキー写像をメモ化するリゾルバーを生成します。\n *\n * 新 `mapKey` は同期的であるため、リゾルバーも同期的です。共有節の写像は操作内で 1 回だけ実行されます。\n *\n * @param key 根のキー (論理キー) です。\n * @param vars 根の実行時変数です。\n *\n * @returns 葉リゾルバーを返します。\n */\n public createResolver(scope: OperationScope): LeafResolver {\n return new LeafResolver(scope);\n }\n\n /**\n * 葉の経路のミドルウェアを逆順に適用してデータをデコードします。\n *\n * 各段の前後で中断を確認します。\n *\n * @param leaf デコード元の葉です。\n * @param scope 操作共通の実行時情報です。`key` は論理キーです。\n * @param data デコードするデータです。\n *\n * @returns デコード済みのデータを返します。\n */\n public async decode(leaf: PipelineLeaf, scope: OperationScope, data: unknown): Promise<unknown> {\n // 経路を逆順 (葉→根) にネスト実行し、下流 (根側) の `set` が上流 (葉側) の `await next()` 後に見えるようにします。\n // データは外側から内側へ鎖状に渡し、最終結果を外側へ伝播させます。\n const reversed = leaf.path.toReversed();\n\n async function run(index: number, input: unknown): Promise<unknown> {\n const maybeNode = reversed[index];\n\n if (maybeNode === undefined) {\n return input;\n }\n\n const node: PipelineNode = maybeNode;\n\n const ctx = new DecodeContext({\n key: scope.key,\n store: scope.store,\n signal: scope.signal,\n source: input,\n });\n let downstreamResult: unknown;\n let hasDownstream = false;\n let nextCalled = false;\n let nextSettled = false;\n\n function next(): Promise<void> {\n if (nextCalled) {\n return Promise.reject(\n new MiddlewareNextCalledMultipleTimesError({\n name: node.middleware.name,\n operation: \"decode\",\n }),\n );\n }\n\n nextCalled = true;\n\n // next() の実行後、即座に destination の確認と凍結を行います。\n let decoded: unknown;\n\n try {\n decoded = requireDestination(node.middleware, ctx, \"decode\");\n freezeDestination(ctx);\n } catch (ex) {\n return Promise.reject(ex);\n }\n\n return Promise.try(async () => {\n try {\n downstreamResult = await run(index + 1, decoded);\n hasDownstream = true;\n } finally {\n nextSettled = true;\n }\n });\n }\n\n await node.middleware.decode(ctx, next);\n\n scope.signal.throwIfAborted();\n if (!nextCalled) {\n throw new MiddlewareNextNotCalledError({\n name: node.middleware.name,\n operation: \"decode\",\n });\n }\n\n if (!nextSettled) {\n throw new MiddlewareNextNotAwaitedError({\n name: node.middleware.name,\n operation: \"decode\",\n });\n }\n\n const destination = requireDestination(node.middleware, ctx, \"decode\");\n\n // 下流が実行されたときはその最終結果を返し、そうでなければ自らの出力を返す。\n // (下流の失敗を握り潰したミドルウェアでは自らの出力が最終となる。)。\n if (hasDownstream) {\n return downstreamResult;\n }\n\n return destination;\n }\n\n return run(0, data);\n }\n\n /**\n * 葉の経路のミドルウェアを逆順に `pipeThrough` してストリームをデコードします。\n *\n * @param leaf デコード元の葉です。\n * @param scope 操作共通の実行時情報です。`key` は論理キーです。\n * @param source 入力ストリームです。\n *\n * @returns デコード済みのストリームを返します。\n */\n public async decodeStream(\n leaf: PipelineLeaf,\n scope: OperationScope,\n source: IReadableStream,\n ): Promise<IReadableStream> {\n // 途中で失敗したときは構築済みのパイプを解放し、ソースストリームがロックされたまま残らないようにします。\n const pipes: IReadableStream[] = [];\n\n try {\n const reversed = leaf.path.toReversed();\n\n async function run(index: number, input: IReadableStream): Promise<IReadableStream> {\n const maybeNode = reversed[index];\n\n if (maybeNode === undefined) {\n return input;\n }\n\n const node: PipelineNode = maybeNode;\n\n const ctx = new DecodeStreamContext({\n key: scope.key,\n store: scope.store,\n signal: scope.signal,\n source: input,\n });\n let downstreamResult: IReadableStream | undefined;\n let nextCalled = false;\n let nextSettled = false;\n\n function next(): Promise<void> {\n if (nextCalled) {\n return Promise.reject(\n new MiddlewareNextCalledMultipleTimesError({\n name: node.middleware.name,\n operation: \"decode\",\n }),\n );\n }\n\n nextCalled = true;\n\n // next() の実行後、即座に destination の確認と凍結を行います。\n let decoded: IReadableStream;\n\n try {\n decoded = requireStreamDestination(node.middleware, ctx, \"decode\");\n freezeDestination(ctx);\n } catch (ex) {\n return Promise.reject(ex);\n }\n\n return Promise.try(async () => {\n try {\n downstreamResult = await run(index + 1, decoded);\n } finally {\n nextSettled = true;\n }\n });\n }\n\n try {\n await node.middleware.decodeStream(ctx, next);\n scope.signal.throwIfAborted();\n if (!nextCalled) {\n throw new MiddlewareNextNotCalledError({\n name: node.middleware.name,\n operation: \"decode\",\n });\n }\n\n if (!nextSettled) {\n throw new MiddlewareNextNotAwaitedError({\n name: node.middleware.name,\n operation: \"decode\",\n });\n }\n\n const output = requireStreamDestination(node.middleware, ctx, \"decode\");\n pipes.push(output);\n\n if (downstreamResult !== undefined) {\n return downstreamResult;\n }\n\n return output;\n } catch (ex) {\n // ミドルウェアが設定した destination は `pipes` に未登録のことがあるため、投げる前に解放対象へ加えます。\n // `source.pipeThrough(...)` で入力をロックした出力は、ここで収集しないと呼び出し側から解放できません。\n // abort 判定より前に加えることで、next() 完了後の abort でもロックした出力を解放できます。\n if (ctx.destination !== undefined) {\n pipes.push(ctx.destination);\n }\n\n throw ex;\n }\n }\n\n return await run(0, source);\n } catch (ex) {\n await cancelStreams(pipes, ex);\n throw ex;\n }\n }\n\n /**\n * 共有節を 1 回だけ実行しながら、全葉向けのプレーン値をエンコードします。\n *\n * エンコード中の失敗は生の例外として投げます。\n *\n * @param scope 操作共通の実行時情報です。`key` は論理キーです。\n * @param data エンコードするデータです。\n *\n * @returns 登録順のエンコード結果を返します。\n */\n public async encode(scope: OperationScope, data: unknown): Promise<EncodeTarget[]> {\n // 共有節は 1 回だけ encode し、得られた値は全分岐で参照を共有します(複製しません)。\n // オニオン実行により、下流の `set` が上流の `await next()` 後の `get` に見えます (共有ストアのため)。\n const targets: EncodeTarget[] = [];\n\n async function walk(node: PipelineNode, input: unknown, parentKey: string): Promise<void> {\n scope.signal.throwIfAborted();\n\n // 親コンテキストを共有ストアで作成し、`next` 内で子の入力として `destination` を参照します。\n // ミドルウェアは `destination` を設定してから `next` を呼ぶため、`next` 実行時点では親出力が確定しています。\n const ctx = new EncodeContext({\n key: scope.key,\n store: scope.store,\n signal: scope.signal,\n source: input,\n });\n let nodeKey = parentKey;\n let nextCalled = false;\n let nextSettled = false;\n\n function next(): Promise<void> {\n if (nextCalled) {\n return Promise.reject(\n new MiddlewareNextCalledMultipleTimesError({\n name: node.middleware.name,\n operation: \"encode\",\n }),\n );\n }\n\n nextCalled = true;\n\n // next() の実行後、即座に destination の確認と凍結を行います。\n let encoded: unknown;\n\n try {\n encoded = requireDestination(node.middleware, ctx, \"encode\");\n freezeDestination(ctx);\n } catch (ex) {\n return Promise.reject(ex);\n }\n\n return Promise.try(async () => {\n try {\n // `mapKey` は親出力確定後に、共有ストアで適用します。\n nodeKey = applyMapKey(node.middleware, parentKey, scope);\n for (const entry of node.entries) {\n if (entry.kind === \"node\") {\n await walk(entry.node, encoded, nodeKey);\n } else {\n targets.push({\n key: nodeKey,\n data: encoded,\n leaf: entry.leaf,\n });\n }\n }\n } finally {\n nextSettled = true;\n }\n });\n }\n\n await node.middleware.encode(ctx, next);\n\n scope.signal.throwIfAborted();\n if (!nextCalled) {\n throw new MiddlewareNextNotCalledError({\n name: node.middleware.name,\n operation: \"encode\",\n });\n }\n\n if (!nextSettled) {\n throw new MiddlewareNextNotAwaitedError({\n name: node.middleware.name,\n operation: \"encode\",\n });\n }\n }\n\n for (const entry of this.#entries) {\n if (entry.kind === \"node\") {\n await walk(entry.node, data, scope.key);\n } else {\n targets.push({\n key: scope.key,\n data,\n leaf: entry.leaf,\n });\n }\n }\n\n // 登録順に整列し、並列書き込みの開始順を安定させます。\n targets.sort((a, b) => a.leaf.index - b.leaf.index);\n\n return targets;\n }\n\n /**\n * 書き戻し対象の葉へ、共有節を 1 回だけ実行しながら再エンコードして書き込みます。\n *\n * 葉への書き込みは並列に開始し、対象単位の拒否は記録だけして他の対象の開始を止めません。\n * 走査中に確定した拒否は即座に投げます。書き込み中に判明した拒否も、応答のない他の書き込みを待たずに確定させます。\n * 拒否がなければ全タスクの終了を待ちます。\n *\n * @param scope 操作共通の実行時情報です。`key` は論理キーです。\n * @param targets 書き戻し対象の葉です。登録順に渡します。\n * @param throwOnRepairDenied 書き戻し拒否をエラーとして投げるかどうかです。\n * @param data デコード済みの原データです。\n * @param write 葉への書き込み処理です。\n */\n public async repair(\n scope: OperationScope,\n targets: readonly PipelineLeaf[],\n throwOnRepairDenied: boolean,\n data: unknown,\n write: (leaf: PipelineLeaf, key: string, data: unknown) => Promise<void>,\n ): Promise<void> {\n if (targets.length === 0) {\n return;\n }\n\n const targetSet = new Set(targets);\n const isTarget = (leaf: PipelineLeaf): boolean => targetSet.has(leaf);\n const writeTasks: Promise<void>[] = [];\n // 拒否は 2 経路です。走査中の拒否は即時に確定するため、書き込みの待機で get を止めません。\n let traversalDenial: RepairNotAllowedError | null = null;\n // 書き込み中の拒否は 1 件目のシグナルで確定し、応答のない他タスクを待ちません。\n const writeDenials: RepairNotAllowedError[] = [];\n const writeDenialSignal = Promise.withResolvers<void>();\n\n // 葉書き込みは待機せず開始し、各タスクが自身の失敗を処理して allSettled で確定します。\n const writeLeaf = (leaf: PipelineLeaf, input: unknown, writeKey: string): void => {\n writeTasks.push(\n (async (): Promise<void> => {\n try {\n await write(leaf, writeKey, input);\n } catch (ex) {\n // 意図的な中断時はエラーではありません。\n if (scope.signal.aborted) {\n return;\n }\n\n if (ex instanceof RepairNotAllowedError) {\n repairLogger.warn`Failed to repair a storage: ${ex}`;\n\n if (throwOnRepairDenied) {\n writeDenials.push(\n new RepairNotAllowedError({\n cause: ex,\n names: [leaf.name],\n }),\n );\n // 他の書き込みの完了を待たずに拒否を確定させます。resolve は冪等です。\n writeDenialSignal.resolve();\n }\n\n return;\n }\n\n logger.error`Failed to repair a storage: ${ex}`;\n }\n })(),\n );\n };\n\n const recordTraversalDenial = (denied: RepairNotAllowedError): void => {\n traversalDenial ??= denied;\n };\n\n const skipDenied = (leaf: PipelineLeaf): void => {\n // 意図的な中断時はエラーではありません。\n if (scope.signal.aborted) {\n return;\n }\n\n repairLogger.warn`Skipped repair for a storage without AllowRepair: ${leaf.name}`;\n\n if (throwOnRepairDenied) {\n recordTraversalDenial(new RepairNotAllowedError({ names: [leaf.name] }));\n }\n };\n\n const walk = async (node: PipelineNode, input: unknown, parentKey: string): Promise<void> => {\n const activeLeaves = activeLeavesOf(node, isTarget);\n\n const [firstLeaf] = activeLeaves;\n\n if (firstLeaf === undefined) {\n return;\n }\n\n const shared = activeLeaves.length >= 2;\n\n // 単一対象の節でも許可があれば再エンコードを行います。\n // 許可がなければ書き込みに到達しないため、副作用のないスキップに正規化しています。\n // ミドルウェアを実行せず、下流へそのまま伝播します。\n if (!(shared || firstLeaf.canRepair)) {\n scope.signal.throwIfAborted();\n\n for (const entry of node.entries) {\n if (entry.kind === \"node\") {\n await walk(entry.node, input, parentKey);\n } else {\n if (!isTarget(entry.leaf)) {\n continue;\n }\n\n if (!entry.leaf.canRepair) {\n skipDenied(entry.leaf);\n continue;\n }\n\n writeLeaf(entry.leaf, input, parentKey);\n }\n }\n\n return;\n }\n\n scope.signal.throwIfAborted();\n\n // オニオン実行により、下流の `set` が上流の `await next()` 後の `get` に見えます (共有ストアのため)。\n // 子走査は `next()` 内で行い、親ミドルウェアの後段としてネスト実行します。\n const ctx = new EncodeContext({\n key: scope.key,\n store: scope.store,\n signal: scope.signal,\n source: input,\n });\n let nodeKey = parentKey;\n let nextCalled = false;\n let nextSettled = false;\n let downstreamStarted = false;\n\n function next(): Promise<void> {\n if (nextCalled) {\n return Promise.reject(\n new MiddlewareNextCalledMultipleTimesError({\n name: node.middleware.name,\n operation: \"encode\",\n }),\n );\n }\n\n nextCalled = true;\n\n // next() の実行後、即座に destination の確認と凍結を行います。\n let encoded: unknown;\n\n try {\n encoded = requireDestination(node.middleware, ctx, \"encode\");\n freezeDestination(ctx);\n } catch (ex) {\n return Promise.reject(ex);\n }\n\n return Promise.try(async () => {\n try {\n // `mapKey` は親出力確定後に、共有ストアで適用します。\n // ここでの失敗は節固有のセットアップ失敗であり、下流開始前として扱います。\n nodeKey = applyMapKey(node.middleware, parentKey, scope);\n scope.signal.throwIfAborted();\n downstreamStarted = true;\n\n for (const entry of node.entries) {\n if (entry.kind === \"node\") {\n await walk(entry.node, encoded, nodeKey);\n } else {\n if (!isTarget(entry.leaf)) {\n continue;\n }\n\n if (!entry.leaf.canRepair) {\n skipDenied(entry.leaf);\n continue;\n }\n\n writeLeaf(entry.leaf, encoded, nodeKey);\n }\n }\n } finally {\n nextSettled = true;\n }\n });\n }\n\n try {\n await node.middleware.encode(ctx, next);\n scope.signal.throwIfAborted();\n if (!nextCalled) {\n throw new MiddlewareNextNotCalledError({\n name: node.middleware.name,\n operation: \"encode\",\n });\n }\n\n if (!nextSettled) {\n throw new MiddlewareNextNotAwaitedError({\n name: node.middleware.name,\n operation: \"encode\",\n });\n }\n } catch (ex) {\n // 意図的な中断時は中断理由で失敗します。\n if (scope.signal.aborted) {\n if (shared) {\n throw ex;\n }\n\n return;\n }\n // 規約違反はプログラミングエラーであり、握り潰さずに投げます。\n if (\n ex instanceof MiddlewareNextNotCalledError ||\n ex instanceof MiddlewareNextNotAwaitedError ||\n ex instanceof MiddlewareNextCalledMultipleTimesError ||\n ex instanceof MiddlewareDestinationMissingError ||\n ex instanceof MiddlewareDestinationFrozenError\n ) {\n throw ex;\n }\n // 下流開始後の失敗は子節で確定済み (単一拒否は記録、共有拒否は投げ) です。\n // repair は補助処理のため、拒否以外の失敗は記録に留め、読み取りは成功させます。\n if (downstreamStarted) {\n if (ex instanceof RepairNotAllowedError) {\n if (throwOnRepairDenied) {\n throw ex;\n }\n\n // 拒否をエラーにしない指定では、下流開始前と同じく警告に留めて読み取りを成功させます。\n repairLogger.warn`Failed to repair a storage: ${ex}`;\n\n return;\n }\n\n logger.error`Failed to repair a storage: ${ex}`;\n\n return;\n }\n\n if (ex instanceof RepairNotAllowedError) {\n repairLogger.warn`Failed to repair a storage: ${ex}`;\n\n if (throwOnRepairDenied) {\n const denied = new RepairNotAllowedError({\n cause: ex,\n names: activeLeaves.map((leaf) => leaf.name),\n });\n // 複数対象が共有する節の拒否は、旧実装同様に書き込み開始前に確定させます。\n if (shared) {\n throw denied;\n }\n\n recordTraversalDenial(denied);\n }\n } else {\n logger.error`Failed to repair a storage: ${ex}`;\n }\n }\n };\n\n for (const entry of this.#entries) {\n if (entry.kind === \"node\") {\n await walk(entry.node, data, scope.key);\n } else {\n if (!isTarget(entry.leaf)) {\n continue;\n }\n\n if (!entry.leaf.canRepair) {\n skipDenied(entry.leaf);\n continue;\n }\n\n writeLeaf(entry.leaf, data, scope.key);\n }\n }\n\n // 走査中の拒否は開始済みの書き込みを待たずに投げます。タスクは自身で例外を処理します。\n if (traversalDenial !== null) {\n const denial: RepairNotAllowedError = traversalDenial;\n\n throw denial;\n }\n\n // 書き込み中の拒否はシグナルで確定し、拒否がなければ全タスクの終了を待ちます。\n await Promise.race([Promise.allSettled(writeTasks), writeDenialSignal.promise]);\n\n const [firstDenial] = writeDenials;\n\n if (firstDenial !== undefined) {\n throw firstDenial;\n }\n }\n\n /**\n * 共有節を 1 回だけ実行しながらストリームエンコード木を構築します。\n *\n * 新 Middleware の `encodeStream` は `c.source.pipeThrough(...)` で変換し `c.destination` に設定します。\n * 共有節の実行は 1 回だけであり、分岐点では tee で入力を分けます。\n * 計画段階の失敗は何も構築せずに伝播するため、呼び出し側が `streams` のソースをキャンセルします。\n * tee とパイプの構築後の失敗は、`streams` に収集したストリーム (分割した読み取り側を含む) を内部でキャンセルしてから伝播します。\n * 呼び出し側はどちらの失敗でも `streams` をキャンセルできます。\n *\n * @param scope 操作共通の実行時情報です。`key` は論理キーです。\n * @param source 入力ストリームです。\n * @param streams 構築したストリームを収集する集合です。呼び出し側がソースを事前に追加します。\n * @param options 構築オプションです。\n *\n * @returns 構築結果を返します。\n */\n public async buildEncodeTree(\n scope: OperationScope,\n source: IReadableStream,\n streams: Set<IReadableStream>,\n options: BuildEncodeTreeOptions = {},\n ): Promise<StreamEncodeTree> {\n const { isActive, onNodeError } = options;\n const targets: StreamEncodeTarget[] = [];\n let readStream = source;\n\n // 段階 1 は共有節の単一実行と tee 分岐です。対象外の部分木は作りません。\n // 旧 `planNode` + `buildGraph` の 2 段階を、新 `encodeStream` の直接実行に統合しています。\n // オニオン実行により、下流の `set` が上流の `await next()` 後の `get` に見えます (共有ストアのため)。\n // 子走査と tee 分岐は `next()` 内で行い、親ミドルウェアの後段としてネスト実行します。\n const walk = async (\n node: PipelineNode,\n input: IReadableStream,\n parentKey: string,\n ): Promise<{\n readonly key: string;\n readonly output: IReadableStream;\n } | null> => {\n const activeLeaves = isActive === undefined ? node.allLeaves : activeLeavesOf(node, isActive);\n\n if (activeLeaves.length === 0) {\n return null;\n }\n\n scope.signal.throwIfAborted();\n\n const ctx = new EncodeStreamContext({\n key: scope.key,\n store: scope.store,\n signal: scope.signal,\n source: input,\n });\n let nodeKey: string = parentKey;\n let output: IReadableStream | undefined;\n let nextCalled = false;\n let nextSettled = false;\n let downstreamStarted = false;\n let downstreamError: unknown;\n let hasDownstreamError = false;\n let emptyBranches = false;\n\n function next(): Promise<void> {\n if (nextCalled) {\n return Promise.reject(\n new MiddlewareNextCalledMultipleTimesError({\n name: node.middleware.name,\n operation: \"encode\",\n }),\n );\n }\n\n nextCalled = true;\n\n // next() の実行後、即座に destination の確認と凍結を行います。\n let encoded: IReadableStream;\n\n try {\n encoded = requireStreamDestination(node.middleware, ctx, \"encode\");\n freezeDestination(ctx);\n } catch (ex) {\n return Promise.reject(ex);\n }\n\n return Promise.try(async () => {\n try {\n // pipeThrough で入力をロックした出力は、以降の失敗でも解放できるよう先に収集します。\n output = encoded;\n streams.add(output);\n\n // `mapKey` は親出力確定後に、共有ストアで適用します。\n // ここでの失敗は節固有のセットアップ失敗であり、下流開始前として扱います。\n nodeKey = applyMapKey(node.middleware, parentKey, scope);\n scope.signal.throwIfAborted();\n downstreamStarted = true;\n\n // 直下の分岐を登録順に tee で割り当てます。最後の分岐は tee せず残りを使います。\n const branchEntries = node.entries.filter((entry) => {\n if (entry.kind === \"leaf\") {\n return isActive === undefined || isActive(entry.leaf);\n }\n\n const leaves = entry.node.allLeaves;\n\n return isActive === undefined || leaves.some(isActive);\n });\n\n if (branchEntries.length === 0) {\n emptyBranches = true;\n\n return;\n }\n\n const assigned: IReadableStream[] = [];\n let current = output;\n\n for (let i = 0; i < branchEntries.length; i++) {\n if (i < branchEntries.length - 1) {\n const [branch, rest] = current.tee();\n streams.add(branch);\n streams.add(rest);\n assigned.push(branch);\n current = rest;\n } else {\n assigned.push(current);\n }\n }\n\n for (let i = 0; i < branchEntries.length; i++) {\n const entry = branchEntries[i];\n const stream = assigned[i];\n\n if (entry === undefined || stream === undefined) {\n throw new Error(\"分岐の項目またはストリームが存在しません。\");\n }\n\n if (entry.kind === \"leaf\") {\n targets.push({\n key: nodeKey,\n leaf: entry.leaf,\n stream,\n });\n } else {\n const child = await walk(entry.node, stream, nodeKey);\n\n if (child === null) {\n // スキップされた部分木の分岐は解放します。tee の cancel は兄弟分岐の cancel/drain まで解決しないため、開始だけして構築を止めません (未処理 rejection も残しません)。\n // oxlint-disable-next-line promise/prefer-await-to-then\n Promise.try(() => stream.cancel(new Error(\"Skipped branch\"))).catch(() => {});\n }\n }\n }\n } catch (ex) {\n // 下流のセットアップ失敗を親の後処理失敗と取り違えないよう、由来を記録します。\n downstreamError = ex;\n hasDownstreamError = true;\n throw ex;\n } finally {\n nextSettled = true;\n }\n });\n }\n\n try {\n await node.middleware.encodeStream(ctx, next);\n scope.signal.throwIfAborted();\n if (!nextCalled) {\n throw new MiddlewareNextNotCalledError({\n name: node.middleware.name,\n operation: \"encode\",\n });\n }\n\n if (!nextSettled) {\n throw new MiddlewareNextNotAwaitedError({\n name: node.middleware.name,\n operation: \"encode\",\n });\n }\n } catch (ex) {\n // next() を呼ぶ前に設定された destination は `streams` に未登録のため、投げる前に解放対象へ加えます。\n // pipeThrough で入力をロックした出力は、呼び出し側の `streams` のキャンセルでしか解放できません。\n // abort 判定・規約違反判定より前に加えることで、どちらの失敗でもロックした出力を解放できます。\n if (ctx.destination !== undefined) {\n streams.add(ctx.destination);\n }\n\n // 意図的な中断時は中断理由で失敗します。\n if (scope.signal.aborted) {\n throw ex;\n }\n // 規約違反はプログラミングエラーであり、`onNodeError` を経由せずに投げます。\n if (\n ex instanceof MiddlewareNextNotCalledError ||\n ex instanceof MiddlewareNextNotAwaitedError ||\n ex instanceof MiddlewareNextCalledMultipleTimesError ||\n ex instanceof MiddlewareDestinationMissingError ||\n ex instanceof MiddlewareDestinationFrozenError\n ) {\n throw ex;\n }\n\n // 下流開始後の失敗は子節で確定済みのため、そのまま伝播し、根直下で `onNodeError` に分類させます。\n if (downstreamStarted) {\n // 子節のセットアップ失敗は、親の後処理失敗ではないため repair でも握り潰しません。\n if (hasDownstreamError && ex === downstreamError) {\n throw ex;\n }\n\n // repair は補助処理のため、下流開始後の拒否以外の失敗は記録に留め、読み取りは成功させます。\n if (onNodeError !== undefined) {\n if (ex instanceof RepairNotAllowedError) {\n if (onNodeError(ex, activeLeaves)) {\n // 書き戻しの分岐は既に構築済みのため、そのまま読み取りを続けます。\n return output === undefined\n ? null\n : {\n key: nodeKey,\n output,\n };\n }\n }\n\n logger.error`Failed to repair a storage: ${ex}`;\n\n return output === undefined\n ? null\n : {\n key: nodeKey,\n output,\n };\n }\n\n throw ex;\n }\n\n if (onNodeError !== undefined && onNodeError(ex, activeLeaves)) {\n // 構築済みの出力は親の入力を pipeThrough でロックしており、親側からの解放は失敗するため、出力側からキャンセルを伝播させます。\n // next() 前の失敗で output が未確定のときは、設定済みの destination を直接キャンセルします。\n // tee の cancel は兄弟分岐の cancel/drain まで解決しないため、開始だけして構築を止めません (未処理 rejection も残しません)。\n const abandoned = output ?? ctx.destination;\n\n if (abandoned !== undefined) {\n // oxlint-disable-next-line promise/prefer-await-to-then\n Promise.try(() => abandoned.cancel(ex)).catch(() => {});\n }\n\n return null;\n }\n\n throw ex;\n }\n\n if (emptyBranches || output === undefined) {\n return null;\n }\n\n return {\n key: nodeKey,\n output,\n };\n };\n\n try {\n // 読み取り側は不変に保ち、書き戻し側だけを木へ通します。\n let rootInput = source;\n\n if (options.splitRead === true) {\n const [repairInput, read] = source.tee();\n streams.add(repairInput);\n streams.add(read);\n rootInput = repairInput;\n readStream = read;\n }\n\n // 根直下の分岐を登録順に tee で割り当てます。\n const rootActives = this.#leaves.filter((leaf) => isActive === undefined || isActive(leaf));\n\n if (rootActives.length === 0 && this.#entries.length === 0) {\n return {\n targets,\n readStream,\n };\n }\n\n const rootBranchEntries = this.#entries.filter((entry) => {\n if (entry.kind === \"leaf\") {\n return isActive === undefined || isActive(entry.leaf);\n }\n\n return isActive === undefined || entry.node.allLeaves.some(isActive);\n });\n\n if (rootBranchEntries.length > 0) {\n const assigned: IReadableStream[] = [];\n let current = rootInput;\n\n for (let i = 0; i < rootBranchEntries.length; i++) {\n if (i < rootBranchEntries.length - 1) {\n const [branch, rest] = current.tee();\n streams.add(branch);\n streams.add(rest);\n assigned.push(branch);\n current = rest;\n } else {\n assigned.push(current);\n }\n }\n\n for (let i = 0; i < rootBranchEntries.length; i++) {\n const entry = rootBranchEntries[i];\n const stream = assigned[i];\n\n if (entry === undefined || stream === undefined) {\n throw new Error(\"分岐の項目またはストリームが存在しません。\");\n }\n\n if (entry.kind === \"leaf\") {\n if (isActive === undefined || isActive(entry.leaf)) {\n targets.push({\n key: scope.key,\n leaf: entry.leaf,\n stream,\n });\n }\n } else {\n try {\n const child = await walk(entry.node, stream, scope.key);\n\n if (child === null) {\n // tee の cancel は兄弟分岐の cancel/drain まで解決しないため、開始だけして構築を止めません (未処理 rejection も残しません)。\n // oxlint-disable-next-line promise/prefer-await-to-then\n Promise.try(() => stream.cancel(new Error(\"Skipped branch\"))).catch(() => {});\n }\n } catch (ex) {\n if (onNodeError) {\n const leaves = entry.node.allLeaves.filter(\n (leaf) => isActive === undefined || isActive(leaf),\n );\n\n if (onNodeError(ex, leaves)) {\n // tee の cancel は兄弟分岐の cancel/drain まで解決しないため、開始だけして構築を止めません (未処理 rejection も残しません)。\n // oxlint-disable-next-line promise/prefer-await-to-then\n Promise.try(() => stream.cancel(ex)).catch(() => {});\n continue;\n }\n }\n\n throw ex;\n }\n }\n }\n }\n } catch (ex) {\n // 構築途中で失敗した場合は、tee の両分岐を含む構築済みストリームを解放してから伝播します。\n await cancelStreams(streams, ex);\n throw ex;\n }\n\n targets.sort((a, b) => a.leaf.index - b.leaf.index);\n\n return {\n targets,\n readStream,\n };\n }\n}\n","import type { TupleSchema, ObjectSchema } from \"@tai-kun/valibot-extra-lab\";\nimport type {\n StringSchema,\n BooleanSchema,\n GenericSchema,\n UnknownSchema,\n InstanceSchema,\n OptionalSchema,\n} from \"valibot\";\n\nimport type { VariablesEntry } from \"./_contexts.js\";\nimport * as v from \"./_valibot.js\";\n\nexport const VariablesKeySchema: StringSchema<undefined> = v.string();\n\nexport const VariablesInitSchema: GenericSchema<any, readonly VariablesEntry[]> = v.pipe(\n v.union([\n v.custom<Iterable<VariablesEntry>>(\n // 各アイテムの検証は今後の課題です。\n (input) => typeof input === \"object\" && input !== null && Symbol.iterator in input,\n \"Expected a Iterable object\",\n ),\n v.record(VariablesKeySchema, v.unknown()),\n ]),\n v.transform(\n (input: Iterable<VariablesEntry> | Record<string, unknown>): readonly VariablesEntry[] => {\n if (Symbol.iterator in input) {\n return [...input];\n }\n\n return Object.entries(input);\n },\n ),\n);\n\nexport const VariablesArgsSchema: TupleSchema<[typeof VariablesInitSchema], undefined> = v.tuple([\n VariablesInitSchema,\n]);\n\nexport const OpenOptionsSchema: ObjectSchema<\n {\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n },\n undefined\n> = v.object({\n /**\n * 処理の中断を通知するためのシグナルです。\n */\n signal: v.optional(v.instance(AbortSignal)),\n\n /**\n * 実行時の変数です。\n */\n vars: v.optional(VariablesInitSchema),\n});\n\nexport const OpenArgsSchema: TupleSchema<\n [OptionalSchema<typeof OpenOptionsSchema, undefined>],\n undefined\n> = v.tuple([v.optional(OpenOptionsSchema)]);\n\nexport const CloseOptionsSchema: ObjectSchema<\n {\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n },\n undefined\n> = v.object({\n /**\n * 処理の中断を通知するためのシグナルです。\n */\n signal: v.optional(v.instance(AbortSignal)),\n\n /**\n * 実行時の変数です。\n */\n vars: v.optional(VariablesInitSchema),\n});\n\nexport const CloseArgsSchema: TupleSchema<\n [OptionalSchema<typeof CloseOptionsSchema, undefined>],\n undefined\n> = v.tuple([v.optional(CloseOptionsSchema)]);\n\nexport const SetOptionsSchema: ObjectSchema<\n {\n readonly key: StringSchema<undefined>;\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly value: UnknownSchema;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n },\n undefined\n> = v.object({\n key: v.string(),\n vars: v.optional(VariablesInitSchema),\n value: v.unknown(),\n signal: v.optional(v.instance(AbortSignal)),\n});\n\nexport const SetArgsSchema: GenericSchema<\n any,\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly value: unknown;\n readonly signal?: AbortSignal | undefined;\n },\n ]\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly value: unknown;\n readonly signal?: AbortSignal | undefined;\n },\n ]\n> = v.union([\n v.tuple([SetOptionsSchema]),\n v.pipe(\n v.tuple([\n SetOptionsSchema.entries.key,\n SetOptionsSchema.entries.value,\n v.optional(v.omit(SetOptionsSchema, [\"key\", \"value\"])),\n ]),\n v.transform(\n ([key, value, options]: [\n string,\n unknown,\n (\n | {\n vars?: readonly VariablesEntry[] | undefined;\n signal?: AbortSignal | undefined;\n }\n | undefined\n ),\n ]): [\n {\n key: string;\n vars?: readonly VariablesEntry[] | undefined;\n value: unknown;\n signal?: AbortSignal | undefined;\n },\n ] => [\n {\n ...options,\n key,\n value,\n },\n ],\n ),\n ),\n]);\n\nexport const GetOptionsSchema: ObjectSchema<\n {\n readonly key: StringSchema<undefined>;\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly repair: OptionalSchema<BooleanSchema<undefined>, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n readonly throwOnRepairDenied: OptionalSchema<BooleanSchema<undefined>, undefined>;\n },\n undefined\n> = v.object({\n key: v.string(),\n vars: v.optional(VariablesInitSchema),\n repair: v.optional(v.boolean()),\n signal: v.optional(v.instance(AbortSignal)),\n throwOnRepairDenied: v.optional(v.boolean()),\n});\n\nexport const GetArgsSchema: GenericSchema<\n any,\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly repair?: boolean | undefined;\n readonly signal?: AbortSignal | undefined;\n readonly throwOnRepairDenied?: boolean | undefined;\n },\n ]\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly repair?: boolean | undefined;\n readonly signal?: AbortSignal | undefined;\n readonly throwOnRepairDenied?: boolean | undefined;\n },\n ]\n> = v.union([\n v.tuple([GetOptionsSchema]),\n v.pipe(\n v.tuple([GetOptionsSchema.entries.key, v.optional(v.omit(GetOptionsSchema, [\"key\"]))]),\n v.transform(\n ([key, options]: [\n string,\n (\n | {\n vars?: readonly VariablesEntry[] | undefined;\n repair?: boolean | undefined;\n signal?: AbortSignal | undefined;\n throwOnRepairDenied?: boolean | undefined;\n }\n | undefined\n ),\n ]): [\n {\n key: string;\n vars?: readonly VariablesEntry[] | undefined;\n repair?: boolean | undefined;\n signal?: AbortSignal | undefined;\n throwOnRepairDenied?: boolean | undefined;\n },\n ] => [\n {\n ...options,\n key,\n },\n ],\n ),\n ),\n]);\n\nexport const StreamOptionsSchema: ObjectSchema<\n {\n readonly key: StringSchema<undefined>;\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly repair: OptionalSchema<BooleanSchema<undefined>, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n readonly throwOnRepairDenied: OptionalSchema<BooleanSchema<undefined>, undefined>;\n },\n undefined\n> = v.object({\n key: v.string(),\n vars: v.optional(VariablesInitSchema),\n repair: v.optional(v.boolean()),\n signal: v.optional(v.instance(AbortSignal)),\n throwOnRepairDenied: v.optional(v.boolean()),\n});\n\nexport const StreamArgsSchema: GenericSchema<\n any,\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly repair?: boolean | undefined;\n readonly signal?: AbortSignal | undefined;\n readonly throwOnRepairDenied?: boolean | undefined;\n },\n ]\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly repair?: boolean | undefined;\n readonly signal?: AbortSignal | undefined;\n readonly throwOnRepairDenied?: boolean | undefined;\n },\n ]\n> = v.union([\n v.tuple([StreamOptionsSchema]),\n v.pipe(\n v.tuple([StreamOptionsSchema.entries.key, v.optional(v.omit(StreamOptionsSchema, [\"key\"]))]),\n v.transform(\n ([key, options]: [\n string,\n (\n | {\n vars?: readonly VariablesEntry[] | undefined;\n repair?: boolean | undefined;\n signal?: AbortSignal | undefined;\n throwOnRepairDenied?: boolean | undefined;\n }\n | undefined\n ),\n ]): [\n {\n key: string;\n vars?: readonly VariablesEntry[] | undefined;\n repair?: boolean | undefined;\n signal?: AbortSignal | undefined;\n throwOnRepairDenied?: boolean | undefined;\n },\n ] => [\n {\n ...options,\n key,\n },\n ],\n ),\n ),\n]);\n\nexport const HasOptionsSchema: ObjectSchema<\n {\n readonly key: StringSchema<undefined>;\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n },\n undefined\n> = v.object({\n key: v.string(),\n vars: v.optional(VariablesInitSchema),\n signal: v.optional(v.instance(AbortSignal)),\n});\n\nexport const HasArgsSchema: GenericSchema<\n any,\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly signal?: AbortSignal | undefined;\n },\n ]\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly signal?: AbortSignal | undefined;\n },\n ]\n> = v.union([\n v.tuple([HasOptionsSchema]),\n v.pipe(\n v.tuple([HasOptionsSchema.entries.key, v.optional(v.omit(HasOptionsSchema, [\"key\"]))]),\n v.transform(\n ([key, options]: [\n string,\n (\n | {\n vars?: readonly VariablesEntry[] | undefined;\n signal?: AbortSignal | undefined;\n }\n | undefined\n ),\n ]): [\n {\n key: string;\n vars?: readonly VariablesEntry[] | undefined;\n signal?: AbortSignal | undefined;\n },\n ] => [\n {\n ...options,\n key,\n },\n ],\n ),\n ),\n]);\n\nexport const DeleteOptionsSchema: ObjectSchema<\n {\n readonly key: StringSchema<undefined>;\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n },\n undefined\n> = v.object({\n key: v.string(),\n vars: v.optional(VariablesInitSchema),\n signal: v.optional(v.instance(AbortSignal)),\n});\n\nexport const DeleteArgsSchema: GenericSchema<\n any,\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly signal?: AbortSignal | undefined;\n },\n ]\n | readonly [\n {\n readonly key: string;\n readonly vars?: readonly VariablesEntry[] | undefined;\n readonly signal?: AbortSignal | undefined;\n },\n ]\n> = v.union([\n v.tuple([DeleteOptionsSchema]),\n v.pipe(\n v.tuple([DeleteOptionsSchema.entries.key, v.optional(v.omit(DeleteOptionsSchema, [\"key\"]))]),\n v.transform(\n ([key, options]: [\n string,\n (\n | {\n vars?: readonly VariablesEntry[] | undefined;\n signal?: AbortSignal | undefined;\n }\n | undefined\n ),\n ]): [\n {\n key: string;\n vars?: readonly VariablesEntry[] | undefined;\n signal?: AbortSignal | undefined;\n },\n ] => [\n {\n ...options,\n key,\n },\n ],\n ),\n ),\n]);\n\nexport const ClearOptionsSchema: ObjectSchema<\n {\n readonly vars: OptionalSchema<typeof VariablesInitSchema, undefined>;\n readonly signal: OptionalSchema<InstanceSchema<typeof AbortSignal, undefined>, undefined>;\n },\n undefined\n> = v.object({\n /**\n * 処理の中断を通知するためのシグナルです。\n */\n signal: v.optional(v.instance(AbortSignal)),\n\n /**\n * 実行時の変数です。\n */\n vars: v.optional(VariablesInitSchema),\n});\n\nexport const ClearArgsSchema: TupleSchema<\n [OptionalSchema<typeof ClearOptionsSchema, undefined>],\n undefined\n> = v.tuple([v.optional(ClearOptionsSchema)]);\n","import * as v from \"./_valibot.js\";\nimport { InvalidInputError } from \"./errors.js\";\nimport type { PlainValue, StreamValue } from \"./value-schemas.js\";\n\n// -------------------------------------------------------------------------------------------------。\n//\n// 値の型。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * PlainValue 型から内部のデータ型を抽出します。\n *\n * @template TPlainValue 対象となる PlainValue 型です。\n */\nexport type $InferPlainValueData<TPlainValue> =\n TPlainValue extends PlainValue<infer TData, any> ? TData : never;\n\n/**\n * PlainValue 型から入力データの型を抽出します。\n *\n * @template TPlainValue 対象となる PlainValue 型です。\n */\nexport type $InferPlainValueInput<TPlainValue> =\n TPlainValue extends PlainValue<any, infer TInput> ? TInput : never;\n\n/**\n * StreamValue 型から内部のチャンクデータ型を抽出します。\n *\n * @template TStreamValue 対象となる StreamValue 型です。\n */\nexport type $InferStreamValueChunkData<TStreamValue> =\n TStreamValue extends StreamValue<infer TChunkData, any> ? TChunkData : never;\n\n/**\n * StreamValue 型から入力チャンクデータの型を抽出します。\n *\n * @template TStreamValue 対象となる StreamValue 型です。\n */\nexport type $InferStreamValueChunkInput<TStreamValue> =\n TStreamValue extends StreamValue<any, infer TChunkInput> ? TChunkInput : never;\n\n/**\n * スキーマ付きの値であることを識別するためのブランドです。\n *\n * 同じライブラリーが複数読み込まれた環境でも認識できるようにグローバルシンボルを使用します。\n */\nexport const VALUE_SCHEMA_BRAND: unique symbol = /* #__PURE__ */ Symbol.for(\n \"unikvs:VALUE_SCHEMA_BRAND\",\n);\n\n/**\n * スキーマ付きの値が扱うデータの種類です。\n *\n * - `\"plain\"`: プレーンな値のみを扱います。\n * - `\"stream\"`: ストリーム形式の値のみを扱います。\n * - `\"any\"`: プレーンな値とストリーム形式の値のどちらも扱います。\n */\nexport type ValueSchemaKind = \"plain\" | \"stream\" | \"any\";\n\n/**\n * キーに対応する値のスキーマ情報です。\n */\nexport type ValueSchemaInfo = {\n /**\n * 扱うデータの種類です。\n */\n readonly kind: ValueSchemaKind;\n\n /**\n * データの検証に使用するスキーマです。\n */\n readonly schema: v.GenericSchema;\n};\n\n// -------------------------------------------------------------------------------------------------。\n//\n// スキーマ定義。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * 検証済みのオブジェクト形式のスキーマ定義です。\n */\ntype UniKvsSchemaInfoRecord = Readonly<Record<string, ValueSchemaInfo>>;\n\n/**\n * 検証済みの配列形式のスキーマ定義です。\n */\ntype UniKvsSchemaInfoEntries = readonly (readonly [v.GenericSchema, ValueSchemaInfo])[];\n\n/**\n * 検証済みのスキーマ定義です。\n */\ntype UniKvsSchemaInfo = UniKvsSchemaInfoRecord | UniKvsSchemaInfoEntries;\n\n// -------------------------------------------------------------------------------------------------。\n//\n// スキーマリゾルバー。\n//\n// -------------------------------------------------------------------------------------------------。\n\n/**\n * キーに対応する値のスキーマ情報を解決するインターフェースです。\n */\nexport interface IValueSchemaResolver {\n /**\n * キーに対応する値のスキーマ情報を返します。\n *\n * @param key 解決するキーです。\n *\n * @returns 対応するスキーマ情報を返します。対応する定義がない場合は `undefined` を返します。\n *\n * @throws キーがどのキースキーマにも一致しない場合に `InvalidInputError` を投げます。\n */\n resolve(key: string): ValueSchemaInfo | undefined;\n}\n\n/**\n * オブジェクト形式のスキーマ定義からスキーマ情報を解決します。\n */\nclass RecordValueSchemaResolver implements IValueSchemaResolver {\n readonly #entries: Map<string, ValueSchemaInfo>;\n\n public constructor(entries: UniKvsSchemaInfoRecord) {\n this.#entries = new Map(Object.entries(entries));\n }\n\n public resolve(key: string): ValueSchemaInfo | undefined {\n return this.#entries.get(key);\n }\n}\n\n/**\n * 配列形式のスキーマ定義からスキーマ情報を解決します。\n *\n * キースキーマに最初に一致した定義を採用します。\n */\nclass EntriesValueSchemaResolver implements IValueSchemaResolver {\n readonly #entries: UniKvsSchemaInfoEntries;\n\n readonly #keySchema: v.GenericSchema | undefined;\n\n public constructor(entries: UniKvsSchemaInfoEntries) {\n this.#entries = entries;\n if (entries.length > 0) {\n this.#keySchema = v.union(entries.map(([keySchema]) => keySchema));\n }\n }\n\n public resolve(key: string): ValueSchemaInfo | undefined {\n let resolved: ValueSchemaInfo | undefined;\n\n for (const [keySchema, valueSchema] of this.#entries) {\n const result = v.safeParse(keySchema, key);\n\n if (result.success) {\n resolved = valueSchema;\n break;\n }\n }\n\n if (resolved === undefined && this.#keySchema) {\n const result = v.safeParse(this.#keySchema, key);\n\n if (!result.success) {\n throw new InvalidInputError({\n value: key,\n issues: result.issues,\n });\n }\n }\n\n return resolved;\n }\n}\n\n/**\n * 検証済みのスキーマ定義からスキーマリゾルバーを生成します。\n *\n * @param schema 検証済みのスキーマ定義です。\n *\n * @returns スキーマリゾルバーを返します。\n */\nexport function createValueSchemaResolver(schema: UniKvsSchemaInfo): IValueSchemaResolver {\n if (Array.isArray(schema)) {\n return new EntriesValueSchemaResolver(schema);\n }\n\n return new RecordValueSchemaResolver(schema);\n}\n","import type { IReadableStream } from \"@unikvs/core\";\nimport { callAsyncableFnOnce } from \"call-fn-once\";\n\nimport { logger } from \"./_logger.js\";\nimport type { IValueStream } from \"./types.js\";\n\n/**\n * 与えられた `IReadableStream` を `IValueStream` に変換します。\n *\n * @template T ストリームが保持する値の型です。\n *\n * @param readableStream 変換対象となる `IReadableStream` インスタンスです。\n * @param onAsyncDispose ストリーム破棄時の処理です。\n * @param onBeforeDispose ソースストリームをキャンセルする前に呼ばれる処理です。\n *\n * @returns 非同期イテレーターが付与された `ValueStream` インスタンスを返します。\n */\nexport default function toValueStream<T>(\n readableStream: IReadableStream<T>,\n onAsyncDispose: () => Promise<void>,\n onBeforeDispose?: () => void,\n): IValueStream<T> {\n const cacheMap = new Map();\n const reader = readableStream.getReader();\n\n async function disposeValueStream(): Promise<void> {\n await callAsyncableFnOnce(cacheMap, \"dispose\", async () => {\n try {\n // ソースストリームのキャンセルが他の分岐の解放を待つ場合、先に分岐を中断しないと破棄が停止します。\n onBeforeDispose?.();\n await reader.cancel();\n } catch (ex) {\n logger.error`Failed to cancel the source stream: ${ex}`;\n }\n\n await onAsyncDispose();\n });\n }\n\n // cancel・エラー・早期 break であっても dispose されるように、readable 側のキャンセルを直接フックしたストリームを返します。\n const valueStream = new ReadableStream<T>({\n async pull(controller): Promise<void> {\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n // ストリームが正常に完了したことも dispose 対象とし、完了を通知する前に破棄を完了させます。\n await disposeValueStream();\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (ex) {\n // ソースエラー時も dispose (ロック解放など) を行わないと、ストリームを放棄した consumer に対してキーの I/O ロックがリークします。\n // dispose 自体が失敗しても元の例外の伝播を壊さないように、失敗はログに残すだけにします。\n await disposeValueStream().catch((disposeError) => {\n logger.error`Failed to dispose value stream: ${disposeError}`;\n });\n controller.error(ex);\n }\n },\n\n async cancel(): Promise<void> {\n await disposeValueStream();\n },\n });\n\n const stream = Object.assign(\n valueStream,\n\n // AsyncDisposable。\n {\n [Symbol.asyncDispose]: disposeValueStream,\n },\n\n // { dispose(): Promise<void> }\n {\n dispose: disposeValueStream,\n },\n\n // AsyncIterable<T, void, unknown>。\n {\n async *[Symbol.asyncIterator](this: ReadableStream<T>) {\n const r = this.getReader();\n\n try {\n // ストリームが終了するまでループを回し、チャンクを読み取ります。\n while (true) {\n const { done, value } = await r.read();\n\n if (done) {\n break;\n }\n\n yield value;\n }\n } catch (ex) {\n // エラーが発生した場合は、リーダーのキャンセルを試みます。\n try {\n await r.cancel(ex);\n } catch (cancelError) {\n logger.error`Failed to cancel reader: ${cancelError}`;\n }\n\n throw ex;\n } finally {\n // cancel・エラー・早期 break など完了方法に関係なくストリームを破棄し、キーの読み取りロックがリークしないようにします (2 回目以降は no-op)。\n try {\n await disposeValueStream();\n } catch (ex) {\n logger.error`Failed to dispose value stream: ${ex}`;\n }\n\n // 最後に必ずリーダーのロックを解放し、ストリームを再利用可能な状態にします。\n try {\n r.releaseLock();\n } catch (ex) {\n logger.error`Failed to release reader's lock: ${ex}`;\n }\n }\n },\n },\n );\n\n return stream;\n}\n","import { isReadableStream } from \"./_streams.js\";\nimport * as v from \"./_valibot.js\";\nimport type { ValueSchemaInfo } from \"./_value-schemas.js\";\n\n/**\n * プレーン値専用のスキーマに ReadableStream が渡されたことを報告するためのスキーマです。\n */\nconst PlainValueInputSchema = v.pipe(\n v.unknown(),\n v.check(\n (input) => !isReadableStream(input),\n \"Expected a plain value, but received a ReadableStream\",\n ),\n);\n\n/**\n * ストリーム専用のスキーマにプレーン値が渡されたことを報告するためのスキーマです。\n */\nconst StreamValueInputSchema = v.pipe(\n v.unknown(),\n v.check(isReadableStream, \"Expected a ReadableStream, but received a plain value\"),\n);\n\n/**\n * スキーマ情報に基づいて `set` の入力値を検証します。\n *\n * プレーン値はその場で検証し、ストリームはチャンクごとに検証するストリームに変換します。\n *\n * @param info キーに対応するスキーマ情報です。\n * @param value 検証する入力値です。\n *\n * @returns 検証済みの入力値を返します。\n */\nexport function parseSetValue(info: ValueSchemaInfo, value: unknown): unknown {\n if (isReadableStream(value)) {\n if (info.kind === \"plain\") {\n // 必ず検証に失敗するため、InvalidInputError が投げられます。\n v.parseInput(PlainValueInputSchema, value);\n }\n\n // 入力チャンクを検証し、変換後の値を後続のパイプラインへ流します。\n return value.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n controller.enqueue(v.parseInput(info.schema, chunk));\n },\n }),\n );\n }\n\n if (info.kind === \"stream\") {\n // 必ず検証に失敗するため、InvalidInputError が投げられます。\n v.parseInput(StreamValueInputSchema, value);\n }\n\n return v.parseInput(info.schema, value);\n}\n","import { type IMiddleware, type IReadableStream, RepairNotAllowedError } from \"@unikvs/core\";\nimport { combineSignals, throwIfAborted } from \"abort-signal-utils\";\nimport { type AsyncmuxLock, Asyncmux, asyncmux } from \"asyncmux\";\n\nimport {\n type VariablesInit,\n type VariablesEntry,\n type VariablesStore,\n GetContext,\n HasContext,\n SetContext,\n OpenContext,\n ClearContext,\n CloseContext,\n DeleteContext,\n StreamContext,\n createVariablesStore,\n} from \"./_contexts.js\";\nimport { logger, repairLogger } from \"./_logger.js\";\nimport type UniKvsMiddleware from \"./_middleware.js\";\nimport type { PipelineGraph } from \"./_pipeline-graph.js\";\nimport type { PipelineLeaf, ResolvedLeaf, StreamEncodeTarget } from \"./_pipeline-graph.types.js\";\nimport { cancelStreams, isReadableStream } from \"./_streams.js\";\nimport toValueStream from \"./_to-value-stream.js\";\nimport {\n GetArgsSchema,\n HasArgsSchema,\n SetArgsSchema,\n OpenArgsSchema,\n ClearArgsSchema,\n CloseArgsSchema,\n DeleteArgsSchema,\n StreamArgsSchema,\n VariablesArgsSchema,\n} from \"./_unikvs.schemas.js\";\nimport * as v from \"./_valibot.js\";\nimport type {\n ValueSchemaInfo,\n $InferPlainValueData,\n IValueSchemaResolver,\n $InferStreamValueChunkData,\n} from \"./_value-schemas.js\";\nimport { parseSetValue } from \"./_value-validation.js\";\nimport {\n type KeyNotFoundErrorArgs,\n KeyNotFoundError,\n UniKvsIsOpenError,\n UniKvsIsNotOpenError,\n MiddlewareNextNotCalledError,\n MiddlewareNextNotAwaitedError,\n PluginOperationAggregateError,\n MiddlewareNextCalledMultipleTimesError,\n} from \"./errors.js\";\nimport type { IValueStream } from \"./types.js\";\nimport type { KeyValueMapping } from \"./unikvs-branch.js\";\nimport type {\n SetValue,\n GetOptions,\n HasOptions,\n SetOptions,\n OpenOptions,\n ClearOptions,\n CloseOptions,\n DeleteOptions,\n StreamOptions,\n KeyofKeyValueMapping,\n KeyofKeyValueMappingHasPlainValue,\n KeyofKeyValueMappingHasStreamValue,\n} from \"./unikvs.types.js\";\n\n/**\n * ストリームの読み取りロックを自動解放するための FinalizationRegistry です。\n */\nconst ioLockRegistry =\n typeof FinalizationRegistry !== \"function\"\n ? null\n : new FinalizationRegistry<IoLockRegistryHeld>((held) => {\n if (!held.lock.released) {\n held.lock.release();\n }\n\n // GC で回収された ValueStream のロックを解放し、ソースのリソースも破棄します。\n // dispose は valueStream を参照しないため、GC を妨げません。失敗したときはログに残すだけにします。\n // oxlint-disable-next-line promise/prefer-await-to-then\n held.dispose().catch((ex) => {\n logger.error`Failed to dispose value stream: ${ex}`;\n });\n });\n\ntype IoLockRegistryHeld = {\n /**\n * stream 操作で取得したキーの読み取りロックです。\n */\n readonly lock: AsyncmuxLock;\n\n /**\n * {@linkcode ValueStream.dispose} です。ソースストリームのキャンセルとロック解放を行います。\n */\n readonly dispose: () => Promise<void>;\n};\n\n/**\n * 接続状態を管理する内部オブジェクトです。\n */\ntype Connection = {\n /**\n * 接続全体を管理する AbortController です。\n */\n readonly ac: AbortController;\n\n /**\n * I/O の多重化を制御する Asyncmux インスタンスです。\n */\n readonly io: Asyncmux;\n};\n\n/**\n * プラグイン操作の失敗を集約するための 1 件分の記録です。\n */\ntype PluginErrorRecord = {\n /**\n * 失敗したプラグインの名前です。\n */\n readonly name: string;\n\n /**\n * 宛先またはプラグインの登録順 (0 起点) です。\n */\n readonly index: number;\n\n /**\n * 失敗の理由です。\n */\n readonly reason: unknown;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#client-operations)\n */\nexport default class UniKvs<TKeyValueMapping extends KeyValueMapping = KeyValueMapping> {\n /**\n * 現在の接続状態です。非接続時は null となります。\n */\n #con: Connection | null;\n\n readonly #acSet: Set<AbortController>;\n\n /**\n * 基本となる実行変数情報です。\n *\n * コンストラクターで受け取った初期値をエントリー列で保持します。操作ごとに複写して使用します。\n */\n #baseVars: readonly VariablesEntry[];\n\n /**\n * コンパイル済みのパイプライン・グラフです。\n */\n readonly #pipeline: PipelineGraph;\n\n /**\n * キーに対応する値のスキーマ情報を解決するリゾルバーです。スキーマ未設定時は null となります。\n */\n readonly #valueSchemaResolver: IValueSchemaResolver | null;\n\n /**\n * @internal\n */\n public constructor(\n vars: readonly VariablesEntry[],\n pipeline: PipelineGraph,\n valueSchemaResolver: IValueSchemaResolver | null = null,\n ) {\n this.#con = null;\n this.#acSet = new Set();\n this.#baseVars = vars;\n this.#pipeline = pipeline;\n this.#valueSchemaResolver = valueSchemaResolver;\n }\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-set-vars)\n */\n public setVars(vars: VariablesInit): this;\n public setVars(...args: unknown[]): this {\n const [vars] = v.parseInput(VariablesArgsSchema, args);\n this.#baseVars = vars;\n\n return this;\n }\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-assign-vars)\n */\n public assignVars(vars: VariablesInit): this;\n public assignVars(...args: unknown[]): this {\n const [vars] = v.parseInput(VariablesArgsSchema, args);\n\n const map = new Map(this.#baseVars);\n\n for (const [name, value] of vars) {\n map.set(name, value);\n }\n\n this.#baseVars = [...map];\n\n return this;\n }\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-defaults-vars)\n */\n public defaultsVars(vars: VariablesInit): this;\n public defaultsVars(...args: unknown[]): this {\n const [vars] = v.parseInput(VariablesArgsSchema, args);\n\n const map = new Map(vars);\n\n for (const [name, value] of this.#baseVars) {\n map.set(name, value);\n }\n\n this.#baseVars = [...map];\n\n return this;\n }\n\n public get isOpen(): boolean {\n return this.#con !== null;\n }\n\n public open(options?: OpenOptions): Promise<void>;\n public async open(...args: any): Promise<void> {\n if (this.#con !== null) {\n throw new UniKvsIsOpenError();\n }\n\n const [options = {}] = v.parseInput(OpenArgsSchema, args);\n const { vars: varsOption, signal: signalOption } = options;\n\n const ac = new AbortController();\n const signal = combineSignals([ac.signal, signalOption]);\n\n const operationVars = this.#createOperationVars(varsOption);\n throwIfAborted(signal);\n this.#acSet.add(ac);\n\n const dispose: (() => Promise<void>)[] = [];\n\n try {\n using _lock = await asyncmux(this, signal);\n\n try {\n if (this.#con !== null) {\n throw new UniKvsIsOpenError();\n }\n\n const openFns: [\n () => Promise<void>,\n plugin: \"storage\" | \"middleware\",\n name: string,\n index: number,\n ][] = [];\n\n // open/close 用の vars はプラグインごとに複製し、並列実行中の変更が他に見えないようにします。\n for (const [index, leaf] of this.#pipeline.leaves.entries()) {\n openFns.push([\n async (): Promise<void> => {\n const pluginVars = new Map(operationVars);\n const c = new OpenContext({\n vars: pluginVars.entries(),\n signal,\n });\n await leaf.storage.open(c);\n dispose.push(async () => {\n try {\n const cc = new CloseContext({\n vars: pluginVars.entries(),\n signal,\n });\n await leaf.storage.close(cc);\n } catch (ex) {\n logger.error`Failed to close storage: ${ex}`;\n }\n });\n },\n \"storage\",\n leaf.name,\n index,\n ]);\n }\n\n // 各ミドルウェアのオープン処理をリストに追加します。\n // ストレージと同様にプラグインごとに複製し、並列実行中の変更が互いに見えないようにします。\n for (const [index, middleware] of this.#pipeline.middlewares.entries()) {\n openFns.push([\n async (): Promise<void> => {\n const pluginVars = new Map(operationVars);\n const c = new OpenContext({\n vars: pluginVars.entries(),\n signal,\n });\n await middleware.open(c);\n dispose.push(async () => {\n try {\n const cc = new CloseContext({\n vars: pluginVars.entries(),\n signal,\n });\n await middleware.close(cc);\n } catch (ex) {\n logger.error`Failed to close middleware: ${ex}`;\n }\n });\n },\n \"middleware\",\n middleware.name,\n index,\n ]);\n }\n\n // すべての処理を並列に実行し、エラーが発生した場合は集約します。\n const errors: {\n name: string;\n index: number;\n plugin: \"storage\" | \"middleware\";\n reason: unknown;\n }[] = [];\n await Promise.all(\n openFns.map(async ([f, plugin, name, index]) => {\n try {\n await f();\n } catch (ex) {\n errors.push({\n name,\n index,\n plugin,\n reason: ex,\n });\n }\n }),\n );\n\n if (errors.length > 0) {\n // 中断以外の失敗が混ざっていないときは、abort 理由が集約エラーに埋もれないようそのまま投げます。\n if (signal.aborted && errors.every((error) => error.reason === signal.reason)) {\n throw signal.reason;\n }\n\n throw new PluginOperationAggregateError({\n action: \"open\",\n errors,\n });\n }\n\n // すべてのプラグインのオープンが成功した後も、待機中に中断されていないか最終確認します。\n // 中断済みのシグナルを持つ接続を作ると、isOpen が true なのに以降の操作がすべて即座に失敗する不整合な状態になります。\n throwIfAborted(signal);\n\n this.#con = {\n ac,\n io: new Asyncmux(),\n };\n } catch (ex) {\n if (dispose.length > 0) {\n await Promise.all(\n dispose.map(async (f) => {\n await f();\n }),\n );\n }\n\n throw ex;\n }\n } finally {\n this.#acSet.delete(ac);\n }\n }\n\n public close(options?: CloseOptions): Promise<void>;\n public close(...args: any): Promise<void> {\n try {\n const [options = {}] = v.parseInput(CloseArgsSchema, args);\n const { vars: varsOption, signal = AbortSignal.timeout(10e3) } = options;\n\n const operationVars = this.#createOperationVars(varsOption);\n\n if (this.#con === null) {\n const acArr = [...this.#acSet];\n\n this.#acSet.clear();\n\n for (const ac of acArr) {\n if (!ac.signal.aborted) {\n ac.abort(new UniKvsIsNotOpenError());\n }\n }\n\n throw new UniKvsIsNotOpenError();\n }\n\n const con = this.#con;\n const { ac } = con;\n const acArr = [ac, ...this.#acSet];\n\n this.#acSet.clear();\n\n for (const targetAc of acArr) {\n if (!targetAc.signal.aborted) {\n targetAc.abort(new UniKvsIsNotOpenError());\n }\n }\n\n const progress = { pluginsStarted: false };\n\n return this.#close(operationVars, signal, con, progress).catch(async (closeError) => {\n // #close が失敗した場合、コネクションの AbortController はすでに abort 済みで、以降の操作がすべて即座に失敗する不整合な状態になります。\n // そこで接続を破棄して isOpen=false の一貫した状態に戻します。\n if (this.#con === con) {\n this.#con = null;\n\n // プラグインの close 段階まで到達していれば、成功分の参照は解放済みで、失敗分は #close が再試行済みです。\n // ここで全プラグインを再度閉じると参照を二重解放してしまうため、close 段階に到達できなかったときだけ破棄します。\n if (!progress.pluginsStarted) {\n const disposeSignal = AbortSignal.timeout(10e3);\n await Promise.all(\n [\n ...this.#pipeline.leaves.map((leaf) => leaf.storage),\n ...this.#pipeline.middlewares,\n ].map(async (plugin) => {\n try {\n const c = new CloseContext({\n vars: new Map(operationVars).entries(),\n signal: disposeSignal,\n });\n await plugin.close(c);\n } catch (disposeError) {\n logger.error`Failed to close plugin after close failure: ${disposeError}`;\n }\n }),\n );\n }\n }\n\n throw closeError;\n });\n } catch (ex) {\n return Promise.reject(ex);\n }\n }\n\n public async [Symbol.asyncDispose](): Promise<void> {\n if (!this.isOpen) {\n return;\n }\n\n await this.close({\n signal: AbortSignal.timeout(10e3),\n });\n }\n\n public set<const TKey extends KeyofKeyValueMapping<TKeyValueMapping>>(\n options: SetOptions<TKeyValueMapping, TKey>,\n ): Promise<void>;\n public set<const TKey extends KeyofKeyValueMapping<TKeyValueMapping>>(\n key: TKey,\n value: SetValue<TKeyValueMapping[TKey]>,\n options?: Omit<SetOptions, \"key\" | \"value\">,\n ): Promise<void>;\n public async set(...args: any): Promise<void> {\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n const [options] = v.parseInput(SetArgsSchema, args);\n const { key, vars: varsOption, signal: signalOption } = options;\n\n const valueSchema = this.#resolveValueSchema(key);\n // スキーマ検証はロック取得前に済ませ、無効な入力ではロックを取得しません。\n const value = valueSchema ? parseSetValue(valueSchema, options.value) : options.value;\n\n const { ac, io } = this.#con;\n const signal = combineSignals([ac.signal, signalOption]);\n\n const store = this.#createOperationStore(varsOption);\n\n // `#setStream` へ所有権を渡す前の失敗では、ソースをロックしたままにしないよう派生ストリームをキャンセルします。\n const stream = isReadableStream(value) ? value : null;\n let ownsStream = stream !== null;\n\n try {\n using _lock = await asyncmux.readonly(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n // 書き込み前の `use` による検証を行います。変異は後続のエンコード・書き込みに引き継がれます。\n const useContext = new SetContext({\n key,\n store,\n signal,\n });\n await this.#use(\"write\", useContext);\n // `use` の完了直後に中断を確認し、後続処理での検出に依存しないようにします。\n throwIfAborted(signal);\n // `use` による変異を操作変数に反映します。\n // ロックはインスタンス (読み取り) からキーの順で取得し、逆順で解放します。\n if (stream !== null) {\n // これ以降の後始末は `#setStream` が所有します。\n ownsStream = false;\n await this.#setStream(io, signal, key, store, stream);\n } else {\n await this.#setPlain(io, signal, key, store, value);\n }\n } catch (ex) {\n if (ownsStream && stream !== null) {\n // 消費されないストリームをキャンセルし、ソースの解放を伝播させます。\n try {\n await stream.cancel(ex);\n } catch {\n // キャンセルに失敗しても元の例外の伝播を優先します。\n }\n }\n\n throw ex;\n }\n }\n\n public get<const TKey extends KeyofKeyValueMappingHasPlainValue<TKeyValueMapping>>(\n options: GetOptions<TKey>,\n ): Promise<$InferPlainValueData<TKeyValueMapping[TKey]>>;\n public get<const TKey extends KeyofKeyValueMappingHasPlainValue<TKeyValueMapping>>(\n key: TKey,\n options?: Omit<GetOptions, \"key\">,\n ): Promise<$InferPlainValueData<TKeyValueMapping[TKey]>>;\n public async get(...args: any): Promise<unknown> {\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n const [options] = v.parseInput(GetArgsSchema, args);\n const {\n key,\n vars: varsOption,\n repair = false,\n signal: signalOption,\n throwOnRepairDenied = false,\n } = options;\n\n const valueSchema = this.#resolveValueSchema(key);\n\n const { ac, io } = this.#con;\n const signal = combineSignals([ac.signal, signalOption]);\n\n const store = this.#createOperationStore(varsOption);\n\n using _lock = await asyncmux.readonly(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n // 読み取り前の `use` による検証を行います。書き戻し要求は `repair` フィールドで伝えます。\n const leafNames = this.#pipeline.leaves.map((leaf) => leaf.name);\n const useContext = new GetContext({\n key,\n store,\n repair: repair\n ? {\n enabled: true,\n targets: leafNames as [string, ...string[]],\n }\n : {\n enabled: false,\n targets: [],\n },\n signal,\n });\n await this.#use(\"read\", useContext);\n // `use` の完了直後に中断を確認し、後続処理での検出に依存しないようにします。\n throwIfAborted(signal);\n let data: unknown = undefined;\n let hit: ResolvedLeaf | null = null;\n const missing: PipelineLeaf[] = [];\n const errors: PluginErrorRecord[] = [];\n\n // 書き戻し時は、読み取りから書き込みまでを同じキーの書き込みと直列化するため、書き込みロックを取得します。\n {\n using _ioLock = await (repair\n ? io.lock({\n key,\n signal,\n })\n : io.rLock({\n key,\n signal,\n }));\n // 登録順が読み取りの優先順です。先頭で見つかればそこで終え、失敗したときは次の宛先を試します。\n const resolver = this.#pipeline.createResolver({\n key,\n store,\n signal,\n });\n\n for (const leaf of this.#pipeline) {\n const resolved = resolver.resolve(leaf);\n const existsContext = new HasContext({\n key: resolved.key,\n store,\n signal,\n });\n const readRepair = repair\n ? {\n enabled: true as const,\n targets: leafNames as [string, ...string[]],\n }\n : {\n enabled: false as const,\n targets: [] as const,\n };\n const readContext = new GetContext({\n key: resolved.key,\n store,\n repair: readRepair,\n signal,\n });\n\n try {\n if (!(await leaf.storage.exists(existsContext))) {\n missing.push(leaf);\n continue;\n }\n\n data = await leaf.storage.read(readContext);\n hit = resolved;\n break;\n } catch (ex) {\n if (signal.aborted) {\n throw ex;\n }\n\n errors.push({\n name: leaf.name,\n index: leaf.index,\n reason: ex,\n });\n logger.error`Failed to read from a storage: ${ex}`;\n }\n }\n\n if (hit === null) {\n throw this.#notFound(key, errors);\n }\n\n if (repair) {\n // 後段で見つかったデータをすべてデコードして原データに戻します。\n data = await this.#repairPlain(data, hit, missing, store, key, signal, throwOnRepairDenied);\n }\n }\n\n if (!repair) {\n // 見つかったストレージ専用の前段パイプラインを逆順に適用して、データをデコードします。\n data = await this.#pipeline.decode(\n hit.leaf,\n {\n key,\n store,\n signal,\n },\n data,\n );\n }\n\n // デコード後のデータを検証します。\n if (valueSchema) {\n data = v.parseOutput(valueSchema.schema, data);\n }\n\n return data;\n }\n\n public stream<const TKey extends KeyofKeyValueMappingHasStreamValue<TKeyValueMapping>>(\n options: StreamOptions<TKey>,\n ): Promise<IValueStream<$InferStreamValueChunkData<TKeyValueMapping[TKey]>>>;\n public stream<const TKey extends KeyofKeyValueMappingHasStreamValue<TKeyValueMapping>>(\n key: TKey,\n options?: Omit<StreamOptions, \"key\">,\n ): Promise<IValueStream<$InferStreamValueChunkData<TKeyValueMapping[TKey]>>>;\n public async stream(...args: any): Promise<IValueStream> {\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n const [options] = v.parseInput(StreamArgsSchema, args);\n const {\n key,\n vars: varsOption,\n repair = false,\n signal: signalOption,\n throwOnRepairDenied = false,\n } = options;\n\n const valueSchema = this.#resolveValueSchema(key);\n\n const { ac, io } = this.#con;\n const signal = combineSignals([ac.signal, signalOption]);\n\n const store = this.#createOperationStore(varsOption);\n\n {\n using _lock = await asyncmux.readonly(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n // 読み取り前の `use` による検証を行います。書き戻し要求は `repair` フィールドで伝えます。\n const leafNames = this.#pipeline.leaves.map((leaf) => leaf.name);\n const useContext = new StreamContext({\n key,\n store,\n repair: repair\n ? {\n enabled: true,\n targets: leafNames as [string, ...string[]],\n }\n : {\n enabled: false,\n targets: [],\n },\n signal,\n });\n await this.#use(\"read\", useContext);\n // `use` の完了直後に中断を確認し、後続処理での検出に依存しないようにします。\n throwIfAborted(signal);\n // NONE は getReadable の呼び出し前を表す番兵値です。\n const NONE: any = {};\n let r: IReadableStream = NONE;\n let hit: ResolvedLeaf | null = null;\n const missing: PipelineLeaf[] = [];\n const errors: PluginErrorRecord[] = [];\n const fillBranches: IReadableStream[] = [];\n const fillTasks: Promise<void>[] = [];\n let repairAc: AbortController | null = null;\n let cancelFills: ((reason: unknown) => Promise<void>) | null = null;\n\n // 書き戻し時は、読み取りから書き込みまでを同じキーの書き込みと直列化するため、書き込みロックを取得します。\n // キーロックは ValueStream の dispose まで保持するため、明示的に解放します。\n const ioLock = await (repair\n ? io.lock({\n key,\n signal,\n })\n : io.rLock({\n key,\n signal,\n }));\n\n try {\n // 登録順が読み取りの優先順です。先頭で見つかればそこで終え、失敗したときは次の宛先を試します。\n const resolver = this.#pipeline.createResolver({\n key,\n store,\n signal,\n });\n\n for (const leaf of this.#pipeline) {\n const resolved = resolver.resolve(leaf);\n const existsContext = new HasContext({\n key: resolved.key,\n store,\n signal,\n });\n const readableRepair = repair\n ? {\n enabled: true as const,\n targets: leafNames as [string, ...string[]],\n }\n : {\n enabled: false as const,\n targets: [] as const,\n };\n const readableContext = new StreamContext({\n key: resolved.key,\n store,\n repair: readableRepair,\n signal,\n });\n\n try {\n if (!(await leaf.storage.exists(existsContext))) {\n missing.push(leaf);\n continue;\n }\n\n r = await leaf.storage.getReadable(readableContext);\n hit = resolved;\n break;\n } catch (ex) {\n if (signal.aborted) {\n throw ex;\n }\n\n errors.push({\n name: leaf.name,\n index: leaf.index,\n reason: ex,\n });\n logger.error`Failed to read from a storage: ${ex}`;\n }\n }\n\n if (hit === null) {\n throw this.#notFound(key, errors);\n }\n\n // 書き戻しが有効なときだけ、ストリームが途中で破棄されたら進行中の書き戻しも中断できるようにします。\n repairAc = repair ? new AbortController() : null;\n const repairSignal = repairAc ? combineSignals([signal, repairAc.signal]) : signal;\n\n // 書き戻しはできる範囲で行います。失敗してもログに残すだけで、読み取りは続けます。\n const fill = (target: StreamEncodeTarget): void => {\n fillBranches.push(target.stream);\n fillTasks.push(\n (async (): Promise<void> => {\n try {\n const wc = new SetContext({\n key: target.key,\n store,\n signal: repairSignal,\n });\n const w = await target.leaf.storage.getWritable(wc);\n await target.stream.pipeTo(w, { signal: repairSignal });\n } catch (ex) {\n // パイプが中断されたときは分岐を解放し、tee が後続のチャンクを保持し続けないようにします。\n try {\n await target.stream.cancel(ex);\n } catch {\n // 解放に失敗しても書き戻しの失敗処理を優先します。\n }\n\n // 意図的な中断時はエラーではありません。\n if (repairSignal.aborted) {\n return;\n }\n\n if (ex instanceof RepairNotAllowedError) {\n repairLogger.warn`Failed to repair a storage: ${ex}`;\n\n return;\n }\n\n logger.error`Failed to repair a storage: ${ex}`;\n }\n })(),\n );\n };\n\n // セットアップに失敗したときは、構築済みの分岐と進行中の書き戻しを中断します。\n cancelFills = async (reason: unknown): Promise<void> => {\n repairAc?.abort(reason);\n await Promise.all(\n fillBranches.map(async (branch) => {\n try {\n await branch.cancel(reason);\n } catch {\n // 解放に失敗しても残りの分岐の解放を優先します。\n }\n }),\n );\n await Promise.all(fillTasks);\n };\n\n // 読み取り元をすべてデコードして原データに戻します。\n // 書き戻しの分岐は読み取りパスと分離します。\n r = await this.#pipeline.decodeStream(\n hit.leaf,\n {\n key,\n store,\n signal,\n },\n r,\n );\n\n if (repair) {\n // 許可のない宛先を先に除外します。throwOnRepairDenied が真のときはここでエラーを確定します。\n const repairSet = new Set<PipelineLeaf>();\n\n for (const leaf of missing) {\n if (!leaf.canRepair) {\n // 意図的な中断時はエラーではありません。\n if (signal.aborted) {\n continue;\n }\n\n repairLogger.warn`Skipped repair for a storage without AllowRepair: ${leaf.name}`;\n\n if (throwOnRepairDenied) {\n throw new RepairNotAllowedError({ names: [leaf.name] });\n }\n\n continue;\n }\n\n repairSet.add(leaf);\n }\n\n if (repairSet.size > 0) {\n // 読み取りパスを変更しないよう、書き戻し側だけを構築して分岐後の読み取り側を返します。\n const streams = new Set<IReadableStream>([r]);\n const tree = await this.#pipeline.buildEncodeTree(\n {\n key,\n store,\n signal,\n },\n r,\n streams,\n {\n isActive: (leaf: PipelineLeaf) => repairSet.has(leaf),\n splitRead: true,\n onNodeError: (ex: unknown, activeLeaves: readonly PipelineLeaf[]) => {\n // 意図的な中断時は中断理由で失敗します。\n throwIfAborted(signal);\n\n if (ex instanceof RepairNotAllowedError) {\n repairLogger.warn`Failed to repair a storage: ${ex}`;\n\n if (throwOnRepairDenied) {\n throw new RepairNotAllowedError({\n cause: ex,\n names: activeLeaves.map((leaf) => leaf.name),\n });\n }\n\n return true;\n }\n\n logger.error`Failed to repair a storage: ${ex}`;\n\n throw ex;\n },\n },\n );\n r = tree.readStream;\n\n for (const target of tree.targets) {\n fill(target);\n }\n }\n\n throwIfAborted(signal);\n }\n\n // デコード後のチャンクを検証します。\n if (valueSchema) {\n r = r.pipeThrough(\n new TransformStream({\n transform(chunk, controller): void {\n controller.enqueue(v.parseOutput(valueSchema.schema, chunk));\n },\n }),\n );\n }\n\n // ストリームを読み切ったかを監視します。読み切ったときは書き戻しの完了を待ち、途中で破棄されたときは書き戻しを中断します。\n let completed = false;\n\n if (repairAc) {\n r = r.pipeThrough(\n new TransformStream({\n flush(): void {\n completed = true;\n },\n transform(chunk, controller): void {\n controller.enqueue(chunk);\n },\n }),\n );\n }\n\n // 破棄時は、ソースストリームをキャンセルする前に進行中の書き戻しを中断します。\n // tee で分岐したストリームはすべての分岐のキャンセルが揃うまで元のキャンセルが完了しないためです。\n const beforeDispose = (): void => {\n if (!completed) {\n repairAc?.abort(signal.reason);\n }\n };\n\n // キーロックは ValueStream の dispose まで保持します。fill の完了を待ってから解放します。\n const dispose = async (): Promise<void> => {\n try {\n await Promise.all(fillTasks);\n } finally {\n try {\n ioLock.release();\n } catch {\n // 解放済みでも dispose を失敗させません。\n }\n }\n };\n\n if (!ioLockRegistry) {\n return toValueStream(r, dispose, beforeDispose);\n }\n\n const unregisterToken = {};\n const valueStream = toValueStream(\n r,\n async () => {\n try {\n ioLockRegistry.unregister(unregisterToken);\n } catch {\n // 未登録でも dispose を失敗させません。\n }\n\n await dispose();\n },\n beforeDispose,\n );\n\n // valueStream が GC される時点でストリームが終わっていなければロックを自動解放します。あわせて、ソースストリームが保持するリソース (S3 レスポンスボディなど) を解放できるよう dispose を記録します。\n ioLockRegistry.register(\n valueStream,\n {\n lock: ioLock,\n dispose: valueStream.dispose,\n },\n unregisterToken,\n );\n\n return valueStream;\n } catch (ex) {\n await cancelFills?.(ex);\n\n if (r !== NONE) {\n // getReadable の成功後にセットアップで失敗したときは、ソースストリームが保持するリソース (S3 レスポンスボディなど) を解放するためキャンセルします。\n try {\n await r.cancel(ex);\n } catch {\n // キャンセルに失敗しても元の例外の伝播を優先します。\n }\n }\n\n ioLock.release();\n\n throw ex;\n }\n }\n }\n\n public has(options: HasOptions<KeyofKeyValueMapping<TKeyValueMapping>>): Promise<boolean>;\n public has(\n key: KeyofKeyValueMapping<TKeyValueMapping>,\n options?: Omit<HasOptions, \"key\">,\n ): Promise<boolean>;\n public async has(...args: any): Promise<boolean> {\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n const [options] = v.parseInput(HasArgsSchema, args);\n const { key, vars: varsOption, signal: signalOption } = options;\n\n // キーがキースキーマに一致するかを検証します。\n this.#resolveValueSchema(key);\n\n const { ac, io } = this.#con;\n const signal = combineSignals([ac.signal, signalOption]);\n\n const store = this.#createOperationStore(varsOption);\n\n using _lock = await asyncmux.readonly(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n // 存在確認に先立ち、各ミドルウェアの `use` を実行します。\n // `use` による vars の変更は後続の解決・走査に引き継がれます。\n const useContext = new HasContext({\n key,\n store,\n signal,\n });\n await this.#use(\"read\", useContext);\n // `use` の完了直後に中断を確認し、後続処理での検出に依存しないようにします。\n throwIfAborted(signal);\n\n using _ioLock = await io.rLock({\n key,\n signal,\n });\n // 登録順に走査し、いずれかのストレージに存在すれば true を返します。\n // exists に失敗したときは次のストレージを試します。\n const errors: PluginErrorRecord[] = [];\n const resolver = this.#pipeline.createResolver({\n key,\n store,\n signal,\n });\n\n for (const leaf of this.#pipeline) {\n const resolved = resolver.resolve(leaf);\n\n try {\n const c = new HasContext({\n key: resolved.key,\n store,\n signal,\n });\n\n if (await leaf.storage.exists(c)) {\n return true;\n }\n } catch (ex) {\n if (signal.aborted) {\n throw ex;\n }\n\n errors.push({\n name: leaf.name,\n index: leaf.index,\n reason: ex,\n });\n\n logger.error`Failed to check existence in a storage: ${ex}`;\n }\n }\n\n // すべてのストレージで存在を確認できなかったときは結果が不明なため、get() と同様にエラーとして報告します。\n if (errors.length > 0) {\n throw this.#notFound(key, errors);\n }\n\n return false;\n }\n\n public delete(options: DeleteOptions<KeyofKeyValueMapping<TKeyValueMapping>>): Promise<void>;\n public delete(\n key: KeyofKeyValueMapping<TKeyValueMapping>,\n options?: Omit<DeleteOptions, \"key\">,\n ): Promise<void>;\n public async delete(...args: any): Promise<void> {\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n const [options] = v.parseInput(DeleteArgsSchema, args);\n const { key, vars: varsOption, signal: signalOption } = options;\n\n // キーがキースキーマに一致するかを検証します。\n this.#resolveValueSchema(key);\n\n const { ac, io } = this.#con;\n const signal = combineSignals([ac.signal, signalOption]);\n\n const store = this.#createOperationStore(varsOption);\n\n using _lock = await asyncmux.readonly(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n // 削除に先立ち、各ミドルウェアの `use` を実行します。\n // `use` による vars の変更は後続の解決・削除に引き継がれます。\n const useContext = new DeleteContext({\n key,\n store,\n signal,\n });\n await this.#use(\"delete\", useContext);\n\n using _ioLock = await io.lock({\n key,\n // `use` の完了直後に中断を確認し、後続処理での検出に依存しないようにします。\n signal,\n });\n // 全宛先を並列に削除し、失敗は宛先の index 付きで集約します。\n const errors: PluginErrorRecord[] = [];\n const resolver = this.#pipeline.createResolver({\n key,\n store,\n signal,\n });\n await Promise.all(\n this.#pipeline.leaves.map(async (leaf) => {\n const resolved = resolver.resolve(leaf);\n const existsContext = new HasContext({\n key: resolved.key,\n store,\n signal,\n });\n const deleteContext = new DeleteContext({\n key: resolved.key,\n store,\n signal,\n });\n\n try {\n if (await leaf.storage.exists(existsContext)) {\n await leaf.storage.delete(deleteContext);\n }\n } catch (ex) {\n errors.push({\n name: leaf.name,\n index: leaf.index,\n reason: ex,\n });\n }\n }),\n );\n\n if (errors.length > 0) {\n throw new PluginOperationAggregateError({\n action: \"delete\",\n errors,\n plugin: \"storage\",\n });\n }\n }\n\n public async clear(options?: ClearOptions): Promise<void>;\n public async clear(...args: any): Promise<void> {\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n const [options = {}] = v.parseInput(ClearArgsSchema, args);\n const { vars: varsOption, signal: signalOption } = options;\n\n const { ac, io } = this.#con;\n const signal = combineSignals([ac.signal, signalOption]);\n\n const store = this.#createOperationStore(varsOption);\n\n using _lock = await asyncmux.readonly(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con === null) {\n throw new UniKvsIsNotOpenError();\n }\n\n using _ioLock = await io.lock({ signal });\n // 全ミドルウェアの `use` を実行します。\n const useContext = new ClearContext({\n store,\n signal,\n });\n await this.#use(\"clear\", useContext);\n // `use` の完了直後に中断を確認し、後続処理での検出に依存しないようにします。\n throwIfAborted(signal);\n // 一括削除は全宛先で並列に実行し、失敗は宛先の index 付きで集約します。\n const errors: PluginErrorRecord[] = [];\n await Promise.all(\n this.#pipeline.leaves.map(async (leaf, index) => {\n try {\n const c = new ClearContext({\n store,\n signal,\n });\n await leaf.storage.clear(c);\n } catch (ex) {\n errors.push({\n name: leaf.name,\n index,\n reason: ex,\n });\n }\n }),\n );\n\n if (errors.length > 0) {\n throw new PluginOperationAggregateError({\n action: \"clear\",\n errors,\n plugin: \"storage\",\n });\n }\n }\n\n /**\n * 基本変数と操作固有変数を結合した実行時変数マップを作成します。\n *\n * @param vars 操作固有の変数です。\n *\n * @returns 結合した変数マップを返します。\n */\n #createOperationVars(vars: readonly VariablesEntry[] | undefined): Map<string, unknown> {\n const map = new Map(this.#baseVars);\n\n if (vars) {\n for (const [k, value] of vars) {\n map.set(k, value);\n }\n }\n\n return map;\n }\n\n /**\n * 操作内で共有される変数ストアを作成します。\n *\n * 同一操作内の全コンテキスト (`use`/`encode`/`decode`/ ストレージ) で共有され、下流の `set` が上流の `await next()` 後の `get` に見えます。\n *\n * @param vars 操作固有の変数です。\n *\n * @returns 共有ストアを返します。\n */\n #createOperationStore(vars: readonly VariablesEntry[] | undefined): VariablesStore {\n return createVariablesStore([...this.#baseVars, ...(vars ?? [])]);\n }\n\n /**\n * キーに対応する値のスキーマ情報を解決します。\n *\n * @param key 解決するキーです。\n *\n * @returns 対応するスキーマ情報を返します。スキーマ未設定または対応する定義がない場合は `undefined` を返します。\n */\n #resolveValueSchema(key: string): ValueSchemaInfo | undefined {\n return this.#valueSchemaResolver?.resolve(key);\n }\n\n /**\n * すべての宛先で読み取りに失敗したときのエラーを組み立てます。\n *\n * @param key 読み取ったキーです。\n * @param errors 収集した失敗です。\n *\n * @returns `KeyNotFoundError` を返します。\n */\n #notFound(key: string, errors: readonly PluginErrorRecord[]): KeyNotFoundError {\n const args: KeyNotFoundErrorArgs = { key };\n\n switch (errors.length) {\n case 0: {\n break;\n }\n\n case 1: {\n const [firstError] = errors;\n\n if (firstError !== undefined) {\n args.cause = firstError.reason;\n }\n\n break;\n }\n\n default: {\n args.cause = new PluginOperationAggregateError({\n action: \"read\",\n errors,\n plugin: \"storage\",\n });\n }\n }\n\n return new KeyNotFoundError(args);\n }\n\n async #close(\n operationVars: Map<string, unknown>,\n signal: AbortSignal,\n con: Connection,\n progress: { pluginsStarted: boolean },\n ): Promise<void> {\n using _lock = await asyncmux(this, signal);\n // ロック待機中に接続状態が変更されていないか再確認します。\n if (this.#con !== con) {\n throw new UniKvsIsNotOpenError();\n }\n\n const { io } = this.#con;\n using _ioLock = await io.lock({ signal });\n const closeFns: [\n () => Promise<void>,\n () => Promise<void>,\n plugin: \"storage\" | \"middleware\",\n name: string,\n index: number,\n ][] = [];\n\n // ストレージのクローズ処理を登録します。\n // open と同じ方針でプラグインごとに複製し、並列実行中の変更が互いに見えないようにします。\n for (const [index, leaf] of this.#pipeline.leaves.entries()) {\n const createContext = (): CloseContext =>\n new CloseContext({\n vars: new Map(operationVars).entries(),\n signal,\n });\n // 再試行は通常 close の失敗 (操作 signal の abort など) に引きずられないよう、新しいタイムアウト signal を使います。\n const createRetryContext = (): CloseContext =>\n new CloseContext({\n vars: new Map(operationVars).entries(),\n signal: AbortSignal.timeout(10e3),\n });\n closeFns.push([\n (): Promise<void> => leaf.storage.close(createContext()),\n (): Promise<void> => leaf.storage.retryClose(createRetryContext()),\n \"storage\",\n leaf.name,\n index,\n ]);\n }\n\n // ミドルウェアのクローズ処理を登録します。\n for (const [index, plugin] of this.#pipeline.middlewares.entries()) {\n const createContext = (): CloseContext =>\n new CloseContext({\n vars: new Map(operationVars).entries(),\n signal,\n });\n // 再試行は通常 close の失敗 (操作 signal の abort など) に引きずられないよう、新しいタイムアウト signal を使います。\n const createRetryContext = (): CloseContext =>\n new CloseContext({\n vars: new Map(operationVars).entries(),\n signal: AbortSignal.timeout(10e3),\n });\n closeFns.push([\n (): Promise<void> => plugin.close(createContext()),\n (): Promise<void> => plugin.retryClose(createRetryContext()),\n \"middleware\",\n plugin.name,\n index,\n ]);\n }\n\n // すべての処理を並列に実行し、エラーが発生した場合は集約します。\n progress.pluginsStarted = true;\n const errors: {\n name: string;\n index: number;\n plugin: \"storage\" | \"middleware\";\n reason: unknown;\n }[] = [];\n const retries: (() => Promise<void>)[] = [];\n await Promise.all(\n closeFns.map(async ([f, retry, plugin, name, index]) => {\n try {\n await f();\n } catch (ex) {\n errors.push({\n name,\n index,\n plugin,\n reason: ex,\n });\n // 通常の close で再試行すると、close 失敗後に別の利用者が引き継いだ参照まで解放してしまいます。\n retries.push(retry);\n }\n }),\n );\n\n if (errors.length > 0) {\n // 失敗したプラグインだけを 1 回再試行します。\n // 成功済みのプラグインを再 close すると、参照カウントが二重に解放され、共有している他の利用者の実体まで閉じてしまうためです。\n await Promise.all(\n retries.map(async (f) => {\n try {\n await f();\n } catch (ex) {\n logger.error`Failed to retry closing a plugin: ${ex}`;\n }\n }),\n );\n\n throw new PluginOperationAggregateError({\n action: \"close\",\n errors,\n });\n }\n\n this.#con = null;\n }\n\n /**\n * 書き込み失敗の集約と、成功した宛先への通知を行います。\n *\n * @param targets 書き込みを試みた対象です。\n * @param failed 失敗した葉の集合です。\n * @param errors 集約する失敗です。\n * @param signal 中断シグナルです。\n */\n async #finishWrites(\n targets: readonly {\n readonly key: string;\n readonly leaf: PipelineLeaf;\n }[],\n store: VariablesStore,\n failed: ReadonlySet<PipelineLeaf>,\n errors: PluginErrorRecord[],\n signal: AbortSignal,\n ): Promise<void> {\n if (errors.length === 0) {\n return;\n }\n\n const error = new PluginOperationAggregateError({\n action: \"write\",\n errors,\n plugin: \"storage\",\n });\n const notifyErrors: unknown[] = [];\n await Promise.all(\n targets.map(async (target) => {\n // 失敗した宛先を除いたすべての宛先へ通知します。通知に失敗しても元の集約エラーは置き換えません。\n if (failed.has(target.leaf)) {\n return;\n }\n\n try {\n const c = new SetContext({\n key: target.key,\n store,\n signal,\n });\n await target.leaf.storage.onOtherWriteError(c, error);\n } catch (ex) {\n notifyErrors.push(ex);\n }\n }),\n );\n\n if (notifyErrors.length > 0) {\n logger.error(new AggregateError(notifyErrors, \"Failed to handle error\"));\n }\n\n throw error;\n }\n\n /**\n * ミドルウェアの `use` をオニオン実行し、失敗時は集約して投げます。\n *\n * 同一コンテキストオブジェクトを全ミドルウェアで共有し、`next` で下流をネスト実行するため、下流の `set` が上流の `await next()` 後の `get` に見えます。\n * `encode`/`decode` と同じく `next()` の呼び出し規約を検証し、違反したときは操作を実行せず失敗させます (fail-close)。\n * いずれかのミドルウェアが投げたときは即時に確定し、後段は実行しません (fail-fast)。\n * 失敗は集約エラー (単一件) として投げます。\n *\n * @param action 集約エラーに付与する操作名です。\n * @param c 共有の `use` コンテキストです。\n */\n async #use(\n action: \"read\" | \"write\" | \"delete\" | \"clear\",\n c: IMiddleware.UseContext,\n ): Promise<void> {\n throwIfAborted(c.signal);\n\n const middlewares = this.#pipeline.middlewares;\n const dispatch = async (index: number): Promise<void> => {\n const maybeMiddleware = middlewares[index];\n\n if (maybeMiddleware === undefined) {\n return;\n }\n\n const middleware: UniKvsMiddleware = maybeMiddleware;\n\n let nextCalled = false;\n let nextSettled = false;\n let downstreamError: unknown;\n let hasDownstreamError = false;\n\n function next(): Promise<void> {\n if (nextCalled) {\n // 2 回目以降の `next()` は下流を実行せず拒否だけを返します。\n const rejection = Promise.reject(\n new MiddlewareNextCalledMultipleTimesError({\n name: middleware.name,\n operation: \"use\",\n }),\n );\n // 呼び出し側が切り離した場合の未処理 rejection を防ぎます。await したときは従来どおり拒否されます。\n // oxlint-disable-next-line promise/prefer-await-to-then\n rejection.catch(() => {});\n\n return rejection;\n }\n\n nextCalled = true;\n\n const promise = Promise.try(async () => {\n try {\n await dispatch(index + 1);\n } catch (ex) {\n // 下流の失敗を親自身の失敗と取り違えないよう、由来を記録します。\n downstreamError = ex;\n hasDownstreamError = true;\n throw ex;\n } finally {\n nextSettled = true;\n }\n });\n // 呼び出し側が切り離した場合の未処理 rejection を防ぎます。await したときは従来どおり拒否されます。\n // oxlint-disable-next-line promise/prefer-await-to-then\n promise.catch(() => {});\n\n return promise;\n }\n\n try {\n await middleware.use(c, next);\n throwIfAborted(c.signal);\n if (!nextCalled) {\n throw new MiddlewareNextNotCalledError({\n name: middleware.name,\n operation: \"use\",\n });\n }\n\n if (!nextSettled) {\n throw new MiddlewareNextNotAwaitedError({\n name: middleware.name,\n operation: \"use\",\n });\n }\n } catch (ex) {\n // 中断による失敗はそのまま投げます。\n if (c.signal.aborted && ex === c.signal.reason) {\n throw ex;\n }\n\n // 規約違反はプログラミングエラーであり、集約せずに投げます。\n if (\n ex instanceof MiddlewareNextNotCalledError ||\n ex instanceof MiddlewareNextNotAwaitedError ||\n ex instanceof MiddlewareNextCalledMultipleTimesError\n ) {\n throw ex;\n }\n\n // `next()` から伝播した下流の失敗は再集約せず、そのまま投げます。\n if (hasDownstreamError && ex === downstreamError) {\n throw ex;\n }\n\n throw new PluginOperationAggregateError({\n action,\n errors: [\n {\n name: middleware.name,\n index,\n reason: ex,\n },\n ],\n plugin: \"middleware\",\n });\n }\n };\n await dispatch(0);\n }\n\n /**\n * プレーン値の並列書き込みを行います。\n *\n * @param io 多重化インスタンスです。\n * @param signal 中断シグナルです。\n * @param key 書き込みキーです。\n * @param store 操作内で共有される変数ストアです。\n * @param value 書き込む値です.\n */\n async #setPlain(\n io: Asyncmux,\n signal: AbortSignal,\n key: string,\n store: VariablesStore,\n value: unknown,\n ): Promise<void> {\n const targets = await this.#pipeline.encode(\n {\n key,\n store,\n signal,\n },\n value,\n );\n using _ioLock = await io.lock({\n key,\n signal,\n });\n const errors: PluginErrorRecord[] = [];\n const failed = new Set<PipelineLeaf>();\n await Promise.all(\n targets.map(async (target) => {\n try {\n const c = new SetContext({\n key: target.key,\n store,\n signal,\n });\n await target.leaf.storage.write(c, target.data);\n } catch (ex) {\n errors.push({\n name: target.leaf.name,\n index: target.leaf.index,\n reason: ex,\n });\n failed.add(target.leaf);\n }\n }),\n );\n await this.#finishWrites(targets, store, failed, errors, signal);\n }\n\n /**\n * ストリーム値の並列書き込みを行います。\n *\n * @param io 多重化インスタンスです。\n * @param signal 中断シグナルです。\n * @param key 書き込みキーです。\n * @param store 操作内で共有される変数ストアです。\n * @param value 書き込むストリームです。\n */\n async #setStream(\n io: Asyncmux,\n signal: AbortSignal,\n key: string,\n store: VariablesStore,\n value: IReadableStream,\n ): Promise<void> {\n const streams = new Set<IReadableStream>([value]);\n let tree;\n\n try {\n tree = await this.#pipeline.buildEncodeTree(\n {\n key,\n store,\n signal,\n },\n value,\n streams,\n );\n } catch (ex) {\n await cancelStreams(streams, ex);\n throw ex;\n }\n\n using _ioLock = await io\n .lock({\n key,\n signal,\n })\n .catch(async (ex) => {\n // キーロックの待機中に中断されたときも、構築済みのストリームをキャンセルします。\n // ソースストリームをロックしたまま残さないためです。\n await cancelStreams(streams, ex);\n throw ex;\n });\n\n const errors: PluginErrorRecord[] = [];\n const failed = new Set<PipelineLeaf>();\n await Promise.all(\n tree.targets.map(async (target) => {\n try {\n const c = new SetContext({\n key: target.key,\n store,\n signal,\n });\n const w = await target.leaf.storage.getWritable(c);\n await target.stream.pipeTo(w, { signal });\n } catch (ex) {\n // tee で分岐したストリームは、片方の分岐をキャンセルするまで他方が読み取ったチャンクを保持し続けるため、失敗時に放棄した分岐は確実にキャンセルします。\n try {\n await target.stream.cancel(ex);\n } catch {\n // キャンセルに失敗してもエラー集約を優先します。\n }\n\n errors.push({\n name: target.leaf.name,\n index: target.leaf.index,\n reason: ex,\n });\n failed.add(target.leaf);\n }\n }),\n );\n await this.#finishWrites(tree.targets, store, failed, errors, signal);\n }\n\n /**\n * 読み取り元のチェーン全体を逆順にデコードし、書き戻し対象向けに再エンコードして書き込みます。\n *\n * @param data 読み取ったデータです。\n * @param hit 読み取り元の葉です。\n * @param missing 読み取りに失敗または不在だった葉です。\n * @param store 操作内で共有される変数ストアです。\n * @param key キーです。\n * @param signal 中断シグナルです。\n * @param throwOnRepairDenied 書き戻し拒否をエラーとして投げるかどうかです。\n *\n * @returns デコード済みの原データを返します。\n */\n async #repairPlain(\n data: unknown,\n hit: ResolvedLeaf,\n missing: readonly PipelineLeaf[],\n store: VariablesStore,\n key: string,\n signal: AbortSignal,\n throwOnRepairDenied: boolean,\n ): Promise<unknown> {\n const raw = await this.#pipeline.decode(\n hit.leaf,\n {\n key,\n store,\n signal,\n },\n data,\n );\n await this.#pipeline.repair(\n {\n key,\n store,\n signal,\n },\n missing,\n throwOnRepairDenied,\n raw,\n async (leaf, writeKey, input) => {\n const c = new SetContext({\n key: writeKey,\n store,\n signal,\n });\n await leaf.storage.write(c, input);\n },\n );\n\n throwIfAborted(signal);\n\n return raw;\n }\n}\n","import type { IStorage, IMiddleware } from \"@unikvs/core\";\n\nimport type { VariablesInit } from \"./_contexts.js\";\nimport UniKvsMiddleware from \"./_middleware.js\";\nimport { PipelineGraph } from \"./_pipeline-graph.js\";\nimport UniKvsStorage from \"./_storage.js\";\nimport type {\n ValueOf,\n $CheckForkDecodeData,\n $CheckForkEncodeData,\n $CheckForkDecodeChunk,\n $CheckForkEncodeChunk,\n $InferDecodeDataInput,\n $InferReadChunkOutput,\n $InferWriteChunkInput,\n $InferDecodeChunkInput,\n $InferEncodeDataOutput,\n $InferEncodeChunkOutput,\n} from \"./_types.js\";\nimport { appendForkDestinations } from \"./_unikvs-branch.js\";\nimport { VariablesArgsSchema, VariablesInitSchema } from \"./_unikvs.schemas.js\";\nimport * as v from \"./_valibot.js\";\nimport {\n type ValueSchemaInfo,\n type $InferPlainValueData,\n type IValueSchemaResolver,\n type $InferStreamValueChunkData,\n VALUE_SCHEMA_BRAND,\n createValueSchemaResolver,\n} from \"./_value-schemas.js\";\nimport { MissingStorageError, UnterminatedPipelineError } from \"./errors.js\";\nimport type { IUniKvsBranch, KeyValueMapping } from \"./unikvs-branch.js\";\nimport UniKvs from \"./unikvs.js\";\nimport type { Value } from \"./value-schemas.js\";\n\ntype KeyofKVMap<TKeyValueMapping extends KeyValueMapping = KeyValueMapping> = Extract<\n keyof TKeyValueMapping,\n string\n>;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport interface IUniKvsBuilder<\n TKeyValueMapping extends KeyValueMapping = KeyValueMapping,\n TUniKvsDataInput = ValueOf<{\n [TKey in KeyofKVMap<TKeyValueMapping>]: $InferPlainValueData<TKeyValueMapping[TKey]>;\n }>,\n TUniKvsDataOutput = TUniKvsDataInput,\n TUniKvsChunkInput = ValueOf<{\n [TKey in KeyofKVMap<TKeyValueMapping>]: $InferStreamValueChunkData<TKeyValueMapping[TKey]>;\n }>,\n TUniKvsChunkOutput = TUniKvsChunkInput,\n TLastMiddlewareDecodeDataInput = TUniKvsDataOutput,\n TLastMiddlewareEncodeDataOutput = TUniKvsDataInput,\n TLastMiddlewareDecodeChunkInput = TUniKvsChunkOutput,\n TLastMiddlewareEncodeChunkOutput = TUniKvsChunkInput,\n> {\n /**\n * 分岐したパイプラインを追加します。\n *\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder-fork)\n *\n * @throws 分岐がストレージに到達しない場合に `InvalidForkError` を投げます。\n */\n fork<\n TBranchChunkInput,\n TBranchChunkOutput,\n TBranchHeadEncodeDataInput,\n TBranchHeadDecodeDataOutput,\n TBranchHeadEncodeChunkInput,\n TBranchHeadDecodeChunkOutput,\n TBranchLastDecodeDataInput,\n TBranchLastEncodeDataOutput,\n TBranchLastDecodeChunkInput,\n TBranchLastEncodeChunkOutput,\n TBranchHasPersist extends boolean,\n >(\n branch: IUniKvsBranch<\n any,\n TBranchChunkInput,\n TBranchChunkOutput,\n TBranchHeadEncodeDataInput,\n TBranchHeadDecodeDataOutput,\n TBranchHeadEncodeChunkInput,\n TBranchHeadDecodeChunkOutput,\n TBranchLastDecodeDataInput,\n TBranchLastEncodeDataOutput,\n TBranchLastDecodeChunkInput,\n TBranchLastEncodeChunkOutput,\n TBranchHasPersist\n > &\n (TBranchHasPersist extends true\n ? $CheckForkEncodeData<TLastMiddlewareEncodeDataOutput, TBranchHeadEncodeDataInput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkDecodeData<TLastMiddlewareDecodeDataInput, TBranchHeadDecodeDataOutput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkEncodeChunk<TLastMiddlewareEncodeChunkOutput, TBranchHeadEncodeChunkInput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkDecodeChunk<TLastMiddlewareDecodeChunkInput, TBranchHeadDecodeChunkOutput>\n : unknown),\n ): IUniKvsBuilder<\n TKeyValueMapping,\n TUniKvsDataInput,\n TUniKvsDataOutput,\n TBranchHasPersist extends true\n ? [TUniKvsChunkInput] extends [never]\n ? never\n : [TBranchChunkInput] extends [never]\n ? never\n : TUniKvsChunkInput\n : TUniKvsChunkInput,\n TBranchHasPersist extends true\n ? [TUniKvsChunkOutput] extends [never]\n ? never\n : [TBranchChunkOutput] extends [never]\n ? never\n : TUniKvsChunkOutput\n : TUniKvsChunkOutput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n >;\n\n use<\n TMiddleware extends IMiddleware<\n [TLastMiddlewareEncodeDataOutput] extends [never] ? any : TLastMiddlewareEncodeDataOutput,\n any,\n [TLastMiddlewareEncodeChunkOutput] extends [never] ? any : TLastMiddlewareEncodeChunkOutput\n >,\n >(\n middleware: TMiddleware,\n ): IUniKvsBuilder<\n TKeyValueMapping,\n TUniKvsDataInput,\n TUniKvsDataOutput,\n [TUniKvsChunkInput] extends [never]\n ? never\n : [$InferDecodeChunkInput<TMiddleware>] extends [never]\n ? never\n : TUniKvsChunkInput,\n [TUniKvsChunkOutput] extends [never]\n ? never\n : [$InferEncodeChunkOutput<TMiddleware>] extends [never]\n ? never\n : TUniKvsChunkOutput,\n $InferDecodeDataInput<TMiddleware>,\n $InferEncodeDataOutput<TMiddleware>,\n $InferDecodeChunkInput<TMiddleware>,\n $InferEncodeChunkOutput<TMiddleware>\n >;\n\n persist<\n TStorage extends IStorage<\n [TLastMiddlewareEncodeDataOutput] extends [never] ? any : TLastMiddlewareEncodeDataOutput,\n [TLastMiddlewareDecodeDataInput] extends [never] ? any : TLastMiddlewareDecodeDataInput,\n [TLastMiddlewareEncodeChunkOutput] extends [never] ? any : TLastMiddlewareEncodeChunkOutput,\n [TLastMiddlewareDecodeChunkInput] extends [never] ? any : TLastMiddlewareDecodeChunkInput\n >,\n >(\n storage: TStorage,\n ): IUniKvsBuilderFinalizer<\n TKeyValueMapping,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeDataInput,\n [TLastMiddlewareEncodeChunkOutput] extends [never]\n ? never\n : [$InferWriteChunkInput<TStorage>] extends [never]\n ? never\n : TLastMiddlewareEncodeChunkOutput,\n [TLastMiddlewareDecodeChunkInput] extends [never]\n ? never\n : [$InferReadChunkOutput<TStorage>] extends [never]\n ? never\n : TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n >;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-set-vars)\n */\n setVars(vars: VariablesInit): this;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-assign-vars)\n */\n assignVars(vars: VariablesInit): this;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-defaults-vars)\n */\n defaultsVars(vars: VariablesInit): this;\n\n /**\n * 現在の構成が有効かどうかを判定します。\n *\n * 有効とは、1 件以上のストレージが登録され、パイプラインがストレージで終わっている状態です。\n * ストレージに到達しない分岐は `fork()` の時点で `InvalidForkError` になるため、分岐の有効性は fork 時に保証されます。\n *\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder-is-valid)\n */\n isValid(): boolean;\n}\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport interface IUniKvsBuilderFinalizer<\n TKeyValueMapping extends KeyValueMapping = KeyValueMapping,\n TWriteDataInput = any,\n TReadDataOutput = any,\n TWriteChunkInput = any,\n TReadChunkOutput = any,\n TLastMiddlewareDecodeDataInput = TReadDataOutput,\n TLastMiddlewareEncodeDataOutput = TWriteDataInput,\n TLastMiddlewareDecodeChunkInput = TReadChunkOutput,\n TLastMiddlewareEncodeChunkOutput = TWriteChunkInput,\n> {\n /**\n * 分岐したパイプラインを追加します。\n *\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder-fork)\n *\n * @throws 分岐がストレージに到達しない場合に `InvalidForkError` を投げます。\n */\n fork<\n TBranchChunkInput,\n TBranchChunkOutput,\n TBranchHeadEncodeDataInput,\n TBranchHeadDecodeDataOutput,\n TBranchHeadEncodeChunkInput,\n TBranchHeadDecodeChunkOutput,\n TBranchLastDecodeDataInput,\n TBranchLastEncodeDataOutput,\n TBranchLastDecodeChunkInput,\n TBranchLastEncodeChunkOutput,\n TBranchHasPersist extends boolean,\n >(\n branch: IUniKvsBranch<\n any,\n TBranchChunkInput,\n TBranchChunkOutput,\n TBranchHeadEncodeDataInput,\n TBranchHeadDecodeDataOutput,\n TBranchHeadEncodeChunkInput,\n TBranchHeadDecodeChunkOutput,\n TBranchLastDecodeDataInput,\n TBranchLastEncodeDataOutput,\n TBranchLastDecodeChunkInput,\n TBranchLastEncodeChunkOutput,\n TBranchHasPersist\n > &\n (TBranchHasPersist extends true\n ? $CheckForkEncodeData<TLastMiddlewareEncodeDataOutput, TBranchHeadEncodeDataInput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkDecodeData<TLastMiddlewareDecodeDataInput, TBranchHeadDecodeDataOutput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkEncodeChunk<TLastMiddlewareEncodeChunkOutput, TBranchHeadEncodeChunkInput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkDecodeChunk<TLastMiddlewareDecodeChunkInput, TBranchHeadDecodeChunkOutput>\n : unknown),\n ): IUniKvsBuilderFinalizer<\n TKeyValueMapping,\n TWriteDataInput,\n TReadDataOutput,\n TBranchHasPersist extends true\n ? [TWriteChunkInput] extends [never]\n ? never\n : [TBranchChunkInput] extends [never]\n ? never\n : TWriteChunkInput\n : TWriteChunkInput,\n TBranchHasPersist extends true\n ? [TReadChunkOutput] extends [never]\n ? never\n : [TBranchChunkOutput] extends [never]\n ? never\n : TReadChunkOutput\n : TReadChunkOutput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n >;\n\n use<\n TMiddleware extends IMiddleware<\n [TLastMiddlewareEncodeDataOutput] extends [never] ? any : TLastMiddlewareEncodeDataOutput,\n any,\n [TLastMiddlewareEncodeChunkOutput] extends [never] ? any : TLastMiddlewareEncodeChunkOutput\n >,\n >(\n middleware: TMiddleware,\n ): IUniKvsBuilderFinalizer<\n TKeyValueMapping,\n TWriteDataInput,\n TReadDataOutput,\n TWriteChunkInput,\n TReadChunkOutput,\n $InferDecodeDataInput<TMiddleware>,\n $InferEncodeDataOutput<TMiddleware>,\n $InferDecodeChunkInput<TMiddleware>,\n $InferEncodeChunkOutput<TMiddleware>\n >;\n\n persist<\n TStorage extends IStorage<\n [TLastMiddlewareEncodeDataOutput] extends [never] ? any : TLastMiddlewareEncodeDataOutput,\n [TLastMiddlewareDecodeDataInput] extends [never] ? any : TLastMiddlewareDecodeDataInput,\n [TLastMiddlewareEncodeChunkOutput] extends [never] ? any : TLastMiddlewareEncodeChunkOutput,\n [TLastMiddlewareDecodeChunkInput] extends [never] ? any : TLastMiddlewareDecodeChunkInput\n >,\n >(\n storage: TStorage,\n ): IUniKvsBuilderFinalizer<\n TKeyValueMapping,\n TWriteDataInput,\n TReadDataOutput,\n [TWriteChunkInput] extends [never]\n ? never\n : [$InferWriteChunkInput<TStorage>] extends [never]\n ? never\n : TWriteChunkInput,\n [TReadChunkOutput] extends [never]\n ? never\n : [$InferReadChunkOutput<TStorage>] extends [never]\n ? never\n : TReadChunkOutput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n >;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-set-vars)\n */\n setVars(vars: VariablesInit): this;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-assign-vars)\n */\n assignVars(vars: VariablesInit): this;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars-defaults-vars)\n */\n defaultsVars(vars: VariablesInit): this;\n\n /**\n * 現在の構成が有効かどうかを判定します。\n *\n * 有効とは、1 件以上のストレージが登録され、パイプラインがストレージで終わっている状態です。\n * ストレージに到達しない分岐は `fork()` の時点で `InvalidForkError` になるため、分岐の有効性は fork 時に保証されます。\n *\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder-is-valid)\n */\n isValid(): boolean;\n\n /**\n * `UniKvs` クライアントを作成します。\n *\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n *\n * @param options ビルドオプションです。\n *\n * @returns 作成したクライアントを返します。\n *\n * @throws ストレージが 1 件もない場合に `MissingStorageError` を投げます。\n * @throws パイプラインがストレージで終わっていない場合に `UnterminatedPipelineError` を投げます。\n */\n build(options?: UniKvsBuildOptions): UniKvs<TKeyValueMapping>;\n}\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport type UniKvsBuilderOptions = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#base-vars)\n */\n readonly vars?: VariablesInit | undefined;\n readonly schema?: UniKvsSchema | undefined;\n};\n\n/**\n * `build()` のオプションです。\n *\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport type UniKvsBuildOptions = {\n /**\n * 既存のすべてのミドルウェアより前に挿入するミドルウェアの配列です。\n * 先頭ほど手前、末尾ほど後続のミドルウェアに近づくように挿入されます。\n */\n readonly beforeAll?: readonly IMiddleware[] | undefined;\n\n /**\n * すべてのストレージの直前に挿入するミドルウェアの配列です。\n * 先頭ほど既存のパイプライン側、末尾ほどストレージ側に近づくように挿入されます。\n */\n readonly beforeStorage?: readonly IMiddleware[] | undefined;\n};\n\n/**\n * オブジェクト形式のスキーマ定義です。キーをそのままキーとして扱います。\n */\nexport type UniKvsSchemaRecord = Readonly<Record<string, Value>>;\n\n/**\n * 配列形式のスキーマ定義です。キーのスキーマと値のスキーマの組を並べます。\n */\nexport type UniKvsSchemaEntries = readonly (readonly [v.GenericSchema, Value])[];\n\n/**\n * `new Builder()` の `schema` オプションに指定できるスキーマ定義です。\n */\nexport type UniKvsSchema = UniKvsSchemaRecord | UniKvsSchemaEntries;\n\n/**\n * スキーマ定義からキーと値のマッピング型を推論します。\n *\n * @template TSchema 対象となるスキーマ定義の型です。\n */\nexport type $InferKeyValueMapping<TSchema extends UniKvsSchema> =\n TSchema extends readonly (readonly [v.GenericSchema, infer TValue extends Value])[]\n ? Readonly<Record<string, TValue>>\n : TSchema extends Readonly<Record<string, Value>>\n ? { readonly [TKey in keyof TSchema]: TSchema[TKey] }\n : never;\n\n/**\n * 値が Valibot のスキーマであるかどうかを判定します。\n */\nfunction isGenericSchema(input: unknown): input is v.GenericSchema {\n return (\n typeof input === \"object\" &&\n input !== null &&\n // GenericSchema は関数 \"~run\" を持ちます。\n \"~run\" in input &&\n typeof input[\"~run\"] === \"function\"\n );\n}\n\n/**\n * 値がスキーマ情報であるかどうかを判定します。\n */\nfunction isValueSchemaInfo(input: unknown): input is ValueSchemaInfo {\n return (\n typeof input === \"object\" &&\n input !== null &&\n VALUE_SCHEMA_BRAND in input &&\n input[VALUE_SCHEMA_BRAND] === true\n );\n}\n\nconst UniKvsBuilderOptionsSchema = v.object({\n /**\n * キーと値のスキーマ定義です。\n */\n schema: v.optional(\n v.union([\n v.array(\n v.tuple([\n v.custom<v.GenericSchema>(isGenericSchema),\n v.custom<ValueSchemaInfo>(isValueSchemaInfo),\n ]),\n ),\n v.record(v.string(), v.custom<ValueSchemaInfo>(isValueSchemaInfo)),\n ]),\n ),\n\n /**\n * 基本となる実行時変数です。\n */\n vars: v.optional(VariablesInitSchema),\n});\n\nconst UniKvsBuilderArgsSchema = v.tuple([v.optional(UniKvsBuilderOptionsSchema)]);\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#builder)\n */\nexport default class UniKvsBuilder<\n const TInit extends KeyValueMapping | UniKvsSchema = KeyValueMapping,\n TKeyValueMapping extends KeyValueMapping = $InferKeyValueMapping<TInit>,\n TUniKvsDataInput = ValueOf<{\n [TKey in KeyofKVMap<TKeyValueMapping>]: $InferPlainValueData<TKeyValueMapping[TKey]>;\n }>,\n TUniKvsDataOutput = TUniKvsDataInput,\n TUniKvsChunkInput = ValueOf<{\n [TKey in KeyofKVMap<TKeyValueMapping>]: $InferStreamValueChunkData<TKeyValueMapping[TKey]>;\n }>,\n TUniKvsChunkOutput = TUniKvsChunkInput,\n TLastMiddlewareDecodeDataInput = TUniKvsDataOutput,\n TLastMiddlewareEncodeDataOutput = TUniKvsDataInput,\n TLastMiddlewareDecodeChunkInput = TUniKvsChunkOutput,\n TLastMiddlewareEncodeChunkOutput = TUniKvsChunkInput,\n> implements IUniKvsBuilder<\n TKeyValueMapping,\n TUniKvsDataInput,\n TUniKvsDataOutput,\n TUniKvsChunkInput,\n TUniKvsChunkOutput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n> {\n /**\n * 登録済みストレージと各登録時点のパイプラインのスナップショットです。\n */\n readonly #destinations: {\n /**\n * データの永続化先です。\n */\n readonly storage: UniKvsStorage;\n\n /**\n * ストレージに対するパイプラインです。\n * 登録順に保持します。\n */\n readonly middlewares: readonly UniKvsMiddleware[];\n }[];\n\n /**\n * 現在のメインのパイプラインです。\n * 登録順に保持します。\n */\n readonly #middlewares: UniKvsMiddleware[];\n\n /**\n * 最後の `persist()` または `fork()` 以降に追加されたミドルウェアがあるかどうかです。\n * `build()` 時にストレージで終わっていないパイプラインを検出するために使用します。\n */\n #hasUnboundMiddlewares: boolean;\n\n /**\n * キーに対応する値のスキーマ情報を解決するリゾルバーです。\n */\n readonly #valueSchemaResolver: IValueSchemaResolver | null;\n\n /**\n * 基本となる実行時変数です。\n *\n * 各操作の `vars` と結合して使用されます。\n */\n readonly #vars: Map<string, unknown>;\n\n public constructor(options?: Omit<UniKvsBuilderOptions, \"schema\"> & { readonly schema?: TInit });\n public constructor(...args: unknown[]) {\n const [options = {}] = v.parseInput(UniKvsBuilderArgsSchema, args);\n const { vars, schema } = options;\n\n this.#destinations = [];\n this.#middlewares = [];\n this.#hasUnboundMiddlewares = false;\n this.#valueSchemaResolver = null;\n this.#vars = new Map(vars);\n if (schema) {\n this.#valueSchemaResolver = createValueSchemaResolver(schema);\n }\n }\n\n public fork<\n TBranchChunkInput,\n TBranchChunkOutput,\n TBranchHeadEncodeDataInput,\n TBranchHeadDecodeDataOutput,\n TBranchHeadEncodeChunkInput,\n TBranchHeadDecodeChunkOutput,\n TBranchLastDecodeDataInput,\n TBranchLastEncodeDataOutput,\n TBranchLastDecodeChunkInput,\n TBranchLastEncodeChunkOutput,\n TBranchHasPersist extends boolean,\n >(\n branch: IUniKvsBranch<\n any,\n TBranchChunkInput,\n TBranchChunkOutput,\n TBranchHeadEncodeDataInput,\n TBranchHeadDecodeDataOutput,\n TBranchHeadEncodeChunkInput,\n TBranchHeadDecodeChunkOutput,\n TBranchLastDecodeDataInput,\n TBranchLastEncodeDataOutput,\n TBranchLastDecodeChunkInput,\n TBranchLastEncodeChunkOutput,\n TBranchHasPersist\n > &\n (TBranchHasPersist extends true\n ? $CheckForkEncodeData<TLastMiddlewareEncodeDataOutput, TBranchHeadEncodeDataInput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkDecodeData<TLastMiddlewareDecodeDataInput, TBranchHeadDecodeDataOutput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkEncodeChunk<TLastMiddlewareEncodeChunkOutput, TBranchHeadEncodeChunkInput>\n : unknown) &\n (TBranchHasPersist extends true\n ? $CheckForkDecodeChunk<TLastMiddlewareDecodeChunkInput, TBranchHeadDecodeChunkOutput>\n : unknown),\n ): IUniKvsBuilder<\n TKeyValueMapping,\n TUniKvsDataInput,\n TUniKvsDataOutput,\n TBranchHasPersist extends true\n ? [TUniKvsChunkInput] extends [never]\n ? never\n : [TBranchChunkInput] extends [never]\n ? never\n : TUniKvsChunkInput\n : TUniKvsChunkInput,\n TBranchHasPersist extends true\n ? [TUniKvsChunkOutput] extends [never]\n ? never\n : [TBranchChunkOutput] extends [never]\n ? never\n : TUniKvsChunkOutput\n : TUniKvsChunkOutput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n >;\n public fork(branch: IUniKvsBranch): IUniKvsBuilder {\n appendForkDestinations(this.#destinations, this.#middlewares, branch);\n this.#hasUnboundMiddlewares = false;\n\n return this;\n }\n\n public use<\n TMiddleware extends IMiddleware<\n [TLastMiddlewareEncodeDataOutput] extends [never] ? any : TLastMiddlewareEncodeDataOutput,\n any,\n [TLastMiddlewareEncodeChunkOutput] extends [never] ? any : TLastMiddlewareEncodeChunkOutput\n >,\n >(\n middleware: TMiddleware,\n ): IUniKvsBuilder<\n TKeyValueMapping,\n TUniKvsDataInput,\n TUniKvsDataOutput,\n [TUniKvsChunkInput] extends [never]\n ? never\n : [$InferDecodeChunkInput<TMiddleware>] extends [never]\n ? never\n : TUniKvsChunkInput,\n [TUniKvsChunkOutput] extends [never]\n ? never\n : [$InferEncodeChunkOutput<TMiddleware>] extends [never]\n ? never\n : TUniKvsChunkOutput,\n $InferDecodeDataInput<TMiddleware>,\n $InferEncodeDataOutput<TMiddleware>,\n $InferDecodeChunkInput<TMiddleware>,\n $InferEncodeChunkOutput<TMiddleware>\n >;\n public use(middleware: IMiddleware): IUniKvsBuilder {\n this.#middlewares.push(UniKvsMiddleware.from(middleware));\n this.#hasUnboundMiddlewares = true;\n\n return this;\n }\n\n public persist<\n TStorage extends IStorage<\n [TLastMiddlewareEncodeDataOutput] extends [never] ? any : TLastMiddlewareEncodeDataOutput,\n [TLastMiddlewareDecodeDataInput] extends [never] ? any : TLastMiddlewareDecodeDataInput,\n [TLastMiddlewareEncodeChunkOutput] extends [never] ? any : TLastMiddlewareEncodeChunkOutput,\n [TLastMiddlewareDecodeChunkInput] extends [never] ? any : TLastMiddlewareDecodeChunkInput\n >,\n >(\n storage: TStorage,\n ): IUniKvsBuilderFinalizer<\n TKeyValueMapping,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeDataInput,\n [TLastMiddlewareEncodeChunkOutput] extends [never]\n ? never\n : [$InferWriteChunkInput<TStorage>] extends [never]\n ? never\n : TLastMiddlewareEncodeChunkOutput,\n [TLastMiddlewareDecodeChunkInput] extends [never]\n ? never\n : [$InferReadChunkOutput<TStorage>] extends [never]\n ? never\n : TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareDecodeDataInput,\n TLastMiddlewareEncodeDataOutput,\n TLastMiddlewareDecodeChunkInput,\n TLastMiddlewareEncodeChunkOutput\n >;\n public persist(storage: IStorage): IUniKvsBuilder {\n this.#destinations.push({\n storage: UniKvsStorage.from(storage),\n // 登録時点のチェーンをスナップショットして保持するため、以降の use はこの登録に影響しません。\n middlewares: [...this.#middlewares],\n });\n this.#hasUnboundMiddlewares = false;\n\n return this;\n }\n\n public setVars(vars: VariablesInit): this;\n public setVars(...args: unknown[]): this {\n const [vars] = v.parseInput(VariablesArgsSchema, args);\n\n this.#vars.clear();\n for (const [name, value] of vars) {\n this.#vars.set(name, value);\n }\n\n return this;\n }\n\n public assignVars(vars: VariablesInit): this;\n public assignVars(...args: unknown[]): this {\n const [vars] = v.parseInput(VariablesArgsSchema, args);\n\n const target = this.#vars;\n const source = vars;\n\n for (const [name, value] of source) {\n target.set(name, value);\n }\n\n return this;\n }\n\n public defaultsVars(vars: VariablesInit): this;\n public defaultsVars(...args: unknown[]): this {\n const [vars] = v.parseInput(VariablesArgsSchema, args);\n\n const target = new Map(vars);\n const source = this.#vars;\n\n for (const [name, value] of source) {\n target.set(name, value);\n }\n\n this.setVars(target);\n\n return this;\n }\n\n public isValid(): boolean {\n return this.#destinations.length > 0 && !this.#hasUnboundMiddlewares;\n }\n\n public build(options: UniKvsBuildOptions = {}): UniKvs<TKeyValueMapping> {\n // ストレージが空の場合は UniKvs として機能できないため、例外を投げます。\n if (this.#destinations.length === 0) {\n throw new MissingStorageError();\n }\n\n // 最後の persist()/fork() 以降に追加されたミドルウェアはどのストレージにも接続されないため、例外を投げます。\n if (this.#hasUnboundMiddlewares) {\n throw new UnterminatedPipelineError();\n }\n\n const beforeAll = options.beforeAll?.map((mw) => UniKvsMiddleware.from(mw)) ?? [];\n const beforeStorage = options.beforeStorage?.map((mw) => UniKvsMiddleware.from(mw)) ?? [];\n // ビルダーを再利用できるよう、挿入は build ごとの複製に対して行います。\n const destinations =\n beforeAll.length === 0 && beforeStorage.length === 0\n ? this.#destinations\n : this.#destinations.map((dest) => ({\n storage: dest.storage,\n middlewares: [...beforeAll, ...dest.middlewares, ...beforeStorage],\n }));\n\n return new UniKvs(\n [...this.#vars.entries()],\n // ビルダーを再利用できるよう、build のたびに trie をコンパイルします。コンパイル後の登録内容は変更しません。\n // 同じミドルウェアインスタンスに対するラッパーは共有します。\n PipelineGraph.compile(destinations),\n this.#valueSchemaResolver,\n );\n }\n}\n","import type * as v from \"./_valibot.js\";\nimport {\n type ValueSchemaInfo,\n type ValueSchemaKind,\n VALUE_SCHEMA_BRAND,\n} from \"./_value-schemas.js\";\n\n/**\n * スキーマ付きの値を表す内部オブジェクトです。\n */\ntype ValueSchemaDescriptor = ValueSchemaInfo & {\n readonly [VALUE_SCHEMA_BRAND]: true;\n};\n\n/**\n * スキーマ情報を内部オブジェクトとして生成します。\n */\nfunction createValueSchemaDescriptor(\n kind: ValueSchemaKind,\n schema: v.GenericSchema,\n): ValueSchemaDescriptor {\n return {\n [VALUE_SCHEMA_BRAND]: true,\n kind,\n schema,\n };\n}\n\n/**\n * プレーンな値を識別するための固有のシンボルです。\n */\ndeclare const PLAIN_VALUE: unique symbol;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport type PlainValue<TData = any, TInput = TData> = [\n Type: typeof PLAIN_VALUE,\n Data: TData,\n Input: TInput,\n];\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport function PlainValue<const TSchema extends v.GenericSchema>(\n schema: TSchema,\n): PlainValue<v.InferOutput<TSchema>, v.InferInput<TSchema>> {\n return createValueSchemaDescriptor(\"plain\", schema) as unknown as PlainValue<\n v.InferOutput<TSchema>,\n v.InferInput<TSchema>\n >;\n}\n\n/**\n * ストリーム形式の値を識別するための固有のシンボルです。\n */\ndeclare const STREAM_VALUE: unique symbol;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport type StreamValue<TChunkData = any, TChunkInput = TChunkData> = [\n Type: typeof STREAM_VALUE,\n ChunkData: TChunkData,\n ChunkInput: TChunkInput,\n];\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport function StreamValue<const TSchema extends v.GenericSchema>(\n schema: TSchema,\n): StreamValue<v.InferOutput<TSchema>, v.InferInput<TSchema>> {\n return createValueSchemaDescriptor(\"stream\", schema) as unknown as StreamValue<\n v.InferOutput<TSchema>,\n v.InferInput<TSchema>\n >;\n}\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport type Value<TDataAndChunkData = any, TInput = TDataAndChunkData> =\n | PlainValue<TDataAndChunkData, TInput>\n | StreamValue<TDataAndChunkData, TInput>;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/unikvs#value-types)\n */\nexport function Value<const TSchema extends v.GenericSchema>(\n schema: TSchema,\n): Value<v.InferOutput<TSchema>, v.InferInput<TSchema>> {\n return createValueSchemaDescriptor(\"any\", schema) as unknown as Value<\n v.InferOutput<TSchema>,\n v.InferInput<TSchema>\n >;\n}\n"],"mappings":"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"}
|