#!perl

use common::sense;

use Ion;
use Coro;
use Coro::ProcessPool;
use Data::Dump::Streamer;
use MIME::Base64 qw(encode_base64 decode_base64);

my $pool   = Coro::ProcessPool->new(max_procs => 4);
my $server = Listen 4242;

$server
  << sub{ decode_base64($_[0]) }
  << sub{ my $msg = eval $_[0]; $@ && die $@; $msg };

$server
  >> sub{ Dump($_[0])->Purity(1)->Declare(1)->Indent(0)->Out }
  >> sub{ encode_base64($_[0], '') };

$server->start;

async_pool {
  while (my $conn = <$server>) {
    async_pool {
      while (my $msg = <$conn>) {
        $conn->($pool->process(@$msg));
      }
    };
  }
};

$server->join;