@rotorsoft/act-tck 1.34.0 → 1.34.2

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.js CHANGED
@@ -384,6 +384,24 @@ ${content}`;
384
384
  // src/store-differential-tck.ts
385
385
  import { SNAP_EVENT } from "@rotorsoft/act";
386
386
  import { afterAll as afterAll2, beforeAll as beforeAll2, describe as describe6, expect as expect6, it as it6 } from "vitest";
387
+ var mark_all = async (store) => {
388
+ const rows = [];
389
+ const { maxEventId } = await store.query_streams(
390
+ (p) => rows.push({
391
+ stream: p.stream,
392
+ at: p.at,
393
+ priority: p.priority,
394
+ lane: p.lane
395
+ })
396
+ );
397
+ const marks = rows.filter((r) => r.at < maxEventId).map((r) => ({
398
+ stream: r.stream,
399
+ priority: r.priority,
400
+ lane: r.lane,
401
+ correlated_at: maxEventId
402
+ }));
403
+ await store.subscribe(marks);
404
+ };
387
405
  var mulberry322 = (seed) => {
388
406
  let a = seed >>> 0;
389
407
  return () => {
@@ -600,6 +618,7 @@ var apply_plan = async (store, plan, pii_isolation) => {
600
618
  ]);
601
619
  } else if (op.t === "claim") {
602
620
  const by = uid();
621
+ await mark_all(store);
603
622
  const leased = await store.claim(1e5, 1e5, by, op.millis);
604
623
  for (const l of leased) if (owned.has(l.stream)) held.set(l.stream, by);
605
624
  } else if (op.t === "ack") {
@@ -856,6 +875,24 @@ var runStoreDifferentialTck = (options) => {
856
875
  // src/store-property-tck.ts
857
876
  import { fc, test } from "@fast-check/vitest";
858
877
  import { afterAll as afterAll3, beforeAll as beforeAll3, describe as describe7, expect as expect7 } from "vitest";
878
+ var mark_all2 = async (store) => {
879
+ const rows = [];
880
+ const { maxEventId } = await store.query_streams(
881
+ (p) => rows.push({
882
+ stream: p.stream,
883
+ at: p.at,
884
+ priority: p.priority,
885
+ lane: p.lane
886
+ })
887
+ );
888
+ const marks = rows.filter((r) => r.at < maxEventId).map((r) => ({
889
+ stream: r.stream,
890
+ priority: r.priority,
891
+ lane: r.lane,
892
+ correlated_at: maxEventId
893
+ }));
894
+ await store.subscribe(marks);
895
+ };
859
896
  var streamArb = fc.constantFrom("s1", "s2", "s3");
860
897
  var commitArb = fc.record({
861
898
  stream: streamArb,
@@ -963,6 +1000,7 @@ var runStorePropertyTck = (options) => {
963
1000
  make_meta({ stream: op.stream })
964
1001
  );
965
1002
  } else if (op.kind === "claim") {
1003
+ await mark_all2(store);
966
1004
  const claimed = await store.claim(5, 5, "worker", 6e4);
967
1005
  totalClaims += claimed.length;
968
1006
  pending = [...pending, ...claimed];
@@ -1004,6 +1042,7 @@ var runStorePropertyTck = (options) => {
1004
1042
  make_meta({ stream })
1005
1043
  );
1006
1044
  }
1045
+ await mark_all2(store);
1007
1046
  const acked1 = await store.ack(
1008
1047
  await store.claim(10, 10, "worker", 6e4)
1009
1048
  );
@@ -1016,6 +1055,7 @@ var runStorePropertyTck = (options) => {
1016
1055
  make_meta({ stream })
1017
1056
  );
1018
1057
  }
1058
+ await mark_all2(store);
1019
1059
  const acked2 = await store.ack(
1020
1060
  await store.claim(10, 10, "worker", 6e4)
1021
1061
  );
@@ -1039,6 +1079,7 @@ var runStorePropertyTck = (options) => {
1039
1079
  make_meta({ stream })
1040
1080
  );
1041
1081
  }
1082
+ await mark_all2(store);
1042
1083
  const claimed = await store.claim(10, 10, "worker", 6e4);
1043
1084
  await store.block(claimed.map((l) => ({ ...l, error: "test" })));
1044
1085
  const blockedSet = new Set(claimed.map((l) => l.stream));
@@ -1048,6 +1089,7 @@ var runStorePropertyTck = (options) => {
1048
1089
  [inc(1)],
1049
1090
  make_meta({ stream: "ctrl" })
1050
1091
  );
1092
+ await mark_all2(store);
1051
1093
  const reclaim = await store.claim(10, 10, "worker2", 6e4);
1052
1094
  for (const l of reclaim) expect7(blockedSet.has(l.stream)).toBe(false);
1053
1095
  });
@@ -1069,6 +1111,38 @@ var runStoreTck = (options) => {
1069
1111
  describe8(`TCK / Store / ${options.name}`, () => {
1070
1112
  let store;
1071
1113
  const caps = { ...options.capabilities };
1114
+ const is_literal = (source) => !/[\]^$.*+?()[{}|\\]/.test(source);
1115
+ const correlate = async (target = store) => {
1116
+ const rows = [];
1117
+ await target.query_streams(
1118
+ (p) => rows.push({
1119
+ stream: p.stream,
1120
+ source: p.source,
1121
+ at: p.at,
1122
+ priority: p.priority,
1123
+ lane: p.lane
1124
+ }),
1125
+ { limit: 1e3 }
1126
+ );
1127
+ const marks = [];
1128
+ for (const row of rows) {
1129
+ let mark = -1;
1130
+ await target.query(
1131
+ (e) => {
1132
+ mark = Math.max(mark, e.id);
1133
+ },
1134
+ row.source !== void 0 ? { stream: row.source, stream_exact: is_literal(row.source) } : {}
1135
+ );
1136
+ if (mark > row.at)
1137
+ marks.push({
1138
+ stream: row.stream,
1139
+ priority: row.priority,
1140
+ lane: row.lane,
1141
+ correlated_at: mark
1142
+ });
1143
+ }
1144
+ if (marks.length) await target.subscribe(marks);
1145
+ };
1072
1146
  beforeAll4(async () => {
1073
1147
  store = await options.factory();
1074
1148
  await store.drop();
@@ -1695,18 +1769,21 @@ var runStoreTck = (options) => {
1695
1769
  const s = `fresh-empty-${uid()}`;
1696
1770
  const src = `fresh-src-${uid()}`;
1697
1771
  await store.subscribe([{ stream: s, source: src }]);
1772
+ await correlate();
1698
1773
  const leases = await store.claim(5, 5, `w-${uid()}`, 5e3);
1699
1774
  expect8(leases.filter((l) => l.stream === s)).toHaveLength(0);
1700
1775
  });
1701
- it7("claims a fresh subscription as soon as its first event lands", async () => {
1776
+ it7("claims a fresh subscription as soon as its first event is marked", async () => {
1702
1777
  const s = `fresh-first-${uid()}`;
1703
1778
  const src = `fresh-first-src-${uid()}`;
1704
1779
  await store.subscribe([{ stream: s, source: src }]);
1705
- await store.commit(
1780
+ const [first] = await store.commit(
1706
1781
  src,
1707
1782
  [inc(1)],
1708
1783
  make_meta({ stream: src })
1709
1784
  );
1785
+ await store.subscribe([{ stream: s, correlated_at: first.id }]);
1786
+ await correlate();
1710
1787
  const leases = await store.claim(5, 5, `w-${uid()}`, 5e3);
1711
1788
  const mine = leases.filter((l) => l.stream === s);
1712
1789
  expect8(mine).toHaveLength(1);
@@ -1799,7 +1876,7 @@ var runStoreTck = (options) => {
1799
1876
  expect8(seen).not.toContain("correlated");
1800
1877
  });
1801
1878
  });
1802
- describe8.skipIf(!caps.work_set)("subscription work set", () => {
1879
+ describe8("subscription work set", () => {
1803
1880
  const claimable = async (stream) => {
1804
1881
  const leased = await store.claim(100, 0, `w-${uid()}`, 1);
1805
1882
  const mine = leased.find((l) => l.stream === stream);
@@ -1886,16 +1963,17 @@ var runStoreTck = (options) => {
1886
1963
  await store.prioritize({ stream: s, stream_exact: true }, 5);
1887
1964
  expect8(await claimable(s)).toBe(true);
1888
1965
  });
1889
- it7("falls back to the legacy probe for an unmarked stream", async () => {
1890
- const s = `ws-legacy-${uid()}`;
1891
- const src = `ws-legacy-src-${uid()}`;
1966
+ it7("never claims an unmarked stream, however much work the log holds", async () => {
1967
+ const s = `ws-unmarked-${uid()}`;
1968
+ const src = `ws-unmarked-src-${uid()}`;
1892
1969
  await store.subscribe([{ stream: s, source: src }]);
1893
- expect8(await claimable(s)).toBe(false);
1894
- await store.commit(
1970
+ const [event] = await store.commit(
1895
1971
  src,
1896
1972
  [inc(1)],
1897
1973
  make_meta({ stream: src })
1898
1974
  );
1975
+ expect8(await claimable(s)).toBe(false);
1976
+ await store.subscribe([{ stream: s, correlated_at: event.id }]);
1899
1977
  expect8(await claimable(s)).toBe(true);
1900
1978
  });
1901
1979
  it7("surfaces the mark on query_streams positions", async () => {
@@ -1928,6 +2006,7 @@ var runStoreTck = (options) => {
1928
2006
  make_meta({ stream: s })
1929
2007
  );
1930
2008
  const by = `worker-${uid()}`;
2009
+ await correlate();
1931
2010
  const leased = await store.claim(100, 0, by, 1e4);
1932
2011
  const mine = leased.find((l) => l.stream === s);
1933
2012
  expect8(mine).toBeDefined();
@@ -1950,6 +2029,7 @@ var runStoreTck = (options) => {
1950
2029
  [inc(1)],
1951
2030
  make_meta({ stream: s })
1952
2031
  );
2032
+ await correlate();
1953
2033
  const leasedA = await store.claim(100, 0, `wA-${uid()}`, 1e5);
1954
2034
  const targetA = leasedA.find((l) => l.stream === s);
1955
2035
  expect8(targetA).toBeDefined();
@@ -1959,6 +2039,7 @@ var runStoreTck = (options) => {
1959
2039
  [inc(2)],
1960
2040
  make_meta({ stream: other })
1961
2041
  );
2042
+ await correlate();
1962
2043
  const leasedB = await store.claim(100, 0, `wB-${uid()}`, 1e5);
1963
2044
  expect8(leasedB.length).toBeGreaterThan(0);
1964
2045
  expect8(leasedB.find((l) => l.stream === s)).toBeUndefined();
@@ -1972,11 +2053,13 @@ var runStoreTck = (options) => {
1972
2053
  [inc(1), inc(2)],
1973
2054
  make_meta({ stream: s })
1974
2055
  );
2056
+ await correlate();
1975
2057
  const leasedA = await store.claim(100, 0, `wA-${uid()}`, 1);
1976
2058
  const a = leasedA.find((l) => l.stream === s);
1977
2059
  expect8(a).toBeDefined();
1978
2060
  expect8(a.retry).toBe(0);
1979
2061
  await new Promise((r) => setTimeout(r, 50));
2062
+ await correlate();
1980
2063
  const leasedB = await store.claim(100, 0, `wB-${uid()}`, 1e5);
1981
2064
  const b = leasedB.find((l) => l.stream === s);
1982
2065
  expect8(b).toBeDefined();
@@ -1997,10 +2080,12 @@ var runStoreTck = (options) => {
1997
2080
  [inc(1), inc(2)],
1998
2081
  make_meta({ stream: s })
1999
2082
  );
2083
+ await correlate();
2000
2084
  const first = await store.claim(100, 0, `w-${uid()}`, 1);
2001
2085
  const mine = first.find((l) => l.stream === s);
2002
2086
  expect8(mine).toBeDefined();
2003
2087
  await store.ack([{ ...mine, at: mine.at + 1 }]);
2088
+ await correlate();
2004
2089
  const second = await store.claim(0, 100, `w-${uid()}`, 1);
2005
2090
  expect8(second.find((l) => l.stream === s)).toBeDefined();
2006
2091
  });
@@ -2034,6 +2119,7 @@ var runStoreTck = (options) => {
2034
2119
  let low_claimed = false;
2035
2120
  const MAX_CYCLES = 20;
2036
2121
  for (let cycle = 0; cycle < MAX_CYCLES && !low_claimed; cycle++) {
2122
+ await correlate(fresh);
2037
2123
  const leases = await fresh.claim(4, 0, by, 1e3);
2038
2124
  if (leases.some((l) => l.stream === low)) {
2039
2125
  low_claimed = true;
@@ -2061,6 +2147,7 @@ var runStoreTck = (options) => {
2061
2147
  [inc(1)],
2062
2148
  make_meta({ stream: s })
2063
2149
  );
2150
+ await correlate();
2064
2151
  const claimed = await store.claim(100, 100, `w-${uid()}`, 1e5);
2065
2152
  const matches = claimed.filter((l) => l.stream === s);
2066
2153
  expect8(matches).toHaveLength(1);
@@ -2079,6 +2166,7 @@ var runStoreTck = (options) => {
2079
2166
  [inc(2)],
2080
2167
  make_meta({ stream: sibling })
2081
2168
  );
2169
+ await correlate();
2082
2170
  const leased = await store.claim(100, 0, `right-${uid()}`, 1e5);
2083
2171
  const mine = leased.find((l) => l.stream === s);
2084
2172
  const sibling_lease = leased.find((l) => l.stream === sibling);
@@ -2095,6 +2183,7 @@ var runStoreTck = (options) => {
2095
2183
  const s = `ack-stale-${uid()}`;
2096
2184
  await store.subscribe([{ stream: s }]);
2097
2185
  const by = `w-${uid()}`;
2186
+ await correlate();
2098
2187
  const leased = await store.claim(100, 0, by, 1e5);
2099
2188
  const mine = leased.find((l) => l.stream === s);
2100
2189
  expect8(mine).toBeDefined();
@@ -2107,6 +2196,7 @@ var runStoreTck = (options) => {
2107
2196
  try {
2108
2197
  await fresh.drop();
2109
2198
  await fresh.seed();
2199
+ await correlate(fresh);
2110
2200
  const claimed = await fresh.claim(1, 1, `w-${uid()}`, 1e3);
2111
2201
  expect8(claimed).toEqual([]);
2112
2202
  } finally {
@@ -2127,10 +2217,12 @@ var runStoreTck = (options) => {
2127
2217
  [inc(1)],
2128
2218
  make_meta({ stream: s })
2129
2219
  );
2220
+ await correlate(fresh);
2130
2221
  const first = await fresh.claim(1, 0, `w-${uid()}`, 0);
2131
2222
  const f = first.find((l) => l.stream === s);
2132
2223
  expect8(f).toBeDefined();
2133
2224
  expect8(f.retry).toBe(0);
2225
+ await correlate(fresh);
2134
2226
  const second = await fresh.claim(1, 0, `w-${uid()}`, 1e5);
2135
2227
  const sec = second.find((l) => l.stream === s);
2136
2228
  expect8(sec).toBeDefined();
@@ -2151,8 +2243,10 @@ var runStoreTck = (options) => {
2151
2243
  [inc(1)],
2152
2244
  make_meta({ stream: s })
2153
2245
  );
2246
+ await correlate(fresh);
2154
2247
  const lag = await fresh.claim(1, 0, `w-${uid()}`, 0);
2155
2248
  expect8(lag.find((l) => l.stream === s)?.lagging).toBe(true);
2249
+ await correlate(fresh);
2156
2250
  const lead = await fresh.claim(0, 1, `w-${uid()}`, 1e5);
2157
2251
  expect8(lead.find((l) => l.stream === s)?.lagging).toBe(false);
2158
2252
  } finally {
@@ -2167,14 +2261,17 @@ var runStoreTck = (options) => {
2167
2261
  const s = `lease-timeout-${uid()}`;
2168
2262
  await fresh.subscribe([{ stream: s }]);
2169
2263
  const [e1] = await seed_stream(fresh, s, 1);
2264
+ await correlate(fresh);
2170
2265
  const a = await fresh.claim(1, 0, `wA-${uid()}`, 0);
2171
2266
  expect8(a.find((l) => l.stream === s)?.retry).toBe(0);
2267
+ await correlate(fresh);
2172
2268
  const b = await fresh.claim(1, 0, `wB-${uid()}`, 3e4);
2173
2269
  const b_lease = b.find((l) => l.stream === s);
2174
2270
  expect8(b_lease).toBeDefined();
2175
2271
  expect8(b_lease.retry).toBe(1);
2176
2272
  await fresh.ack([{ ...b_lease, at: e1.id }]);
2177
2273
  await seed_stream(fresh, s, 1);
2274
+ await correlate(fresh);
2178
2275
  const c = await fresh.claim(1, 0, `wC-${uid()}`, 3e4);
2179
2276
  expect8(c.find((l) => l.stream === s)?.retry).toBe(0);
2180
2277
  } finally {
@@ -2182,42 +2279,7 @@ var runStoreTck = (options) => {
2182
2279
  }
2183
2280
  });
2184
2281
  });
2185
- describe8("claim source matching", () => {
2186
- it7("treats source as an exact stream name \u2014 no substring or pattern overmatch", async () => {
2187
- const fresh = await options.factory();
2188
- try {
2189
- await fresh.drop();
2190
- await fresh.seed();
2191
- const base = `src-${uid()}`;
2192
- const sibling = `${base}2`;
2193
- const target = `agg-${uid()}`;
2194
- const control = `ctl-${uid()}`;
2195
- await fresh.subscribe([
2196
- { stream: target, source: base },
2197
- // Control subscription sourced from the sibling — it DOES see
2198
- // the sibling commit below, so the negative assertion runs
2199
- // through a populated claim result.
2200
- { stream: control, source: sibling }
2201
- ]);
2202
- const [seeded] = await seed_stream(fresh, base, 1);
2203
- const [ctl_seeded] = await seed_stream(fresh, sibling, 1);
2204
- const first = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2205
- const mine = first.find((l) => l.stream === target);
2206
- const ctl = first.find((l) => l.stream === control);
2207
- expect8(mine).toBeDefined();
2208
- expect8(ctl).toBeDefined();
2209
- await fresh.ack([
2210
- { ...mine, at: seeded.id },
2211
- { ...ctl, at: ctl_seeded.id }
2212
- ]);
2213
- await seed_stream(fresh, sibling, 1);
2214
- const second = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2215
- expect8(second.find((l) => l.stream === control)).toBeDefined();
2216
- expect8(second.find((l) => l.stream === target)).toBeUndefined();
2217
- } finally {
2218
- await fresh.dispose();
2219
- }
2220
- });
2282
+ describe8("source windows and lease exclusivity", () => {
2221
2283
  it7("receives exactly its source stream's events", async () => {
2222
2284
  const fresh = await options.factory();
2223
2285
  try {
@@ -2227,12 +2289,14 @@ var runStoreTck = (options) => {
2227
2289
  const target = `agg-${uid()}`;
2228
2290
  await fresh.subscribe([{ stream: target, source: base }]);
2229
2291
  const [e1] = await seed_stream(fresh, base, 1);
2292
+ await correlate(fresh);
2230
2293
  const first = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2231
2294
  const f = first.find((l) => l.stream === target);
2232
2295
  expect8(f).toBeDefined();
2233
2296
  expect8(f.source).toBe(base);
2234
2297
  await fresh.ack([{ ...f, at: e1.id }]);
2235
2298
  const [e2] = await seed_stream(fresh, base, 1);
2299
+ await correlate(fresh);
2236
2300
  const second = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2237
2301
  const sec = second.find((l) => l.stream === target);
2238
2302
  expect8(sec).toBeDefined();
@@ -2257,6 +2321,7 @@ var runStoreTck = (options) => {
2257
2321
  await fresh.subscribe([{ stream: target, source: base }]);
2258
2322
  const [b1] = await seed_stream(fresh, base, 1);
2259
2323
  await seed_stream(fresh, sibling, 1);
2324
+ await correlate(fresh);
2260
2325
  const claimed = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2261
2326
  const lease = claimed.find((l) => l.stream === target);
2262
2327
  expect8(lease).toBeDefined();
@@ -2272,64 +2337,6 @@ var runStoreTck = (options) => {
2272
2337
  }
2273
2338
  });
2274
2339
  });
2275
- describe8.skipIf(!caps.pattern_claim_source)(
2276
- "claim pattern source matching (capability)",
2277
- () => {
2278
- it7("claims a pattern-source target when any matched stream has work (^(A|B)$)", async () => {
2279
- const fresh = await options.factory();
2280
- try {
2281
- await fresh.drop();
2282
- await fresh.seed();
2283
- const a = `A-${uid()}`;
2284
- const b = `B-${uid()}`;
2285
- const target = `board-${uid()}`;
2286
- const pattern = `^(${a}|${b})$`;
2287
- await fresh.subscribe([{ stream: target, source: pattern }]);
2288
- const [ea] = await seed_stream(fresh, a, 1);
2289
- const first = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2290
- const l1 = first.find((s) => s.stream === target);
2291
- expect8(l1).toBeDefined();
2292
- await fresh.ack([{ ...l1, at: ea.id }]);
2293
- const [eb] = await seed_stream(fresh, b, 1);
2294
- const second = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2295
- expect8(second.find((s) => s.stream === target)).toBeDefined();
2296
- expect8(eb.stream).toBe(b);
2297
- } finally {
2298
- await fresh.dispose();
2299
- }
2300
- });
2301
- it7("does not claim a pattern-source target when no matched stream has work", async () => {
2302
- const fresh = await options.factory();
2303
- try {
2304
- await fresh.drop();
2305
- await fresh.seed();
2306
- const a = `A-${uid()}`;
2307
- const b = `B-${uid()}`;
2308
- const other = `Z-${uid()}`;
2309
- const target = `board-${uid()}`;
2310
- const control = `ctl-${uid()}`;
2311
- const pattern = `^(${a}|${b})$`;
2312
- await fresh.subscribe([
2313
- { stream: target, source: pattern },
2314
- { stream: control, source: other }
2315
- ]);
2316
- const [ea] = await seed_stream(fresh, a, 1);
2317
- const first = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2318
- const l1 = first.find((s) => s.stream === target);
2319
- expect8(l1).toBeDefined();
2320
- expect8(first.map((s) => s.stream)).not.toContain(control);
2321
- await fresh.ack([{ ...l1, at: ea.id }]);
2322
- await seed_stream(fresh, other, 1);
2323
- const claimed = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2324
- const streams = claimed.map((s) => s.stream);
2325
- expect8(streams).toContain(control);
2326
- expect8(streams).not.toContain(target);
2327
- } finally {
2328
- await fresh.dispose();
2329
- }
2330
- });
2331
- }
2332
- );
2333
2340
  describe8.skipIf(!caps.rejects_nonportable_claim_source)(
2334
2341
  "claim source registration (capability)",
2335
2342
  () => {
@@ -2347,23 +2354,6 @@ var runStoreTck = (options) => {
2347
2354
  await fresh.dispose();
2348
2355
  }
2349
2356
  });
2350
- it7("accepts a portable-subset pattern claim source (^prefix.*) and claims on match", async () => {
2351
- const fresh = await options.factory();
2352
- try {
2353
- await fresh.drop();
2354
- await fresh.seed();
2355
- const prefix = `pfx${uid()}`.replace(/-/g, "");
2356
- const matched = `${prefix}child`;
2357
- const target = `board-${uid()}`;
2358
- await fresh.subscribe([{ stream: target, source: `^${prefix}.*` }]);
2359
- const [e] = await seed_stream(fresh, matched, 1);
2360
- const claimed = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2361
- expect8(claimed.find((s) => s.stream === target)).toBeDefined();
2362
- expect8(e.stream).toBe(matched);
2363
- } finally {
2364
- await fresh.dispose();
2365
- }
2366
- });
2367
2357
  }
2368
2358
  );
2369
2359
  describe8.skipIf(!caps.concurrent_claim)("concurrency (capability)", () => {
@@ -2385,6 +2375,7 @@ var runStoreTck = (options) => {
2385
2375
  );
2386
2376
  }
2387
2377
  const owned = new Set(streams);
2378
+ await correlate(fresh);
2388
2379
  const [a, b] = await Promise.all([
2389
2380
  fresh.claim(100, 100, `wA-${uid()}`, 6e4),
2390
2381
  fresh.claim(100, 100, `wB-${uid()}`, 6e4)
@@ -2405,10 +2396,12 @@ var runStoreTck = (options) => {
2405
2396
  const other = `unexpired-other-${uid()}`;
2406
2397
  await fresh.subscribe([{ stream: s }]);
2407
2398
  await seed_stream(fresh, s, 1);
2399
+ await correlate(fresh);
2408
2400
  const a = await fresh.claim(100, 100, `wA-${uid()}`, 6e4);
2409
2401
  expect8(a.find((l) => l.stream === s)).toBeDefined();
2410
2402
  await fresh.subscribe([{ stream: other }]);
2411
2403
  await seed_stream(fresh, other, 1);
2404
+ await correlate(fresh);
2412
2405
  const b = await fresh.claim(100, 100, `wB-${uid()}`, 6e4);
2413
2406
  expect8(b.find((l) => l.stream === other)).toBeDefined();
2414
2407
  expect8(b.find((l) => l.stream === s)).toBeUndefined();
@@ -2424,6 +2417,7 @@ var runStoreTck = (options) => {
2424
2417
  const s = `expired-${uid()}`;
2425
2418
  await fresh.subscribe([{ stream: s }]);
2426
2419
  const [e1] = await seed_stream(fresh, s, 1);
2420
+ await correlate(fresh);
2427
2421
  const dead = await fresh.claim(100, 0, `wDead-${uid()}`, 0);
2428
2422
  expect8(dead.find((l) => l.stream === s)?.retry).toBe(0);
2429
2423
  const [b, c] = await Promise.all([
@@ -2435,6 +2429,7 @@ var runStoreTck = (options) => {
2435
2429
  expect8(winners[0].retry).toBe(1);
2436
2430
  await fresh.ack([{ ...winners[0], at: e1.id }]);
2437
2431
  await seed_stream(fresh, s, 1);
2432
+ await correlate(fresh);
2438
2433
  const again = await fresh.claim(100, 0, `wNext-${uid()}`, 6e4);
2439
2434
  expect8(again.find((l) => l.stream === s)?.retry).toBe(0);
2440
2435
  } finally {
@@ -2451,6 +2446,7 @@ var runStoreTck = (options) => {
2451
2446
  [inc(1)],
2452
2447
  make_meta({ stream: s })
2453
2448
  );
2449
+ await correlate();
2454
2450
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2455
2451
  const mine = leased.find((l) => l.stream === s);
2456
2452
  expect8(mine).toBeDefined();
@@ -2461,6 +2457,7 @@ var runStoreTck = (options) => {
2461
2457
  ]);
2462
2458
  expect8(blocked).toHaveLength(1);
2463
2459
  expect8(blocked[0].error).toBe("boom");
2460
+ await correlate();
2464
2461
  const again = await store.claim(100, 100, `w2-${uid()}`, 1e5);
2465
2462
  expect8(again.find((l) => l.stream === s)).toBeUndefined();
2466
2463
  });
@@ -2472,6 +2469,7 @@ var runStoreTck = (options) => {
2472
2469
  [inc(1)],
2473
2470
  make_meta({ stream: s })
2474
2471
  );
2472
+ await correlate();
2475
2473
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2476
2474
  const mine = leased.find((l) => l.stream === s);
2477
2475
  expect8(mine).toBeDefined();
@@ -2497,6 +2495,7 @@ var runStoreTck = (options) => {
2497
2495
  [inc(1)],
2498
2496
  make_meta({ stream: s })
2499
2497
  );
2498
+ await correlate();
2500
2499
  const leased = await store.claim(100, 0, `right-${uid()}`, 1e5);
2501
2500
  const mine = leased.find((l) => l.stream === s);
2502
2501
  expect8(mine).toBeDefined();
@@ -2515,6 +2514,7 @@ var runStoreTck = (options) => {
2515
2514
  [inc(1)],
2516
2515
  make_meta({ stream: s })
2517
2516
  );
2517
+ await correlate();
2518
2518
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2519
2519
  const mine = leased.find((l) => l.stream === s);
2520
2520
  expect8(mine).toBeDefined();
@@ -2541,6 +2541,7 @@ var runStoreTck = (options) => {
2541
2541
  make_meta({ stream: st })
2542
2542
  );
2543
2543
  expect8(await store.defer([s], Date.now() + 36e5)).toBe(1);
2544
+ await correlate();
2544
2545
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2545
2546
  expect8(leased.find((l) => l.stream === ctl)).toBeDefined();
2546
2547
  expect8(leased.find((l) => l.stream === s)).toBeUndefined();
@@ -2554,6 +2555,7 @@ var runStoreTck = (options) => {
2554
2555
  make_meta({ stream: s })
2555
2556
  );
2556
2557
  expect8(await store.defer([s], Date.now() - 1e3)).toBe(1);
2558
+ await correlate();
2557
2559
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2558
2560
  const mine = leased.find((l) => l.stream === s);
2559
2561
  expect8(mine).toBeDefined();
@@ -2570,9 +2572,12 @@ var runStoreTck = (options) => {
2570
2572
  make_meta({ stream: s })
2571
2573
  );
2572
2574
  await store.defer([s], Date.now() + 36e5);
2575
+ await correlate();
2573
2576
  await store.claim(100, 100, `w1-${uid()}`, 1e5);
2577
+ await correlate();
2574
2578
  await store.claim(100, 100, `w2-${uid()}`, 1e5);
2575
2579
  await store.defer([s], Date.now() - 1e3);
2580
+ await correlate();
2576
2581
  const leased = await store.claim(100, 100, `w3-${uid()}`, 1e5);
2577
2582
  const mine = leased.find((l) => l.stream === s);
2578
2583
  expect8(mine).toBeDefined();
@@ -2591,6 +2596,7 @@ var runStoreTck = (options) => {
2591
2596
  );
2592
2597
  await store.defer([s], Date.now() + 36e5);
2593
2598
  expect8(await store.reset([s])).toBe(1);
2599
+ await correlate();
2594
2600
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2595
2601
  expect8(leased.find((l) => l.stream === s)).toBeDefined();
2596
2602
  });
@@ -2639,6 +2645,7 @@ var runStoreTck = (options) => {
2639
2645
  Date.now() + 36e5
2640
2646
  );
2641
2647
  expect8(n).toBe(2);
2648
+ await correlate();
2642
2649
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2643
2650
  expect8(leased.find((l) => l.stream === ctl)).toBeDefined();
2644
2651
  expect8(leased.find((l) => l.stream === a)).toBeUndefined();
@@ -2674,6 +2681,7 @@ var runStoreTck = (options) => {
2674
2681
  [inc(1)],
2675
2682
  make_meta({ stream: ctl })
2676
2683
  );
2684
+ await correlate();
2677
2685
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2678
2686
  const s_lease = leased.find((l) => l.stream === s);
2679
2687
  const ctl_lease = leased.find((l) => l.stream === ctl);
@@ -2688,6 +2696,7 @@ var runStoreTck = (options) => {
2688
2696
  [inc(2)],
2689
2697
  make_meta({ stream: ctl })
2690
2698
  );
2699
+ await correlate();
2691
2700
  const again = await store.claim(100, 100, `w-${uid()}`, 1e5);
2692
2701
  expect8(again.find((l) => l.stream === ctl)).toBeDefined();
2693
2702
  expect8(again.find((l) => l.stream === s)).toBeUndefined();
@@ -2700,9 +2709,11 @@ var runStoreTck = (options) => {
2700
2709
  [inc(1)],
2701
2710
  make_meta({ stream: s })
2702
2711
  );
2712
+ await correlate();
2703
2713
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2704
2714
  const mine = leased.find((l) => l.stream === s);
2705
2715
  await store.ack([{ ...mine, due: Date.now() - 1e3, retry: -1 }]);
2716
+ await correlate();
2706
2717
  const again = await store.claim(100, 100, `w-${uid()}`, 1e5);
2707
2718
  const re = again.find((l) => l.stream === s);
2708
2719
  expect8(re).toBeDefined();
@@ -2718,9 +2729,11 @@ var runStoreTck = (options) => {
2718
2729
  [inc(1)],
2719
2730
  make_meta({ stream: s })
2720
2731
  );
2732
+ await correlate();
2721
2733
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2722
2734
  const mine = leased.find((l) => l.stream === s);
2723
2735
  await store.ack([{ ...mine, due: Date.now() - 1e3, retry: 3 }]);
2736
+ await correlate();
2724
2737
  const again = await store.claim(100, 100, `w-${uid()}`, 1e5);
2725
2738
  const re = again.find((l) => l.stream === s);
2726
2739
  expect8(re).toBeDefined();
@@ -2741,12 +2754,14 @@ var runStoreTck = (options) => {
2741
2754
  [inc(1)],
2742
2755
  make_meta({ stream: s })
2743
2756
  );
2757
+ await correlate();
2744
2758
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2745
2759
  const mine = leased.find((l) => l.stream === s);
2746
2760
  expect8(mine.at).toBeLessThan(e1.id);
2747
2761
  await store.ack([
2748
2762
  { ...mine, at: e1.id, due: Date.now() - 1e3, retry: 2 }
2749
2763
  ]);
2764
+ await correlate();
2750
2765
  const again = await store.claim(100, 100, `w-${uid()}`, 1e5);
2751
2766
  const re = again.find((l) => l.stream === s);
2752
2767
  expect8(re).toBeDefined();
@@ -2762,6 +2777,7 @@ var runStoreTck = (options) => {
2762
2777
  [inc(1)],
2763
2778
  make_meta({ stream: s })
2764
2779
  );
2780
+ await correlate();
2765
2781
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2766
2782
  const mine = leased.find((l) => l.stream === s);
2767
2783
  await store.ack([
@@ -2780,11 +2796,13 @@ var runStoreTck = (options) => {
2780
2796
  [inc(1)],
2781
2797
  make_meta({ stream: s })
2782
2798
  );
2799
+ await correlate();
2783
2800
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2784
2801
  const mine = leased.find((l) => l.stream === s);
2785
2802
  expect8(mine).toBeDefined();
2786
2803
  await store.ack([{ ...mine, at: 99 }]);
2787
2804
  expect8(await store.reset([s])).toBe(1);
2805
+ await correlate();
2788
2806
  const after = await store.claim(100, 0, `w2-${uid()}`, 1e5);
2789
2807
  const back = after.find((l) => l.stream === s);
2790
2808
  expect8(back).toBeDefined();
@@ -2798,12 +2816,14 @@ var runStoreTck = (options) => {
2798
2816
  [inc(1)],
2799
2817
  make_meta({ stream: s })
2800
2818
  );
2819
+ await correlate();
2801
2820
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2802
2821
  const mine = leased.find((l) => l.stream === s);
2803
2822
  const others = leased.filter((l) => l.stream !== s);
2804
2823
  await store.ack(others);
2805
2824
  await store.block([{ ...mine, error: "boom" }]);
2806
2825
  expect8(await store.reset([s])).toBe(1);
2826
+ await correlate();
2807
2827
  const after = await store.claim(100, 0, `w2-${uid()}`, 1e5);
2808
2828
  expect8(after.find((l) => l.stream === s)).toBeDefined();
2809
2829
  });
@@ -2836,9 +2856,11 @@ var runStoreTck = (options) => {
2836
2856
  [inc(2)],
2837
2857
  make_meta({ stream: s })
2838
2858
  );
2859
+ await correlate();
2839
2860
  const first = await store.claim(100, 0, `w-${uid()}`, 1e5);
2840
2861
  const m1 = first.find((l) => l.stream === s);
2841
2862
  await store.ack([{ ...m1, at: m1.at }]);
2863
+ await correlate();
2842
2864
  const before_block = await store.claim(100, 0, `w-${uid()}`, 1e5);
2843
2865
  const m2 = before_block.find((l) => l.stream === s);
2844
2866
  expect8(m2).toBeDefined();
@@ -2853,6 +2875,7 @@ var runStoreTck = (options) => {
2853
2875
  );
2854
2876
  expect8(blocked_flag).toBe(true);
2855
2877
  expect8(await store.unblock([s])).toBe(1);
2878
+ await correlate();
2856
2879
  const after = await store.claim(100, 0, `w-${uid()}`, 1e5);
2857
2880
  const back = after.find((l) => l.stream === s);
2858
2881
  expect8(back).toBeDefined();
@@ -2887,6 +2910,7 @@ var runStoreTck = (options) => {
2887
2910
  [inc(1)],
2888
2911
  make_meta({ stream: s2 })
2889
2912
  );
2913
+ await correlate();
2890
2914
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2891
2915
  const m1 = leased.find((l) => l.stream === s1);
2892
2916
  const others = leased.filter((l) => l.stream !== s1);
@@ -2915,6 +2939,7 @@ var runStoreTck = (options) => {
2915
2939
  [inc(1)],
2916
2940
  make_meta({ stream: s3 })
2917
2941
  );
2942
+ await correlate();
2918
2943
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2919
2944
  const blockable = leased.filter((l) => l.stream === s1 || l.stream === s2 || l.stream === s3).map((l) => ({ ...l, error: "boom" }));
2920
2945
  await store.ack(
@@ -2927,6 +2952,7 @@ var runStoreTck = (options) => {
2927
2952
  stream: `^unblock-filter-${tag}-`
2928
2953
  });
2929
2954
  expect8(count).toBe(2);
2955
+ await correlate();
2930
2956
  const after = await store.claim(100, 0, `w-${uid()}`, 1e5);
2931
2957
  expect8(after.find((l) => l.stream === s3)).toBeUndefined();
2932
2958
  expect8(after.find((l) => l.stream === s1)).toBeDefined();
@@ -2947,6 +2973,7 @@ var runStoreTck = (options) => {
2947
2973
  [inc(1)],
2948
2974
  make_meta({ stream: s2 })
2949
2975
  );
2976
+ await correlate();
2950
2977
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2951
2978
  const mine = leased.filter((l) => l.stream === s1 || l.stream === s2);
2952
2979
  await store.ack(leased.filter((l) => !mine.includes(l)));
@@ -3001,6 +3028,7 @@ var runStoreTck = (options) => {
3001
3028
  [inc(1)],
3002
3029
  make_meta({ stream: other })
3003
3030
  );
3031
+ await correlate();
3004
3032
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
3005
3033
  const mine = leased.filter(
3006
3034
  (l) => l.stream === s1 || l.stream === s2 || l.stream === other
@@ -3037,6 +3065,7 @@ var runStoreTck = (options) => {
3037
3065
  [inc(1)],
3038
3066
  make_meta({ stream: s2 })
3039
3067
  );
3068
+ await correlate();
3040
3069
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
3041
3070
  const m1 = leased.find((l) => l.stream === s1);
3042
3071
  await store.ack(leased.filter((l) => l.stream !== s1));
@@ -3127,6 +3156,7 @@ var runStoreTck = (options) => {
3127
3156
  { stream: sub_default, source: src1 },
3128
3157
  { stream: sub_slow, source: src2, lane: "slow" }
3129
3158
  ]);
3159
+ await correlate();
3130
3160
  const slow = await store.claim(50, 0, `w-slow-${tag}`, 1e3, "slow");
3131
3161
  const slow_mine = slow.filter(
3132
3162
  (l) => l.stream === sub_default || l.stream === sub_slow
@@ -3134,6 +3164,7 @@ var runStoreTck = (options) => {
3134
3164
  expect8(slow_mine.map((l) => l.stream)).toEqual([sub_slow]);
3135
3165
  expect8(slow_mine[0]?.lane).toBe("slow");
3136
3166
  await store.ack(slow_mine.map((l) => ({ ...l, at: l.at + 1 })));
3167
+ await correlate();
3137
3168
  const all = await store.claim(50, 0, `w-all-${tag}`, 1e3);
3138
3169
  const all_mine = all.filter((l) => l.stream === sub_default || l.stream === sub_slow).map((l) => ({ stream: l.stream, lane: l.lane }));
3139
3170
  expect8(all_mine).toEqual(
@@ -3193,6 +3224,7 @@ var runStoreTck = (options) => {
3193
3224
  { stream: a, source: src, lane: `rslow-${tag}` },
3194
3225
  { stream: b, source: src, lane: `rfast-${tag}` }
3195
3226
  ]);
3227
+ await correlate();
3196
3228
  const leases = await store.claim(50, 0, `w-${tag}`, 5e3);
3197
3229
  const mine = leases.filter((l) => l.stream === a || l.stream === b);
3198
3230
  await store.ack(mine.map((l) => ({ ...l, at: l.at + 1 })));
@@ -3222,6 +3254,7 @@ var runStoreTck = (options) => {
3222
3254
  { stream: a, source: src, lane: `uslow-${tag}` },
3223
3255
  { stream: b, source: src, lane: `ufast-${tag}` }
3224
3256
  ]);
3257
+ await correlate();
3225
3258
  const leases = await store.claim(50, 0, `w-${tag}`, 5e3);
3226
3259
  const mine = leases.filter((l) => l.stream === a || l.stream === b);
3227
3260
  await store.block(mine.map((l) => ({ ...l, error: "boom" })));
@@ -3612,6 +3645,7 @@ var runStoreTck = (options) => {
3612
3645
  [inc(1)],
3613
3646
  make_meta({ stream: s })
3614
3647
  );
3648
+ await correlate();
3615
3649
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
3616
3650
  const mine = leased.find((l) => l.stream === s);
3617
3651
  const others = leased.filter((l) => l.stream !== s);
@@ -3860,6 +3894,7 @@ var runStoreTck = (options) => {
3860
3894
  [inc(2)],
3861
3895
  make_meta({ stream: b })
3862
3896
  );
3897
+ await correlate();
3863
3898
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
3864
3899
  const mine = leased.find((l) => l.stream === a);
3865
3900
  expect8(mine).toBeDefined();