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

@risleylima/escpos

v1.0.6

Published

Node.js thermal printer library: ESC/POS, receipts, barcodes, images via USB or Serial

Readme

@risleylima/escpos

npm version Node.js License: MIT Tests

🇺🇸 Read in English: README.md

A biblioteca definitiva de impressão térmica para Node.js. — Robustez industrial, desempenho O(n) e arquitetura totalmente agnóstica.

🚀 Por que escolher esta biblioteca?

Esta biblioteca foi pensada para eliminar gargalos comuns em implementações tradicionais de impressão térmica. Foco em confiabilidade, desempenho e arquitetura limpa.

Vantagens técnicas

| Recurso | Nossa abordagem moderna | Padrões legados comuns | | :--- | :--- | :--- | | Eficiência de buffer | O(n) (acúmulo inteligente em chunks) | O(n²) (concatenação recursiva) | | Event loop | Protegido (processamento assíncrono de pixels) | Bloqueado (processamento síncrono) | | Gerenciamento de estado | Instanciável (suporte a múltiplas impressoras) | Singletons (limites de estado global) | | Suporte a protocolo | GS ( k nativo (QR moderno) | Comandos legados ESC Z | | Conectividade | Totalmente agnóstica (baseada em interface) | Acoplada a um IO específico |


🛠️ Pilares da arquitetura

  1. Transporte agnóstico (IO): O núcleo da impressora comunica-se por meio da abstração AdapterLike. Use USB, Serial ou Rede de forma intercambiável.
  2. Modelo agnóstico (Perfis): Trate "quircs" específicos de fabricantes (Epson, Elgin, Bematech, Custom) via um sistema robusto de perfis.
  3. Confiabilidade industrial: Mecanismos de drain (com timeouts), chunking e IO serializado para garantir zero perda de dados sob carga.

📦 Instalação

npm install @risleylima/escpos

🧰 Ambiente de desenvolvimento

Para contribuir ou compilar a partir do código-fonte:

yarn install
yarn build
yarn test

⚡ Início rápido

Rede (TCP RAW)

import { Network, Printer } from '@risleylima/escpos';

const adapter = new Network();
await adapter.connect('10.1.1.50', 9100);
await adapter.open();

const printer = new Printer(adapter);
printer.textln('Olá mundo na rede').cut();

await printer.flush();
await adapter.close();

Serial (RS232)

import { Serial, Printer } from '@risleylima/escpos';

const adapter = new Serial();
// baudRate é opcional; se omitido, 9600 é usado.
await adapter.connect('/dev/ttyUSB0', { baudRate: 115200 });
await adapter.open();

const printer = new Printer(adapter);
printer.textln('Olá mundo serial').cut();

await printer.flush();
await adapter.close();

No Windows: use caminhos como COM1, COM2, etc.

USB direto

import { USB, Printer } from '@risleylima/escpos';

const adapter = new USB();
await adapter.connect(0x04b8, 0x0202); // VID, PID
await adapter.open();

const printer = new Printer(adapter);
printer.textln('Olá mundo USB').cut();

await printer.flush();
await adapter.close();

Documentação completa de comandos


🔳 Estratégias de QR Code

printer.qrcode(...) suporta três estratégias para compatibilidade com qualquer impressora:

  • native: Envia comandos nativos GS ( k. Rápido e nítido.
  • raster: Gera máscara de bits em memória e imprime como imagem. Funciona em qualquer impressora com suporte a gráficos.
  • auto: Usa a configuração do perfil para escolher o melhor caminho (ex.: Bematech usa raster por padrão para confiabilidade).
printer.qrcode('https://google.com', {
  size: 6,
  level: 'M',
  strategy: 'raster',
  position: 'center'
});

Para QR raster, position usa alinhamento padrão (ESC a). Em alguns firmwares genéricos o alinhamento pode ser aproximado; use offsetCols (em colunas de caractere) para ajustar o posicionamento horizontal.


🖼️ Processamento de imagens

  • Formatos suportados: PNG (Adam7/Indexed/Gray/RGB), BMP (1/4/8/24-bit), JPEG, GIF e SVG.
  • Não bloqueante: Processamento pesado cede ao Event Loop, mantendo o servidor responsivo.
  • Excelência em SVG: Flattening automático de transparência sobre fundo branco.
import { Image } from '@risleylima/escpos';
const image = await Image.load('./logo.svg');
printer.raster(image); 

🛟 API de recuperação

Tratamento de erros confiável para ambientes de produção:

// Recuperar transporte + baseline da impressora
const result = await printer.recover({ checkStatus: true });

// Se a recuperação precisou limpar o buffer, os dados são retornados para log/retry
if (result.discardedBuffer) {
  console.log('Dados não impressos:', result.discardedBuffer.length, 'bytes');
}

🖨️ Suporte a perfis

  • 'default': ESC/POS padrão.
  • 'custom-vkp80iii': Custom VKP80III (fluxo especial de ejetar/cortar).
  • 'bematech-mp4200th': Otimizado para o padrão do mercado brasileiro.

Registre o seu próprio:

import { registerProfile } from '@risleylima/escpos';
registerProfile({ id: 'meu-modelo', name: 'Meu Modelo', defaultPaperWidth: 42 });

✅ Confiabilidade

  • 239+ testes unitários e de integração.
  • TypeScript Strict: Segurança de tipos para todo o conjunto de comandos.
  • Validado por especificações: Alinhado aos manuais oficiais Epson e dos fabricantes.
  • Flush transacional: Em falha de escrita, o buffer é preservado para retry ou log; chame printer.recover() após erros de transporte antes de retomar impressões.

Feito com ❤️ para sistemas de missão crítica.