@volter/browser-toolbelt 0.1.4 → 0.1.6
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/README.md +15 -0
- package/dist/browser-git-http.d.ts +28 -2
- package/dist/browser-git-http.d.ts.map +1 -1
- package/dist/browser-git-http.js +5 -1
- package/dist/browser-git-http.js.map +1 -1
- package/dist/browser-git-remote-https.d.ts +34 -0
- package/dist/browser-git-remote-https.d.ts.map +1 -0
- package/dist/browser-git-remote-https.js +619 -0
- package/dist/browser-git-remote-https.js.map +1 -0
- package/dist/browser-interactive-shell.d.ts +11 -0
- package/dist/browser-interactive-shell.d.ts.map +1 -0
- package/dist/browser-interactive-shell.js +211 -0
- package/dist/browser-interactive-shell.js.map +1 -0
- package/dist/browser-rm.d.ts +3 -0
- package/dist/browser-rm.d.ts.map +1 -0
- package/dist/browser-rm.js +61 -0
- package/dist/browser-rm.js.map +1 -0
- package/dist/browser-shell-filesystem.d.ts +1 -1
- package/dist/browser-shell-filesystem.d.ts.map +1 -1
- package/dist/browser-shell-filesystem.js +25 -7
- package/dist/browser-shell-filesystem.js.map +1 -1
- package/dist/browser-shell.d.ts +52 -3
- package/dist/browser-shell.d.ts.map +1 -1
- package/dist/browser-shell.js +387 -58
- package/dist/browser-shell.js.map +1 -1
- package/dist/github-device-auth.d.ts +23 -2
- package/dist/github-device-auth.d.ts.map +1 -1
- package/dist/github-device-auth.js +132 -17
- package/dist/github-device-auth.js.map +1 -1
- package/dist/github-web-sign-in.d.ts +24 -0
- package/dist/github-web-sign-in.d.ts.map +1 -0
- package/dist/github-web-sign-in.js +93 -0
- package/dist/github-web-sign-in.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +8 -3
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +37 -5
- package/dist/install.js.map +1 -1
- package/dist/shell-buffer-global.d.ts +2 -0
- package/dist/shell-buffer-global.d.ts.map +1 -0
- package/dist/shell-buffer-global.js +10 -0
- package/dist/shell-buffer-global.js.map +1 -0
- package/dist/volter-sign-in.d.ts +62 -0
- package/dist/volter-sign-in.d.ts.map +1 -0
- package/dist/volter-sign-in.js +255 -0
- package/dist/volter-sign-in.js.map +1 -0
- package/package.json +23 -11
- package/dist/browser-git-filesystem.d.ts +0 -18
- package/dist/browser-git-filesystem.d.ts.map +0 -1
- package/dist/browser-git-filesystem.js +0 -84
- package/dist/browser-git-filesystem.js.map +0 -1
- package/dist/browser-git.d.ts +0 -38
- package/dist/browser-git.d.ts.map +0 -1
- package/dist/browser-git.js +0 -514
- package/dist/browser-git.js.map +0 -1
|
@@ -0,0 +1,619 @@
|
|
|
1
|
+
const encoder = new TextEncoder();
|
|
2
|
+
const decoder = new TextDecoder();
|
|
3
|
+
const FLUSH = encoder.encode("0000");
|
|
4
|
+
const RESPONSE_END = encoder.encode("0002");
|
|
5
|
+
/** Git 2.55's remote-curl protocol at Git's documented remote-helper seam. */
|
|
6
|
+
export class BrowserGitRemoteHttps {
|
|
7
|
+
configuration;
|
|
8
|
+
run = (argv, options) => this.execute(argv, options);
|
|
9
|
+
constructor(configuration) {
|
|
10
|
+
this.configuration = configuration;
|
|
11
|
+
}
|
|
12
|
+
/** Transcribes remote-curl.c::cmd_main. */
|
|
13
|
+
async execute(argv, run) {
|
|
14
|
+
const stderr = [];
|
|
15
|
+
const writeBytes = (bytes) => {
|
|
16
|
+
if (run.onStdoutBytes)
|
|
17
|
+
run.onStdoutBytes(bytes);
|
|
18
|
+
else
|
|
19
|
+
run.onStdout?.(decoder.decode(bytes));
|
|
20
|
+
};
|
|
21
|
+
const write = (text) => writeBytes(encoder.encode(text));
|
|
22
|
+
const fail = (cause) => {
|
|
23
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
24
|
+
const line = `fatal: ${message}\n`;
|
|
25
|
+
stderr.push(line);
|
|
26
|
+
run.onStderr?.(line);
|
|
27
|
+
return { stdout: "", stderr: stderr.join(""), exitCode: 128 };
|
|
28
|
+
};
|
|
29
|
+
try {
|
|
30
|
+
if (argv.length < 2)
|
|
31
|
+
throw new Error("remote-curl: usage: git remote-curl <remote> [<url>]");
|
|
32
|
+
const remoteUrl = argv[2] ?? argv[1];
|
|
33
|
+
const url = remoteUrl.endsWith("/") ? remoteUrl : `${remoteUrl}/`;
|
|
34
|
+
const input = new AsyncByteReader(run.stdinStream ?? singleInput(run.stdin));
|
|
35
|
+
const state = {
|
|
36
|
+
verbosity: 1,
|
|
37
|
+
progress: run.terminal !== undefined,
|
|
38
|
+
deepenNot: [],
|
|
39
|
+
deepenRelative: false,
|
|
40
|
+
followtags: false,
|
|
41
|
+
dryRun: false,
|
|
42
|
+
checkConnectivity: false,
|
|
43
|
+
cloning: false,
|
|
44
|
+
updateShallow: false,
|
|
45
|
+
pushOptions: [],
|
|
46
|
+
fromPromisor: false,
|
|
47
|
+
noDependents: false,
|
|
48
|
+
objectFormat: false,
|
|
49
|
+
atomic: false,
|
|
50
|
+
};
|
|
51
|
+
let discovery;
|
|
52
|
+
const discover = async (service, forPush) => {
|
|
53
|
+
if (discovery?.service === service)
|
|
54
|
+
return discovery;
|
|
55
|
+
discovery = await this.discoverRefs(url, service, forPush);
|
|
56
|
+
return discovery;
|
|
57
|
+
};
|
|
58
|
+
for (;;) {
|
|
59
|
+
const line = await input.readLine();
|
|
60
|
+
if (line === undefined || line === "")
|
|
61
|
+
break;
|
|
62
|
+
if (line === "capabilities") {
|
|
63
|
+
write("stateless-connect\nfetch\noption\npush\n\n");
|
|
64
|
+
}
|
|
65
|
+
else if (line === "list" || line.startsWith("list ")) {
|
|
66
|
+
const found = await discover(line.includes("for-push") ? "git-receive-pack" : "git-upload-pack", line.includes("for-push"));
|
|
67
|
+
this.outputRefs(found.refs, write);
|
|
68
|
+
}
|
|
69
|
+
else if (line.startsWith("option ")) {
|
|
70
|
+
const option = line.slice(7);
|
|
71
|
+
const space = option.indexOf(" ");
|
|
72
|
+
const name = space < 0 ? option : option.slice(0, space);
|
|
73
|
+
const value = space < 0 ? "" : option.slice(space + 1);
|
|
74
|
+
const answer = this.setOption(state, name, value);
|
|
75
|
+
write(`${answer}\n`);
|
|
76
|
+
}
|
|
77
|
+
else if (line.startsWith("stateless-connect ")) {
|
|
78
|
+
await this.statelessConnect(url, line.slice(18), input, writeBytes, discover);
|
|
79
|
+
}
|
|
80
|
+
else if (line.startsWith("fetch ")) {
|
|
81
|
+
const rows = await readCommandGroup(input, line, "fetch ");
|
|
82
|
+
await this.fetchGit(url, rows, state, run, writeBytes, discover("git-upload-pack", false));
|
|
83
|
+
write("\n");
|
|
84
|
+
}
|
|
85
|
+
else if (line.startsWith("push ")) {
|
|
86
|
+
const rows = await readCommandGroup(input, line, "push ");
|
|
87
|
+
await this.pushGit(url, rows, state, run, writeBytes, discover("git-receive-pack", true));
|
|
88
|
+
write("\n");
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
throw new Error(`http transport does not support ${line}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { stdout: "", stderr: stderr.join(""), exitCode: 0 };
|
|
95
|
+
}
|
|
96
|
+
catch (cause) {
|
|
97
|
+
return fail(cause);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Transcribes remote-curl.c::set_option. */
|
|
101
|
+
setOption(options, name, value) {
|
|
102
|
+
const boolean = () => value === "true" ? true : value === "false" ? false : undefined;
|
|
103
|
+
const assignBoolean = (assign) => {
|
|
104
|
+
const parsed = boolean();
|
|
105
|
+
if (parsed === undefined)
|
|
106
|
+
return "error invalid value";
|
|
107
|
+
assign(parsed);
|
|
108
|
+
return "ok";
|
|
109
|
+
};
|
|
110
|
+
if (name === "verbosity") {
|
|
111
|
+
if (!/^-?\d+$/u.test(value))
|
|
112
|
+
return "error invalid value";
|
|
113
|
+
options.verbosity = Number(value);
|
|
114
|
+
}
|
|
115
|
+
else if (name === "progress")
|
|
116
|
+
return assignBoolean(parsed => { options.progress = parsed; });
|
|
117
|
+
else if (name === "depth") {
|
|
118
|
+
if (!/^\d+$/u.test(value))
|
|
119
|
+
return "error invalid value";
|
|
120
|
+
options.depth = Number(value);
|
|
121
|
+
}
|
|
122
|
+
else if (name === "deepen-since")
|
|
123
|
+
options.deepenSince = value;
|
|
124
|
+
else if (name === "deepen-not")
|
|
125
|
+
options.deepenNot.push(value);
|
|
126
|
+
else if (name === "deepen-relative")
|
|
127
|
+
return assignBoolean(parsed => { options.deepenRelative = parsed; });
|
|
128
|
+
else if (name === "followtags")
|
|
129
|
+
return assignBoolean(parsed => { options.followtags = parsed; });
|
|
130
|
+
else if (name === "dry-run")
|
|
131
|
+
return assignBoolean(parsed => { options.dryRun = parsed; });
|
|
132
|
+
else if (name === "check-connectivity")
|
|
133
|
+
return assignBoolean(parsed => { options.checkConnectivity = parsed; });
|
|
134
|
+
else if (name === "cloning")
|
|
135
|
+
return assignBoolean(parsed => { options.cloning = parsed; });
|
|
136
|
+
else if (name === "update-shallow")
|
|
137
|
+
return assignBoolean(parsed => { options.updateShallow = parsed; });
|
|
138
|
+
else if (name === "pushcert") {
|
|
139
|
+
if (value !== "true" && value !== "false" && value !== "if-asked")
|
|
140
|
+
return "error invalid value";
|
|
141
|
+
options.pushcert = value;
|
|
142
|
+
}
|
|
143
|
+
else if (name === "push-option")
|
|
144
|
+
options.pushOptions.push(unquote(value));
|
|
145
|
+
else if (name === "family") {
|
|
146
|
+
if (value !== "ipv4" && value !== "ipv6" && value !== "all")
|
|
147
|
+
return "error invalid value";
|
|
148
|
+
options.family = value;
|
|
149
|
+
}
|
|
150
|
+
else if (name === "from-promisor")
|
|
151
|
+
options.fromPromisor = true;
|
|
152
|
+
else if (name === "no-dependents")
|
|
153
|
+
options.noDependents = true;
|
|
154
|
+
else if (name === "filter")
|
|
155
|
+
options.filter = value;
|
|
156
|
+
else if (name === "object-format") {
|
|
157
|
+
if (value !== "true")
|
|
158
|
+
return "error invalid value";
|
|
159
|
+
options.objectFormat = true;
|
|
160
|
+
}
|
|
161
|
+
else if (name === "atomic")
|
|
162
|
+
return assignBoolean(parsed => { options.atomic = parsed; });
|
|
163
|
+
else
|
|
164
|
+
return "unsupported";
|
|
165
|
+
return "ok";
|
|
166
|
+
}
|
|
167
|
+
/** Transcribes remote-curl.c::discover_refs and check_smart_http. */
|
|
168
|
+
async discoverRefs(url, service, forPush) {
|
|
169
|
+
const requestUrl = `${url}info/refs?service=${service}`;
|
|
170
|
+
const headers = { Accept: "*/*" };
|
|
171
|
+
if (service === "git-upload-pack")
|
|
172
|
+
headers["Git-Protocol"] = "version=2";
|
|
173
|
+
const response = await this.configuration.http.request({ url: requestUrl, method: "GET", headers });
|
|
174
|
+
if (response.statusCode !== 200)
|
|
175
|
+
throw new Error(`unable to access '${requestUrl}': HTTP ${response.statusCode}`);
|
|
176
|
+
const contentType = header(response.headers, "content-type")?.split(";", 1)[0]?.trim();
|
|
177
|
+
if (contentType !== `application/x-${service}-advertisement`) {
|
|
178
|
+
throw new Error(`dumb HTTP transport is not supported for '${requestUrl}'`);
|
|
179
|
+
}
|
|
180
|
+
const body = await collect(response.body);
|
|
181
|
+
const first = readPacket(body, 0);
|
|
182
|
+
if (first.kind !== "data" || decoder.decode(first.payload).replace(/\n$/u, "") !== `# service=${service}`) {
|
|
183
|
+
throw new Error(`invalid server response from '${requestUrl}'`);
|
|
184
|
+
}
|
|
185
|
+
let offset = first.end;
|
|
186
|
+
for (;;) {
|
|
187
|
+
const packet = readPacket(body, offset);
|
|
188
|
+
offset = packet.end;
|
|
189
|
+
if (packet.kind === "flush")
|
|
190
|
+
break;
|
|
191
|
+
if (packet.kind === "eof")
|
|
192
|
+
throw new Error(`invalid server response from '${requestUrl}'`);
|
|
193
|
+
}
|
|
194
|
+
const advertisement = body.slice(offset);
|
|
195
|
+
const versionPacket = readPacket(advertisement, 0);
|
|
196
|
+
const version = versionPacket.kind === "data" && decoder.decode(versionPacket.payload).replace(/\n$/u, "") === "version 2" ? 2 : 0;
|
|
197
|
+
return { service, version, advertisement, refs: version === 2 ? [] : this.parseGitRefs(advertisement, forPush) };
|
|
198
|
+
}
|
|
199
|
+
/** Transcribes remote-curl.c::parse_git_refs. */
|
|
200
|
+
parseGitRefs(advertisement, _forPush) {
|
|
201
|
+
const refs = [];
|
|
202
|
+
let offset = 0;
|
|
203
|
+
let first = true;
|
|
204
|
+
let headTarget;
|
|
205
|
+
for (;;) {
|
|
206
|
+
const packet = readPacket(advertisement, offset);
|
|
207
|
+
offset = packet.end;
|
|
208
|
+
if (packet.kind === "flush" || packet.kind === "eof")
|
|
209
|
+
break;
|
|
210
|
+
if (packet.kind !== "data")
|
|
211
|
+
continue;
|
|
212
|
+
let line = decoder.decode(packet.payload).replace(/\n$/u, "");
|
|
213
|
+
if (first) {
|
|
214
|
+
const nul = line.indexOf("\0");
|
|
215
|
+
if (nul >= 0) {
|
|
216
|
+
const capabilities = line.slice(nul + 1).split(" ");
|
|
217
|
+
headTarget = capabilities.find(value => value.startsWith("symref=HEAD:"))?.slice("symref=HEAD:".length);
|
|
218
|
+
line = line.slice(0, nul);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
first = false;
|
|
222
|
+
const space = line.indexOf(" ");
|
|
223
|
+
if (space > 0)
|
|
224
|
+
refs.push({ oid: line.slice(0, space), name: line.slice(space + 1) });
|
|
225
|
+
}
|
|
226
|
+
if (headTarget) {
|
|
227
|
+
const head = refs.find(ref => ref.name === "HEAD");
|
|
228
|
+
if (head)
|
|
229
|
+
head.symref = headTarget;
|
|
230
|
+
}
|
|
231
|
+
return refs;
|
|
232
|
+
}
|
|
233
|
+
/** Transcribes remote-curl.c::output_refs. */
|
|
234
|
+
outputRefs(refs, write) {
|
|
235
|
+
for (const ref of refs)
|
|
236
|
+
write(ref.symref ? `@${ref.symref} ${ref.name}\n` : `${ref.oid} ${ref.name}\n`);
|
|
237
|
+
write("\n");
|
|
238
|
+
}
|
|
239
|
+
/** Transcribes remote-curl.c::stateless_connect. */
|
|
240
|
+
async statelessConnect(url, service, input, write, discover) {
|
|
241
|
+
const found = await discover(service === "git-upload-archive" ? "git-upload-pack" : service, false);
|
|
242
|
+
if (found.version !== 2) {
|
|
243
|
+
write(encoder.encode("fallback\n"));
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
write(encoder.encode("\n"));
|
|
247
|
+
if (service !== "git-upload-archive")
|
|
248
|
+
write(found.advertisement);
|
|
249
|
+
for (;;) {
|
|
250
|
+
const request = await input.readPacketRequest();
|
|
251
|
+
if (!request)
|
|
252
|
+
break;
|
|
253
|
+
write(await this.postRpc(url, service, request, true));
|
|
254
|
+
// Transcribes remote-curl.c::post_rpc: packet_response_end(rpc->in).
|
|
255
|
+
write(RESPONSE_END);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/** Transcribes remote-curl.c::parse_fetch and fetch_git. */
|
|
259
|
+
async fetchGit(url, rows, options, run, write, discovery) {
|
|
260
|
+
const found = await discovery;
|
|
261
|
+
if (found.version === 2)
|
|
262
|
+
throw new Error("fetch command received after protocol-v2 discovery");
|
|
263
|
+
const args = ["fetch-pack", "--stateless-rpc", "--stdin", "--lock-pack"];
|
|
264
|
+
if (options.verbosity < 1)
|
|
265
|
+
args.push("--quiet");
|
|
266
|
+
if (options.verbosity >= 3)
|
|
267
|
+
args.push("-v", "-v");
|
|
268
|
+
if (options.followtags)
|
|
269
|
+
args.push("--include-tag");
|
|
270
|
+
if (options.checkConnectivity)
|
|
271
|
+
args.push("--check-self-contained-and-connected");
|
|
272
|
+
if (options.cloning)
|
|
273
|
+
args.push("--cloning");
|
|
274
|
+
if (options.updateShallow)
|
|
275
|
+
args.push("--update-shallow");
|
|
276
|
+
if (!options.progress)
|
|
277
|
+
args.push("--no-progress");
|
|
278
|
+
if (options.depth !== undefined)
|
|
279
|
+
args.push(`--depth=${options.depth}`);
|
|
280
|
+
if (options.deepenSince !== undefined)
|
|
281
|
+
args.push(`--shallow-since=${options.deepenSince}`);
|
|
282
|
+
for (const value of options.deepenNot)
|
|
283
|
+
args.push(`--shallow-exclude=${value}`);
|
|
284
|
+
if (options.deepenRelative && options.depth)
|
|
285
|
+
args.push("--deepen-relative");
|
|
286
|
+
if (options.fromPromisor)
|
|
287
|
+
args.push("--from-promisor");
|
|
288
|
+
if (options.noDependents)
|
|
289
|
+
args.push("--no-dependents");
|
|
290
|
+
if (options.filter !== undefined)
|
|
291
|
+
args.push(`--filter=${options.filter}`);
|
|
292
|
+
args.push(url);
|
|
293
|
+
const preamble = concat([...rows.map(row => packet(`${row}\n`)), FLUSH, found.advertisement]);
|
|
294
|
+
const result = await this.rpcService(url, "git-upload-pack", args, preamble, run);
|
|
295
|
+
if (result.exitCode !== 0)
|
|
296
|
+
throw new Error(result.stderr.trim() || "fetch-pack failed");
|
|
297
|
+
if (result.trailing.byteLength)
|
|
298
|
+
write(result.trailing);
|
|
299
|
+
if (options.checkConnectivity)
|
|
300
|
+
write(encoder.encode("connectivity-ok\n"));
|
|
301
|
+
}
|
|
302
|
+
/** Transcribes remote-curl.c::parse_push and push_git. */
|
|
303
|
+
async pushGit(url, rows, options, run, write, discovery) {
|
|
304
|
+
const found = await discovery;
|
|
305
|
+
const args = ["send-pack", "--stateless-rpc", "--helper-status"];
|
|
306
|
+
if (options.dryRun)
|
|
307
|
+
args.push("--dry-run");
|
|
308
|
+
if (options.atomic)
|
|
309
|
+
args.push("--atomic");
|
|
310
|
+
if (options.verbosity === 0)
|
|
311
|
+
args.push("--quiet");
|
|
312
|
+
else if (options.verbosity > 1)
|
|
313
|
+
args.push("--verbose");
|
|
314
|
+
for (const value of options.pushOptions)
|
|
315
|
+
args.push(`--push-option=${value}`);
|
|
316
|
+
args.push(options.progress ? "--progress" : "--no-progress", url, "--stdin");
|
|
317
|
+
const preamble = concat([...rows.map(row => packet(`${row}\n`)), FLUSH, found.advertisement]);
|
|
318
|
+
const result = await this.rpcService(url, "git-receive-pack", args, preamble, run);
|
|
319
|
+
if (result.trailing.byteLength)
|
|
320
|
+
write(result.trailing);
|
|
321
|
+
if (result.exitCode !== 0)
|
|
322
|
+
throw new Error(result.stderr.trim() || "send-pack failed");
|
|
323
|
+
}
|
|
324
|
+
/** Transcribes remote-curl.c::rpc_service. */
|
|
325
|
+
async rpcService(url, service, args, preamble, run) {
|
|
326
|
+
const stdin = new AsyncByteQueue();
|
|
327
|
+
stdin.push(preamble);
|
|
328
|
+
const parser = new RpcRequestParser();
|
|
329
|
+
const trailing = [];
|
|
330
|
+
let posts = Promise.resolve();
|
|
331
|
+
const accept = (bytes) => {
|
|
332
|
+
for (const item of parser.push(bytes)) {
|
|
333
|
+
if (item.request)
|
|
334
|
+
posts = posts.then(async () => { stdin.push(await this.postRpc(url, service, item.request, false)); });
|
|
335
|
+
if (item.trailing)
|
|
336
|
+
trailing.push(item.trailing);
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
const childOptions = {
|
|
340
|
+
...(run.cwd !== undefined ? { cwd: run.cwd } : {}),
|
|
341
|
+
...(run.env !== undefined ? { env: run.env } : {}),
|
|
342
|
+
...(run.signal !== undefined ? { signal: run.signal } : {}),
|
|
343
|
+
stdinStream: stdin,
|
|
344
|
+
onStdoutBytes: accept,
|
|
345
|
+
onStdout: text => accept(encoder.encode(text)),
|
|
346
|
+
...(run.onStderr !== undefined ? { onStderr: run.onStderr } : {}),
|
|
347
|
+
};
|
|
348
|
+
const result = await this.configuration.spawn.run(shellCommand(["git", ...args]), childOptions);
|
|
349
|
+
await posts;
|
|
350
|
+
stdin.close();
|
|
351
|
+
trailing.push(...parser.finish());
|
|
352
|
+
return { exitCode: result.exitCode, stderr: result.stderr, trailing: concat(trailing) };
|
|
353
|
+
}
|
|
354
|
+
/** Transcribes remote-curl.c::post_rpc. */
|
|
355
|
+
async postRpc(url, service, request, protocolV2) {
|
|
356
|
+
const requestUrl = `${url}${service}`;
|
|
357
|
+
const headers = {
|
|
358
|
+
"Content-Type": `application/x-${service}-request`,
|
|
359
|
+
Accept: `application/x-${service}-result`,
|
|
360
|
+
...(protocolV2 ? { "Git-Protocol": "version=2" } : {}),
|
|
361
|
+
};
|
|
362
|
+
const response = await this.configuration.http.request({
|
|
363
|
+
url: requestUrl,
|
|
364
|
+
method: "POST",
|
|
365
|
+
headers,
|
|
366
|
+
body: byteIterator(request),
|
|
367
|
+
});
|
|
368
|
+
if (response.statusCode !== 200)
|
|
369
|
+
throw new Error(`unable to access '${requestUrl}': HTTP ${response.statusCode}`);
|
|
370
|
+
return collect(response.body);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Transcribes remote-curl.c::rpc_service's loop over its child's stdout, with
|
|
375
|
+
* remote-curl.c::post_rpc's buffering loop and remote-curl.c::rpc_read_from_out
|
|
376
|
+
* for `rpc->write_line_lengths == 0`, which is what `fetch_git` and `push_git`
|
|
377
|
+
* set (`stateless_connect` sets it to 1 and restores the headers instead).
|
|
378
|
+
*
|
|
379
|
+
* The child -- `send-pack --stateless-rpc`, `fetch-pack --stateless-rpc` --
|
|
380
|
+
* wraps the protocol it speaks in an outer pkt-line layer so the helper can
|
|
381
|
+
* see where a request ends: send-pack.c:723 `send_sideband(out, -1,
|
|
382
|
+
* req_buf.buf, req_buf.len, LARGE_PACKET_MAX)` for the commands and
|
|
383
|
+
* send-pack.c:127 for the packfile, fetch-pack.c's `send_request` for the
|
|
384
|
+
* wants. remote-curl reads that stream with `packet_read`/`rpc_read_from_out`,
|
|
385
|
+
* which hand back `pktlen_raw` -- the payload alone -- and with
|
|
386
|
+
* `write_line_lengths` clear nothing puts the 4-byte header back
|
|
387
|
+
* (`*appended = pktlen_raw + (rpc->write_line_lengths ? 4 : 0)`, remote-curl.c:677),
|
|
388
|
+
* so only the inner bytes go on the wire.
|
|
389
|
+
*
|
|
390
|
+
* `rpc_service` reads the first packet of each request itself
|
|
391
|
+
* (remote-curl.c:1135 `n = packet_read(rpc->out, rpc->buf, rpc->alloc, 0);
|
|
392
|
+
* if (!n) break;`): a flush there ends the rpc, and what the child writes
|
|
393
|
+
* after it is `rpc_result`, which `push_git` and `fetch_git` write to git
|
|
394
|
+
* verbatim. Otherwise `post_rpc(rpc, 0, 0)` reads on until
|
|
395
|
+
* `PACKET_READ_FLUSH`, and that flush ends the request without being sent.
|
|
396
|
+
*/
|
|
397
|
+
class RpcRequestParser {
|
|
398
|
+
buffer = new Uint8Array();
|
|
399
|
+
payload = [];
|
|
400
|
+
reading = false;
|
|
401
|
+
protocol = true;
|
|
402
|
+
push(chunk) {
|
|
403
|
+
this.buffer = concat([this.buffer, chunk]);
|
|
404
|
+
const output = [];
|
|
405
|
+
while (this.protocol && this.buffer.byteLength >= 4) {
|
|
406
|
+
const length = packetLength(this.buffer, 0);
|
|
407
|
+
if (length === undefined) {
|
|
408
|
+
throw new Error(`protocol error: bad line length character: ${decoder.decode(this.buffer.slice(0, 4))}`);
|
|
409
|
+
}
|
|
410
|
+
// This layer carries neither a delimiter nor a response end;
|
|
411
|
+
// rpc_read_from_out dies on the one it is given.
|
|
412
|
+
if (length === 1 || length === 2)
|
|
413
|
+
throw new Error("remote server sent unexpected response end packet");
|
|
414
|
+
if (length === 0) {
|
|
415
|
+
this.buffer = this.buffer.slice(4);
|
|
416
|
+
if (!this.reading) {
|
|
417
|
+
this.protocol = false;
|
|
418
|
+
break;
|
|
419
|
+
}
|
|
420
|
+
output.push({ request: concat(this.payload) });
|
|
421
|
+
this.payload = [];
|
|
422
|
+
this.reading = false;
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
if (length < 4)
|
|
426
|
+
throw new Error(`protocol error: bad line length ${length}`);
|
|
427
|
+
if (this.buffer.byteLength < length)
|
|
428
|
+
break;
|
|
429
|
+
this.payload.push(this.buffer.slice(4, length));
|
|
430
|
+
this.buffer = this.buffer.slice(length);
|
|
431
|
+
this.reading = true;
|
|
432
|
+
}
|
|
433
|
+
if (!this.protocol && this.buffer.byteLength) {
|
|
434
|
+
output.push({ trailing: this.buffer });
|
|
435
|
+
this.buffer = new Uint8Array();
|
|
436
|
+
}
|
|
437
|
+
return output;
|
|
438
|
+
}
|
|
439
|
+
finish() {
|
|
440
|
+
// Still inside the rpc: remote-curl's packet_read reads its header with no
|
|
441
|
+
// PACKET_READ_GENTLE_ON_EOF, so a child that stops mid-request dies here.
|
|
442
|
+
if (this.protocol) {
|
|
443
|
+
if (this.reading || this.buffer.byteLength)
|
|
444
|
+
throw new Error("the remote end hung up unexpectedly");
|
|
445
|
+
return [];
|
|
446
|
+
}
|
|
447
|
+
return this.buffer.byteLength ? [this.buffer] : [];
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
class AsyncByteReader {
|
|
451
|
+
iterator;
|
|
452
|
+
buffer = new Uint8Array();
|
|
453
|
+
ended = false;
|
|
454
|
+
constructor(input) { this.iterator = input[Symbol.asyncIterator](); }
|
|
455
|
+
async readLine() {
|
|
456
|
+
for (;;) {
|
|
457
|
+
const newline = this.buffer.indexOf(10);
|
|
458
|
+
if (newline >= 0) {
|
|
459
|
+
const line = decoder.decode(this.buffer.slice(0, newline));
|
|
460
|
+
this.buffer = this.buffer.slice(newline + 1);
|
|
461
|
+
return line;
|
|
462
|
+
}
|
|
463
|
+
if (!await this.fill()) {
|
|
464
|
+
if (!this.buffer.byteLength)
|
|
465
|
+
return;
|
|
466
|
+
const line = decoder.decode(this.buffer);
|
|
467
|
+
this.buffer = new Uint8Array();
|
|
468
|
+
return line;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
async readPacketRequest() {
|
|
473
|
+
const chunks = [];
|
|
474
|
+
for (;;) {
|
|
475
|
+
while (this.buffer.byteLength < 4 && await this.fill()) { /* fill header */ }
|
|
476
|
+
if (this.buffer.byteLength === 0 && this.ended)
|
|
477
|
+
return chunks.length ? concat(chunks) : undefined;
|
|
478
|
+
if (this.buffer.byteLength < 4)
|
|
479
|
+
return concat([...chunks, this.take(this.buffer.byteLength)]);
|
|
480
|
+
const length = packetLength(this.buffer, 0);
|
|
481
|
+
if (length === undefined)
|
|
482
|
+
throw new Error("remote-curl: bad line length character");
|
|
483
|
+
const size = length < 4 ? 4 : length;
|
|
484
|
+
while (this.buffer.byteLength < size && await this.fill()) { /* fill packet */ }
|
|
485
|
+
if (this.buffer.byteLength < size)
|
|
486
|
+
throw new Error("remote-curl: truncated packet line");
|
|
487
|
+
chunks.push(this.take(size));
|
|
488
|
+
if (length === 2)
|
|
489
|
+
throw new Error("remote server sent unexpected response end packet");
|
|
490
|
+
if (length === 0)
|
|
491
|
+
return concat(chunks);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
take(length) {
|
|
495
|
+
const value = this.buffer.slice(0, length);
|
|
496
|
+
this.buffer = this.buffer.slice(length);
|
|
497
|
+
return value;
|
|
498
|
+
}
|
|
499
|
+
async fill() {
|
|
500
|
+
if (this.ended)
|
|
501
|
+
return false;
|
|
502
|
+
const item = await this.iterator.next();
|
|
503
|
+
if (item.done) {
|
|
504
|
+
this.ended = true;
|
|
505
|
+
return false;
|
|
506
|
+
}
|
|
507
|
+
this.buffer = concat([this.buffer, item.value]);
|
|
508
|
+
return true;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
class AsyncByteQueue {
|
|
512
|
+
values = [];
|
|
513
|
+
waiters = [];
|
|
514
|
+
ended = false;
|
|
515
|
+
push(value) {
|
|
516
|
+
if (this.ended)
|
|
517
|
+
return;
|
|
518
|
+
const waiter = this.waiters.shift();
|
|
519
|
+
if (waiter)
|
|
520
|
+
waiter({ done: false, value });
|
|
521
|
+
else
|
|
522
|
+
this.values.push(value);
|
|
523
|
+
}
|
|
524
|
+
close() {
|
|
525
|
+
this.ended = true;
|
|
526
|
+
for (const waiter of this.waiters.splice(0))
|
|
527
|
+
waiter({ done: true, value: undefined });
|
|
528
|
+
}
|
|
529
|
+
[Symbol.asyncIterator]() {
|
|
530
|
+
return { next: () => {
|
|
531
|
+
const value = this.values.shift();
|
|
532
|
+
if (value)
|
|
533
|
+
return Promise.resolve({ done: false, value });
|
|
534
|
+
if (this.ended)
|
|
535
|
+
return Promise.resolve({ done: true, value: undefined });
|
|
536
|
+
return new Promise(resolve => this.waiters.push(resolve));
|
|
537
|
+
} };
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
async function readCommandGroup(input, first, prefix) {
|
|
541
|
+
const rows = [first.slice(prefix.length)];
|
|
542
|
+
for (;;) {
|
|
543
|
+
const line = await input.readLine();
|
|
544
|
+
if (line === undefined || line === "")
|
|
545
|
+
return rows;
|
|
546
|
+
if (!line.startsWith(prefix))
|
|
547
|
+
throw new Error(`http transport does not support ${line}`);
|
|
548
|
+
rows.push(line.slice(prefix.length));
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
function readPacket(bytes, offset) {
|
|
552
|
+
if (offset === bytes.byteLength)
|
|
553
|
+
return { kind: "eof", payload: new Uint8Array(), end: offset };
|
|
554
|
+
if (offset + 4 > bytes.byteLength)
|
|
555
|
+
throw new Error("remote-curl: truncated packet header");
|
|
556
|
+
const length = packetLength(bytes, offset);
|
|
557
|
+
if (length === undefined)
|
|
558
|
+
throw new Error("remote-curl: bad line length character");
|
|
559
|
+
if (length === 0)
|
|
560
|
+
return { kind: "flush", payload: new Uint8Array(), end: offset + 4 };
|
|
561
|
+
if (length === 1)
|
|
562
|
+
return { kind: "delim", payload: new Uint8Array(), end: offset + 4 };
|
|
563
|
+
if (length < 4 || offset + length > bytes.byteLength)
|
|
564
|
+
throw new Error("remote-curl: truncated packet line");
|
|
565
|
+
return { kind: "data", payload: bytes.slice(offset + 4, offset + length), end: offset + length };
|
|
566
|
+
}
|
|
567
|
+
function packetLength(bytes, offset) {
|
|
568
|
+
const text = String.fromCharCode(...bytes.slice(offset, offset + 4));
|
|
569
|
+
return /^[0-9a-fA-F]{4}$/u.test(text) ? Number.parseInt(text, 16) : undefined;
|
|
570
|
+
}
|
|
571
|
+
function packet(value) {
|
|
572
|
+
const body = encoder.encode(value);
|
|
573
|
+
return concat([encoder.encode((body.byteLength + 4).toString(16).padStart(4, "0")), body]);
|
|
574
|
+
}
|
|
575
|
+
function concat(chunks) {
|
|
576
|
+
const result = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.byteLength, 0));
|
|
577
|
+
let offset = 0;
|
|
578
|
+
for (const chunk of chunks) {
|
|
579
|
+
result.set(chunk, offset);
|
|
580
|
+
offset += chunk.byteLength;
|
|
581
|
+
}
|
|
582
|
+
return result;
|
|
583
|
+
}
|
|
584
|
+
async function collect(body) {
|
|
585
|
+
if (!body)
|
|
586
|
+
return new Uint8Array();
|
|
587
|
+
const chunks = [];
|
|
588
|
+
for await (const chunk of body)
|
|
589
|
+
chunks.push(chunk);
|
|
590
|
+
return concat(chunks);
|
|
591
|
+
}
|
|
592
|
+
async function* byteIterator(value) { yield value; }
|
|
593
|
+
async function* singleInput(value) {
|
|
594
|
+
if (value !== undefined)
|
|
595
|
+
yield encoder.encode(value);
|
|
596
|
+
}
|
|
597
|
+
function header(headers, name) {
|
|
598
|
+
if (!headers)
|
|
599
|
+
return;
|
|
600
|
+
const lower = name.toLowerCase();
|
|
601
|
+
for (const [key, value] of Object.entries(headers))
|
|
602
|
+
if (key.toLowerCase() === lower)
|
|
603
|
+
return value;
|
|
604
|
+
return;
|
|
605
|
+
}
|
|
606
|
+
function unquote(value) {
|
|
607
|
+
if (!value.startsWith('"'))
|
|
608
|
+
return value;
|
|
609
|
+
try {
|
|
610
|
+
return JSON.parse(value);
|
|
611
|
+
}
|
|
612
|
+
catch {
|
|
613
|
+
throw new Error(`invalid quoting in push-option value: '${value}'`);
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
function shellCommand(argv) {
|
|
617
|
+
return argv.map(value => `'${value.replaceAll("'", "'\\''")}'`).join(" ");
|
|
618
|
+
}
|
|
619
|
+
//# sourceMappingURL=browser-git-remote-https.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-git-remote-https.js","sourceRoot":"","sources":["../src/browser-git-remote-https.ts"],"names":[],"mappings":"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"}
|