@beignet/core 0.0.32 → 0.0.34

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 (139) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +409 -34
  3. package/dist/application/index.d.ts.map +1 -1
  4. package/dist/application/index.js +63 -47
  5. package/dist/application/index.js.map +1 -1
  6. package/dist/contracts/contract-builder.d.ts +0 -4
  7. package/dist/contracts/contract-builder.d.ts.map +1 -1
  8. package/dist/contracts/contract-builder.js +0 -6
  9. package/dist/contracts/contract-builder.js.map +1 -1
  10. package/dist/events/index.d.ts +6 -0
  11. package/dist/events/index.d.ts.map +1 -1
  12. package/dist/events/index.js +20 -10
  13. package/dist/events/index.js.map +1 -1
  14. package/dist/flags/index.d.ts +0 -4
  15. package/dist/flags/index.d.ts.map +1 -1
  16. package/dist/flags/index.js +0 -4
  17. package/dist/flags/index.js.map +1 -1
  18. package/dist/jobs/index.d.ts +415 -4
  19. package/dist/jobs/index.d.ts.map +1 -1
  20. package/dist/jobs/index.js +392 -3
  21. package/dist/jobs/index.js.map +1 -1
  22. package/dist/notifications/index.d.ts +194 -10
  23. package/dist/notifications/index.d.ts.map +1 -1
  24. package/dist/notifications/index.js +397 -59
  25. package/dist/notifications/index.js.map +1 -1
  26. package/dist/outbox/index.d.ts +150 -1
  27. package/dist/outbox/index.d.ts.map +1 -1
  28. package/dist/outbox/index.js +170 -1
  29. package/dist/outbox/index.js.map +1 -1
  30. package/dist/ports/events.d.ts +2 -2
  31. package/dist/ports/index.d.ts +7 -2
  32. package/dist/ports/index.d.ts.map +1 -1
  33. package/dist/ports/index.js +2 -1
  34. package/dist/ports/index.js.map +1 -1
  35. package/dist/providers/instrumentation.d.ts +4 -0
  36. package/dist/providers/instrumentation.d.ts.map +1 -1
  37. package/dist/providers/instrumentation.js.map +1 -1
  38. package/dist/providers/provider.d.ts +1 -1
  39. package/dist/schedules/index.d.ts +8 -7
  40. package/dist/schedules/index.d.ts.map +1 -1
  41. package/dist/schedules/index.js +47 -16
  42. package/dist/schedules/index.js.map +1 -1
  43. package/dist/server/hooks/index.d.ts +1 -0
  44. package/dist/server/hooks/index.d.ts.map +1 -1
  45. package/dist/server/hooks/index.js +1 -0
  46. package/dist/server/hooks/index.js.map +1 -1
  47. package/dist/server/hooks/rate-limit.d.ts +26 -13
  48. package/dist/server/hooks/rate-limit.d.ts.map +1 -1
  49. package/dist/server/hooks/rate-limit.js +28 -34
  50. package/dist/server/hooks/rate-limit.js.map +1 -1
  51. package/dist/server/hooks/security.d.ts +179 -0
  52. package/dist/server/hooks/security.d.ts.map +1 -0
  53. package/dist/server/hooks/security.js +225 -0
  54. package/dist/server/hooks/security.js.map +1 -0
  55. package/dist/server/index.d.ts +8 -0
  56. package/dist/server/index.d.ts.map +1 -1
  57. package/dist/server/index.js +8 -0
  58. package/dist/server/index.js.map +1 -1
  59. package/dist/server/instrumentation.d.ts.map +1 -1
  60. package/dist/server/instrumentation.js +22 -6
  61. package/dist/server/instrumentation.js.map +1 -1
  62. package/dist/server/request-context.d.ts +4 -0
  63. package/dist/server/request-context.d.ts.map +1 -1
  64. package/dist/server/request-context.js +3 -0
  65. package/dist/server/request-context.js.map +1 -1
  66. package/dist/server/runtime-integrity.d.ts +84 -0
  67. package/dist/server/runtime-integrity.d.ts.map +1 -0
  68. package/dist/server/runtime-integrity.js +160 -0
  69. package/dist/server/runtime-integrity.js.map +1 -0
  70. package/dist/server/server.d.ts +10 -10
  71. package/dist/server/server.d.ts.map +1 -1
  72. package/dist/server/server.js +75 -11
  73. package/dist/server/server.js.map +1 -1
  74. package/dist/server/trusted-proxy.d.ts +77 -0
  75. package/dist/server/trusted-proxy.d.ts.map +1 -0
  76. package/dist/server/trusted-proxy.js +129 -0
  77. package/dist/server/trusted-proxy.js.map +1 -0
  78. package/dist/tasks/index.d.ts +6 -7
  79. package/dist/tasks/index.d.ts.map +1 -1
  80. package/dist/tasks/index.js +22 -5
  81. package/dist/tasks/index.js.map +1 -1
  82. package/dist/tenancy/index.d.ts +41 -0
  83. package/dist/tenancy/index.d.ts.map +1 -0
  84. package/dist/tenancy/index.js +34 -0
  85. package/dist/tenancy/index.js.map +1 -0
  86. package/dist/testing/index.d.ts +1 -1
  87. package/dist/testing/index.d.ts.map +1 -1
  88. package/dist/testing/index.js +1 -0
  89. package/dist/testing/index.js.map +1 -1
  90. package/dist/tracing/execution.d.ts +14 -0
  91. package/dist/tracing/execution.d.ts.map +1 -0
  92. package/dist/tracing/execution.js +17 -0
  93. package/dist/tracing/execution.js.map +1 -0
  94. package/dist/tracing/index.d.ts +49 -0
  95. package/dist/tracing/index.d.ts.map +1 -1
  96. package/dist/tracing/index.js +59 -0
  97. package/dist/tracing/index.js.map +1 -1
  98. package/dist/uploads/client.d.ts.map +1 -1
  99. package/dist/uploads/client.js +44 -6
  100. package/dist/uploads/client.js.map +1 -1
  101. package/dist/uploads/index.d.ts +71 -0
  102. package/dist/uploads/index.d.ts.map +1 -1
  103. package/dist/uploads/index.js +344 -15
  104. package/dist/uploads/index.js.map +1 -1
  105. package/dist/webhooks/index.d.ts +55 -4
  106. package/dist/webhooks/index.d.ts.map +1 -1
  107. package/dist/webhooks/index.js +106 -2
  108. package/dist/webhooks/index.js.map +1 -1
  109. package/package.json +5 -5
  110. package/skills/app-architecture/SKILL.md +31 -2
  111. package/src/application/index.ts +88 -56
  112. package/src/contracts/contract-builder.ts +0 -7
  113. package/src/events/index.ts +27 -14
  114. package/src/flags/index.ts +0 -5
  115. package/src/jobs/index.ts +895 -7
  116. package/src/notifications/index.ts +678 -70
  117. package/src/outbox/index.ts +358 -2
  118. package/src/ports/events.ts +2 -2
  119. package/src/ports/index.ts +17 -1
  120. package/src/providers/instrumentation.ts +4 -0
  121. package/src/providers/provider.ts +1 -1
  122. package/src/schedules/index.ts +60 -26
  123. package/src/server/hooks/index.ts +10 -0
  124. package/src/server/hooks/rate-limit.ts +52 -46
  125. package/src/server/hooks/security.ts +503 -0
  126. package/src/server/index.ts +8 -0
  127. package/src/server/instrumentation.ts +25 -5
  128. package/src/server/request-context.ts +7 -0
  129. package/src/server/runtime-integrity.ts +322 -0
  130. package/src/server/server.ts +88 -35
  131. package/src/server/trusted-proxy.ts +249 -0
  132. package/src/tasks/index.ts +29 -12
  133. package/src/tenancy/index.ts +55 -0
  134. package/src/testing/index.ts +2 -0
  135. package/src/tracing/execution.ts +37 -0
  136. package/src/tracing/index.ts +137 -0
  137. package/src/uploads/client.ts +65 -6
  138. package/src/uploads/index.ts +539 -14
  139. package/src/webhooks/index.ts +238 -9
