Websockets

This page is currently only available in English

Integration with websockets can be achieved using the Identrix Websocket API.

Websocket API

The Identrix Websocket API allows you to connect to the Identrix service and receive real-time updates on the status of your scans and other info.

What are websockets?

WebSockets are a protocol that provides full duplex, persistent communication over a single TCP connection. After an initial HTTP upgrade handshake, the connection remains open, allowing both client and server to send messages independently and at any time. This removes the need for repeated HTTP requests and enables low latency, real time data exchange.

From a systems perspective, WebSockets shift communication from stateless request response interactions to a stateful, event driven model. Messages are sent as lightweight frames and can be either text or binary, making the protocol efficient for high frequency updates. Because connections are long lived, servers must explicitly manage connection state, lifecycle, flow control, and resource usage.

Within this documentation, WebSockets form the foundation for command based interaction between clients and services. Once a connection is established, clients issue structured commands and receive asynchronous responses or events over the same channel. The following sections describe how to establish a connection, authenticate, and interact with the available service commands.

Using the Websocket API

After setting up the websocket connection, you can send commands to the Identrix service using the command API.

Settings up a websocket connection

Here is a very simplified example of how to set up a websocket connection in a React component using a simple Hook:

useWebSocket.ts
import { useEffect, useRef } from "react";

type CommandMessage = {
  type: string;
  payload?: unknown;
};

export function useWebSocket(url: string) {
  const socketRef = useRef<WebSocket | null>(null);

  useEffect(() => {
    const socket = new WebSocket(url);
    socketRef.current = socket;

    socket.onopen = () => {
      console.log("WebSocket connected");
    };

    socket.onmessage = (event) => {
      const message = JSON.parse(event.data);
      console.log("Received:", message);
    };

    socket.onerror = (err) => {
      console.error("WebSocket error", err);
    };

    socket.onclose = () => {
      console.log("WebSocket closed");
    };

    return () => {
      socket.close();
    };
  }, [url]);

  const sendCommand = (command: CommandMessage) => {
    if (socketRef.current?.readyState === WebSocket.OPEN) {
      socketRef.current.send(JSON.stringify(command));
    }
  };

  return { sendCommand };
}

You could then use the sendCommand function to send commands to the Identrix service.

const { sendCommand } = useWebSocket("wss://example.com/ws");

sendCommand({
  type: "ping",
  payload: { timestamp: Date.now() },
});

Identrix Websocket Command structure

Messages that get send from a frontend to the server have a simple structure:

command.json
{
  "action": "command",
  "data" : <data>
}

and is typed as CommandMessage

type CommandMessage = {
  action: string;
  data: unknown;
};

the action field is required and the data field is optional and can be of any type, depending on the command.

Available Commands

Config command

Sending the config command will return the current configuration of the Identrix service.

The command JSON payload looks like this:

configCommand.json
{
  "action": "config",
  "data": null
}

Device command

Sending the device command will return the current active device and its relevant information / status.

The command JSON payload looks like this:

deviceCommand.json
{
  "action": "device",
  "data": null
}

Available Messages / Events

The server can send the following messages to the client, either as server initiated events or responses to commands the client has sent.

Current Configuration

The current config will be sent as a message to the client on connect, as well as when the config changes and also when the clients asks for the current config.

The message might look something like this:

configMessage.json
{
  "action": "config",
  "data": {

  }
}

The message is typed as ConfigMessage

configMessage.ts
export enum LogLevel {
  Verbose = 0,
  Debug = 1,
  Info = 2,
  Warning = 3,
  Error = 4,
  Off = 5,
}

export interface System {
  Debug: boolean;
  ToFile: boolean;
  Filename: string;
  LogLevel: LogLevel;
}

export interface MrzParseSettings {
  AutoCleanParts: boolean;
  UseCorrector: boolean;
  IgnoreFillerChecksNonZero: boolean;
  AllowExperimentalParsers: boolean;
  AddExtendedInfo: boolean;
  AddChecksInfo: boolean;
  AgeTop: number;
  AgeBottom: number;
  TranslateIds: boolean;
  OutputFormat: string;
}

export enum StopBits {
  One = 0,
  OnePointFive = 1,
  Two = 2,
}

export enum Parity {
  None = 0,
  Odd = 1,
  Even = 2,
  Mark = 3,
  Space = 4,
}

export interface SerialProperties {
  BaudRate: number;
  DataBits: number;
  StopBits: StopBits;
  Parity: Parity;
  Timeout: number;
}

export interface SerialSettings {
  AutoConnect: boolean;
  PreferredPortName: string;
  PreferredVidPid: string;
  Properties: SerialProperties;
}

export type BaseOutputItemConfig = StringMap;

export interface OutputEntry {
  Name: string;
  Format: string;
  Config: BaseOutputItemConfig;
}

type OutputEntryList = OutputEntry[];

export interface OutputSettings {
  Enabled: boolean;
  OutputItems: OutputEntryList;
}

export interface ServerSettings {
  Enabled: boolean;
  Port: number;
  RootFolder: string;
  AutoOpen: boolean;
}

export enum AccessModeType {
  AM_Fast = "fast",
  AM_Secure = "secure",
}

export interface NFCReadingModes {
  SmartAgeMode: boolean;
  AccessMode: AccessModeType;
}

export interface NFCImages {
  Convertjp2: boolean;
  Quality: number;
}

export interface NfcOutputIncludes {
  SimpleDataList: boolean;
  SimpleImageList: boolean;
  FullInfo: boolean;
  ParsedList: boolean;
}

