@certrev/cert-block 2.0.0 → 2.0.2

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 (61) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/README.md +50 -10
  3. package/dist/builder/card-beacon.d.ts +73 -0
  4. package/dist/builder/card-beacon.d.ts.map +1 -0
  5. package/dist/builder/card-beacon.js +178 -0
  6. package/dist/builder/card-beacon.js.map +1 -0
  7. package/dist/builder/card-contract.d.ts +10 -2
  8. package/dist/builder/card-contract.d.ts.map +1 -1
  9. package/dist/builder/card-contract.js +27 -3
  10. package/dist/builder/card-contract.js.map +1 -1
  11. package/dist/builder/card-placement.d.ts +45 -0
  12. package/dist/builder/card-placement.d.ts.map +1 -0
  13. package/dist/builder/card-placement.js +193 -0
  14. package/dist/builder/card-placement.js.map +1 -0
  15. package/dist/builder/card-report.d.ts +26 -14
  16. package/dist/builder/card-report.d.ts.map +1 -1
  17. package/dist/builder/card-report.js +68 -14
  18. package/dist/builder/card-report.js.map +1 -1
  19. package/dist/builder/cert-review-card.d.ts +6 -4
  20. package/dist/builder/cert-review-card.d.ts.map +1 -1
  21. package/dist/builder/cert-review-card.js +172 -199
  22. package/dist/builder/cert-review-card.js.map +1 -1
  23. package/dist/builder/contract-card.d.ts +18 -1
  24. package/dist/builder/contract-card.d.ts.map +1 -1
  25. package/dist/builder/contract-card.js +60 -10
  26. package/dist/builder/contract-card.js.map +1 -1
  27. package/dist/builder/delivery-runtime.d.ts +38 -4
  28. package/dist/builder/delivery-runtime.d.ts.map +1 -1
  29. package/dist/builder/delivery-runtime.js +43 -5
  30. package/dist/builder/delivery-runtime.js.map +1 -1
  31. package/dist/builder/index.d.ts +4 -4
  32. package/dist/builder/index.js +4 -4
  33. package/dist/builder/ssr-seed.d.ts +5 -4
  34. package/dist/builder/ssr-seed.d.ts.map +1 -1
  35. package/dist/builder/ssr-seed.js +4 -3
  36. package/dist/builder/ssr-seed.js.map +1 -1
  37. package/dist/builder/version.d.ts +3 -0
  38. package/dist/builder/version.d.ts.map +1 -0
  39. package/dist/builder/version.js +3 -0
  40. package/dist/builder/version.js.map +1 -0
  41. package/dist/verify/cache.d.ts +24 -0
  42. package/dist/verify/cache.d.ts.map +1 -1
  43. package/dist/verify/cache.js +78 -6
  44. package/dist/verify/cache.js.map +1 -1
  45. package/dist/verify/get-verified-delivery.d.ts +18 -0
  46. package/dist/verify/get-verified-delivery.d.ts.map +1 -1
  47. package/dist/verify/get-verified-delivery.js +30 -3
  48. package/dist/verify/get-verified-delivery.js.map +1 -1
  49. package/package.json +1 -1
  50. package/src/builder/card-beacon.ts +201 -0
  51. package/src/builder/card-contract.ts +25 -3
  52. package/src/builder/card-placement.ts +208 -0
  53. package/src/builder/card-report.ts +79 -14
  54. package/src/builder/cert-review-card.tsx +208 -238
  55. package/src/builder/contract-card.tsx +65 -8
  56. package/src/builder/delivery-runtime.ts +45 -5
  57. package/src/builder/index.tsx +4 -4
  58. package/src/builder/ssr-seed.ts +5 -4
  59. package/src/builder/version.ts +2 -0
  60. package/src/verify/cache.ts +78 -6
  61. package/src/verify/get-verified-delivery.ts +40 -3
package/CHANGELOG.md CHANGED
@@ -5,6 +5,116 @@ change the rendered cert output and never break a compiling integration** (regis
5
5
  exports, types). Anything that would alter what a visitor sees, or require integration changes,
6
6
  is announced loudly here first.
7
7
 
