unikvs 0.0.2 → 0.0.4

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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/_combine-signals.d.ts +9 -0
  3. package/dist/src/_combine-signals.d.ts.map +1 -0
  4. package/dist/src/_combine-signals.js +59 -0
  5. package/dist/src/_logger.d.ts +3 -0
  6. package/dist/src/_logger.d.ts.map +1 -0
  7. package/dist/src/_logger.js +3 -0
  8. package/dist/src/_merge-context.d.ts +4 -0
  9. package/dist/src/_merge-context.d.ts.map +1 -0
  10. package/dist/src/_merge-context.js +3 -0
  11. package/dist/src/_storage.d.ts +17 -0
  12. package/dist/src/_storage.d.ts.map +1 -0
  13. package/dist/src/_storage.js +84 -0
  14. package/dist/src/_to-value-stream.d.ts +12 -0
  15. package/dist/src/_to-value-stream.d.ts.map +1 -0
  16. package/dist/src/_to-value-stream.js +53 -0
  17. package/dist/src/_transformer.d.ts +12 -0
  18. package/dist/src/_transformer.d.ts.map +1 -0
  19. package/dist/src/_transformer.js +52 -0
  20. package/dist/src/_valibot.d.ts +13 -0
  21. package/dist/src/_valibot.d.ts.map +1 -0
  22. package/dist/src/_valibot.js +12 -0
  23. package/dist/src/context.types.d.ts +17 -0
  24. package/dist/src/context.types.d.ts.map +1 -0
  25. package/dist/src/context.types.js +1 -0
  26. package/dist/src/errors.d.ts +108 -0
  27. package/dist/src/errors.d.ts.map +1 -0
  28. package/dist/src/errors.js +169 -0
  29. package/dist/src/index.d.ts +10 -0
  30. package/dist/src/index.d.ts.map +1 -0
  31. package/dist/src/index.js +3 -0
  32. package/dist/src/unikvs-config.d.ts +255 -0
  33. package/dist/src/unikvs-config.d.ts.map +1 -0
  34. package/dist/src/unikvs-config.js +105 -0
  35. package/dist/src/unikvs.d.ts +324 -0
  36. package/dist/src/unikvs.d.ts.map +1 -0
  37. package/dist/src/unikvs.js +693 -0
  38. package/dist/src/utils.types.d.ts +7 -0
  39. package/dist/src/utils.types.d.ts.map +1 -0
  40. package/dist/src/utils.types.js +1 -0
  41. package/dist/src/value-stream.types.d.ts +11 -0
  42. package/dist/src/value-stream.types.d.ts.map +1 -0
  43. package/dist/src/value-stream.types.js +1 -0
  44. package/package.json +53 -7
  45. package/src/_combine-signals.ts +67 -0
  46. package/src/_logger.ts +5 -0
  47. package/src/_merge-context.ts +10 -0
  48. package/src/_storage.ts +130 -0
  49. package/src/_to-value-stream.ts +59 -0
  50. package/src/_transformer.ts +75 -0
  51. package/src/_valibot.ts +30 -0
  52. package/src/context.types.ts +19 -0
  53. package/src/errors.ts +382 -0
  54. package/src/index.ts +52 -0
  55. package/src/unikvs-config.ts +429 -0
  56. package/src/unikvs.ts +1171 -0
  57. package/src/utils.types.ts +6 -0
  58. package/src/value-stream.types.ts +14 -0
  59. package/README.md +0 -45
