@checktiv/sdk-web 1.10.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -1
- package/dist/agents/AGENTS.md +8 -0
- package/dist/agents/manifest.json +12 -0
- package/dist/capture-ui.d.ts +4 -4
- package/dist/capture-ui.js +6 -5
- package/dist/capture.d.ts +3 -3
- package/dist/capture.js +3 -2
- package/dist/challenge.js +2 -2
- package/dist/chunk-3KEVZCCZ.js +3 -0
- package/dist/chunk-CAI3JWWU.js +12 -0
- package/dist/chunk-EOTGVXW6.js +7 -0
- package/dist/{chunk-HV2QKVJX.js → chunk-FQSJUWRP.js} +1 -1
- package/dist/{chunk-YRM5SYRT.js → chunk-HWABVMID.js} +3 -3
- package/dist/chunk-MLQ2HMTS.js +3 -0
- package/dist/chunk-O3JECGW2.js +3 -0
- package/dist/chunk-PB2THQ3P.js +8 -0
- package/dist/chunk-TKK5CTVG.js +59 -0
- package/dist/chunk-VMWTID63.js +3 -0
- package/dist/{chunk-LRKS6JEP.js → chunk-YE2LWN74.js} +1 -1
- package/dist/collect-user-info.d.ts +3 -3
- package/dist/collect-user-info.js +2 -2
- package/dist/{controller-CO5r6vXD.d.ts → controller-Dh-rSrot.d.ts} +2 -1
- package/dist/{copy-D6Sd0BIe.d.ts → copy-Bsb1n1Wv.d.ts} +1 -1
- package/dist/credit-history.d.ts +4 -0
- package/dist/credit-history.js +12 -0
- package/dist/cross-device.js +2 -2
- package/dist/custom-form.css +1 -1
- package/dist/custom-form.d.ts +3 -3
- package/dist/custom-form.js +4 -4
- package/dist/esign/ceremony-runtime.js +1 -1
- package/dist/esign.d.ts +15 -3
- package/dist/esign.js +10 -5
- package/dist/fraud.d.ts +3 -3
- package/dist/fraud.js +2 -2
- package/dist/idv/cross-device.d.ts +7 -7
- package/dist/idv.d.ts +3 -3
- package/dist/idv.js +9 -9
- package/dist/{api-EY_fOZm-.d.ts → index-CGH7LlPH.d.ts} +266 -108
- package/dist/{index-iyKwn5_z.d.ts → index-CZt19Km4.d.ts} +5 -5
- package/dist/index.d.ts +6 -6
- package/dist/index.js +5 -4
- package/dist/{machine-DXxarDcC.d.ts → machine-EePe2ERe.d.ts} +13 -1
- package/dist/react.d.ts +4 -4
- package/dist/react.js +8 -7
- package/dist/workspace.d.ts +3 -3
- package/dist/workspace.js +1 -1
- package/package.json +29 -10
- package/dist/chunk-2SPZA3CQ.js +0 -3
- package/dist/chunk-GFHNOZVO.js +0 -3
- package/dist/chunk-NHNGQ5BB.js +0 -66
- package/dist/chunk-SU6RE6UR.js +0 -12
- package/dist/chunk-T6NMRTFB.js +0 -7
- package/dist/chunk-XOGHMNBX.js +0 -3
- package/dist/chunk-YK4WW4LX.js +0 -7
package/dist/custom-form.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { u } from './chunk-
|
|
2
|
-
import { R, k, S } from './chunk-
|
|
3
|
-
import {
|
|
4
|
-
import { warnWrongTokenPlane, isRecord, isJourneyPlaneBody } from './chunk-YK4WW4LX.js';
|
|
1
|
+
import { u } from './chunk-FQSJUWRP.js';
|
|
2
|
+
import { R, k, S } from './chunk-3KEVZCCZ.js';
|
|
3
|
+
import { warnWrongTokenPlane, isRecord, isJourneyPlaneBody } from './chunk-EOTGVXW6.js';
|
|
5
4
|
import './chunk-IQKHRPJR.js';
|
|
6
5
|
import { assertNever } from './chunk-UBQTPS5J.js';
|
|
6
|
+
import { registerModule } from './chunk-VMWTID63.js';
|
|
7
7
|
import { withTokenRetry, isChecktivError, createChecktivError, mapHttpStatusToError } from './chunk-C7GRMEYT.js';
|
|
8
8
|
import { SESSIONS_ME_PATH, dataPlaneHeaders, stepSubmitPath, formUploadUrlPath } from './chunk-HFQJYEGZ.js';
|
|
9
9
|
import './chunk-QFA3K5ZV.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { isEsignConsentOutcome, resolveEsignDocumentCopy, ESIGN_STATES, ESIGN_CONSENT_ACTIONS, ESIGN_DOCUMENT_ACTIONS } from '../chunk-MLQ2HMTS.js';
|
|
1
2
|
import { initTransport } from '../chunk-UVTAPUGQ.js';
|
|
2
|
-
import { isEsignConsentOutcome, resolveEsignDocumentCopy, ESIGN_STATES, ESIGN_CONSENT_ACTIONS, ESIGN_DOCUMENT_ACTIONS } from '../chunk-2SPZA3CQ.js';
|
|
3
3
|
import '../chunk-AIK7CDV6.js';
|
|
4
4
|
|
|
5
5
|
function esignFrameOwnsDownload(documentCount){return documentCount===1}function createEsignChrome(deps){const doc=deps.container.ownerDocument;let documentPanel=null;function ensurePanel(existing,marker){if(existing!==null)return existing;const el=doc.createElement("div");el.setAttribute(marker,"");el.className="ctv-esign-callout-body";deps.container.appendChild(el);return el}function button(label,onClick){const el=doc.createElement("button");el.type="button";el.className="ctv-esign-btn ctv-esign-btn-ghost";el.textContent=label;el.addEventListener("click",onClick);return el}function line(text,role){const el=doc.createElement("p");el.className="ctv-esign-callout-text";el.setAttribute("role",role);el.textContent=text;return el}function renderDocuments(model){if(model.documents.length===0){documentPanel?.remove();documentPanel=null;return}const panel=ensurePanel(documentPanel,"data-checktiv-esign-documents");documentPanel=panel;panel.replaceChildren();const frameOwnsTheControl=!model.owned&&model.framePaintsTopBar&&esignFrameOwnsDownload(model.documents.length);if(!frameOwnsTheControl){const controls=doc.createElement("div");controls.className="ctv-esign-callout-actions";panel.appendChild(controls);const label=resolveEsignDocumentCopy(deps.copy,"download");for(const[index,document_]of model.documents.entries()){const text=model.documents.length>1?`${label} ${index+1}`:label;const control=button(text,()=>deps.on.onDownload(document_.documentId));control.setAttribute("data-checktiv-esign-download",document_.documentId);controls.appendChild(control);}}if(model.downloadFailed){const error=line(resolveEsignDocumentCopy(deps.copy,"downloadFailed"),"alert");error.setAttribute("data-checktiv-esign-download-error","");panel.appendChild(error);}if(model.downloadRemoved){const removed=line(resolveEsignDocumentCopy(deps.copy,"downloadRemoved"),"alert");removed.setAttribute("data-checktiv-esign-download-removed","");panel.appendChild(removed);}if(panel.childElementCount===0){panel.remove();documentPanel=null;}}return {render(model){renderDocuments(model);},destroy(){documentPanel?.remove();documentPanel=null;}}}function filenameFromDisposition(raw){if(raw===null)return "document.pdf";const match=/filename="([^"]+)"/.exec(raw);const name=match?.[1];return name!==void 0&&name.length>0?name:"document.pdf"}function saveBlobAsDownload(blob,filename,deps){const doc=deps.container.ownerDocument;const view=doc.defaultView;if(view===null||typeof view.URL?.createObjectURL!=="function")return false;const objectUrl=view.URL.createObjectURL(blob);const anchor=doc.createElement("a");anchor.href=objectUrl;anchor.download=filename;anchor.rel="noopener";anchor.style.display="none";doc.body.appendChild(anchor);anchor.click();anchor.remove();deps.schedule(()=>view.URL.revokeObjectURL(objectUrl),0);return true}var ESIGN_PROTOCOL_VERSION=1;var MIN_ESIGN_PROTOCOL_VERSION=1;function checkInboundProtocolVersion(value){if(value===void 0)return "ok";if(typeof value!=="number"||!Number.isFinite(value))return "malformed";return value<MIN_ESIGN_PROTOCOL_VERSION?"mismatch":"ok"}function isRecord(value){return typeof value==="object"&&value!==null}function isDocumentDocShape(value){if(!isRecord(value))return false;if(value.type!=="doc")return false;return value.content===void 0||Array.isArray(value.content)}function isBundleDocumentShape(value){if(!isRecord(value))return false;if(typeof value.documentId!=="string"||value.documentId.length===0)return false;if(typeof value.templateVersionId!=="string"||value.templateVersionId.length===0){return false}if(typeof value.documentOrder!=="number")return false;if(typeof value.preSignatureHash!=="string")return false;if(!isRecord(value.resolvedVariables))return false;return isDocumentDocShape(value.doc)}function isEsignBundleShape(value){if(!isRecord(value))return false;if(typeof value.envelopeId!=="string"||value.envelopeId.length===0)return false;if(!Array.isArray(value.documents)||value.documents.length===0)return false;if(!value.documents.every(isBundleDocumentShape))return false;if(!Array.isArray(value.parties))return false;const disclosure=value.disclosure;if(!isRecord(disclosure))return false;if(typeof disclosure.version!=="string"||disclosure.version.length===0)return false;if(typeof disclosure.hash!=="string"||disclosure.hash.length===0)return false;if(typeof disclosure.body!=="string"||disclosure.body.length===0)return false;if(typeof disclosure.locale!=="string"||disclosure.locale.length===0)return false;const settings=value.settings;if(!isRecord(settings))return false;if(typeof settings.requireScrollToEnd!=="boolean")return false;if(settings.minimumAgeYears!==void 0&&typeof settings.minimumAgeYears!=="number"){return false}return true}function isEsignProjectionShape(value){if(!isRecord(value))return false;if(typeof value.envelopeId!=="string"||value.envelopeId.length===0)return false;if(typeof value.status!=="string"||value.status.length===0)return false;if(typeof value.expiresAt!=="string")return false;if(!("disclosure"in value)||!("scrolledToEndAt"in value))return false;if(!("adoptedSignature"in value)||!("adoptedAt"in value))return false;return "chainHeadSequence"in value}function parseEsignInbound(data){if(!isRecord(data))return null;const type=data.type;if(typeof type!=="string"||!type.startsWith("esign:"))return null;const verdict=checkInboundProtocolVersion(data.protocolVersion);if(verdict==="malformed")return null;if(verdict==="mismatch")return {kind:"protocol_mismatch"};const protocolVersion=typeof data.protocolVersion==="number"?data.protocolVersion:ESIGN_PROTOCOL_VERSION;if(type==="esign:ready"){return {kind:"message",message:{type:"esign:ready",protocolVersion}}}if(type==="esign:state"){const state=data.state;if(typeof state!=="string"||!isEsignState(state))return null;return {kind:"message",message:{type:"esign:state",protocolVersion,state}}}if(type==="esign:event"){const event=data.event;if(!isCeremonyEventShape(event))return null;return {kind:"message",message:{type:"esign:event",protocolVersion,event}}}if(type==="esign:submit"){const body=data.body;if(!isSubmitBodyShape(body))return null;return {kind:"message",message:{type:"esign:submit",protocolVersion,body}}}if(type==="esign:resize"){const height=data.height;if(typeof height!=="number"||!Number.isFinite(height)||height<=0)return null;return {kind:"message",message:{type:"esign:resize",protocolVersion,height}}}if(type==="esign:consent_act"){const action=data.action;if(typeof action!=="string"||!isEsignConsentAction(action))return null;return {kind:"message",message:{type:"esign:consent_act",protocolVersion,action}}}if(type==="esign:scroll_request"){const offsetTop=data.offsetTop;if(typeof offsetTop!=="number"||!Number.isFinite(offsetTop)||offsetTop<0)return null;return {kind:"message",message:{type:"esign:scroll_request",protocolVersion,offsetTop}}}if(type==="esign:document_act"){const{action,documentId}=data;if(typeof action!=="string"||!isEsignDocumentAction(action))return null;if(typeof documentId!=="string"||documentId.length===0)return null;return {kind:"message",message:{type:"esign:document_act",protocolVersion,action,documentId}}}if(type==="esign:document_extent"){const{documentId,endOffsetTop}=data;if(typeof documentId!=="string"||documentId.length===0)return null;if(typeof endOffsetTop!=="number"||!Number.isFinite(endOffsetTop)||endOffsetTop<0){return null}return {kind:"message",message:{type:"esign:document_extent",protocolVersion,documentId,endOffsetTop}}}return null}function isEsignConsentAction(value){return ESIGN_CONSENT_ACTIONS.includes(value)}function isEsignDocumentAction(value){return ESIGN_DOCUMENT_ACTIONS.includes(value)}var CEREMONY_EVENT_TYPES=["document.viewed","disclosure.presented","disclosure.consented","document.scrolled_to_end","signature.adopted"];function isCeremonyEventShape(value){if(!isRecord(value))return false;return typeof value.type==="string"&&isCeremonyEventType(value.type)}function isCeremonyEventType(value){const types=CEREMONY_EVENT_TYPES;return types.includes(value)}function isSubmitBodyShape(value){if(!isRecord(value))return false;if(!Array.isArray(value.documents)||value.documents.length===0)return false;const signed=value.adoptedSignature!==void 0;const declined=value.declineReason!==void 0;return signed!==declined}function isEsignState(value){return ESIGN_STATES.includes(value)}function buildSignerLocalContext(context){return {getTimezoneOffsetMinutes:(context.now??new Date).getTimezoneOffset(),...context.locale!==void 0?{locale:context.locale}:{}}}function buildEsignCeremonyEventBody(input,context={}){const common={protocolVersion:ESIGN_PROTOCOL_VERSION,...buildSignerLocalContext(context)};switch(input.type){case "document.viewed":return {...common,type:"document.viewed",documentId:input.documentId};case "disclosure.presented":return {...common,type:"disclosure.presented",...input.disclosureLocale!==void 0?{disclosureLocale:input.disclosureLocale}:{}};case "disclosure.consented":return {...common,type:"disclosure.consented",disclosureVersion:input.disclosureVersion,disclosureLocale:input.disclosureLocale,disclosureHash:input.disclosureHash};case "document.scrolled_to_end":return {...common,type:"document.scrolled_to_end",documentId:input.documentId};case "signature.adopted":return {...common,type:"signature.adopted",adoptedSignature:input.adoptedSignature};default:return assertNeverCeremonyEvent(input)}}function buildEsignConsentActBody(action,context={}){return {protocolVersion:ESIGN_PROTOCOL_VERSION,action,...buildSignerLocalContext(context)}}function parseEsignConsentActBody(body){if(!isRecord(body))return null;const outcome=body.outcome;if(typeof outcome!=="string"||!isEsignConsentOutcome(outcome))return null;return outcome}function isEsignDocumentRemovedBody(body){return isRecord(body)&&body.removed===true}function assertNeverCeremonyEvent(input){throw new Error(`Unhandled esign ceremony event input: ${JSON.stringify(input)}`)}var ESIGN_REFUSAL_STATE={esign_protocol_unsupported:{disposition:"upgrade",state:"protocol_mismatch"},esign_envelope_not_ready:{disposition:"retry",state:"preparing"},esign_event_out_of_order:{disposition:"resume",state:"conflict"},esign_disclosure_mismatch:{disposition:"resume",state:"consent"},esign_unknown_document:{disposition:"resume",state:"conflict"},esign_documents_incomplete:{disposition:"resume",state:"conflict"},esign_consent_required:{disposition:"resume",state:"consent"},esign_read_through_required:{disposition:"resume",state:"scroll_incomplete"},esign_signature_not_adopted:{disposition:"resume",state:"adopt"},esign_signature_mismatch:{disposition:"resume",state:"adopt"},esign_template_version_stale:{disposition:"resume",state:"conflict"},esign_age_assurance_required:{disposition:"resume",state:"age_gate"},esign_minimum_age_not_met:{disposition:"blocked",state:"age_blocked"},esign_consent_withdrawn:{disposition:"withdrawn",state:"terminal_withdrawn"},esign_envelope_conflict:{disposition:"concluded",state:"conflict"}};function isRecord2(value){return typeof value==="object"&&value!==null}function isEsignRefusalCode(value){return Object.prototype.hasOwnProperty.call(ESIGN_REFUSAL_STATE,value)}function readEsignRefusal(body){if(!isRecord2(body))return null;const error=body.error;if(!isRecord2(error))return null;const code=error.code;if(typeof code!=="string"||!isEsignRefusalCode(code))return null;const retryAfterMs=error.retryAfterMs;return {code,retryAfterMs:typeof retryAfterMs==="number"&&Number.isFinite(retryAfterMs)&&retryAfterMs>0?retryAfterMs:void 0}}function wireEsignTransport(options){const{win,embedOrigin,getFrameWindow,handlers}=options;return initTransport({win,allowedOrigins:[embedOrigin],parse:parseEsignInbound,expectedSource:getFrameWindow,onMessage:(inbound,post)=>{if(inbound.kind==="protocol_mismatch"){handlers.onProtocolMismatch();return}const message=inbound.message;switch(message.type){case "esign:ready":handlers.onReady(post);return;case "esign:state":handlers.onState(message);return;case "esign:event":handlers.onEvent(message,post);return;case "esign:submit":handlers.onSubmit(message);return;case "esign:resize":handlers.onResize(message);return;case "esign:consent_act":handlers.onConsentAct(message,post);return;case "esign:scroll_request":handlers.onScrollRequest(message);return;case "esign:document_act":handlers.onDocumentAct(message);return;case "esign:document_extent":handlers.onDocumentExtent(message);return;default:return assertNeverEsignInbound(message)}}})}function assertNeverEsignInbound(message){throw new Error(`Unhandled esign inbound message: ${JSON.stringify(message)}`)}
|
package/dist/esign.d.ts
CHANGED
|
@@ -1,4 +1,16 @@
|
|
|
1
|
-
export {
|
|
2
|
-
import './machine-
|
|
3
|
-
import './copy-
|
|
1
|
+
export { C as ChecktivEsignEvent, E as ESIGN_CONSENT_ACTIONS, a as ESIGN_COPY_FALLBACKS, b as ESIGN_COPY_STATE_KEYS, c as ESIGN_COUNT_TOKEN, d as ESIGN_DOCUMENT_FALLBACKS, e as ESIGN_DOCUMENT_KEYS, f as ESIGN_FRAME_ANNOUNCE_TIMEOUT_MS, g as ESIGN_LABELS, h as ESIGN_LABEL_FALLBACKS, i as ESIGN_OUTCOME_RIGHTS_KEY, j as ESIGN_RIGHTS_FALLBACKS, k as ESIGN_RIGHTS_KEYS, l as ESIGN_SHELL_FALLBACKS, m as ESIGN_SHELL_KEYS, n as ESIGN_STATES, o as ESIGN_STATE_RIGHTS, p as ESIGN_TERMINAL_STATUS_KEY, q as EsignChunkModule, r as EsignConsentAction, s as EsignConsentOutcome, t as EsignCopy, u as EsignCopyScalarKey, v as EsignDocumentCopyKey, w as EsignHandle, x as EsignLabel, y as EsignMountOptions, z as EsignRightsAffordance, A as EsignRightsKey, B as EsignShellKey, D as EsignState, F as EsignSubmitOutcome, G as EsignTerminalState, T as TERMINAL_STATUS_TO_STATE, H as TerminalEnvelopeStatus, I as createEsign, J as esignStateOffersRights, K as resolveEsignCopy, L as resolveEsignDocumentCopy, M as resolveEsignFrameTitle, N as resolveEsignLabel, O as resolveEsignOutcomeCopy, P as resolveEsignRightsCopy, Q as resolveEsignShellCopy, R as resolveEsignTerminalStatus } from './index-CGH7LlPH.js';
|
|
2
|
+
import './machine-EePe2ERe.js';
|
|
3
|
+
import './copy-Bsb1n1Wv.js';
|
|
4
4
|
import './copy-DCeQ4JKx.js';
|
|
5
|
+
|
|
6
|
+
interface EsignContextMint {
|
|
7
|
+
contextToken: string;
|
|
8
|
+
embedOrigin: string;
|
|
9
|
+
disclosureLocale: string;
|
|
10
|
+
}
|
|
11
|
+
declare function parseEsignMint(body: unknown): EsignContextMint | null;
|
|
12
|
+
declare function parseEsignPending(body: unknown): {
|
|
13
|
+
retryAfterMs: number;
|
|
14
|
+
} | null;
|
|
15
|
+
|
|
16
|
+
export { type EsignContextMint, parseEsignMint, parseEsignPending };
|
package/dist/esign.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { isTerminalEnvelopeStatus, TERMINAL_STATUS_TO_STATE, ESIGN_PREPARING_MAX_ATTEMPTS, esignPreparingDelayMs, isEsignFrameFatalState, resolveEsignFrameTitle, ESIGN_FRAME_ANNOUNCE_TIMEOUT_MS, ESIGN_SCROLL_TARGET_MARGIN_PX, ESIGN_TERMINAL_STATUS_KEY, ESIGN_PREPARING_STALL_MS, resolveEsignShellCopy, resolveEsignCopy, resolveEsignDocumentCopy, resolveEsignLabel } from './chunk-2SPZA3CQ.js';
|
|
3
|
-
export { ESIGN_CONSENT_ACTIONS, ESIGN_COPY_FALLBACKS, ESIGN_COPY_STATE_KEYS, ESIGN_COUNT_TOKEN, ESIGN_DOCUMENT_FALLBACKS, ESIGN_DOCUMENT_KEYS, ESIGN_FRAME_ANNOUNCE_TIMEOUT_MS, ESIGN_LABELS, ESIGN_LABEL_FALLBACKS, ESIGN_OUTCOME_RIGHTS_KEY, ESIGN_RIGHTS_FALLBACKS, ESIGN_RIGHTS_KEYS, ESIGN_SHELL_FALLBACKS, ESIGN_SHELL_KEYS, ESIGN_STATES, ESIGN_STATE_RIGHTS, ESIGN_TERMINAL_STATUS_KEY, TERMINAL_STATUS_TO_STATE, esignStateOffersRights, resolveEsignCopy, resolveEsignDocumentCopy, resolveEsignFrameTitle, resolveEsignLabel, resolveEsignOutcomeCopy, resolveEsignRightsCopy, resolveEsignShellCopy, resolveEsignTerminalStatus } from './chunk-2SPZA3CQ.js';
|
|
4
|
-
import { registerModule } from './chunk-GFHNOZVO.js';
|
|
5
|
-
import { resolveSession, warnWrongTokenPlane } from './chunk-YK4WW4LX.js';
|
|
1
|
+
import { resolveSession, warnWrongTokenPlane } from './chunk-EOTGVXW6.js';
|
|
6
2
|
import './chunk-IQKHRPJR.js';
|
|
7
3
|
import { assertNever } from './chunk-UBQTPS5J.js';
|
|
4
|
+
import { isTerminalEnvelopeStatus, TERMINAL_STATUS_TO_STATE, ESIGN_PREPARING_MAX_ATTEMPTS, esignPreparingDelayMs, isEsignFrameFatalState, resolveEsignFrameTitle, ESIGN_FRAME_ANNOUNCE_TIMEOUT_MS, ESIGN_SCROLL_TARGET_MARGIN_PX, ESIGN_TERMINAL_STATUS_KEY, ESIGN_PREPARING_STALL_MS, resolveEsignShellCopy, resolveEsignCopy, resolveEsignDocumentCopy, resolveEsignLabel } from './chunk-MLQ2HMTS.js';
|
|
5
|
+
export { ESIGN_CONSENT_ACTIONS, ESIGN_COPY_FALLBACKS, ESIGN_COPY_STATE_KEYS, ESIGN_COUNT_TOKEN, ESIGN_DOCUMENT_FALLBACKS, ESIGN_DOCUMENT_KEYS, ESIGN_FRAME_ANNOUNCE_TIMEOUT_MS, ESIGN_LABELS, ESIGN_LABEL_FALLBACKS, ESIGN_OUTCOME_RIGHTS_KEY, ESIGN_RIGHTS_FALLBACKS, ESIGN_RIGHTS_KEYS, ESIGN_SHELL_FALLBACKS, ESIGN_SHELL_KEYS, ESIGN_STATES, ESIGN_STATE_RIGHTS, ESIGN_TERMINAL_STATUS_KEY, TERMINAL_STATUS_TO_STATE, esignStateOffersRights, resolveEsignCopy, resolveEsignDocumentCopy, resolveEsignFrameTitle, resolveEsignLabel, resolveEsignOutcomeCopy, resolveEsignRightsCopy, resolveEsignShellCopy, resolveEsignTerminalStatus } from './chunk-MLQ2HMTS.js';
|
|
6
|
+
import { resolveCaptureTheme } from './chunk-4HIQN4KL.js';
|
|
7
|
+
import { registerModule } from './chunk-VMWTID63.js';
|
|
8
8
|
import { withTokenRetry, createChecktivError, isCredentialUnverifiable, isChecktivError, mapHttpStatusToError } from './chunk-C7GRMEYT.js';
|
|
9
9
|
import { dataPlaneHeaders, stepSubmitPath, isCanonicalOrigin, SESSIONS_ME_PATH } from './chunk-HFQJYEGZ.js';
|
|
10
10
|
import './chunk-QFA3K5ZV.js';
|
|
@@ -84,6 +84,11 @@ function esignBundlePath(stepId,opts={}){return `${esignStepPath(stepId)}${local
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
.ctv-esign-input:is([type='date'], [type='datetime-local'], [type='month'], [type='time'], [type='week']) {
|
|
88
|
+
min-width: 0;
|
|
89
|
+
max-width: 100%;
|
|
90
|
+
}
|
|
91
|
+
|
|
87
92
|
.ctv-esign-btn {
|
|
88
93
|
display: inline-flex;
|
|
89
94
|
align-items: center;
|
package/dist/fraud.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
2
|
-
import './machine-
|
|
3
|
-
import './copy-
|
|
1
|
+
export { a8 as ChecktivFraudEvent, aG as FraudChunkModule, af as FraudHandle, ag as FraudMountOptions, aH as createFraud } from './index-CGH7LlPH.js';
|
|
2
|
+
import './machine-EePe2ERe.js';
|
|
3
|
+
import './copy-Bsb1n1Wv.js';
|
|
4
4
|
import './copy-DCeQ4JKx.js';
|
package/dist/fraud.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { resolveSession, warnWrongTokenPlane } from './chunk-YK4WW4LX.js';
|
|
1
|
+
import { resolveSession, warnWrongTokenPlane } from './chunk-EOTGVXW6.js';
|
|
3
2
|
import './chunk-IQKHRPJR.js';
|
|
4
3
|
import { assertNever } from './chunk-UBQTPS5J.js';
|
|
4
|
+
import { registerModule } from './chunk-VMWTID63.js';
|
|
5
5
|
import { createChecktivError, withTokenRetry } from './chunk-C7GRMEYT.js';
|
|
6
6
|
import { TELEMETRY_PATH, dataPlaneHeaders } from './chunk-HFQJYEGZ.js';
|
|
7
7
|
import './chunk-QFA3K5ZV.js';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { mountCrossDevice } from '../cross-device.js';
|
|
2
|
+
import { S as SdkCrossDeviceStatusResponse } from '../machine-EePe2ERe.js';
|
|
3
|
+
import { Y as SubstrateContext, Z as CrossDeviceHandoffHook, S as ChecktivIdvEvent } from '../index-CGH7LlPH.js';
|
|
3
4
|
import { C as CrossDeviceCopy } from '../copy-DCeQ4JKx.js';
|
|
4
|
-
import
|
|
5
|
-
import '../copy-D6Sd0BIe.js';
|
|
5
|
+
import '../copy-Bsb1n1Wv.js';
|
|
6
6
|
|
|
7
7
|
interface ManagedCrossDeviceParams {
|
|
8
8
|
ctx: SubstrateContext;
|
|
@@ -30,9 +30,9 @@ interface CrossDevicePollConfig {
|
|
|
30
30
|
totalCapMs?: number;
|
|
31
31
|
}
|
|
32
32
|
declare const CROSS_DEVICE_REMINT_CAP = 3;
|
|
33
|
-
|
|
34
|
-
mountCrossDevice
|
|
35
|
-
}
|
|
33
|
+
type CrossDeviceChunkModule = {
|
|
34
|
+
mountCrossDevice: typeof mountCrossDevice;
|
|
35
|
+
};
|
|
36
36
|
type CrossDeviceChunkImporter = () => Promise<CrossDeviceChunkModule>;
|
|
37
37
|
declare function preloadCrossDeviceChunk(importer?: CrossDeviceChunkImporter): void;
|
|
38
38
|
interface CrossDeviceOverlayOptions {
|
package/dist/idv.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
import './
|
|
3
|
-
|
|
1
|
+
export { Z as CrossDeviceHandoffHook, aC as ForwardedSession, aD as IdvChunkModule, ak as IdvHandle, al as IdvMountOptions, aE as REMINT_READY_TIMEOUT_MS, aF as createIdv } from './index-CGH7LlPH.js';
|
|
2
|
+
import './machine-EePe2ERe.js';
|
|
3
|
+
import './copy-Bsb1n1Wv.js';
|
|
4
4
|
import './copy-DCeQ4JKx.js';
|
package/dist/idv.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { mount } from './chunk-
|
|
2
|
-
import { IDV_ACQUISITION_WHEN_ABSENT, CURRENT_PROTOCOL_VERSION } from './chunk-
|
|
3
|
-
import './chunk-
|
|
1
|
+
import { mount } from './chunk-HWABVMID.js';
|
|
2
|
+
import { IDV_ACQUISITION_WHEN_ABSENT, CURRENT_PROTOCOL_VERSION } from './chunk-PB2THQ3P.js';
|
|
3
|
+
import './chunk-TKK5CTVG.js';
|
|
4
4
|
import { createChecktivErrorEvent, mapStateToEvent, getCrossDeviceOpener } from './chunk-KYV5BPCD.js';
|
|
5
5
|
import './chunk-ZU4L3NDZ.js';
|
|
6
|
-
import './chunk-
|
|
7
|
-
import
|
|
8
|
-
import './chunk-
|
|
9
|
-
import { registerModule } from './chunk-GFHNOZVO.js';
|
|
10
|
-
import { resolveSession, warnWrongTokenPlane } from './chunk-YK4WW4LX.js';
|
|
6
|
+
import './chunk-FQSJUWRP.js';
|
|
7
|
+
import './chunk-3KEVZCCZ.js';
|
|
8
|
+
import { resolveSession, warnWrongTokenPlane } from './chunk-EOTGVXW6.js';
|
|
11
9
|
import './chunk-IQKHRPJR.js';
|
|
12
10
|
import { assertNever } from './chunk-UBQTPS5J.js';
|
|
11
|
+
import { resolveCaptureTheme } from './chunk-4HIQN4KL.js';
|
|
12
|
+
import { registerModule } from './chunk-VMWTID63.js';
|
|
13
13
|
import { createChecktivError, withTokenRetry, CREDENTIAL_UNVERIFIABLE_STATUS, mapHttpStatusToError } from './chunk-C7GRMEYT.js';
|
|
14
14
|
import { stepSubmitPath, dataPlaneHeaders, CAPTURE_TOKEN_MINT_PATH, isCanonicalOrigin } from './chunk-HFQJYEGZ.js';
|
|
15
15
|
import './chunk-QFA3K5ZV.js';
|
|
16
16
|
import './chunk-AIK7CDV6.js';
|
|
17
17
|
|
|
18
|
-
var LEASE_STORAGE_KEY_PREFIX="checktiv.idv.lease.";function isRecord(v){return typeof v==="object"&&v!==null}function storageKey(sessionId){return LEASE_STORAGE_KEY_PREFIX+sessionId}function safeLocalStorage(){try{return globalThis.localStorage??null}catch{return null}}function generateHolderDeviceId(){const c=globalThis.crypto;if(c&&typeof c.randomUUID==="function"){return c.randomUUID()}const bytes=new Uint8Array(16);c.getRandomValues(bytes);let hex="";for(const b of bytes)hex+=b.toString(16).padStart(2,"0");return hex}function loadPersistedLease(sessionId){const ls=safeLocalStorage();if(ls===null)return null;let raw;try{raw=ls.getItem(storageKey(sessionId));}catch{return null}if(raw===null)return null;let parsed;try{parsed=JSON.parse(raw);}catch{return null}if(!isRecord(parsed))return null;const{holderDeviceId,leaseGeneration}=parsed;if(typeof holderDeviceId!=="string"||holderDeviceId.length===0)return null;const gen=typeof leaseGeneration==="number"&&Number.isInteger(leaseGeneration)&&leaseGeneration>=0?leaseGeneration:void 0;return gen===void 0?{holderDeviceId}:{holderDeviceId,leaseGeneration:gen}}function persistLease(sessionId,record){const ls=safeLocalStorage();if(ls===null)return;try{ls.setItem(storageKey(sessionId),JSON.stringify(record));}catch{}}function loadOrCreatePersistedLease(sessionId){const persisted=loadPersistedLease(sessionId);if(persisted!==null)return persisted;const record={holderDeviceId:generateHolderDeviceId()};persistLease(sessionId,record);return record}var MAX_REMINTS=3;var CTX_FORWARDED_KEYS=["selfiePromptMap","selfieChromeCopy","beginScanCopy"];function pickDefined(source,keys){const out={};for(const key of keys){const value=source[key];if(value!==void 0)out[key]=value;}return out}function isRecord2(v){return typeof v==="object"&&v!==null}function asMode(value){return value==="live"||value==="test"?value:null}var TEST_HINTS=["pass","review","fail","doc_quality"];function asTestHint(value){return TEST_HINTS.find(hint=>hint===value)??null}function parseMintBody(body){if(!isRecord2(body)||!isRecord2(body.data))return null;const d=body.data;const captureToken=d.capture_token;const embedOrigin=d.embed_origin;const runIndex=d.run_index;const embedContextToken=d.embed_context_token;if(typeof captureToken!=="string"||captureToken.length===0)return null;if(!isCanonicalOrigin(embedOrigin))return null;if(typeof runIndex!=="number"||!Number.isInteger(runIndex)||runIndex<0)return null;if(typeof embedContextToken!=="string"||embedContextToken.length===0)return null;const mode=asMode(d.mode);const testHint=asTestHint(d.test_hint);return {captureToken,embedOrigin,runIndex,embedContextToken,...mode!==null?{mode}:{},...testHint!==null?{testHint}:{}}}function buildCaptureSubmitBody(input){return {runIndex:input.runIndex,r2Keys:input.r2Keys,...input.acquisition!==IDV_ACQUISITION_WHEN_ABSENT?{acquisition:input.acquisition}:{},holderDeviceId:input.holderDeviceId,...input.leaseGeneration!==void 0?{leaseGeneration:input.leaseGeneration}:{}}}function createIdvTransport(ctx,opts){const fetchImpl=opts.fetchImpl??fetch;const origin=ctx.apiBaseOrigin;let embedContextToken=null;let remintCount=0;const persistedLease=loadOrCreatePersistedLease(opts.sessionId);const holderDeviceId=persistedLease.holderDeviceId;const leaseGeneration=persistedLease.leaseGeneration;async function mintToken(){const res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+CAPTURE_TOKEN_MINT_PATH,{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify({stepId:opts.stepId})}));if(!res.ok){throw createChecktivError(mapHttpStatusToError(res.status))}let body;try{body=await res.json();}catch{opts.onError?.(createChecktivErrorEvent("sdk_load_failed"));throw createChecktivError("sdk_load_failed")}const parsed=parseMintBody(body);if(parsed===null){opts.onError?.(createChecktivErrorEvent("sdk_load_failed"));throw createChecktivError("sdk_load_failed")}embedContextToken=parsed.embedContextToken;return {captureToken:parsed.captureToken,embedOrigin:parsed.embedOrigin,runIndex:parsed.runIndex,...parsed.mode!==void 0?{mode:parsed.mode}:{},...parsed.testHint!==void 0?{testHint:parsed.testHint}:{}}}function getEmbedSrc(embedOrigin){if(embedContextToken===null){opts.onError?.(createChecktivErrorEvent("sdk_load_failed"));throw createChecktivError("sdk_load_failed")}return `${embedOrigin}/idv/capture?ctx=${encodeURIComponent(embedContextToken)}`}async function submit(runIndex,r2Keys,acquisition=IDV_ACQUISITION_WHEN_ABSENT){let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+stepSubmitPath(opts.sessionId,opts.stepId??""),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify(buildCaptureSubmitBody({runIndex,r2Keys,acquisition,holderDeviceId,leaseGeneration}))}));}catch{return {ok:false,reason:"failed"}}if(res.ok)return {ok:true};if(res.status===CREDENTIAL_UNVERIFIABLE_STATUS)return {ok:false,reason:"token_expired"};if(res.status===409)return {ok:false,reason:"capture_superseded"};if(res.status===503&&res.headers.has("Retry-After")){return {ok:false,reason:"signal_pending"}}return {ok:false,reason:"failed"}}function initPayload(){return {config:opts.config(),locale:ctx.locale,theme:resolveCaptureTheme(ctx.theme),protocolVersion:CURRENT_PROTOCOL_VERSION,...pickDefined(ctx,CTX_FORWARDED_KEYS)}}async function remint(){if(remintCount>=MAX_REMINTS){opts.onError?.(createChecktivErrorEvent("session_expired"));return null}remintCount+=1;try{return await mintToken()}catch{return null}}function failProtocolMismatch(){opts.onError?.(createChecktivErrorEvent("protocol_mismatch"));}return {mintToken,submit,getEmbedSrc,initPayload,remint,failProtocolMismatch}}function after(delayMs,fn){return setTimeout(fn,delayMs)}function createSyntheticIdv(opts,config,sessionId,script){const emit=e=>opts.onEvent?.(e);const delayMs=script?.stepDelayMs??0;const timers=[];let destroyed=false;function step(offsetMs,fn){timers.push(after(offsetMs,()=>{if(!destroyed)fn();}));}step(delayMs*0,()=>{emit({type:"checktiv.idv.ready",config});});if(script?.injectError!==void 0){const code=script.injectError;step(delayMs*1,()=>{emit(createChecktivErrorEvent(code));});}else {step(delayMs*1,()=>{emit({type:"checktiv.idv.phase",phase:"document_front"});});step(delayMs*2,()=>{emit({type:"checktiv.idv.submitted",sessionId});});}const destroy=()=>{if(destroyed)return;destroyed=true;for(const id of timers)clearTimeout(id);};return {destroy,unmount:destroy}}function resolveTarget(target){if(typeof target!=="string")return target;if(typeof document==="undefined")return null;return document.querySelector(target)}function toCaptureConfig(config){return {documentTypes:config.documentTypes,biometricMode:config.biometricMode,allowDocumentUpload:config.allowDocumentUpload,requireMrzMatch:false,requireExpiryValid:false,requireNameMatch:false,documentAuthenticity:false,...config.minAge!==void 0?{minAge:config.minAge}:{}}}function toReadyConfig(config){const{documentTypes,biometricMode,allowDocumentUpload}=config;return {documentTypes,biometricMode,allowDocumentUpload}}var REMINT_READY_TIMEOUT_MS=15e3;function noopHandle(){return {destroy(){},unmount(){},openCrossDevice(){}}}function isCoarsePointerViewport(){return typeof window!=="undefined"&&typeof window.matchMedia==="function"&&window.matchMedia("(pointer: coarse)").matches}function createIdv(ctx,opts){const element=resolveTarget(opts.target);if(element===null){console.warn('[Checktiv] mount("idv"): no target element found. Pass an element or a selector that resolves.');return noopHandle()}const emit=e=>opts.onEvent?.(e);const fetchImpl=opts.fetchImpl??fetch;let teardown=null;let cancelled=false;let crossDeviceSession=null;let crossDeviceOverlay=null;const closeCrossDevice=()=>{if(crossDeviceOverlay!==null){crossDeviceOverlay.destroy();crossDeviceOverlay=null;}};const openCrossDevice=()=>{if(cancelled)return;if(crossDeviceOverlay!==null){if(crossDeviceOverlay.isCapped())crossDeviceOverlay.restartPoll();return}if(isCoarsePointerViewport()){console.warn('[Checktiv] mount("idv"): openCrossDevice() is a desktop affordance; ignoring the call on a touch device (the immersive capture layout already owns the phone).');return}const sess=crossDeviceSession;if(sess===null){console.warn('[Checktiv] mount("idv"): openCrossDevice() called before the session resolved.');return}const copy=opts.crossDeviceCopy;if(copy===void 0){console.warn('[Checktiv] mount("idv"): openCrossDevice() requires `crossDeviceCopy` (with `unavailableMessage`).');return}const openOverlay=getCrossDeviceOpener();if(openOverlay===null){console.warn(`[Checktiv] mount("idv"): cross-device is not enabled. Import '@checktiv/sdk-web/idv/cross-device' in your app.`);return}crossDeviceOverlay=openOverlay({ctx,fetchImpl,target:sess.element,stepId:sess.stepId,sessionId:sess.sessionId,copy,isMobile:isCoarsePointerViewport(),onOpenCrossDevice:opts.onOpenCrossDevice,emit,onClose:closeCrossDevice});};void(async()=>{try{await setupCapture(element);}catch(err){if(cancelled)return;console.warn('[Checktiv] mount("idv") setup failed.',err);emit(createChecktivErrorEvent("sdk_load_failed"));}})();async function setupCapture(element2){const resolution=await resolveSession(ctx,fetchImpl);if(cancelled)return;let session;switch(resolution.kind){case "ok":session=resolution.session;break;case "wrong_token":warnWrongTokenPlane();emit(createChecktivErrorEvent("wrong_token_type"));return;case "unresolved":emit(createChecktivErrorEvent("session_expired"));return;case "parked":emit(createChecktivErrorEvent("session_parked"));return;case "nothing_to_render":emit({type:"checktiv.idv.processing",reason:"no_renderable_step"});return;default:return assertNever(resolution)}const idvConfig=session.config;if(idvConfig===null){emit(createChecktivErrorEvent("session_expired"));return}const captureConfig=toCaptureConfig(idvConfig);const readyConfig=toReadyConfig(captureConfig);if(ctx.mode==="test"&&opts.synthetic!==void 0){const synthHandle=createSyntheticIdv(opts,readyConfig,session.sessionId,opts.synthetic);teardown=()=>synthHandle.destroy();return}crossDeviceSession={sessionId:session.sessionId,stepId:session.stepId,element:element2};const transport=createIdvTransport(ctx,{fetchImpl,sessionId:session.sessionId,stepId:session.stepId,config:()=>captureConfig,onError:emit});let pinnedOrigin=null;let everReady=false;const onState=state=>{if(state.kind==="ready"){pinnedOrigin=state.embedOrigin;everReady=true;}if(state.kind==="capture_error"&&state.errorKind==="protocol_mismatch"){transport.failProtocolMismatch();return}const event=mapStateToEvent(state,{config:readyConfig,sessionId:session.sessionId});if(event!==null)emit(event);};const onControllerEvent=event=>{if(event.type==="all-complete"){emit({type:"checktiv.idv.submitted",sessionId:session.sessionId});}};const handle=mount(element2,{mintToken:transport.mintToken,submit:transport.submit,getEmbedSrc:transport.getEmbedSrc,initPayload:transport.initPayload,copy:opts.copy??{},layout:opts.layout,maxWidth:opts.maxWidth,onBeforeSubmit:opts.onBeforeSubmit,onBehaviorSegment:opts.onBehaviorSegment,onState,onControllerEvent});let reminting=false;let awaitingRemintReady=false;let remintReadyTimeoutHandle=null;const clearRemintReadyTimeout=()=>{if(remintReadyTimeoutHandle!==null){clearTimeout(remintReadyTimeoutHandle);remintReadyTimeoutHandle=null;}};const armRemintReadyTimeout=()=>{clearRemintReadyTimeout();remintReadyTimeoutHandle=setTimeout(()=>{remintReadyTimeoutHandle=null;if(!awaitingRemintReady)return;if(cancelled)return;void(async()=>{const minted=await transport.remint();if(cancelled||minted===null){awaitingRemintReady=false;reminting=false;return}if(!awaitingRemintReady){reminting=false;return}const frame=element2.querySelector("iframe.idv-capture-frame");if(frame===null){awaitingRemintReady=false;reminting=false;return}armRemintReadyTimeout();frame.src=transport.getEmbedSrc(minted.embedOrigin);})();},REMINT_READY_TIMEOUT_MS);};const isCaptureReady=data=>typeof data==="object"&&data!==null&&"type"in data&&data.type==="capture:ready";const onReloadMessage=mev=>{if(pinnedOrigin===null||mev.origin!==pinnedOrigin)return;if(!everReady)return;if(!isCaptureReady(mev.data))return;const pinnedFrame=element2.querySelector("iframe.idv-capture-frame");if(pinnedFrame===null)return;if(mev.source!==null&&mev.source!==pinnedFrame.contentWindow)return;if(reminting){if(awaitingRemintReady){clearRemintReadyTimeout();awaitingRemintReady=false;reminting=false;}return}reminting=true;void(async()=>{const minted=await transport.remint();if(cancelled||minted===null){reminting=false;return}const frame=element2.querySelector("iframe.idv-capture-frame");if(frame===null){reminting=false;return}awaitingRemintReady=true;armRemintReadyTimeout();frame.src=transport.getEmbedSrc(minted.embedOrigin);})();};if(typeof window!=="undefined"){window.addEventListener("message",onReloadMessage);}teardown=()=>{clearRemintReadyTimeout();if(typeof window!=="undefined"){window.removeEventListener("message",onReloadMessage);}handle.destroy();};}const destroy=()=>{cancelled=true;closeCrossDevice();if(teardown!==null){teardown();teardown=null;}};return {destroy,unmount:destroy,openCrossDevice}}registerModule("idv",createIdv);
|
|
18
|
+
var LEASE_STORAGE_KEY_PREFIX="checktiv.idv.lease.";function isRecord(v){return typeof v==="object"&&v!==null}function storageKey(sessionId){return LEASE_STORAGE_KEY_PREFIX+sessionId}function safeLocalStorage(){try{return globalThis.localStorage??null}catch{return null}}function generateHolderDeviceId(){const c=globalThis.crypto;if(c&&typeof c.randomUUID==="function"){return c.randomUUID()}const bytes=new Uint8Array(16);c.getRandomValues(bytes);let hex="";for(const b of bytes)hex+=b.toString(16).padStart(2,"0");return hex}function loadPersistedLease(sessionId){const ls=safeLocalStorage();if(ls===null)return null;let raw;try{raw=ls.getItem(storageKey(sessionId));}catch{return null}if(raw===null)return null;let parsed;try{parsed=JSON.parse(raw);}catch{return null}if(!isRecord(parsed))return null;const{holderDeviceId,leaseGeneration}=parsed;if(typeof holderDeviceId!=="string"||holderDeviceId.length===0)return null;const gen=typeof leaseGeneration==="number"&&Number.isInteger(leaseGeneration)&&leaseGeneration>=0?leaseGeneration:void 0;return gen===void 0?{holderDeviceId}:{holderDeviceId,leaseGeneration:gen}}function persistLease(sessionId,record){const ls=safeLocalStorage();if(ls===null)return;try{ls.setItem(storageKey(sessionId),JSON.stringify(record));}catch{}}function loadOrCreatePersistedLease(sessionId){const persisted=loadPersistedLease(sessionId);if(persisted!==null)return persisted;const record={holderDeviceId:generateHolderDeviceId()};persistLease(sessionId,record);return record}var MAX_REMINTS=3;var CTX_FORWARDED_KEYS=["selfiePromptMap","selfieChromeCopy","beginScanCopy"];function pickDefined(source,keys){const out={};for(const key of keys){const value=source[key];if(value!==void 0)out[key]=value;}return out}function isRecord2(v){return typeof v==="object"&&v!==null}function asMode(value){return value==="live"||value==="test"?value:null}var TEST_HINTS=["pass","review","fail","doc_quality"];function asTestHint(value){return TEST_HINTS.find(hint=>hint===value)??null}function parseMintBody(body){if(!isRecord2(body)||!isRecord2(body.data))return null;const d=body.data;const captureToken=d.capture_token;const embedOrigin=d.embed_origin;const runIndex=d.run_index;const embedContextToken=d.embed_context_token;if(typeof captureToken!=="string"||captureToken.length===0)return null;if(!isCanonicalOrigin(embedOrigin))return null;if(typeof runIndex!=="number"||!Number.isInteger(runIndex)||runIndex<0)return null;if(typeof embedContextToken!=="string"||embedContextToken.length===0)return null;const mode=asMode(d.mode);const testHint=asTestHint(d.test_hint);return {captureToken,embedOrigin,runIndex,embedContextToken,...mode!==null?{mode}:{},...testHint!==null?{testHint}:{}}}function buildCaptureSubmitBody(input){return {runIndex:input.runIndex,r2Keys:input.r2Keys,...input.acquisition!==IDV_ACQUISITION_WHEN_ABSENT?{acquisition:input.acquisition}:{},holderDeviceId:input.holderDeviceId,...input.leaseGeneration!==void 0?{leaseGeneration:input.leaseGeneration}:{}}}function createIdvTransport(ctx,opts){const fetchImpl=opts.fetchImpl??fetch;const origin=ctx.apiBaseOrigin;let embedContextToken=null;let remintCount=0;const persistedLease=loadOrCreatePersistedLease(opts.sessionId);const holderDeviceId=persistedLease.holderDeviceId;const leaseGeneration=persistedLease.leaseGeneration;async function mintToken(){const res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+CAPTURE_TOKEN_MINT_PATH,{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify({stepId:opts.stepId})}));if(!res.ok){throw createChecktivError(mapHttpStatusToError(res.status))}let body;try{body=await res.json();}catch{opts.onError?.(createChecktivErrorEvent("sdk_load_failed"));throw createChecktivError("sdk_load_failed")}const parsed=parseMintBody(body);if(parsed===null){opts.onError?.(createChecktivErrorEvent("sdk_load_failed"));throw createChecktivError("sdk_load_failed")}embedContextToken=parsed.embedContextToken;return {captureToken:parsed.captureToken,embedOrigin:parsed.embedOrigin,runIndex:parsed.runIndex,...parsed.mode!==void 0?{mode:parsed.mode}:{},...parsed.testHint!==void 0?{testHint:parsed.testHint}:{}}}function getEmbedSrc(embedOrigin){if(embedContextToken===null){opts.onError?.(createChecktivErrorEvent("sdk_load_failed"));throw createChecktivError("sdk_load_failed")}return `${embedOrigin}/idv/capture?ctx=${encodeURIComponent(embedContextToken)}`}async function submit(runIndex,r2Keys,acquisition=IDV_ACQUISITION_WHEN_ABSENT){let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+stepSubmitPath(opts.sessionId,opts.stepId??""),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify(buildCaptureSubmitBody({runIndex,r2Keys,acquisition,holderDeviceId,leaseGeneration}))}));}catch{return {ok:false,reason:"failed"}}if(res.ok)return {ok:true};if(res.status===CREDENTIAL_UNVERIFIABLE_STATUS)return {ok:false,reason:"token_expired"};if(res.status===409)return {ok:false,reason:"capture_superseded"};if(res.status===503&&res.headers.has("Retry-After")){return {ok:false,reason:"signal_pending"}}return {ok:false,reason:"failed"}}function initPayload(){return {config:opts.config(),locale:ctx.locale,theme:resolveCaptureTheme(ctx.theme),protocolVersion:CURRENT_PROTOCOL_VERSION,...pickDefined(ctx,CTX_FORWARDED_KEYS)}}async function remint(){if(remintCount>=MAX_REMINTS){opts.onError?.(createChecktivErrorEvent("session_expired"));return null}remintCount+=1;try{return await mintToken()}catch{return null}}function failProtocolMismatch(){opts.onError?.(createChecktivErrorEvent("protocol_mismatch"));}return {mintToken,submit,getEmbedSrc,initPayload,remint,failProtocolMismatch}}function after(delayMs,fn){return setTimeout(fn,delayMs)}function createSyntheticIdv(opts,config,sessionId,script){const emit=e=>opts.onEvent?.(e);const delayMs=script?.stepDelayMs??0;const timers=[];let destroyed=false;function step(offsetMs,fn){timers.push(after(offsetMs,()=>{if(!destroyed)fn();}));}step(delayMs*0,()=>{emit({type:"checktiv.idv.ready",config});});if(script?.injectError!==void 0){const code=script.injectError;step(delayMs*1,()=>{emit(createChecktivErrorEvent(code));});}else {step(delayMs*1,()=>{emit({type:"checktiv.idv.phase",phase:"document_front"});});step(delayMs*2,()=>{emit({type:"checktiv.idv.submitted",sessionId});});}const destroy=()=>{if(destroyed)return;destroyed=true;for(const id of timers)clearTimeout(id);};return {destroy,unmount:destroy}}function resolveTarget(target){if(typeof target!=="string")return target;if(typeof document==="undefined")return null;return document.querySelector(target)}function toCaptureConfig(config){return {documentTypes:config.documentTypes,biometricMode:config.biometricMode,allowDocumentUpload:config.allowDocumentUpload,requireMrzMatch:false,requireExpiryValid:false,requireNameMatch:false,documentAuthenticity:false,...config.minAge!==void 0?{minAge:config.minAge}:{}}}function toReadyConfig(config){const{documentTypes,biometricMode,allowDocumentUpload}=config;return {documentTypes,biometricMode,allowDocumentUpload}}var REMINT_READY_TIMEOUT_MS=15e3;function noopHandle(){return {destroy(){},unmount(){},openCrossDevice(){}}}function isCoarsePointerViewport(){return typeof window!=="undefined"&&typeof window.matchMedia==="function"&&window.matchMedia("(pointer: coarse)").matches}function createIdv(ctx,opts){const element=resolveTarget(opts.target);if(element===null){console.warn('[Checktiv] mount("idv"): no target element found. Pass an element or a selector that resolves.');return noopHandle()}const emit=e=>opts.onEvent?.(e);const fetchImpl=opts.fetchImpl??fetch;let teardown=null;let cancelled=false;let crossDeviceSession=null;let crossDeviceOverlay=null;const closeCrossDevice=()=>{if(crossDeviceOverlay!==null){crossDeviceOverlay.destroy();crossDeviceOverlay=null;}};const openCrossDevice=()=>{if(cancelled)return;if(crossDeviceOverlay!==null){if(crossDeviceOverlay.isCapped())crossDeviceOverlay.restartPoll();return}if(isCoarsePointerViewport()){console.warn('[Checktiv] mount("idv"): openCrossDevice() is a desktop affordance; ignoring the call on a touch device (the immersive capture layout already owns the phone).');return}const sess=crossDeviceSession;if(sess===null){console.warn('[Checktiv] mount("idv"): openCrossDevice() called before the session resolved.');return}const copy=opts.crossDeviceCopy;if(copy===void 0){console.warn('[Checktiv] mount("idv"): openCrossDevice() requires `crossDeviceCopy` (with `unavailableMessage`).');return}const openOverlay=getCrossDeviceOpener();if(openOverlay===null){console.warn(`[Checktiv] mount("idv"): cross-device is not enabled. Import '@checktiv/sdk-web/idv/cross-device' in your app.`);return}crossDeviceOverlay=openOverlay({ctx,fetchImpl,target:sess.element,stepId:sess.stepId,sessionId:sess.sessionId,copy,isMobile:isCoarsePointerViewport(),onOpenCrossDevice:opts.onOpenCrossDevice,emit,onClose:closeCrossDevice});};void(async()=>{try{await setupCapture(element);}catch(err){if(cancelled)return;console.warn('[Checktiv] mount("idv") setup failed.',err);emit(createChecktivErrorEvent("sdk_load_failed"));}})();async function resolveOwnSession(){const resolution=await resolveSession(ctx,fetchImpl);if(cancelled)return null;let session;switch(resolution.kind){case "ok":session=resolution.session;break;case "wrong_token":warnWrongTokenPlane();emit(createChecktivErrorEvent("wrong_token_type"));return null;case "unresolved":emit(createChecktivErrorEvent("session_expired"));return null;case "parked":emit(createChecktivErrorEvent("session_parked"));return null;case "nothing_to_render":emit({type:"checktiv.idv.processing",reason:"no_renderable_step"});return null;default:return assertNever(resolution)}return {sessionId:session.sessionId,stepId:session.stepId,config:session.config}}async function setupCapture(element2){let session;if(opts.session!==void 0){session=opts.session;}else {const resolved=await resolveOwnSession();if(resolved===null)return;session=resolved;}const idvConfig=session.config;if(idvConfig===null){emit(createChecktivErrorEvent("session_expired"));return}const captureConfig=toCaptureConfig(idvConfig);const readyConfig=toReadyConfig(captureConfig);if(ctx.mode==="test"&&opts.synthetic!==void 0){const synthHandle=createSyntheticIdv(opts,readyConfig,session.sessionId,opts.synthetic);teardown=()=>synthHandle.destroy();return}crossDeviceSession={sessionId:session.sessionId,stepId:session.stepId,element:element2};const transport=createIdvTransport(ctx,{fetchImpl,sessionId:session.sessionId,stepId:session.stepId,config:()=>captureConfig,onError:emit});let pinnedOrigin=null;let everReady=false;const onState=state=>{if(state.kind==="ready"){pinnedOrigin=state.embedOrigin;everReady=true;}if(state.kind==="capture_error"&&state.errorKind==="protocol_mismatch"){transport.failProtocolMismatch();return}const event=mapStateToEvent(state,{config:readyConfig,sessionId:session.sessionId});if(event!==null)emit(event);};const onControllerEvent=event=>{if(event.type==="all-complete"){emit({type:"checktiv.idv.submitted",sessionId:session.sessionId});}};const handle=mount(element2,{mintToken:transport.mintToken,submit:transport.submit,getEmbedSrc:transport.getEmbedSrc,initPayload:transport.initPayload,copy:opts.copy??{},layout:opts.layout,maxWidth:opts.maxWidth,onBeforeSubmit:opts.onBeforeSubmit,onBehaviorSegment:opts.onBehaviorSegment,onEmbedTiming:timing=>emit({type:"checktiv.idv.timing",...timing}),onState,onControllerEvent});let reminting=false;let awaitingRemintReady=false;let remintReadyTimeoutHandle=null;const clearRemintReadyTimeout=()=>{if(remintReadyTimeoutHandle!==null){clearTimeout(remintReadyTimeoutHandle);remintReadyTimeoutHandle=null;}};const armRemintReadyTimeout=()=>{clearRemintReadyTimeout();remintReadyTimeoutHandle=setTimeout(()=>{remintReadyTimeoutHandle=null;if(!awaitingRemintReady)return;if(cancelled)return;void(async()=>{const minted=await transport.remint();if(cancelled||minted===null){awaitingRemintReady=false;reminting=false;return}if(!awaitingRemintReady){reminting=false;return}const frame=element2.querySelector("iframe.idv-capture-frame");if(frame===null){awaitingRemintReady=false;reminting=false;return}armRemintReadyTimeout();frame.src=transport.getEmbedSrc(minted.embedOrigin);})();},REMINT_READY_TIMEOUT_MS);};const isCaptureReady=data=>typeof data==="object"&&data!==null&&"type"in data&&data.type==="capture:ready";const onReloadMessage=mev=>{if(pinnedOrigin===null||mev.origin!==pinnedOrigin)return;if(!everReady)return;if(!isCaptureReady(mev.data))return;const pinnedFrame=element2.querySelector("iframe.idv-capture-frame");if(pinnedFrame===null)return;if(mev.source!==null&&mev.source!==pinnedFrame.contentWindow)return;if(reminting){if(awaitingRemintReady){clearRemintReadyTimeout();awaitingRemintReady=false;reminting=false;}return}reminting=true;void(async()=>{const minted=await transport.remint();if(cancelled||minted===null){reminting=false;return}const frame=element2.querySelector("iframe.idv-capture-frame");if(frame===null){reminting=false;return}awaitingRemintReady=true;armRemintReadyTimeout();frame.src=transport.getEmbedSrc(minted.embedOrigin);})();};if(typeof window!=="undefined"){window.addEventListener("message",onReloadMessage);}teardown=()=>{clearRemintReadyTimeout();if(typeof window!=="undefined"){window.removeEventListener("message",onReloadMessage);}handle.destroy();};}const destroy=()=>{cancelled=true;closeCrossDevice();if(teardown!==null){teardown();teardown=null;}};return {destroy,unmount:destroy,openCrossDevice}}registerModule("idv",createIdv);
|
|
19
19
|
|
|
20
20
|
export { REMINT_READY_TIMEOUT_MS, createIdv };
|