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

Defined in: [packages/common/src/Resource.ts:354](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Resource.ts#L354)

Shared [Resource](https://evolu.dev/docs/api-reference/common/Resource/type-aliases/Resource)s keyed by logical identity.

A map-like registry of [SharedResource](https://evolu.dev/docs/api-reference/common/Resource/interfaces/SharedResource)s. Each key owns at most one
current resource instance.

The first [acquire](https://evolu.dev/docs/api-reference/common/Resource/interfaces/SharedResourceByKey#acquire) for a key lazily
creates that key's resource. Later acquires for the same key reuse the same
resource until the final [release](https://evolu.dev/docs/api-reference/common/Resource/interfaces/SharedResourceByKey#release) starts
the final disposal path for that key. Disposal and registry removal happen
immediately by default, or after
[idleDisposeAfter](https://evolu.dev/docs/api-reference/common/Resource/interfaces/SharedResourceByKeyOptions#idledisposeafter) elapses
when configured.

Different keys are independent and may progress concurrently. Operations for
the same key are serialized. Calls to
[release](https://evolu.dev/docs/api-reference/common/Resource/interfaces/SharedResourceByKey#release) must be balanced with successful
calls to [acquire](https://evolu.dev/docs/api-reference/common/Resource/interfaces/SharedResourceByKey#acquire). Acquire and release
may still be aborted before they start on an already-stopped Run, but once
started they run to completion. Releasing more times than acquired is a
programmer error checked with [assert](https://evolu.dev/docs/api-reference/common/Assert/variables/assert).

By default, [createSharedResourceByKey](https://evolu.dev/docs/api-reference/common/Resource/functions/createSharedResourceByKey) 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

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

## Methods

<a id="asyncdispose"></a>

### \[asyncDispose\]()

```ts
asyncDispose: PromiseLike<void>;
```

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

#### Inherited from

```ts
AsyncDisposable.[asyncDispose]
```

## Properties

<a id="acquire"></a>

### acquire

```ts
readonly acquire: (key: K) => Task<BorrowedResource<T>, never, D>;
```

Defined in: [packages/common/src/Resource.ts:370](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Resource.ts#L370)

Acquires the shared resource for `key`, creating it on first use.

Once started, acquire runs to completion even if the caller aborts its
Fiber. Always await the result. A successful result still counts as an
acquired lease for `key` and must later be balanced with
[release](https://evolu.dev/docs/api-reference/common/Resource/interfaces/SharedResourceByKey#release).

### get

```ts
readonly get: (key: K) =>
  | BorrowedResource<T>
  | undefined;
```

Defined in: [packages/common/src/Resource.ts:360](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Resource.ts#L360)

Returns the current resource for `key`, or `undefined` if absent.

### getCount

```ts
readonly getCount: (key: K) => Task<number & Brand<"Int"> & Brand<"NonNegative">, never, D>;
```

Defined in: [packages/common/src/Resource.ts:387](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Resource.ts#L387)

Returns the current acquire count for `key`. Missing keys return `0`.

### release

```ts
readonly release: (key: K) => Task<void, never, D>;
```

Defined in: [packages/common/src/Resource.ts:384](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Resource.ts#L384)

Releases one previously acquired shared reference for `key`.

When the last acquired reference for `key` is released, that key's current
resource is disposed and removed from the registry immediately by default.
If [idleDisposeAfter](https://evolu.dev/docs/api-reference/common/Resource/interfaces/SharedResourceByKeyOptions#idledisposeafter) is
set, disposal and registry removal are scheduled instead and a new acquire
for the same key during that delay reuses the current resource.

Once started, release runs to completion even if the caller aborts its
Fiber. Always await the result instead of assuming no cleanup happened.

### snapshot

```ts
readonly snapshot: () => SharedResourceByKeySnapshot<K, T>;
```

Defined in: [packages/common/src/Resource.ts:390](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Resource.ts#L390)

Returns current keyed resources and their per-key mutex state.