@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.
- package/CHANGELOG.md +76 -0
- package/README.md +2 -2
- package/dist/providers/media_provider.d.ts.map +1 -1
- package/dist/providers/media_provider.js +113 -0
- package/dist/providers/media_provider.js.map +1 -1
- package/dist/src/content_type.d.ts +6 -1
- package/dist/src/content_type.d.ts.map +1 -1
- package/dist/src/content_type.js +102 -7
- package/dist/src/content_type.js.map +1 -1
- package/dist/src/define_config.d.ts +88 -5
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js +7 -2
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/direct_upload.d.ts +177 -0
- package/dist/src/direct_upload.d.ts.map +1 -0
- package/dist/src/direct_upload.js +299 -0
- package/dist/src/direct_upload.js.map +1 -0
- package/dist/src/direct_upload_handler.d.ts +83 -0
- package/dist/src/direct_upload_handler.d.ts.map +1 -0
- package/dist/src/direct_upload_handler.js +180 -0
- package/dist/src/direct_upload_handler.js.map +1 -0
- package/dist/src/disks/factory.d.ts +11 -3
- package/dist/src/disks/factory.d.ts.map +1 -1
- package/dist/src/disks/factory.js +5 -3
- package/dist/src/disks/factory.js.map +1 -1
- package/dist/src/disks/s3.d.ts +10 -0
- package/dist/src/disks/s3.d.ts.map +1 -1
- package/dist/src/disks/s3.js +96 -22
- package/dist/src/disks/s3.js.map +1 -1
- package/dist/src/disks/sigv4.d.ts +58 -0
- package/dist/src/disks/sigv4.d.ts.map +1 -0
- package/dist/src/disks/sigv4.js +87 -0
- package/dist/src/disks/sigv4.js.map +1 -0
- package/dist/src/disks/xml_fallback.d.ts +3 -3
- package/dist/src/disks/xml_fallback.js +3 -3
- package/dist/src/errors.d.ts +104 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +145 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/hls/delivery.d.ts +112 -0
- package/dist/src/hls/delivery.d.ts.map +1 -0
- package/dist/src/hls/delivery.js +118 -0
- package/dist/src/hls/delivery.js.map +1 -0
- package/dist/src/hls/playlist.d.ts +67 -0
- package/dist/src/hls/playlist.d.ts.map +1 -0
- package/dist/src/hls/playlist.js +126 -0
- package/dist/src/hls/playlist.js.map +1 -0
- package/dist/src/index.d.ts +18 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +13 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/media_collection.d.ts +8 -1
- package/dist/src/media_collection.d.ts.map +1 -1
- package/dist/src/media_collection.js +23 -1
- package/dist/src/media_collection.js.map +1 -1
- package/dist/src/media_library.d.ts +32 -2
- package/dist/src/media_library.d.ts.map +1 -1
- package/dist/src/media_library.js +218 -11
- package/dist/src/media_library.js.map +1 -1
- package/dist/src/media_manager.d.ts +37 -2
- package/dist/src/media_manager.d.ts.map +1 -1
- package/dist/src/media_manager.js +54 -1
- package/dist/src/media_manager.js.map +1 -1
- package/dist/src/media_record.d.ts +22 -2
- package/dist/src/media_record.d.ts.map +1 -1
- package/dist/src/testing/fake_transformer.d.ts +32 -0
- package/dist/src/testing/fake_transformer.d.ts.map +1 -0
- package/dist/src/testing/fake_transformer.js +32 -0
- package/dist/src/testing/fake_transformer.js.map +1 -0
- package/dist/src/testing/index.d.ts +2 -0
- package/dist/src/testing/index.d.ts.map +1 -1
- package/dist/src/testing/index.js +1 -0
- package/dist/src/testing/index.js.map +1 -1
- package/dist/src/transformer.d.ts +111 -0
- package/dist/src/transformer.d.ts.map +1 -0
- package/dist/src/transformer.js +2 -0
- package/dist/src/transformer.js.map +1 -0
- package/dist/src/transformers/factory.d.ts +30 -0
- package/dist/src/transformers/factory.d.ts.map +1 -0
- package/dist/src/transformers/factory.js +34 -0
- package/dist/src/transformers/factory.js.map +1 -0
- package/dist/src/transformers/hls.d.ts +110 -0
- package/dist/src/transformers/hls.d.ts.map +1 -0
- package/dist/src/transformers/hls.js +111 -0
- package/dist/src/transformers/hls.js.map +1 -0
- package/dist/src/transformers/mediabunny.d.ts +5 -0
- package/dist/src/transformers/mediabunny.d.ts.map +1 -0
- package/dist/src/transformers/mediabunny.js +150 -0
- package/dist/src/transformers/mediabunny.js.map +1 -0
- package/dist/src/transformers/mediabunny_loader.d.ts +15 -0
- package/dist/src/transformers/mediabunny_loader.d.ts.map +1 -0
- package/dist/src/transformers/mediabunny_loader.js +21 -0
- package/dist/src/transformers/mediabunny_loader.js.map +1 -0
- package/dist/src/transformers/probe.d.ts +56 -0
- package/dist/src/transformers/probe.d.ts.map +1 -0
- package/dist/src/transformers/probe.js +32 -0
- package/dist/src/transformers/probe.js.map +1 -0
- package/dist/src/transformers/source_file.d.ts +20 -0
- package/dist/src/transformers/source_file.d.ts.map +1 -0
- package/dist/src/transformers/source_file.js +30 -0
- package/dist/src/transformers/source_file.js.map +1 -0
- package/dist/stubs/config/media.stub +12 -0
- package/package.json +11 -7
- package/LICENSE +0 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct_upload.js","sourceRoot":"","sources":["../../src/direct_upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { DirectUploadManager } from './direct_upload.js';
|
|
2
|
+
import type { MultipartPart } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* A web-framework-neutral direct-upload request, one variant per lifecycle step (the provider maps
|
|
5
|
+
* an AdonisJS `HttpContext` to this; any other framework maps its own request the same way).
|
|
6
|
+
*/
|
|
7
|
+
export type DirectUploadRequest = {
|
|
8
|
+
action: 'initiate';
|
|
9
|
+
/** Name of the file being uploaded — feeds `keyFor`, never used as a key verbatim. */
|
|
10
|
+
fileName: string;
|
|
11
|
+
/** Total size in bytes. */
|
|
12
|
+
size: number;
|
|
13
|
+
contentType?: string | undefined;
|
|
14
|
+
/** Extra metadata persisted on the session. */
|
|
15
|
+
metadata?: Record<string, string> | undefined;
|
|
16
|
+
} | {
|
|
17
|
+
action: 'status';
|
|
18
|
+
uploadId: string;
|
|
19
|
+
} | {
|
|
20
|
+
action: 'confirm-part';
|
|
21
|
+
uploadId: string;
|
|
22
|
+
partNumber: number;
|
|
23
|
+
etag: string;
|
|
24
|
+
} | {
|
|
25
|
+
action: 'complete';
|
|
26
|
+
uploadId: string;
|
|
27
|
+
parts?: MultipartPart[] | undefined;
|
|
28
|
+
} | {
|
|
29
|
+
action: 'abort';
|
|
30
|
+
uploadId: string;
|
|
31
|
+
};
|
|
32
|
+
/** A web-framework-neutral response: a status code and a JSON-serializable body. */
|
|
33
|
+
export interface DirectUploadResponse {
|
|
34
|
+
status: number;
|
|
35
|
+
body?: unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface DirectUploadHandlerOptions {
|
|
38
|
+
manager: DirectUploadManager;
|
|
39
|
+
/** Disk uploads land on. Defaults to the manager's default disk. */
|
|
40
|
+
disk?: string | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Collection this endpoint uploads into. Forwarded to the manager's `initiate`, whose MIME gate
|
|
43
|
+
* (against the registry the manager holds) rejects a wrong declared type with `415` before the
|
|
44
|
+
* multipart upload opens. The collection config stays the single source of truth.
|
|
45
|
+
*/
|
|
46
|
+
collection?: string | undefined;
|
|
47
|
+
/** Reject initiations whose `size` exceeds this many bytes (`413`). */
|
|
48
|
+
maxSize?: number | undefined;
|
|
49
|
+
/** Compute the final object key. Default: `uploads/<token>/<fileName>`. */
|
|
50
|
+
keyFor?: ((fileName: string, token: string, metadata: Record<string, string>) => string) | undefined;
|
|
51
|
+
idGenerator?: (() => string) | undefined;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* HTTP half of the session-backed direct upload flow, mirroring {@link TusUploadHandler}: the core
|
|
55
|
+
* ({@link DirectUploadManager}) never sees HTTP, this class never sees a framework, and a thin
|
|
56
|
+
* AdonisJS route adapter maps `HttpContext` to {@link DirectUploadRequest}/{@link DirectUploadResponse}.
|
|
57
|
+
*
|
|
58
|
+
* The endpoint surface it expects to be mounted on (see the provider's `uploads.direct.routes`):
|
|
59
|
+
*
|
|
60
|
+
* - `POST /` → `initiate` — `201` + session id, part size, presigned URLs
|
|
61
|
+
* - `GET /:id` → `status` — confirmed ETags + fresh URLs for pending parts
|
|
62
|
+
* - `POST /:id/parts/:partNumber` → `confirm-part` — record one uploaded part's ETag
|
|
63
|
+
* - `POST /:id/complete` → `complete` — assemble; `409` names any missing parts
|
|
64
|
+
* - `DELETE /:id` → `abort`
|
|
65
|
+
*
|
|
66
|
+
* **This handler performs NO authorization** — the same split as `TusUploadHandler` and
|
|
67
|
+
* `MediaDeliveryHandler`. Who may upload, and into whose namespace the key resolves, are questions
|
|
68
|
+
* only the app can answer: guard the route, and resolve the key server-side via {@link keyFor}
|
|
69
|
+
* (the client sends a `fileName`, never a key).
|
|
70
|
+
*/
|
|
71
|
+
export declare class DirectUploadHandler {
|
|
72
|
+
private readonly manager;
|
|
73
|
+
private readonly disk;
|
|
74
|
+
private readonly collection;
|
|
75
|
+
private readonly maxSize;
|
|
76
|
+
private readonly keyFor;
|
|
77
|
+
private readonly newId;
|
|
78
|
+
constructor(options: DirectUploadHandlerOptions);
|
|
79
|
+
handle(req: DirectUploadRequest): Promise<DirectUploadResponse>;
|
|
80
|
+
/** Map manager errors onto HTTP statuses; anything unexpected keeps propagating. */
|
|
81
|
+
private mapError;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=direct_upload_handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct_upload_handler.d.ts","sourceRoot":"","sources":["../../src/direct_upload_handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAU9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IACE,MAAM,EAAE,UAAU,CAAC;IACnB,sFAAsF;IACtF,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAC/C,GACD;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9E;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,EAAE,GAAG,SAAS,CAAA;CAAE,GAC7E;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,oFAAoF;AACpF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,2EAA2E;IAC3E,MAAM,CAAC,EACH,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,GAC/E,SAAS,CAAC;IACd,WAAW,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8D;IACrF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,OAAO,EAAE,0BAA0B;IASzC,MAAM,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2HrE,oFAAoF;IACpF,OAAO,CAAC,QAAQ;CA4BjB"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { MimeNotAllowedError, UploadNotSupportedError, UploadPartOutOfRangeError, UploadPartSizeError, UploadPartsIncompleteError, UploadSessionExpiredError, UploadSessionNotFoundError, } from './errors.js';
|
|
3
|
+
/**
|
|
4
|
+
* HTTP half of the session-backed direct upload flow, mirroring {@link TusUploadHandler}: the core
|
|
5
|
+
* ({@link DirectUploadManager}) never sees HTTP, this class never sees a framework, and a thin
|
|
6
|
+
* AdonisJS route adapter maps `HttpContext` to {@link DirectUploadRequest}/{@link DirectUploadResponse}.
|
|
7
|
+
*
|
|
8
|
+
* The endpoint surface it expects to be mounted on (see the provider's `uploads.direct.routes`):
|
|
9
|
+
*
|
|
10
|
+
* - `POST /` → `initiate` — `201` + session id, part size, presigned URLs
|
|
11
|
+
* - `GET /:id` → `status` — confirmed ETags + fresh URLs for pending parts
|
|
12
|
+
* - `POST /:id/parts/:partNumber` → `confirm-part` — record one uploaded part's ETag
|
|
13
|
+
* - `POST /:id/complete` → `complete` — assemble; `409` names any missing parts
|
|
14
|
+
* - `DELETE /:id` → `abort`
|
|
15
|
+
*
|
|
16
|
+
* **This handler performs NO authorization** — the same split as `TusUploadHandler` and
|
|
17
|
+
* `MediaDeliveryHandler`. Who may upload, and into whose namespace the key resolves, are questions
|
|
18
|
+
* only the app can answer: guard the route, and resolve the key server-side via {@link keyFor}
|
|
19
|
+
* (the client sends a `fileName`, never a key).
|
|
20
|
+
*/
|
|
21
|
+
export class DirectUploadHandler {
|
|
22
|
+
manager;
|
|
23
|
+
disk;
|
|
24
|
+
collection;
|
|
25
|
+
maxSize;
|
|
26
|
+
keyFor;
|
|
27
|
+
newId;
|
|
28
|
+
constructor(options) {
|
|
29
|
+
this.manager = options.manager;
|
|
30
|
+
this.disk = options.disk;
|
|
31
|
+
this.collection = options.collection;
|
|
32
|
+
this.maxSize = options.maxSize;
|
|
33
|
+
this.keyFor = options.keyFor ?? ((fileName, token) => `uploads/${token}/${fileName}`);
|
|
34
|
+
this.newId = options.idGenerator ?? (() => randomUUID());
|
|
35
|
+
}
|
|
36
|
+
async handle(req) {
|
|
37
|
+
switch (req.action) {
|
|
38
|
+
case 'initiate': {
|
|
39
|
+
if (typeof req.fileName !== 'string' || req.fileName.length === 0) {
|
|
40
|
+
return { status: 400, body: { error: 'fileName is required' } };
|
|
41
|
+
}
|
|
42
|
+
if (!Number.isInteger(req.size) || req.size <= 0) {
|
|
43
|
+
return { status: 400, body: { error: 'size must be a positive integer' } };
|
|
44
|
+
}
|
|
45
|
+
if (this.maxSize !== undefined && req.size > this.maxSize) {
|
|
46
|
+
return {
|
|
47
|
+
status: 413,
|
|
48
|
+
body: { error: `Upload exceeds the maximum size of ${this.maxSize} bytes` },
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const metadata = req.metadata ?? {};
|
|
52
|
+
try {
|
|
53
|
+
const created = await this.manager.initiate({
|
|
54
|
+
key: this.keyFor(req.fileName, this.newId(), metadata),
|
|
55
|
+
size: req.size,
|
|
56
|
+
contentType: req.contentType,
|
|
57
|
+
metadata,
|
|
58
|
+
...(this.disk !== undefined ? { disk: this.disk } : {}),
|
|
59
|
+
...(this.collection !== undefined ? { collection: this.collection } : {}),
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
status: 201,
|
|
63
|
+
body: {
|
|
64
|
+
id: created.id,
|
|
65
|
+
key: created.key,
|
|
66
|
+
disk: created.disk,
|
|
67
|
+
partSize: created.partSize,
|
|
68
|
+
size: created.size,
|
|
69
|
+
totalParts: created.totalParts,
|
|
70
|
+
parts: created.parts,
|
|
71
|
+
...(created.expiresAt !== undefined
|
|
72
|
+
? { expiresAt: created.expiresAt.toISOString() }
|
|
73
|
+
: {}),
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
return this.mapError(err);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
case 'status': {
|
|
82
|
+
try {
|
|
83
|
+
const status = await this.manager.status(req.uploadId);
|
|
84
|
+
return {
|
|
85
|
+
status: 200,
|
|
86
|
+
body: {
|
|
87
|
+
id: status.id,
|
|
88
|
+
key: status.key,
|
|
89
|
+
disk: status.disk,
|
|
90
|
+
partSize: status.partSize,
|
|
91
|
+
size: status.size,
|
|
92
|
+
totalParts: status.totalParts,
|
|
93
|
+
...(status.contentType !== undefined ? { contentType: status.contentType } : {}),
|
|
94
|
+
completedParts: status.completedParts,
|
|
95
|
+
pendingParts: status.pendingParts,
|
|
96
|
+
...(status.expiresAt !== undefined
|
|
97
|
+
? { expiresAt: status.expiresAt.toISOString() }
|
|
98
|
+
: {}),
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
return this.mapError(err);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
case 'confirm-part': {
|
|
107
|
+
if (!Number.isInteger(req.partNumber) || req.partNumber < 1) {
|
|
108
|
+
return { status: 400, body: { error: 'partNumber must be a positive integer' } };
|
|
109
|
+
}
|
|
110
|
+
if (typeof req.etag !== 'string' || req.etag.length === 0) {
|
|
111
|
+
return { status: 400, body: { error: 'etag is required' } };
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
const progress = await this.manager.confirmPart(req.uploadId, {
|
|
115
|
+
partNumber: req.partNumber,
|
|
116
|
+
etag: req.etag,
|
|
117
|
+
});
|
|
118
|
+
return { status: 200, body: progress };
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
return this.mapError(err);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
case 'complete': {
|
|
125
|
+
const parts = req.parts ?? [];
|
|
126
|
+
if (!Array.isArray(parts) ||
|
|
127
|
+
parts.some((part) => !Number.isInteger(part?.partNumber) ||
|
|
128
|
+
part.partNumber < 1 ||
|
|
129
|
+
typeof part?.etag !== 'string' ||
|
|
130
|
+
part.etag.length === 0)) {
|
|
131
|
+
return {
|
|
132
|
+
status: 400,
|
|
133
|
+
body: { error: 'parts must be an array of { partNumber, etag }' },
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
const done = await this.manager.complete(req.uploadId, parts);
|
|
138
|
+
return { status: 200, body: done };
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
return this.mapError(err);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
case 'abort': {
|
|
145
|
+
await this.manager.abort(req.uploadId);
|
|
146
|
+
return { status: 204 };
|
|
147
|
+
}
|
|
148
|
+
default:
|
|
149
|
+
return { status: 400, body: { error: 'Unknown action' } };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/** Map manager errors onto HTTP statuses; anything unexpected keeps propagating. */
|
|
153
|
+
mapError(err) {
|
|
154
|
+
if (err instanceof UploadSessionNotFoundError) {
|
|
155
|
+
return { status: 404, body: { error: err.message, code: err.code } };
|
|
156
|
+
}
|
|
157
|
+
if (err instanceof UploadSessionExpiredError) {
|
|
158
|
+
return { status: 410, body: { error: err.message, code: err.code } };
|
|
159
|
+
}
|
|
160
|
+
if (err instanceof MimeNotAllowedError) {
|
|
161
|
+
return { status: 415, body: { error: err.message, code: err.code } };
|
|
162
|
+
}
|
|
163
|
+
// Not-yet-uploaded parts are client state out of sync with the session, not a bad request.
|
|
164
|
+
if (err instanceof UploadPartsIncompleteError) {
|
|
165
|
+
return {
|
|
166
|
+
status: 409,
|
|
167
|
+
body: { error: err.message, code: err.code, missingParts: [...err.missingParts] },
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if (err instanceof UploadPartOutOfRangeError ||
|
|
171
|
+
err instanceof UploadPartSizeError ||
|
|
172
|
+
err instanceof UploadNotSupportedError ||
|
|
173
|
+
err instanceof RangeError) {
|
|
174
|
+
const code = err.code;
|
|
175
|
+
return { status: 400, body: { error: err.message, ...(code ? { code } : {}) } };
|
|
176
|
+
}
|
|
177
|
+
throw err;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=direct_upload_handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct_upload_handler.js","sourceRoot":"","sources":["../../src/direct_upload_handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,13 @@ export interface S3DiskConfig {
|
|
|
24
24
|
credentials?: S3Credentials;
|
|
25
25
|
/** Custom endpoint for S3-compatible services (MinIO, R2, DigitalOcean Spaces, …). */
|
|
26
26
|
endpoint?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Endpoint presigned URLs are signed against, when it differs from `endpoint`. Presigned URLs are
|
|
29
|
+
* consumed by the BROWSER (direct-upload part `PUT`s, signed `GET`s) and SigV4 bakes the host into
|
|
30
|
+
* the signature — so when `endpoint` is an internal FQDN the internet cannot resolve (MinIO on a
|
|
31
|
+
* private network), set the public one here. Server-side operations keep using `endpoint`.
|
|
32
|
+
*/
|
|
33
|
+
publicEndpoint?: string;
|
|
27
34
|
/** Use path-style addressing (`endpoint/bucket/key`) — required by most S3-compatible services. */
|
|
28
35
|
forcePathStyle?: boolean;
|
|
29
36
|
/** Prefix prepended to every key (e.g. `uploads`). */
|
|
@@ -51,11 +58,12 @@ export interface S3DiskConfig {
|
|
|
51
58
|
* ```
|
|
52
59
|
*
|
|
53
60
|
* Each factory returns a {@link DiskFactory} — a lazy thunk. Calling it in the config file costs
|
|
54
|
-
* nothing; `@aws-sdk/client-s3`
|
|
55
|
-
*
|
|
61
|
+
* nothing; `@aws-sdk/client-s3` is only imported when the provider builds the selected disk at
|
|
62
|
+
* boot, keeping the AWS SDK an optional peer. (Presigning needs no SDK at all — it is hand-rolled
|
|
63
|
+
* SigV4, see `sigv4.ts`.)
|
|
56
64
|
*/
|
|
57
65
|
export declare const disks: {
|
|
58
|
-
/** S3 (or S3-compatible) disk — needs the optional `@aws-sdk/client-s3`
|
|
66
|
+
/** S3 (or S3-compatible) disk — needs the optional `@aws-sdk/client-s3` peer. */
|
|
59
67
|
s3(config: S3DiskConfig): DiskFactory;
|
|
60
68
|
};
|
|
61
69
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/disks/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9C,yGAAyG;AACzG,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,sGAAsG;AACtG,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mGAAmG;IACnG,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACnC;AAED
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/disks/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9C,yGAAyG;AACzG,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,sGAAsG;AACtG,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mGAAmG;IACnG,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,KAAK;IAChB,iFAAiF;eACtE,YAAY,GAAG,WAAW;CAuBtC,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,SAAS,GACjD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAQ/B"}
|
|
@@ -13,11 +13,12 @@
|
|
|
13
13
|
* ```
|
|
14
14
|
*
|
|
15
15
|
* Each factory returns a {@link DiskFactory} — a lazy thunk. Calling it in the config file costs
|
|
16
|
-
* nothing; `@aws-sdk/client-s3`
|
|
17
|
-
*
|
|
16
|
+
* nothing; `@aws-sdk/client-s3` is only imported when the provider builds the selected disk at
|
|
17
|
+
* boot, keeping the AWS SDK an optional peer. (Presigning needs no SDK at all — it is hand-rolled
|
|
18
|
+
* SigV4, see `sigv4.ts`.)
|
|
18
19
|
*/
|
|
19
20
|
export const disks = {
|
|
20
|
-
/** S3 (or S3-compatible) disk — needs the optional `@aws-sdk/client-s3`
|
|
21
|
+
/** S3 (or S3-compatible) disk — needs the optional `@aws-sdk/client-s3` peer. */
|
|
21
22
|
s3(config) {
|
|
22
23
|
return async () => {
|
|
23
24
|
const { S3Client } = await import('@aws-sdk/client-s3');
|
|
@@ -35,6 +36,7 @@ export const disks = {
|
|
|
35
36
|
...(config.publicBaseUrl !== undefined ? { publicBaseUrl: config.publicBaseUrl } : {}),
|
|
36
37
|
...(config.region !== undefined ? { region: config.region } : {}),
|
|
37
38
|
...(config.endpoint !== undefined ? { endpoint: config.endpoint } : {}),
|
|
39
|
+
...(config.publicEndpoint !== undefined ? { publicEndpoint: config.publicEndpoint } : {}),
|
|
38
40
|
...(config.forcePathStyle !== undefined ? { forcePathStyle: config.forcePathStyle } : {}),
|
|
39
41
|
...(config.visibility !== undefined ? { visibility: config.visibility } : {}),
|
|
40
42
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/disks/factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/disks/factory.ts"],"names":[],"mappings":"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"}
|
package/dist/src/disks/s3.d.ts
CHANGED
|
@@ -19,6 +19,14 @@ export interface S3DiskOptions {
|
|
|
19
19
|
region?: string;
|
|
20
20
|
/** Custom endpoint (S3-compatible services). Used for URL synthesis when no `publicBaseUrl` is set. */
|
|
21
21
|
endpoint?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Endpoint presigned URLs are signed against, when it differs from `endpoint`. SigV4 embeds the
|
|
24
|
+
* `Host` in the signature, and presigned URLs are consumed by the BROWSER (a part `PUT` during a
|
|
25
|
+
* direct upload, a `GET` while streaming) — so when the app reaches storage through an internal
|
|
26
|
+
* FQDN the internet cannot resolve (MinIO behind a private network), set this to the public one.
|
|
27
|
+
* Server-side operations keep using `endpoint`; only what leaves the server is signed for here.
|
|
28
|
+
*/
|
|
29
|
+
publicEndpoint?: string;
|
|
22
30
|
/** Emit path-style URLs (`endpoint/bucket/key`) instead of virtual-hosted-style. */
|
|
23
31
|
forcePathStyle?: boolean;
|
|
24
32
|
/**
|
|
@@ -39,6 +47,7 @@ export interface S3DiskOptions {
|
|
|
39
47
|
* plus a {@link DiskCapabilities} descriptor), detected structurally via `isExtendedDisk`.
|
|
40
48
|
*/
|
|
41
49
|
export declare class S3Disk implements Disk, MultipartUploadDisk, ExtendedDisk {
|
|
50
|
+
#private;
|
|
42
51
|
/** Coarse feature descriptor — S3 supports presign, native multipart, and prefix listing. */
|
|
43
52
|
readonly capabilities: DiskCapabilities;
|
|
44
53
|
private readonly client;
|
|
@@ -47,6 +56,7 @@ export declare class S3Disk implements Disk, MultipartUploadDisk, ExtendedDisk {
|
|
|
47
56
|
private readonly publicBaseUrl;
|
|
48
57
|
private readonly region;
|
|
49
58
|
private readonly endpoint;
|
|
59
|
+
private readonly publicEndpoint;
|
|
50
60
|
private readonly forcePathStyle;
|
|
51
61
|
private readonly visibility;
|
|
52
62
|
constructor(options: S3DiskOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../../src/disks/s3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAWL,KAAK,QAAQ,EAEd,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../../src/disks/s3.ts"],"names":[],"mappings":"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"}
|
package/dist/src/disks/s3.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AbortMultipartUploadCommand, CompleteMultipartUploadCommand, CopyObjectCommand, CreateMultipartUploadCommand, DeleteObjectCommand, DeleteObjectsCommand, GetObjectCommand, HeadObjectCommand, ListObjectsV2Command, PutObjectCommand, UploadPartCommand, } from '@aws-sdk/client-s3';
|
|
2
|
-
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
|
|
3
2
|
import { hardenBodyStream } from './harden_body_stream.js';
|
|
3
|
+
import { presignS3Url } from './sigv4.js';
|
|
4
4
|
import { extractListObjectsV2FromXml, isXmlEntityDeserializationError } from './xml_fallback.js';
|
|
5
5
|
/** Default presigned-URL lifetime when a caller passes no `expiresIn` (30 minutes). */
|
|
6
6
|
const DEFAULT_SIGNED_URL_TTL_SECONDS = 1800;
|
|
@@ -48,6 +48,7 @@ export class S3Disk {
|
|
|
48
48
|
publicBaseUrl;
|
|
49
49
|
region;
|
|
50
50
|
endpoint;
|
|
51
|
+
publicEndpoint;
|
|
51
52
|
forcePathStyle;
|
|
52
53
|
visibility;
|
|
53
54
|
constructor(options) {
|
|
@@ -57,6 +58,7 @@ export class S3Disk {
|
|
|
57
58
|
this.publicBaseUrl = options.publicBaseUrl;
|
|
58
59
|
this.region = options.region;
|
|
59
60
|
this.endpoint = options.endpoint;
|
|
61
|
+
this.publicEndpoint = options.publicEndpoint;
|
|
60
62
|
this.forcePathStyle = options.forcePathStyle ?? false;
|
|
61
63
|
this.visibility = options.visibility ?? 'private';
|
|
62
64
|
this.capabilities = {
|
|
@@ -165,12 +167,80 @@ export class S3Disk {
|
|
|
165
167
|
return this.visibility;
|
|
166
168
|
}
|
|
167
169
|
async getSignedUrl(key, options) {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
}
|
|
170
|
+
const query = {};
|
|
171
|
+
if (options?.contentType !== undefined)
|
|
172
|
+
query['response-content-type'] = options.contentType;
|
|
173
|
+
if (options?.contentDisposition !== undefined) {
|
|
174
|
+
query['response-content-disposition'] = options.contentDisposition;
|
|
175
|
+
}
|
|
176
|
+
return this.#presign('GET', this.key(key), query, toExpiresInSeconds(options?.expiresIn), {
|
|
177
|
+
browserFacing: true,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
// --- Hand-rolled SigV4 presigning ---------------------------------------------------------
|
|
181
|
+
/**
|
|
182
|
+
* Credentials + region for signing, resolved from the SDK client's own config so every credential
|
|
183
|
+
* source the client supports (static, env, shared config, IAM role) keeps working. Only the
|
|
184
|
+
* *signature computation* is hand-rolled — see {@link presignS3Url} for why (it is pure local
|
|
185
|
+
* crypto, and owning it is what lets a URL be signed for {@link S3DiskOptions.publicEndpoint}
|
|
186
|
+
* without constructing a second client per endpoint).
|
|
187
|
+
*/
|
|
188
|
+
async #signingContext() {
|
|
189
|
+
const config = this.client.config;
|
|
190
|
+
const credentials = typeof config.credentials === 'function' ? await config.credentials() : config.credentials;
|
|
191
|
+
let region = this.region;
|
|
192
|
+
if (region === undefined) {
|
|
193
|
+
try {
|
|
194
|
+
region = typeof config.region === 'function' ? await config.region() : config.region;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// A client constructed without a region (S3-compatible services often don't need one).
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return { credentials, region: region ?? 'us-east-1' };
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* The scheme/host/path a presigned URL is computed for. `browserFacing` URLs prefer
|
|
204
|
+
* {@link S3DiskOptions.publicEndpoint}: the signature bakes the `Host` in, and these URLs are
|
|
205
|
+
* consumed outside the server's network. Server-side presigns (the list XML fallback) always
|
|
206
|
+
* target the internal endpoint.
|
|
207
|
+
*/
|
|
208
|
+
#presignTarget(fullKey, options) {
|
|
209
|
+
const bucket = options.bucket ?? this.bucket;
|
|
210
|
+
const base = (options.browserFacing ? this.publicEndpoint : undefined) ?? this.endpoint;
|
|
211
|
+
if (base !== undefined) {
|
|
212
|
+
const url = new URL(base);
|
|
213
|
+
const basePath = url.pathname.replace(/\/+$/, '');
|
|
214
|
+
const protocol = url.protocol === 'http:' ? 'http:' : 'https:';
|
|
215
|
+
if (this.forcePathStyle) {
|
|
216
|
+
return {
|
|
217
|
+
protocol,
|
|
218
|
+
host: url.host,
|
|
219
|
+
path: `${basePath}/${bucket}${fullKey ? `/${fullKey}` : ''}`,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
return { protocol, host: `${bucket}.${url.host}`, path: `${basePath}/${fullKey}` };
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
protocol: 'https:',
|
|
226
|
+
host: `${bucket}.s3.${options.region}.amazonaws.com`,
|
|
227
|
+
path: `/${fullKey}`,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/** Presign one request against this disk. `fullKey` is already prefixed; `''` targets the bucket. */
|
|
231
|
+
async #presign(method, fullKey, query, expiresInSeconds, options) {
|
|
232
|
+
const { credentials, region } = await this.#signingContext();
|
|
233
|
+
const target = this.#presignTarget(fullKey, { ...options, region });
|
|
234
|
+
return presignS3Url({
|
|
235
|
+
method,
|
|
236
|
+
protocol: target.protocol,
|
|
237
|
+
host: target.host,
|
|
238
|
+
path: target.path,
|
|
239
|
+
query,
|
|
240
|
+
credentials,
|
|
241
|
+
region,
|
|
242
|
+
expiresInSeconds,
|
|
243
|
+
});
|
|
174
244
|
}
|
|
175
245
|
async getMetaData(key) {
|
|
176
246
|
try {
|
|
@@ -282,15 +352,22 @@ export class S3Disk {
|
|
|
282
352
|
if (!isXmlEntityDeserializationError(err))
|
|
283
353
|
throw err;
|
|
284
354
|
// fast-xml-parser rejected valid entity refs in the ListObjectsV2 XML — presign the same
|
|
285
|
-
// request and fetch the raw body, then parse it by hand
|
|
286
|
-
//
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
355
|
+
// request (hand-rolled SigV4, see sigv4.ts) and fetch the raw body, then parse it by hand
|
|
356
|
+
// into the same shape. This is a SERVER-side fetch, so it deliberately targets the internal
|
|
357
|
+
// endpoint even when a `publicEndpoint` is configured (see xml_fallback.ts).
|
|
358
|
+
const listQuery = {
|
|
359
|
+
'list-type': '2',
|
|
360
|
+
prefix: fullPrefix,
|
|
361
|
+
delimiter: options?.delimiter ?? '/',
|
|
362
|
+
};
|
|
363
|
+
if (options?.limit !== undefined)
|
|
364
|
+
listQuery['max-keys'] = String(options.limit);
|
|
365
|
+
if (options?.cursor !== undefined)
|
|
366
|
+
listQuery['continuation-token'] = options.cursor;
|
|
367
|
+
const signedUrl = await this.#presign('GET', '', listQuery, 60, {
|
|
368
|
+
browserFacing: false,
|
|
369
|
+
bucket,
|
|
370
|
+
});
|
|
294
371
|
const response = await fetch(signedUrl);
|
|
295
372
|
if (!response.ok) {
|
|
296
373
|
throw new Error(`S3Disk: signed list fallback failed: HTTP ${response.status} ${response.statusText}`);
|
|
@@ -337,12 +414,9 @@ export class S3Disk {
|
|
|
337
414
|
return { partNumber, etag: out.ETag };
|
|
338
415
|
}
|
|
339
416
|
async presignUploadPart(key, uploadId, partNumber, expiresInSeconds) {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
UploadId: uploadId,
|
|
344
|
-
PartNumber: partNumber,
|
|
345
|
-
}), { expiresIn: Math.max(1, Math.round(expiresInSeconds)) });
|
|
417
|
+
// Browser-facing: the client PUTs the part bytes to this URL, so it is signed against the
|
|
418
|
+
// public endpoint when one is configured.
|
|
419
|
+
return this.#presign('PUT', this.key(key), { uploadId, partNumber: String(partNumber) }, expiresInSeconds, { browserFacing: true });
|
|
346
420
|
}
|
|
347
421
|
async completeMultipartUpload(key, uploadId, parts) {
|
|
348
422
|
await this.client.send(new CompleteMultipartUploadCommand({
|