valkyries 0.1.3 → 0.1.6
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 +7 -0
- package/dist/cache/batch-read.d.mts +1 -0
- package/dist/cache/batch-read.d.mts.map +1 -1
- package/dist/cache/batch-read.mjs +36 -23
- package/dist/cache/batch-read.mjs.map +1 -1
- package/dist/cache/core.d.mts +4 -1
- package/dist/cache/core.d.mts.map +1 -1
- package/dist/cache/core.mjs +9 -1
- package/dist/cache/core.mjs.map +1 -1
- package/dist/cache/deletes.d.mts.map +1 -1
- package/dist/cache/deletes.mjs +28 -10
- package/dist/cache/deletes.mjs.map +1 -1
- package/dist/cache/mutations.d.mts.map +1 -1
- package/dist/cache/mutations.mjs +38 -14
- package/dist/cache/mutations.mjs.map +1 -1
- package/dist/cache/set-if-not-invalidated-events.d.mts.map +1 -1
- package/dist/cache/set-if-not-invalidated-events.mjs +27 -12
- package/dist/cache/set-if-not-invalidated-events.mjs.map +1 -1
- package/dist/cache/single-read.d.mts.map +1 -1
- package/dist/cache/single-read.mjs +10 -1
- package/dist/cache/single-read.mjs.map +1 -1
- package/dist/clients.d.mts +6 -0
- package/dist/clients.d.mts.map +1 -1
- package/dist/clients.mjs +5 -1
- package/dist/clients.mjs.map +1 -1
- package/dist/config.d.mts +2 -0
- package/dist/config.d.mts.map +1 -1
- package/dist/config.mjs +8 -0
- package/dist/config.mjs.map +1 -1
- package/dist/delete.d.mts.map +1 -1
- package/dist/delete.mjs +22 -8
- package/dist/delete.mjs.map +1 -1
- package/dist/dynamic-config/fields.d.mts.map +1 -1
- package/dist/dynamic-config/fields.mjs +9 -1
- package/dist/dynamic-config/fields.mjs.map +1 -1
- package/dist/dynamic-config/storage.d.mts +6 -5
- package/dist/dynamic-config/storage.d.mts.map +1 -1
- package/dist/dynamic-config/storage.mjs +29 -9
- package/dist/dynamic-config/storage.mjs.map +1 -1
- package/dist/dynamic-config.d.mts +2 -0
- package/dist/dynamic-config.d.mts.map +1 -1
- package/dist/dynamic-config.mjs +33 -10
- package/dist/dynamic-config.mjs.map +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/rate-limiter.d.mts.map +1 -1
- package/dist/rate-limiter.mjs +20 -4
- package/dist/rate-limiter.mjs.map +1 -1
- package/dist/retry.d.mts +24 -0
- package/dist/retry.d.mts.map +1 -0
- package/dist/retry.mjs +50 -0
- package/dist/retry.mjs.map +1 -0
- package/dist/shutdown.d.mts.map +1 -1
- package/dist/shutdown.mjs +15 -2
- package/dist/shutdown.mjs.map +1 -1
- package/dist/types.d.mts +7 -0
- package/dist/types.d.mts.map +1 -1
- package/docs/clients.md +9 -3
- package/package.json +3 -3
package/dist/retry.d.mts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true when the error is a transient Valkey / Glide connection or saturation error
|
|
3
|
+
* that is safe to retry (the operation was never sent or was rejected before execution).
|
|
4
|
+
*/
|
|
5
|
+
export declare function isRetryableValkeyError(error: unknown): boolean;
|
|
6
|
+
export type RetryValkeyOperationOptions = {
|
|
7
|
+
/** Maximum number of attempts (default: 3). */
|
|
8
|
+
attempts?: number;
|
|
9
|
+
/** Milliseconds to wait between attempts (default: 1000). */
|
|
10
|
+
delayMs?: number;
|
|
11
|
+
/** Predicate controlling which errors trigger a retry (default: isRetryableValkeyError). */
|
|
12
|
+
shouldRetry?: (error: unknown) => boolean;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Retries a Valkey operation on transient connection / saturation errors.
|
|
16
|
+
*
|
|
17
|
+
* Non-retryable errors (shouldRetry returns false) are rethrown immediately.
|
|
18
|
+
* After all attempts are exhausted the last error is rethrown.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* const job = await retryValkeyOperation(() => queue.add(name, data, opts));
|
|
22
|
+
*/
|
|
23
|
+
export declare function retryValkeyOperation<T>(fn: () => Promise<T>, options?: RetryValkeyOperationOptions): Promise<T>;
|
|
24
|
+
//# sourceMappingURL=retry.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.mts","sourceRoot":"","sources":["../retry.mts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI9D;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,CAAC,CAAC,CAgBZ"}
|
package/dist/retry.mjs
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Substring patterns that identify transient Valkey / Glide errors which are safe to retry.
|
|
3
|
+
* These originate from the @valkey/valkey-glide native Rust core.
|
|
4
|
+
*/
|
|
5
|
+
const RETRYABLE_PATTERNS = [
|
|
6
|
+
"Reached maximum inflight requests",
|
|
7
|
+
"Connection closed",
|
|
8
|
+
"Request timed out",
|
|
9
|
+
"Socket was closed",
|
|
10
|
+
"Client is in closing state",
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Returns true when the error is a transient Valkey / Glide connection or saturation error
|
|
14
|
+
* that is safe to retry (the operation was never sent or was rejected before execution).
|
|
15
|
+
*/
|
|
16
|
+
export function isRetryableValkeyError(error) {
|
|
17
|
+
if (!(error instanceof Error))
|
|
18
|
+
return false;
|
|
19
|
+
const msg = error.message;
|
|
20
|
+
return RETRYABLE_PATTERNS.some((pattern) => msg.includes(pattern));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Retries a Valkey operation on transient connection / saturation errors.
|
|
24
|
+
*
|
|
25
|
+
* Non-retryable errors (shouldRetry returns false) are rethrown immediately.
|
|
26
|
+
* After all attempts are exhausted the last error is rethrown.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* const job = await retryValkeyOperation(() => queue.add(name, data, opts));
|
|
30
|
+
*/
|
|
31
|
+
export async function retryValkeyOperation(fn, options) {
|
|
32
|
+
const { attempts = 3, delayMs = 1000, shouldRetry = isRetryableValkeyError } = options ?? {};
|
|
33
|
+
const maxAttempts = Math.max(1, attempts);
|
|
34
|
+
let lastError;
|
|
35
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
36
|
+
try {
|
|
37
|
+
return await fn();
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (!shouldRetry(error))
|
|
41
|
+
throw error;
|
|
42
|
+
lastError = error;
|
|
43
|
+
if (attempt < maxAttempts - 1) {
|
|
44
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
throw lastError;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=retry.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.mjs","sourceRoot":"","sources":["../retry.mts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,kBAAkB,GAAG;IACzB,mCAAmC;IACnC,mBAAmB;IACnB,mBAAmB;IACnB,mBAAmB;IACnB,4BAA4B;CAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1B,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACrE,CAAC;AAWD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAoB,EACpB,OAAqC;IAErC,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,WAAW,GAAG,sBAAsB,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAC7F,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1C,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YACrC,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC;AAClB,CAAC"}
|
package/dist/shutdown.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shutdown.d.mts","sourceRoot":"","sources":["../shutdown.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shutdown.d.mts","sourceRoot":"","sources":["../shutdown.mts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,IAAI,CAgBvD,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAlBa,OAAO,CAAC,IAAI,CAkBJ,CAAC"}
|
package/dist/shutdown.mjs
CHANGED
|
@@ -2,17 +2,30 @@ import { urlsToClients, closeDynamicConfigValkeySubscriptionClient } from "./cli
|
|
|
2
2
|
import { dynamicConfigs } from "./dynamic-config.mjs";
|
|
3
3
|
import { handleValkeyError } from "./errors.mjs";
|
|
4
4
|
let shutdown = false;
|
|
5
|
+
/**
|
|
6
|
+
* Executes a close method safely, converting synchronous returns and throws into promises.
|
|
7
|
+
* This avoids the overhead of wrapping with Promise.resolve().then() for each item
|
|
8
|
+
* which creates unnecessary wrapper Promises and microtasks during shutdown.
|
|
9
|
+
*/
|
|
10
|
+
const safeClose = (obj) => {
|
|
11
|
+
try {
|
|
12
|
+
return obj.close();
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
return Promise.reject(error);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
5
18
|
export const onGracefulShutdown = async () => {
|
|
6
19
|
if (shutdown)
|
|
7
20
|
return;
|
|
8
21
|
shutdown = true;
|
|
9
|
-
const configResults = await Promise.allSettled([...dynamicConfigs].map(
|
|
22
|
+
const configResults = await Promise.allSettled([...dynamicConfigs].map(safeClose));
|
|
10
23
|
for (const result of configResults) {
|
|
11
24
|
if (result.status === "rejected")
|
|
12
25
|
handleValkeyError(toError(result.reason));
|
|
13
26
|
}
|
|
14
27
|
const results = await Promise.allSettled([
|
|
15
|
-
...
|
|
28
|
+
...Array.from(urlsToClients.values(), safeClose),
|
|
16
29
|
closeDynamicConfigValkeySubscriptionClient(),
|
|
17
30
|
]);
|
|
18
31
|
for (const result of results) {
|
package/dist/shutdown.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shutdown.mjs","sourceRoot":"","sources":["../shutdown.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,0CAA0C,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,MAAM,
|
|
1
|
+
{"version":3,"file":"shutdown.mjs","sourceRoot":"","sources":["../shutdown.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,0CAA0C,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB;;;;GAIG;AACH,MAAM,SAAS,GAAG,CAAC,GAA6B,EAAE,EAAE;IAClD,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,IAAmB,EAAE;IAC1D,IAAI,QAAQ;QAAE,OAAO;IACrB,QAAQ,GAAG,IAAI,CAAC;IAEhB,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACnF,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;YAAE,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACvC,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC;QAChD,0CAA0C,EAAE;KAC7C,CAAC,CAAC;IACH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;YAAE,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AAErD,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACnE,CAAC"}
|
package/dist/types.d.mts
CHANGED
|
@@ -29,6 +29,13 @@ export type ValkeyCacheOptions<K = string> = {
|
|
|
29
29
|
bloomFilterEnabled?: () => boolean;
|
|
30
30
|
/** Optional Valkey client. Defaults to the package cache client. */
|
|
31
31
|
client?: GlideClient;
|
|
32
|
+
/**
|
|
33
|
+
* When true (default), a Valkey read error in cacheGetByAny / cacheGetByAnyBatch is reported
|
|
34
|
+
* via handleValkeyError and the fetch function is called directly as a fallback instead of
|
|
35
|
+
* propagating the error to the caller. Set to false for caches that must not silently bypass
|
|
36
|
+
* Valkey (e.g. strongly-consistent auth caches).
|
|
37
|
+
*/
|
|
38
|
+
fallbackOnReadError?: boolean;
|
|
32
39
|
} & (K extends string ? {
|
|
33
40
|
/**
|
|
34
41
|
* Converts a key to its string representation for cache storage.
|
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;
|
|
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"}
|
package/docs/clients.md
CHANGED
|
@@ -30,11 +30,17 @@ Default clients are created at module load:
|
|
|
30
30
|
type ValkeyClientOptions = {
|
|
31
31
|
readFrom?: "primary" | "preferReplica";
|
|
32
32
|
lazyConnect?: boolean;
|
|
33
|
+
inflightRequestsLimit?: number;
|
|
34
|
+
requestTimeout?: number;
|
|
33
35
|
};
|
|
34
36
|
```
|
|
35
37
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
| Option | Default | Env var | Description |
|
|
39
|
+
| ----------------------- | --------------- | -------------------------------- | ---------------------------------------------------------- |
|
|
40
|
+
| `readFrom` | (Glide default) | — | Read preference: `"primary"` or `"preferReplica"`. |
|
|
41
|
+
| `lazyConnect` | `true` | — | Whether Glide connects lazily on first command. |
|
|
42
|
+
| `inflightRequestsLimit` | `1000` | `VALKEY_INFLIGHT_REQUESTS_LIMIT` | Maximum number of concurrent inflight requests per client. |
|
|
43
|
+
| `requestTimeout` | `500` | `VALKEY_REQUEST_TIMEOUT_MS` | Per-request timeout in milliseconds. |
|
|
38
44
|
|
|
39
45
|
## `urlsToClients`
|
|
40
46
|
|
|
@@ -42,7 +48,7 @@ type ValkeyClientOptions = {
|
|
|
42
48
|
const urlsToClients: Map<string, GlideClient>;
|
|
43
49
|
```
|
|
44
50
|
|
|
45
|
-
Registry of package-managed clients keyed by URL, read preference,
|
|
51
|
+
Registry of package-managed clients keyed by URL, read preference, lazy-connect, inflight-requests limit, and request timeout.
|
|
46
52
|
|
|
47
53
|
## `upsertValkeyClientByUrl(url, options?)`
|
|
48
54
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "valkyries",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Valkey utilities for caches, bloom filters, dynamic configuration, and rate limiting.",
|
|
5
5
|
"homepage": "https://github.com/jonathanong/valkyries#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -55,9 +55,9 @@
|
|
|
55
55
|
"@types/node": "^25.8.0",
|
|
56
56
|
"@vitest/coverage-v8": "^4.1.6",
|
|
57
57
|
"github-actionlint": "^1.7.12",
|
|
58
|
-
"oxfmt": "^0.
|
|
58
|
+
"oxfmt": "^0.51.0",
|
|
59
59
|
"oxlint": "^1.65.0",
|
|
60
|
-
"oxlint-tsgolint": "^0.
|
|
60
|
+
"oxlint-tsgolint": "^0.23.0",
|
|
61
61
|
"tsx": "^4.22.1",
|
|
62
62
|
"typescript": "^6.0.3",
|
|
63
63
|
"vitest": "^4.1.6"
|