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

@jwcbphy/token-memory-ttl

v1.0.1

Published

In-memory token storage with TTL (Time-To-Live) and automatic cleanup of expired entries. Minimal implementation, no external dependencies, full TypeScript support, and builds for both ESM and CommonJS.

Readme

Token Memory TTL

Armazenamento de tokens em memória com TTL (Time-To-Live) e coleta automática de expirados. Implementação simples, sem dependências externas, com suporte completo a TypeScript e distribuição para ESM e CommonJS.

Este projeto tem como objetivo oferecer uma solução previsível e segura para cenários em que é necessário manter tokens temporários em memória (por exemplo, sessões, códigos de verificação, chaves temporárias), com limpeza automática após o prazo configurado e sem manter o processo Node ativo desnecessariamente.

English README

Sumário

Motivação

Em muitas aplicações o custo de integrar um banco externo para armazenar dados efêmeros não compensa. Um mapa em memória pode resolver com latência mínima e simplicidade. Entretanto, há desafios: garantir a expiração correta, evitar vazamentos de memória e tratar limites de temporizadores do Node.js para TTLs longos (> 24 dias). Esta biblioteca aborda esses pontos de forma direta e documentada.

Requisitos

  • Node.js >= 18
  • TypeScript opcional (tipos incluídos)

Instalação

npm install @jwcbphy/token-memory-ttl

Como funciona

Os registros são mantidos em um Map<string, { token, createdAt, expiresAt }> em memória. Para cada chave, é agendado um temporizador de expiração. Como o Node.js utiliza um inteiro de 32 bits para atrasos de timer, valores acima de ~24,8 dias podem causar overflow. Para contornar isso, o agendamento é feito em blocos: quando o restante até a expiração excede o limite seguro, agenda-se o próximo passo e reprograma-se até atingir o prazo final. Assim, TTLs extensos são honrados sem disparos prematuros.

Os timers são unref() quando suportado, o que significa que não impedem o encerramento do processo Node. A cada operação de leitura (get, has, getMetadata, getTtl, keys), itens expirados são limpos de forma oportunista, reduzindo o acúmulo de dados inválidos.

Uso rápido

ESM/TypeScript

import { MemoryTokenStore } from '@jwcbphy/token-memory-ttl';

const store = new MemoryTokenStore();
await store.set('user:123', 'token', 3600);
const token = await store.get('user:123');

CommonJS

const { MemoryTokenStore, tokenStore } = require('@jwcbphy/token-memory-ttl');

const store = new MemoryTokenStore();
store.set('k', 'v', 60).then(() => store.get('k'));

Instância global

import { tokenStore } from '@jwcbphy/token-memory-ttl';

await tokenStore.set('session:abc', 'dados', 1800);
const session = await tokenStore.get('session:abc');

API

Opções do construtor

interface TokenStoreOptions {
  maxSize?: number;     // limite máximo de chaves (padrão: ilimitado)
  defaultTtl?: number;  // TTL padrão em segundos (padrão: 3600)
  debug?: boolean;      // logs mínimos de depuração (padrão: false)
}

Métodos principais

  • set(key: string, token: string, ttlSeconds?: number): Promise<void>

    • Armazena um token com TTL. Usa defaultTtl quando ttlSeconds não é informado.
  • get(key: string): Promise<string | null>

    • Retorna o token se existente e não expirado; caso contrário, null.
  • delete(key: string): Promise<boolean>

    • Remove a chave e retorna true se existia.
  • has(key: string): Promise<boolean>

    • Indica se a chave existe e está válida.

Metadados

  • getMetadata(key: string): Promise<{ createdAt: number; expiresAt: number } | null>

    • Retorna metadados do item sem expor o valor do token.
  • getTtl(key: string): Promise<number | null>

    • Retorna o TTL restante em segundos.
  • updateTtl(key: string, ttlSeconds: number): Promise<boolean>

    • Atualiza o TTL de uma chave existente.

Gestão

  • keys(): Promise<string[]>

    • Lista as chaves válidas (não expiradas).
  • clear(): Promise<void>

    • Remove todas as chaves e cancela temporizadores.
  • getStats(): { size: number; pendingCleanups: number; memoryUsage: number }

    • Estatísticas aproximadas do armazenamento.

Padrões de uso

Sessão

await tokenStore.set(`session:${sessionId}`, userData, 1800);
const session = await tokenStore.get(`session:${sessionId}`);

Cache de chaves de API

const apiKeyStore = new MemoryTokenStore({ defaultTtl: 3600, maxSize: 5000 });
await apiKeyStore.set(`api_key:${keyHash}`, userPermissions, 3600);
const permissions = await apiKeyStore.get(`api_key:${keyHash}`);

Dados temporários

await tokenStore.set(`upload:${uploadId}`, uploadConfig, 300);
await tokenStore.set(`verify:${email}`, verificationCode, 600);
await tokenStore.set(`reset:${userId}`, resetToken, 1800);

Limitações e considerações

  • Persistência: o armazenamento é apenas em memória; um restart do processo limpa os dados.
  • Segurança: a biblioteca não cifra valores; se necessário, armazene apenas tokens já seguros (ex.: JWT) ou dados não sensíveis.
  • Memória: o custo por entrada envolve chave, valor, metadados e referências de timer. Use maxSize para controlar crescimento.
  • Timers: para TTLs muito longos, o agendamento é segmentado por limites do Node; isso evita “disparos imediatos” indevidos.
  • Ambiente: a biblioteca não mantém o processo ativo por causa de timers (unref() quando disponível); isso é desejável em CLIs e jobs.

Testes e qualidade

  • Testes com vitest, cobrindo operações básicas, expiração, concorrência e TTL longo.
  • Tipos TypeScript incluídos (arquivo .d.ts) e checagem com tsc --noEmit.
  • Lint configurado com eslint + @typescript-eslint.

Licença

MIT © jwcbmat

Links úteis:

  • Repositório: https://github.com/jwcbmat/token-memory-ttl
  • Pacote npm: https://www.npmjs.com/package/@jwcbphy/token-memory-ttl
  • Issues: https://github.com/jwcbmat/token-memory-ttl/issues