npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ncalayer-js-client

v1.5.0

Published

JS клиент для NCALayer стремящийся быть максимально простым в использовании

Downloads

1,851

Readme

ncalayer-js-client

JS клиент для NCALayer стремящийся быть максимально простым в использовании.

Поддерживает новый модуль kz.gov.pki.knca.basics (https://github.com/pkigovkz/sdkinfo/wiki/KNCA-Basics-Module), пример использования приведен ниже в этом файле.

Поддерживает HTTP API KAZTOKEN mobile/desktop. Поддержка реализована в функции basicsSignCMS - в том случае, если в конструкторе не запрещено использовать HTTP API (allowKmdHttpApi) и библиотека определила что доступен HTTP API KAZTOKEN mobile/desktop, будет использован он, так как он позволяет подписывать документы значительно большего размера чем WebSocket API NCALayer и KAZTOKEN mobile/desktop.

Разработан для веб интерфейса https://sigex.kz.

Документация по API: https://sigex-kz.github.io/ncalayer-js-client/.

Документация по NCALayer доступна в составе SDK НУЦ, либо на странице документации приложения KAZTOKEN mobile повторяющего API NCALayer.

Демо: https://sigex-kz.github.io/ncalayer-js-client/.

Демо мультиподписания: https://sigex-kz.github.io/ncalayer-js-client/multisign.html.

Использование

Одним из следующих образов:

  • скопировать себе ncalayer-client.js и загрузить его на странице;
  • npm install ncalayer-js-client.

Пример использования нового модуля kz.gov.pki.knca.basics

async function connectAndSign() {
  const ncalayerClient = new NCALayerClient();

  try {
    await ncalayerClient.connect();
  } catch (error) {
    alert(`Не удалось подключиться к NCALayer: ${error.toString()}`);
    return;
  }

  const documentInBase64 = 'MTEK';

  let base64EncodedSignature;
  try {
    base64EncodedSignature = await ncalayerClient.basicsSignCMS(
      NCALayerClient.basicsStorageAll,
      documentInBase64, // здесь поддерживаются String | ArrayBuffer | Blob | File, строки интерпретируются как Base64
      NCALayerClient.basicsCMSParamsDetached,
      NCALayerClient.basicsSignerSignAny,
    );
  } catch (error) {
    if (error.canceledByUser) {
      alert('Действие отменено пользователем.');
    }

    alert(error.toString());
    return;
  }

  return base64EncodedSignature;
}

Пример мультиподписания с использованием KAZTOKEN mobile/desktop

async function connectAndSign() {
  const ncalayerClient = new NCALayerClient();

  try {
    await ncalayerClient.connect();
  } catch (error) {
    alert(`Не удалось подключиться к NCALayer: ${error.toString()}`);
    return;
  }

  const documentsInBase64 = [
    'MTEK',
    'MTEK',
    'MTEK',
  ];

  // Функция мультиподписания доступна, значит можно передать массив документов
  // и получить массив подписей
  if (ncalayerClient.multisignAvailable) {
    let base64EncodedSignatures;
    try {
      base64EncodedSignatures = await ncalayerClient.basicsSignCMS(
        NCALayerClient.basicsStorageAll,
        documentsInBase64, // здесь поддерживаются Array<String | ArrayBuffer | Blob | File>, строки интерпретируются как Base64
        NCALayerClient.basicsCMSParamsDetached,
        NCALayerClient.basicsSignerSignAny,
      );
    } catch (error) {
      if (error.canceledByUser) {
        alert('Действие отменено пользователем.');
      }

      alert(error.toString());
      return;
    }

    return base64EncodedSignatures;
  }

  // Иначе подписываем документы по одному
  const base64EncodedSignatures = [];
  for (const documentInBase64 of documentsInBase64) {
    try {
      const base64EncodedSignature = await ncalayerClient.basicsSignCMS(
        NCALayerClient.basicsStorageAll,
        documentInBase64,
        NCALayerClient.basicsCMSParamsDetached,
        NCALayerClient.basicsSignerSignAny,
      );
      base64EncodedSignatures.push(base64EncodedSignature);
    } catch (error) {
      if (error.canceledByUser) {
        alert('Действие отменено пользователем.');
      }

      alert(error.toString());
      return;
    }

  }
  return base64EncodedSignatures;
}

Пример использования функции мультиподписания через HTTP API KAZTOKEN mobile/desktop

Важно: для работы этого API необходимо чтобы сервер, со страницы которого осуществляются вызовы, устанавливал в заголовке Content-Security-Policy значение connect-src https://127.0.0.1:24680; иначе браузер не будет передавать в HTTP запросах к KAZTOKEN mobile/desktop куки operationCookie и вызовы будут возвращать 401 Unauthorized.

async function connectAndSign() {
  const ncalayerClient = new NCALayerClient();

  const documentsInBase64 = [
    'MTEK',
    'MTEK',
    'MTEK',
  ];

  const kmdMultisignAvailable = await ncalayerClient.kmdMultisignAvailable();
  if (!kmdMultisignAvailable) {
    alert('На данном компьютере не удалось обнаружить KAZTOKEN mobile/desktop с поддержкой HTTP API');
    return;
  }

  try {
    await ncalayerClient.startKmdMultisign(documentsInBase64.length, true, false);
  } catch (error) {
    alert(`Не удалось подключиться к KAZTOKEN mobile/desktop: ${error.toString()}`);
    return;
  }

  const signatures = [];
  try {
    for (const documentInBase64 of documentsInBase64) {
      const signature = await ncalayerClient.kmdMultisignNext(documentInBase64);
      this.signatures.push(signature);
    }
  } catch (error) {
    if (error.canceledByUser) {
      alert('Действие отменено пользователем.');
    }

    alert(error.toString());
    return;
  }

  return signatures;
}

Пример использования старого модуля commonUtils

Использование этого модуля не рекомендуется, так как НУЦ не будет его развивать и рекомендует переходить на kz.gov.pki.knca.basics.

async function connectAndSign() {
  const ncalayerClient = new NCALayerClient();

  try {
    await ncalayerClient.connect();
  } catch (error) {
    alert(`Не удалось подключиться к NCALayer: ${error.toString()}`);
    return;
  }

  let activeTokens;
  try {
    activeTokens = await ncalayerClient.getActiveTokens();
  } catch (error) {
    alert(error.toString());
    return;
  }

  // getActiveTokens может вернуть несколько типов хранилищ, для простоты проверим первый.
  // Иначе нужно просить пользователя выбрать тип носителя.
  const storageType = activeTokens[0] || NCALayerClient.fileStorageType;

  const documentInBase64 = 'MTEK';

  let base64EncodedSignature;
  try {
    base64EncodedSignature = await ncalayerClient.createCAdESFromBase64(storageType, documentInBase64);
  } catch (error) {
    alert(error.toString());
    return;
  }

  return base64EncodedSignature;
}

Разработка

  • npm run lint - проверка кода с помощью ESLint;
  • npm run test - выполнение тестов;
  • npm run ts-check - проверка с помощью TypeScript;
  • npm run build-docs - обновление документации из комментариев в коде;
  • npm run build - все вышеперечисленное вместе, рекомендуется выполнять перед коммитом;
  • npm run test-data-builder - запуск веб сервера на http://127.0.0.1:8080 со страницей подготовки данных для тестов.

Подготовка данных для тестов

  • запустить сервер публикующий страницу подготовки данных npm run test-data-builder;
  • открыть http://127.0.0.1:8080;
  • выполнить инструкции;
  • проверить сформированные данные (в основном корректность формирования подписей);
  • замаскировать в сформированных данных чувствительную информацию (подписи и сертификаты);
  • записать сформированный блок данных в test/test-data.json.