valkyries 0.8.1 → 0.9.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/clients.d.mts +3 -0
- package/dist/clients.d.mts.map +1 -1
- package/dist/clients.mjs +41 -4
- package/dist/clients.mjs.map +1 -1
- package/dist/dynamic-config/bounded-field.d.mts +7 -0
- package/dist/dynamic-config/bounded-field.d.mts.map +1 -0
- package/dist/dynamic-config/bounded-field.mjs +11 -0
- package/dist/dynamic-config/bounded-field.mjs.map +1 -0
- package/dist/dynamic-config/registry.d.mts +11 -0
- package/dist/dynamic-config/registry.d.mts.map +1 -0
- package/dist/dynamic-config/registry.mjs +44 -0
- package/dist/dynamic-config/registry.mjs.map +1 -0
- package/dist/dynamic-config/types.d.mts +42 -0
- package/dist/dynamic-config/types.d.mts.map +1 -0
- package/dist/dynamic-config/types.mjs +2 -0
- package/dist/dynamic-config/types.mjs.map +1 -0
- package/dist/dynamic-config/validation.d.mts +14 -0
- package/dist/dynamic-config/validation.d.mts.map +1 -0
- package/dist/dynamic-config/validation.mjs +72 -0
- package/dist/dynamic-config/validation.mjs.map +1 -0
- package/dist/dynamic-config/validators.d.mts +14 -0
- package/dist/dynamic-config/validators.d.mts.map +1 -0
- package/dist/dynamic-config/validators.mjs +45 -0
- package/dist/dynamic-config/validators.mjs.map +1 -0
- package/dist/dynamic-config.d.mts +6 -0
- package/dist/dynamic-config.d.mts.map +1 -1
- package/dist/dynamic-config.mjs +4 -0
- package/dist/dynamic-config.mjs.map +1 -1
- package/docs/api.md +1 -1
- package/docs/dynamic-config.md +107 -0
- package/package.json +2 -2
package/dist/clients.d.mts
CHANGED
|
@@ -47,6 +47,9 @@ export declare function buildDynamicConfigSubscriptionClientConfig(url: string):
|
|
|
47
47
|
lazyConnect: boolean;
|
|
48
48
|
inflightRequestsLimit: number;
|
|
49
49
|
requestTimeout: number;
|
|
50
|
+
advancedConfiguration: {
|
|
51
|
+
connectionTimeout: number;
|
|
52
|
+
};
|
|
50
53
|
pubsubSubscriptions: {
|
|
51
54
|
channelsAndPatterns: {
|
|
52
55
|
1: Set<string>;
|
package/dist/clients.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clients.d.mts","sourceRoot":"","sources":["../clients.mts"],"names":[],"mappings":"AACA,OAAO,EAEL,WAAW,EAEX,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"clients.d.mts","sourceRoot":"","sources":["../clients.mts"],"names":[],"mappings":"AACA,OAAO,EAEL,WAAW,EAEX,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAQ9B,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,eAAe,CAAC;AAEzD,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,aAAa,0BAAiC,CAAC;AAG5D,eAAO,MAAM,iBAAiB,aAE5B,CAAC;AACH,eAAO,MAAM,uBAAuB,aAElC,CAAC;AACH,eAAO,MAAM,yBAAyB,aAEpC,CAAC;AAIH,KAAK,oBAAoB,GAAG,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;AAGrD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAE3E;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAE9E;AAeD,wBAAgB,2CAA2C,IAAI,OAAO,CAAC,WAAW,CAAC,CAqClF;AAED,wBAAsB,0CAA0C,IAAI,OAAO,CAAC,IAAI,CAAC,CAShF;AAED,iBAAS,mBAAmB,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAEjD;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,WAAW,CAAC,CA0BtB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;EA0B5E;AAED,wBAAgB,0CAA0C,CAAC,GAAG,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;EAWrE"}
|
package/dist/clients.mjs
CHANGED
|
@@ -3,6 +3,8 @@ import { ALL_PATTERNS, GlideClient, GlideClientConfiguration, } from "@valkey/va
|
|
|
3
3
|
import { config } from "./config.mjs";
|
|
4
4
|
import { handleValkeyError } from "./errors.mjs";
|
|
5
5
|
const CLIENT_CLOSE_SETTLE_MS = 100;
|
|
6
|
+
const SUBSCRIPTION_CONNECTION_TIMEOUT_MS = 2_000;
|
|
7
|
+
const SUBSCRIPTION_CREATION_TIMEOUT_MS = 5_000;
|
|
6
8
|
export const urlsToClients = new Map();
|
|
7
9
|
const urlsToClientPromises = new Map();
|
|
8
10
|
export const cacheValkeyClient = await upsertValkeyClientByUrl(config.cache_url, {
|
|
@@ -22,14 +24,48 @@ export function addPubSubMessageHandler(handler) {
|
|
|
22
24
|
export function removePubSubMessageHandler(handler) {
|
|
23
25
|
pubSubMessageHandlers.delete(handler);
|
|
24
26
|
}
|
|
27
|
+
function reportSubscriptionError(error) {
|
|
28
|
+
try {
|
|
29
|
+
handleValkeyError(error);
|
|
30
|
+
}
|
|
31
|
+
catch (cause) {
|
|
32
|
+
// Error reporting must not replace the native failure or reject an ignored observer.
|
|
33
|
+
process.emitWarning(new AggregateError([error, cause], "DynamicConfig subscription error handler threw", {
|
|
34
|
+
cause,
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
25
38
|
export function ensureDynamicConfigValkeySubscriptionClient() {
|
|
26
39
|
if (dynamicConfigValkeySubscriptionClientPromise)
|
|
27
40
|
return dynamicConfigValkeySubscriptionClientPromise;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
41
|
+
let expired = false;
|
|
42
|
+
let timer;
|
|
43
|
+
const deadline = new Promise((_, reject) => {
|
|
44
|
+
timer = setTimeout(() => {
|
|
45
|
+
expired = true;
|
|
46
|
+
reject(new Error("DynamicConfig subscription client creation timed out after 5000 ms"));
|
|
47
|
+
}, SUBSCRIPTION_CREATION_TIMEOUT_MS);
|
|
48
|
+
});
|
|
49
|
+
const creation = Promise.resolve()
|
|
50
|
+
.then(() => GlideClient.createClient(buildDynamicConfigSubscriptionClientConfig(config.dynamic_config_url)))
|
|
51
|
+
.then((client) => {
|
|
52
|
+
if (expired)
|
|
53
|
+
client.close();
|
|
54
|
+
return client;
|
|
32
55
|
});
|
|
56
|
+
// Observe late native rejection/close failure after the deadline has already won.
|
|
57
|
+
creation.catch((error) => {
|
|
58
|
+
if (expired)
|
|
59
|
+
reportSubscriptionError(error);
|
|
60
|
+
});
|
|
61
|
+
const clientPromise = Promise.race([creation, deadline])
|
|
62
|
+
.catch((error) => {
|
|
63
|
+
if (dynamicConfigValkeySubscriptionClientPromise === clientPromise)
|
|
64
|
+
dynamicConfigValkeySubscriptionClientPromise = null;
|
|
65
|
+
reportSubscriptionError(error);
|
|
66
|
+
throw error;
|
|
67
|
+
})
|
|
68
|
+
.finally(() => clearTimeout(timer));
|
|
33
69
|
dynamicConfigValkeySubscriptionClientPromise = clientPromise;
|
|
34
70
|
return clientPromise;
|
|
35
71
|
}
|
|
@@ -106,6 +142,7 @@ export function glideConfigFromUrl(url, options) {
|
|
|
106
142
|
export function buildDynamicConfigSubscriptionClientConfig(url) {
|
|
107
143
|
return {
|
|
108
144
|
...glideConfigFromUrl(url, { readFrom: "preferReplica", lazyConnect: false }),
|
|
145
|
+
advancedConfiguration: { connectionTimeout: SUBSCRIPTION_CONNECTION_TIMEOUT_MS },
|
|
109
146
|
pubsubSubscriptions: {
|
|
110
147
|
channelsAndPatterns: {
|
|
111
148
|
[GlideClientConfiguration.PubSubChannelModes.Pattern]: new Set(["dynamic-config:*"]),
|
package/dist/clients.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clients.mjs","sourceRoot":"","sources":["../clients.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EACL,YAAY,EACZ,WAAW,EACX,wBAAwB,GAEzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,sBAAsB,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"clients.mjs","sourceRoot":"","sources":["../clients.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DynamicConfig } from "../dynamic-config.mts";
|
|
2
|
+
export type BoundedPositiveIntegerLimits = {
|
|
3
|
+
defaultValue: number;
|
|
4
|
+
maxValue: number;
|
|
5
|
+
};
|
|
6
|
+
export declare function getBoundedPositiveIntegerField(config: Pick<DynamicConfig, "fields">, field: string, limits: BoundedPositiveIntegerLimits): number;
|
|
7
|
+
//# sourceMappingURL=bounded-field.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-field.d.mts","sourceRoot":"","sources":["../../dynamic-config/bounded-field.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,4BAA4B,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,EACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,4BAA4B,GACnC,MAAM,CAWR"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function getBoundedPositiveIntegerField(config, field, limits) {
|
|
2
|
+
const value = config.fields.get(field);
|
|
3
|
+
if (typeof value === "number" &&
|
|
4
|
+
Number.isInteger(value) &&
|
|
5
|
+
value > 0 &&
|
|
6
|
+
value <= limits.maxValue) {
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
return limits.defaultValue;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=bounded-field.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-field.mjs","sourceRoot":"","sources":["../../dynamic-config/bounded-field.mts"],"names":[],"mappings":"AAIA,MAAM,UAAU,8BAA8B,CAC5C,MAAqC,EACrC,KAAa,EACb,MAAoC;IAEpC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvC,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QACvB,KAAK,GAAG,CAAC;QACT,KAAK,IAAI,MAAM,CAAC,QAAQ,EACxB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DynamicConfigFieldRules, DynamicConfigNamespaceDefinition, DynamicConfigRegistry } from "./types.mts";
|
|
2
|
+
/**
|
|
3
|
+
* Returns the definition unchanged, or throws when its field rules do not cover exactly the
|
|
4
|
+
* config's `fieldTypes`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function defineDynamicConfigNamespace<T extends DynamicConfigNamespaceDefinition>(definition: T): T;
|
|
7
|
+
/** Sets `maxValueExemption` on every field without a `maxValue`, except the named ones. */
|
|
8
|
+
export declare function withMaxValueExemption<T extends Record<string, DynamicConfigFieldRules>>(fields: T, reason: string, except?: readonly string[]): T;
|
|
9
|
+
/** Indexes definitions by namespace. Throws on duplicate namespaces. */
|
|
10
|
+
export declare function createDynamicConfigRegistry<T extends DynamicConfigNamespaceDefinition>(entries: readonly T[]): DynamicConfigRegistry<T>;
|
|
11
|
+
//# sourceMappingURL=registry.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.mts","sourceRoot":"","sources":["../../dynamic-config/registry.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,gCAAgC,EAChC,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,gCAAgC,EACrF,UAAU,EAAE,CAAC,GACZ,CAAC,CAYH;AAED,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,EACrF,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,SAAS,MAAM,EAAO,GAC7B,CAAC,CAUH;AAED,wEAAwE;AACxE,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,gCAAgC,EACpF,OAAO,EAAE,SAAS,CAAC,EAAE,GACpB,qBAAqB,CAAC,CAAC,CAAC,CAY1B"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the definition unchanged, or throws when its field rules do not cover exactly the
|
|
3
|
+
* config's `fieldTypes`.
|
|
4
|
+
*/
|
|
5
|
+
export function defineDynamicConfigNamespace(definition) {
|
|
6
|
+
const { fieldTypes } = definition.config;
|
|
7
|
+
const missing = Object.keys(fieldTypes).filter((name) => !Object.hasOwn(definition.fields, name));
|
|
8
|
+
const extra = Object.keys(definition.fields).filter((name) => !Object.hasOwn(fieldTypes, name));
|
|
9
|
+
if (missing.length === 0 && extra.length === 0)
|
|
10
|
+
return definition;
|
|
11
|
+
const details = [];
|
|
12
|
+
if (missing.length > 0)
|
|
13
|
+
details.push(`missing rules: ${missing.join(", ")}`);
|
|
14
|
+
if (extra.length > 0)
|
|
15
|
+
details.push(`extra rules: ${extra.join(", ")}`);
|
|
16
|
+
throw new Error(`DynamicConfig field rules drift for ${definition.namespace}: ${details.join("; ")}`);
|
|
17
|
+
}
|
|
18
|
+
/** Sets `maxValueExemption` on every field without a `maxValue`, except the named ones. */
|
|
19
|
+
export function withMaxValueExemption(fields, reason, except = []) {
|
|
20
|
+
const result = Object.create(null);
|
|
21
|
+
for (const name of Object.keys(fields)) {
|
|
22
|
+
const rules = fields[name];
|
|
23
|
+
result[name] =
|
|
24
|
+
rules.maxValue === undefined && !except.includes(name)
|
|
25
|
+
? { ...rules, maxValueExemption: reason }
|
|
26
|
+
: rules;
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
/** Indexes definitions by namespace. Throws on duplicate namespaces. */
|
|
31
|
+
export function createDynamicConfigRegistry(entries) {
|
|
32
|
+
const byNamespace = new Map();
|
|
33
|
+
for (const entry of entries) {
|
|
34
|
+
if (byNamespace.has(entry.namespace)) {
|
|
35
|
+
throw new Error(`Duplicate dynamic config namespace: ${entry.namespace}`);
|
|
36
|
+
}
|
|
37
|
+
byNamespace.set(entry.namespace, entry);
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
entries: [...entries],
|
|
41
|
+
get: (namespace) => byNamespace.get(namespace) ?? null,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=registry.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.mjs","sourceRoot":"","sources":["../../dynamic-config/registry.mts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,UAAa;IAEb,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAClG,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IAChG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAElE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvE,MAAM,IAAI,KAAK,CACb,uCAAuC,UAAU,CAAC,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;AACJ,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,qBAAqB,CACnC,MAAS,EACT,MAAc,EACd,MAAM,GAAsB,EAAE;IAE9B,MAAM,MAAM,GAA4C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACpD,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE;gBACzC,CAAC,CAAC,KAAK,CAAC;IACd,CAAC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,2BAA2B,CACzC,OAAqB;IAErB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAa,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO;QACL,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;QACrB,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI;KACvD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { DynamicConfigField, DynamicConfigFieldType } from "../types.mts";
|
|
2
|
+
/** The subset of a `DynamicConfig` that namespace definitions and update validation read. */
|
|
3
|
+
export type DynamicConfigSchema = {
|
|
4
|
+
fieldTypes: Record<string, DynamicConfigFieldType>;
|
|
5
|
+
};
|
|
6
|
+
/** Per-field update rules and display metadata. */
|
|
7
|
+
export type DynamicConfigFieldRules = {
|
|
8
|
+
description?: string | undefined;
|
|
9
|
+
/** Inclusive lower bound for number fields. */
|
|
10
|
+
minValue?: number | undefined;
|
|
11
|
+
/** Inclusive upper bound for number fields. */
|
|
12
|
+
maxValue?: number | undefined;
|
|
13
|
+
/** Why a number field intentionally has no `maxValue`. */
|
|
14
|
+
maxValueExemption?: string | undefined;
|
|
15
|
+
/** Requires number fields to be safe integers. */
|
|
16
|
+
integer?: boolean | undefined;
|
|
17
|
+
};
|
|
18
|
+
export type DynamicConfigNamespaceDefinition<TConfig extends DynamicConfigSchema = DynamicConfigSchema> = {
|
|
19
|
+
namespace: string;
|
|
20
|
+
config: TConfig;
|
|
21
|
+
/** Rules for every field in `config.fieldTypes`, and no others. */
|
|
22
|
+
fields: Record<string, DynamicConfigFieldRules>;
|
|
23
|
+
/** Cross-field validator over the merged fields; throws to reject an update. */
|
|
24
|
+
validate?: ((next: Record<string, DynamicConfigField>) => void) | undefined;
|
|
25
|
+
};
|
|
26
|
+
export type DynamicConfigRegistry<T extends DynamicConfigNamespaceDefinition = DynamicConfigNamespaceDefinition> = {
|
|
27
|
+
readonly entries: readonly T[];
|
|
28
|
+
get(namespace: string): T | null;
|
|
29
|
+
};
|
|
30
|
+
export type DynamicConfigUpdate = {
|
|
31
|
+
/** The requested changes after type and rule checks. */
|
|
32
|
+
changes: Record<string, DynamicConfigField>;
|
|
33
|
+
/** `current` merged with `changes`. */
|
|
34
|
+
next: Record<string, DynamicConfigField>;
|
|
35
|
+
/** Whether any requested value differs from `current`. */
|
|
36
|
+
changed: boolean;
|
|
37
|
+
};
|
|
38
|
+
export type DynamicConfigChangedFields = Record<string, {
|
|
39
|
+
previous: unknown;
|
|
40
|
+
next: unknown;
|
|
41
|
+
}>;
|
|
42
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../../dynamic-config/types.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE/E,6FAA6F;AAC7F,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACpD,CAAC;AAEF,mDAAmD;AACnD,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,gCAAgC,CAC1C,OAAO,SAAS,mBAAmB,GAAG,mBAAmB,IACvD;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAChD,gFAAgF;IAChF,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC7E,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAC/B,CAAC,SAAS,gCAAgC,GAAG,gCAAgC,IAC3E;IACF,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;IAC/B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACzC,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.mjs","sourceRoot":"","sources":["../../dynamic-config/types.mts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DynamicConfigField } from "../types.mts";
|
|
2
|
+
import type { DynamicConfigChangedFields, DynamicConfigNamespaceDefinition, DynamicConfigUpdate } from "./types.mts";
|
|
3
|
+
export declare class DynamicConfigValidationError extends Error {
|
|
4
|
+
name: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Validates untrusted changes against a namespace definition without writing anything.
|
|
8
|
+
* Values must already have their declared runtime type; unlike `DynamicConfig.setFields`, nothing
|
|
9
|
+
* is coerced. Runs the definition's `validate` hook on `current` merged with the changes.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateDynamicConfigUpdate(definition: DynamicConfigNamespaceDefinition, current: Record<string, DynamicConfigField>, changes: unknown): DynamicConfigUpdate;
|
|
12
|
+
/** Shallow diff of two field snapshots. Absent keys read as `undefined`. */
|
|
13
|
+
export declare function getChangedFields(previous: Record<string, unknown> | null | undefined, next: Record<string, unknown> | null | undefined): DynamicConfigChangedFields;
|
|
14
|
+
//# sourceMappingURL=validation.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.mts","sourceRoot":"","sources":["../../dynamic-config/validation.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EACV,0BAA0B,EAE1B,gCAAgC,EAChC,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAErB,qBAAa,4BAA6B,SAAQ,KAAK;IAC5C,IAAI,SAAkC;CAChD;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,gCAAgC,EAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC3C,OAAO,EAAE,OAAO,GACf,mBAAmB,CAqBrB;AA6CD,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EACpD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAC/C,0BAA0B,CAU5B"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export class DynamicConfigValidationError extends Error {
|
|
2
|
+
name = "DynamicConfigValidationError";
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Validates untrusted changes against a namespace definition without writing anything.
|
|
6
|
+
* Values must already have their declared runtime type; unlike `DynamicConfig.setFields`, nothing
|
|
7
|
+
* is coerced. Runs the definition's `validate` hook on `current` merged with the changes.
|
|
8
|
+
*/
|
|
9
|
+
export function validateDynamicConfigUpdate(definition, current, changes) {
|
|
10
|
+
if (changes === null || typeof changes !== "object" || Array.isArray(changes)) {
|
|
11
|
+
throw new DynamicConfigValidationError("Changes must be an object");
|
|
12
|
+
}
|
|
13
|
+
const names = Object.keys(changes);
|
|
14
|
+
if (names.length === 0) {
|
|
15
|
+
throw new DynamicConfigValidationError("Changes must not be empty");
|
|
16
|
+
}
|
|
17
|
+
// Null prototype so a declared `__proto__` field stays an own property.
|
|
18
|
+
const validated = Object.create(null);
|
|
19
|
+
let changed = false;
|
|
20
|
+
for (const name of names) {
|
|
21
|
+
const value = validateFieldValue(definition, name, changes[name]);
|
|
22
|
+
validated[name] = value;
|
|
23
|
+
if (current[name] !== value)
|
|
24
|
+
changed = true;
|
|
25
|
+
}
|
|
26
|
+
const next = { ...current, ...validated };
|
|
27
|
+
definition.validate?.(next);
|
|
28
|
+
return { changes: validated, next, changed };
|
|
29
|
+
}
|
|
30
|
+
function validateFieldValue(definition, name, value) {
|
|
31
|
+
const { fieldTypes } = definition.config;
|
|
32
|
+
if (!Object.hasOwn(fieldTypes, name)) {
|
|
33
|
+
throw new DynamicConfigValidationError(`Unknown field: ${name}`);
|
|
34
|
+
}
|
|
35
|
+
const type = fieldTypes[name];
|
|
36
|
+
if (type !== "number") {
|
|
37
|
+
if (typeof value !== type) {
|
|
38
|
+
throw new DynamicConfigValidationError(`Field ${name} must be a ${type}`);
|
|
39
|
+
}
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
43
|
+
throw new DynamicConfigValidationError(`Field ${name} must be a finite number`);
|
|
44
|
+
}
|
|
45
|
+
validateNumberRules(name, value, definition.fields[name]);
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
function validateNumberRules(name, value, rules) {
|
|
49
|
+
if (rules?.integer && !Number.isSafeInteger(value)) {
|
|
50
|
+
throw new DynamicConfigValidationError(`Field ${name} must be a safe integer`);
|
|
51
|
+
}
|
|
52
|
+
if (rules?.minValue !== undefined && value < rules.minValue) {
|
|
53
|
+
throw new DynamicConfigValidationError(`Field ${name} must be greater than or equal to ${rules.minValue}`);
|
|
54
|
+
}
|
|
55
|
+
if (rules?.maxValue !== undefined && value > rules.maxValue) {
|
|
56
|
+
throw new DynamicConfigValidationError(`Field ${name} must be less than or equal to ${rules.maxValue}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Shallow diff of two field snapshots. Absent keys read as `undefined`. */
|
|
60
|
+
export function getChangedFields(previous, next) {
|
|
61
|
+
const before = previous ?? {};
|
|
62
|
+
const after = next ?? {};
|
|
63
|
+
const changed = Object.create(null);
|
|
64
|
+
for (const key of new Set([...Object.keys(before), ...Object.keys(after)])) {
|
|
65
|
+
const previousValue = Object.hasOwn(before, key) ? before[key] : undefined;
|
|
66
|
+
const nextValue = Object.hasOwn(after, key) ? after[key] : undefined;
|
|
67
|
+
if (previousValue !== nextValue)
|
|
68
|
+
changed[key] = { previous: previousValue, next: nextValue };
|
|
69
|
+
}
|
|
70
|
+
return changed;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=validation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.mjs","sourceRoot":"","sources":["../../dynamic-config/validation.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DynamicConfigField } from "../types.mts";
|
|
2
|
+
type Fields = Record<string, DynamicConfigField>;
|
|
3
|
+
/** Requires every number field to be finite and greater than zero. Ignores other types. */
|
|
4
|
+
export declare function validatePositiveNumberFields(next: Fields): void;
|
|
5
|
+
/** Requires every number field to be an integer greater than zero. Ignores other types. */
|
|
6
|
+
export declare function validatePositiveIntegerFields(next: Fields): void;
|
|
7
|
+
/** Requires `next[field]` to be a number within `[min, max]`. */
|
|
8
|
+
export declare function validateNumberRange(next: Fields, field: string, min: number, max: number): void;
|
|
9
|
+
/** Requires `next[field]` to be one of the allowed strings. */
|
|
10
|
+
export declare function validateOneOf(next: Fields, field: string, allowed: readonly string[]): void;
|
|
11
|
+
/** Requires the named number fields to be strictly ascending in the given order. */
|
|
12
|
+
export declare function validateStrictlyAscending(next: Fields, fields: readonly string[]): void;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=validators.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.mts","sourceRoot":"","sources":["../../dynamic-config/validators.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGvD,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAEjD,2FAA2F;AAC3F,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAO/D;AAED,2FAA2F;AAC3F,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOhE;AAED,iEAAiE;AACjE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAO/F;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAK3F;AAED,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CASvF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { DynamicConfigValidationError } from "./validation.mjs";
|
|
2
|
+
/** Requires every number field to be finite and greater than zero. Ignores other types. */
|
|
3
|
+
export function validatePositiveNumberFields(next) {
|
|
4
|
+
for (const name of Object.keys(next)) {
|
|
5
|
+
const value = next[name];
|
|
6
|
+
if (typeof value === "number" && (!Number.isFinite(value) || value <= 0)) {
|
|
7
|
+
throw new DynamicConfigValidationError(`Field ${name} must be a positive finite number`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** Requires every number field to be an integer greater than zero. Ignores other types. */
|
|
12
|
+
export function validatePositiveIntegerFields(next) {
|
|
13
|
+
for (const name of Object.keys(next)) {
|
|
14
|
+
const value = next[name];
|
|
15
|
+
if (typeof value === "number" && (!Number.isInteger(value) || value <= 0)) {
|
|
16
|
+
throw new DynamicConfigValidationError(`Field ${name} must be a positive integer`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Requires `next[field]` to be a number within `[min, max]`. */
|
|
21
|
+
export function validateNumberRange(next, field, min, max) {
|
|
22
|
+
const value = next[field];
|
|
23
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < min || value > max) {
|
|
24
|
+
throw new DynamicConfigValidationError(`Field ${field} must be a number between ${min} and ${max}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Requires `next[field]` to be one of the allowed strings. */
|
|
28
|
+
export function validateOneOf(next, field, allowed) {
|
|
29
|
+
const value = next[field];
|
|
30
|
+
if (typeof value !== "string" || !allowed.includes(value)) {
|
|
31
|
+
throw new DynamicConfigValidationError(`Field ${field} must be one of: ${allowed.join(", ")}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Requires the named number fields to be strictly ascending in the given order. */
|
|
35
|
+
export function validateStrictlyAscending(next, fields) {
|
|
36
|
+
let previous = -Infinity;
|
|
37
|
+
for (const field of fields) {
|
|
38
|
+
const value = next[field];
|
|
39
|
+
if (typeof value !== "number" || !(previous < value)) {
|
|
40
|
+
throw new DynamicConfigValidationError(`Fields must be ordered: ${fields.join(" < ")}`);
|
|
41
|
+
}
|
|
42
|
+
previous = value;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=validators.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.mjs","sourceRoot":"","sources":["../../dynamic-config/validators.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAIhE,2FAA2F;AAC3F,MAAM,UAAU,4BAA4B,CAAC,IAAY;IACvD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,4BAA4B,CAAC,SAAS,IAAI,mCAAmC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,6BAA6B,CAAC,IAAY;IACxD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,4BAA4B,CAAC,SAAS,IAAI,6BAA6B,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW,EAAE,GAAW;IACvF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QACvF,MAAM,IAAI,4BAA4B,CACpC,SAAS,KAAK,6BAA6B,GAAG,QAAQ,GAAG,EAAE,CAC5D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,KAAa,EAAE,OAA0B;IACnF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,4BAA4B,CAAC,SAAS,KAAK,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,yBAAyB,CAAC,IAAY,EAAE,MAAyB;IAC/E,IAAI,QAAQ,GAAG,CAAC,QAAQ,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,4BAA4B,CAAC,2BAA2B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import type { DynamicConfigOptions, DynamicConfigField, DynamicConfigFieldType } from "./types.mts";
|
|
2
2
|
import { parseField, stringifyField } from "./dynamic-config/fields.mts";
|
|
3
|
+
export { getBoundedPositiveIntegerField } from "./dynamic-config/bounded-field.mts";
|
|
4
|
+
export type { BoundedPositiveIntegerLimits } from "./dynamic-config/bounded-field.mts";
|
|
5
|
+
export { createDynamicConfigRegistry, defineDynamicConfigNamespace, withMaxValueExemption, } from "./dynamic-config/registry.mts";
|
|
6
|
+
export { DynamicConfigValidationError, getChangedFields, validateDynamicConfigUpdate, } from "./dynamic-config/validation.mts";
|
|
7
|
+
export { validateNumberRange, validateOneOf, validatePositiveIntegerFields, validatePositiveNumberFields, validateStrictlyAscending, } from "./dynamic-config/validators.mts";
|
|
8
|
+
export type * from "./dynamic-config/types.mts";
|
|
3
9
|
export declare const dynamicConfigs: DynamicConfig[];
|
|
4
10
|
export declare class DynamicConfig {
|
|
5
11
|
staleTtl: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-config.d.mts","sourceRoot":"","sources":["../dynamic-config.mts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AASpG,OAAO,EACL,UAAU,EAEV,cAAc,EAEf,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"dynamic-config.d.mts","sourceRoot":"","sources":["../dynamic-config.mts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AASpG,OAAO,EACL,UAAU,EAEV,cAAc,EAEf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAC;AACpF,YAAY,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,6BAA6B,EAC7B,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,iCAAiC,CAAC;AACzC,mBAAmB,4BAA4B,CAAC;AAKhD,eAAO,MAAM,cAAc,EAAE,aAAa,EAAO,CAAC;AAElD,qBAAa,aAAa;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACnD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAClD,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,YAAY,CAIhB;IACJ,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,oBAAoB,CAA4B;IACxD,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqD;IAEpF,YAAY,OAAO,EAAE,oBAAoB,EAiCxC;IAEK,UAAU,kBA0Bf;IAEK,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3C;IAED,OAAO,CAAC,kBAAkB;IAI1B,cAAc,wBAAkB;IAChC,UAAU,oBAAc;IAExB,OAAO,CAAC,YAAY;IAIpB,OAAO,KAAK,oBAAoB,GAK/B;YAEa,kBAAkB;IAY1B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAM/B;IAGD,WAAW,IAAI,IAAI,CAElB;IAED,OAAO,CAAC,mBAAmB;IAgB3B,kBAAkB,SAOjB;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrB;IAEK,OAAO,kBAuBZ;IAED,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAM9C;IAIK,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCzE;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/D;CACF"}
|
package/dist/dynamic-config.mjs
CHANGED
|
@@ -3,6 +3,10 @@ import { handleValkeyError } from "./errors.mjs";
|
|
|
3
3
|
import { config } from "./config.mjs";
|
|
4
4
|
import { applyFieldsFromMap, buildMissingDefaultWrites, getDynamicConfigFieldsMap, writeDynamicConfigFields, } from "./dynamic-config/storage.mjs";
|
|
5
5
|
import { parseField, processFieldValue, stringifyField, validateFieldTypes, } from "./dynamic-config/fields.mjs";
|
|
6
|
+
export { getBoundedPositiveIntegerField } from "./dynamic-config/bounded-field.mjs";
|
|
7
|
+
export { createDynamicConfigRegistry, defineDynamicConfigNamespace, withMaxValueExemption, } from "./dynamic-config/registry.mjs";
|
|
8
|
+
export { DynamicConfigValidationError, getChangedFields, validateDynamicConfigUpdate, } from "./dynamic-config/validation.mjs";
|
|
9
|
+
export { validateNumberRange, validateOneOf, validatePositiveIntegerFields, validatePositiveNumberFields, validateStrictlyAscending, } from "./dynamic-config/validators.mjs";
|
|
6
10
|
const NAMESPACE = "dynamic-config";
|
|
7
11
|
const isTest = process.env.NODE_ENV === "test";
|
|
8
12
|
export const dynamicConfigs = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-config.mjs","sourceRoot":"","sources":["../dynamic-config.mts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dynamic-config.mjs","sourceRoot":"","sources":["../dynamic-config.mts"],"names":[],"mappings":"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"}
|
package/docs/api.md
CHANGED
|
@@ -6,7 +6,7 @@ This is the entry point for the public `valkyries` API. Detailed API documentati
|
|
|
6
6
|
|
|
7
7
|
- [`ValkeyCache`](cache.md) - read-through cache helpers, direct get/set APIs, invalidation, stale refresh, and Bloom-filter integration.
|
|
8
8
|
- [`ValkeyBloomFilter`](bloom-filters.md) - Bloom filter lookup, writes, readiness markers, streaming rebuilds, and key helpers.
|
|
9
|
-
- [`DynamicConfig`](dynamic-config.md) - distributed runtime fields backed by Valkey hashes and pub/sub updates.
|
|
9
|
+
- [`DynamicConfig`](dynamic-config.md) - distributed runtime fields backed by Valkey hashes and pub/sub updates, plus namespace registries and update validation.
|
|
10
10
|
- [Channel pub/sub](channel-pubsub.md) - ephemeral, caller-managed key-scoped pub/sub.
|
|
11
11
|
- [`RateLimiter`](rate-limiter.md) - sliding-window rate limiting backed by sorted sets and Lua scripts.
|
|
12
12
|
- [Idempotency keys](idempotency-key.md) - consume-once values and token-fenced idempotency-key lifecycle helpers.
|
package/docs/dynamic-config.md
CHANGED
|
@@ -77,6 +77,8 @@ config.waitForInitialization(): Promise<void>
|
|
|
77
77
|
|
|
78
78
|
Waits for field validation, default writes, initial field loading, pub/sub subscription, and timer creation.
|
|
79
79
|
|
|
80
|
+
The shared subscription client uses a 2-second native connection timeout and a 5-second creation deadline. If creation rejects or reaches that deadline, the cached attempt is cleared and callers receive the failure; a later explicit call can start a new attempt. A client that finishes creation after the deadline is closed rather than retained. This does not automatically retry initialization or cancel an unresolved native creation operation.
|
|
81
|
+
|
|
80
82
|
## `getFields()`
|
|
81
83
|
|
|
82
84
|
```ts
|
|
@@ -149,3 +151,108 @@ import { dynamicConfigs } from "valkyries";
|
|
|
149
151
|
```
|
|
150
152
|
|
|
151
153
|
Array of live `DynamicConfig` instances. It is used by `closeValkeyClients()` to close configs during shutdown.
|
|
154
|
+
|
|
155
|
+
## `getBoundedPositiveIntegerField(config, field, limits)`
|
|
156
|
+
|
|
157
|
+
```ts
|
|
158
|
+
import { getBoundedPositiveIntegerField } from "valkyries/dynamic-config";
|
|
159
|
+
|
|
160
|
+
const batchSize = getBoundedPositiveIntegerField(flags, "batchSize", {
|
|
161
|
+
defaultValue: 100,
|
|
162
|
+
maxValue: 1000,
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Reads a numeric field from `config.fields` and returns it only when it is an integer greater than `0` and at most `limits.maxValue`. Otherwise it returns `limits.defaultValue`.
|
|
167
|
+
|
|
168
|
+
A missing field, a non-number, a non-integer, `0`, a negative number, and a value above `maxValue` all fall back to `defaultValue`. Values above `maxValue` are treated as invalid and are never clamped to the maximum.
|
|
169
|
+
|
|
170
|
+
`config` only needs a `fields` map, so any `DynamicConfig` instance works.
|
|
171
|
+
|
|
172
|
+
## Namespaces and Update Validation
|
|
173
|
+
|
|
174
|
+
These helpers validate untrusted updates, such as admin edits, before they reach `setFields()`. They are pure: they never read or write Valkey, and they only read `config.fieldTypes`. Authorization, audit history, and response shapes stay in the application.
|
|
175
|
+
|
|
176
|
+
```ts
|
|
177
|
+
import {
|
|
178
|
+
createDynamicConfigRegistry,
|
|
179
|
+
defineDynamicConfigNamespace,
|
|
180
|
+
validateDynamicConfigUpdate,
|
|
181
|
+
validateStrictlyAscending,
|
|
182
|
+
} from "valkyries/dynamic-config";
|
|
183
|
+
|
|
184
|
+
const registry = createDynamicConfigRegistry([
|
|
185
|
+
defineDynamicConfigNamespace({
|
|
186
|
+
namespace: "limits",
|
|
187
|
+
config: limits, // a DynamicConfig
|
|
188
|
+
fields: {
|
|
189
|
+
soft: { minValue: 1, integer: true, description: "Soft limit" },
|
|
190
|
+
hard: { minValue: 1, maxValue: 1000, integer: true },
|
|
191
|
+
},
|
|
192
|
+
validate: (next) => validateStrictlyAscending(next, ["soft", "hard"]),
|
|
193
|
+
}),
|
|
194
|
+
]);
|
|
195
|
+
|
|
196
|
+
const entry = registry.get("limits");
|
|
197
|
+
if (entry) {
|
|
198
|
+
await entry.config.waitForInitialization();
|
|
199
|
+
const update = validateDynamicConfigUpdate(entry, entry.config.getFields(), requestBody);
|
|
200
|
+
if (update.changed) await entry.config.setFields(update.changes);
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### `defineDynamicConfigNamespace(definition)`
|
|
205
|
+
|
|
206
|
+
Returns `definition` unchanged. Throws when `fields` does not have exactly one entry per `config.fieldTypes` key, which catches rules that have drifted from the config schema. Definitions may carry extra application properties, such as labels or access policy. Those properties keep their types through the registry.
|
|
207
|
+
|
|
208
|
+
```ts
|
|
209
|
+
type DynamicConfigNamespaceDefinition = {
|
|
210
|
+
namespace: string;
|
|
211
|
+
config: { fieldTypes: Record<string, "string" | "number" | "boolean"> };
|
|
212
|
+
fields: Record<string, DynamicConfigFieldRules>;
|
|
213
|
+
validate?: (next: Record<string, string | number | boolean>) => void;
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
type DynamicConfigFieldRules = {
|
|
217
|
+
description?: string;
|
|
218
|
+
minValue?: number; // inclusive, number fields
|
|
219
|
+
maxValue?: number; // inclusive, number fields
|
|
220
|
+
maxValueExemption?: string; // why a number field has no maxValue
|
|
221
|
+
integer?: boolean; // number fields must be safe integers
|
|
222
|
+
};
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### `withMaxValueExemption(fields, reason, except?)`
|
|
226
|
+
|
|
227
|
+
Returns a copy of `fields` that sets `maxValueExemption: reason` on every field without a `maxValue`, skipping the names in `except`.
|
|
228
|
+
|
|
229
|
+
### `createDynamicConfigRegistry(entries)`
|
|
230
|
+
|
|
231
|
+
Returns `{ entries, get(namespace) }`. `get` returns `null` for unknown namespaces. Throws on duplicate namespaces.
|
|
232
|
+
|
|
233
|
+
### `validateDynamicConfigUpdate(definition, current, changes)`
|
|
234
|
+
|
|
235
|
+
Validates `changes` against the definition and returns `{ changes, next, changed }`. `changes` holds the validated values, `next` is `current` merged with `changes`, and `changed` is true when any requested value differs from `current`. Throws `DynamicConfigValidationError` when:
|
|
236
|
+
|
|
237
|
+
- `changes` is not a non-empty plain object
|
|
238
|
+
- a field name is not in `config.fieldTypes`
|
|
239
|
+
- a value does not already have the field's declared type (`boolean`, `string`, or a finite `number`)
|
|
240
|
+
- a number breaks the field's `integer`, `minValue`, or `maxValue` rule
|
|
241
|
+
|
|
242
|
+
After those checks it runs the definition's `validate` hook on `next`. The hook may throw any error.
|
|
243
|
+
|
|
244
|
+
Unlike `setFields()`, it does not coerce values. For example, `"3"` is rejected for a number field and `"true"` is rejected for a boolean field.
|
|
245
|
+
|
|
246
|
+
### `getChangedFields(previous, next)`
|
|
247
|
+
|
|
248
|
+
Shallow diff of two field snapshots: `Record<string, { previous, next }>`. A missing key reads as `undefined`, and `null` or `undefined` snapshots are treated as empty.
|
|
249
|
+
|
|
250
|
+
### Validators
|
|
251
|
+
|
|
252
|
+
Use these inside a `validate` hook. Each one throws `DynamicConfigValidationError`.
|
|
253
|
+
|
|
254
|
+
- `validatePositiveNumberFields(next)`: every number field must be finite and greater than 0.
|
|
255
|
+
- `validatePositiveIntegerFields(next)`: every number field must be an integer greater than 0.
|
|
256
|
+
- `validateNumberRange(next, field, min, max)`: `next[field]` must be a finite number in `[min, max]`.
|
|
257
|
+
- `validateOneOf(next, field, allowed)`: `next[field]` must be one of the `allowed` strings.
|
|
258
|
+
- `validateStrictlyAscending(next, fields)`: the named fields must be numbers in strictly ascending order.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "valkyries",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
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": {
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"@types/node": "^26.1.0",
|
|
71
71
|
"@vitest/coverage-v8": "^5.0.0",
|
|
72
72
|
"github-actionlint": "^1.7.12",
|
|
73
|
-
"oxfmt": "^0.
|
|
73
|
+
"oxfmt": "^0.70.0",
|
|
74
74
|
"oxlint": "^1.65.0",
|
|
75
75
|
"oxlint-tsgolint": "^7.0.2001",
|
|
76
76
|
"tsx": "^4.22.1",
|