@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 +3 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +129 -0
- package/dist/index.js.map +1 -0
- package/package.json +21 -23
- package/src/errors.ts +19 -56
- package/src/index.ts +2 -2
- package/src/memory.ts +67 -108
- package/dist/src/errors.d.ts +0 -63
- package/dist/src/errors.d.ts.map +0 -1
- package/dist/src/errors.js +0 -43
- package/dist/src/index.d.ts +0 -5
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -2
- package/dist/src/memory.d.ts +0 -80
- package/dist/src/memory.d.ts.map +0 -1
- package/dist/src/memory.js +0 -138
package/README.md
ADDED
package/dist/index.d.ts
ADDED
|
@@ -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.
|
|
4
|
-
"description": "",
|
|
5
|
-
"homepage": "https://
|
|
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/
|
|
24
|
-
"default": "./dist/
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"default": "./dist/index.js"
|
|
25
24
|
}
|
|
26
25
|
},
|
|
27
26
|
"dependencies": {
|
|
28
|
-
"@unikvs/core": "0.0.
|
|
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
|
-
"@
|
|
37
|
-
"@vitest/browser-playwright": "
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
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": "
|
|
45
|
+
"build": "vp -C .config pack"
|
|
48
46
|
}
|
|
49
47
|
}
|
package/src/errors.ts
CHANGED
|
@@ -1,75 +1,36 @@
|
|
|
1
|
-
import {
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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 = {
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
|
1
|
+
import { type IStorage, KeyNotFoundError } from "@unikvs/core";
|
|
2
2
|
|
|
3
|
-
import {
|
|
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
|
-
|
|
22
|
+
readonly #map: Map<string, any>;
|
|
23
|
+
|
|
24
|
+
public readonly name: string;
|
|
16
25
|
|
|
17
26
|
/**
|
|
18
|
-
*
|
|
27
|
+
* データの複製に使用する関数です。
|
|
19
28
|
*/
|
|
20
|
-
|
|
29
|
+
readonly #clone: <T>(value: T) => T;
|
|
21
30
|
|
|
22
31
|
/**
|
|
23
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
119
|
-
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
offset
|
|
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
|
-
|
|
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
|
|
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({
|
|
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
|
});
|
package/dist/src/errors.d.ts
DELETED
|
@@ -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
|
package/dist/src/errors.d.ts.map
DELETED
|
@@ -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"}
|
package/dist/src/errors.js
DELETED
|
@@ -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");
|
package/dist/src/index.d.ts
DELETED
|
@@ -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
|
package/dist/src/index.d.ts.map
DELETED
|
@@ -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
package/dist/src/memory.d.ts
DELETED
|
@@ -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
|
package/dist/src/memory.d.ts.map
DELETED
|
@@ -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"}
|
package/dist/src/memory.js
DELETED
|
@@ -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
|
-
}
|