Skip to content

Commit

Permalink
replace readRange with readRanges that opens file only once
Browse files Browse the repository at this point in the history
  • Loading branch information
LiviaMedeiros committed Aug 29, 2023
1 parent 9f34c4c commit 9217598
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 15 deletions.
29 changes: 17 additions & 12 deletions lib/fs.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@ const rangeToFSOpts = (range, size = Infinity) => {
size = Number(size);

let [start, end] = range.split('-').map($ => $ === '' ? null : Number($));
start ?? (end === null
? start = 0
: (start = size - end, end = size - 1)
);
end ??= size - 1;
start ?? (start = size - end || 0, end = size - 1);

if (end > size - 1)
throw new RangeError(`end (${end}) exceeds size (${size}) - 1`);
Expand All @@ -17,22 +20,24 @@ const rangeToFSOpts = (range, size = Infinity) => {
return { length: end - start + 1, position: start };
};

const readRange = async (range, size, url) => {
const { length, position } = rangeToFSOpts(range, size);

let fd;
const readRanges = async (url, ranges, size, fd) => {
try {
fd = await open(url);
return fd.read(new Uint8Array(length), {
length,
position,
}).then(({ buffer }) => buffer);
fd ??= await open(url);

return Promise.all(ranges.map(range => {
const { length, position } = rangeToFSOpts(range, size);

return fd.read(new Uint8Array(length), {
length,
position,
}).then(({ buffer }) => buffer);
}));
} finally {
await fd?.close();
}
};

const writeRange = async (range, url, body, flag) => {
const writeRange = async (url, range, body, flag) => {
let { length, position } = rangeToFSOpts(range);

let fd;
Expand All @@ -54,6 +59,6 @@ const writeRange = async (range, url, body, flag) => {
};

export {
readRange,
readRanges,
writeRange,
};
6 changes: 3 additions & 3 deletions lib/methods.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {
validatedBody,
} from './sri.mjs';
import {
readRange,
readRanges,
writeRange,
} from './fs.mjs';

Expand All @@ -33,7 +33,7 @@ const GET = async (url, { headers, integrity, signal }) => {

// TODO: rewrite this so only one filehandle is needed
return ranges.length
? Promise.all(ranges.map(range => readRange(range, size, url)))
? readRanges(url, ranges, size)
.then($ => validatedBody(integrity, $))
.then(
async body => [
Expand Down Expand Up @@ -64,7 +64,7 @@ const POSTorPUT = async (url, { body, headers, method }) => {

const flag = method === 'PUT' ? 'w+' : 'r+';
const [range] = getRanges(headers);
return writeRange(range ?? '-', url, body, flag).then(() => genericResponse(201));
return writeRange(url, range ?? '-', body, flag).then(() => genericResponse(201));
};

const methods = new Map([
Expand Down

0 comments on commit 9217598

Please sign in to comment.