@rotorsoft/act-tck 1.17.1 → 1.18.0

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/index.cjs CHANGED
@@ -1464,6 +1464,104 @@ var runStoreTck = (options) => {
1464
1464
  (0, import_vitest9.expect)(blocked).toHaveLength(0);
1465
1465
  });
1466
1466
  });
1467
+ (0, import_vitest9.describe)("defer", () => {
1468
+ (0, import_vitest9.it)("hides a stream from claim until its deferred_at passes", async () => {
1469
+ const s = `defer-${uid()}`;
1470
+ const ctl = `defer-ctl-${uid()}`;
1471
+ await store.subscribe([{ stream: s }, { stream: ctl }]);
1472
+ for (const st of [s, ctl])
1473
+ await store.commit(
1474
+ st,
1475
+ [inc(1)],
1476
+ make_meta({ stream: st })
1477
+ );
1478
+ (0, import_vitest9.expect)(await store.defer([s], Date.now() + 36e5)).toBe(1);
1479
+ const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
1480
+ (0, import_vitest9.expect)(leased.find((l) => l.stream === ctl)).toBeDefined();
1481
+ (0, import_vitest9.expect)(leased.find((l) => l.stream === s)).toBeUndefined();
1482
+ });
1483
+ (0, import_vitest9.it)("makes a stream claimable once the deferred_at is in the past", async () => {
1484
+ const s = `defer-past-${uid()}`;
1485
+ await store.subscribe([{ stream: s }]);
1486
+ await store.commit(
1487
+ s,
1488
+ [inc(1)],
1489
+ make_meta({ stream: s })
1490
+ );
1491
+ (0, import_vitest9.expect)(await store.defer([s], Date.now() - 1e3)).toBe(1);
1492
+ const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
1493
+ const mine = leased.find((l) => l.stream === s);
1494
+ (0, import_vitest9.expect)(mine).toBeDefined();
1495
+ await store.ack(
1496
+ leased.filter((l) => l.stream !== s).concat(mine)
1497
+ );
1498
+ });
1499
+ (0, import_vitest9.it)("does not bump retry while a stream is deferred", async () => {
1500
+ const s = `defer-retry-${uid()}`;
1501
+ await store.subscribe([{ stream: s }]);
1502
+ await store.commit(
1503
+ s,
1504
+ [inc(1)],
1505
+ make_meta({ stream: s })
1506
+ );
1507
+ await store.defer([s], Date.now() + 36e5);
1508
+ await store.claim(100, 100, `w1-${uid()}`, 1e5);
1509
+ await store.claim(100, 100, `w2-${uid()}`, 1e5);
1510
+ await store.defer([s], Date.now() - 1e3);
1511
+ const leased = await store.claim(100, 100, `w3-${uid()}`, 1e5);
1512
+ const mine = leased.find((l) => l.stream === s);
1513
+ (0, import_vitest9.expect)(mine).toBeDefined();
1514
+ (0, import_vitest9.expect)(mine.retry).toBe(0);
1515
+ await store.ack(
1516
+ leased.filter((l) => l.stream !== s).concat(mine)
1517
+ );
1518
+ });
1519
+ (0, import_vitest9.it)("reset clears a pending defer", async () => {
1520
+ const s = `defer-reset-${uid()}`;
1521
+ await store.subscribe([{ stream: s }]);
1522
+ await store.commit(
1523
+ s,
1524
+ [inc(1)],
1525
+ make_meta({ stream: s })
1526
+ );
1527
+ await store.defer([s], Date.now() + 36e5);
1528
+ (0, import_vitest9.expect)(await store.reset([s])).toBe(1);
1529
+ const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
1530
+ (0, import_vitest9.expect)(leased.find((l) => l.stream === s)).toBeDefined();
1531
+ });
1532
+ (0, import_vitest9.it)("defers streams matching a filter and counts matches", async () => {
1533
+ const tag = uid();
1534
+ const a = `deferfilter-${tag}-a`;
1535
+ const b = `deferfilter-${tag}-b`;
1536
+ await store.subscribe([{ stream: a }, { stream: b }]);
1537
+ for (const s of [a, b])
1538
+ await store.commit(
1539
+ s,
1540
+ [inc(1)],
1541
+ make_meta({ stream: s })
1542
+ );
1543
+ const ctl = `defer-filterctl-${tag}`;
1544
+ await store.subscribe([{ stream: ctl }]);
1545
+ await store.commit(
1546
+ ctl,
1547
+ [inc(1)],
1548
+ make_meta({ stream: ctl })
1549
+ );
1550
+ const n = await store.defer(
1551
+ { stream: `^deferfilter-${tag}-`, stream_exact: false },
1552
+ Date.now() + 36e5
1553
+ );
1554
+ (0, import_vitest9.expect)(n).toBe(2);
1555
+ const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
1556
+ (0, import_vitest9.expect)(leased.find((l) => l.stream === ctl)).toBeDefined();
1557
+ (0, import_vitest9.expect)(leased.find((l) => l.stream === a)).toBeUndefined();
1558
+ (0, import_vitest9.expect)(leased.find((l) => l.stream === b)).toBeUndefined();
1559
+ });
1560
+ (0, import_vitest9.it)("returns 0 for unknown streams and empty input", async () => {
1561
+ (0, import_vitest9.expect)(await store.defer([`missing-${uid()}`], Date.now())).toBe(0);
1562
+ (0, import_vitest9.expect)(await store.defer([], Date.now())).toBe(0);
1563
+ });
1564
+ });
1467
1565
  (0, import_vitest9.describe)("reset", () => {
1468
1566
  (0, import_vitest9.it)("rewinds a stream watermark to -1", async () => {
1469
1567
  const s = `reset-${uid()}`;