Skip to main content

Variable: IdentifierPreview

const IdentifierPreview: TObject<{ document: TString; documentDigest: TWith<TString, { description: "SHA-256 of the UTF-8 bytes of `document`, in lowercase hex. It is what the preview records on the identifier as `previewedDigest`."; }>; identifier: TObject<{ assertionKeyId: TOptional<TWith<TString, { description: "The key credentials are signed with: the RFC 7638 thumbprint of its public key. Absent while `placing`. An update replaces it."; }>>; createdAt: TWith<TString, { description: "When the identifier was created."; }>; createdBy: TWith<TString, { description: "Who created it: a subject id, never a name."; }>; did: TOptional<TWith<TString, { description: "The DID. Absent while `placing`. For `webvh` it is also absent until the first version is published, because the DID is derived from the first log entry and there is none yet; the preview shows the placeholder in its place."; }>>; failureReason: TOptional<TWith<TUnsafe<"document-mismatch" | "agent-refused" | "other">, { description: "Why it failed, present when `status` is `failed` and only then. `document-mismatch`: what was signed was not what was previewed, so nothing was written. `agent-refused`: the keys could not be generated or used. `other`: anything else. In every case create a new identifier."; }>>; history: TBoolean; host: TWith<TString, { description: "The host the identifier is served on: the organization's own publisher host, `<slug>.identity.<domain>`, or the delegated host named at creation."; }>; id: TWith<TString, { description: "The identifier. The `{id}` of the read, preview, publish and update routes."; }>; method: TWith<TUnsafe<"webvh" | "web">, { description: "The DID method, chosen at creation and never changed. `webvh`: a signed, append-only log, so every change can be verified against the one before it. `web`: one replaceable document with no history, so a key change cannot be told from a substitution and whoever controls the domain can replace it."; }>; nextUpdateKeyId: TOptional<TWith<TString, { description: "The update key committed to in advance (pre-rotation), as a thumbprint: the log already carries its hash, so a lost update key does not freeze the identifier. Present while a version waits to be published, as the key that version commits to; once it is published that key is `updateKeyId`, and this is absent until an update begins. Absent for `did:web`."; }>>; organizationId: TWith<TString, { description: "The organization the identifier belongs to: its subject id."; }>; path: TWith<TString, { description: "The organization's path when the identifier was created."; }>; pendingDiscardKeyIds: TOptional<TArray<TString>>; previewedAt: TOptional<TWith<TString, { description: "When the document was last previewed. A render after the preview leaves this in place, so it alone does not say the current document was seen: compare `previewedDigest`."; }>>; previewedBy: TOptional<TWith<TString, { description: "Who last previewed it: a subject id. Present exactly when `previewedAt` is."; }>>; previewedDigest: TOptional<TWith<TString, { description: "SHA-256 of the document that preview showed. The preview covers the identifier only while this equals the `documentDigest` a preview returns now. Present exactly when `previewedAt` is."; }>>; publishedAt: TOptional<TWith<TString, { description: "When the version now served was written out. Absent until then."; }>>; renderedAt: TOptional<TWith<TString, { description: "When the document now waiting, or last published, was rendered. A preview older than this no longer counts."; }>>; retiredAssertionKeyIds: TOptional<TArray<TString>>; retiredUpdateKeyIds: TOptional<TArray<TString>>; scid: TOptional<TString>; status: TWith<TUnsafe<"placing" | "prepared" | "published" | "failed">, { description: "Where it stands. `placing`: created, waiting to be placed on an agent; read again shortly. `prepared`: keys generated and a document rendered, waiting to be previewed and published. `published`: served and resolvable. `failed`: could not be published; its keys were destroyed and nothing was written."; }>; updateKeyId: TOptional<TWith<TString, { description: "The key that signs the next log entry, as a thumbprint. While a version waits to be published it is the key that will sign that version; once the version is published it is the key that version committed to, and the key that signed is spent and listed in `retiredUpdateKeyIds` only. Absent for `did:web`, where nothing signs the document."; }>>; version: TWith<TInteger, { description: "How many versions have been published: 0 until the first, then the number of the log entry (or, for `did:web`, of the document) now served."; }>; versionId: TOptional<TWith<TString, { description: "The `versionId` of the log entry now served. Absent until the first publication, and always for `did:web`, which has no log."; }>>; versionLimit: TOptional<TInteger>; }>; parallelDocument: TOptional<TString>; scid: TOptional<TUnion<[TString, TNull]>>; scidPlaceholder: TOptional<TLiteral<"{SCID}">>; servedAt: TArray<TString>; version: TInteger; }>

Defined in: packages/contracts/src/schemas/issuance.ts:601

request.*.issuance.identifier.preview.v1 reply data: exactly the document that will be published, where it will be served, and which keys stand behind it. Reading it is what satisfies the publish gate.

The document travels as text and not as a JSON object. It is the RFC 8785 canonical form, and the gate at publication compares the canonical form of what the agent signed with this, byte for byte (D3.3). An object would invite a re-serialisation somewhere between issuance and the reader, and the preview's whole worth is that nothing changes what is shown.