{"version":3,"sources":["jsdelivr-header.js","/npm/ncalayer-js-client@1.5.10/ncalayer-client.js"],"names":[],"mappings":"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","file":"/npm/ncalayer-js-client@1.5.10/ncalayer-client.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/ncalayer-js-client@1.5.10/ncalayer-client.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","// @ts-check\n\n((exports, WebSocket, window) => { // eslint-disable-line max-classes-per-file\n  /**\n   * Класс ошибок NCALayerError.\n   */\n  class NCALayerError extends Error {\n    constructor(message, canceledByUser) {\n      super(message);\n      this.name = 'NCALayerError';\n      this.canceledByUser = canceledByUser;\n    }\n  }\n\n  /**\n   * Класс клиента NCALayer.\n   */\n  class NCALayerClient {\n    /**\n     * Конструктор.\n     *\n     * @param {String} [url = 'wss://127.0.0.1:13579'] опциональный URL для подключения к NCALayer.\n     * @param {Boolean} [allowKmdHttpApi = true] допустимо ли использовать HTTP API\n     * KAZTOKEN mobile/desktop\n     * (https://kaztoken.kz/products/kaztoken-desktop/#%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-api-%D0%BC%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BF%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F-sigex),\n     * этот API работает в поточном режиме и позволяет подписывать документы очень больших размеров.\n     * На данный момент реализована поддержка этого API только в функции `basicsSignCMS`.\n     */\n    constructor(url = 'wss://127.0.0.1:13579', allowKmdHttpApi = true) {\n      this.url = url;\n      this.wsConnection = null;\n      this.responseProcessed = false;\n      this.isKmd = false; // Работаем с KAZTOKEN mobile/desktop?\n      this.allowKmdHttpApi = allowKmdHttpApi;\n      this.kmdHttpApiUrl = 'https://127.0.0.1:24680/';\n      this.isKmdHttpApiAvailable = false; // Доступен ли HTTP API KAZTOKEN mobile/desktop?\n      this.KmdHTTPAPIOperationId = null;\n      this.KmdHTTPAPIOperationInBase64 = false;\n      this.KmdHTTPAPIOperationTotal = 0;\n      this.KmdHTTPAPIOperationProcessed = 0;\n      this.basicsLogo = '';\n\n      // Используются для упрощения тестирования\n      this.onRequestReady = null;\n      this.onResponseReady = null;\n    }\n\n    /**\n     * Подключиться к NCALayer.\n     *\n     * @returns {Promise<String>} версию NCALayer.\n     *\n     * @throws NCALayerError\n     */\n    async connect() {\n      if (this.wsConnection) {\n        throw new NCALayerError('Подключение уже выполнено.');\n      }\n\n      this.wsConnection = new WebSocket(this.url);\n\n      return new Promise((resolve, reject) => {\n        this.responseProcessed = false;\n        this.setHandlers(resolve, reject);\n\n        this.wsConnection.onmessage = async (msg) => {\n          if (this.responseProcessed) {\n            return;\n          }\n          this.responseProcessed = true;\n\n          if (this.onResponseReady) {\n            this.onResponseReady(msg.data);\n          }\n\n          const response = JSON.parse(msg.data);\n\n          if (!response.result || !response.result.version) {\n            reject(new NCALayerError('Ошибка взаимодействия с NCALayer.'));\n            return;\n          }\n\n          // Идентификация KAZTOKEN mobile/desktop\n          try {\n            const request = {\n              module: 'kz.digiflow.mobile.extensions',\n              method: 'getVersion',\n            };\n\n            this.sendRequest(request);\n\n            await new Promise((resolveInner, rejectInner) => {\n              this.setHandlers(resolveInner, rejectInner);\n            });\n            this.isKmd = true;\n          } catch (err) {\n            /* игнорируем */\n          }\n\n          // Идентификация KAZTOKEN mobile/desktop HTTP API\n          (async () => {\n            try {\n              const httpResponse = await fetch(\n                this.kmdHttpApiUrl,\n                { signal: AbortSignal.timeout(1000) },\n              );\n\n              if (httpResponse.ok) {\n                this.isKmdHttpApiAvailable = true;\n              }\n            } catch (err) {\n              /* игнорируем */\n            }\n          })();\n\n          resolve(response.result.version);\n        };\n      });\n    }\n\n    /**\n     * Доступна ли функия мультиподписания (подписание нескольких документов одной операцией).\n     */\n    get multisignAvailable() { // eslint-disable-line class-methods-use-this\n      // eslint отключен для обеспечения обратной совместимости,\n      // так как раньше этот метод использовал `this`.\n      return true;\n    }\n\n    //\n    // Типы хранилищ\n    //\n\n    /**\n     * KAZTOKEN\n     */\n    static get basicsStorageKAZTOKEN() {\n      return ['AKKaztokenStore'];\n    }\n\n    /**\n     * Удостоверение личности\n     */\n    static get basicsStorageIDCard() {\n      return ['AKKZIDCardStore'];\n    }\n\n    /**\n     * eToken 72k\n     */\n    static get basicsStorageEToken72k() {\n      return ['AKEToken72KStore'];\n    }\n\n    /**\n     * eToken 5110\n     */\n    static get basicsStorageEToken5110() {\n      return ['AKEToken5110Store'];\n    }\n\n    /**\n     * JaCarta\n     */\n    static get basicsStorageJaCarta() {\n      return ['AKJaCartaStore'];\n    }\n\n    /**\n     * aKey\n     */\n    static get basicsStorageAKey() {\n      return ['AKAKEYStore'];\n    }\n\n    /**\n     * Файловле хранилище PKCS#12\n     */\n    static get basicsStoragePKCS12() {\n      return ['PKCS12'];\n    }\n\n    /**\n     * Файловле хранилище JKS\n     */\n    static get basicsStorageJKS() {\n      return ['JKS'];\n    }\n\n    /**\n     * Любые хранилища.\n     */\n    static get basicsStorageAll() {\n      return null;\n    }\n\n    /**\n     * Только аппаратные хранилища.\n     */\n    static get basicsStorageHardware() {\n      return [\n        'AKKaztokenStore',\n        'AKKZIDCardStore',\n        'AKEToken72KStore',\n        'AKEToken5110Store',\n        'AKAKEYStore',\n      ];\n    }\n\n    //\n    // Параметры подписания\n    //\n\n    /**\n     * Параметры подписания для формирования CMS по умолчанию.\n     */\n    static get basicsCMSParams() {\n      return {};\n    }\n\n    /**\n     * Параметры подписания для формирования CMS без вложенных данных из данных в Base64.\n     */\n    static get basicsCMSParamsDetached() {\n      return {\n        decode: true,\n        encapsulate: false,\n        digested: false,\n        tsaProfile: {},\n      };\n    }\n\n    /**\n     * Параметры подписания для формирования CMS без вложенных данных из данных в Base64.\n     * Без метки времени.\n     */\n    static get basicsCMSParamsDetachedNoTSP() {\n      return {\n        decode: true,\n        encapsulate: false,\n        digested: false,\n      };\n    }\n\n    /**\n     * Параметры подписания для формирования CMS без вложенных данных из хеша данных в Base64.\n     */\n    static get basicsCMSParamsDetachedHash() {\n      return {\n        decode: true,\n        encapsulate: false,\n        digested: true,\n        tsaProfile: {},\n      };\n    }\n\n    /**\n     * Параметры подписания для формирования CMS с вложенными данными из данных в Base64.\n     */\n    static get basicsCMSParamsAttached() {\n      return {\n        decode: true,\n        encapsulate: true,\n        digested: false,\n        tsaProfile: {},\n      };\n    }\n\n    /**\n     * Параметры подписания для формирования XML по умолчанию.\n     */\n    static get basicsXMLParams() {\n      return {};\n    }\n\n    //\n    // Параметры выбора сертификата\n    //\n\n    /**\n     * Любой сертификат выпущенный боевым УЦ НУЦ.\n     */\n    static get basicsSignerAny() {\n      return {\n        extKeyUsageOids: [],\n      };\n    }\n\n    /**\n     * Любой сертификат для подписания выпущенный боевым УЦ НУЦ.\n     */\n    static get basicsSignerSignAny() {\n      return {\n        extKeyUsageOids: ['1.3.6.1.5.5.7.3.4'],\n      };\n    }\n\n    /**\n     * Сертификат физического лица для подписания выпущенный боевым УЦ НУЦ.\n     */\n    static get basicsSignerSignPerson() {\n      return {\n        extKeyUsageOids: ['1.3.6.1.5.5.7.3.4', '1.2.398.3.3.4.1.1'],\n      };\n    }\n\n    /**\n     * Сертификат любого сотрудника юридического лица для подписания выпущенный боевым УЦ НУЦ.\n     */\n    static get basicsSignerSignOrg() {\n      return {\n        extKeyUsageOids: ['1.3.6.1.5.5.7.3.4', '1.2.398.3.3.4.1.2'],\n      };\n    }\n\n    /**\n     * Сертификат руководителя юридического лица для подписания выпущенный боевым УЦ НУЦ.\n     */\n    static get basicsSignerSignHead() {\n      return {\n        extKeyUsageOids: ['1.3.6.1.5.5.7.3.4', '1.2.398.3.3.4.1.2.1'],\n      };\n    }\n\n    /**\n     * Сертификат лица с правом подписи юридического лица для подписания выпущенный боевым УЦ НУЦ.\n     */\n    static get basicsSignerSignTrusted() {\n      return {\n        extKeyUsageOids: ['1.3.6.1.5.5.7.3.4', '1.2.398.3.3.4.1.2.2'],\n      };\n    }\n\n    /**\n     * Сертификат сотрудника юридического лица для подписания выпущенный боевым УЦ НУЦ.\n     */\n    static get basicsSignerSignEmployee() {\n      return {\n        extKeyUsageOids: ['1.3.6.1.5.5.7.3.4', '1.2.398.3.3.4.1.2.5'],\n      };\n    }\n\n    /**\n     * Любой сертификат для аутентификации выпущенный боевым УЦ НУЦ.\n     */\n    static get basicsSignerAuthAny() {\n      return {\n        extKeyUsageOids: ['1.3.6.1.5.5.7.3.2'],\n      };\n    }\n\n    /**\n     * Сертификат физического лица для аутентификации выпущенный боевым УЦ НУЦ.\n     */\n    static get basicsSignerAuthPerson() {\n      return {\n        extKeyUsageOids: ['1.3.6.1.5.5.7.3.2', '1.2.398.3.3.4.1.1'],\n      };\n    }\n\n    /**\n     * Сертификат любого сотрудника юридического лица для аутентификации выпущенный боевым УЦ НУЦ.\n     */\n    static get basicsSignerAuthOrg() {\n      return {\n        extKeyUsageOids: ['1.3.6.1.5.5.7.3.2', '1.2.398.3.3.4.1.2'],\n      };\n    }\n\n    /**\n     * Сертификат руководителя юридического лица для аутентификации выпущенный боевым УЦ НУЦ.\n     */\n    static get basicsSignerAuthHead() {\n      return {\n        extKeyUsageOids: ['1.3.6.1.5.5.7.3.2', '1.2.398.3.3.4.1.2.1'],\n      };\n    }\n\n    /**\n     * Сертификат лица с правом подписи юридического лица для аутентификации выпущенный боевым УЦ\n     * НУЦ.\n     */\n    static get basicsSignerAuthRight() {\n      return {\n        extKeyUsageOids: ['1.3.6.1.5.5.7.3.2', '1.2.398.3.3.4.1.2.2'],\n      };\n    }\n\n    /**\n     * Сертификат сотрудника юридического лица для аутентификации выпущенный боевым УЦ НУЦ.\n     */\n    static get basicsSignerAuthEmployee() {\n      return {\n        extKeyUsageOids: ['1.3.6.1.5.5.7.3.2', '1.2.398.3.3.4.1.2.5'],\n      };\n    }\n\n    /**\n     * Любой сертификат выпущенный боевым или тестовым УЦ НУЦ.\n     */\n    static get basicsSignerTestAny() {\n      return {\n        extKeyUsageOids: [],\n        chain: [],\n      };\n    }\n\n    /**\n     * Настроить логотип который будет отображаться окном приложения NCALayer.\n     *\n     * @param {String | ArrayBuffer | Blob | File} logo логотип для отображения NCALayer\n     * в виде строки Base64, либо ArrayBuffer, Blob или File.\n     */\n    async setLogoForBasicsSign(logo) {\n      this.basicsLogo = await NCALayerClient.normalizeDataToSign(logo);\n    }\n\n    /**\n     * Вычислить подпись под данными с указанными параметрами. **Новая функция sign 2022 года из\n     * модуля kz.gov.pki.knca.basics (https://github.com/pkigovkz/sdkinfo/wiki/KNCA-Basics-Module)**.\n     * Сигнатура функции сложная, поэтому рекомендуем пользоваться функциями помощниками\n     * basicsSignXLM и basicsSignCMS.\n     *\n     * @param {Array | null} allowedStorages массив строк с константами допустимых для использования\n     * типов хранилищ (см. константы basicsStorage*).\n     *\n     * @param {String} format тип вычисляемой подписи: 'xml', либо 'cms'.\n     *\n     * @param {String | Array} data подписываемые данные.\n     *\n     * @param {Object} signingParams параметры подписания (см. basicsCMSParams* и basicsXMLParams*).\n     *\n     * @param {Object} signerParams параметры выбора сертификата для подписания (см. константы\n     * basicsSigner*).\n     *\n     * @param {String} locale язык пользовательского интерфейса.\n     *\n     * @param {Boolean} forceSingleSignature возвращать только одну подпись даже если получили\n     * массив, используется для обеспечения обратной совместимости работы с CMS.\n     *\n     * @returns {Promise<String | Array<String>>} подпись или массив подписей.\n     *\n     * @throws NCALayerError\n     */\n    async basicsSign(\n      allowedStorages,\n      format,\n      data,\n      signingParams,\n      signerParams,\n      locale,\n      forceSingleSignature = false,\n    ) {\n      const request = {\n        module: 'kz.gov.pki.knca.basics',\n        method: 'sign',\n        args: {\n          allowedStorages,\n          format,\n          data,\n          signingParams,\n          signerParams,\n          locale,\n        },\n      };\n\n      if (this.basicsLogo) {\n        request.args.logo = this.basicsLogo;\n      }\n\n      this.sendRequest(request);\n\n      return new Promise((resolve, reject) => {\n        this.setHandlers(resolve, reject, forceSingleSignature);\n      });\n    }\n\n    /**\n     * Вычислить CMS подпись под данными с указанными параметрами, это функция-помощник для\n     * упрощения работы с функцией basicsSign.\n     *\n     * В том случае, если библиотека смогла обнаружить HTTP API KAZTOKEN desktop на локальном\n     * компьютере, она будет пробовать использовать его для подписания в том случае, если это\n     * не было запрещено при вызове конструктора (параметр `allowKmdHttpApi`).\n     *\n     * @param {Array | null} allowedStorages массив строк с константами допустимых для использования\n     * типов хранилищ (см. константы basicsStorage*).\n     *\n     * @param {String | ArrayBuffer | Blob | File | Array<String | ArrayBuffer | Blob | File>} data\n     * данные, которые нужно подписать, в виде строки Base64, либо ArrayBuffer, Blob или File.\n     * Так же поддерживается массив документов.\n     *\n     * @param {Object} signingParams параметры подписания (см basicsCMSParams*).\n     *\n     * @param {Object} signerParams параметры выбора сертификата для подписания (см. константы\n     * basicsSigner*).\n     *\n     * @param {String} [locale = 'ru'] язык пользовательского интерфейса.\n     *\n     * @returns {Promise<String | Array<String>>} подпись, либо массив подписей если на подписание\n     * был передан массиов документов.\n     *\n     * @throws NCALayerError\n     */\n    async basicsSignCMS(allowedStorages, data, signingParams, signerParams, locale = 'ru') {\n      const dataIsArray = Array.isArray(data);\n\n      // Использование HTTP API KAZTOKEN mobile/desktop\n      if (this.allowKmdHttpApi && this.isKmdHttpApiAvailable) {\n        try {\n          const documents = dataIsArray ? data : [data];\n          const base64 = (typeof (documents[0]) === 'string');\n\n          let response = await fetch(\n            this.kmdHttpApiUrl,\n            {\n              method: 'POST',\n              mode: 'cors',\n              credentials: 'include',\n              body: JSON.stringify({\n                numberOfDocuments: documents.length,\n                base64,\n                encapsulateContent: signingParams.encapsulate,\n              }),\n            },\n          );\n\n          if (!response) {\n            throw new NCALayerError('Ошибка взаимодействия с KAZTOKEN mobile/desktop.');\n          }\n\n          if (!response.ok) {\n            if (response.status === 409) {\n              throw new NCALayerError('Операция отменена пользователем', true);\n            }\n            throw new NCALayerError(`KAZTOKEN mobile/desktop вернул ошибку '${response.status}: ${response.statusText}'`);\n          }\n\n          const operationId = await response.text();\n\n          const signatures = [];\n          // eslint-disable-next-line no-restricted-syntax\n          for (const document of documents) {\n            // eslint-disable-next-line no-await-in-loop\n            response = await fetch(\n              `${this.kmdHttpApiUrl}${operationId}`,\n              {\n                method: 'POST',\n                mode: 'cors',\n                credentials: 'include',\n                body: document,\n              },\n            );\n\n            if (!response) {\n              throw new NCALayerError('Ошибка взаимодействия с KAZTOKEN mobile/desktop.');\n            }\n\n            if (!response.ok) {\n              if (response.status === 401) {\n                throw new NCALayerError('Операция отменена пользователем', true);\n              }\n              throw new NCALayerError(`KAZTOKEN mobile/desktop вернул ошибку '${response.status}: ${response.statusText}'`);\n            }\n\n            let signature = '';\n            if (base64) {\n              // eslint-disable-next-line no-await-in-loop\n              signature = await response.text();\n            } else {\n              // eslint-disable-next-line no-await-in-loop\n              const signatureBytes = await response.arrayBuffer();\n              signature = NCALayerClient.arrayBufferToB64(signatureBytes);\n            }\n\n            signatures.push(signature);\n          }\n\n          return dataIsArray ? signatures : signatures[0];\n        } catch (err) {\n          throw new NCALayerError(`Ошибка взаимодействия с KAZTOKEN mobile/desktop: ${err}`);\n        }\n      }\n\n      const forceSingleSignature = !dataIsArray;\n      return this.basicsSign(\n        allowedStorages,\n        'cms',\n        await NCALayerClient.normalizeDataToSign(data),\n        signingParams,\n        signerParams,\n        locale,\n        forceSingleSignature,\n      );\n    }\n\n    /**\n     * Вычислить XML подпись под данными с указанными параметрами, это функция-помощник для\n     * упрощения работы с функцией basicsSign.\n     *\n     * @param {Array | null} allowedStorages массив строк с константами допустимых для использования\n     * типов хранилищ (см. константы basicsStorage*).\n     *\n     * @param {String | Array<String>} data подписываемые данные - строка (либо массив строк) XML.\n     *\n     * @param {Object} signingParams параметры подписания (см basicsXMLParams*).\n     *\n     * @param {Object} signerParams параметры выбора сертификата для подписания (см. константы\n     * basicsSigner*).\n     *\n     * @param {String} [locale = 'ru'] язык пользовательского интерфейса.\n     *\n     * @returns {Promise<String | Array<String>>} подпись или массив подписей.\n     *\n     * @throws NCALayerError\n     */\n    async basicsSignXML(allowedStorages, data, signingParams, signerParams, locale = 'ru') {\n      return this.basicsSign(\n        allowedStorages,\n        'xml',\n        data,\n        signingParams,\n        signerParams,\n        locale,\n      );\n    }\n\n    /**\n     * Проверить доступность функции мультиподписания через HTTP API KAZTOKEN mobile/desktop.\n     *\n     * @returns {Promise<Boolean>} доступна ли функция.\n     */\n    async kmdMultisignAvailable() {\n      try {\n        const httpResponse = await fetch(\n          this.kmdHttpApiUrl,\n          { signal: AbortSignal.timeout(1000) },\n        );\n\n        if (httpResponse.ok) {\n          return true;\n        }\n      } catch (err) {\n        /* игнорируем */\n      }\n\n      return false;\n    }\n\n    /**\n     * Инициировать процедуру мультиподписания через HTTP API KAZTOKEN mobile/desktop.\n     * Не требует предварительного вызова `connect()`.\n     *\n     * @param {Number} numberOfDocuments количество документов которые будут подписаны\n     * в рамках процедуры мультиподписания.\n     *\n     * @param {Boolean} base64 будут ли данные передаваться в base64 или в бинарном виде.\n     *\n     * @param {Boolean} encapsulateContent следудует ли встраивать подписываемые данные в подписи\n     * (не рекомендуется, так как в этом случае требуется значительно больше ОЗУ для обработки).\n     *\n     * @throws NCALayerError\n     */\n    async startKmdMultisign(numberOfDocuments, base64, encapsulateContent) {\n      let response;\n      try {\n        response = await fetch(\n          this.kmdHttpApiUrl,\n          {\n            method: 'POST',\n            mode: 'cors',\n            credentials: 'include',\n            body: JSON.stringify({\n              numberOfDocuments,\n              base64,\n              encapsulateContent,\n            }),\n          },\n        );\n      } catch (err) {\n        throw new NCALayerError(`Ошибка взаимодействия с KAZTOKEN mobile/desktop: ${err}`);\n      }\n\n      if (!response) {\n        throw new NCALayerError('Ошибка взаимодействия с KAZTOKEN mobile/desktop');\n      }\n\n      if (!response.ok) {\n        if (response.status === 409) {\n          throw new NCALayerError('Операция отменена пользователем', true);\n        }\n        throw new NCALayerError(`KAZTOKEN mobile/desktop вернул ошибку '${response.status}: ${response.statusText}'`);\n      }\n\n      try {\n        this.KmdHTTPAPIOperationId = await response.text();\n        this.KmdHTTPAPIOperationInBase64 = base64;\n        this.KmdHTTPAPIOperationTotal = numberOfDocuments;\n        this.KmdHTTPAPIOperationProcessed = 0;\n      } catch (err) {\n        throw new NCALayerError(`Ошибка взаимодействия с KAZTOKEN mobile/desktop: ${err}`);\n      }\n    }\n\n    /**\n     * Вычислить CMS подпись под данными в рамках процедуры мультиподписания через HTTP API\n     * KAZTOKEN mobile/desktop.\n     *\n     * Можно вызывать только после того как процедура была инициализирована с помощью\n     * `StartKmdMultisign` и только для того количества документов, которое было\n     * указано при инициализации.\n     *\n     * @param {String | ArrayBuffer | Blob | File} data\n     * данные, которые нужно подписать, в виде строки Base64, либо ArrayBuffer, Blob или File.\n     *\n     * @returns {Promise<String>} подпись в base64.\n     *\n     * @throws NCALayerError\n     */\n    async kmdMultisignNext(data) {\n      if (!this.KmdHTTPAPIOperationId) {\n        throw new NCALayerError('Процедура мультиподписания не была инициализирована');\n      }\n\n      let response;\n      try {\n        response = await fetch(\n          `${this.kmdHttpApiUrl}${this.KmdHTTPAPIOperationId}`,\n          {\n            method: 'POST',\n            mode: 'cors',\n            credentials: 'include',\n            body: data,\n          },\n        );\n      } catch (err) {\n        throw new NCALayerError(`Ошибка взаимодействия с KAZTOKEN mobile/desktop: ${err}`);\n      }\n\n      if (!response) {\n        throw new NCALayerError('Ошибка взаимодействия с KAZTOKEN mobile/desktop');\n      }\n\n      if (!response.ok) {\n        if (response.status === 401) {\n          throw new NCALayerError('Операция отменена пользователем', true);\n        }\n        throw new NCALayerError(`KAZTOKEN mobile/desktop вернул ошибку '${response.status}: ${response.statusText}'`);\n      }\n\n      let signature = '';\n      if (this.KmdHTTPAPIOperationInBase64) {\n        signature = await response.text();\n      } else {\n        const signatureBytes = await response.arrayBuffer();\n        signature = NCALayerClient.arrayBufferToB64(signatureBytes);\n      }\n\n      this.KmdHTTPAPIOperationProcessed += 1;\n      if (this.KmdHTTPAPIOperationProcessed === this.KmdHTTPAPIOperationTotal) {\n        this.KmdHTTPAPIOperationId = null;\n        this.KmdHTTPAPIOperationProcessed = 0;\n        this.KmdHTTPAPIOperationTotal = 0;\n      }\n\n      return signature;\n    }\n\n    /**\n     * Получить список активных типов устройств.\n     *\n     * @returns {Promise<String[]>} массив содержащий типы хранилищ экземпляры которых доступны в\n     * данный момент.\n     *\n     * @throws NCALayerError\n     */\n    async getActiveTokens() {\n      const request = {\n        module: 'kz.gov.pki.knca.commonUtils',\n        method: 'getActiveTokens',\n      };\n\n      this.sendRequest(request);\n\n      return new Promise((resolve, reject) => { this.setHandlers(resolve, reject); });\n    }\n\n    /**\n     * Получить информацию об одной записи (ключевой паре с сертификатом).\n     *\n     * @param {String} storageType тип хранилища на экземплярах которого следует искать записи.\n     *\n     * @returns {Promise<Object>} объект с информацией о записи.\n     *\n     * @throws NCALayerError\n     */\n    async getKeyInfo(storageType) {\n      const request = {\n        module: 'kz.gov.pki.knca.commonUtils',\n        method: 'getKeyInfo',\n        args: [\n          storageType,\n        ],\n      };\n\n      this.sendRequest(request);\n\n      return new Promise((resolve, reject) => { this.setHandlers(resolve, reject); });\n    }\n\n    /**\n     * Вычислить подпись под данными и сформировать CMS (CAdES).\n     *\n     * @param {String} storageType тип хранилища который следует использовать для подписания.\n     *\n     * @param {String | ArrayBuffer | Blob | File | Array<String | ArrayBuffer | Blob | File>} data\n     * данные, которые нужно подписать, в виде строки Base64, либо ArrayBuffer, Blob или File.\n     * Так же поддерживается массив строк Base64, ArrayBuffer, Blob или File, но это будет работать\n     * только с приложениями KAZTOKEN mobile/desktop, NCALayer не умеет подписывать массив\n     * документов.\n     *\n     * @param {String} [keyType = 'SIGNATURE'] каким типом ключа следует подписывать, поддерживаемые\n     * варианты 'SIGNATURE' и 'AUTHENTICATION', иное значение позволит пользователю выбрать\n     * любой доступный в хранилище ключа.\n     *\n     * @param {Boolean} [attach = false] следует ли включить в подпись подписываемые данные.\n     *\n     * @returns {Promise<String>} CMS подпись в виде Base64 строки.\n     *\n     * @throws NCALayerError\n     */\n    async createCAdESFromBase64(storageType, data, keyType = 'SIGNATURE', attach = false) {\n      const request = {\n        module: 'kz.gov.pki.knca.commonUtils',\n        method: 'createCAdESFromBase64',\n        args: [\n          storageType,\n          keyType,\n          await NCALayerClient.normalizeDataToSign(data),\n          attach,\n        ],\n      };\n\n      this.sendRequest(request);\n\n      return new Promise((resolve, reject) => { this.setHandlers(resolve, reject); });\n    }\n\n    /**\n     * Вычислить подпись под хешем данных и сформировать CMS (CAdES).\n     *\n     * @param {String} storageType тип хранилища который следует использовать для подписания.\n     *\n     * @param {String | ArrayBuffer | Blob | File | Array<String | ArrayBuffer | Blob | File>} hash\n     * хеш данных в виде строки Base64, либо ArrayBuffer, Blob или File.\n     * Так же поддерживается массив строк Base64, ArrayBuffer, Blob или File, но это будет работать\n     * только с приложениями KAZTOKEN mobile/desktop, NCALayer не умеет подписывать массив\n     * хешей.\n     *\n     * @param {String} [keyType = 'SIGNATURE'] каким типом ключа следует подписывать, поддерживаемые\n     * варианты 'SIGNATURE' и 'AUTHENTICATION', иное значение позволит пользователю выбрать\n     * любой доступный в хранилище ключа.\n     *\n     * @returns {Promise<String>} CMS подпись в виде Base64 строки.\n     *\n     * @throws NCALayerError\n     */\n    async createCAdESFromBase64Hash(storageType, hash, keyType = 'SIGNATURE') {\n      const request = {\n        module: 'kz.gov.pki.knca.commonUtils',\n        method: 'createCAdESFromBase64Hash',\n        args: [\n          storageType,\n          keyType,\n          await NCALayerClient.normalizeDataToSign(hash),\n        ],\n      };\n\n      this.sendRequest(request);\n\n      return new Promise((resolve, reject) => { this.setHandlers(resolve, reject); });\n    }\n\n    /**\n     * Подписать блок данных и сформировать CMS (CAdES) подпись с интегрированной меткой времени\n     * TSP. **Не рекомендуется использовать, разработчики NCALayer пометили как DEPRECATED (https://forum.pki.gov.kz/t/podpis-s-metkoj-vremeni-na-js/704/7)!**\n     *\n     * @param {String} storageType тип хранилища который следует использовать для подписания.\n     *\n     * @param {String | ArrayBuffer | Blob | File | Array<String | ArrayBuffer | Blob | File>} data\n     * данные, которые нужно подписать, в виде строки Base64, либо ArrayBuffer, Blob или File.\n     * Так же поддерживается массив строк Base64, ArrayBuffer, Blob или File, но это будет работать\n     * только с приложениями KAZTOKEN mobile/desktop, NCALayer не умеет подписывать массив\n     * документов.\n     *\n     * @param {String} [keyType = 'SIGNATURE'] каким типом ключа следует подписывать, поддерживаемые\n     * варианты 'SIGNATURE' и 'AUTHENTICATION', иное значение позволит пользователю выбрать\n     * любой доступный в хранилище ключа.\n     *\n     * @param {Boolean} [attach = false] следует ли включить в подпись подписываемые данные.\n     *\n     * @returns {Promise<String>} CMS подпись в виде Base64 строки.\n     *\n     * @throws NCALayerError\n     */\n    async createCMSSignatureFromBase64(storageType, data, keyType = 'SIGNATURE', attach = false) {\n      const request = {\n        module: 'kz.gov.pki.knca.commonUtils',\n        method: 'createCMSSignatureFromBase64',\n        args: [\n          storageType,\n          keyType,\n          await NCALayerClient.normalizeDataToSign(data),\n          attach,\n        ],\n      };\n\n      this.sendRequest(request);\n\n      return new Promise((resolve, reject) => { this.setHandlers(resolve, reject); });\n    }\n\n    /**\n     * Вычислить подпись под документом в формате XML.\n     *\n     * @param {String} storageType тип хранилища который следует использовать для подписания.\n     *\n     * @param {String} xml XML данные которые нужно подписать.\n     *\n     * @param {String} [keyType = 'SIGNATURE'] каким типом ключа следует подписывать, поддерживаемые\n     * варианты 'SIGNATURE' и 'AUTHENTICATION', иное значение позволит пользователю выбрать\n     * любой доступный в хранилище ключа.\n     *\n     * @param {String} [tbsElementXPath = ''] путь к подписываемому узлу XML.\n     *\n     * @param {String} [signatureParentElementXPath = ''] путь к узлу в который необходимо добавить\n     * сформированную подпись.\n     *\n     * @returns {Promise<String>} XML документ содержащий XMLDSIG подпись.\n     *\n     * @throws NCALayerError\n     */\n    async signXml(storageType, xml, keyType = 'SIGNATURE', tbsElementXPath = '', signatureParentElementXPath = '') {\n      const request = {\n        module: 'kz.gov.pki.knca.commonUtils',\n        method: 'signXml',\n        args: [\n          storageType,\n          keyType,\n          xml,\n          tbsElementXPath,\n          signatureParentElementXPath,\n        ],\n      };\n\n      this.sendRequest(request);\n\n      return new Promise((resolve, reject) => { this.setHandlers(resolve, reject); });\n    }\n\n    /**\n     * Вычислить подпись под каждым из массива документов в формате XML.\n     *\n     * @param {String} storageType тип хранилища который следует использовать для подписания.\n     *\n     * @param {String[]} xmls массив XML данных которые нужно подписать.\n     *\n     * @param {String} [keyType = 'SIGNATURE'] каким типом ключа следует подписывать, поддерживаемые\n     * варианты 'SIGNATURE' и 'AUTHENTICATION', иное значение позволит пользователю выбрать\n     * любой доступный в хранилище ключа.\n     *\n     * @param {String} [tbsElementXPath = ''] путь к подписываемому узлу XML.\n     *\n     * @param {String} [signatureParentElementXPath = ''] путь к узлу в который необходимо добавить\n     * сформированную подпись.\n     *\n     * @returns {Promise<String[]>} массив XML документов содержащих XMLDSIG подписи.\n     *\n     * @throws NCALayerError\n     */\n    async signXmls(storageType, xmls, keyType = 'SIGNATURE', tbsElementXPath = '', signatureParentElementXPath = '') {\n      const request = {\n        module: 'kz.gov.pki.knca.commonUtils',\n        method: 'signXmls',\n        args: [\n          storageType,\n          keyType,\n          xmls,\n          tbsElementXPath,\n          signatureParentElementXPath,\n        ],\n      };\n\n      this.sendRequest(request);\n\n      return new Promise((resolve, reject) => { this.setHandlers(resolve, reject); });\n    }\n\n    /**\n     * Изменить язык интерфейса NCALayer.\n     *\n     * @param {String} localeId новый идентификатор языка.\n     *\n     * @throws NCALayerError\n     */\n    async changeLocale(localeId) {\n      const request = {\n        module: 'kz.gov.pki.knca.commonUtils',\n        method: 'changeLocale',\n        args: [\n          localeId,\n        ],\n      };\n\n      this.sendRequest(request);\n\n      return new Promise((resolve, reject) => { this.setHandlers(resolve, reject); });\n    }\n\n    /**\n     * Константа определяющая имя файлового хранилища.\n     */\n    static get fileStorageType() {\n      return 'PKCS12';\n    }\n\n    sendRequest(request) {\n      if (!this.wsConnection) {\n        throw new NCALayerError('Подключение к NCALayer не установлено.');\n      }\n\n      const jsonRequest = JSON.stringify(request);\n      if (this.onRequestReady) {\n        this.onRequestReady(jsonRequest);\n      }\n\n      this.wsConnection.send(jsonRequest);\n    }\n\n    setHandlers(resolve, reject, forceSingleSignature) {\n      this.responseProcessed = false;\n\n      this.wsConnection.onerror = () => {\n        if (this.responseProcessed) {\n          return;\n        }\n        this.responseProcessed = true;\n\n        reject(new NCALayerError('Ошибка взаимодействия с NCALayer. В том случае, если на вашем компьютере не установлен NCALayer, пожалуйста установите его c портала НУЦ РК (https://ncl.pki.gov.kz/). Если же NCALayer установлен, но портал выдает ошибку, свяжитесь, пожалуйста, с нашей технической поддержкой.'));\n      };\n\n      this.wsConnection.onclose = () => {\n        if (this.responseProcessed) {\n          return;\n        }\n        this.responseProcessed = true;\n\n        reject(new NCALayerError('NCALayer закрыл соединение.'));\n      };\n\n      this.wsConnection.onmessage = (msg) => {\n        if (this.responseProcessed) {\n          return;\n        }\n        this.responseProcessed = true;\n\n        if (this.onResponseReady) {\n          this.onResponseReady(msg.data);\n        }\n\n        const response = JSON.parse(msg.data);\n\n        // basics response\n        if (response.hasOwnProperty('status')) { // eslint-disable-line no-prototype-builtins\n          if (!response.status) {\n            reject(new NCALayerError(`${response.code}: ${response.message} (${response.details})`));\n            return;\n          }\n\n          if (!response.body.hasOwnProperty('result')) { // eslint-disable-line no-prototype-builtins\n            reject(new NCALayerError('cancelled by user', true));\n            return;\n          }\n\n          let { result } = response.body;\n          if (forceSingleSignature && Array.isArray(result)) {\n            [result] = result;\n          }\n          resolve(result);\n          return;\n        }\n\n        // commonUtils response\n        if (response.code !== '200') {\n          reject(new NCALayerError(`${response.code}: ${response.message}`));\n          return;\n        }\n\n        resolve(response.responseObject);\n      };\n    }\n\n    static arrayBufferToB64(arrayBuffer) {\n      let binary = '';\n      const bytes = new Uint8Array(arrayBuffer);\n      const len = bytes.byteLength;\n      for (let i = 0; i < len; i += 1) {\n        binary += String.fromCharCode(bytes[i]);\n      }\n      return window.btoa(binary);\n    }\n\n    static async normalizeDataToSign(data) {\n      const normalizeDataBlock = async (dataBlock) => {\n        if (typeof dataBlock === 'string') {\n          return dataBlock;\n        }\n\n        let dataBlockArrayBuffer = dataBlock;\n        if (dataBlock instanceof Blob) {\n          dataBlockArrayBuffer = await dataBlock.arrayBuffer();\n        }\n\n        return NCALayerClient.arrayBufferToB64(dataBlockArrayBuffer);\n      };\n\n      if (Array.isArray(data)) {\n        return Promise.all(data.map(normalizeDataBlock));\n      }\n\n      return normalizeDataBlock(data);\n    }\n  }\n\n  exports.NCALayerClient = NCALayerClient; // eslint-disable-line no-param-reassign\n})(\n  typeof exports === 'undefined' ? this : exports,\n  typeof WebSocket === 'undefined' ? require('ws') : WebSocket,\n  typeof window === 'undefined' ? { btoa(x) { return x; } } : window // eslint-disable-line comma-dangle\n); // Заглушка для NodeJS\n"]}