@nitida/asset-client 0.23.0 → 0.24.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/index.cjs CHANGED
@@ -43,6 +43,7 @@ __export(index_exports, {
43
43
  getAssetDimensions: () => getAssetDimensions,
44
44
  getAssetSrcSet: () => getAssetSrcSet,
45
45
  getAssetUrl: () => getAssetUrl,
46
+ getByteBudgetTransformUrl: () => getByteBudgetTransformUrl,
46
47
  getCdnBase: () => getCdnBase,
47
48
  getHlsLadder: () => getHlsLadder,
48
49
  getHlsStreamingUrl: () => getHlsStreamingUrl,
@@ -57,6 +58,7 @@ __export(index_exports, {
57
58
  getTransformUrl: () => getTransformUrl,
58
59
  getVideoTransformUrl: () => getVideoTransformUrl,
59
60
  hasPreset: () => hasPreset,
61
+ hasSizeLadder: () => hasSizeLadder,
60
62
  hlsLadderAlignment: () => hlsLadderAlignment,
61
63
  invalidateSlotCache: () => invalidateSlotCache,
62
64
  isRequestablePreset: () => isRequestablePreset,
@@ -373,6 +375,37 @@ function getTransformUrl(asset, opts) {
373
375
  );
374
376
  return buildTransformUrl(asset, opts);
375
377
  }
378
+ var LADDER_PRESETS = ["thumb", "sm", "md", "lg", "xl"];
379
+ function hasSizeLadder(asset) {
380
+ const raw = asset.presets;
381
+ if (raw == null || raw.trim() === "") return null;
382
+ return LADDER_PRESETS.some((preset) => hasPreset(asset, preset));
383
+ }
384
+ function getByteBudgetTransformUrl(asset, opts) {
385
+ assertSha(asset, "getByteBudgetTransformUrl");
386
+ assertPublic(
387
+ asset,
388
+ "getByteBudgetTransformUrl",
389
+ "getPrivateTransformUrl(asset, opts, signingKey, { expiresInSeconds: 300 })"
390
+ );
391
+ if (!Number.isInteger(opts.quality) || opts.quality < 1 || opts.quality > 100) {
392
+ throw new Error(
393
+ `getByteBudgetTransformUrl: quality must be an integer 1..100, got ${String(opts.quality)}. If you do not have a measured byte budget, use getTransformUrl and omit quality entirely.`
394
+ );
395
+ }
396
+ const ladder = hasSizeLadder(asset);
397
+ if (ladder === null) {
398
+ throw new Error(
399
+ `getByteBudgetTransformUrl: asset ${asset.sha} carries no 'presets', so whether a pinned quality would re-compress it is UNKNOWN \u2014 and unknown is not permission. Fetch the full DTO (assets.get / assets.byHash) and pass it, or use getTransformUrl with no quality.`
400
+ );
401
+ }
402
+ if (ladder) {
403
+ throw new Error(
404
+ `getByteBudgetTransformUrl: asset ${asset.sha} has stored size variants (presets="${asset.presets}"). A pinned quality there does not set the encoder \u2014 it makes /t/ decode one of those already-compressed variants, so the output is a SECOND lossy generation: measured +2..+8% HEAVIER and -0.50..-0.85 dB. Use getTransformUrl with no quality (one pass from the master), or upload this asset with presets: ["original"] if the byte budget is real.`
405
+ );
406
+ }
407
+ return buildTransformUrl(asset, opts);
408
+ }
376
409
  function getSignedTransformUrl(asset, opts, signingKey, signOpts) {
377
410
  assertSha(asset, "getSignedTransformUrl");
378
411
  assertPublic(
@@ -827,6 +860,7 @@ function getAssetDimensions(asset) {
827
860
  getAssetDimensions,
828
861
  getAssetSrcSet,
829
862
  getAssetUrl,
863
+ getByteBudgetTransformUrl,
830
864
  getCdnBase,
831
865
  getHlsLadder,
832
866
  getHlsStreamingUrl,
@@ -841,6 +875,7 @@ function getAssetDimensions(asset) {
841
875
  getTransformUrl,
842
876
  getVideoTransformUrl,
843
877
  hasPreset,
878
+ hasSizeLadder,
844
879
  hlsLadderAlignment,
845
880
  invalidateSlotCache,
846
881
  isRequestablePreset,