basic console service
[scpubgit/Clifton.git] / lib / App / Clifton / ConsoleService.pm
index 0bb27a2..4ca0e73 100644 (file)
@@ -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;