@adviser/cement 0.4.66 → 0.4.68
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/cjs/keyed-ng.cjs +1 -0
- package/cjs/keyed-ng.cjs.map +1 -1
- package/cjs/keyed-ng.d.ts +1 -0
- package/cjs/keyed-ng.d.ts.map +1 -1
- package/cjs/resolve-once.cjs +132 -70
- package/cjs/resolve-once.cjs.map +1 -1
- package/cjs/resolve-once.d.ts +26 -8
- package/cjs/resolve-once.d.ts.map +1 -1
- package/cjs/resolve-once.test.cjs +53 -1
- package/cjs/resolve-once.test.cjs.map +1 -1
- package/cjs/version.cjs +1 -1
- package/deno.json +1 -1
- package/esm/keyed-ng.d.ts +1 -0
- package/esm/keyed-ng.d.ts.map +1 -1
- package/esm/keyed-ng.js +1 -0
- package/esm/keyed-ng.js.map +1 -1
- package/esm/resolve-once.d.ts +26 -8
- package/esm/resolve-once.d.ts.map +1 -1
- package/esm/resolve-once.js +132 -70
- package/esm/resolve-once.js.map +1 -1
- package/esm/resolve-once.test.js +53 -1
- package/esm/resolve-once.test.js.map +1 -1
- package/esm/version.js +1 -1
- package/package.json +1 -1
- package/src/keyed-ng.ts +3 -0
- package/src/resolve-once.ts +205 -84
- package/ts/cjs/keyed-ng.d.ts +1 -0
- package/ts/cjs/keyed-ng.d.ts.map +1 -1
- package/ts/cjs/keyed-ng.js +1 -0
- package/ts/cjs/keyed-ng.js.map +1 -1
- package/ts/cjs/resolve-once.d.ts +26 -8
- package/ts/cjs/resolve-once.d.ts.map +1 -1
- package/ts/cjs/resolve-once.js +132 -70
- package/ts/cjs/resolve-once.js.map +1 -1
- package/ts/cjs/resolve-once.test.js +53 -1
- package/ts/cjs/resolve-once.test.js.map +1 -1
- package/ts/cjs/version.js +1 -1
- package/ts/esm/keyed-ng.d.ts +1 -0
- package/ts/esm/keyed-ng.d.ts.map +1 -1
- package/ts/esm/keyed-ng.js +1 -0
- package/ts/esm/keyed-ng.js.map +1 -1
- package/ts/esm/resolve-once.d.ts +26 -8
- package/ts/esm/resolve-once.d.ts.map +1 -1
- package/ts/esm/resolve-once.js +132 -70
- package/ts/esm/resolve-once.js.map +1 -1
- package/ts/esm/resolve-once.test.js +53 -1
- package/ts/esm/resolve-once.test.js.map +1 -1
- package/ts/esm/version.js +1 -1
package/src/resolve-once.ts
CHANGED
|
@@ -182,13 +182,19 @@ export interface ResolveOnceIf<R, CTX = void> {
|
|
|
182
182
|
* @internal
|
|
183
183
|
*/
|
|
184
184
|
export class SyncResolveOnce<T, CTX = void> {
|
|
185
|
-
state: ResolveState = "initial";
|
|
186
|
-
|
|
187
185
|
#value?: T;
|
|
188
186
|
#error?: Error;
|
|
189
187
|
|
|
190
188
|
readonly queueLength = 0;
|
|
191
189
|
|
|
190
|
+
readonly #state: StateInstance;
|
|
191
|
+
readonly #rOnce: ResolveOnce<T, CTX>;
|
|
192
|
+
|
|
193
|
+
constructor(rOnce: ResolveOnce<T, CTX>, state: StateInstance) {
|
|
194
|
+
this.#state = state;
|
|
195
|
+
this.#rOnce = rOnce;
|
|
196
|
+
}
|
|
197
|
+
|
|
192
198
|
/**
|
|
193
199
|
* Gets the cached value if available.
|
|
194
200
|
*/
|
|
@@ -207,12 +213,7 @@ export class SyncResolveOnce<T, CTX = void> {
|
|
|
207
213
|
* Returns true if the function has been executed.
|
|
208
214
|
*/
|
|
209
215
|
get ready(): boolean {
|
|
210
|
-
return this.
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
readonly #ctx?: CTX;
|
|
214
|
-
constructor(ctx?: CTX) {
|
|
215
|
-
this.#ctx = ctx;
|
|
216
|
+
return this.#state.isProcessed();
|
|
216
217
|
}
|
|
217
218
|
|
|
218
219
|
/**
|
|
@@ -224,14 +225,16 @@ export class SyncResolveOnce<T, CTX = void> {
|
|
|
224
225
|
* @throws Error if the function returned a promise (use AsyncResolveOnce instead)
|
|
225
226
|
*/
|
|
226
227
|
resolve(fn: (ctx?: CTX) => T): T {
|
|
227
|
-
if (this.
|
|
228
|
-
this.state = "processed";
|
|
228
|
+
if (this.#state.isProcessing()) {
|
|
229
229
|
try {
|
|
230
|
-
this.#value = fn(this.#
|
|
230
|
+
this.#value = fn(this.#rOnce._ctx);
|
|
231
231
|
} catch (e) {
|
|
232
232
|
this.#error = e as Error;
|
|
233
|
+
} finally {
|
|
234
|
+
this.#state.setProcessed();
|
|
235
|
+
this.#rOnce.setProcessed(this.#state);
|
|
233
236
|
}
|
|
234
|
-
if (isPromise(this
|
|
237
|
+
if (isPromise(this.#value)) {
|
|
235
238
|
throw new Error("SyncResolveOnce.once fn returned a promise");
|
|
236
239
|
}
|
|
237
240
|
}
|
|
@@ -248,10 +251,10 @@ export class SyncResolveOnce<T, CTX = void> {
|
|
|
248
251
|
* @returns The result if fn provided, undefined otherwise
|
|
249
252
|
*/
|
|
250
253
|
reset(fn?: (c?: CTX) => T): T | undefined {
|
|
251
|
-
this.state = "initial";
|
|
252
254
|
this.#value = undefined;
|
|
253
255
|
this.#error = undefined;
|
|
254
256
|
if (fn) {
|
|
257
|
+
this.#state.setProcessing();
|
|
255
258
|
return this.resolve(fn);
|
|
256
259
|
}
|
|
257
260
|
return undefined as T;
|
|
@@ -263,15 +266,18 @@ export class SyncResolveOnce<T, CTX = void> {
|
|
|
263
266
|
* Handles queuing of multiple concurrent requests for the same async operation.
|
|
264
267
|
* @internal
|
|
265
268
|
*/
|
|
266
|
-
class AsyncResolveItem<T> {
|
|
267
|
-
readonly id = Math.random();
|
|
268
|
-
#state: ResolveState = "initial";
|
|
269
|
+
class AsyncResolveItem<T, CTX> {
|
|
270
|
+
readonly id: number = Math.random();
|
|
269
271
|
readonly #toResolve: Promise<UnPromisify<T>>;
|
|
270
272
|
#value: Option<UnPromisify<T>> = Option.None();
|
|
271
273
|
#error?: Error;
|
|
274
|
+
readonly #state: StateInstance;
|
|
275
|
+
readonly #rOnce: ResolveOnce<T, CTX>;
|
|
272
276
|
|
|
273
|
-
constructor(fn: Promise<UnPromisify<T
|
|
277
|
+
constructor(fn: Promise<UnPromisify<T>>, rOnce: ResolveOnce<T, CTX>, state: StateInstance) {
|
|
274
278
|
this.#toResolve = fn;
|
|
279
|
+
this.#state = state;
|
|
280
|
+
this.#rOnce = rOnce;
|
|
275
281
|
}
|
|
276
282
|
|
|
277
283
|
get value(): UnPromisify<T> | undefined {
|
|
@@ -292,7 +298,7 @@ class AsyncResolveItem<T> {
|
|
|
292
298
|
* Returns true if this item has completed and has no pending futures.
|
|
293
299
|
*/
|
|
294
300
|
isDisposable(): boolean {
|
|
295
|
-
return this.#state
|
|
301
|
+
return this.#state.isProcessed() && this.#queue.length === 0;
|
|
296
302
|
}
|
|
297
303
|
|
|
298
304
|
#resolveFuture(future?: Future<UnPromisify<T>>): void {
|
|
@@ -315,15 +321,14 @@ class AsyncResolveItem<T> {
|
|
|
315
321
|
if (this.#value.IsSome()) {
|
|
316
322
|
return Promise.resolve(this.#value.Unwrap());
|
|
317
323
|
}
|
|
318
|
-
throw new Error(
|
|
324
|
+
throw new Error(`AsyncResolveItem.#promiseResult impossible: ${this.#state.getResolveState()}`);
|
|
319
325
|
}
|
|
320
326
|
|
|
321
327
|
/**
|
|
322
328
|
* Resolves the async operation, queuing the request if already in progress.
|
|
323
329
|
*/
|
|
324
330
|
resolve(): T {
|
|
325
|
-
if (this.#state
|
|
326
|
-
this.#state = "waiting";
|
|
331
|
+
if (this.#state.isWaiting()) {
|
|
327
332
|
const future = new Future<UnPromisify<T>>();
|
|
328
333
|
this.#queue.push(future);
|
|
329
334
|
this.#toResolve
|
|
@@ -334,22 +339,24 @@ class AsyncResolveItem<T> {
|
|
|
334
339
|
this.#error = e as Error;
|
|
335
340
|
})
|
|
336
341
|
.finally(() => {
|
|
337
|
-
this.#state
|
|
342
|
+
this.#state.setProcessed();
|
|
343
|
+
this.#rOnce.setProcessed(this.#state);
|
|
338
344
|
while (this.#queue.length > 0) {
|
|
339
345
|
this.#resolveFuture(this.#queue.shift());
|
|
340
346
|
}
|
|
341
347
|
});
|
|
342
348
|
return future.asPromise() as T;
|
|
343
349
|
}
|
|
344
|
-
|
|
350
|
+
|
|
351
|
+
if (this.#state.isProcessed()) {
|
|
345
352
|
return this.#promiseResult() as T;
|
|
346
353
|
}
|
|
347
|
-
if (this.#state
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
}
|
|
352
|
-
throw new Error(
|
|
354
|
+
// if (this.#state.isWaiting()) {
|
|
355
|
+
// const future = new Future<UnPromisify<T>>();
|
|
356
|
+
// this.#queue.push(future);
|
|
357
|
+
// return future.asPromise() as T;
|
|
358
|
+
// }
|
|
359
|
+
throw new Error(`AsyncResolveItem.resolve impossible: ${this.#state.getResolveState()}`);
|
|
353
360
|
}
|
|
354
361
|
}
|
|
355
362
|
|
|
@@ -364,17 +371,30 @@ class AsyncResolveItem<T> {
|
|
|
364
371
|
* @template CTX - Optional context type
|
|
365
372
|
* @internal
|
|
366
373
|
*/
|
|
367
|
-
export class AsyncResolveOnce<T, CTX = void> {
|
|
368
|
-
state: ResolveState = "initial";
|
|
369
374
|
|
|
370
|
-
|
|
375
|
+
function isAsyncResolveOnce<T, CTX>(obj: SyncOrAsync<T, CTX>): obj is Option<AsyncResolveOnce<T, CTX>> {
|
|
376
|
+
return obj.IsSome() && obj.Unwrap() instanceof AsyncResolveOnce;
|
|
377
|
+
}
|
|
371
378
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
379
|
+
export class AsyncResolveOnce<T, CTX = void> {
|
|
380
|
+
// #state: ResolveState = "initial";
|
|
381
|
+
readonly #state: StateInstance;
|
|
382
|
+
|
|
383
|
+
readonly #queue: AsyncResolveItem<T, CTX>[];
|
|
384
|
+
|
|
385
|
+
readonly #rOnce: ResolveOnce<T, CTX>;
|
|
386
|
+
//readonly #ctx?: CTX;
|
|
387
|
+
constructor(rOnce: ResolveOnce<T, CTX>, state: StateInstance, prev: SyncOrAsync<T, CTX>) {
|
|
388
|
+
this.#state = state;
|
|
389
|
+
this.#rOnce = rOnce;
|
|
390
|
+
if (isAsyncResolveOnce(prev)) {
|
|
391
|
+
this.#queue = [...prev.unwrap().#queue];
|
|
392
|
+
} else {
|
|
393
|
+
this.#queue = [];
|
|
394
|
+
}
|
|
375
395
|
}
|
|
376
396
|
|
|
377
|
-
#active(): AsyncResolveItem<T> {
|
|
397
|
+
#active(): AsyncResolveItem<T, CTX> {
|
|
378
398
|
const r = this.#queue[this.#queue.length - 1];
|
|
379
399
|
if (!r) {
|
|
380
400
|
throw new Error("AsyncResolveOnce.#active impossible");
|
|
@@ -389,18 +409,11 @@ export class AsyncResolveOnce<T, CTX = void> {
|
|
|
389
409
|
return this.#queue.reduce((acc, r) => acc + r.queuelength, this.#queue.length);
|
|
390
410
|
}
|
|
391
411
|
|
|
392
|
-
/**
|
|
393
|
-
* Returns true if the async operation has started.
|
|
394
|
-
*/
|
|
395
|
-
get ready(): boolean {
|
|
396
|
-
return this.state !== "initial";
|
|
397
|
-
}
|
|
398
|
-
|
|
399
412
|
/**
|
|
400
413
|
* Gets the cached resolved value if available.
|
|
401
414
|
*/
|
|
402
415
|
get value(): UnPromisify<T> | undefined {
|
|
403
|
-
if (this.
|
|
416
|
+
if (this.#state.isInitial()) {
|
|
404
417
|
return undefined;
|
|
405
418
|
}
|
|
406
419
|
return this.#active().value;
|
|
@@ -410,7 +423,7 @@ export class AsyncResolveOnce<T, CTX = void> {
|
|
|
410
423
|
* Gets the cached error if one occurred.
|
|
411
424
|
*/
|
|
412
425
|
get error(): Error | undefined {
|
|
413
|
-
if (this.
|
|
426
|
+
if (this.#state.isInitial()) {
|
|
414
427
|
return undefined;
|
|
415
428
|
}
|
|
416
429
|
return this.#active().error;
|
|
@@ -424,11 +437,11 @@ export class AsyncResolveOnce<T, CTX = void> {
|
|
|
424
437
|
* @returns A promise that resolves to the function's result
|
|
425
438
|
*/
|
|
426
439
|
resolve(fn: (ctx?: CTX) => T): T {
|
|
427
|
-
if (this.
|
|
428
|
-
this.
|
|
440
|
+
if (this.#state.isProcessing()) {
|
|
441
|
+
this.#state.setWaiting();
|
|
429
442
|
let promiseResult: Promise<UnPromisify<T>>;
|
|
430
443
|
try {
|
|
431
|
-
const couldBePromise = fn(this.#
|
|
444
|
+
const couldBePromise = fn(this.#rOnce._ctx);
|
|
432
445
|
if (!isPromise(couldBePromise)) {
|
|
433
446
|
promiseResult = Promise.resolve(couldBePromise as UnPromisify<T>);
|
|
434
447
|
} else {
|
|
@@ -437,7 +450,7 @@ export class AsyncResolveOnce<T, CTX = void> {
|
|
|
437
450
|
} catch (e) {
|
|
438
451
|
promiseResult = Promise.reject(e as Error);
|
|
439
452
|
}
|
|
440
|
-
this.#queue.push(new AsyncResolveItem(promiseResult));
|
|
453
|
+
this.#queue.push(new AsyncResolveItem<T, CTX>(promiseResult, this.#rOnce, this.#state));
|
|
441
454
|
}
|
|
442
455
|
// remove all disposable items
|
|
443
456
|
this.#queue
|
|
@@ -457,7 +470,7 @@ export class AsyncResolveOnce<T, CTX = void> {
|
|
|
457
470
|
* @returns The result if fn provided, undefined otherwise
|
|
458
471
|
*/
|
|
459
472
|
reset(fn?: (c?: CTX) => T): T {
|
|
460
|
-
this.
|
|
473
|
+
this.#state.setProcessing();
|
|
461
474
|
if (fn) {
|
|
462
475
|
return this.resolve(fn);
|
|
463
476
|
}
|
|
@@ -489,91 +502,187 @@ export class AsyncResolveOnce<T, CTX = void> {
|
|
|
489
502
|
* expensiveOp.reset();
|
|
490
503
|
* ```
|
|
491
504
|
*/
|
|
492
|
-
|
|
505
|
+
|
|
506
|
+
export interface ResolveOnceOpts {
|
|
507
|
+
readonly resetAfter?: number; // milliseconds after which to reset the cached value
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
class StateInstance {
|
|
511
|
+
readonly id: number = Math.random();
|
|
493
512
|
#state: ResolveState = "initial";
|
|
494
513
|
|
|
495
|
-
|
|
514
|
+
// get state(): ResolveState {
|
|
515
|
+
// return this.#state;
|
|
516
|
+
// }
|
|
517
|
+
getResolveState(): ResolveState {
|
|
518
|
+
return this.#state;
|
|
519
|
+
}
|
|
496
520
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
521
|
+
isInitial(): boolean {
|
|
522
|
+
return this.#state === "initial";
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
isProcessed(): boolean {
|
|
526
|
+
return this.#state === "processed";
|
|
527
|
+
}
|
|
528
|
+
setProcessed(): void {
|
|
529
|
+
this.#state = "processed";
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
isProcessing(): boolean {
|
|
533
|
+
return this.#state === "processing";
|
|
534
|
+
}
|
|
535
|
+
setProcessing(): void {
|
|
536
|
+
this.#state = "processing";
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
isWaiting(): boolean {
|
|
540
|
+
return this.#state === "waiting";
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
setWaiting(): void {
|
|
544
|
+
this.#state = "waiting";
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
equals(other: StateInstance): boolean {
|
|
548
|
+
return this.id === other.id;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
type SyncOrAsync<T, CTX> = Option<SyncResolveOnce<T, CTX> | AsyncResolveOnce<T, CTX>>;
|
|
553
|
+
|
|
554
|
+
export class ResolveOnce<T, CTX = void> implements ResolveOnceIf<T, CTX> {
|
|
555
|
+
#state = new StateInstance();
|
|
556
|
+
|
|
557
|
+
#syncOrAsync: SyncOrAsync<T, CTX> = Option.None();
|
|
558
|
+
|
|
559
|
+
readonly #opts: ResolveOnceOpts;
|
|
560
|
+
resetAfterTimer?: ReturnType<typeof setTimeout>;
|
|
561
|
+
|
|
562
|
+
readonly _ctx?: CTX;
|
|
563
|
+
constructor(ctx?: CTX, opts?: ResolveOnceOpts) {
|
|
564
|
+
this._ctx = ctx;
|
|
565
|
+
this.#opts = opts ?? {};
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
get state(): ResolveState {
|
|
569
|
+
return this.#state.getResolveState();
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// activeState(state: StateInstance): StateInstance | undefined {
|
|
573
|
+
// if (this.#state.equals(state)) {
|
|
574
|
+
// return this.#state;
|
|
575
|
+
// }
|
|
576
|
+
// return undefined;
|
|
577
|
+
// }
|
|
578
|
+
|
|
579
|
+
setProcessed(state: StateInstance): void {
|
|
580
|
+
if (this.resetAfterTimer) {
|
|
581
|
+
clearTimeout(this.resetAfterTimer);
|
|
582
|
+
}
|
|
583
|
+
if (this.#state.equals(state)) {
|
|
584
|
+
this.#state.setProcessed();
|
|
585
|
+
if (typeof this.#opts.resetAfter === "number" && this.#opts.resetAfter > 0) {
|
|
586
|
+
this.resetAfterTimer = setTimeout(() => {
|
|
587
|
+
this.reset();
|
|
588
|
+
}, this.#opts.resetAfter);
|
|
589
|
+
}
|
|
590
|
+
}
|
|
500
591
|
}
|
|
501
592
|
|
|
502
593
|
get ready(): boolean {
|
|
503
|
-
return this.#state
|
|
594
|
+
return !this.#state.isInitial();
|
|
504
595
|
}
|
|
505
596
|
|
|
506
597
|
get value(): UnPromisify<T> | undefined {
|
|
507
|
-
if (this.#state
|
|
598
|
+
if (this.#state.isInitial()) {
|
|
508
599
|
return undefined;
|
|
509
600
|
}
|
|
510
601
|
return this.#syncOrAsync.Unwrap().value as UnPromisify<T>;
|
|
511
602
|
}
|
|
512
603
|
|
|
513
604
|
get queueLength(): number {
|
|
514
|
-
if (this.#state
|
|
605
|
+
if (this.#state.isInitial()) {
|
|
515
606
|
return 0;
|
|
516
607
|
}
|
|
517
608
|
return this.#syncOrAsync.Unwrap().queueLength;
|
|
518
609
|
}
|
|
519
610
|
|
|
520
611
|
get error(): Error | undefined {
|
|
521
|
-
if (this.#state
|
|
612
|
+
if (this.#state.isInitial()) {
|
|
522
613
|
return undefined;
|
|
523
614
|
}
|
|
524
615
|
return this.#syncOrAsync.Unwrap().error;
|
|
525
616
|
}
|
|
526
617
|
|
|
527
|
-
get state(): ResolveState {
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
618
|
+
// get state(): ResolveState {
|
|
619
|
+
// return this.#state;
|
|
620
|
+
// }
|
|
621
|
+
// set state(value: ResolveState) {
|
|
622
|
+
// console.log(`ResolveOnce.state ${this.#state} -> ${value}`);
|
|
623
|
+
// if (value === "processed") {
|
|
624
|
+
// if (this.resetAfterTimer) {
|
|
625
|
+
// clearTimeout(this.resetAfterTimer);
|
|
626
|
+
// }
|
|
627
|
+
// if (typeof this.#opts.resetAfter === "number" && this.#opts.resetAfter > 0) {
|
|
628
|
+
// console.log("setting reset timer for", this.#opts.resetAfter);
|
|
629
|
+
// this.resetAfterTimer = setTimeout(() => {
|
|
630
|
+
// console.log("resetting after", this.#opts.resetAfter);
|
|
631
|
+
// this.reset();
|
|
632
|
+
// }, this.#opts.resetAfter);
|
|
633
|
+
// }
|
|
634
|
+
// }
|
|
635
|
+
// this.#state = value;
|
|
636
|
+
// }
|
|
533
637
|
|
|
534
638
|
once<R>(fn: (c: CTX) => R): ResultOnce<R> {
|
|
535
639
|
let resultFn: (ctx: CTX) => R;
|
|
536
|
-
if (this.#state
|
|
537
|
-
|
|
640
|
+
if (this.#state.isInitial()) {
|
|
641
|
+
const state = this.#state;
|
|
538
642
|
try {
|
|
643
|
+
state.setProcessing();
|
|
539
644
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
|
540
|
-
const isSyncOrAsync = fn(this
|
|
645
|
+
const isSyncOrAsync = fn(this._ctx ?? ({} as CTX)) as R;
|
|
541
646
|
if (isPromise(isSyncOrAsync)) {
|
|
542
|
-
this.#syncOrAsync = Option.Some(new AsyncResolveOnce<
|
|
647
|
+
this.#syncOrAsync = Option.Some(new AsyncResolveOnce<T, CTX>(this, state, this.#syncOrAsync));
|
|
543
648
|
} else {
|
|
544
|
-
this.#syncOrAsync = Option.Some(new SyncResolveOnce<
|
|
649
|
+
this.#syncOrAsync = Option.Some(new SyncResolveOnce<T, CTX>(this, state));
|
|
545
650
|
}
|
|
546
651
|
resultFn = (): R => isSyncOrAsync;
|
|
547
652
|
} catch (e) {
|
|
548
|
-
this.#syncOrAsync = Option.Some(new SyncResolveOnce<
|
|
653
|
+
this.#syncOrAsync = Option.Some(new SyncResolveOnce<T, CTX>(this, state));
|
|
549
654
|
resultFn = (): R => {
|
|
550
655
|
throw e;
|
|
551
656
|
};
|
|
552
|
-
} finally {
|
|
553
|
-
this.#state = "processed";
|
|
554
657
|
}
|
|
555
658
|
} else {
|
|
556
659
|
resultFn = fn;
|
|
557
660
|
}
|
|
558
661
|
if (!this.#syncOrAsync) {
|
|
559
|
-
throw new Error(
|
|
662
|
+
throw new Error(`ResolveOnce.once impossible: state=${this.#state.getResolveState()}`);
|
|
560
663
|
}
|
|
561
664
|
return this.#syncOrAsync.Unwrap().resolve(resultFn as (c?: CTX) => never) as ResultOnce<R>;
|
|
562
665
|
}
|
|
563
666
|
|
|
564
667
|
reset<R>(fn?: (c: CTX) => R): ResultOnce<R> {
|
|
565
|
-
if (this.#state
|
|
668
|
+
if (this.#state.isInitial()) {
|
|
566
669
|
if (!fn) {
|
|
567
670
|
return undefined as ResultOnce<R>;
|
|
568
671
|
}
|
|
569
672
|
return this.once(fn as (c: CTX) => R);
|
|
570
673
|
}
|
|
571
|
-
if (this.#state
|
|
674
|
+
if (this.#state.isProcessing()) {
|
|
572
675
|
// eslint-disable-next-line no-console
|
|
573
676
|
console.warn("ResolveOnce.reset dropped was called while processing");
|
|
574
677
|
return undefined as ResultOnce<R>;
|
|
575
678
|
}
|
|
576
|
-
|
|
679
|
+
let ret = undefined as ResultOnce<R>;
|
|
680
|
+
this.#state = new StateInstance();
|
|
681
|
+
if (fn) {
|
|
682
|
+
ret = this.once(fn as (c: CTX) => R);
|
|
683
|
+
// ret = this.#syncOrAsync.Unwrap().reset(fn as (c?: CTX) => never) as ResultOnce<R>
|
|
684
|
+
}
|
|
685
|
+
return ret;
|
|
577
686
|
}
|
|
578
687
|
}
|
|
579
688
|
|
|
@@ -703,10 +812,15 @@ export class KeyedResolvOnce<T extends WithOptionalReset<PT>, K = string, CTX ex
|
|
|
703
812
|
createValue: (
|
|
704
813
|
item: KeyedNgItem<K, ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, CTX>,
|
|
705
814
|
): ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>> => {
|
|
706
|
-
return new ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>(
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
815
|
+
return new ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>(
|
|
816
|
+
{
|
|
817
|
+
...item,
|
|
818
|
+
ctx: kp.ctx ?? item.ctx,
|
|
819
|
+
},
|
|
820
|
+
{
|
|
821
|
+
resetAfter: kp.resetAfter,
|
|
822
|
+
},
|
|
823
|
+
);
|
|
710
824
|
},
|
|
711
825
|
key2string: kp.key2string,
|
|
712
826
|
ctx: kp.ctx as CTX,
|
|
@@ -998,8 +1112,11 @@ export class KeyedResolvSeq<
|
|
|
998
1112
|
* @internal
|
|
999
1113
|
*/
|
|
1000
1114
|
class LazyContainer<T> {
|
|
1001
|
-
readonly resolveOnce
|
|
1115
|
+
readonly resolveOnce: ResolveOnce<T>;
|
|
1002
1116
|
|
|
1117
|
+
constructor(opts?: ResolveOnceOpts) {
|
|
1118
|
+
this.resolveOnce = new ResolveOnce<T>(undefined, opts);
|
|
1119
|
+
}
|
|
1003
1120
|
call<Args extends readonly unknown[], Return>(fn: (...args: Args) => Return): () => Return {
|
|
1004
1121
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-explicit-any
|
|
1005
1122
|
return (...args: Args) => this.resolveOnce.once(() => fn(...args) as any) as unknown as Return;
|
|
@@ -1029,7 +1146,11 @@ class LazyContainer<T> {
|
|
|
1029
1146
|
* getConfig(); // Returns cached config without logging
|
|
1030
1147
|
* ```
|
|
1031
1148
|
*/
|
|
1032
|
-
|
|
1033
|
-
|
|
1149
|
+
|
|
1150
|
+
export function Lazy<Args extends readonly unknown[], Return>(
|
|
1151
|
+
fn: (...args: Args) => Return,
|
|
1152
|
+
opts?: ResolveOnceOpts,
|
|
1153
|
+
): (...args: Args) => Return {
|
|
1154
|
+
const lazy = new LazyContainer<Return>(opts);
|
|
1034
1155
|
return lazy.call(fn);
|
|
1035
1156
|
}
|
package/ts/cjs/keyed-ng.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ export interface KeyedNgOptions<K, V, CTX> {
|
|
|
22
22
|
readonly createValue: (keyItem: KeyedNgItem<K, V, CTX>) => V;
|
|
23
23
|
readonly key2string?: (key: K) => string;
|
|
24
24
|
readonly ctx?: CTX;
|
|
25
|
+
readonly resetAfter?: number;
|
|
25
26
|
readonly lru?: Partial<LRUParam<unknown, string>>;
|
|
26
27
|
}
|
|
27
28
|
export interface KeyedNgItem<K, V, CTX> {
|
package/ts/cjs/keyed-ng.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyed-ng.d.ts","sourceRoot":"","sources":["../../../src/keyed-ng.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,QAAQ,EAAU,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAsB7D,MAAM,WAAW,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,GAAG,GAAG,OAAO;IAOzD,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC;IAQ1C,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC;IAO7C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAQ9D,QAAQ,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAU5C,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IAE3B,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAQrC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC;IAOjC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;IAOrB,MAAM,IAAI,IAAI,EAAE,CAAC;IAOjB,IAAI,IAAI,CAAC,EAAE,CAAC;IAOZ,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAElD,OAAO,IAAI,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;CACrC;AAiBD,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,CAAC,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,OAAO,CAAA;CAAE,CAAC;AAmBxG,MAAM,WAAW,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG;IAUvC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAc7D,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IAOzC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"keyed-ng.d.ts","sourceRoot":"","sources":["../../../src/keyed-ng.ts"],"names":[],"mappings":"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"}
|
package/ts/cjs/keyed-ng.js
CHANGED
package/ts/cjs/keyed-ng.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyed-ng.js","sourceRoot":"","sources":["../../../src/keyed-ng.ts"],"names":[],"mappings":";;;AAwBA,qDAA6D;AAC7D,+DAA0D;
|
|
1
|
+
{"version":3,"file":"keyed-ng.js","sourceRoot":"","sources":["../../../src/keyed-ng.ts"],"names":[],"mappings":"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"}
|
package/ts/cjs/resolve-once.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { Future } from "./future.js";
|
|
|
2
2
|
import { UnPromisify } from "./is-promise.js";
|
|
3
3
|
import { UnregFn } from "./lru-map-set.js";
|
|
4
4
|
import { Result } from "./result.js";
|
|
5
|
+
import { Option } from "./option.js";
|
|
5
6
|
import { KeyedIf, KeyedNg, KeyedNgItem, KeyedNgItemWithoutValue, KeyedNgOptions } from "./keyed-ng.js";
|
|
6
7
|
interface ResolveSeqItem<C, T, R> {
|
|
7
8
|
readonly future: Future<T>;
|
|
@@ -30,34 +31,51 @@ export interface ResolveOnceIf<R, CTX = void> {
|
|
|
30
31
|
}
|
|
31
32
|
export declare class SyncResolveOnce<T, CTX = void> {
|
|
32
33
|
#private;
|
|
33
|
-
state: ResolveState;
|
|
34
34
|
readonly queueLength: number;
|
|
35
|
+
constructor(rOnce: ResolveOnce<T, CTX>, state: StateInstance);
|
|
35
36
|
get value(): T | undefined;
|
|
36
37
|
get error(): Error | undefined;
|
|
37
38
|
get ready(): boolean;
|
|
38
|
-
constructor(ctx?: CTX);
|
|
39
39
|
resolve(fn: (ctx?: CTX) => T): T;
|
|
40
40
|
reset(fn?: (c?: CTX) => T): T | undefined;
|
|
41
41
|
}
|
|
42
42
|
export declare class AsyncResolveOnce<T, CTX = void> {
|
|
43
43
|
#private;
|
|
44
|
-
state:
|
|
45
|
-
constructor(ctx?: CTX);
|
|
44
|
+
constructor(rOnce: ResolveOnce<T, CTX>, state: StateInstance, prev: SyncOrAsync<T, CTX>);
|
|
46
45
|
get queueLength(): number;
|
|
47
|
-
get ready(): boolean;
|
|
48
46
|
get value(): UnPromisify<T> | undefined;
|
|
49
47
|
get error(): Error | undefined;
|
|
50
48
|
resolve(fn: (ctx?: CTX) => T): T;
|
|
51
49
|
reset(fn?: (c?: CTX) => T): T;
|
|
52
50
|
}
|
|
51
|
+
export interface ResolveOnceOpts {
|
|
52
|
+
readonly resetAfter?: number;
|
|
53
|
+
}
|
|
54
|
+
declare class StateInstance {
|
|
55
|
+
#private;
|
|
56
|
+
readonly id: number;
|
|
57
|
+
getResolveState(): ResolveState;
|
|
58
|
+
isInitial(): boolean;
|
|
59
|
+
isProcessed(): boolean;
|
|
60
|
+
setProcessed(): void;
|
|
61
|
+
isProcessing(): boolean;
|
|
62
|
+
setProcessing(): void;
|
|
63
|
+
isWaiting(): boolean;
|
|
64
|
+
setWaiting(): void;
|
|
65
|
+
equals(other: StateInstance): boolean;
|
|
66
|
+
}
|
|
67
|
+
type SyncOrAsync<T, CTX> = Option<SyncResolveOnce<T, CTX> | AsyncResolveOnce<T, CTX>>;
|
|
53
68
|
export declare class ResolveOnce<T, CTX = void> implements ResolveOnceIf<T, CTX> {
|
|
54
69
|
#private;
|
|
55
|
-
|
|
70
|
+
resetAfterTimer?: ReturnType<typeof setTimeout>;
|
|
71
|
+
readonly _ctx?: CTX;
|
|
72
|
+
constructor(ctx?: CTX, opts?: ResolveOnceOpts);
|
|
73
|
+
get state(): ResolveState;
|
|
74
|
+
setProcessed(state: StateInstance): void;
|
|
56
75
|
get ready(): boolean;
|
|
57
76
|
get value(): UnPromisify<T> | undefined;
|
|
58
77
|
get queueLength(): number;
|
|
59
78
|
get error(): Error | undefined;
|
|
60
|
-
get state(): ResolveState;
|
|
61
79
|
once<R>(fn: (c: CTX) => R): ResultOnce<R>;
|
|
62
80
|
reset<R>(fn?: (c: CTX) => R): ResultOnce<R>;
|
|
63
81
|
}
|
|
@@ -98,6 +116,6 @@ export declare class KeyedResolvOnce<T extends WithOptionalReset<PT>, K = string
|
|
|
98
116
|
export declare class KeyedResolvSeq<VALUEType extends NonNullable<unknown>, KEYType = string, CTX extends NonNullable<object> = object> extends KeyedNg<KEYType, ResolveSeq<VALUEType, KeyedNgItemWithoutValue<KEYType, CTX>>, CTX> {
|
|
99
117
|
constructor(kp?: Partial<Omit<KeyedNgOptions<KEYType, VALUEType, CTX>, "createValue">>);
|
|
100
118
|
}
|
|
101
|
-
export declare function Lazy<Args extends readonly unknown[], Return>(fn: (...args: Args) => Return): (...args: Args) => Return;
|
|
119
|
+
export declare function Lazy<Args extends readonly unknown[], Return>(fn: (...args: Args) => Return, opts?: ResolveOnceOpts): (...args: Args) => Return;
|
|
102
120
|
export {};
|
|
103
121
|
//# sourceMappingURL=resolve-once.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-once.d.ts","sourceRoot":"","sources":["../../../src/resolve-once.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-once.d.ts","sourceRoot":"","sources":["../../../src/resolve-once.ts"],"names":[],"mappings":"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"}
|