@rotorsoft/act-tck 0.2.0 → 0.4.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/README.md +56 -59
- package/dist/.tsbuildinfo +1 -1
- package/dist/@types/store-tck.d.ts.map +1 -1
- package/dist/index.cjs +394 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +395 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -352,6 +352,14 @@ var runStoreTck = (options) => {
|
|
|
352
352
|
(0, import_vitest3.expect)(backward.map((e) => e.id)).toEqual(
|
|
353
353
|
[...committed].reverse().map((c) => c.id)
|
|
354
354
|
);
|
|
355
|
+
const latest = await collect(store, {
|
|
356
|
+
stream: s,
|
|
357
|
+
stream_exact: true,
|
|
358
|
+
backward: true,
|
|
359
|
+
limit: 1
|
|
360
|
+
});
|
|
361
|
+
(0, import_vitest3.expect)(latest).toHaveLength(1);
|
|
362
|
+
(0, import_vitest3.expect)(latest[0].id).toBe(committed.at(-1).id);
|
|
355
363
|
});
|
|
356
364
|
(0, import_vitest3.it)("after/before bound the id range", async () => {
|
|
357
365
|
const s = `q-bounds-${uid()}`;
|
|
@@ -908,6 +916,169 @@ var runStoreTck = (options) => {
|
|
|
908
916
|
(0, import_vitest3.expect)(got2.priority).toBe(5);
|
|
909
917
|
});
|
|
910
918
|
});
|
|
919
|
+
(0, import_vitest3.describe)("lanes", () => {
|
|
920
|
+
(0, import_vitest3.it)("subscribe defaults lane to 'default' when omitted", async () => {
|
|
921
|
+
const s = `lane-default-${uid()}`;
|
|
922
|
+
await store.subscribe([{ stream: s }]);
|
|
923
|
+
const seen = [];
|
|
924
|
+
await store.query_streams((p) => seen.push(p.lane), {
|
|
925
|
+
stream: s,
|
|
926
|
+
stream_exact: true
|
|
927
|
+
});
|
|
928
|
+
(0, import_vitest3.expect)(seen).toEqual(["default"]);
|
|
929
|
+
});
|
|
930
|
+
(0, import_vitest3.it)("subscribe records the lane passed in", async () => {
|
|
931
|
+
const s = `lane-set-${uid()}`;
|
|
932
|
+
await store.subscribe([{ stream: s, lane: "slow" }]);
|
|
933
|
+
const seen = [];
|
|
934
|
+
await store.query_streams((p) => seen.push(p.lane), {
|
|
935
|
+
stream: s,
|
|
936
|
+
stream_exact: true
|
|
937
|
+
});
|
|
938
|
+
(0, import_vitest3.expect)(seen).toEqual(["slow"]);
|
|
939
|
+
});
|
|
940
|
+
(0, import_vitest3.it)("subscribe re-lanes existing streams on subsequent calls", async () => {
|
|
941
|
+
const s = `lane-upsert-${uid()}`;
|
|
942
|
+
await store.subscribe([{ stream: s, lane: "slow" }]);
|
|
943
|
+
await store.subscribe([{ stream: s, lane: "fast" }]);
|
|
944
|
+
const seen = [];
|
|
945
|
+
await store.query_streams((p) => seen.push(p.lane), {
|
|
946
|
+
stream: s,
|
|
947
|
+
stream_exact: true
|
|
948
|
+
});
|
|
949
|
+
(0, import_vitest3.expect)(seen).toEqual(["fast"]);
|
|
950
|
+
});
|
|
951
|
+
(0, import_vitest3.it)("claim() filters by lane when supplied and returns lane on the Lease", async () => {
|
|
952
|
+
const tag = uid();
|
|
953
|
+
const src1 = `lane-claim-src1-${tag}`;
|
|
954
|
+
const src2 = `lane-claim-src2-${tag}`;
|
|
955
|
+
const subDefault = `lane-claim-def-${tag}`;
|
|
956
|
+
const subSlow = `lane-claim-slow-${tag}`;
|
|
957
|
+
await store.commit(
|
|
958
|
+
src1,
|
|
959
|
+
[inc(1)],
|
|
960
|
+
makeMeta({ stream: src1 })
|
|
961
|
+
);
|
|
962
|
+
await store.commit(
|
|
963
|
+
src2,
|
|
964
|
+
[inc(1)],
|
|
965
|
+
makeMeta({ stream: src2 })
|
|
966
|
+
);
|
|
967
|
+
await store.subscribe([
|
|
968
|
+
{ stream: subDefault, source: src1 },
|
|
969
|
+
{ stream: subSlow, source: src2, lane: "slow" }
|
|
970
|
+
]);
|
|
971
|
+
const slow = await store.claim(50, 0, `w-slow-${tag}`, 1e3, "slow");
|
|
972
|
+
const slowMine = slow.filter(
|
|
973
|
+
(l) => l.stream === subDefault || l.stream === subSlow
|
|
974
|
+
);
|
|
975
|
+
(0, import_vitest3.expect)(slowMine.map((l) => l.stream)).toEqual([subSlow]);
|
|
976
|
+
(0, import_vitest3.expect)(slowMine[0]?.lane).toBe("slow");
|
|
977
|
+
await store.ack(slowMine.map((l) => ({ ...l, at: l.at + 1 })));
|
|
978
|
+
const all = await store.claim(50, 0, `w-all-${tag}`, 1e3);
|
|
979
|
+
const allMine = all.filter((l) => l.stream === subDefault || l.stream === subSlow).map((l) => ({ stream: l.stream, lane: l.lane }));
|
|
980
|
+
(0, import_vitest3.expect)(allMine).toEqual(
|
|
981
|
+
import_vitest3.expect.arrayContaining([
|
|
982
|
+
{ stream: subDefault, lane: "default" },
|
|
983
|
+
{ stream: subSlow, lane: "slow" }
|
|
984
|
+
])
|
|
985
|
+
);
|
|
986
|
+
});
|
|
987
|
+
(0, import_vitest3.it)("query_streams filters by lane", async () => {
|
|
988
|
+
const tag = uid();
|
|
989
|
+
const a = `lane-q-a-${tag}`;
|
|
990
|
+
const b = `lane-q-b-${tag}`;
|
|
991
|
+
const c = `lane-q-c-${tag}`;
|
|
992
|
+
await store.subscribe([
|
|
993
|
+
{ stream: a, lane: "qslow" },
|
|
994
|
+
{ stream: b, lane: "qfast" },
|
|
995
|
+
{ stream: c, lane: "qslow" }
|
|
996
|
+
]);
|
|
997
|
+
const seen = [];
|
|
998
|
+
await store.query_streams((p) => seen.push(p.stream), {
|
|
999
|
+
lane: "qslow",
|
|
1000
|
+
stream: `lane-q-.*-${tag}`,
|
|
1001
|
+
limit: 100
|
|
1002
|
+
});
|
|
1003
|
+
(0, import_vitest3.expect)(seen.sort()).toEqual([a, c]);
|
|
1004
|
+
});
|
|
1005
|
+
(0, import_vitest3.it)("prioritize filters by lane", async () => {
|
|
1006
|
+
const tag = uid();
|
|
1007
|
+
const a = `lane-pri-a-${tag}`;
|
|
1008
|
+
const b = `lane-pri-b-${tag}`;
|
|
1009
|
+
await store.subscribe([
|
|
1010
|
+
{ stream: a, lane: `pslow-${tag}` },
|
|
1011
|
+
{ stream: b, lane: `pfast-${tag}` }
|
|
1012
|
+
]);
|
|
1013
|
+
const updated = await store.prioritize({ lane: `pslow-${tag}` }, 7);
|
|
1014
|
+
(0, import_vitest3.expect)(updated).toBe(1);
|
|
1015
|
+
const seen = /* @__PURE__ */ new Map();
|
|
1016
|
+
await store.query_streams((p) => seen.set(p.stream, p.priority), {
|
|
1017
|
+
stream: `lane-pri-.*-${tag}`,
|
|
1018
|
+
limit: 100
|
|
1019
|
+
});
|
|
1020
|
+
(0, import_vitest3.expect)(seen.get(a)).toBe(7);
|
|
1021
|
+
(0, import_vitest3.expect)(seen.get(b)).toBe(0);
|
|
1022
|
+
});
|
|
1023
|
+
(0, import_vitest3.it)("reset filters by lane", async () => {
|
|
1024
|
+
const tag = uid();
|
|
1025
|
+
const src = `lane-reset-src-${tag}`;
|
|
1026
|
+
const a = `lane-reset-a-${tag}`;
|
|
1027
|
+
const b = `lane-reset-b-${tag}`;
|
|
1028
|
+
await store.commit(
|
|
1029
|
+
src,
|
|
1030
|
+
[inc(1)],
|
|
1031
|
+
makeMeta({ stream: src })
|
|
1032
|
+
);
|
|
1033
|
+
await store.subscribe([
|
|
1034
|
+
{ stream: a, source: src, lane: `rslow-${tag}` },
|
|
1035
|
+
{ stream: b, source: src, lane: `rfast-${tag}` }
|
|
1036
|
+
]);
|
|
1037
|
+
const leases = await store.claim(50, 0, `w-${tag}`, 5e3);
|
|
1038
|
+
const mine = leases.filter((l) => l.stream === a || l.stream === b);
|
|
1039
|
+
await store.ack(mine.map((l) => ({ ...l, at: l.at + 1 })));
|
|
1040
|
+
const count = await store.reset({ lane: `rslow-${tag}` });
|
|
1041
|
+
(0, import_vitest3.expect)(count).toBe(1);
|
|
1042
|
+
const ats = /* @__PURE__ */ new Map();
|
|
1043
|
+
for (const name of [a, b]) {
|
|
1044
|
+
await store.query_streams((p) => ats.set(p.stream, p.at), {
|
|
1045
|
+
stream: name,
|
|
1046
|
+
stream_exact: true
|
|
1047
|
+
});
|
|
1048
|
+
}
|
|
1049
|
+
(0, import_vitest3.expect)(ats.get(a)).toBe(-1);
|
|
1050
|
+
(0, import_vitest3.expect)(ats.get(b)).toBeGreaterThanOrEqual(0);
|
|
1051
|
+
});
|
|
1052
|
+
(0, import_vitest3.it)("unblock filters by lane", async () => {
|
|
1053
|
+
const tag = uid();
|
|
1054
|
+
const src = `lane-ub-src-${tag}`;
|
|
1055
|
+
const a = `lane-ub-a-${tag}`;
|
|
1056
|
+
const b = `lane-ub-b-${tag}`;
|
|
1057
|
+
await store.commit(
|
|
1058
|
+
src,
|
|
1059
|
+
[inc(1)],
|
|
1060
|
+
makeMeta({ stream: src })
|
|
1061
|
+
);
|
|
1062
|
+
await store.subscribe([
|
|
1063
|
+
{ stream: a, source: src, lane: `uslow-${tag}` },
|
|
1064
|
+
{ stream: b, source: src, lane: `ufast-${tag}` }
|
|
1065
|
+
]);
|
|
1066
|
+
const leases = await store.claim(50, 0, `w-${tag}`, 5e3);
|
|
1067
|
+
const mine = leases.filter((l) => l.stream === a || l.stream === b);
|
|
1068
|
+
await store.block(mine.map((l) => ({ ...l, error: "boom" })));
|
|
1069
|
+
const count = await store.unblock({ lane: `uslow-${tag}` });
|
|
1070
|
+
(0, import_vitest3.expect)(count).toBe(1);
|
|
1071
|
+
const blocked = /* @__PURE__ */ new Map();
|
|
1072
|
+
for (const name of [a, b]) {
|
|
1073
|
+
await store.query_streams((p) => blocked.set(p.stream, p.blocked), {
|
|
1074
|
+
stream: name,
|
|
1075
|
+
stream_exact: true
|
|
1076
|
+
});
|
|
1077
|
+
}
|
|
1078
|
+
(0, import_vitest3.expect)(blocked.get(a)).toBe(false);
|
|
1079
|
+
(0, import_vitest3.expect)(blocked.get(b)).toBe(true);
|
|
1080
|
+
});
|
|
1081
|
+
});
|
|
911
1082
|
(0, import_vitest3.describe)("truncate", () => {
|
|
912
1083
|
(0, import_vitest3.it)("seeds a tombstone when no snapshot is provided", async () => {
|
|
913
1084
|
const s = `trunc-tomb-${uid()}`;
|
|
@@ -1060,6 +1231,229 @@ var runStoreTck = (options) => {
|
|
|
1060
1231
|
(0, import_vitest3.expect)(unblocked).toEqual([sibling]);
|
|
1061
1232
|
});
|
|
1062
1233
|
});
|
|
1234
|
+
(0, import_vitest3.describe)("query_stats", () => {
|
|
1235
|
+
(0, import_vitest3.it)("array input \u2014 returns head per stream, absent when not in input", async () => {
|
|
1236
|
+
const tag = uid();
|
|
1237
|
+
const sA = `qst-${tag}-a`;
|
|
1238
|
+
const sB = `qst-${tag}-b`;
|
|
1239
|
+
const sUnasked = `qst-${tag}-unasked`;
|
|
1240
|
+
await store.commit(
|
|
1241
|
+
sA,
|
|
1242
|
+
[inc(1), inc(2)],
|
|
1243
|
+
makeMeta({ stream: sA })
|
|
1244
|
+
);
|
|
1245
|
+
await store.commit(
|
|
1246
|
+
sB,
|
|
1247
|
+
[dec(5)],
|
|
1248
|
+
makeMeta({ stream: sB })
|
|
1249
|
+
);
|
|
1250
|
+
await store.commit(
|
|
1251
|
+
sUnasked,
|
|
1252
|
+
[inc(99)],
|
|
1253
|
+
makeMeta({ stream: sUnasked })
|
|
1254
|
+
);
|
|
1255
|
+
const stats = await store.query_stats([sA, sB]);
|
|
1256
|
+
(0, import_vitest3.expect)(stats.size).toBe(2);
|
|
1257
|
+
(0, import_vitest3.expect)(stats.get(sA)?.head.name).toBe("Incremented");
|
|
1258
|
+
(0, import_vitest3.expect)((stats.get(sA)?.head.data).amount).toBe(2);
|
|
1259
|
+
(0, import_vitest3.expect)(stats.get(sB)?.head.name).toBe("Decremented");
|
|
1260
|
+
(0, import_vitest3.expect)((stats.get(sB)?.head.data).amount).toBe(5);
|
|
1261
|
+
(0, import_vitest3.expect)(stats.has(sUnasked)).toBe(false);
|
|
1262
|
+
const empty = await store.query_stats([]);
|
|
1263
|
+
(0, import_vitest3.expect)(empty.size).toBe(0);
|
|
1264
|
+
const unknown = await store.query_stats([`qst-${tag}-missing`]);
|
|
1265
|
+
(0, import_vitest3.expect)(unknown.size).toBe(0);
|
|
1266
|
+
});
|
|
1267
|
+
(0, import_vitest3.it)("tail returns the earliest event per stream", async () => {
|
|
1268
|
+
const tag = uid();
|
|
1269
|
+
const s = `qst-tail-${tag}`;
|
|
1270
|
+
await store.commit(s, [inc(1)], makeMeta({ stream: s }));
|
|
1271
|
+
await store.commit(s, [inc(2)], makeMeta({ stream: s }));
|
|
1272
|
+
await store.commit(s, [inc(3)], makeMeta({ stream: s }));
|
|
1273
|
+
const stats = await store.query_stats([s], {
|
|
1274
|
+
tail: true
|
|
1275
|
+
});
|
|
1276
|
+
const r = stats.get(s);
|
|
1277
|
+
(0, import_vitest3.expect)(r?.head.name).toBe("Incremented");
|
|
1278
|
+
(0, import_vitest3.expect)((r?.head.data).amount).toBe(3);
|
|
1279
|
+
(0, import_vitest3.expect)(r?.tail?.name).toBe("Incremented");
|
|
1280
|
+
(0, import_vitest3.expect)((r?.tail?.data).amount).toBe(1);
|
|
1281
|
+
});
|
|
1282
|
+
(0, import_vitest3.it)("count + names \u2014 full aggregates including framework markers", async () => {
|
|
1283
|
+
const tag = uid();
|
|
1284
|
+
const s = `qst-cn-${tag}`;
|
|
1285
|
+
await store.commit(s, [inc(1)], makeMeta({ stream: s }));
|
|
1286
|
+
await store.truncate([{ stream: s, snapshot: { count: 99 } }]);
|
|
1287
|
+
await store.commit(
|
|
1288
|
+
s,
|
|
1289
|
+
[inc(2), inc(3), dec(1)],
|
|
1290
|
+
makeMeta({ stream: s })
|
|
1291
|
+
);
|
|
1292
|
+
const stats = await store.query_stats([s], {
|
|
1293
|
+
count: true,
|
|
1294
|
+
names: true
|
|
1295
|
+
});
|
|
1296
|
+
const r = stats.get(s);
|
|
1297
|
+
(0, import_vitest3.expect)(r?.count).toBe(4);
|
|
1298
|
+
(0, import_vitest3.expect)(r?.names?.[import_act.SNAP_EVENT]).toBe(1);
|
|
1299
|
+
(0, import_vitest3.expect)(r?.names?.Incremented).toBe(2);
|
|
1300
|
+
(0, import_vitest3.expect)(r?.names?.Decremented).toBe(1);
|
|
1301
|
+
(0, import_vitest3.expect)(r?.names?.[import_act.SNAP_EVENT]).toBe(1);
|
|
1302
|
+
});
|
|
1303
|
+
(0, import_vitest3.it)("exclude shifts head past filtered events; stream absent when all filtered", async () => {
|
|
1304
|
+
const tag = uid();
|
|
1305
|
+
const s = `qst-excl-${tag}`;
|
|
1306
|
+
const sAllOut = `qst-allout-${tag}`;
|
|
1307
|
+
await store.commit(
|
|
1308
|
+
s,
|
|
1309
|
+
[inc(1), dec(2), inc(3)],
|
|
1310
|
+
makeMeta({ stream: s })
|
|
1311
|
+
);
|
|
1312
|
+
await store.commit(
|
|
1313
|
+
sAllOut,
|
|
1314
|
+
[inc(7)],
|
|
1315
|
+
makeMeta({ stream: sAllOut })
|
|
1316
|
+
);
|
|
1317
|
+
const all = await store.query_stats([s]);
|
|
1318
|
+
(0, import_vitest3.expect)(all.get(s)?.head.name).toBe("Incremented");
|
|
1319
|
+
(0, import_vitest3.expect)((all.get(s)?.head.data).amount).toBe(3);
|
|
1320
|
+
const excl = await store.query_stats([s], {
|
|
1321
|
+
exclude: ["Incremented"]
|
|
1322
|
+
});
|
|
1323
|
+
(0, import_vitest3.expect)(excl.get(s)?.head.name).toBe("Decremented");
|
|
1324
|
+
(0, import_vitest3.expect)((excl.get(s)?.head.data).amount).toBe(2);
|
|
1325
|
+
const wipe = await store.query_stats([sAllOut], {
|
|
1326
|
+
exclude: ["Incremented", "Decremented", "Reset"]
|
|
1327
|
+
});
|
|
1328
|
+
(0, import_vitest3.expect)(wipe.has(sAllOut)).toBe(false);
|
|
1329
|
+
const noTomb = await store.query_stats([s], {
|
|
1330
|
+
exclude: [import_act.TOMBSTONE_EVENT]
|
|
1331
|
+
});
|
|
1332
|
+
(0, import_vitest3.expect)(noTomb.get(s)?.head.name).toBe("Incremented");
|
|
1333
|
+
});
|
|
1334
|
+
(0, import_vitest3.it)("before \u2014 time travel narrows head/tail/count", async () => {
|
|
1335
|
+
const tag = uid();
|
|
1336
|
+
const s = `qst-tt-${tag}`;
|
|
1337
|
+
const c1 = await store.commit(
|
|
1338
|
+
s,
|
|
1339
|
+
[inc(1)],
|
|
1340
|
+
makeMeta({ stream: s })
|
|
1341
|
+
);
|
|
1342
|
+
const c2 = await store.commit(
|
|
1343
|
+
s,
|
|
1344
|
+
[inc(2)],
|
|
1345
|
+
makeMeta({ stream: s })
|
|
1346
|
+
);
|
|
1347
|
+
await store.commit(s, [inc(3)], makeMeta({ stream: s }));
|
|
1348
|
+
const before = c2[0].id;
|
|
1349
|
+
const stats = await store.query_stats([s], {
|
|
1350
|
+
tail: true,
|
|
1351
|
+
count: true,
|
|
1352
|
+
before
|
|
1353
|
+
});
|
|
1354
|
+
const r = stats.get(s);
|
|
1355
|
+
(0, import_vitest3.expect)(r?.count).toBe(1);
|
|
1356
|
+
(0, import_vitest3.expect)(r?.head.id).toBe(c1[0].id);
|
|
1357
|
+
(0, import_vitest3.expect)(r?.tail?.id).toBe(c1[0].id);
|
|
1358
|
+
const empty = await store.query_stats([s], {
|
|
1359
|
+
before: 0
|
|
1360
|
+
});
|
|
1361
|
+
(0, import_vitest3.expect)(empty.has(s)).toBe(false);
|
|
1362
|
+
});
|
|
1363
|
+
(0, import_vitest3.it)("filter form \u2014 stream regex, stream_exact, empty {} match", async () => {
|
|
1364
|
+
const tag = uid();
|
|
1365
|
+
const sA = `qsf-${tag}-orders-1`;
|
|
1366
|
+
const sB = `qsf-${tag}-orders-2`;
|
|
1367
|
+
const sOther = `qsf-${tag}-users-1`;
|
|
1368
|
+
await store.commit(
|
|
1369
|
+
sA,
|
|
1370
|
+
[inc(1)],
|
|
1371
|
+
makeMeta({ stream: sA })
|
|
1372
|
+
);
|
|
1373
|
+
await store.commit(
|
|
1374
|
+
sB,
|
|
1375
|
+
[inc(2)],
|
|
1376
|
+
makeMeta({ stream: sB })
|
|
1377
|
+
);
|
|
1378
|
+
await store.commit(
|
|
1379
|
+
sOther,
|
|
1380
|
+
[inc(3)],
|
|
1381
|
+
makeMeta({ stream: sOther })
|
|
1382
|
+
);
|
|
1383
|
+
const orders = await store.query_stats({
|
|
1384
|
+
stream: `^qsf-${tag}-orders-`
|
|
1385
|
+
});
|
|
1386
|
+
(0, import_vitest3.expect)([...orders.keys()].sort()).toEqual([sA, sB].sort());
|
|
1387
|
+
const exact = await store.query_stats({
|
|
1388
|
+
stream: sA,
|
|
1389
|
+
stream_exact: true
|
|
1390
|
+
});
|
|
1391
|
+
(0, import_vitest3.expect)([...exact.keys()]).toEqual([sA]);
|
|
1392
|
+
const all = await store.query_stats({
|
|
1393
|
+
stream: `^qsf-${tag}-`
|
|
1394
|
+
});
|
|
1395
|
+
(0, import_vitest3.expect)([...all.keys()].sort()).toEqual([sA, sB, sOther].sort());
|
|
1396
|
+
});
|
|
1397
|
+
(0, import_vitest3.it)("compose with query_streams for subscription-level filters", async () => {
|
|
1398
|
+
const tag = uid();
|
|
1399
|
+
const a = `qsc-${tag}-a`;
|
|
1400
|
+
const b = `qsc-${tag}-b`;
|
|
1401
|
+
await store.subscribe([{ stream: a }, { stream: b }]);
|
|
1402
|
+
await store.commit(a, [inc(1)], makeMeta({ stream: a }));
|
|
1403
|
+
await store.commit(b, [inc(2)], makeMeta({ stream: b }));
|
|
1404
|
+
const leased = await store.claim(100, 0, `w-${uid()}`, 1e5);
|
|
1405
|
+
const mine = leased.find((l) => l.stream === a);
|
|
1406
|
+
(0, import_vitest3.expect)(mine).toBeDefined();
|
|
1407
|
+
const others = leased.filter((l) => l.stream !== a);
|
|
1408
|
+
await store.ack(others);
|
|
1409
|
+
await store.block([{ ...mine, error: "boom" }]);
|
|
1410
|
+
const blockedNames = [];
|
|
1411
|
+
await store.query_streams((p) => blockedNames.push(p.stream), {
|
|
1412
|
+
stream: `^qsc-${tag}-`,
|
|
1413
|
+
blocked: true
|
|
1414
|
+
});
|
|
1415
|
+
(0, import_vitest3.expect)(blockedNames).toEqual([a]);
|
|
1416
|
+
const stats = await store.query_stats(blockedNames);
|
|
1417
|
+
(0, import_vitest3.expect)(stats.get(a)?.head.name).toBe("Incremented");
|
|
1418
|
+
(0, import_vitest3.expect)(stats.has(b)).toBe(false);
|
|
1419
|
+
});
|
|
1420
|
+
(0, import_vitest3.it)("empty filter {} \u2014 matches every event-bearing stream", async () => {
|
|
1421
|
+
const tag = uid();
|
|
1422
|
+
const a = `qse-${tag}-a`;
|
|
1423
|
+
const b = `qse-${tag}-b`;
|
|
1424
|
+
await store.commit(a, [inc(1)], makeMeta({ stream: a }));
|
|
1425
|
+
await store.commit(b, [dec(2)], makeMeta({ stream: b }));
|
|
1426
|
+
const all = await store.query_stats({});
|
|
1427
|
+
(0, import_vitest3.expect)(all.has(a)).toBe(true);
|
|
1428
|
+
(0, import_vitest3.expect)(all.has(b)).toBe(true);
|
|
1429
|
+
});
|
|
1430
|
+
(0, import_vitest3.it)("stat-flag combinations \u2014 count-only, names-only, tail-only", async () => {
|
|
1431
|
+
const tag = uid();
|
|
1432
|
+
const s = `qsfl-${tag}`;
|
|
1433
|
+
await store.commit(
|
|
1434
|
+
s,
|
|
1435
|
+
[inc(1), inc(2), dec(3)],
|
|
1436
|
+
makeMeta({ stream: s })
|
|
1437
|
+
);
|
|
1438
|
+
const c = await store.query_stats([s], {
|
|
1439
|
+
count: true
|
|
1440
|
+
});
|
|
1441
|
+
(0, import_vitest3.expect)(c.get(s)?.count).toBe(3);
|
|
1442
|
+
(0, import_vitest3.expect)(c.get(s)?.names).toBeUndefined();
|
|
1443
|
+
(0, import_vitest3.expect)(c.get(s)?.tail).toBeUndefined();
|
|
1444
|
+
const n = await store.query_stats([s], {
|
|
1445
|
+
names: true
|
|
1446
|
+
});
|
|
1447
|
+
(0, import_vitest3.expect)(n.get(s)?.names).toEqual({ Incremented: 2, Decremented: 1 });
|
|
1448
|
+
(0, import_vitest3.expect)(n.get(s)?.count).toBeUndefined();
|
|
1449
|
+
(0, import_vitest3.expect)(n.get(s)?.tail).toBeUndefined();
|
|
1450
|
+
const t = await store.query_stats([s], { tail: true });
|
|
1451
|
+
(0, import_vitest3.expect)(t.get(s)?.tail?.name).toBe("Incremented");
|
|
1452
|
+
(0, import_vitest3.expect)((t.get(s)?.tail?.data).amount).toBe(1);
|
|
1453
|
+
(0, import_vitest3.expect)(t.get(s)?.count).toBeUndefined();
|
|
1454
|
+
(0, import_vitest3.expect)(t.get(s)?.names).toBeUndefined();
|
|
1455
|
+
});
|
|
1456
|
+
});
|
|
1063
1457
|
(0, import_vitest3.describe)("query_streams anchor contract", () => {
|
|
1064
1458
|
(0, import_vitest3.it)("plain regex without anchors is a substring match", async () => {
|
|
1065
1459
|
const tag = uid();
|