export interface NFCSettings {
  Enabled: boolean;
  DumpRaw: boolean;
  DumpRawFolder: string;
  ReadPhoto: boolean;
  ApduLog: boolean;
  ApduLogFile: string;
  Reading: NFCReadingModes;
  Images: NFCImages;
  Output: NfcOutputIncludes;
}
export interface Settings {
  System: System;
  Mrz: MrzParseSettings;
  Nfc: NFCSettings;
  Serial: SerialSettings;
  Output: OutputSettings;
  Server: ServerSettings;
  CustomFields: StringMap;
}

type ConfigMessage = {
  Action: string;
  Data: Settings;
};

Current Device

The current device will be sent as a message to the client on connect, as well as when the device changes and also when the clients asks for the current device.

The message might look something like this:

deviceMessage.json
{
  "Action": "device",
  "Data": {
    "Title": "VCOM Device name",
    "Port": "COM3",
    "Vid": "1234",
    "Pid": "5678",
    "Serial": "123456789",
    "VpInfo": {
      "Vid": {
        "Vid": "1234",
        "Name": "Vendor Name",
        "NiceName": "Actual vendor display name"
      },
      "Pid": {
        "Pid": "5678",
        "Name": "Product Name",
        "NiceName": "Actual product display name"
      }
    }
  }
}

The message type looks like this:

deviceMessage.ts
export interface VendorBase {
  Vid: string;
  Name: string;
  NiceName: string;
}

export interface ProductBase {
  Pid: string;
  Name: string;
  NiceName: string;
}

export interface VidPidInfo {
  Vid: VendorBase;
  Pid: ProductBase;
}

export interface DeviceEntry {
  Title: string;
  Port: string;
  Vid: string;
  Pid: string;
  Serial: string;
  VpInfo: VidPidInfo;
}

type DeviceMessage = {
  Action: string;
  Data: DeviceEntry;
};

Scan Status Updates

Scan process updates are sent during the scan process. They will contain a list al all steps that need to be performed during the scan process, as wel as overall info on the scan progress in total.

Depending on your chosen scan related settings and the type of document you are scanning, more or less different types of steps will be involved.

You can use the ProgressMessage type to parse the updates and display them to the user or to track the progress of the scan process.

The scan status updates are sent as a ProgressMessage and look like this:

progressMessage.json
{
  "action": "progress",
  "data": {
    "CurrentItem": 0,
    "TotalItems": 0,
    "OverallPercent": 0,
    "ActiveStepPercent": 0,
    "OverallPercentInt": 0,
    "ActiveStepPercentInt": 0,
    "StepsComplete": 0,
    "IsComplete": false,
    "Steps": [
      {
        "Current": 0,
        "Total": 0,
        "Key": "",
        "Msg": ""
      }
    ]
  }
}

The ProgressMessage type looks like this:

progressMessage.ts
export interface ProgressItem {
  Current: number;
  Total: number;
  Key: string;
  Msg: string;
}

export interface ProgressInfo {
  CurrentItem: number;
  TotalItems: number;
  OverallPercent: number;
  ActiveStepPercent: number;
  OverallPercentInt: number;
  ActiveStepPercentInt: number;
  StepsComplete: number;
  IsComplete: boolean;
  Steps: ProgressItem[];
}

type ProgressMessage = {
  Action: string;
  Data: ProgressInfo;
};

Scan Result Data

Once the scan process is complete, the scan results will be sent as a ScanResultMessage and look something like this:

For a more detailed explanation of the ScanResultMessage type, see the Detailed output explanation.

