Skip to content

Commit 643724e

Browse files
committed
fix(env): add min option to envNumber for strict-positive configs
1 parent 233f7bd commit 643724e

3 files changed

Lines changed: 23 additions & 12 deletions

File tree

apps/sim/lib/copilot/request/session/buffer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ export type StreamConfig = {
4040

4141
export function getStreamConfig(): StreamConfig {
4242
return {
43-
ttlSeconds: envNumber(env.COPILOT_STREAM_TTL_SECONDS, DEFAULT_TTL_SECONDS),
44-
eventLimit: envNumber(env.COPILOT_STREAM_EVENT_LIMIT, DEFAULT_EVENT_LIMIT),
43+
ttlSeconds: envNumber(env.COPILOT_STREAM_TTL_SECONDS, DEFAULT_TTL_SECONDS, { min: 1 }),
44+
eventLimit: envNumber(env.COPILOT_STREAM_EVENT_LIMIT, DEFAULT_EVENT_LIMIT, { min: 1 }),
4545
}
4646
}
4747

apps/sim/lib/core/config/env.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -516,19 +516,25 @@ export const isFalsy = (value: string | boolean | number | undefined) =>
516516
export { getEnv }
517517

518518
/**
519-
* Coerce an env-derived value to a positive finite number, falling back to the
520-
* provided default when the value is unset, empty, non-finite, or negative.
521-
* Zero is accepted — some configs (e.g. `KB_CONFIG_DELAY_BETWEEN_BATCHES`)
522-
* use `0` to mean "no delay / max throughput".
519+
* Coerce an env-derived value to a finite number ≥ `min`, falling back to the
520+
* provided default when the value is unset, empty, non-finite, or below `min`.
521+
* `min` defaults to `0` so configs like `KB_CONFIG_DELAY_BETWEEN_BATCHES=0`
522+
* (meaning "no delay / max throughput") are honored. Pass `min: 1` for configs
523+
* where zero is invalid (e.g. Redis TTLs, capacity limits).
523524
*
524525
* `createEnv` is configured with `skipValidation: true`, so values declared as
525526
* `z.number()` arrive as raw strings when sourced from `process.env` or Helm.
526527
* Use this helper anywhere a numeric env override is consumed to normalize the
527528
* type at the boundary instead of relying on JS implicit coercion.
528529
*/
529-
export function envNumber(value: number | string | undefined | null, fallback: number): number {
530-
if (typeof value === 'number' && Number.isFinite(value) && value >= 0) return value
530+
export function envNumber(
531+
value: number | string | undefined | null,
532+
fallback: number,
533+
options: { min?: number } = {}
534+
): number {
535+
const min = options.min ?? 0
536+
if (typeof value === 'number' && Number.isFinite(value) && value >= min) return value
531537
if (value === undefined || value === null || value === '') return fallback
532538
const parsed = Number(value)
533-
return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback
539+
return Number.isFinite(parsed) && parsed >= min ? parsed : fallback
534540
}

packages/testing/src/mocks/env.mock.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,16 @@ export function createEnvMock(overrides: Record<string, string | undefined> = {}
5353
typeof value === 'string'
5454
? value.toLowerCase() === 'false' || value === '0'
5555
: value === false,
56-
envNumber: (value: number | string | undefined | null, fallback: number): number => {
57-
if (typeof value === 'number' && Number.isFinite(value) && value >= 0) return value
56+
envNumber: (
57+
value: number | string | undefined | null,
58+
fallback: number,
59+
options: { min?: number } = {}
60+
): number => {
61+
const min = options.min ?? 0
62+
if (typeof value === 'number' && Number.isFinite(value) && value >= min) return value
5863
if (value === undefined || value === null || value === '') return fallback
5964
const parsed = Number(value)
60-
return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback
65+
return Number.isFinite(parsed) && parsed >= min ? parsed : fallback
6166
},
6267
}
6368
}

0 commit comments

Comments
 (0)