API reference › @evolu/common › Task › 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);