scanResultMessage.json
{
  "Action": "result",
  "Data": {
    "Mrz": {
      "Settings": {
        "AutoCleanParts": true,
        "UseCorrector": false,
        "IgnoreFillerChecksNonZero": true,
        "AllowExperimentalParsers": true,
        "AddExtendedInfo": true,
        "AddChecksInfo": true,
        "AgeTop": 18,
        "AgeBottom": 16,
        "TranslateIds": false,
        "OutputFormat": "TEXT"
      },
      "MrzData": {
        "RawData": "I\u003cNLDSPECI20245\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c8003100F3407172NLD\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c2DE\u003cBRUIJN\u003c\u003cWILLEKE\u003cLISELOTTE\u003c\u003c",
        "Lines": [
          "I\u003cNLDSPECI20245\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c",
          "8003100F3407172NLD\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c2",
          "DE\u003cBRUIJN\u003c\u003cWILLEKE\u003cLISELOTTE\u003c\u003c"
        ],
        "WasCorrected": false,
        "CorrectedData": "",
        "InvalidChars": []
      },
      "Parts": [
        {
          "Id": "code",
          "Line": 0,
          "Offset": 0,
          "Length": 1,
          "Corrector": 6,
          "Raw": "I",
          "Overlapped": false
        },
        {
          "Id": "subcode",
          "Line": 0,
          "Offset": 1,
          "Length": 1,
          "Corrector": 0,
          "Raw": "\u003c",
          "Overlapped": false
        },
        {
          "Id": "issuer",
          "Line": 0,
          "Offset": 2,
          "Length": 3,
          "Corrector": 2,
          "Raw": "NLD",
          "Overlapped": false
        },
        {
          "Id": "docnum",
          "Line": 0,
          "Offset": 5,
          "Length": 9,
          "Corrector": 0,
          "Raw": "SPECI2024",
          "Overlapped": false
        },
        {
          "Id": "cd_docnum",
          "Line": 0,
          "Offset": 14,
          "Length": 1,
          "Corrector": 4,
          "Raw": "5",
          "Overlapped": false
        },
        {
          "Id": "opt1",
          "Line": 0,
          "Offset": 15,
          "Length": 15,
          "Corrector": 0,
          "Raw": "\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c",
          "Overlapped": false
        },
        {
          "Id": "dob",
          "Line": 1,
          "Offset": 0,
          "Length": 6,
          "Corrector": 3,
          "Raw": "800310",
          "Overlapped": false
        },
        {
          "Id": "cd_dob",
          "Line": 1,
          "Offset": 6,
          "Length": 1,
          "Corrector": 4,
          "Raw": "0",
          "Overlapped": false
        },
        {
          "Id": "sex",
          "Line": 1,
          "Offset": 7,
          "Length": 1,
          "Corrector": 5,
          "Raw": "F",
          "Overlapped": false
        },
        {
          "Id": "exp",
          "Line": 1,
          "Offset": 8,
          "Length": 6,
          "Corrector": 3,
          "Raw": "340717",
          "Overlapped": false
        },
        {
          "Id": "cd_exp",
          "Line": 1,
          "Offset": 14,
          "Length": 1,
          "Corrector": 4,
          "Raw": "2",
          "Overlapped": false
        },
        {
          "Id": "nat",
          "Line": 1,
          "Offset": 15,
          "Length": 3,
          "Corrector": 2,
          "Raw": "NLD",
          "Overlapped": false
        },
        {
          "Id": "opt2",
          "Line": 1,
          "Offset": 18,
          "Length": 11,
          "Corrector": 0,
          "Raw": "\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c",
          "Overlapped": false
        },
        {
          "Id": "cd_comp",
          "Line": 1,
          "Offset": 29,
          "Length": 1,
          "Corrector": 4,
          "Raw": "2",
          "Overlapped": false
        },
        {
          "Id": "name",
          "Line": 2,
          "Offset": 0,
          "Length": 30,
          "Corrector": 2,
          "Raw": "DE\u003cBRUIJN\u003c\u003cWILLEKE\u003cLISELOTTE\u003c\u003c",
          "Overlapped": false
        }
      ],
      "Values": {
        "cd_comp": "2",
        "cd_dob": "0",
        "cd_docnum": "5",
        "cd_exp": "2",
        "code": "I",
        "composite": "SPECI20245\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c80031003407172",
        "dob": "800310",
        "docidcode": "I-\u003c-TD1",
        "docnum": "SPECI2024",
        "exp": "340717",
        "issuer": "NLD",
        "kmrz": "SPECI2024580031003407172",
        "kmrzfixed": "SPECI2024580031003407172",
        "name": "DE\u003cBRUIJN\u003c\u003cWILLEKE\u003cLISELOTTE",
        "name_first": "WILLEKE LISELOTTE",
        "name_last": "DE BRUIJN",
        "nat": "NLD",
        "opt1": "",
        "opt2": "",
        "refugee_doctype": "0",
        "sex": "F",
        "subcode": "\u003c"
      },
      "CheckDigits": [
        {
          "Id": "cd_docnum",
          "Name": "cd_docnum",
          "FromData": "SPECI2024",
          "Read": "5",
          "Calc": "5",
          "IsValid": true
        },
        {
          "Id": "cd_dob",
          "Name": "cd_dob",
          "FromData": "800310",
          "Read": "0",
          "Calc": "0",
          "IsValid": true
        },
        {
          "Id": "cd_exp",
          "Name": "cd_exp",
          "FromData": "340717",
          "Read": "2",
          "Calc": "2",
          "IsValid": true
        },
        {
          "Id": "cd_comp",
          "Name": "cd_comp",
          "FromData": "SPECI20245\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c80031003407172",
          "Read": "2",
          "Calc": "2",
          "IsValid": true
        }
      ],
      "IsVisa": false,
      "ExtendedDocNumber": false,
      "ExtendedInfo": {
        "Values": {
          "age": "44",
          "dob_iso": "1980-03-10T00:00:00",
          "dob_nice": "10-03-1980",
          "docidname": "Identity Card",
          "exp_iso": "2034-07-17T00:00:00",
          "exp_nice": "17-07-2034",
          "initials": "W.L.",
          "issuer_name": "Netherlands, the (NLD)",
          "name_full": "Willeke Liselotte De Bruijn",
          "name_parsed_first": "Willeke Liselotte",
          "name_parsed_last": "Bruijn",
          "name_parsed_prefix": "de",
          "nat_name": "Netherlands, the (NLD)",
          "refugee_doctype_code": "N/A",
          "refugee_doctype_desc": "N/A",
          "refugee_doctype_name": "N/A",
          "sex_value": "Female"
        }
      },
      "CheckInfo": [
        {
          "Id": "check_doc_not_expired",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "check_age",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "check_digits",
          "Ok": true,
          "State": 1
        }
      ],
      "ParserInfo": {
        "Type": 2,
        "Description": "ICAO TD1 Travel Document",
        "Name": "TD1",
        "IsExperimental": false
      },
      "OptDataParserUsed": ""
    },
    "Nfc": {
      "DocType": "EMRTD",
      "Error": "",
      "Atr": "O4WAAYBzhCHgsg==",
      "Ats": "gHOEIeCQAA==",
      "AuthStatus": {
        "ActiveAuthentication": {
          "AuthState": 1,
          "WasPerformed": true,
          "Reason": "",
          "Info": ""
        },
        "PassiveAuthentication": {
          "AuthState": 2,
          "WasPerformed": true,
          "Reason": "unable to verify SignedData (SOD): error: unable to locate parent certificate (SKI:4b0a407df6272538ce67cb9b3ff6c2b4b41097d038c562e5e95b672fc2a87acd)",
          "Info": ""
        },
        "ChipAuthentication": {
          "AuthState": 1,
          "WasPerformed": true,
          "Reason": "",
          "Info": ""
        },
        "ChipAuthStatus": 2,
        "DSDataVerified": {
          "AuthState": 1,
          "WasPerformed": true,
          "Reason": "",
          "Info": ""
        },
        "DSCSCAVerified": {
          "AuthState": 2,
          "WasPerformed": true,
          "Reason": "CSCA certificate chain verification failed: error: unable to locate parent certificate (SKI:4b0a407df6272538ce67cb9b3ff6c2b4b41097d038c562e5e95b672fc2a87acd)",
          "Info": ""
        },
        "AccessMethod": 3
      },
      "DGInfos": [
        {
          "Num": 1,
          "OnChip": true,
          "Read": true,
          "SodHash": "j81+g2Zks3sYZjkDVlHysPL5rn/vzER6uTM2mpI5/0Y=",
          "CalcHash": "j81+g2Zks3sYZjkDVlHysPL5rn/vzER6uTM2mpI5/0Y=",
          "Match": true
        },
        {
          "Num": 2,
          "OnChip": true,
          "Read": true,
          "SodHash": "RnaH0h8070K3QEkU/cYo2iV74kT4nxLG5yBMOPOTdFk=",
          "CalcHash": "RnaH0h8070K3QEkU/cYo2iV74kT4nxLG5yBMOPOTdFk=",
          "Match": true
        },
        {
          "Num": 3,
          "OnChip": true,
          "Read": false,
          "SodHash": "jFBXfDIiTaLMlW3/yduRYArp0AnNPntTKDXlrhrHJlw=",
          "CalcHash": null,
          "Match": false
        },
        {
          "Num": 4,
          "OnChip": false,
          "Read": false,
          "SodHash": null,
          "CalcHash": null,
          "Match": false
        },
        {
          "Num": 5,
          "OnChip": false,
          "Read": false,
          "SodHash": null,
          "CalcHash": null,
          "Match": false
        },
        {
          "Num": 6,
          "OnChip": false,
          "Read": false,
          "SodHash": null,
          "CalcHash": null,
          "Match": false
        },
        {
          "Num": 7,
          "OnChip": false,
          "Read": false,
          "SodHash": null,
          "CalcHash": null,
          "Match": false
        },
        {
          "Num": 8,
          "OnChip": false,
          "Read": false,
          "SodHash": null,
          "CalcHash": null,
          "Match": false
        },
        {
          "Num": 9,
          "OnChip": false,
          "Read": false,
          "SodHash": null,
          "CalcHash": null,
          "Match": false
        },
        {
          "Num": 10,
          "OnChip": false,
          "Read": false,
          "SodHash": null,
          "CalcHash": null,
          "Match": false
        },
        {
          "Num": 11,
          "OnChip": false,
          "Read": false,
          "SodHash": null,
          "CalcHash": null,
          "Match": false
        },
        {
          "Num": 12,
          "OnChip": false,
          "Read": false,
          "SodHash": null,
          "CalcHash": null,
          "Match": false
        },
        {
          "Num": 13,
          "OnChip": false,
          "Read": false,
          "SodHash": null,
          "CalcHash": null,
          "Match": false
        },
        {
          "Num": 14,
          "OnChip": true,
          "Read": true,
          "SodHash": "uV3qZm3lND5EMqva5oiXRRAgfrYj4cBiSCGG2Z9msaI=",
          "CalcHash": "uV3qZm3lND5EMqva5oiXRRAgfrYj4cBiSCGG2Z9msaI=",
          "Match": true
        },
        {
          "Num": 15,
          "OnChip": true,
          "Read": true,
          "SodHash": "adDngMVBab/UGPUvMU2aVxfRPhqjobZs88SFmyTJJ6Y=",
          "CalcHash": "adDngMVBab/UGPUvMU2aVxfRPhqjobZs88SFmyTJJ6Y=",
          "Match": true
        },
        {
          "Num": 16,
          "OnChip": false,
          "Read": false,
          "SodHash": null,
          "CalcHash": null,
          "Match": false
        }
      ],
      "ComDGs": [
        1,
        2,
        3,
        14,
        15
      ],
      "SodDGs": [
        1,
        2,
        3,
        14,
        15
      ],
      "SodCertChain": [
        {
          "Raw": "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",
          "Info": {
            "Version": "v3 (2)",
            "Serial": "72",
            "Issuer": "C=NL, O=Kingdom of the Netherlands - Specimen, OU=Kingdom of the Netherlands - Specimen, CN=CSCA NL - Specimen, SERIALNUMBER=3",
            "Subject": "C=NL, O=Kingdom of the Netherlands - Specimen, OU=Kingdom of the Netherlands - Specimen, CN=DS-M-02 NL - Specimen, SERIALNUMBER=17",
            "NotBefore": "2024-04-16T00:00:00Z",
            "NotAfter": "2034-08-16T00:00:00Z",
            "SignatureAlgorithm": "1.2.840.113549.1.1.11 (sha256WithRSAEncryption)",
            "PublicKeyAlgorithm": "1.2.840.113549.1.1.1 (rsaEncryption)",
            "Feature": "243e4d6d447de7e38c07887938d787810640ccf5"
          }
        }
      ],
      "CardSecCertChain": null,
      "VerifyInfos": [
        {
          "Id": "mandatory_files",
          "Title": "Mandatory files",
          "Desc": "Checks if all mandatory files are present",
          "State": true,
          "Reason": "One or more mandatory files are missing (COM,SOD,DG1,DG2)"
        },
        {
          "Id": "dg14_file",
          "Title": "DG14 file",
          "Desc": "Checks if DG14 file is present",
          "State": true,
          "Reason": "DG14 file missing but referenced by SOD"
        },
        {
          "Id": "cardaccess_secinfos",
          "Title": "CardAccess SecInfos",
          "Desc": "Check if CardAccess SecInfos are present within DG14",
          "State": true,
          "Reason": "CardAccess SecInfos are not present within DG14"
        },
        {
          "Id": "dg15_file",
          "Title": "DG15 file",
          "Desc": "Checks if DG15 file is present",
          "State": true,
          "Reason": "DG15 file missing but referenced by SOD"
        },
        {
          "Id": "dg_hashes",
          "Title": "DG File Hashes",
          "Desc": "Checks if all file hashes match",
          "State": true,
          "Reason": "One or more file hashes do not match"
        },
        {
          "Id": "mrz_match",
          "Title": "MRZ's match",
          "Desc": "Checks if document \u0026 chip MRZ's match",
          "State": true,
          "Reason": "MRZ's are different"
        },
        {
          "Id": "com_vs_sod",
          "Title": "DG List COM vs SOD",
          "Desc": "Checks if DG lists match",
          "State": true,
          "Reason": "DG list does not match"
        }
      ],
      "dataitems": [
        {
          "Dg": -1,
          "Type": 1,
          "Cat": "Document",
          "Name": "ComLdsVersion",
          "Value": "0108",
          "Raw": null
        },
        {
          "Dg": -1,
          "Type": 1,
          "Cat": "Document",
          "Name": "ComUnicodeVersion",
          "Value": "040000",
          "Raw": null
        },
        {
          "Dg": -1,
          "Type": 1,
          "Cat": "Document",
          "Name": "ComTagList",
          "Value": "97,117,99,110,111",
          "Raw": null
        },
        {
          "Dg": -1,
          "Type": 1,
          "Cat": "Document",
          "Name": "ComDgList",
          "Value": "1,2,3,14,15",
          "Raw": null
        },
        {
          "Dg": -2,
          "Type": 1,
          "Cat": "Document",
          "Name": "SodDgList",
          "Value": "1,2,3,14,15",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Other",
          "Name": "MRZ",
          "Value": "I\u003cNLDSPECI20245\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c8003100F3407172NLD\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c2DE\u003cBRUIJN\u003c\u003cWILLEKE\u003cLISELOTTE\u003c\u003c",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Document",
          "Name": "MRZRaw",
          "Value": "I\u003cNLDSPECI20245\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c8003100F3407172NLD\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c2DE\u003cBRUIJN\u003c\u003cWILLEKE\u003cLISELOTTE\u003c\u003c",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.opt2",
          "Value": "",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.kmrz",
          "Value": "SPECI2024580031003407172",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.opt1",
          "Value": "",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.cd_dob",
          "Value": "0",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.sex",
          "Value": "F",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.name",
          "Value": "DE\u003cBRUIJN\u003c\u003cWILLEKE\u003cLISELOTTE",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.name_last",
          "Value": "DE BRUIJN",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.code",
          "Value": "I",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.docnum",
          "Value": "SPECI2024",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.cd_docnum",
          "Value": "5",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.exp",
          "Value": "340717",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.cd_exp",
          "Value": "2",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.nat",
          "Value": "NLD",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.name_first",
          "Value": "WILLEKE LISELOTTE",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.docidcode",
          "Value": "I-\u003c-TD1",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.subcode",
          "Value": "\u003c",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.dob",
          "Value": "800310",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.cd_comp",
          "Value": "2",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.kmrzfixed",
          "Value": "SPECI2024580031003407172",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.composite",
          "Value": "SPECI20245\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c80031003407172",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.refugee_doctype",
          "Value": "0",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.Value.issuer",
          "Value": "NLD",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.dob_nice",
          "Value": "10-03-1980",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.sex_value",
          "Value": "Female",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.name_parsed_last",
          "Value": "Bruijn",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.docidname",
          "Value": "Identity Card",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.dob_iso",
          "Value": "1980-03-10T00:00:00",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.exp_nice",
          "Value": "17-07-2034",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.name_parsed_first",
          "Value": "Willeke Liselotte",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.name_full",
          "Value": "Willeke Liselotte De Bruijn",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.nat_name",
          "Value": "Netherlands, the (NLD)",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.initials",
          "Value": "W.L.",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.refugee_doctype_code",
          "Value": "N/A",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.refugee_doctype_name",
          "Value": "N/A",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.refugee_doctype_desc",
          "Value": "N/A",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.age",
          "Value": "44",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.exp_iso",
          "Value": "2034-07-17T00:00:00",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.issuer_name",
          "Value": "Netherlands, the (NLD)",
          "Raw": null
        },
        {
          "Dg": 1,
          "Type": 1,
          "Cat": "Raw",
          "Name": "Mrz.ExtendedInfo.Value.name_parsed_prefix",
          "Value": "de",
          "Raw": null
        }
      ],
      "imageitems": [
        {
          "Dg": 2,
          "Name": "FacialImage0",
          "Kind": 0,
          "Type": 1,
          "Raw": "<base64_encode_jpeg_image>"
        }
      ],
      "SpecialFiles": {
        "CardAccess": true,
        "CardSecurity": false,
        "COM": true,
        "SOD": true,
        "DIR": true,
        "AtrInfo": true,
        "CVCA": true
      }
    },
    "ProcessedOutput": {
      "age": {
        "Key": "age",
        "SourceKey": "age",
        "Value": "44",
        "Category": "holder",
        "Type": 1
      },
      "cd_comp": {
        "Key": "cd_comp",
        "SourceKey": "cd_comp",
        "Value": "2",
        "Category": "general",
        "Type": 2
      },
      "cd_dob": {
        "Key": "cd_dob",
        "SourceKey": "cd_dob",
        "Value": "0",
        "Category": "general",
        "Type": 2
      },
      "cd_docnum": {
        "Key": "cd_docnum",
        "SourceKey": "cd_docnum",
        "Value": "5",
        "Category": "general",
        "Type": 2
      },
      "cd_exp": {
        "Key": "cd_exp",
        "SourceKey": "cd_exp",
        "Value": "2",
        "Category": "general",
        "Type": 2
      },
      "code": {
        "Key": "code",
        "SourceKey": "code",
        "Value": "I",
        "Category": "document",
        "Type": 2
      },
      "composite": {
        "Key": "composite",
        "SourceKey": "composite",
        "Value": "SPECI20245\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c80031003407172",
        "Category": "general",
        "Type": 2
      },
      "dob": {
        "Key": "dob",
        "SourceKey": "dob",
        "Value": "800310",
        "Category": "holder",
        "Type": 2
      },
      "dob_iso": {
        "Key": "dob_iso",
        "SourceKey": "dob_iso",
        "Value": "1980-03-10T00:00:00",
        "Category": "holder",
        "Type": 5
      },
      "dob_nice": {
        "Key": "dob_nice",
        "SourceKey": "dob_nice",
        "Value": "10-03-1980",
        "Category": "holder",
        "Type": 2
      },
      "docidcode": {
        "Key": "docidcode",
        "SourceKey": "docidcode",
        "Value": "I-\u003c-TD1",
        "Category": "document",
        "Type": 2
      },
      "docidname": {
        "Key": "docidname",
        "SourceKey": "docidname",
        "Value": "Identity Card",
        "Category": "document",
        "Type": 2
      },
      "docnum": {
        "Key": "docnum",
        "SourceKey": "docnum",
        "Value": "SPECI2024",
        "Category": "document",
        "Type": 2
      },
      "exp": {
        "Key": "exp",
        "SourceKey": "exp",
        "Value": "340717",
        "Category": "document",
        "Type": 2
      },
      "exp_iso": {
        "Key": "exp_iso",
        "SourceKey": "exp_iso",
        "Value": "2034-07-17T00:00:00",
        "Category": "document",
        "Type": 5
      },
      "exp_nice": {
        "Key": "exp_nice",
        "SourceKey": "exp_nice",
        "Value": "17-07-2034",
        "Category": "document",
        "Type": 2
      },
      "initials": {
        "Key": "initials",
        "SourceKey": "initials",
        "Value": "W.L.",
        "Category": "holder",
        "Type": 2
      },
      "issuer": {
        "Key": "issuer",
        "SourceKey": "issuer",
        "Value": "NLD",
        "Category": "document",
        "Type": 2
      },
      "issuer_name": {
        "Key": "issuer_name",
        "SourceKey": "issuer_name",
        "Value": "Netherlands, the (NLD)",
        "Category": "document",
        "Type": 2
      },
      "kmrz": {
        "Key": "kmrz",
        "SourceKey": "kmrz",
        "Value": "SPECI2024580031003407172",
        "Category": "document",
        "Type": 2
      },
      "kmrzfixed": {
        "Key": "kmrzfixed",
        "SourceKey": "kmrzfixed",
        "Value": "SPECI2024580031003407172",
        "Category": "document",
        "Type": 2
      },
      "name": {
        "Key": "name",
        "SourceKey": "name",
        "Value": "DE\u003cBRUIJN\u003c\u003cWILLEKE\u003cLISELOTTE",
        "Category": "holder",
        "Type": 2
      },
      "name_first": {
        "Key": "name_first",
        "SourceKey": "name_first",
        "Value": "WILLEKE LISELOTTE",
        "Category": "holder",
        "Type": 2
      },
      "name_last": {
        "Key": "name_last",
        "SourceKey": "name_last",
        "Value": "DE BRUIJN",
        "Category": "holder",
        "Type": 2
      },
      "name_parsed_first": {
        "Key": "name_parsed_first",
        "SourceKey": "name_parsed_first",
        "Value": "Willeke Liselotte",
        "Category": "holder",
        "Type": 2
      },
      "name_parsed_last": {
        "Key": "name_parsed_last",
        "SourceKey": "name_parsed_last",
        "Value": "Bruijn",
        "Category": "holder",
        "Type": 2
      },
      "name_parsed_prefix": {
        "Key": "name_parsed_prefix",
        "SourceKey": "name_parsed_prefix",
        "Value": "de",
        "Category": "holder",
        "Type": 2
      },
      "nat": {
        "Key": "nat",
        "SourceKey": "nat",
        "Value": "NLD",
        "Category": "holder",
        "Type": 2
      },
      "nat_name": {
        "Key": "nat_name",
        "SourceKey": "nat_name",
        "Value": "Netherlands, the (NLD)",
        "Category": "holder",
        "Type": 2
      },
      "refugee_doctype": {
        "Key": "refugee_doctype",
        "SourceKey": "refugee_doctype",
        "Value": "0",
        "Category": "document",
        "Type": 1
      },
      "refugee_doctype_code": {
        "Key": "refugee_doctype_code",
        "SourceKey": "refugee_doctype_code",
        "Value": "N/A",
        "Category": "document",
        "Type": 2
      },
      "refugee_doctype_desc": {
        "Key": "refugee_doctype_desc",
        "SourceKey": "refugee_doctype_desc",
        "Value": "N/A",
        "Category": "document",
        "Type": 2
      },
      "refugee_doctype_name": {
        "Key": "refugee_doctype_name",
        "SourceKey": "refugee_doctype_name",
        "Value": "N/A",
        "Category": "document",
        "Type": 2
      },
      "sex": {
        "Key": "sex",
        "SourceKey": "sex",
        "Value": "F",
        "Category": "holder",
        "Type": 2
      },
      "sex_value": {
        "Key": "sex_value",
        "SourceKey": "sex_value",
        "Value": "Female",
        "Category": "holder",
        "Type": 2
      },
      "subcode": {
        "Key": "subcode",
        "SourceKey": "subcode",
        "Value": "\u003c",
        "Category": "document",
        "Type": 2
      }
    },
    "ProcessedChecks": {
      "Checks": [
        {
          "Id": "check_doc_not_expired",
          "Name": "Document Expiration",
          "Desc": "Check if the document is not expired",
          "Reason": "",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "check_age",
          "Name": "Age Verification",
          "Desc": "Checks if Age is within range",
          "Reason": "",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "check_digits",
          "Name": "Check Digits",
          "Desc": "Checks if all MRZ Digits are correct",
          "Reason": "",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "active_authentication",
          "Name": "Active Authentication",
          "Desc": "Was Active Authentication performed successfully",
          "Reason": "",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "chip_authentication",
          "Name": "Chip Authentication",
          "Desc": "Was Chip Authentication performed successfully",
          "Reason": "",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "passive_authentication",
          "Name": "Passive Authentication",
          "Desc": "Was Passive Authentication performed successfully",
          "Reason": "unable to verify SignedData (SOD): error: unable to locate parent certificate (SKI:4b0a407df6272538ce67cb9b3ff6c2b4b41097d038c562e5e95b672fc2a87acd)",
          "Ok": false,
          "State": 2
        },
        {
          "Id": "ds_data_verified",
          "Name": "DS Data Verified",
          "Desc": "Sod Data Verified with DS signature status",
          "Reason": "",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "ds_csca_verified",
          "Name": "DS CSCA Verified",
          "Desc": "Sod Data Verified against CSCA certificate chain",
          "Reason": "CSCA certificate chain verification failed: error: unable to locate parent certificate (SKI:4b0a407df6272538ce67cb9b3ff6c2b4b41097d038c562e5e95b672fc2a87acd)",
          "Ok": false,
          "State": 2
        },
        {
          "Id": "mandatory_files",
          "Name": "Mandatory files",
          "Desc": "Checks if all mandatory files are present",
          "Reason": "",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "dg14_file",
          "Name": "DG14 file",
          "Desc": "Checks if DG14 file is present",
          "Reason": "",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "cardaccess_secinfos",
          "Name": "CardAccess SecInfos",
          "Desc": "Check if CardAccess SecInfos are present within DG14",
          "Reason": "",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "dg15_file",
          "Name": "DG15 file",
          "Desc": "Checks if DG15 file is present",
          "Reason": "",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "dg_hashes",
          "Name": "DG File Hashes",
          "Desc": "Checks if all file hashes match",
          "Reason": "",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "mrz_match",
          "Name": "MRZ's match",
          "Desc": "Checks if document \u0026 chip MRZ's match",
          "Reason": "",
          "Ok": true,
          "State": 1
        },
        {
          "Id": "com_vs_sod",
          "Name": "DG List COM vs SOD",
          "Desc": "Checks if DG lists match",
          "Reason": "",
          "Ok": true,
          "State": 1
        }
      ],
      "OverallState": 2
    },
    "CustomFields": {
      "testveld": "hier wat eigen data"
    }
  }
}

