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,654 @@
1
+ /**
2
+ * Git Smart HTTP Protocol Implementation
3
+ *
4
+ * Implements the Git Smart HTTP protocol for server-side handling of:
5
+ * - Fetch discovery (GET /info/refs?service=git-upload-pack)
6
+ * - Push discovery (GET /info/refs?service=git-receive-pack)
7
+ * - Fetch data transfer (POST /git-upload-pack)
8
+ * - Push data transfer (POST /git-receive-pack)
9
+ *
10
+ * Reference: https://git-scm.com/docs/http-protocol
11
+ */
12
+ import { encodePktLine, pktLineStream, FLUSH_PKT } from './pkt-line';
13
+ /**
14
+ * Content-Type for git-upload-pack advertisement
15
+ */
16
+ export const CONTENT_TYPE_UPLOAD_PACK_ADVERTISEMENT = 'application/x-git-upload-pack-advertisement';
17
+ /**
18
+ * Content-Type for git-receive-pack advertisement
19
+ */
20
+ export const CONTENT_TYPE_RECEIVE_PACK_ADVERTISEMENT = 'application/x-git-receive-pack-advertisement';
21
+ /**
22
+ * Content-Type for git-upload-pack request
23
+ */
24
+ export const CONTENT_TYPE_UPLOAD_PACK_REQUEST = 'application/x-git-upload-pack-request';
25
+ /**
26
+ * Content-Type for git-upload-pack result
27
+ */
28
+ export const CONTENT_TYPE_UPLOAD_PACK_RESULT = 'application/x-git-upload-pack-result';
29
+ /**
30
+ * Content-Type for git-receive-pack request
31
+ */
32
+ export const CONTENT_TYPE_RECEIVE_PACK_REQUEST = 'application/x-git-receive-pack-request';
33
+ /**
34
+ * Content-Type for git-receive-pack result
35
+ */
36
+ export const CONTENT_TYPE_RECEIVE_PACK_RESULT = 'application/x-git-receive-pack-result';
37
+ /**
38
+ * Zero SHA constant used for ref creation/deletion
39
+ */
40
+ export const ZERO_SHA = '0000000000000000000000000000000000000000';
41
+ const encoder = new TextEncoder();
42
+ const decoder = new TextDecoder();
43
+ /**
44
+ * Get HTTP status text from status code
45
+ */
46
+ function getStatusText(statusCode) {
47
+ const statusTexts = {
48
+ 200: 'OK',
49
+ 400: 'Bad Request',
50
+ 401: 'Unauthorized',
51
+ 403: 'Forbidden',
52
+ 404: 'Not Found',
53
+ 415: 'Unsupported Media Type',
54
+ 500: 'Internal Server Error',
55
+ };
56
+ return statusTexts[statusCode] || 'Unknown';
57
+ }
58
+ /**
59
+ * Check if a string is a valid SHA-1 hex string (40 characters)
60
+ */
61
+ function isValidSha(sha) {
62
+ return /^[0-9a-f]{40}$/i.test(sha);
63
+ }
64
+ /**
65
+ * Handle GET /info/refs requests for ref discovery.
66
+ *
67
+ * This endpoint is called by git clients to discover refs and capabilities
68
+ * before performing fetch or push operations.
69
+ *
70
+ * @param request - The incoming HTTP request
71
+ * @param repository - Repository provider for fetching refs
72
+ * @param capabilities - Server capabilities to advertise
73
+ * @returns HTTP response with ref advertisement
74
+ * @throws SmartHTTPError for invalid requests or repository errors
75
+ */
76
+ export async function handleInfoRefs(request, repository, capabilities) {
77
+ // Check service parameter
78
+ const service = request.query.service;
79
+ if (!service) {
80
+ return createErrorResponse(400, 'Missing service parameter');
81
+ }
82
+ if (service !== 'git-upload-pack' && service !== 'git-receive-pack') {
83
+ return createErrorResponse(400, 'Invalid service parameter');
84
+ }
85
+ // Check if repository exists
86
+ const exists = await repository.exists();
87
+ if (!exists) {
88
+ return createErrorResponse(404, 'Repository not found');
89
+ }
90
+ // Check permission
91
+ const hasPermission = await repository.hasPermission(service);
92
+ if (!hasPermission) {
93
+ return createErrorResponse(403, 'Permission denied');
94
+ }
95
+ // Get refs
96
+ const refs = await repository.getRefs();
97
+ // Format response
98
+ const body = formatRefAdvertisement(service, refs, capabilities);
99
+ // Get content type
100
+ const contentType = service === 'git-upload-pack'
101
+ ? CONTENT_TYPE_UPLOAD_PACK_ADVERTISEMENT
102
+ : CONTENT_TYPE_RECEIVE_PACK_ADVERTISEMENT;
103
+ return {
104
+ status: 200,
105
+ statusText: 'OK',
106
+ headers: {
107
+ 'Content-Type': contentType,
108
+ 'Cache-Control': 'no-cache',
109
+ 'Pragma': 'no-cache',
110
+ },
111
+ body,
112
+ };
113
+ }
114
+ /**
115
+ * Handle POST /git-upload-pack requests for fetch data transfer.
116
+ *
117
+ * This endpoint receives the client's wants/haves and returns a packfile
118
+ * containing the requested objects.
119
+ *
120
+ * @param request - The incoming HTTP request with wants/haves
121
+ * @param repository - Repository provider for creating packfile
122
+ * @returns HTTP response with packfile data
123
+ * @throws SmartHTTPError for invalid requests or repository errors
124
+ */
125
+ export async function handleUploadPack(request, repository) {
126
+ // Check content type
127
+ const contentType = request.headers['Content-Type'];
128
+ if (!validateContentType(contentType, CONTENT_TYPE_UPLOAD_PACK_REQUEST)) {
129
+ return createErrorResponse(415, 'Invalid content type');
130
+ }
131
+ // Check body
132
+ if (!request.body) {
133
+ return createErrorResponse(400, 'Missing request body');
134
+ }
135
+ // Check permission
136
+ const hasPermission = await repository.hasPermission('git-upload-pack');
137
+ if (!hasPermission) {
138
+ return createErrorResponse(403, 'Permission denied');
139
+ }
140
+ // Parse request
141
+ let parsed;
142
+ try {
143
+ parsed = parseUploadPackRequest(request.body);
144
+ }
145
+ catch (e) {
146
+ return createErrorResponse(400, 'Malformed request');
147
+ }
148
+ // Validate SHA format
149
+ for (const want of parsed.wants) {
150
+ if (!isValidSha(want)) {
151
+ return createErrorResponse(400, 'Invalid SHA format in want');
152
+ }
153
+ }
154
+ for (const have of parsed.haves) {
155
+ if (!isValidSha(have)) {
156
+ return createErrorResponse(400, 'Invalid SHA format in have');
157
+ }
158
+ }
159
+ // Check for side-band capability
160
+ const useSideBand = parsed.capabilities.includes('side-band-64k') || parsed.capabilities.includes('side-band');
161
+ // Get packfile from repository
162
+ const packData = await repository.uploadPack(parsed.wants, parsed.haves, parsed.capabilities);
163
+ // Format response (with ACK if there are haves, NAK otherwise)
164
+ const hasCommonObjects = parsed.haves.length > 0;
165
+ const body = formatUploadPackResponse(packData, useSideBand, hasCommonObjects, parsed.haves);
166
+ return {
167
+ status: 200,
168
+ statusText: 'OK',
169
+ headers: {
170
+ 'Content-Type': CONTENT_TYPE_UPLOAD_PACK_RESULT,
171
+ },
172
+ body,
173
+ };
174
+ }
175
+ /**
176
+ * Handle POST /git-receive-pack requests for push data transfer.
177
+ *
178
+ * This endpoint receives ref update commands and a packfile from the client,
179
+ * updates refs accordingly, and returns a status report.
180
+ *
181
+ * @param request - The incoming HTTP request with commands and packfile
182
+ * @param repository - Repository provider for processing push
183
+ * @returns HTTP response with status report
184
+ * @throws SmartHTTPError for invalid requests or repository errors
185
+ */
186
+ export async function handleReceivePack(request, repository) {
187
+ // Check content type
188
+ const contentType = request.headers['Content-Type'];
189
+ if (!validateContentType(contentType, CONTENT_TYPE_RECEIVE_PACK_REQUEST)) {
190
+ return createErrorResponse(415, 'Invalid content type');
191
+ }
192
+ // Check body
193
+ if (!request.body) {
194
+ return createErrorResponse(400, 'Missing request body');
195
+ }
196
+ // Check permission
197
+ const hasPermission = await repository.hasPermission('git-receive-pack');
198
+ if (!hasPermission) {
199
+ return createErrorResponse(403, 'Permission denied');
200
+ }
201
+ // Parse request
202
+ let parsed;
203
+ try {
204
+ parsed = parseReceivePackRequest(request.body);
205
+ }
206
+ catch (e) {
207
+ return createErrorResponse(400, 'Malformed request');
208
+ }
209
+ // Validate SHA format in commands
210
+ for (const cmd of parsed.commands) {
211
+ if (!isValidSha(cmd.oldSha) || !isValidSha(cmd.newSha)) {
212
+ return createErrorResponse(400, 'Invalid SHA format in command');
213
+ }
214
+ }
215
+ // Process the push
216
+ const result = await repository.receivePack(parsed.packfile, parsed.commands);
217
+ // Format response
218
+ const body = formatReceivePackResponse(result);
219
+ return {
220
+ status: 200,
221
+ statusText: 'OK',
222
+ headers: {
223
+ 'Content-Type': CONTENT_TYPE_RECEIVE_PACK_RESULT,
224
+ },
225
+ body,
226
+ };
227
+ }
228
+ /**
229
+ * Format ref advertisement for info/refs response.
230
+ *
231
+ * Creates pkt-line formatted ref advertisement including:
232
+ * - Service header
233
+ * - Capability advertisement on first ref
234
+ * - All refs with their SHAs
235
+ * - Flush packet
236
+ *
237
+ * @param service - The git service (git-upload-pack or git-receive-pack)
238
+ * @param refs - Array of refs to advertise
239
+ * @param capabilities - Server capabilities to include
240
+ * @returns Formatted ref advertisement as Uint8Array
241
+ */
242
+ export function formatRefAdvertisement(service, refs, capabilities) {
243
+ let output = '';
244
+ // Service announcement
245
+ output += encodePktLine(`# service=${service}\n`);
246
+ output += FLUSH_PKT;
247
+ // Capabilities string
248
+ const capStrings = capabilities ? capabilitiesToStrings(capabilities) : [];
249
+ const capLine = capStrings.length > 0 ? capStrings.join(' ') : '';
250
+ if (refs.length === 0) {
251
+ // Empty repo - send capabilities with zero SHA
252
+ if (capLine) {
253
+ output += encodePktLine(`${ZERO_SHA} capabilities^{}\x00${capLine}\n`);
254
+ }
255
+ else {
256
+ output += encodePktLine(`${ZERO_SHA} capabilities^{}\n`);
257
+ }
258
+ }
259
+ else {
260
+ // First ref includes capabilities
261
+ const firstRef = refs[0];
262
+ if (capLine) {
263
+ output += encodePktLine(`${firstRef.sha} ${firstRef.name}\x00${capLine}\n`);
264
+ }
265
+ else {
266
+ output += encodePktLine(`${firstRef.sha} ${firstRef.name}\n`);
267
+ }
268
+ // Remaining refs
269
+ for (let i = 1; i < refs.length; i++) {
270
+ const ref = refs[i];
271
+ output += encodePktLine(`${ref.sha} ${ref.name}\n`);
272
+ }
273
+ // Add peeled refs for annotated tags
274
+ for (const ref of refs) {
275
+ if (ref.peeled) {
276
+ output += encodePktLine(`${ref.peeled} ${ref.name}^{}\n`);
277
+ }
278
+ }
279
+ }
280
+ output += FLUSH_PKT;
281
+ return encoder.encode(output);
282
+ }
283
+ /**
284
+ * Parse upload-pack request body.
285
+ *
286
+ * Extracts wants, haves, and capabilities from the pkt-line formatted
287
+ * request body sent by git fetch.
288
+ *
289
+ * @param body - Request body as Uint8Array
290
+ * @returns Parsed wants, haves, and capabilities
291
+ */
292
+ export function parseUploadPackRequest(body) {
293
+ const text = decoder.decode(body);
294
+ // Check if the input starts with a valid pkt-line format
295
+ // Valid pkt-lines start with 4 hex characters (length) or special packets (0000, 0001)
296
+ if (text.length >= 4) {
297
+ const hexPrefix = text.slice(0, 4);
298
+ const length = parseInt(hexPrefix, 16);
299
+ // If the first 4 chars are not valid hex (NaN) and not a special packet, it's malformed
300
+ if (isNaN(length) && hexPrefix !== '0000' && hexPrefix !== '0001') {
301
+ throw new Error('Malformed pkt-line: invalid length prefix');
302
+ }
303
+ }
304
+ const { packets } = pktLineStream(text);
305
+ const wants = [];
306
+ const haves = [];
307
+ let capabilities = [];
308
+ let done = false;
309
+ let firstWant = true;
310
+ for (const packet of packets) {
311
+ if (packet.type === 'flush' || packet.type === 'delim') {
312
+ continue;
313
+ }
314
+ if (!packet.data)
315
+ continue;
316
+ const line = packet.data.trim();
317
+ if (line === 'done') {
318
+ done = true;
319
+ continue;
320
+ }
321
+ if (line.startsWith('want ')) {
322
+ const rest = line.slice(5);
323
+ // First want line may contain capabilities after SHA
324
+ const parts = rest.split(' ');
325
+ const sha = parts[0];
326
+ wants.push(sha);
327
+ if (firstWant && parts.length > 1) {
328
+ capabilities = parts.slice(1);
329
+ firstWant = false;
330
+ }
331
+ }
332
+ else if (line.startsWith('have ')) {
333
+ const sha = line.slice(5).trim();
334
+ haves.push(sha);
335
+ }
336
+ else if (line.startsWith('deepen ') || line.startsWith('deepen-since ') || line.startsWith('filter ')) {
337
+ // Handle shallow/filter commands - just skip them for now
338
+ continue;
339
+ }
340
+ }
341
+ return { wants, haves, capabilities, done };
342
+ }
343
+ /**
344
+ * Parse receive-pack request body.
345
+ *
346
+ * Extracts ref update commands, capabilities, and packfile data from
347
+ * the request body sent by git push.
348
+ *
349
+ * @param body - Request body as Uint8Array
350
+ * @returns Parsed commands, capabilities, and packfile
351
+ */
352
+ export function parseReceivePackRequest(body) {
353
+ const text = decoder.decode(body);
354
+ const commands = [];
355
+ let capabilities = [];
356
+ let firstCommand = true;
357
+ // Parse pkt-lines manually to track byte offset for packfile extraction
358
+ let offset = 0;
359
+ let flushOffset = -1;
360
+ while (offset < text.length) {
361
+ // Need at least 4 bytes for length prefix
362
+ if (offset + 4 > text.length) {
363
+ throw new Error('Malformed pkt-line: incomplete length prefix');
364
+ }
365
+ const hexLength = text.slice(offset, offset + 4);
366
+ // Check for flush packet
367
+ if (hexLength === FLUSH_PKT) {
368
+ flushOffset = offset + 4;
369
+ break;
370
+ }
371
+ // Validate hex length
372
+ const length = parseInt(hexLength, 16);
373
+ if (isNaN(length) || length < 4) {
374
+ throw new Error('Malformed pkt-line: invalid length');
375
+ }
376
+ // Check if we have enough data
377
+ if (offset + length > text.length) {
378
+ throw new Error('Malformed pkt-line: incomplete packet');
379
+ }
380
+ // Extract packet data
381
+ let line = text.slice(offset + 4, offset + length);
382
+ offset += length;
383
+ // Remove trailing newline
384
+ if (line.endsWith('\n')) {
385
+ line = line.slice(0, -1);
386
+ }
387
+ // First command may have capabilities after NUL byte
388
+ let cmdLine = line;
389
+ if (firstCommand && line.includes('\x00')) {
390
+ const nullIndex = line.indexOf('\x00');
391
+ cmdLine = line.slice(0, nullIndex);
392
+ const capPart = line.slice(nullIndex + 1);
393
+ capabilities = capPart.split(' ').filter(c => c.length > 0);
394
+ firstCommand = false;
395
+ }
396
+ // Parse command: oldSha newSha refName
397
+ const parts = cmdLine.split(' ');
398
+ if (parts.length >= 3) {
399
+ commands.push({
400
+ oldSha: parts[0],
401
+ newSha: parts[1],
402
+ refName: parts.slice(2).join(' '),
403
+ });
404
+ }
405
+ }
406
+ // Extract packfile data after flush packet
407
+ let packfile = new Uint8Array(0);
408
+ if (flushOffset !== -1 && flushOffset < body.length) {
409
+ packfile = body.slice(flushOffset);
410
+ }
411
+ return { commands, capabilities, packfile };
412
+ }
413
+ /**
414
+ * Format upload-pack response.
415
+ *
416
+ * Creates the response body for git-upload-pack POST request,
417
+ * including NAK/ACK responses and packfile data with optional sideband.
418
+ *
419
+ * @param packData - The packfile data to send
420
+ * @param useSideBand - Whether to use side-band encoding
421
+ * @param hasCommonObjects - Whether there are common objects (for ACK vs NAK)
422
+ * @param haves - The have SHAs from the client
423
+ * @returns Formatted response as Uint8Array
424
+ */
425
+ export function formatUploadPackResponse(packData, useSideBand, hasCommonObjects, haves) {
426
+ let output = '';
427
+ // Send ACK or NAK
428
+ if (hasCommonObjects && haves && haves.length > 0) {
429
+ // ACK the first have
430
+ output += encodePktLine(`ACK ${haves[0]}\n`);
431
+ }
432
+ else {
433
+ output += encodePktLine('NAK\n');
434
+ }
435
+ if (useSideBand) {
436
+ // Side-band format: data on channel 1, progress on channel 2, error on channel 3
437
+ // Each sideband packet: length (4 hex) + channel byte + data
438
+ const channel1 = new Uint8Array(1 + packData.length);
439
+ channel1[0] = 1; // Channel 1 for pack data
440
+ channel1.set(packData, 1);
441
+ // Encode as pkt-line
442
+ const pktLine = encodePktLine(channel1);
443
+ if (typeof pktLine === 'string') {
444
+ output += pktLine;
445
+ }
446
+ else {
447
+ // Binary data - need to handle differently
448
+ const headerBytes = encoder.encode(output);
449
+ const result = new Uint8Array(headerBytes.length + pktLine.length + 4);
450
+ result.set(headerBytes, 0);
451
+ result.set(pktLine, headerBytes.length);
452
+ result.set(encoder.encode(FLUSH_PKT), headerBytes.length + pktLine.length);
453
+ return result;
454
+ }
455
+ }
456
+ else {
457
+ // No side-band - include pack data directly
458
+ // Pack data is binary, so encode it as pkt-line
459
+ const pktLine = encodePktLine(packData);
460
+ if (typeof pktLine === 'string') {
461
+ output += pktLine;
462
+ }
463
+ else {
464
+ const headerBytes = encoder.encode(output);
465
+ const result = new Uint8Array(headerBytes.length + pktLine.length + 4);
466
+ result.set(headerBytes, 0);
467
+ result.set(pktLine, headerBytes.length);
468
+ result.set(encoder.encode(FLUSH_PKT), headerBytes.length + pktLine.length);
469
+ return result;
470
+ }
471
+ }
472
+ output += FLUSH_PKT;
473
+ return encoder.encode(output);
474
+ }
475
+ /**
476
+ * Format receive-pack response.
477
+ *
478
+ * Creates the response body for git-receive-pack POST request,
479
+ * including unpack status and ref update results.
480
+ *
481
+ * @param result - Result of the receive-pack operation
482
+ * @returns Formatted response as Uint8Array
483
+ */
484
+ export function formatReceivePackResponse(result) {
485
+ let output = '';
486
+ // Unpack status
487
+ if (result.success) {
488
+ output += encodePktLine('unpack ok\n');
489
+ }
490
+ else {
491
+ output += encodePktLine('unpack error\n');
492
+ }
493
+ // Ref results
494
+ for (const refResult of result.refResults) {
495
+ if (refResult.success) {
496
+ output += encodePktLine(`ok ${refResult.refName}\n`);
497
+ }
498
+ else {
499
+ const error = refResult.error || 'failed';
500
+ output += encodePktLine(`ng ${refResult.refName} ${error}\n`);
501
+ }
502
+ }
503
+ output += FLUSH_PKT;
504
+ return encoder.encode(output);
505
+ }
506
+ /**
507
+ * Convert ServerCapabilities to capability string list.
508
+ *
509
+ * @param capabilities - Server capabilities object
510
+ * @returns Array of capability strings
511
+ */
512
+ export function capabilitiesToStrings(capabilities) {
513
+ const result = [];
514
+ if (capabilities.multiAck)
515
+ result.push('multi_ack');
516
+ if (capabilities.multiAckDetailed)
517
+ result.push('multi_ack_detailed');
518
+ if (capabilities.thinPack)
519
+ result.push('thin-pack');
520
+ if (capabilities.sideBand)
521
+ result.push('side-band');
522
+ if (capabilities.sideBand64k)
523
+ result.push('side-band-64k');
524
+ if (capabilities.ofsDelta)
525
+ result.push('ofs-delta');
526
+ if (capabilities.shallow)
527
+ result.push('shallow');
528
+ if (capabilities.deepenSince)
529
+ result.push('deepen-since');
530
+ if (capabilities.deepenNot)
531
+ result.push('deepen-not');
532
+ if (capabilities.deepenRelative)
533
+ result.push('deepen-relative');
534
+ if (capabilities.noProgress)
535
+ result.push('no-progress');
536
+ if (capabilities.includeTag)
537
+ result.push('include-tag');
538
+ if (capabilities.reportStatus)
539
+ result.push('report-status');
540
+ if (capabilities.reportStatusV2)
541
+ result.push('report-status-v2');
542
+ if (capabilities.deleteRefs)
543
+ result.push('delete-refs');
544
+ if (capabilities.quiet)
545
+ result.push('quiet');
546
+ if (capabilities.atomic)
547
+ result.push('atomic');
548
+ if (capabilities.pushOptions)
549
+ result.push('push-options');
550
+ if (capabilities.allowTipSha1InWant)
551
+ result.push('allow-tip-sha1-in-want');
552
+ if (capabilities.allowReachableSha1InWant)
553
+ result.push('allow-reachable-sha1-in-want');
554
+ if (capabilities.filter)
555
+ result.push('filter');
556
+ if (capabilities.agent)
557
+ result.push(`agent=${capabilities.agent}`);
558
+ if (capabilities.objectFormat)
559
+ result.push(`object-format=${capabilities.objectFormat}`);
560
+ return result;
561
+ }
562
+ /**
563
+ * Parse capability strings into ServerCapabilities object.
564
+ *
565
+ * @param capStrings - Array of capability strings
566
+ * @returns Parsed capabilities object
567
+ */
568
+ export function parseCapabilities(capStrings) {
569
+ const result = {};
570
+ for (const cap of capStrings) {
571
+ if (cap === 'multi_ack')
572
+ result.multiAck = true;
573
+ else if (cap === 'multi_ack_detailed')
574
+ result.multiAckDetailed = true;
575
+ else if (cap === 'thin-pack')
576
+ result.thinPack = true;
577
+ else if (cap === 'side-band')
578
+ result.sideBand = true;
579
+ else if (cap === 'side-band-64k')
580
+ result.sideBand64k = true;
581
+ else if (cap === 'ofs-delta')
582
+ result.ofsDelta = true;
583
+ else if (cap === 'shallow')
584
+ result.shallow = true;
585
+ else if (cap === 'deepen-since')
586
+ result.deepenSince = true;
587
+ else if (cap === 'deepen-not')
588
+ result.deepenNot = true;
589
+ else if (cap === 'deepen-relative')
590
+ result.deepenRelative = true;
591
+ else if (cap === 'no-progress')
592
+ result.noProgress = true;
593
+ else if (cap === 'include-tag')
594
+ result.includeTag = true;
595
+ else if (cap === 'report-status')
596
+ result.reportStatus = true;
597
+ else if (cap === 'report-status-v2')
598
+ result.reportStatusV2 = true;
599
+ else if (cap === 'delete-refs')
600
+ result.deleteRefs = true;
601
+ else if (cap === 'quiet')
602
+ result.quiet = true;
603
+ else if (cap === 'atomic')
604
+ result.atomic = true;
605
+ else if (cap === 'push-options')
606
+ result.pushOptions = true;
607
+ else if (cap === 'allow-tip-sha1-in-want')
608
+ result.allowTipSha1InWant = true;
609
+ else if (cap === 'allow-reachable-sha1-in-want')
610
+ result.allowReachableSha1InWant = true;
611
+ else if (cap === 'filter')
612
+ result.filter = true;
613
+ else if (cap.startsWith('agent='))
614
+ result.agent = cap.slice(6);
615
+ else if (cap.startsWith('object-format='))
616
+ result.objectFormat = cap.slice(14);
617
+ // Unknown capabilities are ignored
618
+ }
619
+ return result;
620
+ }
621
+ /**
622
+ * Validate Content-Type header for a request.
623
+ *
624
+ * @param contentType - The Content-Type header value
625
+ * @param expectedType - The expected Content-Type
626
+ * @returns true if valid, false otherwise
627
+ */
628
+ export function validateContentType(contentType, expectedType) {
629
+ if (!contentType) {
630
+ return false;
631
+ }
632
+ // Normalize: lowercase and strip charset or other parameters
633
+ const normalized = contentType.toLowerCase().split(';')[0].trim();
634
+ const expected = expectedType.toLowerCase();
635
+ return normalized === expected;
636
+ }
637
+ /**
638
+ * Create an error response with appropriate status code and message.
639
+ *
640
+ * @param statusCode - HTTP status code
641
+ * @param message - Error message
642
+ * @returns SmartHTTPResponse with error
643
+ */
644
+ export function createErrorResponse(statusCode, message) {
645
+ return {
646
+ status: statusCode,
647
+ statusText: getStatusText(statusCode),
648
+ headers: {
649
+ 'Content-Type': 'text/plain',
650
+ },
651
+ body: encoder.encode(message),
652
+ };
653
+ }
654
+ //# sourceMappingURL=smart-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-http.js","sourceRoot":"","sources":["../../src/wire/smart-http.ts"],"names":[],"mappings":"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"}