# `Soundcheck.Check.Warning.BlockingCallInHandler`
[🔗](https://github.com/leonqadirie/soundcheck/blob/v0.1.0/lib/soundcheck/check/warning/blocking_call_in_handler.ex#L1)

## Basics

> #### This check is disabled by default. {: .neutral}
>
> [Learn how to enable it](`e:credo:config_file.html#checks`) via `.credo.exs`.

This check has a base priority of `normal` and works with any version of Elixir.

## Explanation

Flags calls that block a LiveView process inside `handle_event/3`,
`handle_info/2`, and `handle_params/3`: sleeps, `Task.await/2`, HTTP
requests, and `receive` without `after`. A LiveView handles one
message at a time, so while the handler waits, the page ignores
every click, keystroke, and broadcast.

Before:

    def handle_event("refresh", _params, socket) do
      prices = Req.get!("https://api.example.com/prices").body
      {:noreply, assign(socket, :prices, prices)}
    end

After:

    def handle_event("refresh", _params, socket) do
      {:noreply,
       start_async(socket, :prices, fn -> Req.get!("https://api.example.com/prices").body end)}
    end

Calls inside closures (`start_async/3`, `Task.async/1`) do not count.
`blocking_functions` lists `{Module, :function}` pairs and
`blocking_modules` lists modules (atoms or regexes on the
alias-expanded name) whose every call blocks.

Confidence: medium. Tier: syntactic (works without compiling).

## Check-Specific Parameters

Use the following parameters to configure this check:

### `:excluded_paths`

  Paths to skip (atoms, binaries as path segments, or regexes).

*This parameter defaults to* `[~r/\/test\//, "test"]`.

### `:strict`

  Unused.

*This parameter defaults to* `false`.

### `:blocking_functions`

  `{Module, :function}` pairs that block.

*This parameter defaults to* `[{Process, :sleep}, {:timer, :sleep}, {Task, :await}, {Task, :await_many}, {Task, :yield}, {Task, :yield_many}]`.

### `:blocking_modules`

  Modules whose calls block: atoms or regexes.

*This parameter defaults to* `[~r/^(Req|Finch|HTTPoison|Tesla)$/]`.

## General Parameters

Like with all checks, [general params](`e:credo:check_params.html`) can be applied.

Parameters can be configured via the [`.credo.exs` config file](`e:credo:config_file.html`).

---

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