gitx.do 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +156 -0
- package/dist/durable-object/object-store.d.ts +113 -0
- package/dist/durable-object/object-store.d.ts.map +1 -0
- package/dist/durable-object/object-store.js +387 -0
- package/dist/durable-object/object-store.js.map +1 -0
- package/dist/durable-object/schema.d.ts +17 -0
- package/dist/durable-object/schema.d.ts.map +1 -0
- package/dist/durable-object/schema.js +43 -0
- package/dist/durable-object/schema.js.map +1 -0
- package/dist/durable-object/wal.d.ts +111 -0
- package/dist/durable-object/wal.d.ts.map +1 -0
- package/dist/durable-object/wal.js +200 -0
- package/dist/durable-object/wal.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/adapter.d.ts +231 -0
- package/dist/mcp/adapter.d.ts.map +1 -0
- package/dist/mcp/adapter.js +502 -0
- package/dist/mcp/adapter.js.map +1 -0
- package/dist/mcp/sandbox.d.ts +261 -0
- package/dist/mcp/sandbox.d.ts.map +1 -0
- package/dist/mcp/sandbox.js +983 -0
- package/dist/mcp/sandbox.js.map +1 -0
- package/dist/mcp/sdk-adapter.d.ts +413 -0
- package/dist/mcp/sdk-adapter.d.ts.map +1 -0
- package/dist/mcp/sdk-adapter.js +672 -0
- package/dist/mcp/sdk-adapter.js.map +1 -0
- package/dist/mcp/tools.d.ts +133 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +1604 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/ops/blame.d.ts +148 -0
- package/dist/ops/blame.d.ts.map +1 -0
- package/dist/ops/blame.js +754 -0
- package/dist/ops/blame.js.map +1 -0
- package/dist/ops/branch.d.ts +215 -0
- package/dist/ops/branch.d.ts.map +1 -0
- package/dist/ops/branch.js +608 -0
- package/dist/ops/branch.js.map +1 -0
- package/dist/ops/commit-traversal.d.ts +209 -0
- package/dist/ops/commit-traversal.d.ts.map +1 -0
- package/dist/ops/commit-traversal.js +755 -0
- package/dist/ops/commit-traversal.js.map +1 -0
- package/dist/ops/commit.d.ts +221 -0
- package/dist/ops/commit.d.ts.map +1 -0
- package/dist/ops/commit.js +606 -0
- package/dist/ops/commit.js.map +1 -0
- package/dist/ops/merge-base.d.ts +223 -0
- package/dist/ops/merge-base.d.ts.map +1 -0
- package/dist/ops/merge-base.js +581 -0
- package/dist/ops/merge-base.js.map +1 -0
- package/dist/ops/merge.d.ts +385 -0
- package/dist/ops/merge.d.ts.map +1 -0
- package/dist/ops/merge.js +1203 -0
- package/dist/ops/merge.js.map +1 -0
- package/dist/ops/tag.d.ts +182 -0
- package/dist/ops/tag.d.ts.map +1 -0
- package/dist/ops/tag.js +608 -0
- package/dist/ops/tag.js.map +1 -0
- package/dist/ops/tree-builder.d.ts +82 -0
- package/dist/ops/tree-builder.d.ts.map +1 -0
- package/dist/ops/tree-builder.js +246 -0
- package/dist/ops/tree-builder.js.map +1 -0
- package/dist/ops/tree-diff.d.ts +243 -0
- package/dist/ops/tree-diff.d.ts.map +1 -0
- package/dist/ops/tree-diff.js +657 -0
- package/dist/ops/tree-diff.js.map +1 -0
- package/dist/pack/delta.d.ts +68 -0
- package/dist/pack/delta.d.ts.map +1 -0
- package/dist/pack/delta.js +343 -0
- package/dist/pack/delta.js.map +1 -0
- package/dist/pack/format.d.ts +84 -0
- package/dist/pack/format.d.ts.map +1 -0
- package/dist/pack/format.js +261 -0
- package/dist/pack/format.js.map +1 -0
- package/dist/pack/full-generation.d.ts +327 -0
- package/dist/pack/full-generation.d.ts.map +1 -0
- package/dist/pack/full-generation.js +1159 -0
- package/dist/pack/full-generation.js.map +1 -0
- package/dist/pack/generation.d.ts +118 -0
- package/dist/pack/generation.d.ts.map +1 -0
- package/dist/pack/generation.js +459 -0
- package/dist/pack/generation.js.map +1 -0
- package/dist/pack/index.d.ts +181 -0
- package/dist/pack/index.d.ts.map +1 -0
- package/dist/pack/index.js +552 -0
- package/dist/pack/index.js.map +1 -0
- package/dist/refs/branch.d.ts +224 -0
- package/dist/refs/branch.d.ts.map +1 -0
- package/dist/refs/branch.js +170 -0
- package/dist/refs/branch.js.map +1 -0
- package/dist/refs/storage.d.ts +208 -0
- package/dist/refs/storage.d.ts.map +1 -0
- package/dist/refs/storage.js +421 -0
- package/dist/refs/storage.js.map +1 -0
- package/dist/refs/tag.d.ts +230 -0
- package/dist/refs/tag.d.ts.map +1 -0
- package/dist/refs/tag.js +188 -0
- package/dist/refs/tag.js.map +1 -0
- package/dist/storage/lru-cache.d.ts +188 -0
- package/dist/storage/lru-cache.d.ts.map +1 -0
- package/dist/storage/lru-cache.js +410 -0
- package/dist/storage/lru-cache.js.map +1 -0
- package/dist/storage/object-index.d.ts +140 -0
- package/dist/storage/object-index.d.ts.map +1 -0
- package/dist/storage/object-index.js +166 -0
- package/dist/storage/object-index.js.map +1 -0
- package/dist/storage/r2-pack.d.ts +394 -0
- package/dist/storage/r2-pack.d.ts.map +1 -0
- package/dist/storage/r2-pack.js +1062 -0
- package/dist/storage/r2-pack.js.map +1 -0
- package/dist/tiered/cdc-pipeline.d.ts +316 -0
- package/dist/tiered/cdc-pipeline.d.ts.map +1 -0
- package/dist/tiered/cdc-pipeline.js +771 -0
- package/dist/tiered/cdc-pipeline.js.map +1 -0
- package/dist/tiered/migration.d.ts +242 -0
- package/dist/tiered/migration.d.ts.map +1 -0
- package/dist/tiered/migration.js +592 -0
- package/dist/tiered/migration.js.map +1 -0
- package/dist/tiered/parquet-writer.d.ts +248 -0
- package/dist/tiered/parquet-writer.d.ts.map +1 -0
- package/dist/tiered/parquet-writer.js +555 -0
- package/dist/tiered/parquet-writer.js.map +1 -0
- package/dist/tiered/read-path.d.ts +141 -0
- package/dist/tiered/read-path.d.ts.map +1 -0
- package/dist/tiered/read-path.js +204 -0
- package/dist/tiered/read-path.js.map +1 -0
- package/dist/types/objects.d.ts +53 -0
- package/dist/types/objects.d.ts.map +1 -0
- package/dist/types/objects.js +291 -0
- package/dist/types/objects.js.map +1 -0
- package/dist/types/storage.d.ts +117 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/storage.js +8 -0
- package/dist/types/storage.js.map +1 -0
- package/dist/utils/hash.d.ts +31 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +60 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/sha1.d.ts +26 -0
- package/dist/utils/sha1.d.ts.map +1 -0
- package/dist/utils/sha1.js +127 -0
- package/dist/utils/sha1.js.map +1 -0
- package/dist/wire/capabilities.d.ts +236 -0
- package/dist/wire/capabilities.d.ts.map +1 -0
- package/dist/wire/capabilities.js +437 -0
- package/dist/wire/capabilities.js.map +1 -0
- package/dist/wire/pkt-line.d.ts +67 -0
- package/dist/wire/pkt-line.d.ts.map +1 -0
- package/dist/wire/pkt-line.js +145 -0
- package/dist/wire/pkt-line.js.map +1 -0
- package/dist/wire/receive-pack.d.ts +302 -0
- package/dist/wire/receive-pack.d.ts.map +1 -0
- package/dist/wire/receive-pack.js +885 -0
- package/dist/wire/receive-pack.js.map +1 -0
- package/dist/wire/smart-http.d.ts +321 -0
- package/dist/wire/smart-http.d.ts.map +1 -0
- package/dist/wire/smart-http.js +654 -0
- package/dist/wire/smart-http.js.map +1 -0
- package/dist/wire/upload-pack.d.ts +333 -0
- package/dist/wire/upload-pack.d.ts.map +1 -0
- package/dist/wire/upload-pack.js +850 -0
- package/dist/wire/upload-pack.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,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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"}
|