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

Defined in: [packages/common/src/Task.ts:6052](https://github.com/evoluhq/evolu/blob/dd96d79f1dbe9a49fa12ce8e0aa7d3d0177795ca/packages/common/src/Task.ts#L6052)

Runs [Task](https://evolu.dev/docs/api-reference/common/Task/type-aliases/Task)s one at a time independently for each key, like
[Mutex](https://evolu.dev/docs/api-reference/common/Task/interfaces/Mutex).

## Properties

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

### isIdle

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

Defined in: [packages/common/src/Task.ts:6057](https://github.com/evoluhq/evolu/blob/dd96d79f1dbe9a49fa12ce8e0aa7d3d0177795ca/packages/common/src/Task.ts#L6057)

Whether the lock for the key is neither held nor queued.

### snapshot

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

Defined in: [packages/common/src/Task.ts:6060](https://github.com/evoluhq/evolu/blob/dd96d79f1dbe9a49fa12ce8e0aa7d3d0177795ca/packages/common/src/Task.ts#L6060)

Returns the current key lock state, or null when the key is idle.

### withLock

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

Defined in: [packages/common/src/Task.ts:6054](https://github.com/evoluhq/evolu/blob/dd96d79f1dbe9a49fa12ce8e0aa7d3d0177795ca/packages/common/src/Task.ts#L6054)

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