@frankieone/one-sdk 1.9.42 → 1.10.0-rc
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/dist/commit.txt +1 -1
- package/dist/esm/modules/biometrics/vendors/Daon/index.d.ts +1 -1
- package/dist/esm/modules/biometrics/vendors/Onfido/onfido.init.d.ts +3 -1
- package/dist/esm/modules/biometrics/vendors/Onfido/onfido.init.d.ts.map +1 -1
- package/dist/esm/modules/biometrics/vendors/Onfido/onfido.init.js +15 -2
- package/dist/esm/modules/biometrics/vendors/Onfido/onfido.init.js.map +1 -1
- package/dist/esm/modules/biometrics/vendors/Onfido/onfidoLegacy.init.d.ts +3 -1
- package/dist/esm/modules/biometrics/vendors/Onfido/onfidoLegacy.init.d.ts.map +1 -1
- package/dist/esm/modules/biometrics/vendors/Onfido/onfidoLegacy.init.js +15 -2
- package/dist/esm/modules/biometrics/vendors/Onfido/onfidoLegacy.init.js.map +1 -1
- package/dist/esm/modules/biometrics/vendors/Onfido/shared.d.ts +7 -0
- package/dist/esm/modules/biometrics/vendors/Onfido/shared.d.ts.map +1 -1
- package/dist/esm/modules/biometrics/vendors/Onfido/shared.js +20 -5
- package/dist/esm/modules/biometrics/vendors/Onfido/shared.js.map +1 -1
- package/dist/esm/modules/common/shared/utils/fetchCheckProcessingStatus.d.ts.map +1 -1
- package/dist/esm/modules/common/shared/utils/fetchCheckProcessingStatus.js +6 -2
- package/dist/esm/modules/common/shared/utils/fetchCheckProcessingStatus.js.map +1 -1
- package/dist/esm/modules/common/vendors/common/iframeUtils/createIframe.d.ts.map +1 -1
- package/dist/esm/modules/common/vendors/common/iframeUtils/createIframe.js +5 -2
- package/dist/esm/modules/common/vendors/common/iframeUtils/createIframe.js.map +1 -1
- package/dist/esm/modules/common/vendors/common/iframeUtils/createIframeEventListener.d.ts +11 -0
- package/dist/esm/modules/common/vendors/common/iframeUtils/createIframeEventListener.d.ts.map +1 -1
- package/dist/esm/modules/common/vendors/common/iframeUtils/createIframeEventListener.js +1 -0
- package/dist/esm/modules/common/vendors/common/iframeUtils/createIframeEventListener.js.map +1 -1
- package/dist/esm/modules/common/vendors/daon/mapMessageToEvent.d.ts.map +1 -1
- package/dist/esm/modules/common/vendors/daon/mapMessageToEvent.js +18 -3
- package/dist/esm/modules/common/vendors/daon/mapMessageToEvent.js.map +1 -1
- package/dist/esm/modules/form/vendors/react/components/base/FrankieLoader/FrankieLoader.d.ts.map +1 -1
- package/dist/esm/modules/form/vendors/react/components/base/FrankieLoader/FrankieLoader.js +1 -1
- package/dist/esm/modules/form/vendors/react/components/base/FrankieLoader/FrankieLoader.js.map +1 -1
- package/dist/esm/modules/form/vendors/react/components/view/Progress/Progress.d.ts.map +1 -1
- package/dist/esm/modules/form/vendors/react/components/view/Progress/Progress.js +1 -1
- package/dist/esm/modules/form/vendors/react/components/view/Progress/Progress.js.map +1 -1
- package/dist/esm/modules/form/vendors/react/features/PersonalDetails/personalDetails.config.d.ts +585 -585
- package/dist/esm/modules/form/vendors/react/features/PersonalDetails/personalDetails.config.d.ts.map +1 -1
- package/dist/esm/modules/form/vendors/react/index.js +15 -0
- package/dist/esm/modules/form/vendors/react/index.js.map +1 -1
- package/dist/esm/modules/frankie-client/clients/F2/IDVClientF2.d.ts +4 -4
- package/dist/esm/modules/frankie-client/clients/F2/IDVClientF2.d.ts.map +1 -1
- package/dist/esm/modules/frankie-client/clients/F2/IDVClientF2.js.map +1 -1
- package/dist/esm/modules/frankie-client/clients/IDVClient.d.ts +4 -4
- package/dist/esm/modules/frankie-client/clients/IDVClient.d.ts.map +1 -1
- package/dist/esm/modules/frankie-client/clients/IDVClient.js.map +1 -1
- package/dist/esm/modules/idv/actions/mount.d.ts +9 -0
- package/dist/esm/modules/idv/actions/mount.d.ts.map +1 -1
- package/dist/esm/modules/idv/actions/mount.js +3 -1
- package/dist/esm/modules/idv/actions/mount.js.map +1 -1
- package/dist/esm/modules/idv/index.d.ts.map +1 -1
- package/dist/esm/modules/idv/index.js +17 -2
- package/dist/esm/modules/idv/index.js.map +1 -1
- package/dist/esm/modules/idv/vendors/Daon/index.d.ts +1 -1
- package/dist/esm/modules/idv/vendors/Incode/index.d.ts +1 -1
- package/dist/esm/modules/idv/vendors/Mastercard/index.d.ts +1 -1
- package/dist/esm/modules/idv/vendors/OcrLabs/index.d.ts +1 -1
- package/dist/esm/modules/idv/vendors/Onfido/index.d.ts +1 -1
- package/dist/esm/modules/idv/vendors/Onfido/index.d.ts.map +1 -1
- package/dist/esm/modules/idv/vendors/Onfido/index.js +20 -2
- package/dist/esm/modules/idv/vendors/Onfido/index.js.map +1 -1
- package/dist/esm/modules/idv/vendors/Onfido/index.useOneStep.d.ts +3 -1
- package/dist/esm/modules/idv/vendors/Onfido/index.useOneStep.d.ts.map +1 -1
- package/dist/esm/modules/idv/vendors/Onfido/index.useOneStep.js +15 -2
- package/dist/esm/modules/idv/vendors/Onfido/index.useOneStep.js.map +1 -1
- package/dist/esm/modules/idv/vendors/Sumsub/index.d.ts +1 -1
- package/dist/esm/modules/idv/vendors/Truuth/index.d.ts +1 -1
- package/dist/esm/modules/idv/vendors/Truuth/index.d.ts.map +1 -1
- package/dist/esm/modules/idv/vendors/Truuth/index.js +13 -1
- package/dist/esm/modules/idv/vendors/Truuth/index.js.map +1 -1
- package/dist/esm/modules/idv/vendors/common/iframeUtils/defineIframeIDVWrapper.d.ts +1 -1
- package/dist/esm/modules/idv/vendors/common/iframeUtils/defineIframeIDVWrapper.d.ts.map +1 -1
- package/dist/esm/modules/idv/vendors/common/iframeUtils/defineIframeIDVWrapper.js +19 -1
- package/dist/esm/modules/idv/vendors/common/iframeUtils/defineIframeIDVWrapper.js.map +1 -1
- package/dist/esm/modules/index.d.ts +2 -0
- package/dist/esm/modules/index.d.ts.map +1 -1
- package/dist/esm/modules/index.js +1 -0
- package/dist/esm/modules/index.js.map +1 -1
- package/dist/esm/modules/journey/classify/classify.d.ts +8 -0
- package/dist/esm/modules/journey/classify/classify.d.ts.map +1 -0
- package/dist/esm/modules/journey/classify/classify.js +105 -0
- package/dist/esm/modules/journey/classify/classify.js.map +1 -0
- package/dist/esm/modules/journey/classify/transportError.d.ts +24 -0
- package/dist/esm/modules/journey/classify/transportError.d.ts.map +1 -0
- package/dist/esm/modules/journey/classify/transportError.js +35 -0
- package/dist/esm/modules/journey/classify/transportError.js.map +1 -0
- package/dist/esm/modules/journey/classify/v1Status.d.ts +24 -0
- package/dist/esm/modules/journey/classify/v1Status.d.ts.map +1 -0
- package/dist/esm/modules/journey/classify/v1Status.js +43 -0
- package/dist/esm/modules/journey/classify/v1Status.js.map +1 -0
- package/dist/esm/modules/journey/flows/ekycFlow.d.ts +38 -0
- package/dist/esm/modules/journey/flows/ekycFlow.d.ts.map +1 -0
- package/dist/esm/modules/journey/flows/ekycFlow.js +179 -0
- package/dist/esm/modules/journey/flows/ekycFlow.js.map +1 -0
- package/dist/esm/modules/journey/flows/idvFlow.d.ts +32 -0
- package/dist/esm/modules/journey/flows/idvFlow.d.ts.map +1 -0
- package/dist/esm/modules/journey/flows/idvFlow.js +509 -0
- package/dist/esm/modules/journey/flows/idvFlow.js.map +1 -0
- package/dist/esm/modules/journey/flows/ocrFlow.d.ts +27 -0
- package/dist/esm/modules/journey/flows/ocrFlow.d.ts.map +1 -0
- package/dist/esm/modules/journey/flows/ocrFlow.js +434 -0
- package/dist/esm/modules/journey/flows/ocrFlow.js.map +1 -0
- package/dist/esm/modules/journey/flows/screenSequence.d.ts +127 -0
- package/dist/esm/modules/journey/flows/screenSequence.d.ts.map +1 -0
- package/dist/esm/modules/journey/flows/screenSequence.js +418 -0
- package/dist/esm/modules/journey/flows/screenSequence.js.map +1 -0
- package/dist/esm/modules/journey/flows/submitAndClassify.d.ts +32 -0
- package/dist/esm/modules/journey/flows/submitAndClassify.d.ts.map +1 -0
- package/dist/esm/modules/journey/flows/submitAndClassify.js +101 -0
- package/dist/esm/modules/journey/flows/submitAndClassify.js.map +1 -0
- package/dist/esm/modules/journey/index.d.ts +34 -0
- package/dist/esm/modules/journey/index.d.ts.map +1 -0
- package/dist/esm/modules/journey/index.js +183 -0
- package/dist/esm/modules/journey/index.js.map +1 -0
- package/dist/esm/modules/journey/journeyHandle.d.ts +35 -0
- package/dist/esm/modules/journey/journeyHandle.d.ts.map +1 -0
- package/dist/esm/modules/journey/journeyHandle.js +130 -0
- package/dist/esm/modules/journey/journeyHandle.js.map +1 -0
- package/dist/esm/modules/journey/screens/ctaConfig.d.ts +2 -0
- package/dist/esm/modules/journey/screens/ctaConfig.d.ts.map +1 -0
- package/dist/esm/modules/journey/screens/ctaConfig.js +23 -0
- package/dist/esm/modules/journey/screens/ctaConfig.js.map +1 -0
- package/dist/esm/modules/journey/screens/resultScreen.d.ts +21 -0
- package/dist/esm/modules/journey/screens/resultScreen.d.ts.map +1 -0
- package/dist/esm/modules/journey/screens/resultScreen.js +108 -0
- package/dist/esm/modules/journey/screens/resultScreen.js.map +1 -0
- package/dist/esm/modules/journey/simulate/fixtures.d.ts +9 -0
- package/dist/esm/modules/journey/simulate/fixtures.d.ts.map +1 -0
- package/dist/esm/modules/journey/simulate/fixtures.js +41 -0
- package/dist/esm/modules/journey/simulate/fixtures.js.map +1 -0
- package/dist/esm/modules/journey/steps/firstPaint.d.ts +43 -0
- package/dist/esm/modules/journey/steps/firstPaint.d.ts.map +1 -0
- package/dist/esm/modules/journey/steps/firstPaint.js +28 -0
- package/dist/esm/modules/journey/steps/firstPaint.js.map +1 -0
- package/dist/esm/modules/journey/steps/stepMachine.d.ts +52 -0
- package/dist/esm/modules/journey/steps/stepMachine.d.ts.map +1 -0
- package/dist/esm/modules/journey/steps/stepMachine.js +90 -0
- package/dist/esm/modules/journey/steps/stepMachine.js.map +1 -0
- package/dist/esm/modules/journey/steps/stepTable.d.ts +234 -0
- package/dist/esm/modules/journey/steps/stepTable.d.ts.map +1 -0
- package/dist/esm/modules/journey/steps/stepTable.js +241 -0
- package/dist/esm/modules/journey/steps/stepTable.js.map +1 -0
- package/dist/esm/modules/journey/theme/applyTheme.d.ts +17 -0
- package/dist/esm/modules/journey/theme/applyTheme.d.ts.map +1 -0
- package/dist/esm/modules/journey/theme/applyTheme.js +49 -0
- package/dist/esm/modules/journey/theme/applyTheme.js.map +1 -0
- package/dist/esm/modules/journey/types/classification.d.ts +10 -0
- package/dist/esm/modules/journey/types/classification.d.ts.map +1 -0
- package/dist/esm/modules/journey/types/classification.js +2 -0
- package/dist/esm/modules/journey/types/classification.js.map +1 -0
- package/dist/esm/modules/journey/types/classifierInput.d.ts +45 -0
- package/dist/esm/modules/journey/types/classifierInput.d.ts.map +1 -0
- package/dist/esm/modules/journey/types/classifierInput.js +2 -0
- package/dist/esm/modules/journey/types/classifierInput.js.map +1 -0
- package/dist/esm/modules/journey/types/contract.d.ts +60 -0
- package/dist/esm/modules/journey/types/contract.d.ts.map +1 -0
- package/dist/esm/modules/journey/types/contract.js +7 -0
- package/dist/esm/modules/journey/types/contract.js.map +1 -0
- package/dist/esm/modules/journey/types/resultConfig.d.ts +23 -0
- package/dist/esm/modules/journey/types/resultConfig.d.ts.map +1 -0
- package/dist/esm/modules/journey/types/resultConfig.js +2 -0
- package/dist/esm/modules/journey/types/resultConfig.js.map +1 -0
- package/dist/esm/modules/meta.json +1 -1
- package/dist/esm/modules/ocr/vendors/Daon/index.d.ts +1 -1
- package/dist/esm/modules/ocr/vendors/Onfido/onfido.init.d.ts +3 -1
- package/dist/esm/modules/ocr/vendors/Onfido/onfido.init.d.ts.map +1 -1
- package/dist/esm/modules/ocr/vendors/Onfido/onfido.init.js +15 -2
- package/dist/esm/modules/ocr/vendors/Onfido/onfido.init.js.map +1 -1
- package/dist/esm/modules/ocr/vendors/Onfido/onfidoLegacy.init.d.ts +3 -1
- package/dist/esm/modules/ocr/vendors/Onfido/onfidoLegacy.init.d.ts.map +1 -1
- package/dist/esm/modules/ocr/vendors/Onfido/onfidoLegacy.init.js +15 -2
- package/dist/esm/modules/ocr/vendors/Onfido/onfidoLegacy.init.js.map +1 -1
- package/dist/esm/modules/ocr/vendors/Onfido/shared.d.ts +17 -0
- package/dist/esm/modules/ocr/vendors/Onfido/shared.d.ts.map +1 -1
- package/dist/esm/modules/ocr/vendors/Onfido/shared.js +33 -5
- package/dist/esm/modules/ocr/vendors/Onfido/shared.js.map +1 -1
- package/dist/esm/modules/sdk/index.d.ts.map +1 -1
- package/dist/esm/modules/sdk/index.js +5 -1
- package/dist/esm/modules/sdk/index.js.map +1 -1
- package/dist/esm/modules/sdk/types/globalEvents.d.ts +13 -0
- package/dist/esm/modules/sdk/types/globalEvents.d.ts.map +1 -1
- package/dist/esm/modules/sdk/types/oneSDK.d.ts +1 -0
- package/dist/esm/modules/sdk/types/oneSDK.d.ts.map +1 -1
- package/dist/esm/styles/f1-style.css +1 -1
- package/dist/release.txt +1 -1
- package/dist/version.txt +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { OneSdkContext } from '../../sdk/types/oneSDK';
|
|
2
|
+
import type { StepEmitter, StepMachine } from './stepMachine';
|
|
3
|
+
import type { JourneyName } from '../types/contract';
|
|
4
|
+
/**
|
|
5
|
+
* Wire `emitter` so that the first time any of `events` fires, `journey_ready`
|
|
6
|
+
* (`globalEvents.ts`) emits once for the whole journey and every other
|
|
7
|
+
* `watch()` call becomes a no-op. Idempotent by design: every screen a flow
|
|
8
|
+
* might mount first — START/WELCOME/CONSENT/PERSONAL (`screenSequence.ts`'s
|
|
9
|
+
* `present()`) or the vendor CAPTURE flow (`idvFlow.ts`/`ocrFlow.ts`) — calls
|
|
10
|
+
* this the same way, and whichever fires first wins; the rest are already
|
|
11
|
+
* settled by the time their own listener would run.
|
|
12
|
+
*
|
|
13
|
+
* The `'form:{name}:loaded'` events `present()` watches are uniform (every
|
|
14
|
+
* screen goes through the same `ScreenWrapper.tsx`). The vendor CAPTURE
|
|
15
|
+
* flow's `'ready'` is not: it is purely vendor-delegated, and idvFlow.ts's/
|
|
16
|
+
* ocrFlow.ts's own `firstPaint.watch()` call sites document, vendor by
|
|
17
|
+
* vendor, which ones it is confirmed to mean actual visibility for, which
|
|
18
|
+
* fire early/ambiguously, and which (OcrLabs in production, dummy-ocr) never
|
|
19
|
+
* fire it at all — a journey whose first screen is CAPTURE on one of those
|
|
20
|
+
* never gets a `journey_ready` for that attempt. No fallback timer here by
|
|
21
|
+
* design (spec's own convention: timeouts guard engine silence deliberately,
|
|
22
|
+
* but a *host's own* timeout on this specific signal is the applicable one,
|
|
23
|
+
* not one baked into the SDK).
|
|
24
|
+
*/
|
|
25
|
+
export type FirstPaintSignal = {
|
|
26
|
+
watch: (emitter: StepEmitter, events: readonly string[]) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Fire directly, for a surface the journey mounts itself and can therefore
|
|
29
|
+
* observe without depending on a vendor event — `idvFlow.ts`/`ocrFlow.ts`
|
|
30
|
+
* call this once their own capture loader has painted. This is the path
|
|
31
|
+
* that makes `journey_ready` deterministic: it no longer inherits the
|
|
32
|
+
* per-vendor `ready` accuracy documented at those call sites.
|
|
33
|
+
*/
|
|
34
|
+
signal: () => void;
|
|
35
|
+
};
|
|
36
|
+
export declare const mkFirstPaintSignal: (deps: {
|
|
37
|
+
oneSdk: OneSdkContext;
|
|
38
|
+
flow: JourneyName;
|
|
39
|
+
machine: StepMachine;
|
|
40
|
+
/** `Date.now()` at the moment `journey(...)` was called — `JOURNEY:READY` telemetry's `elapsedMs` is measured from here */
|
|
41
|
+
startedAt: number;
|
|
42
|
+
}) => FirstPaintSignal;
|
|
43
|
+
//# sourceMappingURL=firstPaint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firstPaint.d.ts","sourceRoot":"","sources":["../../../../../modules/journey/steps/firstPaint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;IACjE;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,kBAAkB,SAAU;IACvC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;IACrB,2HAA2H;IAC3H,SAAS,EAAE,MAAM,CAAC;CACnB,KAAG,gBA4BH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const mkFirstPaintSignal = (deps) => {
|
|
2
|
+
const { oneSdk, flow, machine, startedAt } = deps;
|
|
3
|
+
let fired = false;
|
|
4
|
+
const fire = () => {
|
|
5
|
+
if (fired)
|
|
6
|
+
return;
|
|
7
|
+
fired = true;
|
|
8
|
+
oneSdk.emit('journey_ready', { flow });
|
|
9
|
+
oneSdk.emit('telemetry', {
|
|
10
|
+
eventName: 'JOURNEY:READY',
|
|
11
|
+
data: { flow, elapsedMs: Date.now() - startedAt },
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
const watch = (emitter, events) => {
|
|
15
|
+
if (fired)
|
|
16
|
+
return;
|
|
17
|
+
const onFirstEvent = () => {
|
|
18
|
+
if (fired)
|
|
19
|
+
return;
|
|
20
|
+
events.forEach((event) => { var _a; return (_a = emitter.off) === null || _a === void 0 ? void 0 : _a.call(emitter, event, onFirstEvent); });
|
|
21
|
+
fire();
|
|
22
|
+
};
|
|
23
|
+
events.forEach((event) => emitter.on(event, onFirstEvent));
|
|
24
|
+
machine.release(() => events.forEach((event) => { var _a; return (_a = emitter.off) === null || _a === void 0 ? void 0 : _a.call(emitter, event, onFirstEvent); }));
|
|
25
|
+
};
|
|
26
|
+
return { watch, signal: fire };
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=firstPaint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firstPaint.js","sourceRoot":"","sources":["../../../../../modules/journey/steps/firstPaint.ts"],"names":[],"mappings":"AAsCA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAMlC,EAAoB,EAAE;IACrB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAClD,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,IAAI,KAAK;YAAE,OAAO;QAClB,KAAK,GAAG,IAAI,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;YACvB,SAAS,EAAE,eAAe;YAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE;SAClD,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,KAAK,GAA8B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3D,IAAI,KAAK;YAAE,OAAO;QAClB,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,IAAI,KAAK;gBAAE,OAAO;YAClB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,WAAC,OAAA,MAAA,OAAO,CAAC,GAAG,wDAAG,KAAK,EAAE,YAAY,CAAC,CAAA,EAAA,CAAC,CAAC;YAC9D,IAAI,EAAE,CAAC;QACT,CAAC,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CACnB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,WAAC,OAAA,MAAA,OAAO,CAAC,GAAG,wDAAG,KAAK,EAAE,YAAY,CAAC,CAAA,EAAA,CAAC,CAC9D,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { JourneyStep } from './stepTable';
|
|
2
|
+
/**
|
|
3
|
+
* ONE SUBSCRIPTION, ONE TEARDOWN, ONE PLACE THAT DECIDES A STEP IS DONE.
|
|
4
|
+
*
|
|
5
|
+
* The journey used to attach a fresh listener inside each per-screen promise
|
|
6
|
+
* and resolve it from inside that closure, which is why "which event means
|
|
7
|
+
* done" was invisible (see `stepTable.ts`) and why teardown could not reach the
|
|
8
|
+
* listeners, timers and half-started mounts those closures owned.
|
|
9
|
+
*
|
|
10
|
+
* Here instead:
|
|
11
|
+
*
|
|
12
|
+
* - every listener the journey attaches is attached by `attach()`, using the
|
|
13
|
+
* events `stepTable.ts` declares, and its detach is registered in the one
|
|
14
|
+
* release list;
|
|
15
|
+
* - a step is a state with at most one waiter, and it leaves that state only
|
|
16
|
+
* through `complete()` / `fail()` — both of which live here, not in a closure;
|
|
17
|
+
* - `teardown()` runs every release and rejects whatever is still waiting, and
|
|
18
|
+
* afterwards `run()` refuses outright. Nothing can build, mount or complete
|
|
19
|
+
* into a container the host has already reclaimed: the mount-after-destroy
|
|
20
|
+
* race is not representable rather than being guarded case by case.
|
|
21
|
+
*
|
|
22
|
+
* The machine is deliberately not an event bus: each screen instance is still
|
|
23
|
+
* its own emitter (the form module creates one per screen), so "one
|
|
24
|
+
* subscription" means one owner of every subscription, not one `on()` call.
|
|
25
|
+
*/
|
|
26
|
+
/** anything the journey listens to: a form screen instance, or the idv flow */
|
|
27
|
+
export type StepEmitter = {
|
|
28
|
+
on(event: string, listener: (...args: never[]) => void): unknown;
|
|
29
|
+
off?(event: string, listener: (...args: never[]) => void): unknown;
|
|
30
|
+
};
|
|
31
|
+
/** wire a step's emitter; defaults to the events its row declares */
|
|
32
|
+
export type StepAttach = (emitter: StepEmitter, events?: readonly string[]) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Builds and starts a step. Runs inside the teardown guard, so a destroyed
|
|
35
|
+
* journey never even constructs a screen. Anything promise-like it returns is
|
|
36
|
+
* awaited: a rejection fails the step, a resolution on its own does not
|
|
37
|
+
* complete it (the declared signal does).
|
|
38
|
+
*/
|
|
39
|
+
export type StepOpener = (attach: StepAttach) => unknown;
|
|
40
|
+
export type StepMachine = {
|
|
41
|
+
isTorn: () => boolean;
|
|
42
|
+
isPending: (step: JourneyStep) => boolean;
|
|
43
|
+
complete: (step: JourneyStep, value?: unknown) => void;
|
|
44
|
+
fail: (step: JourneyStep, error: Error) => void;
|
|
45
|
+
/** register a detach / unmount / clearTimeout for the single teardown */
|
|
46
|
+
release: (release: () => void) => void;
|
|
47
|
+
run: <T>(step: JourneyStep, open: StepOpener) => Promise<T>;
|
|
48
|
+
teardown: () => void;
|
|
49
|
+
};
|
|
50
|
+
export declare const TORN_DOWN = "The journey was destroyed before this step completed.";
|
|
51
|
+
export declare const mkStepMachine: () => StepMachine;
|
|
52
|
+
//# sourceMappingURL=stepMachine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepMachine.d.ts","sourceRoot":"","sources":["../../../../../modules/journey/steps/stepMachine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,+EAA+E;AAC/E,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC;IACjE,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC;CACpE,CAAC;AAEF,qEAAqE;AACrE,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,KACvB,IAAI,CAAC;AAEV;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC;AAEzD,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC;IAC1C,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACvD,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAChD,yEAAyE;IACzE,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACvC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5D,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AASF,eAAO,MAAM,SAAS,0DACmC,CAAC;AAU1D,eAAO,MAAM,aAAa,QAAO,WAwFhC,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { completingEventsFor } from './stepTable.js';
|
|
2
|
+
export const TORN_DOWN = 'The journey was destroyed before this step completed.';
|
|
3
|
+
const quietly = (release) => {
|
|
4
|
+
try {
|
|
5
|
+
release();
|
|
6
|
+
}
|
|
7
|
+
catch (_a) {
|
|
8
|
+
// swallow: a noisy release must not abort the rest of the teardown
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
export const mkStepMachine = () => {
|
|
12
|
+
const waiting = new Map();
|
|
13
|
+
let releases = [];
|
|
14
|
+
let torn = false;
|
|
15
|
+
const settle = (step) => {
|
|
16
|
+
const waiter = waiting.get(step);
|
|
17
|
+
waiting.delete(step);
|
|
18
|
+
return waiter;
|
|
19
|
+
};
|
|
20
|
+
const complete = (step, value) => { var _a; return (_a = settle(step)) === null || _a === void 0 ? void 0 : _a.resolve(value); };
|
|
21
|
+
const fail = (step, error) => { var _a; return (_a = settle(step)) === null || _a === void 0 ? void 0 : _a.reject(error); };
|
|
22
|
+
const release = (fn) => {
|
|
23
|
+
// registered after teardown: the list will never run again, so retaining it
|
|
24
|
+
// would be a silent leak. Whatever it holds is already stale — release now.
|
|
25
|
+
if (torn) {
|
|
26
|
+
quietly(fn);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
releases.push(fn);
|
|
30
|
+
};
|
|
31
|
+
const attachTo = (step) => (emitter, events) => {
|
|
32
|
+
const wired = events !== null && events !== void 0 ? events : completingEventsFor(step);
|
|
33
|
+
const listener = () => complete(step);
|
|
34
|
+
wired.forEach((event) => emitter.on(event, listener));
|
|
35
|
+
release(() => wired.forEach((event) => { var _a; return (_a = emitter.off) === null || _a === void 0 ? void 0 : _a.call(emitter, event, listener); }));
|
|
36
|
+
};
|
|
37
|
+
const run = (step, open) => {
|
|
38
|
+
if (torn)
|
|
39
|
+
return Promise.reject(new Error(TORN_DOWN));
|
|
40
|
+
// A step already in flight is not an error. The engine can repeat itself --
|
|
41
|
+
// two `results` for one capture -- and a duplicate must stay as harmless as
|
|
42
|
+
// it was before there was a machine: `open` does not run a second time, so
|
|
43
|
+
// nothing is mounted twice, and the caller follows the original step rather
|
|
44
|
+
// than being handed a failure while its screen is still on screen.
|
|
45
|
+
const inFlight = waiting.get(step);
|
|
46
|
+
if (inFlight)
|
|
47
|
+
return inFlight.settled;
|
|
48
|
+
let resolveStep = () => undefined;
|
|
49
|
+
let rejectStep = () => undefined;
|
|
50
|
+
const settled = new Promise((resolve, reject) => {
|
|
51
|
+
resolveStep = resolve;
|
|
52
|
+
rejectStep = reject;
|
|
53
|
+
});
|
|
54
|
+
// registered before `open` runs, so a screen that reports ready during its
|
|
55
|
+
// own wiring still finds its waiter
|
|
56
|
+
waiting.set(step, { resolve: resolveStep, reject: rejectStep, settled });
|
|
57
|
+
// a synchronous throw from `open` is the same failure as a mount
|
|
58
|
+
// rejection: the step never started, and must not be left waiting
|
|
59
|
+
try {
|
|
60
|
+
Promise.resolve(open(attachTo(step))).catch((error) => fail(step, error));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
fail(step, error);
|
|
64
|
+
}
|
|
65
|
+
return settled;
|
|
66
|
+
};
|
|
67
|
+
const teardown = () => {
|
|
68
|
+
if (torn)
|
|
69
|
+
return;
|
|
70
|
+
torn = true;
|
|
71
|
+
const queued = releases;
|
|
72
|
+
releases = [];
|
|
73
|
+
// releases run first: they are what lets an in-flight step settle honestly
|
|
74
|
+
// (the idv runner registers `abandoned / user_exited` as one of them)
|
|
75
|
+
queued.forEach(quietly);
|
|
76
|
+
const outstanding = [...waiting.values()];
|
|
77
|
+
waiting.clear();
|
|
78
|
+
outstanding.forEach((waiter) => waiter.reject(new Error(TORN_DOWN)));
|
|
79
|
+
};
|
|
80
|
+
return {
|
|
81
|
+
isTorn: () => torn,
|
|
82
|
+
isPending: (step) => waiting.has(step),
|
|
83
|
+
complete,
|
|
84
|
+
fail,
|
|
85
|
+
release,
|
|
86
|
+
run,
|
|
87
|
+
teardown,
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=stepMachine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepMachine.js","sourceRoot":"","sources":["../../../../../modules/journey/steps/stepMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAmElD,MAAM,CAAC,MAAM,SAAS,GACpB,uDAAuD,CAAC;AAE1D,MAAM,OAAO,GAAG,CAAC,OAAmB,EAAE,EAAE;IACtC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,WAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,GAAgB,EAAE;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,IAAI,QAAQ,GAAmB,EAAE,CAAC;IAClC,IAAI,IAAI,GAAG,KAAK,CAAC;IAEjB,MAAM,MAAM,GAAG,CAAC,IAAiB,EAAsB,EAAE;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,IAAiB,EAAE,KAAe,EAAE,EAAE,WACtD,OAAA,MAAA,MAAM,CAAC,IAAI,CAAC,0CAAE,OAAO,CAAC,KAAK,CAAC,CAAA,EAAA,CAAC;IAE/B,MAAM,IAAI,GAAG,CAAC,IAAiB,EAAE,KAAY,EAAE,EAAE,WAAC,OAAA,MAAA,MAAM,CAAC,IAAI,CAAC,0CAAE,MAAM,CAAC,KAAK,CAAC,CAAA,EAAA,CAAC;IAE9E,MAAM,OAAO,GAAG,CAAC,EAAc,EAAE,EAAE;QACjC,4EAA4E;QAC5E,4EAA4E;QAC5E,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,EAAE,CAAC,CAAC;YACZ,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,QAAQ,GACZ,CAAC,IAAiB,EAAc,EAAE,CAClC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClB,MAAM,KAAK,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,WAAC,OAAA,MAAA,OAAO,CAAC,GAAG,wDAAG,KAAK,EAAE,QAAQ,CAAC,CAAA,EAAA,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC;IAEJ,MAAM,GAAG,GAAG,CAAI,IAAiB,EAAE,IAAgB,EAAc,EAAE;QACjE,IAAI,IAAI;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QACtD,4EAA4E;QAC5E,4EAA4E;QAC5E,2EAA2E;QAC3E,4EAA4E;QAC5E,mEAAmE;QACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC,OAAqB,CAAC;QAEpD,IAAI,WAAW,GAA6B,GAAG,EAAE,CAAC,SAAS,CAAC;QAC5D,IAAI,UAAU,GAA2B,GAAG,EAAE,CAAC,SAAS,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjD,WAAW,GAAG,OAAmC,CAAC;YAClD,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,2EAA2E;QAC3E,oCAAoC;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,iEAAiE;QACjE,kEAAkE;QAClE,IAAI,CAAC;YACH,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE,CAC3D,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAClB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,KAAc,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,IAAI,IAAI;YAAE,OAAO;QACjB,IAAI,GAAG,IAAI,CAAC;QACZ,MAAM,MAAM,GAAG,QAAQ,CAAC;QACxB,QAAQ,GAAG,EAAE,CAAC;QACd,2EAA2E;QAC3E,sEAAsE;QACtE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI;QAClB,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACtC,QAAQ;QACR,IAAI;QACJ,OAAO;QACP,GAAG;QACH,QAAQ;KACT,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { RESULT_STATE } from '../../form/vendors/react/appConfig.type';
|
|
2
|
+
/**
|
|
3
|
+
* WHICH EVENT COMPLETES WHICH STEP — the one place that answers it.
|
|
4
|
+
*
|
|
5
|
+
* Every wait in a journey used to be its own promise with its own listener, so
|
|
6
|
+
* the choice of "which event means done" was implied across seven `await`s and
|
|
7
|
+
* could only be checked by reading all of them. That invisibility produced this
|
|
8
|
+
* spike's worst defects: the RESULT screen was awaited on `form:result:ready`,
|
|
9
|
+
* which it never emits, and welcome/consent/review were awaited on events the
|
|
10
|
+
* form module emits on *submit*, not on render — which is what the 5s fallback
|
|
11
|
+
* timers were papering over, and those timers then advanced past screens nobody
|
|
12
|
+
* had acted on and recorded consent nobody gave.
|
|
13
|
+
*
|
|
14
|
+
* So the table is the artefact: one row per step, the signals it subscribes to,
|
|
15
|
+
* and what each signal actually means — read out of the emitting module, not
|
|
16
|
+
* assumed. A reviewer checks this file against the form and idv modules; the
|
|
17
|
+
* machine (`stepMachine.ts`) wires exactly what is declared here and nothing
|
|
18
|
+
* else. Where a step completes on something that is not an event at all — the
|
|
19
|
+
* terminal RESULT screen settling when `mount()` resolves — the row says so
|
|
20
|
+
* rather than leaving it to be discovered in code.
|
|
21
|
+
*/
|
|
22
|
+
export type JourneyStep = 'START' | 'WELCOME' | 'CONSENT' | 'CAPTURE' | 'PERSONAL' | 'DOCUMENT' | 'REVIEW' | 'REVIEW_VERIFY' | 'PARTIAL' | 'RESULT';
|
|
23
|
+
/**
|
|
24
|
+
* The pseudo-signal for a step that completes without any event: the emitter
|
|
25
|
+
* genuinely emits nothing, and the completion is the mount promise settling.
|
|
26
|
+
* It is not an event name, so it is never subscribed to — `completingEventsFor`
|
|
27
|
+
* excludes it by name, as a stated rule rather than as a side effect of how its
|
|
28
|
+
* `completes` field happens to be written.
|
|
29
|
+
*/
|
|
30
|
+
export declare const MOUNT_RESOLVED = "mount() resolved \u2014 no event is emitted";
|
|
31
|
+
export type StepSignal = {
|
|
32
|
+
/** the event name subscribed to, or `MOUNT_RESOLVED` */
|
|
33
|
+
event: string;
|
|
34
|
+
/** what the emitter actually does when it fires, and where that is written */
|
|
35
|
+
means: string;
|
|
36
|
+
/**
|
|
37
|
+
* `true` — completes the step whenever it fires.
|
|
38
|
+
* `false` — subscribed, but never completes the step.
|
|
39
|
+
* a string — the condition under which it completes it.
|
|
40
|
+
*/
|
|
41
|
+
completes: boolean | string;
|
|
42
|
+
};
|
|
43
|
+
export type StepRow = {
|
|
44
|
+
completesOn: readonly StepSignal[];
|
|
45
|
+
/** anything about the step's completion that is not a signal */
|
|
46
|
+
note?: string;
|
|
47
|
+
};
|
|
48
|
+
export declare const STEP_COMPLETION: {
|
|
49
|
+
readonly START: {
|
|
50
|
+
readonly completesOn: readonly [{
|
|
51
|
+
readonly event: "form:welcome:info" | "form:welcome:back" | "form:welcome:loaded" | "form:welcome:failed" | "form:welcome:success" | "form:welcome:partial" | "form:welcome:timeout" | "form:welcome:ready" | "form:welcome:pending" | "form:welcome:navigate" | "form:consent:info" | "form:consent:back" | "form:consent:loaded" | "form:consent:failed" | "form:consent:success" | "form:consent:partial" | "form:consent:timeout" | "form:consent:ready" | "form:consent:pending" | "form:consent:navigate" | "form:document:info" | "form:document:back" | "form:document:loaded" | "form:document:failed" | "form:document:success" | "form:document:partial" | "form:document:timeout" | "form:document:ready" | "form:document:pending" | "form:document:navigate" | "form:review:info" | "form:review:back" | "form:review:loaded" | "form:review:failed" | "form:review:success" | "form:review:partial" | "form:review:timeout" | "form:review:ready" | "form:review:pending" | "form:review:navigate" | "form:personal:info" | "form:personal:back" | "form:personal:loaded" | "form:personal:failed" | "form:personal:success" | "form:personal:partial" | "form:personal:timeout" | "form:personal:ready" | "form:personal:pending" | "form:personal:navigate" | "form:loading:info" | "form:loading:back" | "form:loading:loaded" | "form:loading:failed" | "form:loading:success" | "form:loading:partial" | "form:loading:timeout" | "form:loading:ready" | "form:loading:pending" | "form:loading:navigate" | "form:result:info" | "form:result:back" | "form:result:loaded" | "form:result:failed" | "form:result:success" | "form:result:partial" | "form:result:timeout" | "form:result:ready" | "form:result:pending" | "form:result:navigate" | "form:retry:info" | "form:retry:back" | "form:retry:loaded" | "form:retry:failed" | "form:retry:success" | "form:retry:partial" | "form:retry:timeout" | "form:retry:ready" | "form:retry:pending" | "form:retry:navigate" | "form:doc_upload:info" | "form:doc_upload:back" | "form:doc_upload:loaded" | "form:doc_upload:failed" | "form:doc_upload:success" | "form:doc_upload:partial" | "form:doc_upload:timeout" | "form:doc_upload:ready" | "form:doc_upload:pending" | "form:doc_upload:navigate" | "form:start:info" | "form:start:back" | "form:start:loaded" | "form:start:failed" | "form:start:success" | "form:start:partial" | "form:start:timeout" | "form:start:ready" | "form:start:pending" | "form:start:navigate" | "form:required_document_upload:info" | "form:required_document_upload:back" | "form:required_document_upload:loaded" | "form:required_document_upload:failed" | "form:required_document_upload:success" | "form:required_document_upload:partial" | "form:required_document_upload:timeout" | "form:required_document_upload:ready" | "form:required_document_upload:pending" | "form:required_document_upload:navigate" | "form:partial_document_upload:info" | "form:partial_document_upload:back" | "form:partial_document_upload:loaded" | "form:partial_document_upload:failed" | "form:partial_document_upload:success" | "form:partial_document_upload:partial" | "form:partial_document_upload:timeout" | "form:partial_document_upload:ready" | "form:partial_document_upload:pending" | "form:partial_document_upload:navigate" | "form:optional_document_upload:info" | "form:optional_document_upload:back" | "form:optional_document_upload:loaded" | "form:optional_document_upload:failed" | "form:optional_document_upload:success" | "form:optional_document_upload:partial" | "form:optional_document_upload:timeout" | "form:optional_document_upload:ready" | "form:optional_document_upload:pending" | "form:optional_document_upload:navigate" | "form:verification_method_selection:info" | "form:verification_method_selection:back" | "form:verification_method_selection:loaded" | "form:verification_method_selection:failed" | "form:verification_method_selection:success" | "form:verification_method_selection:partial" | "form:verification_method_selection:timeout" | "form:verification_method_selection:ready" | "form:verification_method_selection:pending" | "form:verification_method_selection:navigate";
|
|
52
|
+
readonly means: "Start.tsx:17 passes `documentReady` as the Wrapper CTA handler — emitted on CTA click, NOT on render.";
|
|
53
|
+
readonly completes: true;
|
|
54
|
+
}];
|
|
55
|
+
readonly note: "Human-gated: a person reading a screen is not a stalled flow, so there is no timeout. A screen that fails to *mount* is engine silence and fails the step instead.";
|
|
56
|
+
};
|
|
57
|
+
readonly WELCOME: {
|
|
58
|
+
readonly completesOn: readonly [{
|
|
59
|
+
readonly event: "form:welcome:info" | "form:welcome:back" | "form:welcome:loaded" | "form:welcome:failed" | "form:welcome:success" | "form:welcome:partial" | "form:welcome:timeout" | "form:welcome:ready" | "form:welcome:pending" | "form:welcome:navigate" | "form:consent:info" | "form:consent:back" | "form:consent:loaded" | "form:consent:failed" | "form:consent:success" | "form:consent:partial" | "form:consent:timeout" | "form:consent:ready" | "form:consent:pending" | "form:consent:navigate" | "form:document:info" | "form:document:back" | "form:document:loaded" | "form:document:failed" | "form:document:success" | "form:document:partial" | "form:document:timeout" | "form:document:ready" | "form:document:pending" | "form:document:navigate" | "form:review:info" | "form:review:back" | "form:review:loaded" | "form:review:failed" | "form:review:success" | "form:review:partial" | "form:review:timeout" | "form:review:ready" | "form:review:pending" | "form:review:navigate" | "form:personal:info" | "form:personal:back" | "form:personal:loaded" | "form:personal:failed" | "form:personal:success" | "form:personal:partial" | "form:personal:timeout" | "form:personal:ready" | "form:personal:pending" | "form:personal:navigate" | "form:loading:info" | "form:loading:back" | "form:loading:loaded" | "form:loading:failed" | "form:loading:success" | "form:loading:partial" | "form:loading:timeout" | "form:loading:ready" | "form:loading:pending" | "form:loading:navigate" | "form:result:info" | "form:result:back" | "form:result:loaded" | "form:result:failed" | "form:result:success" | "form:result:partial" | "form:result:timeout" | "form:result:ready" | "form:result:pending" | "form:result:navigate" | "form:retry:info" | "form:retry:back" | "form:retry:loaded" | "form:retry:failed" | "form:retry:success" | "form:retry:partial" | "form:retry:timeout" | "form:retry:ready" | "form:retry:pending" | "form:retry:navigate" | "form:doc_upload:info" | "form:doc_upload:back" | "form:doc_upload:loaded" | "form:doc_upload:failed" | "form:doc_upload:success" | "form:doc_upload:partial" | "form:doc_upload:timeout" | "form:doc_upload:ready" | "form:doc_upload:pending" | "form:doc_upload:navigate" | "form:start:info" | "form:start:back" | "form:start:loaded" | "form:start:failed" | "form:start:success" | "form:start:partial" | "form:start:timeout" | "form:start:ready" | "form:start:pending" | "form:start:navigate" | "form:required_document_upload:info" | "form:required_document_upload:back" | "form:required_document_upload:loaded" | "form:required_document_upload:failed" | "form:required_document_upload:success" | "form:required_document_upload:partial" | "form:required_document_upload:timeout" | "form:required_document_upload:ready" | "form:required_document_upload:pending" | "form:required_document_upload:navigate" | "form:partial_document_upload:info" | "form:partial_document_upload:back" | "form:partial_document_upload:loaded" | "form:partial_document_upload:failed" | "form:partial_document_upload:success" | "form:partial_document_upload:partial" | "form:partial_document_upload:timeout" | "form:partial_document_upload:ready" | "form:partial_document_upload:pending" | "form:partial_document_upload:navigate" | "form:optional_document_upload:info" | "form:optional_document_upload:back" | "form:optional_document_upload:loaded" | "form:optional_document_upload:failed" | "form:optional_document_upload:success" | "form:optional_document_upload:partial" | "form:optional_document_upload:timeout" | "form:optional_document_upload:ready" | "form:optional_document_upload:pending" | "form:optional_document_upload:navigate" | "form:verification_method_selection:info" | "form:verification_method_selection:back" | "form:verification_method_selection:loaded" | "form:verification_method_selection:failed" | "form:verification_method_selection:success" | "form:verification_method_selection:partial" | "form:verification_method_selection:timeout" | "form:verification_method_selection:ready" | "form:verification_method_selection:pending" | "form:verification_method_selection:navigate";
|
|
60
|
+
readonly means: "Welcome.tsx:20 passes `documentReady` as the Wrapper CTA handler — emitted on CTA click, NOT on render.";
|
|
61
|
+
readonly completes: true;
|
|
62
|
+
}];
|
|
63
|
+
readonly note: "Human-gated: no timeout. See START.";
|
|
64
|
+
};
|
|
65
|
+
readonly CONSENT: {
|
|
66
|
+
readonly completesOn: readonly [{
|
|
67
|
+
readonly event: "form:welcome:info" | "form:welcome:back" | "form:welcome:loaded" | "form:welcome:failed" | "form:welcome:success" | "form:welcome:partial" | "form:welcome:timeout" | "form:welcome:ready" | "form:welcome:pending" | "form:welcome:navigate" | "form:consent:info" | "form:consent:back" | "form:consent:loaded" | "form:consent:failed" | "form:consent:success" | "form:consent:partial" | "form:consent:timeout" | "form:consent:ready" | "form:consent:pending" | "form:consent:navigate" | "form:document:info" | "form:document:back" | "form:document:loaded" | "form:document:failed" | "form:document:success" | "form:document:partial" | "form:document:timeout" | "form:document:ready" | "form:document:pending" | "form:document:navigate" | "form:review:info" | "form:review:back" | "form:review:loaded" | "form:review:failed" | "form:review:success" | "form:review:partial" | "form:review:timeout" | "form:review:ready" | "form:review:pending" | "form:review:navigate" | "form:personal:info" | "form:personal:back" | "form:personal:loaded" | "form:personal:failed" | "form:personal:success" | "form:personal:partial" | "form:personal:timeout" | "form:personal:ready" | "form:personal:pending" | "form:personal:navigate" | "form:loading:info" | "form:loading:back" | "form:loading:loaded" | "form:loading:failed" | "form:loading:success" | "form:loading:partial" | "form:loading:timeout" | "form:loading:ready" | "form:loading:pending" | "form:loading:navigate" | "form:result:info" | "form:result:back" | "form:result:loaded" | "form:result:failed" | "form:result:success" | "form:result:partial" | "form:result:timeout" | "form:result:ready" | "form:result:pending" | "form:result:navigate" | "form:retry:info" | "form:retry:back" | "form:retry:loaded" | "form:retry:failed" | "form:retry:success" | "form:retry:partial" | "form:retry:timeout" | "form:retry:ready" | "form:retry:pending" | "form:retry:navigate" | "form:doc_upload:info" | "form:doc_upload:back" | "form:doc_upload:loaded" | "form:doc_upload:failed" | "form:doc_upload:success" | "form:doc_upload:partial" | "form:doc_upload:timeout" | "form:doc_upload:ready" | "form:doc_upload:pending" | "form:doc_upload:navigate" | "form:start:info" | "form:start:back" | "form:start:loaded" | "form:start:failed" | "form:start:success" | "form:start:partial" | "form:start:timeout" | "form:start:ready" | "form:start:pending" | "form:start:navigate" | "form:required_document_upload:info" | "form:required_document_upload:back" | "form:required_document_upload:loaded" | "form:required_document_upload:failed" | "form:required_document_upload:success" | "form:required_document_upload:partial" | "form:required_document_upload:timeout" | "form:required_document_upload:ready" | "form:required_document_upload:pending" | "form:required_document_upload:navigate" | "form:partial_document_upload:info" | "form:partial_document_upload:back" | "form:partial_document_upload:loaded" | "form:partial_document_upload:failed" | "form:partial_document_upload:success" | "form:partial_document_upload:partial" | "form:partial_document_upload:timeout" | "form:partial_document_upload:ready" | "form:partial_document_upload:pending" | "form:partial_document_upload:navigate" | "form:optional_document_upload:info" | "form:optional_document_upload:back" | "form:optional_document_upload:loaded" | "form:optional_document_upload:failed" | "form:optional_document_upload:success" | "form:optional_document_upload:partial" | "form:optional_document_upload:timeout" | "form:optional_document_upload:ready" | "form:optional_document_upload:pending" | "form:optional_document_upload:navigate" | "form:verification_method_selection:info" | "form:verification_method_selection:back" | "form:verification_method_selection:loaded" | "form:verification_method_selection:failed" | "form:verification_method_selection:success" | "form:verification_method_selection:partial" | "form:verification_method_selection:timeout" | "form:verification_method_selection:ready" | "form:verification_method_selection:pending" | "form:verification_method_selection:navigate";
|
|
68
|
+
readonly means: "Consent.tsx:28 calls `documentReady` from `triggerEvent`, after `giveConsents` — emitted on submit, NOT on render.";
|
|
69
|
+
readonly completes: true;
|
|
70
|
+
}];
|
|
71
|
+
readonly note: "Human-gated: no timeout. The journey records consents only after this fires, so auto-advancing here would record consent nobody gave.";
|
|
72
|
+
};
|
|
73
|
+
readonly PERSONAL: {
|
|
74
|
+
readonly completesOn: readonly [{
|
|
75
|
+
readonly event: "form:welcome:info" | "form:welcome:back" | "form:welcome:loaded" | "form:welcome:failed" | "form:welcome:success" | "form:welcome:partial" | "form:welcome:timeout" | "form:welcome:ready" | "form:welcome:pending" | "form:welcome:navigate" | "form:consent:info" | "form:consent:back" | "form:consent:loaded" | "form:consent:failed" | "form:consent:success" | "form:consent:partial" | "form:consent:timeout" | "form:consent:ready" | "form:consent:pending" | "form:consent:navigate" | "form:document:info" | "form:document:back" | "form:document:loaded" | "form:document:failed" | "form:document:success" | "form:document:partial" | "form:document:timeout" | "form:document:ready" | "form:document:pending" | "form:document:navigate" | "form:review:info" | "form:review:back" | "form:review:loaded" | "form:review:failed" | "form:review:success" | "form:review:partial" | "form:review:timeout" | "form:review:ready" | "form:review:pending" | "form:review:navigate" | "form:personal:info" | "form:personal:back" | "form:personal:loaded" | "form:personal:failed" | "form:personal:success" | "form:personal:partial" | "form:personal:timeout" | "form:personal:ready" | "form:personal:pending" | "form:personal:navigate" | "form:loading:info" | "form:loading:back" | "form:loading:loaded" | "form:loading:failed" | "form:loading:success" | "form:loading:partial" | "form:loading:timeout" | "form:loading:ready" | "form:loading:pending" | "form:loading:navigate" | "form:result:info" | "form:result:back" | "form:result:loaded" | "form:result:failed" | "form:result:success" | "form:result:partial" | "form:result:timeout" | "form:result:ready" | "form:result:pending" | "form:result:navigate" | "form:retry:info" | "form:retry:back" | "form:retry:loaded" | "form:retry:failed" | "form:retry:success" | "form:retry:partial" | "form:retry:timeout" | "form:retry:ready" | "form:retry:pending" | "form:retry:navigate" | "form:doc_upload:info" | "form:doc_upload:back" | "form:doc_upload:loaded" | "form:doc_upload:failed" | "form:doc_upload:success" | "form:doc_upload:partial" | "form:doc_upload:timeout" | "form:doc_upload:ready" | "form:doc_upload:pending" | "form:doc_upload:navigate" | "form:start:info" | "form:start:back" | "form:start:loaded" | "form:start:failed" | "form:start:success" | "form:start:partial" | "form:start:timeout" | "form:start:ready" | "form:start:pending" | "form:start:navigate" | "form:required_document_upload:info" | "form:required_document_upload:back" | "form:required_document_upload:loaded" | "form:required_document_upload:failed" | "form:required_document_upload:success" | "form:required_document_upload:partial" | "form:required_document_upload:timeout" | "form:required_document_upload:ready" | "form:required_document_upload:pending" | "form:required_document_upload:navigate" | "form:partial_document_upload:info" | "form:partial_document_upload:back" | "form:partial_document_upload:loaded" | "form:partial_document_upload:failed" | "form:partial_document_upload:success" | "form:partial_document_upload:partial" | "form:partial_document_upload:timeout" | "form:partial_document_upload:ready" | "form:partial_document_upload:pending" | "form:partial_document_upload:navigate" | "form:optional_document_upload:info" | "form:optional_document_upload:back" | "form:optional_document_upload:loaded" | "form:optional_document_upload:failed" | "form:optional_document_upload:success" | "form:optional_document_upload:partial" | "form:optional_document_upload:timeout" | "form:optional_document_upload:ready" | "form:optional_document_upload:pending" | "form:optional_document_upload:navigate" | "form:verification_method_selection:info" | "form:verification_method_selection:back" | "form:verification_method_selection:loaded" | "form:verification_method_selection:failed" | "form:verification_method_selection:success" | "form:verification_method_selection:partial" | "form:verification_method_selection:timeout" | "form:verification_method_selection:ready" | "form:verification_method_selection:pending" | "form:verification_method_selection:navigate";
|
|
76
|
+
readonly means: "PersonalDetails.tsx:150 calls `documentReady()` from `handleFormSubmit`, wired to the form's `onSubmit` — emitted on submit, NOT on render.";
|
|
77
|
+
readonly completes: true;
|
|
78
|
+
}];
|
|
79
|
+
readonly note: "Human-gated: no timeout, same as START/WELCOME/CONSENT. ekycFlow.ts only (idv/ocr have no PERSONAL step).";
|
|
80
|
+
};
|
|
81
|
+
readonly DOCUMENT: {
|
|
82
|
+
readonly completesOn: readonly [{
|
|
83
|
+
readonly event: "form:welcome:info" | "form:welcome:back" | "form:welcome:loaded" | "form:welcome:failed" | "form:welcome:success" | "form:welcome:partial" | "form:welcome:timeout" | "form:welcome:ready" | "form:welcome:pending" | "form:welcome:navigate" | "form:consent:info" | "form:consent:back" | "form:consent:loaded" | "form:consent:failed" | "form:consent:success" | "form:consent:partial" | "form:consent:timeout" | "form:consent:ready" | "form:consent:pending" | "form:consent:navigate" | "form:document:info" | "form:document:back" | "form:document:loaded" | "form:document:failed" | "form:document:success" | "form:document:partial" | "form:document:timeout" | "form:document:ready" | "form:document:pending" | "form:document:navigate" | "form:review:info" | "form:review:back" | "form:review:loaded" | "form:review:failed" | "form:review:success" | "form:review:partial" | "form:review:timeout" | "form:review:ready" | "form:review:pending" | "form:review:navigate" | "form:personal:info" | "form:personal:back" | "form:personal:loaded" | "form:personal:failed" | "form:personal:success" | "form:personal:partial" | "form:personal:timeout" | "form:personal:ready" | "form:personal:pending" | "form:personal:navigate" | "form:loading:info" | "form:loading:back" | "form:loading:loaded" | "form:loading:failed" | "form:loading:success" | "form:loading:partial" | "form:loading:timeout" | "form:loading:ready" | "form:loading:pending" | "form:loading:navigate" | "form:result:info" | "form:result:back" | "form:result:loaded" | "form:result:failed" | "form:result:success" | "form:result:partial" | "form:result:timeout" | "form:result:ready" | "form:result:pending" | "form:result:navigate" | "form:retry:info" | "form:retry:back" | "form:retry:loaded" | "form:retry:failed" | "form:retry:success" | "form:retry:partial" | "form:retry:timeout" | "form:retry:ready" | "form:retry:pending" | "form:retry:navigate" | "form:doc_upload:info" | "form:doc_upload:back" | "form:doc_upload:loaded" | "form:doc_upload:failed" | "form:doc_upload:success" | "form:doc_upload:partial" | "form:doc_upload:timeout" | "form:doc_upload:ready" | "form:doc_upload:pending" | "form:doc_upload:navigate" | "form:start:info" | "form:start:back" | "form:start:loaded" | "form:start:failed" | "form:start:success" | "form:start:partial" | "form:start:timeout" | "form:start:ready" | "form:start:pending" | "form:start:navigate" | "form:required_document_upload:info" | "form:required_document_upload:back" | "form:required_document_upload:loaded" | "form:required_document_upload:failed" | "form:required_document_upload:success" | "form:required_document_upload:partial" | "form:required_document_upload:timeout" | "form:required_document_upload:ready" | "form:required_document_upload:pending" | "form:required_document_upload:navigate" | "form:partial_document_upload:info" | "form:partial_document_upload:back" | "form:partial_document_upload:loaded" | "form:partial_document_upload:failed" | "form:partial_document_upload:success" | "form:partial_document_upload:partial" | "form:partial_document_upload:timeout" | "form:partial_document_upload:ready" | "form:partial_document_upload:pending" | "form:partial_document_upload:navigate" | "form:optional_document_upload:info" | "form:optional_document_upload:back" | "form:optional_document_upload:loaded" | "form:optional_document_upload:failed" | "form:optional_document_upload:success" | "form:optional_document_upload:partial" | "form:optional_document_upload:timeout" | "form:optional_document_upload:ready" | "form:optional_document_upload:pending" | "form:optional_document_upload:navigate" | "form:verification_method_selection:info" | "form:verification_method_selection:back" | "form:verification_method_selection:loaded" | "form:verification_method_selection:failed" | "form:verification_method_selection:success" | "form:verification_method_selection:partial" | "form:verification_method_selection:timeout" | "form:verification_method_selection:ready" | "form:verification_method_selection:pending" | "form:verification_method_selection:navigate";
|
|
84
|
+
readonly means: "IdSelection.tsx:69 calls `documentReady(document)` from `handleSubmit`, itself called on selecting/submitting an ID type — emitted on submit, NOT on render.";
|
|
85
|
+
readonly completes: true;
|
|
86
|
+
}];
|
|
87
|
+
readonly note: "Human-gated: no timeout, same as PERSONAL. ekycFlow.ts only. SECOND EXIT, not in this list because it does not complete the step the way a row event does: IdSelection.tsx:118-121 also emits `form:document:back` from the 'Back' link, and the form vendor tears its own screen down on it (`vendors/react/index.tsx` registers `cleanUpInstance` on `{screen}:back` as well as `{screen}:ready`). `screenSequence.ts`'s `presentDocument` wires it as a `DocumentExit` of 'back' and `ekycFlow.ts`'s `presentIdentity` re-presents PERSONAL — the same thing `templateManualKyc.js` does by hand. Ignoring it is what left the applicant on a blank container with this step never completing (FDEL-53225 QA bug 2).";
|
|
88
|
+
};
|
|
89
|
+
readonly CAPTURE: {
|
|
90
|
+
readonly completesOn: readonly [{
|
|
91
|
+
readonly event: "detection_complete";
|
|
92
|
+
readonly means: "the vendor finished capture. The payload is vendor-specific: iframe vendors (Daon) emit it with NO payload at all (defineIframeIDVWrapper.ts:193), Sumsub/Truuth emit `{ provider }` only, and `source` comes solely from the split Onfido flow — `ocr/vendors/Onfido/onfido.init.ts:117-119` and `onfidoLegacy.init.ts:135-137` supply `source: \"ocr\"`, `idv/vendors/Onfido/index.useOneStep.ts:142` supplies `source: \"biometrics\"`, both forwarded by `idv/vendors/Onfido/index.ts:90-94`. So the `source !== \"ocr\"` test shows the extraction screen for every vendor that omits it, which is the intent (FDEL-52471).";
|
|
93
|
+
readonly completes: false;
|
|
94
|
+
}, {
|
|
95
|
+
readonly event: "vendor_sdk_failed_loading";
|
|
96
|
+
readonly means: "`vendorLoading.ts:187` — the vendor's own SDK could not be fetched or initialised at all, so there is no capture UI and never will be. Emitted immediately BEFORE the generic `error` at :191, which is the only form this used to reach the journey in; since the machine settles first-wins, subscribing here is enough to claim it without deferral. Carries `{ vendor, errorObject }`, so the host finally learns which vendor failed — before FDEL-53728 Q2 that only reached `<MODULE>:VENDOR_FAILED_LOADING` telemetry.";
|
|
97
|
+
readonly completes: true;
|
|
98
|
+
}, {
|
|
99
|
+
readonly event: "detection_failed";
|
|
100
|
+
readonly means: "the vendor's capture ended without a result. Two different things wear this name, which is why the row is conditional. For `defineIframeIDVWrapper.ts:233-256` (Daon, Incode), `Truuth/index.ts:349-360` and `OcrLabs/endFlow.ts:15` it is the whole story: the frame is removed and nothing else follows, so before FDEL-53728 the container simply went blank and `start()` never resolved. For Onfido (`idv/vendors/Onfido/index.useOneStep.ts:160`, `ocr/vendors/Onfido/onfido.init.ts:163`) and IDVerse (`common/vendors/idverse/index.ts:361/:372` ) it is a *prelude*, emitted synchronously ahead of `input_required` / `session_interrupted` / `error`, which say far more. Incode's `onError` emits it bare when the applicant is out of attempts.";
|
|
101
|
+
readonly completes: "only if nothing else settles the step first — the runners defer it by one microtask, so any event the vendor emits synchronously after it wins";
|
|
102
|
+
}, {
|
|
103
|
+
readonly event: "results";
|
|
104
|
+
readonly means: "checkStatusEventMapping.ts:34 — COMPLETE and not REJECTED. The runner then reviews and submits; the step completes on the submit result, not on this event alone.";
|
|
105
|
+
readonly completes: "once review + submit have resolved";
|
|
106
|
+
}, {
|
|
107
|
+
readonly event: "error";
|
|
108
|
+
readonly means: "checkStatusEventMapping.ts:26/:45 — COMPLETE+REJECTED and FAILED, as a OneSDKError whose payload carries `checkStatus`/`result`.";
|
|
109
|
+
readonly completes: true;
|
|
110
|
+
}, {
|
|
111
|
+
readonly event: "info";
|
|
112
|
+
readonly means: "fetchCheckProcessingStatus.ts:112 emits `FetchProcessingExceededAttempts` when polling is exhausted. Every other `info` (defineIframeIDVWrapper.ts:171/:196, getInitProcessResults.ts:48) is chatter and must not settle anything.";
|
|
113
|
+
readonly completes: "only for name === FetchProcessingExceededAttempts";
|
|
114
|
+
}, {
|
|
115
|
+
readonly event: "session_interrupted";
|
|
116
|
+
readonly means: "the vendor session ended without a result. Emission is vendor-specific and NO iframe vendor emits it — Daon included — so on this spike's flow it never fires. `eventName: \"USER_CLOSED_MODAL\"`, which the runner reads to tell a deliberate exit from an interruption (spec §5.4), is emitted only by `biometrics/vendors/Onfido/onfido.init.ts:164`; the other emitters send `eventName: \"USER_EXITED\"` (`idv/vendors/Onfido/index.useOneStep.ts:168`, `ocr/vendors/Onfido/onfido.init.ts:176`, `onfidoLegacy.init.ts:116`), which therefore classifies as `abandoned / session_interrupted` rather than `user_exited`. Recorded, not changed here.";
|
|
117
|
+
readonly completes: true;
|
|
118
|
+
}, {
|
|
119
|
+
readonly event: "input_required";
|
|
120
|
+
readonly means: "checkStatusEventMapping.ts:62 emits `(info, checkStatus)` for INTERRUPTED / INCOMPLETE / DOCUMENTS_INVALID / WAITING_DOC_UPLOAD / WAITING_SELFIE_UPLOAD. AWAITING_CONSENT re-presents consent and INCOMPLETE re-fetches, so neither completes the step.";
|
|
121
|
+
readonly completes: "except AWAITING_CONSENT and INCOMPLETE (spec §5.4)";
|
|
122
|
+
}];
|
|
123
|
+
readonly note: "No timeout: capture is bounded by the applicant taking photographs (minutes) and by server-side polling the engine already bounds itself. `checkStatusEventMapping.ts:68-81` emits AWAITING_CONSENT and PROVIDER_OFFLINE as `error`, with the status under `payload.errorStatus` rather than `payload.checkStatus` — so spec §5.4 is wrong to list them under `input_required`, and on every iframe vendor (Daon, Incode) they arrive by the `error` door. FDEL-53728 B6: the `error` listener now reads `errorStatus` and routes both back through the same status ladder, so the AWAITING_CONSENT re-present is live for those vendors too rather than reading as a vendor outage.";
|
|
124
|
+
};
|
|
125
|
+
readonly REVIEW: {
|
|
126
|
+
readonly completesOn: readonly [{
|
|
127
|
+
readonly event: "form:welcome:info" | "form:welcome:back" | "form:welcome:loaded" | "form:welcome:failed" | "form:welcome:success" | "form:welcome:partial" | "form:welcome:timeout" | "form:welcome:ready" | "form:welcome:pending" | "form:welcome:navigate" | "form:consent:info" | "form:consent:back" | "form:consent:loaded" | "form:consent:failed" | "form:consent:success" | "form:consent:partial" | "form:consent:timeout" | "form:consent:ready" | "form:consent:pending" | "form:consent:navigate" | "form:document:info" | "form:document:back" | "form:document:loaded" | "form:document:failed" | "form:document:success" | "form:document:partial" | "form:document:timeout" | "form:document:ready" | "form:document:pending" | "form:document:navigate" | "form:review:info" | "form:review:back" | "form:review:loaded" | "form:review:failed" | "form:review:success" | "form:review:partial" | "form:review:timeout" | "form:review:ready" | "form:review:pending" | "form:review:navigate" | "form:personal:info" | "form:personal:back" | "form:personal:loaded" | "form:personal:failed" | "form:personal:success" | "form:personal:partial" | "form:personal:timeout" | "form:personal:ready" | "form:personal:pending" | "form:personal:navigate" | "form:loading:info" | "form:loading:back" | "form:loading:loaded" | "form:loading:failed" | "form:loading:success" | "form:loading:partial" | "form:loading:timeout" | "form:loading:ready" | "form:loading:pending" | "form:loading:navigate" | "form:result:info" | "form:result:back" | "form:result:loaded" | "form:result:failed" | "form:result:success" | "form:result:partial" | "form:result:timeout" | "form:result:ready" | "form:result:pending" | "form:result:navigate" | "form:retry:info" | "form:retry:back" | "form:retry:loaded" | "form:retry:failed" | "form:retry:success" | "form:retry:partial" | "form:retry:timeout" | "form:retry:ready" | "form:retry:pending" | "form:retry:navigate" | "form:doc_upload:info" | "form:doc_upload:back" | "form:doc_upload:loaded" | "form:doc_upload:failed" | "form:doc_upload:success" | "form:doc_upload:partial" | "form:doc_upload:timeout" | "form:doc_upload:ready" | "form:doc_upload:pending" | "form:doc_upload:navigate" | "form:start:info" | "form:start:back" | "form:start:loaded" | "form:start:failed" | "form:start:success" | "form:start:partial" | "form:start:timeout" | "form:start:ready" | "form:start:pending" | "form:start:navigate" | "form:required_document_upload:info" | "form:required_document_upload:back" | "form:required_document_upload:loaded" | "form:required_document_upload:failed" | "form:required_document_upload:success" | "form:required_document_upload:partial" | "form:required_document_upload:timeout" | "form:required_document_upload:ready" | "form:required_document_upload:pending" | "form:required_document_upload:navigate" | "form:partial_document_upload:info" | "form:partial_document_upload:back" | "form:partial_document_upload:loaded" | "form:partial_document_upload:failed" | "form:partial_document_upload:success" | "form:partial_document_upload:partial" | "form:partial_document_upload:timeout" | "form:partial_document_upload:ready" | "form:partial_document_upload:pending" | "form:partial_document_upload:navigate" | "form:optional_document_upload:info" | "form:optional_document_upload:back" | "form:optional_document_upload:loaded" | "form:optional_document_upload:failed" | "form:optional_document_upload:success" | "form:optional_document_upload:partial" | "form:optional_document_upload:timeout" | "form:optional_document_upload:ready" | "form:optional_document_upload:pending" | "form:optional_document_upload:navigate" | "form:verification_method_selection:info" | "form:verification_method_selection:back" | "form:verification_method_selection:loaded" | "form:verification_method_selection:failed" | "form:verification_method_selection:success" | "form:verification_method_selection:partial" | "form:verification_method_selection:timeout" | "form:verification_method_selection:ready" | "form:verification_method_selection:pending" | "form:verification_method_selection:navigate";
|
|
128
|
+
readonly means: "Review.tsx:104 calls `documentReady` after `individual().submit()` resolves — emitted on submit, NOT on render.";
|
|
129
|
+
readonly completes: true;
|
|
130
|
+
}];
|
|
131
|
+
readonly note: "Human-gated: no timeout. Advancing without this would let unreviewed data through.";
|
|
132
|
+
};
|
|
133
|
+
readonly REVIEW_VERIFY: {
|
|
134
|
+
readonly completesOn: readonly [{
|
|
135
|
+
readonly event: "form:welcome:info" | "form:welcome:back" | "form:welcome:loaded" | "form:welcome:failed" | "form:welcome:success" | "form:welcome:partial" | "form:welcome:timeout" | "form:welcome:ready" | "form:welcome:pending" | "form:welcome:navigate" | "form:consent:info" | "form:consent:back" | "form:consent:loaded" | "form:consent:failed" | "form:consent:success" | "form:consent:partial" | "form:consent:timeout" | "form:consent:ready" | "form:consent:pending" | "form:consent:navigate" | "form:document:info" | "form:document:back" | "form:document:loaded" | "form:document:failed" | "form:document:success" | "form:document:partial" | "form:document:timeout" | "form:document:ready" | "form:document:pending" | "form:document:navigate" | "form:review:info" | "form:review:back" | "form:review:loaded" | "form:review:failed" | "form:review:success" | "form:review:partial" | "form:review:timeout" | "form:review:ready" | "form:review:pending" | "form:review:navigate" | "form:personal:info" | "form:personal:back" | "form:personal:loaded" | "form:personal:failed" | "form:personal:success" | "form:personal:partial" | "form:personal:timeout" | "form:personal:ready" | "form:personal:pending" | "form:personal:navigate" | "form:loading:info" | "form:loading:back" | "form:loading:loaded" | "form:loading:failed" | "form:loading:success" | "form:loading:partial" | "form:loading:timeout" | "form:loading:ready" | "form:loading:pending" | "form:loading:navigate" | "form:result:info" | "form:result:back" | "form:result:loaded" | "form:result:failed" | "form:result:success" | "form:result:partial" | "form:result:timeout" | "form:result:ready" | "form:result:pending" | "form:result:navigate" | "form:retry:info" | "form:retry:back" | "form:retry:loaded" | "form:retry:failed" | "form:retry:success" | "form:retry:partial" | "form:retry:timeout" | "form:retry:ready" | "form:retry:pending" | "form:retry:navigate" | "form:doc_upload:info" | "form:doc_upload:back" | "form:doc_upload:loaded" | "form:doc_upload:failed" | "form:doc_upload:success" | "form:doc_upload:partial" | "form:doc_upload:timeout" | "form:doc_upload:ready" | "form:doc_upload:pending" | "form:doc_upload:navigate" | "form:start:info" | "form:start:back" | "form:start:loaded" | "form:start:failed" | "form:start:success" | "form:start:partial" | "form:start:timeout" | "form:start:ready" | "form:start:pending" | "form:start:navigate" | "form:required_document_upload:info" | "form:required_document_upload:back" | "form:required_document_upload:loaded" | "form:required_document_upload:failed" | "form:required_document_upload:success" | "form:required_document_upload:partial" | "form:required_document_upload:timeout" | "form:required_document_upload:ready" | "form:required_document_upload:pending" | "form:required_document_upload:navigate" | "form:partial_document_upload:info" | "form:partial_document_upload:back" | "form:partial_document_upload:loaded" | "form:partial_document_upload:failed" | "form:partial_document_upload:success" | "form:partial_document_upload:partial" | "form:partial_document_upload:timeout" | "form:partial_document_upload:ready" | "form:partial_document_upload:pending" | "form:partial_document_upload:navigate" | "form:optional_document_upload:info" | "form:optional_document_upload:back" | "form:optional_document_upload:loaded" | "form:optional_document_upload:failed" | "form:optional_document_upload:success" | "form:optional_document_upload:partial" | "form:optional_document_upload:timeout" | "form:optional_document_upload:ready" | "form:optional_document_upload:pending" | "form:optional_document_upload:navigate" | "form:verification_method_selection:info" | "form:verification_method_selection:back" | "form:verification_method_selection:loaded" | "form:verification_method_selection:failed" | "form:verification_method_selection:success" | "form:verification_method_selection:partial" | "form:verification_method_selection:timeout" | "form:verification_method_selection:ready" | "form:verification_method_selection:pending" | "form:verification_method_selection:navigate";
|
|
136
|
+
readonly means: "ekycFlow.ts only. ReviewDocument.tsx:239 calls `individual().submit({ verify })` itself (verify: true, passed via config), then its own :246-296 classifies the result inline (alertList/status.type/retryPages) into a RESULT_STATE, and :341-349's effect emits `ResultStates[resultStatus]` via `idvEventEmitter` — but ONLY when `docConfig.customResult` is true (also forced by ekycFlow.ts); otherwise ReviewDocument renders its own <Result> screen and never emits this row's events at all. SUCCESS = RESULT_STATE.SUCCESS (status.type 'passed'/'pass_manual').";
|
|
137
|
+
readonly completes: true;
|
|
138
|
+
}, {
|
|
139
|
+
readonly event: "form:welcome:info" | "form:welcome:back" | "form:welcome:loaded" | "form:welcome:failed" | "form:welcome:success" | "form:welcome:partial" | "form:welcome:timeout" | "form:welcome:ready" | "form:welcome:pending" | "form:welcome:navigate" | "form:consent:info" | "form:consent:back" | "form:consent:loaded" | "form:consent:failed" | "form:consent:success" | "form:consent:partial" | "form:consent:timeout" | "form:consent:ready" | "form:consent:pending" | "form:consent:navigate" | "form:document:info" | "form:document:back" | "form:document:loaded" | "form:document:failed" | "form:document:success" | "form:document:partial" | "form:document:timeout" | "form:document:ready" | "form:document:pending" | "form:document:navigate" | "form:review:info" | "form:review:back" | "form:review:loaded" | "form:review:failed" | "form:review:success" | "form:review:partial" | "form:review:timeout" | "form:review:ready" | "form:review:pending" | "form:review:navigate" | "form:personal:info" | "form:personal:back" | "form:personal:loaded" | "form:personal:failed" | "form:personal:success" | "form:personal:partial" | "form:personal:timeout" | "form:personal:ready" | "form:personal:pending" | "form:personal:navigate" | "form:loading:info" | "form:loading:back" | "form:loading:loaded" | "form:loading:failed" | "form:loading:success" | "form:loading:partial" | "form:loading:timeout" | "form:loading:ready" | "form:loading:pending" | "form:loading:navigate" | "form:result:info" | "form:result:back" | "form:result:loaded" | "form:result:failed" | "form:result:success" | "form:result:partial" | "form:result:timeout" | "form:result:ready" | "form:result:pending" | "form:result:navigate" | "form:retry:info" | "form:retry:back" | "form:retry:loaded" | "form:retry:failed" | "form:retry:success" | "form:retry:partial" | "form:retry:timeout" | "form:retry:ready" | "form:retry:pending" | "form:retry:navigate" | "form:doc_upload:info" | "form:doc_upload:back" | "form:doc_upload:loaded" | "form:doc_upload:failed" | "form:doc_upload:success" | "form:doc_upload:partial" | "form:doc_upload:timeout" | "form:doc_upload:ready" | "form:doc_upload:pending" | "form:doc_upload:navigate" | "form:start:info" | "form:start:back" | "form:start:loaded" | "form:start:failed" | "form:start:success" | "form:start:partial" | "form:start:timeout" | "form:start:ready" | "form:start:pending" | "form:start:navigate" | "form:required_document_upload:info" | "form:required_document_upload:back" | "form:required_document_upload:loaded" | "form:required_document_upload:failed" | "form:required_document_upload:success" | "form:required_document_upload:partial" | "form:required_document_upload:timeout" | "form:required_document_upload:ready" | "form:required_document_upload:pending" | "form:required_document_upload:navigate" | "form:partial_document_upload:info" | "form:partial_document_upload:back" | "form:partial_document_upload:loaded" | "form:partial_document_upload:failed" | "form:partial_document_upload:success" | "form:partial_document_upload:partial" | "form:partial_document_upload:timeout" | "form:partial_document_upload:ready" | "form:partial_document_upload:pending" | "form:partial_document_upload:navigate" | "form:optional_document_upload:info" | "form:optional_document_upload:back" | "form:optional_document_upload:loaded" | "form:optional_document_upload:failed" | "form:optional_document_upload:success" | "form:optional_document_upload:partial" | "form:optional_document_upload:timeout" | "form:optional_document_upload:ready" | "form:optional_document_upload:pending" | "form:optional_document_upload:navigate" | "form:verification_method_selection:info" | "form:verification_method_selection:back" | "form:verification_method_selection:loaded" | "form:verification_method_selection:failed" | "form:verification_method_selection:success" | "form:verification_method_selection:partial" | "form:verification_method_selection:timeout" | "form:verification_method_selection:ready" | "form:verification_method_selection:pending" | "form:verification_method_selection:navigate";
|
|
140
|
+
readonly means: "same emitter as above. FAILED = RESULT_STATE.FAIL — a duplicate/blacklist/too-many alert, or status.type 'failed' (ReviewDocument.tsx:272-289). Not a data-correction case: classified as declined, not retried.";
|
|
141
|
+
readonly completes: true;
|
|
142
|
+
}, {
|
|
143
|
+
readonly event: "form:welcome:info" | "form:welcome:back" | "form:welcome:loaded" | "form:welcome:failed" | "form:welcome:success" | "form:welcome:partial" | "form:welcome:timeout" | "form:welcome:ready" | "form:welcome:pending" | "form:welcome:navigate" | "form:consent:info" | "form:consent:back" | "form:consent:loaded" | "form:consent:failed" | "form:consent:success" | "form:consent:partial" | "form:consent:timeout" | "form:consent:ready" | "form:consent:pending" | "form:consent:navigate" | "form:document:info" | "form:document:back" | "form:document:loaded" | "form:document:failed" | "form:document:success" | "form:document:partial" | "form:document:timeout" | "form:document:ready" | "form:document:pending" | "form:document:navigate" | "form:review:info" | "form:review:back" | "form:review:loaded" | "form:review:failed" | "form:review:success" | "form:review:partial" | "form:review:timeout" | "form:review:ready" | "form:review:pending" | "form:review:navigate" | "form:personal:info" | "form:personal:back" | "form:personal:loaded" | "form:personal:failed" | "form:personal:success" | "form:personal:partial" | "form:personal:timeout" | "form:personal:ready" | "form:personal:pending" | "form:personal:navigate" | "form:loading:info" | "form:loading:back" | "form:loading:loaded" | "form:loading:failed" | "form:loading:success" | "form:loading:partial" | "form:loading:timeout" | "form:loading:ready" | "form:loading:pending" | "form:loading:navigate" | "form:result:info" | "form:result:back" | "form:result:loaded" | "form:result:failed" | "form:result:success" | "form:result:partial" | "form:result:timeout" | "form:result:ready" | "form:result:pending" | "form:result:navigate" | "form:retry:info" | "form:retry:back" | "form:retry:loaded" | "form:retry:failed" | "form:retry:success" | "form:retry:partial" | "form:retry:timeout" | "form:retry:ready" | "form:retry:pending" | "form:retry:navigate" | "form:doc_upload:info" | "form:doc_upload:back" | "form:doc_upload:loaded" | "form:doc_upload:failed" | "form:doc_upload:success" | "form:doc_upload:partial" | "form:doc_upload:timeout" | "form:doc_upload:ready" | "form:doc_upload:pending" | "form:doc_upload:navigate" | "form:start:info" | "form:start:back" | "form:start:loaded" | "form:start:failed" | "form:start:success" | "form:start:partial" | "form:start:timeout" | "form:start:ready" | "form:start:pending" | "form:start:navigate" | "form:required_document_upload:info" | "form:required_document_upload:back" | "form:required_document_upload:loaded" | "form:required_document_upload:failed" | "form:required_document_upload:success" | "form:required_document_upload:partial" | "form:required_document_upload:timeout" | "form:required_document_upload:ready" | "form:required_document_upload:pending" | "form:required_document_upload:navigate" | "form:partial_document_upload:info" | "form:partial_document_upload:back" | "form:partial_document_upload:loaded" | "form:partial_document_upload:failed" | "form:partial_document_upload:success" | "form:partial_document_upload:partial" | "form:partial_document_upload:timeout" | "form:partial_document_upload:ready" | "form:partial_document_upload:pending" | "form:partial_document_upload:navigate" | "form:optional_document_upload:info" | "form:optional_document_upload:back" | "form:optional_document_upload:loaded" | "form:optional_document_upload:failed" | "form:optional_document_upload:success" | "form:optional_document_upload:partial" | "form:optional_document_upload:timeout" | "form:optional_document_upload:ready" | "form:optional_document_upload:pending" | "form:optional_document_upload:navigate" | "form:verification_method_selection:info" | "form:verification_method_selection:back" | "form:verification_method_selection:loaded" | "form:verification_method_selection:failed" | "form:verification_method_selection:success" | "form:verification_method_selection:partial" | "form:verification_method_selection:timeout" | "form:verification_method_selection:ready" | "form:verification_method_selection:pending" | "form:verification_method_selection:navigate";
|
|
144
|
+
readonly means: "same emitter. PARTIAL = RESULT_STATE.PARTIAL — a 'partial'/'404' alert, a PROVIDER_ERROR retryPage, or status.type 'archived' (ReviewDocument.tsx:249-284), all collapsed into one bucket. ekycFlow.ts treats every case here as a data-correction retry (spec §6), which is coarser than classify.ts's own per-status reasons (e.g. 'archived' is a terminal decline there) — a deliberate simplification: ReviewDocument.tsx's own classification is trusted as-is here rather than re-derived from a second submit.";
|
|
145
|
+
readonly completes: true;
|
|
146
|
+
}, {
|
|
147
|
+
readonly event: "form:welcome:info" | "form:welcome:back" | "form:welcome:loaded" | "form:welcome:failed" | "form:welcome:success" | "form:welcome:partial" | "form:welcome:timeout" | "form:welcome:ready" | "form:welcome:pending" | "form:welcome:navigate" | "form:consent:info" | "form:consent:back" | "form:consent:loaded" | "form:consent:failed" | "form:consent:success" | "form:consent:partial" | "form:consent:timeout" | "form:consent:ready" | "form:consent:pending" | "form:consent:navigate" | "form:document:info" | "form:document:back" | "form:document:loaded" | "form:document:failed" | "form:document:success" | "form:document:partial" | "form:document:timeout" | "form:document:ready" | "form:document:pending" | "form:document:navigate" | "form:review:info" | "form:review:back" | "form:review:loaded" | "form:review:failed" | "form:review:success" | "form:review:partial" | "form:review:timeout" | "form:review:ready" | "form:review:pending" | "form:review:navigate" | "form:personal:info" | "form:personal:back" | "form:personal:loaded" | "form:personal:failed" | "form:personal:success" | "form:personal:partial" | "form:personal:timeout" | "form:personal:ready" | "form:personal:pending" | "form:personal:navigate" | "form:loading:info" | "form:loading:back" | "form:loading:loaded" | "form:loading:failed" | "form:loading:success" | "form:loading:partial" | "form:loading:timeout" | "form:loading:ready" | "form:loading:pending" | "form:loading:navigate" | "form:result:info" | "form:result:back" | "form:result:loaded" | "form:result:failed" | "form:result:success" | "form:result:partial" | "form:result:timeout" | "form:result:ready" | "form:result:pending" | "form:result:navigate" | "form:retry:info" | "form:retry:back" | "form:retry:loaded" | "form:retry:failed" | "form:retry:success" | "form:retry:partial" | "form:retry:timeout" | "form:retry:ready" | "form:retry:pending" | "form:retry:navigate" | "form:doc_upload:info" | "form:doc_upload:back" | "form:doc_upload:loaded" | "form:doc_upload:failed" | "form:doc_upload:success" | "form:doc_upload:partial" | "form:doc_upload:timeout" | "form:doc_upload:ready" | "form:doc_upload:pending" | "form:doc_upload:navigate" | "form:start:info" | "form:start:back" | "form:start:loaded" | "form:start:failed" | "form:start:success" | "form:start:partial" | "form:start:timeout" | "form:start:ready" | "form:start:pending" | "form:start:navigate" | "form:required_document_upload:info" | "form:required_document_upload:back" | "form:required_document_upload:loaded" | "form:required_document_upload:failed" | "form:required_document_upload:success" | "form:required_document_upload:partial" | "form:required_document_upload:timeout" | "form:required_document_upload:ready" | "form:required_document_upload:pending" | "form:required_document_upload:navigate" | "form:partial_document_upload:info" | "form:partial_document_upload:back" | "form:partial_document_upload:loaded" | "form:partial_document_upload:failed" | "form:partial_document_upload:success" | "form:partial_document_upload:partial" | "form:partial_document_upload:timeout" | "form:partial_document_upload:ready" | "form:partial_document_upload:pending" | "form:partial_document_upload:navigate" | "form:optional_document_upload:info" | "form:optional_document_upload:back" | "form:optional_document_upload:loaded" | "form:optional_document_upload:failed" | "form:optional_document_upload:success" | "form:optional_document_upload:partial" | "form:optional_document_upload:timeout" | "form:optional_document_upload:ready" | "form:optional_document_upload:pending" | "form:optional_document_upload:navigate" | "form:verification_method_selection:info" | "form:verification_method_selection:back" | "form:verification_method_selection:loaded" | "form:verification_method_selection:failed" | "form:verification_method_selection:success" | "form:verification_method_selection:partial" | "form:verification_method_selection:timeout" | "form:verification_method_selection:ready" | "form:verification_method_selection:pending" | "form:verification_method_selection:navigate";
|
|
148
|
+
readonly means: "same emitter. PENDING = RESULT_STATE.PENDING, the `default` branch of the status.type switch (ReviewDocument.tsx:290-292) — anything not passed/pass_manual/archived/failed and not already bucketed by an alert or retryPage.";
|
|
149
|
+
readonly completes: true;
|
|
150
|
+
}];
|
|
151
|
+
readonly note: "ekycFlow.ts does NOT call `submitAndClassify`/`individual().submit()` itself for this step — ReviewDocument.tsx's built-in verify+classify is the only submit. Consequence: the resulting `ClassifierInput` never carries `checkResult` (nothing here exposes the raw submit response — `idvEventEmitter`'s payload is `{name: 'REVIEW'}` only, ReviewDocument.tsx:342-347), so a success/pending/declined outcome via this step settles without one. Reached twice per journey by design: once for the main attempt (REVIEW screen), again from inside the RETRY module once it lands back on REVIEW (`Retry.tsx` case REVIEW renders `<ReviewDocument/>` directly) — `getEventConfig` resolves the event name from `extraEventInfo.name`, not from which screen was originally mounted, so it is still `form:review:*` either time (`layout.util.tsx:47-51`).";
|
|
152
|
+
};
|
|
153
|
+
readonly PARTIAL: {
|
|
154
|
+
readonly completesOn: readonly [{
|
|
155
|
+
readonly event: "form:welcome:info" | "form:welcome:back" | "form:welcome:loaded" | "form:welcome:failed" | "form:welcome:success" | "form:welcome:partial" | "form:welcome:timeout" | "form:welcome:ready" | "form:welcome:pending" | "form:welcome:navigate" | "form:consent:info" | "form:consent:back" | "form:consent:loaded" | "form:consent:failed" | "form:consent:success" | "form:consent:partial" | "form:consent:timeout" | "form:consent:ready" | "form:consent:pending" | "form:consent:navigate" | "form:document:info" | "form:document:back" | "form:document:loaded" | "form:document:failed" | "form:document:success" | "form:document:partial" | "form:document:timeout" | "form:document:ready" | "form:document:pending" | "form:document:navigate" | "form:review:info" | "form:review:back" | "form:review:loaded" | "form:review:failed" | "form:review:success" | "form:review:partial" | "form:review:timeout" | "form:review:ready" | "form:review:pending" | "form:review:navigate" | "form:personal:info" | "form:personal:back" | "form:personal:loaded" | "form:personal:failed" | "form:personal:success" | "form:personal:partial" | "form:personal:timeout" | "form:personal:ready" | "form:personal:pending" | "form:personal:navigate" | "form:loading:info" | "form:loading:back" | "form:loading:loaded" | "form:loading:failed" | "form:loading:success" | "form:loading:partial" | "form:loading:timeout" | "form:loading:ready" | "form:loading:pending" | "form:loading:navigate" | "form:result:info" | "form:result:back" | "form:result:loaded" | "form:result:failed" | "form:result:success" | "form:result:partial" | "form:result:timeout" | "form:result:ready" | "form:result:pending" | "form:result:navigate" | "form:retry:info" | "form:retry:back" | "form:retry:loaded" | "form:retry:failed" | "form:retry:success" | "form:retry:partial" | "form:retry:timeout" | "form:retry:ready" | "form:retry:pending" | "form:retry:navigate" | "form:doc_upload:info" | "form:doc_upload:back" | "form:doc_upload:loaded" | "form:doc_upload:failed" | "form:doc_upload:success" | "form:doc_upload:partial" | "form:doc_upload:timeout" | "form:doc_upload:ready" | "form:doc_upload:pending" | "form:doc_upload:navigate" | "form:start:info" | "form:start:back" | "form:start:loaded" | "form:start:failed" | "form:start:success" | "form:start:partial" | "form:start:timeout" | "form:start:ready" | "form:start:pending" | "form:start:navigate" | "form:required_document_upload:info" | "form:required_document_upload:back" | "form:required_document_upload:loaded" | "form:required_document_upload:failed" | "form:required_document_upload:success" | "form:required_document_upload:partial" | "form:required_document_upload:timeout" | "form:required_document_upload:ready" | "form:required_document_upload:pending" | "form:required_document_upload:navigate" | "form:partial_document_upload:info" | "form:partial_document_upload:back" | "form:partial_document_upload:loaded" | "form:partial_document_upload:failed" | "form:partial_document_upload:success" | "form:partial_document_upload:partial" | "form:partial_document_upload:timeout" | "form:partial_document_upload:ready" | "form:partial_document_upload:pending" | "form:partial_document_upload:navigate" | "form:optional_document_upload:info" | "form:optional_document_upload:back" | "form:optional_document_upload:loaded" | "form:optional_document_upload:failed" | "form:optional_document_upload:success" | "form:optional_document_upload:partial" | "form:optional_document_upload:timeout" | "form:optional_document_upload:ready" | "form:optional_document_upload:pending" | "form:optional_document_upload:navigate" | "form:verification_method_selection:info" | "form:verification_method_selection:back" | "form:verification_method_selection:loaded" | "form:verification_method_selection:failed" | "form:verification_method_selection:success" | "form:verification_method_selection:partial" | "form:verification_method_selection:timeout" | "form:verification_method_selection:ready" | "form:verification_method_selection:pending" | "form:verification_method_selection:navigate";
|
|
156
|
+
readonly means: "Result.tsx:145-149 — the RESULT screen emits on CTA click only, never on render; PARTIAL maps to `partial` (form.const.ts:225).";
|
|
157
|
+
readonly completes: true;
|
|
158
|
+
}];
|
|
159
|
+
readonly note: "spec §6 — the data-correction retry. Its CTA (\"Review details\") IS the retry action, so this screen keeps its CTA where terminal screens hide theirs (D5).";
|
|
160
|
+
};
|
|
161
|
+
readonly RESULT: {
|
|
162
|
+
readonly completesOn: readonly [{
|
|
163
|
+
readonly event: "mount() resolved — no event is emitted";
|
|
164
|
+
readonly means: "the terminal screen is non-interactive by default (`cta.hidden`, spec D5) and emits nothing on render, so the completion is `mount()` settling — resolved or rejected. Waiting on an event here is what the `form:result:ready` defect did, and the event never came.";
|
|
165
|
+
readonly completes: "when no CTA is configured (the default)";
|
|
166
|
+
}, {
|
|
167
|
+
readonly event: "form:result:{success|failed|partial|pending|timeout}";
|
|
168
|
+
readonly means: "Result.tsx:145-149 emits the event `ResultStates[state]` names, on CTA click only. The exact event per state is `RESULT_CTA_EVENT` below.";
|
|
169
|
+
readonly completes: "when the host configured a CTA (spec §7.2)";
|
|
170
|
+
}];
|
|
171
|
+
readonly note: "A CTA screen that never rendered also completes: no click can follow a screen that is not there.";
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* The event each RESULT state emits when its CTA is clicked. Mirrors
|
|
176
|
+
* `ResultStates` (`form/vendors/react/constants/form.const.ts:224`), which is
|
|
177
|
+
* what `Result.tsx:147` reads to decide what to emit.
|
|
178
|
+
*/
|
|
179
|
+
export declare const RESULT_CTA_EVENT: Record<RESULT_STATE, string>;
|
|
180
|
+
/** every engine event the capture step subscribes to, straight from the table */
|
|
181
|
+
export declare const CAPTURE_EVENTS: ("error" | "info" | "vendor_sdk_failed_loading" | "results" | "detection_complete" | "detection_failed" | "input_required" | "session_interrupted")[];
|
|
182
|
+
/** the events of the capture row, as a union — a handler map must cover them all */
|
|
183
|
+
export type CaptureEvent = (typeof CAPTURE_EVENTS)[number];
|
|
184
|
+
/**
|
|
185
|
+
* The `ocr` module's own CAPTURE row (`ocrFlow.ts`). Same event *names* as
|
|
186
|
+
* `idv`'s row above — unsurprising, since `idv` is `ocr` + biometrics composed
|
|
187
|
+
* — but NOT the same *meaning* for every vendor, so it gets its own row rather
|
|
188
|
+
* than reusing IDV's:
|
|
189
|
+
*
|
|
190
|
+
* - `detection_complete` never carries `source: 'biometrics'` here (there is no
|
|
191
|
+
* biometrics leg), so, unlike IDV, this row's listener shows the extraction
|
|
192
|
+
* screen unconditionally — nothing to suppress it for.
|
|
193
|
+
* - `error`/`input_required` status vocabulary is vendor-dependent in a way
|
|
194
|
+
* IDV's row is not fully:
|
|
195
|
+
* - Daon (`modules/ocr/vendors/Daon/index.ts`) shares `defineIframeIDVWrapper`
|
|
196
|
+
* with the idv module, so its statuses and the same Daon gap noted in the
|
|
197
|
+
* CAPTURE row above apply verbatim.
|
|
198
|
+
* - Incode/Onfido/Sumsub go through
|
|
199
|
+
* `modules/ocr/vendors/common/statusEvaluators.ts`, whose `documentStatus`
|
|
200
|
+
* is the raw `OCRStatus` enum (`modules/frankie-client/clients/OCRClient.ts`)
|
|
201
|
+
* — a different string vocabulary from IDV's `checkStatusEventMapping.ts`.
|
|
202
|
+
* `PROVIDER_OFFLINE`/`FAILED`/`WAITING_OCR_RUN` all emit a payload-less
|
|
203
|
+
* `error` there (statusEvaluators.ts:26-49), never `input_required`.
|
|
204
|
+
*
|
|
205
|
+
* KNOWN GAP, flagged rather than guessed at: `statusEvaluators.ts`'s `default`
|
|
206
|
+
* branch emits `input_required` for every other `OCRStatus`, including
|
|
207
|
+
* `WAITING_BACK`/`WAITING_FRONT` (still waiting for the other side of a
|
|
208
|
+
* two-sided document) and `AWAITING_DOCUMENT_UPLOAD_INVALID_TYPE` /
|
|
209
|
+
* `AWAITING_DOCUMENT_UPLOAD_FAILED_OCR` / `DOCUMENT_INVALID_EXCEEDED_SIZE_LIMIT`
|
|
210
|
+
* / `DOCUMENT_INVALID_INCORRECT_FILE_FORMAT` / `SHARE_DECLINED` (upload
|
|
211
|
+
* failures). Whether `WAITING_BACK`/`WAITING_FRONT` ever reach this listener,
|
|
212
|
+
* as opposed to being resolved inside the vendor's own capture UI before it
|
|
213
|
+
* gets here, is not yet confirmed against Onfido/Incode's full init flow.
|
|
214
|
+
* `ocrFlow.ts`'s recapture list only treats the confirmed failure statuses as
|
|
215
|
+
* a recapture; an unconfirmed status still settles safely as `unmapped_status`
|
|
216
|
+
* (diagnosable) rather than being silently misclassified either way.
|
|
217
|
+
*/
|
|
218
|
+
export declare const OCR_CAPTURE_EVENTS: ("error" | "info" | "vendor_sdk_failed_loading" | "results" | "detection_complete" | "detection_failed" | "input_required" | "session_interrupted")[];
|
|
219
|
+
/** the events of the ocr capture row, as a union — a handler map must cover them all */
|
|
220
|
+
export type OcrCaptureEvent = CaptureEvent;
|
|
221
|
+
/**
|
|
222
|
+
* Every `form:review:*` outcome event the REVIEW_VERIFY step subscribes to
|
|
223
|
+
* (ekycFlow.ts). Values still come from the table at runtime — only the
|
|
224
|
+
* *type* is asserted narrow: `FORM_REVIEW_SUCCESS` and friends are typed
|
|
225
|
+
* `FormEventKeyType` (every `FormEvents` key) at their declaration in
|
|
226
|
+
* `@module/form/events`, which is too wide for a per-event handler map, and
|
|
227
|
+
* `as const` on an object literal cannot narrow a reference to an
|
|
228
|
+
* already-typed constant back down. Order must match the REVIEW_VERIFY row.
|
|
229
|
+
*/
|
|
230
|
+
export declare const REVIEW_VERIFY_EVENTS: readonly ["form:review:success", "form:review:failed", "form:review:partial", "form:review:pending"];
|
|
231
|
+
/** the events of the review-verify row, as a union — a handler map must cover them all */
|
|
232
|
+
export type ReviewVerifyEvent = (typeof REVIEW_VERIFY_EVENTS)[number];
|
|
233
|
+
export declare const completingEventsFor: (step: JourneyStep) => readonly string[];
|
|
234
|
+
//# sourceMappingURL=stepTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepTable.d.ts","sourceRoot":"","sources":["../../../../../modules/journey/steps/stepTable.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,SAAS,GACT,SAAS,GACT,SAAS,GACT,UAAU,GACV,UAAU,GACV,QAAQ,GACR,eAAe,GACf,SAAS,GACT,QAAQ,CAAC;AAEb;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,gDAA2C,CAAC;AAEvE,MAAM,MAAM,UAAU,GAAG;IACvB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IACnC,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkLqB,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CASzD,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,cAAc,uJAE1B,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,kBAAkB,uJAAiB,CAAC;AAEjD,wFAAwF;AACxF,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC;AAE3C;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAGf,SAAS,CACvB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,CACtB,CAAC;AAEJ,0FAA0F;AAC1F,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAWtE,eAAO,MAAM,mBAAmB,SAAU,WAAW,KAAG,SAAS,MAAM,EAIrC,CAAC"}
|