The ScanResultMessage type looks like this:

scanResultMessage.ts

export type StringMap = {
  [key: string]: string;
};

export interface MrzSettings {
  AutoCleanParts: boolean;
  UseCorrector: boolean;
  IgnoreFillerChecksNonZero: boolean;
  AllowExperimentalParsers: boolean;
  AddExtendedInfo: boolean;
  AddChecksInfo: boolean;
  AgeTop: number;
  AgeBottom: number;
  TranslateIds: boolean;
  OutputFormat: string;
}

export interface InvalidChar {
  Char: string;
  Line: number;
  Offset: number;
}

export interface MrzData {
  RawData: string;
  Lines: string[];
  WasCorrected: boolean;
  CorrectedData: string;
  InvalidChars: InvalidChar[];
}

export enum MrzCorrectionType {
  NONE = 0,
  ALPHA = 1,
  ALPHA_FILLER = 2,
  NUMERIC = 3,
  NUMERIC_FILLER = 4,
  GENDER = 5,
  DOCCODE = 6,
}

export interface MrzPart {
  Id: string;
  Line: number;
  Offset: number;
  Length: number;
  Corrector: MrzCorrectionType;
  Raw: string;
  Overlapped: boolean;
}

export type MrzPartList = MrzPart[];

export interface MrzCheckDigit {
  Id: string;
  Name: string;
  FromData: string;
  Read: string;
  Calc: string;
  IsValid: boolean;
}

