# `PhoenixKitAgent.Attachments.Slots`
[🔗](https://github.com/BeamLabEU/phoenix_kit_agent/blob/v0.1.0/lib/phoenix_kit_agent/attachments/slots.ex#L1)

The places for work on files on the node (spec §9): at most
`Bounds` `concurrent_jobs` files are processed at the same time, of whom at
most `jobs_per_user` are one user's. A file that finds no place waits for
one, in turn, up to `queue_wait_ms`; with `queued_jobs` waiting already, or
when the time is up, it is refused (`{:error, :unavailable}`) and the file
`failed` as `unavailable`.

A place is held by the process that took it and is free when that process
ends, however it ends; a waiting process that ends leaves the queue. The
limits are read at each decision, so changing them needs no restart. Users
are told apart by uuid only; nothing of a file is known here.

# `acquire`

```elixir
@spec acquire(String.t(), GenServer.server()) :: :ok | {:error, :unavailable}
```

A place for the calling process, for `user_uuid`: `:ok` once there is one,
`{:error, :unavailable}` when there is no room in the queue or the wait is
over (or the slots are not running). The place is held until the caller ends.

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