@@ -29,6 +29,43 @@ export interface UploadFileIntent {
29
29
  * File size in bytes.
30
30
  */
31
31
  size: number;
32
+ /**
33
+ * Optional expected checksum for this file. Direct uploads use this to
34
+ * verify the object bytes during completion.
35
+ */
36
+ checksum?: UploadFileChecksum;
37
+ }
38
+ /**
39
+ * Checksum algorithms supported by Beignet upload verification.
40
+ */
41
+ export type UploadChecksumAlgorithm = "sha256";
42
+ /**
43
+ * Expected or computed file checksum.
44
+ */
45
+ export interface UploadFileChecksum {
46
+ /**
47
+ * Hash algorithm used for the checksum.
48
+ */
49
+ algorithm: UploadChecksumAlgorithm;
50
+ /**
51
+ * Lowercase hex digest.
52
+ */
53
+ value: string;
54
+ }
55
+ /**
56
+ * Checksum verification requested by an upload definition.
57
+ */
58
+ export interface UploadChecksumRequirement {
59
+ /**
60
+ * Hash algorithm to compute.
61
+ */
62
+ algorithm: UploadChecksumAlgorithm;
63
+ /**
64
+ * Whether direct upload preparation/completion must include a checksum.
65
+ *
66
+ * @default true
67
+ */
68
+ required?: boolean;
32
69
  }
