@adonis-agora/media 0.8.2 → 0.9.0

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 (104) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/README.md +2 -2
  3. package/dist/providers/media_provider.d.ts.map +1 -1
  4. package/dist/providers/media_provider.js +113 -0
  5. package/dist/providers/media_provider.js.map +1 -1
  6. package/dist/src/content_type.d.ts +6 -1
  7. package/dist/src/content_type.d.ts.map +1 -1
  8. package/dist/src/content_type.js +102 -7
  9. package/dist/src/content_type.js.map +1 -1
  10. package/dist/src/define_config.d.ts +88 -5
  11. package/dist/src/define_config.d.ts.map +1 -1
  12. package/dist/src/define_config.js +7 -2
  13. package/dist/src/define_config.js.map +1 -1
  14. package/dist/src/direct_upload.d.ts +177 -0
  15. package/dist/src/direct_upload.d.ts.map +1 -0
  16. package/dist/src/direct_upload.js +299 -0
  17. package/dist/src/direct_upload.js.map +1 -0
  18. package/dist/src/direct_upload_handler.d.ts +83 -0
  19. package/dist/src/direct_upload_handler.d.ts.map +1 -0
  20. package/dist/src/direct_upload_handler.js +180 -0
  21. package/dist/src/direct_upload_handler.js.map +1 -0
  22. package/dist/src/disks/factory.d.ts +11 -3
  23. package/dist/src/disks/factory.d.ts.map +1 -1
  24. package/dist/src/disks/factory.js +5 -3
  25. package/dist/src/disks/factory.js.map +1 -1
  26. package/dist/src/disks/s3.d.ts +10 -0
  27. package/dist/src/disks/s3.d.ts.map +1 -1
  28. package/dist/src/disks/s3.js +96 -22
  29. package/dist/src/disks/s3.js.map +1 -1
  30. package/dist/src/disks/sigv4.d.ts +58 -0
  31. package/dist/src/disks/sigv4.d.ts.map +1 -0
  32. package/dist/src/disks/sigv4.js +87 -0
  33. package/dist/src/disks/sigv4.js.map +1 -0
  34. package/dist/src/disks/xml_fallback.d.ts +3 -3
  35. package/dist/src/disks/xml_fallback.js +3 -3
  36. package/dist/src/errors.d.ts +104 -0
  37. package/dist/src/errors.d.ts.map +1 -1
  38. package/dist/src/errors.js +145 -0
  39. package/dist/src/errors.js.map +1 -1
  40. package/dist/src/hls/delivery.d.ts +112 -0
  41. package/dist/src/hls/delivery.d.ts.map +1 -0
  42. package/dist/src/hls/delivery.js +118 -0
  43. package/dist/src/hls/delivery.js.map +1 -0
  44. package/dist/src/hls/playlist.d.ts +67 -0
  45. package/dist/src/hls/playlist.d.ts.map +1 -0
  46. package/dist/src/hls/playlist.js +126 -0
  47. package/dist/src/hls/playlist.js.map +1 -0
  48. package/dist/src/index.d.ts +18 -3
  49. package/dist/src/index.d.ts.map +1 -1
  50. package/dist/src/index.js +13 -2
  51. package/dist/src/index.js.map +1 -1
  52. package/dist/src/media_collection.d.ts +8 -1
  53. package/dist/src/media_collection.d.ts.map +1 -1
  54. package/dist/src/media_collection.js +23 -1
  55. package/dist/src/media_collection.js.map +1 -1
  56. package/dist/src/media_library.d.ts +32 -2
  57. package/dist/src/media_library.d.ts.map +1 -1
  58. package/dist/src/media_library.js +218 -11
  59. package/dist/src/media_library.js.map +1 -1
  60. package/dist/src/media_manager.d.ts +37 -2
  61. package/dist/src/media_manager.d.ts.map +1 -1
  62. package/dist/src/media_manager.js +54 -1
  63. package/dist/src/media_manager.js.map +1 -1
  64. package/dist/src/media_record.d.ts +22 -2
  65. package/dist/src/media_record.d.ts.map +1 -1
  66. package/dist/src/testing/fake_transformer.d.ts +32 -0
  67. package/dist/src/testing/fake_transformer.d.ts.map +1 -0
  68. package/dist/src/testing/fake_transformer.js +32 -0
  69. package/dist/src/testing/fake_transformer.js.map +1 -0
  70. package/dist/src/testing/index.d.ts +2 -0
  71. package/dist/src/testing/index.d.ts.map +1 -1
  72. package/dist/src/testing/index.js +1 -0
  73. package/dist/src/testing/index.js.map +1 -1
  74. package/dist/src/transformer.d.ts +111 -0
  75. package/dist/src/transformer.d.ts.map +1 -0
  76. package/dist/src/transformer.js +2 -0
  77. package/dist/src/transformer.js.map +1 -0
  78. package/dist/src/transformers/factory.d.ts +30 -0
  79. package/dist/src/transformers/factory.d.ts.map +1 -0
  80. package/dist/src/transformers/factory.js +34 -0
  81. package/dist/src/transformers/factory.js.map +1 -0
  82. package/dist/src/transformers/hls.d.ts +110 -0
  83. package/dist/src/transformers/hls.d.ts.map +1 -0
  84. package/dist/src/transformers/hls.js +111 -0
  85. package/dist/src/transformers/hls.js.map +1 -0
  86. package/dist/src/transformers/mediabunny.d.ts +5 -0
  87. package/dist/src/transformers/mediabunny.d.ts.map +1 -0
  88. package/dist/src/transformers/mediabunny.js +150 -0
  89. package/dist/src/transformers/mediabunny.js.map +1 -0
  90. package/dist/src/transformers/mediabunny_loader.d.ts +15 -0
  91. package/dist/src/transformers/mediabunny_loader.d.ts.map +1 -0
  92. package/dist/src/transformers/mediabunny_loader.js +21 -0
  93. package/dist/src/transformers/mediabunny_loader.js.map +1 -0
  94. package/dist/src/transformers/probe.d.ts +56 -0
  95. package/dist/src/transformers/probe.d.ts.map +1 -0
  96. package/dist/src/transformers/probe.js +32 -0
  97. package/dist/src/transformers/probe.js.map +1 -0
  98. package/dist/src/transformers/source_file.d.ts +20 -0
  99. package/dist/src/transformers/source_file.d.ts.map +1 -0
  100. package/dist/src/transformers/source_file.js +30 -0
  101. package/dist/src/transformers/source_file.js.map +1 -0
  102. package/dist/stubs/config/media.stub +12 -0
  103. package/package.json +11 -7
  104. package/LICENSE +0 -21