type MrzCheckDigitList = MrzCheckDigit[];

export interface ExtendedInfoType {
  Values: StringMap;
}

export enum CheckInfoState {
  Failed = 0,
  Success = 1,
  Warning = 2,
}

export interface CheckInfoType {
  Id: string;
  Ok: boolean;
  State: CheckInfoState;
}

export type CheckInfoList = CheckInfoType[];

export enum MRZType {
  UNKNOWN = 0,
  TD = 1,
  TD1 = 2,
  TD2 = 3,
  TD3 = 4,
  EUDL = 5,
  EUDL_NLD = 6,
  EUDL_FRA = 7,
  EUDL_IRL = 8,
  FRA_NIC = 9,
  BASE_2x34 = 10,
  SVK_2x34 = 11,
  VEHICLE = 12,
  VEHICLE_FRA = 13,
  VEHICLE_POL = 14,
  VEHICLE_POL_2x38 = 15,
  VEHICLE_POL_3x38 = 16,
  DL_CHE = 17,
  AUS_VISA = 18,
  EUDL_HRV = 19,
  EUDL_SVK = 20,
  EUDL_EST = 21,
  DL_CHE_FULL = 22,
  VEHICLE_PAK = 23,
}

export interface ParserInfo {
  Type: MRZType;
  Description: string;
  Name: string;
  IsExperimental: boolean;
}

