@prenta/core 7.6.4 → 7.6.6

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.
@@ -3,6 +3,17 @@ import type { CacheAdapter } from '../config/types.js';
3
3
  export declare function cached<T>(adapter: CacheAdapter, key: string, tags: string[], ttl: number, fn: () => Promise<T>): Promise<T>;
4
4
  /** Invalidate all cache entries associated with a tag. */
5
5
  export declare function revalidateTag(adapter: CacheAdapter, tag: string): Promise<void>;
6
+ /**
7
+ * The platform cache, when the host configured one. Absent means document
8
+ * reads go straight to the database, which is the default.
9
+ */
10
+ export declare function configuredCacheAdapter(): CacheAdapter | null;
11
+ /**
12
+ * Return a cached value or compute it. Adapter failures fall through to
13
+ * `fn` so a down cache never fails the read. A hit is cloned so the caller
14
+ * can reshape it without mutating the stored entry.
15
+ */
16
+ export declare function readThrough<T>(adapter: CacheAdapter, key: string, tags: string[], fn: () => Promise<T>): Promise<T>;
6
17
  /** Build a cache key from a collection, operation, and parameters. */
7
18
  export declare function buildCacheKey(collection: string, operation: string, params?: Record<string, unknown>): string;
8
19
  /** Get the standard cache tags for a document. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAQtD,iDAAiD;AACjD,wBAAsB,MAAM,CAAC,CAAC,EAC5B,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAOZ;AAED,0DAA0D;AAC1D,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErF;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAUR;AAED,kDAAkD;AAClD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAItF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAkBtD,iDAAiD;AACjD,wBAAsB,MAAM,CAAC,CAAC,EAC5B,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAOZ;AAED,0DAA0D;AAC1D,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,YAAY,GAAG,IAAI,CAI5D;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CA4BZ;AAUD,sEAAsE;AACtE,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAUR;AAED,kDAAkD;AAClD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAItF"}
@@ -1,3 +1,10 @@
1
+ import { getPrentaConfig } from '../config/runtime.js';
2
+ import { createLogger } from '../diagnostics/logger.js';
3
+ const cacheLogger = createLogger('cache');
4
+ /** How long a document read stays warm. Matches the public HTTP cache TTL. */
5
+ const DOCUMENT_READ_TTL_SECONDS = 60;
6
+ /** Stay under typical Redis and runtime-cache item limits. */
7
+ const MAX_CACHE_ENTRY_BYTES = 1_500_000;
1
8
  /** Wrap a computation with tag-based caching. */
2
9
  export async function cached(adapter, key, tags, ttl, fn) {
3
10
  const existing = await adapter.get(key);
@@ -11,6 +18,59 @@ export async function cached(adapter, key, tags, ttl, fn) {
11
18
  export async function revalidateTag(adapter, tag) {
12
19
  await adapter.invalidateTag(tag);
13
20
  }
21
+ /**
22
+ * The platform cache, when the host configured one. Absent means document
23
+ * reads go straight to the database, which is the default.
24
+ */
25
+ export function configuredCacheAdapter() {
26
+ const cache = getPrentaConfig()?.platform?.cache;
27
+ if (!cache || typeof cache.get !== 'function' || typeof cache.set !== 'function')
28
+ return null;
29
+ return cache;
30
+ }
31
+ /**
32
+ * Return a cached value or compute it. Adapter failures fall through to
33
+ * `fn` so a down cache never fails the read. A hit is cloned so the caller
34
+ * can reshape it without mutating the stored entry.
35
+ */
36
+ export async function readThrough(adapter, key, tags, fn) {
37
+ try {
38
+ const existing = await adapter.get(key);
39
+ if (existing && typeof existing === 'object' && 'value' in existing) {
40
+ return structuredClone(existing.value);
41
+ }
42
+ }
43
+ catch (err) {
44
+ cacheLogger.error('cache get failed — reading from the database', {
45
+ error: err instanceof Error ? err.message : String(err),
46
+ });
47
+ }
48
+ const value = await fn();
49
+ try {
50
+ const entry = {
51
+ value,
52
+ tags,
53
+ expiresAt: Date.now() + DOCUMENT_READ_TTL_SECONDS * 1000,
54
+ };
55
+ if (!oversized(entry)) {
56
+ await adapter.set(key, entry, DOCUMENT_READ_TTL_SECONDS);
57
+ }
58
+ }
59
+ catch (err) {
60
+ cacheLogger.error('cache set failed — returning the database value', {
61
+ error: err instanceof Error ? err.message : String(err),
62
+ });
63
+ }
64
+ return value;
65
+ }
66
+ function oversized(entry) {
67
+ try {
68
+ return JSON.stringify(entry).length > MAX_CACHE_ENTRY_BYTES;
69
+ }
70
+ catch {
71
+ return true;
72
+ }
73
+ }
14
74
  /** Build a cache key from a collection, operation, and parameters. */
15
75
  export function buildCacheKey(collection, operation, params) {
16
76
  const base = `prenta:${collection}:${operation}`;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAQA,iDAAiD;AACjD,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAqB,EACrB,GAAW,EACX,IAAc,EACd,GAAW,EACX,EAAoB;IAEpB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAgB,GAAG,CAAC,CAAA;IACtD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAA;IAEnC,MAAM,KAAK,GAAG,MAAM,EAAE,EAAE,CAAA;IACxB,MAAM,OAAO,CAAC,GAAG,CAAgB,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,CAAC,CAAA;IACxF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAqB,EAAE,GAAW;IACpE,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAClC,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,aAAa,CAC3B,UAAkB,EAClB,SAAiB,EACjB,MAAgC;IAEhC,MAAM,IAAI,GAAG,UAAU,UAAU,IAAI,SAAS,EAAE,CAAA;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAExB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,IAAI,CAAC,GAAG,CAAC,CAAA;IAEZ,OAAO,GAAG,IAAI,IAAI,MAAM,EAAE,CAAA;AAC5B,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,oBAAoB,CAAC,UAAkB,EAAE,UAAmB;IAC1E,MAAM,IAAI,GAAG,CAAC,cAAc,UAAU,EAAE,CAAC,CAAA;IACzC,IAAI,UAAU;QAAE,IAAI,CAAC,IAAI,CAAC,OAAO,UAAU,EAAE,CAAC,CAAA;IAC9C,OAAO,IAAI,CAAA;AACb,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prenta/core",
3
- "version": "7.6.4",
3
+ "version": "7.6.6",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -240,7 +240,7 @@
240
240
  "dotenv": "^17.3.1",
241
241
  "graphql": "^16.13.2",
242
242
  "graphql-yoga": "^5.19.0",
243
- "next": "^16.3.4",
243
+ "next": "^16.3.6",
244
244
  "pg": "^8.20.0",
245
245
  "prisma": "^7.8.0",
246
246
  "react": "^19.2.4",