@certrev/cert-block 1.2.0-canary.7 → 1.2.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 (33) hide show
  1. package/CHANGELOG.md +120 -63
  2. package/README.md +116 -21
  3. package/dist/builder/card-reader-css.d.ts +14 -0
  4. package/dist/builder/card-reader-css.d.ts.map +1 -0
  5. package/dist/builder/card-reader-css.js +17 -0
  6. package/dist/builder/card-reader-css.js.map +1 -0
  7. package/dist/builder/cert-review-card.d.ts +8 -0
  8. package/dist/builder/cert-review-card.d.ts.map +1 -1
  9. package/dist/builder/cert-review-card.js +234 -41
  10. package/dist/builder/cert-review-card.js.map +1 -1
  11. package/dist/builder/delivery-runtime.d.ts +15 -1
  12. package/dist/builder/delivery-runtime.d.ts.map +1 -1
  13. package/dist/builder/delivery-runtime.js +31 -3
  14. package/dist/builder/delivery-runtime.js.map +1 -1
  15. package/dist/builder/ssr-seed.d.ts +155 -0
  16. package/dist/builder/ssr-seed.d.ts.map +1 -0
  17. package/dist/builder/ssr-seed.js +278 -0
  18. package/dist/builder/ssr-seed.js.map +1 -0
  19. package/dist/verify/cache.d.ts +39 -2
  20. package/dist/verify/cache.d.ts.map +1 -1
  21. package/dist/verify/cache.js +61 -12
  22. package/dist/verify/cache.js.map +1 -1
  23. package/dist/verify/get-verified-delivery.d.ts +28 -3
  24. package/dist/verify/get-verified-delivery.d.ts.map +1 -1
  25. package/dist/verify/get-verified-delivery.js +46 -9
  26. package/dist/verify/get-verified-delivery.js.map +1 -1
  27. package/package.json +112 -112
  28. package/src/builder/card-reader-css.ts +19 -0
  29. package/src/builder/cert-review-card.tsx +308 -56
  30. package/src/builder/delivery-runtime.ts +33 -3
  31. package/src/builder/ssr-seed.ts +343 -0
  32. package/src/verify/cache.ts +87 -11
  33. package/src/verify/get-verified-delivery.ts +77 -11
@@ -11,6 +11,13 @@
11
11
  * ONE fetch, not N.
12
12
  * 3. Negative-caches failures briefly so a hard-down origin doesn't get hammered, while
13
13
  * still recovering quickly (short negative TTL).
14
+ * 4. (1.2.0, opt-in through `staleMs`) STALE-WHILE-REVALIDATE and STALE-IF-ERROR: a positive
15
+ * entry past its TTL but inside the stale window is served at once while ONE background
16
+ * refresh replaces it; a refresh that only failed to reach the origin (`isTransient`)
17
+ * keeps the stale entry instead of overwriting it. So an origin that is slow or briefly
18
+ * down costs the page nothing it already had. A definitive answer (a revocation, say)
19
+ * replaces the entry the moment the refresh lands. With the default `staleMs` of 0 an
20
+ * expired entry is gone, exactly as before 1.2.0.
14
21
  *
15
22
  * It is deliberately tiny + dependency-free (a Map + timestamps) so it runs in any server
16
23
  * runtime (Node, edge, workerd). For multi-instance deployments this is per-instance L1 and
