denoland/deno · error · RangeError
ERR_OUT_OF_RANGE
ERR_OUT_OF_RANGE
Error message
The value of "prevValue.user" is out of range. It must be >= 0 && <= 2^53. Received ${prevValue.user} What it means
Beyond the type check, prevValue.user must be a finite non-negative number (Node documents the range 0..2^53). NaN passes typeof but fails Number.isFinite; Infinity and negatives fail the >= 0 test — all throw ERR_OUT_OF_RANGE('prevValue.user', '>= 0 && <= 2^53', value).
Source
Thrown at ext/node/polyfills/worker_threads.ts:872
this[privateWorkerRef](true);
}
unref() {
this[privateWorkerRef](false);
}
cpuUsage(prevValue?: { user: number; system: number }) {
if (prevValue != null && !NumberIsNaN(prevValue)) {
validateObject(prevValue, "prevValue");
if (typeof prevValue.user !== "number") {
throw new ERR_INVALID_ARG_TYPE(
"prevValue.user",
"number",
prevValue.user,
);
}
if (!NumberIsFinite(prevValue.user) || prevValue.user < 0) {
throw new ERR_OUT_OF_RANGE(
"prevValue.user",
">= 0 && <= 2^53",
prevValue.user,
);
}
if (typeof prevValue.system !== "number") {
throw new ERR_INVALID_ARG_TYPE(
"prevValue.system",
"number",
prevValue.system,
);
}
if (!NumberIsFinite(prevValue.system) || prevValue.system < 0) {
throw new ERR_OUT_OF_RANGE(
"prevValue.system",
">= 0 && <= 2^53",
prevValue.system,
);View on GitHub (pinned to 9ad36f7a2c)
Solutions
- Do not precompute deltas — pass the earlier sample and let the API subtract.
- Sanitize before calling: Number.isFinite(v.user) && v.user >= 0, else omit prevValue.
- Fix the upstream source producing NaN or negative values.
Example fix
// before
const delta = worker.cpuUsage({ user: end.user - start.user, system: 0 }); // can go negative
// after
const delta = worker.cpuUsage(start); // pass the earlier sample itself Defensive patterns
Strategy: validation
Validate before calling
const usable = prev != null && Number.isFinite(prev.user) && prev.user >= 0 && Number.isFinite(prev.system) && prev.system >= 0; const delta = worker.cpuUsage(usable ? prev : undefined);
Type guard
const isRangeOkCpuSample = (v: { user: number; system: number }) =>
Number.isFinite(v.user) && v.user >= 0 && Number.isFinite(v.system) && v.system >= 0; Prevention
- Never subtract timestamps yourself before calling cpuUsage.
- Reject -1/NaN sentinels when ingesting metrics from other systems.
- Unit-test boundary values (0, 2^53) once per wrapper.
When it happens
Trigger: worker.cpuUsage({ user: -1, system: 0 }); worker.cpuUsage({ user: NaN, system: 0 }); worker.cpuUsage({ user: Infinity, system: 0 }).
Common situations: Hand-computed negative deltas from clock-source mismatches or counter resets; NaN produced by undefined arithmetic when a field is missing; telemetry sentinels like -1.
Related errors
- Selector must specify either 'prefix' or both 'start' and 'e
- ERR_OUT_OF_RANGE
- BenchContext::start() has already been invoked
- ${prefix}Linter plugin name must only contain lowercase lett
- ${prefix}Linter plugin name must start and end with a lowerc
AI-assisted analysis of denoland/deno@9ad36f7a2c (2026-08-20).
Data as JSON: /api/errors/a9c0c72776266825.
Report an issue: GitHub.