X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FApp%2FClifton%2FConsoleService.pm;h=4ca0e73a7ccdfec58a4c5279818893f859eae57b;hb=cd780129233f7640e94d3ad1bb7910161b1b7ddb;hp=0bb27a23d5bfcddd9189193cc8809021ad46f400;hpb=8b2081ac221fa947e07976edcee71141befd009b;p=scpubgit%2FClifton.git diff --git a/lib/App/Clifton/ConsoleService.pm b/lib/App/Clifton/ConsoleService.pm index 0bb27a2..4ca0e73 100644 --- a/lib/App/Clifton/ConsoleService.pm +++ b/lib/App/Clifton/ConsoleService.pm @@ -1,7 +1,56 @@ package App::Clifton::ConsoleService; +use Log::Contextual qw(:log); +use aliased 'App::Clifton::ConsoleService::Session'; +use IO::Async::Listener; +use IO::Socket::UNIX; +use Scalar::Util qw(weaken); use Moo; extends 'App::Clifton::Service'; +has socket_location => (is => 'ro', default => sub { 'clifton.sock' }); + +has $_ => (is => 'lazy') for qw(listener session socket); + +sub _build_socket { + my ($self) = @_; + my $location = $self->socket_location; + unlink($location) if -e $location; + IO::Socket::UNIX->new( + Local => $location, + Listen => 1, + ) or die "Cannot make UNIX socket - $!\n"; +} + +sub _build_listener { + my ($self) = @_; + $self->_new_child('IO::Async::Listener', { + on_stream => $self->_replace_weakself('_open_connection'), + handle => $self->socket, + }); +} + +sub _build_session { + my ($self) = @_; + Session->new->${\sub { + my ($session) = @_; + $session->lex_env->lexicals->{'$_SERVICE'} = \$self; + weaken(${$session->lex_env->{'$_SERVICE'}}); + $session; + }}; +} + +sub BUILD { + my ($self) = @_; + $self->$_ for qw(listener session); +} + +sub _open_connection { + my ($self, $stream) = @_; + log_debug { "Connection opened" }; + $self->session->configure(transport => $stream); + $self->add_child($self->session); +} + 1;