8
+ ## 2.0.2 · 2026-10-29
9
+
10
+ **A CertREV outage never slows a brand's page by more than a fraction of a second.** A drop-in on 2.0.1: same package,
11
+ same `certRevCertComponent` and registration (`CertREV Cert`, the same 22 inputs), no new prop, no new peer dependency,
12
+ the same four Content-Security-Policy sources, the same records, reports and beacons. Only how long a server render
13
+ waits for CertREV changes. In 2.0.1 a cold placement's server render waited for the Delivery read up to 8 s, every
14
+ concurrent request on that placement waited with it, and a failure was remembered 5 s, so a CertREV that accepted
15
+ connections and never answered held a brand's HTML up to 8 s, again every 5 s.
16
+
17
+ - **A server render waits at most 300 ms** (`CARD_SERVER_WAIT_MS`) for a placement's read. Past it the block prints
18
+ nothing, as for any read that did not reach CertREV (`delivery_unreachable`), and the page goes out. The read itself
19
+ runs on (its own deadline stays 8 s): when it lands it is cached, and the next render paints the card. Why 300 ms:
20
+ over the 30 days to 2026-10-29, CertREV's production Delivery and card routes ran 21,368 function invocations (the
21
+ CDN misses; a cached edge answer runs none and took about 40-50 ms of server time when probed). Their durations:
22
+ p50 127 ms, p75 149 ms, p90 221 ms, p95 355 ms, p99 1,120 ms; 91.1% within 250 ms, 93.0% within 300 ms, 96.5%
23
+ within 400 ms, 97.8% within 500 ms. 300 ms holds a cached answer and a p90 miss with its round trip; waiting for
24
+ the p99 would cost over a second, which is the delay this release removes. A slower read is not lost, only not
25
+ waited for.
26
+ - **A failure is remembered 60 s** (`CARD_DELIVERY_FAILURE_MS`) per placement and process: a timeout (the render's
27
+ 300 ms or the read's 8 s), a network error, a 5xx, a body that is not JSON. Inside that window no read of the
28
+ placement starts and every render answers at once, so an ongoing outage costs at most one 300 ms wait per placement
29
+ per minute. CertREV's recovery shows on the first render after the window.
30
+ - **Concurrent requests never wait behind a read in flight.** A server render that finds a read of the placement
31
+ already running that it did not start (another request's, a background refresh) prints nothing at once and reports
32
+ nothing: it is not a failure. React gives a block no way to tell another request from a second block of the same
33
+ placement on its own page, so on a placement's cold read the second block (a split banner's memo, say) does not wait
34
+ either: it prints a hidden `data-certrev-skipped` marker and no record, hydrates as that marker, and right after
35
+ paints from the verified seed the first block printed, with no browser read. Every warm render prints both blocks,
36
+ as before.
37
+ - **A warm card never waits.** A verified card paints from the cache while it is fresh (30 s) and through its stale
38
+ window (30 s more), refreshed in the background, never on the render path. While a failure is remembered the stale
39
+ card keeps painting and no refresh starts; past the stale window it prints nothing, at once.
40
+ - **Revocation within ADR 0001 §7 is unchanged.** The fresh and stale windows are 2.0.1's; a definitive no (revoked,
41
+ expired, a 404 or 410, an envelope that does not verify) replaces the cached card when its refresh lands and is
42
+ never painted over; a remembered failure only ever prints nothing.
43
+ - `TtlCache` (exported) gains an optional `failureTtlMs` and a `markFailed(key, value)`. Without `failureTtlMs` it
44
+ behaves exactly as in 2.0.1.
45
+ - Browser reads (a client mount with `clientRead`) are unchanged: they never hold a page.
46
+ - The WordPress plugin and the hosted card runtime do not share this path: the hosted runtime only reads CertREV from
47
+ the browser, after the card is printed, and the WordPress plugin prints from the card stored on the post, refreshed
48
+ in the background.
49
+
50
+ ## 2.0.1 · 2026-10-25
51
+
52
+ **e.l.f.'s one install.** A drop-in on 2.0.0: same package, same `certRevCertComponent` and registration (`CertREV
53
+ Cert`, the same 22 inputs), no new prop, no new peer dependency, and the same four Content-Security-Policy sources (the
54
+ beacon below goes to the delivery origin `connect-src` already allows). Everything that can change later comes from
55
+ CertREV's server.
56
+
57
+ - **Nothing, never unsigned facts.** Every path that painted the block's export-time options (a reviewer name, a
58
+ credential, a memo, a verify link nobody signed) now prints **nothing** and reports why: a block with no delivery
59
+ marker (`no_marker`), a marker this client does not accept or a block with no Builder entry (`marker_invalid`),
60
+ CertREV not reached with no verified answer inside the stale window (`delivery_unreachable`, also for a page whose
61
+ 2.0.0 server wrote an `'options'` record), and a client mount with `clientRead={false}` and no server answer
62
+ (`client_read_off`). The signed paths are unchanged: a contract-1 card prints CertREV's document; an envelope with
63
+ no `contract` key paints the 1.3.x face from its SIGNED facts, as 2.0.0 did. The options-face renderer is gone; the
64
+ inputs stay registered (an entry that carries them still loads) and are not read.
65
+ - **A stale window inside the revocation SLA.** A verified answer is fresh for 30 s and may still paint for 30 s more
66
+ while it is refreshed or CertREV is down (2.0.0: 60 s and 300 s), so the card adds at most a minute to the Delivery
67
+ API's own cache and a revoked card is gone within ADR 0001 §7's five to six minutes (2.0.0 stacked to about twelve).
68
+ Past the window a read that cannot reach CertREV prints nothing; stale is never served indefinitely.
69
+ - **A beacon to CertREV** (`card-beacon.ts`). Each fallback, and one health event on one page view in a hundred, is a
70
+ `POST <delivery origin>/api/cert/v1/beacon` with a `text/plain` JSON body: `{v:1, client:'cert-block',
71
+ clientVersion, contract, platform:'builder', externalId, family, events:[{kind, reason, outcome}]}`. No cookies
72
+ (`credentials: 'omit'`), no page address or text, no user agent beyond a family (chromium, webkit, gecko, other,
73
+ server). At most three per page in the browser (`fetch`, `no-cors`, `keepalive`); on a server, each placement and
74
+ reason at most once an hour per process, with a 1.5 s deadline, never awaited. A beacon that fails is dropped; it
75
+ never changes what prints. The same shape serves the WordPress plugin 2.0.1 and the hosted runtime.
76
+ - **Forward compatible.** Unknown parts, unknown fields and new keys in known objects (how CertREV ships a minor change
77
+ under contract 1) are ignored and the card prints as before; a newer major (`contract` 2 or later in the signed
78
+ binding) prints nothing and reports `card_unsupported_contract` (beacon outcome `unsupported`); the page around it
79
+ always renders.
80
+ - **Placement hints** (`card-placement.ts`). After the page has loaded, the block moves each banner part to the place
81
+ `card.placement` names among the Builder entry's top-level blocks: `content-start` (after a leading image when
82
+ `after: 'leading-media'`), `after-byline` (an element marked `data-certrev-anchor="byline"`, else the first
83
+ `[rel~="author"]`, `[itemprop="author"]`, `.byline`, `[class*="byline"]` or `address`), `before-references` (else
84
+ `content-end`), `content-end`. An unknown anchor, `pinned`, or an anchor the page does not have leaves the part where
85
+ the editor put it; with JavaScript off every part is where the editor put it, and in Builder's visual editor and
86
+ preview nothing moves. A sidebar's rail and a floating pill never move. So CertREV can put the reviewer right after the byline and the memo at the end of the article with no
87
+ install.
88
+ - **The page's CertREV graph.** When the document carries `jsonld.graph` (a complete JSON-LD object CertREV's server
89
+ resolved for the placement: the Certification, its reviewer and CertREV, and the page's WebPage and Article; an
90
+ additive key under contract 1), the block that carries the page's assets prints it verbatim, once per page, as
91
+ `<script type="application/ld+json" data-certrev-graph data-certrev-external-id="<entry>">` (every `<` written as
92
+ `\u003c`). A document without it prints no graph. The block never builds or edits the graph; schema changes are the
93
+ server's. (1.x's rule that a page-builder block owns no structured data held while the block had to build the graph
94
+ itself; now it only prints the server's.)
95
+ - Dialogs are the document's own (`card.dialogs`): nothing in the package draws, styles or names them, so a redesign
96
+ of CertREV's profile and certificate dialogs needs no client change.
97
+ - **Nothing in the console.** Through 2.0.0, React's development build reported a hydration mismatch on every page with
98
+ a contract-1 card (the browser had already attached the card's shadow roots, which React expected as templates), and
99
+ in production every card React wrote itself (an in-app navigation, a re-render after the page's own hydration error)
100
+ drew Chrome's "Found declarative shadowrootmode attribute on a template, but declarative Shadow DOM is not being
101
+ parsed" warning once per template. The wrapper now skips React's hydration comparison (`suppressHydrationWarning`,
102
+ never printed), and in a browser that parses declarative roots the HTML React writes holds each template's mode
103
+ under `data-certrev-shadowrootmode` until the block re-parses the card's exact bytes, as before. The server's bytes
104
+ are unchanged.
105
+ - **A failed envelope is reported too.** An envelope that does not verify (a bad signature, an algorithm the client
106
+ does not accept, another platform, content that drifted from what was signed, a payload version it cannot read)
107
+ prints nothing, as before, and is now reported as `envelope_verify_failed` (beacon outcome `verify_failed`). Revoked,
108
+ expired, not found and another entry's envelope stay silent. When CertREV answers with an HTTP error, the
109
+ `delivery_unreachable` report carries `status` and the beacon says `http_5xx` or `http_4xx`. A beacon never sends the
110
+ page address (`referrerPolicy: 'no-referrer'`). Its three-per-page budget belongs to a document address, so an in-app
111
+ navigation starts a new one.
112
+ - **React 19 no longer rewrites the card.** React 19 rewrites an element's `innerHTML` whenever its
113
+ `dangerouslySetInnerHTML` is a new object (React 18 compared the strings), so on React 19 every re-render of a
114
+ contract-1 block, including the one right after hydration, replaced the card the browser had built (and left it to
115
+ the hosted runtime to attach the roots again). The block now keeps one object per printed string, so the server's
116
+ card nodes are the ones on the page after hydration, and it re-attaches any root after every commit before paint.
117
+
8
118
  ## 2.0.0 · 2026-10-21
9
119
 
10
120
  Major: **the contract-v1 Builder client. Install it once; from then on every visual, copy, layout, schema, fold and
package/README.md CHANGED
@@ -296,13 +296,14 @@ brand's render-def (accent / surface / corners / font + v2 bar-ink / body-ink).
296
296
  the card's design, copy, layout, schema, memo fold or dialogs ships from CertREV with no package release and no install
297
297
  on your side. The upgrade is two edits, made once:
298
298
 
299
- 1. `@certrev/cert-block` `^2.0.0`. Keep the registration line as it is: same import, same `certRevCertComponent`,
300
- same block name (`CertREV Cert`), same inputs, no new prop, no config.
299
+ 1. `@certrev/cert-block` `^2.0.1` (2.0.1 is a drop-in on 2.0.0: see "2.0.1" below). Keep the registration line as it
300
+ is: same import, same `certRevCertComponent`, same block name (`CertREV Cert`), same inputs, no new prop, no config.
301
301
  2. Four sources in the storefront's Content-Security-Policy, and nothing else from CertREV:
302
302
 
303
303
  ```
