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

@yaebal/again

v0.1.1

Published

yaebal auto-retry plugin - retries 429 retry_after and transient 5xx errors.

Downloads

949

Readme

@yaebal/again

awaited auto-retry for Telegram 429 flood-wait errors and transient 5xx errors. unlike text-parsing retry helpers, again reads TelegramError.parameters.retry_after, which is copied from Telegram's structured response_parameters.retry_after field by @yaebal/core.

install

pnpm add @yaebal/again

usage

import { autoRetry } from "@yaebal/again";

bot.install(
	autoRetry({
		maxRetries: 5,
		retryAfterPaddingMs: 250,
		onRetry: (event) => {
			console.log(event.method, event.reason, event.delayMs);
		},
	}),
);

direct API-hook form:

autoRetry(bot.api, { maxRetries: 5 });

behavior

autoRetry() registers an api.onError hook. when a request fails, core keeps the original promise alive, waits, and re-runs the same API call. await ctx.reply() resolves with the successful retry result or rejects with the final error after the retry budget is exhausted.

retry policy:

  • 429 with error.parameters.retry_after waits exactly that value, plus optional padding.
  • 429 without structured retry_after falls back to exponential backoff.
  • 5xx uses exponential backoff when retryOnInternal is enabled.
  • 4xx client errors are not retried.
  • onRetry observes every scheduled retry for logs and metrics.

options

autoRetry({
	maxRetries: 3,
	maxDelayMs: 30_000,
	baseDelayMs: 1_000,
	retryAfterPaddingMs: 0,
	jitter: 0.2,
	retryOnInternal: true,
	onRetry: (event) => metrics.count(event.reason),
});

testing

import { againTestPack } from "@yaebal/again/test-pack";
import { apiError, createTestEnv } from "@yaebal/test";

const env = createTestEnv(bot, { packs: [againTestPack({ maxRetries: 2 })] });
env.onApi("sendMessage", apiError(429, "Too Many Requests", { retry_after: 0 }), { times: 1 });

with @yaebal/throttle

use @yaebal/throttle before or after again. core runs all error hooks, so throttle can learn Telegram's structured retry_after feedback even when again is the hook that requests the retry.


part of yaebal - a type-safe, runtime-agnostic Telegram Bot API framework. MIT.