@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.cjs CHANGED
@@ -438,6 +438,24 @@ ${content}`;
438
438
  // src/store-differential-tck.ts
439
439
  var import_act = require("@rotorsoft/act");
440
440
  var import_vitest6 = require("vitest");
441
+ var mark_all = async (store) => {
442
+ const rows = [];
443
+ const { maxEventId } = await store.query_streams(
444
+ (p) => rows.push({
445
+ stream: p.stream,
446
+ at: p.at,
447
+ priority: p.priority,
448
+ lane: p.lane
449
+ })
450
+ );
451
+ const marks = rows.filter((r) => r.at < maxEventId).map((r) => ({
452
+ stream: r.stream,
453
+ priority: r.priority,
454
+ lane: r.lane,
455
+ correlated_at: maxEventId
456
+ }));
457
+ await store.subscribe(marks);
458
+ };
441
459
  var mulberry322 = (seed) => {
442
460
  let a = seed >>> 0;
443
461
  return () => {
@@ -654,6 +672,7 @@ var apply_plan = async (store, plan, pii_isolation) => {
654
672
  ]);
655
673
  } else if (op.t === "claim") {
656
674
  const by = uid();
675
+ await mark_all(store);
657
676
  const leased = await store.claim(1e5, 1e5, by, op.millis);
658
677
  for (const l of leased) if (owned.has(l.stream)) held.set(l.stream, by);
659
678
  } else if (op.t === "ack") {
@@ -910,6 +929,24 @@ var runStoreDifferentialTck = (options) => {
910
929
  // src/store-property-tck.ts
911
930
  var import_vitest7 = require("@fast-check/vitest");
912
931
  var import_vitest8 = require("vitest");
932
+ var mark_all2 = async (store) => {
933
+ const rows = [];
934
+ const { maxEventId } = await store.query_streams(
935
+ (p) => rows.push({
936
+ stream: p.stream,
937
+ at: p.at,
938
+ priority: p.priority,
939
+ lane: p.lane
940
+ })
941
+ );
942
+ const marks = rows.filter((r) => r.at < maxEventId).map((r) => ({
943
+ stream: r.stream,
944
+ priority: r.priority,
945
+ lane: r.lane,
946
+ correlated_at: maxEventId
947
+ }));
948
+ await store.subscribe(marks);
949
+ };
913
950
  var streamArb = import_vitest7.fc.constantFrom("s1", "s2", "s3");
914
951
  var commitArb = import_vitest7.fc.record({
915
952
  stream: streamArb,
@@ -1017,6 +1054,7 @@ var runStorePropertyTck = (options) => {
1017
1054
  make_meta({ stream: op.stream })
1018
1055
  );
1019
1056
  } else if (op.kind === "claim") {
1057
+ await mark_all2(store);
1020
1058
  const claimed = await store.claim(5, 5, "worker", 6e4);
1021
1059
  totalClaims += claimed.length;
1022
1060
  pending = [...pending, ...claimed];
@@ -1058,6 +1096,7 @@ var runStorePropertyTck = (options) => {
1058
1096
  make_meta({ stream })
1059
1097
  );
1060
1098
  }
1099
+ await mark_all2(store);
1061
1100
  const acked1 = await store.ack(
1062
1101
  await store.claim(10, 10, "worker", 6e4)
1063
1102
  );
@@ -1070,6 +1109,7 @@ var runStorePropertyTck = (options) => {
1070
1109
  make_meta({ stream })
1071
1110
  );
1072
1111
  }
1112
+ await mark_all2(store);
1073
1113
  const acked2 = await store.ack(
1074
1114
  await store.claim(10, 10, "worker", 6e4)
1075
1115
  );
@@ -1093,6 +1133,7 @@ var runStorePropertyTck = (options) => {
1093
1133
  make_meta({ stream })
1094
1134
  );
1095
1135
  }
1136
+ await mark_all2(store);
1096
1137
  const claimed = await store.claim(10, 10, "worker", 6e4);
1097
1138
  await store.block(claimed.map((l) => ({ ...l, error: "test" })));
1098
1139
  const blockedSet = new Set(claimed.map((l) => l.stream));
@@ -1102,6 +1143,7 @@ var runStorePropertyTck = (options) => {
1102
1143
  [inc(1)],
1103
1144
  make_meta({ stream: "ctrl" })
1104
1145
  );
1146
+ await mark_all2(store);
1105
1147
  const reclaim = await store.claim(10, 10, "worker2", 6e4);
1106
1148
  for (const l of reclaim) (0, import_vitest8.expect)(blockedSet.has(l.stream)).toBe(false);
1107
1149
  });
@@ -1116,6 +1158,38 @@ var runStoreTck = (options) => {
1116
1158
  (0, import_vitest9.describe)(`TCK / Store / ${options.name}`, () => {
1117
1159
  let store;
1118
1160
  const caps = { ...options.capabilities };
1161
+ const is_literal = (source) => !/[\]^$.*+?()[{}|\\]/.test(source);
1162
+ const correlate = async (target = store) => {
1163
+ const rows = [];
1164
+ await target.query_streams(
1165
+ (p) => rows.push({
1166
+ stream: p.stream,
1167
+ source: p.source,
1168
+ at: p.at,
1169
+ priority: p.priority,
1170
+ lane: p.lane
1171
+ }),
1172
+ { limit: 1e3 }
1173
+ );
1174
+ const marks = [];
1175
+ for (const row of rows) {
1176
+ let mark = -1;
1177
+ await target.query(
1178
+ (e) => {
1179
+ mark = Math.max(mark, e.id);
1180
+ },
1181
+ row.source !== void 0 ? { stream: row.source, stream_exact: is_literal(row.source) } : {}
1182
+ );
1183
+ if (mark > row.at)
1184
+ marks.push({
1185
+ stream: row.stream,
1186
+ priority: row.priority,
1187
+ lane: row.lane,
1188
+ correlated_at: mark
1189
+ });
1190
+ }
1191
+ if (marks.length) await target.subscribe(marks);
1192
+ };
1119
1193
  (0, import_vitest9.beforeAll)(async () => {
1120
1194
  store = await options.factory();
1121
1195
  await store.drop();
@@ -1742,18 +1816,21 @@ var runStoreTck = (options) => {
1742
1816
  const s = `fresh-empty-${uid()}`;
1743
1817
  const src = `fresh-src-${uid()}`;
1744
1818
  await store.subscribe([{ stream: s, source: src }]);
1819
+ await correlate();
1745
1820
  const leases = await store.claim(5, 5, `w-${uid()}`, 5e3);
1746
1821
  (0, import_vitest9.expect)(leases.filter((l) => l.stream === s)).toHaveLength(0);
1747
1822
  });
1748
- (0, import_vitest9.it)("claims a fresh subscription as soon as its first event lands", async () => {
1823
+ (0, import_vitest9.it)("claims a fresh subscription as soon as its first event is marked", async () => {
1749
1824
  const s = `fresh-first-${uid()}`;
1750
1825
  const src = `fresh-first-src-${uid()}`;
1751
1826
  await store.subscribe([{ stream: s, source: src }]);
1752
- await store.commit(
1827
+ const [first] = await store.commit(
1753
1828
  src,
1754
1829
  [inc(1)],
1755
1830
  make_meta({ stream: src })
1756
1831
  );
1832
+ await store.subscribe([{ stream: s, correlated_at: first.id }]);
1833
+ await correlate();
1757
1834
  const leases = await store.claim(5, 5, `w-${uid()}`, 5e3);
1758
1835
  const mine = leases.filter((l) => l.stream === s);
1759
1836
  (0, import_vitest9.expect)(mine).toHaveLength(1);
@@ -1846,7 +1923,7 @@ var runStoreTck = (options) => {
1846
1923
  (0, import_vitest9.expect)(seen).not.toContain("correlated");
1847
1924
  });
1848
1925
  });
1849
- import_vitest9.describe.skipIf(!caps.work_set)("subscription work set", () => {
1926
+ (0, import_vitest9.describe)("subscription work set", () => {
1850
1927
  const claimable = async (stream) => {
1851
1928
  const leased = await store.claim(100, 0, `w-${uid()}`, 1);
1852
1929
  const mine = leased.find((l) => l.stream === stream);
@@ -1933,16 +2010,17 @@ var runStoreTck = (options) => {
1933
2010
  await store.prioritize({ stream: s, stream_exact: true }, 5);
1934
2011
  (0, import_vitest9.expect)(await claimable(s)).toBe(true);
1935
2012
  });
1936
- (0, import_vitest9.it)("falls back to the legacy probe for an unmarked stream", async () => {
1937
- const s = `ws-legacy-${uid()}`;
1938
- const src = `ws-legacy-src-${uid()}`;
2013
+ (0, import_vitest9.it)("never claims an unmarked stream, however much work the log holds", async () => {
2014
+ const s = `ws-unmarked-${uid()}`;
2015
+ const src = `ws-unmarked-src-${uid()}`;
1939
2016
  await store.subscribe([{ stream: s, source: src }]);
1940
- (0, import_vitest9.expect)(await claimable(s)).toBe(false);
1941
- await store.commit(
2017
+ const [event] = await store.commit(
1942
2018
  src,
1943
2019
  [inc(1)],
1944
2020
  make_meta({ stream: src })
1945
2021
  );
2022
+ (0, import_vitest9.expect)(await claimable(s)).toBe(false);
2023
+ await store.subscribe([{ stream: s, correlated_at: event.id }]);
1946
2024
  (0, import_vitest9.expect)(await claimable(s)).toBe(true);
1947
2025
  });
1948
2026
  (0, import_vitest9.it)("surfaces the mark on query_streams positions", async () => {
@@ -1975,6 +2053,7 @@ var runStoreTck = (options) => {
1975
2053
  make_meta({ stream: s })
1976
2054
  );
1977
2055
  const by = `worker-${uid()}`;
2056
+ await correlate();
1978
2057
  const leased = await store.claim(100, 0, by, 1e4);
1979
2058
  const mine = leased.find((l) => l.stream === s);
1980
2059
  (0, import_vitest9.expect)(mine).toBeDefined();
@@ -1997,6 +2076,7 @@ var runStoreTck = (options) => {
1997
2076
  [inc(1)],
1998
2077
  make_meta({ stream: s })
1999
2078
  );
2079
+ await correlate();
2000
2080
  const leasedA = await store.claim(100, 0, `wA-${uid()}`, 1e5);
2001
2081
  const targetA = leasedA.find((l) => l.stream === s);
2002
2082
  (0, import_vitest9.expect)(targetA).toBeDefined();
@@ -2006,6 +2086,7 @@ var runStoreTck = (options) => {
2006
2086
  [inc(2)],
2007
2087
  make_meta({ stream: other })
2008
2088
  );
2089
+ await correlate();
2009
2090
  const leasedB = await store.claim(100, 0, `wB-${uid()}`, 1e5);
2010
2091
  (0, import_vitest9.expect)(leasedB.length).toBeGreaterThan(0);
2011
2092
  (0, import_vitest9.expect)(leasedB.find((l) => l.stream === s)).toBeUndefined();
@@ -2019,11 +2100,13 @@ var runStoreTck = (options) => {
2019
2100
  [inc(1), inc(2)],
2020
2101
  make_meta({ stream: s })
2021
2102
  );
2103
+ await correlate();
2022
2104
  const leasedA = await store.claim(100, 0, `wA-${uid()}`, 1);
2023
2105
  const a = leasedA.find((l) => l.stream === s);
2024
2106
  (0, import_vitest9.expect)(a).toBeDefined();
2025
2107
  (0, import_vitest9.expect)(a.retry).toBe(0);
2026
2108
  await new Promise((r) => setTimeout(r, 50));
2109
+ await correlate();
2027
2110
  const leasedB = await store.claim(100, 0, `wB-${uid()}`, 1e5);
2028
2111
  const b = leasedB.find((l) => l.stream === s);
2029
2112
  (0, import_vitest9.expect)(b).toBeDefined();
@@ -2044,10 +2127,12 @@ var runStoreTck = (options) => {
2044
2127
  [inc(1), inc(2)],
2045
2128
  make_meta({ stream: s })
2046
2129
  );
2130
+ await correlate();
2047
2131
  const first = await store.claim(100, 0, `w-${uid()}`, 1);
2048
2132
  const mine = first.find((l) => l.stream === s);
2049
2133
  (0, import_vitest9.expect)(mine).toBeDefined();
2050
2134
  await store.ack([{ ...mine, at: mine.at + 1 }]);
2135
+ await correlate();
2051
2136
  const second = await store.claim(0, 100, `w-${uid()}`, 1);
2052
2137
  (0, import_vitest9.expect)(second.find((l) => l.stream === s)).toBeDefined();
2053
2138
  });
@@ -2081,6 +2166,7 @@ var runStoreTck = (options) => {
2081
2166
  let low_claimed = false;
2082
2167
  const MAX_CYCLES = 20;
2083
2168
  for (let cycle = 0; cycle < MAX_CYCLES && !low_claimed; cycle++) {
2169
+ await correlate(fresh);
2084
2170
  const leases = await fresh.claim(4, 0, by, 1e3);
2085
2171
  if (leases.some((l) => l.stream === low)) {
2086
2172
  low_claimed = true;
@@ -2108,6 +2194,7 @@ var runStoreTck = (options) => {
2108
2194
  [inc(1)],
2109
2195
  make_meta({ stream: s })
2110
2196
  );
2197
+ await correlate();
2111
2198
  const claimed = await store.claim(100, 100, `w-${uid()}`, 1e5);
2112
2199
  const matches = claimed.filter((l) => l.stream === s);
2113
2200
  (0, import_vitest9.expect)(matches).toHaveLength(1);
@@ -2126,6 +2213,7 @@ var runStoreTck = (options) => {
2126
2213
  [inc(2)],
2127
2214
  make_meta({ stream: sibling })
2128
2215
  );
2216
+ await correlate();
2129
2217
  const leased = await store.claim(100, 0, `right-${uid()}`, 1e5);
2130
2218
  const mine = leased.find((l) => l.stream === s);
2131
2219
  const sibling_lease = leased.find((l) => l.stream === sibling);
@@ -2142,6 +2230,7 @@ var runStoreTck = (options) => {
2142
2230
  const s = `ack-stale-${uid()}`;
2143
2231
  await store.subscribe([{ stream: s }]);
2144
2232
  const by = `w-${uid()}`;
2233
+ await correlate();
2145
2234
  const leased = await store.claim(100, 0, by, 1e5);
2146
2235
  const mine = leased.find((l) => l.stream === s);
2147
2236
  (0, import_vitest9.expect)(mine).toBeDefined();
@@ -2154,6 +2243,7 @@ var runStoreTck = (options) => {
2154
2243
  try {
2155
2244
  await fresh.drop();
2156
2245
  await fresh.seed();
2246
+ await correlate(fresh);
2157
2247
  const claimed = await fresh.claim(1, 1, `w-${uid()}`, 1e3);
2158
2248
  (0, import_vitest9.expect)(claimed).toEqual([]);
2159
2249
  } finally {
@@ -2174,10 +2264,12 @@ var runStoreTck = (options) => {
2174
2264
  [inc(1)],
2175
2265
  make_meta({ stream: s })
2176
2266
  );
2267
+ await correlate(fresh);
2177
2268
  const first = await fresh.claim(1, 0, `w-${uid()}`, 0);
2178
2269
  const f = first.find((l) => l.stream === s);
2179
2270
  (0, import_vitest9.expect)(f).toBeDefined();
2180
2271
  (0, import_vitest9.expect)(f.retry).toBe(0);
2272
+ await correlate(fresh);
2181
2273
  const second = await fresh.claim(1, 0, `w-${uid()}`, 1e5);
2182
2274
  const sec = second.find((l) => l.stream === s);
2183
2275
  (0, import_vitest9.expect)(sec).toBeDefined();
@@ -2198,8 +2290,10 @@ var runStoreTck = (options) => {
2198
2290
  [inc(1)],
2199
2291
  make_meta({ stream: s })
2200
2292
  );
2293
+ await correlate(fresh);
2201
2294
  const lag = await fresh.claim(1, 0, `w-${uid()}`, 0);
2202
2295
  (0, import_vitest9.expect)(lag.find((l) => l.stream === s)?.lagging).toBe(true);
2296
+ await correlate(fresh);
2203
2297
  const lead = await fresh.claim(0, 1, `w-${uid()}`, 1e5);
2204
2298
  (0, import_vitest9.expect)(lead.find((l) => l.stream === s)?.lagging).toBe(false);
2205
2299
  } finally {
@@ -2214,14 +2308,17 @@ var runStoreTck = (options) => {
2214
2308
  const s = `lease-timeout-${uid()}`;
2215
2309
  await fresh.subscribe([{ stream: s }]);
2216
2310
  const [e1] = await seed_stream(fresh, s, 1);
2311
+ await correlate(fresh);
2217
2312
  const a = await fresh.claim(1, 0, `wA-${uid()}`, 0);
2218
2313
  (0, import_vitest9.expect)(a.find((l) => l.stream === s)?.retry).toBe(0);
2314
+ await correlate(fresh);
2219
2315
  const b = await fresh.claim(1, 0, `wB-${uid()}`, 3e4);
2220
2316
  const b_lease = b.find((l) => l.stream === s);
2221
2317
  (0, import_vitest9.expect)(b_lease).toBeDefined();
2222
2318
  (0, import_vitest9.expect)(b_lease.retry).toBe(1);
2223
2319
  await fresh.ack([{ ...b_lease, at: e1.id }]);
2224
2320
  await seed_stream(fresh, s, 1);
2321
+ await correlate(fresh);
2225
2322
  const c = await fresh.claim(1, 0, `wC-${uid()}`, 3e4);
2226
2323
  (0, import_vitest9.expect)(c.find((l) => l.stream === s)?.retry).toBe(0);
2227
2324
  } finally {
@@ -2229,42 +2326,7 @@ var runStoreTck = (options) => {
2229
2326
  }
2230
2327
  });
2231
2328
  });
2232
- (0, import_vitest9.describe)("claim source matching", () => {
2233
- (0, import_vitest9.it)("treats source as an exact stream name \u2014 no substring or pattern overmatch", async () => {
2234
- const fresh = await options.factory();
2235
- try {
2236
- await fresh.drop();
2237
- await fresh.seed();
2238
- const base = `src-${uid()}`;
2239
- const sibling = `${base}2`;
2240
- const target = `agg-${uid()}`;
2241
- const control = `ctl-${uid()}`;
2242
- await fresh.subscribe([
2243
- { stream: target, source: base },
2244
- // Control subscription sourced from the sibling — it DOES see
2245
- // the sibling commit below, so the negative assertion runs
2246
- // through a populated claim result.
2247
- { stream: control, source: sibling }
2248
- ]);
2249
- const [seeded] = await seed_stream(fresh, base, 1);
2250
- const [ctl_seeded] = await seed_stream(fresh, sibling, 1);
2251
- const first = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2252
- const mine = first.find((l) => l.stream === target);
2253
- const ctl = first.find((l) => l.stream === control);
2254
- (0, import_vitest9.expect)(mine).toBeDefined();
2255
- (0, import_vitest9.expect)(ctl).toBeDefined();
2256
- await fresh.ack([
2257
- { ...mine, at: seeded.id },
2258
- { ...ctl, at: ctl_seeded.id }
2259
- ]);
2260
- await seed_stream(fresh, sibling, 1);
2261
- const second = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2262
- (0, import_vitest9.expect)(second.find((l) => l.stream === control)).toBeDefined();
2263
- (0, import_vitest9.expect)(second.find((l) => l.stream === target)).toBeUndefined();
2264
- } finally {
2265
- await fresh.dispose();
2266
- }
2267
- });
2329
+ (0, import_vitest9.describe)("source windows and lease exclusivity", () => {
2268
2330
  (0, import_vitest9.it)("receives exactly its source stream's events", async () => {
2269
2331
  const fresh = await options.factory();
2270
2332
  try {
@@ -2274,12 +2336,14 @@ var runStoreTck = (options) => {
2274
2336
  const target = `agg-${uid()}`;
2275
2337
  await fresh.subscribe([{ stream: target, source: base }]);
2276
2338
  const [e1] = await seed_stream(fresh, base, 1);
2339
+ await correlate(fresh);
2277
2340
  const first = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2278
2341
  const f = first.find((l) => l.stream === target);
2279
2342
  (0, import_vitest9.expect)(f).toBeDefined();
2280
2343
  (0, import_vitest9.expect)(f.source).toBe(base);
2281
2344
  await fresh.ack([{ ...f, at: e1.id }]);
2282
2345
  const [e2] = await seed_stream(fresh, base, 1);
2346
+ await correlate(fresh);
2283
2347
  const second = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2284
2348
  const sec = second.find((l) => l.stream === target);
2285
2349
  (0, import_vitest9.expect)(sec).toBeDefined();
@@ -2304,6 +2368,7 @@ var runStoreTck = (options) => {
2304
2368
  await fresh.subscribe([{ stream: target, source: base }]);
2305
2369
  const [b1] = await seed_stream(fresh, base, 1);
2306
2370
  await seed_stream(fresh, sibling, 1);
2371
+ await correlate(fresh);
2307
2372
  const claimed = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2308
2373
  const lease = claimed.find((l) => l.stream === target);
2309
2374
  (0, import_vitest9.expect)(lease).toBeDefined();
@@ -2319,64 +2384,6 @@ var runStoreTck = (options) => {
2319
2384
  }
2320
2385
  });
2321
2386
  });
2322
- import_vitest9.describe.skipIf(!caps.pattern_claim_source)(
2323
- "claim pattern source matching (capability)",
2324
- () => {
2325
- (0, import_vitest9.it)("claims a pattern-source target when any matched stream has work (^(A|B)$)", async () => {
2326
- const fresh = await options.factory();
2327
- try {
2328
- await fresh.drop();
2329
- await fresh.seed();
2330
- const a = `A-${uid()}`;
2331
- const b = `B-${uid()}`;
2332
- const target = `board-${uid()}`;
2333
- const pattern = `^(${a}|${b})$`;
2334
- await fresh.subscribe([{ stream: target, source: pattern }]);
2335
- const [ea] = await seed_stream(fresh, a, 1);
2336
- const first = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2337
- const l1 = first.find((s) => s.stream === target);
2338
- (0, import_vitest9.expect)(l1).toBeDefined();
2339
- await fresh.ack([{ ...l1, at: ea.id }]);
2340
- const [eb] = await seed_stream(fresh, b, 1);
2341
- const second = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2342
- (0, import_vitest9.expect)(second.find((s) => s.stream === target)).toBeDefined();
2343
- (0, import_vitest9.expect)(eb.stream).toBe(b);
2344
- } finally {
2345
- await fresh.dispose();
2346
- }
2347
- });
2348
- (0, import_vitest9.it)("does not claim a pattern-source target when no matched stream has work", async () => {
2349
- const fresh = await options.factory();
2350
- try {
2351
- await fresh.drop();
2352
- await fresh.seed();
2353
- const a = `A-${uid()}`;
2354
- const b = `B-${uid()}`;
2355
- const other = `Z-${uid()}`;
2356
- const target = `board-${uid()}`;
2357
- const control = `ctl-${uid()}`;
2358
- const pattern = `^(${a}|${b})$`;
2359
- await fresh.subscribe([
2360
- { stream: target, source: pattern },
2361
- { stream: control, source: other }
2362
- ]);
2363
- const [ea] = await seed_stream(fresh, a, 1);
2364
- const first = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2365
- const l1 = first.find((s) => s.stream === target);
2366
- (0, import_vitest9.expect)(l1).toBeDefined();
2367
- (0, import_vitest9.expect)(first.map((s) => s.stream)).not.toContain(control);
2368
- await fresh.ack([{ ...l1, at: ea.id }]);
2369
- await seed_stream(fresh, other, 1);
2370
- const claimed = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2371
- const streams = claimed.map((s) => s.stream);
2372
- (0, import_vitest9.expect)(streams).toContain(control);
2373
- (0, import_vitest9.expect)(streams).not.toContain(target);
2374
- } finally {
2375
- await fresh.dispose();
2376
- }
2377
- });
2378
- }
2379
- );
2380
2387
  import_vitest9.describe.skipIf(!caps.rejects_nonportable_claim_source)(
2381
2388
  "claim source registration (capability)",
2382
2389
  () => {
@@ -2394,23 +2401,6 @@ var runStoreTck = (options) => {
2394
2401
  await fresh.dispose();
2395
2402
  }
2396
2403
  });
2397
- (0, import_vitest9.it)("accepts a portable-subset pattern claim source (^prefix.*) and claims on match", async () => {
2398
- const fresh = await options.factory();
2399
- try {
2400
- await fresh.drop();
2401
- await fresh.seed();
2402
- const prefix = `pfx${uid()}`.replace(/-/g, "");
2403
- const matched = `${prefix}child`;
2404
- const target = `board-${uid()}`;
2405
- await fresh.subscribe([{ stream: target, source: `^${prefix}.*` }]);
2406
- const [e] = await seed_stream(fresh, matched, 1);
2407
- const claimed = await fresh.claim(100, 0, `w-${uid()}`, 3e4);
2408
- (0, import_vitest9.expect)(claimed.find((s) => s.stream === target)).toBeDefined();
2409
- (0, import_vitest9.expect)(e.stream).toBe(matched);
2410
- } finally {
2411
- await fresh.dispose();
2412
- }
2413
- });
2414
2404
  }
2415
2405
  );
2416
2406
  import_vitest9.describe.skipIf(!caps.concurrent_claim)("concurrency (capability)", () => {
@@ -2432,6 +2422,7 @@ var runStoreTck = (options) => {
2432
2422
  );
2433
2423
  }
2434
2424
  const owned = new Set(streams);
2425
+ await correlate(fresh);
2435
2426
  const [a, b] = await Promise.all([
2436
2427
  fresh.claim(100, 100, `wA-${uid()}`, 6e4),
2437
2428
  fresh.claim(100, 100, `wB-${uid()}`, 6e4)
@@ -2452,10 +2443,12 @@ var runStoreTck = (options) => {
2452
2443
  const other = `unexpired-other-${uid()}`;
2453
2444
  await fresh.subscribe([{ stream: s }]);
2454
2445
  await seed_stream(fresh, s, 1);
2446
+ await correlate(fresh);
2455
2447
  const a = await fresh.claim(100, 100, `wA-${uid()}`, 6e4);
2456
2448
  (0, import_vitest9.expect)(a.find((l) => l.stream === s)).toBeDefined();
2457
2449
  await fresh.subscribe([{ stream: other }]);
2458
2450
  await seed_stream(fresh, other, 1);
2451
+ await correlate(fresh);
2459
2452
  const b = await fresh.claim(100, 100, `wB-${uid()}`, 6e4);
2460
2453
  (0, import_vitest9.expect)(b.find((l) => l.stream === other)).toBeDefined();
2461
2454
  (0, import_vitest9.expect)(b.find((l) => l.stream === s)).toBeUndefined();
@@ -2471,6 +2464,7 @@ var runStoreTck = (options) => {
2471
2464
  const s = `expired-${uid()}`;
2472
2465
  await fresh.subscribe([{ stream: s }]);
2473
2466
  const [e1] = await seed_stream(fresh, s, 1);
2467
+ await correlate(fresh);
2474
2468
  const dead = await fresh.claim(100, 0, `wDead-${uid()}`, 0);
2475
2469
  (0, import_vitest9.expect)(dead.find((l) => l.stream === s)?.retry).toBe(0);
2476
2470
  const [b, c] = await Promise.all([
@@ -2482,6 +2476,7 @@ var runStoreTck = (options) => {
2482
2476
  (0, import_vitest9.expect)(winners[0].retry).toBe(1);
2483
2477
  await fresh.ack([{ ...winners[0], at: e1.id }]);
2484
2478
  await seed_stream(fresh, s, 1);
2479
+ await correlate(fresh);
2485
2480
  const again = await fresh.claim(100, 0, `wNext-${uid()}`, 6e4);
2486
2481
  (0, import_vitest9.expect)(again.find((l) => l.stream === s)?.retry).toBe(0);
2487
2482
  } finally {
@@ -2498,6 +2493,7 @@ var runStoreTck = (options) => {
2498
2493
  [inc(1)],
2499
2494
  make_meta({ stream: s })
2500
2495
  );
2496
+ await correlate();
2501
2497
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2502
2498
  const mine = leased.find((l) => l.stream === s);
2503
2499
  (0, import_vitest9.expect)(mine).toBeDefined();
@@ -2508,6 +2504,7 @@ var runStoreTck = (options) => {
2508
2504
  ]);
2509
2505
  (0, import_vitest9.expect)(blocked).toHaveLength(1);
2510
2506
  (0, import_vitest9.expect)(blocked[0].error).toBe("boom");
2507
+ await correlate();
2511
2508
  const again = await store.claim(100, 100, `w2-${uid()}`, 1e5);
2512
2509
  (0, import_vitest9.expect)(again.find((l) => l.stream === s)).toBeUndefined();
2513
2510
  });
@@ -2519,6 +2516,7 @@ var runStoreTck = (options) => {
2519
2516
  [inc(1)],
2520
2517
  make_meta({ stream: s })
2521
2518
  );
2519
+ await correlate();
2522
2520
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2523
2521
  const mine = leased.find((l) => l.stream === s);
2524
2522
  (0, import_vitest9.expect)(mine).toBeDefined();
@@ -2544,6 +2542,7 @@ var runStoreTck = (options) => {
2544
2542
  [inc(1)],
2545
2543
  make_meta({ stream: s })
2546
2544
  );
2545
+ await correlate();
2547
2546
  const leased = await store.claim(100, 0, `right-${uid()}`, 1e5);
2548
2547
  const mine = leased.find((l) => l.stream === s);
2549
2548
  (0, import_vitest9.expect)(mine).toBeDefined();
@@ -2562,6 +2561,7 @@ var runStoreTck = (options) => {
2562
2561
  [inc(1)],
2563
2562
  make_meta({ stream: s })
2564
2563
  );
2564
+ await correlate();
2565
2565
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2566
2566
  const mine = leased.find((l) => l.stream === s);
2567
2567
  (0, import_vitest9.expect)(mine).toBeDefined();
@@ -2588,6 +2588,7 @@ var runStoreTck = (options) => {
2588
2588
  make_meta({ stream: st })
2589
2589
  );
2590
2590
  (0, import_vitest9.expect)(await store.defer([s], Date.now() + 36e5)).toBe(1);
2591
+ await correlate();
2591
2592
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2592
2593
  (0, import_vitest9.expect)(leased.find((l) => l.stream === ctl)).toBeDefined();
2593
2594
  (0, import_vitest9.expect)(leased.find((l) => l.stream === s)).toBeUndefined();
@@ -2601,6 +2602,7 @@ var runStoreTck = (options) => {
2601
2602
  make_meta({ stream: s })
2602
2603
  );
2603
2604
  (0, import_vitest9.expect)(await store.defer([s], Date.now() - 1e3)).toBe(1);
2605
+ await correlate();
2604
2606
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2605
2607
  const mine = leased.find((l) => l.stream === s);
2606
2608
  (0, import_vitest9.expect)(mine).toBeDefined();
@@ -2617,9 +2619,12 @@ var runStoreTck = (options) => {
2617
2619
  make_meta({ stream: s })
2618
2620
  );
2619
2621
  await store.defer([s], Date.now() + 36e5);
2622
+ await correlate();
2620
2623
  await store.claim(100, 100, `w1-${uid()}`, 1e5);
2624
+ await correlate();
2621
2625
  await store.claim(100, 100, `w2-${uid()}`, 1e5);
2622
2626
  await store.defer([s], Date.now() - 1e3);
2627
+ await correlate();
2623
2628
  const leased = await store.claim(100, 100, `w3-${uid()}`, 1e5);
2624
2629
  const mine = leased.find((l) => l.stream === s);
2625
2630
  (0, import_vitest9.expect)(mine).toBeDefined();
@@ -2638,6 +2643,7 @@ var runStoreTck = (options) => {
2638
2643
  );
2639
2644
  await store.defer([s], Date.now() + 36e5);
2640
2645
  (0, import_vitest9.expect)(await store.reset([s])).toBe(1);
2646
+ await correlate();
2641
2647
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2642
2648
  (0, import_vitest9.expect)(leased.find((l) => l.stream === s)).toBeDefined();
2643
2649
  });
@@ -2686,6 +2692,7 @@ var runStoreTck = (options) => {
2686
2692
  Date.now() + 36e5
2687
2693
  );
2688
2694
  (0, import_vitest9.expect)(n).toBe(2);
2695
+ await correlate();
2689
2696
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2690
2697
  (0, import_vitest9.expect)(leased.find((l) => l.stream === ctl)).toBeDefined();
2691
2698
  (0, import_vitest9.expect)(leased.find((l) => l.stream === a)).toBeUndefined();
@@ -2721,6 +2728,7 @@ var runStoreTck = (options) => {
2721
2728
  [inc(1)],
2722
2729
  make_meta({ stream: ctl })
2723
2730
  );
2731
+ await correlate();
2724
2732
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2725
2733
  const s_lease = leased.find((l) => l.stream === s);
2726
2734
  const ctl_lease = leased.find((l) => l.stream === ctl);
@@ -2735,6 +2743,7 @@ var runStoreTck = (options) => {
2735
2743
  [inc(2)],
2736
2744
  make_meta({ stream: ctl })
2737
2745
  );
2746
+ await correlate();
2738
2747
  const again = await store.claim(100, 100, `w-${uid()}`, 1e5);
2739
2748
  (0, import_vitest9.expect)(again.find((l) => l.stream === ctl)).toBeDefined();
2740
2749
  (0, import_vitest9.expect)(again.find((l) => l.stream === s)).toBeUndefined();
@@ -2747,9 +2756,11 @@ var runStoreTck = (options) => {
2747
2756
  [inc(1)],
2748
2757
  make_meta({ stream: s })
2749
2758
  );
2759
+ await correlate();
2750
2760
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2751
2761
  const mine = leased.find((l) => l.stream === s);
2752
2762
  await store.ack([{ ...mine, due: Date.now() - 1e3, retry: -1 }]);
2763
+ await correlate();
2753
2764
  const again = await store.claim(100, 100, `w-${uid()}`, 1e5);
2754
2765
  const re = again.find((l) => l.stream === s);
2755
2766
  (0, import_vitest9.expect)(re).toBeDefined();
@@ -2765,9 +2776,11 @@ var runStoreTck = (options) => {
2765
2776
  [inc(1)],
2766
2777
  make_meta({ stream: s })
2767
2778
  );
2779
+ await correlate();
2768
2780
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2769
2781
  const mine = leased.find((l) => l.stream === s);
2770
2782
  await store.ack([{ ...mine, due: Date.now() - 1e3, retry: 3 }]);
2783
+ await correlate();
2771
2784
  const again = await store.claim(100, 100, `w-${uid()}`, 1e5);
2772
2785
  const re = again.find((l) => l.stream === s);
2773
2786
  (0, import_vitest9.expect)(re).toBeDefined();
@@ -2788,12 +2801,14 @@ var runStoreTck = (options) => {
2788
2801
  [inc(1)],
2789
2802
  make_meta({ stream: s })
2790
2803
  );
2804
+ await correlate();
2791
2805
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2792
2806
  const mine = leased.find((l) => l.stream === s);
2793
2807
  (0, import_vitest9.expect)(mine.at).toBeLessThan(e1.id);
2794
2808
  await store.ack([
2795
2809
  { ...mine, at: e1.id, due: Date.now() - 1e3, retry: 2 }
2796
2810
  ]);
2811
+ await correlate();
2797
2812
  const again = await store.claim(100, 100, `w-${uid()}`, 1e5);
2798
2813
  const re = again.find((l) => l.stream === s);
2799
2814
  (0, import_vitest9.expect)(re).toBeDefined();
@@ -2809,6 +2824,7 @@ var runStoreTck = (options) => {
2809
2824
  [inc(1)],
2810
2825
  make_meta({ stream: s })
2811
2826
  );
2827
+ await correlate();
2812
2828
  const leased = await store.claim(100, 100, `w-${uid()}`, 1e5);
2813
2829
  const mine = leased.find((l) => l.stream === s);
2814
2830
  await store.ack([
@@ -2827,11 +2843,13 @@ var runStoreTck = (options) => {
2827
2843
  [inc(1)],
2828
2844
  make_meta({ stream: s })
2829
2845
  );
2846
+ await correlate();
2830
2847
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2831
2848
  const mine = leased.find((l) => l.stream === s);
2832
2849
  (0, import_vitest9.expect)(mine).toBeDefined();
2833
2850
  await store.ack([{ ...mine, at: 99 }]);
2834
2851
  (0, import_vitest9.expect)(await store.reset([s])).toBe(1);
2852
+ await correlate();
2835
2853
  const after = await store.claim(100, 0, `w2-${uid()}`, 1e5);
2836
2854
  const back = after.find((l) => l.stream === s);
2837
2855
  (0, import_vitest9.expect)(back).toBeDefined();
@@ -2845,12 +2863,14 @@ var runStoreTck = (options) => {
2845
2863
  [inc(1)],
2846
2864
  make_meta({ stream: s })
2847
2865
  );
2866
+ await correlate();
2848
2867
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2849
2868
  const mine = leased.find((l) => l.stream === s);
2850
2869
  const others = leased.filter((l) => l.stream !== s);
2851
2870
  await store.ack(others);
2852
2871
  await store.block([{ ...mine, error: "boom" }]);
2853
2872
  (0, import_vitest9.expect)(await store.reset([s])).toBe(1);
2873
+ await correlate();
2854
2874
  const after = await store.claim(100, 0, `w2-${uid()}`, 1e5);
2855
2875
  (0, import_vitest9.expect)(after.find((l) => l.stream === s)).toBeDefined();
2856
2876
  });
@@ -2883,9 +2903,11 @@ var runStoreTck = (options) => {
2883
2903
  [inc(2)],
2884
2904
  make_meta({ stream: s })
2885
2905
  );
2906
+ await correlate();
2886
2907
  const first = await store.claim(100, 0, `w-${uid()}`, 1e5);
2887
2908
  const m1 = first.find((l) => l.stream === s);
2888
2909
  await store.ack([{ ...m1, at: m1.at }]);
2910
+ await correlate();
2889
2911
  const before_block = await store.claim(100, 0, `w-${uid()}`, 1e5);
2890
2912
  const m2 = before_block.find((l) => l.stream === s);
2891
2913
  (0, import_vitest9.expect)(m2).toBeDefined();
@@ -2900,6 +2922,7 @@ var runStoreTck = (options) => {
2900
2922
  );
2901
2923
  (0, import_vitest9.expect)(blocked_flag).toBe(true);
2902
2924
  (0, import_vitest9.expect)(await store.unblock([s])).toBe(1);
2925
+ await correlate();
2903
2926
  const after = await store.claim(100, 0, `w-${uid()}`, 1e5);
2904
2927
  const back = after.find((l) => l.stream === s);
2905
2928
  (0, import_vitest9.expect)(back).toBeDefined();
@@ -2934,6 +2957,7 @@ var runStoreTck = (options) => {
2934
2957
  [inc(1)],
2935
2958
  make_meta({ stream: s2 })
2936
2959
  );
2960
+ await correlate();
2937
2961
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2938
2962
  const m1 = leased.find((l) => l.stream === s1);
2939
2963
  const others = leased.filter((l) => l.stream !== s1);
@@ -2962,6 +2986,7 @@ var runStoreTck = (options) => {
2962
2986
  [inc(1)],
2963
2987
  make_meta({ stream: s3 })
2964
2988
  );
2989
+ await correlate();
2965
2990
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2966
2991
  const blockable = leased.filter((l) => l.stream === s1 || l.stream === s2 || l.stream === s3).map((l) => ({ ...l, error: "boom" }));
2967
2992
  await store.ack(
@@ -2974,6 +2999,7 @@ var runStoreTck = (options) => {
2974
2999
  stream: `^unblock-filter-${tag}-`
2975
3000
  });
2976
3001
  (0, import_vitest9.expect)(count).toBe(2);
3002
+ await correlate();
2977
3003
  const after = await store.claim(100, 0, `w-${uid()}`, 1e5);
2978
3004
  (0, import_vitest9.expect)(after.find((l) => l.stream === s3)).toBeUndefined();
2979
3005
  (0, import_vitest9.expect)(after.find((l) => l.stream === s1)).toBeDefined();
@@ -2994,6 +3020,7 @@ var runStoreTck = (options) => {
2994
3020
  [inc(1)],
2995
3021
  make_meta({ stream: s2 })
2996
3022
  );
3023
+ await correlate();
2997
3024
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
2998
3025
  const mine = leased.filter((l) => l.stream === s1 || l.stream === s2);
2999
3026
  await store.ack(leased.filter((l) => !mine.includes(l)));
@@ -3048,6 +3075,7 @@ var runStoreTck = (options) => {
3048
3075
  [inc(1)],
3049
3076
  make_meta({ stream: other })
3050
3077
  );
3078
+ await correlate();
3051
3079
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
3052
3080
  const mine = leased.filter(
3053
3081
  (l) => l.stream === s1 || l.stream === s2 || l.stream === other
@@ -3084,6 +3112,7 @@ var runStoreTck = (options) => {
3084
3112
  [inc(1)],
3085
3113
  make_meta({ stream: s2 })
3086
3114
  );
3115
+ await correlate();
3087
3116
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
3088
3117
  const m1 = leased.find((l) => l.stream === s1);
3089
3118
  await store.ack(leased.filter((l) => l.stream !== s1));
@@ -3174,6 +3203,7 @@ var runStoreTck = (options) => {
3174
3203
  { stream: sub_default, source: src1 },
3175
3204
  { stream: sub_slow, source: src2, lane: "slow" }
3176
3205
  ]);
3206
+ await correlate();
3177
3207
  const slow = await store.claim(50, 0, `w-slow-${tag}`, 1e3, "slow");
3178
3208
  const slow_mine = slow.filter(
3179
3209
  (l) => l.stream === sub_default || l.stream === sub_slow
@@ -3181,6 +3211,7 @@ var runStoreTck = (options) => {
3181
3211
  (0, import_vitest9.expect)(slow_mine.map((l) => l.stream)).toEqual([sub_slow]);
3182
3212
  (0, import_vitest9.expect)(slow_mine[0]?.lane).toBe("slow");
3183
3213
  await store.ack(slow_mine.map((l) => ({ ...l, at: l.at + 1 })));
3214
+ await correlate();
3184
3215
  const all = await store.claim(50, 0, `w-all-${tag}`, 1e3);
3185
3216
  const all_mine = all.filter((l) => l.stream === sub_default || l.stream === sub_slow).map((l) => ({ stream: l.stream, lane: l.lane }));
3186
3217
  (0, import_vitest9.expect)(all_mine).toEqual(
@@ -3240,6 +3271,7 @@ var runStoreTck = (options) => {
3240
3271
  { stream: a, source: src, lane: `rslow-${tag}` },
3241
3272
  { stream: b, source: src, lane: `rfast-${tag}` }
3242
3273
  ]);
3274
+ await correlate();
3243
3275
  const leases = await store.claim(50, 0, `w-${tag}`, 5e3);
3244
3276
  const mine = leases.filter((l) => l.stream === a || l.stream === b);
3245
3277
  await store.ack(mine.map((l) => ({ ...l, at: l.at + 1 })));
@@ -3269,6 +3301,7 @@ var runStoreTck = (options) => {
3269
3301
  { stream: a, source: src, lane: `uslow-${tag}` },
3270
3302
  { stream: b, source: src, lane: `ufast-${tag}` }
3271
3303
  ]);
3304
+ await correlate();
3272
3305
  const leases = await store.claim(50, 0, `w-${tag}`, 5e3);
3273
3306
  const mine = leases.filter((l) => l.stream === a || l.stream === b);
3274
3307
  await store.block(mine.map((l) => ({ ...l, error: "boom" })));
@@ -3659,6 +3692,7 @@ var runStoreTck = (options) => {
3659
3692
  [inc(1)],
3660
3693
  make_meta({ stream: s })
3661
3694
  );
3695
+ await correlate();
3662
3696
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
3663
3697
  const mine = leased.find((l) => l.stream === s);
3664
3698
  const others = leased.filter((l) => l.stream !== s);
@@ -3907,6 +3941,7 @@ var runStoreTck = (options) => {
3907
3941
  [inc(2)],
3908
3942
  make_meta({ stream: b })
3909
3943
  );
3944
+ await correlate();
3910
3945
  const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
3911
3946
  const mine = leased.find((l) => l.stream === a);
3912
3947
  (0, import_vitest9.expect)(mine).toBeDefined();