API reference@evolu/commonTask › createSemaphore

function createSemaphore(
  initialPermits: Int1To100OrPositiveInt,
  __namedParameters?: {
    policy?: SemaphorePolicy;
  },
): Semaphore;

Defined in: packages/common/src/Task.ts:5732

Creates a Semaphore.

Example

import {
  assertEqual,
  createRun,
  createSemaphore,
  getOk,
  ok,
  sleep,
  type Task,
} from "@evolu/common";

await using run = createRun();

const semaphore = createSemaphore(2);
let activeSaves = 0;
let maxActiveSaves = 0;

const saveUser =
  (id: string): Task<string> =>
  async (run) => {
    activeSaves += 1;
    maxActiveSaves = Math.max(maxActiveSaves, activeSaves);
    await run.ok(sleep("10ms"));
    activeSaves -= 1;
    return ok(`saved:${id}`);
  };

const results = await Promise.all([
  run(semaphore.withPermit(saveUser("1"))),
  run(semaphore.withPermit(saveUser("2"))),
  run(semaphore.withPermit(saveUser("3"))),
]);

const savedUsers = results.map(getOk);
assertEqual(savedUsers, ["saved:1", "saved:2", "saved:3"]);
assertEqual(maxActiveSaves, 2);