diff --git a/lib/App/Controller/Apiv1.pm b/lib/App/Controller/Apiv1.pm index b560315..7bbdf22 100644 --- a/lib/App/Controller/Apiv1.pm +++ b/lib/App/Controller/Apiv1.pm @@ -30,10 +30,12 @@ sub api_get_paste { if ($row) { $c->delay(sub { my ($delay) = @_; - $c->eval->get_eval($pasteid, $row->{paste}, [$row->{language}], $delay->begin(0, 1)) + $c->eval->get_eval($pasteid, $row->{paste}, [$row->{language}], 0, $delay->begin(0, 1)) }, sub { - my ($delay, $output_hr) = @_; + my ($delay, $evalres) = @_; + + my ($status, $output_hr) = $evalres->@{qw/status output/}; my ($output_lang) = keys %$output_hr; # grab a random output value, should be the first one since multilang support isn't working yet my ($output) = $output_hr->{$output_lang}; @@ -44,6 +46,7 @@ sub api_get_paste { description => $row->{desc}, language => $output_lang, output => $output, + status => $status, warning => "If this was multi-language paste, you just got a random language", }; diff --git a/lib/App/Controller/Apiv2.pm b/lib/App/Controller/Apiv2.pm index 388f88f..f2b1c12 100644 --- a/lib/App/Controller/Apiv2.pm +++ b/lib/App/Controller/Apiv2.pm @@ -50,21 +50,21 @@ sub api_get_paste { if ($row) { $c->delay(sub { my ($delay) = @_; - $c->eval->get_eval($pasteid, $row->{paste}, [$row->{language}], $delay->begin(0, 1)) + $c->eval->get_eval($pasteid, $row->{paste}, [$row->{language}], 0, $delay->begin(0, 1)) }, sub { - my ($delay, $output_hr) = @_; + my ($delay, $evalres) = @_; + + my ($status, $output_hr) = $evalres->@{qw/status output/}; my ($output_lang) = keys %$output_hr; # grab a random output value, should be the first one since multilang support isn't working yet - my ($output) = $output_hr->{$output_lang}; my $data = { paste => $row->{paste}, when => $row->{when}, username => $row->{who}, description => $row->{desc}, language => $output_lang, - output => $output, - warning => "If this was multi-language paste, you just got a random language", + output => $output_hr, }; $c->render(json => $data); diff --git a/lib/App/Controller/Eval.pm b/lib/App/Controller/Eval.pm index 41505f4..605129e 100644 --- a/lib/App/Controller/Eval.pm +++ b/lib/App/Controller/Eval.pm @@ -20,8 +20,6 @@ sub run_eval { my ($self) = @_; my $data = $self->req->body_params; - - $self = $self->inactivity_timeout(3600); my $code = $data->param('code') // ''; @@ -29,13 +27,17 @@ sub run_eval { $self->delay(sub { my $delay = shift; - $self->eval->get_eval(undef, $code, [$language], $delay->begin(0,1)); + $self->eval->get_eval(undef, $code, [$language], 1, $delay->begin(0,1)); return 1; }, sub { my $delay = shift; - my ($output) = @_; + my ($evalres) = @_; + + use Data::Dumper; + print Dumper("wutwut", $evalres); + my $output = $evalres->{output}; $self->render(json => {evalout => $output}); }) diff --git a/lib/App/Controller/Paste.pm b/lib/App/Controller/Paste.pm index 5b43a90..4160c26 100644 --- a/lib/App/Controller/Paste.pm +++ b/lib/App/Controller/Paste.pm @@ -85,15 +85,18 @@ sub get_paste { $c->delay(sub { my $delay = shift; - $c->eval->get_eval($pasteid, $row->{paste}, [$row->{language}], $delay->begin(0,1)); + $c->eval->get_eval($pasteid, $row->{paste}, [$row->{language}], 0, $delay->begin(0,1)); }, sub { - my ($delay, $evalout) = @_; + my ($delay, $evalres) = @_; + + my ($status, $evalout) = $evalres->@{qw/status output/}; $c->stash($row); $c->stash({language => $c->languages->get_language_hash->{$row->{language}}}); $c->stash({all_langs => $c->languages->get_language_hash}); $c->stash({page_tmpl => 'viewer.html'}); $c->stash({paste_id => $pasteid}); $c->stash({eval => $evalout}); + $c->stash({eval_status => $status}); $c->stash({perl_sort_versions => \&App::Model::Languages::perl_sort_versions}); $c->render('page'); diff --git a/lib/App/Model/Eval.pm b/lib/App/Model/Eval.pm index 30f9fa2..4654cdb 100644 --- a/lib/App/Model/Eval.pm +++ b/lib/App/Model/Eval.pm @@ -29,9 +29,14 @@ sub _adopt_future { }) } +sub _get_cache { + my ($key) = @_; + return unless defined $key; + return $memd->get($key); +} sub get_eval { - my ($self, $paste_id, $code, $langs, $callback) = @_; + my ($self, $paste_id, $code, $langs, $wait, $callback) = @_; print "Entering\n"; if (@$langs == 1 && $langs->[0] eq "evalall") { @@ -40,7 +45,7 @@ sub get_eval { use Data::Dumper; print "Languages! ", Dumper($langs); - if ($paste_id && (my $cached = $memd->get($paste_id))) { + if ($paste_id && (my $cached = _get_cache($paste_id))) { $callback->($cached); } else { # connect to server @@ -52,9 +57,16 @@ sub get_eval { my $reader = $self->get_eval_reader($stream); my %output; + # TODO make running status messages per langs? + $memd->set($paste_id, {status => 'running', output => {}}); + + if (!$wait && @$langs != 1) { + $callback->({status => 'running', output => {}}); + } + for my $lang (@$langs) { if ($lang eq 'text') { - $callback->(""); + $callback->({status => "ready", output => {}}); return; } else { my $future = $self->async_eval($stream, $reader, $lang, $code); @@ -72,11 +84,13 @@ sub get_eval { if (!keys %futures) { # I'm the last one print "Calling memset\n"; - $memd->set($paste_id, \%output) if ($paste_id); + $memd->set($paste_id, {status => 'ready', output => \%output}) if ($paste_id); print "Returning output to delay\n"; use Data::Dumper; print Dumper(\%output); - $callback->(\%output); + if ($wait || @$langs == 1) { + $callback->({status => "ready", output => \%output}); + } } }); } diff --git a/templates/viewer.html b/templates/viewer.html index c66754c..f2906a0 100755 --- a/templates/viewer.html +++ b/templates/viewer.html @@ -74,6 +74,9 @@