The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

RapidApp::BgTaskInterface

SYNOPSIS

  package MyModule;
  use Moose;
  extends 'RapidApp::BgTaskInterface';
  sub getTask {
    my $task= ... # load a RapidApp::BgTask::Task object, somehow.  See notes on 'getTask'
        return $task;
  }
  1;

DESCRIPTION

This module provides the interfaces needed for the Ext.ux.RapidApp.BgTaskRenderPanel. In the future, it will also have the methods needed for the planned javascript interface that provides a line of stdin, and tabs for stdout/stderr, and a metadata inspector.

ATTRIBUTES

create_active

Whether or not the refresh polling should be initiated during the constructor of the javascript panel. This only affects the javascript generated by $self->renderPanel_js (and $self->content)

callback_params

Parameters which should be sent to the client during creation and returned to the controller on each request. Same as Ext's "base_params", but with a better name. This only takes effect when $self->renderPanel_js is called.

read_enabled

Whether javascript read requests are permitted to read stream data from the job. You will likely want to override this attribute with a custom function.

write_enabled

Whether javascript write requests are permitted to write to streams of the job. You will likely want to override this attribute with a custom function.

$self->getTask() [abstract]

Returns a RapidApp::BgTask::TaskClient object.

This method is abstract, and needs to be implemented in the derived class. Simple (but inefficient) implementation:

   # open connection to task supervisor on each request
   my $taskPool= RapidApp::BgTask::TaskPool->new(path => '/tmp/foo');
   my ($t)= $taskPool->search({ meta => { name => 'My Task' }});
   die "Can't find task" unless $t;

Better implementation by caching the taskpool and pid:

   # keep taskPool allocated somewhere else (in a ::Model perhaps, or in the main application)
   package MyApp;
   has taskPool => ( is => 'ro', default => sub { RapidApp::BgTask::TaskPool->new(path => '/tmp/foo', mkdirIfMissing => [ 0755, undef, undef ] ) } );
   
   package MyModule;
   if (my $pid= $self->c->session->{'my_module_task_name_pid'}) {
     my $task= $self->c->taskPool->taskByPid($pid);
     return $task if $task && $task->connect(my $err);
   }
   my ($task)= $self->c->taskPool->search({ meta => { name => 'My Task' }});
   die "Can't find task" unless $task;
   return $task;

An even better implementation would be to hold open the connection to the task supervisor, but then you need a way to close the connection if it goes unused for a while, to conserve resources.

renderPanel_js

Get the javascript to create a BgTaskRenderPanel fromo this module's configuration.

writeInput

Write data to STDIN of the job.

readOutput

Read from STDOUT of the job. No support yet for STDERR, so you should redirect STDERR into STDOUT within the job. (This is the only way to see them in proper sequence anyway. The Supervisor has no record of which lines of data came first between two streams. Adding such timestamps might not be a bad idea, but would only tell which stream the Supervisor read first, not which had data on it first.)

_tty2html

Convert terminalisms into HTML.

At the moment, this just handles "\r" processing. In the future it will also handle colors. No support is planned for cursor-moving features that cross line boundaries.