[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) › SemaphoreByKey

Defined in: [packages/common/src/Task.ts:2605](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Task.ts#L2605)

A keyed [Semaphore](https://evolu.dev/docs/api-reference/common/Task/interfaces/Semaphore) registry.

Provides semaphore operations per key while preserving the same API shape as
[Semaphore](https://evolu.dev/docs/api-reference/common/Task/interfaces/Semaphore).

By default, [createSemaphoreByKey](https://evolu.dev/docs/api-reference/common/Task/functions/createSemaphoreByKey) uses reference identity for keys,
matching native `Map`. Callers may instead provide a [lookup](https://evolu.dev/docs/api-reference/common/Lookup/type-aliases/Lookup) so
logical equality is based on a derived stable key.

## Extends

- [`Disposable`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management)

## Methods

<a id="dispose"></a>

### \[dispose\]()

```ts
dispose: void;
```

Defined in: node_modules/.bun/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts:36

#### Inherited from

```ts
Disposable.[dispose]
```

## Properties

<a id="snapshot"></a>

### snapshot

```ts
readonly snapshot: (key: K) =>
  | SemaphoreSnapshot
  | null;
```

Defined in: [packages/common/src/Task.ts:2624](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Task.ts#L2624)

Returns current semaphore state for a key, or `null` if absent.

### withPermit

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

Defined in: [packages/common/src/Task.ts:2611](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Task.ts#L2611)

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

Behaves like [Semaphore.withPermit](https://evolu.dev/docs/api-reference/common/Task/interfaces/Semaphore#withpermit), scoped to `key`.

### withPermits

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

Defined in: [packages/common/src/Task.ts:2618](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Task.ts#L2618)

Executes a [Task](https://evolu.dev/docs/api-reference/common/Task/type-aliases/Task) while holding permits for a specific key.

Behaves like [Semaphore.withPermits](https://evolu.dev/docs/api-reference/common/Task/interfaces/Semaphore#withpermits), scoped to `key`.