@ttt-productions/ttt-core 0.79.29 → 0.79.30

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.
@@ -1,3 +1,5 @@
1
+ /** Key prefix owning every variant of one asset: mediaAssets/{assetId}. */
2
+ export declare function buildMediaAssetKeyPrefix(mediaAssetId: string): string;
1
3
  /** Object key shared by R2 and the Storage emulator: mediaAssets/{assetId}/{variantKey}. */
2
4
  export declare function buildMediaAssetKey(mediaAssetId: string, variantKey: string): string;
3
5
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"media-asset-url.d.ts","sourceRoot":"","sources":["../../src/media/media-asset-url.ts"],"names":[],"mappings":"AAQA,4FAA4F;AAC5F,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D,MAAM,WAAW,sBAAsB;IACrC,0DAA0D;IAC1D,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACxC,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,oBAAoB,GAAG,CACjC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,yBAAyB,KAC7B,MAAM,CAAC;AAEZ,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,qBAAqB,GAAG,oBAAoB,CAqB9F"}
1
+ {"version":3,"file":"media-asset-url.d.ts","sourceRoot":"","sources":["../../src/media/media-asset-url.ts"],"names":[],"mappings":"AAQA,2EAA2E;AAC3E,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,4FAA4F;AAC5F,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D,MAAM,WAAW,sBAAsB;IACrC,0DAA0D;IAC1D,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACxC,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,oBAAoB,GAAG,CACjC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,yBAAyB,KAC7B,MAAM,CAAC;AAEZ,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,qBAAqB,GAAG,oBAAoB,CAqB9F"}
@@ -5,9 +5,13 @@
5
5
  // Gateway URLs are NEVER persisted — content docs store `*AssetId` refs and
6
6
  // every render builds the URL from assetId + variant.
7
7
  // See ttt-prod docs/design/media-assets-and-protected-serving.md.
8
+ /** Key prefix owning every variant of one asset: mediaAssets/{assetId}. */
9
+ export function buildMediaAssetKeyPrefix(mediaAssetId) {
10
+ return `mediaAssets/${mediaAssetId}`;
11
+ }
8
12
  /** Object key shared by R2 and the Storage emulator: mediaAssets/{assetId}/{variantKey}. */
9
13
  export function buildMediaAssetKey(mediaAssetId, variantKey) {
10
- return `mediaAssets/${mediaAssetId}/${variantKey}`;
14
+ return `${buildMediaAssetKeyPrefix(mediaAssetId)}/${variantKey}`;
11
15
  }