33
70
  /**
34
71
  * Constraints for files accepted by an upload definition.
@@ -58,6 +95,18 @@ export interface UploadFileConstraints {
58
95
  * Cache-Control value written to storage.
59
96
  */
60
97
  cacheControl?: string;
98
+ /**
99
+ * Verify supported MIME types against file signatures instead of trusting
100
+ * only the client-declared content type.
101
+ *
102
+ * @default "signature"
103
+ */
104
+ contentTypeVerification?: "signature" | false;
105
+ /**
106
+ * Request checksum verification for direct uploads and expose the requirement
107
+ * through the upload manifest so browser clients can send expected digests.
108
+ */
109
+ checksum?: UploadChecksumRequirement;
61
110
  }
62
111
  /**
63
112
  * Parsed file intent with a generated upload id and storage key.
@@ -190,6 +239,22 @@ export interface UploadFileHookArgs<Metadata, Ctx> extends UploadHookArgs<Metada
190
239
  export interface UploadCompleteHookArgs<Metadata, Ctx> extends UploadHookArgs<Metadata, Ctx> {
191
240
  files: CompletedUploadFile[];
192
241
  }
242
+ /**
243
+ * Arguments passed to `verifyFile(...)` after a file exists in storage and
244
+ * before `onComplete(...)` runs.
245
+ */
246
+ export interface UploadVerifyFileHookArgs<Metadata, Ctx> extends UploadHookArgs<Metadata, Ctx> {
247
+ file: CompletedUploadFile;
248
+ storage: StoragePort;
249
+ }
250
+ /**
251
+ * Verification result accepted by `verifyFile(...)`.
252
+ */
253
+ export type UploadFileVerificationResult = boolean | undefined | {
254
+ valid: boolean;
255
+ reason?: string;
256
+ details?: unknown;
257
+ };
193
258
  /**
194
259
  * Upload definition options.
195
260
  */
@@ -224,6 +289,11 @@ export interface DefineUploadOptions<MetadataSchema extends StandardSchema, Ctx,
224
289
  * Add storage metadata for one file.
225
290
  */
