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 🙏

© 2026 – Pkg Stats / Ryan Hefner

sign-assistant-extension

v0.1.8

Published

This library helps to integrate web pages with Ledger Sign Assistant compatible signer extensions

Readme

Web Sign Assistant Extension

A Typescript library to communicate web pages with Sign Assistant compatible extensions

Getting started

You can install the module via npm or yarn:

yarn add sign-assistant-extension
npm install sign-assistant-extension --save

This library can only be used in frontend (browser). If its used in server side rendering (like Nextjs), please, make a dynamic import of the component that uses it.

Features

  • Check if extension is installed and enabled
  • Check if the Sign Assistant is installed
  • Download extension based on current browser
  • Download Sign Assistnat based on extension response
  • Get certificate list from extension
  • Sign a hash
  • Listen to errors, requests and responses from extension

Examples

Here are some code examples.

Basic Usage

import Signer from 'sign-assistant-extension';

const signer = new Signer({
  key: "YOUR_KEY", // website sign assistant access key
  id: "extension-unique-id",
})

const loadCertificates = async () => {
  const certificates = await signer.getCertificates()
  console.log({ certificates })
}

loadCertificates()

Advanced Usage

import Signer, { isError } from 'sign-assistant-extension';
import toast from './toast';

const signer = new Signer({
  key: "YOUR_KEY", // website sign assistant access key
  id: "extension-unique-id",
})

const signWithFirstCertificate = async () => {
  const certificates = await signer.getCertificates() // sends error if not found extension or Sign Assistant

  const dataToSign = 'Q1VTVE9NIENPTlRFTlQ='
  const dataToSignArray = [{
    dataToSign, // string of data to sign
    key: 1,
  }]
  const certificate = certificates[0]
  const signResponse = await signer.sign({ dataToSignArray, certificate })
  
  if (isError(signResponse)) {
    toast(signResponse.error)
    return
  }
  console.log({ signature: signResponse[0].signature })
}

signWithFirstCertificate()

This library is strongly typed, but here are the method response type definitions to help you better understand its workings.

interface Certificate {
  isValid: boolean
  issuer: string
  name: string
  notAfter: string
  notBefore: string
  pem: string
  provider: string
  specialName: string
  type: string
  personId?: string
}

interface Signature {
  key: number
  signature: string
}

interface ErrorResponse {
  level: "BACKGROUND" | "CONTENT" | "CLI" | "LIB" | "EXTENSION_RUNTIME" // specify where the error occurred
  error: string // user friendly message
  code: number // code based on error level, explained later...
  originalErrorMessage?: string // original error message if it exist (set if level is "EXTENSION_RUNTIME" or "CLI")
}

Methods

List certificates

const searchResponse = await signer.getCertificates()
// will return: Certificate[] | ErrorResponse

Sign

const dataToSignArray = [{
  dataToSign, // string of data to sign
  key: 1,
}]
const signResponse = await signer.sign({ dataToSignArray, certificate })
// will return: Signature[] | ErrorResponse

Has Extension

const hasExtension = await signer.hasExtension() // timeout = 1000ms
// wil return: true | ErrorResponse

Has Software

const hasSoftware = await signer.hasSoftware() // timeout = 1000ms
// wil return: true | ErrorResponse

Download extension (Its not a Promise because download urls already setten in downloadLinks property)

const url = signer.downloadExtension({
  openUrl: false // Optional, default: true
})
// wil return: string | ErrorResponse
// string is the download url, it will be open as new tab if openUrl is not set to false

Download software

const url = await signer.downloadSoftware({
  openUrl: false // Optional, default: true
})
// wil return: string | ErrorResponse
// string is the download url, it will be open as new tab if openUrl is not set to false

Is error (narrow type check) - This method is also exported from library index

const dataToSignArray = [{
  dataToSign, // string of data to sign
  key: 1,
}]
const signResponse = await signer.sign({ dataToSignArray, certificate })
const isError = signer.isError(signResponse) // boolean
if (isError) {
  console.log(signResponse.error)
}
// will return: boolean

Properties

|Name|Type|Default|Description| |:--|:--:|:-----:|:----------| |id|string|required|Unique extension ID, e.g: ledger| |key|string|required|Sign assistant access key for website| |requestTimeout|number|3000|Timeout to check if extension is activated in milliseconds, e.g.: 1000 |logs|boolean|false|Enable lib and extension logs |downloadLinks|object|undefined|Objeto com os links de download da extensões nas lojas. |onLoadExtension |function|undefined|Callback when extension is loaded| |onError |function|undefined|Callback when a error is thrown| |onRequest |function|undefined|Callback when library sends a request to extension| |onResponse |function|undefined|Callback when lib receives a response from extension|

Error codes

|Level|Code|Portuguese Description| |:--|:--:|:-----:| CLI|1| Erro desconhecido no nosso Sign Assistant. CLI|2| Argumentos inválidos enviados ao Sign Assistant. CLI|3| A comunicação com o Sign Assistant foi interrompida. CLI|4| Um campo obrigatório não foi enviado ao Sign Assistant. CLI|5| Um campo obrigatório foi enviado ao Sign Assistant com tipo inválido. CLI|6| Algorítmo inválido enviado ao Sign Assistant. CLI|7| Senha incorreta fornecida ao Sign Assistant. CLI|8| O certificado enviado ao Sign Assistant não foi encontrado. CLI|9| Operação cancelada pelo usuário no Sign Assistant. CLI|10| Falha ao ler certificado no Sign Assistant. CLI|11| O certificado já existe no Sign Assistant. CLI|12| Erro no SQLite no Sign Assistant. CLI|13| Erro no OpenSLL no Sign Assistant. CLI|14| Erro ao inicializar interface gráfica no Sign Assistant. CLI|15| Não foi possível acessar o certificado no Sign Assistant. Verifique se o token está conectado. CLI|16| O caminho do driver já existe no banco de dados do Sign Assistant. CLI|17| O token foi bloqueado no Sign Assistant por excesso de falhas de PIN. EXTENSION_RUNTIME|1|Falha não identificada ao comunicar com o Sign Assistant. EXTENSION_RUNTIME|2|Cheque as permissões do local de instalação do Sign Assistant. EXTENSION_RUNTIME|3|A extensão está tentando conectar com um host não existente. EXTENSION_RUNTIME|4|A comunicação com o Sign Assistant foi interrompida. EXTENSION_RUNTIME|5|O nosso software não foi instalado. EXTENSION_RUNTIME|6|O ID da sua extensão precisa ser adicionado à lista de extensões no arquivo de configuração do Sign Assistant. EXTENSION_RUNTIME|7|Problema de comunicação com o Sign Assistant. Certifique-se de tê-lo atualizado. CONTENT|1|Falha ao receber resposta da extensão. CONTENT|2|A extensão foi desabilitada. CONTENT|3|Operação não permitida. BACKGROUND|1|Falha de configuração de comunicação com o Sign Assistant. BACKGROUND|2|Versão de software incompatível. BACKGROUND|3|Sistema operacional ainda não suportado. LIB|1|Extensão não instalada. LIB|2|Os dados para assinar não foram fornecidos. LIB|3|Certificado para assinar não foi fornecido. LIB|4|O seu navegador ainda não é suportado. LIB|5|O seu sistema operacional ainda não é suportado. LIB|6|Links de download não fornecidos.