diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9259173..ad5781d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -16,4 +16,4 @@ jobs: - uses: actions/checkout@v4 - name: Publish package - run: npx jsr publish \ No newline at end of file + run: npx jsr publish diff --git a/README.md b/README.md index e2e645d..dcbc315 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,28 @@ bun add github:nesterow/limiter # or pnpm ## Usage +### Add tasks + +```typescript +import { Limiter, LimiterRetryError } from "@nesterow/limiter"; + +const task = ({ url }) => { + await fetch(url); + // ... write +}; + +const limiter = new Limiter({ + limit: 20, + onError(error) { + // Logger.error(error) + }, +}); + +limiter.process(task); +limiter.process(task); +limiter.process(task); +``` + ### Limit number of requests ```typescript @@ -35,81 +57,74 @@ const limiter = new Limiter({ limit: 10, }); -for (let i = 0; i < 100; i++) { - await limiter.process(task); -} +await limiter.process(...Array.from({ length: 100 }, () => task())); ``` ### Limit RPS ```typescript -import {Limiter} from '@nesterow/limiter' +import { Limiter } from "@nesterow/limiter"; const execEvery100ms = () => { - await fetch('https://my.api.xyz') - // ... write -} + await fetch("https://my.api.xyz"); + // ... write +}; const limiter = new Limiter({ - limit: 20 - rps: 10 -}) - -for (let i=0; i < 100; i++) { - await limiter.process(execEvery100ms) -} + limit: 20, + rps: 10, +}); +await limiter.process(...Array.from({ length: 100 }, () => execEvery100ms())); ``` ### Retry ```typescript -import {Limiter, LimiterRetryError} from '@nesterow/limiter' +import { Limiter, LimiterRetryError } from "@nesterow/limiter"; const retry5times = () => { - await fetch('https://my.api.xyz') - throw new Error("Connection refused") - // ... write -} + await fetch("https://my.api.xyz"); + throw new Error("Connection refused"); + // ... write +}; const limiter = new Limiter({ - limit: 20 - maxRetry: 5 -}) + limit: 20, + maxRetry: 5, +}); -for (let i=0; i < 100; i++) { - try { - await limiter.process(retry5times) - } catch(e) { - if (e instanceof LimiterRetryError) { - // Logger.log(e) - } +for (let i = 0; i < 100; i++) { + try { + await limiter.process(Array.from({ length: 100 }, () => retry5times())); + } catch (e) { + if (e instanceof LimiterRetryError) { + // Logger.log(e) } + } } - ``` ### Handle errors in background ```typescript -import {Limiter, LimiterRetryError} from '@nesterow/limiter' +import { Limiter, LimiterRetryError } from "@nesterow/limiter"; const wontStopPooling = () => { - await fetch('https://my.api.xyz') - throw new Error("Connection refused") - // ... write -} + await fetch("https://my.api.xyz"); + throw new Error("Connection refused"); + // ... write +}; const limiter = new Limiter({ - limit: 20 - maxRetry: 5, - onError(error) { - // Logger.error(error) - } -}) + limit: 20, + maxRetry: 5, + onError(error) { + // Logger.error(error) + }, +}); -for (let i=0; i < 100; i++) { - await limiter.process(wontStopPooling) +for (let i = 0; i < 100; i++) { + await limiter.process(Array.from({ length: 100 }, () => wontStopPooling())); } - ``` diff --git a/jsr.json b/jsr.json index 8cea72c..2348f30 100644 --- a/jsr.json +++ b/jsr.json @@ -1,5 +1,5 @@ { "name": "@nesterow/limiter", - "version": "0.1.0", + "version": "0.1.1", "exports": "./limiter.ts" } diff --git a/package.json b/package.json index 29577eb..191c07a 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "0.1.0", + "version": "0.1.1", "name": "@nesterow/limiter", "module": "limiter.ts", "type": "module",