(ranges: WriteFileRange[], size: number)
| 346 | } |
| 347 | |
| 348 | function normalizeRanges(ranges: WriteFileRange[], size: number): WriteFileRange[] { |
| 349 | const normalized = ranges |
| 350 | .map((range) => ({ |
| 351 | start: Math.max(0, Math.min(size, Math.floor(range.start))), |
| 352 | end: Math.max(0, Math.min(size, Math.ceil(range.end))), |
| 353 | })) |
| 354 | .filter((range) => range.start < range.end) |
| 355 | .sort((a, b) => a.start - b.start); |
| 356 | |
| 357 | const merged: WriteFileRange[] = []; |
| 358 | for (const range of normalized) { |
| 359 | const previous = merged.at(-1); |
| 360 | if (previous === undefined || previous.end < range.start) { |
| 361 | merged.push({ ...range }); |
| 362 | } else { |
| 363 | previous.end = Math.max(previous.end, range.end); |
| 364 | } |
| 365 | } |
| 366 | return merged; |
| 367 | } |
| 368 | |
| 369 | function existingChunkRefs(db: Database, inode: number): ChunkRef[] { |
| 370 | return db.all<ChunkRef>("SELECT hash, size FROM vfs_chunks WHERE inode = ? ORDER BY idx", inode); |
no test coverage detected