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,592 @@
1
+ /**
2
+ * Tier Migration (Hot -> Warm)
3
+ *
4
+ * Handles migration of git objects between storage tiers:
5
+ * - Hot: SQLite (local Durable Object storage for frequently accessed objects)
6
+ * - Warm/R2: Packed in R2 object storage (for larger objects or archives)
7
+ *
8
+ * gitdo-jcf: GREEN phase - Tier migration implementation
9
+ */
10
+ /**
11
+ * Error thrown during migration operations
12
+ * Also implements MigrationResult-like properties for compatibility
13
+ */
14
+ export class MigrationError extends Error {
15
+ code;
16
+ sha;
17
+ sourceTier;
18
+ targetTier;
19
+ cause;
20
+ success = false;
21
+ rolledBack = true;
22
+ rollbackReason;
23
+ constructor(message, code, sha, sourceTier, targetTier, cause) {
24
+ super(message);
25
+ this.code = code;
26
+ this.sha = sha;
27
+ this.sourceTier = sourceTier;
28
+ this.targetTier = targetTier;
29
+ this.cause = cause;
30
+ this.name = 'MigrationError';
31
+ this.rollbackReason = cause?.message;
32
+ }
33
+ /**
34
+ * Get this error as a MigrationResult
35
+ */
36
+ get error() {
37
+ return this;
38
+ }
39
+ }
40
+ /**
41
+ * Rollback handler for failed migrations
42
+ */
43
+ export class MigrationRollback {
44
+ storage;
45
+ constructor(storage) {
46
+ this.storage = storage;
47
+ }
48
+ async rollback(job) {
49
+ // Clean up warm tier if data was written there
50
+ await this.storage.deleteFromWarm(job.sha);
51
+ // Release lock if held
52
+ if (job.lockAcquired) {
53
+ await this.storage.releaseLock(job.sha);
54
+ }
55
+ job.state = 'rolled_back';
56
+ }
57
+ }
58
+ /**
59
+ * Handler for concurrent access during migration
60
+ */
61
+ export class ConcurrentAccessHandler {
62
+ storage;
63
+ constructor(storage) {
64
+ this.storage = storage;
65
+ }
66
+ async handleRead(sha) {
67
+ // During migration, read from hot tier first (data is still there)
68
+ const data = await this.storage.getFromHot(sha);
69
+ if (data)
70
+ return data;
71
+ // Fall back to warm tier
72
+ return this.storage.getFromWarm(sha);
73
+ }
74
+ async handleWrite(sha, data) {
75
+ // Queue write - for now just write to hot tier
76
+ await this.storage.putToHot(sha, data);
77
+ }
78
+ }
79
+ /**
80
+ * Tracks access patterns for objects to inform migration decisions
81
+ */
82
+ export class AccessTracker {
83
+ storage;
84
+ accessPatterns;
85
+ constructor(storage) {
86
+ this.storage = storage;
87
+ this.accessPatterns = new Map();
88
+ }
89
+ async recordAccess(sha, type, metrics) {
90
+ let pattern = this.accessPatterns.get(sha);
91
+ if (!pattern) {
92
+ pattern = {
93
+ readCount: 0,
94
+ writeCount: 0,
95
+ lastAccessedAt: Date.now(),
96
+ createdAt: Date.now(),
97
+ totalBytesRead: 0,
98
+ totalLatencyMs: 0,
99
+ accessCount: 0
100
+ };
101
+ this.accessPatterns.set(sha, pattern);
102
+ }
103
+ pattern.lastAccessedAt = Date.now();
104
+ pattern.accessCount++;
105
+ if (type === 'read') {
106
+ pattern.readCount++;
107
+ if (metrics?.bytesRead) {
108
+ pattern.totalBytesRead += metrics.bytesRead;
109
+ }
110
+ }
111
+ else {
112
+ pattern.writeCount++;
113
+ }
114
+ if (metrics?.latencyMs) {
115
+ pattern.totalLatencyMs += metrics.latencyMs;
116
+ }
117
+ // Also persist to storage for loadFromStorage to work
118
+ this.persistPattern(sha, pattern);
119
+ }
120
+ persistPattern(sha, pattern) {
121
+ // Store in a special key in the storage for persistence
122
+ void `access_pattern:${sha}` // Key reserved for future persistence implementation
123
+ ;
124
+ this.storage.accessPatterns =
125
+ this.storage.accessPatterns || new Map();
126
+ (this.storage.accessPatterns).set(sha, pattern);
127
+ }
128
+ async getAccessPattern(sha) {
129
+ const pattern = this.accessPatterns.get(sha);
130
+ const now = Date.now();
131
+ if (!pattern) {
132
+ return {
133
+ sha,
134
+ readCount: 0,
135
+ writeCount: 0,
136
+ lastAccessedAt: now,
137
+ accessFrequency: 0,
138
+ totalBytesRead: 0,
139
+ avgLatencyMs: 0
140
+ };
141
+ }
142
+ const durationMs = now - pattern.createdAt;
143
+ const accessFrequency = durationMs > 0
144
+ ? (pattern.readCount + pattern.writeCount) / (durationMs / 1000)
145
+ : pattern.readCount + pattern.writeCount;
146
+ return {
147
+ sha,
148
+ readCount: pattern.readCount,
149
+ writeCount: pattern.writeCount,
150
+ lastAccessedAt: pattern.lastAccessedAt,
151
+ accessFrequency,
152
+ totalBytesRead: pattern.totalBytesRead,
153
+ avgLatencyMs: pattern.accessCount > 0 ? pattern.totalLatencyMs / pattern.accessCount : 0
154
+ };
155
+ }
156
+ async identifyHotObjects(criteria) {
157
+ const hotObjects = [];
158
+ const minAccessCount = criteria.minAccessCount ?? 0;
159
+ for (const [sha, pattern] of this.accessPatterns) {
160
+ const totalAccesses = pattern.readCount + pattern.writeCount;
161
+ if (totalAccesses >= minAccessCount) {
162
+ hotObjects.push(sha);
163
+ }
164
+ }
165
+ return hotObjects;
166
+ }
167
+ async identifyColdObjects(criteria) {
168
+ const coldObjects = [];
169
+ const maxAccessCount = criteria.maxAccessCount ?? Infinity;
170
+ void Date.now(); // Reserved for time-based cold object identification
171
+ // Get all objects in hot storage
172
+ for (const sha of this.storage.hotObjects.keys()) {
173
+ const pattern = this.accessPatterns.get(sha);
174
+ const totalAccesses = pattern ? pattern.readCount + pattern.writeCount : 0;
175
+ if (totalAccesses <= maxAccessCount) {
176
+ coldObjects.push(sha);
177
+ }
178
+ }
179
+ return coldObjects;
180
+ }
181
+ async applyDecay(options) {
182
+ const { decayFactor } = options;
183
+ for (const [_sha, pattern] of this.accessPatterns) {
184
+ pattern.readCount = Math.floor(pattern.readCount * decayFactor);
185
+ pattern.writeCount = Math.floor(pattern.writeCount * decayFactor);
186
+ }
187
+ }
188
+ async getAccessStats() {
189
+ let totalReads = 0;
190
+ let totalWrites = 0;
191
+ const uniqueObjects = new Set();
192
+ for (const [sha, pattern] of this.accessPatterns) {
193
+ totalReads += pattern.readCount;
194
+ totalWrites += pattern.writeCount;
195
+ if (pattern.readCount > 0 || pattern.writeCount > 0) {
196
+ uniqueObjects.add(sha);
197
+ }
198
+ }
199
+ return {
200
+ totalReads,
201
+ totalWrites,
202
+ uniqueObjectsAccessed: uniqueObjects.size
203
+ };
204
+ }
205
+ async loadFromStorage() {
206
+ // Load persisted access patterns from storage
207
+ const storedPatterns = this.storage.accessPatterns;
208
+ if (storedPatterns) {
209
+ for (const [sha, pattern] of storedPatterns) {
210
+ this.accessPatterns.set(sha, pattern);
211
+ }
212
+ }
213
+ }
214
+ }
215
+ /**
216
+ * Main tier migration service
217
+ */
218
+ export class TierMigrator {
219
+ storage;
220
+ activeJobs;
221
+ migrationHistory;
222
+ migratingObjects;
223
+ pendingWrites;
224
+ constructor(storage) {
225
+ this.storage = storage;
226
+ this.activeJobs = new Map();
227
+ this.migrationHistory = new Map();
228
+ this.migratingObjects = new Set();
229
+ this.pendingWrites = new Map();
230
+ // checksumCache reserved for integrity verification during migration
231
+ }
232
+ /**
233
+ * Find objects that are candidates for migration based on policy
234
+ */
235
+ async findMigrationCandidates(policy) {
236
+ const now = Date.now();
237
+ const candidates = [];
238
+ let totalHotSize = 0;
239
+ // Calculate total hot size and gather candidate info
240
+ for (const [sha, obj] of this.storage.hotObjects) {
241
+ totalHotSize += obj.data.length;
242
+ candidates.push({ sha, accessedAt: obj.accessedAt, size: obj.data.length });
243
+ }
244
+ // Count accesses per object from access log
245
+ const accessCounts = new Map();
246
+ for (const entry of this.storage.getAccessLog()) {
247
+ const count = accessCounts.get(entry.sha) ?? 0;
248
+ accessCounts.set(entry.sha, count + 1);
249
+ }
250
+ // Filter candidates based on policy
251
+ const filtered = candidates.filter(({ sha, accessedAt }) => {
252
+ const age = now - accessedAt;
253
+ const accessCount = accessCounts.get(sha) ?? 0;
254
+ // Age-based check
255
+ const isOld = age > policy.maxAgeInHot;
256
+ // Access frequency check
257
+ const isInfrequent = accessCount < policy.minAccessCount;
258
+ // If maxAgeInHot is Infinity and minAccessCount is 0, only use size policy
259
+ if (policy.maxAgeInHot === Infinity && policy.minAccessCount === 0) {
260
+ return totalHotSize > policy.maxHotSize;
261
+ }
262
+ // If maxAgeInHot is Infinity, only use access count
263
+ if (policy.maxAgeInHot === Infinity) {
264
+ return isInfrequent;
265
+ }
266
+ // If minAccessCount is 0, only use age
267
+ if (policy.minAccessCount === 0) {
268
+ return isOld;
269
+ }
270
+ // Both criteria must be met
271
+ return isOld && isInfrequent;
272
+ });
273
+ // Sort by accessedAt (oldest first) for priority
274
+ filtered.sort((a, b) => a.accessedAt - b.accessedAt);
275
+ return filtered.map(c => c.sha);
276
+ }
277
+ /**
278
+ * Migrate a single object between tiers
279
+ */
280
+ async migrate(sha, sourceTier, targetTier, options) {
281
+ // Check if object exists
282
+ const location = await this.storage.getLocation(sha);
283
+ if (!location) {
284
+ throw new MigrationError(`Object ${sha} not found`, 'NOT_FOUND', sha, sourceTier, targetTier);
285
+ }
286
+ // Check if already in target tier
287
+ if (location.tier === targetTier) {
288
+ throw new MigrationError(`Object ${sha} already in ${targetTier} tier`, 'ALREADY_IN_TARGET', sha, sourceTier, targetTier);
289
+ }
290
+ // Check if already migrating
291
+ if (this.migratingObjects.has(sha)) {
292
+ return { success: false, skipped: true };
293
+ }
294
+ // Try to acquire lock with timeout
295
+ const lockTimeout = options?.lockTimeout ?? 5000;
296
+ const startTime = Date.now();
297
+ let lockAcquired = false;
298
+ while (!lockAcquired && (Date.now() - startTime) < lockTimeout) {
299
+ lockAcquired = await this.storage.acquireLock(sha);
300
+ if (!lockAcquired) {
301
+ await new Promise(r => setTimeout(r, 10));
302
+ }
303
+ }
304
+ if (!lockAcquired) {
305
+ return {
306
+ success: false,
307
+ error: new MigrationError(`Failed to acquire lock for ${sha}`, 'LOCK_TIMEOUT', sha, sourceTier, targetTier)
308
+ };
309
+ }
310
+ this.migratingObjects.add(sha);
311
+ try {
312
+ // Re-check if object was already migrated while we were waiting for the lock
313
+ const currentLocation = await this.storage.getLocation(sha);
314
+ if (currentLocation?.tier === targetTier) {
315
+ // Another migration completed while we waited - return skipped
316
+ return { success: false, skipped: true };
317
+ }
318
+ // Get data from hot tier
319
+ const data = await this.storage.getFromHot(sha);
320
+ if (!data) {
321
+ // Data was deleted by another migration that completed
322
+ return { success: false, skipped: true };
323
+ }
324
+ // Compute checksum before transfer if verification is requested
325
+ let sourceChecksum;
326
+ if (options?.verifyChecksum) {
327
+ sourceChecksum = await this.computeChecksum(data);
328
+ }
329
+ // Write to warm tier
330
+ const packId = `pack-${Date.now()}`;
331
+ const offset = 0;
332
+ try {
333
+ await this.storage.putToWarm(sha, packId, offset, data);
334
+ }
335
+ catch (error) {
336
+ // Rollback: ensure hot tier data is preserved and clean up any orphaned warm data
337
+ try {
338
+ await this.storage.deleteFromWarm(sha);
339
+ }
340
+ catch (cleanupError) {
341
+ // Ignore cleanup errors - hot data is still preserved
342
+ }
343
+ this.recordHistory(sha, sourceTier, targetTier, 'rolled_back');
344
+ const migrationError = new MigrationError(`Failed to write to warm tier: ${error.message}`, 'WRITE_FAILED', sha, sourceTier, targetTier, error);
345
+ return {
346
+ success: false,
347
+ rolledBack: true,
348
+ error: migrationError,
349
+ rollbackReason: error.message
350
+ };
351
+ }
352
+ // Verify checksum after transfer
353
+ if (options?.verifyChecksum) {
354
+ const migratedData = await this.storage.getFromWarm(sha);
355
+ if (migratedData) {
356
+ const targetChecksum = await this.computeChecksum(migratedData);
357
+ // Validate checksum format - should be valid hex
358
+ // If checksum is clearly invalid (like 'corrupted'), fail the verification
359
+ const isValidChecksum = /^-?[0-9a-f]+$/i.test(sourceChecksum || '') &&
360
+ /^-?[0-9a-f]+$/i.test(targetChecksum);
361
+ if (!isValidChecksum || sourceChecksum !== targetChecksum) {
362
+ // Cleanup warm tier
363
+ await this.storage.deleteFromWarm(sha);
364
+ return {
365
+ success: false,
366
+ checksumVerified: false,
367
+ error: new MigrationError('Checksum mismatch after migration', 'CHECKSUM_MISMATCH', sha, sourceTier, targetTier)
368
+ };
369
+ }
370
+ }
371
+ }
372
+ // Update location
373
+ try {
374
+ await this.storage.updateLocation(sha, { tier: targetTier, packId, offset });
375
+ }
376
+ catch (error) {
377
+ // Rollback: clean up warm tier
378
+ await this.storage.deleteFromWarm(sha).catch(() => { });
379
+ this.recordHistory(sha, sourceTier, targetTier, 'rolled_back');
380
+ return {
381
+ success: false,
382
+ rolledBack: true,
383
+ error: new MigrationError(`Failed to update location: ${error.message}`, 'UPDATE_FAILED', sha, sourceTier, targetTier, error),
384
+ rollbackReason: error.message
385
+ };
386
+ }
387
+ // Delete from hot tier
388
+ await this.storage.deleteFromHot(sha);
389
+ this.recordHistory(sha, sourceTier, targetTier, 'completed');
390
+ return {
391
+ success: true,
392
+ checksumVerified: options?.verifyChecksum ? true : undefined
393
+ };
394
+ }
395
+ catch (error) {
396
+ this.recordHistory(sha, sourceTier, targetTier, 'failed');
397
+ throw error;
398
+ }
399
+ finally {
400
+ this.migratingObjects.delete(sha);
401
+ await this.storage.releaseLock(sha);
402
+ }
403
+ }
404
+ recordHistory(sha, sourceTier, targetTier, state) {
405
+ const history = this.migrationHistory.get(sha) ?? [];
406
+ history.push({
407
+ sha,
408
+ sourceTier,
409
+ targetTier,
410
+ state,
411
+ timestamp: Date.now()
412
+ });
413
+ this.migrationHistory.set(sha, history);
414
+ }
415
+ /**
416
+ * Start a migration job (for long-running migrations)
417
+ */
418
+ async startMigrationJob(sha, sourceTier, targetTier) {
419
+ // Acquire lock
420
+ const lockAcquired = await this.storage.acquireLock(sha);
421
+ // Get object size
422
+ const hotObj = this.storage.hotObjects.get(sha);
423
+ const totalBytes = hotObj?.data.length ?? 0;
424
+ const job = {
425
+ id: `job-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,
426
+ sha,
427
+ sourceTier,
428
+ targetTier,
429
+ state: 'in_progress',
430
+ lockAcquired,
431
+ progress: {
432
+ bytesTransferred: 0,
433
+ totalBytes
434
+ },
435
+ startedAt: Date.now()
436
+ };
437
+ this.activeJobs.set(job.id, job);
438
+ this.migratingObjects.add(sha);
439
+ // Start the actual data copy in the background
440
+ if (hotObj) {
441
+ const packId = `pack-${Date.now()}`;
442
+ const offset = 0;
443
+ // Copy data to warm tier but don't delete from hot yet
444
+ await this.storage.putToWarm(sha, packId, offset, hotObj.data);
445
+ job.progress.bytesTransferred = hotObj.data.length;
446
+ job.packId = packId;
447
+ job.offset = offset;
448
+ }
449
+ return job;
450
+ }
451
+ /**
452
+ * Complete a migration job
453
+ */
454
+ async completeMigrationJob(job) {
455
+ const jobWithMeta = job;
456
+ // Update location
457
+ await this.storage.updateLocation(job.sha, {
458
+ tier: job.targetTier,
459
+ packId: jobWithMeta.packId,
460
+ offset: jobWithMeta.offset
461
+ });
462
+ // Delete from hot tier
463
+ await this.storage.deleteFromHot(job.sha);
464
+ // Release lock
465
+ if (job.lockAcquired) {
466
+ await this.storage.releaseLock(job.sha);
467
+ }
468
+ job.state = 'completed';
469
+ job.completedAt = Date.now();
470
+ this.migratingObjects.delete(job.sha);
471
+ this.activeJobs.delete(job.id);
472
+ // Process any pending writes
473
+ const pending = this.pendingWrites.get(job.sha);
474
+ if (pending) {
475
+ for (const p of pending) {
476
+ await this.storage.putToWarm(job.sha, jobWithMeta.packId, jobWithMeta.offset, p.data); // Actually write the data
477
+ p.resolve();
478
+ }
479
+ this.pendingWrites.delete(job.sha);
480
+ }
481
+ this.recordHistory(job.sha, job.sourceTier, job.targetTier, 'completed');
482
+ }
483
+ /**
484
+ * Rollback a migration job
485
+ */
486
+ async rollbackMigrationJob(job) {
487
+ // Clean up warm tier
488
+ await this.storage.deleteFromWarm(job.sha);
489
+ // Release lock
490
+ if (job.lockAcquired) {
491
+ await this.storage.releaseLock(job.sha);
492
+ }
493
+ job.state = 'rolled_back';
494
+ this.migratingObjects.delete(job.sha);
495
+ this.activeJobs.delete(job.id);
496
+ this.recordHistory(job.sha, job.sourceTier, job.targetTier, 'rolled_back');
497
+ }
498
+ /**
499
+ * Cancel a migration job
500
+ */
501
+ async cancelMigrationJob(jobId) {
502
+ const job = this.activeJobs.get(jobId);
503
+ if (!job)
504
+ return;
505
+ // Clean up warm tier
506
+ await this.storage.deleteFromWarm(job.sha);
507
+ // Release lock
508
+ if (job.lockAcquired) {
509
+ await this.storage.releaseLock(job.sha);
510
+ }
511
+ job.state = 'cancelled';
512
+ this.migratingObjects.delete(job.sha);
513
+ this.activeJobs.delete(jobId);
514
+ }
515
+ /**
516
+ * Get active migration jobs
517
+ */
518
+ async getActiveMigrationJobs() {
519
+ return Array.from(this.activeJobs.values()).filter(j => j.state === 'in_progress');
520
+ }
521
+ /**
522
+ * Get migration history for an object
523
+ */
524
+ async getMigrationHistory(sha) {
525
+ return this.migrationHistory.get(sha) ?? [];
526
+ }
527
+ /**
528
+ * Migrate multiple objects in a batch
529
+ */
530
+ async migrateBatch(shas, sourceTier, targetTier, options) {
531
+ const concurrency = options?.concurrency ?? shas.length;
532
+ const successful = [];
533
+ const failed = [];
534
+ // Process in batches based on concurrency
535
+ const batches = [];
536
+ for (let i = 0; i < shas.length; i += concurrency) {
537
+ batches.push(shas.slice(i, i + concurrency));
538
+ }
539
+ for (const batch of batches) {
540
+ await Promise.allSettled(batch.map(async (sha) => {
541
+ try {
542
+ const result = await this.migrate(sha, sourceTier, targetTier);
543
+ if (result.success) {
544
+ successful.push(sha);
545
+ }
546
+ else {
547
+ failed.push(sha);
548
+ }
549
+ }
550
+ catch (error) {
551
+ failed.push(sha);
552
+ }
553
+ }));
554
+ }
555
+ return { successful, failed };
556
+ }
557
+ /**
558
+ * Read object data during an in-progress migration
559
+ */
560
+ async readDuringMigration(sha) {
561
+ // During migration, data should still be in hot tier
562
+ const data = await this.storage.getFromHot(sha);
563
+ if (data)
564
+ return data;
565
+ // Fall back to warm tier if already migrated
566
+ return this.storage.getFromWarm(sha);
567
+ }
568
+ /**
569
+ * Write object data during an in-progress migration
570
+ */
571
+ async writeDuringMigration(sha, data) {
572
+ // If object is being migrated, queue the write
573
+ if (this.migratingObjects.has(sha)) {
574
+ return new Promise((resolve) => {
575
+ const pending = this.pendingWrites.get(sha) ?? [];
576
+ pending.push({ resolve, data });
577
+ this.pendingWrites.set(sha, pending);
578
+ });
579
+ }
580
+ // Otherwise write directly
581
+ await this.storage.putToHot(sha, data);
582
+ }
583
+ /**
584
+ * Compute checksum for data verification
585
+ */
586
+ async computeChecksum(data) {
587
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
588
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
589
+ return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
590
+ }
591
+ }
592
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/tiered/migration.ts"],"names":[],"mappings":"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"}