@unikvs/memory 0.0.10 → 0.0.12

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/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @unikvs/memory
2
+
3
+ [Documentation](https://tai-kun.github.io/unikvs/packages/memory)
@@ -1,62 +1,53 @@
1
1
  import { ErrorBase, type ErrorOptions } from "@unikvs/core";
2
2
  /**
3
- * 指定されたキーがストレージ内に存在しないことを示すエラーメタデータ型です。
3
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
4
4
  */
5
5
  export type KeyNotFoundErrorMeta = {
6
6
  /**
7
- * 存在しなかったキーです。
7
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
8
8
  */
9
9
  readonly key: string;
10
10
  };
11
11
  /**
12
- * {@link KeyNotFoundError} のコンストラクター引数型です。
13
- *
14
- * エラーの追加情報 (`cause`) も含みます。
12
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
15
13
  */
16
14
  export type KeyNotFoundErrorArgs = ErrorOptions & KeyNotFoundErrorMeta;
17
15
  /**
18
- * 読み取りまたは削除を実行しようとしたキーがストレージ内に存在しない場合に投げられるエラーです。
16
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
19
17
  */
20
18
  export declare class KeyNotFoundError extends ErrorBase<KeyNotFoundErrorMeta> {
21
19
  /**
22
- * KeyNotFoundError インスタンスを初期化します。
23
- *
24
- * @param args エラーメタデータとエラーの追加情報です。
20
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
25
21
  */
26
22
  constructor(args: KeyNotFoundErrorArgs);
27
23
  }
28
24
  /**
29
- * ストリーム書き込み時に無効なチャンク型が渡されたことを示すエラーメタデータ型です。
25
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
30
26
  */
31
27
  export type InvalidChunkTypeErrorMeta = {
32
28
  /**
33
- * 書き込み先または読み取り元のキーです。
29
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
34
30
  */
35
31
  readonly key: string;
36
32
  /**
37
- * 型が無効だったチャンクの値です。
33
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
38
34
  */
39
35
  readonly chunk: unknown;
40
36
  /**
41
- * 実際に渡されたチャンク値の型名です。
37
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
42
38
  */
43
39
  readonly chunkType: string;
44
40
  };
45
41
  /**
46
- * {@link InvalidChunkTypeError} のコンストラクター引数型です。
47
- *
48
- * `chunkType` はコンストラクター内部で自動的に設定されるため、引数からは除外されています。
49
- * また、エラーの追加情報 (`cause`) も含みます。
42
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
50
43
  */
51
44
  export type InvalidChunkTypeErrorArgs = ErrorOptions & Omit<InvalidChunkTypeErrorMeta, "chunkType">;
52
45
  /**
53
- * `getWritable` が返すストリームに `Uint8Array<ArrayBuffer>` 以外の値が書き込まれた場合に投げられるエラーです。
46
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
54
47
  */
55
48
  export declare class InvalidChunkTypeError extends ErrorBase<InvalidChunkTypeErrorMeta> {
56
49
  /**
57
- * InvalidChunkTypeError インスタンスを初期化します。
58
- *
59
- * @param args エラーメタデータとエラーの追加情報です。
50
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
60
51
  */
61
52
  constructor(args: InvalidChunkTypeErrorArgs);
62
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAmB,MAAM,cAAc,CAAC;AAG7E;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,oBAAoB,CAAC;AAEvE;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,SAAS,CAAC,oBAAoB,CAAC;IAKnE;;;;OAIG;IACH,YAAmB,IAAI,EAAE,oBAAoB,EAI5C;CACF;AAID;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,yBAAyB,GAAG,YAAY,GAAG,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,CAAC;AAEpG;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,SAAS,CAAC,yBAAyB,CAAC;IAK7E;;;;OAIG;IACH,YAAmB,IAAI,EAAE,yBAAyB,EASjD;CACF"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAmB,MAAM,cAAc,CAAC;AAG7E;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,oBAAoB,CAAC;AAEvE;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,SAAS,CAAC,oBAAoB,CAAC;IAKnE;;OAEG;IACH,YAAmB,IAAI,EAAE,oBAAoB,EAI5C;CACF;AAID;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,YAAY,GAAG,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,CAAC;AAEpG;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,SAAS,CAAC,yBAAyB,CAAC;IAK7E;;OAEG;IACH,YAAmB,IAAI,EAAE,yBAAyB,EASjD;CACF"}
@@ -2,13 +2,11 @@ var _a, _b;
2
2
  import { ErrorBase, setErrorMessage } from "@unikvs/core";
3
3
  import getTypeName from "type-name";
4
4
  /**
5
- * 読み取りまたは削除を実行しようとしたキーがストレージ内に存在しない場合に投げられるエラーです。
5
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
6
6
  */
7
7
  export class KeyNotFoundError extends ErrorBase {
8
8
  /**
9
- * KeyNotFoundError インスタンスを初期化します。
10
- *
11
- * @param args エラーメタデータとエラーの追加情報です。
9
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
12
10
  */
13
11
  constructor(args) {
14
12
  const { key, ...options } = args;
@@ -22,13 +20,11 @@ _a = KeyNotFoundError;
22
20
  })();
23
21
  setErrorMessage(KeyNotFoundError, ({ key }) => `キー ${key} が見つかりません`, "ja");
24
22
  /**
25
- * `getWritable` が返すストリームに `Uint8Array<ArrayBuffer>` 以外の値が書き込まれた場合に投げられるエラーです。
23
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
26
24
  */
27
25
  export class InvalidChunkTypeError extends ErrorBase {
28
26
  /**
29
- * InvalidChunkTypeError インスタンスを初期化します。
30
- *
31
- * @param args エラーメタデータとエラーの追加情報です。
27
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
32
28
  */
33
29
  constructor(args) {
34
30
  const { key, chunk, ...options } = args;
@@ -1,9 +1,15 @@
1
1
  import type { IStorage } from "@unikvs/core";
2
2
  /**
3
- * メモリーを永続化先として使用するストレージクラスです。
4
- *
5
- * アプリケーションの実行中のみデータを保持し、プロセス終了時に破棄されます。
6
- * 全ての操作が同期で完了するため、非同期処理のオーバーヘッドがありません。
3
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
4
+ */
5
+ export type MemoryOptions = {
6
+ /**
7
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
8
+ */
9
+ readonly clone?: (<T>(value: T) => T) | undefined;
10
+ };
11
+ /**
12
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
7
13
  */
8
14
  export default class Memory implements IStorage {
9
15
  /**
@@ -11,69 +17,47 @@ export default class Memory implements IStorage {
11
17
  */
12
18
  private readonly map;
13
19
  /**
14
- * ストレージの名前です。デバッグやエラーメッセージなどに使用されます。
20
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
15
21
  */
16
22
  readonly name: string;
17
23
  /**
18
- * Memory インスタンスを初期化します。
19
- *
20
- * 内部のマップを初期化し、常にオープン状態として動作します。
24
+ * データの複製に使用する関数です。
25
+ */
26
+ private readonly clone;
27
+ /**
28
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
21
29
  */
22
- constructor();
30
+ constructor(options?: MemoryOptions);
23
31
  /**
24
- * メモリーストレージは常に利用可能なため、常に `true` を返します。
32
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
25
33
  */
26
34
  get isOpen(): boolean;
27
35
  /**
28
- * 指定されたデータを、対応するキーでストレージに保存します。
29
- *
30
- * @param args.key 保存先のキーです。
31
- * @param args.data 保存するデータです。
36
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
32
37
  */
33
38
  write(args: Pick<IStorage.WriteArgs<any>, "key" | "data">): void;
34
39
  /**
35
- * 指定されたキーに対応するデータをストレージから取得します。
36
- *
37
- * @param args.key 取得元のキーです。
38
- * @returns キーに対応するデータです。
39
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
40
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
40
41
  */
41
42
  read(args: Pick<IStorage.ReadArgs, "key">): any;
42
43
  /**
43
- * 指定されたキーに対応するデータがストレージ内に存在するかを確認します。
44
- *
45
- * @param args.key 確認するキーです。
46
- * @returns キーに対応するデータが存在する場合は true、それ以外は false です。
44
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
47
45
  */
48
46
  exists(args: Pick<IStorage.ExistsArgs, "key">): boolean;
49
47
  /**
50
- * 指定されたキーに対応するデータをストレージから削除します。
51
- *
52
- * @param args.key 削除するキーです。
53
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
48
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
54
49
  */
55
50
  delete(args: Pick<IStorage.DeleteArgs, "key">): void;
56
51
  /**
57
- * ストレージ内のすべてのデータを完全に消去します。
52
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
58
53
  */
59
54
  clear(): void;
60
55
  /**
61
- * 指定されたキーに対応する書き込み可能なストリームを取得します。
62
- *
63
- * メモリーストレージにはネイティブなストリームがないため、書き込まれたチャンクをメモリー上に保持し、ストリームがクローズされたときに結合して保存します。
64
- *
65
- * @param args.key 書き込み先のキーです。
66
- * @returns 書き込み可能なストリームです。
56
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#data)
67
57
  */
68
58
  getWritable(args: Pick<IStorage.GetWritableArgs, "key">): WritableStream<Uint8Array<ArrayBuffer>>;
69
59
  /**
70
- * 指定されたキーに対応する読み取り可能なストリームを取得します。
71
- *
72
- * メモリーストレージにはネイティブなストリームがないため、既存の値を単一チャンクとしてストリームで送出します。
73
- *
74
- * @param args.key 読み取り元のキーです。
75
- * @returns 読み取り可能なストリームです。
76
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
60
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#data)
77
61
  */
78
62
  getReadable(args: Pick<IStorage.GetReadableArgs, "key">): ReadableStream<Uint8Array<ArrayBuffer>>;
79
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAI7C;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,MAAO,YAAW,QAAQ;IAC7C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;IAEvC;;OAEG;IACH,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B;;;;OAIG;IACH,cAGC;IAED;;OAEG;IACH,IAAW,MAAM,IAAI,OAAO,CAE3B;IAED;;;;;OAKG;IACI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,CAGtE;IAED;;;;;;OAMG;IACI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,GAAG,CASrD;IAED;;;;;OAKG;IACI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,OAAO,CAK7D;IAED;;;;;OAKG;IACI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,IAAI,CAO1D;IAED;;OAEG;IACI,KAAK,IAAI,IAAI,CAEnB;IAED;;;;;;;OAOG;IACI,WAAW,CAChB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC,GAC1C,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CA2BzC;IAED;;;;;;;;OAQG;IACI,WAAW,CAChB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC,GAC1C,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAoBzC;CACF"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAI7C;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC;CACnD,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,MAAO,YAAW,QAAQ;IAC7C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;IAEvC;;OAEG;IACH,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAE3C;;OAEG;IACH,YAAmB,OAAO,GAAE,aAAkB,EAI7C;IAED;;OAEG;IACH,IAAW,MAAM,IAAI,OAAO,CAE3B;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,CAGtE;IAED;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,GAAG,CASrD;IAED;;OAEG;IACI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,OAAO,CAK7D;IAED;;OAEG;IACI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,IAAI,CAO1D;IAED;;OAEG;IACI,KAAK,IAAI,IAAI,CAEnB;IAED;;OAEG;IACI,WAAW,CAChB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC,GAC1C,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CA2BzC;IAED;;OAEG;IACI,WAAW,CAChB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC,GAC1C,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAoBzC;CACF"}
@@ -1,42 +1,31 @@
1
1
  import { KeyNotFoundError, InvalidChunkTypeError } from "./errors.js";
2
2
  /**
3
- * メモリーを永続化先として使用するストレージクラスです。
4
- *
5
- * アプリケーションの実行中のみデータを保持し、プロセス終了時に破棄されます。
6
- * 全ての操作が同期で完了するため、非同期処理のオーバーヘッドがありません。
3
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
7
4
  */
8
5
  export default class Memory {
9
6
  /**
10
- * Memory インスタンスを初期化します。
11
- *
12
- * 内部のマップを初期化し、常にオープン状態として動作します。
7
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
13
8
  */
14
- constructor() {
9
+ constructor(options = {}) {
15
10
  this.name = "Memory";
16
11
  this.map = new Map();
12
+ this.clone = options.clone ?? ((v) => structuredClone(v));
17
13
  }
18
14
  /**
19
- * メモリーストレージは常に利用可能なため、常に `true` を返します。
15
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
20
16
  */
21
17
  get isOpen() {
22
18
  return true;
23
19
  }
24
20
  /**
25
- * 指定されたデータを、対応するキーでストレージに保存します。
26
- *
27
- * @param args.key 保存先のキーです。
28
- * @param args.data 保存するデータです。
21
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
29
22
  */
30
23
  write(args) {
31
24
  const { key, data } = args;
32
- this.map.set(key, data);
25
+ this.map.set(key, this.clone(data));
33
26
  }
34
27
  /**
35
- * 指定されたキーに対応するデータをストレージから取得します。
36
- *
37
- * @param args.key 取得元のキーです。
38
- * @returns キーに対応するデータです。
39
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
28
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
40
29
  */
41
30
  read(args) {
42
31
  const { key } = args;
@@ -44,13 +33,10 @@ export default class Memory {
44
33
  throw new KeyNotFoundError({ key });
45
34
  }
46
35
  const value = this.map.get(key);
47
- return value;
36
+ return this.clone(value);
48
37
  }
49
38
  /**
50
- * 指定されたキーに対応するデータがストレージ内に存在するかを確認します。
51
- *
52
- * @param args.key 確認するキーです。
53
- * @returns キーに対応するデータが存在する場合は true、それ以外は false です。
39
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
54
40
  */
55
41
  exists(args) {
56
42
  const { key } = args;
@@ -58,10 +44,7 @@ export default class Memory {
58
44
  return exists;
59
45
  }
60
46
  /**
61
- * 指定されたキーに対応するデータをストレージから削除します。
62
- *
63
- * @param args.key 削除するキーです。
64
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
47
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
65
48
  */
66
49
  delete(args) {
67
50
  const { key } = args;
@@ -71,18 +54,13 @@ export default class Memory {
71
54
  this.map.delete(key);
72
55
  }
73
56
  /**
74
- * ストレージ内のすべてのデータを完全に消去します。
57
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
75
58
  */
76
59
  clear() {
77
60
  this.map.clear();
78
61
  }
79
62
  /**
80
- * 指定されたキーに対応する書き込み可能なストリームを取得します。
81
- *
82
- * メモリーストレージにはネイティブなストリームがないため、書き込まれたチャンクをメモリー上に保持し、ストリームがクローズされたときに結合して保存します。
83
- *
84
- * @param args.key 書き込み先のキーです。
85
- * @returns 書き込み可能なストリームです。
63
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#data)
86
64
  */
87
65
  getWritable(args) {
88
66
  const { key } = args;
@@ -93,7 +71,7 @@ export default class Memory {
93
71
  if (!(chunk instanceof Uint8Array)) {
94
72
  throw new InvalidChunkTypeError({ key, chunk });
95
73
  }
96
- chunks.push(chunk);
74
+ chunks.push(this.clone(chunk));
97
75
  },
98
76
  close: () => {
99
77
  const totalLength = chunks.reduce((sum, c) => sum + c.byteLength, 0);
@@ -109,13 +87,7 @@ export default class Memory {
109
87
  return stream;
110
88
  }
111
89
  /**
112
- * 指定されたキーに対応する読み取り可能なストリームを取得します。
113
- *
114
- * メモリーストレージにはネイティブなストリームがないため、既存の値を単一チャンクとしてストリームで送出します。
115
- *
116
- * @param args.key 読み取り元のキーです。
117
- * @returns 読み取り可能なストリームです。
118
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
90
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#data)
119
91
  */
120
92
  getReadable(args) {
121
93
  const { key } = args;
@@ -129,7 +101,7 @@ export default class Memory {
129
101
  if (!(value instanceof Uint8Array)) {
130
102
  throw new InvalidChunkTypeError({ key, chunk: value });
131
103
  }
132
- controller.enqueue(value);
104
+ controller.enqueue(this.clone(value));
133
105
  controller.close();
134
106
  },
135
107
  });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@unikvs/memory",
3
- "version": "0.0.10",
4
- "description": "",
3
+ "version": "0.0.12",
4
+ "description": "Storage plugin that stores arbitrary data in memory.",
5
5
  "homepage": "https://github.com/tai-kun/unikvs",
6
6
  "license": "MIT",
7
7
  "author": "tai-kun",
@@ -12,6 +12,7 @@
12
12
  "dist",
13
13
  "src",
14
14
  "package.json",
15
+ "README.md",
15
16
  "LICENSE"
16
17
  ],
17
18
  "type": "module",
@@ -25,20 +26,20 @@
25
26
  }
26
27
  },
27
28
  "dependencies": {
28
- "@unikvs/core": "0.0.10",
29
+ "@unikvs/core": "0.0.12",
29
30
  "type-name": "2.0.2"
30
31
  },
31
32
  "devDependencies": {
32
33
  "@tsconfig/node24": "24.0.5",
33
34
  "@tsconfig/strictest": "2.0.8",
34
- "@types/node": "24.13.3",
35
+ "@types/node": "24.13.6",
35
36
  "@types/type-name": "1.0.32",
36
- "@vitest/browser": "4.1.10",
37
- "@vitest/browser-playwright": "4.1.10",
37
+ "@vitest/browser": "4.1.11",
38
+ "@vitest/browser-playwright": "4.1.11",
38
39
  "npm-check-updates": "20.0.2",
39
- "playwright": "1.62.1",
40
- "vite": "8.2.1",
41
- "vitest": "4.1.10"
40
+ "playwright": "1.63.0",
41
+ "vite": "8.3.0",
42
+ "vitest": "4.1.11"
42
43
  },
43
44
  "peerDependencies": {
44
45
  "@logtape/logtape": "2.0.0"
package/src/errors.ts CHANGED
@@ -2,24 +2,22 @@ import { ErrorBase, type ErrorOptions, setErrorMessage } from "@unikvs/core";
2
2
  import getTypeName from "type-name";
3
3
 
4
4
  /**
5
- * 指定されたキーがストレージ内に存在しないことを示すエラーメタデータ型です。
5
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
6
6
  */
7
7
  export type KeyNotFoundErrorMeta = {
8
8
  /**
9
- * 存在しなかったキーです。
9
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
10
10
  */
11
11
  readonly key: string;
12
12
  };
13
13
 
14
14
  /**
15
- * {@link KeyNotFoundError} のコンストラクター引数型です。
16
- *
17
- * エラーの追加情報 (`cause`) も含みます。
15
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
18
16
  */
19
17
  export type KeyNotFoundErrorArgs = ErrorOptions & KeyNotFoundErrorMeta;
20
18
 
21
19
  /**
22
- * 読み取りまたは削除を実行しようとしたキーがストレージ内に存在しない場合に投げられるエラーです。
20
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
23
21
  */
24
22
  export class KeyNotFoundError extends ErrorBase<KeyNotFoundErrorMeta> {
25
23
  static {
@@ -27,9 +25,7 @@ export class KeyNotFoundError extends ErrorBase<KeyNotFoundErrorMeta> {
27
25
  }
28
26
 
29
27
  /**
30
- * KeyNotFoundError インスタンスを初期化します。
31
- *
32
- * @param args エラーメタデータとエラーの追加情報です。
28
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
33
29
  */
34
30
  public constructor(args: KeyNotFoundErrorArgs) {
35
31
  const { key, ...options } = args;
@@ -41,35 +37,32 @@ export class KeyNotFoundError extends ErrorBase<KeyNotFoundErrorMeta> {
41
37
  setErrorMessage(KeyNotFoundError, ({ key }) => `キー ${key} が見つかりません`, "ja");
42
38
 
43
39
  /**
44
- * ストリーム書き込み時に無効なチャンク型が渡されたことを示すエラーメタデータ型です。
40
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
45
41
  */
46
42
  export type InvalidChunkTypeErrorMeta = {
47
43
  /**
48
- * 書き込み先または読み取り元のキーです。
44
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
49
45
  */
50
46
  readonly key: string;
51
47
 
52
48
  /**
53
- * 型が無効だったチャンクの値です。
49
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
54
50
  */
55
51
  readonly chunk: unknown;
56
52
 
57
53
  /**
58
- * 実際に渡されたチャンク値の型名です。
54
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
59
55
  */
60
56
  readonly chunkType: string;
61
57
  };
62
58
 
63
59
  /**
64
- * {@link InvalidChunkTypeError} のコンストラクター引数型です。
65
- *
66
- * `chunkType` はコンストラクター内部で自動的に設定されるため、引数からは除外されています。
67
- * また、エラーの追加情報 (`cause`) も含みます。
60
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
68
61
  */
69
62
  export type InvalidChunkTypeErrorArgs = ErrorOptions & Omit<InvalidChunkTypeErrorMeta, "chunkType">;
70
63
 
71
64
  /**
72
- * `getWritable` が返すストリームに `Uint8Array<ArrayBuffer>` 以外の値が書き込まれた場合に投げられるエラーです。
65
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
73
66
  */
74
67
  export class InvalidChunkTypeError extends ErrorBase<InvalidChunkTypeErrorMeta> {
75
68
  static {
@@ -77,9 +70,7 @@ export class InvalidChunkTypeError extends ErrorBase<InvalidChunkTypeErrorMeta>
77
70
  }
78
71
 
79
72
  /**
80
- * InvalidChunkTypeError インスタンスを初期化します。
81
- *
82
- * @param args エラーメタデータとエラーの追加情報です。
73
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#errors)
83
74
  */
84
75
  public constructor(args: InvalidChunkTypeErrorArgs) {
85
76
  const { key, chunk, ...options } = args;
package/src/memory.ts CHANGED
@@ -3,10 +3,17 @@ import type { IStorage } from "@unikvs/core";
3
3
  import { KeyNotFoundError, InvalidChunkTypeError } from "./errors.js";
4
4
 
5
5
  /**
6
- * メモリーを永続化先として使用するストレージクラスです。
7
- *
8
- * アプリケーションの実行中のみデータを保持し、プロセス終了時に破棄されます。
9
- * 全ての操作が同期で完了するため、非同期処理のオーバーヘッドがありません。
6
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
7
+ */
8
+ export type MemoryOptions = {
9
+ /**
10
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
11
+ */
12
+ readonly clone?: (<T>(value: T) => T) | undefined;
13
+ };
14
+
15
+ /**
16
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
10
17
  */
11
18
  export default class Memory implements IStorage {
12
19
  /**
@@ -15,44 +22,41 @@ export default class Memory implements IStorage {
15
22
  private readonly map: Map<string, any>;
16
23
 
17
24
  /**
18
- * ストレージの名前です。デバッグやエラーメッセージなどに使用されます。
25
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
19
26
  */
20
27
  public readonly name: string;
21
28
 
22
29
  /**
23
- * Memory インスタンスを初期化します。
24
- *
25
- * 内部のマップを初期化し、常にオープン状態として動作します。
30
+ * データの複製に使用する関数です。
31
+ */
32
+ private readonly clone: <T>(value: T) => T;
33
+
34
+ /**
35
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
26
36
  */
27
- public constructor() {
37
+ public constructor(options: MemoryOptions = {}) {
28
38
  this.name = "Memory";
29
39
  this.map = new Map();
40
+ this.clone = options.clone ?? ((v) => structuredClone(v));
30
41
  }
31
42
 
32
43
  /**
33
- * メモリーストレージは常に利用可能なため、常に `true` を返します。
44
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
34
45
  */
35
46
  public get isOpen(): boolean {
36
47
  return true;
37
48
  }
38
49
 
39
50
  /**
40
- * 指定されたデータを、対応するキーでストレージに保存します。
41
- *
42
- * @param args.key 保存先のキーです。
43
- * @param args.data 保存するデータです。
51
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
44
52
  */
45
53
  public write(args: Pick<IStorage.WriteArgs<any>, "key" | "data">): void {
46
54
  const { key, data } = args;
47
- this.map.set(key, data);
55
+ this.map.set(key, this.clone(data));
48
56
  }
49
57
 
50
58
  /**
51
- * 指定されたキーに対応するデータをストレージから取得します。
52
- *
53
- * @param args.key 取得元のキーです。
54
- * @returns キーに対応するデータです。
55
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
59
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
56
60
  */
57
61
  public read(args: Pick<IStorage.ReadArgs, "key">): any {
58
62
  const { key } = args;
@@ -62,14 +66,11 @@ export default class Memory implements IStorage {
62
66
 
63
67
  const value = this.map.get(key);
64
68
 
65
- return value;
69
+ return this.clone(value);
66
70
  }
67
71
 
68
72
  /**
69
- * 指定されたキーに対応するデータがストレージ内に存在するかを確認します。
70
- *
71
- * @param args.key 確認するキーです。
72
- * @returns キーに対応するデータが存在する場合は true、それ以外は false です。
73
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
73
74
  */
74
75
  public exists(args: Pick<IStorage.ExistsArgs, "key">): boolean {
75
76
  const { key } = args;
@@ -79,10 +80,7 @@ export default class Memory implements IStorage {
79
80
  }
80
81
 
81
82
  /**
82
- * 指定されたキーに対応するデータをストレージから削除します。
83
- *
84
- * @param args.key 削除するキーです。
85
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
83
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
86
84
  */
87
85
  public delete(args: Pick<IStorage.DeleteArgs, "key">): void {
88
86
  const { key } = args;
@@ -94,19 +92,14 @@ export default class Memory implements IStorage {
94
92
  }
95
93
 
96
94
  /**
97
- * ストレージ内のすべてのデータを完全に消去します。
95
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
98
96
  */
99
97
  public clear(): void {
100
98
  this.map.clear();
101
99
  }
102
100
 
103
101
  /**
104
- * 指定されたキーに対応する書き込み可能なストリームを取得します。
105
- *
106
- * メモリーストレージにはネイティブなストリームがないため、書き込まれたチャンクをメモリー上に保持し、ストリームがクローズされたときに結合して保存します。
107
- *
108
- * @param args.key 書き込み先のキーです。
109
- * @returns 書き込み可能なストリームです。
102
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#data)
110
103
  */
111
104
  public getWritable(
112
105
  args: Pick<IStorage.GetWritableArgs, "key">,
@@ -120,7 +113,7 @@ export default class Memory implements IStorage {
120
113
  throw new InvalidChunkTypeError({ key, chunk });
121
114
  }
122
115
 
123
- chunks.push(chunk);
116
+ chunks.push(this.clone(chunk));
124
117
  },
125
118
  close: () => {
126
119
  const totalLength = chunks.reduce((sum, c) => sum + c.byteLength, 0);
@@ -140,13 +133,7 @@ export default class Memory implements IStorage {
140
133
  }
141
134
 
142
135
  /**
143
- * 指定されたキーに対応する読み取り可能なストリームを取得します。
144
- *
145
- * メモリーストレージにはネイティブなストリームがないため、既存の値を単一チャンクとしてストリームで送出します。
146
- *
147
- * @param args.key 読み取り元のキーです。
148
- * @returns 読み取り可能なストリームです。
149
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
136
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#data)
150
137
  */
151
138
  public getReadable(
152
139
  args: Pick<IStorage.GetReadableArgs, "key">,
@@ -164,7 +151,7 @@ export default class Memory implements IStorage {
164
151
  throw new InvalidChunkTypeError({ key, chunk: value });
165
152
  }
166
153
 
167
- controller.enqueue(value as Uint8Array<ArrayBuffer>);
154
+ controller.enqueue(this.clone(value) as Uint8Array<ArrayBuffer>);
168
155
  controller.close();
169
156
  },
170
157
  });