@@ -23,21 +30,47 @@ export class TtlCache {
23
30
  ttlMs;
24
31
  negativeTtlMs;
25
32
  maxEntries;
33
+ staleMs;
34
+ inflightMaxMs;
26
35
  now;
27
36
  constructor(opts = {}) {
28
37
  this.ttlMs = opts.ttlMs ?? 60_000;
29
38
  this.negativeTtlMs = opts.negativeTtlMs ?? 5_000;
30
39
  this.maxEntries = opts.maxEntries ?? 1000;
40
+ this.staleMs = opts.staleMs !== undefined && opts.staleMs > 0 ? opts.staleMs : 0;
41
+ this.inflightMaxMs = opts.inflightMaxMs ?? Number.POSITIVE_INFINITY;
31
42
  this.now = opts.now ?? Date.now;
32
43
  }
33
- /** Read a live (non-expired) entry, or undefined. Prunes the entry if expired. */
34
- peek(key) {
44
+ /** The entry while it may still be served (fresh, or positive and inside the stale window); prunes it past that. */
45
+ servable(key) {
35
46
  const e = this.store.get(key);
36
47
  if (!e)
37
48
  return undefined;
38
- if (e.expiresAt <= this.now()) {
39
- this.store.delete(key);
49
+ const now = this.now();
50
+ if (e.expiresAt > now)
51
+ return e;
52
+ if (!e.negative && now < e.expiresAt + this.staleMs)
53
+ return e;
54
+ this.store.delete(key);
55
+ return undefined;
56
+ }
57
+ /** Read a live (non-expired) entry, or undefined. Never serves a stale one; prunes an entry past its stale window. */
58
+ peek(key) {
59
+ const e = this.servable(key);
60
+ return e && e.expiresAt > this.now() ? e.value : undefined;
61
+ }
62
+ /**
63
+ * The synchronous stale-while-revalidate read: a fresh value; or a positive entry past its TTL but inside the stale
64
+ * window, returned at once while this starts (or joins) ONE background refresh through `loader`; else undefined,
65
+ * and the caller loads (`getOrLoad`). The refresh caches as `getOrLoad` does, with the same arguments; its failure
66
+ * is swallowed (the stale value was already served, and a thrown loader is never cached).
67
+ */
68
+ peekOrRefresh(key, loader, isNegative, positiveTtlMs, isTransient) {
69
+ const e = this.servable(key);
70
+ if (!e)
40
71
  return undefined;
72
+ if (e.expiresAt <= this.now()) {
73
+ this.load(key, loader, isNegative, positiveTtlMs, isTransient).catch(() => undefined);
41
74
  }
42
75
  return e.value;
43
76
  }
@@ -54,23 +87,39 @@ export class TtlCache {
54
87
  * It deliberately does NOT apply to a negative result: a caller asking for a 10-minute
55
88
  * positive TTL is asking for fewer origin reads, not for a transient failure to be
56
89
  * remembered for ten minutes (see the negative-TTL rationale in the module header).
90
+ *
91
+ * 1.2.0: inside the stale window (`staleMs`) an expired positive entry is returned at once and refreshed in the
92
+ * background (`peekOrRefresh`). `isTransient(value)` marks a result that says only "the origin was not reached"
93
+ * (a timeout, a 5xx): when a servable positive entry exists, such a result is NOT cached over it and the caller
94
+ * gets that entry's value instead (stale-if-error). With no entry to keep, it is cached as `isNegative` says.
57
95
  */
58
- async getOrLoad(key, loader, isNegative, positiveTtlMs) {
59
- const cached = this.peek(key);
60
- if (cached !== undefined)
61
- return cached;
96
+ async getOrLoad(key, loader, isNegative, positiveTtlMs, isTransient) {
97
+ const served = this.peekOrRefresh(key, loader, isNegative, positiveTtlMs, isTransient);
98
+ if (served !== undefined)
99
+ return served;
100
+ return this.load(key, loader, isNegative, positiveTtlMs, isTransient);
101
+ }
102
+ /** Single-flight load and cache (joins an unsettled load younger than `inflightMaxMs`). */
103
+ load(key, loader, isNegative, positiveTtlMs, isTransient) {
62
104
  const existing = this.inflight.get(key);
63
- if (existing)
64
- return existing;
105
+ if (existing && this.now() - existing.startedAt < this.inflightMaxMs)
106
+ return existing.promise;
65
107
  const promise = (async () => {
66
108
  const value = await loader();
109
+ if (isTransient?.(value)) {
110
+ const kept = this.servable(key);
111
+ if (kept && !kept.negative)
112
+ return kept.value;
113
+ }
67
114
  const negative = isNegative ? isNegative(value) : false;
68
115
  this.set(key, value, negative, negative ? undefined : positiveTtlMs);
69
116
  return value;
70
117
  })().finally(() => {
71
- this.inflight.delete(key);
118
+ // Only this load's own slot: a newer load that replaced an abandoned one keeps its place.
119
+ if (this.inflight.get(key)?.promise === promise)
120
+ this.inflight.delete(key);
72
121
  });
73
- this.inflight.set(key, promise);
122
+ this.inflight.set(key, { promise, startedAt: this.now() });
74
123
  return promise;
75
124
  }
76
125
  /** Insert/overwrite an entry. `ttlMsOverride` replaces the TTL this write would otherwise
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/verify/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/verify/cache.ts"],"names":[],"mappings":"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"}
@@ -29,24 +29,42 @@
29
29
  * `peekVerifiedDelivery` is the synchronous read of the same cache: a React component suspends on
30
30
  * `getVerifiedDelivery` once, then reads the settled value without a second promise (which is what
31
31
  * keeps a streaming SSR render from suspending forever on a fresh promise every retry).
32
+ *
33
+ * 1.2.0: a suppressed read that only failed to REACH CertREV (the fetch threw or hit its deadline, a 5xx or other
34
+ * non-OK status but 404/410, a body that is not JSON or not an object) is marked `unreachable`. It says nothing
35
+ * about the credential, so a cache with a stale window keeps a verified entry over it (stale-if-error), and the
36
+ * card paints its options face instead of nothing. A definitive answer (404/410, a key or signature that does not
37
+ * verify, a revoked, expired or mismatched artifact) is never `unreachable`. `readVerifiedDelivery` is the
38
+ * synchronous read that also serves a stale entry while refreshing it.
32
39
  */
33
40
  import type { CertChromeRenderDef } from '../builder/cert-chrome-data.js';
34
- import type { CertPayload, CertSuppressReason, CertVerdict, RenderContext, ResolvePublicKeyByKid } from '../contract/kernel.js';
41
+ import type { CertPayload, CertSignature, CertSuppressReason, CertVerdict, RenderContext, ResolvePublicKeyByKid } from '../contract/kernel.js';
35
42
  import { TtlCache } from './cache.js';
36
- /** What one Delivery read settles to, as cached: a verified payload + its def, or the reason not. */
43
+ /**
44
+ * What one Delivery read settles to, as cached: a verified payload + its def (and, from 1.2.0, the signature it
45
+ * verified with, so a server render can hand the signed envelope to the browser), or the reason not.
46
+ */
37
47
  export type CachedDelivery = {
38
48
  readonly kind: 'verified';
39
49
  readonly payload: CertPayload;
40
50
  readonly renderDef: CertChromeRenderDef | null;
51
+ /** Absent only in a cache filled by hand (a test, a custom cache); a read always keeps it. */
52
+ readonly signature?: CertSignature;
41
53
  } | {
42
54
  readonly kind: 'suppressed';
43
55
  readonly reason: CertSuppressReason;
56
+ /** 1.2.0: true when CertREV was not reached (no answer about the credential); see the module header. */
57
+ readonly unreachable?: true;
44
58
  };
45
59
  /** The answer for one render: the verdict AT THIS RENDER'S CLOCK, and the def to paint it with. */
46
60
  export interface VerifiedDelivery {
47
61
  readonly verdict: CertVerdict;
48
62
  /** The brand's render def, or null (no def resolved, a malformed one, or a suppress verdict). */
49
63
  readonly renderDef: CertChromeRenderDef | null;
64
+ /** The verified envelope's signature, on a `render` verdict whose read kept it; else undefined. */
65
+ readonly signature?: CertSignature;
66
+ /** 1.2.0: on a suppress verdict, true when CertREV was not reached; else undefined. */
67
+ readonly unreachable?: true;
50
68
  }
51
69
  export interface GetVerifiedDeliveryOptions {
52
70
  /** Base URL of the CertREV app that serves the Delivery API, e.g. 'https://portal.certrev.com'. */
@@ -62,7 +80,7 @@ export interface GetVerifiedDeliveryOptions {
62
80
  readonly cache?: TtlCache<CachedDelivery>;
63
81
  /** TTL in ms for a VERIFIED read (default: the cache's positive TTL, 60_000 on the shared one). */
64
82
  readonly ttlMs?: number;
65
- /** Deadline in ms for the fetch (default `DEFAULT_FETCH_TIMEOUT_MS`, 3s). */
83
+ /** Deadline in ms for the fetch (default `DEFAULT_FETCH_TIMEOUT_MS`, 3s; the Builder card's runtime passes 8s). */
66
84
  readonly timeoutMs?: number;
67
85
  /**
68
86
  * 1.2.0-canary.5: read one saved design version instead of the brand's live def. CertREV's own canary
@@ -118,6 +136,13 @@ export declare function settleDelivery(cached: CachedDelivery, context: RenderCo
118
136
  * `context.now`, the payload is unrevoked, unexpired and for this placement.
119
137
  */
120
138
  export declare function getVerifiedDelivery(opts: GetVerifiedDeliveryOptions): Promise<VerifiedDelivery>;
139
+ /**
140
+ * 1.2.0, the synchronous read a render uses: the settled answer for a fresh cached read; or, inside the cache's
141
+ * stale window, the stale read's answer at once while ONE background refresh (the same fetch `getVerifiedDelivery`
142
+ * makes) replaces it; else `undefined`, and the caller awaits `getVerifiedDelivery`. The verdict is still settled
143
+ * at `context.now`, so a stale payload that has expired or been revoked in its own fields still suppresses.
144
+ */
145
+ export declare function readVerifiedDelivery(opts: GetVerifiedDeliveryOptions): VerifiedDelivery | undefined;
121
146
  /**
122
147
  * The synchronous read: the settled answer when a fresh read is cached, else `undefined` (the
123
148
  * caller then awaits `getVerifiedDelivery`). Never fetches.
@@ -1 +1 @@
1
- {"version":3,"file":"get-verified-delivery.d.ts","sourceRoot":"","sources":["../../src/verify/get-verified-delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACzE,OAAO,KAAK,EAEX,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAGrC,qGAAqG;AACrG,MAAM,MAAM,cAAc,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAAE,GAC5G;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAA;AAEvE,mGAAmG;AACnG,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,iGAAiG;IACjG,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAC9C;AAED,MAAM,WAAW,0BAA0B;IAC1C,mGAAmG;IACnG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAA;IAC1C,8FAA8F;IAC9F,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACjC,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAA;IACzC,mGAAmG;IACnG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,kFAAkF;AAClF,QAAA,MAAM,mBAAmB,0BAAwE,CAAA;AAMjG,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAM7G;AAED,gHAAgH;AAChH,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,IAAI,CAAC,0BAA0B,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAC,GAClG,MAAM,CAER;AASD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAU9E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAWxG;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAgCzE;AAyCD,iGAAiG;AACjG,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,GAAG,gBAAgB,CAI/F;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,0BAA0B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CASrG;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,IAAI,CAAC,0BAA0B,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC,GAC5G,gBAAgB,GAAG,SAAS,CAG9B;AAED,gHAAgH;AAChH,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,IAAI,CAAC,0BAA0B,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAC,EACpG,KAAK,GAAE,QAAQ,CAAC,cAAc,CAAuB,GACnD,IAAI,CAEN;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAA"}
1
+ {"version":3,"file":"get-verified-delivery.d.ts","sourceRoot":"","sources":["../../src/verify/get-verified-delivery.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,13 @@
29
29
  * `peekVerifiedDelivery` is the synchronous read of the same cache: a React component suspends on
30
30
  * `getVerifiedDelivery` once, then reads the settled value without a second promise (which is what
31
31
  * keeps a streaming SSR render from suspending forever on a fresh promise every retry).
32
+ *
33
+ * 1.2.0: a suppressed read that only failed to REACH CertREV (the fetch threw or hit its deadline, a 5xx or other
34
+ * non-OK status but 404/410, a body that is not JSON or not an object) is marked `unreachable`. It says nothing
35
+ * about the credential, so a cache with a stale window keeps a verified entry over it (stale-if-error), and the
36
+ * card paints its options face instead of nothing. A definitive answer (404/410, a key or signature that does not
37
+ * verify, a revoked, expired or mismatched artifact) is never `unreachable`. `readVerifiedDelivery` is the
38
+ * synchronous read that also serves a stale entry while refreshing it.
32
39
  */
33
40
  import { renderVerdict, verifyArtifact } from '../contract/kernel.js';
34
41
  import { TtlCache } from './cache.js';
@@ -38,6 +45,11 @@ const sharedDeliveryCache = new TtlCache({ ttlMs: 60_000, negativeTtlMs: 5_000 }
38
45
  function suppressed(reason) {
39
46
  return { kind: 'suppressed', reason };
40
47
  }
48
+ /** A read that did not reach CertREV: the same least-wrong reason as before 1.2.0, marked `unreachable`. */
49
+ function unreachable() {
50
+ return { kind: 'suppressed', reason: 'unsupported_contract_version', unreachable: true };
51
+ }
52
+ const isUnreachable = (v) => v.kind === 'suppressed' && v.unreachable === true;
41
53
  /** The Delivery route; a design pin adds `?design=<v>` and, with a brand, `&designBrand=<brand>`. */
42
54
  export function deliveryUrl(baseUrl, platform, externalId, design) {
43
55
  const base = baseUrl.replace(/\/+$/, '');
@@ -151,23 +163,23 @@ async function loadDelivery(opts) {
151
163
  }
152
164
  catch {
153
165
  // Unreachable, DNS/TLS, or the deadline. Same least-wrong member as getVerifiedEnvelope.
154
- return suppressed('unsupported_contract_version');
166
+ return unreachable();
155
167
  }
156
168
  // Nothing served for this placement: never certified, or withdrawn. A LIVE revocation is a 200
157
169
  // tombstone, so a 4xx here genuinely means "no credential for this subject".
158
170
  if (res.status === 404 || res.status === 410)
159
171
  return suppressed('subject_mismatch');
160
172
  if (!res.ok)
161
- return suppressed('unsupported_contract_version');
173
+ return unreachable();
162
174
  let body;
163
175
  try {
164
176
  body = await res.json();
165
177
  }
166
178
  catch {
167
- return suppressed('unsupported_contract_version');
179
+ return unreachable();
168
180
  }
169
181
  if (!isRecord(body))
170
- return suppressed('unsupported_contract_version');
182
+ return unreachable();
171
183
  let verdict;
172
184
  try {
173
185
  // `verifyArtifact`, so a tombstone verifies as itself and reports 'revoked'. The kernel reads
@@ -180,14 +192,28 @@ async function loadDelivery(opts) {
180
192
  }
181
193
  if (verdict.decision !== 'render')
182
194
  return suppressed(verdict.reason);
183
- return { kind: 'verified', payload: verdict.payload, renderDef: parseRenderDef(body.renderDef) };
195
+ // A `render` verdict came from an envelope (a tombstone never renders), so `signature` is the one just verified.
196
+ const signature = isRecord(body.signature) ? body.signature : undefined;
197
+ return {
198
+ kind: 'verified',
199
+ payload: verdict.payload,
200
+ renderDef: parseRenderDef(body.renderDef),
201
+ ...(signature ? { signature } : {}),
202
+ };
184
203
  }
185
204
  /** Apply the render-time policy to a cached read: lifecycle + subject at THIS render's clock. */
186
205
  export function settleDelivery(cached, context) {
187
- if (cached.kind === 'suppressed')
188
- return { verdict: { decision: 'suppress', reason: cached.reason }, renderDef: null };
206
+ if (cached.kind === 'suppressed') {
207
+ return {
208
+ verdict: { decision: 'suppress', reason: cached.reason },
209
+ renderDef: null,
210
+ ...(cached.unreachable ? { unreachable: true } : {}),
211
+ };
212
+ }
189
213
  const verdict = renderVerdict(cached.payload, context);
190
- return { verdict, renderDef: verdict.decision === 'render' ? cached.renderDef : null };
214
+ if (verdict.decision !== 'render')
215
+ return { verdict, renderDef: null };
216
+ return { verdict, renderDef: cached.renderDef, ...(cached.signature ? { signature: cached.signature } : {}) };
191
217
  }
192
218
  /**
193
219
  * Fetch (if needed), verify, cache, and settle one Delivery read for one placement. FAIL-CLOSED:
@@ -196,9 +222,20 @@ export function settleDelivery(cached, context) {
196
222
  */
197
223
  export async function getVerifiedDelivery(opts) {
198
224
  const cache = opts.cache ?? sharedDeliveryCache;
199
- const cached = await cache.getOrLoad(deliveryCacheKey(opts), () => loadDelivery(opts), (v) => v.kind === 'suppressed', opts.ttlMs);
225
+ const cached = await cache.getOrLoad(deliveryCacheKey(opts), () => loadDelivery(opts), (v) => v.kind === 'suppressed', opts.ttlMs, isUnreachable);
200
226
  return settleDelivery(cached, opts.context);
201
227
  }
228
+ /**
229
+ * 1.2.0, the synchronous read a render uses: the settled answer for a fresh cached read; or, inside the cache's
230
+ * stale window, the stale read's answer at once while ONE background refresh (the same fetch `getVerifiedDelivery`
231
+ * makes) replaces it; else `undefined`, and the caller awaits `getVerifiedDelivery`. The verdict is still settled
232
+ * at `context.now`, so a stale payload that has expired or been revoked in its own fields still suppresses.
233
+ */
234
+ export function readVerifiedDelivery(opts) {
235
+ const cache = opts.cache ?? sharedDeliveryCache;
236
+ const cached = cache.peekOrRefresh(deliveryCacheKey(opts), () => loadDelivery(opts), (v) => v.kind === 'suppressed', opts.ttlMs, isUnreachable);
237
+ return cached === undefined ? undefined : settleDelivery(cached, opts.context);
238
+ }
202
239
  /**
203
240
  * The synchronous read: the settled answer when a fresh read is cached, else `undefined` (the
204
241
  * caller then awaits `getVerifiedDelivery`). Never fetches.
@@ -1 +1 @@
1
- {"version":3,"file":"get-verified-delivery.js","sourceRoot":"","sources":["../../src/verify/get-verified-delivery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-verified-delivery.js","sourceRoot":"","sources":["../../src/verify/get-verified-delivery.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,113 +1,113 @@
1
1
  {
2
- "name": "@certrev/cert-block",
3
- "version": "1.2.0-canary.7",
4
- "description": "Headless render edge for the CertREV CertDeliveryEnvelope: SSR-safe React cert components, a framework-agnostic <certrev-badge> Web Component, a schema.org JSON-LD projector, and a fail-closed verify layer over the shared VerdictKernel.",
5
- "repository": {
6
- "type": "git",
7
- "url": "git+https://github.com/CertREV/cert-kit.git",
8
- "directory": "packages/cert-block"
9
- },
10
- "homepage": "https://github.com/CertREV/cert-kit/tree/HEAD/packages/cert-block#readme",
11
- "bugs": {
12
- "url": "https://github.com/CertREV/cert-kit/issues"
13
- },
14
- "type": "module",
15
- "main": "./dist/index.js",
16
- "types": "./dist/index.d.ts",
17
- "exports": {
18
- ".": {
19
- "types": "./dist/index.d.ts",
20
- "default": "./dist/index.js"
21
- },
22
- "./builder": {
23
- "types": "./dist/builder/index.d.ts",
24
- "default": "./dist/builder/index.js"
25
- },
26
- "./builder/face": {
27
- "types": "./dist/builder/envelope-face.d.ts",
28
- "default": "./dist/builder/envelope-face.js"
29
- },
30
- "./reader": {
31
- "types": "./dist/reader/index.d.ts",
32
- "default": "./dist/reader/index.js"
33
- },
34
- "./reader.css": "./src/reader/reader.css",
35
- "./webcomponent": {
36
- "types": "./dist/webcomponent/certrev-badge.d.ts",
37
- "default": "./dist/webcomponent/certrev-badge.js"
38
- },
39
- "./fixtures": {
40
- "types": "./dist/contract/fixtures.d.ts",
41
- "default": "./dist/contract/fixtures.js"
42
- },
43
- "./modal": {
44
- "types": "./dist/modal/index.d.ts",
45
- "default": "./dist/modal/index.js"
46
- },
47
- "./modal/placement": {
48
- "types": "./dist/modal/placement.d.ts",
49
- "default": "./dist/modal/placement.js"
50
- },
51
- "./modal/certrev-cert.js": "./dist/modal/certrev-cert.js"
52
- },
53
- "files": [
54
- "dist",
55
- "src",
56
- "!src/**/__tests__",
57
- "!src/**/*.test.ts",
58
- "!src/**/*.test.tsx",
59
- "README.md",
60
- "CHANGELOG.md"
61
- ],
62
- "publishConfig": {
63
- "registry": "https://registry.npmjs.org",
64
- "access": "public"
65
- },
66
- "publishTargets": [
67
- "npmjs",
68
- "github-packages"
69
- ],
70
- "scripts": {
71
- "build": "tsc && pnpm build:modal-bundle",
72
- "build:modal-bundle": "pnpm dlx esbuild@0.27.7 src/modal/certrev-cert.entry.ts --bundle --minify --target=es2020 --format=iife --legal-comments=none --tsconfig-raw='{\"compilerOptions\":{\"target\":\"ES2017\",\"module\":\"esnext\",\"strict\":true}}' --banner:js='/* biome-ignore-all format: generated cert-badge bundle, see @certrev/cert-block src/modal/ */ /* biome-ignore-all lint: generated cert-badge bundle, see @certrev/cert-block src/modal/ */' --outfile=dist/modal/certrev-cert.js",
73
- "refresh:reader": "node scripts/refresh-reader.mjs",
74
- "typecheck": "tsc --noEmit",
75
- "test": "vitest run"
76
- },
77
- "dependencies": {
78
- "@certrev/cert-contract": "^0.5.0"
79
- },
80
- "peerDependencies": {
81
- "react": ">=18.0.0"
82
- },
83
- "peerDependenciesMeta": {
84
- "react": {
85
- "optional": false
86
- }
87
- },
88
- "devDependencies": {
89
- "@testing-library/react": "^16.1.0",
90
- "@types/node": "^20.0.0",
91
- "@types/react": "^18.3.0",
92
- "@types/react-dom": "^18.3.0",
93
- "jsdom": "^25.0.0",
94
- "react": "^18.3.1",
95
- "react-dom": "^18.3.1",
96
- "typescript": "^6.0.3",
97
- "vitest": "^4.1.5"
98
- },
99
- "keywords": [
100
- "certrev",
101
- "certification",
102
- "react",
103
- "server-components",
104
- "hydrogen",
105
- "shopify",
106
- "json-ld",
107
- "schema-org",
108
- "web-component",
109
- "ed25519",
110
- "ssr"
111
- ],
112
- "license": "MIT"
113
- }
2
+ "name": "@certrev/cert-block",
3
+ "version": "1.2.0",
4
+ "description": "Headless render edge for the CertREV CertDeliveryEnvelope: SSR-safe React cert components, a framework-agnostic <certrev-badge> Web Component, a schema.org JSON-LD projector, and a fail-closed verify layer over the shared VerdictKernel.",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/CertREV/cert-kit.git",
8
+ "directory": "packages/cert-block"
9
+ },
10
+ "homepage": "https://github.com/CertREV/cert-kit/tree/HEAD/packages/cert-block#readme",
11
+ "bugs": {
12
+ "url": "https://github.com/CertREV/cert-kit/issues"
13
+ },
14
+ "type": "module",
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.js"
21
+ },
22
+ "./builder": {
23
+ "types": "./dist/builder/index.d.ts",
24
+ "default": "./dist/builder/index.js"
25
+ },
26
+ "./builder/face": {
27
+ "types": "./dist/builder/envelope-face.d.ts",
28
+ "default": "./dist/builder/envelope-face.js"
29
+ },
30
+ "./reader": {
31
+ "types": "./dist/reader/index.d.ts",
32
+ "default": "./dist/reader/index.js"
33
+ },
34
+ "./reader.css": "./src/reader/reader.css",
35
+ "./webcomponent": {
36
+ "types": "./dist/webcomponent/certrev-badge.d.ts",
37
+ "default": "./dist/webcomponent/certrev-badge.js"
38
+ },
39
+ "./fixtures": {
40
+ "types": "./dist/contract/fixtures.d.ts",
41
+ "default": "./dist/contract/fixtures.js"
42
+ },
43
+ "./modal": {
44
+ "types": "./dist/modal/index.d.ts",
45
+ "default": "./dist/modal/index.js"
46
+ },
47
+ "./modal/placement": {
48
+ "types": "./dist/modal/placement.d.ts",
49
+ "default": "./dist/modal/placement.js"
50
+ },
51
+ "./modal/certrev-cert.js": "./dist/modal/certrev-cert.js"
52
+ },
53
+ "files": [
54
+ "dist",
55
+ "src",
56
+ "!src/**/__tests__",
57
+ "!src/**/*.test.ts",
58
+ "!src/**/*.test.tsx",
59
+ "README.md",
60
+ "CHANGELOG.md"
61
+ ],
62
+ "publishConfig": {
63
+ "registry": "https://registry.npmjs.org",
64
+ "access": "public"
65
+ },
66
+ "publishTargets": [
67
+ "npmjs",
68
+ "github-packages"
69
+ ],
70
+ "dependencies": {
71
+ "@certrev/cert-contract": "^0.5.0"
72
+ },
73
+ "peerDependencies": {
74
+ "react": ">=18.0.0"
75
+ },
76
+ "peerDependenciesMeta": {
77
+ "react": {
78
+ "optional": false
79
+ }
80
+ },
81
+ "devDependencies": {
82
+ "@testing-library/react": "^16.1.0",
83
+ "@types/node": "^20.0.0",
84
+ "@types/react": "^18.3.0",
85
+ "@types/react-dom": "^18.3.0",
86
+ "jsdom": "^25.0.0",
87
+ "react": "^18.3.1",
88
+ "react-dom": "^18.3.1",
89
+ "typescript": "^6.0.3",
90
+ "vitest": "^4.1.5"
91
+ },
92
+ "keywords": [
93
+ "certrev",
94
+ "certification",
95
+ "react",
96
+ "server-components",
97
+ "hydrogen",
98
+ "shopify",
99
+ "json-ld",
100
+ "schema-org",
101
+ "web-component",
102
+ "ed25519",
103
+ "ssr"
104
+ ],
105
+ "license": "MIT",
106
+ "scripts": {
107
+ "build": "tsc && pnpm build:modal-bundle",
108
+ "build:modal-bundle": "pnpm dlx esbuild@0.27.7 src/modal/certrev-cert.entry.ts --bundle --minify --target=es2020 --format=iife --legal-comments=none --tsconfig-raw='{\"compilerOptions\":{\"target\":\"ES2017\",\"module\":\"esnext\",\"strict\":true}}' --banner:js='/* biome-ignore-all format: generated cert-badge bundle, see @certrev/cert-block src/modal/ */ /* biome-ignore-all lint: generated cert-badge bundle, see @certrev/cert-block src/modal/ */' --outfile=dist/modal/certrev-cert.js",
109
+ "refresh:reader": "node scripts/refresh-reader.mjs",
110
+ "typecheck": "tsc --noEmit",
111
+ "test": "vitest run"
112
+ }
113
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The reader stylesheet as the Builder card inlines it (1.2.0): `READER_CSS` without its remote `@font-face` rules.
3
+ *
4
+ * The portal's reader CSS loads its faces from `https://assets.certrev.com/fonts/…`. A storefront whose CSP
5
+ * `font-src` does not name that origin (e.l.f.'s live policy names `'self' data:` and a list of font CDNs, no
6
+ * CertREV origin) refuses each load and logs a violation, and the text falls back anyway. So the card ships only the
7
+ * `local()` fallback faces (Arial or Times New Roman under each family's metric overrides), which need no CSP at all:
8
+ * the face looks the same as it does on a page that blocks the remote fonts, with nothing refused. The portal and the
9
+ * Shopify reader keep `READER_CSS` unchanged.
10
+ *
11
+ * INTERNAL: not on the package `exports` map.
12
+ */
13
+
14
+ import { READER_CSS } from '../reader/reader-css.generated.js'
15
+
16
+ /** One `@font-face { … }` rule whose body has a `url(`; the reader CSS has no nested braces inside a face rule. */
17
+ const REMOTE_FONT_FACE = /@font-face\s*\{[^{}]*\burl\([^{}]*\}\s*/g
18
+
19
+ export const CARD_READER_CSS = READER_CSS.replace(REMOTE_FONT_FACE, '')