@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.
Files changed (32) hide show
  1. package/dist/client/media-console-client.d.ts +17 -0
  2. package/dist/client/media-console-client.d.ts.map +1 -1
  3. package/dist/client/media-console-client.js +30 -0
  4. package/dist/client/media-console-client.js.map +1 -1
  5. package/dist/client/types.d.ts +15 -0
  6. package/dist/client/types.d.ts.map +1 -1
  7. package/dist/server/index.cjs +249 -22
  8. package/dist/server/index.cjs.map +1 -1
  9. package/dist/server/index.d.cts +106 -11
  10. package/dist/server/index.d.ts +106 -11
  11. package/dist/server/index.js +253 -26
  12. package/dist/server/index.js.map +1 -1
  13. package/dist/spa/assets/ArchivePreview-DOdBOvk3.js +1 -0
  14. package/dist/spa/assets/CertificatePreview-mA7wK3Q3.js +118 -0
  15. package/dist/spa/assets/MarkdownPreview-BNIkmc7p.js +67 -0
  16. package/dist/spa/assets/ParquetPreview-BjqCCkAM.js +973 -0
  17. package/dist/spa/assets/SheetPreview-emR2KQES.js +38 -0
  18. package/dist/spa/assets/SqlitePreview-I0YTyJ8b.js +1 -0
  19. package/dist/spa/assets/{index-glKgA7_Y.js → index-DIUJb6qa.js} +1 -1
  20. package/dist/spa/assets/index-DeIsE7va.js +1 -0
  21. package/dist/spa/assets/{preview-jKg6Oyy0.js → preview-DcCWrB9M.js} +2 -2
  22. package/dist/spa/assets/sqlite.worker-BywrJP2Y.js +38 -0
  23. package/dist/spa/assets/sqlite3-BVKGSWc-.wasm +0 -0
  24. package/dist/spa/assets/sqlite3-opfs-async-proxy-D_xnb1D8.js +876 -0
  25. package/dist/spa/assets/sqlite3-worker1-IteDdVNs.js +36 -0
  26. package/dist/spa/assets/styles-CuahvDe0.js +75 -0
  27. package/dist/spa/assets/styles-FRkIQ83o.css +1 -0
  28. package/dist/spa/index.html +3 -3
  29. package/dist/spa/preview.html +3 -3
  30. package/package.json +9 -2
  31. package/dist/spa/assets/styles-DLxWbFBU.js +0 -110
  32. 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":"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"}
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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"}
@@ -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":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
@@ -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
- constructor(storage, store, uploads, actionsEnabled, insightProviders = null) {
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 = driver.capabilities.presign ? await driver.temporaryUrl(key, URL_TTL_SECONDS) : await driver.url(key);
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
- /** The object's raw byte stream plus the metadata the controller needs to serve it inline. Used by
673
- * the console's same-origin preview proxy so text/PDF render in the browser instead of downloading
674
- * (and so a CORS-locked bucket is still previewable). */
675
- async objectStream(disk, key) {
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 stream = await driver.stream(key);
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: stat.contentType ?? "application/octet-stream",
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?.capabilities.presign ? await driver.temporaryUrl(conversion.path, URL_TTL_SECONDS) : await driver?.url(conversion.path) ?? "";
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
- /** Streams the object's bytes inline (Content-Disposition: inline) from the same origin, so the SPA
1378
- * can render text/PDF previews the browser would otherwise download, and read text past CORS. */
1379
- async objectRaw(disk, key) {
1380
- const { stream, contentType, size } = await this.service.objectStream(disk, key);
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: "inline",
1384
- ...Number.isFinite(size) ? {
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