{"record":{"id":"bd6d3ed04181373a","repo":"videojs/video.js","slug":"this-timeranges-object-is-empty","errorCode":null,"errorMessage":"This TimeRanges object is empty","messagePattern":"This TimeRanges object is empty","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/js/utils/time.js","lineNumber":106,"sourceCode":"}\n\n/**\n * Create a time range object given ranges of time.\n *\n * @private\n * @param   {Array} [ranges]\n *          An array of time ranges.\n *\n * @return  {TimeRange}\n */\nfunction createTimeRangesObj(ranges) {\n  let timeRangesObj;\n\n  if (ranges === undefined || ranges.length === 0) {\n    timeRangesObj = {\n      length: 0,\n      start() {\n        throw new Error('This TimeRanges object is empty');\n      },\n      end() {\n        throw new Error('This TimeRanges object is empty');\n      }\n    };\n  } else {\n    timeRangesObj = {\n      length: ranges.length,\n      start: getRange.bind(null, 'start', 0, ranges),\n      end: getRange.bind(null, 'end', 1, ranges)\n    };\n  }\n\n  if (window.Symbol && window.Symbol.iterator) {\n    timeRangesObj[window.Symbol.iterator] = () => (ranges || []).values();\n  }\n\n  return timeRangesObj;","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/videojs/video.js/blob/c3a7e0e6d20cf5400c9afbee29965fe4dff393c2/src/js/utils/time.js#L88-L124","documentation":"Thrown by the start() method on a TimeRanges object created empty (ranges undefined or length 0). createTimeRangesObj installs start/end stubs that throw immediately to signal there is no range data, rather than returning undefined. Represents a player state with no buffered/seekable/played data.","triggerScenarios":"Calling player.buffered().start(0) before any media data has buffered; reading start() immediately after a source change or a flush that clears ranges; on live streams before a seekable window is established.","commonSituations":"Reading buffered progress at 'ready' or synchronously after src() before 'loadedmetadata'/'progress' fire; HLS/DASH streams with no buffered ranges yet; calling end() to draw a progress bar before playback begins.","solutions":["Guard with if (ranges.length > 0) before calling start()/end().","Wait for 'progress' or 'loadedmetadata' events before reading buffered/seekable.","Coalesce to 0: const s = buf.length ? buf.start(buf.length - 1) : 0."],"exampleFix":"// before\nconst start = player.buffered().start(0);\n// after\nconst b = player.buffered();\nconst start = b.length ? b.start(0) : 0;","handlingStrategy":"validation","validationCode":"function safeStart(ranges) {\n  return ranges.length ? ranges.start(0) : 0;\n}","typeGuard":"function hasRanges(ranges) {\n  return ranges && ranges.length > 0;\n}","tryCatchPattern":"try {\n  return ranges.start(0);\n} catch (err) {\n  if (/TimeRanges object is empty/.test(err.message)) return 0;\n  throw err;\n}","preventionTips":["Guard every start() call with if (ranges.length).","Wait for 'progress'/'loadedmetadata' before reading buffered/seekable.","Default to 0 when the object is empty rather than letting it throw."],"tags":["time-ranges","buffered","timing","validation"],"backgroundTag":null,"analyzedSha":"c3a7e0e6d20cf5400c9afbee29965fe4dff393c2","analyzedAt":"2026-08-13T04:20:15.471Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}