12
16
  /**
13
17
  * Fixed emulator-only download token. In emulator mode processors attach this
@@ -1 +1 @@
1
- {"version":3,"file":"media-asset-url.js","sourceRoot":"","sources":["../../src/media/media-asset-url.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,uEAAuE;AACvE,oEAAoE;AACpE,gFAAgF;AAChF,4EAA4E;AAC5E,sDAAsD;AACtD,kEAAkE;AAElE,4FAA4F;AAC5F,MAAM,UAAU,kBAAkB,CAAC,YAAoB,EAAE,UAAkB;IACzE,OAAO,eAAe,YAAY,IAAI,UAAU,EAAE,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AA+B/D,MAAM,UAAU,0BAA0B,CAAC,MAA6B;IACtE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,KAAK,GAAG,oBAAoB,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;QACxF,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE;YAClC,MAAM,UAAU,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;YACpF,OAAO,GAAG,MAAM,SAAS,MAAM,MAAM,UAAU,oBAAoB,KAAK,EAAE,CAAC;QAC7E,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,IAAI,EAAE,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,IAAI,EAAE,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,WAAW,SAAS,WAAW,kBAAkB,CAAC,YAAY,CAAC,IAAI,kBAAkB,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;IAClH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// Render-time media URL building — pure and configuration-injected. ttt-core\n// never reads process.env / window / Next config / Firebase state; the\n// consuming app resolves its environment and constructs ONE builder\n// (frontend: NEXT_PUBLIC_MEDIA_HOST + emulator flag; backend: function config).\n// Gateway URLs are NEVER persisted — content docs store `*AssetId` refs and\n// every render builds the URL from assetId + variant.\n// See ttt-prod docs/design/media-assets-and-protected-serving.md.\n\n/** Object key shared by R2 and the Storage emulator: mediaAssets/{assetId}/{variantKey}. */\nexport function buildMediaAssetKey(mediaAssetId: string, variantKey: string): string {\n return `mediaAssets/${mediaAssetId}/${variantKey}`;\n}\n\n/**\n * Fixed emulator-only download token. In emulator mode processors attach this\n * constant token to Storage-emulator objects (token URLs bypass rules in the\n * emulator; production never mints tokens for final media), so the builder can\n * produce deterministic emulator URLs with no Cloudflare involvement.\n */\nexport const EMULATOR_MEDIA_TOKEN = 'ttt-emulator-media-token';\n\nexport interface MediaUrlEmulatorConfig {\n /** Storage emulator origin, e.g. http://127.0.0.1:9199 */\n storageEmulatorOrigin: string;\n /** Emulator storage bucket name, e.g. ttt-dev-cfb70.appspot.com */\n bucket: string;\n /** Token attached by emulator-mode processors. Defaults to EMULATOR_MEDIA_TOKEN. */\n token?: string;\n}\n\nexport interface MediaUrlBuilderConfig {\n /** Gateway host for deployed envs, e.g. media.ttt.productions */\n mediaHost?: string;\n /** When set, the builder is in emulator mode and ignores mediaHost. */\n emulator?: MediaUrlEmulatorConfig;\n}\n\nexport interface BuildMediaAssetUrlOptions {\n /** Signed scoped-grant token (user-bound); appended for scoped-tier assets. */\n grant?: string;\n /** Request Content-Disposition: attachment from the gateway. */\n download?: boolean;\n}\n\nexport type MediaAssetUrlBuilder = (\n mediaAssetId: string,\n variantKey: string,\n opts?: BuildMediaAssetUrlOptions,\n) => string;\n\nexport function createMediaAssetUrlBuilder(config: MediaUrlBuilderConfig): MediaAssetUrlBuilder {\n if (config.emulator) {\n const { storageEmulatorOrigin, bucket, token = EMULATOR_MEDIA_TOKEN } = config.emulator;\n const origin = storageEmulatorOrigin.replace(/\\/$/, '');\n return (mediaAssetId, variantKey) => {\n const objectPath = encodeURIComponent(buildMediaAssetKey(mediaAssetId, variantKey));\n return `${origin}/v0/b/${bucket}/o/${objectPath}?alt=media&token=${token}`;\n };\n }\n\n const mediaHost = config.mediaHost;\n if (!mediaHost) {\n throw new Error('createMediaAssetUrlBuilder: mediaHost is required outside emulator mode');\n }\n return (mediaAssetId, variantKey, opts) => {\n const params = new URLSearchParams();\n if (opts?.grant) params.set('grant', opts.grant);\n if (opts?.download) params.set('download', '1');\n const qs = params.size > 0 ? `?${params.toString()}` : '';\n return `https://${mediaHost}/assets/${encodeURIComponent(mediaAssetId)}/${encodeURIComponent(variantKey)}${qs}`;\n };\n}\n"]}
1
+ {"version":3,"file":"media-asset-url.js","sourceRoot":"","sources":["../../src/media/media-asset-url.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,uEAAuE;AACvE,oEAAoE;AACpE,gFAAgF;AAChF,4EAA4E;AAC5E,sDAAsD;AACtD,kEAAkE;AAElE,2EAA2E;AAC3E,MAAM,UAAU,wBAAwB,CAAC,YAAoB;IAC3D,OAAO,eAAe,YAAY,EAAE,CAAC;AACvC,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,kBAAkB,CAAC,YAAoB,EAAE,UAAkB;IACzE,OAAO,GAAG,wBAAwB,CAAC,YAAY,CAAC,IAAI,UAAU,EAAE,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AA+B/D,MAAM,UAAU,0BAA0B,CAAC,MAA6B;IACtE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,KAAK,GAAG,oBAAoB,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;QACxF,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE;YAClC,MAAM,UAAU,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;YACpF,OAAO,GAAG,MAAM,SAAS,MAAM,MAAM,UAAU,oBAAoB,KAAK,EAAE,CAAC;QAC7E,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,IAAI,EAAE,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,IAAI,EAAE,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,WAAW,SAAS,WAAW,kBAAkB,CAAC,YAAY,CAAC,IAAI,kBAAkB,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;IAClH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// Render-time media URL building — pure and configuration-injected. ttt-core\n// never reads process.env / window / Next config / Firebase state; the\n// consuming app resolves its environment and constructs ONE builder\n// (frontend: NEXT_PUBLIC_MEDIA_HOST + emulator flag; backend: function config).\n// Gateway URLs are NEVER persisted — content docs store `*AssetId` refs and\n// every render builds the URL from assetId + variant.\n// See ttt-prod docs/design/media-assets-and-protected-serving.md.\n\n/** Key prefix owning every variant of one asset: mediaAssets/{assetId}. */\nexport function buildMediaAssetKeyPrefix(mediaAssetId: string): string {\n return `mediaAssets/${mediaAssetId}`;\n}\n\n/** Object key shared by R2 and the Storage emulator: mediaAssets/{assetId}/{variantKey}. */\nexport function buildMediaAssetKey(mediaAssetId: string, variantKey: string): string {\n return `${buildMediaAssetKeyPrefix(mediaAssetId)}/${variantKey}`;\n}\n\n/**\n * Fixed emulator-only download token. In emulator mode processors attach this\n * constant token to Storage-emulator objects (token URLs bypass rules in the\n * emulator; production never mints tokens for final media), so the builder can\n * produce deterministic emulator URLs with no Cloudflare involvement.\n */\nexport const EMULATOR_MEDIA_TOKEN = 'ttt-emulator-media-token';\n\nexport interface MediaUrlEmulatorConfig {\n /** Storage emulator origin, e.g. http://127.0.0.1:9199 */\n storageEmulatorOrigin: string;\n /** Emulator storage bucket name, e.g. ttt-dev-cfb70.appspot.com */\n bucket: string;\n /** Token attached by emulator-mode processors. Defaults to EMULATOR_MEDIA_TOKEN. */\n token?: string;\n}\n\nexport interface MediaUrlBuilderConfig {\n /** Gateway host for deployed envs, e.g. media.ttt.productions */\n mediaHost?: string;\n /** When set, the builder is in emulator mode and ignores mediaHost. */\n emulator?: MediaUrlEmulatorConfig;\n}\n\nexport interface BuildMediaAssetUrlOptions {\n /** Signed scoped-grant token (user-bound); appended for scoped-tier assets. */\n grant?: string;\n /** Request Content-Disposition: attachment from the gateway. */\n download?: boolean;\n}\n\nexport type MediaAssetUrlBuilder = (\n mediaAssetId: string,\n variantKey: string,\n opts?: BuildMediaAssetUrlOptions,\n) => string;\n\nexport function createMediaAssetUrlBuilder(config: MediaUrlBuilderConfig): MediaAssetUrlBuilder {\n if (config.emulator) {\n const { storageEmulatorOrigin, bucket, token = EMULATOR_MEDIA_TOKEN } = config.emulator;\n const origin = storageEmulatorOrigin.replace(/\\/$/, '');\n return (mediaAssetId, variantKey) => {\n const objectPath = encodeURIComponent(buildMediaAssetKey(mediaAssetId, variantKey));\n return `${origin}/v0/b/${bucket}/o/${objectPath}?alt=media&token=${token}`;\n };\n }\n\n const mediaHost = config.mediaHost;\n if (!mediaHost) {\n throw new Error('createMediaAssetUrlBuilder: mediaHost is required outside emulator mode');\n }\n return (mediaAssetId, variantKey, opts) => {\n const params = new URLSearchParams();\n if (opts?.grant) params.set('grant', opts.grant);\n if (opts?.download) params.set('download', '1');\n const qs = params.size > 0 ? `?${params.toString()}` : '';\n return `https://${mediaHost}/assets/${encodeURIComponent(mediaAssetId)}/${encodeURIComponent(variantKey)}${qs}`;\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ttt-productions/ttt-core",
3
- "version": "0.79.29",
3
+ "version": "0.79.30",
4
4
  "description": "Core types, Firestore path constants, and shared constants for TTT Productions",
5
5
  "repository": {
6
6
  "type": "git",