gitx.do 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +156 -0
- package/dist/durable-object/object-store.d.ts +113 -0
- package/dist/durable-object/object-store.d.ts.map +1 -0
- package/dist/durable-object/object-store.js +387 -0
- package/dist/durable-object/object-store.js.map +1 -0
- package/dist/durable-object/schema.d.ts +17 -0
- package/dist/durable-object/schema.d.ts.map +1 -0
- package/dist/durable-object/schema.js +43 -0
- package/dist/durable-object/schema.js.map +1 -0
- package/dist/durable-object/wal.d.ts +111 -0
- package/dist/durable-object/wal.d.ts.map +1 -0
- package/dist/durable-object/wal.js +200 -0
- package/dist/durable-object/wal.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/adapter.d.ts +231 -0
- package/dist/mcp/adapter.d.ts.map +1 -0
- package/dist/mcp/adapter.js +502 -0
- package/dist/mcp/adapter.js.map +1 -0
- package/dist/mcp/sandbox.d.ts +261 -0
- package/dist/mcp/sandbox.d.ts.map +1 -0
- package/dist/mcp/sandbox.js +983 -0
- package/dist/mcp/sandbox.js.map +1 -0
- package/dist/mcp/sdk-adapter.d.ts +413 -0
- package/dist/mcp/sdk-adapter.d.ts.map +1 -0
- package/dist/mcp/sdk-adapter.js +672 -0
- package/dist/mcp/sdk-adapter.js.map +1 -0
- package/dist/mcp/tools.d.ts +133 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +1604 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/ops/blame.d.ts +148 -0
- package/dist/ops/blame.d.ts.map +1 -0
- package/dist/ops/blame.js +754 -0
- package/dist/ops/blame.js.map +1 -0
- package/dist/ops/branch.d.ts +215 -0
- package/dist/ops/branch.d.ts.map +1 -0
- package/dist/ops/branch.js +608 -0
- package/dist/ops/branch.js.map +1 -0
- package/dist/ops/commit-traversal.d.ts +209 -0
- package/dist/ops/commit-traversal.d.ts.map +1 -0
- package/dist/ops/commit-traversal.js +755 -0
- package/dist/ops/commit-traversal.js.map +1 -0
- package/dist/ops/commit.d.ts +221 -0
- package/dist/ops/commit.d.ts.map +1 -0
- package/dist/ops/commit.js +606 -0
- package/dist/ops/commit.js.map +1 -0
- package/dist/ops/merge-base.d.ts +223 -0
- package/dist/ops/merge-base.d.ts.map +1 -0
- package/dist/ops/merge-base.js +581 -0
- package/dist/ops/merge-base.js.map +1 -0
- package/dist/ops/merge.d.ts +385 -0
- package/dist/ops/merge.d.ts.map +1 -0
- package/dist/ops/merge.js +1203 -0
- package/dist/ops/merge.js.map +1 -0
- package/dist/ops/tag.d.ts +182 -0
- package/dist/ops/tag.d.ts.map +1 -0
- package/dist/ops/tag.js +608 -0
- package/dist/ops/tag.js.map +1 -0
- package/dist/ops/tree-builder.d.ts +82 -0
- package/dist/ops/tree-builder.d.ts.map +1 -0
- package/dist/ops/tree-builder.js +246 -0
- package/dist/ops/tree-builder.js.map +1 -0
- package/dist/ops/tree-diff.d.ts +243 -0
- package/dist/ops/tree-diff.d.ts.map +1 -0
- package/dist/ops/tree-diff.js +657 -0
- package/dist/ops/tree-diff.js.map +1 -0
- package/dist/pack/delta.d.ts +68 -0
- package/dist/pack/delta.d.ts.map +1 -0
- package/dist/pack/delta.js +343 -0
- package/dist/pack/delta.js.map +1 -0
- package/dist/pack/format.d.ts +84 -0
- package/dist/pack/format.d.ts.map +1 -0
- package/dist/pack/format.js +261 -0
- package/dist/pack/format.js.map +1 -0
- package/dist/pack/full-generation.d.ts +327 -0
- package/dist/pack/full-generation.d.ts.map +1 -0
- package/dist/pack/full-generation.js +1159 -0
- package/dist/pack/full-generation.js.map +1 -0
- package/dist/pack/generation.d.ts +118 -0
- package/dist/pack/generation.d.ts.map +1 -0
- package/dist/pack/generation.js +459 -0
- package/dist/pack/generation.js.map +1 -0
- package/dist/pack/index.d.ts +181 -0
- package/dist/pack/index.d.ts.map +1 -0
- package/dist/pack/index.js +552 -0
- package/dist/pack/index.js.map +1 -0
- package/dist/refs/branch.d.ts +224 -0
- package/dist/refs/branch.d.ts.map +1 -0
- package/dist/refs/branch.js +170 -0
- package/dist/refs/branch.js.map +1 -0
- package/dist/refs/storage.d.ts +208 -0
- package/dist/refs/storage.d.ts.map +1 -0
- package/dist/refs/storage.js +421 -0
- package/dist/refs/storage.js.map +1 -0
- package/dist/refs/tag.d.ts +230 -0
- package/dist/refs/tag.d.ts.map +1 -0
- package/dist/refs/tag.js +188 -0
- package/dist/refs/tag.js.map +1 -0
- package/dist/storage/lru-cache.d.ts +188 -0
- package/dist/storage/lru-cache.d.ts.map +1 -0
- package/dist/storage/lru-cache.js +410 -0
- package/dist/storage/lru-cache.js.map +1 -0
- package/dist/storage/object-index.d.ts +140 -0
- package/dist/storage/object-index.d.ts.map +1 -0
- package/dist/storage/object-index.js +166 -0
- package/dist/storage/object-index.js.map +1 -0
- package/dist/storage/r2-pack.d.ts +394 -0
- package/dist/storage/r2-pack.d.ts.map +1 -0
- package/dist/storage/r2-pack.js +1062 -0
- package/dist/storage/r2-pack.js.map +1 -0
- package/dist/tiered/cdc-pipeline.d.ts +316 -0
- package/dist/tiered/cdc-pipeline.d.ts.map +1 -0
- package/dist/tiered/cdc-pipeline.js +771 -0
- package/dist/tiered/cdc-pipeline.js.map +1 -0
- package/dist/tiered/migration.d.ts +242 -0
- package/dist/tiered/migration.d.ts.map +1 -0
- package/dist/tiered/migration.js +592 -0
- package/dist/tiered/migration.js.map +1 -0
- package/dist/tiered/parquet-writer.d.ts +248 -0
- package/dist/tiered/parquet-writer.d.ts.map +1 -0
- package/dist/tiered/parquet-writer.js +555 -0
- package/dist/tiered/parquet-writer.js.map +1 -0
- package/dist/tiered/read-path.d.ts +141 -0
- package/dist/tiered/read-path.d.ts.map +1 -0
- package/dist/tiered/read-path.js +204 -0
- package/dist/tiered/read-path.js.map +1 -0
- package/dist/types/objects.d.ts +53 -0
- package/dist/types/objects.d.ts.map +1 -0
- package/dist/types/objects.js +291 -0
- package/dist/types/objects.js.map +1 -0
- package/dist/types/storage.d.ts +117 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/storage.js +8 -0
- package/dist/types/storage.js.map +1 -0
- package/dist/utils/hash.d.ts +31 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +60 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/sha1.d.ts +26 -0
- package/dist/utils/sha1.d.ts.map +1 -0
- package/dist/utils/sha1.js +127 -0
- package/dist/utils/sha1.js.map +1 -0
- package/dist/wire/capabilities.d.ts +236 -0
- package/dist/wire/capabilities.d.ts.map +1 -0
- package/dist/wire/capabilities.js +437 -0
- package/dist/wire/capabilities.js.map +1 -0
- package/dist/wire/pkt-line.d.ts +67 -0
- package/dist/wire/pkt-line.d.ts.map +1 -0
- package/dist/wire/pkt-line.js +145 -0
- package/dist/wire/pkt-line.js.map +1 -0
- package/dist/wire/receive-pack.d.ts +302 -0
- package/dist/wire/receive-pack.d.ts.map +1 -0
- package/dist/wire/receive-pack.js +885 -0
- package/dist/wire/receive-pack.js.map +1 -0
- package/dist/wire/smart-http.d.ts +321 -0
- package/dist/wire/smart-http.d.ts.map +1 -0
- package/dist/wire/smart-http.js +654 -0
- package/dist/wire/smart-http.js.map +1 -0
- package/dist/wire/upload-pack.d.ts +333 -0
- package/dist/wire/upload-pack.d.ts.map +1 -0
- package/dist/wire/upload-pack.js +850 -0
- package/dist/wire/upload-pack.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LRU Cache implementation for hot objects in gitdo
|
|
3
|
+
* gitdo-165: LRU cache for hot objects
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* LRU Cache class for storing hot objects with size and count limits
|
|
7
|
+
*/
|
|
8
|
+
export class LRUCache {
|
|
9
|
+
cache = new Map();
|
|
10
|
+
head = null; // Most recently used
|
|
11
|
+
tail = null; // Least recently used
|
|
12
|
+
_bytes = 0;
|
|
13
|
+
_hits = 0;
|
|
14
|
+
_misses = 0;
|
|
15
|
+
_evictions = 0;
|
|
16
|
+
maxCount;
|
|
17
|
+
maxBytes;
|
|
18
|
+
defaultTTL;
|
|
19
|
+
sizeCalculator;
|
|
20
|
+
onEvict;
|
|
21
|
+
/**
|
|
22
|
+
* Create a new LRU cache
|
|
23
|
+
* @param options Configuration options
|
|
24
|
+
*/
|
|
25
|
+
constructor(options) {
|
|
26
|
+
this.maxCount = options?.maxCount ?? Infinity;
|
|
27
|
+
this.maxBytes = options?.maxBytes ?? Infinity;
|
|
28
|
+
this.defaultTTL = options?.defaultTTL;
|
|
29
|
+
this.sizeCalculator = options?.sizeCalculator ?? defaultSizeCalculator;
|
|
30
|
+
this.onEvict = options?.onEvict;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if an entry is expired
|
|
34
|
+
*/
|
|
35
|
+
isExpired(entry) {
|
|
36
|
+
if (entry.expiresAt === null)
|
|
37
|
+
return false;
|
|
38
|
+
return Date.now() > entry.expiresAt;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Move a node to the head (most recently used)
|
|
42
|
+
*/
|
|
43
|
+
moveToHead(node) {
|
|
44
|
+
if (node === this.head)
|
|
45
|
+
return;
|
|
46
|
+
// Remove from current position
|
|
47
|
+
this.removeNode(node);
|
|
48
|
+
// Add to head
|
|
49
|
+
node.prev = null;
|
|
50
|
+
node.next = this.head;
|
|
51
|
+
if (this.head) {
|
|
52
|
+
this.head.prev = node;
|
|
53
|
+
}
|
|
54
|
+
this.head = node;
|
|
55
|
+
if (!this.tail) {
|
|
56
|
+
this.tail = node;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Remove a node from the linked list
|
|
61
|
+
*/
|
|
62
|
+
removeNode(node) {
|
|
63
|
+
if (node.prev) {
|
|
64
|
+
node.prev.next = node.next;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
this.head = node.next;
|
|
68
|
+
}
|
|
69
|
+
if (node.next) {
|
|
70
|
+
node.next.prev = node.prev;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
this.tail = node.prev;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Add a node to the head of the list
|
|
78
|
+
*/
|
|
79
|
+
addToHead(node) {
|
|
80
|
+
node.prev = null;
|
|
81
|
+
node.next = this.head;
|
|
82
|
+
if (this.head) {
|
|
83
|
+
this.head.prev = node;
|
|
84
|
+
}
|
|
85
|
+
this.head = node;
|
|
86
|
+
if (!this.tail) {
|
|
87
|
+
this.tail = node;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Evict items until we're under limits
|
|
92
|
+
*/
|
|
93
|
+
evictToFit(requiredSize) {
|
|
94
|
+
// Evict until we have room for the new item
|
|
95
|
+
while (this.tail && ((this.maxCount !== Infinity && this.cache.size >= this.maxCount) ||
|
|
96
|
+
(this.maxBytes !== Infinity && this._bytes + requiredSize > this.maxBytes))) {
|
|
97
|
+
const lru = this.tail;
|
|
98
|
+
this.removeNode(lru);
|
|
99
|
+
this.cache.delete(lru.key);
|
|
100
|
+
this._bytes -= lru.entry.size;
|
|
101
|
+
this._evictions++;
|
|
102
|
+
if (this.onEvict) {
|
|
103
|
+
this.onEvict(lru.key, lru.entry.value, 'lru');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get a value from the cache
|
|
109
|
+
* @param key The cache key
|
|
110
|
+
* @returns The cached value or undefined if not found/expired
|
|
111
|
+
*/
|
|
112
|
+
get(key) {
|
|
113
|
+
const node = this.cache.get(key);
|
|
114
|
+
if (!node) {
|
|
115
|
+
this._misses++;
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
if (this.isExpired(node.entry)) {
|
|
119
|
+
// Remove expired entry
|
|
120
|
+
this.removeNode(node);
|
|
121
|
+
this.cache.delete(key);
|
|
122
|
+
this._bytes -= node.entry.size;
|
|
123
|
+
this._misses++;
|
|
124
|
+
if (this.onEvict) {
|
|
125
|
+
this.onEvict(key, node.entry.value, 'ttl');
|
|
126
|
+
}
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
// Update access time and move to head
|
|
130
|
+
node.entry.lastAccessed = Date.now();
|
|
131
|
+
this.moveToHead(node);
|
|
132
|
+
this._hits++;
|
|
133
|
+
return node.entry.value;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Set a value in the cache
|
|
137
|
+
* @param key The cache key
|
|
138
|
+
* @param value The value to cache
|
|
139
|
+
* @param options Optional settings for this entry
|
|
140
|
+
* @returns true if successfully set, false otherwise
|
|
141
|
+
*/
|
|
142
|
+
set(key, value, options) {
|
|
143
|
+
const size = options?.size ?? this.sizeCalculator(value);
|
|
144
|
+
// Reject items larger than maxBytes
|
|
145
|
+
if (this.maxBytes !== Infinity && size > this.maxBytes) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
const ttl = options?.ttl ?? this.defaultTTL;
|
|
150
|
+
const expiresAt = ttl !== undefined ? now + ttl : null;
|
|
151
|
+
// Check if key already exists
|
|
152
|
+
const existingNode = this.cache.get(key);
|
|
153
|
+
if (existingNode) {
|
|
154
|
+
// Update existing entry
|
|
155
|
+
this._bytes -= existingNode.entry.size;
|
|
156
|
+
existingNode.entry = {
|
|
157
|
+
value,
|
|
158
|
+
size,
|
|
159
|
+
createdAt: now,
|
|
160
|
+
expiresAt,
|
|
161
|
+
lastAccessed: now
|
|
162
|
+
};
|
|
163
|
+
this._bytes += size;
|
|
164
|
+
this.moveToHead(existingNode);
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
// Evict items to make room
|
|
168
|
+
this.evictToFit(size);
|
|
169
|
+
// Create new entry
|
|
170
|
+
const entry = {
|
|
171
|
+
value,
|
|
172
|
+
size,
|
|
173
|
+
createdAt: now,
|
|
174
|
+
expiresAt,
|
|
175
|
+
lastAccessed: now
|
|
176
|
+
};
|
|
177
|
+
const node = {
|
|
178
|
+
key,
|
|
179
|
+
entry,
|
|
180
|
+
prev: null,
|
|
181
|
+
next: null
|
|
182
|
+
};
|
|
183
|
+
this.cache.set(key, node);
|
|
184
|
+
this.addToHead(node);
|
|
185
|
+
this._bytes += size;
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check if a key exists in the cache (without updating LRU order)
|
|
190
|
+
* @param key The cache key
|
|
191
|
+
* @returns true if the key exists and is not expired
|
|
192
|
+
*/
|
|
193
|
+
has(key) {
|
|
194
|
+
const node = this.cache.get(key);
|
|
195
|
+
if (!node)
|
|
196
|
+
return false;
|
|
197
|
+
if (this.isExpired(node.entry))
|
|
198
|
+
return false;
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Delete a key from the cache
|
|
203
|
+
* @param key The cache key
|
|
204
|
+
* @returns true if the key was deleted, false if it didn't exist
|
|
205
|
+
*/
|
|
206
|
+
delete(key) {
|
|
207
|
+
const node = this.cache.get(key);
|
|
208
|
+
if (!node)
|
|
209
|
+
return false;
|
|
210
|
+
this.removeNode(node);
|
|
211
|
+
this.cache.delete(key);
|
|
212
|
+
this._bytes -= node.entry.size;
|
|
213
|
+
if (this.onEvict) {
|
|
214
|
+
this.onEvict(key, node.entry.value, 'manual');
|
|
215
|
+
}
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Clear all entries from the cache
|
|
220
|
+
*/
|
|
221
|
+
clear() {
|
|
222
|
+
if (this.onEvict) {
|
|
223
|
+
// Call onEvict for each entry
|
|
224
|
+
for (const [key, node] of this.cache) {
|
|
225
|
+
this.onEvict(key, node.entry.value, 'clear');
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
this.cache.clear();
|
|
229
|
+
this.head = null;
|
|
230
|
+
this.tail = null;
|
|
231
|
+
this._bytes = 0;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Get cache statistics
|
|
235
|
+
* @returns Current cache statistics
|
|
236
|
+
*/
|
|
237
|
+
getStats() {
|
|
238
|
+
const total = this._hits + this._misses;
|
|
239
|
+
const hitRate = total === 0 ? 0 : Math.round((this._hits / total) * 100);
|
|
240
|
+
return {
|
|
241
|
+
hits: this._hits,
|
|
242
|
+
misses: this._misses,
|
|
243
|
+
count: this.cache.size,
|
|
244
|
+
bytes: this._bytes,
|
|
245
|
+
evictions: this._evictions,
|
|
246
|
+
hitRate
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Reset cache statistics (keeps cached data)
|
|
251
|
+
*/
|
|
252
|
+
resetStats() {
|
|
253
|
+
this._hits = 0;
|
|
254
|
+
this._misses = 0;
|
|
255
|
+
this._evictions = 0;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get the number of items currently in the cache
|
|
259
|
+
*/
|
|
260
|
+
get size() {
|
|
261
|
+
return this.cache.size;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get the current byte size of the cache
|
|
265
|
+
*/
|
|
266
|
+
get bytes() {
|
|
267
|
+
return this._bytes;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Get all keys in the cache (in LRU order, most recent first)
|
|
271
|
+
*/
|
|
272
|
+
keys() {
|
|
273
|
+
const keys = [];
|
|
274
|
+
let node = this.head;
|
|
275
|
+
while (node) {
|
|
276
|
+
keys.push(node.key);
|
|
277
|
+
node = node.next;
|
|
278
|
+
}
|
|
279
|
+
return keys;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get all values in the cache (in LRU order, most recent first)
|
|
283
|
+
*/
|
|
284
|
+
values() {
|
|
285
|
+
const values = [];
|
|
286
|
+
let node = this.head;
|
|
287
|
+
while (node) {
|
|
288
|
+
values.push(node.entry.value);
|
|
289
|
+
node = node.next;
|
|
290
|
+
}
|
|
291
|
+
return values;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Get all entries in the cache (in LRU order, most recent first)
|
|
295
|
+
*/
|
|
296
|
+
entries() {
|
|
297
|
+
const entries = [];
|
|
298
|
+
let node = this.head;
|
|
299
|
+
while (node) {
|
|
300
|
+
entries.push([node.key, node.entry.value]);
|
|
301
|
+
node = node.next;
|
|
302
|
+
}
|
|
303
|
+
return entries;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Peek at a value without updating LRU order
|
|
307
|
+
* @param key The cache key
|
|
308
|
+
* @returns The cached value or undefined if not found/expired
|
|
309
|
+
*/
|
|
310
|
+
peek(key) {
|
|
311
|
+
const node = this.cache.get(key);
|
|
312
|
+
if (!node)
|
|
313
|
+
return undefined;
|
|
314
|
+
if (this.isExpired(node.entry))
|
|
315
|
+
return undefined;
|
|
316
|
+
return node.entry.value;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Evict expired entries from the cache
|
|
320
|
+
* @returns Number of entries evicted
|
|
321
|
+
*/
|
|
322
|
+
prune() {
|
|
323
|
+
let pruned = 0;
|
|
324
|
+
const now = Date.now();
|
|
325
|
+
for (const [key, node] of this.cache) {
|
|
326
|
+
if (node.entry.expiresAt !== null && now > node.entry.expiresAt) {
|
|
327
|
+
this.removeNode(node);
|
|
328
|
+
this.cache.delete(key);
|
|
329
|
+
this._bytes -= node.entry.size;
|
|
330
|
+
pruned++;
|
|
331
|
+
if (this.onEvict) {
|
|
332
|
+
this.onEvict(key, node.entry.value, 'ttl');
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return pruned;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Resize the cache to new limits
|
|
340
|
+
* @param options New size limits
|
|
341
|
+
*/
|
|
342
|
+
resize(options) {
|
|
343
|
+
if (options.maxCount !== undefined) {
|
|
344
|
+
this.maxCount = options.maxCount;
|
|
345
|
+
}
|
|
346
|
+
if (options.maxBytes !== undefined) {
|
|
347
|
+
this.maxBytes = options.maxBytes;
|
|
348
|
+
}
|
|
349
|
+
// Evict items until we're under the new limits
|
|
350
|
+
while (this.tail && ((this.maxCount !== Infinity && this.cache.size > this.maxCount) ||
|
|
351
|
+
(this.maxBytes !== Infinity && this._bytes > this.maxBytes))) {
|
|
352
|
+
const lru = this.tail;
|
|
353
|
+
this.removeNode(lru);
|
|
354
|
+
this.cache.delete(lru.key);
|
|
355
|
+
this._bytes -= lru.entry.size;
|
|
356
|
+
this._evictions++;
|
|
357
|
+
if (this.onEvict) {
|
|
358
|
+
this.onEvict(lru.key, lru.entry.value, 'lru');
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Create a key serializer for complex key types
|
|
365
|
+
*/
|
|
366
|
+
export function createKeySerializer(serialize, deserialize) {
|
|
367
|
+
return { serialize, deserialize };
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Default size calculator for common value types
|
|
371
|
+
*/
|
|
372
|
+
export function defaultSizeCalculator(value) {
|
|
373
|
+
if (value === null || value === undefined) {
|
|
374
|
+
return 0;
|
|
375
|
+
}
|
|
376
|
+
if (typeof value === 'string') {
|
|
377
|
+
// Approximate size: 2 bytes per character (UTF-16)
|
|
378
|
+
return value.length * 2;
|
|
379
|
+
}
|
|
380
|
+
if (typeof value === 'number') {
|
|
381
|
+
// Numbers are 8 bytes in JavaScript
|
|
382
|
+
return 8;
|
|
383
|
+
}
|
|
384
|
+
if (typeof value === 'boolean') {
|
|
385
|
+
return 4;
|
|
386
|
+
}
|
|
387
|
+
if (value instanceof Uint8Array) {
|
|
388
|
+
return value.byteLength;
|
|
389
|
+
}
|
|
390
|
+
if (value instanceof ArrayBuffer) {
|
|
391
|
+
return value.byteLength;
|
|
392
|
+
}
|
|
393
|
+
if (ArrayBuffer.isView(value)) {
|
|
394
|
+
return value.byteLength;
|
|
395
|
+
}
|
|
396
|
+
if (typeof value === 'object') {
|
|
397
|
+
// For objects, serialize to JSON and count characters
|
|
398
|
+
try {
|
|
399
|
+
const json = JSON.stringify(value);
|
|
400
|
+
return json.length * 2;
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
// If serialization fails, return a default size
|
|
404
|
+
return 64;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
// Default size for unknown types
|
|
408
|
+
return 8;
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=lru-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru-cache.js","sourceRoot":"","sources":["../../src/storage/lru-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Object Location Index
|
|
3
|
+
*
|
|
4
|
+
* Tracks the storage location of Git objects across multiple tiers:
|
|
5
|
+
* - Hot: SQLite (local Durable Object storage for frequently accessed objects)
|
|
6
|
+
* - R2: Packed in R2 object storage (for larger objects or archives)
|
|
7
|
+
* - Parquet: Columnar format for cold storage analytics
|
|
8
|
+
*
|
|
9
|
+
* The index enables efficient object lookup regardless of which tier
|
|
10
|
+
* contains the actual data.
|
|
11
|
+
*/
|
|
12
|
+
import { DurableObjectStorage } from '../durable-object/schema';
|
|
13
|
+
/**
|
|
14
|
+
* Storage tiers for object location
|
|
15
|
+
*/
|
|
16
|
+
export type StorageTier = 'hot' | 'r2' | 'parquet';
|
|
17
|
+
/**
|
|
18
|
+
* Represents the location of a git object in the tiered storage system
|
|
19
|
+
*/
|
|
20
|
+
export interface ObjectLocation {
|
|
21
|
+
/** The storage tier where the object is located */
|
|
22
|
+
tier: StorageTier;
|
|
23
|
+
/** Pack file ID (for R2 or Parquet tiers, null for hot tier) */
|
|
24
|
+
packId: string | null;
|
|
25
|
+
/** Byte offset within the pack file (for R2 or Parquet tiers) */
|
|
26
|
+
offset: number | null;
|
|
27
|
+
/** Size of the object in bytes */
|
|
28
|
+
size: number;
|
|
29
|
+
/** The object's SHA-1 hash */
|
|
30
|
+
sha: string;
|
|
31
|
+
/** Object type (blob, tree, commit, tag) */
|
|
32
|
+
type?: string;
|
|
33
|
+
/** Timestamp when location was last updated */
|
|
34
|
+
updatedAt?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Statistics about objects in each storage tier
|
|
38
|
+
*/
|
|
39
|
+
export interface ObjectIndexStats {
|
|
40
|
+
/** Total number of indexed objects */
|
|
41
|
+
totalObjects: number;
|
|
42
|
+
/** Number of objects in hot tier */
|
|
43
|
+
hotCount: number;
|
|
44
|
+
/** Number of objects in R2 tier */
|
|
45
|
+
r2Count: number;
|
|
46
|
+
/** Number of objects in Parquet tier */
|
|
47
|
+
parquetCount: number;
|
|
48
|
+
/** Total size of objects in hot tier (bytes) */
|
|
49
|
+
hotSize: number;
|
|
50
|
+
/** Total size of objects in R2 tier (bytes) */
|
|
51
|
+
r2Size: number;
|
|
52
|
+
/** Total size of objects in Parquet tier (bytes) */
|
|
53
|
+
parquetSize: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Result of a batch lookup operation
|
|
57
|
+
*/
|
|
58
|
+
export interface BatchLookupResult {
|
|
59
|
+
/** Map of SHA to location for found objects */
|
|
60
|
+
found: Map<string, ObjectLocation>;
|
|
61
|
+
/** Array of SHAs that were not found */
|
|
62
|
+
missing: string[];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Options for recording an object location
|
|
66
|
+
*/
|
|
67
|
+
export interface RecordLocationOptions {
|
|
68
|
+
/** The object's SHA-1 hash */
|
|
69
|
+
sha: string;
|
|
70
|
+
/** Storage tier */
|
|
71
|
+
tier: StorageTier;
|
|
72
|
+
/** Pack ID (required for r2/parquet tiers) */
|
|
73
|
+
packId?: string;
|
|
74
|
+
/** Offset in pack file */
|
|
75
|
+
offset?: number;
|
|
76
|
+
/** Size in bytes */
|
|
77
|
+
size: number;
|
|
78
|
+
/** Object type */
|
|
79
|
+
type?: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Object Index class for managing object locations across storage tiers
|
|
83
|
+
*/
|
|
84
|
+
export declare class ObjectIndex {
|
|
85
|
+
private _storage;
|
|
86
|
+
constructor(storage: DurableObjectStorage);
|
|
87
|
+
/**
|
|
88
|
+
* Record the location of an object
|
|
89
|
+
*/
|
|
90
|
+
recordLocation(options: RecordLocationOptions): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Look up the location of an object by SHA
|
|
93
|
+
*/
|
|
94
|
+
lookupLocation(sha: string): Promise<ObjectLocation | null>;
|
|
95
|
+
/**
|
|
96
|
+
* Perform batch lookup of multiple objects
|
|
97
|
+
*/
|
|
98
|
+
batchLookup(shas: string[]): Promise<BatchLookupResult>;
|
|
99
|
+
/**
|
|
100
|
+
* Update the location of an object (e.g., when moving between tiers)
|
|
101
|
+
*/
|
|
102
|
+
updateLocation(sha: string, newTier: StorageTier, packId?: string, offset?: number): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Get statistics about object distribution across tiers
|
|
105
|
+
*/
|
|
106
|
+
getStats(): Promise<ObjectIndexStats>;
|
|
107
|
+
/**
|
|
108
|
+
* Check if an object exists in the index
|
|
109
|
+
*/
|
|
110
|
+
exists(sha: string): Promise<boolean>;
|
|
111
|
+
/**
|
|
112
|
+
* Delete an object from the index
|
|
113
|
+
*/
|
|
114
|
+
deleteLocation(sha: string): Promise<boolean>;
|
|
115
|
+
/**
|
|
116
|
+
* Get all objects in a specific tier
|
|
117
|
+
*/
|
|
118
|
+
getObjectsByTier(tier: StorageTier): Promise<ObjectLocation[]>;
|
|
119
|
+
/**
|
|
120
|
+
* Get all objects in a specific pack
|
|
121
|
+
*/
|
|
122
|
+
getObjectsByPack(packId: string): Promise<ObjectLocation[]>;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Record the location of an object (standalone function)
|
|
126
|
+
*/
|
|
127
|
+
export declare function recordLocation(storage: DurableObjectStorage, options: RecordLocationOptions): Promise<void>;
|
|
128
|
+
/**
|
|
129
|
+
* Look up the location of an object by SHA (standalone function)
|
|
130
|
+
*/
|
|
131
|
+
export declare function lookupLocation(storage: DurableObjectStorage, sha: string): Promise<ObjectLocation | null>;
|
|
132
|
+
/**
|
|
133
|
+
* Perform batch lookup of multiple objects (standalone function)
|
|
134
|
+
*/
|
|
135
|
+
export declare function batchLookup(storage: DurableObjectStorage, shas: string[]): Promise<BatchLookupResult>;
|
|
136
|
+
/**
|
|
137
|
+
* Get statistics about object distribution (standalone function)
|
|
138
|
+
*/
|
|
139
|
+
export declare function getStats(storage: DurableObjectStorage): Promise<ObjectIndexStats>;
|
|
140
|
+
//# sourceMappingURL=object-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-index.d.ts","sourceRoot":"","sources":["../../src/storage/object-index.ts"],"names":[],"mappings":"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"}
|