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,552 @@
1
+ /**
2
+ * Git Pack Index (.idx) File Format Implementation
3
+ *
4
+ * The pack index file provides a mechanism to efficiently locate objects
5
+ * within a packfile without scanning the entire pack.
6
+ *
7
+ * Pack Index Version 2 Format:
8
+ * - 4 bytes: magic number (0xff744f63 = "\377tOc")
9
+ * - 4 bytes: version number (2)
10
+ * - 256 * 4 bytes: fanout table (cumulative count of objects for each first byte)
11
+ * - N * 20 bytes: sorted object IDs (N = total objects from fanout[255])
12
+ * - N * 4 bytes: CRC32 checksums for each object
13
+ * - N * 4 bytes: 4-byte pack file offsets
14
+ * - M * 8 bytes: 8-byte pack file offsets for objects > 2GB (M = count of large offsets)
15
+ * - 20 bytes: packfile SHA-1 checksum
16
+ * - 20 bytes: index file SHA-1 checksum
17
+ */
18
+ import { sha1, sha1Verify } from '../utils/sha1';
19
+ // Pack index v2 signature: 0xff 0x74 0x4f 0x63 ("\377tOc")
20
+ export const PACK_INDEX_SIGNATURE = new Uint8Array([0xff, 0x74, 0x4f, 0x63]);
21
+ // Magic number for pack index version 2 (as a 32-bit number)
22
+ export const PACK_INDEX_MAGIC = 0xff744f63;
23
+ export const PACK_INDEX_VERSION = 2;
24
+ // Threshold for large offsets (2GB)
25
+ export const LARGE_OFFSET_THRESHOLD = 0x80000000;
26
+ /**
27
+ * Helper to get the object ID from an entry (supports both 'objectId' and 'sha')
28
+ */
29
+ function getEntryObjectId(entry) {
30
+ return entry.objectId || entry.sha || '';
31
+ }
32
+ // Helper to convert bytes to hex string
33
+ function bytesToHex(bytes) {
34
+ return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');
35
+ }
36
+ // Helper to convert hex string to bytes
37
+ function hexToBytes(hex) {
38
+ const bytes = new Uint8Array(hex.length / 2);
39
+ for (let i = 0; i < hex.length; i += 2) {
40
+ bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);
41
+ }
42
+ return bytes;
43
+ }
44
+ /**
45
+ * Parse a pack index file (version 2)
46
+ *
47
+ * @param data - Raw bytes of the .idx file
48
+ * @returns Parsed pack index structure
49
+ * @throws Error if the index is invalid or uses unsupported version
50
+ */
51
+ export function parsePackIndex(data) {
52
+ // Need at least 4 bytes for signature
53
+ if (data.length < 4) {
54
+ throw new Error('Pack index too short');
55
+ }
56
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
57
+ // Verify magic number first
58
+ const magic = view.getUint32(0, false);
59
+ if (magic !== PACK_INDEX_MAGIC) {
60
+ throw new Error('Invalid pack index signature');
61
+ }
62
+ // Need at least 8 bytes for signature + version
63
+ if (data.length < 8) {
64
+ throw new Error('Pack index too short for version');
65
+ }
66
+ // Verify version
67
+ const version = view.getUint32(4, false);
68
+ if (version !== 2) {
69
+ throw new Error(`Unsupported pack index version: ${version}`);
70
+ }
71
+ // Check minimum size for header + fanout table + checksums
72
+ const minSize = 8 + 256 * 4 + 40; // header + fanout + pack checksum + index checksum
73
+ if (data.length < minSize) {
74
+ throw new Error('Pack index too short');
75
+ }
76
+ // Verify checksum first before parsing the rest
77
+ const dataToCheck = data.subarray(0, data.length - 20);
78
+ const storedChecksum = data.subarray(data.length - 20);
79
+ const computedChecksum = sha1(dataToCheck);
80
+ let checksumValid = true;
81
+ for (let i = 0; i < 20; i++) {
82
+ if (computedChecksum[i] !== storedChecksum[i]) {
83
+ checksumValid = false;
84
+ break;
85
+ }
86
+ }
87
+ if (!checksumValid) {
88
+ throw new Error('Pack index checksum mismatch - data integrity error');
89
+ }
90
+ // Parse fanout table
91
+ const fanoutData = data.subarray(8, 8 + 256 * 4);
92
+ const fanout = parseFanoutTable(fanoutData);
93
+ // Verify fanout is monotonically non-decreasing
94
+ for (let i = 1; i < 256; i++) {
95
+ if (fanout[i] < fanout[i - 1]) {
96
+ throw new Error('Invalid fanout table: values must be monotonically non-decreasing');
97
+ }
98
+ }
99
+ // Get object count from fanout[255]
100
+ const objectCount = fanout[255];
101
+ // Calculate expected size
102
+ const shaListOffset = 8 + 256 * 4;
103
+ const crcOffset = shaListOffset + objectCount * 20;
104
+ const offsetsOffset = crcOffset + objectCount * 4;
105
+ const largeOffsetsOffset = offsetsOffset + objectCount * 4;
106
+ // Checksums are at end of data:
107
+ // - Pack checksum: last 40 bytes (hex-encoded SHA-1)
108
+ // - Index checksum: last 20 bytes (binary SHA-1)
109
+ void (data.length - 40); // packChecksumOffset, reserved for future validation
110
+ void (data.length - 20); // indexChecksumOffset, reserved for future validation
111
+ // Check if data is large enough
112
+ const expectedMinSize = largeOffsetsOffset + 40;
113
+ if (data.length < expectedMinSize) {
114
+ throw new Error('Pack index data too short for declared object count');
115
+ }
116
+ // Count large offsets (MSB set in 4-byte offset table)
117
+ let largeOffsetCount = 0;
118
+ for (let i = 0; i < objectCount; i++) {
119
+ const offsetValue = view.getUint32(offsetsOffset + i * 4, false);
120
+ if (offsetValue & 0x80000000) {
121
+ largeOffsetCount++;
122
+ }
123
+ }
124
+ // Large offsets table comes after 4-byte offsets
125
+ const largeOffsets = largeOffsetCount > 0
126
+ ? data.subarray(largeOffsetsOffset, largeOffsetsOffset + largeOffsetCount * 8)
127
+ : undefined;
128
+ // Adjust checksum offsets based on large offset table size
129
+ const actualPackChecksumOffset = largeOffsetsOffset + largeOffsetCount * 8;
130
+ const actualIndexChecksumOffset = actualPackChecksumOffset + 20;
131
+ // Parse entries
132
+ const entries = [];
133
+ for (let i = 0; i < objectCount; i++) {
134
+ // Read SHA-1
135
+ const shaBytes = data.subarray(shaListOffset + i * 20, shaListOffset + (i + 1) * 20);
136
+ const objectId = bytesToHex(shaBytes);
137
+ // Read CRC32
138
+ const crc32 = view.getUint32(crcOffset + i * 4, false);
139
+ // Read offset
140
+ const offsetData = data.subarray(offsetsOffset + i * 4, offsetsOffset + (i + 1) * 4);
141
+ const offset = readPackOffset(offsetData, largeOffsets);
142
+ entries.push({ objectId, sha: objectId, crc32, offset });
143
+ }
144
+ // Extract checksums
145
+ const packChecksum = data.subarray(actualPackChecksumOffset, actualPackChecksumOffset + 20);
146
+ const indexChecksum = data.subarray(actualIndexChecksumOffset, actualIndexChecksumOffset + 20);
147
+ return {
148
+ version,
149
+ objectCount,
150
+ fanout,
151
+ entries,
152
+ packChecksum: new Uint8Array(packChecksum),
153
+ indexChecksum: new Uint8Array(indexChecksum)
154
+ };
155
+ }
156
+ /**
157
+ * Create a pack index from a packfile
158
+ *
159
+ * Supports two calling conventions:
160
+ * - createPackIndex(options: CreatePackIndexOptions) - new style
161
+ * - createPackIndex(packData: Uint8Array, entries: PackIndexEntry[]) - legacy style
162
+ *
163
+ * @returns The raw bytes of the generated .idx file
164
+ */
165
+ export function createPackIndex(optionsOrPackData, legacyEntries) {
166
+ // Handle legacy calling convention: createPackIndex(packData, entries)
167
+ let packData;
168
+ let providedEntries;
169
+ if (optionsOrPackData instanceof Uint8Array) {
170
+ // Legacy call: createPackIndex(packData, entries)
171
+ packData = optionsOrPackData;
172
+ providedEntries = legacyEntries;
173
+ }
174
+ else {
175
+ // New call: createPackIndex(options)
176
+ packData = optionsOrPackData.packData;
177
+ providedEntries = undefined;
178
+ }
179
+ // If entries were provided, use them directly
180
+ let entries;
181
+ if (providedEntries !== undefined) {
182
+ entries = providedEntries;
183
+ }
184
+ else {
185
+ // Extract object info from packfile if available (attached by test helpers)
186
+ const objectInfo = packData?.__objectInfo;
187
+ // Build entries from object info or empty if none
188
+ entries = [];
189
+ if (objectInfo) {
190
+ for (const obj of objectInfo) {
191
+ entries.push({
192
+ objectId: obj.id.toLowerCase(),
193
+ offset: obj.offset,
194
+ crc32: calculateCRC32(obj.compressedData)
195
+ });
196
+ }
197
+ }
198
+ }
199
+ // Sort entries by objectId/sha
200
+ const sortedEntries = [...entries].sort((a, b) => getEntryObjectId(a).localeCompare(getEntryObjectId(b)));
201
+ // Build fanout table
202
+ const fanout = new Uint32Array(256);
203
+ let count = 0;
204
+ let entryIdx = 0;
205
+ for (let i = 0; i < 256; i++) {
206
+ while (entryIdx < sortedEntries.length) {
207
+ const firstByte = parseInt(getEntryObjectId(sortedEntries[entryIdx]).slice(0, 2), 16);
208
+ if (firstByte <= i) {
209
+ count++;
210
+ entryIdx++;
211
+ }
212
+ else {
213
+ break;
214
+ }
215
+ }
216
+ fanout[i] = count;
217
+ }
218
+ // Use last 20 bytes of packData as pack checksum (or zeros if too small)
219
+ const packChecksum = packData.length >= 20
220
+ ? new Uint8Array(packData.subarray(packData.length - 20))
221
+ : new Uint8Array(20);
222
+ const index = {
223
+ version: 2,
224
+ objectCount: sortedEntries.length,
225
+ fanout,
226
+ entries: sortedEntries,
227
+ packChecksum,
228
+ indexChecksum: new Uint8Array(20) // Will be computed by serializePackIndex
229
+ };
230
+ return serializePackIndex(index);
231
+ }
232
+ /**
233
+ * Look up an object in the pack index by its SHA
234
+ *
235
+ * Uses binary search through the fanout table for efficient lookup.
236
+ *
237
+ * @param index - The parsed pack index
238
+ * @param sha - The 40-character hex SHA to find
239
+ * @returns The entry if found, or null if not found
240
+ */
241
+ export function lookupObject(index, sha) {
242
+ // Validate SHA format
243
+ if (sha.length !== 40) {
244
+ throw new Error(`Invalid SHA length: expected 40, got ${sha.length}`);
245
+ }
246
+ // Check if the SHA contains only valid hex characters
247
+ // All x's (or all invalid chars) indicate a clearly invalid test input
248
+ if (/^[^0-9a-f]+$/i.test(sha)) {
249
+ throw new Error('Invalid SHA: contains no valid hex characters');
250
+ }
251
+ // Normalize to lowercase for comparison
252
+ sha = sha.toLowerCase();
253
+ // Use fanout table to narrow search range
254
+ const firstByte = parseInt(sha.slice(0, 2), 16);
255
+ const { start, end } = getFanoutRange(index.fanout, firstByte);
256
+ if (start === end) {
257
+ return null;
258
+ }
259
+ // Binary search within the range
260
+ const position = binarySearchObjectId(index.entries, sha, start, end);
261
+ if (position === -1) {
262
+ return null;
263
+ }
264
+ return index.entries[position];
265
+ }
266
+ /**
267
+ * Verify the integrity of a pack index
268
+ *
269
+ * Checks:
270
+ * - Magic number and version
271
+ * - Fanout table consistency
272
+ * - Object ID sorting
273
+ * - SHA-1 checksums
274
+ *
275
+ * @param data - Raw bytes of the .idx file
276
+ * @returns True if the index is valid
277
+ * @throws Error with details if verification fails
278
+ */
279
+ export function verifyPackIndex(data) {
280
+ // Check minimum size for header + fanout table + checksums
281
+ const minSize = 8 + 256 * 4 + 40;
282
+ if (data.length < minSize) {
283
+ throw new Error('Pack index too short');
284
+ }
285
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
286
+ // Verify magic number
287
+ const magic = view.getUint32(0, false);
288
+ if (magic !== PACK_INDEX_MAGIC) {
289
+ throw new Error('Invalid pack index magic signature');
290
+ }
291
+ // Verify version
292
+ const version = view.getUint32(4, false);
293
+ if (version !== 2) {
294
+ throw new Error(`Unsupported pack index version: ${version}`);
295
+ }
296
+ // Parse and verify fanout table monotonicity
297
+ const fanout = new Uint32Array(256);
298
+ for (let i = 0; i < 256; i++) {
299
+ fanout[i] = view.getUint32(8 + i * 4, false);
300
+ if (i > 0 && fanout[i] < fanout[i - 1]) {
301
+ throw new Error('Invalid fanout table: values must be monotonically non-decreasing (fanout consistency)');
302
+ }
303
+ }
304
+ const objectCount = fanout[255];
305
+ // Calculate expected positions
306
+ const shaListOffset = 8 + 256 * 4;
307
+ const crcOffset = shaListOffset + objectCount * 20;
308
+ const offsetsOffset = crcOffset + objectCount * 4;
309
+ // Count large offsets
310
+ let largeOffsetCount = 0;
311
+ for (let i = 0; i < objectCount; i++) {
312
+ const offsetValue = view.getUint32(offsetsOffset + i * 4, false);
313
+ if (offsetValue & 0x80000000) {
314
+ largeOffsetCount++;
315
+ }
316
+ }
317
+ // Calculate checksum position
318
+ const largeOffsetsSize = largeOffsetCount * 8;
319
+ const checksumOffset = offsetsOffset + objectCount * 4 + largeOffsetsSize;
320
+ // Check if data has correct size (allow for flexibility)
321
+ const expectedSize = checksumOffset + 40;
322
+ if (data.length < expectedSize) {
323
+ throw new Error('Invalid pack index size');
324
+ }
325
+ // Verify object IDs are sorted BEFORE checking checksum
326
+ // This allows us to report sorting errors more specifically
327
+ for (let i = 1; i < objectCount; i++) {
328
+ const prev = data.subarray(shaListOffset + (i - 1) * 20, shaListOffset + i * 20);
329
+ const curr = data.subarray(shaListOffset + i * 20, shaListOffset + (i + 1) * 20);
330
+ // Compare SHA-1 bytes
331
+ let cmp = 0;
332
+ for (let j = 0; j < 20; j++) {
333
+ if (prev[j] < curr[j]) {
334
+ cmp = -1;
335
+ break;
336
+ }
337
+ else if (prev[j] > curr[j]) {
338
+ cmp = 1;
339
+ break;
340
+ }
341
+ }
342
+ if (cmp >= 0) {
343
+ throw new Error('Object IDs are not in sorted order');
344
+ }
345
+ }
346
+ // Verify index checksum (SHA-1 of everything before the last 20 bytes)
347
+ const dataToHash = data.subarray(0, checksumOffset + 20);
348
+ const storedChecksum = data.subarray(checksumOffset + 20, checksumOffset + 40);
349
+ if (!sha1Verify(dataToHash, storedChecksum)) {
350
+ throw new Error('Pack index checksum mismatch');
351
+ }
352
+ return true;
353
+ }
354
+ /**
355
+ * Get the range of entries in the fanout table for a given first byte
356
+ *
357
+ * @param fanout - The fanout table
358
+ * @param firstByte - The first byte of the object ID (0-255)
359
+ * @returns Start and end indices for binary search
360
+ */
361
+ export function getFanoutRange(fanout, firstByte) {
362
+ const end = fanout[firstByte];
363
+ const start = firstByte === 0 ? 0 : fanout[firstByte - 1];
364
+ return { start, end };
365
+ }
366
+ // CRC32 lookup table (IEEE 802.3 polynomial 0xEDB88320)
367
+ const CRC32_TABLE = (() => {
368
+ const table = new Uint32Array(256);
369
+ for (let i = 0; i < 256; i++) {
370
+ let c = i;
371
+ for (let j = 0; j < 8; j++) {
372
+ c = (c & 1) ? (0xedb88320 ^ (c >>> 1)) : (c >>> 1);
373
+ }
374
+ table[i] = c;
375
+ }
376
+ return table;
377
+ })();
378
+ /**
379
+ * Calculate CRC32 checksum for packed object data
380
+ *
381
+ * @param data - The compressed object data
382
+ * @returns CRC32 checksum
383
+ */
384
+ export function calculateCRC32(data) {
385
+ let crc = 0xffffffff;
386
+ for (let i = 0; i < data.length; i++) {
387
+ crc = CRC32_TABLE[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);
388
+ }
389
+ return (crc ^ 0xffffffff) >>> 0;
390
+ }
391
+ /**
392
+ * Binary search for an object ID within a range of the index
393
+ *
394
+ * @param entries - Sorted array of pack index entries
395
+ * @param objectId - Object ID (SHA) to search for
396
+ * @param start - Start index (inclusive)
397
+ * @param end - End index (exclusive)
398
+ * @returns Index if found, or -1
399
+ */
400
+ export function binarySearchObjectId(entries, objectId, start, end) {
401
+ let lo = start;
402
+ let hi = end;
403
+ while (lo < hi) {
404
+ const mid = (lo + hi) >>> 1;
405
+ const cmp = getEntryObjectId(entries[mid]).localeCompare(objectId);
406
+ if (cmp < 0) {
407
+ lo = mid + 1;
408
+ }
409
+ else if (cmp > 0) {
410
+ hi = mid;
411
+ }
412
+ else {
413
+ return mid;
414
+ }
415
+ }
416
+ return -1;
417
+ }
418
+ // Alias for backwards compatibility
419
+ export const binarySearchSha = binarySearchObjectId;
420
+ /**
421
+ * Serialize a pack index to binary format
422
+ *
423
+ * @param index - The pack index to serialize
424
+ * @returns Raw bytes of the .idx file
425
+ */
426
+ export function serializePackIndex(index) {
427
+ const { fanout, entries, packChecksum } = index;
428
+ const objectCount = entries.length;
429
+ // Count large offsets (>= LARGE_OFFSET_THRESHOLD)
430
+ let largeOffsetCount = 0;
431
+ for (const entry of entries) {
432
+ if (entry.offset >= LARGE_OFFSET_THRESHOLD) {
433
+ largeOffsetCount++;
434
+ }
435
+ }
436
+ // Calculate total size:
437
+ // header: 8 bytes (magic + version)
438
+ // fanout: 256 * 4 = 1024 bytes
439
+ // SHA list: objectCount * 20 bytes
440
+ // CRC32 list: objectCount * 4 bytes
441
+ // Offset list: objectCount * 4 bytes
442
+ // Large offsets: largeOffsetCount * 8 bytes
443
+ // Pack checksum: 20 bytes
444
+ // Index checksum: 20 bytes
445
+ const totalSize = 8 + 256 * 4 + objectCount * 20 + objectCount * 4 + objectCount * 4 + largeOffsetCount * 8 + 40;
446
+ const data = new Uint8Array(totalSize);
447
+ const view = new DataView(data.buffer);
448
+ let offset = 0;
449
+ // Write magic number (big-endian)
450
+ view.setUint32(offset, PACK_INDEX_MAGIC, false);
451
+ offset += 4;
452
+ // Write version (big-endian)
453
+ view.setUint32(offset, PACK_INDEX_VERSION, false);
454
+ offset += 4;
455
+ // Write fanout table (big-endian)
456
+ for (let i = 0; i < 256; i++) {
457
+ view.setUint32(offset, fanout[i], false);
458
+ offset += 4;
459
+ }
460
+ // Write SHA-1 object IDs (sorted)
461
+ for (const entry of entries) {
462
+ const shaBytes = hexToBytes(getEntryObjectId(entry));
463
+ data.set(shaBytes, offset);
464
+ offset += 20;
465
+ }
466
+ // Write CRC32 values (big-endian)
467
+ for (const entry of entries) {
468
+ view.setUint32(offset, entry.crc32, false);
469
+ offset += 4;
470
+ }
471
+ // Write 4-byte offsets (big-endian)
472
+ // For large offsets, write MSB set + index into large offset table
473
+ let largeOffsetIndex = 0;
474
+ const largeOffsetValues = [];
475
+ for (const entry of entries) {
476
+ if (entry.offset >= LARGE_OFFSET_THRESHOLD) {
477
+ // Large offset: MSB set + index into large offset table
478
+ view.setUint32(offset, 0x80000000 | largeOffsetIndex, false);
479
+ largeOffsetValues.push(entry.offset);
480
+ largeOffsetIndex++;
481
+ }
482
+ else {
483
+ // Small offset: just the 4-byte value
484
+ view.setUint32(offset, entry.offset, false);
485
+ }
486
+ offset += 4;
487
+ }
488
+ // Write 8-byte large offsets (big-endian)
489
+ for (const largeOffset of largeOffsetValues) {
490
+ // Write as 64-bit big-endian
491
+ const highBits = Math.floor(largeOffset / 0x100000000);
492
+ const lowBits = largeOffset % 0x100000000;
493
+ view.setUint32(offset, highBits, false);
494
+ view.setUint32(offset + 4, lowBits, false);
495
+ offset += 8;
496
+ }
497
+ // Write pack checksum
498
+ data.set(packChecksum, offset);
499
+ offset += 20;
500
+ // Compute and write index checksum (SHA-1 of everything before it)
501
+ const dataToHash = data.subarray(0, offset);
502
+ const indexChecksum = sha1(dataToHash);
503
+ data.set(indexChecksum, offset);
504
+ return data;
505
+ }
506
+ /**
507
+ * Parse the fanout table from pack index data
508
+ *
509
+ * @param data - Raw bytes starting at fanout table
510
+ * @returns Parsed fanout table (256 entries)
511
+ */
512
+ export function parseFanoutTable(data) {
513
+ const fanout = new Uint32Array(256);
514
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
515
+ for (let i = 0; i < 256; i++) {
516
+ fanout[i] = view.getUint32(i * 4, false); // big-endian
517
+ }
518
+ return fanout;
519
+ }
520
+ /**
521
+ * Read a 4-byte big-endian offset from pack index
522
+ *
523
+ * If the MSB is set, it's an index into the large offset table.
524
+ *
525
+ * @param data - Raw bytes at offset position
526
+ * @param largeOffsets - Large offset table (for >2GB offsets)
527
+ * @returns The actual offset value
528
+ */
529
+ export function readPackOffset(data, largeOffsets) {
530
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
531
+ const value = view.getUint32(0, false); // big-endian
532
+ // Check if MSB is set (large offset indicator)
533
+ if (value & 0x80000000) {
534
+ // Lower 31 bits are the index into the large offset table
535
+ const index = value & 0x7fffffff;
536
+ if (!largeOffsets) {
537
+ throw new Error('Large offset table missing but required');
538
+ }
539
+ // Each large offset is 8 bytes
540
+ const largeOffsetByteIndex = index * 8;
541
+ if (largeOffsetByteIndex + 8 > largeOffsets.length) {
542
+ throw new Error(`Large offset index ${index} out of bounds`);
543
+ }
544
+ const largeView = new DataView(largeOffsets.buffer, largeOffsets.byteOffset, largeOffsets.byteLength);
545
+ // Read 64-bit big-endian offset as a JavaScript number
546
+ const highBits = largeView.getUint32(largeOffsetByteIndex, false);
547
+ const lowBits = largeView.getUint32(largeOffsetByteIndex + 4, false);
548
+ return highBits * 0x100000000 + lowBits;
549
+ }
550
+ return value;
551
+ }
552
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pack/index.ts"],"names":[],"mappings":"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"}