Skip to content

RateLimiter

Spaces queued task starts by a fixed interval.

Use RateLimiter for APIs or providers that require minimum spacing between calls.

Import

typescript
import { Duration } from '@haskou/value-objects';
import {
  QueueOptions,
  RateLimiter,
  RateLimiterInterval,
  RateLimiterOptions,
} from '@haskou/flow';

Signature

typescript
class RateLimiter

Constructor

typescript
constructor(options: RateLimiterOptions)

Validation

RateLimiterOptions accepts a millisecond number, Duration, or RateLimiterInterval. Internally, the interval is stored as RateLimiterInterval.

Throws

This class can throw:

  • InvalidRateLimiterIntervalError
  • any error thrown by a scheduled task

Methods

MethodDescription
schedule(task)Queues a task and waits for its rate-limit turn before running it.
run(task)Alias for schedule(task) used by FlowPipeline.
waitUntilIdle()Resolves when the internal queue is idle.

Example

typescript
import { RateLimiter, RateLimiterOptions } from '@haskou/flow';

const limiter = new RateLimiter(
  new RateLimiterOptions(Duration.fromMilliseconds(100)),
);

await limiter.schedule(() => callProvider());
await limiter.waitUntilIdle();

With queue concurrency

typescript
const limiter = new RateLimiter(
  new RateLimiterOptions(50, QueueOptions.withConcurrency(1)),
);

The queue controls how many tasks may be active in the limiter. The interval controls when each queued task may start.

RateLimiterOptions

Configuration object for RateLimiter.

Signature

typescript
class RateLimiterOptions

Constructor

typescript
constructor(
  interval: number | Duration | RateLimiterInterval,
  queueOptions = new QueueOptions(),
)

Methods

MethodDescription
getInterval()Returns the interval as RateLimiterInterval.
getQueueOptions()Returns queue options used internally by the limiter.

Notes

  • The first task runs immediately.
  • Later tasks wait until the configured interval has elapsed since the previously reserved start.
  • Number inputs are interpreted as milliseconds.
  • Use Flow.rateLimit(rateLimiter) when rate limiting is one step in a larger flow.

Released under the MIT License.