226
291
  storageMetadata?(args: UploadFileHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<StorageMetadata>;
292
+ /**
293
+ * Run after a file exists in storage and before `onComplete(...)`. Use this
294
+ * for app-owned scanning, moderation, or quarantine decisions.
295
+ */
296
+ verifyFile?(args: UploadVerifyFileHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<UploadFileVerificationResult>;
227
297
  /**
228
298
  * Run after files exist in storage.
229
299
  */
@@ -242,6 +312,7 @@ export interface UploadDef<Name extends string = string, MetadataSchema extends
242
312
  authorize?(args: UploadFileHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<UploadAuthorizeResult>;
243
313
  key(args: UploadFileHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<string>;
244
314
  storageMetadata?(args: UploadFileHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<StorageMetadata>;
315
+ verifyFile?(args: UploadVerifyFileHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<UploadFileVerificationResult>;
245
316
  onComplete?(args: UploadCompleteHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<Result>;
246
317
  }
247
318
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/uploads/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/uploads/index.ts"],"names":[],"mappings":"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"}
@@ -122,6 +122,7 @@ export function defineUpload(name, options) {
122
122
  ...(options.storageMetadata
123
123
  ? { storageMetadata: options.storageMetadata }
124
124
  : {}),
125
+ ...(options.verifyFile ? { verifyFile: options.verifyFile } : {}),
125
126
  ...(options.onComplete ? { onComplete: options.onComplete } : {}),
126
127
  };
127
128
  }
@@ -243,7 +244,9 @@ export function createUploadRouter(options) {
243
244
  const parsed = parsePrepareInput(uploadName, input);
244
245
  const ctx = await resolveCtx();
245
246
  const metadata = await parseMetadata(upload, parsed.metadata);
246
- assertFiles(upload, parsed.files);
247
+ assertFiles(upload, parsed.files, {
248
+ requireChecksum: Boolean(options.signer),
249
+ });
247
250
  const files = [];
248
251
  for (const file of parsed.files) {
249
252
  const uploadId = id();
@@ -308,7 +311,7 @@ export function createUploadRouter(options) {
308
311
  const parsed = parseCompleteInput(uploadName, input);
309
312
  const ctx = await resolveCtx();
310
313
  const metadata = await parseMetadata(upload, parsed.metadata);
311
- assertFiles(upload, parsed.files);
314
+ assertFiles(upload, parsed.files, { requireChecksum: true });
312
315
  const files = [];
313
316
  for (const file of parsed.files) {
314
317
  await assertAuthorized(upload, {
@@ -332,14 +335,29 @@ export function createUploadRouter(options) {
332
335
  },
333
336
  });
334
337
  }
335
- const object = await options.storage.stat(file.key);
338
+ const object = needsUploadBodyVerification(upload, file)
339
+ ? await options.storage.get(file.key)
340
+ : await options.storage.stat(file.key);
336
341
  if (!object) {
337
342
  throw new UploadObjectNotFoundError({
338
343
  message: `Uploaded object "${file.key}" was not found.`,
339
344
  });
340
345
  }
341
346
  assertStoredObject(upload, file, object);
342
- files.push({ ...file, object });
347
+ const verified = await verifyStoredUploadFile(upload, file, object);
348
+ const completedObject = storageObjectMetadata(object);
349
+ const completedFile = {
350
+ ...file,
351
+ ...(verified.checksum ? { checksum: verified.checksum } : {}),
352
+ object: completedObject,
353
+ };
354
+ await assertVerifiedFile(upload, {
355
+ ctx,
356
+ metadata,
357
+ file: completedFile,
358
+ storage: options.storage,
359
+ });
360
+ files.push(completedFile);
343
361
  }
344
362
  const result = await upload.onComplete?.({ ctx, metadata, files });
345
363
  instrumentation.custom({
@@ -376,45 +394,57 @@ export function createUploadRouter(options) {
376
394
  const metadata = await parseMetadata(definition, metadataFromFormData(input.formData));
377
395
  const webFiles = filesFromFormData(input.formData);
378
396
  const intents = webFiles.map(fileIntentFromFile);
379
- assertFiles(definition, intents);
397
+ assertFiles(definition, intents, { requireChecksum: false });
380
398
  const completed = [];
381
399
  for (const [index, file] of webFiles.entries()) {
382
400
  const intent = intents[index];
383
401
  if (!intent)
384
402
  continue;
403
+ const verified = await verifyBlobUploadFile(definition, intent, file);
404
+ const verifiedIntent = {
405
+ ...intent,
406
+ ...(verified.checksum ? { checksum: verified.checksum } : {}),
407
+ };
385
408
  const uploadId = id();
386
409
  await assertAuthorized(definition, {
387
410
  ctx,
388
411
  metadata,
389
- file: intent,
412
+ file: verifiedIntent,
390
413
  uploadId,
391
414
  });
392
415
  const key = await definition.key({
393
416
  ctx,
394
417
  metadata,
395
- file: intent,
418
+ file: verifiedIntent,
396
419
  uploadId,
397
420
  });
398
421
  const storageMetadata = (await definition.storageMetadata?.({
399
422
  ctx,
400
423
  metadata,
401
- file: intent,
424
+ file: verifiedIntent,
402
425
  uploadId,
403
426
  })) ?? {};
404
427
  const object = await options.storage.put(key, file, {
405
- contentType: intent.contentType,
428
+ contentType: verifiedIntent.contentType,
406
429
  ...(definition.file.cacheControl !== undefined
407
430
  ? { cacheControl: definition.file.cacheControl }
408
431
  : {}),
409
432
  metadata: storageMetadata,
410
433
  visibility: definition.file.visibility ?? "private",
411
434
  });
412
- completed.push({
413
- ...intent,
435
+ const completedFile = {
436
+ ...verifiedIntent,
414
437
  uploadId,
415
438
  key,
416
439
  object,
440
+ };
441
+ await assertVerifiedFile(definition, {
442
+ ctx,
443
+ metadata,
444
+ file: completedFile,
445
+ storage: options.storage,
417
446
  });
447
+ completed.push(completedFile);
418
448
  }
419
449
  const result = await definition.onComplete?.({
420
450
  ctx,
@@ -652,7 +682,7 @@ async function parseMetadata(upload, input) {
652
682
  }
653
683
  throw new Error("Invalid Standard Schema result: missing value");
654
684
  }
655
- function assertFiles(upload, files) {
685
+ function assertFiles(upload, files, options = {}) {
656
686
  const maxFiles = upload.file.maxFiles ?? 1;
657
687
  if (files.length === 0 || files.length > maxFiles) {
658
688
  throw new InvalidUploadFileError({
@@ -667,8 +697,11 @@ function assertFiles(upload, files) {
667
697
  details: { file },
668
698
  });
669
699
  }
700
+ assertFileChecksum(upload, file, options);
670
701
  if (upload.file.contentTypes?.length &&
671
- !upload.file.contentTypes.includes(file.contentType)) {
702
+ !upload.file.contentTypes
703
+ .map(normalizeContentType)
704
+ .includes(normalizeContentType(file.contentType))) {
672
705
  throw new InvalidUploadFileError({
673
706
  status: 415,
674
707
  message: `Upload "${upload.name}" does not accept "${file.contentType}".`,
@@ -691,6 +724,300 @@ function assertFiles(upload, files) {
691
724
  }
692
725
  }
693
726
  }
727
+ function assertFileChecksum(upload, file, options) {
728
+ const requirement = upload.file.checksum;
729
+ if (!requirement && !file.checksum)
730
+ return;
731
+ const configuredAlgorithm = requirement?.algorithm;
732
+ if (configuredAlgorithm && configuredAlgorithm !== "sha256") {
733
+ throw new InvalidUploadFileError({
734
+ message: `Upload "${upload.name}" uses an unsupported checksum algorithm.`,
735
+ details: {
736
+ algorithm: configuredAlgorithm,
737
+ },
738
+ });
739
+ }
740
+ const required = requirement
741
+ ? requirement.required !== false && options.requireChecksum === true
742
+ : false;
743
+ if (!file.checksum) {
744
+ if (!required)
745
+ return;
746
+ throw new InvalidUploadFileError({
747
+ message: `Upload "${upload.name}" requires a sha256 checksum for "${file.name}".`,
748
+ details: {
749
+ fileName: file.name,
750
+ algorithm: "sha256",
751
+ },
752
+ });
753
+ }
754
+ if (file.checksum.algorithm !== "sha256" ||
755
+ !isSha256Hex(file.checksum.value)) {
756
+ throw new InvalidUploadFileError({
757
+ message: `Upload "${upload.name}" received an invalid checksum for "${file.name}".`,
758
+ details: {
759
+ fileName: file.name,
760
+ checksum: file.checksum,
761
+ },
762
+ });
763
+ }
764
+ }
765
+ const UPLOAD_SIGNATURE_MAX_BYTES = 512;
766
+ function needsUploadBodyVerification(upload, file) {
767
+ return (needsUploadChecksumVerification(upload, file) ||
768
+ needsUploadContentTypeVerification(upload, file));
769
+ }
770
+ function needsUploadChecksumVerification(upload, file) {
771
+ return Boolean(file.checksum ||
772
+ (upload.file.checksum && upload.file.checksum.required !== false));
773
+ }
774
+ function needsUploadContentTypeVerification(upload, file) {
775
+ if (upload.file.contentTypeVerification === false)
776
+ return false;
777
+ if (hasContentTypeSignature(file.contentType))
778
+ return true;
779
+ return Boolean(upload.file.contentTypes?.some((contentType) => hasContentTypeSignature(contentType)));
780
+ }
781
+ async function verifyBlobUploadFile(upload, file, blob) {
782
+ if (!needsUploadBodyVerification(upload, file))
783
+ return {};
784
+ const needsChecksum = needsUploadChecksumVerification(upload, file);
785
+ const bytes = needsChecksum
786
+ ? new Uint8Array(await blob.arrayBuffer())
787
+ : new Uint8Array(await blob.slice(0, UPLOAD_SIGNATURE_MAX_BYTES).arrayBuffer());
788
+ assertUploadContentTypeSignature(upload, file, bytes);
789
+ if (!needsChecksum)
790
+ return {};
791
+ const checksum = await createUploadChecksum(bytes);
792
+ assertUploadChecksum(upload, file, checksum);
793
+ return { checksum };
794
+ }
795
+ async function verifyStoredUploadFile(upload, file, object) {
796
+ if (!needsUploadBodyVerification(upload, file))
797
+ return {};
798
+ if (!("bytes" in object)) {
799
+ throw new InvalidUploadFileError({
800
+ message: `Uploaded object "${object.key}" must be readable for verification.`,
801
+ details: {
802
+ key: object.key,
803
+ },
804
+ });
805
+ }
806
+ const needsChecksum = needsUploadChecksumVerification(upload, file);
807
+ const bytes = needsChecksum
808
+ ? await object.bytes()
809
+ : await readObjectPrefix(object, UPLOAD_SIGNATURE_MAX_BYTES);
810
+ assertUploadContentTypeSignature(upload, file, bytes);
811
+ if (!needsChecksum)
812
+ return {};
813
+ const checksum = await createUploadChecksum(bytes);
814
+ assertUploadChecksum(upload, file, checksum);
815
+ return { checksum };
816
+ }
817
+ function storageObjectMetadata(object) {
818
+ return {
819
+ key: object.key,
820
+ size: object.size,
821
+ ...(object.contentType !== undefined
822
+ ? { contentType: object.contentType }
823
+ : {}),
824
+ ...(object.cacheControl !== undefined
825
+ ? { cacheControl: object.cacheControl }
826
+ : {}),
827
+ metadata: object.metadata,
828
+ visibility: object.visibility,
829
+ lastModified: object.lastModified,
830
+ };
831
+ }
832
+ function assertUploadContentTypeSignature(upload, file, bytes) {
833
+ if (upload.file.contentTypeVerification === false)
834
+ return;
835
+ const declaredContentType = normalizeContentType(file.contentType);
836
+ const acceptedContentTypes = upload.file.contentTypes?.map(normalizeContentType) ?? [];
837
+ const detectedContentType = detectSupportedContentType(bytes);
838
+ if (detectedContentType &&
839
+ acceptedContentTypes.length > 0 &&
840
+ !acceptedContentTypes.includes(detectedContentType)) {
841
+ throw new InvalidUploadFileError({
842
+ status: 415,
843
+ message: `Upload "${upload.name}" does not accept detected content type "${detectedContentType}".`,
844
+ details: {
845
+ fileName: file.name,
846
+ declaredContentType,
847
+ detectedContentType,
848
+ acceptedContentTypes,
849
+ },
850
+ });
851
+ }
852
+ if (hasContentTypeSignature(declaredContentType) &&
853
+ !matchesContentTypeSignature(declaredContentType, bytes)) {
854
+ throw new InvalidUploadFileError({
855
+ status: 415,
856
+ message: `Upload "${upload.name}" content type "${declaredContentType}" does not match the file bytes.`,
857
+ details: {
858
+ fileName: file.name,
859
+ expectedContentType: declaredContentType,
860
+ detectedContentType: detectedContentType ?? "unknown",
861
+ },
862
+ });
863
+ }
864
+ }
865
+ function assertUploadChecksum(upload, file, actual) {
866
+ if (!file.checksum)
867
+ return;
868
+ if (file.checksum.value.toLowerCase() === actual.value)
869
+ return;
870
+ throw new InvalidUploadFileError({
871
+ message: `Upload "${upload.name}" checksum does not match "${file.name}".`,
872
+ details: {
873
+ fileName: file.name,
874
+ algorithm: "sha256",
875
+ expected: file.checksum.value.toLowerCase(),
876
+ actual: actual.value,
877
+ },
878
+ });
879
+ }
880
+ async function assertVerifiedFile(upload, args) {
881
+ if (!upload.verifyFile)
882
+ return;
883
+ const result = await upload.verifyFile(args);
884
+ const invalid = result === false ||
885
+ (typeof result === "object" &&
886
+ result !== null &&
887
+ "valid" in result &&
888
+ result.valid === false);
889
+ if (!invalid)
890
+ return;
891
+ throw new InvalidUploadFileError({
892
+ message: typeof result === "object" && result?.reason
893
+ ? result.reason
894
+ : `Upload "${upload.name}" file "${args.file.name}" did not pass verification.`,
895
+ details: typeof result === "object" && "details" in result
896
+ ? result.details
897
+ : {
898
+ fileName: args.file.name,
899
+ key: args.file.key,
900
+ },
901
+ });
902
+ }
903
+ async function readObjectPrefix(object, maxBytes) {
904
+ const reader = object.stream().getReader();
905
+ const chunks = [];
906
+ let total = 0;
907
+ try {
908
+ while (total < maxBytes) {
909
+ const result = await reader.read();
910
+ if (result.done)
911
+ break;
912
+ const remaining = maxBytes - total;
913
+ const chunk = result.value.byteLength > remaining
914
+ ? result.value.slice(0, remaining)
915
+ : result.value;
916
+ chunks.push(chunk);
917
+ total += chunk.byteLength;
918
+ if (result.value.byteLength > remaining)
919
+ break;
920
+ }
921
+ }
922
+ finally {
923
+ await reader.cancel().catch(() => undefined);
924
+ reader.releaseLock();
925
+ }
926
+ const bytes = new Uint8Array(total);
927
+ let offset = 0;
928
+ for (const chunk of chunks) {
929
+ bytes.set(chunk, offset);
930
+ offset += chunk.byteLength;
931
+ }
932
+ return bytes;
933
+ }
934
+ async function createUploadChecksum(bytes) {
935
+ if (!globalThis.crypto?.subtle) {
936
+ throw new InvalidUploadFileError({
937
+ message: "Upload checksum verification requires Web Crypto.",
938
+ });
939
+ }
940
+ const buffer = new ArrayBuffer(bytes.byteLength);
941
+ new Uint8Array(buffer).set(bytes);
942
+ const digest = await globalThis.crypto.subtle.digest("SHA-256", buffer);
943
+ return {
944
+ algorithm: "sha256",
945
+ value: bytesToHex(new Uint8Array(digest)),
946
+ };
947
+ }
948
+ function bytesToHex(bytes) {
949
+ return [...bytes].map((byte) => byte.toString(16).padStart(2, "0")).join("");
950
+ }
951
+ function isSha256Hex(value) {
952
+ return /^[a-f0-9]{64}$/i.test(value);
953
+ }
954
+ function normalizeContentType(contentType) {
955
+ return contentType.split(";")[0]?.trim().toLowerCase() ?? "";
956
+ }
957
+ function hasContentTypeSignature(contentType) {
958
+ return SIGNATURE_CONTENT_TYPES.has(normalizeContentType(contentType));
959
+ }
960
+ function matchesContentTypeSignature(contentType, bytes) {
961
+ const normalized = normalizeContentType(contentType);
962
+ switch (normalized) {
963
+ case "application/pdf":
964
+ return startsWithBytes(bytes, [0x25, 0x50, 0x44, 0x46, 0x2d]);
965
+ case "application/zip":
966
+ return (startsWithBytes(bytes, [0x50, 0x4b, 0x03, 0x04]) ||
967
+ startsWithBytes(bytes, [0x50, 0x4b, 0x05, 0x06]) ||
968
+ startsWithBytes(bytes, [0x50, 0x4b, 0x07, 0x08]));
969
+ case "image/gif":
970
+ return (startsWithAscii(bytes, "GIF87a") || startsWithAscii(bytes, "GIF89a"));
971
+ case "image/jpeg":
972
+ return startsWithBytes(bytes, [0xff, 0xd8, 0xff]);
973
+ case "image/png":
974
+ return startsWithBytes(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
975
+ case "image/svg+xml":
976
+ return looksLikeSvg(bytes);
977
+ case "image/webp":
978
+ return (startsWithAscii(bytes, "RIFF") &&
979
+ bytes.length >= 12 &&
980
+ asciiAt(bytes, 8, 4) === "WEBP");
981
+ default:
982
+ return false;
983
+ }
984
+ }
985
+ function detectSupportedContentType(bytes) {
986
+ for (const contentType of SIGNATURE_CONTENT_TYPES) {
987
+ if (matchesContentTypeSignature(contentType, bytes))
988
+ return contentType;
989
+ }
990
+ return undefined;
991
+ }
992
+ const SIGNATURE_CONTENT_TYPES = new Set([
993
+ "application/pdf",
994
+ "application/zip",
995
+ "image/gif",
996
+ "image/jpeg",
997
+ "image/png",
998
+ "image/svg+xml",
999
+ "image/webp",
1000
+ ]);
1001
+ function startsWithBytes(bytes, prefix) {
1002
+ if (bytes.length < prefix.length)
1003
+ return false;
1004
+ return prefix.every((byte, index) => bytes[index] === byte);
1005
+ }
1006
+ function startsWithAscii(bytes, prefix) {
1007
+ return asciiAt(bytes, 0, prefix.length) === prefix;
1008
+ }
1009
+ function asciiAt(bytes, offset, length) {
1010
+ return String.fromCharCode(...bytes.slice(offset, offset + length));
1011
+ }
1012
+ function looksLikeSvg(bytes) {
1013
+ const text = new TextDecoder()
1014
+ .decode(bytes)
1015
+ .replace(/^\uFEFF/, "")
1016
+ .trimStart()
1017
+ .toLowerCase();
1018
+ return (text.startsWith("<svg") ||
1019
+ (text.startsWith("<?xml") && text.includes("<svg")));
1020
+ }
694
1021
  async function assertAuthorized(upload, args) {
695
1022
  if (!upload.authorize) {
696
1023
  if ((upload.access ?? "protected") === "public")
@@ -737,7 +1064,8 @@ function assertStoredObject(upload, file, object) {
737
1064
  }
738
1065
  if (object.contentType &&
739
1066
  file.contentType &&
740
- object.contentType !== file.contentType) {
1067
+ normalizeContentType(object.contentType) !==
1068
+ normalizeContentType(file.contentType)) {
741
1069
  throw new InvalidUploadFileError({
742
1070
  message: `Uploaded object "${object.key}" content type does not match the prepared file.`,
743
1071
  details: {
@@ -771,9 +1099,10 @@ function filesFromFormData(formData) {
771
1099
  return files;
772
1100
  }
773
1101
  function fileIntentFromFile(file) {
1102
+ const contentType = normalizeContentType(file.type) || "application/octet-stream";
774
1103
  return {
775
1104
  name: file.name,
776
- contentType: file.type || "application/octet-stream",
1105
+ contentType,
777
1106
  size: file.size,
778
1107
  };
779
1108
  }