package/CHANGELOG.md CHANGED
@@ -1,5 +1,81 @@
1
1
  # @adonis-agora/media
2
2
 
3
+ ## 0.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#20](https://github.com/DavideCarvalho/adonis-media/pull/20) [`a44014e`](https://github.com/DavideCarvalho/adonis-media/commit/a44014eb05c1aea460c163b1dd68c98bee01c284) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Session-backed direct uploads (`media.direct`) and a hand-rolled SigV4 presigner with split internal/public endpoints
8
+
9
+ **Why a third upload flow.** For video-sized files the deciding cost is bandwidth _through the app_. The TUS path resumes beautifully but streams every chunk client→app→S3 — 2× the bytes, and the app pays for both directions. The raw direct primitives (`media.uploads.initiateDirect` & friends) send bytes straight to S3, but they are stateless: `uploadId`, the part size and every collected `ETag` live only in the client's memory, so a page reload orphans the upload — and every consuming app was growing its own tracking table to compensate. `DirectUploadManager` (`media.direct`, config `uploads.direct`) combines the halves: the browser `PUT`s multipart parts straight to S3 through presigned URLs (the app moves **no** payload), while the session — `uploadId`, the agreed `partSize`, every confirmed part ETag — persists in the existing `UploadSessionStore` SPI. Same SPI, and with `uploadSessions.lucid()` the same tables, as TUS: **zero new migrations**; a part-size marker in the session metadata keeps the two flows from ever misreading each other's sessions in a shared store. TUS remains the right tool when the disk isn't S3 or bytes must flow through the app; direct sessions when they mustn't.
10
+
11
+ The lifecycle is deliberately front-loaded and resumable at every step:
12
+
13
+ - **`initiate`** validates part-size geometry (S3's 5 MiB floor and 10,000-part cap — caught here as the new `UploadPartSizeError`, instead of as S3's `EntityTooSmall` _after_ the whole file crossed the wire) and, given a `collection`, the declared `contentType` against that collection's `acceptsMimeTypes` — read from the same registry `attach` uses, so the gate and the barrier cannot drift — before the multipart upload even opens. Then it persists the session and presigns every part URL in one local batch.
14
+ - **`confirmPart`** records each uploaded part's ETag server-side — the resume currency. Everything else is disposable client state.
15
+ - **`status`** is the resume answer: confirmed ETags plus **fresh** presigned URLs for the parts still missing — which is also why the presign TTL no longer has to be sized to "the whole upload on a slow connection"; an expired URL costs one status round-trip, not the upload.
16
+ - **`complete(id, parts?)`** merges caller-supplied and confirmed parts and fails fast naming the exact missing part numbers (`UploadPartsIncompleteError`) instead of letting S3 return an opaque `InvalidPart`; **`abort`** frees the parts S3 is storing (best-effort — a lifecycle-reaped upload must still be deletable locally); expired sessions are reaped on access exactly like TUS.
17
+
18
+ `DirectUploadHandler` is the framework-neutral HTTP half in the `TusUploadHandler` mold — the provider mounts it under `uploads.direct.routes` (default `/media/uploads/direct/sessions`), it performs **no authorization** (the app guards the route), and the client sends a `fileName`, never a key: the key is resolved server-side via `keyFor`. `MediaManager.completeDirectUploadToLibrary(sessionId, input, parts?)` mirrors `completeUploadToLibrary`: complete + `attachExisting` in one step, zero-copy, with the collection whitelist re-validated against the **real** bytes (`verifyContentAgainstWhitelist` on a 16-byte head read) — the initiate gate checked what the client _declared_; this remains the barrier that checks what it _sent_.
19
+
20
+ **Presigned URLs are now hand-rolled SigV4 (query auth, `UNSIGNED-PAYLOAD`) — the `@aws-sdk/s3-request-presigner` peer is gone.** Presigning is pure local crypto (an HMAC chain over a canonical request; no round-trip to S3), so the SDK package bought nothing except a hard coupling of the signature to the client's configured endpoint. That coupling is precisely what breaks browser-consumed URLs behind a private network: SigV4 bakes the `Host` into the signature, and a URL signed for the internal MinIO FQDN is invalid on the public one — with the SDK the only fix is constructing a second client per endpoint. Owning the signer makes it a parameter: the new `publicEndpoint` option on `disks.s3()` signs **browser-facing** URLs (direct-upload part `PUT`s, signed `GET`s) for the public host while server-side operations — including the ListObjectsV2 XML-fallback fetch — stay on the internal `endpoint`. The signer (`presignS3Url`, exported) is verified byte-for-byte against AWS's published `examplebucket` presigned-GET test vector, plus an independently recomputed `UploadPart` vector locked as a regression pin; strict RFC 3986 encoding (including the `!'()*` set `encodeURIComponent` skips) and STS session tokens are covered. Credentials and region still resolve from the SDK client's own config, so every credential source (static, env, shared config, IAM role) keeps working.
21
+
22
+ Also new: typed `UploadPartOutOfRangeError` (a confirmed part number outside the agreed slicing) and `DirectUploadsNotConfiguredError` (accessing `media.direct` without `uploads.direct`), both alongside the errors above; `direct.partSize`/`direct.presignTtlSeconds` fall back to the shared `uploads.*` knobs, with a 20 MiB default part size (direct parts occupy no app memory, so a bigger part only enlarges the retry unit). Requires bucket CORS that allows `PUT` from the app's origin and exposes the `ETag` response header — the browser must read it to confirm parts.
23
+
24
+ - [#21](https://github.com/DavideCarvalho/adonis-media/pull/21) [`75649a9`](https://github.com/DavideCarvalho/adonis-media/commit/75649a9c6793f9f8fc83da07ee2418ab9ff8432b) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Transformers — transformações de conteúdo plugáveis persistidas como conversions — com HLS de vídeo como implementação de referência
25
+
26
+ **O contrato `Transformer`.** Conversions de imagem respondem "mesma imagem, outro tamanho/formato". Tudo o mais que deriva de uma mídia — um pacote HLS, uma faixa de áudio extraída, metadados sondados, um blurhash — agora passa por um contrato único: um `Transformer` recebe um `TransformerContext` (o record, leitura do original via `getBytes`/`getStream`, o `storage` para assets auxiliares em outros disks) e produz artefatos + metadados persistidos como uma conversion nomeada no `MediaRecord`. O contrato foi validado contra os shapes possíveis antes de nascer: N artefatos com entry (HLS), 1 artefato (otimizar imagem, extrair áudio), **zero artefato** (probe/placeholder — só `meta`), input auxiliar (watermark via `context.storage`) e requisito de runtime declarável (`TransformerRuntimeMissingError` tipado para WebCodecs/peer ausente).
27
+
28
+ O sandbox é do context, não do transformer: todo `write(relativePath, contents)` cai sob o prefixo `…/conversions/<name>/`, é validado (sem `..`/caminho absoluto — `TransformerOutputError`) e **registrado** — a lista `files` persistida vem do que foi de fato escrito, nunca da contabilidade do transformer. É isso que torna um pacote de centenas de segmentos deletável (batch via `deleteMany` em disks capazes) e servível arquivo a arquivo sem aritmética de path sobre input do caller. `MediaConversion` ganhou o shape para isso: `path`/`disk` agora opcionais (transform metadata-only não tem artefato), mais `prefix`, `files` e `meta` — as conversions de imagem existentes seguem `{ path, disk }` sem migração (colunas JSON).
29
+
30
+ **Registro e disparo.** Transformers declaram-se por collection (`transformers: [transformers.hls()]`), no mesmo namespace de nomes das presets — colisão falha no boot com `TransformerConflictError`. Vídeo é pesado e assíncrono por natureza, então nada roda no attach por padrão: o app dispara `media.library.transform(id, 'hls')` do job dele (a lib não assume sistema de filas). A chamada é **idempotente** — conversion existente ⇒ skip — e falha no meio varre os artefatos parciais e nunca persiste entry, então retry recomeça limpo. `eager: true` (para transforms baratos) roda dentro de `attach` **e** `attachExisting` — o caminho do finalize TUS via `completeUploadToLibrary`, fechando o fluxo "TUS larga os bytes, transformers derivam depois" sem fiação extra — com o mesmo rollback das conversions eager (mídia nova desfeita inteira, a anterior de uma collection `single` fica de pé). Leitura nunca gera transform: `url()`/`deliver()` numa conversion de transformer ausente lançam `TransformNotReadyError` em vez de prender um request atrás de um remux (presets de imagem continuam lazy).
31
+
32
+ **`transformers.hls()` — o transformer de vídeo.** Remuxa o vídeo para HLS (segmentos MPEG-TS + playlists de mídia atrás de um master) com [mediabunny](https://mediabunny.dev) — TypeScript puro, **sem binário ffmpeg**, peer OPCIONAL importado só no primeiro `transform()` (padrão `processors.sharp()`/`disks.s3()`; ausente ⇒ `TransformerRuntimeMissingError` com hint de install, não `ERR_MODULE_NOT_FOUND` cinco imports abaixo). Incorpora os gotchas provados em produção no protótipo do eduliberta:
33
+
34
+ - **Remux-only por padrão, com o porquê documentado**: encodar exige WebCodecs, que o Node não expõe. h264/aac copia sem re-encode (sem perda, rápido); codec que o MPEG-TS não carrega (vp9/av1) falha com `HlsSourceUnsupportedError` listando codec e razão por track — definitivo para o arquivo, não retryável.
35
+ - **O trim do AAC priming**: áudio AAC com edit list começa em timestamp NEGATIVO; o default do mediabunny corta em t=0, o que tiraria a track do fast path de cópia. A conversão corta no `getFirstTimestamp()` real — todas as tracks deslocam igual, sync intacto, tudo continua stream-copy.
36
+ - **WebCodecs injetável**: `transformers.hls({ webcodecs: () => import('@napi-rs/webcodecs') })` instala a implementação em `globalThis` (só o que falta; nativo nunca é sobrescrito) e destrava o fallback de re-encode do mediabunny para fontes incompatíveis. `resolveWebCodecsSupport()` reporta `native`/`injected`/`absent`. Multi-qualidade (ladder 360p/480p/720p via fan-out) fica como evolução documentada no roadmap sobre esse mesmo seam — não é fingida hoje.
37
+
38
+ Meta persistida: duração, resolução, codecs, contagem de segmentos/playlists, targetDuration. O engine é injetável (`HlsRemuxEngine`), então a orquestração inteira (temp files, upload streaming com contentLength, content types) é testada sem mediabunny — e um teste de integração roda o mediabunny REAL contra uma fixture h264/aac de 12 KB no CI (JS puro, funciona no ubuntu-latest), provando o caminho de produção inclusive o trim.
39
+
40
+ **`transformers.probe()` — o transformer metadata-only.** Sonda duração/resolução/codecs/sample rate e persiste só `meta`, zero artefato — a prova real do shape "sem artefato" do contrato, e o substituto do serviço manual de "baixa o arquivo e lê a duração" que todo app de mídia acaba criando.
41
+
42
+ **Delivery HLS-aware.** Playlists são armazenadas com referências relativas ao layout do storage e precisam de rewrite a cada serve. `rewriteHlsPlaylist(content, rewrite)` cobre todos os lugares onde o RFC 8216 põe uma URI — linhas de URI, atributos `URI="…"` de `#EXT-X-MEDIA` (renditions de áudio), `#EXT-X-MAP`, `#EXT-X-I-FRAME-STREAM-INF`, `#EXT-X-KEY` — reescreve só referências **relativas** (absolutas/rooted ficam como estão), preserva o resto byte a byte (CRLF incluso) e aceita rewriter async. Em cima dela, `HlsDeliveryHandler` é a rota-metade framework-agnóstica no padrão `MediaDeliveryHandler`/`TusUploadHandler`: o app monta UMA rota `(:mediaId, :file?)` com o middleware dele — **a lib não decide autorização** — e o handler serve o pacote inteiro: playlist pedida ⇒ conteúdo reescrito (sub-playlists via `urlForPlaylist` do app, para cada hop voltar pela auth; segmentos via `urlForSegment` ou, por padrão, **presigned URL direto do disk** com TTL — o caso comum pronto); segmento pedido ⇒ `redirect` presigned ou `stream` proxied (`segmentDelivery`). Arquivo pedido é validado por pertencimento à lista `files` persistida — traversal estruturalmente impossível.
43
+
44
+ **Tipos inferidos da config.** `defineConfig` agora é `<const T>` e preserva nomes literais; `InferTransformers<typeof config>` / `InferConversions<typeof config>` extraem as unions de nomes (presets + transformers) para tipar payloads de job e rotas — o padrão `InferConverters` do @jrmc/adonis-attachment, sem `as const`.
45
+
46
+ **Testing kit**: `FakeTransformer` (registra contexts, escreve artefatos configurados, `behavior` custom) ao lado do `FakeImageProcessor`.
47
+
48
+ **Cortes explícitos** (registrados no roadmap, não neste PR): multi-qualidade/ladder (exige o WebCodecs injetado; seam pronto), PosterFrame (exige decoder — idem), watermark/audio-extract/image-optimize/placeholder/transcription (o contrato acomoda os seis shapes; nada de stubs mortos), DRM/EXT-X-KEY com criptografia, HLS live/low-latency (só VOD), decorator Lucid `@media` no model do app (API desenhada no roadmap; o shape novo de `MediaConversion` já a suporta sem refactor) e a rota de delivery nomeada com inferência Tuyau + helpers Edge (idem).
49
+
50
+ Sem breaking para consumidores existentes além do type de `MediaConversion` (`path`/`disk` opcionais — 0.x, sem shim): stores existentes leem os records antigos como sempre.
51
+
52
+ - [#19](https://github.com/DavideCarvalho/adonis-media/pull/19) [`f81478e`](https://github.com/DavideCarvalho/adonis-media/commit/f81478e7a683347fa4ba56c9fb8d5614c2e95477) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Magic-byte signatures for the common video containers — and with them, video collections finally get a real whitelist
53
+
54
+ The signature table covered PNG/JPEG/GIF/WEBP/PDF and **no video format**. That had two concrete consequences for any collection gating video:
55
+
56
+ - No video was ever _detectable_, so a whitelist like `['video/mp4']` could never be **closed** (see 0.8.0): the closed-whitelist rejection for unrecognisable content simply never activated, and anything without a known signature — a `.txt`, an executable, random bytes — sailed through `attach`/`attachExisting`/TUS as long as the caller declared `video/mp4`.
57
+ - `attachExisting` could not catch content disguised as a video: a PNG uploaded as `clip.mp4` produced no `ContentTypeMismatchError`, because the detector had no idea what an MP4 looks like.
58
+
59
+ The table now recognises:
60
+
61
+ - **`video/mp4`** — ISO-BMFF `ftyp` box (bytes 4–7; the first 4 bytes are the box _size_ and vary per file, so they are skipped — the existing `[offset, hex]` parts mechanism already expresses this) with a major brand from the recognised set: `isom`, `iso2`–`iso6`, `mp41`, `mp42`, `avc1`, `av01`, `dash`. One table entry per brand, the GIF87a/GIF89a pattern.
62
+ - **`video/quicktime`** — the same `ftyp` box with major brand `qt `. Same container, different type: a `.mov` relabeled `video/mp4` is now a positive **mismatch**, not a pass.
63
+ - **`video/webm`** / **`video/x-matroska`** — EBML magic `1A45DFA3` at offset 0, discriminated by the `DocType` element (`webm` vs `matroska`). DocType sits inside a variable-length EBML header, so its offset depends on the muxer — the one thing fixed offsets cannot express. The signature mechanism gained a minimal `scan` field: a byte run (element id + size + doc type string, so it cannot fire on stray text) that must appear _anywhere_ in the head, checked only **after** the fixed parts already identified the container. No EBML parser, no new dependency.
64
+ - **`video/x-msvideo`** — `RIFF` + `AVI ` form type (bytes 4–7 are the chunk size and skipped, exactly like WEBP).
65
+ - **`video/mp2t`** — MPEG transport stream. There is no magic number, only the `0x47` sync byte opening every 188-byte packet; one byte would collide with anything starting with `G`, so the sync byte is required at the start of the first **two** packets (offsets 0 and 188). It is the weakest signature and sits last in the table, so it can never shadow a stronger match.
66
+
67
+ `SIGNATURE_HEAD_BYTES` grows from 16 to **189** (the second TS sync byte). All the sniffing paths already read exactly this constant and handle short payloads: `attach` still peeks and replays the head without buffering the payload, `attachExisting` still tears the disk stream down after one short read, and a head shorter than a signature's deepest offset degrades to _unrecognised_, never to a false positive.
68
+
69
+ Deliberate non-guesses, so a legitimate file never turns into a false mismatch: an `ftyp` brand outside the set above (3GPP's `3gp*`, Apple's `M4A `/`M4V `) and an EBML DocType that is neither `webm` nor `matroska` stay **unrecognised** — under an open whitelist they fall back to the declared type exactly as before.
70
+
71
+ **Behaviour change to review if you gate video:** a whitelist made up entirely of the types above — `['video/mp4']` being the canonical case — was open and is now **closed**. Three things follow:
72
+
73
+ 1. Content whose signature contradicts the declared type is rejected with `ContentTypeMismatchError` (`E_MEDIA_CONTENT_TYPE_MISMATCH`) — the PNG-disguised-as-MP4 case, previously accepted.
74
+ 2. Content matching _no_ signature is rejected with `ContentSignatureUnrecognizedError` (`E_MEDIA_CONTENT_SIGNATURE_UNRECOGNIZED`), per the 0.8.0 closed-whitelist rule that never activated for video before.
75
+ 3. Legitimate videos whose real container differs from the declared type — `.mov`/`.mkv`/`.avi` files uploaded under a blanket `video/mp4` — now fail instead of slipping through. If your collection genuinely accepts them, list what you accept: `acceptsMimeTypes: ['video/mp4', 'video/quicktime', 'video/webm']`.
76
+
77
+ Applies uniformly to `attach`, `attachExisting` and the TUS first-chunk check, which all share `verifyContentAgainstWhitelist`.
78
+
3
79
  ## 0.8.2
4
80
 
5
81
  ### Patch Changes
package/README.md CHANGED
@@ -27,7 +27,7 @@ The package uses **subpath exports** (the Agora idiom), so heavy backends stay o
27
27
  | `@adonis-agora/media/single-file` | `storeSingleFile` / `removeSingleFile` / `isSingleFileStoreAvailable` — lets other packages delegate single-file uploads (e.g. avatars) to media without a hard dependency |
28
28
  | `@adonis-agora/media/stores/lucid` | the Lucid `MediaStore` (`@adonisjs/lucid` peer) |
29
29
  | `@adonis-agora/media/upload_sessions/lucid` | the Lucid resumable `UploadSessionStore` (`@adonisjs/lucid` peer) |
30
- | `@adonis-agora/media/disks/s3` | the bundled `S3Disk` (`@aws-sdk/client-s3` + `@aws-sdk/s3-request-presigner` peers) |
30
+ | `@adonis-agora/media/disks/s3` | the bundled `S3Disk` (`@aws-sdk/client-s3` peer; presigning is hand-rolled SigV4) |
31
31
  | `@adonis-agora/media/processors/sharp` | the sharp `ImageProcessor` (`sharp` peer) |
32
32
  | `@adonis-agora/media/telescope` | `mediaTelescopeExtension` (`@adonis-agora/telescope` optional peer) |
33
33
  | `@adonis-agora/media/testing` | `InMemoryMediaStore`, `InMemoryDisk`, `inMemoryDiskResolver`, `FakeImageProcessor`, `InMemoryUploadSessionStore` |
@@ -48,7 +48,7 @@ Optional peers, loaded lazily only when selected:
48
48
 
49
49
  - `@adonisjs/lucid` (`^22.4.0`) — the `lucid` `MediaStore` / `UploadSessionStore`
50
50
  - `sharp` (`^0.33.0`) — image conversions
51
- - `@aws-sdk/client-s3` + `@aws-sdk/s3-request-presigner` (`^3.0.0`) — the bundled `disks.s3()` driver
51
+ - `@aws-sdk/client-s3` (`^3.0.0`) — the bundled `disks.s3()` driver (presigned URLs are hand-rolled SigV4, no presigner package)
52
52
  - `@adonis-agora/telescope` (`^0.4.0`) — the Telescope watcher extension
53
53
 
54
54
  ## Configure
@@ -1 +1 @@
1
- {"version":3,"file":"media_provider.d.ts","sourceRoot":"","sources":["../../providers/media_provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,sBAAsB,CAAC;AAgBlF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;;IACpB,SAAS,CAAC,GAAG,EAAE,kBAAkB;gBAAvB,GAAG,EAAE,kBAAkB;IAE7C,QAAQ;IAkFR;;;OAGG;IACG,IAAI;CAkPX"}
1
+ {"version":3,"file":"media_provider.d.ts","sourceRoot":"","sources":["../../providers/media_provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,sBAAsB,CAAC;AAkBlF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;;IACpB,SAAS,CAAC,GAAG,EAAE,kBAAkB;gBAAvB,GAAG,EAAE,kBAAkB;IAE7C,QAAQ;IA+GR;;;OAGG;IACG,IAAI;CAqWX"}
@@ -1,3 +1,4 @@
1
+ import { DirectUploadHandler } from '../src/direct_upload_handler.js';
1
2
  import { createDriveBackedResolver } from '../src/disks/drive.js';
2
3
  import { resolveConfiguredDisks } from '../src/disks/factory.js';
3
4
  import { MediaManager } from '../src/media_manager.js';
@@ -44,6 +45,16 @@ export default class MediaProvider {
44
45
  ...(resumable.stores !== undefined ? { stores: resumable.stores } : {}),
45
46
  }, { app: this.app })
46
47
  : undefined;
48
+ // Same lazy, opt-in construction for the session-backed direct upload store. It may share
49
+ // the resumable store's Lucid tables, but each subsystem owns its store INSTANCE so enabling
50
+ // one never implies the other.
51
+ const direct = config.uploads?.direct;
52
+ const directUploadSessions = direct
53
+ ? await resolveUploadSessionStore({
54
+ ...(direct.store !== undefined ? { store: direct.store } : {}),
55
+ ...(direct.stores !== undefined ? { stores: direct.stores } : {}),
56
+ }, { app: this.app })
57
+ : undefined;
47
58
  // Build any disks declared in `config.disks` (e.g. the bundled `disks.s3()` driver). Each
48
59
  // factory lazily loads its peer (the AWS SDK), so nothing is imported unless an S3 disk is
49
60
  // actually configured.
@@ -82,6 +93,21 @@ export default class MediaProvider {
82
93
  ...(resumable?.sessionTtlSeconds !== undefined
83
94
  ? { resumableSessionTtlSeconds: resumable.sessionTtlSeconds }
84
95
  : {}),
96
+ ...(directUploadSessions !== undefined ? { directUploadSessions } : {}),
97
+ // Direct settings fall back to the shared `uploads.*` knobs, so one part size / TTL can
98
+ // govern both the raw primitives and the session flow.
99
+ ...((direct?.partSize ?? config.uploads?.partSize)
100
+ ? { directPartSize: (direct?.partSize ?? config.uploads?.partSize) }
101
+ : {}),
102
+ ...((direct?.presignTtlSeconds ?? config.uploads?.presignTtlSeconds)
103
+ ? {
104
+ directPresignTtlSeconds: (direct?.presignTtlSeconds ??
105
+ config.uploads?.presignTtlSeconds),
106
+ }
107
+ : {}),
108
+ ...(direct?.sessionTtlSeconds !== undefined
109
+ ? { directSessionTtlSeconds: direct.sessionTtlSeconds }
110
+ : {}),
85
111
  // Delivery is config only — no route is mounted for it, deliberately: serving a record is
86
112
  // an authorization decision, so the app owns the route (see `MediaDeliveryHandler`).
87
113
  ...(config.delivery?.mode !== undefined ? { deliveryMode: config.delivery.mode } : {}),
@@ -137,6 +163,7 @@ export default class MediaProvider {
137
163
  #registerRoutes(router) {
138
164
  const config = this.app.config.get('media', {});
139
165
  this.#mountTusRoutes(router, config);
166
+ this.#mountDirectSessionRoutes(router, config);
140
167
  const routes = config.uploads?.routes;
141
168
  if (!routes?.enabled)
142
169
  return;
@@ -288,6 +315,92 @@ export default class MediaProvider {
288
315
  router.patch(`${prefix}/:id`, run('PATCH', true)).as('media.uploads.tus.patch');
289
316
  router.delete(`${prefix}/:id`, run('DELETE')).as('media.uploads.tus.delete');
290
317
  }
318
+ /**
319
+ * Mount the optional session-backed direct upload routes when `uploads.direct.routes.enabled`.
320
+ * Plain AdonisJS routes (NOT controllers), each driving a framework-agnostic
321
+ * {@link DirectUploadHandler} over `media.direct` — mirroring the TUS mount. The client sends a
322
+ * `fileName`, never a key: the key is resolved server-side by the handler's `keyFor`.
323
+ *
324
+ * Routes (relative to `uploads.direct.routes.prefix`, default `/media/uploads/direct/sessions`):
325
+ * - `POST /` → initiate: persist a session, presign every part URL
326
+ * - `GET /:id` → status: confirmed ETags + fresh URLs for pending parts
327
+ * - `POST /:id/parts/:partNumber` → confirm one uploaded part's ETag
328
+ * - `POST /:id/complete` → assemble the parts into the final object
329
+ * - `DELETE /:id` → abort
330
+ *
331
+ * Like every built-in route these are UNGUARDED — add your own auth middleware, or leave them off
332
+ * and mount your own routes over the handler/manager.
333
+ */
334
+ #mountDirectSessionRoutes(router, config) {
335
+ const direct = config.uploads?.direct;
336
+ if (!direct?.routes?.enabled)
337
+ return;
338
+ const prefix = (direct.routes.prefix ?? '/media/uploads/direct/sessions').replace(/\/+$/, '');
339
+ const routeDisk = direct.routes.disk;
340
+ const maxSize = direct.routes.maxSize;
341
+ const collection = direct.routes.collection;
342
+ // Build the handler once, on first request, from the resolved MediaManager singleton.
343
+ let handler;
344
+ const getHandler = async () => {
345
+ if (!handler) {
346
+ const media = await this.app.container.make(MediaManager);
347
+ handler = new DirectUploadHandler({
348
+ manager: media.direct,
349
+ ...(routeDisk !== undefined ? { disk: routeDisk } : {}),
350
+ ...(collection !== undefined ? { collection } : {}),
351
+ ...(maxSize !== undefined ? { maxSize } : {}),
352
+ });
353
+ }
354
+ return handler;
355
+ };
356
+ const run = (toRequest) => {
357
+ return async (ctx) => {
358
+ const direct_ = await getHandler();
359
+ const res = await direct_.handle(toRequest(ctx));
360
+ ctx.response.status(res.status);
361
+ return res.body ?? '';
362
+ };
363
+ };
364
+ router
365
+ .post(prefix, run((ctx) => {
366
+ const body = ctx.request.body();
367
+ return {
368
+ action: 'initiate',
369
+ fileName: body.fileName,
370
+ size: body.size,
371
+ ...(body.contentType !== undefined ? { contentType: body.contentType } : {}),
372
+ ...(body.metadata !== undefined ? { metadata: body.metadata } : {}),
373
+ };
374
+ }))
375
+ .as('media.uploads.direct.sessions.initiate');
376
+ router
377
+ .get(`${prefix}/:id`, run((ctx) => ({ action: 'status', uploadId: String(ctx.params.id) })))
378
+ .as('media.uploads.direct.sessions.status');
379
+ router
380
+ .post(`${prefix}/:id/parts/:partNumber`, run((ctx) => {
381
+ const body = ctx.request.body();
382
+ return {
383
+ action: 'confirm-part',
384
+ uploadId: String(ctx.params.id),
385
+ partNumber: Number(ctx.params.partNumber),
386
+ etag: body.etag,
387
+ };
388
+ }))
389
+ .as('media.uploads.direct.sessions.confirmPart');
390
+ router
391
+ .post(`${prefix}/:id/complete`, run((ctx) => {
392
+ const body = ctx.request.body();
393
+ return {
394
+ action: 'complete',
395
+ uploadId: String(ctx.params.id),
396
+ ...(body.parts !== undefined ? { parts: body.parts } : {}),
397
+ };
398
+ }))
399
+ .as('media.uploads.direct.sessions.complete');
400
+ router
401
+ .delete(`${prefix}/:id`, run((ctx) => ({ action: 'abort', uploadId: String(ctx.params.id) })))
402
+ .as('media.uploads.direct.sessions.abort');
403
+ }
291
404
  /** A config `imageProcessor` may be a ready instance or a lazy factory thunk. */
292
405
  async #resolveImageProcessor(config) {
293
406
  const ip = config.imageProcessor;
@@ -1 +1 @@
1
- {"version":3,"file":"media_provider.js","sourceRoot":"","sources":["../../providers/media_provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"media_provider.js","sourceRoot":"","sources":["../../providers/media_provider.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,13 @@
2
2
  * How many leading bytes {@link detectMimeType} needs to decide. This — and never the file size —
3
3
  * is what the attach paths read: the whole point of `attachExisting` is not buffering the object,
4
4
  * so content validation must stay a short head read.
5
+ *
6
+ * 189 = two MPEG-TS sync bytes (offsets 0 and 188), the deepest probe in the table; every other
7
+ * signature resolves within the first few dozen bytes. A file (or a TUS first chunk) shorter than
8
+ * a signature's deepest offset simply cannot match that signature — short heads degrade to
9
+ * "unrecognised", never to a false positive.
5
10
  */
6
- export declare const SIGNATURE_HEAD_BYTES = 16;
11
+ export declare const SIGNATURE_HEAD_BYTES = 189;
7
12
  /**
8
13
  * Identify the real content type from the leading bytes of a file, or `undefined` when no signature
9
14
  * in the embedded table matches.
@@ -1 +1 @@
1
- {"version":3,"file":"content_type.d.ts","sourceRoot":"","sources":["../../src/content_type.ts"],"names":[],"mappings":"AAkCA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAYvC;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAOnE;AAKD,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE/E;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,OAAO,EAAE,UAAU,CAAA;CAAE;AACzB,4EAA4E;GAC1E;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAC3C,yEAAyE;GACvE;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAC/C,kGAAkG;GAChG;IAAE,OAAO,EAAE,cAAc,CAAA;CAAE,CAAC;AAEhC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc,CAUhB"}
1
+ {"version":3,"file":"content_type.d.ts","sourceRoot":"","sources":["../../src/content_type.ts"],"names":[],"mappings":"AA4HA;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAqBxC;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAOnE;AAKD,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE/E;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,OAAO,EAAE,UAAU,CAAA;CAAE;AACzB,4EAA4E;GAC1E;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAC3C,yEAAyE;GACvE;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAC/C,kGAAkG;GAChG;IAAE,OAAO,EAAE,cAAc,CAAA;CAAE,CAAC;AAEhC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc,CAUhB"}
@@ -1,8 +1,58 @@
1
+ /** ASCII → hex, so signatures whose bytes are readable tags (`ftyp`, brands, `AVI `) stay legible. */
2
+ function ascii(text) {
3
+ let hex = '';
4
+ for (let i = 0; i < text.length; i++) {
5
+ hex += text.charCodeAt(i).toString(16).padStart(2, '0');
6
+ }
7
+ return hex;
8
+ }
9
+ /**
10
+ * ISO-BMFF `ftyp` signature: bytes 0..3 are the box SIZE (varies with the compatible-brands list,
11
+ * so they are skipped), bytes 4..7 are `ftyp`, bytes 8..11 the major brand — which is what
12
+ * distinguishes plain MP4 from QuickTime.
13
+ */
14
+ function ftyp(mimeType, brand) {
15
+ return {
16
+ mimeType,
17
+ parts: [
18
+ [4, ascii('ftyp')],
19
+ [8, ascii(brand)],
20
+ ],
21
+ };
22
+ }
23
+ /**
24
+ * The `ftyp` major brands treated as `video/mp4`: the ISO base/conformance brands plus what real
25
+ * encoders write (ffmpeg `isom`/`mp42`, H.264 `avc1`, AV1 `av01`, DASH init segments `dash`). An
26
+ * unknown brand (3GPP's `3gp*`, Apple's `M4V `/`M4A `…) is deliberately NOT claimed as `video/mp4`:
27
+ * it stays *unrecognised*, which under an open whitelist falls back to the declared type instead of
28
+ * manufacturing a false `mismatch` against it.
29
+ */
30
+ const MP4_MAJOR_BRANDS = [
31
+ 'isom',
32
+ 'iso2',
33
+ 'iso3',
34
+ 'iso4',
35
+ 'iso5',
36
+ 'iso6',
37
+ 'mp41',
38
+ 'mp42',
39
+ 'avc1',
40
+ 'av01',
41
+ 'dash',
42
+ ];
1
43
  /**
2
44
  * The embedded signature table. Deliberately small and dependency-free (no `file-type`): it covers
3
- * the formats a MIME whitelist realistically gates on the way in — the raster images conversions are
4
- * generated from, plus PDF. Anything outside it is simply *unrecognised*, which is a defined,
5
- * non-fatal outcome (see {@link detectMimeType}), so the table can grow without changing semantics.
45
+ * the formats a MIME whitelist realistically gates on the way in — the raster images conversions
46
+ * are generated from, PDF, and the common video containers. Anything outside it is simply
47
+ * *unrecognised*, which is a defined, non-fatal outcome (see {@link detectMimeType}), so the table
48
+ * can grow without changing semantics.
49
+ *
50
+ * Growing it IS observable in one way, though: adding a type here flips any whitelist made up
51
+ * entirely of table types to *closed* (see {@link isClosedSignatureWhitelist}), which starts
52
+ * rejecting unrecognisable content for those collections.
53
+ *
54
+ * Order matters only where signatures could overlap: first full match wins, so the weakest
55
+ * signature (MPEG-TS, two single bytes) goes last.
6
56
  */
7
57
  const SIGNATURES = [
8
58
  { mimeType: 'image/png', parts: [[0, '89504e470d0a1a0a']] },
@@ -19,13 +69,47 @@ const SIGNATURES = [
19
69
  ],
20
70
  },
21
71
  { mimeType: 'application/pdf', parts: [[0, '25504446']] }, // %PDF
72
+ // ISO-BMFF (`ftyp`) family — one entry per major brand, the GIF87a/GIF89a pattern.
73
+ ...MP4_MAJOR_BRANDS.map((brand) => ftyp('video/mp4', brand)),
74
+ ftyp('video/quicktime', 'qt '),
75
+ // Matroska family: the EBML magic at 0 identifies the container, the scanned `DocType` element
76
+ // (id 0x4282 + size + ASCII doc type — see {@link ContentSignature.scan} for why it floats)
77
+ // says which member. An EBML file whose DocType is neither — or is encoded with a padded size
78
+ // vint no real muxer emits — stays unrecognised rather than guessed.
79
+ { mimeType: 'video/webm', parts: [[0, '1a45dfa3']], scan: `428284${ascii('webm')}` },
80
+ { mimeType: 'video/x-matroska', parts: [[0, '1a45dfa3']], scan: `428288${ascii('matroska')}` },
81
+ // RIFF container whose form type is AVI; bytes 4..7 are the chunk size, as with WEBP above.
82
+ {
83
+ mimeType: 'video/x-msvideo',
84
+ parts: [
85
+ [0, ascii('RIFF')],
86
+ [8, ascii('AVI ')],
87
+ ],
88
+ },
89
+ // MPEG transport stream: no magic number, only the 0x47 sync byte opening every 188-byte packet.
90
+ // One byte would collide with anything starting with 'G' (GIF is caught above by its full
91
+ // signature, but plain text is not), so the sync byte is required at the start of the first TWO
92
+ // packets — which is also what pins {@link SIGNATURE_HEAD_BYTES} at 189. Kept LAST: it is the
93
+ // weakest signature in the table and must never shadow a stronger one.
94
+ {
95
+ mimeType: 'video/mp2t',
96
+ parts: [
97
+ [0, '47'],
98
+ [188, '47'],
99
+ ],
100
+ },
22
101
  ];
23
102
  /**
24
103
  * How many leading bytes {@link detectMimeType} needs to decide. This — and never the file size —
25
104
  * is what the attach paths read: the whole point of `attachExisting` is not buffering the object,
26
105
  * so content validation must stay a short head read.
106
+ *
107
+ * 189 = two MPEG-TS sync bytes (offsets 0 and 188), the deepest probe in the table; every other
108
+ * signature resolves within the first few dozen bytes. A file (or a TUS first chunk) shorter than
109
+ * a signature's deepest offset simply cannot match that signature — short heads degrade to
110
+ * "unrecognised", never to a false positive.
27
111
  */
28
- export const SIGNATURE_HEAD_BYTES = 16;
112
+ export const SIGNATURE_HEAD_BYTES = 189;
29
113
  /** Does `head` carry `hex` at `offset`? */
30
114
  function matchesAt(head, offset, hex) {
31
115
  const length = hex.length / 2;
@@ -37,6 +121,15 @@ function matchesAt(head, offset, hex) {
37
121
  }
38
122
  return true;
39
123
  }
124
+ /** Does `head` carry `hex` at ANY offset? Naive scan — the head is at most a couple hundred bytes. */
125
+ function matchesAnywhere(head, hex) {
126
+ const last = head.byteLength - hex.length / 2;
127
+ for (let offset = 0; offset <= last; offset++) {
128
+ if (matchesAt(head, offset, hex))
129
+ return true;
130
+ }
131
+ return false;
132
+ }
40
133
  /**
41
134
  * Identify the real content type from the leading bytes of a file, or `undefined` when no signature
42
135
  * in the embedded table matches.
@@ -47,9 +140,11 @@ function matchesAt(head, offset, hex) {
47
140
  */
48
141
  export function detectMimeType(head) {
49
142
  for (const signature of SIGNATURES) {
50
- if (signature.parts.every(([offset, hex]) => matchesAt(head, offset, hex))) {
51
- return signature.mimeType;
52
- }
143
+ if (!signature.parts.every(([offset, hex]) => matchesAt(head, offset, hex)))
144
+ continue;
145
+ if (signature.scan !== undefined && !matchesAnywhere(head, signature.scan))
146
+ continue;
147
+ return signature.mimeType;
53
148
  }
54
149
  return undefined;
55
150
  }
@@ -1 +1 @@
1
- {"version":3,"file":"content_type.js","sourceRoot":"","sources":["../../src/content_type.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content_type.js","sourceRoot":"","sources":["../../src/content_type.ts"],"names":[],"mappings":"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"}