@package-broker/runtime-node 0.0.0-stage → 2.0.0-rc.2

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 +22 -0
  28. package/dist/client-ip.d.ts.map +1 -0
  29. package/dist/client-ip.js +104 -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 +113 -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 +688 -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 -3
  100. package/README.md +0 -3
@@ -0,0 +1,26 @@
1
+ import { createHash } from 'node:crypto';
2
+ export function createNodeBlobHasher() {
3
+ return {
4
+ async hashStream(stream) {
5
+ const hash = createHash('sha256');
6
+ const reader = stream.getReader();
7
+ try {
8
+ for (;;) {
9
+ const { done, value } = await reader.read();
10
+ if (done)
11
+ break;
12
+ hash.update(value);
13
+ }
14
+ return new Uint8Array(hash.digest());
15
+ }
16
+ catch (error) {
17
+ await reader.cancel(error).catch(() => undefined);
18
+ throw error;
19
+ }
20
+ finally {
21
+ reader.releaseLock();
22
+ }
23
+ },
24
+ };
25
+ }
26
+ //# sourceMappingURL=hasher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasher.js","sourceRoot":"","sources":["../../src/blob/hasher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,KAAK,CAAC,UAAU,CAAC,MAAM;YACrB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,SAAS,CAAC;oBACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC5C,IAAI,IAAI;wBAAE,MAAM;oBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAClD,MAAM,KAAK,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { ByteStore } from '@package-broker/core/platform/blob';
2
+ export interface S3ByteStoreOptions {
3
+ readonly endpoint: string;
4
+ readonly region: string;
5
+ readonly bucket: string;
6
+ readonly accessKeyId: string;
7
+ readonly secretAccessKey: string;
8
+ readonly sessionToken?: string;
9
+ readonly pathStyle?: boolean;
10
+ readonly allowInsecureHttp?: boolean;
11
+ readonly fetch?: typeof fetch;
12
+ }
13
+ export declare class S3ConfigError extends Error {
14
+ readonly field: string;
15
+ name: string;
16
+ constructor(field: string);
17
+ }
18
+ export declare class S3SigningError extends Error {
19
+ name: string;
20
+ constructor();
21
+ }
22
+ export declare class S3RequestError extends Error {
23
+ readonly status: number;
24
+ name: string;
25
+ constructor(status: number);
26
+ }
27
+ export declare class S3CopyError extends Error {
28
+ name: string;
29
+ constructor();
30
+ }
31
+ export declare class S3UploadIncompleteError extends Error {
32
+ name: string;
33
+ constructor();
34
+ }
35
+ export declare class S3IntegrityError extends Error {
36
+ name: string;
37
+ constructor();
38
+ }
39
+ export declare function createS3ByteStore(options: S3ByteStoreOptions): ByteStore;
40
+ //# sourceMappingURL=s3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../src/blob/s3.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAE/E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B;AAED,qBAAa,aAAc,SAAQ,KAAK;IAE1B,QAAQ,CAAC,KAAK,EAAE,MAAM;IADzB,IAAI,SAAmB;gBACX,KAAK,EAAE,MAAM;CAGnC;AAED,qBAAa,cAAe,SAAQ,KAAK;IAC9B,IAAI,SAAoB;;CAIlC;AAED,qBAAa,cAAe,SAAQ,KAAK;IAE3B,QAAQ,CAAC,MAAM,EAAE,MAAM;IAD1B,IAAI,SAAoB;gBACZ,MAAM,EAAE,MAAM;CAGpC;AAED,qBAAa,WAAY,SAAQ,KAAK;IAC3B,IAAI,SAAiB;;CAI/B;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IACvC,IAAI,SAA6B;;CAI3C;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAChC,IAAI,SAAsB;;CAIpC;AAkPD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,CAkQxE"}
@@ -0,0 +1,494 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { AwsV4Signer } from 'aws4fetch';
3
+ import { BlobSizeMismatchError, BlobValidationError } from '@package-broker/core/platform/blob';
4
+ export class S3ConfigError extends Error {
5
+ field;
6
+ name = 'S3ConfigError';
7
+ constructor(field) {
8
+ super(`invalid S3 storage configuration: ${field}`);
9
+ this.field = field;
10
+ }
11
+ }
12
+ export class S3SigningError extends Error {
13
+ name = 'S3SigningError';
14
+ constructor() {
15
+ super('S3 request signing failed');
16
+ }
17
+ }
18
+ export class S3RequestError extends Error {
19
+ status;
20
+ name = 'S3RequestError';
21
+ constructor(status) {
22
+ super(`S3 request failed with status ${status}`);
23
+ this.status = status;
24
+ }
25
+ }
26
+ export class S3CopyError extends Error {
27
+ name = 'S3CopyError';
28
+ constructor() {
29
+ super('S3 CopyObject did not confirm the copy');
30
+ }
31
+ }
32
+ export class S3UploadIncompleteError extends Error {
33
+ name = 'S3UploadIncompleteError';
34
+ constructor() {
35
+ super('S3 answered the staging upload before the body was verified');
36
+ }
37
+ }
38
+ export class S3IntegrityError extends Error {
39
+ name = 'S3IntegrityError';
40
+ constructor() {
41
+ super('existing S3 object does not match the expected digest');
42
+ }
43
+ }
44
+ const DEFAULT_MEDIA_TYPE = 'application/octet-stream';
45
+ const STAGING_PREFIX = 'staging/';
46
+ const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
47
+ const COPY_RESPONSE_LIMIT = 64 * 1024;
48
+ const SHA256_HEX = /^[0-9a-f]{64}$/;
49
+ const SHA256_BASE64 = /^[A-Za-z0-9+/]{43}=$/;
50
+ const SAFE_KEY = /^[A-Za-z0-9._-]+(\/[A-Za-z0-9._-]+)*$/;
51
+ const CONTENT_RANGE = /^bytes (\d+)-(\d+)\/(\d+)$/;
52
+ const BUCKET = /^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$/;
53
+ const IPV4 = /^\d{1,3}(\.\d{1,3}){3}$/;
54
+ const COPY_CHILDREN = new Set([
55
+ 'ETag',
56
+ 'LastModified',
57
+ 'ChecksumCRC32',
58
+ 'ChecksumCRC32C',
59
+ 'ChecksumSHA1',
60
+ 'ChecksumSHA256',
61
+ 'ChecksumCRC64NVME',
62
+ 'ChecksumType',
63
+ ]);
64
+ const XML_DECLARATION = /^<\?xml\s+version=(["'])1\.[0-9]\1(?:\s+encoding=(["'])[A-Za-z][A-Za-z0-9._-]*\2)?(?:\s+standalone=(["'])(?:yes|no)\3)?\s*\?>/;
65
+ const COPY_ROOT_OPEN = /^<CopyObjectResult(?:\s+xmlns=(?:"[^"<>&]*"|'[^'<>&]*'))?\s*>/;
66
+ const COPY_ROOT_CLOSE = /^<\/CopyObjectResult\s*>/;
67
+ const COPY_CHILD = /^<([A-Za-z][A-Za-z0-9]*)>([^<]*)<\/\1>/;
68
+ const XML_TEXT = /^(?:[^&<]|&(?:amp|lt|gt|quot|apos|#[0-9]{1,7}|#x[0-9A-Fa-f]{1,6});)*$/;
69
+ const CHAR_REFERENCE = /&#(x[0-9A-Fa-f]+|[0-9]+);/g;
70
+ const isXmlChar = (code) => code === 0x9 ||
71
+ code === 0xa ||
72
+ code === 0xd ||
73
+ (code >= 0x20 && code <= 0xd7ff) ||
74
+ (code >= 0xe000 && code <= 0xfffd) ||
75
+ (code >= 0x10000 && code <= 0x10ffff);
76
+ function isXmlText(value) {
77
+ if (!XML_TEXT.test(value) || value.includes(']]>'))
78
+ return false;
79
+ for (const char of value) {
80
+ if (!isXmlChar(char.codePointAt(0) ?? 0))
81
+ return false;
82
+ }
83
+ for (const [, reference] of value.matchAll(CHAR_REFERENCE)) {
84
+ const code = reference.startsWith('x')
85
+ ? Number.parseInt(reference.slice(1), 16)
86
+ : Number.parseInt(reference, 10);
87
+ if (!isXmlChar(code))
88
+ return false;
89
+ }
90
+ return true;
91
+ }
92
+ function validateKey(storageKey) {
93
+ if (!SAFE_KEY.test(storageKey) || storageKey.split('/').some((s) => s === '.' || s === '..')) {
94
+ throw new BlobValidationError();
95
+ }
96
+ }
97
+ const isLoopback = (hostname) => hostname === 'localhost' || hostname === '[::1]' || /^127(\.\d{1,3}){3}$/.test(hostname);
98
+ function parseEndpoint(endpoint, allowInsecureHttp) {
99
+ let url;
100
+ try {
101
+ url = new URL(endpoint);
102
+ }
103
+ catch {
104
+ throw new S3ConfigError('endpoint');
105
+ }
106
+ const secure = url.protocol === 'https:';
107
+ const plain = url.protocol === 'http:' && (allowInsecureHttp || isLoopback(url.hostname));
108
+ if (!secure && !plain)
109
+ throw new S3ConfigError('endpoint');
110
+ if (url.username !== '' || url.password !== '' || url.search !== '' || url.hash !== '') {
111
+ throw new S3ConfigError('endpoint');
112
+ }
113
+ if (url.pathname !== '/')
114
+ throw new S3ConfigError('endpoint');
115
+ return url;
116
+ }
117
+ function validateBucket(bucket, virtualHostedHttps) {
118
+ if (!BUCKET.test(bucket) ||
119
+ bucket.includes('..') ||
120
+ bucket.includes('.-') ||
121
+ bucket.includes('-.') ||
122
+ IPV4.test(bucket) ||
123
+ bucket.startsWith('xn--') ||
124
+ bucket.endsWith('-s3alias') ||
125
+ (virtualHostedHttps && bucket.includes('.'))) {
126
+ throw new S3ConfigError('bucket');
127
+ }
128
+ }
129
+ const CREDENTIAL_LIMITS = { accessKeyId: 128, secretAccessKey: 512, sessionToken: 16384 };
130
+ const PRINTABLE_ASCII = /^[\x21-\x7e]+$/;
131
+ function validateCredentials(options) {
132
+ for (const field of ['accessKeyId', 'secretAccessKey', 'sessionToken']) {
133
+ const value = options[field];
134
+ if (value === undefined && field === 'sessionToken')
135
+ continue;
136
+ if (typeof value !== 'string' ||
137
+ value.length > CREDENTIAL_LIMITS[field] ||
138
+ !PRINTABLE_ASCII.test(value)) {
139
+ throw new S3ConfigError(field);
140
+ }
141
+ }
142
+ }
143
+ function sizeHeader(response, name) {
144
+ const text = response.headers.get(name);
145
+ if (text === null || !/^\d+$/.test(text))
146
+ throw new S3RequestError(response.status);
147
+ const value = Number(text);
148
+ if (!Number.isSafeInteger(value))
149
+ throw new S3RequestError(response.status);
150
+ return value;
151
+ }
152
+ const mediaTypeOf = (response) => response.headers.get('content-type') ?? DEFAULT_MEDIA_TYPE;
153
+ async function discard(response) {
154
+ await response.body?.cancel().catch(() => undefined);
155
+ }
156
+ function exactLength(length) {
157
+ let seen = 0;
158
+ return new TransformStream({
159
+ transform(chunk, controller) {
160
+ seen += chunk.length;
161
+ if (seen > length) {
162
+ controller.error(new BlobSizeMismatchError());
163
+ return;
164
+ }
165
+ controller.enqueue(chunk);
166
+ },
167
+ flush(controller) {
168
+ if (seen !== length)
169
+ controller.error(new BlobSizeMismatchError());
170
+ },
171
+ });
172
+ }
173
+ async function readBounded(response, limit) {
174
+ if (response.body === null)
175
+ return '';
176
+ const reader = response.body.getReader();
177
+ const chunks = [];
178
+ let total = 0;
179
+ for (;;) {
180
+ const { done, value } = await reader.read();
181
+ if (done)
182
+ break;
183
+ total += value.length;
184
+ if (total > limit) {
185
+ await reader.cancel().catch(() => undefined);
186
+ throw new S3CopyError();
187
+ }
188
+ chunks.push(value);
189
+ }
190
+ return new TextDecoder().decode(Buffer.concat(chunks));
191
+ }
192
+ function isCopyConfirmed(text) {
193
+ let rest = text.trimStart();
194
+ const declaration = XML_DECLARATION.exec(rest);
195
+ if (declaration !== null)
196
+ rest = rest.slice(declaration[0].length).trimStart();
197
+ const open = COPY_ROOT_OPEN.exec(rest);
198
+ if (open === null)
199
+ return false;
200
+ rest = rest.slice(open[0].length);
201
+ const seen = new Set();
202
+ for (;;) {
203
+ rest = rest.trimStart();
204
+ const close = COPY_ROOT_CLOSE.exec(rest);
205
+ if (close !== null)
206
+ return seen.has('ETag') && rest.slice(close[0].length).trim() === '';
207
+ const child = COPY_CHILD.exec(rest);
208
+ if (child === null)
209
+ return false;
210
+ const [whole, name = '', value = ''] = child;
211
+ if (!COPY_CHILDREN.has(name) || seen.has(name) || !isXmlText(value))
212
+ return false;
213
+ seen.add(name);
214
+ rest = rest.slice(whole.length);
215
+ }
216
+ }
217
+ function verifyingBody(reader, expected, state) {
218
+ const hash = createHash('sha256');
219
+ let seen = 0;
220
+ let held = null;
221
+ const fail = (controller, error) => {
222
+ state.error = error;
223
+ controller.error(error);
224
+ void reader.cancel(error).catch(() => undefined);
225
+ };
226
+ return new ReadableStream({
227
+ async pull(controller) {
228
+ for (;;) {
229
+ const { done, value } = await reader.read();
230
+ if (done) {
231
+ if (seen !== expected.size)
232
+ return fail(controller, new BlobSizeMismatchError());
233
+ if (hash.digest('hex') !== expected.sha256) {
234
+ return fail(controller, new BlobValidationError());
235
+ }
236
+ state.completed = true;
237
+ if (held !== null)
238
+ controller.enqueue(held);
239
+ controller.close();
240
+ return;
241
+ }
242
+ if (value.length === 0)
243
+ continue;
244
+ seen += value.length;
245
+ if (seen > expected.size)
246
+ return fail(controller, new BlobSizeMismatchError());
247
+ hash.update(value);
248
+ const previous = held;
249
+ held = value;
250
+ if (previous !== null) {
251
+ controller.enqueue(previous);
252
+ return;
253
+ }
254
+ }
255
+ },
256
+ cancel(reason) {
257
+ return reader.cancel(reason);
258
+ },
259
+ }, { highWaterMark: 0 });
260
+ }
261
+ export function createS3ByteStore(options) {
262
+ validateCredentials(options);
263
+ const endpoint = parseEndpoint(options.endpoint, options.allowInsecureHttp ?? false);
264
+ const fetchImpl = options.fetch ?? globalThis.fetch;
265
+ const pathStyle = options.pathStyle ?? false;
266
+ validateBucket(options.bucket, !pathStyle && endpoint.protocol === 'https:');
267
+ const base = new URL(endpoint.origin);
268
+ if (!pathStyle) {
269
+ base.hostname = `${options.bucket}.${endpoint.hostname}`;
270
+ if (base.host !== `${options.bucket}.${endpoint.host}`)
271
+ throw new S3ConfigError('bucket');
272
+ }
273
+ const bucketPath = pathStyle ? `/${options.bucket}` : '';
274
+ const encodeKey = (storageKey) => storageKey.split('/').map(encodeURIComponent).join('/');
275
+ const objectUrl = (storageKey) => {
276
+ validateKey(storageKey);
277
+ return new URL(`${bucketPath}/${encodeKey(storageKey)}`, base);
278
+ };
279
+ async function send(method, storageKey, headers = {}, upload) {
280
+ const url = objectUrl(storageKey);
281
+ let signed;
282
+ try {
283
+ signed = await new AwsV4Signer({
284
+ method,
285
+ url: url.toString(),
286
+ headers: upload === undefined ? { 'x-amz-content-sha256': EMPTY_SHA256, ...headers } : headers,
287
+ accessKeyId: options.accessKeyId,
288
+ secretAccessKey: options.secretAccessKey,
289
+ ...(options.sessionToken === undefined ? {} : { sessionToken: options.sessionToken }),
290
+ service: 's3',
291
+ region: options.region,
292
+ }).sign();
293
+ }
294
+ catch {
295
+ throw new S3SigningError();
296
+ }
297
+ if (signed.url.origin !== base.origin)
298
+ throw new S3ConfigError('endpoint');
299
+ const init = { method, headers: signed.headers, redirect: 'manual' };
300
+ if (upload !== undefined) {
301
+ init.body = upload.body;
302
+ init.duplex = 'half';
303
+ init.signal = upload.signal;
304
+ }
305
+ return fetchImpl(signed.url.toString(), init);
306
+ }
307
+ async function expectStatus(response, allowed) {
308
+ await discard(response);
309
+ if (!allowed.includes(response.status))
310
+ throw new S3RequestError(response.status);
311
+ }
312
+ let checksumModeSupported = true;
313
+ async function headObject(storageKey, askChecksum = false) {
314
+ const checksumMode = askChecksum && checksumModeSupported;
315
+ const response = await send('HEAD', storageKey, checksumMode ? { 'x-amz-checksum-mode': 'ENABLED' } : {});
316
+ if (checksumMode && (response.status === 400 || response.status === 501)) {
317
+ await discard(response);
318
+ checksumModeSupported = false;
319
+ return headObject(storageKey);
320
+ }
321
+ await expectStatus(response, [200, 404]);
322
+ if (response.status === 404)
323
+ return null;
324
+ return {
325
+ size: sizeHeader(response, 'content-length'),
326
+ mediaType: mediaTypeOf(response),
327
+ checksum: response.headers.get('x-amz-checksum-sha256'),
328
+ };
329
+ }
330
+ async function remove(storageKey) {
331
+ await expectStatus(await send('DELETE', storageKey), [200, 204, 404]);
332
+ }
333
+ async function hashObject(storageKey, size) {
334
+ const response = await send('GET', storageKey);
335
+ const stream = response.body;
336
+ if (response.status !== 200 || stream === null) {
337
+ await discard(response);
338
+ throw new S3RequestError(response.status);
339
+ }
340
+ const hash = createHash('sha256');
341
+ const reader = stream.pipeThrough(exactLength(size)).getReader();
342
+ try {
343
+ for (;;) {
344
+ const { done, value } = await reader.read();
345
+ if (done)
346
+ break;
347
+ hash.update(value);
348
+ }
349
+ }
350
+ catch (error) {
351
+ await reader.cancel().catch(() => undefined);
352
+ throw error;
353
+ }
354
+ return hash.digest('hex');
355
+ }
356
+ async function verifyExisting(storageKey, existing, expected) {
357
+ if (existing.size !== expected.size)
358
+ throw new BlobSizeMismatchError();
359
+ if (existing.checksum !== null && SHA256_BASE64.test(existing.checksum)) {
360
+ const stored = Buffer.from(existing.checksum, 'base64').toString('hex');
361
+ if (stored !== expected.sha256)
362
+ throw new S3IntegrityError();
363
+ return;
364
+ }
365
+ if ((await hashObject(storageKey, expected.size)) !== expected.sha256) {
366
+ throw new S3IntegrityError();
367
+ }
368
+ }
369
+ async function copy(sourceKey, targetKey) {
370
+ const response = await send('PUT', targetKey, {
371
+ 'x-amz-copy-source': `/${options.bucket}/${encodeKey(sourceKey)}`,
372
+ });
373
+ if (response.status !== 200) {
374
+ await discard(response);
375
+ throw new S3RequestError(response.status);
376
+ }
377
+ if (!isCopyConfirmed(await readBounded(response, COPY_RESPONSE_LIMIT))) {
378
+ throw new S3CopyError();
379
+ }
380
+ }
381
+ async function stage(stagingKey, body, input, verifier, signal) {
382
+ let response;
383
+ try {
384
+ response = await send('PUT', stagingKey, {
385
+ 'content-length': String(input.size),
386
+ 'content-type': input.mediaType,
387
+ 'x-amz-content-sha256': 'UNSIGNED-PAYLOAD',
388
+ 'x-amz-checksum-sha256': Buffer.from(input.sha256, 'hex').toString('base64'),
389
+ }, { body, signal });
390
+ }
391
+ catch (error) {
392
+ throw verifier.error ?? error;
393
+ }
394
+ await discard(response);
395
+ if (verifier.error !== null)
396
+ throw verifier.error;
397
+ if (response.status !== 200)
398
+ throw new S3RequestError(response.status);
399
+ if (!verifier.completed)
400
+ throw new S3UploadIncompleteError();
401
+ }
402
+ return Object.freeze({
403
+ async putVerified(storageKey, source, input) {
404
+ validateKey(storageKey);
405
+ if (!SHA256_HEX.test(input.sha256) ||
406
+ !storageKey.endsWith(`/${input.sha256}`) ||
407
+ storageKey.startsWith(STAGING_PREFIX)) {
408
+ throw new BlobValidationError();
409
+ }
410
+ const stagingKey = `${STAGING_PREFIX}${randomUUID()}`;
411
+ const abort = new AbortController();
412
+ const verifier = { completed: false, error: null };
413
+ const reader = source.getReader();
414
+ const body = verifyingBody(reader, input, verifier);
415
+ try {
416
+ await stage(stagingKey, body, input, verifier, abort.signal);
417
+ const existing = await headObject(storageKey, true);
418
+ let mediaType = input.mediaType;
419
+ if (existing === null) {
420
+ await copy(stagingKey, storageKey);
421
+ }
422
+ else {
423
+ await verifyExisting(storageKey, existing, input);
424
+ mediaType = existing.mediaType;
425
+ }
426
+ await remove(stagingKey).catch(() => undefined);
427
+ return { size: input.size, mediaType };
428
+ }
429
+ catch (error) {
430
+ abort.abort();
431
+ await reader.cancel().catch(() => undefined);
432
+ await remove(stagingKey).catch(() => undefined);
433
+ throw error;
434
+ }
435
+ },
436
+ async get(storageKey, range) {
437
+ const headers = range === undefined
438
+ ? {}
439
+ : { range: `bytes=${range.offset}-${range.offset + range.length - 1}` };
440
+ const response = await send('GET', storageKey, headers);
441
+ if (response.status === 404) {
442
+ await discard(response);
443
+ return null;
444
+ }
445
+ try {
446
+ const stream = response.body;
447
+ if (range === undefined) {
448
+ if (response.status !== 200 || stream === null)
449
+ throw new S3RequestError(response.status);
450
+ const size = sizeHeader(response, 'content-length');
451
+ return {
452
+ size,
453
+ mediaType: mediaTypeOf(response),
454
+ range: null,
455
+ body: stream.pipeThrough(exactLength(size)),
456
+ };
457
+ }
458
+ if (response.status === 200)
459
+ throw new BlobSizeMismatchError();
460
+ if (response.status !== 206 || stream === null)
461
+ throw new S3RequestError(response.status);
462
+ const match = CONTENT_RANGE.exec(response.headers.get('content-range') ?? '');
463
+ const start = Number(match?.[1]);
464
+ const end = Number(match?.[2]);
465
+ const total = Number(match?.[3]);
466
+ const declared = response.headers.get('content-length');
467
+ if (match === null ||
468
+ start !== range.offset ||
469
+ end !== range.offset + range.length - 1 ||
470
+ !Number.isSafeInteger(total) ||
471
+ end >= total ||
472
+ (declared !== null && declared !== String(range.length))) {
473
+ throw new BlobSizeMismatchError();
474
+ }
475
+ return {
476
+ size: total,
477
+ mediaType: mediaTypeOf(response),
478
+ range: { offset: range.offset, length: range.length },
479
+ body: stream.pipeThrough(exactLength(range.length)),
480
+ };
481
+ }
482
+ catch (error) {
483
+ await discard(response);
484
+ throw error;
485
+ }
486
+ },
487
+ async head(storageKey) {
488
+ const found = await headObject(storageKey);
489
+ return found === null ? null : { size: found.size, mediaType: found.mediaType };
490
+ },
491
+ remove,
492
+ });
493
+ }
494
+ //# sourceMappingURL=s3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/blob/s3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Cache } from '@package-broker/core/platform/cache';
2
+ export interface LruCacheOptions {
3
+ readonly maxBytes?: number;
4
+ readonly maxEntries?: number;
5
+ readonly maxEntryBytes?: number;
6
+ }
7
+ export declare function createLruCache(options?: LruCacheOptions): Cache;
8
+ //# sourceMappingURL=lru.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lru.d.ts","sourceRoot":"","sources":["../../src/cache/lru.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,KAAK,EAAiB,MAAM,qCAAqC,CAAC;AAE/F,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAuCD,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,KAAK,CAkFnE"}