304
304
  script-src https://portal.certrev.com (the hosted card runtime: dialogs, revalidation)
305
- connect-src https://portal.certrev.com (the card's read after an in-app navigation; the runtime's revalidation)
305
+ connect-src https://portal.certrev.com (the card's read after an in-app navigation; the runtime's revalidation;
306
+ 2.0.1: the card's beacon)
306
307
  font-src https://assets.certrev.com (the card's fonts)
307
308
  img-src https://assets.certrev.com (reviewer photos)
308
309
  ```
@@ -342,7 +343,8 @@ page keeps one card when a brand changes its design. A sidebar card's float is l
342
343
  card print it again from the seed after re-checking it. A card the client mounts with no record on the page (an in-app
343
344
  navigation, Builder's editor) reads the Delivery API once (`clientRead`, on by default from 2.0.0; `clientRead={false}`
344
345
  restores 1.3.1's no-read behaviour), prints the card and attaches its roots (`setHTMLUnsafe`, else from each template),
345
- and loads the runtime once. A read your policy blocks paints the block's options face, as 1.3.1 did.
346
+ and loads the runtime once. A read your policy blocks prints nothing and reports `delivery_unreachable` (2.0.1; 2.0.0
347
+ painted the block's options face, as 1.3.1 did).
346
348
 
347
349
  **React 19 hosts and readers with JavaScript off.** React 19 streams a Suspense boundary larger than its
348
350
  `progressiveChunkSize` (12,800 bytes by default) after the page's shell, even when it is ready at once, and only a script
@@ -357,18 +359,53 @@ import { CARD_FALLBACK_EVENT, type CardFallbackDetail } from '@certrev/cert-bloc
357
359
 
358
360
  document.addEventListener(CARD_FALLBACK_EVENT, (e) => {
359
361
  const { reason, externalId, certId } = (e as CustomEvent<CardFallbackDetail>).detail
360
- // reason: card_missing | card_verify_failed | card_unsupported_contract | card_pin_mismatch | unknown_key | delivery_unreachable
362
+ // reason: card_missing | card_verify_failed | card_unsupported_contract | card_pin_mismatch | unknown_key
363
+ // | delivery_unreachable | no_marker | marker_invalid | client_read_off (the last three: 2.0.1)
361
364
  })
362
365
  ```
