@dudousxd/nestjs-media-dashboard 0.14.0 → 0.16.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/dist/client/media-console-client.d.ts +17 -0
- package/dist/client/media-console-client.d.ts.map +1 -1
- package/dist/client/media-console-client.js +30 -0
- package/dist/client/media-console-client.js.map +1 -1
- package/dist/client/types.d.ts +15 -0
- package/dist/client/types.d.ts.map +1 -1
- package/dist/server/index.cjs +249 -22
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.cts +106 -11
- package/dist/server/index.d.ts +106 -11
- package/dist/server/index.js +253 -26
- package/dist/server/index.js.map +1 -1
- package/dist/spa/assets/ArchivePreview-DOdBOvk3.js +1 -0
- package/dist/spa/assets/CertificatePreview-mA7wK3Q3.js +118 -0
- package/dist/spa/assets/MarkdownPreview-BNIkmc7p.js +67 -0
- package/dist/spa/assets/ParquetPreview-BjqCCkAM.js +973 -0
- package/dist/spa/assets/SheetPreview-emR2KQES.js +38 -0
- package/dist/spa/assets/SqlitePreview-I0YTyJ8b.js +1 -0
- package/dist/spa/assets/{index-glKgA7_Y.js → index-DIUJb6qa.js} +1 -1
- package/dist/spa/assets/index-DeIsE7va.js +1 -0
- package/dist/spa/assets/{preview-jKg6Oyy0.js → preview-DcCWrB9M.js} +2 -2
- package/dist/spa/assets/sqlite.worker-BywrJP2Y.js +38 -0
- package/dist/spa/assets/sqlite3-BVKGSWc-.wasm +0 -0
- package/dist/spa/assets/sqlite3-opfs-async-proxy-D_xnb1D8.js +876 -0
- package/dist/spa/assets/sqlite3-worker1-IteDdVNs.js +36 -0
- package/dist/spa/assets/styles-CuahvDe0.js +75 -0
- package/dist/spa/assets/styles-FRkIQ83o.css +1 -0
- package/dist/spa/index.html +3 -3
- package/dist/spa/preview.html +3 -3
- package/package.json +9 -2
- package/dist/spa/assets/styles-DLxWbFBU.js +0 -110
- package/dist/spa/assets/styles-DN3_W60e.css +0 -1
|
@@ -43,6 +43,11 @@ export declare const mediaConsoleClient: {
|
|
|
43
43
|
/** Same-origin URL that streams the object bytes inline (Content-Disposition: inline) — used to
|
|
44
44
|
* embed previews that a cross-origin signed URL would download (PDFs) or that CORS would block. */
|
|
45
45
|
objectRawUrl: (disk: string, key: string) => string;
|
|
46
|
+
/** Same-origin URL that streams the object as a SAVE (Content-Disposition: attachment, named
|
|
47
|
+
* after the key). A URL rather than a fetch on purpose: the download has to be a real navigation
|
|
48
|
+
* so the browser owns the save dialog and the progress — pulling the bytes through `fetch` would
|
|
49
|
+
* buffer the whole object in the tab first, which is exactly wrong for the large ones. */
|
|
50
|
+
objectDownloadUrl: (disk: string, key: string) => string;
|
|
46
51
|
/** Read up to `maxBytes` of an object as text through the inline proxy, aborting the stream once the
|
|
47
52
|
* budget is reached — so a many-MB CSV/text file is *sampled* (its head) without downloading the
|
|
48
53
|
* whole thing. Returns the decoded text and the bytes actually read (compare to the object's size
|
|
@@ -51,6 +56,18 @@ export declare const mediaConsoleClient: {
|
|
|
51
56
|
text: string;
|
|
52
57
|
bytesRead: number;
|
|
53
58
|
}>;
|
|
59
|
+
/**
|
|
60
|
+
* Fetch a byte range of an object through the same-origin inline proxy. `end` is INCLUSIVE (HTTP
|
|
61
|
+
* `Range` semantics). This is what makes a random-access reader — a SQLite page reader, a ZIP
|
|
62
|
+
* directory reader — possible against an object far too big to download.
|
|
63
|
+
*
|
|
64
|
+
* THROWS when the server answers `200` instead of `206`, and that check is the entire point of
|
|
65
|
+
* this function rather than a nicety. A server build, a proxy, or a CDN that dropped the `Range`
|
|
66
|
+
* header answers 200 with the WHOLE body: a caller that just took `arrayBuffer()` would stream
|
|
67
|
+
* several hundred MB down the wire and then read its 64 KB page out of the front of it, looking
|
|
68
|
+
* for all the world like it worked. Failing loudly is the only way anyone finds out.
|
|
69
|
+
*/
|
|
70
|
+
objectRange: (disk: string, key: string, start: number, end: number) => Promise<Uint8Array>;
|
|
54
71
|
/** Fetch an object's raw bytes (for binary previews like XLSX) through the inline proxy. */
|
|
55
72
|
objectBytes: (disk: string, key: string) => Promise<ArrayBuffer>;
|
|
56
73
|
uploads: (params?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-console-client.d.ts","sourceRoot":"","sources":["../../src/client/media-console-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,QAAQ,EACR,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB;CACF;AAED,iGAAiG;AACjG,wBAAgB,OAAO,IAAI,MAAM,CAMhC;AA4CD,+FAA+F;AAC/F,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,GAChF;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAExC,iGAAiG;AACjG,eAAO,MAAM,kBAAkB;IAC7B,6FAA6F;cAC/E,OAAO,CAAC,gBAAgB,CAAC;IAgBvC,kGAAkG;sBAC1E,MAAM,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;IAWhE,gCAAgC;kBACd,OAAO,CAAC,IAAI,CAAC;oBAGjB,OAAO,CAAC,QAAQ,CAAC;iBACpB,OAAO,CAAC,gBAAgB,CAAC;oBAE5B,MAAM,WACJ;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KAC3D,OAAO,CAAC,kBAAkB,CAAC;mBAEf,MAAM,OAAO,MAAM,KAAG,OAAO,CAAC,oBAAoB,CAAC;IAElE;4DACwD;2BACjC,MAAM,OAAO,MAAM,KAAG,OAAO,CAAC,sBAAsB,CAAC;IAE5E;wGACoG;yBAC/E,MAAM,OAAO,MAAM,KAAG,MAAM;IAEjD;;;uGAGmG;2BAE3F,MAAM,OACP,MAAM,YACD,MAAM,KACf,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IA4B/C,4FAA4F;wBAClE,MAAM,OAAO,MAAM,KAAG,OAAO,CAAC,WAAW,CAAC;uBAOlD;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAQ,OAAO,CAAC,kBAAkB,CAAC;iBAE1E,MAAM,KAAG,OAAO,CAAC,oBAAoB,CAAC;uBAElC,OAAO,CAAC,mBAAmB,CAAC;uBAEnC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KAC9E,OAAO,CAAC,mBAAmB,CAAC;wBACX,MAAM,KAAG,OAAO,CAAC,qBAAqB,CAAC;yBAEtC,MAAM,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;IAExD,+FAA+F;2BACxE,MAAM,QAAQ,MAAM,UAAU,MAAM,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;IAEvF,+FAA+F;2BACxE,MAAM,QAAQ,MAAM,UAAU,MAAM,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;IAEvF,2FAA2F;2BACpE,MAAM,QAAQ,MAAM,UAAU,MAAM,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;IAEvF,2FAA2F;2BACpE,MAAM,QAAQ,MAAM,UAAU,MAAM,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;sBAErE,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;8BAEd,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;IAEhD,2FAA2F;yBACtE,MAAM,OAAO,MAAM,QAAQ,IAAI,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC,IAAI,CAAC;IAQvF,uEAAuE;yBAClD,MAAM,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;IAE3D,oFAAoF;yBAC/D,MAAM,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;CAE5D,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"media-console-client.d.ts","sourceRoot":"","sources":["../../src/client/media-console-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -89,6 +89,11 @@ export const mediaConsoleClient = {
|
|
|
89
89
|
/** Same-origin URL that streams the object bytes inline (Content-Disposition: inline) — used to
|
|
90
90
|
* embed previews that a cross-origin signed URL would download (PDFs) or that CORS would block. */
|
|
91
91
|
objectRawUrl: (disk, key) => `${apiBase()}${withQuery(`/disks/${encodeURIComponent(disk)}/object/raw`, { key })}`,
|
|
92
|
+
/** Same-origin URL that streams the object as a SAVE (Content-Disposition: attachment, named
|
|
93
|
+
* after the key). A URL rather than a fetch on purpose: the download has to be a real navigation
|
|
94
|
+
* so the browser owns the save dialog and the progress — pulling the bytes through `fetch` would
|
|
95
|
+
* buffer the whole object in the tab first, which is exactly wrong for the large ones. */
|
|
96
|
+
objectDownloadUrl: (disk, key) => `${apiBase()}${withQuery(`/disks/${encodeURIComponent(disk)}/object/download`, { key })}`,
|
|
92
97
|
/** Read up to `maxBytes` of an object as text through the inline proxy, aborting the stream once the
|
|
93
98
|
* budget is reached — so a many-MB CSV/text file is *sampled* (its head) without downloading the
|
|
94
99
|
* whole thing. Returns the decoded text and the bytes actually read (compare to the object's size
|
|
@@ -124,6 +129,31 @@ export const mediaConsoleClient = {
|
|
|
124
129
|
}
|
|
125
130
|
return { text: new TextDecoder().decode(merged), bytesRead };
|
|
126
131
|
},
|
|
132
|
+
/**
|
|
133
|
+
* Fetch a byte range of an object through the same-origin inline proxy. `end` is INCLUSIVE (HTTP
|
|
134
|
+
* `Range` semantics). This is what makes a random-access reader — a SQLite page reader, a ZIP
|
|
135
|
+
* directory reader — possible against an object far too big to download.
|
|
136
|
+
*
|
|
137
|
+
* THROWS when the server answers `200` instead of `206`, and that check is the entire point of
|
|
138
|
+
* this function rather than a nicety. A server build, a proxy, or a CDN that dropped the `Range`
|
|
139
|
+
* header answers 200 with the WHOLE body: a caller that just took `arrayBuffer()` would stream
|
|
140
|
+
* several hundred MB down the wire and then read its 64 KB page out of the front of it, looking
|
|
141
|
+
* for all the world like it worked. Failing loudly is the only way anyone finds out.
|
|
142
|
+
*/
|
|
143
|
+
objectRange: async (disk, key, start, end) => {
|
|
144
|
+
const response = await fetch(mediaConsoleClient.objectRawUrl(disk, key), {
|
|
145
|
+
credentials: 'same-origin',
|
|
146
|
+
headers: { Range: `bytes=${start}-${end}` },
|
|
147
|
+
});
|
|
148
|
+
if (response.status === 200) {
|
|
149
|
+
// Drop the body rather than buffering the object we deliberately did not ask for.
|
|
150
|
+
await response.body?.cancel().catch(() => undefined);
|
|
151
|
+
throw new Error(`Ranged read of "${key}" was answered 200 (full body) instead of 206 — the Range header was dropped between this page and the disk.`);
|
|
152
|
+
}
|
|
153
|
+
if (!response.ok)
|
|
154
|
+
throw new Error(`${response.status} ${response.statusText}`);
|
|
155
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
156
|
+
},
|
|
127
157
|
/** Fetch an object's raw bytes (for binary previews like XLSX) through the inline proxy. */
|
|
128
158
|
objectBytes: async (disk, key) => {
|
|
129
159
|
const response = await fetch(mediaConsoleClient.objectRawUrl(disk, key), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-console-client.js","sourceRoot":"","sources":["../../src/client/media-console-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"media-console-client.js","sourceRoot":"","sources":["../../src/client/media-console-client.ts"],"names":[],"mappings":"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"}
|
package/dist/client/types.d.ts
CHANGED
|
@@ -3,6 +3,15 @@ export interface DiskCapabilities {
|
|
|
3
3
|
multipart: boolean;
|
|
4
4
|
publicUrls: boolean;
|
|
5
5
|
list: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Can the disk serve a byte range without transferring the whole object (a ranged `object/raw`)?
|
|
8
|
+
*
|
|
9
|
+
* Optional HERE, unlike the required `ranged` on the driver's own `DriverCapabilities`, because
|
|
10
|
+
* this is a WIRE shape: the console bundle can be served by a host still running an older server
|
|
11
|
+
* build that never emits the field. `undefined` means "this server didn't say", which a caller
|
|
12
|
+
* should treat as "don't count on it" — not as `false`.
|
|
13
|
+
*/
|
|
14
|
+
ranged?: boolean;
|
|
6
15
|
}
|
|
7
16
|
export interface DiskInfo {
|
|
8
17
|
name: string;
|
|
@@ -86,6 +95,12 @@ export interface LibraryListResponse {
|
|
|
86
95
|
export interface LibraryVariant {
|
|
87
96
|
name: string;
|
|
88
97
|
url: string;
|
|
98
|
+
/** Where the variant actually lives, so the UI can reach the console's own object routes for it
|
|
99
|
+
* (download, proxied read) — `url` alone is opaque, and under `objectUrls: 'auto'` points at the
|
|
100
|
+
* object store rather than at this server. Empty when the record names a disk that is no longer
|
|
101
|
+
* registered, which is the same case `url` reports as `''`. */
|
|
102
|
+
disk: string;
|
|
103
|
+
path: string;
|
|
89
104
|
}
|
|
90
105
|
export interface LibraryDetailResponse {
|
|
91
106
|
record: LibraryRecord;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.cjs
CHANGED
|
@@ -350,6 +350,7 @@ var MEDIA_DASHBOARD_ACTIONS = Symbol("MEDIA_DASHBOARD_ACTIONS");
|
|
|
350
350
|
var MEDIA_CONSOLE_AUTH = Symbol("MEDIA_CONSOLE_AUTH");
|
|
351
351
|
var MEDIA_CONSOLE_COOKIE_PATH = Symbol("MEDIA_CONSOLE_COOKIE_PATH");
|
|
352
352
|
var MEDIA_CONSOLE_OBJECT_INSIGHTS = Symbol("MEDIA_CONSOLE_OBJECT_INSIGHTS");
|
|
353
|
+
var MEDIA_CONSOLE_OBJECT_URLS = Symbol("MEDIA_CONSOLE_OBJECT_URLS");
|
|
353
354
|
|
|
354
355
|
// src/server/media-console.guard.ts
|
|
355
356
|
function _ts_decorate(decorators, target, key, desc) {
|
|
@@ -484,6 +485,13 @@ function sanitizeInsight(insight) {
|
|
|
484
485
|
}
|
|
485
486
|
__name(sanitizeInsight, "sanitizeInsight");
|
|
486
487
|
|
|
488
|
+
// src/server/object-urls.ts
|
|
489
|
+
function objectProxyUrl(apiBasePath, route, disk, key) {
|
|
490
|
+
const path = `${apiBasePath}/disks/${encodeURIComponent(disk)}/object/${route}`;
|
|
491
|
+
return `${path}?key=${encodeURIComponent(key)}`;
|
|
492
|
+
}
|
|
493
|
+
__name(objectProxyUrl, "objectProxyUrl");
|
|
494
|
+
|
|
487
495
|
// src/server/media-console.service.ts
|
|
488
496
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
489
497
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -513,6 +521,37 @@ function lastSegment(prefix) {
|
|
|
513
521
|
return slash === -1 ? trimmed : trimmed.slice(slash + 1);
|
|
514
522
|
}
|
|
515
523
|
__name(lastSegment, "lastSegment");
|
|
524
|
+
var RangeNotSatisfiableException = class extends import_common2.HttpException {
|
|
525
|
+
static {
|
|
526
|
+
__name(this, "RangeNotSatisfiableException");
|
|
527
|
+
}
|
|
528
|
+
size;
|
|
529
|
+
constructor(size) {
|
|
530
|
+
super({
|
|
531
|
+
statusCode: import_common2.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE,
|
|
532
|
+
message: `Requested range is not satisfiable for an object of ${size} bytes`,
|
|
533
|
+
error: "Range Not Satisfiable"
|
|
534
|
+
}, import_common2.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE), this.size = size;
|
|
535
|
+
}
|
|
536
|
+
};
|
|
537
|
+
function resolveRange(range, size) {
|
|
538
|
+
if ("suffixLength" in range) {
|
|
539
|
+
if (!Number.isInteger(range.suffixLength) || range.suffixLength <= 0 || size === 0) return null;
|
|
540
|
+
return {
|
|
541
|
+
start: Math.max(0, size - range.suffixLength),
|
|
542
|
+
end: size - 1
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
const { start } = range;
|
|
546
|
+
if (!Number.isInteger(start) || start < 0 || start >= size) return null;
|
|
547
|
+
const end = range.end === void 0 ? size - 1 : Math.min(range.end, size - 1);
|
|
548
|
+
if (!Number.isInteger(end) || end < start) return null;
|
|
549
|
+
return {
|
|
550
|
+
start,
|
|
551
|
+
end
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
__name(resolveRange, "resolveRange");
|
|
516
555
|
function mapUpload(session) {
|
|
517
556
|
const percent = session.size !== void 0 && session.size > 0 ? Math.min(100, Math.round(session.offset / session.size * 100)) : null;
|
|
518
557
|
return {
|
|
@@ -555,12 +594,25 @@ var MediaConsoleService = class _MediaConsoleService {
|
|
|
555
594
|
uploads;
|
|
556
595
|
actionsEnabled;
|
|
557
596
|
insightProviders;
|
|
558
|
-
|
|
597
|
+
objectUrls;
|
|
598
|
+
constructor(storage, store, uploads, actionsEnabled, insightProviders = null, objectUrls = null) {
|
|
559
599
|
this.storage = storage;
|
|
560
600
|
this.store = store;
|
|
561
601
|
this.uploads = uploads;
|
|
562
602
|
this.actionsEnabled = actionsEnabled;
|
|
563
603
|
this.insightProviders = insightProviders;
|
|
604
|
+
this.objectUrls = objectUrls;
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* The URL to report for an object's bytes, under the host's {@link ObjectUrlStrategy}. `auto`
|
|
608
|
+
* prefers a presigned URL straight to the store; `proxy` routes through this server, for a host
|
|
609
|
+
* whose browser cannot reach the store at all.
|
|
610
|
+
*/
|
|
611
|
+
objectUrl(driver, disk, key) {
|
|
612
|
+
if (this.objectUrls?.strategy === "proxy") {
|
|
613
|
+
return Promise.resolve(objectProxyUrl(this.objectUrls.apiBasePath, "raw", disk, key));
|
|
614
|
+
}
|
|
615
|
+
return driver.capabilities.presign ? driver.temporaryUrl(key, URL_TTL_SECONDS) : driver.url(key);
|
|
564
616
|
}
|
|
565
617
|
logger = new import_common2.Logger(_MediaConsoleService.name);
|
|
566
618
|
diskOrThrow(disk) {
|
|
@@ -618,7 +670,7 @@ var MediaConsoleService = class _MediaConsoleService {
|
|
|
618
670
|
async objectDetail(disk, key) {
|
|
619
671
|
const driver = this.diskOrThrow(disk);
|
|
620
672
|
const stat = await driver.stat(key);
|
|
621
|
-
const url =
|
|
673
|
+
const url = await this.objectUrl(driver, disk, key);
|
|
622
674
|
return {
|
|
623
675
|
key,
|
|
624
676
|
size: stat.size,
|
|
@@ -669,17 +721,44 @@ var MediaConsoleService = class _MediaConsoleService {
|
|
|
669
721
|
insights: settled.filter((insight) => insight !== null).map(sanitizeInsight)
|
|
670
722
|
};
|
|
671
723
|
}
|
|
672
|
-
/**
|
|
673
|
-
*
|
|
674
|
-
*
|
|
675
|
-
|
|
724
|
+
/**
|
|
725
|
+
* The object's raw byte stream plus the metadata the controller needs to serve it inline. Used by
|
|
726
|
+
* the console's same-origin preview proxy so text/PDF render in the browser instead of downloading
|
|
727
|
+
* (and so a CORS-locked bucket is still previewable).
|
|
728
|
+
*
|
|
729
|
+
* With `range`, only that slice — which is what makes previewing a multi-hundred-MB object (a
|
|
730
|
+
* SQLite database read a page at a time) possible at all. The range is resolved HERE, not in the
|
|
731
|
+
* driver, because it has to be checked against the object's size and the `stat` for that is
|
|
732
|
+
* already on this path: the suffix form is made absolute, an overrunning `end` is clamped to the
|
|
733
|
+
* last byte, and anything genuinely unsatisfiable becomes a {@link RangeNotSatisfiableException}
|
|
734
|
+
* (HTTP 416) instead of a surprise empty body.
|
|
735
|
+
*
|
|
736
|
+
* A driver that reports `ranged: false` REFUSES a range request rather than quietly returning the
|
|
737
|
+
* whole object: the caller asked for 64 KB out of 400 MB, and silently answering with all 400 MB
|
|
738
|
+
* — which the caller would then read as if it were the slice — is the exact failure the `ranged`
|
|
739
|
+
* capability exists to make impossible.
|
|
740
|
+
*/
|
|
741
|
+
async objectStream(disk, key, range) {
|
|
676
742
|
const driver = this.diskOrThrow(disk);
|
|
677
743
|
const stat = await driver.stat(key);
|
|
678
|
-
const
|
|
744
|
+
const contentType = stat.contentType ?? "application/octet-stream";
|
|
745
|
+
if (!range) {
|
|
746
|
+
return {
|
|
747
|
+
stream: await driver.stream(key),
|
|
748
|
+
contentType,
|
|
749
|
+
size: stat.size
|
|
750
|
+
};
|
|
751
|
+
}
|
|
752
|
+
if (!driver.capabilities.ranged) {
|
|
753
|
+
throw new import_common2.NotImplementedException(`Disk "${disk}" cannot serve byte ranges`);
|
|
754
|
+
}
|
|
755
|
+
const resolved = resolveRange(range, stat.size);
|
|
756
|
+
if (!resolved) throw new RangeNotSatisfiableException(stat.size);
|
|
679
757
|
return {
|
|
680
|
-
stream,
|
|
681
|
-
contentType
|
|
682
|
-
size: stat.size
|
|
758
|
+
stream: await driver.stream(key, resolved),
|
|
759
|
+
contentType,
|
|
760
|
+
size: stat.size,
|
|
761
|
+
range: resolved
|
|
683
762
|
};
|
|
684
763
|
}
|
|
685
764
|
/** Writes an object from a byte stream (a browser upload). The caller supplies the full key
|
|
@@ -894,10 +973,12 @@ var MediaConsoleService = class _MediaConsoleService {
|
|
|
894
973
|
if (!record) throw new import_common2.NotFoundException(`Unknown media record: ${id}`);
|
|
895
974
|
const variants = await Promise.all(Object.entries(record.conversions).map(async ([name, conversion]) => {
|
|
896
975
|
const driver = this.storage?.diskNames().includes(conversion.disk) ? this.storage.disk(conversion.disk) : null;
|
|
897
|
-
const url = driver
|
|
976
|
+
const url = driver ? await this.objectUrl(driver, conversion.disk, conversion.path) : "";
|
|
898
977
|
return {
|
|
899
978
|
name,
|
|
900
|
-
url
|
|
979
|
+
url,
|
|
980
|
+
disk: conversion.disk,
|
|
981
|
+
path: conversion.path
|
|
901
982
|
};
|
|
902
983
|
}));
|
|
903
984
|
return {
|
|
@@ -930,12 +1011,15 @@ MediaConsoleService = _ts_decorate2([
|
|
|
930
1011
|
_ts_param2(3, (0, import_common2.Inject)(MEDIA_DASHBOARD_ACTIONS)),
|
|
931
1012
|
_ts_param2(4, (0, import_common2.Optional)()),
|
|
932
1013
|
_ts_param2(4, (0, import_common2.Inject)(MEDIA_CONSOLE_OBJECT_INSIGHTS)),
|
|
1014
|
+
_ts_param2(5, (0, import_common2.Optional)()),
|
|
1015
|
+
_ts_param2(5, (0, import_common2.Inject)(MEDIA_CONSOLE_OBJECT_URLS)),
|
|
933
1016
|
_ts_metadata2("design:type", Function),
|
|
934
1017
|
_ts_metadata2("design:paramtypes", [
|
|
935
1018
|
Object,
|
|
936
1019
|
Object,
|
|
937
1020
|
Object,
|
|
938
1021
|
Object,
|
|
1022
|
+
Object,
|
|
939
1023
|
Object
|
|
940
1024
|
])
|
|
941
1025
|
], MediaConsoleService);
|
|
@@ -1318,6 +1402,33 @@ MediaConsoleAuthController = _ts_decorate4([
|
|
|
1318
1402
|
|
|
1319
1403
|
// src/server/media-console-read.controller.ts
|
|
1320
1404
|
var import_common5 = require("@nestjs/common");
|
|
1405
|
+
|
|
1406
|
+
// src/server/content-disposition.ts
|
|
1407
|
+
var FALLBACK_FILENAME = "download";
|
|
1408
|
+
var ATTR_CHAR = /^[A-Za-z0-9!#$&+\-.^_`|~]$/;
|
|
1409
|
+
function toExtValue(name) {
|
|
1410
|
+
let encoded = "";
|
|
1411
|
+
for (const byte of new TextEncoder().encode(name)) {
|
|
1412
|
+
const char = String.fromCharCode(byte);
|
|
1413
|
+
encoded += ATTR_CHAR.test(char) ? char : `%${byte.toString(16).toUpperCase().padStart(2, "0")}`;
|
|
1414
|
+
}
|
|
1415
|
+
return encoded;
|
|
1416
|
+
}
|
|
1417
|
+
__name(toExtValue, "toExtValue");
|
|
1418
|
+
function downloadFilename(key) {
|
|
1419
|
+
const segment = key.split("/").pop() ?? "";
|
|
1420
|
+
return segment.trim() === "" ? FALLBACK_FILENAME : segment;
|
|
1421
|
+
}
|
|
1422
|
+
__name(downloadFilename, "downloadFilename");
|
|
1423
|
+
function attachmentDisposition(filename) {
|
|
1424
|
+
const name = filename.trim() === "" ? FALLBACK_FILENAME : filename;
|
|
1425
|
+
const ascii = name.replace(/[^\x20-\x7E]/g, "").replace(/["\\]/g, "").trim();
|
|
1426
|
+
const quoted = ascii === "" ? FALLBACK_FILENAME : ascii;
|
|
1427
|
+
return `attachment; filename="${quoted}"; filename*=UTF-8''${toExtValue(name)}`;
|
|
1428
|
+
}
|
|
1429
|
+
__name(attachmentDisposition, "attachmentDisposition");
|
|
1430
|
+
|
|
1431
|
+
// src/server/media-console-read.controller.ts
|
|
1321
1432
|
function _ts_decorate5(decorators, target, key, desc) {
|
|
1322
1433
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1323
1434
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -1341,6 +1452,43 @@ function toLimit(value) {
|
|
|
1341
1452
|
return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : void 0;
|
|
1342
1453
|
}
|
|
1343
1454
|
__name(toLimit, "toLimit");
|
|
1455
|
+
var SINGLE_BYTE_RANGE = /^bytes=(\d*)-(\d*)$/;
|
|
1456
|
+
function parseRangeHeader(header) {
|
|
1457
|
+
if (header === void 0) return null;
|
|
1458
|
+
const match = SINGLE_BYTE_RANGE.exec(header.trim());
|
|
1459
|
+
if (!match) return null;
|
|
1460
|
+
const startText = match[1] ?? "";
|
|
1461
|
+
const endText = match[2] ?? "";
|
|
1462
|
+
if (startText === "" && endText === "") return null;
|
|
1463
|
+
if (startText === "") return {
|
|
1464
|
+
suffixLength: Number(endText)
|
|
1465
|
+
};
|
|
1466
|
+
const start = Number(startText);
|
|
1467
|
+
return endText === "" ? {
|
|
1468
|
+
start
|
|
1469
|
+
} : {
|
|
1470
|
+
start,
|
|
1471
|
+
end: Number(endText)
|
|
1472
|
+
};
|
|
1473
|
+
}
|
|
1474
|
+
__name(parseRangeHeader, "parseRangeHeader");
|
|
1475
|
+
function setHeader(response, name, value) {
|
|
1476
|
+
if (typeof response.setHeader === "function") {
|
|
1477
|
+
response.setHeader(name, value);
|
|
1478
|
+
return;
|
|
1479
|
+
}
|
|
1480
|
+
if (typeof response.raw?.setHeader === "function") response.raw.setHeader(name, value);
|
|
1481
|
+
}
|
|
1482
|
+
__name(setHeader, "setHeader");
|
|
1483
|
+
function setStatus(response, code) {
|
|
1484
|
+
if (typeof response.status === "function") {
|
|
1485
|
+
response.status(code);
|
|
1486
|
+
return;
|
|
1487
|
+
}
|
|
1488
|
+
if (response.raw) response.raw.statusCode = code;
|
|
1489
|
+
else response.statusCode = code;
|
|
1490
|
+
}
|
|
1491
|
+
__name(setStatus, "setStatus");
|
|
1344
1492
|
var MediaConsoleReadController = class {
|
|
1345
1493
|
static {
|
|
1346
1494
|
__name(this, "MediaConsoleReadController");
|
|
@@ -1374,16 +1522,64 @@ var MediaConsoleReadController = class {
|
|
|
1374
1522
|
objectInsights(disk, key) {
|
|
1375
1523
|
return this.service.objectInsights(disk, key);
|
|
1376
1524
|
}
|
|
1377
|
-
/**
|
|
1378
|
-
*
|
|
1379
|
-
|
|
1380
|
-
|
|
1525
|
+
/**
|
|
1526
|
+
* Streams the object's bytes inline (Content-Disposition: inline) from the same origin, so the SPA
|
|
1527
|
+
* can render text/PDF previews the browser would otherwise download, and read text past CORS.
|
|
1528
|
+
*/
|
|
1529
|
+
objectRaw(disk, key, rangeHeader, response) {
|
|
1530
|
+
return this.streamObject(disk, key, rangeHeader, response, "inline");
|
|
1531
|
+
}
|
|
1532
|
+
/**
|
|
1533
|
+
* The same bytes as `/raw`, but as a SAVE rather than a render: `Content-Disposition: attachment`
|
|
1534
|
+
* with the object's own name on it.
|
|
1535
|
+
*
|
|
1536
|
+
* Its own route rather than a flag on `/raw` because `/raw` is load-bearing for every preview —
|
|
1537
|
+
* they depend on `inline`, and a disposition that varied by query param would be one wrong link
|
|
1538
|
+
* away from a PDF preview turning into a download.
|
|
1539
|
+
*
|
|
1540
|
+
* Same-origin and unconditional, deliberately: this is the console's own action, so it must work
|
|
1541
|
+
* on a host whose browser cannot reach the object store at all (no route to S3, no CORS grant).
|
|
1542
|
+
* That is exactly where `objectDetail`'s presigned `url` — a link to share, not a way to fetch —
|
|
1543
|
+
* is useless. See the `objectUrls` option.
|
|
1544
|
+
*/
|
|
1545
|
+
objectDownload(disk, key, rangeHeader, response) {
|
|
1546
|
+
return this.streamObject(disk, key, rangeHeader, response, attachmentDisposition(downloadFilename(key ?? "")));
|
|
1547
|
+
}
|
|
1548
|
+
/**
|
|
1549
|
+
* Stream an object under the given `Content-Disposition`, honouring a single-range `Range` header
|
|
1550
|
+
* — which is what lets a reader pull a few KB out of a multi-hundred-MB object (a SQLite page, a
|
|
1551
|
+
* ZIP's central directory) instead of the whole file, and what lets a browser resume an
|
|
1552
|
+
* interrupted download of one. With no `Range` the response is a plain 200 full body, which the
|
|
1553
|
+
* PDF/text/spreadsheet previews depend on.
|
|
1554
|
+
*/
|
|
1555
|
+
async streamObject(disk, key, rangeHeader, response, disposition) {
|
|
1556
|
+
const requested = parseRangeHeader(rangeHeader);
|
|
1557
|
+
setHeader(response, "Accept-Ranges", "bytes");
|
|
1558
|
+
let result;
|
|
1559
|
+
try {
|
|
1560
|
+
result = await this.service.objectStream(disk, key, requested ?? void 0);
|
|
1561
|
+
} catch (error) {
|
|
1562
|
+
if (error instanceof RangeNotSatisfiableException) {
|
|
1563
|
+
setHeader(response, "Content-Range", `bytes */${error.size}`);
|
|
1564
|
+
}
|
|
1565
|
+
throw error;
|
|
1566
|
+
}
|
|
1567
|
+
const { stream, contentType, size, range } = result;
|
|
1568
|
+
if (!range) {
|
|
1569
|
+
return new import_common5.StreamableFile(stream, {
|
|
1570
|
+
type: contentType,
|
|
1571
|
+
disposition,
|
|
1572
|
+
...Number.isFinite(size) ? {
|
|
1573
|
+
length: size
|
|
1574
|
+
} : {}
|
|
1575
|
+
});
|
|
1576
|
+
}
|
|
1577
|
+
setStatus(response, 206);
|
|
1578
|
+
setHeader(response, "Content-Range", `bytes ${range.start}-${range.end}/${size}`);
|
|
1381
1579
|
return new import_common5.StreamableFile(stream, {
|
|
1382
1580
|
type: contentType,
|
|
1383
|
-
disposition
|
|
1384
|
-
|
|
1385
|
-
length: size
|
|
1386
|
-
} : {}
|
|
1581
|
+
disposition,
|
|
1582
|
+
length: range.end - range.start + 1
|
|
1387
1583
|
});
|
|
1388
1584
|
}
|
|
1389
1585
|
uploads(disk, prefix) {
|
|
@@ -1473,13 +1669,36 @@ _ts_decorate5([
|
|
|
1473
1669
|
(0, import_common5.Get)("disks/:disk/object/raw"),
|
|
1474
1670
|
_ts_param5(0, (0, import_common5.Param)("disk")),
|
|
1475
1671
|
_ts_param5(1, (0, import_common5.Query)("key")),
|
|
1672
|
+
_ts_param5(2, (0, import_common5.Headers)("range")),
|
|
1673
|
+
_ts_param5(3, (0, import_common5.Res)({
|
|
1674
|
+
passthrough: true
|
|
1675
|
+
})),
|
|
1476
1676
|
_ts_metadata5("design:type", Function),
|
|
1477
1677
|
_ts_metadata5("design:paramtypes", [
|
|
1478
1678
|
String,
|
|
1479
|
-
String
|
|
1679
|
+
String,
|
|
1680
|
+
Object,
|
|
1681
|
+
typeof ConsoleHttpResponse === "undefined" ? Object : ConsoleHttpResponse
|
|
1480
1682
|
]),
|
|
1481
|
-
_ts_metadata5("design:returntype", Promise)
|
|
1683
|
+
_ts_metadata5("design:returntype", typeof Promise === "undefined" ? Object : Promise)
|
|
1482
1684
|
], MediaConsoleReadController.prototype, "objectRaw", null);
|
|
1685
|
+
_ts_decorate5([
|
|
1686
|
+
(0, import_common5.Get)("disks/:disk/object/download"),
|
|
1687
|
+
_ts_param5(0, (0, import_common5.Param)("disk")),
|
|
1688
|
+
_ts_param5(1, (0, import_common5.Query)("key")),
|
|
1689
|
+
_ts_param5(2, (0, import_common5.Headers)("range")),
|
|
1690
|
+
_ts_param5(3, (0, import_common5.Res)({
|
|
1691
|
+
passthrough: true
|
|
1692
|
+
})),
|
|
1693
|
+
_ts_metadata5("design:type", Function),
|
|
1694
|
+
_ts_metadata5("design:paramtypes", [
|
|
1695
|
+
String,
|
|
1696
|
+
String,
|
|
1697
|
+
Object,
|
|
1698
|
+
typeof ConsoleHttpResponse === "undefined" ? Object : ConsoleHttpResponse
|
|
1699
|
+
]),
|
|
1700
|
+
_ts_metadata5("design:returntype", typeof Promise === "undefined" ? Object : Promise)
|
|
1701
|
+
], MediaConsoleReadController.prototype, "objectDownload", null);
|
|
1483
1702
|
_ts_decorate5([
|
|
1484
1703
|
(0, import_common5.Get)("uploads"),
|
|
1485
1704
|
_ts_param5(0, (0, import_common5.Query)("disk")),
|
|
@@ -1592,6 +1811,10 @@ var MediaConsoleApiModule = class _MediaConsoleApiModule {
|
|
|
1592
1811
|
provide: MEDIA_CONSOLE_COOKIE_PATH,
|
|
1593
1812
|
useValue: options.cookiePath
|
|
1594
1813
|
},
|
|
1814
|
+
{
|
|
1815
|
+
provide: MEDIA_CONSOLE_OBJECT_URLS,
|
|
1816
|
+
useValue: options.objectUrls
|
|
1817
|
+
},
|
|
1595
1818
|
options.authProvider,
|
|
1596
1819
|
options.insightsProvider ?? {
|
|
1597
1820
|
provide: MEDIA_CONSOLE_OBJECT_INSIGHTS,
|
|
@@ -1831,6 +2054,10 @@ var MediaDashboardModule = class _MediaDashboardModule {
|
|
|
1831
2054
|
...imports ?? [],
|
|
1832
2055
|
MediaConsoleApiModule.register({
|
|
1833
2056
|
actions,
|
|
2057
|
+
objectUrls: {
|
|
2058
|
+
strategy: options.objectUrls ?? "auto",
|
|
2059
|
+
apiBasePath
|
|
2060
|
+
},
|
|
1834
2061
|
// `Path=/`, deliberately NOT scoped to `apiBasePath` (nor to `basePath`): the two mounts
|
|
1835
2062
|
// are independently configurable and can live at unrelated paths (e.g. a `/media` UI
|
|
1836
2063
|
// with a `/api/media/console` API). Scoped to the API base, the browser withheld the
|