unikvs 0.0.9 → 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.
Files changed (63) hide show
  1. package/README.md +3 -0
  2. package/dist/src/_logger.d.ts.map +1 -1
  3. package/dist/src/_merge-variables.d.ts +13 -0
  4. package/dist/src/_merge-variables.d.ts.map +1 -0
  5. package/dist/src/_merge-variables.js +12 -0
  6. package/dist/src/_storage.d.ts +11 -11
  7. package/dist/src/_storage.d.ts.map +1 -1
  8. package/dist/src/_storage.js +31 -22
  9. package/dist/src/_streams.d.ts +20 -0
  10. package/dist/src/_streams.d.ts.map +1 -0
  11. package/dist/src/_streams.js +36 -0
  12. package/dist/src/_to-value-stream.d.ts.map +1 -1
  13. package/dist/src/_to-value-stream.js +44 -6
  14. package/dist/src/_transformer.d.ts +7 -7
  15. package/dist/src/_transformer.d.ts.map +1 -1
  16. package/dist/src/_transformer.js +12 -12
  17. package/dist/src/_valibot.d.ts +6 -7
  18. package/dist/src/_valibot.d.ts.map +1 -1
  19. package/dist/src/_valibot.js +1 -1
  20. package/dist/src/_value-schemas.d.ts +179 -0
  21. package/dist/src/_value-schemas.d.ts.map +1 -0
  22. package/dist/src/_value-schemas.js +150 -0
  23. package/dist/src/errors.d.ts +218 -27
  24. package/dist/src/errors.d.ts.map +1 -1
  25. package/dist/src/errors.js +102 -47
  26. package/dist/src/index.d.ts +3 -3
  27. package/dist/src/index.d.ts.map +1 -1
  28. package/dist/src/index.js +2 -2
  29. package/dist/src/unikvs-config.d.ts +58 -139
  30. package/dist/src/unikvs-config.d.ts.map +1 -1
  31. package/dist/src/unikvs-config.js +41 -46
  32. package/dist/src/unikvs.d.ts +86 -161
  33. package/dist/src/unikvs.d.ts.map +1 -1
  34. package/dist/src/unikvs.js +374 -171
  35. package/dist/src/utils.types.d.ts +1 -3
  36. package/dist/src/utils.types.d.ts.map +1 -1
  37. package/dist/src/value-stream.types.d.ts +5 -6
  38. package/dist/src/value-stream.types.d.ts.map +1 -1
  39. package/dist/src/variables.types.d.ts +11 -0
  40. package/dist/src/variables.types.d.ts.map +1 -0
  41. package/package.json +26 -25
  42. package/src/_merge-variables.ts +19 -0
  43. package/src/_storage.ts +47 -24
  44. package/src/_streams.ts +47 -0
  45. package/src/_to-value-stream.ts +47 -8
  46. package/src/_transformer.ts +13 -13
  47. package/src/_valibot.ts +8 -6
  48. package/src/_value-schemas.ts +362 -0
  49. package/src/errors.ts +280 -68
  50. package/src/index.ts +2 -3
  51. package/src/unikvs-config.ts +142 -167
  52. package/src/unikvs.ts +523 -285
  53. package/src/utils.types.ts +1 -3
  54. package/src/value-stream.types.ts +5 -6
  55. package/src/variables.types.ts +13 -0
  56. package/dist/src/_merge-context.d.ts +0 -13
  57. package/dist/src/_merge-context.d.ts.map +0 -1
  58. package/dist/src/_merge-context.js +0 -12
  59. package/dist/src/context.types.d.ts +0 -17
  60. package/dist/src/context.types.d.ts.map +0 -1
  61. package/src/_merge-context.ts +0 -19
  62. package/src/context.types.ts +0 -19
  63. /package/dist/src/{context.types.js → variables.types.js} +0 -0
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # unikvs
2
+
3
+ [Documentation](https://tai-kun.github.io/unikvs/packages/unikvs)
@@ -1 +1 @@
1
- {"version":3,"file":"_logger.d.ts","sourceRoot":"","sources":["../../src/_logger.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,MAAM,mCAAsB,CAAC;AAEnC,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"_logger.d.ts","sourceRoot":"","sources":["../../src/_logger.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,MAAM,mCAAsB,CAAC;eAEpB,MAAM"}
@@ -0,0 +1,13 @@
1
+ import { Variables } from "@unikvs/core";
2
+ import type { VariablesSource } from "./variables.types.js";
3
+ /**
4
+ * 2 つの Variables オブジェクトを結合します。
5
+ *
6
+ * 基本となる Variables に対して、追加または上書きする変数情報を結合し、新しい Variables オブジェクトを生成して返します。追加する変数情報が配列(キーと値のペアの配列)である場合は、オブジェクトに変換した上で結合処理を行います。
7
+ *
8
+ * @param a ベースとなる読み取り専用の Variables オブジェクトです。
9
+ * @param b 結合する読み取り専用の Variables、または VariablesSource、あるいは undefined です。
10
+ * @returns 結合された新しい Variables オブジェクトです。
11
+ */
12
+ export default function mergeVariables(a: Readonly<Variables>, b: Readonly<Variables> | VariablesSource | undefined): Variables;
13
+ //# sourceMappingURL=_merge-variables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_merge-variables.d.ts","sourceRoot":"","sources":["../../src/_merge-variables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,EACtB,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,eAAe,GAAG,SAAS,GACnD,SAAS,CAEX"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 2 つの Variables オブジェクトを結合します。
3
+ *
4
+ * 基本となる Variables に対して、追加または上書きする変数情報を結合し、新しい Variables オブジェクトを生成して返します。追加する変数情報が配列(キーと値のペアの配列)である場合は、オブジェクトに変換した上で結合処理を行います。
5
+ *
6
+ * @param a ベースとなる読み取り専用の Variables オブジェクトです。
7
+ * @param b 結合する読み取り専用の Variables、または VariablesSource、あるいは undefined です。
8
+ * @returns 結合された新しい Variables オブジェクトです。
9
+ */
10
+ export default function mergeVariables(a, b) {
11
+ return { ...a, ...(Array.isArray(b) ? Object.fromEntries(b) : b) };
12
+ }
@@ -1,18 +1,18 @@
1
- import type { Context, IStorage, IReadableStream, IWritableStream } from "@unikvs/core";
1
+ import type { Variables, IStorage, IReadableStream, IWritableStream } from "@unikvs/core";
2
2
  import { type PluginOperationAggregateError } from "./errors.js";
3
3
  export default class UniKvsStorage {
4
4
  private readonly io;
5
5
  private managed;
6
6
  constructor(io: IStorage);
7
- open(context: Context, signal: AbortSignal): Promise<void>;
8
- close(context: Context, signal: AbortSignal): Promise<void>;
9
- write(context: Context, signal: AbortSignal, key: IStorage.Key, data: unknown): Promise<void>;
10
- read(context: Context, signal: AbortSignal, key: IStorage.Key): Promise<unknown>;
11
- exists(context: Context, signal: AbortSignal, key: IStorage.Key): Promise<boolean>;
12
- delete(context: Context, signal: AbortSignal, key: IStorage.Key): Promise<void>;
13
- clear(context: Context, signal: AbortSignal): Promise<void>;
14
- getReadable(context: Context, signal: AbortSignal, key: IStorage.Key): Promise<IReadableStream>;
15
- getWritable(context: Context, signal: AbortSignal, key: IStorage.Key): Promise<IWritableStream>;
16
- onOtherWriteError(context: Context, signal: AbortSignal, key: IStorage.Key, err: PluginOperationAggregateError): Promise<void>;
7
+ open(vars: Variables, signal: AbortSignal): Promise<void>;
8
+ close(vars: Variables, signal: AbortSignal): Promise<void>;
9
+ write(vars: Variables, signal: AbortSignal, key: IStorage.Key, data: unknown): Promise<void>;
10
+ read(vars: Variables, signal: AbortSignal, key: IStorage.Key): Promise<unknown>;
11
+ exists(vars: Variables, signal: AbortSignal, key: IStorage.Key): Promise<boolean>;
12
+ delete(vars: Variables, signal: AbortSignal, key: IStorage.Key): Promise<void>;
13
+ clear(vars: Variables, signal: AbortSignal): Promise<void>;
14
+ getReadable(vars: Variables, signal: AbortSignal, key: IStorage.Key): Promise<IReadableStream>;
15
+ getWritable(vars: Variables, signal: AbortSignal, key: IStorage.Key): Promise<IWritableStream>;
16
+ onOtherWriteError(vars: Variables, signal: AbortSignal, key: IStorage.Key, err: PluginOperationAggregateError): Promise<void>;
17
17
  }
18
18
  //# sourceMappingURL=_storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_storage.d.ts","sourceRoot":"","sources":["../../src/_storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAa,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGnG,OAAO,EACL,KAAK,6BAA6B,EAInC,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;IAE9B,OAAO,CAAC,OAAO,CAAU;gBAEN,EAAE,EAAE,QAAQ;IAKlB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1D,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3D,KAAK,CAChB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,QAAQ,CAAC,GAAG,EACjB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,IAAI,CAAC;IAQH,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhF,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAWlF,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/E,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3D,WAAW,CACtB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,QAAQ,CAAC,GAAG,GAChB,OAAO,CAAC,eAAe,CAAC;IAed,WAAW,CACtB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,QAAQ,CAAC,GAAG,GAChB,OAAO,CAAC,eAAe,CAAC;IAed,iBAAiB,CAC5B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,QAAQ,CAAC,GAAG,EACjB,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,IAAI,CAAC;CAuBjB"}
1
+ {"version":3,"file":"_storage.d.ts","sourceRoot":"","sources":["../../src/_storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EAER,eAAe,EACf,eAAe,EAChB,MAAM,cAAc,CAAC;AAItB,OAAO,EACL,KAAK,6BAA6B,EAInC,MAAM,aAAa,CAAC;AAkBrB,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;IAE9B,OAAO,CAAC,OAAO,CAAU;IAEzB,YAAmB,EAAE,EAAE,QAAQ,EAG9B;IAEY,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CASrE;IAEY,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAQtE;IAEY,KAAK,CAChB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,QAAQ,CAAC,GAAG,EACjB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,IAAI,CAAC,CAMf;IAEY,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ3F;IAEY,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAS7F;IAEY,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1F;IAEY,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtE;IAEY,WAAW,CACtB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,QAAQ,CAAC,GAAG,GAChB,OAAO,CAAC,eAAe,CAAC,CAa1B;IAEY,WAAW,CACtB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,QAAQ,CAAC,GAAG,GAChB,OAAO,CAAC,eAAe,CAAC,CAa1B;IAEY,iBAAiB,CAC5B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,QAAQ,CAAC,GAAG,EACjB,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,IAAI,CAAC,CAsBf;CACF"}
@@ -1,83 +1,92 @@
1
+ import { isReadableStream, isWritableStream } from "./_streams.js";
1
2
  import * as v from "./_valibot.js";
2
3
  import { StorageIsNotOpenError, ReadableStreamNotSupportedError, WritableStreamNotSupportedError, } from "./errors.js";
4
+ /**
5
+ * `ReadableStream` のインターフェースを満たすかを検証するためのスキーマです。
6
+ */
7
+ const ReadableStreamSchema = v.custom(isReadableStream, "Expected a ReadableStream");
8
+ /**
9
+ * `WritableStream` のインターフェースを満たすかを検証するためのスキーマです。
10
+ */
11
+ const WritableStreamSchema = v.custom(isWritableStream, "Expected a WritableStream");
3
12
  export default class UniKvsStorage {
4
13
  constructor(io) {
5
14
  this.io = io;
6
15
  this.managed = false;
7
16
  }
8
- async open(context, signal) {
17
+ async open(vars, signal) {
9
18
  if (typeof this.io.open !== "function") {
10
19
  return;
11
20
  }
12
21
  if (!this.io.isOpen) {
13
22
  this.managed = true;
14
- await this.io.open({ signal, context });
23
+ await this.io.open({ vars, signal });
15
24
  }
16
25
  }
17
- async close(context, signal) {
26
+ async close(vars, signal) {
18
27
  if (typeof this.io.close !== "function") {
19
28
  return;
20
29
  }
21
30
  if (this.io.isOpen && this.managed) {
22
- await this.io.close({ signal, context });
31
+ await this.io.close({ vars, signal });
23
32
  }
24
33
  }
25
- async write(context, signal, key, data) {
34
+ async write(vars, signal, key, data) {
26
35
  if (!this.io.isOpen) {
27
36
  throw new StorageIsNotOpenError({ name: this.io.name });
28
37
  }
29
- await this.io.write({ key, data, signal, context });
38
+ await this.io.write({ key, data, vars, signal });
30
39
  }
31
- async read(context, signal, key) {
40
+ async read(vars, signal, key) {
32
41
  if (!this.io.isOpen) {
33
42
  throw new StorageIsNotOpenError({ name: this.io.name });
34
43
  }
35
- const output = await this.io.read({ key, signal, context });
44
+ const output = await this.io.read({ key, vars, signal });
36
45
  return output;
37
46
  }
38
- async exists(context, signal, key) {
47
+ async exists(vars, signal, key) {
39
48
  if (!this.io.isOpen) {
40
49
  throw new StorageIsNotOpenError({ name: this.io.name });
41
50
  }
42
- const output = await this.io.exists({ key, signal, context });
51
+ const output = await this.io.exists({ key, vars, signal });
43
52
  const parsed = Boolean(output);
44
53
  return parsed;
45
54
  }
46
- async delete(context, signal, key) {
55
+ async delete(vars, signal, key) {
47
56
  if (!this.io.isOpen) {
48
57
  throw new StorageIsNotOpenError({ name: this.io.name });
49
58
  }
50
- await this.io.delete({ key, signal, context });
59
+ await this.io.delete({ key, vars, signal });
51
60
  }
52
- async clear(context, signal) {
61
+ async clear(vars, signal) {
53
62
  if (!this.io.isOpen) {
54
63
  throw new StorageIsNotOpenError({ name: this.io.name });
55
64
  }
56
- await this.io.clear({ signal, context });
65
+ await this.io.clear({ vars, signal });
57
66
  }
58
- async getReadable(context, signal, key) {
67
+ async getReadable(vars, signal, key) {
59
68
  if (!this.io.isOpen) {
60
69
  throw new StorageIsNotOpenError({ name: this.io.name });
61
70
  }
62
71
  if (typeof this.io.getReadable !== "function") {
63
72
  throw new ReadableStreamNotSupportedError({ name: this.io.name });
64
73
  }
65
- const output = await this.io.getReadable({ key, signal, context });
66
- const parsed = v.parseOutput(v.instance(ReadableStream), output);
74
+ const output = await this.io.getReadable({ key, vars, signal });
75
+ const parsed = v.parseOutput(ReadableStreamSchema, output);
67
76
  return parsed;
68
77
  }
69
- async getWritable(context, signal, key) {
78
+ async getWritable(vars, signal, key) {
70
79
  if (!this.io.isOpen) {
71
80
  throw new StorageIsNotOpenError({ name: this.io.name });
72
81
  }
73
82
  if (typeof this.io.getWritable !== "function") {
74
83
  throw new WritableStreamNotSupportedError({ name: this.io.name });
75
84
  }
76
- const output = await this.io.getWritable({ key, signal, context });
77
- const parsed = v.parseOutput(v.instance(WritableStream), output);
85
+ const output = await this.io.getWritable({ key, vars, signal });
86
+ const parsed = v.parseOutput(WritableStreamSchema, output);
78
87
  return parsed;
79
88
  }
80
- async onOtherWriteError(context, signal, key, err) {
89
+ async onOtherWriteError(vars, signal, key, err) {
81
90
  if (!this.io.isOpen) {
82
91
  throw new StorageIsNotOpenError({ name: this.io.name });
83
92
  }
@@ -88,7 +97,7 @@ export default class UniKvsStorage {
88
97
  key,
89
98
  error: err,
90
99
  signal,
91
- context,
100
+ vars,
92
101
  });
93
102
  }
94
103
  }
@@ -0,0 +1,20 @@
1
+ import type { IReadableStream, IWritableStream } from "@unikvs/core";
2
+ /**
3
+ * 値が `ReadableStream` のインターフェースを満たすかどうかを判定します。
4
+ *
5
+ * ランタイムによっては `ReadableStream` クラスを継承せずに同じインターフェースを備えたオブジェクトが存在するため、`instanceof` ではなく必要なメソッドの有無で判定します。
6
+ *
7
+ * @param input 判定する値です。
8
+ * @returns `ReadableStream` のインターフェースを満たす場合は `true` を返します。
9
+ */
10
+ export declare function isReadableStream(input: unknown): input is IReadableStream;
11
+ /**
12
+ * 値が `WritableStream` のインターフェースを満たすかどうかを判定します。
13
+ *
14
+ * ランタイムによっては `WritableStream` クラスを継承せずに同じインターフェースを備えたオブジェクトが存在するため、`instanceof` ではなく必要なメソッドの有無で判定します。
15
+ *
16
+ * @param input 判定する値です。
17
+ * @returns `WritableStream` のインターフェースを満たす場合は `true` を返します。
18
+ */
19
+ export declare function isWritableStream(input: unknown): input is IWritableStream;
20
+ //# sourceMappingURL=_streams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_streams.d.ts","sourceRoot":"","sources":["../../src/_streams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAErE;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAczE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAYzE"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 値が `ReadableStream` のインターフェースを満たすかどうかを判定します。
3
+ *
4
+ * ランタイムによっては `ReadableStream` クラスを継承せずに同じインターフェースを備えたオブジェクトが存在するため、`instanceof` ではなく必要なメソッドの有無で判定します。
5
+ *
6
+ * @param input 判定する値です。
7
+ * @returns `ReadableStream` のインターフェースを満たす場合は `true` を返します。
8
+ */
9
+ export function isReadableStream(input) {
10
+ if (typeof input !== "object" || input === null) {
11
+ return false;
12
+ }
13
+ const stream = input;
14
+ return (typeof stream.getReader === "function" &&
15
+ typeof stream.pipeThrough === "function" &&
16
+ typeof stream.pipeTo === "function" &&
17
+ typeof stream.tee === "function" &&
18
+ typeof stream.cancel === "function");
19
+ }
20
+ /**
21
+ * 値が `WritableStream` のインターフェースを満たすかどうかを判定します。
22
+ *
23
+ * ランタイムによっては `WritableStream` クラスを継承せずに同じインターフェースを備えたオブジェクトが存在するため、`instanceof` ではなく必要なメソッドの有無で判定します。
24
+ *
25
+ * @param input 判定する値です。
26
+ * @returns `WritableStream` のインターフェースを満たす場合は `true` を返します。
27
+ */
28
+ export function isWritableStream(input) {
29
+ if (typeof input !== "object" || input === null) {
30
+ return false;
31
+ }
32
+ const stream = input;
33
+ return (typeof stream.getWriter === "function" &&
34
+ typeof stream.abort === "function" &&
35
+ typeof stream.close === "function");
36
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"_to-value-stream.d.ts","sourceRoot":"","sources":["../../src/_to-value-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,CAAC,EACrC,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC,EAClC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAClC,WAAW,CAAC,CAAC,CAAC,CA0DhB"}
1
+ {"version":3,"file":"_to-value-stream.d.ts","sourceRoot":"","sources":["../../src/_to-value-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,CAAC,EACrC,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC,EAClC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAClC,WAAW,CAAC,CAAC,CAAC,CAiGhB"}
@@ -10,14 +10,44 @@ import logger from "./_logger.js";
10
10
  */
11
11
  export default function toValueStream(readableStream, onAsyncDispose) {
12
12
  const cacheMap = new Map();
13
+ const reader = readableStream.getReader();
13
14
  async function disposeValueStream() {
14
- await callAsyncableFnOnce(cacheMap, "dispose", onAsyncDispose);
15
+ await callAsyncableFnOnce(cacheMap, "dispose", async () => {
16
+ try {
17
+ await reader.cancel();
18
+ }
19
+ catch (ex) {
20
+ logger.error `Failed to cancel the source stream: ${ex}`;
21
+ }
22
+ await onAsyncDispose();
23
+ });
15
24
  }
16
- return Object.assign(
17
- // ReadableStream
18
- readableStream.pipeThrough(new TransformStream({
19
- flush: disposeValueStream,
20
- })),
25
+ // cancel・エラー・早期 break であっても dispose されるように、readable 側のキャンセルを直接フックしたストリームを返します。
26
+ const valueStream = new ReadableStream({
27
+ async pull(controller) {
28
+ try {
29
+ const { done, value } = await reader.read();
30
+ if (done) {
31
+ // ストリームが正常に完了したことも dispose 対象とし、完了を通知する前に破棄を完了させます。
32
+ await disposeValueStream();
33
+ controller.close();
34
+ }
35
+ else {
36
+ controller.enqueue(value);
37
+ }
38
+ }
39
+ catch (ex) {
40
+ // ソースエラー時も dispose (ロック解放など) を行わないと、ストリームを放棄した consumer に対してキーの I/O ロックがリークします。
41
+ // dispose 自体が失敗しても元の例外の伝播を壊さないように、失敗はログに残すだけにします。
42
+ await disposeValueStream().catch((e) => logger.error `Failed to dispose value stream: ${e}`);
43
+ controller.error(ex);
44
+ }
45
+ },
46
+ async cancel() {
47
+ await disposeValueStream();
48
+ },
49
+ });
50
+ const stream = Object.assign(valueStream,
21
51
  // AsyncDisposable
22
52
  {
23
53
  [Symbol.asyncDispose]: disposeValueStream,
@@ -51,6 +81,13 @@ export default function toValueStream(readableStream, onAsyncDispose) {
51
81
  throw ex;
52
82
  }
53
83
  finally {
84
+ // cancel・エラー・早期 break など完了方法に関係なくストリームを破棄し、キーの読み取りロックがリークしないようにします (2 回目以降は no-op)。
85
+ try {
86
+ await disposeValueStream();
87
+ }
88
+ catch (ex) {
89
+ logger.error `Failed to dispose value stream: ${ex}`;
90
+ }
54
91
  // 最後に必ずリーダーのロックを解放し、ストリームを再利用可能な状態にします。
55
92
  try {
56
93
  r.releaseLock();
@@ -61,4 +98,5 @@ export default function toValueStream(readableStream, onAsyncDispose) {
61
98
  }
62
99
  },
63
100
  });
101
+ return stream;
64
102
  }
@@ -1,13 +1,13 @@
1
- import type { Context, IDecodable, ITransformer, IEncodable } from "@unikvs/core";
1
+ import type { Variables, IDecodable, ITransformer, IEncodable } from "@unikvs/core";
2
2
  export default class UniKvsTransformer {
3
3
  private readonly tf;
4
4
  private managed;
5
5
  constructor(tf: ITransformer);
6
- open(context: Context, signal: AbortSignal): Promise<void>;
7
- close(context: Context, signal: AbortSignal): Promise<void>;
8
- encode(context: Context, signal: AbortSignal, data: any): Promise<unknown>;
9
- decode(context: Context, signal: AbortSignal, data: any): Promise<unknown>;
10
- getEncodable(context: Context, signal: AbortSignal): Promise<IEncodable>;
11
- getDecodable(context: Context, signal: AbortSignal): Promise<IDecodable>;
6
+ open(vars: Variables, signal: AbortSignal): Promise<void>;
7
+ close(vars: Variables, signal: AbortSignal): Promise<void>;
8
+ encode(vars: Variables, signal: AbortSignal, data: any): Promise<unknown>;
9
+ decode(vars: Variables, signal: AbortSignal, data: any): Promise<unknown>;
10
+ getEncodable(vars: Variables, signal: AbortSignal): Promise<IEncodable>;
11
+ getDecodable(vars: Variables, signal: AbortSignal): Promise<IDecodable>;
12
12
  }
13
13
  //# sourceMappingURL=_transformer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_transformer.d.ts","sourceRoot":"","sources":["../../src/_transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQlF,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAe;IAElC,OAAO,CAAC,OAAO,CAAU;gBAEN,EAAE,EAAE,YAAY;IAKtB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1D,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3D,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1E,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1E,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAexE,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CActF"}
1
+ {"version":3,"file":"_transformer.d.ts","sourceRoot":"","sources":["../../src/_transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQpF,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAe;IAElC,OAAO,CAAC,OAAO,CAAU;IAEzB,YAAmB,EAAE,EAAE,YAAY,EAGlC;IAEY,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CASrE;IAEY,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAQtE;IAEY,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAQrF;IAEY,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAQrF;IAEY,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAanF;IAEY,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAanF;CACF"}
@@ -4,56 +4,56 @@ export default class UniKvsTransformer {
4
4
  this.tf = tf;
5
5
  this.managed = false;
6
6
  }
7
- async open(context, signal) {
7
+ async open(vars, signal) {
8
8
  if (typeof this.tf.open !== "function") {
9
9
  return;
10
10
  }
11
11
  if (!this.tf.isOpen) {
12
12
  this.managed = true;
13
- await this.tf.open({ signal, context });
13
+ await this.tf.open({ vars, signal });
14
14
  }
15
15
  }
16
- async close(context, signal) {
16
+ async close(vars, signal) {
17
17
  if (typeof this.tf.close !== "function") {
18
18
  return;
19
19
  }
20
20
  if (this.tf.isOpen && this.managed) {
21
- await this.tf.close({ signal, context });
21
+ await this.tf.close({ vars, signal });
22
22
  }
23
23
  }
24
- async encode(context, signal, data) {
24
+ async encode(vars, signal, data) {
25
25
  if (!this.tf.isOpen) {
26
26
  throw new TransformerIsNotOpenError({ name: this.tf.name });
27
27
  }
28
- const output = await this.tf.encode({ data, signal, context });
28
+ const output = await this.tf.encode({ data, vars, signal });
29
29
  return output;
30
30
  }
31
- async decode(context, signal, data) {
31
+ async decode(vars, signal, data) {
32
32
  if (!this.tf.isOpen) {
33
33
  throw new TransformerIsNotOpenError({ name: this.tf.name });
34
34
  }
35
- const output = await this.tf.decode({ data, signal, context });
35
+ const output = await this.tf.decode({ data, vars, signal });
36
36
  return output;
37
37
  }
38
- async getEncodable(context, signal) {
38
+ async getEncodable(vars, signal) {
39
39
  if (!this.tf.isOpen) {
40
40
  throw new TransformerIsNotOpenError({ name: this.tf.name });
41
41
  }
42
42
  if (typeof this.tf.getEncodable !== "function") {
43
43
  throw new EncodableStreamNotSupportedError({ name: this.tf.name });
44
44
  }
45
- const output = await this.tf.getEncodable({ signal, context });
45
+ const output = await this.tf.getEncodable({ vars, signal });
46
46
  const parsed = output; // TODO(tai-kun): 要検証
47
47
  return parsed;
48
48
  }
49
- async getDecodable(context, signal) {
49
+ async getDecodable(vars, signal) {
50
50
  if (!this.tf.isOpen) {
51
51
  throw new TransformerIsNotOpenError({ name: this.tf.name });
52
52
  }
53
53
  if (typeof this.tf.getDecodable !== "function") {
54
54
  throw new DecodableStreamNotSupportedError({ name: this.tf.name });
55
55
  }
56
- const output = await this.tf.getDecodable({ signal, context });
56
+ const output = await this.tf.getDecodable({ vars, signal });
57
57
  const parsed = output; // TODO(tai-kun): 要検証
58
58
  return parsed;
59
59
  }
@@ -1,16 +1,15 @@
1
- import type { ErrorOptions } from "@unikvs/core";
2
1
  import { type InferOutput, safeParse } from "valibot";
3
2
  import { type InvalidInputErrorArgs, type InvalidOutputErrorArgs } from "./errors.js";
4
- export type { InferInput, InferOutput } from "valibot";
5
- export { any, omit, pipe, union, number, string, symbol, unknown, instance, minValue, optional, safeInteger, } from "valibot";
3
+ export type { GenericSchema, InferInput, InferOutput } from "valibot";
4
+ export { any, check, custom, omit, pipe, union, number, string, symbol, unknown, instance, minValue, optional, safeInteger, safeParse, } from "valibot";
6
5
  export { array, tuple, object, record, transform } from "@tai-kun/valibot-extra-lab";
7
6
  type BaseSchema = typeof safeParse extends (schema: infer S, ...args: any) => any ? S : never;
8
- export interface ParseInputErrorConstructor {
9
- new (args: InvalidInputErrorArgs, options?: ErrorOptions): Error;
7
+ export interface IParseInputErrorConstructor {
8
+ new (args: InvalidInputErrorArgs): Error;
10
9
  }
11
- export declare function parseInput<const TSchema extends BaseSchema>(schema: TSchema, value: unknown, Error?: ParseInputErrorConstructor): InferOutput<TSchema>;
10
+ export declare function parseInput<const TSchema extends BaseSchema>(schema: TSchema, value: unknown, Error?: IParseInputErrorConstructor): InferOutput<TSchema>;
12
11
  export interface ParseOutputErrorConstructor {
13
- new (args: InvalidOutputErrorArgs, options?: ErrorOptions): Error;
12
+ new (args: InvalidOutputErrorArgs): Error;
14
13
  }
15
14
  export declare function parseOutput<const TSchema extends BaseSchema>(schema: TSchema, value: unknown, Error?: ParseOutputErrorConstructor): InferOutput<TSchema>;
16
15
  //# sourceMappingURL=_valibot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_valibot.d.ts","sourceRoot":"","sources":["../../src/_valibot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,KAAK,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEtD,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAG5B,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EACL,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,MAAM,EACN,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW,GACZ,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAErF,KAAK,UAAU,GAAG,OAAO,SAAS,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;AAE9F,MAAM,WAAW,0BAA0B;IACzC,KAAK,IAAI,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC;CAClE;AAED,wBAAgB,UAAU,CAAC,KAAK,CAAC,OAAO,SAAS,UAAU,EACzD,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,0BAA8C,GACpD,WAAW,CAAC,OAAO,CAAC,CAStB;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,IAAI,EAAE,sBAAsB,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC;CACnE;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,OAAO,SAAS,UAAU,EAC1D,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,2BAAgD,GACtD,WAAW,CAAC,OAAO,CAAC,CAStB"}
1
+ {"version":3,"file":"_valibot.d.ts","sourceRoot":"","sources":["../../src/_valibot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEtD,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAG5B,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EACL,GAAG,EACH,KAAK,EACL,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,MAAM,EACN,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,SAAS,GACV,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAErF,KAAK,UAAU,GAAG,OAAO,SAAS,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;AAE9F,MAAM,WAAW,2BAA2B;IAC1C,KAAK,IAAI,EAAE,qBAAqB,GAAG,KAAK,CAAC;CAC1C;AAED,wBAAgB,UAAU,CAAC,KAAK,CAAC,OAAO,SAAS,UAAU,EACzD,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,2BAA+C,GACrD,WAAW,CAAC,OAAO,CAAC,CAStB;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,IAAI,EAAE,sBAAsB,GAAG,KAAK,CAAC;CAC3C;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,OAAO,SAAS,UAAU,EAC1D,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,2BAAgD,GACtD,WAAW,CAAC,OAAO,CAAC,CAStB"}
@@ -1,7 +1,7 @@
1
1
  import { tryCaptureStackTrace } from "try-capture-stack-trace";
2
2
  import { safeParse } from "valibot";
3
3
  import { InvalidInputError, InvalidOutputError, } from "./errors.js";
4
- export { any, omit, pipe, union, number, string, symbol, unknown, instance, minValue, optional, safeInteger, } from "valibot";
4
+ export { any, check, custom, omit, pipe, union, number, string, symbol, unknown, instance, minValue, optional, safeInteger, safeParse, } from "valibot";
5
5
  export { array, tuple, object, record, transform } from "@tai-kun/valibot-extra-lab";
6
6
  export function parseInput(schema, value, Error = InvalidInputError) {
7
7
  const result = safeParse(schema, value);