@package-broker/runtime-node 0.0.0-stage → 2.0.0-rc.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 +661 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/assets.d.ts +4 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +68 -0
- package/dist/assets.js.map +1 -0
- package/dist/blob/archive-staging.d.ts +15 -0
- package/dist/blob/archive-staging.d.ts.map +1 -0
- package/dist/blob/archive-staging.js +154 -0
- package/dist/blob/archive-staging.js.map +1 -0
- package/dist/blob/filesystem.d.ts +18 -0
- package/dist/blob/filesystem.d.ts.map +1 -0
- package/dist/blob/filesystem.js +631 -0
- package/dist/blob/filesystem.js.map +1 -0
- package/dist/blob/hasher.d.ts +3 -0
- package/dist/blob/hasher.d.ts.map +1 -0
- package/dist/blob/hasher.js +26 -0
- package/dist/blob/hasher.js.map +1 -0
- package/dist/blob/s3.d.ts +40 -0
- package/dist/blob/s3.d.ts.map +1 -0
- package/dist/blob/s3.js +494 -0
- package/dist/blob/s3.js.map +1 -0
- package/dist/cache/lru.d.ts +8 -0
- package/dist/cache/lru.d.ts.map +1 -0
- package/dist/cache/lru.js +103 -0
- package/dist/cache/lru.js.map +1 -0
- package/dist/client-ip.d.ts +2 -0
- package/dist/client-ip.d.ts.map +1 -0
- package/dist/client-ip.js +51 -0
- package/dist/client-ip.js.map +1 -0
- package/dist/codec/node-codec.d.ts +3 -0
- package/dist/codec/node-codec.d.ts.map +1 -0
- package/dist/codec/node-codec.js +163 -0
- package/dist/codec/node-codec.js.map +1 -0
- package/dist/db/better-sqlite3-executor.d.ts +10 -0
- package/dist/db/better-sqlite3-executor.d.ts.map +1 -0
- package/dist/db/better-sqlite3-executor.js +129 -0
- package/dist/db/better-sqlite3-executor.js.map +1 -0
- package/dist/entry.d.ts +32 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +158 -0
- package/dist/entry.js.map +1 -0
- package/dist/import-jobs.d.ts +18 -0
- package/dist/import-jobs.d.ts.map +1 -0
- package/dist/import-jobs.js +56 -0
- package/dist/import-jobs.js.map +1 -0
- package/dist/index.d.ts +112 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +981 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/seams-key.d.ts +2 -0
- package/dist/internal/seams-key.d.ts.map +1 -0
- package/dist/internal/seams-key.js +2 -0
- package/dist/internal/seams-key.js.map +1 -0
- package/dist/jobs/loop.d.ts +38 -0
- package/dist/jobs/loop.d.ts.map +1 -0
- package/dist/jobs/loop.js +318 -0
- package/dist/jobs/loop.js.map +1 -0
- package/dist/observability/stdio.d.ts +11 -0
- package/dist/observability/stdio.d.ts.map +1 -0
- package/dist/observability/stdio.js +47 -0
- package/dist/observability/stdio.js.map +1 -0
- package/dist/organization-administration.d.ts +5 -0
- package/dist/organization-administration.d.ts.map +1 -0
- package/dist/organization-administration.js +16 -0
- package/dist/organization-administration.js.map +1 -0
- package/dist/sources/dns-guard.d.ts +33 -0
- package/dist/sources/dns-guard.d.ts.map +1 -0
- package/dist/sources/dns-guard.js +202 -0
- package/dist/sources/dns-guard.js.map +1 -0
- package/dist/sources/git-provider.d.ts +30 -0
- package/dist/sources/git-provider.d.ts.map +1 -0
- package/dist/sources/git-provider.js +213 -0
- package/dist/sources/git-provider.js.map +1 -0
- package/dist/sources/guarded-fetch.d.ts +15 -0
- package/dist/sources/guarded-fetch.d.ts.map +1 -0
- package/dist/sources/guarded-fetch.js +217 -0
- package/dist/sources/guarded-fetch.js.map +1 -0
- package/dist/sources/ssh-archive-store.d.ts +19 -0
- package/dist/sources/ssh-archive-store.d.ts.map +1 -0
- package/dist/sources/ssh-archive-store.js +284 -0
- package/dist/sources/ssh-archive-store.js.map +1 -0
- package/dist/sources/ssh-git.d.ts +46 -0
- package/dist/sources/ssh-git.d.ts.map +1 -0
- package/dist/sources/ssh-git.js +430 -0
- package/dist/sources/ssh-git.js.map +1 -0
- package/dist/sources/ssh-provider.d.ts +55 -0
- package/dist/sources/ssh-provider.d.ts.map +1 -0
- package/dist/sources/ssh-provider.js +369 -0
- package/dist/sources/ssh-provider.js.map +1 -0
- package/dist/startup.d.ts +49 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +687 -0
- package/dist/startup.js.map +1 -0
- package/dist/token-jobs.d.ts +18 -0
- package/dist/token-jobs.d.ts.map +1 -0
- package/dist/token-jobs.js +45 -0
- package/dist/token-jobs.js.map +1 -0
- package/package.json +45 -3
- package/README.md +0 -3
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from 'node:child_process';
|
|
2
|
+
import { appendFile, chmod, lstat, mkdir, mkdtemp, readdir, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { isIP } from 'node:net';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
export class SshGitError extends Error {
|
|
7
|
+
reason;
|
|
8
|
+
name = 'SshGitError';
|
|
9
|
+
constructor(reason) {
|
|
10
|
+
super(`ssh git failed: ${reason}`);
|
|
11
|
+
this.reason = reason;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const QUIET_CONFIG = '[maintenance]\n\tauto = false\n[gc]\n\tauto = 0\n\tautoDetach = false\n';
|
|
15
|
+
const QUIET_ARGS = ['-c', 'maintenance.auto=false', '-c', 'gc.auto=0', '-c', 'gc.autoDetach=false'];
|
|
16
|
+
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
17
|
+
const DEFAULT_MAX_STDOUT = 64 * 1024 * 1024;
|
|
18
|
+
const DEFAULT_MAX_REPO = 256 * 1024 * 1024;
|
|
19
|
+
const SIZE_POLL_MS = 200;
|
|
20
|
+
const GROUP_EXIT_WAIT_MS = 5_000;
|
|
21
|
+
const MAX_STDERR = 16 * 1024;
|
|
22
|
+
const HOSTNAME = /^[A-Za-z0-9](?:[A-Za-z0-9.-]{0,251}[A-Za-z0-9])?$/;
|
|
23
|
+
const USER = /^[A-Za-z0-9_][A-Za-z0-9._-]{0,63}$/;
|
|
24
|
+
const REPO_PATH = /^[A-Za-z0-9._/-]+$/;
|
|
25
|
+
const SAFE_TEMP = /^[A-Za-z0-9/._-]+$/;
|
|
26
|
+
const OBJECT_ID = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/;
|
|
27
|
+
const ADVERTISED = /^(?:HEAD|refs\/(?:heads|tags)\/.+)$/;
|
|
28
|
+
const REF_NAME = /^refs\/(?:heads|tags)\/[A-Za-z0-9._/+-]+$/;
|
|
29
|
+
const STDERR_REASONS = [
|
|
30
|
+
[
|
|
31
|
+
/Host key verification failed|REMOTE HOST IDENTIFICATION HAS CHANGED|host key .* not known/i,
|
|
32
|
+
'host_key_mismatch',
|
|
33
|
+
],
|
|
34
|
+
[/Permission denied \(|Authentication failed|Too many authentication failures/i, 'auth_failed'],
|
|
35
|
+
[
|
|
36
|
+
/Connection refused|Connection timed out|No route to host|Network is unreachable|Connection reset|Connection closed by remote host/i,
|
|
37
|
+
'connect_failed',
|
|
38
|
+
],
|
|
39
|
+
[
|
|
40
|
+
/does not exist|not a valid object name|invalid object name|not our ref|repository not found|does not appear to be a git repository|couldn't find remote ref/i,
|
|
41
|
+
'not_found',
|
|
42
|
+
],
|
|
43
|
+
];
|
|
44
|
+
const RECOVERABLE = new Set(['not_found']);
|
|
45
|
+
function hasControl(value) {
|
|
46
|
+
return [...value].some((char) => {
|
|
47
|
+
const code = char.charCodeAt(0);
|
|
48
|
+
return code < 0x20 || code === 0x7f;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function parseHost(raw) {
|
|
52
|
+
const bare = raw.startsWith('[') && raw.endsWith(']') ? raw.slice(1, -1) : raw;
|
|
53
|
+
if (isIP(bare) === 6 && !bare.includes('%')) {
|
|
54
|
+
const canonical = new URL(`http://[${bare}]/`).hostname.slice(1, -1);
|
|
55
|
+
return { host: canonical, urlHost: `[${canonical}]` };
|
|
56
|
+
}
|
|
57
|
+
if (bare !== raw || !HOSTNAME.test(raw))
|
|
58
|
+
throw new SshGitError('invalid_host');
|
|
59
|
+
const host = raw.toLowerCase();
|
|
60
|
+
return { host, urlHost: host };
|
|
61
|
+
}
|
|
62
|
+
function assertRemote(remote) {
|
|
63
|
+
const { host, urlHost } = parseHost(remote.host);
|
|
64
|
+
if (remote.user !== undefined && !USER.test(remote.user))
|
|
65
|
+
throw new SshGitError('invalid_user');
|
|
66
|
+
const port = remote.port ?? 22;
|
|
67
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535)
|
|
68
|
+
throw new SshGitError('invalid_port');
|
|
69
|
+
if (!REPO_PATH.test(remote.path) || remote.path.startsWith('-') || remote.path.startsWith('~')) {
|
|
70
|
+
throw new SshGitError('invalid_path');
|
|
71
|
+
}
|
|
72
|
+
return { host, urlHost, port };
|
|
73
|
+
}
|
|
74
|
+
function assertPath(path) {
|
|
75
|
+
if (path === '' || path.startsWith('-') || hasControl(path)) {
|
|
76
|
+
throw new SshGitError('invalid_path');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function assertRef(ref) {
|
|
80
|
+
if (OBJECT_ID.test(ref))
|
|
81
|
+
return;
|
|
82
|
+
if (!REF_NAME.test(ref) || ref.includes('..') || ref.endsWith('.lock') || ref.endsWith('/')) {
|
|
83
|
+
throw new SshGitError('invalid_ref');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function refspec(ref) {
|
|
87
|
+
return OBJECT_ID.test(ref) ? ref : `${ref}:${ref}`;
|
|
88
|
+
}
|
|
89
|
+
function classify(stderr) {
|
|
90
|
+
return STDERR_REASONS.find(([pattern]) => pattern.test(stderr))?.[1] ?? 'git_failed';
|
|
91
|
+
}
|
|
92
|
+
function orderAddresses(addresses) {
|
|
93
|
+
return [
|
|
94
|
+
...addresses.filter((entry) => entry.family === 4),
|
|
95
|
+
...addresses.filter((entry) => entry.family === 6),
|
|
96
|
+
].map((entry) => entry.address);
|
|
97
|
+
}
|
|
98
|
+
async function directorySize(dir) {
|
|
99
|
+
let total = 0;
|
|
100
|
+
const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
101
|
+
for (const entry of entries) {
|
|
102
|
+
const full = join(dir, entry.name);
|
|
103
|
+
if (entry.isDirectory())
|
|
104
|
+
total += await directorySize(full);
|
|
105
|
+
else if (entry.isFile())
|
|
106
|
+
total += await lstat(full).then((info) => info.size, () => 0);
|
|
107
|
+
}
|
|
108
|
+
return total;
|
|
109
|
+
}
|
|
110
|
+
function groupAlive(pid) {
|
|
111
|
+
try {
|
|
112
|
+
process.kill(-pid, 0);
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function killGroup(child, exited) {
|
|
120
|
+
const pid = child.pid;
|
|
121
|
+
if (pid === undefined)
|
|
122
|
+
return;
|
|
123
|
+
try {
|
|
124
|
+
process.kill(-pid, 'SIGKILL');
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
child.kill('SIGKILL');
|
|
128
|
+
}
|
|
129
|
+
await exited;
|
|
130
|
+
const deadline = Date.now() + GROUP_EXIT_WAIT_MS;
|
|
131
|
+
while (groupAlive(pid) && Date.now() < deadline) {
|
|
132
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export async function withSshGitSession(remote, options, work) {
|
|
136
|
+
const session = await openSshGitSession(remote, options);
|
|
137
|
+
try {
|
|
138
|
+
return await work(session);
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
await session.close();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export async function openSshGitSession(remote, options) {
|
|
145
|
+
const target = assertRemote(remote);
|
|
146
|
+
const spawn = options.spawn ?? nodeSpawn;
|
|
147
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
148
|
+
const maxStdout = options.maxStdoutBytes ?? DEFAULT_MAX_STDOUT;
|
|
149
|
+
const maxRepo = options.maxRepoBytes ?? DEFAULT_MAX_REPO;
|
|
150
|
+
const resolution = await options.dnsGuard.forTarget(target.host, target.port, 'ssh').resolve();
|
|
151
|
+
const addresses = orderAddresses(resolution.addresses);
|
|
152
|
+
if (addresses.length === 0)
|
|
153
|
+
throw new SshGitError('no_address');
|
|
154
|
+
const root = await mkdtemp(join(options.tmpRoot ?? tmpdir(), 'ssh-git-'));
|
|
155
|
+
const home = join(root, 'home');
|
|
156
|
+
const keyFile = join(root, 'id_key');
|
|
157
|
+
const knownHostsFile = join(root, 'known_hosts');
|
|
158
|
+
const gitConfig = join(home, '.gitconfig');
|
|
159
|
+
const repo = join(root, 'repo.git');
|
|
160
|
+
const gitDir = `--git-dir=${repo}`;
|
|
161
|
+
const live = new Set();
|
|
162
|
+
let closing;
|
|
163
|
+
const close = () => {
|
|
164
|
+
closing ??= (async () => {
|
|
165
|
+
await Promise.all([...live].map((abort) => abort('closed')));
|
|
166
|
+
await rm(root, { recursive: true, force: true });
|
|
167
|
+
})();
|
|
168
|
+
return closing;
|
|
169
|
+
};
|
|
170
|
+
try {
|
|
171
|
+
if (!SAFE_TEMP.test(root))
|
|
172
|
+
throw new SshGitError('unsafe_temp_path');
|
|
173
|
+
await chmod(root, 0o700);
|
|
174
|
+
await mkdir(home, { mode: 0o700 });
|
|
175
|
+
const key = options.credential.privateKeyPem;
|
|
176
|
+
await writeFile(keyFile, key.endsWith('\n') ? key : `${key}\n`, { mode: 0o600, flag: 'wx' });
|
|
177
|
+
await writeFile(knownHostsFile, options.credential.knownHosts, { mode: 0o600, flag: 'wx' });
|
|
178
|
+
await writeFile(gitConfig, '', { mode: 0o600, flag: 'wx' });
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
await close();
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
const envFor = (address) => ({
|
|
185
|
+
PATH: process.env['PATH'] ?? '/usr/bin:/bin',
|
|
186
|
+
HOME: home,
|
|
187
|
+
GIT_CONFIG_GLOBAL: gitConfig,
|
|
188
|
+
GIT_CONFIG_NOSYSTEM: '1',
|
|
189
|
+
GIT_CEILING_DIRECTORIES: root,
|
|
190
|
+
GIT_ALLOW_PROTOCOL: 'ssh',
|
|
191
|
+
GIT_TERMINAL_PROMPT: '0',
|
|
192
|
+
GIT_SSH_COMMAND: [
|
|
193
|
+
'ssh -F /dev/null',
|
|
194
|
+
`-i '${keyFile}'`,
|
|
195
|
+
'-o IdentitiesOnly=yes',
|
|
196
|
+
'-o IdentityAgent=none',
|
|
197
|
+
`-o UserKnownHostsFile='${knownHostsFile}'`,
|
|
198
|
+
'-o StrictHostKeyChecking=yes',
|
|
199
|
+
`-o HostKeyAlias=${target.host}`,
|
|
200
|
+
`-o HostName=${address}`,
|
|
201
|
+
'-o BatchMode=yes',
|
|
202
|
+
'-o ProxyCommand=none',
|
|
203
|
+
'-o PermitLocalCommand=no',
|
|
204
|
+
'-o ForwardAgent=no',
|
|
205
|
+
'-o ClearAllForwardings=yes',
|
|
206
|
+
'-o ControlPath=none',
|
|
207
|
+
'-o ConnectTimeout=15',
|
|
208
|
+
].join(' '),
|
|
209
|
+
});
|
|
210
|
+
const userPart = remote.user === undefined ? '' : `${remote.user}@`;
|
|
211
|
+
const url = `ssh://${userPart}${target.urlHost}:${target.port}/${remote.path.replace(/^\/+/, '')}`;
|
|
212
|
+
let addressIndex = 0;
|
|
213
|
+
let partial = false;
|
|
214
|
+
let repoReady;
|
|
215
|
+
function run(args, watchSize = false, extraEnv = {}) {
|
|
216
|
+
if (closing)
|
|
217
|
+
return Promise.reject(new SshGitError('closed'));
|
|
218
|
+
const address = addresses[addressIndex] ?? addresses[0] ?? '';
|
|
219
|
+
return new Promise((resolve, reject) => {
|
|
220
|
+
const gitArgs = args[0]?.startsWith('--git-dir=')
|
|
221
|
+
? [args[0], ...QUIET_ARGS, ...args.slice(1)]
|
|
222
|
+
: [...QUIET_ARGS, ...args];
|
|
223
|
+
const child = spawn('git', gitArgs, {
|
|
224
|
+
shell: false,
|
|
225
|
+
detached: true,
|
|
226
|
+
env: { ...envFor(address), ...extraEnv },
|
|
227
|
+
cwd: root,
|
|
228
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
229
|
+
});
|
|
230
|
+
const exited = new Promise((done) => {
|
|
231
|
+
child.once('exit', () => done());
|
|
232
|
+
child.once('error', () => done());
|
|
233
|
+
});
|
|
234
|
+
const chunks = [];
|
|
235
|
+
let stderr = '';
|
|
236
|
+
let size = 0;
|
|
237
|
+
let settled = false;
|
|
238
|
+
const stop = () => {
|
|
239
|
+
settled = true;
|
|
240
|
+
clearTimeout(timer);
|
|
241
|
+
clearInterval(poll);
|
|
242
|
+
live.delete(abort);
|
|
243
|
+
};
|
|
244
|
+
const abort = async (reason) => {
|
|
245
|
+
if (settled)
|
|
246
|
+
return;
|
|
247
|
+
stop();
|
|
248
|
+
await killGroup(child, exited);
|
|
249
|
+
reject(new SshGitError(reason));
|
|
250
|
+
};
|
|
251
|
+
live.add(abort);
|
|
252
|
+
const timer = setTimeout(() => void abort('timeout'), timeoutMs);
|
|
253
|
+
const poll = setInterval(() => {
|
|
254
|
+
if (!watchSize || settled)
|
|
255
|
+
return;
|
|
256
|
+
void directorySize(repo).then((bytes) => {
|
|
257
|
+
if (bytes > maxRepo)
|
|
258
|
+
void abort('repository_too_large');
|
|
259
|
+
});
|
|
260
|
+
}, SIZE_POLL_MS);
|
|
261
|
+
child.stdout?.on('data', (chunk) => {
|
|
262
|
+
size += chunk.length;
|
|
263
|
+
if (size > maxStdout)
|
|
264
|
+
void abort('output_too_large');
|
|
265
|
+
else
|
|
266
|
+
chunks.push(chunk);
|
|
267
|
+
});
|
|
268
|
+
child.stderr?.on('data', (chunk) => {
|
|
269
|
+
if (stderr.length < MAX_STDERR)
|
|
270
|
+
stderr += chunk.toString('utf8');
|
|
271
|
+
});
|
|
272
|
+
child.on('error', () => void abort('git_failed'));
|
|
273
|
+
child.on('close', (code) => {
|
|
274
|
+
if (settled)
|
|
275
|
+
return;
|
|
276
|
+
stop();
|
|
277
|
+
if (code === 0)
|
|
278
|
+
resolve(Buffer.concat(chunks));
|
|
279
|
+
else
|
|
280
|
+
reject(new SshGitError(classify(stderr)));
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
async function overAddresses(work) {
|
|
285
|
+
for (;;) {
|
|
286
|
+
try {
|
|
287
|
+
return await work();
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
const retry = error instanceof SshGitError &&
|
|
291
|
+
error.reason === 'connect_failed' &&
|
|
292
|
+
addressIndex < addresses.length - 1;
|
|
293
|
+
if (!retry)
|
|
294
|
+
throw error;
|
|
295
|
+
addressIndex += 1;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
function ensureRepo() {
|
|
300
|
+
repoReady ??= (async () => {
|
|
301
|
+
await run(['init', '--bare', '--quiet', repo]);
|
|
302
|
+
await appendFile(join(repo, 'config'), `\n${QUIET_CONFIG}`);
|
|
303
|
+
await run([gitDir, 'remote', 'add', 'origin', url]);
|
|
304
|
+
})();
|
|
305
|
+
return repoReady;
|
|
306
|
+
}
|
|
307
|
+
async function assertRepoSize() {
|
|
308
|
+
if ((await directorySize(repo)) > maxRepo)
|
|
309
|
+
throw new SshGitError('repository_too_large');
|
|
310
|
+
}
|
|
311
|
+
async function guarded(work) {
|
|
312
|
+
try {
|
|
313
|
+
return await work();
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
if (!(error instanceof SshGitError && RECOVERABLE.has(error.reason)))
|
|
317
|
+
await close();
|
|
318
|
+
throw error;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return {
|
|
322
|
+
lsRemote() {
|
|
323
|
+
return guarded(async () => {
|
|
324
|
+
const out = await overAddresses(() => run([
|
|
325
|
+
'-c',
|
|
326
|
+
'protocol.version=2',
|
|
327
|
+
'ls-remote',
|
|
328
|
+
'--symref',
|
|
329
|
+
url,
|
|
330
|
+
'HEAD',
|
|
331
|
+
'refs/heads/*',
|
|
332
|
+
'refs/tags/*',
|
|
333
|
+
]));
|
|
334
|
+
const refs = new Map();
|
|
335
|
+
const symrefs = new Map();
|
|
336
|
+
for (const line of out.toString('utf8').split('\n')) {
|
|
337
|
+
const [sha, name] = line.split('\t');
|
|
338
|
+
if (!sha || !name)
|
|
339
|
+
continue;
|
|
340
|
+
if (sha.startsWith('ref: ')) {
|
|
341
|
+
const target = sha.slice(5);
|
|
342
|
+
if (name === 'HEAD' && REF_NAME.test(target))
|
|
343
|
+
symrefs.set(name, target);
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
if (!OBJECT_ID.test(sha))
|
|
347
|
+
continue;
|
|
348
|
+
if (!ADVERTISED.test(name.endsWith('^{}') ? name.slice(0, -3) : name))
|
|
349
|
+
continue;
|
|
350
|
+
if (name.endsWith('^{}')) {
|
|
351
|
+
const base = refs.get(name.slice(0, -3));
|
|
352
|
+
if (base)
|
|
353
|
+
base.peeled = sha;
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
refs.set(name, { sha });
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return [...refs].map(([name, ref]) => ({
|
|
360
|
+
name,
|
|
361
|
+
...ref,
|
|
362
|
+
...(symrefs.has(name) ? { symref: symrefs.get(name) } : {}),
|
|
363
|
+
}));
|
|
364
|
+
});
|
|
365
|
+
},
|
|
366
|
+
async fetchRefs(refs, fetchOptions) {
|
|
367
|
+
refs.forEach(assertRef);
|
|
368
|
+
return guarded(async () => {
|
|
369
|
+
if (refs.length === 0)
|
|
370
|
+
return;
|
|
371
|
+
await ensureRepo();
|
|
372
|
+
if (fetchOptions.filter !== 'none')
|
|
373
|
+
partial = true;
|
|
374
|
+
await overAddresses(() => run([
|
|
375
|
+
gitDir,
|
|
376
|
+
'-c',
|
|
377
|
+
'protocol.version=2',
|
|
378
|
+
'-c',
|
|
379
|
+
'fetch.fsckObjects=true',
|
|
380
|
+
'-c',
|
|
381
|
+
'transfer.fsckObjects=true',
|
|
382
|
+
'fetch',
|
|
383
|
+
'--quiet',
|
|
384
|
+
'--no-tags',
|
|
385
|
+
'--no-write-fetch-head',
|
|
386
|
+
`--depth=${fetchOptions.depth}`,
|
|
387
|
+
...(fetchOptions.filter === 'none' ? [] : [`--filter=${fetchOptions.filter}`]),
|
|
388
|
+
'origin',
|
|
389
|
+
...refs.map(refspec),
|
|
390
|
+
], true));
|
|
391
|
+
await assertRepoSize();
|
|
392
|
+
});
|
|
393
|
+
},
|
|
394
|
+
async catFile(ref, path) {
|
|
395
|
+
assertRef(ref);
|
|
396
|
+
assertPath(path);
|
|
397
|
+
return guarded(async () => {
|
|
398
|
+
await ensureRepo();
|
|
399
|
+
const out = await run([gitDir, 'cat-file', 'blob', `${ref}:${path}`], partial);
|
|
400
|
+
if (partial)
|
|
401
|
+
await assertRepoSize();
|
|
402
|
+
return out;
|
|
403
|
+
});
|
|
404
|
+
},
|
|
405
|
+
async commitTime(ref) {
|
|
406
|
+
assertRef(ref);
|
|
407
|
+
return guarded(async () => {
|
|
408
|
+
await ensureRepo();
|
|
409
|
+
const out = await run([gitDir, 'show', '--no-patch', '--format=%cI', `${ref}^{commit}`, '--'], false, { GIT_NO_LAZY_FETCH: '1' });
|
|
410
|
+
const time = out.toString('utf8').trim();
|
|
411
|
+
if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:Z|[+-]\d{2}:\d{2})$/.test(time)) {
|
|
412
|
+
throw new SshGitError('git_failed');
|
|
413
|
+
}
|
|
414
|
+
return new Date(time).toISOString();
|
|
415
|
+
});
|
|
416
|
+
},
|
|
417
|
+
async archiveZip(ref) {
|
|
418
|
+
assertRef(ref);
|
|
419
|
+
return guarded(async () => {
|
|
420
|
+
await ensureRepo();
|
|
421
|
+
const out = await run([gitDir, 'archive', '--format=zip', ref], partial);
|
|
422
|
+
if (partial)
|
|
423
|
+
await assertRepoSize();
|
|
424
|
+
return out;
|
|
425
|
+
});
|
|
426
|
+
},
|
|
427
|
+
close,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
//# sourceMappingURL=ssh-git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh-git.js","sourceRoot":"","sources":["../../src/sources/ssh-git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { OrgContext } from '@package-broker/core/db/port';
|
|
2
|
+
import { type SshKeyMaterial } from '@package-broker/core/sources/credentials';
|
|
3
|
+
import { type ProviderSource, type SourceProvider } from '@package-broker/core/sources/provider';
|
|
4
|
+
import type { DnsGuard } from './dns-guard.js';
|
|
5
|
+
import { type SpawnGit, type SshRemote } from './ssh-git.js';
|
|
6
|
+
export interface SshArchiveRecord {
|
|
7
|
+
readonly sha1: string;
|
|
8
|
+
readonly time: string | null;
|
|
9
|
+
}
|
|
10
|
+
export interface SshBuiltArchive extends SshArchiveRecord {
|
|
11
|
+
readonly version: string;
|
|
12
|
+
readonly versionNormalized: string;
|
|
13
|
+
readonly commit: string;
|
|
14
|
+
readonly zip: Uint8Array;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Immutable archives built during SSH source ingestion, scoped per call by OrgContext.
|
|
18
|
+
* Implementations must include `ctx.orgId`, source.id, canonical package name,
|
|
19
|
+
* normalized version and commit in every storage key. Names are opaque key components,
|
|
20
|
+
* never filesystem paths; a hash of the tuple is suitable for filesystem naming.
|
|
21
|
+
*
|
|
22
|
+
* `store` is the put operation. It resolves only after the complete ZIP and its SHA-1
|
|
23
|
+
* and commit time are durable and atomically visible together. Readers must see either
|
|
24
|
+
* no record or the complete archive, including during concurrent writes. Repeating a
|
|
25
|
+
* put for an existing key preserves the first published archive; it is never rebuilt.
|
|
26
|
+
*
|
|
27
|
+
* `find` is the metadata get and existence check: null means absent; a record means
|
|
28
|
+
* the complete ZIP is available. Storage failures reject, rather than report absence.
|
|
29
|
+
* Returned records must not expose mutable internal state.
|
|
30
|
+
*
|
|
31
|
+
* Implementations enforce their configured ZIP byte cap before publishing. An oversized
|
|
32
|
+
* archive or failed write rejects without publishing a record, preserves any prior
|
|
33
|
+
* archive and removes temporary files. Errors must not contain a URL, key path or credential text.
|
|
34
|
+
*/
|
|
35
|
+
export interface SshArchiveStore {
|
|
36
|
+
find(ctx: OrgContext, source: ProviderSource, name: string, versionNormalized: string, commit: string): Promise<SshArchiveRecord | null>;
|
|
37
|
+
store(ctx: OrgContext, source: ProviderSource, name: string, archive: SshBuiltArchive): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/** Reads only the full archive tuple; null means absent, with no upstream fallback. */
|
|
40
|
+
export interface SshArchiveReader extends SshArchiveStore {
|
|
41
|
+
readZip(ctx: OrgContext, source: ProviderSource, name: string, versionNormalized: string, commit: string): Promise<Uint8Array | null>;
|
|
42
|
+
}
|
|
43
|
+
export interface SshGitProviderOptions {
|
|
44
|
+
readonly dnsGuard: DnsGuard;
|
|
45
|
+
readonly sshKey: (source: ProviderSource) => Promise<SshKeyMaterial>;
|
|
46
|
+
readonly archives: SshArchiveReader;
|
|
47
|
+
readonly tmpRoot?: string;
|
|
48
|
+
readonly timeoutMs?: number;
|
|
49
|
+
readonly maxStdoutBytes?: number;
|
|
50
|
+
readonly spawn?: SpawnGit;
|
|
51
|
+
}
|
|
52
|
+
export declare function parseSshRepository(text: string): SshRemote;
|
|
53
|
+
export declare function informationalUrl(remote: SshRemote): string;
|
|
54
|
+
export declare function createSshGitProvider(options: SshGitProviderOptions): SourceProvider;
|
|
55
|
+
//# sourceMappingURL=ssh-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh-provider.d.ts","sourceRoot":"","sources":["../../src/sources/ssh-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAU/D,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,cAAc,EAEpB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAIL,KAAK,QAAQ,EAEb,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAQtB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CACF,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACpC,KAAK,CACH,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,uFAAuF;AACvF,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,OAAO,CACL,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACrE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAmB1D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAE1D;AAwGD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAyTnF"}
|