* parse range header. * * ```ts ignore * parseRangeHeader("bytes=0-100", 500); // => { start: 0, end: 100 } * parseRangeHeader("bytes=0-", 500); // => { start: 0, end: 499 } * parseRangeHeader("bytes=-100", 500); // => { start: 400, end: 499 } * parseRangeHeader("bytes=invalid", 500)
(rangeValue: string, fileSize: number)
| 119 | * Note: Currently, no support for multiple Ranges (e.g. `bytes=0-10, 20-30`) |
| 120 | */ |
| 121 | function parseRangeHeader(rangeValue: string, fileSize: number) { |
| 122 | const rangeRegex = /bytes=(?<start>\d+)?-(?<end>\d+)?$/u; |
| 123 | const parsed = rangeValue.match(rangeRegex); |
| 124 | |
| 125 | if (!parsed || !parsed.groups) { |
| 126 | // failed to parse range header |
| 127 | return null; |
| 128 | } |
| 129 | |
| 130 | const { start, end } = parsed.groups; |
| 131 | if (start !== undefined) { |
| 132 | if (end !== undefined) { |
| 133 | return { start: +start, end: +end }; |
| 134 | } else { |
| 135 | return { start: +start, end: fileSize - 1 }; |
| 136 | } |
| 137 | } else { |
| 138 | if (end !== undefined) { |
| 139 | // example: `bytes=-100` means the last 100 bytes. |
| 140 | return { start: fileSize - +end, end: fileSize - 1 }; |
| 141 | } else { |
| 142 | // failed to parse range header |
| 143 | return null; |
| 144 | } |
| 145 | } |
| 146 | } |
| 147 | |
| 148 | /** Options for {@linkcode serveFile}. */ |
| 149 | export interface ServeFileOptions { |