Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit f8dd8dc

Browse files
committed
Refactor out common range parsing code in storages
We made a similar change in Miniflare 2 recently
1 parent d6cdeea commit f8dd8dc

File tree

4 files changed

+33
-47
lines changed

4 files changed

+33
-47
lines changed

packages/tre/src/storage/file.ts

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
StoredKeyMeta,
1616
StoredMeta,
1717
StoredValueMeta,
18+
parseRange,
1819
} from "./storage";
1920

2021
export interface FileRange {
@@ -57,25 +58,7 @@ export async function readFileRange(
5758
filePath = await fs.realpath(filePath);
5859
const { size } = await fs.lstat(filePath);
5960
// build offset and length as necessary
60-
if (suffix !== undefined) {
61-
if (suffix <= 0) {
62-
throw new Error("Suffix must be > 0");
63-
}
64-
if (suffix > size) suffix = size;
65-
offset = size - suffix;
66-
length = size - offset;
67-
}
68-
if (offset === undefined) offset = 0;
69-
if (length === undefined) {
70-
// get length of file
71-
length = size - offset;
72-
}
73-
74-
// check offset and length are valid
75-
if (offset < 0) throw new Error("Offset must be >= 0");
76-
if (offset >= size) throw new Error("Offset must be < size");
77-
if (length <= 0) throw new Error("Length must be > 0");
78-
if (offset + length > size) length = size - offset;
61+
({ offset, length } = parseRange({ offset, length, suffix }, size));
7962

8063
// read file
8164
fd = await fs.open(filePath, "r");

packages/tre/src/storage/memory.ts

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,9 @@ import {
88
StoredMeta,
99
StoredValueMeta,
1010
cloneMetadata,
11+
parseRange,
1112
} from "./storage";
1213

13-
export function parseRange(
14-
{ offset, length, suffix }: Range,
15-
size: number
16-
): Required<Pick<Range, "offset" | "length">> {
17-
// build proper offset and length
18-
if (suffix !== undefined) {
19-
if (suffix <= 0) {
20-
throw new Error("Suffix must be > 0");
21-
}
22-
if (suffix > size) suffix = size;
23-
offset = size - suffix;
24-
length = size - offset;
25-
}
26-
if (offset === undefined) offset = 0;
27-
if (length === undefined) length = size - offset;
28-
29-
// if offset is negative or greater than size, throw an error
30-
if (offset < 0) throw new Error("Offset must be >= 0");
31-
if (offset >= size) throw new Error("Offset must be < size");
32-
// if length is less than or equal to 0, throw an error
33-
if (length <= 0) throw new Error("Length must be > 0");
34-
// if length goes beyond actual length, adjust length to the end of the value
35-
if (offset + length > size) length = size - offset;
36-
37-
return { offset, length };
38-
}
3914
export class MemoryStorage extends LocalStorage {
4015
#sqliteDatabase?: DatabaseType;
4116

@@ -87,7 +62,6 @@ export class MemoryStorage extends LocalStorage {
8762
if (stored === undefined) return;
8863
const { value } = stored;
8964
const size = value.byteLength;
90-
9165
const { offset, length } = parseRange(range, size);
9266

9367
return {

packages/tre/src/storage/sqlite.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import crypto from "crypto";
22
import Database, { Database as DatabaseType } from "better-sqlite3";
33
import { defaultClock } from "../shared";
44
import { LocalStorage } from "./local";
5-
import { parseRange } from "./memory";
65
import {
76
Range,
87
RangeStoredValueMeta,
98
StoredKey,
109
StoredKeyMeta,
1110
StoredMeta,
1211
StoredValueMeta,
12+
parseRange,
1313
} from "./storage";
1414

1515
// Don't use this!

packages/tre/src/storage/storage.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,35 @@ export interface Range {
4545
length?: number;
4646
suffix?: number;
4747
}
48+
export interface ParsedRange {
49+
offset: number;
50+
length: number;
51+
}
52+
export function parseRange(
53+
{ offset, length, suffix }: Range,
54+
size: number
55+
): ParsedRange {
56+
if (suffix !== undefined) {
57+
if (suffix <= 0) {
58+
throw new Error("Suffix must be > 0");
59+
}
60+
if (suffix > size) suffix = size;
61+
offset = size - suffix;
62+
length = size - offset;
63+
}
64+
if (offset === undefined) offset = 0;
65+
if (length === undefined) length = size - offset;
66+
67+
// If offset is negative or greater than size, throw an error
68+
if (offset < 0) throw new Error("Offset must be >= 0");
69+
if (offset > size) throw new Error("Offset must be < size");
70+
// If length is less than or equal to 0, throw an error
71+
if (length <= 0) throw new Error("Length must be > 0");
72+
// If length goes beyond actual length, adjust length to the end of the value
73+
if (offset + length > size) length = size - offset;
74+
75+
return { offset, length };
76+
}
4877

4978
export interface StorageListOptions {
5079
// Stage 1: filtering

0 commit comments

Comments
 (0)