[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Task](https://evolu.dev/docs/api-reference/common/Task) › Semaphore

Defined in: [packages/common/src/Task.ts:5553](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Task.ts#L5553)

Coordinates concurrent [Task](https://evolu.dev/docs/api-reference/common/Task/type-aliases/Task)s by acquiring and releasing permits.

Use [Semaphore.withPermit](https://evolu.dev/docs/api-reference/common/Task/interfaces/Semaphore#withpermit) or [Semaphore.withPermits](https://evolu.dev/docs/api-reference/common/Task/interfaces/Semaphore#withpermits) to acquire
permits for one Task and release them when it settles. Use
[Semaphore.take](https://evolu.dev/docs/api-reference/common/Task/interfaces/Semaphore#take) when one permit must cover several child Tasks; the
returned [SemaphorePermit](https://evolu.dev/docs/api-reference/common/Task/interfaces/SemaphorePermit) owns release and is disposable.

Requests are not capped by the current permit count because
[Semaphore.resize](https://evolu.dev/docs/api-reference/common/Task/interfaces/Semaphore#resize) can increase it later.

Acquisition uses the `"fifo"` [SemaphorePolicy](https://evolu.dev/docs/api-reference/common/Task/type-aliases/SemaphorePolicy) by default.

Capacity is always positive. Use [Gate](https://evolu.dev/docs/api-reference/common/Task/interfaces/Gate) when work should start closed
and be released later.

`Semaphore` is permit-counting, not owner tracking. Acquiring permits while
already holding permits consumes additional permits and can wait if not
enough permits are available.

## See

[createSemaphore](https://evolu.dev/docs/api-reference/common/Task/functions/createSemaphore)

## Properties

<a id="isidle"></a>

### isIdle

```ts
readonly isIdle: () => boolean;
```

Defined in: [packages/common/src/Task.ts:5600](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Task.ts#L5600)

Whether no permits are held and no requests are queued.

### resize

```ts
readonly resize: (permits: Int1To100OrPositiveInt) => void;
```

Defined in: [packages/common/src/Task.ts:5594](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Task.ts#L5594)

Changes the total permit count without revoking held permits.

Permit count must stay positive; resizing to 0 is not supported. Use
[Gate](https://evolu.dev/docs/api-reference/common/Task/interfaces/Gate) for closed/open coordination.

If the total permit count is reduced below currently held permits, new
acquisitions wait until enough permits are released.

### snapshot

```ts
readonly snapshot: () => SemaphoreSnapshot;
```

Defined in: [packages/common/src/Task.ts:5597](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Task.ts#L5597)

Returns the current semaphore state for monitoring and debugging.

### take

```ts
readonly take: (permits: Int1To100OrPositiveInt) => Task<SemaphorePermit>;
```

Defined in: [packages/common/src/Task.ts:5583](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Task.ts#L5583)

Acquires permits and returns an owned [SemaphorePermit](https://evolu.dev/docs/api-reference/common/Task/interfaces/SemaphorePermit).

The [Task](https://evolu.dev/docs/api-reference/common/Task/type-aliases/Task) waits until enough permits are available. Dispose or
release the returned permit to make them available again.

When the request exceeds the current total permit count, the Task remains
pending until [Semaphore.resize](https://evolu.dev/docs/api-reference/common/Task/interfaces/Semaphore#resize) increases capacity or the Task is
aborted.

### withPermit

```ts
readonly withPermit: <T, E, D>(task: Task<T, E, D>) => Task<T, E, D>;
```

Defined in: [packages/common/src/Task.ts:5555](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Task.ts#L5555)

Runs a [Task](https://evolu.dev/docs/api-reference/common/Task/type-aliases/Task) while holding one permit.

### withPermits

```ts
readonly withPermits: (permits: Int1To100OrPositiveInt) => <T, E, D>(task: Task<T, E, D>) => Task<T, E, D>;
```

Defined in: [packages/common/src/Task.ts:5558](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Task.ts#L5558)

Runs a [Task](https://evolu.dev/docs/api-reference/common/Task/type-aliases/Task) while holding the requested permits.

### withPermitsIfAvailable

```ts
readonly withPermitsIfAvailable: (permits: Int1To100OrPositiveInt) => <T, E, D>(task: Task<T, E, D>) => Task<Option<T>, E, D>;
```

Defined in: [packages/common/src/Task.ts:5569](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Task.ts#L5569)

Runs a [Task](https://evolu.dev/docs/api-reference/common/Task/type-aliases/Task) only when the requested permits are immediately
available.

Returns [none](https://evolu.dev/docs/api-reference/common/Option/variables/none) without running the Task when the request cannot be
granted immediately.