---
title: "@unikvs/writeonly"
description: "読み取りを拒否して書き込み専用にする @unikvs/writeonly の使い方を説明します。"
---

## 概要 [#overview]

`@unikvs/writeonly` Middleware は読み取りを拒否して書き込み専用にするミドルウェアです。

読み取り方向の操作 (`get`・`has`・`stream`・`decode`) は存在しないキーとして扱って拒否し、書き込み方向の操作 (`set`・`copy`・`move`) はそのまま透過させます。`allowDelete` が `false` のときは削除も拒否します。

- `name` は `WriteOnly` です。
- `isOpen` は常に `true` です。
- `allowDelete` の既定値は `false` です。

インストールは次のコマンドで行います。

```package-install
npm install @unikvs/writeonly
```

## 使い方 [#usage]

WriteOnly は IMiddleware を実装しています。UniKvs には use() で渡します。

```ts
import { WriteOnly } from "@unikvs/writeonly";
```

### `WriteOnly` [#writeonly]

読み取りを拒否して書き込み専用にするミドルウェアです。

コンストラクターの引数は次のとおりです。

| Prop | Type | Default | Description |
| - | - | - | - |
| `allowDelete?` | `[#writeonly-allow-delete] boolean` | `false` | 削除操作を許可するかどうかです。false のときは delete・clear を拒否します。 |

以下は、値を保存する例です。

```ts
import { Memory } from "@unikvs/memory";
import { WriteOnly } from "@unikvs/writeonly";
import * as unikvs from "unikvs";

const kvs = new unikvs.Builder<{
  foo: unikvs.Value<Uint8Array>;
}>()
  .use(new WriteOnly())
  .persist(new Memory())
  .build();

await kvs.open();
await kvs.set("foo", new Uint8Array([0, 1, 2]));
await kvs.close();
```

## データ型 [#data-types]

| メソッド       | 入力             | 出力                                   |
| -------------- | ---------------- | -------------------------------------- |
| `encode`       | 書き込み値       | 書き込み値（そのまま透過します）       |
| `decode`       | 読み取り値       | 常に `KeyNotFoundError` を投げます     |
| `getEncodable` | 書き込みチャンク | 書き込みチャンク（そのまま透過します） |
| `getDecodable` | 読み取りチャンク | 常に `KeyNotFoundError` を投げます     |

- 書き込み方向の変換は行わず、値をそのまま透過させます。
- `copy` と `move` は値を返さないため、書き込み方向の操作として許可します。
- 読み取り方向は常に拒否し、キーが存在しないものとして扱います。
- 削除の可否は `use()` で制御し、`allowDelete` が `false` のときは `delete`・`clear` を拒否します。

## エラー [#errors]

このパッケージが投げるエラーは次のとおりです。

### WriteOnlyDeleteNotAllowedError [#error-write-only-delete-not-allowed]

#### 意味

`allowDelete` が `false` のときに `delete` が呼ばれると、このエラーが投げられます。

#### 対処方法

削除が必要なときは `allowDelete: true` を指定してください。

### WriteOnlyClearNotAllowedError [#error-write-only-clear-not-allowed]

#### 意味

`allowDelete` が `false` のときに `clear` が呼ばれると、このエラーが投げられます。

#### 対処方法

全件削除が必要なときは `allowDelete: true` を指定してください。

### KeyNotFoundError [#error-key-not-found]

#### 意味

読み取り方向の操作 (`get`・`has`・`stream`・`decode`) が呼ばれたときに、このエラーが投げられます。`@unikvs/core` の共通エラーです。

#### 対処方法

読み取りが必要なときはこのミドルウェアを使わないでください。

#### 例

以下は、`KeyNotFoundError` を捕捉する例です。

```ts
import { KeyNotFoundError } from "@unikvs/writeonly";

try {
  const data = await kvs.get("foo");
} catch (ex) {
  if (ex instanceof KeyNotFoundError) {
    console.log("読み取りは許可されていません");
  } else {
    throw ex;
  }
}
```
