unikvs 0.0.4 → 0.0.6
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/dist/src/_storage.d.ts +9 -9
- package/dist/src/_storage.d.ts.map +1 -1
- package/dist/src/_storage.js +13 -5
- package/dist/src/_transformer.d.ts +2 -2
- package/dist/src/_transformer.d.ts.map +1 -1
- package/dist/src/_transformer.js +10 -4
- package/dist/src/_valibot.d.ts +12 -9
- package/dist/src/_valibot.d.ts.map +1 -1
- package/dist/src/_valibot.js +14 -3
- package/dist/src/errors.d.ts +9 -2
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +25 -15
- package/dist/src/unikvs-config.d.ts +5 -5
- package/dist/src/unikvs-config.d.ts.map +1 -1
- package/dist/src/unikvs-config.js +1 -1
- package/dist/src/unikvs.d.ts +53 -30
- package/dist/src/unikvs.d.ts.map +1 -1
- package/dist/src/unikvs.js +185 -152
- package/package.json +20 -18
- package/src/_storage.ts +30 -13
- package/src/_transformer.ts +16 -6
- package/src/_valibot.ts +48 -10
- package/src/errors.ts +31 -3
- package/src/unikvs-config.ts +5 -8
- package/src/unikvs.ts +323 -309
package/dist/src/unikvs.js
CHANGED
|
@@ -9,14 +9,13 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _UniKvs_con, _UniKvs_context, _UniKvs_destinations, _UniKvs_transformers;
|
|
12
|
+
var _UniKvs_instances, _UniKvs_con, _UniKvs_acSet, _UniKvs_context, _UniKvs_destinations, _UniKvs_transformers, _UniKvs_close;
|
|
13
13
|
import { asyncmux, Asyncmux } from "asyncmux";
|
|
14
|
-
import * as v from "valibot";
|
|
15
14
|
import combineSignals from "./_combine-signals.js";
|
|
16
15
|
import logger from "./_logger.js";
|
|
17
16
|
import mergeContext from "./_merge-context.js";
|
|
18
17
|
import toValueStream from "./_to-value-stream.js";
|
|
19
|
-
import
|
|
18
|
+
import * as v from "./_valibot.js";
|
|
20
19
|
import { KeyNotFoundError, PluginOperationAggregateError, UniKvsIsNotOpenError, UniKvsIsOpenError, } from "./errors.js";
|
|
21
20
|
import UniKvsConfig from "./unikvs-config.js";
|
|
22
21
|
// -------------------------------------------------------------------------------------------------
|
|
@@ -24,18 +23,30 @@ import UniKvsConfig from "./unikvs-config.js";
|
|
|
24
23
|
// スキーマ
|
|
25
24
|
//
|
|
26
25
|
// -------------------------------------------------------------------------------------------------
|
|
27
|
-
const ContextKeySchema = v.
|
|
26
|
+
const ContextKeySchema = v.string();
|
|
28
27
|
const ContextSourceSchema = v.union([
|
|
29
28
|
v.record(v.any(), v.unknown()),
|
|
30
29
|
v.array(v.tuple([ContextKeySchema, v.unknown()])),
|
|
31
30
|
]);
|
|
32
31
|
const OpenOptionsSchema = v.object({
|
|
32
|
+
/**
|
|
33
|
+
* 処理の中断を通知するためのシグナルです。
|
|
34
|
+
*/
|
|
33
35
|
signal: v.optional(v.instance(AbortSignal)),
|
|
36
|
+
/**
|
|
37
|
+
* 実行時のコンテキスト情報です。
|
|
38
|
+
*/
|
|
34
39
|
context: v.optional(ContextSourceSchema),
|
|
35
40
|
});
|
|
36
41
|
const OpenArgsSchema = v.tuple([v.optional(OpenOptionsSchema)]);
|
|
37
42
|
const CloseOptionsSchema = v.object({
|
|
43
|
+
/**
|
|
44
|
+
* 処理の中断を通知するためのシグナルです。
|
|
45
|
+
*/
|
|
38
46
|
signal: v.optional(v.instance(AbortSignal)),
|
|
47
|
+
/**
|
|
48
|
+
* 実行時のコンテキスト情報です。
|
|
49
|
+
*/
|
|
39
50
|
context: v.optional(ContextSourceSchema),
|
|
40
51
|
});
|
|
41
52
|
const CloseArgsSchema = v.tuple([v.optional(CloseOptionsSchema)]);
|
|
@@ -90,7 +101,13 @@ const DeleteArgsSchema = v.union([
|
|
|
90
101
|
v.pipe(v.tuple([DeleteOptionsSchema.entries.key, v.optional(v.omit(DeleteOptionsSchema, ["key"]))]), v.transform(([key, options]) => [{ ...options, key }])),
|
|
91
102
|
]);
|
|
92
103
|
const ClearOptionsSchema = v.object({
|
|
104
|
+
/**
|
|
105
|
+
* 処理の中断を通知するためのシグナルです。
|
|
106
|
+
*/
|
|
93
107
|
signal: v.optional(v.instance(AbortSignal)),
|
|
108
|
+
/**
|
|
109
|
+
* 実行時のコンテキスト情報です。
|
|
110
|
+
*/
|
|
94
111
|
context: v.optional(ContextSourceSchema),
|
|
95
112
|
});
|
|
96
113
|
const ClearArgsSchema = v.tuple([v.optional(ClearOptionsSchema)]);
|
|
@@ -106,7 +123,7 @@ const ioLockRegistry = typeof FinalizationRegistry !== "function"
|
|
|
106
123
|
? null
|
|
107
124
|
: new FinalizationRegistry((lock) => {
|
|
108
125
|
try {
|
|
109
|
-
lock.
|
|
126
|
+
lock.release();
|
|
110
127
|
}
|
|
111
128
|
catch { }
|
|
112
129
|
});
|
|
@@ -155,10 +172,12 @@ export default class UniKvs {
|
|
|
155
172
|
* @param transformers トランスフォーマーのリストです。
|
|
156
173
|
*/
|
|
157
174
|
constructor(context, destinations, transformers) {
|
|
175
|
+
_UniKvs_instances.add(this);
|
|
158
176
|
/**
|
|
159
177
|
* 現在の接続状態です。非接続時は null となります。
|
|
160
178
|
*/
|
|
161
179
|
_UniKvs_con.set(this, void 0);
|
|
180
|
+
_UniKvs_acSet.set(this, void 0);
|
|
162
181
|
/**
|
|
163
182
|
* 基本となる実行コンテキスト情報です。
|
|
164
183
|
*/
|
|
@@ -172,10 +191,8 @@ export default class UniKvs {
|
|
|
172
191
|
*/
|
|
173
192
|
_UniKvs_transformers.set(this, void 0);
|
|
174
193
|
__classPrivateFieldSet(this, _UniKvs_con, null, "f");
|
|
175
|
-
__classPrivateFieldSet(this,
|
|
176
|
-
|
|
177
|
-
"unikvs:instance": this,
|
|
178
|
-
}, "f");
|
|
194
|
+
__classPrivateFieldSet(this, _UniKvs_acSet, new Set(), "f");
|
|
195
|
+
__classPrivateFieldSet(this, _UniKvs_context, { ...context }, "f");
|
|
179
196
|
__classPrivateFieldSet(this, _UniKvs_destinations, destinations, "f");
|
|
180
197
|
__classPrivateFieldSet(this, _UniKvs_transformers, transformers, "f");
|
|
181
198
|
}
|
|
@@ -185,114 +202,131 @@ export default class UniKvs {
|
|
|
185
202
|
* @returns 利用可能である場合は true、そうでない場合は false を返します。
|
|
186
203
|
*/
|
|
187
204
|
get isOpen() {
|
|
188
|
-
return
|
|
205
|
+
return __classPrivateFieldGet(this, _UniKvs_con, "f") !== null;
|
|
189
206
|
}
|
|
190
207
|
async open(...args) {
|
|
191
|
-
if (__classPrivateFieldGet(this, _UniKvs_con, "f")) {
|
|
208
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") !== null) {
|
|
192
209
|
throw new UniKvsIsOpenError();
|
|
193
210
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
211
|
+
const [options = {}] = v.parseInput(OpenArgsSchema, args);
|
|
212
|
+
const { signal: signalOption, context: contextOption } = options;
|
|
213
|
+
const ac = new AbortController();
|
|
214
|
+
const signal = combineSignals([ac.signal, signalOption]);
|
|
215
|
+
const context = mergeContext(__classPrivateFieldGet(this, _UniKvs_context, "f"), contextOption);
|
|
216
|
+
context["unikvs:action"] = "open";
|
|
217
|
+
signal.throwIfAborted();
|
|
218
|
+
__classPrivateFieldGet(this, _UniKvs_acSet, "f").add(ac);
|
|
219
|
+
const dispose = [];
|
|
220
|
+
const lock = await asyncmux(this, signal);
|
|
198
221
|
try {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
const signal = combineSignals([conAc.signal, signalOption]);
|
|
203
|
-
const context = mergeContext(__classPrivateFieldGet(this, _UniKvs_context, "f"), contextOption);
|
|
204
|
-
context["unikvs:action"] = "open";
|
|
222
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") !== null) {
|
|
223
|
+
throw new UniKvsIsOpenError();
|
|
224
|
+
}
|
|
205
225
|
const openFns = [];
|
|
206
|
-
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
226
|
+
// 各ストレージのオープン処理をリストに追加します。
|
|
227
|
+
for (const storage of __classPrivateFieldGet(this, _UniKvs_destinations, "f")) {
|
|
228
|
+
openFns.push([
|
|
229
|
+
async () => {
|
|
230
|
+
await storage.open(context, signal);
|
|
231
|
+
dispose.push(async () => {
|
|
232
|
+
try {
|
|
233
|
+
await storage.close(context, signal);
|
|
234
|
+
}
|
|
235
|
+
catch (ex) {
|
|
236
|
+
logger.error `Failed to close storage: ${ex}`;
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
},
|
|
240
|
+
"storage",
|
|
241
|
+
]);
|
|
242
|
+
}
|
|
243
|
+
// 各トランスフォーマーのオープン処理をリストに追加します。
|
|
244
|
+
for (const transformer of __classPrivateFieldGet(this, _UniKvs_transformers, "f")) {
|
|
245
|
+
openFns.push([
|
|
246
|
+
async () => {
|
|
247
|
+
await transformer.open(context, signal);
|
|
248
|
+
dispose.push(async () => {
|
|
249
|
+
try {
|
|
250
|
+
await transformer.close(context, signal);
|
|
251
|
+
}
|
|
252
|
+
catch (ex) {
|
|
253
|
+
logger.error `Failed to close transformer: ${ex}`;
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
},
|
|
257
|
+
"transformer",
|
|
258
|
+
]);
|
|
259
|
+
}
|
|
260
|
+
// すべての処理を並列に実行し、エラーが発生した場合は集約します。
|
|
261
|
+
const errors = [];
|
|
262
|
+
await Promise.all(openFns.map(async ([f, plugin]) => {
|
|
263
|
+
try {
|
|
264
|
+
await f();
|
|
229
265
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
openFns.push([
|
|
233
|
-
async () => {
|
|
234
|
-
await transformer.open(context, signal);
|
|
235
|
-
dispose.push(async () => {
|
|
236
|
-
try {
|
|
237
|
-
await transformer.close(context, signal);
|
|
238
|
-
}
|
|
239
|
-
catch (ex) {
|
|
240
|
-
logger.error `Failed to close transformer: ${ex}`;
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
},
|
|
244
|
-
"transformer",
|
|
245
|
-
]);
|
|
266
|
+
catch (reason) {
|
|
267
|
+
errors.push({ plugin, reason });
|
|
246
268
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
269
|
+
}));
|
|
270
|
+
if (errors.length > 0) {
|
|
271
|
+
throw new PluginOperationAggregateError({ action: "open", errors });
|
|
272
|
+
}
|
|
273
|
+
__classPrivateFieldSet(this, _UniKvs_con, {
|
|
274
|
+
ac,
|
|
275
|
+
io: new Asyncmux(),
|
|
276
|
+
}, "f");
|
|
277
|
+
}
|
|
278
|
+
catch (ex) {
|
|
279
|
+
if (dispose.length > 0) {
|
|
280
|
+
await Promise.all(dispose.map(async (f) => {
|
|
281
|
+
await f();
|
|
256
282
|
}));
|
|
257
|
-
if (errors.length > 0) {
|
|
258
|
-
throw new PluginOperationAggregateError({ action: "open", errors });
|
|
259
|
-
}
|
|
260
283
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
284
|
+
throw ex;
|
|
285
|
+
}
|
|
286
|
+
finally {
|
|
287
|
+
__classPrivateFieldGet(this, _UniKvs_acSet, "f").delete(ac);
|
|
288
|
+
lock.release();
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
close(...args) {
|
|
292
|
+
try {
|
|
293
|
+
const [options = {}] = v.parseInput(CloseArgsSchema, args);
|
|
294
|
+
const { signal = AbortSignal.timeout(10e3), context: contextOption } = options;
|
|
295
|
+
const context = mergeContext(__classPrivateFieldGet(this, _UniKvs_context, "f"), contextOption);
|
|
296
|
+
context["unikvs:action"] = "close";
|
|
297
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
298
|
+
const acArr = [...__classPrivateFieldGet(this, _UniKvs_acSet, "f")];
|
|
299
|
+
__classPrivateFieldGet(this, _UniKvs_acSet, "f").clear();
|
|
300
|
+
for (const ac of acArr) {
|
|
301
|
+
if (!ac.signal.aborted) {
|
|
302
|
+
ac.abort(new UniKvsIsNotOpenError());
|
|
303
|
+
}
|
|
267
304
|
}
|
|
268
|
-
throw
|
|
305
|
+
throw new UniKvsIsNotOpenError();
|
|
269
306
|
}
|
|
270
|
-
|
|
271
|
-
|
|
307
|
+
const { ac } = __classPrivateFieldGet(this, _UniKvs_con, "f");
|
|
308
|
+
const acArr = [ac, ...__classPrivateFieldGet(this, _UniKvs_acSet, "f")];
|
|
309
|
+
__classPrivateFieldGet(this, _UniKvs_acSet, "f").clear();
|
|
310
|
+
for (const ac of acArr) {
|
|
311
|
+
if (!ac.signal.aborted) {
|
|
312
|
+
ac.abort(new UniKvsIsNotOpenError());
|
|
313
|
+
}
|
|
272
314
|
}
|
|
315
|
+
return __classPrivateFieldGet(this, _UniKvs_instances, "m", _UniKvs_close).call(this, context, signal, __classPrivateFieldGet(this, _UniKvs_con, "f"));
|
|
273
316
|
}
|
|
274
317
|
catch (ex) {
|
|
275
|
-
|
|
276
|
-
throw ex;
|
|
318
|
+
return Promise.reject(ex);
|
|
277
319
|
}
|
|
278
320
|
}
|
|
279
|
-
async
|
|
280
|
-
if (!__classPrivateFieldGet(this, _UniKvs_con, "f")) {
|
|
281
|
-
throw new UniKvsIsNotOpenError();
|
|
282
|
-
}
|
|
283
|
-
const [options = {}] = parse(CloseArgsSchema, args);
|
|
284
|
-
const { signal = AbortSignal.timeout(10e3), context: contextOption } = options;
|
|
285
|
-
const context = mergeContext(__classPrivateFieldGet(this, _UniKvs_context, "f"), contextOption);
|
|
286
|
-
context["unikvs:action"] = "close";
|
|
287
|
-
const { conAc, ioMux } = __classPrivateFieldGet(this, _UniKvs_con, "f");
|
|
288
|
-
conAc.abort(new UniKvsIsNotOpenError()); // 実行中の他の操作をすべて中断させるために signal を発火させます。
|
|
321
|
+
async [(_UniKvs_con = new WeakMap(), _UniKvs_acSet = new WeakMap(), _UniKvs_context = new WeakMap(), _UniKvs_destinations = new WeakMap(), _UniKvs_transformers = new WeakMap(), _UniKvs_instances = new WeakSet(), _UniKvs_close = async function _UniKvs_close(context, signal, con) {
|
|
289
322
|
const lock = await asyncmux(this, signal);
|
|
290
323
|
try {
|
|
291
324
|
// ロック待機中に接続状態が変更されていないか再確認します。
|
|
292
|
-
if (
|
|
325
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") !== con) {
|
|
293
326
|
throw new UniKvsIsNotOpenError();
|
|
294
327
|
}
|
|
295
|
-
const
|
|
328
|
+
const { io } = __classPrivateFieldGet(this, _UniKvs_con, "f");
|
|
329
|
+
const lock = await io.lock({ signal });
|
|
296
330
|
try {
|
|
297
331
|
const closeFns = [];
|
|
298
332
|
// ストレージのクローズ処理を登録します。
|
|
@@ -328,15 +362,14 @@ export default class UniKvs {
|
|
|
328
362
|
}
|
|
329
363
|
}
|
|
330
364
|
finally {
|
|
331
|
-
lock.
|
|
365
|
+
lock.release();
|
|
332
366
|
}
|
|
367
|
+
__classPrivateFieldSet(this, _UniKvs_con, null, "f");
|
|
333
368
|
}
|
|
334
369
|
finally {
|
|
335
|
-
|
|
336
|
-
lock.unlock();
|
|
370
|
+
lock.release();
|
|
337
371
|
}
|
|
338
|
-
}
|
|
339
|
-
async [(_UniKvs_con = new WeakMap(), _UniKvs_context = new WeakMap(), _UniKvs_destinations = new WeakMap(), _UniKvs_transformers = new WeakMap(), Symbol.asyncDispose)]() {
|
|
372
|
+
}, Symbol.asyncDispose)]() {
|
|
340
373
|
if (!this.isOpen) {
|
|
341
374
|
return;
|
|
342
375
|
}
|
|
@@ -345,20 +378,20 @@ export default class UniKvs {
|
|
|
345
378
|
});
|
|
346
379
|
}
|
|
347
380
|
async set(...args) {
|
|
348
|
-
if (
|
|
381
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
349
382
|
throw new UniKvsIsNotOpenError();
|
|
350
383
|
}
|
|
351
|
-
const [options] =
|
|
384
|
+
const [options] = v.parseInput(SetArgsSchema, args);
|
|
352
385
|
const { key, value, signal: signalOption, context: contextOption } = options;
|
|
353
|
-
const {
|
|
354
|
-
const signal = combineSignals([
|
|
386
|
+
const { ac, io } = __classPrivateFieldGet(this, _UniKvs_con, "f");
|
|
387
|
+
const signal = combineSignals([ac.signal, signalOption]);
|
|
355
388
|
const context = mergeContext(__classPrivateFieldGet(this, _UniKvs_context, "f"), contextOption);
|
|
356
389
|
context["unikvs:action"] = "set";
|
|
357
390
|
context["unikvs:key"] = key;
|
|
358
391
|
const lock = await asyncmux(this, signal);
|
|
359
392
|
try {
|
|
360
393
|
// ロック待機中に接続状態が変更されていないか再確認します。
|
|
361
|
-
if (
|
|
394
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
362
395
|
throw new UniKvsIsNotOpenError();
|
|
363
396
|
}
|
|
364
397
|
const errors = [];
|
|
@@ -370,7 +403,7 @@ export default class UniKvs {
|
|
|
370
403
|
const e = await transformer.getEncodable(context, signal);
|
|
371
404
|
data = data.pipeThrough(e);
|
|
372
405
|
}
|
|
373
|
-
const lock = await
|
|
406
|
+
const lock = await io.lock({ key, signal });
|
|
374
407
|
try {
|
|
375
408
|
await Promise.all(__classPrivateFieldGet(this, _UniKvs_destinations, "f").map(async (storage, i) => {
|
|
376
409
|
try {
|
|
@@ -389,7 +422,7 @@ export default class UniKvs {
|
|
|
389
422
|
}));
|
|
390
423
|
}
|
|
391
424
|
finally {
|
|
392
|
-
lock.
|
|
425
|
+
lock.release();
|
|
393
426
|
}
|
|
394
427
|
}
|
|
395
428
|
else {
|
|
@@ -398,7 +431,7 @@ export default class UniKvs {
|
|
|
398
431
|
for (const transformer of __classPrivateFieldGet(this, _UniKvs_transformers, "f")) {
|
|
399
432
|
data = await transformer.encode(context, signal, data);
|
|
400
433
|
}
|
|
401
|
-
const lock = await
|
|
434
|
+
const lock = await io.lock({ key, signal });
|
|
402
435
|
try {
|
|
403
436
|
await Promise.all(__classPrivateFieldGet(this, _UniKvs_destinations, "f").map(async (storage) => {
|
|
404
437
|
try {
|
|
@@ -411,7 +444,7 @@ export default class UniKvs {
|
|
|
411
444
|
}));
|
|
412
445
|
}
|
|
413
446
|
finally {
|
|
414
|
-
lock.
|
|
447
|
+
lock.release();
|
|
415
448
|
}
|
|
416
449
|
}
|
|
417
450
|
// エラーが発生した場合は集約します。
|
|
@@ -442,29 +475,29 @@ export default class UniKvs {
|
|
|
442
475
|
}
|
|
443
476
|
}
|
|
444
477
|
finally {
|
|
445
|
-
lock.
|
|
478
|
+
lock.release();
|
|
446
479
|
}
|
|
447
480
|
}
|
|
448
481
|
async get(...args) {
|
|
449
|
-
if (
|
|
482
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
450
483
|
throw new UniKvsIsNotOpenError();
|
|
451
484
|
}
|
|
452
|
-
const [options] =
|
|
485
|
+
const [options] = v.parseInput(GetArgsSchema, args);
|
|
453
486
|
const { key, signal: signalOption, context: contextOption } = options;
|
|
454
|
-
const {
|
|
455
|
-
const signal = combineSignals([
|
|
487
|
+
const { ac, io } = __classPrivateFieldGet(this, _UniKvs_con, "f");
|
|
488
|
+
const signal = combineSignals([ac.signal, signalOption]);
|
|
456
489
|
const context = mergeContext(__classPrivateFieldGet(this, _UniKvs_context, "f"), contextOption);
|
|
457
490
|
context["unikvs:action"] = "get";
|
|
458
491
|
context["unikvs:key"] = key;
|
|
459
492
|
const lock = await asyncmux.readonly(this, signal);
|
|
460
493
|
try {
|
|
461
494
|
// ロック待機中に接続状態が変更されていないか再確認します。
|
|
462
|
-
if (
|
|
495
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
463
496
|
throw new UniKvsIsNotOpenError();
|
|
464
497
|
}
|
|
465
498
|
const NONE = {};
|
|
466
499
|
let data = NONE;
|
|
467
|
-
const lock = await
|
|
500
|
+
const lock = await io.rLock({ key, signal });
|
|
468
501
|
try {
|
|
469
502
|
// 各ストレージを巡回し、最初に見つかったデータを取得します。
|
|
470
503
|
for (const storage of __classPrivateFieldGet(this, _UniKvs_destinations, "f")) {
|
|
@@ -475,7 +508,7 @@ export default class UniKvs {
|
|
|
475
508
|
}
|
|
476
509
|
}
|
|
477
510
|
finally {
|
|
478
|
-
lock.
|
|
511
|
+
lock.release();
|
|
479
512
|
}
|
|
480
513
|
if (data === NONE) {
|
|
481
514
|
throw new KeyNotFoundError({ key });
|
|
@@ -489,29 +522,29 @@ export default class UniKvs {
|
|
|
489
522
|
return data;
|
|
490
523
|
}
|
|
491
524
|
finally {
|
|
492
|
-
lock.
|
|
525
|
+
lock.release();
|
|
493
526
|
}
|
|
494
527
|
}
|
|
495
528
|
async stream(...args) {
|
|
496
|
-
if (
|
|
529
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
497
530
|
throw new UniKvsIsNotOpenError();
|
|
498
531
|
}
|
|
499
|
-
const [options] =
|
|
532
|
+
const [options] = v.parseInput(StreamArgsSchema, args);
|
|
500
533
|
const { key, signal: signalOption, context: contextOption } = options;
|
|
501
|
-
const {
|
|
502
|
-
const signal = combineSignals([
|
|
534
|
+
const { ac, io } = __classPrivateFieldGet(this, _UniKvs_con, "f");
|
|
535
|
+
const signal = combineSignals([ac.signal, signalOption]);
|
|
503
536
|
const context = mergeContext(__classPrivateFieldGet(this, _UniKvs_context, "f"), contextOption);
|
|
504
537
|
context["unikvs:action"] = "stream";
|
|
505
538
|
context["unikvs:key"] = key;
|
|
506
539
|
const lock = await asyncmux(this, signal);
|
|
507
540
|
try {
|
|
508
541
|
// ロック待機中に接続状態が変更されていないか再確認します。
|
|
509
|
-
if (
|
|
542
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
510
543
|
throw new UniKvsIsNotOpenError();
|
|
511
544
|
}
|
|
512
545
|
const NONE = {};
|
|
513
546
|
let r = NONE;
|
|
514
|
-
const lock = await
|
|
547
|
+
const lock = await io.rLock({ key, signal });
|
|
515
548
|
try {
|
|
516
549
|
// 各ストレージを巡回し、最初に見つかったデータを取得します。
|
|
517
550
|
for (const storage of __classPrivateFieldGet(this, _UniKvs_destinations, "f")) {
|
|
@@ -537,7 +570,7 @@ export default class UniKvs {
|
|
|
537
570
|
}
|
|
538
571
|
catch { }
|
|
539
572
|
try {
|
|
540
|
-
lock.
|
|
573
|
+
lock.release();
|
|
541
574
|
}
|
|
542
575
|
catch { }
|
|
543
576
|
});
|
|
@@ -553,7 +586,7 @@ export default class UniKvs {
|
|
|
553
586
|
}
|
|
554
587
|
catch { }
|
|
555
588
|
try {
|
|
556
|
-
lock.
|
|
589
|
+
lock.release();
|
|
557
590
|
}
|
|
558
591
|
catch { }
|
|
559
592
|
});
|
|
@@ -562,32 +595,32 @@ export default class UniKvs {
|
|
|
562
595
|
return valueStream;
|
|
563
596
|
}
|
|
564
597
|
catch (ex) {
|
|
565
|
-
lock.
|
|
598
|
+
lock.release();
|
|
566
599
|
throw ex;
|
|
567
600
|
}
|
|
568
601
|
}
|
|
569
602
|
finally {
|
|
570
|
-
lock.
|
|
603
|
+
lock.release();
|
|
571
604
|
}
|
|
572
605
|
}
|
|
573
606
|
async has(...args) {
|
|
574
|
-
if (
|
|
607
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
575
608
|
throw new UniKvsIsNotOpenError();
|
|
576
609
|
}
|
|
577
|
-
const [options] =
|
|
610
|
+
const [options] = v.parseInput(HasArgsSchema, args);
|
|
578
611
|
const { key, signal: signalOption, context: contextOption } = options;
|
|
579
|
-
const {
|
|
580
|
-
const signal = combineSignals([
|
|
612
|
+
const { ac, io } = __classPrivateFieldGet(this, _UniKvs_con, "f");
|
|
613
|
+
const signal = combineSignals([ac.signal, signalOption]);
|
|
581
614
|
const context = mergeContext(__classPrivateFieldGet(this, _UniKvs_context, "f"), contextOption);
|
|
582
615
|
context["unikvs:action"] = "has";
|
|
583
616
|
context["unikvs:key"] = key;
|
|
584
617
|
const lock = await asyncmux(this, signal);
|
|
585
618
|
try {
|
|
586
619
|
// ロック待機中に接続状態が変更されていないか再確認します。
|
|
587
|
-
if (
|
|
620
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
588
621
|
throw new UniKvsIsNotOpenError();
|
|
589
622
|
}
|
|
590
|
-
const lock = await
|
|
623
|
+
const lock = await io.rLock({ key, signal });
|
|
591
624
|
try {
|
|
592
625
|
// いずれかのストレージに存在すれば true を返します。
|
|
593
626
|
for (const storage of __classPrivateFieldGet(this, _UniKvs_destinations, "f")) {
|
|
@@ -598,31 +631,31 @@ export default class UniKvs {
|
|
|
598
631
|
return false;
|
|
599
632
|
}
|
|
600
633
|
finally {
|
|
601
|
-
lock.
|
|
634
|
+
lock.release();
|
|
602
635
|
}
|
|
603
636
|
}
|
|
604
637
|
finally {
|
|
605
|
-
lock.
|
|
638
|
+
lock.release();
|
|
606
639
|
}
|
|
607
640
|
}
|
|
608
641
|
async delete(...args) {
|
|
609
|
-
if (
|
|
642
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
610
643
|
throw new UniKvsIsNotOpenError();
|
|
611
644
|
}
|
|
612
|
-
const [options] =
|
|
645
|
+
const [options] = v.parseInput(DeleteArgsSchema, args);
|
|
613
646
|
const { key, signal: signalOption, context: contextOption } = options;
|
|
614
|
-
const {
|
|
615
|
-
const signal = combineSignals([
|
|
647
|
+
const { ac, io } = __classPrivateFieldGet(this, _UniKvs_con, "f");
|
|
648
|
+
const signal = combineSignals([ac.signal, signalOption]);
|
|
616
649
|
const context = mergeContext(__classPrivateFieldGet(this, _UniKvs_context, "f"), contextOption);
|
|
617
650
|
context["unikvs:action"] = "delete";
|
|
618
651
|
context["unikvs:key"] = key;
|
|
619
652
|
const lock = await asyncmux(this, signal);
|
|
620
653
|
try {
|
|
621
654
|
// ロック待機中に接続状態が変更されていないか再確認します。
|
|
622
|
-
if (
|
|
655
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
623
656
|
throw new UniKvsIsNotOpenError();
|
|
624
657
|
}
|
|
625
|
-
const lock = await
|
|
658
|
+
const lock = await io.lock({ key, signal });
|
|
626
659
|
try {
|
|
627
660
|
// すべてのストレージから対象データを削除します。
|
|
628
661
|
// すべての処理を並列に実行し、エラーが発生した場合は集約します。
|
|
@@ -642,30 +675,30 @@ export default class UniKvs {
|
|
|
642
675
|
}
|
|
643
676
|
}
|
|
644
677
|
finally {
|
|
645
|
-
lock.
|
|
678
|
+
lock.release();
|
|
646
679
|
}
|
|
647
680
|
}
|
|
648
681
|
finally {
|
|
649
|
-
lock.
|
|
682
|
+
lock.release();
|
|
650
683
|
}
|
|
651
684
|
}
|
|
652
685
|
async clear(...args) {
|
|
653
|
-
if (
|
|
686
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
654
687
|
throw new UniKvsIsNotOpenError();
|
|
655
688
|
}
|
|
656
|
-
const [options = {}] =
|
|
689
|
+
const [options = {}] = v.parseInput(ClearArgsSchema, args);
|
|
657
690
|
const { signal: signalOption, context: contextOption } = options;
|
|
658
|
-
const {
|
|
659
|
-
const signal = combineSignals([
|
|
691
|
+
const { ac, io } = __classPrivateFieldGet(this, _UniKvs_con, "f");
|
|
692
|
+
const signal = combineSignals([ac.signal, signalOption]);
|
|
660
693
|
const context = mergeContext(__classPrivateFieldGet(this, _UniKvs_context, "f"), contextOption);
|
|
661
694
|
context["unikvs:action"] = "clear";
|
|
662
695
|
const lock = await asyncmux(this, signal);
|
|
663
696
|
try {
|
|
664
697
|
// ロック待機中に接続状態が変更されていないか再確認します。
|
|
665
|
-
if (
|
|
698
|
+
if (__classPrivateFieldGet(this, _UniKvs_con, "f") === null) {
|
|
666
699
|
throw new UniKvsIsNotOpenError();
|
|
667
700
|
}
|
|
668
|
-
const lock = await
|
|
701
|
+
const lock = await io.lock({ signal });
|
|
669
702
|
try {
|
|
670
703
|
// すべてのストレージで一括削除を実行します。
|
|
671
704
|
// すべての処理を並列に実行し、エラーが発生した場合は集約します。
|
|
@@ -683,11 +716,11 @@ export default class UniKvs {
|
|
|
683
716
|
}
|
|
684
717
|
}
|
|
685
718
|
finally {
|
|
686
|
-
lock.
|
|
719
|
+
lock.release();
|
|
687
720
|
}
|
|
688
721
|
}
|
|
689
722
|
finally {
|
|
690
|
-
lock.
|
|
723
|
+
lock.release();
|
|
691
724
|
}
|
|
692
725
|
}
|
|
693
726
|
}
|