export interface MrzResult {
  Settings: MrzSettings;
  MrzData: MrzData;
  Parts: MrzPartList;
  Values: StringMap;
  CheckDigits: MrzCheckDigitList;
  IsVisa: boolean;
  ExtendedDocNumber: boolean;
  ExtendedInfo: ExtendedInfoType;
  CheckInfo: CheckInfoList;
  ParserInfo: ParserInfo;
  OptDataParserUsed: string;
}



export enum LDSImageType {
  ImageTypeUnknown = 0,
  ImageTypeJpeg = 1, //1
  ImageTypeJpeg2000 = 2, //2
  ImageTypeJp2Stream = 3, //3
  ImageTypeWSQ = 4, //4
}

export enum AuthStateType {
  AuthStateNone = 0,
  AuthStatePasses = 1,
  AuthStateFailed = 2,
}

export interface AuthenticationInfo {
  AuthState: AuthStateType;
  Info: string;
  Reason: string;
  WasPerformed: boolean;
}

export enum AccessMethodType {
  AccessMethodUnknown = 0,
  AccessMethodPlain = 1,
  AccessMethodBAC = 2,
  AccessMethodPACE = 3,
  AccessMethodBAP = 4,
}

export enum ChipAuthMethodType {
  NONE = 0,
  PACE_CAM = 1,
  CA = 2,
  AA = 3,
}

