@adonis-agora/media 0.5.0 → 0.7.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 +26 -0
- package/dist/providers/media_provider.d.ts.map +1 -1
- package/dist/providers/media_provider.js +6 -0
- package/dist/providers/media_provider.js.map +1 -1
- package/dist/src/content_type.d.ts +16 -0
- package/dist/src/content_type.d.ts.map +1 -0
- package/dist/src/content_type.js +56 -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 +22 -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/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 +18 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +27 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +6 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/media_library.d.ts +90 -0
- package/dist/src/media_library.d.ts.map +1 -1
- package/dist/src/media_library.js +223 -40
- package/dist/src/media_library.js.map +1 -1
- package/dist/src/media_manager.d.ts +24 -0
- package/dist/src/media_manager.d.ts.map +1 -1
- package/dist/src/media_manager.js +24 -0
- package/dist/src/media_manager.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/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
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import {
|
|
2
|
+
import { SIGNATURE_HEAD_BYTES, detectMimeType } from './content_type.js';
|
|
3
|
+
import { asBuffer, peekContents, peekStream, toBytes } from './contents.js';
|
|
4
|
+
import { DEFAULT_DELIVERY_SIGNED_TTL_SECONDS, resolveDeliveryMode, } from './delivery.js';
|
|
3
5
|
import { publishMedia } from './diagnostics.js';
|
|
4
|
-
import { ConversionNotDefinedError, ImageProcessorMissingError, MediaNotFoundError, MimeNotAllowedError, } from './errors.js';
|
|
6
|
+
import { ContentTypeMismatchError, ConversionNotDefinedError, ImageProcessorMissingError, MediaNotFoundError, MediaObjectMissingError, MimeNotAllowedError, UploadNotSupportedError, } from './errors.js';
|
|
7
|
+
import { isExtendedDisk } from './extended_disk.js';
|
|
5
8
|
import { MediaCollectionRegistry } from './media_collection.js';
|
|
6
9
|
export class MediaLibrary {
|
|
7
10
|
storage;
|
|
@@ -11,6 +14,8 @@ export class MediaLibrary {
|
|
|
11
14
|
emitDiagnostics;
|
|
12
15
|
newId;
|
|
13
16
|
now;
|
|
17
|
+
deliveryMode;
|
|
18
|
+
deliverySignedTtlSeconds;
|
|
14
19
|
constructor(options) {
|
|
15
20
|
this.storage = options.storage;
|
|
16
21
|
this.store = options.store;
|
|
@@ -19,48 +24,160 @@ export class MediaLibrary {
|
|
|
19
24
|
this.emitDiagnostics = options.emitDiagnostics ?? true;
|
|
20
25
|
this.newId = options.idGenerator ?? (() => randomUUID());
|
|
21
26
|
this.now = options.clock ?? (() => new Date());
|
|
27
|
+
this.deliveryMode = options.deliveryMode ?? 'auto';
|
|
28
|
+
this.deliverySignedTtlSeconds =
|
|
29
|
+
options.deliverySignedTtlSeconds ?? DEFAULT_DELIVERY_SIGNED_TTL_SECONDS;
|
|
22
30
|
}
|
|
23
31
|
emit(event, payload) {
|
|
24
32
|
if (this.emitDiagnostics)
|
|
25
33
|
publishMedia(event, payload);
|
|
26
34
|
}
|
|
27
35
|
async attach(input) {
|
|
28
|
-
const
|
|
29
|
-
const ownerId =
|
|
30
|
-
|
|
31
|
-
throw new MimeNotAllowedError(input.collection, input.mimeType);
|
|
32
|
-
}
|
|
33
|
-
// A single-file collection replaces whatever is already there — but only once the new media is
|
|
34
|
-
// written, persisted AND renderable, so anything that fails on the way leaves the old media
|
|
35
|
-
// intact. Capture the records to replace up front; drop them at the end.
|
|
36
|
-
const previous = config.single
|
|
37
|
-
? await this.store.listByOwner(input.ownerType, ownerId, input.collection)
|
|
38
|
-
: [];
|
|
39
|
-
const disk = input.disk ?? config.disk ?? this.storage.defaultDisk;
|
|
40
|
-
const id = input.id ?? this.newId();
|
|
41
|
-
const path = `${input.ownerType}/${ownerId}/${input.collection}/${id}/${input.fileName}`;
|
|
42
|
-
const target = this.storage.disk(disk);
|
|
36
|
+
const context = await this.#prepare(input);
|
|
37
|
+
const { config, ownerId, disk, id, target } = context;
|
|
38
|
+
const path = this.#layoutPath(input.ownerType, ownerId, input.collection, id, input.fileName);
|
|
43
39
|
const hasConversions = (config.conversions ?? []).length > 0;
|
|
40
|
+
// Prove the bytes are what the caller claims BEFORE writing them. Peeking replays the head, so
|
|
41
|
+
// the payload below is still whole — and a `Readable` is still a stream.
|
|
42
|
+
let contents = input.contents;
|
|
43
|
+
if (config.acceptsMimeTypes) {
|
|
44
|
+
const peeked = await peekContents(input.contents, SIGNATURE_HEAD_BYTES);
|
|
45
|
+
contents = peeked.contents;
|
|
46
|
+
this.#assertContentMatches(config.acceptsMimeTypes, input.collection, input.mimeType, peeked.head);
|
|
47
|
+
}
|
|
44
48
|
// Stream large uploads straight through (no in-memory buffer) when we can: a Readable with a
|
|
45
49
|
// known size, no conversions to generate off the buffered bytes, and a disk that supports it.
|
|
46
|
-
const canStream = !Buffer.isBuffer(
|
|
50
|
+
const canStream = !Buffer.isBuffer(contents) &&
|
|
47
51
|
input.size !== undefined &&
|
|
48
52
|
!hasConversions &&
|
|
49
53
|
typeof target.putStream === 'function';
|
|
50
54
|
if (canStream) {
|
|
51
55
|
// `input.size` is forwarded, not dropped: it is the very thing that makes this path
|
|
52
56
|
// eligible (see `canStream`), and S3's putStream cannot write without it.
|
|
53
|
-
await target.putStream?.(path,
|
|
57
|
+
await target.putStream?.(path, contents, {
|
|
54
58
|
contentType: input.mimeType,
|
|
55
59
|
contentLength: input.size,
|
|
56
60
|
});
|
|
57
61
|
}
|
|
58
62
|
else {
|
|
59
|
-
const bytes = await toBytes(
|
|
63
|
+
const bytes = await toBytes(contents);
|
|
60
64
|
await target.put(path, bytes, { contentType: input.mimeType });
|
|
61
65
|
}
|
|
66
|
+
return this.#commit(context, { ...input, path, ownsObject: true });
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Register an object that ALREADY exists on the disk as a media record — zero-copy: its bytes are
|
|
70
|
+
* never read back or rewritten, only its metadata is inspected. The bridge for uploads that land
|
|
71
|
+
* on the disk on their own (`media.resumable` / TUS, direct-S3), where round-tripping the bytes
|
|
72
|
+
* through {@link attach} would defeat the point of a resumable upload.
|
|
73
|
+
*
|
|
74
|
+
* Everything after storage behaves exactly as {@link attach}: collection resolution,
|
|
75
|
+
* `acceptsMimeTypes`, atomic `single: true` replace, ordering, eager conversions and diagnostics.
|
|
76
|
+
*
|
|
77
|
+
* ```ts
|
|
78
|
+
* const { key, disk, size } = await media.resumable.complete(sessionId)
|
|
79
|
+
* await media.library.attachExisting({
|
|
80
|
+
* ownerType: 'Post', ownerId: post.id, collection: 'gallery',
|
|
81
|
+
* key, disk, size, fileName: 'scan.pdf', mimeType: 'application/pdf',
|
|
82
|
+
* })
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* Unlike {@link attach}, a failure downstream of the object does NOT delete it: the caller wrote
|
|
86
|
+
* those bytes and may retry with them, so only what this call created is rolled back.
|
|
87
|
+
*/
|
|
88
|
+
async attachExisting(input) {
|
|
89
|
+
const context = await this.#prepare(input);
|
|
90
|
+
const { ownerId, disk, id, target } = context;
|
|
91
|
+
if (!(await target.exists(input.key))) {
|
|
92
|
+
throw new MediaObjectMissingError(disk, input.key);
|
|
93
|
+
}
|
|
94
|
+
// Validate the REAL content of an object we never wrote. `peekStream` tears the stream down
|
|
95
|
+
// after the signature, so this stays a short head read — never the download `attachExisting`
|
|
96
|
+
// exists to avoid.
|
|
97
|
+
if (context.config.acceptsMimeTypes) {
|
|
98
|
+
const head = await peekStream(await target.getStream(input.key), SIGNATURE_HEAD_BYTES);
|
|
99
|
+
this.#assertContentMatches(context.config.acceptsMimeTypes, input.collection, input.mimeType, head);
|
|
100
|
+
}
|
|
101
|
+
let path = input.key;
|
|
102
|
+
const layout = this.#layoutPath(input.ownerType, ownerId, input.collection, id, input.fileName);
|
|
103
|
+
if (input.moveIntoLayout && path !== layout) {
|
|
104
|
+
// Server-side only. There is deliberately no fallback that reads and re-writes the bytes:
|
|
105
|
+
// that is precisely the copy this method exists to avoid.
|
|
106
|
+
if (!isExtendedDisk(target))
|
|
107
|
+
throw new UploadNotSupportedError(disk, 'server-side move');
|
|
108
|
+
await target.move(path, layout);
|
|
109
|
+
path = layout;
|
|
110
|
+
}
|
|
111
|
+
return this.#commit(context, { ...input, path, ownsObject: input.moveIntoLayout === true });
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Enforce `acceptsMimeTypes` against what the bytes ACTUALLY are, not what the caller declared.
|
|
115
|
+
* The declared type is written by the app — routinely a hardcoded constant — so checking it alone
|
|
116
|
+
* (as `#prepare` does, cheaply and first) whitelists nothing about the content itself.
|
|
117
|
+
*
|
|
118
|
+
* Three outcomes, given the leading bytes:
|
|
119
|
+
* - no signature matches → *unknown*, not invalid. Many legitimate types (SVG, CSV, text, office
|
|
120
|
+
* formats) have none, so rejecting here would break them; the declared type stands, already
|
|
121
|
+
* validated by `#prepare`.
|
|
122
|
+
* - a signature matches and agrees with the declared type → accept.
|
|
123
|
+
* - a signature matches and the collection does not accept it, or it contradicts the declared
|
|
124
|
+
* type → reject with {@link ContentTypeMismatchError}. A PNG announced as `application/pdf` is
|
|
125
|
+
* a lie whether or not PNG is on the list, and a record whose `mimeType` misdescribes its bytes
|
|
126
|
+
* poisons every downstream consumer (conversions, `Content-Type` on delivery).
|
|
127
|
+
*/
|
|
128
|
+
#assertContentMatches(accepted, collection, declared, head) {
|
|
129
|
+
const detected = detectMimeType(head);
|
|
130
|
+
if (detected === undefined || detected === declared)
|
|
131
|
+
return;
|
|
132
|
+
throw new ContentTypeMismatchError(collection, declared, detected, accepted);
|
|
133
|
+
}
|
|
134
|
+
/** Storage key layout every record written by this library follows. */
|
|
135
|
+
#layoutPath(ownerType, ownerId, collection, id, fileName) {
|
|
136
|
+
return `${ownerType}/${ownerId}/${collection}/${id}/${fileName}`;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Everything both attach paths do BEFORE the object exists: resolve the collection, enforce its
|
|
140
|
+
* MIME whitelist against the DECLARED type, capture the records a `single: true` collection will
|
|
141
|
+
* replace, and pick the disk and record id.
|
|
142
|
+
*
|
|
143
|
+
* The declared-type check is only the cheap first gate — it rejects without touching a byte. Each
|
|
144
|
+
* attach path then proves the content itself with {@link #assertContentMatches}.
|
|
145
|
+
*
|
|
146
|
+
* A single-file collection replaces whatever is already there — but only once the new media is
|
|
147
|
+
* stored, persisted AND renderable, so anything that fails on the way leaves the old media intact.
|
|
148
|
+
* Hence "capture up front, drop at the end" (see {@link #commit}).
|
|
149
|
+
*/
|
|
150
|
+
async #prepare(input) {
|
|
151
|
+
const config = this.collections.get(input.collection);
|
|
152
|
+
const ownerId = String(input.ownerId);
|
|
153
|
+
if (config.acceptsMimeTypes && !config.acceptsMimeTypes.includes(input.mimeType)) {
|
|
154
|
+
throw new MimeNotAllowedError(input.collection, input.mimeType);
|
|
155
|
+
}
|
|
156
|
+
const previous = config.single
|
|
157
|
+
? await this.store.listByOwner(input.ownerType, ownerId, input.collection)
|
|
158
|
+
: [];
|
|
159
|
+
const disk = input.disk ?? config.disk ?? this.storage.defaultDisk;
|
|
160
|
+
return {
|
|
161
|
+
config,
|
|
162
|
+
ownerId,
|
|
163
|
+
previous,
|
|
164
|
+
disk,
|
|
165
|
+
target: this.storage.disk(disk),
|
|
166
|
+
id: input.id ?? this.newId(),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Everything both attach paths do AFTER the object is in place: persist the record, generate eager
|
|
171
|
+
* conversions, drop what a `single: true` collection replaced, and emit `attach`. Compensates on
|
|
172
|
+
* failure — dropping the object itself only when `ownsObject` says this call put it there.
|
|
173
|
+
*/
|
|
174
|
+
async #commit(context, input) {
|
|
175
|
+
const { config, ownerId, previous, disk, id, target } = context;
|
|
176
|
+
const { path } = input;
|
|
62
177
|
let saved;
|
|
63
178
|
try {
|
|
179
|
+
// `getMetaData` is a HEAD-shaped metadata read, never a body download — the zero-copy
|
|
180
|
+
// guarantee of `attachExisting` holds even when the caller omits `size`.
|
|
64
181
|
const size = input.size ?? (await target.getMetaData(path)).contentLength;
|
|
65
182
|
// A single-file collection holds exactly one item, so its order resets to 0 on replace.
|
|
66
183
|
const order = config.single
|
|
@@ -88,7 +205,8 @@ export class MediaLibrary {
|
|
|
88
205
|
catch (error) {
|
|
89
206
|
// Compensation (disk + store aren't a single transaction): the bytes landed but the record
|
|
90
207
|
// didn't persist — best-effort remove the orphaned object before rethrowing.
|
|
91
|
-
|
|
208
|
+
if (input.ownsObject)
|
|
209
|
+
await this.#safeDelete(disk, path);
|
|
92
210
|
throw error;
|
|
93
211
|
}
|
|
94
212
|
// Eager presets are generated synchronously on attach; lazy ones on first `url()`. This runs
|
|
@@ -103,7 +221,8 @@ export class MediaLibrary {
|
|
|
103
221
|
catch (error) {
|
|
104
222
|
// The new media can't be rendered, so roll it back whole — bytes, any conversions already
|
|
105
223
|
// written, and the row — and leave what it was replacing untouched.
|
|
106
|
-
|
|
224
|
+
if (input.ownsObject)
|
|
225
|
+
await this.#safeDelete(disk, path);
|
|
107
226
|
for (const variant of Object.values(current.conversions)) {
|
|
108
227
|
await this.#safeDelete(variant.disk, variant.path);
|
|
109
228
|
}
|
|
@@ -111,9 +230,28 @@ export class MediaLibrary {
|
|
|
111
230
|
throw error;
|
|
112
231
|
}
|
|
113
232
|
}
|
|
114
|
-
// The new media is committed and renderable; only now is it safe to drop what it replaced.
|
|
115
|
-
|
|
233
|
+
// The new media is committed and renderable; only now is it safe to drop what it replaced. A
|
|
234
|
+
// replaced record can overlap the new one — the store row when the caller reused `id`, the disk
|
|
235
|
+
// object when the same key is re-registered — and cleaning up an overlap would destroy the media
|
|
236
|
+
// just committed, so each half is dropped only where it is genuinely superseded.
|
|
237
|
+
for (const record of previous) {
|
|
238
|
+
const sharesObject = record.disk === disk && record.path === path;
|
|
239
|
+
const sharesRow = record.id === id;
|
|
240
|
+
if (sharesObject && sharesRow)
|
|
241
|
+
continue;
|
|
242
|
+
if (sharesObject) {
|
|
243
|
+
await this.store.delete(record.id);
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (sharesRow) {
|
|
247
|
+
await this.#safeDelete(record.disk, record.path);
|
|
248
|
+
for (const variant of Object.values(record.conversions)) {
|
|
249
|
+
await this.#safeDelete(variant.disk, variant.path);
|
|
250
|
+
}
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
116
253
|
await this.#deleteRecord(record);
|
|
254
|
+
}
|
|
117
255
|
this.emit('attach', {
|
|
118
256
|
id: saved.id,
|
|
119
257
|
ownerType: saved.ownerType,
|
|
@@ -170,6 +308,7 @@ export class MediaLibrary {
|
|
|
170
308
|
const ownerId_ = String(ownerId);
|
|
171
309
|
return {
|
|
172
310
|
attach: (input) => this.attach({ ...input, ownerType, ownerId: ownerId_ }),
|
|
311
|
+
attachExisting: (input) => this.attachExisting({ ...input, ownerType, ownerId: ownerId_ }),
|
|
173
312
|
list: (collection) => this.list(ownerType, ownerId_, collection),
|
|
174
313
|
};
|
|
175
314
|
}
|
|
@@ -202,21 +341,74 @@ export class MediaLibrary {
|
|
|
202
341
|
}
|
|
203
342
|
}
|
|
204
343
|
/**
|
|
205
|
-
*
|
|
206
|
-
*
|
|
344
|
+
* Resolve a media id (optionally a named conversion of it) to the concrete object on a disk that
|
|
345
|
+
* every read path — {@link url}, {@link signedUrl}, {@link deliver} — then acts on. Requesting a
|
|
346
|
+
* conversion that has not been generated produces it lazily first.
|
|
207
347
|
*/
|
|
208
|
-
async
|
|
348
|
+
async #resolveTarget(id, conversion) {
|
|
209
349
|
if (conversion) {
|
|
210
350
|
const record = await this.ensureConversion(id, conversion);
|
|
211
351
|
const variant = record.conversions[conversion];
|
|
212
352
|
if (!variant)
|
|
213
353
|
throw new MediaNotFoundError(`${id}#${conversion}`);
|
|
214
|
-
return
|
|
354
|
+
return {
|
|
355
|
+
record,
|
|
356
|
+
disk: variant.disk,
|
|
357
|
+
path: variant.path,
|
|
358
|
+
// The conversion has its own format (and so its own extension); the record's `fileName`
|
|
359
|
+
// names the original.
|
|
360
|
+
fileName: variant.path.slice(variant.path.lastIndexOf('/') + 1),
|
|
361
|
+
};
|
|
215
362
|
}
|
|
216
363
|
const record = await this.store.find(id);
|
|
217
364
|
if (!record)
|
|
218
365
|
throw new MediaNotFoundError(id);
|
|
219
|
-
return
|
|
366
|
+
return { record, disk: record.disk, path: record.path, fileName: record.fileName };
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Public URL for a media record or one of its conversions. When a conversion is
|
|
370
|
+
* requested and not yet generated, it is produced lazily (and cached) first.
|
|
371
|
+
*/
|
|
372
|
+
async url(id, conversion) {
|
|
373
|
+
const target = await this.#resolveTarget(id, conversion);
|
|
374
|
+
return this.storage.disk(target.disk).getUrl(target.path);
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Resolve how a media record should reach the client, per the configured `delivery.mode` — the
|
|
378
|
+
* read-side counterpart to `uploads.mode`. Returns either a URL to redirect to (`public`/`signed`)
|
|
379
|
+
* or a {@link Readable} to pipe (`proxy`), so an app on a private bucket with no
|
|
380
|
+
* internet-reachable storage stops hand-rolling a streaming route.
|
|
381
|
+
*
|
|
382
|
+
* Like every other library method this answers "how", NOT "who": authorize the caller first. See
|
|
383
|
+
* {@link MediaDeliveryHandler} for mounting this as a route.
|
|
384
|
+
*
|
|
385
|
+
* ```ts
|
|
386
|
+
* const result = await media.library.deliver(id)
|
|
387
|
+
* if (result.kind === 'redirect') return response.redirect(result.url)
|
|
388
|
+
* response.header('content-type', result.mimeType)
|
|
389
|
+
* return response.stream(result.stream)
|
|
390
|
+
* ```
|
|
391
|
+
*/
|
|
392
|
+
async deliver(id, options = {}) {
|
|
393
|
+
const target = await this.#resolveTarget(id, options.conversion);
|
|
394
|
+
const disk = this.storage.disk(target.disk);
|
|
395
|
+
const mode = await resolveDeliveryMode(options.mode ?? this.deliveryMode, disk, target.path);
|
|
396
|
+
if (mode === 'public')
|
|
397
|
+
return { kind: 'redirect', url: await disk.getUrl(target.path) };
|
|
398
|
+
if (mode === 'signed') {
|
|
399
|
+
const expiresIn = options.signedTtlSeconds ?? this.deliverySignedTtlSeconds;
|
|
400
|
+
return { kind: 'redirect', url: await disk.getSignedUrl(target.path, { expiresIn }) };
|
|
401
|
+
}
|
|
402
|
+
// Prefer the disk's own metadata over the record's: for a conversion the record describes the
|
|
403
|
+
// ORIGINAL (a `thumb` of a PNG may well be a WEBP), and its `size` is the original's too.
|
|
404
|
+
const metadata = await disk.getMetaData(target.path);
|
|
405
|
+
return {
|
|
406
|
+
kind: 'stream',
|
|
407
|
+
stream: await disk.getStream(target.path),
|
|
408
|
+
mimeType: metadata.contentType ?? target.record.mimeType,
|
|
409
|
+
size: metadata.contentLength,
|
|
410
|
+
fileName: target.fileName,
|
|
411
|
+
};
|
|
220
412
|
}
|
|
221
413
|
/**
|
|
222
414
|
* Signed, expiring URL for a media record or one of its conversions.
|
|
@@ -228,17 +420,8 @@ export class MediaLibrary {
|
|
|
228
420
|
async signedUrl(id, expiresIn, options = {}) {
|
|
229
421
|
const { conversion, ...responseOptions } = options;
|
|
230
422
|
const signOptions = { expiresIn, ...responseOptions };
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
const variant = record.conversions[conversion];
|
|
234
|
-
if (!variant)
|
|
235
|
-
throw new MediaNotFoundError(`${id}#${conversion}`);
|
|
236
|
-
return this.storage.disk(variant.disk).getSignedUrl(variant.path, signOptions);
|
|
237
|
-
}
|
|
238
|
-
const record = await this.store.find(id);
|
|
239
|
-
if (!record)
|
|
240
|
-
throw new MediaNotFoundError(id);
|
|
241
|
-
return this.storage.disk(record.disk).getSignedUrl(record.path, signOptions);
|
|
423
|
+
const target = await this.#resolveTarget(id, conversion);
|
|
424
|
+
return this.storage.disk(target.disk).getSignedUrl(target.path, signOptions);
|
|
242
425
|
}
|
|
243
426
|
}
|
|
244
427
|
function stripExtension(fileName) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media_library.js","sourceRoot":"","sources":["../../src/media_library.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"media_library.js","sourceRoot":"","sources":["../../src/media_library.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { AttachmentManager } from './attachment.js';
|
|
2
|
+
import type { DeliveryMode } from './delivery.js';
|
|
2
3
|
import type { ImageProcessor } from './image_processor.js';
|
|
3
4
|
import type { MediaCollectionConfig } from './media_collection.js';
|
|
4
5
|
import { MediaLibrary } from './media_library.js';
|
|
6
|
+
import type { AttachExistingInput } from './media_library.js';
|
|
7
|
+
import type { MediaRecord } from './media_record.js';
|
|
5
8
|
import type { MediaStore } from './media_store.js';
|
|
6
9
|
import { ResumableUploadManager } from './resumable_upload.js';
|
|
7
10
|
import type { UploadSessionStore } from './resumable_upload.js';
|
|
@@ -34,6 +37,10 @@ export interface MediaManagerOptions {
|
|
|
34
37
|
resumableTmpPrefix?: string;
|
|
35
38
|
/** Resumable session lifetime in seconds (TUS `expiration`). Omit for never-expiring sessions. */
|
|
36
39
|
resumableSessionTtlSeconds?: number;
|
|
40
|
+
/** Default read strategy (`auto`/`public`/`signed`/`proxy`) for `library.deliver`. Default `auto`. */
|
|
41
|
+
deliveryMode?: DeliveryMode;
|
|
42
|
+
/** Signed-URL lifetime in seconds when delivery resolves to `signed`. Default 300. */
|
|
43
|
+
deliverySignedTtlSeconds?: number;
|
|
37
44
|
}
|
|
38
45
|
/**
|
|
39
46
|
* The singleton bound into the AdonisJS container as `MediaManager`. Composes the two layers over a
|
|
@@ -64,6 +71,23 @@ export declare class MediaManager {
|
|
|
64
71
|
* a session store was configured via `uploads.resumable` in `config/media.ts`.
|
|
65
72
|
*/
|
|
66
73
|
get resumable(): ResumableUploadManager;
|
|
74
|
+
/**
|
|
75
|
+
* Finish a resumable (TUS) upload and register the assembled object as a media record, in one
|
|
76
|
+
* step and without ever reading the uploaded bytes back: `resumable.complete()` returns the final
|
|
77
|
+
* `{ key, disk, size }`, which {@link MediaLibrary.attachExisting} adopts as-is.
|
|
78
|
+
*
|
|
79
|
+
* This lives here because the two layers meet only at the manager — {@link ResumableUploadManager}
|
|
80
|
+
* knows nothing of the library. It is opt-in: {@link resumable}'s `complete()` stays the raw
|
|
81
|
+
* primitive for uploads that should NOT become library assets.
|
|
82
|
+
*
|
|
83
|
+
* ```ts
|
|
84
|
+
* await media.completeUploadToLibrary(sessionId, {
|
|
85
|
+
* ownerType: 'Post', ownerId: post.id, collection: 'gallery',
|
|
86
|
+
* fileName: 'scan.pdf', mimeType: 'application/pdf',
|
|
87
|
+
* })
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
completeUploadToLibrary(sessionId: string, input: Omit<AttachExistingInput, 'key' | 'disk' | 'size'>): Promise<MediaRecord>;
|
|
67
91
|
/** Whether resumable (TUS) uploads are configured (a session store is present). */
|
|
68
92
|
get hasResumable(): boolean;
|
|
69
93
|
/** Resolve a raw disk by name (escape hatch to the underlying Drive disk). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media_manager.d.ts","sourceRoot":"","sources":["../../src/media_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"media_manager.d.ts","sourceRoot":"","sources":["../../src/media_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,10 @@ export class MediaManager {
|
|
|
39
39
|
...(options.emitDiagnostics !== undefined
|
|
40
40
|
? { emitDiagnostics: options.emitDiagnostics }
|
|
41
41
|
: {}),
|
|
42
|
+
...(options.deliveryMode !== undefined ? { deliveryMode: options.deliveryMode } : {}),
|
|
43
|
+
...(options.deliverySignedTtlSeconds !== undefined
|
|
44
|
+
? { deliverySignedTtlSeconds: options.deliverySignedTtlSeconds }
|
|
45
|
+
: {}),
|
|
42
46
|
});
|
|
43
47
|
this.attachments = new AttachmentManager({
|
|
44
48
|
storage: this.storage,
|
|
@@ -86,6 +90,26 @@ export class MediaManager {
|
|
|
86
90
|
throw new ResumableUploadsNotConfiguredError();
|
|
87
91
|
return this.#resumable;
|
|
88
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Finish a resumable (TUS) upload and register the assembled object as a media record, in one
|
|
95
|
+
* step and without ever reading the uploaded bytes back: `resumable.complete()` returns the final
|
|
96
|
+
* `{ key, disk, size }`, which {@link MediaLibrary.attachExisting} adopts as-is.
|
|
97
|
+
*
|
|
98
|
+
* This lives here because the two layers meet only at the manager — {@link ResumableUploadManager}
|
|
99
|
+
* knows nothing of the library. It is opt-in: {@link resumable}'s `complete()` stays the raw
|
|
100
|
+
* primitive for uploads that should NOT become library assets.
|
|
101
|
+
*
|
|
102
|
+
* ```ts
|
|
103
|
+
* await media.completeUploadToLibrary(sessionId, {
|
|
104
|
+
* ownerType: 'Post', ownerId: post.id, collection: 'gallery',
|
|
105
|
+
* fileName: 'scan.pdf', mimeType: 'application/pdf',
|
|
106
|
+
* })
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
async completeUploadToLibrary(sessionId, input) {
|
|
110
|
+
const { key, disk, size } = await this.resumable.complete(sessionId);
|
|
111
|
+
return this.library.attachExisting({ ...input, key, disk, size });
|
|
112
|
+
}
|
|
89
113
|
/** Whether resumable (TUS) uploads are configured (a session store is present). */
|
|
90
114
|
get hasResumable() {
|
|
91
115
|
return this.#resumable !== undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media_manager.js","sourceRoot":"","sources":["../../src/media_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"media_manager.js","sourceRoot":"","sources":["../../src/media_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Readable } from 'node:stream';
|
|
2
2
|
import type { Disk, DiskMetaData, DiskResolver, DiskWriteOptions, SignedUrlOptions } from '../types.js';
|
|
3
|
+
/** Visibility an {@link InMemoryDisk} reports — or `'unknown'` for a disk with no such signal. */
|
|
4
|
+
export type DiskVisibility = 'public' | 'private' | 'unknown';
|
|
3
5
|
interface StoredFile {
|
|
4
6
|
data: Buffer;
|
|
5
7
|
contentType?: string | undefined;
|
|
@@ -25,9 +27,17 @@ export declare class InMemoryDisk implements Disk {
|
|
|
25
27
|
readonly files: Map<string, StoredFile>;
|
|
26
28
|
/** Options from the most recent `getSignedUrl` call, so tests can assert the contract. */
|
|
27
29
|
lastSignedUrlOptions: SignedUrlOptions | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Reports the object visibility `delivery.mode: 'auto'` branches on. Defined as an own property
|
|
32
|
+
* rather than a prototype method so `'unknown'` genuinely REMOVES it — that is the "disk that
|
|
33
|
+
* cannot answer" case, which `resolveDeliveryMode` detects by probing for the method.
|
|
34
|
+
*/
|
|
35
|
+
readonly getVisibility?: (key: string) => Promise<'public' | 'private'>;
|
|
28
36
|
constructor(
|
|
29
37
|
/** Used to render `getUrl`/`getSignedUrl`. */
|
|
30
|
-
baseUrl?: string
|
|
38
|
+
baseUrl?: string,
|
|
39
|
+
/** What `getVisibility` reports; `'unknown'` omits the method entirely. */
|
|
40
|
+
visibility?: DiskVisibility);
|
|
31
41
|
put(key: string, contents: Uint8Array, options?: DiskWriteOptions): Promise<void>;
|
|
32
42
|
putStream(key: string, contents: Readable, options?: DiskWriteOptions): Promise<void>;
|
|
33
43
|
getBytes(key: string): Promise<Uint8Array>;
|
|
@@ -48,7 +58,9 @@ export declare class InMemoryDisk implements Disk {
|
|
|
48
58
|
* const storage = new StorageManager({ default: 'fs', resolve })
|
|
49
59
|
* ```
|
|
50
60
|
*/
|
|
51
|
-
export declare function inMemoryDiskResolver(names?: string[]
|
|
61
|
+
export declare function inMemoryDiskResolver(names?: string[],
|
|
62
|
+
/** Visibility every disk reports; `'unknown'` builds disks with no `getVisibility` at all. */
|
|
63
|
+
visibility?: DiskVisibility): {
|
|
52
64
|
resolve: DiskResolver;
|
|
53
65
|
disks: Record<string, InMemoryDisk>;
|
|
54
66
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in_memory_disk.d.ts","sourceRoot":"","sources":["../../../src/testing/in_memory_disk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,EACV,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,YAAY,EAAE,IAAI,CAAC;IACnB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;;GAIG;AACH,qBAAa,YAAa,YAAW,IAAI;
|
|
1
|
+
{"version":3,"file":"in_memory_disk.d.ts","sourceRoot":"","sources":["../../../src/testing/in_memory_disk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,EACV,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,kGAAkG;AAClG,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9D,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,YAAY,EAAE,IAAI,CAAC;IACnB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;;GAIG;AACH,qBAAa,YAAa,YAAW,IAAI;IAcrC,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAd1B,QAAQ,CAAC,KAAK,0BAAiC;IAE/C,0FAA0F;IAC1F,oBAAoB,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAEnD;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;;IAGtE,8CAA8C;IAC7B,OAAO,SAAkB;IAC1C,2EAA2E;IAC3E,UAAU,GAAE,cAA0B;IAKlC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjF,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAK1C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIzC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAMtE,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IASrD,OAAO,CAAC,OAAO;CAKhB;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,GAAE,MAAM,EAAgB;AAC7B,8FAA8F;AAC9F,UAAU,GAAE,cAA0B,GACrC;IACD,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACrC,CAWA"}
|
|
@@ -9,10 +9,20 @@ export class InMemoryDisk {
|
|
|
9
9
|
files = new Map();
|
|
10
10
|
/** Options from the most recent `getSignedUrl` call, so tests can assert the contract. */
|
|
11
11
|
lastSignedUrlOptions;
|
|
12
|
+
/**
|
|
13
|
+
* Reports the object visibility `delivery.mode: 'auto'` branches on. Defined as an own property
|
|
14
|
+
* rather than a prototype method so `'unknown'` genuinely REMOVES it — that is the "disk that
|
|
15
|
+
* cannot answer" case, which `resolveDeliveryMode` detects by probing for the method.
|
|
16
|
+
*/
|
|
17
|
+
getVisibility;
|
|
12
18
|
constructor(
|
|
13
19
|
/** Used to render `getUrl`/`getSignedUrl`. */
|
|
14
|
-
baseUrl = 'memory://disk'
|
|
20
|
+
baseUrl = 'memory://disk',
|
|
21
|
+
/** What `getVisibility` reports; `'unknown'` omits the method entirely. */
|
|
22
|
+
visibility = 'private') {
|
|
15
23
|
this.baseUrl = baseUrl;
|
|
24
|
+
if (visibility !== 'unknown')
|
|
25
|
+
this.getVisibility = async () => visibility;
|
|
16
26
|
}
|
|
17
27
|
async put(key, contents, options) {
|
|
18
28
|
this.files.set(key, {
|
|
@@ -77,10 +87,12 @@ export class InMemoryDisk {
|
|
|
77
87
|
* const storage = new StorageManager({ default: 'fs', resolve })
|
|
78
88
|
* ```
|
|
79
89
|
*/
|
|
80
|
-
export function inMemoryDiskResolver(names = ['default']
|
|
90
|
+
export function inMemoryDiskResolver(names = ['default'],
|
|
91
|
+
/** Visibility every disk reports; `'unknown'` builds disks with no `getVisibility` at all. */
|
|
92
|
+
visibility = 'private') {
|
|
81
93
|
const disks = {};
|
|
82
94
|
for (const name of names)
|
|
83
|
-
disks[name] = new InMemoryDisk(`memory://${name}
|
|
95
|
+
disks[name] = new InMemoryDisk(`memory://${name}`, visibility);
|
|
84
96
|
const fallback = names[0] ?? 'default';
|
|
85
97
|
const resolve = (name) => {
|
|
86
98
|
const key = name ?? fallback;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in_memory_disk.js","sourceRoot":"","sources":["../../../src/testing/in_memory_disk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"in_memory_disk.js","sourceRoot":"","sources":["../../../src/testing/in_memory_disk.ts"],"names":[],"mappings":"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"}
|