use v6.d; use Cro::HTTP::Server; use Cro::HTTP::Router; use Vlc::Client; use Lirc::Commands; class App::MediaControl { has Vlc::Client $.vlc is required; has Lirc::Commands $.lirc is required; has Int $.port = 8080; has Cro::Service $!service handles ; method start() { my $vlc = route { post -> 'play' { await self.vlc.command('pl_play') } post -> 'pause' { await self.vlc.command('pl_pause') } post -> 'stop' { await self.vlc.command('pl_stop') } get -> 'status' { my $status = await self.vlc.status(); content 'application/json', $status; } } my $ir = route { post -> $thing, $arg { await self.lirc.send($thing, $arg); } } my $application = route { resources-from %?RESOURCES; get -> { resource 'index.html' } get -> 'ir.png' { resource 'ir.png' } get -> 'ir.webmanifest' { resource 'ir.webmanifest' } include :$vlc, :$ir; around -> &handler { handler(); CATCH { default { note "BOOM $_"; response.status = 500; content 'application/json', %( error => "$_" ); } } } }; $!service = Cro::HTTP::Server.new( :port(self.port), :$application, ); return $!service.start(); } }