# LibTmux::Async::Server#wait_for

- **Module:** LibTmux::Async
- **Package:** libtmux-async
- **Language:** Ruby
- **Kind:** method
- **Source:** https://github.com/libtmux/libtmux-ruby/blob/d8ce4bbee0ca7748a81929f81f7d8d07f8c51267/gems/libtmux/lib/libtmux/operations.rb#L47
- **Public owner:** LibTmux::Server#wait_for
- **Page:** https://libtmux.org/en/ruby/v0.1.0.alpha.3/reference/libtmux-async-server-wait_for/

```
def wait_for: (
  ::String,
  ?action: :wait | :signal | :lock | :unlock,
  ?timeout: ::Numeric,
  ?cancel: untyped
) -> ::LibTmux::CommandResult
```

Retiring the client cannot remove a dispatched waiter from tmux's queue.

Behavior contract: Wait channels.

## Examples

Cancel an Async task whose tmux request is waiting and read the delivery evidence on the Cancelled error. Use Ruby 4.0.7, Bundler, Git and tmux 3.3a or newer on Unix, with /bin/cat and /bin/sh available. In an empty directory, fetch the documented library revision:

```console
$ git clone https://github.com/libtmux/libtmux-ruby.git libtmux-source && \
  git -C libtmux-source checkout d8ce4bbee0ca7748a81929f81f7d8d07f8c51267
```

Save this dependency file as Gemfile:

```ruby
source "https://rubygems.org"

gem "libtmux-async", path: "libtmux-source/gems/libtmux-async"
```

Save this complete program as async_run.rb. Its Server.start block owns a private tmux server and stops it on exit, including after an error.

[Source example](https://github.com/libtmux/libtmux-ruby/blob/d8ce4bbee0ca7748a81929f81f7d8d07f8c51267/examples/api/async_run.rb).

```ruby
# frozen_string_literal: true

begin
  # docs:begin main
  require "libtmux"
  require "libtmux/async"

  LibTmux::Server.start do |server|
    server.new_session(name: "work", command: ["/bin/cat"])
    Async do |parent|
      LibTmux::Async.open(parent: parent, server: server) do |scope|
        waiting = parent.async do
          scope.server.run(["wait-for", "-S", "ready", ";", "wait-for", "held"], timeout: 5)
        rescue LibTmux::Cancelled => error
          error
        end
        scope.server.wait_for("ready", timeout: 5)
        waiting.cancel
        failure = waiting.wait
        puts "request: #{failure.class}"
        puts "delivery: #{failure.delivery}"
      end
    end.wait
  end
  # docs:end main
rescue StandardError => error
  warn "#{error.class}: #{error.message}"
  exit 1
end
```

Install the runtime dependencies and run the saved program. An operation or cleanup error makes it exit unsuccessfully:

```console
$ bundle config set --local path vendor/bundle && \
  bundle install --jobs 2 && \
  bundle exec ruby async_run.rb
```

Expected output:

```text
request: LibTmux::Cancelled
delivery: possibly_sent
```

## Parameters

- `arg1` (`::String`)
- `action` (`:wait | :signal | :lock | :unlock`)
- `timeout` (`::Numeric`)
- `cancel` (`untyped`)
