@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,631 @@
1
+ import { randomBytes, createHash } from 'node:crypto';
2
+ import { constants } from 'node:fs';
3
+ import { link, lstat, mkdir, open, readdir, realpath, rename, rm, unlink, utimes, } from 'node:fs/promises';
4
+ import { dirname, isAbsolute, join, parse, resolve, sep } from 'node:path';
5
+ import { Readable } from 'node:stream';
6
+ import { BlobBusyError, BlobRangeError, BlobSizeMismatchError, BlobValidationError, } from '@package-broker/core/platform/blob';
7
+ export class FilesystemUnsafePathError extends Error {
8
+ name = 'FilesystemUnsafePathError';
9
+ constructor() {
10
+ super('unsafe path under the blob root');
11
+ }
12
+ }
13
+ export class FilesystemRootError extends Error {
14
+ name = 'FilesystemRootError';
15
+ constructor(problem) {
16
+ super(`blob root ${problem}`);
17
+ }
18
+ }
19
+ export class FilesystemIntegrityError extends Error {
20
+ name = 'FilesystemIntegrityError';
21
+ constructor() {
22
+ super('stored object does not match its digest');
23
+ }
24
+ }
25
+ const COMPONENT = /^[A-Za-z0-9_-]{1,255}$/;
26
+ const MAX_COMPONENTS = 8;
27
+ const STAGING_DIRECTORY = '.staging';
28
+ const STAGING_PREFIX = '.stage-';
29
+ const PROBE_PREFIX = '.probe-';
30
+ const CLAIM_PREFIX = '.claim-';
31
+ const INSTANCE_NAME = /^[0-9a-f]{32}$/;
32
+ const SWEEP_NAME = /^[0-9a-f]{32}\.sweep-[0-9a-f]{32}$/;
33
+ const STALE_STAGING_MS = 24 * 60 * 60 * 1000;
34
+ const REFRESH_MS = 60 * 60 * 1000;
35
+ const ORPHAN_SIDECAR_MS = 5 * 60 * 1000;
36
+ const MEDIA_SUFFIX = '.media';
37
+ const MEDIA_TYPE = /^[\x21-\x7e]{1,255}$/;
38
+ const READ_FLAGS = constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK;
39
+ const STAGE_FLAGS = constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW;
40
+ const DIRECTORY_FLAGS = constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW;
41
+ const FILE_MODE = 0o600;
42
+ const DIRECTORY_MODE = 0o700;
43
+ function code(error) {
44
+ return error instanceof Error ? error.code : undefined;
45
+ }
46
+ function vanishedAsBusy(error) {
47
+ return code(error) === 'ENOENT' ? new BlobBusyError() : error;
48
+ }
49
+ const randomName = () => randomBytes(16).toString('hex');
50
+ function parseKey(storageKey) {
51
+ if (typeof storageKey !== 'string')
52
+ throw new BlobValidationError();
53
+ const parts = storageKey.split('/');
54
+ if (parts.length > MAX_COMPONENTS || !parts.every((part) => COMPONENT.test(part))) {
55
+ throw new BlobValidationError();
56
+ }
57
+ const name = parts.pop();
58
+ if (name === undefined)
59
+ throw new BlobValidationError();
60
+ return { parents: parts, name };
61
+ }
62
+ function parseMediaType(value) {
63
+ if (typeof value !== 'string' || !MEDIA_TYPE.test(value))
64
+ throw new BlobValidationError();
65
+ return value;
66
+ }
67
+ function parsePutInput(input) {
68
+ if (input === null || typeof input !== 'object')
69
+ throw new BlobValidationError();
70
+ const { sha256, size, mediaType } = input;
71
+ if (typeof size !== 'number' ||
72
+ !Number.isSafeInteger(size) ||
73
+ size < 0 ||
74
+ typeof sha256 !== 'string' ||
75
+ !/^[0-9a-f]{64}$/.test(sha256)) {
76
+ throw new BlobValidationError();
77
+ }
78
+ return { sha256, size, mediaType: parseMediaType(mediaType) };
79
+ }
80
+ async function syncDirectory(directory) {
81
+ const handle = await open(directory, DIRECTORY_FLAGS);
82
+ try {
83
+ await handle.sync();
84
+ }
85
+ finally {
86
+ await handle.close();
87
+ }
88
+ }
89
+ async function requireDirectory(path) {
90
+ let stats;
91
+ try {
92
+ stats = await lstat(path);
93
+ }
94
+ catch (error) {
95
+ if (code(error) === 'ENOENT')
96
+ return false;
97
+ throw error;
98
+ }
99
+ if (!stats.isDirectory())
100
+ throw new FilesystemUnsafePathError();
101
+ return true;
102
+ }
103
+ async function makeDirectory(path) {
104
+ try {
105
+ await mkdir(path, { mode: DIRECTORY_MODE });
106
+ }
107
+ catch (error) {
108
+ if (code(error) !== 'EEXIST')
109
+ throw error;
110
+ }
111
+ if (!(await requireDirectory(path)))
112
+ throw new FilesystemUnsafePathError();
113
+ await syncDirectory(dirname(path));
114
+ }
115
+ async function isStale(path, cutoff) {
116
+ try {
117
+ const stats = await lstat(path);
118
+ return stats.isDirectory() && stats.mtimeMs < cutoff;
119
+ }
120
+ catch (error) {
121
+ if (code(error) === 'ENOENT')
122
+ return false;
123
+ throw error;
124
+ }
125
+ }
126
+ async function sweepStaging(stagingRoot) {
127
+ const cutoff = Date.now() - STALE_STAGING_MS;
128
+ for (const name of await readdir(stagingRoot)) {
129
+ const path = join(stagingRoot, name);
130
+ if (SWEEP_NAME.test(name)) {
131
+ if (await isStale(path, cutoff))
132
+ await rm(path, { recursive: true, force: true });
133
+ continue;
134
+ }
135
+ if (!INSTANCE_NAME.test(name) || !(await isStale(path, cutoff)))
136
+ continue;
137
+ const moved = join(stagingRoot, `${name}.sweep-${randomName()}`);
138
+ try {
139
+ await rename(path, moved);
140
+ }
141
+ catch (error) {
142
+ if (code(error) === 'ENOENT')
143
+ continue;
144
+ throw error;
145
+ }
146
+ await rm(moved, { recursive: true, force: true });
147
+ }
148
+ }
149
+ async function createInstanceDirectory(stagingRoot) {
150
+ for (;;) {
151
+ const path = join(stagingRoot, randomName());
152
+ try {
153
+ await mkdir(path, { mode: DIRECTORY_MODE });
154
+ await syncDirectory(stagingRoot);
155
+ return path;
156
+ }
157
+ catch (error) {
158
+ if (code(error) !== 'EEXIST')
159
+ throw error;
160
+ }
161
+ }
162
+ }
163
+ async function validateRoot(root) {
164
+ if (typeof root !== 'string' || !isAbsolute(root) || resolve(root) !== root) {
165
+ throw new FilesystemRootError('must be a normalized absolute path');
166
+ }
167
+ const top = parse(root).root;
168
+ const components = root
169
+ .slice(top.length)
170
+ .split(sep)
171
+ .filter((part) => part !== '');
172
+ let path = top;
173
+ let index = 0;
174
+ for (; index < components.length; index++) {
175
+ const next = join(path, components[index]);
176
+ let stats;
177
+ try {
178
+ stats = await lstat(next);
179
+ }
180
+ catch (error) {
181
+ if (code(error) === 'ENOENT')
182
+ break;
183
+ throw error;
184
+ }
185
+ if (stats.isSymbolicLink())
186
+ throw new FilesystemRootError('or a parent is a symlink');
187
+ if (!stats.isDirectory())
188
+ throw new FilesystemRootError('or a parent is not a directory');
189
+ path = next;
190
+ }
191
+ if ((await realpath(path)) !== path)
192
+ throw new FilesystemRootError('or a parent is a symlink');
193
+ for (; index < components.length; index++) {
194
+ const next = join(path, components[index]);
195
+ try {
196
+ await mkdir(next, { mode: DIRECTORY_MODE });
197
+ }
198
+ catch (error) {
199
+ if (code(error) !== 'EEXIST')
200
+ throw error;
201
+ }
202
+ const stats = await lstat(next);
203
+ if (stats.isSymbolicLink() || !stats.isDirectory()) {
204
+ throw new FilesystemRootError('or a parent changed while it was created');
205
+ }
206
+ await syncDirectory(path);
207
+ path = next;
208
+ }
209
+ const stats = await lstat(root);
210
+ if (typeof process.getuid === 'function' && stats.uid !== process.getuid()) {
211
+ throw new FilesystemRootError('is not owned by the service user');
212
+ }
213
+ if ((stats.mode & 0o022) !== 0)
214
+ throw new FilesystemRootError('is writable by group or others');
215
+ }
216
+ async function createStaging(directory) {
217
+ for (;;) {
218
+ const path = join(directory, STAGING_PREFIX + randomName());
219
+ try {
220
+ return { path, handle: await open(path, STAGE_FLAGS, FILE_MODE) };
221
+ }
222
+ catch (error) {
223
+ if (code(error) !== 'EEXIST')
224
+ throw error;
225
+ }
226
+ }
227
+ }
228
+ async function writeAll(handle, chunk) {
229
+ let at = 0;
230
+ while (at < chunk.length) {
231
+ const { bytesWritten } = await handle.write(chunk, at, chunk.length - at, null);
232
+ at += bytesWritten;
233
+ }
234
+ }
235
+ async function openRegular(path) {
236
+ let handle;
237
+ try {
238
+ handle = await open(path, READ_FLAGS);
239
+ }
240
+ catch (error) {
241
+ if (code(error) === 'ENOENT')
242
+ return null;
243
+ if (code(error) === 'ELOOP')
244
+ throw new FilesystemUnsafePathError();
245
+ throw error;
246
+ }
247
+ try {
248
+ if (!(await handle.stat()).isFile())
249
+ throw new FilesystemUnsafePathError();
250
+ }
251
+ catch (error) {
252
+ await handle.close().catch(() => undefined);
253
+ throw error;
254
+ }
255
+ return handle;
256
+ }
257
+ async function readMediaType(path) {
258
+ const handle = await openRegular(path);
259
+ if (handle === null)
260
+ return null;
261
+ try {
262
+ return parseMediaType((await handle.readFile({ encoding: 'utf8' })).toString());
263
+ }
264
+ finally {
265
+ await handle.close();
266
+ }
267
+ }
268
+ async function verifyExisting(path, sha256, size) {
269
+ const handle = await openRegular(path);
270
+ if (handle === null)
271
+ throw new BlobBusyError();
272
+ try {
273
+ if ((await handle.stat()).size !== size)
274
+ throw new FilesystemIntegrityError();
275
+ const hash = createHash('sha256');
276
+ const buffer = new Uint8Array(64 * 1024);
277
+ let position = 0;
278
+ for (;;) {
279
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, position);
280
+ if (bytesRead === 0)
281
+ break;
282
+ hash.update(buffer.subarray(0, bytesRead));
283
+ position += bytesRead;
284
+ }
285
+ if (position !== size || hash.digest('hex') !== sha256)
286
+ throw new FilesystemIntegrityError();
287
+ }
288
+ finally {
289
+ await handle.close();
290
+ }
291
+ }
292
+ async function exists(path) {
293
+ try {
294
+ await lstat(path);
295
+ return true;
296
+ }
297
+ catch (error) {
298
+ if (code(error) === 'ENOENT')
299
+ return false;
300
+ throw error;
301
+ }
302
+ }
303
+ async function isOrphanSidecar(path) {
304
+ try {
305
+ const stats = await lstat(path);
306
+ return stats.isFile() && stats.mtimeMs < Date.now() - ORPHAN_SIDECAR_MS;
307
+ }
308
+ catch (error) {
309
+ if (code(error) === 'ENOENT')
310
+ return false;
311
+ throw error;
312
+ }
313
+ }
314
+ export async function openFilesystemByteStore(options) {
315
+ const root = options?.root;
316
+ await validateRoot(root);
317
+ const stagingRoot = join(root, STAGING_DIRECTORY);
318
+ await makeDirectory(stagingRoot);
319
+ await sweepStaging(stagingRoot);
320
+ const instance = await createInstanceDirectory(stagingRoot);
321
+ const inFlight = new Set();
322
+ let refresher = null;
323
+ async function refresh() {
324
+ const now = new Date();
325
+ await utimes(instance, now, now);
326
+ }
327
+ async function stage() {
328
+ let staging;
329
+ try {
330
+ staging = await createStaging(instance);
331
+ }
332
+ catch (error) {
333
+ if (code(error) !== 'ENOENT')
334
+ throw error;
335
+ try {
336
+ await makeDirectory(stagingRoot);
337
+ await makeDirectory(instance);
338
+ staging = await createStaging(instance);
339
+ }
340
+ catch (retryError) {
341
+ throw vanishedAsBusy(retryError);
342
+ }
343
+ }
344
+ inFlight.add(staging.path);
345
+ if (refresher === null) {
346
+ refresher = setInterval(() => {
347
+ refresh().catch(() => undefined);
348
+ }, REFRESH_MS);
349
+ refresher.unref?.();
350
+ }
351
+ try {
352
+ await refresh();
353
+ }
354
+ catch (error) {
355
+ await release(staging);
356
+ throw vanishedAsBusy(error);
357
+ }
358
+ return staging;
359
+ }
360
+ async function release(staging) {
361
+ await staging.handle.close().catch(() => undefined);
362
+ try {
363
+ await unlink(staging.path);
364
+ await syncDirectory(instance);
365
+ }
366
+ catch (error) {
367
+ if (code(error) !== 'ENOENT')
368
+ throw error;
369
+ }
370
+ finally {
371
+ inFlight.delete(staging.path);
372
+ if (inFlight.size === 0 && refresher !== null) {
373
+ clearInterval(refresher);
374
+ refresher = null;
375
+ }
376
+ }
377
+ }
378
+ async function probe() {
379
+ const staging = await stage();
380
+ try {
381
+ await staging.handle.close();
382
+ const target = join(root, PROBE_PREFIX + randomName());
383
+ try {
384
+ await link(staging.path, target);
385
+ }
386
+ catch (error) {
387
+ if (code(error) === 'EXDEV') {
388
+ throw new FilesystemRootError('staging is on a different filesystem than the root');
389
+ }
390
+ throw error;
391
+ }
392
+ await unlink(target);
393
+ }
394
+ finally {
395
+ await release(staging);
396
+ }
397
+ }
398
+ await probe();
399
+ const publishing = new Map();
400
+ async function exclusive(path, task) {
401
+ const previous = publishing.get(path) ?? Promise.resolve();
402
+ const current = previous.catch(() => undefined).then(task);
403
+ publishing.set(path, current);
404
+ try {
405
+ return await current;
406
+ }
407
+ finally {
408
+ if (publishing.get(path) === current)
409
+ publishing.delete(path);
410
+ }
411
+ }
412
+ async function directoryOf(parents, create) {
413
+ let path = root;
414
+ for (const part of parents) {
415
+ path = join(path, part);
416
+ if (create)
417
+ await makeDirectory(path);
418
+ else if (!(await requireDirectory(path)))
419
+ return null;
420
+ }
421
+ return path;
422
+ }
423
+ async function publishMediaType(directory, name, mediaType) {
424
+ const staging = await stage();
425
+ try {
426
+ await writeAll(staging.handle, new TextEncoder().encode(mediaType));
427
+ await staging.handle.sync();
428
+ await staging.handle.close();
429
+ const target = join(directory, name + MEDIA_SUFFIX);
430
+ const publish = async () => {
431
+ try {
432
+ await link(staging.path, target);
433
+ return true;
434
+ }
435
+ catch (error) {
436
+ if (code(error) !== 'EEXIST')
437
+ throw vanishedAsBusy(error);
438
+ return false;
439
+ }
440
+ };
441
+ if (await publish())
442
+ return { mediaType, created: true };
443
+ if (!(await exists(join(directory, name)))) {
444
+ if (!(await isOrphanSidecar(target)))
445
+ throw new BlobBusyError();
446
+ const claim = join(directory, CLAIM_PREFIX + randomName());
447
+ try {
448
+ await rename(target, claim);
449
+ }
450
+ catch (error) {
451
+ throw vanishedAsBusy(error);
452
+ }
453
+ if (!(await isOrphanSidecar(claim))) {
454
+ await link(claim, target).catch(() => undefined);
455
+ await unlink(claim);
456
+ throw new BlobBusyError();
457
+ }
458
+ await unlink(claim);
459
+ if (await publish())
460
+ return { mediaType, created: true };
461
+ }
462
+ const existing = await readMediaType(target);
463
+ if (existing === null)
464
+ throw new BlobBusyError();
465
+ return { mediaType: existing, created: false };
466
+ }
467
+ finally {
468
+ await release(staging);
469
+ }
470
+ }
471
+ return Object.freeze({
472
+ async putVerified(storageKey, body, input) {
473
+ let key;
474
+ let expected;
475
+ try {
476
+ key = parseKey(storageKey);
477
+ expected = parsePutInput(input);
478
+ }
479
+ catch (error) {
480
+ await body.cancel().catch(() => undefined);
481
+ throw error;
482
+ }
483
+ const reader = body.getReader();
484
+ let staging = null;
485
+ let source = 'local';
486
+ try {
487
+ staging = await stage();
488
+ const hash = createHash('sha256');
489
+ let count = 0;
490
+ for (;;) {
491
+ source = 'reader';
492
+ const { done, value } = await reader.read();
493
+ source = 'local';
494
+ if (done)
495
+ break;
496
+ if (!(value instanceof Uint8Array))
497
+ throw new BlobValidationError();
498
+ count += value.length;
499
+ if (count > expected.size)
500
+ throw new BlobSizeMismatchError();
501
+ hash.update(value);
502
+ await writeAll(staging.handle, value);
503
+ }
504
+ if (count !== expected.size)
505
+ throw new BlobSizeMismatchError();
506
+ if (hash.digest('hex') !== expected.sha256)
507
+ throw new BlobValidationError();
508
+ await staging.handle.sync();
509
+ await staging.handle.close();
510
+ const directory = await directoryOf(key.parents, true);
511
+ if (directory === null)
512
+ throw new FilesystemUnsafePathError();
513
+ const finalPath = join(directory, key.name);
514
+ const staged = staging;
515
+ const stored = await exclusive(finalPath, async () => {
516
+ const sidecar = await publishMediaType(directory, key.name, expected.mediaType);
517
+ try {
518
+ await link(staged.path, finalPath);
519
+ }
520
+ catch (error) {
521
+ if (code(error) === 'EEXIST') {
522
+ await verifyExisting(finalPath, expected.sha256, expected.size);
523
+ }
524
+ else {
525
+ if (sidecar.created) {
526
+ await unlink(finalPath + MEDIA_SUFFIX).catch(() => undefined);
527
+ }
528
+ throw code(error) === 'ENOENT' ? new BlobBusyError() : error;
529
+ }
530
+ }
531
+ await syncDirectory(directory);
532
+ return sidecar.mediaType;
533
+ });
534
+ staging = null;
535
+ await release(staged);
536
+ return { size: expected.size, mediaType: stored };
537
+ }
538
+ catch (error) {
539
+ if (source === 'local')
540
+ await reader.cancel().catch(() => undefined);
541
+ if (staging !== null)
542
+ await release(staging).catch(() => undefined);
543
+ throw error;
544
+ }
545
+ finally {
546
+ reader.releaseLock();
547
+ }
548
+ },
549
+ async get(storageKey, range) {
550
+ const { parents, name } = parseKey(storageKey);
551
+ const directory = await directoryOf(parents, false);
552
+ if (directory === null)
553
+ return null;
554
+ const handle = await openRegular(join(directory, name));
555
+ if (handle === null)
556
+ return null;
557
+ let owned = true;
558
+ try {
559
+ const stats = await handle.stat();
560
+ const mediaType = await readMediaType(join(directory, name + MEDIA_SUFFIX));
561
+ if (mediaType === null)
562
+ return null;
563
+ let served = null;
564
+ if (range !== undefined) {
565
+ if (!Number.isSafeInteger(range.offset) ||
566
+ !Number.isSafeInteger(range.length) ||
567
+ range.offset < 0 ||
568
+ range.length < 1 ||
569
+ range.offset >= stats.size) {
570
+ throw new BlobRangeError();
571
+ }
572
+ served = {
573
+ offset: range.offset,
574
+ length: Math.min(range.length, stats.size - range.offset),
575
+ };
576
+ }
577
+ const stream = served === null
578
+ ? handle.createReadStream({ autoClose: true })
579
+ : handle.createReadStream({
580
+ start: served.offset,
581
+ end: served.offset + served.length - 1,
582
+ autoClose: true,
583
+ });
584
+ owned = false;
585
+ return {
586
+ size: stats.size,
587
+ mediaType,
588
+ range: served,
589
+ body: Readable.toWeb(stream),
590
+ };
591
+ }
592
+ finally {
593
+ if (owned)
594
+ await handle.close().catch(() => undefined);
595
+ }
596
+ },
597
+ async head(storageKey) {
598
+ const { parents, name } = parseKey(storageKey);
599
+ const directory = await directoryOf(parents, false);
600
+ if (directory === null)
601
+ return null;
602
+ let stats;
603
+ try {
604
+ stats = await lstat(join(directory, name));
605
+ }
606
+ catch (error) {
607
+ if (code(error) === 'ENOENT')
608
+ return null;
609
+ throw error;
610
+ }
611
+ if (!stats.isFile())
612
+ throw new FilesystemUnsafePathError();
613
+ const mediaType = await readMediaType(join(directory, name + MEDIA_SUFFIX));
614
+ return mediaType === null ? null : { size: stats.size, mediaType };
615
+ },
616
+ async remove(storageKey) {
617
+ const { parents, name } = parseKey(storageKey);
618
+ const directory = await directoryOf(parents, false);
619
+ if (directory === null)
620
+ return;
621
+ for (const file of [name + MEDIA_SUFFIX, name]) {
622
+ await unlink(join(directory, file)).catch((error) => {
623
+ if (code(error) !== 'ENOENT')
624
+ throw error;
625
+ });
626
+ }
627
+ await syncDirectory(directory);
628
+ },
629
+ });
630
+ }
631
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/blob/filesystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { BlobHasher } from '@package-broker/core/platform/blob';
2
+ export declare function createNodeBlobHasher(): BlobHasher;
3
+ //# sourceMappingURL=hasher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasher.d.ts","sourceRoot":"","sources":["../../src/blob/hasher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAErE,wBAAgB,oBAAoB,IAAI,UAAU,CAoBjD"}