@@ -0,0 +1,429 @@
1
+ import type {
2
+ Context,
3
+ IReadableStreamStorage,
4
+ IStorage,
5
+ IWritableStreamStorage,
6
+ Key,
7
+ IDecodableStreamTransformer,
8
+ IEncodableStreamTransformer,
9
+ ITransformer,
10
+ } from "@unikvs/core";
11
+
12
+ import { UniKvsStorage } from "./_storage.js";
13
+ import UniKvsTransformer from "./_transformer.js";
14
+ import type { ContextSource } from "./context.types.js";
15
+ import { MissingStorageError } from "./errors.js";
16
+ import type UniKvs from "./unikvs.js";
17
+ import type { ValueOf } from "./utils.types.js";
18
+
19
+ /**
20
+ * トランスフォーマーから、デコード時の入力データの型を推論するユーティリティー型です。
21
+ *
22
+ * @template TTransformer 対象となるトランスフォーマーの型です。
23
+ */
24
+ type $InferDecodeDataInput<TTransformer extends ITransformer> =
25
+ TTransformer extends ITransformer<any, infer TDecodeDataInput> ? TDecodeDataInput : never;
26
+
27
+ /**
28
+ * トランスフォーマーから、エンコード時の出力データの型を推論するユーティリティー型です。
29
+ *
30
+ * @template TTransformer 対象となるトランスフォーマーの型です。
31
+ */
32
+ type $InferEncodeDataOutput<TTransformer extends ITransformer> =
33
+ TTransformer extends ITransformer<any, any, infer TEncodeDataOutput> ? TEncodeDataOutput : never;
34
+
35
+ /**
36
+ * トランスフォーマーから、デコードストリームの入力チャンクデータの型を推論するユーティリティー型です。
37
+ *
38
+ * @template TTransformer 対象となるトランスフォーマーの型です。
39
+ */
40
+ type $InferDecodeChunkInput<TTransformer extends ITransformer> =
41
+ TTransformer extends IDecodableStreamTransformer<infer TDecodeChunkInput>
42
+ ? TDecodeChunkInput
43
+ : never;
44
+
45
+ /**
46
+ * トランスフォーマーから、エンコードストリームの出力チャンクデータの型を推論するユーティリティー型です。
47
+ *
48
+ * @template TTransformer 対象となるトランスフォーマーの型です。
49
+ */
50
+ type $InferEncodeChunkOutput<TTransformer extends ITransformer> =
51
+ TTransformer extends IEncodableStreamTransformer<any, infer TEncodeChunkOutput>
52
+ ? TEncodeChunkOutput
53
+ : never;
54
+
55
+ /**
56
+ * ストレージから、書き込みストリームの入力チャンクデータの型を推論するユーティリティー型です。
57
+ *
58
+ * @template TStorage 対象となるストレージの型です。
59
+ */
60
+ type $InferWriteChunkInput<TStorage extends IStorage> =
61
+ TStorage extends IWritableStreamStorage<infer TWriteChunkInput> ? TWriteChunkInput : never;
62
+
63
+ /**
64
+ * ストレージから、読み込みストリームの出力チャンクデータの型を推論するユーティリティー型です。
65
+ *
66
+ * @template TStorage 対象となるストレージの型です。
67
+ */
68
+ type $InferReadChunkOutput<TStorage extends IStorage> =
69
+ TStorage extends IReadableStreamStorage<infer TReadChunkOutput> ? TReadChunkOutput : never;
70
+
71
+ /**
72
+ * プレーンな値を識別するための固有のシンボルです。
73
+ */
74
+ declare const PLAIN_VALUE: unique symbol;
75
+
76
+ /**
77
+ * ストリームではない通常の値を表す型定義です。
78
+ *
79
+ * @template TData 保持するデータの型です。
80
+ */
81
+ export type PlainValue<TData = any> = [Type: typeof PLAIN_VALUE, Data: TData];
82
+
83
+ /**
84
+ * ストリーム形式の値を識別するための固有のシンボルです。
85
+ */
86
+ declare const STREAM_VALUE: unique symbol;
87
+
88
+ /**
89
+ * ストリームとして扱われる値を表す型定義です。
90
+ *
91
+ * @template TChunkData ストリームのチャンクデータの型です。
92
+ */
93
+ export type StreamValue<TChunkData = any> = [Type: typeof STREAM_VALUE, ChunkData: TChunkData];
94
+
95
+ /**
96
+ * UniKvs で扱う値の抽象型です。プレーンな値かストリーム値のいずれかになります。
97
+ *
98
+ * @template TDataAndChunkData データまたはチャンクデータの型です。
99
+ */
100
+ export type Value<TDataAndChunkData = any> =
101
+ | PlainValue<TDataAndChunkData>
102
+ | StreamValue<TDataAndChunkData>;
103
+
104
+ /**
105
+ * キーと値のマッピングを定義するオブジェクトの型です。
106
+ *
107
+ * @template T マッピングされる値の型です。
108
+ */
109
+ export type KeyValueMapping<T = any> = { readonly [key: Key]: Value<T> };
110
+
111
+ /**
112
+ * PlainValue 型から内部のデータ型を抽出します。
113
+ *
114
+ * @template TPlainValue 対象となる PlainValue 型です。
115
+ */
116
+ export type $InferPlainValueData<TPlainValue> =
117
+ TPlainValue extends PlainValue<infer TData> ? TData : never;
118
+
119
+ /**
120
+ * StreamValue 型から内部のチャンクデータ型を抽出します。
121
+ *
122
+ * @template TStremValue 対象となる StreamValue 型です。
123
+ */
124
+ export type $InferStreamValueChunkData<TStremValue> =
125
+ TStremValue extends StreamValue<infer TChunkData> ? TChunkData : never;
126
+
127
+ /**
128
+ * KeyValueMapping から有効なキーの型を抽出します。
129
+ *
130
+ * @template TKeyValueMapping 対象となるマッピング型です。
131
+ */
132
+ export type KeyofKeyValueMapping<TKeyValueMapping extends KeyValueMapping = KeyValueMapping> =
133
+ Extract<keyof TKeyValueMapping, Key>;
134
+
135
+ /**
136
+ * UniKvs の設定を構築するためのビルダーインターフェースです。
137
+ *
138
+ * トランスフォーマーの追加やストレージの登録を型安全に行うための流れるようなインターフェースを提供します。
139
+ *
140
+ * @template TKeyValueMapping キーと値のマッピング型です。
141
+ * @template TUniKvsDataInput UniKvs への入力データの型です。
142
+ * @template TUniKvsDataOutput UniKvs からの出力データの型です。
143
+ * @template TUniKvsChunkInput UniKvs への入力チャンクデータの型です。
144
+ * @template TUniKvsChunkOutput UniKvs からのストリーム出力チャンクデータの型です。
145
+ * @template TLastTransformerDecodeDataInput 最後に適用されたトランスフォーマーのデコード入力データの型です。
146
+ * @template TLastTransformerEncodeDataOutput 最後に適用されたトランスフォーマーのエンコード出力データの型です。
147
+ * @template TLastTransformerDecodeChunkInput 最後に適用されたトランスフォーマーのデコード入力チャンクデータの型です。
148
+ * @template TLastTransformerEncodeChunkOutput 最後に適用されたトランスフォーマーのエンコード出力チャンクデータの型です。
149
+ */
150
+ export interface IUniKvsConfigBuilder<
151
+ TKeyValueMapping extends KeyValueMapping = KeyValueMapping,
152
+ TUniKvsDataInput = ValueOf<{
153
+ [TKey in KeyofKeyValueMapping<TKeyValueMapping>]: $InferPlainValueData<TKeyValueMapping[TKey]>;
154
+ }>,
155
+ TUniKvsDataOutput = TUniKvsDataInput,
156
+ TUniKvsChunkInput = ValueOf<{
157
+ [TKey in KeyofKeyValueMapping<TKeyValueMapping>]: $InferStreamValueChunkData<
158
+ TKeyValueMapping[TKey]
159
+ >;
160
+ }>,
161
+ TUniKvsChunkOutput = TUniKvsChunkInput,
162
+ TLastTransformerDecodeDataInput = TUniKvsDataOutput,
163
+ TLastTransformerEncodeDataOutput = TUniKvsDataInput,
164
+ TLastTransformerDecodeChunkInput = TUniKvsChunkOutput,
165
+ TLastTransformerEncodeChunkOutput = TUniKvsChunkInput,
166
+ > {
167
+ /**
168
+ * コンテキスト情報を設定します。
169
+ *
170
+ * @param context 設定するコンテキストのソースです。
171
+ * @returns インスタンス自身を返します。
172
+ */
173
+ setContext(context: ContextSource): this;
174
+
175
+ /**
176
+ * ストレージをパイプラインの終端に追加します。
177
+ *
178
+ * ストレージが追加されると、設定はファイナライズ段階に移行します。
179
+ *
180
+ * @template TStorage 追加するストレージの型です。
181
+ * @param storage ストレージのインスタンスです。
182
+ * @returns ファイナライザーインターフェースを返します。
183
+ */
184
+ appendStorage<
185
+ TStorage extends IStorage<
186
+ [TLastTransformerEncodeDataOutput] extends [never] ? any : TLastTransformerEncodeDataOutput,
187
+ [TLastTransformerDecodeDataInput] extends [never] ? any : TLastTransformerDecodeDataInput,
188
+ [TLastTransformerEncodeChunkOutput] extends [never] ? any : TLastTransformerEncodeChunkOutput,
189
+ [TLastTransformerDecodeChunkInput] extends [never] ? any : TLastTransformerDecodeChunkInput
190
+ >,
191
+ >(
192
+ storage: TStorage,
193
+ ): IUniKvsConfigFinalizer<
194
+ TKeyValueMapping,
195
+ TLastTransformerEncodeDataOutput,
196
+ TLastTransformerDecodeDataInput,
197
+ [TLastTransformerEncodeChunkOutput] extends [never]
198
+ ? never
199
+ : [$InferWriteChunkInput<TStorage>] extends [never]
200
+ ? never
201
+ : TLastTransformerEncodeChunkOutput,
202
+ [TLastTransformerDecodeChunkInput] extends [never]
203
+ ? never
204
+ : [$InferReadChunkOutput<TStorage>] extends [never]
205
+ ? never
206
+ : TLastTransformerDecodeChunkInput
207
+ >;
208
+
209
+ /**
210
+ * トランスフォーマーをパイプラインに追加します。
211
+ *
212
+ * データ変換の層を積み重ねることで、シリアライズなどの処理を定義できます。
213
+ *
214
+ * @template TTransformer 追加するトランスフォーマーの型です。
215
+ * @param transformer トランスフォーマーのインスタンスです。
216
+ * @returns 新しい型情報を持つビルダーを返します。
217
+ */
218
+ appendTransformer<
219
+ TTransformer extends ITransformer<
220
+ // 最後のトランスファーマーのエンコード出力を、入力値として受け入れられる必要があります。
221
+ [TLastTransformerEncodeDataOutput] extends [never] ? any : TLastTransformerEncodeDataOutput,
222
+ // ここではまだ、後段のトランスフォーマーのデコード出力を気にしません。
223
+ any,
224
+ // ここではまだ、後段のトランスフォーマーのエンコード入力を気にしません。
225
+ any,
226
+ // 最後のトランスフォーマーのデコード入力を出力する必要があります。
227
+ [TLastTransformerDecodeDataInput] extends [never] ? any : TLastTransformerDecodeDataInput,
228
+ // 最後のトランスファーマーのエンコード出力を、入力値として受け入れられる必要があります。
229
+ [TLastTransformerEncodeChunkOutput] extends [never] ? any : TLastTransformerEncodeChunkOutput,
230
+ // ここではまだ、後段のトランスフォーマーのデコード出力を気にしません。
231
+ any,
232
+ // ここではまだ、後段のトランスフォーマーのエンコード入力を気にしません。
233
+ any,
234
+ // 最後のトランスフォーマーのデコード入力を出力する必要があります。
235
+ [TLastTransformerDecodeChunkInput] extends [never] ? any : TLastTransformerDecodeChunkInput
236
+ >,
237
+ >(
238
+ transformer: TTransformer,
239
+ ): IUniKvsConfigBuilder<
240
+ TKeyValueMapping,
241
+ TUniKvsDataInput,
242
+ TUniKvsDataOutput,
243
+ [TUniKvsChunkInput] extends [never]
244
+ ? never
245
+ : [$InferDecodeChunkInput<TTransformer>] extends [never]
246
+ ? never
247
+ : TUniKvsChunkInput,
248
+ [TUniKvsChunkOutput] extends [never]
249
+ ? never
250
+ : [$InferEncodeChunkOutput<TTransformer>] extends [never]
251
+ ? never
252
+ : TUniKvsChunkOutput,
253
+ $InferDecodeDataInput<TTransformer>,
254
+ $InferEncodeDataOutput<TTransformer>,
255
+ $InferDecodeChunkInput<TTransformer>,
256
+ $InferEncodeChunkOutput<TTransformer>
257
+ >;
258
+ }
259
+
260
+ /**
261
+ * UniKvs の設定を完了させるためのファイナライザーインターフェースです。
262
+ *
263
+ * @template TKeyValueMapping キーと値のマッピング型です。
264
+ * @template TWriteDataInput ストレージへの書き込み入力データの型です。
265
+ * @template TReadDataOutput ストレージからの読み込み出力データの型です。
266
+ * @template TWriteChunkInput ストレージへの書き込みチャンクデータの型です。
267
+ * @template TReadChunkOutput ストレージからの読み込みチャンクデータの型です。
268
+ */
269
+ export interface IUniKvsConfigFinalizer<
270
+ TKeyValueMapping extends KeyValueMapping = KeyValueMapping,
271
+ TWriteDataInput = any,
272
+ TReadDataOutput = any,
273
+ TWriteChunkInput = any,
274
+ TReadChunkOutput = any,
275
+ > {
276
+ /**
277
+ * 設定に基づいて UniKvs インスタンスを作成します。
278
+ *
279
+ * @returns 作成された UniKvs のインスタンスです。
280
+ */
281
+ create(): UniKvs<TKeyValueMapping>;
282
+
283
+ /**
284
+ * コンテキスト情報を設定します。
285
+ *
286
+ * @param context 設定するコンテキストのソースです。
287
+ * @returns インスタンス自身を返します。
288
+ */
289
+ setContext(context: ContextSource): this;
290
+
291
+ /**
292
+ * 追加のストレージを登録します。UniKvs は複数のストレージへのマルチキャスト書き込みをサポートします。
293
+ *
294
+ * @template TStorage 追加するストレージの型です。
295
+ * @param storage ストレージのインスタンスです。
296
+ * @returns ファイナライザーインターフェースを返します。
297
+ */
298
+ appendStorage<
299
+ TStorage extends IStorage<
300
+ [TWriteDataInput] extends [never] ? any : TWriteDataInput,
301
+ [TReadDataOutput] extends [never] ? any : TReadDataOutput,
302
+ [TWriteChunkInput] extends [never] ? any : TWriteChunkInput,
303
+ [TReadChunkOutput] extends [never] ? any : TReadChunkOutput
304
+ >,
305
+ >(
306
+ storage: TStorage,
307
+ ): IUniKvsConfigFinalizer<
308
+ TKeyValueMapping,
309
+ TWriteDataInput,
310
+ TReadDataOutput,
311
+ [TWriteChunkInput] extends [never]
312
+ ? never
313
+ : [$InferWriteChunkInput<TStorage>] extends [never]
314
+ ? never
315
+ : TWriteChunkInput,
316
+ [TReadChunkOutput] extends [never]
317
+ ? never
318
+ : [$InferReadChunkOutput<TStorage>] extends [never]
319
+ ? never
320
+ : TReadChunkOutput
321
+ >;
322
+ }
323
+
324
+ /**
325
+ * UniKvs の構成を管理する設定クラスです。
326
+ *
327
+ * ビルダーパターンを用いて、コンテキスト、トランスフォーマー、ストレージの順で設定を積み上げます。
328
+ */
329
+ export default class UniKvsConfig implements IUniKvsConfigBuilder, IUniKvsConfigFinalizer {
330
+ /**
331
+ * UniKvs のコンストラクターです。
332
+ */
333
+ readonly #UniKvs: typeof UniKvs;
334
+
335
+ /**
336
+ * アプリケーションの実行時情報を保持するコンテキストオブジェクトです。
337
+ */
338
+ #context: Context;
339
+
340
+ /**
341
+ * データの永続化先となるストレージのリストです。
342
+ */
343
+ readonly #destinations: IStorage[];
344
+
345
+ /**
346
+ * データを変換するためのトランスフォーマーのリストです。
347
+ */
348
+ readonly #transformers: ITransformer[];
349
+
350
+ /**
351
+ * UniKvsConfig インスタンスを初期化します。
352
+ *
353
+ * @param UniKvsConstructor UniKvs のクラスコンストラクターです。
354
+ */
355
+ public constructor(UniKvsConstructor: typeof UniKvs) {
356
+ this.#UniKvs = UniKvsConstructor;
357
+ this.#context = {};
358
+ this.#destinations = [];
359
+ this.#transformers = [];
360
+ }
361
+
362
+ /**
363
+ * 現在の設定を使用して UniKvs インスタンスを作成します。
364
+ *
365
+ * @returns 作成された UniKvs インスタンスです。
366
+ * @throws ストレージが一つも登録されていない場合にエラーを投げます。
367
+ */
368
+ public create(): UniKvs {
369
+ // 登録されたストレージから先頭の要素を取得します。
370
+ const [dest, ...destinations] = this.#destinations.map((io) => new UniKvsStorage(io));
371
+
372
+ // ストレージが空の場合は UniKvs として機能できないため、例外を投げます。
373
+ if (!dest) {
374
+ throw new MissingStorageError();
375
+ }
376
+
377
+ // コンテキストの参照を切り離すために浅いコピーを作成して UniKvs を初期化します。
378
+ // トランスフォーマーの配列もスライスしてコピーを渡し、内部状態の安全性を確保します。
379
+ return new this.#UniKvs(
380
+ this.#context,
381
+ [dest, ...destinations],
382
+ this.#transformers.map((tf) => new UniKvsTransformer(tf)),
383
+ );
384
+ }
385
+
386
+ /**
387
+ * コンテキスト情報を設定します。既存のコンテキストは上書きされます。
388
+ *
389
+ * @param context 設定するコンテキストのソースデータです。
390
+ * @returns インスタンス自身を返します。
391
+ */
392
+ public setContext(context: ContextSource): this {
393
+ this.#context = Array.isArray(context) ? Object.fromEntries(context) : { ...context };
394
+
395
+ return this;
396
+ }
397
+
398
+ /**
399
+ * ストレージを登録リストに追加します。
400
+ *
401
+ * @param storage 追加するストレージインスタンスです。
402
+ * @returns ファイナライザーとして自身を返します。
403
+ */
404
+ public appendStorage(storage: IStorage): IUniKvsConfigFinalizer {
405
+ this.#destinations.push(storage);
406
+
407
+ return this;
408
+ }
409
+
410
+ /**
411
+ * トランスフォーマーを変換パイプラインに追加します。
412
+ *
413
+ * ストレージが登録された後には追加できない制約があります。
414
+ *
415
+ * @param transformer 追加するトランスフォーマーインスタンスです。
416
+ * @returns ビルダーとして自身を返します。
417
+ * @throws すでにストレージが登録されている状態で呼び出された場合にエラーを投げます。
418
+ */
419
+ public appendTransformer(transformer: ITransformer): IUniKvsConfigBuilder {
420
+ // パイプラインの順序を守るため、終端であるストレージが登録済みでないか確認します。
421
+ if (this.#destinations.length > 0) {
422
+ throw new TransformStreamDefaultController();
423
+ }
424
+
425
+ this.#transformers.push(transformer);
426
+
427
+ return this;
428
+ }
429
+ }