363
366
 
364
- once per placement and reason per page; on a server, one `console.warn` line `[certrev] card_fallback {json}`. The card
365
- itself sends nothing anywhere (no beacon, no storage, no cookie: its reads use `credentials: 'omit'`).
367
+ once per placement and reason per page; on a server, one `console.warn` line `[certrev] card_fallback {json}`. 2.0.1:
368
+ each report is also a beacon to CertREV (below); the card stores nothing and sends no cookie (`credentials: 'omit'`).
366
369
 
367
370
  **Key rotation needs no reinstall.** The baked kid (`cert-issuer-1`) verifies as before. An envelope signed by any
368
371
  other kid makes one read of `https://portal.certrev.com/api/cert/v1/keys`, a key set the card accepts only when the baked
369
372
  kid signs it (and it is not older than one already accepted, and still lists its signer). Otherwise the kid is unknown
370
373
  and the card renders nothing, as in 1.3.x.
371
374
 
375
+ ### 2.0.1: e.l.f.'s one install
376
+
377
+ A drop-in on 2.0.0 (same package, export, registration, inputs and CSP). What changes on a page:
378
+
379
+ - **Nothing, never unsigned facts.** A block with no delivery marker (`no_marker`), a marker this client does not
380
+ accept (`marker_invalid`), CertREV not reached with no verified answer inside the stale window
381
+ (`delivery_unreachable`), and a client mount with `clientRead={false}` (`client_read_off`) print **nothing** and
382
+ report it. Through 2.0.0 those painted the block's export-time options (a reviewer name, a credential, a memo, a
383
+ verify link that nobody signed); that face is gone. Every section below that still describes "the options face"
384
+ describes 1.x to 2.0.0; 2.0.1 prints nothing there. The signed paths are unchanged.
385
+ - **Stale window: 30 s fresh, 30 s stale** (2.0.0: 60 s and 300 s): with the Delivery API's own cache a revoked card is
386
+ gone within five to six minutes (ADR 0001 §7); past the window a read that cannot reach CertREV prints nothing.
387
+ - **A beacon to CertREV**: each fallback, and one health event on one page view in a hundred, as a `POST <delivery
388
+ origin>/api/cert/v1/beacon` `text/plain` JSON body `{v:1, client:'cert-block', clientVersion, contract,
389
+ platform:'builder', externalId, family, events:[{kind, reason, outcome}]}`. No cookies, no page address or text, no
390
+ user agent beyond a family. At most three per page; on a server, each placement and reason once an hour per process.
391
+ It goes to the delivery origin, already in `connect-src`: no new CSP source.
392
+ - **Forward compatible**: unknown parts, unknown fields and new keys under contract 1 are ignored; a newer major prints
393
+ nothing (`card_unsupported_contract`) and the page renders around it.
394
+ - **Placement hints**: once the page has loaded, each banner part moves to the place the document's `placement` names
395
+ among the Builder entry's top-level blocks: `content-start` (after a leading image with `after: 'leading-media'`),
396
+ `after-byline`, `before-references` (else `content-end`), `content-end`. Mark your byline with
397
+ `data-certrev-anchor="byline"` to make `after-byline` exact; otherwise the first `[rel~="author"]`,
398
+ `[itemprop="author"]`, `.byline`, `[class*="byline"]` or `address` in the entry is taken. An anchor the page lacks,
399
+ or one this client does not know, leaves the part where the editor put it, as JavaScript off and Builder's visual
400
+ editor and preview do. Rails and pills never move.
401
+ - **Nothing in the console**: no hydration mismatch in React's development build, and no "declarative Shadow DOM is
402
+ not being parsed" warning when React writes the card itself (an in-app navigation). The server's bytes are
403
+ unchanged.
404
+ - **The page's CertREV graph**: when the document carries `jsonld.graph` (resolved by CertREV's server for the
405
+ placement), the block that carries the page's assets prints it once as `<script type="application/ld+json"
406
+ data-certrev-graph>`; without it, no graph. The block never builds the graph (the "card emits no structured data" rule
407
+ below describes 1.x's own face).
408
+
372
409
  ### The reader face (1.2.0, opt-in)
373
410
 
374
411
  certrev.com's "reader" design (a banner card plus the expert memo, a sidebar card, a floating pill) is a
@@ -481,7 +518,7 @@ browser hydrates from it:
481
518
  - **Where the server had no envelope to paint, it writes what it painted instead**, in the same attribute: a
482
519
  record `{ v: 1, baseUrl, externalId, design?, face }` with no payload, no signature and no def. The browser keeps
483
520
  that face through hydration and any later render of the same placement, and reads nothing:
484
- - **CertREV not reached** (a 5xx, a body that is not an envelope, a network error, the 8 s deadline): the
521
+ - **CertREV not reached** (a 5xx, a body that is not an envelope, a network error, the deadline; 2.0.2: the server's 300 ms wait): the
485
522
  block's own options face, the card 0.5.x and 1.0.x painted from the same fields, with `face: "options"`. Its
486
523
  placement is the block's `mode`, else its def's `layout`, else the banner. A page never loses its card to an
487
524
  outage. A pinned card (below) paints it too, with a record naming its pin. A block whose options cannot
@@ -530,7 +567,10 @@ browser hydrates from it:
530
567
  - **The server's read** waits up to 8 s (the verifier's own default stays 3 s). Its cache keeps a certificate for
531
568
  60 s, then serves it for up to 5 minutes more while one background refresh runs or while CertREV cannot be
532
569
  reached; a refusal (revoked, expired) lands as soon as its refresh does. A cold placement waits once; a warm one
533
- never waits.
570
+ never waits. **2.0.2:** a server render waits at most 300 ms for a cold read (the read itself runs on, up to 8 s,
571
+ and is cached when it lands), never waits behind another request's read of the same placement, and a failure is
572
+ remembered 60 s per placement and process, so a hanging CertREV costs a page at most one 300 ms wait per placement
573
+ per minute. 2.0.1 already keeps a certificate 30 s, and 30 s more while it is refreshed (see the CHANGELOG).
534
574
  - **A reviewer photo the browser cannot load** (a CSP `img-src` without the photo's origin, a 404) is repainted as
535
575
  the person's initials, the same bytes the face paints for a hidden photo (below), with no request and no change to
536
576
  the record.
@@ -986,7 +1026,7 @@ published at `@certrev/cert-block/fixtures`).
986
1026
 
987
1027
  ## Version
988
1028
 
989
- `2.0.0`: see [CHANGELOG.md](./CHANGELOG.md) for the release history and the semver contract
1029
+ `2.0.2`: see [CHANGELOG.md](./CHANGELOG.md) for the release history and the semver contract
990
1030
  (patch/minor never change the rendered cert output or break a compiling integration). Publishes
991
1031
  **publicly** to npm as `@certrev/cert-block` (`publishConfig.access: public`) via GitHub Actions
992
1032
  trusted publishing (OIDC); the internal `@certrev` GitHub-Packages channel mirrors it.
@@ -0,0 +1,73 @@
1
+ /**
2
+ * The Builder card's beacon (2.0.1): what the card tells CertREV about itself, so a card that does not print on a brand's
3
+ * page is seen by CertREV and not only by the brand's console.
4
+ *
5
+ * One `POST <delivery origin>/api/cert/v1/beacon` per event, a `text/plain` JSON body (a CORS simple request, so no
6
+ * preflight; the origin is the delivery origin the page's `connect-src` already allows, so no new CSP source):
7
+ *
8
+ * { v: 1, client: 'cert-block', clientVersion, contract, platform: 'builder', externalId, family,
9
+ * events: [{ kind: 'fallback' | 'health', reason, outcome, status? }] }
10
+ *
11
+ * What it never carries: cookies (`credentials: 'omit'`), the page's address (`referrerPolicy: 'no-referrer'`) or text, the reader's user agent (only a
12
+ * coarse family: chromium, webkit, gecko, other, or server), or anything the reader typed. `externalId` is the Builder
13
+ * entry the block renders in, which the brand's page already sends to CertREV when it reads the card.
14
+ *
15
+ * How much: in a browser, every fallback (each placement and reason once per page, `card-report.ts`) and one health
16
+ * event per page in a hundred, at most three beacons per page (a page is a document address: an in-app navigation to
17
+ * another article starts a new budget); on a server, each placement, reason and origin at most
18
+ * once an hour per process, with a short deadline, never awaited. A beacon that fails is dropped: it never retries,
19
+ * never stores anything and never changes what the card prints.
20
+ */
21
+ export declare const BEACON_PATH = "/api/cert/v1/beacon";
22
+ /** Where a block with no accepted delivery marker reports: CertREV's production delivery origin. */
23
+ export declare const DEFAULT_BEACON_ORIGIN = "https://portal.certrev.com";
24
+ /** The most beacons one page sends. */
25
+ export declare const BEACON_MAX_PER_PAGE = 3;
26
+ /** The share of page views that send one health event. */
27
+ export declare const BEACON_HEALTH_SAMPLE = 0.01;
28
+ /** A server sends one beacon per placement, reason and origin at most this often. */
29
+ export declare const BEACON_SERVER_INTERVAL_MS = 3600000;
30
+ export type BeaconOutcome = 'ok' | 'unreachable' | 'http_4xx' | 'http_5xx' | 'verify_failed' | 'unsupported' | 'other';
31
+ export type BeaconFamily = 'chromium' | 'webkit' | 'gecko' | 'server' | 'other';
32
+ export interface BeaconEvent {
33
+ readonly kind: 'fallback' | 'health';
34
+ readonly reason: string;
35
+ readonly outcome: BeaconOutcome;
36
+ /** The HTTP status CertREV answered with, when a read failed on one (outcome `http_4xx` or `http_5xx`). */
37
+ readonly status?: number;
38
+ }
39
+ export interface CardBeacon {
40
+ readonly v: 1;
41
+ readonly client: 'cert-block';
42
+ readonly clientVersion: string;
43
+ readonly contract: number;
44
+ readonly platform: 'builder';
45
+ readonly externalId?: string;
46
+ readonly family: BeaconFamily;
47
+ readonly events: readonly BeaconEvent[];
48
+ }
49
+ /** How a beacon leaves: `url`, the JSON body, and where it is sent from. */
50
+ export type BeaconTransport = (url: string, body: string, where: 'browser' | 'server') => void;
51
+ /** The transport the card ships with: `fetch`, never awaited, never throwing (exported for CertREV's replica harness). */
52
+ export declare const fetchBeaconTransport: BeaconTransport;
53
+ /** The coarse browser family, from the user agent; nothing else of it is kept. */
54
+ export declare function browserFamily(userAgent: string): BeaconFamily;
55
+ export declare function beaconBody(externalId: string, events: readonly BeaconEvent[], family: BeaconFamily): CardBeacon;
56
+ /** Send one event from the browser, within the page's budget. */
57
+ export declare function sendBrowserBeacon(baseUrl: string | undefined, externalId: string, event: BeaconEvent): void;
58
+ /** Send one health event from the browser on one page view in a hundred (drawn once per page). */
59
+ export declare function maybeSendBrowserHealth(baseUrl: string | undefined, externalId: string): void;
60
+ /** Send one event from a server: each placement, reason and origin at most once an hour per process. */
61
+ export declare function sendServerBeacon(baseUrl: string | undefined, externalId: string, event: BeaconEvent): void;
62
+ /**
63
+ * Test seam: replace the transport (and the sampling draw and clock) and forget the page's and the process's budget.
64
+ * Returns a restore.
65
+ */
66
+ export declare function setCardBeaconForTests(overrides?: {
67
+ transport?: BeaconTransport;
68
+ random?: () => number;
69
+ now?: () => number;
70
+ }): () => void;
71
+ /** Test seam: a new page and a new process. */
72
+ export declare function forgetCardBeaconsForTests(): void;
73
+ //# sourceMappingURL=card-beacon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-beacon.d.ts","sourceRoot":"","sources":["../../src/builder/card-beacon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,eAAO,MAAM,WAAW,wBAAwB,CAAA;AAChD,oGAAoG;AACpG,eAAO,MAAM,qBAAqB,+BAA+B,CAAA;AACjE,uCAAuC;AACvC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,0DAA0D;AAC1D,eAAO,MAAM,oBAAoB,OAAO,CAAA;AACxC,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,UAAY,CAAA;AAIlD,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,eAAe,GAAG,aAAa,GAAG,OAAO,CAAA;AACtH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE/E,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAA;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,2GAA2G;IAC3G,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAA;IACb,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAA;CACvC;AAED,4EAA4E;AAC5E,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,QAAQ,KAAK,IAAI,CAAA;AAE9F,0HAA0H;AAC1H,eAAO,MAAM,oBAAoB,EAAE,eAsBlC,CAAA;AAoBD,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAK7D;AAeD,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,UAAU,CAW/G;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAQ3G;AAED,kGAAkG;AAClG,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAO5F;AAED,wGAAwG;AACxG,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAa1G;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,SAAS,GAAE;IAAE,SAAS,CAAC,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GACxF,MAAM,IAAI,CAWZ;AAED,+CAA+C;AAC/C,wBAAgB,yBAAyB,IAAI,IAAI,CAKhD"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * The Builder card's beacon (2.0.1): what the card tells CertREV about itself, so a card that does not print on a brand's
3
+ * page is seen by CertREV and not only by the brand's console.
4
+ *
5
+ * One `POST <delivery origin>/api/cert/v1/beacon` per event, a `text/plain` JSON body (a CORS simple request, so no
6
+ * preflight; the origin is the delivery origin the page's `connect-src` already allows, so no new CSP source):
7
+ *
8
+ * { v: 1, client: 'cert-block', clientVersion, contract, platform: 'builder', externalId, family,
9
+ * events: [{ kind: 'fallback' | 'health', reason, outcome, status? }] }
10
+ *
11
+ * What it never carries: cookies (`credentials: 'omit'`), the page's address (`referrerPolicy: 'no-referrer'`) or text, the reader's user agent (only a
12
+ * coarse family: chromium, webkit, gecko, other, or server), or anything the reader typed. `externalId` is the Builder
13
+ * entry the block renders in, which the brand's page already sends to CertREV when it reads the card.
14
+ *
15
+ * How much: in a browser, every fallback (each placement and reason once per page, `card-report.ts`) and one health
16
+ * event per page in a hundred, at most three beacons per page (a page is a document address: an in-app navigation to
17
+ * another article starts a new budget); on a server, each placement, reason and origin at most
18
+ * once an hour per process, with a short deadline, never awaited. A beacon that fails is dropped: it never retries,
19
+ * never stores anything and never changes what the card prints.
20
+ */
21
+ import { CARD_CONTRACT_VERSION } from './card-contract.js';
22
+ import { CERT_BLOCK_VERSION } from './version.js';
23
+ export const BEACON_PATH = '/api/cert/v1/beacon';
24
+ /** Where a block with no accepted delivery marker reports: CertREV's production delivery origin. */
25
+ export const DEFAULT_BEACON_ORIGIN = 'https://portal.certrev.com';
26
+ /** The most beacons one page sends. */
27
+ export const BEACON_MAX_PER_PAGE = 3;
28
+ /** The share of page views that send one health event. */
29
+ export const BEACON_HEALTH_SAMPLE = 0.01;
30
+ /** A server sends one beacon per placement, reason and origin at most this often. */
31
+ export const BEACON_SERVER_INTERVAL_MS = 3_600_000;
32
+ const SERVER_MAX_KEYS = 500;
33
+ const SERVER_TIMEOUT_MS = 1_500;
34
+ /** The transport the card ships with: `fetch`, never awaited, never throwing (exported for CertREV's replica harness). */
35
+ export const fetchBeaconTransport = (url, body, where) => {
36
+ try {
37
+ const send = globalThis.fetch;
38
+ if (typeof send !== 'function')
39
+ return;
40
+ const init = {
41
+ method: 'POST',
42
+ body,
43
+ headers: { 'content-type': 'text/plain;charset=UTF-8' },
44
+ credentials: 'omit',
45
+ // Never the reader's page address, whatever the storefront's Referrer-Policy.
46
+ referrerPolicy: 'no-referrer',
47
+ ...(where === 'browser'
48
+ ? // Opaque and kept alive: no CORS read of the answer, and it outlives a navigation away.
49
+ { mode: 'no-cors', keepalive: true }
50
+ : typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function'
51
+ ? { signal: AbortSignal.timeout(SERVER_TIMEOUT_MS) }
52
+ : {}),
53
+ };
54
+ void send(url, init).catch(() => { });
55
+ }
56
+ catch {
57
+ // A beacon never throws into a render.
58
+ }
59
+ };
60
+ let transport = fetchBeaconTransport;
61
+ let sentOnPage = 0;
62
+ let healthDrawn = null;
63
+ /** The document address the page budget belongs to. */
64
+ let budgetPage = null;
65
+ /** Start a new page budget when the document's address changed (an in-app navigation). */
66
+ function samePageBudget() {
67
+ const page = typeof location !== 'undefined' ? `${location.pathname}${location.search}` : '';
68
+ if (page === budgetPage)
69
+ return;
70
+ budgetPage = page;
71
+ sentOnPage = 0;
72
+ healthDrawn = null;
73
+ }
74
+ const sentOnServer = new Map();
75
+ let random = Math.random;
76
+ let clock = Date.now;
77
+ /** The coarse browser family, from the user agent; nothing else of it is kept. */
78
+ export function browserFamily(userAgent) {
79
+ if (/Firefox\//.test(userAgent))
80
+ return 'gecko';
81
+ if (/(Chrome|Chromium|CriOS|Edg)\//.test(userAgent))
82
+ return 'chromium';
83
+ if (/AppleWebKit\//.test(userAgent))
84
+ return 'webkit';
85
+ return 'other';
86
+ }
87
+ /** The delivery origin a beacon goes to: an `https:` origin on certrev.com, else CertREV's production origin. */
88
+ function beaconOrigin(baseUrl) {
89
+ if (!baseUrl)
90
+ return DEFAULT_BEACON_ORIGIN;
91
+ try {
92
+ const url = new URL(baseUrl);
93
+ const host = url.hostname;
94
+ if (url.protocol === 'https:' && (host === 'certrev.com' || host.endsWith('.certrev.com')))
95
+ return url.origin;
96
+ }
97
+ catch {
98
+ // Fall through.
99
+ }
100
+ return DEFAULT_BEACON_ORIGIN;
101
+ }
102
+ export function beaconBody(externalId, events, family) {
103
+ return {
104
+ v: 1,
105
+ client: 'cert-block',
106
+ clientVersion: CERT_BLOCK_VERSION,
107
+ contract: CARD_CONTRACT_VERSION,
108
+ platform: 'builder',
109
+ ...(externalId ? { externalId } : {}),
110
+ family,
111
+ events,
112
+ };
113
+ }
114
+ /** Send one event from the browser, within the page's budget. */
115
+ export function sendBrowserBeacon(baseUrl, externalId, event) {
116
+ if (typeof document === 'undefined')
117
+ return;
118
+ samePageBudget();
119
+ if (sentOnPage >= BEACON_MAX_PER_PAGE)
120
+ return;
121
+ sentOnPage++;
122
+ const userAgent = typeof navigator !== 'undefined' ? String(navigator.userAgent ?? '') : '';
123
+ const body = beaconBody(externalId, [event], browserFamily(userAgent));
124
+ transport(`${beaconOrigin(baseUrl)}${BEACON_PATH}`, JSON.stringify(body), 'browser');
125
+ }
126
+ /** Send one health event from the browser on one page view in a hundred (drawn once per page). */
127
+ export function maybeSendBrowserHealth(baseUrl, externalId) {
128
+ if (typeof document === 'undefined')
129
+ return;
130
+ samePageBudget();
131
+ if (healthDrawn === null)
132
+ healthDrawn = random() < BEACON_HEALTH_SAMPLE;
133
+ if (!healthDrawn)
134
+ return;
135
+ healthDrawn = false;
136
+ sendBrowserBeacon(baseUrl, externalId, { kind: 'health', reason: 'card_printed', outcome: 'ok' });
137
+ }
138
+ /** Send one event from a server: each placement, reason and origin at most once an hour per process. */
139
+ export function sendServerBeacon(baseUrl, externalId, event) {
140
+ const origin = beaconOrigin(baseUrl);
141
+ const key = `${origin}|${externalId}|${event.kind}|${event.reason}`;
142
+ const now = clock();
143
+ const last = sentOnServer.get(key);
144
+ if (last !== undefined && now - last < BEACON_SERVER_INTERVAL_MS)
145
+ return;
146
+ sentOnServer.delete(key);
147
+ if (sentOnServer.size >= SERVER_MAX_KEYS) {
148
+ const oldest = sentOnServer.keys().next().value;
149
+ if (oldest !== undefined)
150
+ sentOnServer.delete(oldest);
151
+ }
152
+ sentOnServer.set(key, now);
153
+ transport(`${origin}${BEACON_PATH}`, JSON.stringify(beaconBody(externalId, [event], 'server')), 'server');
154
+ }
155
+ /**
156
+ * Test seam: replace the transport (and the sampling draw and clock) and forget the page's and the process's budget.
157
+ * Returns a restore.
158
+ */
159
+ export function setCardBeaconForTests(overrides = {}) {
160
+ const previous = { transport, random, clock };
161
+ transport = overrides.transport ?? (() => { });
162
+ random = overrides.random ?? (() => 1);
163
+ clock = overrides.now ?? Date.now;
164
+ forgetCardBeaconsForTests();
165
+ return () => {
166
+ transport = previous.transport;
167
+ random = previous.random;
168
+ clock = previous.clock;
169
+ };
170
+ }
171
+ /** Test seam: a new page and a new process. */
172
+ export function forgetCardBeaconsForTests() {
173
+ sentOnPage = 0;
174
+ healthDrawn = null;
175
+ budgetPage = null;
176
+ sentOnServer.clear();
177
+ }
178
+ //# sourceMappingURL=card-beacon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-beacon.js","sourceRoot":"","sources":["../../src/builder/card-beacon.ts"],"names":[],"mappings":"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"}
@@ -132,10 +132,18 @@ export declare function cardRuntimeTag(card: CardDocumentV1): string;
132
132
  export declare function cardFirstPart(card: CardDocumentV1): CardPartName | null;
133
133
  /** Whether the block printing `names` prints the page's head fragment, dialogs and runtime: it holds the first part. */
134
134
  export declare function cardCarriesAssets(card: CardDocumentV1, names: readonly CardPartName[]): boolean;
135
+ /**
136
+ * 2.0.1: the page's CertREV graph, when the document carries one CertREV's server resolved for this placement
137
+ * (`card.jsonld.graph`: a complete JSON-LD object, every link and page fact filled in, an additive key under contract
138
+ * 1). Printed verbatim as `<script type="application/ld+json" data-certrev-graph ...>`, with every `<` written as
139
+ * `\u003c` so no value can close the element; '' when the document has no graph. The block never builds or edits the
140
+ * graph: what it says, and when it changes, is the server's.
141
+ */
142
+ export declare function cardGraphTag(card: CardDocumentV1): string;
135
143
  /**
136
144
  * Exactly what a block prints inside its wrapper: its parts in page order and, only in the block holding the document's
137
- * first part (`cardCarriesAssets`), the head fragment before them and both dialogs (expert, then certificate) and the
138
- * runtime's tag after. So a split banner (a header block and a memo block) prints the head, the dialogs and the runtime
145
+ * first part (`cardCarriesAssets`), the head fragment before them and both dialogs (expert, then certificate), the
146
+ * runtime's tag and (2.0.1) the page's graph after. So a split banner (a header block and a memo block) prints the head, the dialogs and the runtime
139
147
  * once, in the header block, with no coordination between the blocks and with JavaScript off; the runtime finds a
140
148
  * control's dialog anywhere on the page by its placement. Every byte but the runtime tag is the document's own.
141
149
  */
@@ -1 +1 @@
1
- {"version":3,"file":"card-contract.d.ts","sourceRoot":"","sources":["../../src/builder/card-contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"card-contract.d.ts","sourceRoot":"","sources":["../../src/builder/card-contract.ts"],"names":[],"mappings":"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"}
@@ -243,10 +243,34 @@ export function cardCarriesAssets(card, names) {
243
243
  const first = cardFirstPart(card);
244
244
  return first !== null && names.includes(first);
245
245
  }
246
+ /**
247
+ * 2.0.1: the page's CertREV graph, when the document carries one CertREV's server resolved for this placement
248
+ * (`card.jsonld.graph`: a complete JSON-LD object, every link and page fact filled in, an additive key under contract
249
+ * 1). Printed verbatim as `<script type="application/ld+json" data-certrev-graph ...>`, with every `<` written as
250
+ * `\u003c` so no value can close the element; '' when the document has no graph. The block never builds or edits the
251
+ * graph: what it says, and when it changes, is the server's.
252
+ */
253
+ export function cardGraphTag(card) {
254
+ const jsonld = card.jsonld;
255
+ if (typeof jsonld !== 'object' || jsonld === null)
256
+ return '';
257
+ const graph = jsonld.graph;
258
+ if (typeof graph !== 'object' || graph === null || Array.isArray(graph))
259
+ return '';
260
+ let json;
261
+ try {
262
+ json = JSON.stringify(graph);
263
+ }
264
+ catch {
265
+ return '';
266
+ }
267
+ const id = escapeAttribute(card.subject.externalId);
268
+ return `<script type="application/ld+json" data-certrev-graph="" data-certrev-platform="builder" data-certrev-external-id="${id}">${json.replace(/</g, '\\u003c')}</script>`;
269
+ }
246
270
  /**
247
271
  * Exactly what a block prints inside its wrapper: its parts in page order and, only in the block holding the document's
248
- * first part (`cardCarriesAssets`), the head fragment before them and both dialogs (expert, then certificate) and the
249
- * runtime's tag after. So a split banner (a header block and a memo block) prints the head, the dialogs and the runtime
272
+ * first part (`cardCarriesAssets`), the head fragment before them and both dialogs (expert, then certificate), the
273
+ * runtime's tag and (2.0.1) the page's graph after. So a split banner (a header block and a memo block) prints the head, the dialogs and the runtime
250
274
  * once, in the header block, with no coordination between the blocks and with JavaScript off; the runtime finds a
251
275
  * control's dialog anywhere on the page by its placement. Every byte but the runtime tag is the document's own.
252
276
  */
@@ -257,6 +281,6 @@ export function cardHtml(card, names) {
257
281
  if (!cardCarriesAssets(card, names))
258
282
  return parts;
259
283
  const dialogs = (card.dialogs.expert ?? '') + (card.dialogs.certificate ?? '');
260
- return card.assets.head + parts + dialogs + cardRuntimeTag(card);
284
+ return card.assets.head + parts + dialogs + cardRuntimeTag(card) + cardGraphTag(card);
261
285
  }
262
286
  //# sourceMappingURL=card-contract.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"card-contract.js","sourceRoot":"","sources":["../../src/builder/card-contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"card-contract.js","sourceRoot":"","sources":["../../src/builder/card-contract.ts"],"names":[],"mappings":"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"}