use v6.d; unit class MaildirIndexer::Server; use MaildirIndexer::LogTimelineSchema; use MaildirIndexer::Parser; use MaildirIndexer::Store; has $.port = 9000; has MaildirIndexer::Store $.store is required; method serve() { my $listener = IO::Socket::Async.listen( '127.0.0.1', $.port, :enc, ); react { whenever signal(SIGINT) { exit } whenever signal(SIGHUP) { $.store.dump(); } whenever $listener -> $conn { MaildirIndexer::LogTimelineSchema::Server::Serve.log: { LEAVE { $conn.close } with parse-email($conn) -> $email { with $.store.mailbox-for-email($email) -> $mailbox { await $conn.print("$mailbox\x0d\x0a"); # apparently socket failures ("broken pipe", # "Cannot write to a closed socket") are # X::AdHoc CATCH { when X::OS { }; when X::AdHoc { }; default { .rethrow } } } } } } } }