@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.
- package/CHANGELOG.md +110 -0
- package/README.md +50 -10
- package/dist/builder/card-beacon.d.ts +73 -0
- package/dist/builder/card-beacon.d.ts.map +1 -0
- package/dist/builder/card-beacon.js +178 -0
- package/dist/builder/card-beacon.js.map +1 -0
- package/dist/builder/card-contract.d.ts +10 -2
- package/dist/builder/card-contract.d.ts.map +1 -1
- package/dist/builder/card-contract.js +27 -3
- package/dist/builder/card-contract.js.map +1 -1
- package/dist/builder/card-placement.d.ts +45 -0
- package/dist/builder/card-placement.d.ts.map +1 -0
- package/dist/builder/card-placement.js +193 -0
- package/dist/builder/card-placement.js.map +1 -0
- package/dist/builder/card-report.d.ts +26 -14
- package/dist/builder/card-report.d.ts.map +1 -1
- package/dist/builder/card-report.js +68 -14
- package/dist/builder/card-report.js.map +1 -1
- package/dist/builder/cert-review-card.d.ts +6 -4
- package/dist/builder/cert-review-card.d.ts.map +1 -1
- package/dist/builder/cert-review-card.js +172 -199
- package/dist/builder/cert-review-card.js.map +1 -1
- package/dist/builder/contract-card.d.ts +18 -1
- package/dist/builder/contract-card.d.ts.map +1 -1
- package/dist/builder/contract-card.js +60 -10
- package/dist/builder/contract-card.js.map +1 -1
- package/dist/builder/delivery-runtime.d.ts +38 -4
- package/dist/builder/delivery-runtime.d.ts.map +1 -1
- package/dist/builder/delivery-runtime.js +43 -5
- package/dist/builder/delivery-runtime.js.map +1 -1
- package/dist/builder/index.d.ts +4 -4
- package/dist/builder/index.js +4 -4
- package/dist/builder/ssr-seed.d.ts +5 -4
- package/dist/builder/ssr-seed.d.ts.map +1 -1
- package/dist/builder/ssr-seed.js +4 -3
- package/dist/builder/ssr-seed.js.map +1 -1
- package/dist/builder/version.d.ts +3 -0
- package/dist/builder/version.d.ts.map +1 -0
- package/dist/builder/version.js +3 -0
- package/dist/builder/version.js.map +1 -0
- package/dist/verify/cache.d.ts +24 -0
- package/dist/verify/cache.d.ts.map +1 -1
- package/dist/verify/cache.js +78 -6
- package/dist/verify/cache.js.map +1 -1
- package/dist/verify/get-verified-delivery.d.ts +18 -0
- package/dist/verify/get-verified-delivery.d.ts.map +1 -1
- package/dist/verify/get-verified-delivery.js +30 -3
- package/dist/verify/get-verified-delivery.js.map +1 -1
- package/package.json +1 -1
- package/src/builder/card-beacon.ts +201 -0
- package/src/builder/card-contract.ts +25 -3
- package/src/builder/card-placement.ts +208 -0
- package/src/builder/card-report.ts +79 -14
- package/src/builder/cert-review-card.tsx +208 -238
- package/src/builder/contract-card.tsx +65 -8
- package/src/builder/delivery-runtime.ts +45 -5
- package/src/builder/index.tsx +4 -4
- package/src/builder/ssr-seed.ts +5 -4
- package/src/builder/version.ts +2 -0
- package/src/verify/cache.ts +78 -6
- 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
|
|
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
|
|
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
|
|
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}`.
|
|
365
|
-
|
|
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
|
|
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.
|
|
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)
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAoB,MAAM,uBAAuB,CAAA;AAG5F,uCAAuC;AACvC,eAAO,MAAM,qBAAqB,IAAI,CAAA;AAEtC,uHAAuH;AACvH,eAAO,MAAM,eAAe,4CAA6C,CAAA;AACzE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAE3D,qCAAqC;AACrC,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAA;AAG1D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,yFAAyF;IACzF,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;IACrD,8GAA8G;IAC9G,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7E,QAAQ,CAAC,MAAM,EAAE;QAChB,gGAAgG;QAChG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;QACrB,0FAA0F;QAC1F,QAAQ,CAAC,OAAO,CAAC,EAAE;YAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAA;KACvE,CAAA;CACD;AAED,gGAAgG;AAChG,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACpB;AAQD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,aAAa,GAAG,IAAI,CAU/G;AAwBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAyBvE;AAED,2GAA2G;AAC3G,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAY9E;AAED,iGAAiG;AACjG,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACxC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAC5C;AAMD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAyB3D;AAED,iEAAiE;AACjE,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAChB,OAAO,CAQT;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAEtF;AAED,mHAAmH;AACnH,wBAAsB,SAAS,CAC9B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,YAAY,EAAE,CAUhF;AAMD,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAI3D;AAKD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,GAAG,IAAI,CAEvE;AAED,wHAAwH;AACxH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAG/F;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAazD;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAMrF"}
|
|
@@ -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)
|
|
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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"}
|