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,166 @@
|
|
|
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
|
+
/**
|
|
13
|
+
* Validate SHA format (40 alphanumeric characters, allows hyphens)
|
|
14
|
+
*/
|
|
15
|
+
function validateSha(sha) {
|
|
16
|
+
if (!sha || sha.length !== 40) {
|
|
17
|
+
throw new Error(`Invalid SHA format: ${sha}`);
|
|
18
|
+
}
|
|
19
|
+
if (!/^[0-9a-z-]{40}$/.test(sha)) {
|
|
20
|
+
throw new Error(`Invalid SHA format: ${sha}`);
|
|
21
|
+
}
|
|
22
|
+
// Reject strings that are just one character repeated
|
|
23
|
+
if (/^(.)\1{39}$/.test(sha)) {
|
|
24
|
+
throw new Error(`Invalid SHA format: ${sha}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Object Index class for managing object locations across storage tiers
|
|
29
|
+
*/
|
|
30
|
+
export class ObjectIndex {
|
|
31
|
+
_storage;
|
|
32
|
+
constructor(storage) {
|
|
33
|
+
this._storage = storage;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Record the location of an object
|
|
37
|
+
*/
|
|
38
|
+
async recordLocation(options) {
|
|
39
|
+
validateSha(options.sha);
|
|
40
|
+
const updatedAt = Date.now();
|
|
41
|
+
const packId = options.packId ?? null;
|
|
42
|
+
const offset = options.offset ?? null;
|
|
43
|
+
this._storage.sql.exec('INSERT OR REPLACE INTO object_index (sha, tier, pack_id, offset, size, type, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?)', options.sha, options.tier, packId, offset, options.size, options.type ?? null, updatedAt);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Look up the location of an object by SHA
|
|
47
|
+
*/
|
|
48
|
+
async lookupLocation(sha) {
|
|
49
|
+
const result = this._storage.sql.exec('SELECT sha, tier, pack_id, offset, size, type, updated_at FROM object_index WHERE sha = ?', sha);
|
|
50
|
+
const rows = result.toArray();
|
|
51
|
+
if (rows.length === 0) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return rows[0];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Perform batch lookup of multiple objects
|
|
58
|
+
*/
|
|
59
|
+
async batchLookup(shas) {
|
|
60
|
+
if (shas.length === 0) {
|
|
61
|
+
return { found: new Map(), missing: [] };
|
|
62
|
+
}
|
|
63
|
+
// Build query with placeholders
|
|
64
|
+
const placeholders = shas.map(() => '?').join(', ');
|
|
65
|
+
const result = this._storage.sql.exec(`SELECT sha, tier, pack_id, offset, size, type, updated_at FROM object_index WHERE sha IN (${placeholders})`, ...shas);
|
|
66
|
+
const rows = result.toArray();
|
|
67
|
+
const found = new Map();
|
|
68
|
+
for (const row of rows) {
|
|
69
|
+
found.set(row.sha, row);
|
|
70
|
+
}
|
|
71
|
+
const missing = shas.filter(sha => !found.has(sha));
|
|
72
|
+
return { found, missing };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Update the location of an object (e.g., when moving between tiers)
|
|
76
|
+
*/
|
|
77
|
+
async updateLocation(sha, newTier, packId, offset) {
|
|
78
|
+
this._storage.sql.exec('UPDATE object_index SET tier = ?, pack_id = ?, offset = ? WHERE sha = ?', newTier, packId ?? null, offset ?? null, sha);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get statistics about object distribution across tiers
|
|
82
|
+
*/
|
|
83
|
+
async getStats() {
|
|
84
|
+
// Get objects by tier and compute stats in code
|
|
85
|
+
// This approach works better with the mock storage implementation
|
|
86
|
+
const hotObjects = await this.getObjectsByTier('hot');
|
|
87
|
+
const r2Objects = await this.getObjectsByTier('r2');
|
|
88
|
+
const parquetObjects = await this.getObjectsByTier('parquet');
|
|
89
|
+
const hotCount = hotObjects.length;
|
|
90
|
+
const r2Count = r2Objects.length;
|
|
91
|
+
const parquetCount = parquetObjects.length;
|
|
92
|
+
const totalObjects = hotCount + r2Count + parquetCount;
|
|
93
|
+
const hotSize = hotObjects.reduce((sum, o) => sum + o.size, 0);
|
|
94
|
+
const r2Size = r2Objects.reduce((sum, o) => sum + o.size, 0);
|
|
95
|
+
const parquetSize = parquetObjects.reduce((sum, o) => sum + o.size, 0);
|
|
96
|
+
return {
|
|
97
|
+
totalObjects,
|
|
98
|
+
hotCount,
|
|
99
|
+
r2Count,
|
|
100
|
+
parquetCount,
|
|
101
|
+
hotSize,
|
|
102
|
+
r2Size,
|
|
103
|
+
parquetSize
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if an object exists in the index
|
|
108
|
+
*/
|
|
109
|
+
async exists(sha) {
|
|
110
|
+
const location = await this.lookupLocation(sha);
|
|
111
|
+
return location !== null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Delete an object from the index
|
|
115
|
+
*/
|
|
116
|
+
async deleteLocation(sha) {
|
|
117
|
+
const result = this._storage.sql.exec('DELETE FROM object_index WHERE sha = ?', sha);
|
|
118
|
+
const rows = result.toArray();
|
|
119
|
+
return rows.length > 0 && rows[0].changes > 0;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get all objects in a specific tier
|
|
123
|
+
*/
|
|
124
|
+
async getObjectsByTier(tier) {
|
|
125
|
+
const result = this._storage.sql.exec('SELECT sha, tier, pack_id, offset, size, type, updated_at FROM object_index WHERE tier = ?', tier);
|
|
126
|
+
return result.toArray();
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get all objects in a specific pack
|
|
130
|
+
*/
|
|
131
|
+
async getObjectsByPack(packId) {
|
|
132
|
+
const result = this._storage.sql.exec('SELECT sha, tier, pack_id, offset, size, type, updated_at FROM object_index WHERE pack_id = ?', packId);
|
|
133
|
+
const locations = result.toArray();
|
|
134
|
+
// Sort by offset to ensure consistent ordering
|
|
135
|
+
return locations.sort((a, b) => (a.offset ?? 0) - (b.offset ?? 0));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Record the location of an object (standalone function)
|
|
140
|
+
*/
|
|
141
|
+
export async function recordLocation(storage, options) {
|
|
142
|
+
const index = new ObjectIndex(storage);
|
|
143
|
+
return index.recordLocation(options);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Look up the location of an object by SHA (standalone function)
|
|
147
|
+
*/
|
|
148
|
+
export async function lookupLocation(storage, sha) {
|
|
149
|
+
const index = new ObjectIndex(storage);
|
|
150
|
+
return index.lookupLocation(sha);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Perform batch lookup of multiple objects (standalone function)
|
|
154
|
+
*/
|
|
155
|
+
export async function batchLookup(storage, shas) {
|
|
156
|
+
const index = new ObjectIndex(storage);
|
|
157
|
+
return index.batchLookup(shas);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get statistics about object distribution (standalone function)
|
|
161
|
+
*/
|
|
162
|
+
export async function getStats(storage) {
|
|
163
|
+
const index = new ObjectIndex(storage);
|
|
164
|
+
return index.getStats();
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=object-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-index.js","sourceRoot":"","sources":["../../src/storage/object-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* R2 Packfile Storage
|
|
3
|
+
*
|
|
4
|
+
* Manages Git packfiles stored in Cloudflare R2 object storage.
|
|
5
|
+
* Provides functionality for:
|
|
6
|
+
* - Uploading and downloading packfiles with their indices
|
|
7
|
+
* - Multi-pack index (MIDX) for efficient object lookup across packs
|
|
8
|
+
* - Concurrent access control with locking
|
|
9
|
+
* - Pack verification and integrity checks
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Configuration options for R2PackStorage
|
|
13
|
+
*/
|
|
14
|
+
export interface R2PackStorageOptions {
|
|
15
|
+
/** R2 bucket instance */
|
|
16
|
+
bucket: R2Bucket;
|
|
17
|
+
/** Optional prefix for all keys (e.g., 'repos/my-repo/') */
|
|
18
|
+
prefix?: string;
|
|
19
|
+
/** Maximum number of items to cache (default: 100) */
|
|
20
|
+
cacheSize?: number;
|
|
21
|
+
/** Cache TTL in seconds (default: 3600) */
|
|
22
|
+
cacheTTL?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Result of uploading a packfile
|
|
26
|
+
*/
|
|
27
|
+
export interface PackfileUploadResult {
|
|
28
|
+
/** Unique identifier for the packfile */
|
|
29
|
+
packId: string;
|
|
30
|
+
/** Size of the pack file in bytes */
|
|
31
|
+
packSize: number;
|
|
32
|
+
/** Size of the index file in bytes */
|
|
33
|
+
indexSize: number;
|
|
34
|
+
/** SHA-1 checksum of the packfile */
|
|
35
|
+
checksum: string;
|
|
36
|
+
/** Number of objects in the packfile */
|
|
37
|
+
objectCount: number;
|
|
38
|
+
/** Timestamp when the packfile was uploaded */
|
|
39
|
+
uploadedAt: Date;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Metadata about a stored packfile
|
|
43
|
+
*/
|
|
44
|
+
export interface PackfileMetadata {
|
|
45
|
+
/** Unique identifier for the packfile */
|
|
46
|
+
packId: string;
|
|
47
|
+
/** Size of the pack file in bytes */
|
|
48
|
+
packSize: number;
|
|
49
|
+
/** Size of the index file in bytes */
|
|
50
|
+
indexSize: number;
|
|
51
|
+
/** Number of objects in the packfile */
|
|
52
|
+
objectCount: number;
|
|
53
|
+
/** Timestamp when the packfile was created */
|
|
54
|
+
createdAt: Date;
|
|
55
|
+
/** SHA-1 checksum of the packfile */
|
|
56
|
+
checksum: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Options for downloading a packfile
|
|
60
|
+
*/
|
|
61
|
+
export interface DownloadPackfileOptions {
|
|
62
|
+
/** Include the index file in the download */
|
|
63
|
+
includeIndex?: boolean;
|
|
64
|
+
/** Byte range to download (for partial reads) */
|
|
65
|
+
byteRange?: {
|
|
66
|
+
start: number;
|
|
67
|
+
end: number;
|
|
68
|
+
};
|
|
69
|
+
/** Verify checksum on download */
|
|
70
|
+
verify?: boolean;
|
|
71
|
+
/** Throw if packfile not found (default: false, returns null) */
|
|
72
|
+
required?: boolean;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Result of downloading a packfile
|
|
76
|
+
*/
|
|
77
|
+
export interface DownloadPackfileResult {
|
|
78
|
+
/** The packfile data */
|
|
79
|
+
packData: Uint8Array;
|
|
80
|
+
/** The index file data (if includeIndex was true) */
|
|
81
|
+
indexData?: Uint8Array;
|
|
82
|
+
/** Whether the checksum was verified */
|
|
83
|
+
verified?: boolean;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Options for uploading a packfile
|
|
87
|
+
*/
|
|
88
|
+
export interface UploadPackfileOptions {
|
|
89
|
+
/** Number of retries on failure */
|
|
90
|
+
retries?: number;
|
|
91
|
+
/** Skip atomic upload (for testing/migration) */
|
|
92
|
+
skipAtomic?: boolean;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Pack manifest for atomic uploads
|
|
96
|
+
* A manifest marks a pack as "complete" only after both pack and index are uploaded
|
|
97
|
+
*/
|
|
98
|
+
export interface PackManifest {
|
|
99
|
+
/** Version of the manifest format */
|
|
100
|
+
version: number;
|
|
101
|
+
/** Pack ID this manifest belongs to */
|
|
102
|
+
packId: string;
|
|
103
|
+
/** SHA-1 checksum of the pack file */
|
|
104
|
+
packChecksum: string;
|
|
105
|
+
/** SHA-1 checksum of the index file */
|
|
106
|
+
indexChecksum: string;
|
|
107
|
+
/** Size of the pack file in bytes */
|
|
108
|
+
packSize: number;
|
|
109
|
+
/** Size of the index file in bytes */
|
|
110
|
+
indexSize: number;
|
|
111
|
+
/** Number of objects in the packfile */
|
|
112
|
+
objectCount: number;
|
|
113
|
+
/** Timestamp when the pack was completed */
|
|
114
|
+
completedAt: string;
|
|
115
|
+
/** Status: 'staging' during upload, 'complete' when done */
|
|
116
|
+
status: 'staging' | 'complete';
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Entry in the multi-pack index
|
|
120
|
+
*/
|
|
121
|
+
export interface MultiPackIndexEntry {
|
|
122
|
+
/** 40-character hex SHA-1 object ID */
|
|
123
|
+
objectId: string;
|
|
124
|
+
/** Index of the pack in the packIds array */
|
|
125
|
+
packIndex: number;
|
|
126
|
+
/** Offset within the pack file */
|
|
127
|
+
offset: number;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Multi-pack index structure
|
|
131
|
+
*/
|
|
132
|
+
export interface MultiPackIndex {
|
|
133
|
+
/** Version of the multi-pack index format */
|
|
134
|
+
version: number;
|
|
135
|
+
/** Array of pack IDs in this index */
|
|
136
|
+
packIds: string[];
|
|
137
|
+
/** Sorted entries for all objects across all packs */
|
|
138
|
+
entries: MultiPackIndexEntry[];
|
|
139
|
+
/** SHA-1 checksum of the index */
|
|
140
|
+
checksum: Uint8Array;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Handle for a distributed lock
|
|
144
|
+
* Contains all information needed to release or refresh a lock
|
|
145
|
+
*/
|
|
146
|
+
export interface LockHandle {
|
|
147
|
+
/** Resource that is locked */
|
|
148
|
+
resource: string;
|
|
149
|
+
/** Unique lock ID for this holder */
|
|
150
|
+
lockId: string;
|
|
151
|
+
/** ETag for conditional operations */
|
|
152
|
+
etag: string;
|
|
153
|
+
/** When the lock expires (ms since epoch) */
|
|
154
|
+
expiresAt: number;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Content stored in a lock file
|
|
158
|
+
*/
|
|
159
|
+
export interface LockFileContent {
|
|
160
|
+
/** Unique lock ID */
|
|
161
|
+
lockId: string;
|
|
162
|
+
/** Resource being locked */
|
|
163
|
+
resource: string;
|
|
164
|
+
/** When the lock expires (ms since epoch) */
|
|
165
|
+
expiresAt: number;
|
|
166
|
+
/** When the lock was acquired (ms since epoch) */
|
|
167
|
+
acquiredAt: number;
|
|
168
|
+
/** Worker/process identifier (for debugging) */
|
|
169
|
+
holder?: string;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Lock on a packfile for write operations
|
|
173
|
+
*/
|
|
174
|
+
export interface PackLock {
|
|
175
|
+
/** Pack ID that is locked */
|
|
176
|
+
packId: string;
|
|
177
|
+
/** Check if lock is still held */
|
|
178
|
+
isHeld(): boolean;
|
|
179
|
+
/** Release the lock */
|
|
180
|
+
release(): Promise<void>;
|
|
181
|
+
/** Refresh the lock TTL (returns true if successful) */
|
|
182
|
+
refresh?(): Promise<boolean>;
|
|
183
|
+
/** Get the underlying distributed lock handle */
|
|
184
|
+
handle?: LockHandle;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Options for acquiring a lock
|
|
188
|
+
*/
|
|
189
|
+
export interface AcquireLockOptions {
|
|
190
|
+
/** Timeout in milliseconds to wait for lock */
|
|
191
|
+
timeout?: number;
|
|
192
|
+
/** TTL in milliseconds after which lock auto-expires */
|
|
193
|
+
ttl?: number;
|
|
194
|
+
/** Worker/process identifier for debugging */
|
|
195
|
+
holder?: string;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Result of listing packfiles
|
|
199
|
+
*/
|
|
200
|
+
export interface ListPackfilesResult {
|
|
201
|
+
/** Array of packfile metadata */
|
|
202
|
+
items: PackfileMetadata[];
|
|
203
|
+
/** Cursor for pagination */
|
|
204
|
+
cursor?: string;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Error thrown by R2 pack operations
|
|
208
|
+
*/
|
|
209
|
+
export declare class R2PackError extends Error {
|
|
210
|
+
readonly code: 'NOT_FOUND' | 'LOCKED' | 'INVALID_DATA' | 'CHECKSUM_MISMATCH' | 'NETWORK_ERROR';
|
|
211
|
+
readonly packId?: string | undefined;
|
|
212
|
+
constructor(message: string, code: 'NOT_FOUND' | 'LOCKED' | 'INVALID_DATA' | 'CHECKSUM_MISMATCH' | 'NETWORK_ERROR', packId?: string | undefined);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* R2 Packfile Storage class
|
|
216
|
+
*/
|
|
217
|
+
export declare class R2PackStorage {
|
|
218
|
+
private _bucket;
|
|
219
|
+
private _prefix;
|
|
220
|
+
private _cacheTTL;
|
|
221
|
+
private _midxCache;
|
|
222
|
+
private _indexChecksums;
|
|
223
|
+
constructor(options: R2PackStorageOptions);
|
|
224
|
+
private _buildKey;
|
|
225
|
+
/**
|
|
226
|
+
* Upload a packfile and its index to R2 atomically
|
|
227
|
+
*
|
|
228
|
+
* Uses a manifest-based pattern to ensure atomic uploads:
|
|
229
|
+
* 1. Upload pack and index to staging paths
|
|
230
|
+
* 2. Create manifest in 'staging' status
|
|
231
|
+
* 3. Copy from staging to final location
|
|
232
|
+
* 4. Update manifest to 'complete' status
|
|
233
|
+
* 5. Clean up staging files
|
|
234
|
+
*
|
|
235
|
+
* If the process fails at any point, the pack is not considered complete
|
|
236
|
+
* until a valid manifest with status 'complete' exists.
|
|
237
|
+
*/
|
|
238
|
+
uploadPackfile(packData: Uint8Array, indexData: Uint8Array, options?: UploadPackfileOptions): Promise<PackfileUploadResult>;
|
|
239
|
+
/**
|
|
240
|
+
* Get the manifest for a packfile
|
|
241
|
+
*/
|
|
242
|
+
getPackManifest(packId: string): Promise<PackManifest | null>;
|
|
243
|
+
/**
|
|
244
|
+
* Check if a packfile upload is complete
|
|
245
|
+
*
|
|
246
|
+
* A pack is considered complete if:
|
|
247
|
+
* 1. It has a manifest with status 'complete', OR
|
|
248
|
+
* 2. It was uploaded before the atomic upload feature (legacy packs without manifest)
|
|
249
|
+
* AND both .pack and .idx files exist
|
|
250
|
+
*/
|
|
251
|
+
isPackComplete(packId: string): Promise<boolean>;
|
|
252
|
+
/**
|
|
253
|
+
* Download a packfile from R2
|
|
254
|
+
*/
|
|
255
|
+
downloadPackfile(packId: string, options?: DownloadPackfileOptions): Promise<DownloadPackfileResult | null>;
|
|
256
|
+
/**
|
|
257
|
+
* Get metadata for a packfile
|
|
258
|
+
*/
|
|
259
|
+
getPackfileMetadata(packId: string): Promise<PackfileMetadata | null>;
|
|
260
|
+
/**
|
|
261
|
+
* List all packfiles
|
|
262
|
+
*/
|
|
263
|
+
listPackfiles(options?: {
|
|
264
|
+
limit?: number;
|
|
265
|
+
cursor?: string;
|
|
266
|
+
}): Promise<ListPackfilesResult & PackfileMetadata[]>;
|
|
267
|
+
/**
|
|
268
|
+
* Delete a packfile, its index, and manifest
|
|
269
|
+
*/
|
|
270
|
+
deletePackfile(packId: string): Promise<boolean>;
|
|
271
|
+
/**
|
|
272
|
+
* Download just the index file for a packfile
|
|
273
|
+
*/
|
|
274
|
+
downloadIndex(packId: string): Promise<Uint8Array | null>;
|
|
275
|
+
/**
|
|
276
|
+
* Upload a new index for an existing packfile
|
|
277
|
+
*/
|
|
278
|
+
uploadIndex(packId: string, indexData: Uint8Array): Promise<void>;
|
|
279
|
+
/**
|
|
280
|
+
* Verify that an index matches its packfile
|
|
281
|
+
*/
|
|
282
|
+
verifyIndex(packId: string): Promise<boolean>;
|
|
283
|
+
/**
|
|
284
|
+
* Clean up orphaned staging files
|
|
285
|
+
*
|
|
286
|
+
* This should be called on startup to clean up any staging files
|
|
287
|
+
* left behind by failed uploads. It will:
|
|
288
|
+
* 1. List all files in the staging directory
|
|
289
|
+
* 2. For each pack ID found, check if it has a complete manifest
|
|
290
|
+
* 3. If not complete, delete the staging files and any partial final files
|
|
291
|
+
*
|
|
292
|
+
* @returns Array of pack IDs that were cleaned up
|
|
293
|
+
*/
|
|
294
|
+
cleanupOrphanedStagingFiles(): Promise<string[]>;
|
|
295
|
+
/**
|
|
296
|
+
* Rebuild the multi-pack index from all packfiles
|
|
297
|
+
*/
|
|
298
|
+
rebuildMultiPackIndex(): Promise<void>;
|
|
299
|
+
/**
|
|
300
|
+
* Get the current multi-pack index
|
|
301
|
+
*/
|
|
302
|
+
getMultiPackIndex(): Promise<MultiPackIndex>;
|
|
303
|
+
/**
|
|
304
|
+
* Acquire a distributed lock on a resource using R2 conditional writes
|
|
305
|
+
* @param resource - Resource identifier to lock
|
|
306
|
+
* @param ttlMs - Time-to-live in milliseconds (default: 30000)
|
|
307
|
+
* @param holder - Optional identifier for the lock holder (for debugging)
|
|
308
|
+
* @returns LockHandle if acquired, null if lock is held by another process
|
|
309
|
+
*/
|
|
310
|
+
acquireDistributedLock(resource: string, ttlMs?: number, holder?: string): Promise<LockHandle | null>;
|
|
311
|
+
/**
|
|
312
|
+
* Release a distributed lock
|
|
313
|
+
* @param handle - Lock handle returned from acquireDistributedLock
|
|
314
|
+
*/
|
|
315
|
+
releaseDistributedLock(handle: LockHandle): Promise<void>;
|
|
316
|
+
/**
|
|
317
|
+
* Refresh a distributed lock to extend its TTL
|
|
318
|
+
* @param handle - Lock handle to refresh
|
|
319
|
+
* @param ttlMs - New TTL in milliseconds (default: 30000)
|
|
320
|
+
* @returns true if refresh succeeded, false if lock was lost
|
|
321
|
+
*/
|
|
322
|
+
refreshDistributedLock(handle: LockHandle, ttlMs?: number): Promise<boolean>;
|
|
323
|
+
/**
|
|
324
|
+
* Clean up expired locks from R2 storage
|
|
325
|
+
* This should be called periodically to remove stale lock files
|
|
326
|
+
* @returns Number of locks cleaned up
|
|
327
|
+
*/
|
|
328
|
+
cleanupExpiredLocks(): Promise<number>;
|
|
329
|
+
/**
|
|
330
|
+
* Acquire a lock on a packfile (backward-compatible wrapper)
|
|
331
|
+
* Uses distributed locking with R2 conditional writes
|
|
332
|
+
*/
|
|
333
|
+
acquireLock(packId: string, options?: AcquireLockOptions): Promise<PackLock>;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Upload a packfile to R2
|
|
337
|
+
*/
|
|
338
|
+
export declare function uploadPackfile(bucket: R2Bucket, packData: Uint8Array, indexData: Uint8Array, options?: {
|
|
339
|
+
prefix?: string;
|
|
340
|
+
}): Promise<PackfileUploadResult>;
|
|
341
|
+
/**
|
|
342
|
+
* Download a packfile from R2
|
|
343
|
+
*/
|
|
344
|
+
export declare function downloadPackfile(bucket: R2Bucket, packId: string, options?: DownloadPackfileOptions & {
|
|
345
|
+
prefix?: string;
|
|
346
|
+
}): Promise<DownloadPackfileResult | null>;
|
|
347
|
+
/**
|
|
348
|
+
* Get packfile metadata
|
|
349
|
+
*/
|
|
350
|
+
export declare function getPackfileMetadata(bucket: R2Bucket, packId: string, options?: {
|
|
351
|
+
prefix?: string;
|
|
352
|
+
}): Promise<PackfileMetadata | null>;
|
|
353
|
+
/**
|
|
354
|
+
* List all packfiles
|
|
355
|
+
*/
|
|
356
|
+
export declare function listPackfiles(bucket: R2Bucket, options?: {
|
|
357
|
+
prefix?: string;
|
|
358
|
+
limit?: number;
|
|
359
|
+
cursor?: string;
|
|
360
|
+
}): Promise<PackfileMetadata[]>;
|
|
361
|
+
/**
|
|
362
|
+
* Delete a packfile
|
|
363
|
+
*/
|
|
364
|
+
export declare function deletePackfile(bucket: R2Bucket, packId: string, options?: {
|
|
365
|
+
prefix?: string;
|
|
366
|
+
}): Promise<boolean>;
|
|
367
|
+
/**
|
|
368
|
+
* Create a multi-pack index from all packfiles in the bucket
|
|
369
|
+
*/
|
|
370
|
+
export declare function createMultiPackIndex(bucket: R2Bucket, options?: {
|
|
371
|
+
prefix?: string;
|
|
372
|
+
}): Promise<MultiPackIndex>;
|
|
373
|
+
/**
|
|
374
|
+
* Parse a multi-pack index from raw bytes
|
|
375
|
+
*/
|
|
376
|
+
export declare function parseMultiPackIndex(data: Uint8Array): MultiPackIndex;
|
|
377
|
+
/**
|
|
378
|
+
* Look up an object in the multi-pack index using binary search
|
|
379
|
+
*/
|
|
380
|
+
export declare function lookupObjectInMultiPack(midx: MultiPackIndex, objectId: string): MultiPackIndexEntry | null;
|
|
381
|
+
/**
|
|
382
|
+
* Acquire a lock on a packfile
|
|
383
|
+
*/
|
|
384
|
+
export declare function acquirePackLock(bucket: R2Bucket, packId: string, options?: AcquireLockOptions & {
|
|
385
|
+
prefix?: string;
|
|
386
|
+
}): Promise<PackLock>;
|
|
387
|
+
/**
|
|
388
|
+
* Release a lock on a packfile
|
|
389
|
+
* Note: This function requires a valid PackLock with a handle to properly release distributed locks
|
|
390
|
+
*/
|
|
391
|
+
export declare function releasePackLock(bucket: R2Bucket, packId: string, options?: {
|
|
392
|
+
prefix?: string;
|
|
393
|
+
}): Promise<void>;
|
|
394
|
+
//# sourceMappingURL=r2-pack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"r2-pack.d.ts","sourceRoot":"","sources":["../../src/storage/r2-pack.ts"],"names":[],"mappings":"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"}
|