@se-studio/contentful-rest-api 1.0.121 → 1.0.123

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 CHANGED
@@ -1,5 +1,13 @@
1
1
  # @se-studio/contentful-rest-api
2
2
 
3
+ ## 1.0.122
4
+
5
+ ### Patch Changes
6
+
7
+ - Bulk version bump: patch for all packages
8
+ - Updated dependencies
9
+ - @se-studio/core-data-types@1.0.122
10
+
3
11
  ## 1.0.121
4
12
 
5
13
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"videoEnricher.d.ts","sourceRoot":"","sources":["../../src/converters/videoEnricher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAiDnF;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCnF"}
1
+ {"version":3,"file":"videoEnricher.d.ts","sourceRoot":"","sources":["../../src/converters/videoEnricher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAuEnF;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCnF"}
@@ -1,32 +1,44 @@
1
+ import { unstable_cache } from 'next/cache';
1
2
  import { assetTag } from '../revalidation/tags';
2
3
  /**
3
- * Fetches video metadata (width/height) from the ImageKit metadata API.
4
- * The assetId is used to attach a cache tag so the result is invalidated
5
- * when the Contentful asset is updated via webhook.
6
- *
7
- * @param videoUrl - Contentful CDN URL for the video asset
8
- * @param assetId - Contentful asset ID for cache tagging
9
- * @param imagekitUrl - ImageKit origin URL (IMAGEKIT_URL env var)
10
- * @param privateKey - ImageKit private key (IMAGEKIT_PRIVATE_KEY env var)
4
+ * Raw HTTP fetch called only on cache miss.
5
+ * Note: Next.js automatically excludes fetch calls with Authorization headers from its
6
+ * Data Cache, so caching is handled by the unstable_cache wrapper in fetchVideoMetadata.
11
7
  */
12
- async function fetchVideoMetadata(videoUrl, assetId, imagekitUrl, privateKey) {
13
- const fullUrl = new URL(videoUrl);
14
- const src = `${imagekitUrl}${fullUrl.pathname}/ik-video.mp4`;
8
+ async function fetchFromImageKit(src, privateKey) {
15
9
  const request = `https://api.imagekit.io/v1/metadata?url=${encodeURIComponent(src)}`;
10
+ console.log(`[ImageKit] cache miss — fetching url=${src}`);
16
11
  const response = await fetch(request, {
17
12
  method: 'GET',
18
13
  headers: {
19
14
  authorization: `Basic ${Buffer.from(`${privateKey}:`).toString('base64')}`,
20
15
  },
21
- next: {
22
- tags: [assetTag(assetId)],
23
- },
24
16
  });
25
17
  if (response.ok) {
18
+ console.log(`[ImageKit] metadata ok status=${response.status}`);
26
19
  return (await response.json());
27
20
  }
21
+ console.warn(`[ImageKit] metadata failed status=${response.status} url=${src}`);
28
22
  return undefined;
29
23
  }
24
+ /**
25
+ * Fetches video metadata (width/height) from the ImageKit metadata API, with caching.
26
+ * Uses unstable_cache (not fetch's next:{} options) because Next.js automatically opts
27
+ * fetch calls with Authorization headers out of the Data Cache.
28
+ *
29
+ * Cached for 1 day; can be invalidated on-demand via the asset's Contentful webhook tag.
30
+ *
31
+ * @param videoUrl - Contentful CDN URL for the video asset
32
+ * @param assetId - Contentful asset ID for cache tagging
33
+ * @param imagekitUrl - ImageKit origin URL (IMAGEKIT_URL env var)
34
+ * @param privateKey - ImageKit private key (IMAGEKIT_PRIVATE_KEY env var)
35
+ */
36
+ async function fetchVideoMetadata(videoUrl, assetId, imagekitUrl, privateKey) {
37
+ const fullUrl = new URL(videoUrl);
38
+ const src = `${imagekitUrl}${fullUrl.pathname}/ik-video.mp4`;
39
+ const getCached = unstable_cache(() => fetchFromImageKit(src, privateKey), ['imagekit-metadata', assetId], { revalidate: 86400, tags: [assetTag(assetId)] });
40
+ return getCached();
41
+ }
30
42
  /**
31
43
  * Enriches all local/full video visuals in the assets Map with pixel dimensions
32
44
  * fetched from the ImageKit metadata API. Mutates width/height in place so the
@@ -40,11 +52,14 @@ async function fetchVideoMetadata(videoUrl, assetId, imagekitUrl, privateKey) {
40
52
  export async function enrichVideoAssets(assets) {
41
53
  const imagekitUrl = process.env.IMAGEKIT_URL;
42
54
  const privateKey = process.env.IMAGEKIT_PRIVATE_KEY;
43
- if (!imagekitUrl || !privateKey)
55
+ if (!imagekitUrl || !privateKey) {
56
+ console.log('[ImageKit] skipping video enrichment — IMAGEKIT_URL or IMAGEKIT_PRIVATE_KEY not set');
44
57
  return;
58
+ }
45
59
  const videoEntries = Array.from(assets.entries()).filter(([, visual]) => visual.video?.type === 'Local video' || visual.video?.type === 'Full video');
46
60
  if (videoEntries.length === 0)
47
61
  return;
62
+ console.log(`[ImageKit] enriching ${videoEntries.length} video(s)`);
48
63
  await Promise.all(videoEntries.map(async ([assetId, visual]) => {
49
64
  const video = visual.video;
50
65
  const videoUrl = video.type === 'Full video'
@@ -59,7 +74,8 @@ export async function enrichVideoAssets(assets) {
59
74
  video.height = metadata.height;
60
75
  }
61
76
  }
62
- catch {
77
+ catch (err) {
78
+ console.error(`[ImageKit] metadata fetch threw assetId=${assetId}`, err);
63
79
  // Leave width/height undefined — components handle missing dimensions gracefully
64
80
  }
65
81
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"videoEnricher.js","sourceRoot":"","sources":["../../src/converters/videoEnricher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAWhD;;;;;;;;;GASG;AACH,KAAK,UAAU,kBAAkB,CAC/B,QAAgB,EAChB,OAAe,EACf,WAAmB,EACnB,UAAkB;IAElB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,GAAG,WAAW,GAAG,OAAO,CAAC,QAAQ,eAAe,CAAC;IAC7D,MAAM,OAAO,GAAG,2CAA2C,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;IAErF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;QACpC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,aAAa,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;SAC3E;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAC1B;KACa,CAAC,CAAC;IAElB,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAC;IACrD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAA4B;IAClE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACpD,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU;QAAE,OAAO;IAExC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CACtD,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,YAAY,CAC1B,CAAC;IAEpE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEtC,MAAM,OAAO,CAAC,GAAG,CACf,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,QAAQ,GACZ,KAAK,CAAC,IAAI,KAAK,YAAY;YACzB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC;YACnD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAE7B,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YACtF,IAAI,QAAQ,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACxC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC7B,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YACjC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iFAAiF;QACnF,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"videoEnricher.js","sourceRoot":"","sources":["../../src/converters/videoEnricher.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@se-studio/contentful-rest-api",
3
- "version": "1.0.121",
3
+ "version": "1.0.123",
4
4
  "description": "Type-safe Contentful REST API client with caching and rate limiting for Next.js applications",
5
5
  "repository": {
6
6
  "type": "git",
@@ -50,7 +50,7 @@
50
50
  "@contentful/rich-text-types": "^17.2.5",
51
51
  "contentful": "^11.12.0",
52
52
  "server-only": "0.0.1",
53
- "@se-studio/core-data-types": "1.0.121"
53
+ "@se-studio/core-data-types": "1.0.122"
54
54
  },
55
55
  "peerDependencies": {
56
56
  "next": ">=15.5.0"