import {VerifierBase} from './verifier-base.js'; import {MsLivenessStateContainerForPublicData, MsLivenessVerifierSettings, UploadReadyData} from '../generated/zenid-types.generated.js'; import {SdkVerifierType, VerifierState} from '../generated/zenid-enums.generated.js'; import {ICamera, IVisualizer, OnFrameProcessedCallback} from "../../interfaces/verification-system-interfaces.js"; export class MsLivenessVerifier extends VerifierBase { constructor() { super(SdkVerifierType.MsLiveness); } protected override async runProcessingLoop(camera: ICamera, visualizer: IVisualizer, onGiveMe?: ((state: MsLivenessStateContainerForPublicData) => Promise) | null, onFrameProcessed?: OnFrameProcessedCallback, signal?: AbortSignal): Promise { signal?.addEventListener("abort", () => { this.stopCameraLoopRequested = true; }); let stateContainer: MsLivenessStateContainerForPublicData; while (!this.stopCameraLoopRequested) try { stateContainer = await this.getStateContainer(); let response: string | null = null; if (stateContainer.State === VerifierState.GiveMe) { visualizer.drawOverlay(this, ""); response = await onGiveMe!(stateContainer); } if (response || stateContainer.State === VerifierState.InProgress) { await this.submitExternalResponse(response || ""); stateContainer = await this.getStateContainer(); } switch (stateContainer.State) { case VerifierState.Success: return this.getUploadReadyData(); case VerifierState.InProgress: { let renderCommands = await this.getRenderCommands(visualizer.getWidth(), visualizer.getHeight()); visualizer.drawOverlay(this, renderCommands); break; } } } catch (error) { // Propagate to the central sink (ZenidController.runVerifier) for full-cause logging. throw error; } return null; } }