The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test2::Bundle::Extended;
use Coro;
use Coro::AnyEvent;
use Storable qw(freeze thaw);
use MIME::Base64 qw(encode_base64 decode_base64);
use Ion;

my $message = {foo => 'bar', baz => [1, 2, qq{
bat
  bat
    bat
      bat
    bat
  bat
bat
}]};

my ($request, $response);

my $server = Service{ $request = $_[0] }
  >> sub{ freeze(shift) } >> sub{ encode_base64(shift, '') }
  << sub{ decode_base64(shift) } << sub{ thaw(shift) };

my $client = Connect($server->host, $server->port);
$client >>= sub{ freeze(shift) };
$client >>= sub{ encode_base64(shift, '') };
$client <<= sub{ decode_base64(shift) };
$client <<= sub{ thaw(shift) };

my $timeout = async {
  Coro::AnyEvent::sleep 10;
  $server->stop;
};

$client->($message);
$response = <$client>;
$client->close;
$server->stop;

is $request,  $message, 'request in expected format';
is $response, $message, 'response in expected format';

done_testing;