{"record":{"id":"09bcfdfe2b1ede70","repo":"remotion-dev/remotion","slug":"parameter-durationinmilliseconds-must-be-finite","errorCode":null,"errorMessage":"Parameter 'durationInMilliseconds' must be finite but it is ${durationInMilliseconds}","messagePattern":"Parameter 'durationInMilliseconds' must be finite but it is (.+?)","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/lambda-client/src/estimate-price.ts","lineNumber":59,"sourceCode":"\tconst durationInMilliseconds =\n\t\t'durationInMiliseconds' in other\n\t\t\t? other.durationInMiliseconds\n\t\t\t: other.durationInMilliseconds;\n\n\tif (typeof durationInMilliseconds !== 'number') {\n\t\tthrow new TypeError(\n\t\t\t`Parameter 'durationInMilliseconds' must be a number but got ${typeof durationInMilliseconds}`,\n\t\t);\n\t}\n\n\tif (Number.isNaN(durationInMilliseconds)) {\n\t\tthrow new TypeError(\n\t\t\t`Parameter 'durationInMilliseconds' must not be NaN but it is.`,\n\t\t);\n\t}\n\n\tif (!Number.isFinite(durationInMilliseconds)) {\n\t\tthrow new TypeError(\n\t\t\t`Parameter 'durationInMilliseconds' must be finite but it is ${durationInMilliseconds}`,\n\t\t);\n\t}\n\n\tif (durationInMilliseconds < 0) {\n\t\tthrow new TypeError(\n\t\t\t`Parameter 'durationInMilliseconds' must be over 0 but it is ${durationInMilliseconds}.`,\n\t\t);\n\t}\n\n\tconst durationPrice = pricing[region]['Lambda Duration-ARM'].price;\n\n\t// In GB-second\n\tconst timeCostDollars =\n\t\tNumber(durationPrice) *\n\t\t((memorySizeInMb * durationInMilliseconds) / 1000 / 1024);\n\n\tconst diskSizePrice = pricing[region]['Lambda Storage-Duration-ARM'].price;","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/lambda-client/src/estimate-price.ts#L41-L77","documentation":"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.","triggerScenarios":"durationInMilliseconds is Infinity or -Infinity (e.g. from division by zero or a bad calculation).","commonSituations":"Upstream division producing Infinity, unbounded user input, JSON deserialization of Infinity.","solutions":["Bound durationInMilliseconds to a sane finite range before calling","Fix the upstream calculation that produced Infinity"],"exampleFix":"// before\nconst durationInMilliseconds = totalMs / count; // count could be 0 -> Infinity\n\n// after\nconst durationInMilliseconds = count > 0 ? totalMs / count : 0;","handlingStrategy":"validation","validationCode":"if (!Number.isFinite(durationInMilliseconds)) {\n  throw new Error('duration must be finite');\n}","typeGuard":"const isDuration = (v: unknown): v is number => typeof v === 'number' && !Number.isNaN(v) && Number.isFinite(v) && v >= 0;","tryCatchPattern":null,"preventionTips":["Clamp durations with Math.max/Math.min before estimating","Watch for divide-by-zero in upstream duration math"],"tags":["typescript","validation","api","finite"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}