# BoundedBackpressureController

Source: /tuil/docs/reference/packages/streaming/api/bounded-backpressure-controller
Locale: en

class exported by @mwillbanks/tuil-streaming.



{/* Generated by tooling/docs/generate-reference.ts. */}

## class [#class]

Public class exported by `@mwillbanks/tuil-streaming`.

```ts
export class BoundedBackpressureController implements BackpressureController {
  readonly #highWaterMark: number;
  readonly #waiters: BackpressureWaiter[] = [];
  #size = 0;

  constructor(highWaterMark = 64) {
    if (!Number.isSafeInteger(highWaterMark) || highWaterMark < 1) {
      throw new Error("Backpressure highWaterMark must be positive");
    }
    this.#highWaterMark = highWaterMark;
  }

  get desiredSize(): number {
    return this.#highWaterMark - this.#size;
  }

  async wait(signal?: AbortSignal): Promise<void> {
    if (signal?.aborted) throw signal.reason;
    if (this.#size < this.#highWaterMark) {
      this.#size += 1;
      return;
    }
    await new Promise<void>((resolve, reject) => {
      let waiter: BackpressureWaiter;
      const admit = () => {
        signal?.removeEventListener("abort", waiter.abort);
        this.#size += 1;
        resolve();
      };
      const abort = () => {
        const index = this.#waiters.indexOf(waiter);
        if (index >= 0) this.#waiters.splice(index, 1);
        reject(signal?.reason);
      };
      waiter = { admit, abort };
      this.#waiters.push(waiter);
      signal?.addEventListener("abort", waiter.abort, { once: true });
    });
  }

  release(count = 1): void {
    this.#size = Math.max(0, this.#size - Math.max(1, count));
    while (this.#size < this.#highWaterMark && this.#waiters.length > 0) {
      this.#waiters.shift()?.admit();
    }
  }
}
```

## Members [#members]

| Member           | Type                                      | Required | Description                                                                    | Related types |
| ---------------- | ----------------------------------------- | -------- | ------------------------------------------------------------------------------ | ------------- |
| `#highWaterMark` | `number`                                  | Yes      | The `#highWaterMark` member uses the `number` contract.                        | —             |
| `#waiters`       | `BackpressureWaiter[]`                    | Yes      | The `#waiters` member uses the `BackpressureWaiter[]` contract.                | —             |
| `#size`          | `number`                                  | Yes      | The `#size` member uses the `number` contract.                                 | —             |
| `__constructor`  | `any`                                     | Yes      | The `__constructor` member uses the `any` contract.                            | —             |
| `desiredSize`    | `number`                                  | Yes      | The `desiredSize` member uses the `number` contract.                           | —             |
| `wait`           | `(signal?: AbortSignal) => Promise<void>` | Yes      | The `wait` member uses the `(signal?: AbortSignal) => Promise<void>` contract. | —             |
| `release`        | `(count?: number) => void`                | Yes      | The `release` member uses the `(count?: number) => void` contract.             | —             |

## Parameters [#parameters]

This declaration has no public members.

## Returns [#returns]

This declaration does not return a value.

## Throws [#throws]

No thrown errors are documented for this declaration.

## Related types [#related-types]

* [`BackpressureController`](/tuil/docs/reference/packages/streaming/api/backpressure-controller)

## Source [#source]

[View the secondary source reference](https://github.com/mwillbanks/tuil/blob/main/packages/streaming/src/index.ts)

## Package [#package]

[@mwillbanks/tuil-streaming](/tuil/docs/reference/packages/streaming)
