summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2023-12-09 14:02:41 +0000
committerdakkar <dakkar@thenautilus.net>2023-12-09 14:02:41 +0000
commit4a46c1031aa69e7ba0e309ba9692250f14dba6b8 (patch)
treeb0e5b82f1f763102fb3094904a002d158cc90d7f
parentnew tube api (diff)
downloadHomePanel-4a46c1031aa69e7ba0e309ba9692250f14dba6b8.tar.gz
HomePanel-4a46c1031aa69e7ba0e309ba9692250f14dba6b8.tar.bz2
HomePanel-4a46c1031aa69e7ba0e309ba9692250f14dba6b8.zip
actually async
-rw-r--r--cpanfile5
-rwxr-xr-xdriver-async.pl2
-rwxr-xr-xhomepanel-control49
-rw-r--r--lib/HomePanel/Driver.pm62
-rw-r--r--lib/HomePanel/Render.pm1
-rw-r--r--lib/WebService/ForecastIo.pm36
-rw-r--r--lib/WebService/TFL/Bus.pm20
-rw-r--r--lib/WebService/TFL/TubeStatus.pm20
8 files changed, 66 insertions, 129 deletions
diff --git a/cpanfile b/cpanfile
index 8f5e3b5..97ed0e9 100644
--- a/cpanfile
+++ b/cpanfile
@@ -3,19 +3,20 @@ requires "Class::Load";
requires "Config::Any";
requires "Config::General";
requires "curry::weak";
-requires "Daemon::Control";
requires "Data::Printer";
requires "DateTime";
requires "DateTime::Format::Duration";
requires "DateTime::Format::ISO8601";
requires "DateTime::TimeZone";
+requires "Future::AsyncAwait";
requires "IO::Async::Loop";
+requires "IO::Async::SSL";
requires "IO::Async::Timer::Periodic";
requires "JSON";
requires "LWP::UserAgent";
requires "LWP::Protocol::https";
requires "Moo";
-requires "namespace::autoclean";
+requires "namespace::clean";
requires "Net::Async::HTTP";
requires "Package::Variant";
requires "Path::Class";
diff --git a/driver-async.pl b/driver-async.pl
index c074201..701a8cd 100755
--- a/driver-async.pl
+++ b/driver-async.pl
@@ -19,6 +19,8 @@ my $hp = HomePanel::Driver->new({
template_file => ($config{template} || path(__FILE__)->parent->child('forecast.html.tt')),
output_file => ($config{output_file} || path(__FILE__)->parent->child('forecast.html')),
forecast_key => $config{forecast_key},
+ forecast_latitude => $config{forecast_latitude},
+ forecast_longitude => $config{forecast_longitude},
bus_stop_id => $config{bus_stop_id},
});
diff --git a/homepanel-control b/homepanel-control
deleted file mode 100755
index f8a20ad..0000000
--- a/homepanel-control
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/env perl
-use strict;
-use warnings;
-use Daemon::Control;
-use Path::Tiny;
-use Config::Any;
-
-my $basedir = path(__FILE__)->parent->realpath;
-
-my $config_file = $basedir->child('homepanel.conf');
-my $cfg_set = Config::Any->load_files({
- files => [$config_file],
- use_ext => 1,
-});
-my %config = map { %{(values %$_)[0]} } @$cfg_set;
-my $dest_dir = path($config{output_file})->parent->realpath;
-my $icons = $basedir->child('icons');
-
-exit Daemon::Control->new(
- init_code => <<"INIT",
-if [ ! -d $dest_dir/icons ]; then
- mkdir -p $dest_dir
- mount -t tmpfs none $dest_dir
- cp -a $icons $dest_dir/
-fi
-
-export PERL5LIB="/home/dakkar/.perlbrew/libs/perl-5.30.2\@HomePanel/lib/perl5"
-export PATH="/home/dakkar/.perlbrew/libs/perl-5.30.2\@HomePanel/bin:/home/dakkar/perl5/perlbrew/bin:/home/dakkar/perl5/perlbrew/perls/perl-5.30.2/bin:\$PATH"
-INIT
-
- name => "HomePanel",
- lsb_sdesc => 'Home info panel',
- lsb_desc => 'Show forecast, tube, bus status.',
- path => path(__FILE__)->realpath,
-
- program => $basedir->child('driver-async.pl'),
- program_args => [ $config_file ],
-
- user => 'dakkar',
- group => 'users',
- directory => $basedir,
-
- pid_file => $basedir->child('homepanel.pid'),
- stderr_file => $basedir->child('homepanel.err'),
- stdout_file => $basedir->child('homepanel.out'),
-
- fork => 2,
-
-)->run;
diff --git a/lib/HomePanel/Driver.pm b/lib/HomePanel/Driver.pm
index 8b6c755..ce3026a 100644
--- a/lib/HomePanel/Driver.pm
+++ b/lib/HomePanel/Driver.pm
@@ -1,38 +1,39 @@
package HomePanel::Driver;
use Moo;
-use 5.10.0;
+use v5.36;
use IO::Async::Loop;
use IO::Async::Timer::Periodic;
-use HomePanel::AsyncUA;
+use Net::Async::HTTP;
+use Future::AsyncAwait;
use WebService::ForecastIo;
use WebService::TFL::Bus;
use WebService::TFL::TubeStatus;
use HomePanel::Render;
use Types::Path::Tiny qw(AbsFile AbsPath);
use Try::Tiny;
-#use Devel::Cycle;
use curry::weak;
-use namespace::autoclean;
+use namespace::clean;
+use Data::Dumper;
has loop => ( is => 'lazy' );
sub _build_loop { IO::Async::Loop->new() }
has user_agent => ( is => 'lazy' );
sub _build_user_agent {
- #HomePanel::AsyncUA->new({loop=>$_[0]->loop});
- require LWP::UserAgent;
- return LWP::UserAgent->new(timeout=>20);
+ my ($self) = @_;
+ my $ua = Net::Async::HTTP->new(
+ max_connections_per_host => 1,
+ stall_timeout => 10,
+ decode_content => 1,
+ );
+ $self->loop->add($ua);
+ return $ua;
}
-has forecast_request => (
+has [qw(forecast_latitude forecast_longitude)] => (
is => 'ro',
- default => sub { +{
- latitude => 51.54,
- longitude => -0.37,
- exclude => ['flags','sources'],
- }; },
+ required => 1,
);
-has forecast_response => ( is => 'rw' );
has forecast_key => (
is => 'ro',
required => 1,
@@ -45,6 +46,7 @@ sub _build_forecast {
user_agent => $self->user_agent,
});
}
+has forecast_response => ( is => 'rw' );
has forecast_timer => ( is => 'lazy' );
sub _build_forecast_timer {
my ($self) = @_;
@@ -55,15 +57,15 @@ sub _build_forecast_timer {
}
sub forecast_timer_cb {
my ($self) = @_;
- $self->forecast_response(
- $self->forecast->request(
- $self->forecast_request
- )
- );
+
+ $self->forecast->request({
+ latitude => $self->forecast_latitude,
+ longitude => $self->forecast_longitude,
+ exclude => ['flags','sources'],
+ })->then(sub { $self->forecast_response(shift) })->retain;
}
has bus_stop_id => ( is => 'ro', required => 1 );
-has bus_response => ( is => 'rw' );
has bus => (
is => 'lazy',
);
@@ -72,6 +74,7 @@ sub _build_bus {
user_agent => $_[0]->user_agent,
});
}
+has bus_response => ( is => 'rw' );
has bus_timer => ( is => 'lazy' );
sub _build_bus_timer {
my ($self) = @_;
@@ -82,11 +85,10 @@ sub _build_bus_timer {
}
sub bus_timer_cb {
my ($self) = @_;
- $self->bus_response(
- $self->bus->request(
- $self->bus_stop_id
- )
- );
+
+ $self->bus->request(
+ $self->bus_stop_id
+ )->then(sub { $self->bus_response(shift) })->retain;
};
has tube => (
@@ -108,9 +110,9 @@ sub _build_tube_timer {
}
sub tube_timer_cb {
my ($self) = @_;
- $self->tube_response(
- $self->tube->request()
- );
+
+ $self->tube->request(
+ )->then(sub { $self->tube_response(shift) })->retain;
}
has writer_timer => ( is => 'lazy' );
@@ -160,6 +162,8 @@ sub _build_render {
sub write_page {
my ($self) = @_;
+ return unless $self->forecast_response;
+
my $output = $self->render->render({
forecast => $self->forecast_response,
bus => $self->bus_response,
@@ -167,8 +171,6 @@ sub write_page {
});
$self->output_file->spew_utf8($output);
-
- #find_cycle($self);
}
sub start {
diff --git a/lib/HomePanel/Render.pm b/lib/HomePanel/Render.pm
index fe165e3..34a220b 100644
--- a/lib/HomePanel/Render.pm
+++ b/lib/HomePanel/Render.pm
@@ -6,6 +6,7 @@ use Template::Stash::ForceUTF8;
use Template;
use DateTime;
use DateTime::Format::Duration;
+use namespace::clean;
has [qw(provider stash template)] => (
is => 'lazy',
diff --git a/lib/WebService/ForecastIo.pm b/lib/WebService/ForecastIo.pm
index 6d37519..f3bf109 100644
--- a/lib/WebService/ForecastIo.pm
+++ b/lib/WebService/ForecastIo.pm
@@ -2,13 +2,13 @@ package WebService::ForecastIo;
use Moo;
use 5.10.0;
use Types::Standard -types,'slurpy';
-use Type::Utils qw(duck_type enum);
use Types::URI 'Uri';
use Types::DateTime -all;
use Type::Params;
+use Future::AsyncAwait;
use WebService::ForecastIo::Response;
use DateTime::TimeZone;
-use namespace::autoclean;
+use namespace::clean;
has base_uri => (
is => 'ro',
@@ -24,19 +24,10 @@ has api_key => (
);
has user_agent => (
- is => 'lazy',
- isa => duck_type(['get']),
+ is => 'ro',
+ isa => HasMethods['do_request'],
+ required => 1,
);
-sub _build_user_agent {
- require LWP::UserAgent;
- my $agent = LWP::UserAgent->new(
- agent => __PACKAGE__ . ' version ' . ($WebService::ForecastIo::VERSION // 'devel' ),
- env_proxy => 1,
- keep_alive => 1,
- );
- $agent->default_header( 'Accept-Encoding' => 'gzip' );
- return $agent;
-}
sub _make_request_uri {
my ($self,$opts) = @_;
@@ -74,10 +65,10 @@ sub _make_request_uri {
return $req_uri;
}
-my $units_type = enum [qw(us si ca uk auto)];
-my $block_type = enum [qw(currently minutely hourly daily alerts flags sources)];
+my $units_type = Enum [qw(us si ca uk auto)];
+my $block_type = Enum [qw(currently minutely hourly daily alerts flags sources)];
-sub request {
+async sub request {
state $argcheck = compile(
Object, Dict[
latitude => Num,
@@ -85,25 +76,22 @@ sub request {
time => Optional[DateTimeUTC],
units => Optional[$units_type],
exclude => Optional[ArrayRef[$block_type]],
- raw => Optional[Bool],
],
);
my ($self,$opts) = $argcheck->(@_);
$opts->{units} //= 'si';
$opts->{exclude} //= [];
- $opts->{raw} //= 0;
my $uri = $self->_make_request_uri({%$opts});
- my $response = $self->user_agent->get($uri);
+ my $response = await $self->user_agent->do_request(uri => $uri);
+
if ($response->is_success) {
my $json = $response->decoded_content;
- return $json if $opts->{raw};
- my $res = WebService::ForecastIo::Response->new($json);
- return wantarray ? ($res,$json) : $res
+ return WebService::ForecastIo::Response->new($json);
}
else {
- die $response->status_line
+ die $response->status_line;
}
}
diff --git a/lib/WebService/TFL/Bus.pm b/lib/WebService/TFL/Bus.pm
index 31bd9c3..8f43c0f 100644
--- a/lib/WebService/TFL/Bus.pm
+++ b/lib/WebService/TFL/Bus.pm
@@ -1,21 +1,16 @@
package WebService::TFL::Bus;
use Moo;
use Types::URI 'Uri';
-use Type::Utils 'duck_type';
+use Types::Standard -types;
+use Future::AsyncAwait;
use WebService::TFL::Bus::Response;
use namespace::clean;
has user_agent => (
- isa => duck_type(['get']),
- is => 'lazy',
-
+ isa => HasMethods['do_request'],
+ is => 'ro',
+ required => 1,
);
-sub _build_user_agent {
- require LWP::UserAgent;
- my $ua = LWP::UserAgent->new();
- $ua->env_proxy;
- return $ua;
-}
has uri => (
isa => Uri,
@@ -29,7 +24,7 @@ has parser => (
builder => sub { JSON->new->utf8 },
);
-sub request {
+async sub request {
my ($self,$stop_id) = @_;
my $uri = $self->uri->clone;
@@ -37,7 +32,8 @@ sub request {
map { $_ eq '__' ? $stop_id : $_ } $uri->path_segments
);
- my $http_response = $self->user_agent->get($uri);
+ my $http_response = await $self->user_agent->do_request(uri => $uri);
+
if ($http_response->is_success) {
my $json = $http_response->content;
diff --git a/lib/WebService/TFL/TubeStatus.pm b/lib/WebService/TFL/TubeStatus.pm
index 4166a79..52d573d 100644
--- a/lib/WebService/TFL/TubeStatus.pm
+++ b/lib/WebService/TFL/TubeStatus.pm
@@ -1,20 +1,16 @@
package WebService::TFL::TubeStatus;
use Moo;
-use Type::Utils 'duck_type';
use Types::URI 'Uri';
+use Types::Standard -types;
+use Future::AsyncAwait;
use WebService::TFL::TubeStatus::Response;
-use namespace::autoclean;
+use namespace::clean;
has user_agent => (
- isa => duck_type(['get']),
- is => 'lazy',
+ isa => HasMethods['do_request'],
+ is => 'ro',
+ required => 1,
);
-sub _build_user_agent {
- require LWP::UserAgent;
- my $ua = LWP::UserAgent->new();
- $ua->env_proxy;
- return $ua;
-}
has uri => (
isa => Uri,
@@ -28,11 +24,11 @@ has parser => (
builder => sub { JSON->new->utf8 },
);
-sub request {
+async sub request {
my ($self) = @_;
+ my $http_response = await $self->user_agent->do_request(uri => $self->uri);
- my $http_response = $self->user_agent->get($self->uri);
if ($http_response->is_success) {
my $json = $http_response->content;