export interface AuthStatus {
  AccessMethod: AccessMethodType;
  ActiveAuthentication: AuthenticationInfo;
  ChipAuthentication: AuthenticationInfo;
  PassiveAuthentication: AuthenticationInfo;
  ChipAuthStatus: ChipAuthMethodType;
}

export interface X509OutputInfo {
  Version: string;
  Serial: string;
  Issuer: string;
  Subject: string;
  NotBefore: string;
  NotAfter: string;
  SignatureAlgorithm: string;
  PublicKeyAlgorithm: string;
  Feature: string;
}

export interface CertChainInfo {
  Raw: string;
  Info: X509OutputInfo;
}

export type CertChain = CertChainInfo[];

export interface DGInfoItem {
  Num: number;
  OnChip: boolean;
  Read: boolean;
  SodHash: string;
  ReadHash: string;
  Match: boolean;
}

export interface VerifyInfo {
  Title: string;
  Reason: string;
  State: boolean;
}

export enum DataItemType {
  OutputDataItemInt = 0,
  OutputDataItemString = 1,
  OutputDataItemBool = 2,
  OutputDataItemBytes = 3,
}

export enum DataItemCategory {
  OICHolder = "Holder",
  OICDocument = "Document",
  OICOther = "Other",
  OICVehicle = "Vehicle",
  OICLicense = "License",
  OICRaw = "Raw",
}
export interface DataItem {
  Dg: number;
  Type: DataItemType;
  Cat: DataItemCategory;
  Name: string;
  Value: string;
  Raw: string;
}

