@package-broker/runtime-node 0.0.0-bootstrap → 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.
Files changed (100) hide show
  1. package/LICENSE +661 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/assets.d.ts +4 -0
  4. package/dist/assets.d.ts.map +1 -0
  5. package/dist/assets.js +68 -0
  6. package/dist/assets.js.map +1 -0
  7. package/dist/blob/archive-staging.d.ts +15 -0
  8. package/dist/blob/archive-staging.d.ts.map +1 -0
  9. package/dist/blob/archive-staging.js +154 -0
  10. package/dist/blob/archive-staging.js.map +1 -0
  11. package/dist/blob/filesystem.d.ts +18 -0
  12. package/dist/blob/filesystem.d.ts.map +1 -0
  13. package/dist/blob/filesystem.js +631 -0
  14. package/dist/blob/filesystem.js.map +1 -0
  15. package/dist/blob/hasher.d.ts +3 -0
  16. package/dist/blob/hasher.d.ts.map +1 -0
  17. package/dist/blob/hasher.js +26 -0
  18. package/dist/blob/hasher.js.map +1 -0
  19. package/dist/blob/s3.d.ts +40 -0
  20. package/dist/blob/s3.d.ts.map +1 -0
  21. package/dist/blob/s3.js +494 -0
  22. package/dist/blob/s3.js.map +1 -0
  23. package/dist/cache/lru.d.ts +8 -0
  24. package/dist/cache/lru.d.ts.map +1 -0
  25. package/dist/cache/lru.js +103 -0
  26. package/dist/cache/lru.js.map +1 -0
  27. package/dist/client-ip.d.ts +2 -0
  28. package/dist/client-ip.d.ts.map +1 -0
  29. package/dist/client-ip.js +51 -0
  30. package/dist/client-ip.js.map +1 -0
  31. package/dist/codec/node-codec.d.ts +3 -0
  32. package/dist/codec/node-codec.d.ts.map +1 -0
  33. package/dist/codec/node-codec.js +163 -0
  34. package/dist/codec/node-codec.js.map +1 -0
  35. package/dist/db/better-sqlite3-executor.d.ts +10 -0
  36. package/dist/db/better-sqlite3-executor.d.ts.map +1 -0
  37. package/dist/db/better-sqlite3-executor.js +129 -0
  38. package/dist/db/better-sqlite3-executor.js.map +1 -0
  39. package/dist/entry.d.ts +32 -0
  40. package/dist/entry.d.ts.map +1 -0
  41. package/dist/entry.js +158 -0
  42. package/dist/entry.js.map +1 -0
  43. package/dist/import-jobs.d.ts +18 -0
  44. package/dist/import-jobs.d.ts.map +1 -0
  45. package/dist/import-jobs.js +56 -0
  46. package/dist/import-jobs.js.map +1 -0
  47. package/dist/index.d.ts +112 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +981 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/internal/seams-key.d.ts +2 -0
  52. package/dist/internal/seams-key.d.ts.map +1 -0
  53. package/dist/internal/seams-key.js +2 -0
  54. package/dist/internal/seams-key.js.map +1 -0
  55. package/dist/jobs/loop.d.ts +38 -0
  56. package/dist/jobs/loop.d.ts.map +1 -0
  57. package/dist/jobs/loop.js +318 -0
  58. package/dist/jobs/loop.js.map +1 -0
  59. package/dist/observability/stdio.d.ts +11 -0
  60. package/dist/observability/stdio.d.ts.map +1 -0
  61. package/dist/observability/stdio.js +47 -0
  62. package/dist/observability/stdio.js.map +1 -0
  63. package/dist/organization-administration.d.ts +5 -0
  64. package/dist/organization-administration.d.ts.map +1 -0
  65. package/dist/organization-administration.js +16 -0
  66. package/dist/organization-administration.js.map +1 -0
  67. package/dist/sources/dns-guard.d.ts +33 -0
  68. package/dist/sources/dns-guard.d.ts.map +1 -0
  69. package/dist/sources/dns-guard.js +202 -0
  70. package/dist/sources/dns-guard.js.map +1 -0
  71. package/dist/sources/git-provider.d.ts +30 -0
  72. package/dist/sources/git-provider.d.ts.map +1 -0
  73. package/dist/sources/git-provider.js +213 -0
  74. package/dist/sources/git-provider.js.map +1 -0
  75. package/dist/sources/guarded-fetch.d.ts +15 -0
  76. package/dist/sources/guarded-fetch.d.ts.map +1 -0
  77. package/dist/sources/guarded-fetch.js +217 -0
  78. package/dist/sources/guarded-fetch.js.map +1 -0
  79. package/dist/sources/ssh-archive-store.d.ts +19 -0
  80. package/dist/sources/ssh-archive-store.d.ts.map +1 -0
  81. package/dist/sources/ssh-archive-store.js +284 -0
  82. package/dist/sources/ssh-archive-store.js.map +1 -0
  83. package/dist/sources/ssh-git.d.ts +46 -0
  84. package/dist/sources/ssh-git.d.ts.map +1 -0
  85. package/dist/sources/ssh-git.js +430 -0
  86. package/dist/sources/ssh-git.js.map +1 -0
  87. package/dist/sources/ssh-provider.d.ts +55 -0
  88. package/dist/sources/ssh-provider.d.ts.map +1 -0
  89. package/dist/sources/ssh-provider.js +369 -0
  90. package/dist/sources/ssh-provider.js.map +1 -0
  91. package/dist/startup.d.ts +49 -0
  92. package/dist/startup.d.ts.map +1 -0
  93. package/dist/startup.js +687 -0
  94. package/dist/startup.js.map +1 -0
  95. package/dist/token-jobs.d.ts +18 -0
  96. package/dist/token-jobs.d.ts.map +1 -0
  97. package/dist/token-jobs.js +45 -0
  98. package/dist/token-jobs.js.map +1 -0
  99. package/package.json +45 -5
  100. package/README.md +0 -3
