valkyries 0.1.6 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bloom-filter/batching.d.mts +4 -0
- package/dist/bloom-filter/batching.d.mts.map +1 -1
- package/dist/bloom-filter/batching.mjs +5 -0
- package/dist/bloom-filter/batching.mjs.map +1 -1
- package/dist/bloom-filter/rebuilds.d.mts.map +1 -1
- package/dist/bloom-filter/rebuilds.mjs +4 -6
- package/dist/bloom-filter/rebuilds.mjs.map +1 -1
- package/dist/bloom-filter/types.d.mts +1 -0
- package/dist/bloom-filter/types.d.mts.map +1 -1
- package/dist/bloom-filter/writes.d.mts.map +1 -1
- package/dist/bloom-filter/writes.mjs +13 -14
- package/dist/bloom-filter/writes.mjs.map +1 -1
- package/dist/bloom-filter.d.mts +2 -0
- package/dist/bloom-filter.d.mts.map +1 -1
- package/dist/bloom-filter.mjs +6 -1
- package/dist/bloom-filter.mjs.map +1 -1
- package/dist/cache/core.d.mts +2 -1
- package/dist/cache/core.d.mts.map +1 -1
- package/dist/cache/core.mjs +5 -1
- package/dist/cache/core.mjs.map +1 -1
- package/dist/cache/deletes.d.mts +10 -1
- package/dist/cache/deletes.d.mts.map +1 -1
- package/dist/cache/deletes.mjs +50 -0
- package/dist/cache/deletes.mjs.map +1 -1
- package/dist/cache.d.mts +1 -0
- package/dist/cache.d.mts.map +1 -1
- package/dist/cache.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/rate-limiter.d.mts +5 -1
- package/dist/rate-limiter.d.mts.map +1 -1
- package/dist/rate-limiter.mjs +75 -0
- package/dist/rate-limiter.mjs.map +1 -1
- package/dist/scripts/rate-limiter-add-and-check-windows.lua +40 -0
- package/dist/types.d.mts +22 -0
- package/dist/types.d.mts.map +1 -1
- package/docs/bloom-filters.md +3 -1
- package/docs/cache.md +21 -0
- package/docs/rate-limiter.md +24 -0
- package/package.json +1 -1
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export declare const DEFAULT_BLOOM_FILTER_CONCURRENCY_LIMIT = 16;
|
|
2
2
|
export declare function luaBatchSize(batchSize: number): number;
|
|
3
3
|
export declare function chunkItems(items: string[], batchSize?: number): Generator<string[]>;
|
|
4
|
+
export declare function concurrentSlices<T>(items: T[], concurrencyLimit: number): Generator<{
|
|
5
|
+
start: number;
|
|
6
|
+
slice: T[];
|
|
7
|
+
}>;
|
|
4
8
|
//# sourceMappingURL=batching.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batching.d.mts","sourceRoot":"","sources":["../../bloom-filter/batching.mts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sCAAsC,KAAK,CAAC;AAEzD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAiB,UAAU,CACzB,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,GAAE,MAAmC,GAC7C,SAAS,CAAC,MAAM,EAAE,CAAC,CAUrB"}
|
|
1
|
+
{"version":3,"file":"batching.d.mts","sourceRoot":"","sources":["../../bloom-filter/batching.mts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sCAAsC,KAAK,CAAC;AAEzD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAiB,UAAU,CACzB,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,GAAE,MAAmC,GAC7C,SAAS,CAAC,MAAM,EAAE,CAAC,CAUrB;AAED,wBAAiB,gBAAgB,CAAC,CAAC,EACjC,KAAK,EAAE,CAAC,EAAE,EACV,gBAAgB,EAAE,MAAM,GACvB,SAAS,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,CAAA;CAAE,CAAC,CAI1C"}
|
|
@@ -16,4 +16,9 @@ export function* chunkItems(items, batchSize = luaBatchSize(items.length)) {
|
|
|
16
16
|
yield chunk;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
+
export function* concurrentSlices(items, concurrencyLimit) {
|
|
20
|
+
for (let start = 0; start < items.length; start += concurrencyLimit) {
|
|
21
|
+
yield { start, slice: items.slice(start, start + concurrencyLimit) };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
19
24
|
//# sourceMappingURL=batching.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batching.mjs","sourceRoot":"","sources":["../../bloom-filter/batching.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,CAAC,MAAM,sCAAsC,GAAG,EAAE,CAAC;AAEzD,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,UAAU,CACzB,KAAe,EACf,YAAoB,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;IAE9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC/B,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,KAAK,CAAC;QACZ,OAAO;IACT,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC;IACpC,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"batching.mjs","sourceRoot":"","sources":["../../bloom-filter/batching.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,CAAC,MAAM,sCAAsC,GAAG,EAAE,CAAC;AAEzD,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,UAAU,CACzB,KAAe,EACf,YAAoB,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;IAE9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC/B,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,KAAK,CAAC;QACZ,OAAO;IACT,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,gBAAgB,CAC/B,KAAU,EACV,gBAAwB;IAExB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACpE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,gBAAgB,CAAC,EAAE,CAAC;IACvE,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rebuilds.d.mts","sourceRoot":"","sources":["../../bloom-filter/rebuilds.mts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAsB,OAAO,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAUrF;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,EAChC,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"rebuilds.d.mts","sourceRoot":"","sources":["../../bloom-filter/rebuilds.mts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAsB,OAAO,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAUrF;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,EAChC,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,IAAI,CAAC,CAqDf;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9E;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,gBAAgB,EACvB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAGzE;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGzF;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5F"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { emitValkeyEvent } from "../events.mjs";
|
|
2
2
|
import { handleValkeyError } from "../errors.mjs";
|
|
3
|
-
import { chunkItems,
|
|
3
|
+
import { chunkItems, concurrentSlices } from "./batching.mjs";
|
|
4
4
|
import { bloomFilterEnsureExistsScript, bloomFilterReserveScript } from "./scripts.mjs";
|
|
5
5
|
export async function rebuild(state, items) {
|
|
6
6
|
const { batchSize } = state;
|
|
@@ -28,14 +28,12 @@ export async function rebuildFromStream(state, batches, capacityOverride) {
|
|
|
28
28
|
// We process chunks with a fixed concurrency limit to avoid overloading the client/network.
|
|
29
29
|
// We must also wait for all in-flight commands in a concurrent set to settle before
|
|
30
30
|
// potentially cleaning up or throwing, ensuring no "late" writes recreate the buildingKey.
|
|
31
|
-
const concurrencyLimit
|
|
32
|
-
for (let i = 0; i < chunks.length; i += concurrencyLimit) {
|
|
33
|
-
const slice = chunks.slice(i, i + concurrencyLimit);
|
|
31
|
+
for (const { start, slice } of concurrentSlices(chunks, state.concurrencyLimit)) {
|
|
34
32
|
const settled = await Promise.allSettled(slice.map((chunk) => state.client.customCommand(["BF.MADD", state.buildingKey, ...chunk])));
|
|
35
33
|
for (let j = 0; j < settled.length; j++) {
|
|
36
34
|
const res = settled[j];
|
|
37
35
|
if (res.status === "fulfilled") {
|
|
38
|
-
results[
|
|
36
|
+
results[start + j] = true;
|
|
39
37
|
}
|
|
40
38
|
else if (firstError === undefined) {
|
|
41
39
|
firstError = res.reason;
|
|
@@ -44,7 +42,7 @@ export async function rebuildFromStream(state, batches, capacityOverride) {
|
|
|
44
42
|
// Emit events for this concurrent slice in order before moving to the next slice
|
|
45
43
|
// or throwing an error, maintaining sequential event ordering for consumers.
|
|
46
44
|
for (let j = 0; j < settled.length; j++) {
|
|
47
|
-
if (results[
|
|
45
|
+
if (results[start + j]) {
|
|
48
46
|
emitValkeyEvent("bloom-filter:add", { name: state.name, items: slice[j] });
|
|
49
47
|
}
|
|
50
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rebuilds.mjs","sourceRoot":"","sources":["../../bloom-filter/rebuilds.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"rebuilds.mjs","sourceRoot":"","sources":["../../bloom-filter/rebuilds.mts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../../bloom-filter/types.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../../bloom-filter/types.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writes.d.mts","sourceRoot":"","sources":["../../bloom-filter/writes.mts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAgB,GAAG,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3E;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxF;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,GAC/B,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"writes.d.mts","sourceRoot":"","sources":["../../bloom-filter/writes.mts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAgB,GAAG,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3E;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxF;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,GAC/B,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { emitValkeyEvent } from "../events.mjs";
|
|
2
2
|
import { handleValkeyError } from "../errors.mjs";
|
|
3
|
-
import { chunkItems,
|
|
3
|
+
import { chunkItems, concurrentSlices, luaBatchSize } from "./batching.mjs";
|
|
4
4
|
import { bloomFilterAddScript } from "./scripts.mjs";
|
|
5
5
|
export function add(state, items) {
|
|
6
6
|
if (items.length === 0)
|
|
7
7
|
return Promise.resolve();
|
|
8
|
-
return
|
|
8
|
+
return runAddCommands(state, items)
|
|
9
9
|
.then((results) => {
|
|
10
10
|
if (results.some(wroteFilter)) {
|
|
11
11
|
emitValkeyEvent("bloom-filter:add", { name: state.name, items });
|
|
@@ -16,7 +16,7 @@ export function add(state, items) {
|
|
|
16
16
|
export async function addOrThrow(state, items) {
|
|
17
17
|
if (items.length === 0)
|
|
18
18
|
return;
|
|
19
|
-
const results = await
|
|
19
|
+
const results = await runAddCommands(state, items);
|
|
20
20
|
if (results.some(wroteFilter)) {
|
|
21
21
|
emitValkeyEvent("bloom-filter:add", { name: state.name, items });
|
|
22
22
|
}
|
|
@@ -33,9 +33,7 @@ export async function addStream(state, batches) {
|
|
|
33
33
|
// We process chunks with a fixed concurrency limit to avoid overloading the client/network.
|
|
34
34
|
// We must also wait for all in-flight commands in a concurrent set to settle before
|
|
35
35
|
// potentially throwing, ensuring no "late" writes happen after the method returns.
|
|
36
|
-
const concurrencyLimit
|
|
37
|
-
for (let i = 0; i < chunks.length; i += concurrencyLimit) {
|
|
38
|
-
const slice = chunks.slice(i, i + concurrencyLimit);
|
|
36
|
+
for (const { start, slice } of concurrentSlices(chunks, state.concurrencyLimit)) {
|
|
39
37
|
const settled = await Promise.allSettled(slice.map((chunk) => state.client.invokeScript(bloomFilterAddScript, {
|
|
40
38
|
keys: [state.liveKey, state.buildingKey],
|
|
41
39
|
args: chunk,
|
|
@@ -43,7 +41,7 @@ export async function addStream(state, batches) {
|
|
|
43
41
|
for (let j = 0; j < settled.length; j++) {
|
|
44
42
|
const res = settled[j];
|
|
45
43
|
if (res.status === "fulfilled") {
|
|
46
|
-
results[
|
|
44
|
+
results[start + j] = res.value;
|
|
47
45
|
}
|
|
48
46
|
else if (firstError === undefined) {
|
|
49
47
|
firstError = res.reason;
|
|
@@ -52,7 +50,7 @@ export async function addStream(state, batches) {
|
|
|
52
50
|
// Emit events for this concurrent slice in order before moving to the next slice
|
|
53
51
|
// or throwing an error, maintaining sequential event ordering for consumers.
|
|
54
52
|
for (let j = 0; j < settled.length; j++) {
|
|
55
|
-
if (wroteFilter(results[
|
|
53
|
+
if (wroteFilter(results[start + j])) {
|
|
56
54
|
emitValkeyEvent("bloom-filter:add", { name: state.name, items: slice[j] });
|
|
57
55
|
}
|
|
58
56
|
}
|
|
@@ -64,15 +62,16 @@ export async function addStream(state, batches) {
|
|
|
64
62
|
}
|
|
65
63
|
}
|
|
66
64
|
}
|
|
67
|
-
function
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
async function runAddCommands(state, items) {
|
|
66
|
+
const chunks = Array.from(chunkItems(items, luaBatchSize(state.batchSize)));
|
|
67
|
+
const results = [];
|
|
68
|
+
for (const { slice } of concurrentSlices(chunks, state.concurrencyLimit)) {
|
|
69
|
+
results.push(...(await Promise.all(slice.map((chunk) => state.client.invokeScript(bloomFilterAddScript, {
|
|
71
70
|
keys: [state.liveKey, state.buildingKey],
|
|
72
71
|
args: chunk,
|
|
73
|
-
}));
|
|
72
|
+
})))));
|
|
74
73
|
}
|
|
75
|
-
return
|
|
74
|
+
return results;
|
|
76
75
|
}
|
|
77
76
|
function wroteFilter(result) {
|
|
78
77
|
return result === 1 || result === 1n;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writes.mjs","sourceRoot":"","sources":["../../bloom-filter/writes.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"writes.mjs","sourceRoot":"","sources":["../../bloom-filter/writes.mts"],"names":[],"mappings":"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"}
|
package/dist/bloom-filter.d.mts
CHANGED
|
@@ -7,6 +7,7 @@ export declare class ValkeyBloomFilter {
|
|
|
7
7
|
private errorRate;
|
|
8
8
|
private expansionRate;
|
|
9
9
|
private batchSize;
|
|
10
|
+
private readonly concurrencyLimit;
|
|
10
11
|
private liveKey;
|
|
11
12
|
private buildingKey;
|
|
12
13
|
private client;
|
|
@@ -81,6 +82,7 @@ export declare class ValkeyBloomFilter {
|
|
|
81
82
|
capacity: number;
|
|
82
83
|
errorRate: number;
|
|
83
84
|
batchSize: number;
|
|
85
|
+
concurrencyLimit: number;
|
|
84
86
|
liveKey: string;
|
|
85
87
|
buildingKey: string;
|
|
86
88
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bloom-filter.d.mts","sourceRoot":"","sources":["../bloom-filter.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAgB5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAE/F,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAc;gBAEhB,OAAO,EAAE,wBAAwB;
|
|
1
|
+
{"version":3,"file":"bloom-filter.d.mts","sourceRoot":"","sources":["../bloom-filter.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAgB5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAE/F,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAc;gBAEhB,OAAO,EAAE,wBAAwB;IA6B7C;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAI7C;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;IAIrD;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAItE;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;IAI9E;;;;;;;;;;;;OAYG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC;;;OAGG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;;;OAIG;IACG,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C;;;;OAIG;IACG,iBAAiB,CACrB,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,EAChC,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,IAAI,CAAC;IAIV,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,wBAAwB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAI7B,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI3C,MAAM,IAAI,MAAM;IAIhB,cAAc,IAAI,MAAM;IAIxB,SAAS;;;;;;;;;IAYH,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,OAAO,CAAC,KAAK;CAad"}
|
package/dist/bloom-filter.mjs
CHANGED
|
@@ -11,21 +11,24 @@ export class ValkeyBloomFilter {
|
|
|
11
11
|
errorRate;
|
|
12
12
|
expansionRate;
|
|
13
13
|
batchSize;
|
|
14
|
+
concurrencyLimit;
|
|
14
15
|
liveKey;
|
|
15
16
|
buildingKey;
|
|
16
17
|
client;
|
|
17
18
|
constructor(options) {
|
|
18
|
-
const { name, capacity, errorRate, expansionRate = 2, batchSize = 10_000, client = cacheValkeyClient, } = options;
|
|
19
|
+
const { name, capacity, errorRate, expansionRate = 2, batchSize = 10_000, concurrencyLimit = 16, client = cacheValkeyClient, } = options;
|
|
19
20
|
assert(name && typeof name === "string", "name must be a non-empty string");
|
|
20
21
|
assert(capacity > 0, "capacity must be positive");
|
|
21
22
|
assert(errorRate > 0 && errorRate < 1, "errorRate must be between 0 and 1");
|
|
22
23
|
assert(expansionRate > 0, "expansionRate must be positive");
|
|
23
24
|
assert(batchSize > 0, "batchSize must be positive");
|
|
25
|
+
assert(concurrencyLimit > 0, "concurrencyLimit must be positive");
|
|
24
26
|
this.name = name;
|
|
25
27
|
this.capacity = capacity;
|
|
26
28
|
this.errorRate = errorRate;
|
|
27
29
|
this.expansionRate = expansionRate;
|
|
28
30
|
this.batchSize = batchSize;
|
|
31
|
+
this.concurrencyLimit = concurrencyLimit;
|
|
29
32
|
this.liveKey = `bloom-filter:${name}`;
|
|
30
33
|
this.buildingKey = `bloom-filter:${name}:building`;
|
|
31
34
|
this.client = client;
|
|
@@ -131,6 +134,7 @@ export class ValkeyBloomFilter {
|
|
|
131
134
|
capacity: this.capacity,
|
|
132
135
|
errorRate: this.errorRate,
|
|
133
136
|
batchSize: this.batchSize,
|
|
137
|
+
concurrencyLimit: this.concurrencyLimit,
|
|
134
138
|
liveKey: this.liveKey,
|
|
135
139
|
buildingKey: this.buildingKey,
|
|
136
140
|
};
|
|
@@ -145,6 +149,7 @@ export class ValkeyBloomFilter {
|
|
|
145
149
|
errorRate: this.errorRate,
|
|
146
150
|
expansionRate: this.expansionRate,
|
|
147
151
|
batchSize: this.batchSize,
|
|
152
|
+
concurrencyLimit: this.concurrencyLimit,
|
|
148
153
|
liveKey: this.liveKey,
|
|
149
154
|
buildingKey: this.buildingKey,
|
|
150
155
|
client: this.client,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bloom-filter.mjs","sourceRoot":"","sources":["../bloom-filter.mts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,EACZ,OAAO,EACP,SAAS,EACT,OAAO,EACP,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAE/F,MAAM,OAAO,iBAAiB;IACpB,IAAI,CAAS;IACb,QAAQ,CAAS;IACjB,SAAS,CAAS;IAClB,aAAa,CAAS;IACtB,SAAS,CAAS;
|
|
1
|
+
{"version":3,"file":"bloom-filter.mjs","sourceRoot":"","sources":["../bloom-filter.mts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,EACZ,OAAO,EACP,SAAS,EACT,OAAO,EACP,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAE/F,MAAM,OAAO,iBAAiB;IACpB,IAAI,CAAS;IACb,QAAQ,CAAS;IACjB,SAAS,CAAS;IAClB,aAAa,CAAS;IACtB,SAAS,CAAS;IACT,gBAAgB,CAAS;IAClC,OAAO,CAAS;IAChB,WAAW,CAAS;IACpB,MAAM,CAAc;IAE5B,YAAY,OAAiC;QAC3C,MAAM,EACJ,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,aAAa,GAAG,CAAC,EACjB,SAAS,GAAG,MAAM,EAClB,gBAAgB,GAAG,EAAE,EACrB,MAAM,GAAG,iBAAiB,GAC3B,GAAG,OAAO,CAAC;QAEZ,MAAM,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,iCAAiC,CAAC,CAAC;QAC5E,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,2BAA2B,CAAC,CAAC;QAClD,MAAM,CAAC,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,mCAAmC,CAAC,CAAC;QAC5E,MAAM,CAAC,aAAa,GAAG,CAAC,EAAE,gCAAgC,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,4BAA4B,CAAC,CAAC;QACpD,MAAM,CAAC,gBAAgB,GAAG,CAAC,EAAE,mCAAmC,CAAC,CAAC;QAElE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,gBAAgB,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,gBAAgB,IAAI,WAAW,CAAC;QACnD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,IAAY;QACjB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,KAAe;QACrB,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,QAAgB,EAAE,IAAY;QAC1C,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,QAAgB,EAAE,KAAe;QAC9C,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,GAAG,CAAC,KAAe;QACjB,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,OAAgC;QAC9C,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,KAAe;QAC3B,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iBAAiB,CACrB,OAAgC,EAChC,gBAAyB;QAEzB,MAAM,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,cAAwB;QACrD,MAAM,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,cAAc,CAAC,CAAC;IAC/D,CAAC;IAED,SAAS;QACP,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,QAAgB;QACtB,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,SAAS;QACP,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAiB;QAClC,MAAM,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAEO,KAAK;QACX,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;CACF"}
|
package/dist/cache/core.d.mts
CHANGED
|
@@ -13,12 +13,13 @@ export declare abstract class ValkeyCacheCore<K = string> {
|
|
|
13
13
|
mode: ValkeyCacheMode;
|
|
14
14
|
staleTtlAge: number;
|
|
15
15
|
fallbackOnReadError: boolean;
|
|
16
|
+
staleRefresh: boolean;
|
|
16
17
|
protected bloomFilter?: ValkeyBloomFilter;
|
|
17
18
|
protected bloomFilterEnabled?: () => boolean;
|
|
18
19
|
protected refreshPromises: Map<string, Promise<void>>;
|
|
19
20
|
protected keySerializer: (key: K) => string;
|
|
20
21
|
protected client: GlideClient;
|
|
21
|
-
constructor({ prefix, ttlSeconds, nullTtlSeconds, mode, staleTtlAge, bloomFilter, bloomFilterEnabled, keySerializer, client, fallbackOnReadError, }: ValkeyCacheOptions<K>);
|
|
22
|
+
constructor({ prefix, ttlSeconds, nullTtlSeconds, mode, staleTtlAge, staleRefresh, bloomFilter, bloomFilterEnabled, keySerializer, client, fallbackOnReadError, }: ValkeyCacheOptions<K>);
|
|
22
23
|
/** Reports a Valkey read error and rethrows when fallbackOnReadError is false. */
|
|
23
24
|
protected handleReadError(error: unknown): void;
|
|
24
25
|
protected emitCacheEvents(hitKeys: string[], missKeys: string[], bloomMissKeys: string[]): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.mts","sourceRoot":"","sources":["../../cache/core.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGxE,OAAO,EAAW,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKnF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,8BAAsB,eAAe,CAAC,CAAC,GAAG,MAAM;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAC1C,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC;IAC7C,SAAS,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,SAAS,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IAC5C,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC;gBAElB,EACV,MAAM,EACN,UAAU,EACV,cAAc,EACd,IAAa,EACb,WAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,MAA0B,EAC1B,mBAA0B,GAC3B,EAAE,kBAAkB,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"core.d.mts","sourceRoot":"","sources":["../../cache/core.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGxE,OAAO,EAAW,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKnF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,8BAAsB,eAAe,CAAC,CAAC,GAAG,MAAM;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAC1C,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC;IAC7C,SAAS,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,SAAS,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IAC5C,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC;gBAElB,EACV,MAAM,EACN,UAAU,EACV,cAAc,EACd,IAAa,EACb,WAAiB,EACjB,YAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,MAA0B,EAC1B,mBAA0B,GAC3B,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAqBxB,kFAAkF;IAClF,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAK/C,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE;IAqBxF,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG;QACpC,SAAS,EAAE,CAAC,EAAE,CAAC;QACf,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,aAAa,EAAE,MAAM,EAAE,CAAC;KACzB;IAyBD,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI;IAMhD,SAAS,CAAC,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAI9D,SAAS,CAAC,4BAA4B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;cAIrD,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;cAmB3D,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAgBjF,SAAS,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI;cAQ7C,MAAM,CACpB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,WAAW,GAAG,IAAI,GACzB,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;cAkB5C,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IAGxE,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,GAAG,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YACxE,gBAAgB;CAgB/B"}
|
package/dist/cache/core.mjs
CHANGED
|
@@ -13,12 +13,13 @@ export class ValkeyCacheCore {
|
|
|
13
13
|
mode;
|
|
14
14
|
staleTtlAge;
|
|
15
15
|
fallbackOnReadError;
|
|
16
|
+
staleRefresh;
|
|
16
17
|
bloomFilter;
|
|
17
18
|
bloomFilterEnabled;
|
|
18
19
|
refreshPromises;
|
|
19
20
|
keySerializer;
|
|
20
21
|
client;
|
|
21
|
-
constructor({ prefix, ttlSeconds, nullTtlSeconds, mode = "json", staleTtlAge = 0.9, bloomFilter, bloomFilterEnabled, keySerializer, client = cacheValkeyClient, fallbackOnReadError = true, }) {
|
|
22
|
+
constructor({ prefix, ttlSeconds, nullTtlSeconds, mode = "json", staleTtlAge = 0.9, staleRefresh = true, bloomFilter, bloomFilterEnabled, keySerializer, client = cacheValkeyClient, fallbackOnReadError = true, }) {
|
|
22
23
|
if (!prefix)
|
|
23
24
|
throw new Error("ValkeyCache requires a prefix");
|
|
24
25
|
if (!(ttlSeconds > 0))
|
|
@@ -32,6 +33,7 @@ export class ValkeyCacheCore {
|
|
|
32
33
|
}
|
|
33
34
|
this.staleTtlAge = staleTtlAge;
|
|
34
35
|
this.fallbackOnReadError = fallbackOnReadError;
|
|
36
|
+
this.staleRefresh = staleRefresh;
|
|
35
37
|
this.bloomFilter = bloomFilter;
|
|
36
38
|
this.bloomFilterEnabled = bloomFilterEnabled;
|
|
37
39
|
this.refreshPromises = new Map();
|
|
@@ -136,6 +138,8 @@ export class ValkeyCacheCore {
|
|
|
136
138
|
return Promise.all(serializedKeys.map((key, index) => this.decodeCacheEntry(key, rawResults, index)));
|
|
137
139
|
}
|
|
138
140
|
shouldRefreshTtl(ttlSecondsRemaining) {
|
|
141
|
+
if (!this.staleRefresh)
|
|
142
|
+
return false;
|
|
139
143
|
if (typeof ttlSecondsRemaining !== "number")
|
|
140
144
|
return false;
|
|
141
145
|
if (ttlSecondsRemaining < 0)
|
package/dist/cache/core.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.mjs","sourceRoot":"","sources":["../../cache/core.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,EAAsC,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAQjG,MAAM,OAAgB,eAAe;IACnC,MAAM,CAAS;IACf,GAAG,CAAS;IACZ,OAAO,CAAS;IAChB,IAAI,CAAkB;IACtB,WAAW,CAAS;IACpB,mBAAmB,CAAU;
|
|
1
|
+
{"version":3,"file":"core.mjs","sourceRoot":"","sources":["../../cache/core.mts"],"names":[],"mappings":"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"}
|
package/dist/cache/deletes.d.mts
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
|
+
import type { GlideClient } from "@valkey/valkey-glide";
|
|
2
|
+
import type { ValkeyCache } from "../cache.mts";
|
|
1
3
|
import { ValkeyCacheMutations } from "./mutations.mts";
|
|
4
|
+
export type ValkeyCacheDeleteFromCachesEntry<K = any> = {
|
|
5
|
+
cache: ValkeyCache<K>;
|
|
6
|
+
keys: readonly K[];
|
|
7
|
+
};
|
|
2
8
|
export declare class ValkeyCacheDeletes<K = string> extends ValkeyCacheMutations<K> {
|
|
3
9
|
delete(...keys: K[]): Promise<number>;
|
|
4
10
|
protected deleteBySerializedKey(...serializedKeys: string[]): Promise<number>;
|
|
5
11
|
invalidate(): Promise<void>;
|
|
6
|
-
static
|
|
12
|
+
static deleteFromCaches<K>(entries: readonly ValkeyCacheDeleteFromCachesEntry<K>[]): Promise<number>;
|
|
13
|
+
static deleteFromCaches(entries: readonly ValkeyCacheDeleteFromCachesEntry<any>[]): Promise<number>;
|
|
14
|
+
static invalidate(prefix: string, client?: GlideClient): Promise<void>;
|
|
15
|
+
private static deleteSerializedEntriesFromClient;
|
|
7
16
|
}
|
|
8
17
|
//# sourceMappingURL=deletes.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deletes.d.mts","sourceRoot":"","sources":["../../cache/deletes.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deletes.d.mts","sourceRoot":"","sources":["../../cache/deletes.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAUhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,MAAM,gCAAgC,CAAC,CAAC,GAAG,GAAG,IAAI;IACtD,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;CACpB,CAAC;AAYF,qBAAa,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAE,SAAQ,oBAAoB,CAAC,CAAC,CAAC;IACnE,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;cA+B3B,qBAAqB,CAAC,GAAG,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBnF,UAAU;WAIG,gBAAgB,CAAC,CAAC,EAC7B,OAAO,EAAE,SAAS,gCAAgC,CAAC,CAAC,CAAC,EAAE,GACtD,OAAO,CAAC,MAAM,CAAC;WACL,gBAAgB,CAC3B,OAAO,EAAE,SAAS,gCAAgC,CAAC,GAAG,CAAC,EAAE,GACxD,OAAO,CAAC,MAAM,CAAC;WAgCL,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,cAAoB;mBAQ7C,iCAAiC;CA0BvD"}
|
package/dist/cache/deletes.mjs
CHANGED
|
@@ -54,9 +54,59 @@ export class ValkeyCacheDeletes extends ValkeyCacheMutations {
|
|
|
54
54
|
invalidate() {
|
|
55
55
|
return ValkeyCacheDeletes.invalidate(this.prefix, this.client);
|
|
56
56
|
}
|
|
57
|
+
static async deleteFromCaches(entries) {
|
|
58
|
+
const groups = new Map();
|
|
59
|
+
for (const entry of entries) {
|
|
60
|
+
const serializedKeys = [];
|
|
61
|
+
for (const key of entry.keys) {
|
|
62
|
+
const serialized = entry.cache.toSerializedKey(key);
|
|
63
|
+
if (serialized !== null)
|
|
64
|
+
serializedKeys.push(serialized);
|
|
65
|
+
}
|
|
66
|
+
if (serializedKeys.length === 0)
|
|
67
|
+
continue;
|
|
68
|
+
const group = groups.get(entry.cache.client);
|
|
69
|
+
const serializedEntry = {
|
|
70
|
+
cache: entry.cache,
|
|
71
|
+
serializedKeys,
|
|
72
|
+
};
|
|
73
|
+
if (group) {
|
|
74
|
+
group.push(serializedEntry);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
groups.set(entry.cache.client, [serializedEntry]);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
let deleted = 0;
|
|
81
|
+
for (const [client, group] of groups) {
|
|
82
|
+
deleted += await ValkeyCacheDeletes.deleteSerializedEntriesFromClient(client, group);
|
|
83
|
+
}
|
|
84
|
+
return deleted;
|
|
85
|
+
}
|
|
57
86
|
static async invalidate(prefix, client = cacheValkeyClient) {
|
|
58
87
|
await deleteKeysWithPrefix(client, prefix ? `${CACHE_NAMESPACE}:${prefix}:*` : `${CACHE_NAMESPACE}:*`);
|
|
59
88
|
emitValkeyEvent("cache:invalidate", { cacheName: prefix });
|
|
60
89
|
}
|
|
90
|
+
static async deleteSerializedEntriesFromClient(client, entries) {
|
|
91
|
+
const cacheKeys = [];
|
|
92
|
+
const invalidationKeys = [];
|
|
93
|
+
for (const entry of entries) {
|
|
94
|
+
for (const serializedKey of entry.serializedKeys) {
|
|
95
|
+
cacheKeys.push(entry.cache.getSerializedCacheKey(serializedKey));
|
|
96
|
+
invalidationKeys.push(entry.cache.getSerializedInvalidationKey(serializedKey));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const result = await client.invokeScript(cacheDeleteWithInvalidationScript, {
|
|
100
|
+
keys: [...cacheKeys, ...invalidationKeys],
|
|
101
|
+
args: [String(cacheKeys.length), String(INVALIDATION_MARKER_TTL_SECONDS)],
|
|
102
|
+
});
|
|
103
|
+
for (const entry of entries) {
|
|
104
|
+
emitValkeyEvent("cache:delete", {
|
|
105
|
+
cacheName: entry.cache.prefix,
|
|
106
|
+
keys: entry.serializedKeys,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return normalizeCountResult(result);
|
|
110
|
+
}
|
|
61
111
|
}
|
|
62
112
|
//# sourceMappingURL=deletes.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deletes.mjs","sourceRoot":"","sources":["../../cache/deletes.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deletes.mjs","sourceRoot":"","sources":["../../cache/deletes.mts"],"names":[],"mappings":"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"}
|
package/dist/cache.d.mts
CHANGED
package/dist/cache.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.mts","sourceRoot":"","sources":["../cache.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.d.mts","sourceRoot":"","sources":["../cache.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AAE5E,qBAAa,WAAW,CAAC,CAAC,GAAG,MAAM,CAAE,SAAQ,kBAAkB,CAAC,CAAC,CAAC;CAAG"}
|
package/dist/cache.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.mjs","sourceRoot":"","sources":["../cache.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.mjs","sourceRoot":"","sources":["../cache.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,OAAO,WAAwB,SAAQ,kBAAqB;CAAG"}
|
package/dist/index.d.mts
CHANGED
|
@@ -11,5 +11,5 @@ export * from "./errors.mts";
|
|
|
11
11
|
export * from "./key-normalization.mts";
|
|
12
12
|
export * from "./cache-metrics.mts";
|
|
13
13
|
export * from "./retry.mts";
|
|
14
|
-
export type { RateLimiterOptions, ValkeyBloomFilterOptions, ValkeyCacheOptions, ValkeyCacheMode, ValkeyCacheResponse, DynamicConfigField, DynamicConfigFieldType, DynamicConfigOptions, } from "./types.mts";
|
|
14
|
+
export type { RateLimiterAddAndCheckWindowsOptions, RateLimiterOptions, RateLimiterWindow, ValkeyBloomFilterOptions, ValkeyCacheOptions, ValkeyCacheMode, ValkeyCacheResponse, DynamicConfigField, DynamicConfigFieldType, DynamicConfigOptions, } from "./types.mts";
|
|
15
15
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../index.mts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,YAAY,EACV,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../index.mts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,YAAY,EACV,oCAAoC,EACpC,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
|
package/dist/rate-limiter.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RateLimiterOptions } from "./types.mts";
|
|
1
|
+
import type { RateLimiterAddAndCheckWindowsOptions, RateLimiterOptions, RateLimiterWindow } from "./types.mts";
|
|
2
2
|
import type { GlideClient } from "@valkey/valkey-glide";
|
|
3
3
|
export declare class RateLimiter {
|
|
4
4
|
prefix: string;
|
|
@@ -36,5 +36,9 @@ export declare class RateLimiter {
|
|
|
36
36
|
getKey(key: string): string;
|
|
37
37
|
invalidate(): Promise<void>;
|
|
38
38
|
static invalidate(prefix: string, client?: GlideClient): Promise<void>;
|
|
39
|
+
static addAndCheckWindows(windows: RateLimiterWindow[], options?: RateLimiterAddAndCheckWindowsOptions): Promise<{
|
|
40
|
+
counts: number[];
|
|
41
|
+
limited: boolean;
|
|
42
|
+
}>;
|
|
39
43
|
}
|
|
40
44
|
//# sourceMappingURL=rate-limiter.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.d.mts","sourceRoot":"","sources":["../rate-limiter.mts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.mts","sourceRoot":"","sources":["../rate-limiter.mts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oCAAoC,EACpC,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAkBxD,qBAAa,WAAW;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,MAAM,CAAc;gBAEhB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAgC,EAAE,EAAE,kBAAkB;IAQlF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE;IAmBvB;;;;;;;;;;;OAWG;IACG,WAAW,CACf,GAAG,EAAE,MAAM,EAAE,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,SAAW,GACpB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAuClD;;;OAGG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAK9F;;;OAGG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,UAAU,SAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiB5D,MAAM,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE;IAU7B,MAAM,CAAC,GAAG,EAAE,MAAM;IAIlB,UAAU;WAIG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,cAA0B;WAS3D,kBAAkB,CAC7B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,OAAO,GAAE,oCAAyC,GACjD,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAwBnD"}
|
package/dist/rate-limiter.mjs
CHANGED
|
@@ -9,6 +9,7 @@ const NAMESPACE = "rate-limiter";
|
|
|
9
9
|
const rateLimiterAddScript = registerScript(loadScript("rate-limiter-add.lua", import.meta.url));
|
|
10
10
|
const rateLimiterGetScript = registerScript(loadScript("rate-limiter-get.lua", import.meta.url));
|
|
11
11
|
const rateLimiterAddAndCheckScript = registerScript(loadScript("rate-limiter-add-and-check.lua", import.meta.url));
|
|
12
|
+
const rateLimiterAddAndCheckWindowsScript = registerScript(loadScript("rate-limiter-add-and-check-windows.lua", import.meta.url));
|
|
12
13
|
export class RateLimiter {
|
|
13
14
|
prefix;
|
|
14
15
|
ttl;
|
|
@@ -142,5 +143,79 @@ export class RateLimiter {
|
|
|
142
143
|
emitValkeyEvent("rate-limiter:invalidate", { prefix });
|
|
143
144
|
return result;
|
|
144
145
|
}
|
|
146
|
+
static async addAndCheckWindows(windows, options = {}) {
|
|
147
|
+
if (windows.length === 0)
|
|
148
|
+
return { counts: [], limited: false };
|
|
149
|
+
validateWindows(windows);
|
|
150
|
+
const client = options.client ?? rateLimiterValkeyClient;
|
|
151
|
+
const mode = options.mode ?? "record-all";
|
|
152
|
+
const keys = windows.map(getWindowKey);
|
|
153
|
+
validateUniqueKeys(keys);
|
|
154
|
+
const base = randomUUID();
|
|
155
|
+
const args = [mode];
|
|
156
|
+
for (const [i, window] of windows.entries()) {
|
|
157
|
+
args.push(String(window.ttlSeconds), String(window.threshold), `${base}-${i}`);
|
|
158
|
+
}
|
|
159
|
+
const results = await client.invokeScript(rateLimiterAddAndCheckWindowsScript, { keys, args });
|
|
160
|
+
if (!Array.isArray(results)) {
|
|
161
|
+
handleValkeyError(new Error(`addAndCheckWindows: unexpected Valkey response type ${typeof results}`));
|
|
162
|
+
return { counts: windows.map(() => 0), limited: false };
|
|
163
|
+
}
|
|
164
|
+
const counts = results.slice(0, windows.length).map((result) => normalizeCountResult(result));
|
|
165
|
+
const limited = normalizeCountResult(results[windows.length]) === 1;
|
|
166
|
+
emitWindowEvents(windows, counts, mode);
|
|
167
|
+
return { counts, limited };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function validateWindows(windows) {
|
|
171
|
+
let sharedHashTag;
|
|
172
|
+
for (const window of windows) {
|
|
173
|
+
if (!window.prefix)
|
|
174
|
+
throw new Error("RateLimiter window requires a prefix");
|
|
175
|
+
if (window.prefix.includes("{") || window.prefix.includes("}")) {
|
|
176
|
+
throw new Error("RateLimiter window prefix must not contain Redis hash tag braces");
|
|
177
|
+
}
|
|
178
|
+
if (window.ttlSeconds <= 0) {
|
|
179
|
+
throw new Error("RateLimiter window ttlSeconds must be greater than 0");
|
|
180
|
+
}
|
|
181
|
+
if (window.threshold <= 0) {
|
|
182
|
+
throw new Error("RateLimiter window threshold must be greater than 0");
|
|
183
|
+
}
|
|
184
|
+
if (window.hashTag === "")
|
|
185
|
+
throw new Error("RateLimiter window hashTag must not be empty");
|
|
186
|
+
const hashTag = window.hashTag ?? window.id;
|
|
187
|
+
if (!hashTag)
|
|
188
|
+
throw new Error("RateLimiter window requires an id or hashTag");
|
|
189
|
+
sharedHashTag ??= hashTag;
|
|
190
|
+
if (sharedHashTag !== hashTag) {
|
|
191
|
+
throw new Error("RateLimiter windows must share one Redis Cluster hash tag");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function validateUniqueKeys(keys) {
|
|
196
|
+
if (new Set(keys).size !== keys.length) {
|
|
197
|
+
throw new Error("RateLimiter windows must resolve to unique Valkey keys");
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function getWindowKey(window) {
|
|
201
|
+
const hashTag = window.hashTag ?? window.id;
|
|
202
|
+
const suffix = window.hashTag && window.id ? `:${window.id}` : "";
|
|
203
|
+
return `${NAMESPACE}:${window.prefix}:{${hashTag}}${suffix}`;
|
|
204
|
+
}
|
|
205
|
+
function emitWindowEvents(windows, counts, mode) {
|
|
206
|
+
let priorWindowLimited = false;
|
|
207
|
+
for (const [i, window] of windows.entries()) {
|
|
208
|
+
if (mode === "stop-on-limited" && priorWindowLimited)
|
|
209
|
+
continue;
|
|
210
|
+
const id = window.id || String(window.hashTag);
|
|
211
|
+
const count = counts[i] ?? 0;
|
|
212
|
+
emitValkeyEvent("rate-limiter:add", { prefix: window.prefix, ids: [id] });
|
|
213
|
+
emitValkeyEvent("rate-limiter:get", {
|
|
214
|
+
prefix: window.prefix,
|
|
215
|
+
ids: [id],
|
|
216
|
+
counts: [count],
|
|
217
|
+
});
|
|
218
|
+
priorWindowLimited = count >= window.threshold;
|
|
219
|
+
}
|
|
145
220
|
}
|
|
146
221
|
//# sourceMappingURL=rate-limiter.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.mjs","sourceRoot":"","sources":["../rate-limiter.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limiter.mjs","sourceRoot":"","sources":["../rate-limiter.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
-- Rate limiter multi-window add-and-check operation.
|
|
2
|
+
-- KEYS[1..N]: the sorted set keys
|
|
3
|
+
-- ARGV[1]: mode: "record-all" or "stop-on-limited"
|
|
4
|
+
-- ARGV[2..]: triples of ttl seconds, threshold, random member per key
|
|
5
|
+
-- Returns { count1, count2, ..., limitedFlag }
|
|
6
|
+
-- Uses server time to avoid client clock skew.
|
|
7
|
+
|
|
8
|
+
assert(ARGV[1] == 'record-all' or ARGV[1] == 'stop-on-limited', 'invalid mode')
|
|
9
|
+
assert((#ARGV - 1) == (#KEYS * 3), 'ARGV length mismatch: expected mode + 3 args per key')
|
|
10
|
+
|
|
11
|
+
local mode = ARGV[1]
|
|
12
|
+
local currentTime = redis.call('TIME')
|
|
13
|
+
local now = tonumber(currentTime[1]) * 1000 + tonumber(currentTime[2]) / 1000
|
|
14
|
+
local response = {}
|
|
15
|
+
local limited = 0
|
|
16
|
+
|
|
17
|
+
for i, key in ipairs(KEYS) do
|
|
18
|
+
if limited == 1 and mode == 'stop-on-limited' then
|
|
19
|
+
table.insert(response, 0)
|
|
20
|
+
else
|
|
21
|
+
local argOffset = 2 + ((i - 1) * 3)
|
|
22
|
+
local ttl = tonumber(ARGV[argOffset])
|
|
23
|
+
local threshold = tonumber(ARGV[argOffset + 1])
|
|
24
|
+
local randomElement = ARGV[argOffset + 2]
|
|
25
|
+
local minScore = now - (ttl * 1000)
|
|
26
|
+
|
|
27
|
+
redis.call('ZADD', key, now, randomElement)
|
|
28
|
+
redis.call('ZREMRANGEBYSCORE', key, '-inf', minScore)
|
|
29
|
+
redis.call('EXPIRE', key, ttl)
|
|
30
|
+
|
|
31
|
+
local count = redis.call('ZCOUNT', key, '(' .. minScore, now)
|
|
32
|
+
table.insert(response, count)
|
|
33
|
+
if count >= threshold then
|
|
34
|
+
limited = 1
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
table.insert(response, limited)
|
|
40
|
+
return response
|
package/dist/types.d.mts
CHANGED
|
@@ -12,6 +12,24 @@ export type RateLimiterOptions = {
|
|
|
12
12
|
/** Optional Valkey client. Defaults to the package rate limiter client. */
|
|
13
13
|
client?: GlideClient;
|
|
14
14
|
};
|
|
15
|
+
export type RateLimiterWindow = {
|
|
16
|
+
/** The prefix to use for this window's rate-limiter key */
|
|
17
|
+
prefix: string;
|
|
18
|
+
/** The logical ID being limited. When hashTag is set, this is appended after the hash tag. */
|
|
19
|
+
id: string;
|
|
20
|
+
/** The TTL in seconds for this window */
|
|
21
|
+
ttlSeconds: number;
|
|
22
|
+
/** The post-add count threshold where this window becomes limited */
|
|
23
|
+
threshold: number;
|
|
24
|
+
/** Optional Redis Cluster hash tag. All windows in one call must share the same hash tag. */
|
|
25
|
+
hashTag?: string;
|
|
26
|
+
};
|
|
27
|
+
export type RateLimiterAddAndCheckWindowsOptions = {
|
|
28
|
+
/** Optional Valkey client. Defaults to the package rate limiter client. */
|
|
29
|
+
client?: GlideClient;
|
|
30
|
+
/** Stop processing later windows as soon as an earlier window is limited. Defaults to record-all. */
|
|
31
|
+
mode?: "record-all" | "stop-on-limited";
|
|
32
|
+
};
|
|
15
33
|
export type ValkeyCacheOptions<K = string> = {
|
|
16
34
|
/** The prefix to use for the cache */
|
|
17
35
|
prefix: string;
|
|
@@ -23,6 +41,8 @@ export type ValkeyCacheOptions<K = string> = {
|
|
|
23
41
|
mode?: "json" | "text" | "buffer";
|
|
24
42
|
/** Fraction of ttlSeconds representing the age threshold; values are stale when ttlSecondsRemaining < (1 - staleTtlAge) * ttlSeconds (0-1, defaults to 0.9) */
|
|
25
43
|
staleTtlAge?: number;
|
|
44
|
+
/** When false, stale cache hits are returned without a background refresh. Defaults to true. */
|
|
45
|
+
staleRefresh?: boolean;
|
|
26
46
|
/** Optional bloom filter for negative lookups — skip DB calls for entities that definitely don't exist */
|
|
27
47
|
bloomFilter?: import("./bloom-filter.mts").ValkeyBloomFilter;
|
|
28
48
|
/** Optional runtime feature flag — if provided, called per-request; bloom filter is bypassed when it returns false */
|
|
@@ -75,6 +95,8 @@ export type ValkeyBloomFilterOptions = {
|
|
|
75
95
|
errorRate: number;
|
|
76
96
|
/** The batch size for bulk operations (optional, defaults to 10,000; Lua paths clamp to 5,000) */
|
|
77
97
|
batchSize?: number;
|
|
98
|
+
/** Maximum number of Bloom write chunks in flight at once. Defaults to 16. */
|
|
99
|
+
concurrencyLimit?: number;
|
|
78
100
|
/** The expansion rate for auto-growth (optional, defaults to 2) */
|
|
79
101
|
expansionRate?: number;
|
|
80
102
|
/** Optional Valkey client. Defaults to the package cache client. */
|
package/dist/types.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../types.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC,mBAAmB,CAAC,EAAE,WAAW,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,MAAM,IAAI;IAC3C,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yHAAyH;IACzH,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,+JAA+J;IAC/J,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0GAA0G;IAC1G,WAAW,CAAC,EAAE,OAAO,oBAAoB,EAAE,iBAAiB,CAAC;IAC7D,sHAAsH;IACtH,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC;IACnC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,GAAG,CAAC,CAAC,SAAS,MAAM,GACjB;IACE;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;CACpC,GACD;IACE;;;OAGG;IACH,aAAa,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;CACnC,CAAC,CAAC;AAEP,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AACzD,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AAE5F,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3D,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AACrE,MAAM,MAAM,oBAAoB,GAAG;IACjC,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACnD,0CAA0C;IAC1C,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAClD,6EAA6E;IAC7E,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../types.mts"],"names":[],"mappings":"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"}
|
package/docs/bloom-filters.md
CHANGED
|
@@ -39,6 +39,7 @@ type ValkeyBloomFilterOptions = {
|
|
|
39
39
|
capacity: number;
|
|
40
40
|
errorRate: number;
|
|
41
41
|
batchSize?: number;
|
|
42
|
+
concurrencyLimit?: number;
|
|
42
43
|
expansionRate?: number;
|
|
43
44
|
client?: GlideClient;
|
|
44
45
|
};
|
|
@@ -48,10 +49,11 @@ type ValkeyBloomFilterOptions = {
|
|
|
48
49
|
- `capacity`: expected item count.
|
|
49
50
|
- `errorRate`: target false-positive rate between `0` and `1`.
|
|
50
51
|
- `batchSize`: write/read chunk size. Defaults to `10_000`; Lua paths clamp large chunks internally.
|
|
52
|
+
- `concurrencyLimit`: maximum number of write chunks in flight at once. Defaults to `16`.
|
|
51
53
|
- `expansionRate`: Bloom filter expansion rate. Defaults to `2`.
|
|
52
54
|
- `client`: optional `@valkey/valkey-glide` client. Defaults to the package cache client.
|
|
53
55
|
|
|
54
|
-
The constructor throws when `name` is empty, `capacity` is not positive, `errorRate` is not between `0` and `1`, `expansionRate` is not positive, or `
|
|
56
|
+
The constructor throws when `name` is empty, `capacity` is not positive, `errorRate` is not between `0` and `1`, `expansionRate` is not positive, `batchSize` is not positive, or `concurrencyLimit` is not positive.
|
|
55
57
|
|
|
56
58
|
## `ensureExists(capacity?)`
|
|
57
59
|
|
package/docs/cache.md
CHANGED
|
@@ -43,6 +43,7 @@ type ValkeyCacheOptions<K = string> = {
|
|
|
43
43
|
nullTtlSeconds?: number;
|
|
44
44
|
mode?: "json" | "text" | "buffer";
|
|
45
45
|
staleTtlAge?: number;
|
|
46
|
+
staleRefresh?: boolean;
|
|
46
47
|
bloomFilter?: ValkeyBloomFilter;
|
|
47
48
|
bloomFilterEnabled?: () => boolean;
|
|
48
49
|
client?: GlideClient;
|
|
@@ -57,6 +58,7 @@ For non-string keys, `keySerializer` is required.
|
|
|
57
58
|
- `nullTtlSeconds`: TTL for cached nulls. Defaults to `Math.max(1, Math.floor(ttlSeconds / 60))`.
|
|
58
59
|
- `mode`: serialization mode. Defaults to `json`.
|
|
59
60
|
- `staleTtlAge`: refresh-ahead threshold from `0` to `1`. Defaults to `0.9`.
|
|
61
|
+
- `staleRefresh`: set to `false` to return stale hits without background refresh-ahead. Defaults to `true`.
|
|
60
62
|
- `bloomFilter`: optional negative-lookup Bloom filter.
|
|
61
63
|
- `bloomFilterEnabled`: optional per-call gate for Bloom filter checks.
|
|
62
64
|
- `client`: optional `@valkey/valkey-glide` client. Defaults to the package cache client.
|
|
@@ -164,6 +166,25 @@ cache.delete(...keys: K[]): Promise<number>
|
|
|
164
166
|
|
|
165
167
|
Deletes cache entries and writes short-lived invalidation markers so in-flight read-through writes do not repopulate stale data.
|
|
166
168
|
|
|
169
|
+
## `ValkeyCache.deleteFromCaches(entries)`
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
ValkeyCache.deleteFromCaches([
|
|
173
|
+
{ cache: usersPrivateCache, keys: userKeys },
|
|
174
|
+
{ cache: usersPublicCache, keys: userKeys },
|
|
175
|
+
]): Promise<number>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Deletes entries from multiple cache instances while preserving the same invalidation-marker protection as `delete(...keys)`.
|
|
179
|
+
|
|
180
|
+
Behavior:
|
|
181
|
+
|
|
182
|
+
- Invalid keys are filtered through each cache instance's serializer.
|
|
183
|
+
- Entries sharing the same Valkey client are deleted with one script call.
|
|
184
|
+
- Entries using different clients are grouped by client.
|
|
185
|
+
- `cache:delete` events are emitted per cache prefix.
|
|
186
|
+
- The returned count is the sum of deleted cache keys.
|
|
187
|
+
|
|
167
188
|
## `invalidateCacheGetByAny(...keys)`
|
|
168
189
|
|
|
169
190
|
```ts
|
package/docs/rate-limiter.md
CHANGED
|
@@ -16,6 +16,8 @@ Use `addAndCheck(ids, threshold)` for request paths. It atomically adds an event
|
|
|
16
16
|
|
|
17
17
|
A threshold of `N` blocks the Nth request because the count is checked after incrementing.
|
|
18
18
|
|
|
19
|
+
Use `RateLimiter.addAndCheckWindows(windows)` when one logical request must be checked against multiple TTL/threshold windows in one Valkey round trip. All windows in that call must share one Redis Cluster hash tag.
|
|
20
|
+
|
|
19
21
|
## Import
|
|
20
22
|
|
|
21
23
|
```ts
|
|
@@ -79,6 +81,28 @@ Atomically records events and returns the current counts.
|
|
|
79
81
|
- `ttlSeconds` overrides the instance TTL for this check.
|
|
80
82
|
- Unexpected Valkey response types fail open with zero counts.
|
|
81
83
|
|
|
84
|
+
## `RateLimiter.addAndCheckWindows(windows, options?)`
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
RateLimiter.addAndCheckWindows(
|
|
88
|
+
[
|
|
89
|
+
{ prefix: "web-risk-minute", id: "global", hashTag: "2026-06", ttlSeconds: 60, threshold: 5001 },
|
|
90
|
+
{ prefix: "web-risk-month", id: "global", hashTag: "2026-06", ttlSeconds: 31 * 24 * 60 * 60, threshold: 90001 },
|
|
91
|
+
],
|
|
92
|
+
{ mode: "stop-on-limited" },
|
|
93
|
+
): Promise<{ counts: number[]; limited: boolean }>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Records and checks heterogeneous windows in one Lua script call.
|
|
97
|
+
|
|
98
|
+
- `counts` aligns with `windows`.
|
|
99
|
+
- `limited` is `true` when any post-add count is greater than or equal to its window threshold.
|
|
100
|
+
- `mode: "record-all"` records every window and is the default.
|
|
101
|
+
- `mode: "stop-on-limited"` stops recording later windows after an earlier window is limited.
|
|
102
|
+
- All windows must share the same effective hash tag: `hashTag ?? id`.
|
|
103
|
+
- Window prefixes must not contain Redis hash tag braces, and generated Valkey keys must be unique.
|
|
104
|
+
- Unexpected Valkey response types fail open with zero counts.
|
|
105
|
+
|
|
82
106
|
Example:
|
|
83
107
|
|
|
84
108
|
```ts
|
package/package.json
CHANGED