export enum ImageItemKind {
  Face = 0,
  Signature = 1,
  Finger = 2,
  Iris = 3,
}
export interface ImageItem {
  Dg: number;
  Kind: ImageItemKind;
  Type: LDSImageType;
  Name: string;
  Raw: string;
}

export enum EDocType {
  MRTD = "EMRTD",
  EDL = "EDL",
}

export interface SpecialFilesRead {
  CardAccess: boolean;
  CardSecurity: boolean;
  COM: boolean;
  SOD: boolean;
  DIR: boolean;
  AtrInfo: boolean;
  CVCA: boolean;
}

export interface NfcResult {
  Atr: string;
  Ats: string;
  Error: string;
  DocType: EDocType;
  AuthStatus: AuthStatus;
  CardSecCertChain: CertChain | null;
  SodCertChain: CertChain | null;
  ComDGs: number[];
  SodDGs: number[];
  DGInfos: DGInfoItem[];
  VerifyInfos: VerifyInfo[];
  dataitems: DataItem[] | null;
  imageitems: ImageItem[] | null;
  dgs: { [key: string]: unknown } | null;
  SpecialFiles: SpecialFilesRead;
}

export enum ProcessedOutputItemType {
  TTUnknown = 0,
  TTInt = 1,
  TTString = 2,
  TTBytes = 3,
  TTBool = 4,
  TTDate = 5,
}

export enum ProcessedOutputItemCategory {
  TC_HOLDER = "holder",
  TC_DOC = "document",
  TC_VEHICLE = "vehicle",
  TC_GENERAL = "general",
  TC_OTHER = "other",
  TC_LICENSE = "license",
  TC_LICENSE_CAT = "licensecat",
  TC_DISPLAY = "display",
  TC_CUSTOM = "custom",
}

export interface ProcessedOutputItem {
  Key: string;
  SourceKey: string;
  Value: string;
  Category: ProcessedOutputItemCategory;
  Type: ProcessedOutputItemType;
  frontInternalData?: unknown;
}

export type ProcessedOutput = { [key: string]: ProcessedOutputItem };

export enum ProcessedCheckItemState {
  PCI_Unknown = 0,
  PCI_Success = 1,
  PCI_Failed = 2,
  PCI_Warning = 3,
  PCI_Not_PERFORMED = 4,
}

export interface ProcessedCheckItem {
  Id: string;
  Name: string;
  Desc: string;
  Reason: string;
  Ok: boolean;
  State: ProcessedCheckItemState;
}

export type ProcessedChecks = ProcessedCheckItem[];

export interface ProcessedCheckOutputInfo {
  Checks: ProcessedChecks;
  OverallState: ProcessedCheckItemState;
}

export type ScanResult = {
  Mrz: MrzResult;
  Nfc: NfcResult | null;
  ProcessedOutput: ProcessedOutput | null;
  ProcessedChecks: ProcessedCheckOutputInfo | null;
  CustomFields: StringMap;
};

type ScanResultMessage = {
  Action: string;
  Data: ScanResult;
};