{"record":{"id":"d0b1810cfe2f849a","repo":"remotion-dev/remotion","slug":"a-duration-of-a-spring-must-be-finite-but-is","errorCode":null,"errorMessage":"A \"duration\" of a spring must be finite, but is ${dur}","messagePattern":"A \"duration\" of a spring must be finite, but is (.+?)","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/core/src/validation/validation-spring-duration.ts","lineNumber":19,"sourceCode":"export const validateSpringDuration = (dur: unknown) => {\n\tif (typeof dur === 'undefined') {\n\t\treturn;\n\t}\n\n\tif (typeof dur !== 'number') {\n\t\tthrow new TypeError(\n\t\t\t`A \"duration\" of a spring must be a \"number\" but is \"${typeof dur}\"`,\n\t\t);\n\t}\n\n\tif (Number.isNaN(dur)) {\n\t\tthrow new TypeError(\n\t\t\t'A \"duration\" of a spring is NaN, which it must not be',\n\t\t);\n\t}\n\n\tif (!Number.isFinite(dur)) {\n\t\tthrow new TypeError(\n\t\t\t'A \"duration\" of a spring must be finite, but is ' + dur,\n\t\t);\n\t}\n\n\tif (dur <= 0) {\n\t\tthrow new TypeError(\n\t\t\t'A \"duration\" of a spring must be positive, but is ' + dur,\n\t\t);\n\t}\n};\n","sourceCodeStart":1,"sourceCodeEnd":30,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/core/src/validation/validation-spring-duration.ts#L1-L30","documentation":"`validateSpringDuration()` rejects non-finite numbers (Infinity/-Infinity) for the optional `duration`. A non-finite duration would cause spring math to never converge, so the validator stops it early.","triggerScenarios":"Passing `duration: Infinity` or a value produced by an overflowing expression such as `1 / 0` to `spring()`.","commonSituations":"Computing duration as a ratio that can divide by zero, or accepting user input that includes division expressions.","solutions":["Pass a finite, positive number of seconds.","Clamp the computed value: `duration: Math.min(10, Math.max(0.1, computed))`.","Audit the arithmetic upstream of the spring call."],"exampleFix":"// before\nspring({frame, fps, config, duration: 1 / ratio}); // Infinity when ratio=0\n// after\nconst duration = Number.isFinite(1 / ratio) ? 1 / ratio : 1;\nspring({frame, fps, config, duration});","handlingStrategy":"validation","validationCode":"const duration = Number.isFinite(rawDuration) ? rawDuration : 1;","typeGuard":"const isFinitePositive = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v) && v > 0;","tryCatchPattern":null,"preventionTips":["Clamp duration to a finite positive range.","Avoid division-based duration calculations without bounds.","Add a default fallback at the prop boundary."],"tags":["validation","spring","animation","numeric"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}