@@ -0,0 +1,217 @@
1
+ import { pipeline, Readable } from 'node:stream';
2
+ import { request as httpRequest } from 'node:http';
3
+ import { request as httpsRequest } from 'node:https';
4
+ import { isIP } from 'node:net';
5
+ import { createBrotliDecompress, createGunzip, createInflate } from 'node:zlib';
6
+ import { createDnsGuard, DnsGuardError } from './dns-guard.js';
7
+ class TransportError extends Error {
8
+ code;
9
+ name = 'TransportError';
10
+ constructor(code) {
11
+ super(`transport error: ${code}`);
12
+ this.code = code;
13
+ }
14
+ }
15
+ const NULL_BODY_STATUSES = new Set([204, 205, 304]);
16
+ const CODE_PATTERN = /^[A-Z0-9_]{1,40}$/;
17
+ const fetchFailed = (cause) => new TypeError('fetch failed', cause === undefined ? undefined : { cause });
18
+ function findGuardError(error) {
19
+ if (error instanceof DnsGuardError)
20
+ return error;
21
+ if (error instanceof AggregateError) {
22
+ for (const inner of error.errors) {
23
+ const found = findGuardError(inner);
24
+ if (found)
25
+ return found;
26
+ }
27
+ }
28
+ return undefined;
29
+ }
30
+ function toTransportError(error) {
31
+ const guard = findGuardError(error);
32
+ if (guard)
33
+ return fetchFailed(new DnsGuardError(guard.reason));
34
+ const code = error?.code;
35
+ return fetchFailed(new TransportError(typeof code === 'string' && CODE_PATTERN.test(code) ? code : 'UNKNOWN'));
36
+ }
37
+ function decoder(encoding) {
38
+ switch (encoding?.trim().toLowerCase()) {
39
+ case 'gzip':
40
+ case 'x-gzip':
41
+ return createGunzip;
42
+ case 'deflate':
43
+ return createInflate;
44
+ case 'br':
45
+ return createBrotliDecompress;
46
+ default:
47
+ return undefined;
48
+ }
49
+ }
50
+ function buildHeaders(raw, decoded) {
51
+ const headers = new Headers();
52
+ for (let i = 0; i + 1 < raw.length; i += 2) {
53
+ const name = raw[i];
54
+ if (decoded && /^content-(encoding|length)$/i.test(name))
55
+ continue;
56
+ headers.append(name, raw[i + 1]);
57
+ }
58
+ return headers;
59
+ }
60
+ function toResponse(incoming, method) {
61
+ const status = incoming.statusCode ?? 0;
62
+ if (status < 200 || status > 599)
63
+ throw new RangeError('unsupported status');
64
+ const decode = method === 'HEAD' ? undefined : decoder(incoming.headers['content-encoding']);
65
+ const headers = buildHeaders(incoming.rawHeaders, decode !== undefined);
66
+ if (method === 'HEAD' || NULL_BODY_STATUSES.has(status)) {
67
+ incoming.resume();
68
+ return new Response(null, { status, headers });
69
+ }
70
+ let source = incoming;
71
+ if (decode) {
72
+ const stream = decode();
73
+ pipeline(incoming, stream, () => undefined);
74
+ source = stream;
75
+ }
76
+ return new Response(Readable.toWeb(source), {
77
+ status,
78
+ headers,
79
+ });
80
+ }
81
+ async function normalizeRequest(input, init) {
82
+ if (init?.redirect === 'follow')
83
+ throw new TypeError('redirect follow is not supported');
84
+ const base = input instanceof Request ? input : undefined;
85
+ let url;
86
+ try {
87
+ url = new URL(base ? base.url : input);
88
+ }
89
+ catch {
90
+ throw new TypeError('invalid url');
91
+ }
92
+ const headers = new Headers(init?.headers ?? base?.headers);
93
+ const method = (init?.method ?? base?.method ?? 'GET').toUpperCase();
94
+ const raw = init?.body ?? (base?.body ? await base.arrayBuffer() : undefined);
95
+ let body;
96
+ if (raw !== undefined && raw !== null) {
97
+ if (method === 'GET' || method === 'HEAD')
98
+ throw new TypeError('request body not allowed');
99
+ if (typeof raw === 'string') {
100
+ body = new TextEncoder().encode(raw);
101
+ if (!headers.has('content-type'))
102
+ headers.set('content-type', 'text/plain;charset=UTF-8');
103
+ }
104
+ else if (raw instanceof URLSearchParams) {
105
+ body = new TextEncoder().encode(raw.toString());
106
+ if (!headers.has('content-type')) {
107
+ headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
108
+ }
109
+ }
110
+ else if (raw instanceof Uint8Array)
111
+ body = raw;
112
+ else if (raw instanceof ArrayBuffer)
113
+ body = new Uint8Array(raw);
114
+ else
115
+ throw new TypeError('unsupported request body');
116
+ }
117
+ return { url, method, headers, body };
118
+ }
119
+ /**
120
+ * Redirects are never followed, whatever init.redirect or a Request default says;
121
+ * 3xx responses are returned as-is for the caller to vet. An explicit
122
+ * redirect: 'follow' is rejected.
123
+ */
124
+ export function createGuardedFetch(policy, options = {}) {
125
+ const { tls, ...guardOptions } = options;
126
+ const guard = createDnsGuard(policy, guardOptions);
127
+ return async (input, init) => {
128
+ const { url, method, headers, body } = await normalizeRequest(input, init);
129
+ const signal = init?.signal ?? (input instanceof Request ? input.signal : undefined);
130
+ if (url.protocol !== 'https:')
131
+ throw fetchFailed(new DnsGuardError('scheme'));
132
+ if (signal?.aborted)
133
+ throw signal.reason;
134
+ const secure = url.protocol === 'https:';
135
+ const hostname = url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname;
136
+ const port = url.port === '' ? (secure ? 443 : 80) : Number(url.port);
137
+ const target = guard.forTarget(url.hostname, port, secure ? 'https' : 'http');
138
+ const literal = isIP(hostname) !== 0;
139
+ let connectHost = hostname;
140
+ if (literal) {
141
+ let onLiteralAbort;
142
+ const aborted = new Promise((_, reject) => {
143
+ onLiteralAbort = () => reject(signal?.reason);
144
+ signal?.addEventListener('abort', onLiteralAbort, { once: true });
145
+ });
146
+ aborted.catch(() => undefined);
147
+ try {
148
+ const resolved = await (signal
149
+ ? Promise.race([target.resolve(), aborted])
150
+ : target.resolve());
151
+ connectHost = resolved.addresses[0]?.address ?? hostname;
152
+ }
153
+ catch (error) {
154
+ if (signal?.aborted)
155
+ throw signal.reason;
156
+ throw toTransportError(error);
157
+ }
158
+ finally {
159
+ if (onLiteralAbort)
160
+ signal?.removeEventListener('abort', onLiteralAbort);
161
+ }
162
+ }
163
+ if (!headers.has('accept-encoding'))
164
+ headers.set('accept-encoding', 'gzip, deflate, br');
165
+ const outgoing = Object.fromEntries(headers);
166
+ outgoing['host'] = url.host;
167
+ if (body !== undefined)
168
+ outgoing['content-length'] = String(body.byteLength);
169
+ const servername = hostname.replace(/\.$/, '');
170
+ return new Promise((resolve, reject) => {
171
+ const send = secure ? httpsRequest : httpRequest;
172
+ const req = send({
173
+ host: connectHost,
174
+ port,
175
+ path: `${url.pathname}${url.search}`,
176
+ method,
177
+ headers: outgoing,
178
+ agent: false,
179
+ lookup: target.lookup,
180
+ ...(secure ? { servername: literal ? '' : servername } : {}),
181
+ ...(secure && tls?.ca !== undefined ? { ca: tls.ca } : {}),
182
+ });
183
+ let incoming;
184
+ const abortReason = () => signal?.reason instanceof Error ? signal.reason : new Error('aborted');
185
+ const onAbort = () => {
186
+ incoming?.destroy(abortReason());
187
+ req.destroy(abortReason());
188
+ reject(signal?.reason);
189
+ };
190
+ const cleanup = () => signal?.removeEventListener('abort', onAbort);
191
+ signal?.addEventListener('abort', onAbort, { once: true });
192
+ req.once('close', cleanup);
193
+ const fail = (error) => {
194
+ incoming?.destroy();
195
+ req.destroy();
196
+ cleanup();
197
+ reject(signal?.aborted ? signal.reason : toTransportError(error));
198
+ };
199
+ req.once('upgrade', (_response, socket) => {
200
+ socket.destroy();
201
+ fail(new TransportError('UPGRADE'));
202
+ });
203
+ req.once('response', (message) => {
204
+ incoming = message;
205
+ try {
206
+ resolve(toResponse(message, method));
207
+ }
208
+ catch (error) {
209
+ fail(error);
210
+ }
211
+ });
212
+ req.once('error', fail);
213
+ req.end(body === undefined ? undefined : Buffer.from(body));
214
+ });
215
+ };
216
+ }
217
+ //# sourceMappingURL=guarded-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guarded-fetch.js","sourceRoot":"","sources":["../../src/sources/guarded-fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { OrgContext } from '@package-broker/core/db/port';
2
+ import type { ProviderSource } from '@package-broker/core/sources/provider';
3
+ import type { SshArchiveStore } from './ssh-provider.js';
4
+ export type SshArchiveStoreFailure = 'invalid_options' | 'invalid_archive' | 'invalid_metadata' | 'too_large' | 'unsafe_root' | 'io';
5
+ export declare class SshArchiveStoreError extends Error {
6
+ name: string;
7
+ readonly reason: SshArchiveStoreFailure;
8
+ readonly code?: string;
9
+ constructor(reason: SshArchiveStoreFailure, code?: string);
10
+ }
11
+ export interface FilesystemArchiveStoreOptions {
12
+ readonly maxZipBytes: number;
13
+ }
14
+ export interface FilesystemArchiveStore extends SshArchiveStore {
15
+ readZip(ctx: OrgContext, source: ProviderSource, name: string, versionNormalized: string, commit: string): Promise<Uint8Array | null>;
16
+ }
17
+ export declare function archiveFileName(orgId: string, sourceId: string, name: string, versionNormalized: string, commit: string): string;
18
+ export declare function createFilesystemArchiveStore(root: string, options: FilesystemArchiveStoreOptions): Promise<FilesystemArchiveStore>;
19
+ //# sourceMappingURL=ssh-archive-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-archive-store.d.ts","sourceRoot":"","sources":["../../src/sources/ssh-archive-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAoB,eAAe,EAAmB,MAAM,mBAAmB,CAAC;AAE5F,MAAM,MAAM,sBAAsB,GAChC,iBAAiB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,WAAW,GAAG,aAAa,GAAG,IAAI,CAAC;AAElG,qBAAa,oBAAqB,SAAQ,KAAK;IACpC,IAAI,SAA0B;IACvC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBACX,MAAM,EAAE,sBAAsB,EAAE,IAAI,CAAC,EAAE,MAAM;CAK1D;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAuB,SAAQ,eAAe;IAC7D,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;AA+BD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,MAAM,GACb,MAAM,CAIR;AAiJD,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,sBAAsB,CAAC,CA2FjC"}
@@ -0,0 +1,284 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { constants } from 'node:fs';
3
+ import { link, lstat, mkdir, open, readdir, realpath, unlink } from 'node:fs/promises';
4
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
5
+ export class SshArchiveStoreError extends Error {
6
+ name = 'SshArchiveStoreError';
7
+ reason;
8
+ code;
9
+ constructor(reason, code) {
10
+ super(`ssh archive store: ${reason}`);
11
+ this.reason = reason;
12
+ if (code !== undefined)
13
+ this.code = code;
14
+ }
15
+ }
16
+ const STAGING_DIRECTORY = '.staging';
17
+ const STAGING_PREFIX = '.stage-';
18
+ const STALE_STAGING_MS = 60 * 60 * 1000;
19
+ const SHA1 = /^[0-9a-f]{40}$/;
20
+ const TIME = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$/;
21
+ const ERRNO = /^E[A-Z0-9]{1,15}$/;
22
+ const READ_FLAGS = constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK;
23
+ const STAGE_FLAGS = constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW;
24
+ const DIRECTORY_FLAGS = constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW;
25
+ const FILE_MODE = 0o600;
26
+ const DIRECTORY_MODE = 0o700;
27
+ const STICKY = 0o1000;
28
+ const HEADER_BYTES = 4;
29
+ const MAX_META_BYTES = 1024;
30
+ function code(error) {
31
+ return error instanceof Error ? error.code : undefined;
32
+ }
33
+ function wrap(error) {
34
+ if (error instanceof SshArchiveStoreError)
35
+ return error;
36
+ const errno = code(error);
37
+ return new SshArchiveStoreError('io', errno !== undefined && ERRNO.test(errno) ? errno : undefined);
38
+ }
39
+ export function archiveFileName(orgId, sourceId, name, versionNormalized, commit) {
40
+ return createHash('sha256')
41
+ .update(JSON.stringify([orgId, sourceId, name, versionNormalized, commit]))
42
+ .digest('hex');
43
+ }
44
+ async function syncDirectory(directory) {
45
+ const handle = await open(directory, DIRECTORY_FLAGS);
46
+ try {
47
+ await handle.sync();
48
+ }
49
+ finally {
50
+ await handle.close();
51
+ }
52
+ }
53
+ async function requireDirectory(path, create) {
54
+ if (create) {
55
+ try {
56
+ await mkdir(path, { mode: DIRECTORY_MODE });
57
+ }
58
+ catch (error) {
59
+ if (code(error) !== 'EEXIST')
60
+ throw error;
61
+ }
62
+ }
63
+ const stats = await lstat(path);
64
+ if (stats.isSymbolicLink() || !stats.isDirectory())
65
+ throw new SshArchiveStoreError('unsafe_root');
66
+ }
67
+ async function requireTrustedAncestors(root) {
68
+ const uid = typeof process.getuid === 'function' ? process.getuid() : undefined;
69
+ for (let path = dirname(root);; path = dirname(path)) {
70
+ const stats = await lstat(path);
71
+ const untrustedOwner = uid !== undefined && stats.uid !== uid && stats.uid !== 0;
72
+ const sharedWritable = (stats.mode & 0o022) !== 0 && (stats.mode & STICKY) === 0;
73
+ if (untrustedOwner || sharedWritable)
74
+ throw new SshArchiveStoreError('unsafe_root');
75
+ if (dirname(path) === path)
76
+ return;
77
+ }
78
+ }
79
+ async function sweepStaging(staging) {
80
+ const cutoff = Date.now() - STALE_STAGING_MS;
81
+ for (const entry of await readdir(staging)) {
82
+ if (!entry.startsWith(STAGING_PREFIX))
83
+ continue;
84
+ const path = join(staging, entry);
85
+ const stats = await lstat(path).catch(() => null);
86
+ if (stats !== null && !stats.isDirectory() && stats.mtimeMs < cutoff) {
87
+ await unlink(path).catch(() => undefined);
88
+ }
89
+ }
90
+ }
91
+ async function prepareRoot(root) {
92
+ if (process.platform !== 'win32' && (!constants.O_NOFOLLOW || !constants.O_DIRECTORY)) {
93
+ throw new SshArchiveStoreError('unsafe_root');
94
+ }
95
+ if (typeof root !== 'string' || !isAbsolute(root) || resolve(root) !== root) {
96
+ throw new SshArchiveStoreError('unsafe_root');
97
+ }
98
+ await mkdir(root, { recursive: true, mode: DIRECTORY_MODE });
99
+ await requireDirectory(root, false);
100
+ if ((await realpath(root)) !== root)
101
+ throw new SshArchiveStoreError('unsafe_root');
102
+ const stats = await lstat(root);
103
+ if (typeof process.getuid === 'function' && stats.uid !== process.getuid()) {
104
+ throw new SshArchiveStoreError('unsafe_root');
105
+ }
106
+ if ((stats.mode & 0o022) !== 0)
107
+ throw new SshArchiveStoreError('unsafe_root');
108
+ await requireTrustedAncestors(root);
109
+ const staging = join(root, STAGING_DIRECTORY);
110
+ await requireDirectory(staging, true);
111
+ await sweepStaging(staging);
112
+ }
113
+ async function writeAll(handle, chunk) {
114
+ let at = 0;
115
+ while (at < chunk.length) {
116
+ const { bytesWritten } = await handle.write(chunk, at, chunk.length - at, null);
117
+ at += bytesWritten;
118
+ }
119
+ }
120
+ async function readExactly(handle, length, position) {
121
+ const buffer = new Uint8Array(length);
122
+ let at = 0;
123
+ while (at < length) {
124
+ const { bytesRead } = await handle.read(buffer, at, length - at, position + at);
125
+ if (bytesRead === 0)
126
+ throw new SshArchiveStoreError('io');
127
+ at += bytesRead;
128
+ }
129
+ return buffer;
130
+ }
131
+ async function openRegular(path) {
132
+ let handle;
133
+ try {
134
+ handle = await open(path, READ_FLAGS);
135
+ }
136
+ catch (error) {
137
+ if (code(error) === 'ENOENT')
138
+ return null;
139
+ throw error;
140
+ }
141
+ try {
142
+ if (!(await handle.stat()).isFile())
143
+ throw new SshArchiveStoreError('io');
144
+ }
145
+ catch (error) {
146
+ await handle.close().catch(() => undefined);
147
+ throw error;
148
+ }
149
+ return handle;
150
+ }
151
+ async function readStored(handle) {
152
+ const size = (await handle.stat()).size;
153
+ const header = await readExactly(handle, HEADER_BYTES, 0);
154
+ const metaLength = new DataView(header.buffer).getUint32(0);
155
+ if (metaLength > MAX_META_BYTES || HEADER_BYTES + metaLength > size) {
156
+ throw new SshArchiveStoreError('io');
157
+ }
158
+ const meta = JSON.parse(new TextDecoder().decode(await readExactly(handle, metaLength, HEADER_BYTES)));
159
+ if (meta === null || typeof meta !== 'object')
160
+ throw new SshArchiveStoreError('io');
161
+ const { sha1, time } = meta;
162
+ if (typeof sha1 !== 'string' || !SHA1.test(sha1) || (time !== null && typeof time !== 'string')) {
163
+ throw new SshArchiveStoreError('io');
164
+ }
165
+ return { record: { sha1, time }, zipOffset: HEADER_BYTES + metaLength, size };
166
+ }
167
+ function encode(built) {
168
+ if (!(built.zip instanceof Uint8Array) ||
169
+ typeof built.sha1 !== 'string' ||
170
+ !SHA1.test(built.sha1)) {
171
+ throw new SshArchiveStoreError('invalid_archive');
172
+ }
173
+ if (built.time !== null && (typeof built.time !== 'string' || !TIME.test(built.time))) {
174
+ throw new SshArchiveStoreError('invalid_metadata');
175
+ }
176
+ const meta = new TextEncoder().encode(JSON.stringify({ sha1: built.sha1, time: built.time }));
177
+ if (meta.length > MAX_META_BYTES)
178
+ throw new SshArchiveStoreError('invalid_metadata');
179
+ const header = new Uint8Array(HEADER_BYTES);
180
+ new DataView(header.buffer).setUint32(0, meta.length);
181
+ return [header, meta, built.zip];
182
+ }
183
+ export async function createFilesystemArchiveStore(root, options) {
184
+ const maxZipBytes = options?.maxZipBytes;
185
+ if (typeof maxZipBytes !== 'number' || !Number.isSafeInteger(maxZipBytes) || maxZipBytes < 1) {
186
+ throw new SshArchiveStoreError('invalid_options');
187
+ }
188
+ try {
189
+ await prepareRoot(root);
190
+ }
191
+ catch (error) {
192
+ throw wrap(error);
193
+ }
194
+ const staging = join(root, STAGING_DIRECTORY);
195
+ const finalPath = (ctx, src, name, version, commit) => join(root, archiveFileName(ctx.orgId, src.id, name, version, commit));
196
+ return Object.freeze({
197
+ async find(ctx, src, name, version, commit) {
198
+ try {
199
+ const handle = await openRegular(finalPath(ctx, src, name, version, commit));
200
+ if (handle === null)
201
+ return null;
202
+ try {
203
+ return { ...(await readStored(handle)).record };
204
+ }
205
+ finally {
206
+ await handle.close();
207
+ }
208
+ }
209
+ catch (error) {
210
+ throw wrap(error);
211
+ }
212
+ },
213
+ async readZip(ctx, src, name, version, commit) {
214
+ try {
215
+ const handle = await openRegular(finalPath(ctx, src, name, version, commit));
216
+ if (handle === null)
217
+ return null;
218
+ try {
219
+ const stored = await readStored(handle);
220
+ const length = stored.size - stored.zipOffset;
221
+ if (length > maxZipBytes)
222
+ throw new SshArchiveStoreError('too_large');
223
+ return await readExactly(handle, length, stored.zipOffset);
224
+ }
225
+ finally {
226
+ await handle.close();
227
+ }
228
+ }
229
+ catch (error) {
230
+ throw wrap(error);
231
+ }
232
+ },
233
+ async store(ctx, src, name, built) {
234
+ const parts = encode(built);
235
+ if (built.zip.byteLength > maxZipBytes)
236
+ throw new SshArchiveStoreError('too_large');
237
+ const target = finalPath(ctx, src, name, built.versionNormalized, built.commit);
238
+ let tempPath = null;
239
+ try {
240
+ await requireDirectory(staging, true);
241
+ let handle = null;
242
+ while (handle === null) {
243
+ const candidate = join(staging, STAGING_PREFIX + randomBytes(16).toString('hex'));
244
+ try {
245
+ handle = await open(candidate, STAGE_FLAGS, FILE_MODE);
246
+ tempPath = candidate;
247
+ }
248
+ catch (error) {
249
+ if (code(error) !== 'EEXIST')
250
+ throw error;
251
+ }
252
+ }
253
+ try {
254
+ for (const part of parts)
255
+ await writeAll(handle, part);
256
+ await handle.sync();
257
+ }
258
+ finally {
259
+ await handle.close();
260
+ }
261
+ try {
262
+ await link(tempPath, target);
263
+ }
264
+ catch (error) {
265
+ if (code(error) !== 'EEXIST')
266
+ throw error;
267
+ const existing = await openRegular(target);
268
+ await existing?.close();
269
+ if (existing === null)
270
+ throw new SshArchiveStoreError('io');
271
+ }
272
+ }
273
+ catch (error) {
274
+ throw wrap(error);
275
+ }
276
+ finally {
277
+ if (tempPath !== null)
278
+ await unlink(tempPath).catch(() => undefined);
279
+ }
280
+ await syncDirectory(root).catch(() => undefined);
281
+ },
282
+ });
283
+ }
284
+ //# sourceMappingURL=ssh-archive-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-archive-store.js","sourceRoot":"","sources":["../../src/sources/ssh-archive-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type ChildProcess, type SpawnOptions } from 'node:child_process';
2
+ import type { SshKeyMaterial } from '@package-broker/core/sources/credentials';
3
+ import type { DnsGuard } from './dns-guard.js';
4
+ export type SshGitReason = 'invalid_host' | 'invalid_user' | 'invalid_port' | 'invalid_path' | 'invalid_ref' | 'unsafe_temp_path' | 'no_address' | 'connect_failed' | 'host_key_mismatch' | 'auth_failed' | 'not_found' | 'timeout' | 'output_too_large' | 'repository_too_large' | 'git_failed' | 'closed';
5
+ export declare class SshGitError extends Error {
6
+ readonly reason: SshGitReason;
7
+ readonly name = "SshGitError";
8
+ constructor(reason: SshGitReason);
9
+ }
10
+ export interface SshRemote {
11
+ readonly host: string;
12
+ readonly port?: number;
13
+ readonly user?: string;
14
+ readonly path: string;
15
+ }
16
+ export type SpawnGit = (command: string, args: readonly string[], options: SpawnOptions) => ChildProcess;
17
+ export interface SshGitOptions {
18
+ readonly dnsGuard: DnsGuard;
19
+ readonly credential: Pick<SshKeyMaterial, 'privateKeyPem' | 'knownHosts'>;
20
+ readonly tmpRoot?: string;
21
+ readonly timeoutMs?: number;
22
+ readonly maxStdoutBytes?: number;
23
+ readonly maxRepoBytes?: number;
24
+ readonly spawn?: SpawnGit;
25
+ }
26
+ export interface RemoteRef {
27
+ readonly name: string;
28
+ readonly sha: string;
29
+ readonly peeled?: string;
30
+ readonly symref?: string;
31
+ }
32
+ export interface FetchOptions {
33
+ readonly filter: 'blob:none' | 'none';
34
+ readonly depth: 1;
35
+ }
36
+ export interface SshGitSession {
37
+ lsRemote(): Promise<RemoteRef[]>;
38
+ fetchRefs(refs: readonly string[], options: FetchOptions): Promise<void>;
39
+ catFile(ref: string, path: string): Promise<Buffer>;
40
+ commitTime(ref: string): Promise<string>;
41
+ archiveZip(ref: string): Promise<Buffer>;
42
+ close(): Promise<void>;
43
+ }
44
+ export declare function withSshGitSession<T>(remote: SshRemote, options: SshGitOptions, work: (session: SshGitSession) => Promise<T>): Promise<T>;
45
+ export declare function openSshGitSession(remote: SshRemote, options: SshGitOptions): Promise<SshGitSession>;
46
+ //# sourceMappingURL=ssh-git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-git.d.ts","sourceRoot":"","sources":["../../src/sources/ssh-git.ts"],"names":[],"mappings":"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"}