remotion-dev/remotion · error · TypeError

Parameter 'durationInMilliseconds' must be finite but it is

Error message

Parameter 'durationInMilliseconds' must be finite but it is ${durationInMilliseconds}

What it means

Third guard in the estimatePrice validation chain: Number.isFinite(durationInMilliseconds) is false (Infinity or -Infinity), so a TypeError is thrown with the offending value. Prevents the price formula from producing an Infinite dollar amount.

Source

Thrown at packages/lambda-client/src/estimate-price.ts:59

	const durationInMilliseconds =
		'durationInMiliseconds' in other
			? other.durationInMiliseconds
			: other.durationInMilliseconds;

	if (typeof durationInMilliseconds !== 'number') {
		throw new TypeError(
			`Parameter 'durationInMilliseconds' must be a number but got ${typeof durationInMilliseconds}`,
		);
	}

	if (Number.isNaN(durationInMilliseconds)) {
		throw new TypeError(
			`Parameter 'durationInMilliseconds' must not be NaN but it is.`,
		);
	}

	if (!Number.isFinite(durationInMilliseconds)) {
		throw new TypeError(
			`Parameter 'durationInMilliseconds' must be finite but it is ${durationInMilliseconds}`,
		);
	}

	if (durationInMilliseconds < 0) {
		throw new TypeError(
			`Parameter 'durationInMilliseconds' must be over 0 but it is ${durationInMilliseconds}.`,
		);
	}

	const durationPrice = pricing[region]['Lambda Duration-ARM'].price;

	// In GB-second
	const timeCostDollars =
		Number(durationPrice) *
		((memorySizeInMb * durationInMilliseconds) / 1000 / 1024);

	const diskSizePrice = pricing[region]['Lambda Storage-Duration-ARM'].price;

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Bound durationInMilliseconds to a sane finite range before calling
  2. Fix the upstream calculation that produced Infinity

Example fix

// before
const durationInMilliseconds = totalMs / count; // count could be 0 -> Infinity

// after
const durationInMilliseconds = count > 0 ? totalMs / count : 0;
Defensive patterns

Strategy: validation

Validate before calling

if (!Number.isFinite(durationInMilliseconds)) {
  throw new Error('duration must be finite');
}

Type guard

const isDuration = (v: unknown): v is number => typeof v === 'number' && !Number.isNaN(v) && Number.isFinite(v) && v >= 0;

Prevention

When it happens

Trigger: durationInMilliseconds is Infinity or -Infinity (e.g. from division by zero or a bad calculation).

Common situations: Upstream division producing Infinity, unbounded user input, JSON deserialization of Infinity.

Related errors


AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12). Data as JSON: /api/errors/09bcfdfe2b1ede70. Report an issue: GitHub.