@adonis-agora/media 0.6.0 → 0.8.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.
- package/CHANGELOG.md +33 -0
- package/dist/providers/media_provider.d.ts.map +1 -1
- package/dist/providers/media_provider.js +22 -9
- package/dist/providers/media_provider.js.map +1 -1
- package/dist/src/content_type.d.ts +65 -0
- package/dist/src/content_type.d.ts.map +1 -0
- package/dist/src/content_type.js +101 -0
- package/dist/src/content_type.js.map +1 -0
- package/dist/src/contents.d.ts +27 -1
- package/dist/src/contents.d.ts.map +1 -1
- package/dist/src/contents.js +63 -0
- package/dist/src/contents.js.map +1 -1
- package/dist/src/define_config.d.ts +30 -1
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/delivery.d.ts +91 -0
- package/dist/src/delivery.d.ts.map +1 -0
- package/dist/src/delivery.js +62 -0
- package/dist/src/delivery.js.map +1 -0
- package/dist/src/disks/drive.d.ts +46 -0
- package/dist/src/disks/drive.d.ts.map +1 -0
- package/dist/src/disks/drive.js +28 -0
- package/dist/src/disks/drive.js.map +1 -0
- package/dist/src/disks/factory.d.ts +5 -0
- package/dist/src/disks/factory.d.ts.map +1 -1
- package/dist/src/disks/factory.js +1 -0
- package/dist/src/disks/factory.js.map +1 -1
- package/dist/src/disks/s3.d.ts +14 -0
- package/dist/src/disks/s3.d.ts.map +1 -1
- package/dist/src/disks/s3.js +10 -0
- package/dist/src/disks/s3.js.map +1 -1
- package/dist/src/errors.d.ts +41 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +56 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +9 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/media_library.d.ts +40 -2
- package/dist/src/media_library.d.ts.map +1 -1
- package/dist/src/media_library.js +124 -23
- package/dist/src/media_library.js.map +1 -1
- package/dist/src/media_manager.d.ts +12 -1
- package/dist/src/media_manager.d.ts.map +1 -1
- package/dist/src/media_manager.js +12 -0
- package/dist/src/media_manager.js.map +1 -1
- package/dist/src/resumable_upload.d.ts +6 -1
- package/dist/src/resumable_upload.d.ts.map +1 -1
- package/dist/src/resumable_upload.js +11 -2
- package/dist/src/resumable_upload.js.map +1 -1
- package/dist/src/testing/in_memory_disk.d.ts +14 -2
- package/dist/src/testing/in_memory_disk.d.ts.map +1 -1
- package/dist/src/testing/in_memory_disk.js +15 -3
- package/dist/src/testing/in_memory_disk.js.map +1 -1
- package/dist/src/testing/index.d.ts +1 -0
- package/dist/src/testing/index.d.ts.map +1 -1
- package/dist/src/testing/index.js.map +1 -1
- package/dist/src/tus.d.ts +33 -0
- package/dist/src/tus.d.ts.map +1 -1
- package/dist/src/tus.js +66 -1
- package/dist/src/tus.js.map +1 -1
- package/dist/src/types.d.ts +7 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/stubs/config/media.stub +8 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
# @adonis-agora/media
|
|
2
2
|
|
|
3
|
+
## 0.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#12](https://github.com/DavideCarvalho/adonis-media/pull/12) [`92006a0`](https://github.com/DavideCarvalho/adonis-media/commit/92006a032290c6d7e61d4b34184553127992ea5c) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Collection-aware TUS validation, a stricter closed-whitelist rule, and a fix for a non-deterministic Drive resolution race
|
|
8
|
+
|
|
9
|
+
**Fix: the Drive manager was captured before it existed.** The provider read `(await import('@adonisjs/drive/services/main')).default` once, while building the `MediaManager` singleton. Drive's service module only assigns that manager inside `await app.booted(...)`, which resolves immediately when the app has not booted yet — so the value captured was `undefined`, permanently, and every media call died with `Cannot read properties of undefined (reading 'use')`. It depended on whether the import won the race against boot, which made it non-deterministic: one run 500s, the identical rerun passes. The Drive manager is now resolved **lazily, at the first disk resolution that actually needs it**, and memoized, so it is still resolved exactly once — just not too early. An app whose disks all come from `config.disks` never touches Drive at all, and resolving genuinely before boot now throws `DriveNotReadyError` (`E_MEDIA_DRIVE_NOT_READY`) instead of a bare `TypeError`. The resolver is exported as `createDriveBackedResolver` for wiring media outside AdonisJS.
|
|
10
|
+
|
|
11
|
+
**`TusUploadHandler` can enforce a collection's `acceptsMimeTypes`.** `acceptsMimeTypes` belongs to a collection and used to apply only at `attach`, while TUS knew nothing about collections and accepted any binary (only `maxSize`) — so a user uploaded a whole 20 MB file over a resumable protocol and learned it was the wrong type at finalize. Set `uploads.resumable.routes.collection` (or pass `collection` + `collections` to the handler) and the whitelist is enforced at the two earliest points the protocol allows:
|
|
12
|
+
|
|
13
|
+
- **`POST`** — the `filetype` the client declares in `Upload-Metadata`, rejected with `415` before a single byte is uploaded, with no session created.
|
|
14
|
+
- **first `PATCH`** — the real magic-byte signature of the leading bytes, using the existing detector. Catches a client that lied in `filetype`; the session and any partial object are aborted, so the liar pays for one chunk instead of the whole file. Later chunks are not sniffed.
|
|
15
|
+
|
|
16
|
+
You name the collection, never the MIME list: the collection config stays the single source of truth, so the upload gate and the attach-time check cannot drift. This is bandwidth economy and fast feedback, **not** the security boundary — `attach` / `attachExisting` re-validate the assembled object and remain the final barrier. `MediaManager.collections` now exposes the registry, and `resumable.status()` additionally returns the declared `contentType`.
|
|
17
|
+
|
|
18
|
+
**Unrecognised signatures are now rejected under a closed whitelist.** Treating "no signature matched" as "no evidence" is right for SVG/CSV/text, but it leaked work to apps: a collection accepting only `application/pdf` still let a `.txt` through `attach`/`attachExisting`, so the consuming app had to reimplement `detectMimeType(...) === undefined` by hand. Now, if **every** type in `acceptsMimeTypes` is signature-detectable, unrecognisable content cannot be any of them and is rejected with the new `ContentSignatureUnrecognizedError` (`E_MEDIA_CONTENT_SIGNATURE_UNRECOGNIZED`), distinct from `ContentTypeMismatchError`. If **any** accepted type has no signature (`image/svg+xml`, `text/csv`, `text/plain`, office formats), the previous permissive behaviour is unchanged. Applies to `attach`, `attachExisting` and the TUS first-chunk check alike; `isDetectableMimeType`, `isClosedSignatureWhitelist` and `verifyContentAgainstWhitelist` are exported so the same reasoning is available outside the library.
|
|
19
|
+
|
|
20
|
+
## 0.7.0
|
|
21
|
+
|
|
22
|
+
### Minor Changes
|
|
23
|
+
|
|
24
|
+
- [#10](https://github.com/DavideCarvalho/adonis-media/pull/10) [`afdc1f4`](https://github.com/DavideCarvalho/adonis-media/commit/afdc1f4ec0b46d5b8ed29e3e586e443dd28d940d) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Configurable delivery, and `acceptsMimeTypes` now validates the real file content
|
|
25
|
+
|
|
26
|
+
**Configurable delivery (`delivery`).** The library had a configurable strategy for writes (`uploads.mode`) but nothing for reads, so every consuming app re-derived the same decision by hand — and on a private bucket whose storage isn't internet-reachable, hand-rolled its own streaming route. New `delivery: { mode, signedTtlSeconds }` config (`'auto' | 'public' | 'signed' | 'proxy'`, default `auto`) plus `MediaLibrary.deliver(id, options?)`, returning a discriminated union: `{ kind: 'redirect', url }` for `public`/`signed`, `{ kind: 'stream', stream, mimeType, size, fileName }` for `proxy`.
|
|
27
|
+
|
|
28
|
+
`MediaDeliveryHandler` is the framework-agnostic route half, mirroring `TusUploadHandler`: your app mounts one route with its own middleware and delegates. Like `TusUploadHandler`, **it performs no authorization** — guard the route before calling `handle`, which is also why the provider mounts no delivery route of its own.
|
|
29
|
+
|
|
30
|
+
`auto` resolves by asking the disk for the object's visibility (`Disk.getVisibility`, optional and implemented by every Drive disk): public ⇒ `public`, otherwise ⇒ `signed`. A disk that can't answer falls back to `signed`. The bundled `disks.s3()` gained a declarative `visibility` option (default `private`) to answer it without an ACL round-trip.
|
|
31
|
+
|
|
32
|
+
**Real content validation.** A collection's `acceptsMimeTypes` used to check the caller-declared `mimeType` — which the app itself writes, routinely hardcoded — so it validated nothing about the bytes. It now also detects the type from the file's magic-byte signature and rejects content that contradicts the declaration, with a new `ContentTypeMismatchError` (`E_MEDIA_CONTENT_TYPE_MISMATCH`). Content with no recognisable signature (SVG, CSV, text, office formats) falls back to the declared type rather than being rejected.
|
|
33
|
+
|
|
34
|
+
Only the first 16 bytes are read, never the whole file: `attach` peeks the head and replays it in front of the rest, so a `Readable` payload stays streaming, and `attachExisting` does a short disk read that is torn down immediately — adopting a large object in place still never downloads it. The signature table (PNG, JPEG, GIF, WEBP, PDF) is embedded; no new dependency.
|
|
35
|
+
|
|
3
36
|
## 0.6.0
|
|
4
37
|
|
|
5
38
|
### Minor Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media_provider.d.ts","sourceRoot":"","sources":["../../providers/media_provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"media_provider.d.ts","sourceRoot":"","sources":["../../providers/media_provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAe/D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;;IACpB,SAAS,CAAC,GAAG,EAAE,kBAAkB;gBAAvB,GAAG,EAAE,kBAAkB;IAE7C,QAAQ;IA4ER;;;;;;;;;;;;;OAaG;IACH,IAAI;CA0ML"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import router from '@adonisjs/core/services/router';
|
|
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';
|
|
4
5
|
import { resolveStore } from '../src/stores/factory.js';
|
|
@@ -42,18 +43,16 @@ export default class MediaProvider {
|
|
|
42
43
|
// factory lazily loads its peer (the AWS SDK), so nothing is imported unless an S3 disk is
|
|
43
44
|
// actually configured.
|
|
44
45
|
const configuredDisks = await resolveConfiguredDisks(config.disks);
|
|
45
|
-
// Resolve disks from Drive without a hard dependency: import its service lazily.
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
// Resolve disks from Drive without a hard dependency: import its service lazily. We keep the
|
|
47
|
+
// module NAMESPACE, never a value read out of it — Drive assigns its manager inside
|
|
48
|
+
// `app.booted(...)`, which resolves immediately while the app is still booting, so the export
|
|
49
|
+
// is `undefined` at this point and only the live binding sees the later assignment. The
|
|
50
|
+
// resolver reads it at the first real disk use and memoizes it (see `createDriveBackedResolver`).
|
|
51
|
+
const driveService = (await import('@adonisjs/drive/services/main'));
|
|
50
52
|
const defaultDisk = config.disk ?? (await this.#resolveDefaultDiskName());
|
|
51
53
|
// A disk named in `config.disks` wins over a Drive disk of the same name; otherwise fall
|
|
52
54
|
// through to Drive so existing Drive disks keep working unchanged.
|
|
53
|
-
const resolve = (
|
|
54
|
-
const key = name ?? defaultDisk;
|
|
55
|
-
return configuredDisks[key] ?? drive.use(name);
|
|
56
|
-
};
|
|
55
|
+
const resolve = createDriveBackedResolver({ driveService, configuredDisks, defaultDisk });
|
|
57
56
|
return new MediaManager({
|
|
58
57
|
defaultDisk,
|
|
59
58
|
resolve,
|
|
@@ -78,6 +77,12 @@ export default class MediaProvider {
|
|
|
78
77
|
...(resumable?.sessionTtlSeconds !== undefined
|
|
79
78
|
? { resumableSessionTtlSeconds: resumable.sessionTtlSeconds }
|
|
80
79
|
: {}),
|
|
80
|
+
// Delivery is config only — no route is mounted for it, deliberately: serving a record is
|
|
81
|
+
// an authorization decision, so the app owns the route (see `MediaDeliveryHandler`).
|
|
82
|
+
...(config.delivery?.mode !== undefined ? { deliveryMode: config.delivery.mode } : {}),
|
|
83
|
+
...(config.delivery?.signedTtlSeconds !== undefined
|
|
84
|
+
? { deliverySignedTtlSeconds: config.delivery.signedTtlSeconds }
|
|
85
|
+
: {}),
|
|
81
86
|
});
|
|
82
87
|
});
|
|
83
88
|
}
|
|
@@ -193,6 +198,9 @@ export default class MediaProvider {
|
|
|
193
198
|
* - `HEAD /:id` → report `Upload-Offset` (resume point)
|
|
194
199
|
* - `PATCH /:id` → append bytes at `Upload-Offset`; auto-completes at the declared length
|
|
195
200
|
* - `DELETE /:id` → terminate the upload
|
|
201
|
+
*
|
|
202
|
+
* Set `uploads.resumable.routes.collection` to have the handler enforce that collection's
|
|
203
|
+
* `acceptsMimeTypes` at create time and on the first chunk (`415`), instead of only at attach.
|
|
196
204
|
*/
|
|
197
205
|
#mountTusRoutes(config) {
|
|
198
206
|
const resumable = config.uploads?.resumable;
|
|
@@ -201,6 +209,7 @@ export default class MediaProvider {
|
|
|
201
209
|
const prefix = (resumable.routes.prefix ?? '/media/uploads/tus').replace(/\/+$/, '');
|
|
202
210
|
const routeDisk = resumable.routes.disk;
|
|
203
211
|
const maxSize = resumable.routes.maxSize;
|
|
212
|
+
const collection = resumable.routes.collection;
|
|
204
213
|
// Build the TUS handler once, on first request, from the resolved MediaManager singleton.
|
|
205
214
|
let handler;
|
|
206
215
|
const getHandler = async () => {
|
|
@@ -210,6 +219,10 @@ export default class MediaProvider {
|
|
|
210
219
|
manager: media.resumable,
|
|
211
220
|
disk: routeDisk ?? media.storage.defaultDisk,
|
|
212
221
|
basePath: prefix,
|
|
222
|
+
// The collection's `acceptsMimeTypes` is read from the manager's registry, never restated
|
|
223
|
+
// here, so the TUS gate and the attach-time barrier can never disagree.
|
|
224
|
+
collections: media.collections,
|
|
225
|
+
...(collection !== undefined ? { collection } : {}),
|
|
213
226
|
...(maxSize !== undefined ? { maxSize } : {}),
|
|
214
227
|
});
|
|
215
228
|
}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How many leading bytes {@link detectMimeType} needs to decide. This — and never the file size —
|
|
3
|
+
* is what the attach paths read: the whole point of `attachExisting` is not buffering the object,
|
|
4
|
+
* so content validation must stay a short head read.
|
|
5
|
+
*/
|
|
6
|
+
export declare const SIGNATURE_HEAD_BYTES = 16;
|
|
7
|
+
/**
|
|
8
|
+
* Identify the real content type from the leading bytes of a file, or `undefined` when no signature
|
|
9
|
+
* in the embedded table matches.
|
|
10
|
+
*
|
|
11
|
+
* `undefined` means "unknown", NOT "invalid": plenty of legitimate types (SVG, CSV, plain text,
|
|
12
|
+
* office formats) have no fixed signature, so callers treat it as "no evidence either way" and fall
|
|
13
|
+
* back to the declared MIME type rather than rejecting.
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectMimeType(head: Uint8Array): string | undefined;
|
|
16
|
+
/** Can {@link detectMimeType} ever return this type — i.e. is it in the embedded table? */
|
|
17
|
+
export declare function isDetectableMimeType(mimeType: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Is every type in this whitelist signature-detectable — a *closed* whitelist?
|
|
20
|
+
*
|
|
21
|
+
* The distinction is what makes "unrecognised signature" actionable. Under a closed whitelist
|
|
22
|
+
* (`['application/pdf']`, `['image/png', 'image/jpeg']`) unrecognised content cannot be any accepted
|
|
23
|
+
* type, so it is provably wrong. Under an open one (anything containing `image/svg+xml`, `text/csv`,
|
|
24
|
+
* `text/plain`, an office format…) unrecognised is the NORMAL case for a legitimate file, so there
|
|
25
|
+
* is no evidence either way. An empty list is not closed: it whitelists nothing to reason from.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isClosedSignatureWhitelist(accepted: readonly string[]): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* The outcome of checking real bytes against a collection's `acceptsMimeTypes`. Returned rather
|
|
30
|
+
* than thrown so every caller (the two attach paths, the TUS handler) maps it onto its own failure
|
|
31
|
+
* mode — an exception in the library, an HTTP status in the handler — off one shared decision.
|
|
32
|
+
*/
|
|
33
|
+
export type ContentVerdict = {
|
|
34
|
+
outcome: 'accepted';
|
|
35
|
+
}
|
|
36
|
+
/** A signature matched, and it contradicts the type the caller declared. */
|
|
37
|
+
| {
|
|
38
|
+
outcome: 'mismatch';
|
|
39
|
+
detected: string;
|
|
40
|
+
}
|
|
41
|
+
/** A signature matched, and the collection does not accept that type. */
|
|
42
|
+
| {
|
|
43
|
+
outcome: 'not-accepted';
|
|
44
|
+
detected: string;
|
|
45
|
+
}
|
|
46
|
+
/** No signature matched, under a closed whitelist ⇒ the content is none of the accepted types. */
|
|
47
|
+
| {
|
|
48
|
+
outcome: 'unrecognized';
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Decide whether the leading bytes of a file are acceptable for a collection, given its
|
|
52
|
+
* `acceptsMimeTypes` and (optionally) the type the caller declared.
|
|
53
|
+
*
|
|
54
|
+
* - a signature matches and agrees with the declared type (or none was declared and the type is
|
|
55
|
+
* whitelisted) ⇒ `accepted`.
|
|
56
|
+
* - a signature matches and contradicts the declared type ⇒ `mismatch`, whether or not the detected
|
|
57
|
+
* type is itself whitelisted: a record whose `mimeType` misdescribes its bytes poisons every
|
|
58
|
+
* downstream consumer (conversions, `Content-Type` on delivery).
|
|
59
|
+
* - a signature matches, nothing was declared, and the type is not whitelisted ⇒ `not-accepted`.
|
|
60
|
+
* - no signature matches ⇒ `unrecognized` under a closed whitelist (see
|
|
61
|
+
* {@link isClosedSignatureWhitelist}), otherwise `accepted` — "unknown" is not "invalid" when a
|
|
62
|
+
* legitimate accepted type could have no signature at all.
|
|
63
|
+
*/
|
|
64
|
+
export declare function verifyContentAgainstWhitelist(head: Uint8Array, accepted: readonly string[], declared?: string): ContentVerdict;
|
|
65
|
+
//# sourceMappingURL=content_type.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 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.
|
|
6
|
+
*/
|
|
7
|
+
const SIGNATURES = [
|
|
8
|
+
{ mimeType: 'image/png', parts: [[0, '89504e470d0a1a0a']] },
|
|
9
|
+
// SOI + the first byte of the next marker. Covers JFIF/Exif/raw JPEG alike.
|
|
10
|
+
{ mimeType: 'image/jpeg', parts: [[0, 'ffd8ff']] },
|
|
11
|
+
{ mimeType: 'image/gif', parts: [[0, '474946383761']] }, // GIF87a
|
|
12
|
+
{ mimeType: 'image/gif', parts: [[0, '474946383961']] }, // GIF89a
|
|
13
|
+
// RIFF container whose form type is WEBP; bytes 4..7 are the chunk size, so they are skipped.
|
|
14
|
+
{
|
|
15
|
+
mimeType: 'image/webp',
|
|
16
|
+
parts: [
|
|
17
|
+
[0, '52494646'],
|
|
18
|
+
[8, '57454250'],
|
|
19
|
+
],
|
|
20
|
+
},
|
|
21
|
+
{ mimeType: 'application/pdf', parts: [[0, '25504446']] }, // %PDF
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* How many leading bytes {@link detectMimeType} needs to decide. This — and never the file size —
|
|
25
|
+
* is what the attach paths read: the whole point of `attachExisting` is not buffering the object,
|
|
26
|
+
* so content validation must stay a short head read.
|
|
27
|
+
*/
|
|
28
|
+
export const SIGNATURE_HEAD_BYTES = 16;
|
|
29
|
+
/** Does `head` carry `hex` at `offset`? */
|
|
30
|
+
function matchesAt(head, offset, hex) {
|
|
31
|
+
const length = hex.length / 2;
|
|
32
|
+
if (head.byteLength < offset + length)
|
|
33
|
+
return false;
|
|
34
|
+
for (let i = 0; i < length; i++) {
|
|
35
|
+
if (head[offset + i] !== Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16))
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Identify the real content type from the leading bytes of a file, or `undefined` when no signature
|
|
42
|
+
* in the embedded table matches.
|
|
43
|
+
*
|
|
44
|
+
* `undefined` means "unknown", NOT "invalid": plenty of legitimate types (SVG, CSV, plain text,
|
|
45
|
+
* office formats) have no fixed signature, so callers treat it as "no evidence either way" and fall
|
|
46
|
+
* back to the declared MIME type rather than rejecting.
|
|
47
|
+
*/
|
|
48
|
+
export function detectMimeType(head) {
|
|
49
|
+
for (const signature of SIGNATURES) {
|
|
50
|
+
if (signature.parts.every(([offset, hex]) => matchesAt(head, offset, hex))) {
|
|
51
|
+
return signature.mimeType;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
/** Every MIME type {@link detectMimeType} can PROVE from a signature. */
|
|
57
|
+
const DETECTABLE_MIME_TYPES = new Set(SIGNATURES.map((s) => s.mimeType));
|
|
58
|
+
/** Can {@link detectMimeType} ever return this type — i.e. is it in the embedded table? */
|
|
59
|
+
export function isDetectableMimeType(mimeType) {
|
|
60
|
+
return DETECTABLE_MIME_TYPES.has(mimeType);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Is every type in this whitelist signature-detectable — a *closed* whitelist?
|
|
64
|
+
*
|
|
65
|
+
* The distinction is what makes "unrecognised signature" actionable. Under a closed whitelist
|
|
66
|
+
* (`['application/pdf']`, `['image/png', 'image/jpeg']`) unrecognised content cannot be any accepted
|
|
67
|
+
* type, so it is provably wrong. Under an open one (anything containing `image/svg+xml`, `text/csv`,
|
|
68
|
+
* `text/plain`, an office format…) unrecognised is the NORMAL case for a legitimate file, so there
|
|
69
|
+
* is no evidence either way. An empty list is not closed: it whitelists nothing to reason from.
|
|
70
|
+
*/
|
|
71
|
+
export function isClosedSignatureWhitelist(accepted) {
|
|
72
|
+
return accepted.length > 0 && accepted.every((type) => isDetectableMimeType(type));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Decide whether the leading bytes of a file are acceptable for a collection, given its
|
|
76
|
+
* `acceptsMimeTypes` and (optionally) the type the caller declared.
|
|
77
|
+
*
|
|
78
|
+
* - a signature matches and agrees with the declared type (or none was declared and the type is
|
|
79
|
+
* whitelisted) ⇒ `accepted`.
|
|
80
|
+
* - a signature matches and contradicts the declared type ⇒ `mismatch`, whether or not the detected
|
|
81
|
+
* type is itself whitelisted: a record whose `mimeType` misdescribes its bytes poisons every
|
|
82
|
+
* downstream consumer (conversions, `Content-Type` on delivery).
|
|
83
|
+
* - a signature matches, nothing was declared, and the type is not whitelisted ⇒ `not-accepted`.
|
|
84
|
+
* - no signature matches ⇒ `unrecognized` under a closed whitelist (see
|
|
85
|
+
* {@link isClosedSignatureWhitelist}), otherwise `accepted` — "unknown" is not "invalid" when a
|
|
86
|
+
* legitimate accepted type could have no signature at all.
|
|
87
|
+
*/
|
|
88
|
+
export function verifyContentAgainstWhitelist(head, accepted, declared) {
|
|
89
|
+
const detected = detectMimeType(head);
|
|
90
|
+
if (detected === undefined) {
|
|
91
|
+
return isClosedSignatureWhitelist(accepted)
|
|
92
|
+
? { outcome: 'unrecognized' }
|
|
93
|
+
: { outcome: 'accepted' };
|
|
94
|
+
}
|
|
95
|
+
if (declared !== undefined && detected !== declared)
|
|
96
|
+
return { outcome: 'mismatch', detected };
|
|
97
|
+
if (!accepted.includes(detected))
|
|
98
|
+
return { outcome: 'not-accepted', detected };
|
|
99
|
+
return { outcome: 'accepted' };
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=content_type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content_type.js","sourceRoot":"","sources":["../../src/content_type.ts"],"names":[],"mappings":"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"}
|
package/dist/src/contents.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Readable } from 'node:stream';
|
|
2
2
|
/**
|
|
3
3
|
* Coerce attach/create inputs (a `Buffer` or a `Readable`) to a `Uint8Array` for the disk's `put`,
|
|
4
4
|
* which (matching flydrive) does not accept a stream. A `Buffer` is already a `Uint8Array`.
|
|
@@ -6,4 +6,30 @@ import type { Readable } from 'node:stream';
|
|
|
6
6
|
export declare function toBytes(contents: Buffer | Readable): Promise<Uint8Array>;
|
|
7
7
|
/** Read back disk bytes as a Node `Buffer` for the image processor (which works on Buffers). */
|
|
8
8
|
export declare function asBuffer(bytes: Uint8Array): Buffer;
|
|
9
|
+
/** What {@link peekContents} hands back: the sniffed head, plus contents still safe to write. */
|
|
10
|
+
export interface PeekedContents {
|
|
11
|
+
/** Up to `length` leading bytes (fewer if the payload is shorter). */
|
|
12
|
+
head: Uint8Array;
|
|
13
|
+
/**
|
|
14
|
+
* The contents to write. Identical to the input for a `Buffer`; for a `Readable` it is a NEW
|
|
15
|
+
* stream that replays the consumed head before the untouched remainder, so the peek is invisible
|
|
16
|
+
* downstream.
|
|
17
|
+
*/
|
|
18
|
+
contents: Buffer | Readable;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Read the first `length` bytes of an attach payload WITHOUT consuming it, so the caller can sniff
|
|
22
|
+
* its real content type and still write every byte.
|
|
23
|
+
*
|
|
24
|
+
* A `Readable` cannot be rewound, so the head is re-emitted in front of the rest through a fresh
|
|
25
|
+
* stream driven by the SAME async iterator — no buffering of the full payload, which is what keeps
|
|
26
|
+
* the streaming attach path (large uploads, no conversions) streaming.
|
|
27
|
+
*/
|
|
28
|
+
export declare function peekContents(contents: Buffer | Readable, length: number): Promise<PeekedContents>;
|
|
29
|
+
/**
|
|
30
|
+
* Read the first `length` bytes of an object already on a disk and stop — the stream is destroyed
|
|
31
|
+
* as soon as enough bytes are in hand, so adopting a 2 GiB scan in place costs one short ranged
|
|
32
|
+
* read rather than a download.
|
|
33
|
+
*/
|
|
34
|
+
export declare function peekStream(stream: Readable, length: number): Promise<Uint8Array>;
|
|
9
35
|
//# sourceMappingURL=contents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contents.d.ts","sourceRoot":"","sources":["../../src/contents.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"contents.d.ts","sourceRoot":"","sources":["../../src/contents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;GAGG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAK9E;AAED,gGAAgG;AAChG,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAElD;AAED,iGAAiG;AACjG,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,IAAI,EAAE,UAAU,CAAC;IACjB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAC3B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,CAAC,CAkCzB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAatF"}
|
package/dist/src/contents.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Readable } from 'node:stream';
|
|
1
2
|
/**
|
|
2
3
|
* Coerce attach/create inputs (a `Buffer` or a `Readable`) to a `Uint8Array` for the disk's `put`,
|
|
3
4
|
* which (matching flydrive) does not accept a stream. A `Buffer` is already a `Uint8Array`.
|
|
@@ -14,4 +15,66 @@ export async function toBytes(contents) {
|
|
|
14
15
|
export function asBuffer(bytes) {
|
|
15
16
|
return Buffer.isBuffer(bytes) ? bytes : Buffer.from(bytes);
|
|
16
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Read the first `length` bytes of an attach payload WITHOUT consuming it, so the caller can sniff
|
|
20
|
+
* its real content type and still write every byte.
|
|
21
|
+
*
|
|
22
|
+
* A `Readable` cannot be rewound, so the head is re-emitted in front of the rest through a fresh
|
|
23
|
+
* stream driven by the SAME async iterator — no buffering of the full payload, which is what keeps
|
|
24
|
+
* the streaming attach path (large uploads, no conversions) streaming.
|
|
25
|
+
*/
|
|
26
|
+
export async function peekContents(contents, length) {
|
|
27
|
+
if (Buffer.isBuffer(contents)) {
|
|
28
|
+
return { head: contents.subarray(0, length), contents };
|
|
29
|
+
}
|
|
30
|
+
const iterator = contents[Symbol.asyncIterator]();
|
|
31
|
+
const chunks = [];
|
|
32
|
+
let read = 0;
|
|
33
|
+
let done = false;
|
|
34
|
+
while (read < length) {
|
|
35
|
+
const next = await iterator.next();
|
|
36
|
+
if (next.done) {
|
|
37
|
+
done = true;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
const chunk = Buffer.from(next.value);
|
|
41
|
+
chunks.push(chunk);
|
|
42
|
+
read += chunk.byteLength;
|
|
43
|
+
}
|
|
44
|
+
const buffered = Buffer.concat(chunks);
|
|
45
|
+
const replayed = Readable.from((async function* () {
|
|
46
|
+
if (buffered.byteLength > 0)
|
|
47
|
+
yield buffered;
|
|
48
|
+
if (done)
|
|
49
|
+
return;
|
|
50
|
+
while (true) {
|
|
51
|
+
const next = await iterator.next();
|
|
52
|
+
if (next.done)
|
|
53
|
+
return;
|
|
54
|
+
yield next.value;
|
|
55
|
+
}
|
|
56
|
+
})());
|
|
57
|
+
return { head: buffered.subarray(0, length), contents: replayed };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Read the first `length` bytes of an object already on a disk and stop — the stream is destroyed
|
|
61
|
+
* as soon as enough bytes are in hand, so adopting a 2 GiB scan in place costs one short ranged
|
|
62
|
+
* read rather than a download.
|
|
63
|
+
*/
|
|
64
|
+
export async function peekStream(stream, length) {
|
|
65
|
+
const chunks = [];
|
|
66
|
+
let read = 0;
|
|
67
|
+
try {
|
|
68
|
+
for await (const chunk of stream) {
|
|
69
|
+
chunks.push(Buffer.from(chunk));
|
|
70
|
+
read += chunk.length;
|
|
71
|
+
if (read >= length)
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
stream.destroy();
|
|
77
|
+
}
|
|
78
|
+
return Buffer.concat(chunks).subarray(0, length);
|
|
79
|
+
}
|
|
17
80
|
//# sourceMappingURL=contents.js.map
|
package/dist/src/contents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contents.js","sourceRoot":"","sources":["../../src/contents.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contents.js","sourceRoot":"","sources":["../../src/contents.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { DeliveryMode } from './delivery.js';
|
|
1
2
|
import { disks } from './disks/factory.js';
|
|
2
3
|
import type { DiskFactory, S3Credentials, S3DiskConfig } from './disks/factory.js';
|
|
3
4
|
import type { ImageProcessor } from './image_processor.js';
|
|
@@ -70,8 +71,34 @@ export interface MediaResumableConfig {
|
|
|
70
71
|
disk?: string;
|
|
71
72
|
/** Reject creations whose `Upload-Length` exceeds this many bytes. */
|
|
72
73
|
maxSize?: number;
|
|
74
|
+
/**
|
|
75
|
+
* Collection these uploads are destined for. Set it to have the TUS endpoint enforce that
|
|
76
|
+
* collection's `acceptsMimeTypes` up front — at `POST` from the declared `filetype`, and on the
|
|
77
|
+
* first `PATCH` from the real file signature — instead of only discovering the wrong type at
|
|
78
|
+
* attach time, after the whole file was uploaded. The collection config remains the single
|
|
79
|
+
* source of truth; nothing is restated here. Omit to accept any type (size limits still apply).
|
|
80
|
+
*/
|
|
81
|
+
collection?: string;
|
|
73
82
|
};
|
|
74
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* How stored media reaches the client — the READ counterpart to {@link MediaUploadsConfig.mode}.
|
|
86
|
+
*
|
|
87
|
+
* The library resolves this into either a URL to redirect to or a stream to pipe
|
|
88
|
+
* ({@link MediaLibrary.deliver} / `MediaDeliveryHandler`); it never mounts a route of its own,
|
|
89
|
+
* because serving a record is an authorization decision only the app can make.
|
|
90
|
+
*/
|
|
91
|
+
export interface MediaDeliveryConfig {
|
|
92
|
+
/**
|
|
93
|
+
* `public` = the disk's stable public URL; `signed` = a time-limited signed URL; `proxy` = stream
|
|
94
|
+
* the bytes through the app, so the storage need not be reachable from the internet at all.
|
|
95
|
+
* `auto` asks the disk for the object's visibility — public ⇒ `public`, otherwise (including a
|
|
96
|
+
* disk that cannot answer) ⇒ `signed`. Default `auto`.
|
|
97
|
+
*/
|
|
98
|
+
mode?: DeliveryMode;
|
|
99
|
+
/** Lifetime of the signed URL when delivery resolves to `signed`. Default 300. */
|
|
100
|
+
signedTtlSeconds?: number;
|
|
101
|
+
}
|
|
75
102
|
/**
|
|
76
103
|
* Shape of `config/media.ts`. Storage is delegated to `@adonisjs/drive` — the `disk` is the name of a
|
|
77
104
|
* disk in your `config/drive.ts`; omit it to use Drive's default disk. Pick a `store` by name from the
|
|
@@ -128,9 +155,11 @@ export interface MediaConfig {
|
|
|
128
155
|
emitDiagnostics?: boolean;
|
|
129
156
|
/** Direct-S3 upload settings (default mode, part size, presign TTL, optional HTTP routes). */
|
|
130
157
|
uploads?: MediaUploadsConfig;
|
|
158
|
+
/** How stored media is served back (`auto`/`public`/`signed`/`proxy` + signed-URL TTL). */
|
|
159
|
+
delivery?: MediaDeliveryConfig;
|
|
131
160
|
}
|
|
132
161
|
/** Identity helper giving `config/media.ts` full type-checking. */
|
|
133
162
|
export declare function defineConfig(config?: MediaConfig): MediaConfig;
|
|
134
163
|
export { stores, processors, disks, uploadSessions };
|
|
135
|
-
export type { StoreContext, StoreFactory, LucidStoreConfig, ImageProcessorFactory, DiskFactory, S3DiskConfig, S3Credentials, UploadMode, UploadSessionStoreContext, UploadSessionStoreFactory, LucidUploadSessionStoreConfig, };
|
|
164
|
+
export type { StoreContext, StoreFactory, LucidStoreConfig, ImageProcessorFactory, DiskFactory, S3DiskConfig, S3Credentials, UploadMode, DeliveryMode, UploadSessionStoreContext, UploadSessionStoreFactory, LucidUploadSessionStoreConfig, };
|
|
136
165
|
//# sourceMappingURL=define_config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EACV,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EAC1B,MAAM,8BAA8B,CAAC;AAEtC;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,mGAAmG;IACnG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,MAAM,CAAC,EAAE;QACP,0CAA0C;QAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,4DAA4D;QAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF;;;;OAIG;IACH,SAAS,CAAC,EAAE,oBAAoB,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IACnD,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2FAA2F;IAC3F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kDAAkD;IAClD,MAAM,CAAC,EAAE;QACP,0CAA0C;QAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,oEAAoE;QACpE,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,0EAA0E;QAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,sEAAsE;QACtE,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAI3C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AA+J9D,mEAAmE;AACnE,MAAM,UAAU,YAAY,CAAC,SAAsB,EAAE;IACnD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC"}
|