@unikvs/memory 0.0.10 → 0.0.13

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
+ [Document](https://tai-kun.github.io/unikvs/)
@@ -0,0 +1,65 @@
1
+ import { ErrorBase, ErrorOptions, IStorage, KeyNotFoundError, KeyNotFoundErrorArgs, KeyNotFoundErrorMeta } from "@unikvs/core";
2
+ //#region ../src/errors.d.ts
3
+ /**
4
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)
5
+ */
6
+ type InvalidChunkTypeErrorMeta = {
7
+ /**
8
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-key)
9
+ */
10
+ readonly key: string;
11
+ /**
12
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-chunk)
13
+ */
14
+ readonly chunk: unknown;
15
+ /**
16
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-chunk-type)
17
+ */
18
+ readonly chunkType: string;
19
+ };
20
+ /**
21
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)
22
+ */
23
+ type InvalidChunkTypeErrorArgs = ErrorOptions & Omit<InvalidChunkTypeErrorMeta, "chunkType">;
24
+ /**
25
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)
26
+ */
27
+ export declare class InvalidChunkTypeError extends ErrorBase<InvalidChunkTypeErrorMeta> {
28
+ /**
29
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)
30
+ */
31
+ constructor(args: InvalidChunkTypeErrorArgs);
32
+ }
33
+ //#endregion
34
+ //#region ../src/memory.d.ts
35
+ /**
36
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
37
+ */
38
+ type MemoryOptions = {
39
+ /**
40
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#clone)
41
+ */
42
+ readonly clone?: (<T>(value: T) => T) | undefined;
43
+ };
44
+ /**
45
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
46
+ */
47
+ declare class Memory implements IStorage {
48
+ #private;
49
+ readonly name: string;
50
+ /**
51
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
52
+ */
53
+ constructor(options?: MemoryOptions);
54
+ get isOpen(): boolean;
55
+ write(c: IStorage.WriteContext, data: any): void;
56
+ read(c: IStorage.ReadContext): any;
57
+ exists(c: IStorage.ExistsContext): boolean;
58
+ delete(c: IStorage.DeleteContext): void;
59
+ clear(_c: IStorage.ClearContext): void;
60
+ getWritable(c: IStorage.GetWritableContext): WritableStream<Uint8Array<ArrayBuffer>>;
61
+ getReadable(c: IStorage.GetReadableContext): ReadableStream<Uint8Array<ArrayBuffer>>;
62
+ }
63
+ //#endregion
64
+ export { type InvalidChunkTypeErrorArgs, type InvalidChunkTypeErrorMeta, KeyNotFoundError, type KeyNotFoundErrorArgs, type KeyNotFoundErrorMeta, Memory, type MemoryOptions };
65
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/errors.ts","../src/memory.ts"],"mappings":";;;;;KASY;;;;WAID;;;;WAKA;;;;WAKA;;;;;KAMC,4BAA4B,eAAe,KAAK;;;;qBAK/C,8BAA8B,UAAU;;;;EAQnD,YAAmB,MAAM;;;;;;;KCnCf;;;;WAID,UAAU,GAAG,OAAO,MAAM;;;;;cAMhB,kBAAkB;;WAMrB;;;;EAUhB,YAAmB,UAAS;MAQjB;EAIX,MAAa,GAAG,SAAS,cAAc;EAIvC,KAAY,GAAG,SAAS;EAUxB,OAAc,GAAG,SAAS;EAM1B,OAAc,GAAG,SAAS;EAQ1B,MAAa,IAAI,SAAS;EAI1B,YAAmB,GAAG,SAAS,qBAAqB,eAAe,WAAW;EAgC9E,YAAmB,GAAG,SAAS,qBAAqB,eAAe,WAAW"}
package/dist/index.js ADDED
@@ -0,0 +1,129 @@
1
+ import { ErrorBase, KeyNotFoundError, KeyNotFoundError as KeyNotFoundError$1, setErrorMessage } from "@unikvs/core";
2
+ import getTypeName from "type-name";
3
+ //#region ../src/errors.ts
4
+ var _InvalidChunkTypeError;
5
+ /**
6
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)
7
+ */
8
+ var InvalidChunkTypeError = class extends ErrorBase {
9
+ /**
10
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)
11
+ */
12
+ constructor(args) {
13
+ const { key, chunk, ...options } = args;
14
+ const meta = {
15
+ key,
16
+ chunk,
17
+ chunkType: getTypeName(chunk)
18
+ };
19
+ super(meta, ({ key: messageKey, chunkType }) => `Expected chunk for key ${JSON.stringify(messageKey)} is Uint8Array<ArrayBuffer>, but got ${chunkType}`, options);
20
+ }
21
+ };
22
+ _InvalidChunkTypeError = InvalidChunkTypeError;
23
+ _InvalidChunkTypeError.prototype.name = "MemoryInvalidChunkTypeError";
24
+ setErrorMessage(InvalidChunkTypeError, ({ key: messageKey, chunkType }) => `キー ${JSON.stringify(messageKey)} のチャンク型に Uint8Array<ArrayBuffer> を期待しましたが、${chunkType} を得ました`, "ja");
25
+ //#endregion
26
+ //#region \0@oxc-project+runtime@0.154.0/helpers/esm/checkPrivateRedeclaration.js
27
+ function _checkPrivateRedeclaration(e, t) {
28
+ if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object");
29
+ }
30
+ //#endregion
31
+ //#region \0@oxc-project+runtime@0.154.0/helpers/esm/classPrivateFieldInitSpec.js
32
+ function _classPrivateFieldInitSpec(e, t, a) {
33
+ _checkPrivateRedeclaration(e, t), t.set(e, a);
34
+ }
35
+ //#endregion
36
+ //#region \0@oxc-project+runtime@0.154.0/helpers/esm/assertClassBrand.js
37
+ function _assertClassBrand(e, t, n) {
38
+ if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n;
39
+ throw new TypeError("Private element is not present on this object");
40
+ }
41
+ //#endregion
42
+ //#region \0@oxc-project+runtime@0.154.0/helpers/esm/classPrivateFieldSet2.js
43
+ function _classPrivateFieldSet2(s, a, r) {
44
+ return s.set(_assertClassBrand(s, a), r), r;
45
+ }
46
+ //#endregion
47
+ //#region \0@oxc-project+runtime@0.154.0/helpers/esm/classPrivateFieldGet2.js
48
+ function _classPrivateFieldGet2(s, a) {
49
+ return s.get(_assertClassBrand(s, a));
50
+ }
51
+ //#endregion
52
+ //#region ../src/memory.ts
53
+ var _map = /* @__PURE__ */ new WeakMap();
54
+ var _clone = /* @__PURE__ */ new WeakMap();
55
+ /**
56
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
57
+ */
58
+ var Memory = class {
59
+ /**
60
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
61
+ */
62
+ constructor(options = {}) {
63
+ _classPrivateFieldInitSpec(this, _map, void 0);
64
+ _classPrivateFieldInitSpec(this, _clone, void 0);
65
+ const { clone = (value) => structuredClone(value) } = options;
66
+ this.name = "Memory";
67
+ _classPrivateFieldSet2(_map, this, /* @__PURE__ */ new Map());
68
+ _classPrivateFieldSet2(_clone, this, clone);
69
+ }
70
+ get isOpen() {
71
+ return true;
72
+ }
73
+ write(c, data) {
74
+ _classPrivateFieldGet2(_map, this).set(c.key, _classPrivateFieldGet2(_clone, this).call(this, data));
75
+ }
76
+ read(c) {
77
+ if (!_classPrivateFieldGet2(_map, this).has(c.key)) throw new KeyNotFoundError$1({ key: c.key });
78
+ const value = _classPrivateFieldGet2(_map, this).get(c.key);
79
+ return _classPrivateFieldGet2(_clone, this).call(this, value);
80
+ }
81
+ exists(c) {
82
+ return _classPrivateFieldGet2(_map, this).has(c.key);
83
+ }
84
+ delete(c) {
85
+ if (!_classPrivateFieldGet2(_map, this).has(c.key)) throw new KeyNotFoundError$1({ key: c.key });
86
+ _classPrivateFieldGet2(_map, this).delete(c.key);
87
+ }
88
+ clear(_c) {
89
+ _classPrivateFieldGet2(_map, this).clear();
90
+ }
91
+ getWritable(c) {
92
+ const chunks = [];
93
+ return new WritableStream({
94
+ close: () => {
95
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
96
+ const merged = new Uint8Array(totalLength);
97
+ let offset = 0;
98
+ for (const chunk of chunks) {
99
+ merged.set(chunk, offset);
100
+ offset += chunk.byteLength;
101
+ }
102
+ _classPrivateFieldGet2(_map, this).set(c.key, merged);
103
+ },
104
+ write: (chunk) => {
105
+ if (!(chunk instanceof Uint8Array)) throw new InvalidChunkTypeError({
106
+ key: c.key,
107
+ chunk
108
+ });
109
+ chunks.push(_classPrivateFieldGet2(_clone, this).call(this, chunk));
110
+ }
111
+ });
112
+ }
113
+ getReadable(c) {
114
+ if (!_classPrivateFieldGet2(_map, this).has(c.key)) throw new KeyNotFoundError$1({ key: c.key });
115
+ const value = _classPrivateFieldGet2(_map, this).get(c.key);
116
+ return new ReadableStream({ pull: (controller) => {
117
+ if (!(value instanceof Uint8Array)) throw new InvalidChunkTypeError({
118
+ key: c.key,
119
+ chunk: value
120
+ });
121
+ controller.enqueue(_classPrivateFieldGet2(_clone, this).call(this, value));
122
+ controller.close();
123
+ } });
124
+ }
125
+ };
126
+ //#endregion
127
+ export { InvalidChunkTypeError, KeyNotFoundError, Memory };
128
+
129
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["KeyNotFoundError"],"sources":["../src/errors.ts","../src/memory.ts"],"sourcesContent":["import { type ErrorOptions, ErrorBase, setErrorMessage } from \"@unikvs/core\";\nimport getTypeName from \"type-name\";\n\nexport type { KeyNotFoundErrorArgs, KeyNotFoundErrorMeta } from \"@unikvs/core\";\nexport { KeyNotFoundError } from \"@unikvs/core\";\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)\n */\nexport type InvalidChunkTypeErrorMeta = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-key)\n */\n readonly key: string;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-chunk)\n */\n readonly chunk: unknown;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-chunk-type)\n */\n readonly chunkType: string;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)\n */\nexport type InvalidChunkTypeErrorArgs = ErrorOptions & Omit<InvalidChunkTypeErrorMeta, \"chunkType\">;\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)\n */\nexport class InvalidChunkTypeError extends ErrorBase<InvalidChunkTypeErrorMeta> {\n static {\n this.prototype.name = \"MemoryInvalidChunkTypeError\";\n }\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)\n */\n public constructor(args: InvalidChunkTypeErrorArgs) {\n const { key, chunk, ...options } = args;\n const meta: InvalidChunkTypeErrorMeta = {\n key,\n chunk,\n chunkType: getTypeName(chunk),\n };\n super(\n meta,\n ({ key: messageKey, chunkType }) =>\n `Expected chunk for key ${JSON.stringify(messageKey)} is Uint8Array<ArrayBuffer>, but got ${chunkType}`,\n options,\n );\n }\n}\n\nsetErrorMessage(\n InvalidChunkTypeError,\n ({ key: messageKey, chunkType }) =>\n `キー ${JSON.stringify(messageKey)} のチャンク型に Uint8Array<ArrayBuffer> を期待しましたが、${chunkType} を得ました`,\n \"ja\",\n);\n","import { type IStorage, KeyNotFoundError } from \"@unikvs/core\";\n\nimport { InvalidChunkTypeError } from \"./errors.js\";\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)\n */\nexport type MemoryOptions = {\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#clone)\n */\n readonly clone?: (<T>(value: T) => T) | undefined;\n};\n\n/**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)\n */\nexport default class Memory implements IStorage {\n /**\n * キーと値のペアを保持する内部マップです。\n */\n readonly #map: Map<string, any>;\n\n public readonly name: string;\n\n /**\n * データの複製に使用する関数です。\n */\n readonly #clone: <T>(value: T) => T;\n\n /**\n * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)\n */\n public constructor(options: MemoryOptions = {}) {\n const { clone = <T>(value: T): T => structuredClone(value) } = options;\n\n this.name = \"Memory\";\n this.#map = new Map();\n this.#clone = clone;\n }\n\n public get isOpen(): boolean {\n return true;\n }\n\n public write(c: IStorage.WriteContext, data: any): void {\n this.#map.set(c.key, this.#clone(data));\n }\n\n public read(c: IStorage.ReadContext): any {\n if (!this.#map.has(c.key)) {\n throw new KeyNotFoundError({ key: c.key });\n }\n\n const value = this.#map.get(c.key);\n\n return this.#clone(value);\n }\n\n public exists(c: IStorage.ExistsContext): boolean {\n const exists = this.#map.has(c.key);\n\n return exists;\n }\n\n public delete(c: IStorage.DeleteContext): void {\n if (!this.#map.has(c.key)) {\n throw new KeyNotFoundError({ key: c.key });\n }\n\n this.#map.delete(c.key);\n }\n\n public clear(_c: IStorage.ClearContext): void {\n this.#map.clear();\n }\n\n public getWritable(c: IStorage.GetWritableContext): WritableStream<Uint8Array<ArrayBuffer>> {\n // メモリーストレージにはネイティブなストリームがないため、書き込まれたチャンクを配列に保持し、クローズ時に結合して保存します。\n const chunks: Uint8Array[] = [];\n const stream = new WritableStream<Uint8Array<ArrayBuffer>>({\n close: (): void => {\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);\n const merged = new Uint8Array(totalLength);\n\n let offset = 0;\n\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n this.#map.set(c.key, merged);\n },\n write: (chunk): void => {\n if (!(chunk instanceof Uint8Array)) {\n throw new InvalidChunkTypeError({\n key: c.key,\n chunk,\n });\n }\n\n chunks.push(this.#clone(chunk));\n },\n });\n\n return stream;\n }\n\n public getReadable(c: IStorage.GetReadableContext): ReadableStream<Uint8Array<ArrayBuffer>> {\n if (!this.#map.has(c.key)) {\n throw new KeyNotFoundError({ key: c.key });\n }\n\n // メモリーストレージにはネイティブなストリームがないため、既存の値を単一チャンクとしてストリームで送出します。\n const value = this.#map.get(c.key);\n const stream = new ReadableStream<Uint8Array<ArrayBuffer>>({\n pull: (controller): void => {\n if (!(value instanceof Uint8Array)) {\n throw new InvalidChunkTypeError({\n key: c.key,\n chunk: value,\n });\n }\n\n controller.enqueue(this.#clone(value) as Uint8Array<ArrayBuffer>);\n controller.close();\n },\n });\n\n return stream;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,49 +1,47 @@
1
1
  {
2
2
  "name": "@unikvs/memory",
3
- "version": "0.0.10",
4
- "description": "",
5
- "homepage": "https://github.com/tai-kun/unikvs",
3
+ "version": "0.0.13",
4
+ "description": "Storage plugin that stores arbitrary data in memory.",
5
+ "homepage": "https://tai-kun.github.io/unikvs/",
6
6
  "license": "MIT",
7
- "author": "tai-kun",
8
7
  "repository": {
9
- "url": "https://github.com/tai-kun/unikvs"
8
+ "url": "https://github.com/tai-kun/unikvs",
9
+ "directory": "packages/memory"
10
10
  },
11
11
  "files": [
12
12
  "dist",
13
13
  "src",
14
14
  "package.json",
15
- "LICENSE"
15
+ "LICENSE",
16
+ "README.md"
16
17
  ],
17
18
  "type": "module",
18
19
  "sideEffects": false,
19
- "main": "./dist/src/index.js",
20
- "types": "./dist/src/index.d.ts",
21
20
  "exports": {
22
21
  ".": {
23
- "types": "./dist/src/index.d.ts",
24
- "default": "./dist/src/index.js"
22
+ "types": "./dist/index.d.ts",
23
+ "default": "./dist/index.js"
25
24
  }
26
25
  },
27
26
  "dependencies": {
28
- "@unikvs/core": "0.0.10",
29
- "type-name": "2.0.2"
27
+ "@unikvs/core": "0.0.13",
28
+ "type-name": "^2.0.2"
30
29
  },
31
30
  "devDependencies": {
32
- "@tsconfig/node24": "24.0.5",
33
- "@tsconfig/strictest": "2.0.8",
34
- "@types/node": "24.13.3",
35
31
  "@types/type-name": "1.0.32",
36
- "@vitest/browser": "4.1.10",
37
- "@vitest/browser-playwright": "4.1.10",
38
- "npm-check-updates": "20.0.2",
39
- "playwright": "1.62.1",
40
- "vite": "8.2.1",
41
- "vitest": "4.1.10"
32
+ "@unikvs/testing": "0.0.0",
33
+ "@vitest/browser-playwright": "5.0.5",
34
+ "@vitest/coverage-istanbul": "5.0.5",
35
+ "@vitest/coverage-v8": "5.0.5",
36
+ "playwright": "1.64.1",
37
+ "valibot": "1.5.0",
38
+ "vite-plus": "1.3.0"
42
39
  },
43
40
  "peerDependencies": {
44
- "@logtape/logtape": "2.0.0"
41
+ "@logtape/logtape": "^2.0.0"
45
42
  },
43
+ "readme": "README.md",
46
44
  "scripts": {
47
- "build": "tsc --project ./.config/tsconfig.build.json"
45
+ "build": "vp -C .config pack"
48
46
  }
49
47
  }
package/src/errors.ts CHANGED
@@ -1,75 +1,36 @@
1
- import { ErrorBase, type ErrorOptions, setErrorMessage } from "@unikvs/core";
1
+ import { type ErrorOptions, ErrorBase, setErrorMessage } from "@unikvs/core";
2
2
  import getTypeName from "type-name";
3
3
 
4
- /**
5
- * 指定されたキーがストレージ内に存在しないことを示すエラーメタデータ型です。
6
- */
7
- export type KeyNotFoundErrorMeta = {
8
- /**
9
- * 存在しなかったキーです。
10
- */
11
- readonly key: string;
12
- };
13
-
14
- /**
15
- * {@link KeyNotFoundError} のコンストラクター引数型です。
16
- *
17
- * エラーの追加情報 (`cause`) も含みます。
18
- */
19
- export type KeyNotFoundErrorArgs = ErrorOptions & KeyNotFoundErrorMeta;
20
-
21
- /**
22
- * 読み取りまたは削除を実行しようとしたキーがストレージ内に存在しない場合に投げられるエラーです。
23
- */
24
- export class KeyNotFoundError extends ErrorBase<KeyNotFoundErrorMeta> {
25
- static {
26
- this.prototype.name = "MemoryKeyNotFoundError";
27
- }
28
-
29
- /**
30
- * KeyNotFoundError インスタンスを初期化します。
31
- *
32
- * @param args エラーメタデータとエラーの追加情報です。
33
- */
34
- public constructor(args: KeyNotFoundErrorArgs) {
35
- const { key, ...options } = args;
36
- const meta: KeyNotFoundErrorMeta = { key };
37
- super(meta, ({ key }) => `Key not found: ${key}`, options);
38
- }
39
- }
40
-
41
- setErrorMessage(KeyNotFoundError, ({ key }) => `キー ${key} が見つかりません`, "ja");
4
+ export type { KeyNotFoundErrorArgs, KeyNotFoundErrorMeta } from "@unikvs/core";
5
+ export { KeyNotFoundError } from "@unikvs/core";
42
6
 
43
7
  /**
44
- * ストリーム書き込み時に無効なチャンク型が渡されたことを示すエラーメタデータ型です。
8
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)
45
9
  */
46
10
  export type InvalidChunkTypeErrorMeta = {
47
11
  /**
48
- * 書き込み先または読み取り元のキーです。
12
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-key)
49
13
  */
50
14
  readonly key: string;
51
15
 
52
16
  /**
53
- * 型が無効だったチャンクの値です。
17
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-chunk)
54
18
  */
55
19
  readonly chunk: unknown;
56
20
 
57
21
  /**
58
- * 実際に渡されたチャンク値の型名です。
22
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-chunk-type)
59
23
  */
60
24
  readonly chunkType: string;
61
25
  };
62
26
 
63
27
  /**
64
- * {@link InvalidChunkTypeError} のコンストラクター引数型です。
65
- *
66
- * `chunkType` はコンストラクター内部で自動的に設定されるため、引数からは除外されています。
67
- * また、エラーの追加情報 (`cause`) も含みます。
28
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)
68
29
  */
69
30
  export type InvalidChunkTypeErrorArgs = ErrorOptions & Omit<InvalidChunkTypeErrorMeta, "chunkType">;
70
31
 
71
32
  /**
72
- * `getWritable` が返すストリームに `Uint8Array<ArrayBuffer>` 以外の値が書き込まれた場合に投げられるエラーです。
33
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)
73
34
  */
74
35
  export class InvalidChunkTypeError extends ErrorBase<InvalidChunkTypeErrorMeta> {
75
36
  static {
@@ -77,17 +38,19 @@ export class InvalidChunkTypeError extends ErrorBase<InvalidChunkTypeErrorMeta>
77
38
  }
78
39
 
79
40
  /**
80
- * InvalidChunkTypeError インスタンスを初期化します。
81
- *
82
- * @param args エラーメタデータとエラーの追加情報です。
41
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#invalid-chunk-type-error)
83
42
  */
84
43
  public constructor(args: InvalidChunkTypeErrorArgs) {
85
44
  const { key, chunk, ...options } = args;
86
- const meta: InvalidChunkTypeErrorMeta = { key, chunk, chunkType: getTypeName(chunk) };
45
+ const meta: InvalidChunkTypeErrorMeta = {
46
+ key,
47
+ chunk,
48
+ chunkType: getTypeName(chunk),
49
+ };
87
50
  super(
88
51
  meta,
89
- ({ key, chunkType }) =>
90
- `Expected chunk for key ${JSON.stringify(key)} is Uint8Array<ArrayBuffer>, but got ${chunkType}`,
52
+ ({ key: messageKey, chunkType }) =>
53
+ `Expected chunk for key ${JSON.stringify(messageKey)} is Uint8Array<ArrayBuffer>, but got ${chunkType}`,
91
54
  options,
92
55
  );
93
56
  }
@@ -95,7 +58,7 @@ export class InvalidChunkTypeError extends ErrorBase<InvalidChunkTypeErrorMeta>
95
58
 
96
59
  setErrorMessage(
97
60
  InvalidChunkTypeError,
98
- ({ key, chunkType }) =>
99
- `キー ${JSON.stringify(key)} のチャンク型に Uint8Array<ArrayBuffer> を期待しましたが、${chunkType} を得ました`,
61
+ ({ key: messageKey, chunkType }) =>
62
+ `キー ${JSON.stringify(messageKey)} のチャンク型に Uint8Array<ArrayBuffer> を期待しましたが、${chunkType} を得ました`,
100
63
  "ja",
101
64
  );
package/src/index.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  export type {
2
- KeyNotFoundErrorMeta,
3
2
  KeyNotFoundErrorArgs,
4
- InvalidChunkTypeErrorMeta,
3
+ KeyNotFoundErrorMeta,
5
4
  InvalidChunkTypeErrorArgs,
5
+ InvalidChunkTypeErrorMeta,
6
6
  } from "./errors.js";
7
7
  export { KeyNotFoundError, InvalidChunkTypeError } from "./errors.js";
8
8
 
package/src/memory.ts CHANGED
@@ -1,170 +1,129 @@
1
- import type { IStorage } from "@unikvs/core";
1
+ import { type IStorage, KeyNotFoundError } from "@unikvs/core";
2
2
 
3
- import { KeyNotFoundError, InvalidChunkTypeError } from "./errors.js";
3
+ import { 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#clone)
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
  /**
13
20
  * キーと値のペアを保持する内部マップです。
14
21
  */
15
- private readonly map: Map<string, any>;
22
+ readonly #map: Map<string, any>;
23
+
24
+ public readonly name: string;
16
25
 
17
26
  /**
18
- * ストレージの名前です。デバッグやエラーメッセージなどに使用されます。
27
+ * データの複製に使用する関数です。
19
28
  */
20
- public readonly name: string;
29
+ readonly #clone: <T>(value: T) => T;
21
30
 
22
31
  /**
23
- * Memory インスタンスを初期化します。
24
- *
25
- * 内部のマップを初期化し、常にオープン状態として動作します。
32
+ * [API Reference](https://tai-kun.github.io/unikvs/packages/memory#usage)
26
33
  */
27
- public constructor() {
34
+ public constructor(options: MemoryOptions = {}) {
35
+ const { clone = <T>(value: T): T => structuredClone(value) } = options;
36
+
28
37
  this.name = "Memory";
29
- this.map = new Map();
38
+ this.#map = new Map();
39
+ this.#clone = clone;
30
40
  }
31
41
 
32
- /**
33
- * メモリーストレージは常に利用可能なため、常に `true` を返します。
34
- */
35
42
  public get isOpen(): boolean {
36
43
  return true;
37
44
  }
38
45
 
39
- /**
40
- * 指定されたデータを、対応するキーでストレージに保存します。
41
- *
42
- * @param args.key 保存先のキーです。
43
- * @param args.data 保存するデータです。
44
- */
45
- public write(args: Pick<IStorage.WriteArgs<any>, "key" | "data">): void {
46
- const { key, data } = args;
47
- this.map.set(key, data);
46
+ public write(c: IStorage.WriteContext, data: any): void {
47
+ this.#map.set(c.key, this.#clone(data));
48
48
  }
49
49
 
50
- /**
51
- * 指定されたキーに対応するデータをストレージから取得します。
52
- *
53
- * @param args.key 取得元のキーです。
54
- * @returns キーに対応するデータです。
55
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
56
- */
57
- public read(args: Pick<IStorage.ReadArgs, "key">): any {
58
- const { key } = args;
59
- if (!this.map.has(key)) {
60
- throw new KeyNotFoundError({ key });
50
+ public read(c: IStorage.ReadContext): any {
51
+ if (!this.#map.has(c.key)) {
52
+ throw new KeyNotFoundError({ key: c.key });
61
53
  }
62
54
 
63
- const value = this.map.get(key);
55
+ const value = this.#map.get(c.key);
64
56
 
65
- return value;
57
+ return this.#clone(value);
66
58
  }
67
59
 
68
- /**
69
- * 指定されたキーに対応するデータがストレージ内に存在するかを確認します。
70
- *
71
- * @param args.key 確認するキーです。
72
- * @returns キーに対応するデータが存在する場合は true、それ以外は false です。
73
- */
74
- public exists(args: Pick<IStorage.ExistsArgs, "key">): boolean {
75
- const { key } = args;
76
- const exists = this.map.has(key);
60
+ public exists(c: IStorage.ExistsContext): boolean {
61
+ const exists = this.#map.has(c.key);
77
62
 
78
63
  return exists;
79
64
  }
80
65
 
81
- /**
82
- * 指定されたキーに対応するデータをストレージから削除します。
83
- *
84
- * @param args.key 削除するキーです。
85
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
86
- */
87
- public delete(args: Pick<IStorage.DeleteArgs, "key">): void {
88
- const { key } = args;
89
- if (!this.map.has(key)) {
90
- throw new KeyNotFoundError({ key });
66
+ public delete(c: IStorage.DeleteContext): void {
67
+ if (!this.#map.has(c.key)) {
68
+ throw new KeyNotFoundError({ key: c.key });
91
69
  }
92
70
 
93
- this.map.delete(key);
71
+ this.#map.delete(c.key);
94
72
  }
95
73
 
96
- /**
97
- * ストレージ内のすべてのデータを完全に消去します。
98
- */
99
- public clear(): void {
100
- this.map.clear();
74
+ public clear(_c: IStorage.ClearContext): void {
75
+ this.#map.clear();
101
76
  }
102
77
 
103
- /**
104
- * 指定されたキーに対応する書き込み可能なストリームを取得します。
105
- *
106
- * メモリーストレージにはネイティブなストリームがないため、書き込まれたチャンクをメモリー上に保持し、ストリームがクローズされたときに結合して保存します。
107
- *
108
- * @param args.key 書き込み先のキーです。
109
- * @returns 書き込み可能なストリームです。
110
- */
111
- public getWritable(
112
- args: Pick<IStorage.GetWritableArgs, "key">,
113
- ): WritableStream<Uint8Array<ArrayBuffer>> {
114
- const { key } = args;
78
+ public getWritable(c: IStorage.GetWritableContext): WritableStream<Uint8Array<ArrayBuffer>> {
115
79
  // メモリーストレージにはネイティブなストリームがないため、書き込まれたチャンクを配列に保持し、クローズ時に結合して保存します。
116
80
  const chunks: Uint8Array[] = [];
117
81
  const stream = new WritableStream<Uint8Array<ArrayBuffer>>({
118
- write: (chunk) => {
119
- if (!(chunk instanceof Uint8Array)) {
120
- throw new InvalidChunkTypeError({ key, chunk });
121
- }
122
-
123
- chunks.push(chunk);
124
- },
125
- close: () => {
126
- const totalLength = chunks.reduce((sum, c) => sum + c.byteLength, 0);
82
+ close: (): void => {
83
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
127
84
  const merged = new Uint8Array(totalLength);
128
85
 
129
86
  let offset = 0;
130
- for (const c of chunks) {
131
- merged.set(c, offset);
132
- offset += c.byteLength;
87
+
88
+ for (const chunk of chunks) {
89
+ merged.set(chunk, offset);
90
+ offset += chunk.byteLength;
91
+ }
92
+
93
+ this.#map.set(c.key, merged);
94
+ },
95
+ write: (chunk): void => {
96
+ if (!(chunk instanceof Uint8Array)) {
97
+ throw new InvalidChunkTypeError({
98
+ key: c.key,
99
+ chunk,
100
+ });
133
101
  }
134
102
 
135
- this.map.set(key, merged);
103
+ chunks.push(this.#clone(chunk));
136
104
  },
137
105
  });
138
106
 
139
107
  return stream;
140
108
  }
141
109
 
142
- /**
143
- * 指定されたキーに対応する読み取り可能なストリームを取得します。
144
- *
145
- * メモリーストレージにはネイティブなストリームがないため、既存の値を単一チャンクとしてストリームで送出します。
146
- *
147
- * @param args.key 読み取り元のキーです。
148
- * @returns 読み取り可能なストリームです。
149
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
150
- */
151
- public getReadable(
152
- args: Pick<IStorage.GetReadableArgs, "key">,
153
- ): ReadableStream<Uint8Array<ArrayBuffer>> {
154
- const { key } = args;
155
- if (!this.map.has(key)) {
156
- throw new KeyNotFoundError({ key });
110
+ public getReadable(c: IStorage.GetReadableContext): ReadableStream<Uint8Array<ArrayBuffer>> {
111
+ if (!this.#map.has(c.key)) {
112
+ throw new KeyNotFoundError({ key: c.key });
157
113
  }
158
114
 
159
115
  // メモリーストレージにはネイティブなストリームがないため、既存の値を単一チャンクとしてストリームで送出します。
160
- const value = this.map.get(key);
116
+ const value = this.#map.get(c.key);
161
117
  const stream = new ReadableStream<Uint8Array<ArrayBuffer>>({
162
- pull: (controller) => {
118
+ pull: (controller): void => {
163
119
  if (!(value instanceof Uint8Array)) {
164
- throw new InvalidChunkTypeError({ key, chunk: value });
120
+ throw new InvalidChunkTypeError({
121
+ key: c.key,
122
+ chunk: value,
123
+ });
165
124
  }
166
125
 
167
- controller.enqueue(value as Uint8Array<ArrayBuffer>);
126
+ controller.enqueue(this.#clone(value) as Uint8Array<ArrayBuffer>);
168
127
  controller.close();
169
128
  },
170
129
  });
@@ -1,63 +0,0 @@
1
- import { ErrorBase, type ErrorOptions } from "@unikvs/core";
2
- /**
3
- * 指定されたキーがストレージ内に存在しないことを示すエラーメタデータ型です。
4
- */
5
- export type KeyNotFoundErrorMeta = {
6
- /**
7
- * 存在しなかったキーです。
8
- */
9
- readonly key: string;
10
- };
11
- /**
12
- * {@link KeyNotFoundError} のコンストラクター引数型です。
13
- *
14
- * エラーの追加情報 (`cause`) も含みます。
15
- */
16
- export type KeyNotFoundErrorArgs = ErrorOptions & KeyNotFoundErrorMeta;
17
- /**
18
- * 読み取りまたは削除を実行しようとしたキーがストレージ内に存在しない場合に投げられるエラーです。
19
- */
20
- export declare class KeyNotFoundError extends ErrorBase<KeyNotFoundErrorMeta> {
21
- /**
22
- * KeyNotFoundError インスタンスを初期化します。
23
- *
24
- * @param args エラーメタデータとエラーの追加情報です。
25
- */
26
- constructor(args: KeyNotFoundErrorArgs);
27
- }
28
- /**
29
- * ストリーム書き込み時に無効なチャンク型が渡されたことを示すエラーメタデータ型です。
30
- */
31
- export type InvalidChunkTypeErrorMeta = {
32
- /**
33
- * 書き込み先または読み取り元のキーです。
34
- */
35
- readonly key: string;
36
- /**
37
- * 型が無効だったチャンクの値です。
38
- */
39
- readonly chunk: unknown;
40
- /**
41
- * 実際に渡されたチャンク値の型名です。
42
- */
43
- readonly chunkType: string;
44
- };
45
- /**
46
- * {@link InvalidChunkTypeError} のコンストラクター引数型です。
47
- *
48
- * `chunkType` はコンストラクター内部で自動的に設定されるため、引数からは除外されています。
49
- * また、エラーの追加情報 (`cause`) も含みます。
50
- */
51
- export type InvalidChunkTypeErrorArgs = ErrorOptions & Omit<InvalidChunkTypeErrorMeta, "chunkType">;
52
- /**
53
- * `getWritable` が返すストリームに `Uint8Array<ArrayBuffer>` 以外の値が書き込まれた場合に投げられるエラーです。
54
- */
55
- export declare class InvalidChunkTypeError extends ErrorBase<InvalidChunkTypeErrorMeta> {
56
- /**
57
- * InvalidChunkTypeError インスタンスを初期化します。
58
- *
59
- * @param args エラーメタデータとエラーの追加情報です。
60
- */
61
- constructor(args: InvalidChunkTypeErrorArgs);
62
- }
63
- //# sourceMappingURL=errors.d.ts.map
@@ -1 +0,0 @@
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,43 +0,0 @@
1
- var _a, _b;
2
- import { ErrorBase, setErrorMessage } from "@unikvs/core";
3
- import getTypeName from "type-name";
4
- /**
5
- * 読み取りまたは削除を実行しようとしたキーがストレージ内に存在しない場合に投げられるエラーです。
6
- */
7
- export class KeyNotFoundError extends ErrorBase {
8
- /**
9
- * KeyNotFoundError インスタンスを初期化します。
10
- *
11
- * @param args エラーメタデータとエラーの追加情報です。
12
- */
13
- constructor(args) {
14
- const { key, ...options } = args;
15
- const meta = { key };
16
- super(meta, ({ key }) => `Key not found: ${key}`, options);
17
- }
18
- }
19
- _a = KeyNotFoundError;
20
- (() => {
21
- _a.prototype.name = "MemoryKeyNotFoundError";
22
- })();
23
- setErrorMessage(KeyNotFoundError, ({ key }) => `キー ${key} が見つかりません`, "ja");
24
- /**
25
- * `getWritable` が返すストリームに `Uint8Array<ArrayBuffer>` 以外の値が書き込まれた場合に投げられるエラーです。
26
- */
27
- export class InvalidChunkTypeError extends ErrorBase {
28
- /**
29
- * InvalidChunkTypeError インスタンスを初期化します。
30
- *
31
- * @param args エラーメタデータとエラーの追加情報です。
32
- */
33
- constructor(args) {
34
- const { key, chunk, ...options } = args;
35
- const meta = { key, chunk, chunkType: getTypeName(chunk) };
36
- super(meta, ({ key, chunkType }) => `Expected chunk for key ${JSON.stringify(key)} is Uint8Array<ArrayBuffer>, but got ${chunkType}`, options);
37
- }
38
- }
39
- _b = InvalidChunkTypeError;
40
- (() => {
41
- _b.prototype.name = "MemoryInvalidChunkTypeError";
42
- })();
43
- setErrorMessage(InvalidChunkTypeError, ({ key, chunkType }) => `キー ${JSON.stringify(key)} のチャンク型に Uint8Array<ArrayBuffer> を期待しましたが、${chunkType} を得ました`, "ja");
@@ -1,5 +0,0 @@
1
- export type { KeyNotFoundErrorMeta, KeyNotFoundErrorArgs, InvalidChunkTypeErrorMeta, InvalidChunkTypeErrorArgs, } from "./errors.js";
2
- export { KeyNotFoundError, InvalidChunkTypeError } from "./errors.js";
3
- export type * from "./memory.js";
4
- export { default as Memory } from "./memory.js";
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEtE,mBAAmB,aAAa,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC"}
package/dist/src/index.js DELETED
@@ -1,2 +0,0 @@
1
- export { KeyNotFoundError, InvalidChunkTypeError } from "./errors.js";
2
- export { default as Memory } from "./memory.js";
@@ -1,80 +0,0 @@
1
- import type { IStorage } from "@unikvs/core";
2
- /**
3
- * メモリーを永続化先として使用するストレージクラスです。
4
- *
5
- * アプリケーションの実行中のみデータを保持し、プロセス終了時に破棄されます。
6
- * 全ての操作が同期で完了するため、非同期処理のオーバーヘッドがありません。
7
- */
8
- export default class Memory implements IStorage {
9
- /**
10
- * キーと値のペアを保持する内部マップです。
11
- */
12
- private readonly map;
13
- /**
14
- * ストレージの名前です。デバッグやエラーメッセージなどに使用されます。
15
- */
16
- readonly name: string;
17
- /**
18
- * Memory インスタンスを初期化します。
19
- *
20
- * 内部のマップを初期化し、常にオープン状態として動作します。
21
- */
22
- constructor();
23
- /**
24
- * メモリーストレージは常に利用可能なため、常に `true` を返します。
25
- */
26
- get isOpen(): boolean;
27
- /**
28
- * 指定されたデータを、対応するキーでストレージに保存します。
29
- *
30
- * @param args.key 保存先のキーです。
31
- * @param args.data 保存するデータです。
32
- */
33
- write(args: Pick<IStorage.WriteArgs<any>, "key" | "data">): void;
34
- /**
35
- * 指定されたキーに対応するデータをストレージから取得します。
36
- *
37
- * @param args.key 取得元のキーです。
38
- * @returns キーに対応するデータです。
39
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
40
- */
41
- read(args: Pick<IStorage.ReadArgs, "key">): any;
42
- /**
43
- * 指定されたキーに対応するデータがストレージ内に存在するかを確認します。
44
- *
45
- * @param args.key 確認するキーです。
46
- * @returns キーに対応するデータが存在する場合は true、それ以外は false です。
47
- */
48
- exists(args: Pick<IStorage.ExistsArgs, "key">): boolean;
49
- /**
50
- * 指定されたキーに対応するデータをストレージから削除します。
51
- *
52
- * @param args.key 削除するキーです。
53
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
54
- */
55
- delete(args: Pick<IStorage.DeleteArgs, "key">): void;
56
- /**
57
- * ストレージ内のすべてのデータを完全に消去します。
58
- */
59
- clear(): void;
60
- /**
61
- * 指定されたキーに対応する書き込み可能なストリームを取得します。
62
- *
63
- * メモリーストレージにはネイティブなストリームがないため、書き込まれたチャンクをメモリー上に保持し、ストリームがクローズされたときに結合して保存します。
64
- *
65
- * @param args.key 書き込み先のキーです。
66
- * @returns 書き込み可能なストリームです。
67
- */
68
- getWritable(args: Pick<IStorage.GetWritableArgs, "key">): WritableStream<Uint8Array<ArrayBuffer>>;
69
- /**
70
- * 指定されたキーに対応する読み取り可能なストリームを取得します。
71
- *
72
- * メモリーストレージにはネイティブなストリームがないため、既存の値を単一チャンクとしてストリームで送出します。
73
- *
74
- * @param args.key 読み取り元のキーです。
75
- * @returns 読み取り可能なストリームです。
76
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
77
- */
78
- getReadable(args: Pick<IStorage.GetReadableArgs, "key">): ReadableStream<Uint8Array<ArrayBuffer>>;
79
- }
80
- //# sourceMappingURL=memory.d.ts.map
@@ -1 +0,0 @@
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,138 +0,0 @@
1
- import { KeyNotFoundError, InvalidChunkTypeError } from "./errors.js";
2
- /**
3
- * メモリーを永続化先として使用するストレージクラスです。
4
- *
5
- * アプリケーションの実行中のみデータを保持し、プロセス終了時に破棄されます。
6
- * 全ての操作が同期で完了するため、非同期処理のオーバーヘッドがありません。
7
- */
8
- export default class Memory {
9
- /**
10
- * Memory インスタンスを初期化します。
11
- *
12
- * 内部のマップを初期化し、常にオープン状態として動作します。
13
- */
14
- constructor() {
15
- this.name = "Memory";
16
- this.map = new Map();
17
- }
18
- /**
19
- * メモリーストレージは常に利用可能なため、常に `true` を返します。
20
- */
21
- get isOpen() {
22
- return true;
23
- }
24
- /**
25
- * 指定されたデータを、対応するキーでストレージに保存します。
26
- *
27
- * @param args.key 保存先のキーです。
28
- * @param args.data 保存するデータです。
29
- */
30
- write(args) {
31
- const { key, data } = args;
32
- this.map.set(key, data);
33
- }
34
- /**
35
- * 指定されたキーに対応するデータをストレージから取得します。
36
- *
37
- * @param args.key 取得元のキーです。
38
- * @returns キーに対応するデータです。
39
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
40
- */
41
- read(args) {
42
- const { key } = args;
43
- if (!this.map.has(key)) {
44
- throw new KeyNotFoundError({ key });
45
- }
46
- const value = this.map.get(key);
47
- return value;
48
- }
49
- /**
50
- * 指定されたキーに対応するデータがストレージ内に存在するかを確認します。
51
- *
52
- * @param args.key 確認するキーです。
53
- * @returns キーに対応するデータが存在する場合は true、それ以外は false です。
54
- */
55
- exists(args) {
56
- const { key } = args;
57
- const exists = this.map.has(key);
58
- return exists;
59
- }
60
- /**
61
- * 指定されたキーに対応するデータをストレージから削除します。
62
- *
63
- * @param args.key 削除するキーです。
64
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
65
- */
66
- delete(args) {
67
- const { key } = args;
68
- if (!this.map.has(key)) {
69
- throw new KeyNotFoundError({ key });
70
- }
71
- this.map.delete(key);
72
- }
73
- /**
74
- * ストレージ内のすべてのデータを完全に消去します。
75
- */
76
- clear() {
77
- this.map.clear();
78
- }
79
- /**
80
- * 指定されたキーに対応する書き込み可能なストリームを取得します。
81
- *
82
- * メモリーストレージにはネイティブなストリームがないため、書き込まれたチャンクをメモリー上に保持し、ストリームがクローズされたときに結合して保存します。
83
- *
84
- * @param args.key 書き込み先のキーです。
85
- * @returns 書き込み可能なストリームです。
86
- */
87
- getWritable(args) {
88
- const { key } = args;
89
- // メモリーストレージにはネイティブなストリームがないため、書き込まれたチャンクを配列に保持し、クローズ時に結合して保存します。
90
- const chunks = [];
91
- const stream = new WritableStream({
92
- write: (chunk) => {
93
- if (!(chunk instanceof Uint8Array)) {
94
- throw new InvalidChunkTypeError({ key, chunk });
95
- }
96
- chunks.push(chunk);
97
- },
98
- close: () => {
99
- const totalLength = chunks.reduce((sum, c) => sum + c.byteLength, 0);
100
- const merged = new Uint8Array(totalLength);
101
- let offset = 0;
102
- for (const c of chunks) {
103
- merged.set(c, offset);
104
- offset += c.byteLength;
105
- }
106
- this.map.set(key, merged);
107
- },
108
- });
109
- return stream;
110
- }
111
- /**
112
- * 指定されたキーに対応する読み取り可能なストリームを取得します。
113
- *
114
- * メモリーストレージにはネイティブなストリームがないため、既存の値を単一チャンクとしてストリームで送出します。
115
- *
116
- * @param args.key 読み取り元のキーです。
117
- * @returns 読み取り可能なストリームです。
118
- * @throws キーがストレージ内に存在しない場合に {@link KeyNotFoundError} を投げます。
119
- */
120
- getReadable(args) {
121
- const { key } = args;
122
- if (!this.map.has(key)) {
123
- throw new KeyNotFoundError({ key });
124
- }
125
- // メモリーストレージにはネイティブなストリームがないため、既存の値を単一チャンクとしてストリームで送出します。
126
- const value = this.map.get(key);
127
- const stream = new ReadableStream({
128
- pull: (controller) => {
129
- if (!(value instanceof Uint8Array)) {
130
- throw new InvalidChunkTypeError({ key, chunk: value });
131
- }
132
- controller.enqueue(value);
133
- controller.close();
134
- },
135
- });
136
- return stream;
137
- }
138
- }