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.
Files changed (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +156 -0
  3. package/dist/durable-object/object-store.d.ts +113 -0
  4. package/dist/durable-object/object-store.d.ts.map +1 -0
  5. package/dist/durable-object/object-store.js +387 -0
  6. package/dist/durable-object/object-store.js.map +1 -0
  7. package/dist/durable-object/schema.d.ts +17 -0
  8. package/dist/durable-object/schema.d.ts.map +1 -0
  9. package/dist/durable-object/schema.js +43 -0
  10. package/dist/durable-object/schema.js.map +1 -0
  11. package/dist/durable-object/wal.d.ts +111 -0
  12. package/dist/durable-object/wal.d.ts.map +1 -0
  13. package/dist/durable-object/wal.js +200 -0
  14. package/dist/durable-object/wal.js.map +1 -0
  15. package/dist/index.d.ts +24 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +101 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/mcp/adapter.d.ts +231 -0
  20. package/dist/mcp/adapter.d.ts.map +1 -0
  21. package/dist/mcp/adapter.js +502 -0
  22. package/dist/mcp/adapter.js.map +1 -0
  23. package/dist/mcp/sandbox.d.ts +261 -0
  24. package/dist/mcp/sandbox.d.ts.map +1 -0
  25. package/dist/mcp/sandbox.js +983 -0
  26. package/dist/mcp/sandbox.js.map +1 -0
  27. package/dist/mcp/sdk-adapter.d.ts +413 -0
  28. package/dist/mcp/sdk-adapter.d.ts.map +1 -0
  29. package/dist/mcp/sdk-adapter.js +672 -0
  30. package/dist/mcp/sdk-adapter.js.map +1 -0
  31. package/dist/mcp/tools.d.ts +133 -0
  32. package/dist/mcp/tools.d.ts.map +1 -0
  33. package/dist/mcp/tools.js +1604 -0
  34. package/dist/mcp/tools.js.map +1 -0
  35. package/dist/ops/blame.d.ts +148 -0
  36. package/dist/ops/blame.d.ts.map +1 -0
  37. package/dist/ops/blame.js +754 -0
  38. package/dist/ops/blame.js.map +1 -0
  39. package/dist/ops/branch.d.ts +215 -0
  40. package/dist/ops/branch.d.ts.map +1 -0
  41. package/dist/ops/branch.js +608 -0
  42. package/dist/ops/branch.js.map +1 -0
  43. package/dist/ops/commit-traversal.d.ts +209 -0
  44. package/dist/ops/commit-traversal.d.ts.map +1 -0
  45. package/dist/ops/commit-traversal.js +755 -0
  46. package/dist/ops/commit-traversal.js.map +1 -0
  47. package/dist/ops/commit.d.ts +221 -0
  48. package/dist/ops/commit.d.ts.map +1 -0
  49. package/dist/ops/commit.js +606 -0
  50. package/dist/ops/commit.js.map +1 -0
  51. package/dist/ops/merge-base.d.ts +223 -0
  52. package/dist/ops/merge-base.d.ts.map +1 -0
  53. package/dist/ops/merge-base.js +581 -0
  54. package/dist/ops/merge-base.js.map +1 -0
  55. package/dist/ops/merge.d.ts +385 -0
  56. package/dist/ops/merge.d.ts.map +1 -0
  57. package/dist/ops/merge.js +1203 -0
  58. package/dist/ops/merge.js.map +1 -0
  59. package/dist/ops/tag.d.ts +182 -0
  60. package/dist/ops/tag.d.ts.map +1 -0
  61. package/dist/ops/tag.js +608 -0
  62. package/dist/ops/tag.js.map +1 -0
  63. package/dist/ops/tree-builder.d.ts +82 -0
  64. package/dist/ops/tree-builder.d.ts.map +1 -0
  65. package/dist/ops/tree-builder.js +246 -0
  66. package/dist/ops/tree-builder.js.map +1 -0
  67. package/dist/ops/tree-diff.d.ts +243 -0
  68. package/dist/ops/tree-diff.d.ts.map +1 -0
  69. package/dist/ops/tree-diff.js +657 -0
  70. package/dist/ops/tree-diff.js.map +1 -0
  71. package/dist/pack/delta.d.ts +68 -0
  72. package/dist/pack/delta.d.ts.map +1 -0
  73. package/dist/pack/delta.js +343 -0
  74. package/dist/pack/delta.js.map +1 -0
  75. package/dist/pack/format.d.ts +84 -0
  76. package/dist/pack/format.d.ts.map +1 -0
  77. package/dist/pack/format.js +261 -0
  78. package/dist/pack/format.js.map +1 -0
  79. package/dist/pack/full-generation.d.ts +327 -0
  80. package/dist/pack/full-generation.d.ts.map +1 -0
  81. package/dist/pack/full-generation.js +1159 -0
  82. package/dist/pack/full-generation.js.map +1 -0
  83. package/dist/pack/generation.d.ts +118 -0
  84. package/dist/pack/generation.d.ts.map +1 -0
  85. package/dist/pack/generation.js +459 -0
  86. package/dist/pack/generation.js.map +1 -0
  87. package/dist/pack/index.d.ts +181 -0
  88. package/dist/pack/index.d.ts.map +1 -0
  89. package/dist/pack/index.js +552 -0
  90. package/dist/pack/index.js.map +1 -0
  91. package/dist/refs/branch.d.ts +224 -0
  92. package/dist/refs/branch.d.ts.map +1 -0
  93. package/dist/refs/branch.js +170 -0
  94. package/dist/refs/branch.js.map +1 -0
  95. package/dist/refs/storage.d.ts +208 -0
  96. package/dist/refs/storage.d.ts.map +1 -0
  97. package/dist/refs/storage.js +421 -0
  98. package/dist/refs/storage.js.map +1 -0
  99. package/dist/refs/tag.d.ts +230 -0
  100. package/dist/refs/tag.d.ts.map +1 -0
  101. package/dist/refs/tag.js +188 -0
  102. package/dist/refs/tag.js.map +1 -0
  103. package/dist/storage/lru-cache.d.ts +188 -0
  104. package/dist/storage/lru-cache.d.ts.map +1 -0
  105. package/dist/storage/lru-cache.js +410 -0
  106. package/dist/storage/lru-cache.js.map +1 -0
  107. package/dist/storage/object-index.d.ts +140 -0
  108. package/dist/storage/object-index.d.ts.map +1 -0
  109. package/dist/storage/object-index.js +166 -0
  110. package/dist/storage/object-index.js.map +1 -0
  111. package/dist/storage/r2-pack.d.ts +394 -0
  112. package/dist/storage/r2-pack.d.ts.map +1 -0
  113. package/dist/storage/r2-pack.js +1062 -0
  114. package/dist/storage/r2-pack.js.map +1 -0
  115. package/dist/tiered/cdc-pipeline.d.ts +316 -0
  116. package/dist/tiered/cdc-pipeline.d.ts.map +1 -0
  117. package/dist/tiered/cdc-pipeline.js +771 -0
  118. package/dist/tiered/cdc-pipeline.js.map +1 -0
  119. package/dist/tiered/migration.d.ts +242 -0
  120. package/dist/tiered/migration.d.ts.map +1 -0
  121. package/dist/tiered/migration.js +592 -0
  122. package/dist/tiered/migration.js.map +1 -0
  123. package/dist/tiered/parquet-writer.d.ts +248 -0
  124. package/dist/tiered/parquet-writer.d.ts.map +1 -0
  125. package/dist/tiered/parquet-writer.js +555 -0
  126. package/dist/tiered/parquet-writer.js.map +1 -0
  127. package/dist/tiered/read-path.d.ts +141 -0
  128. package/dist/tiered/read-path.d.ts.map +1 -0
  129. package/dist/tiered/read-path.js +204 -0
  130. package/dist/tiered/read-path.js.map +1 -0
  131. package/dist/types/objects.d.ts +53 -0
  132. package/dist/types/objects.d.ts.map +1 -0
  133. package/dist/types/objects.js +291 -0
  134. package/dist/types/objects.js.map +1 -0
  135. package/dist/types/storage.d.ts +117 -0
  136. package/dist/types/storage.d.ts.map +1 -0
  137. package/dist/types/storage.js +8 -0
  138. package/dist/types/storage.js.map +1 -0
  139. package/dist/utils/hash.d.ts +31 -0
  140. package/dist/utils/hash.d.ts.map +1 -0
  141. package/dist/utils/hash.js +60 -0
  142. package/dist/utils/hash.js.map +1 -0
  143. package/dist/utils/sha1.d.ts +26 -0
  144. package/dist/utils/sha1.d.ts.map +1 -0
  145. package/dist/utils/sha1.js +127 -0
  146. package/dist/utils/sha1.js.map +1 -0
  147. package/dist/wire/capabilities.d.ts +236 -0
  148. package/dist/wire/capabilities.d.ts.map +1 -0
  149. package/dist/wire/capabilities.js +437 -0
  150. package/dist/wire/capabilities.js.map +1 -0
  151. package/dist/wire/pkt-line.d.ts +67 -0
  152. package/dist/wire/pkt-line.d.ts.map +1 -0
  153. package/dist/wire/pkt-line.js +145 -0
  154. package/dist/wire/pkt-line.js.map +1 -0
  155. package/dist/wire/receive-pack.d.ts +302 -0
  156. package/dist/wire/receive-pack.d.ts.map +1 -0
  157. package/dist/wire/receive-pack.js +885 -0
  158. package/dist/wire/receive-pack.js.map +1 -0
  159. package/dist/wire/smart-http.d.ts +321 -0
  160. package/dist/wire/smart-http.d.ts.map +1 -0
  161. package/dist/wire/smart-http.js +654 -0
  162. package/dist/wire/smart-http.js.map +1 -0
  163. package/dist/wire/upload-pack.d.ts +333 -0
  164. package/dist/wire/upload-pack.d.ts.map +1 -0
  165. package/dist/wire/upload-pack.js +850 -0
  166. package/dist/wire/upload-pack.js.map +1 -0
  167. 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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"}