Hello,
I am just starting out with Mojolicious. I am trying to create an
application that provides a Websocket interface to a child process managed
by the application. I started with the great example of a Websocket
program here:
Joel's example
<http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&cad=rja&uact=8&ved=0CEIQFjAF&url=http%3A%2F%2Fblogs.perl.org%2Fusers%2Fjoel_berger%2F2014%2F09%2Fmojolicious-do-it-for-the-candy.html&ei=vLuZVLqAEsGVNr-_gYgI&usg=AFQjCNFDjyc9tu0Sl9K4Z2U5oKO41MqOvw&bvm=bv.82001339,d.eXY>
I started to modify it by stripping uneeded functions and adding code to
manage the child process. Here is that version (minus the html/javascript
part which is currently unchanged from Joel's):
#!/usr/bin/env
perl
use Mojolicious::Lite;
use Mojo::IOLoop;
use IO::Async::Process;
use IO::Async::Loop::Mojo;
my $loop = IO::Async::Loop::Mojo->new;
my $process = IO::Async::Process->new(
command => [ "/bin/ping", "-c4", "localhost" ],
stdout => {
on_read => sub {
my ( $stream, $buffref, $eof ) = @_;
while ( $$buffref =~ s/^(.*)\n// ) {
print "PING wrote: $1\n";
}
return 0;
},
},
on_finish => sub {
my ( $pid, $exitcode ) = @_;
my $status = ( $exitcode >> 8 );
$loop->stop;
},
);
$loop->add($process);
# setup base
route
any '/' => sub {
my $self = shift;
my $rows;
push @$rows, [ 'col', 1 ];
$self->render( 'index', rows => $rows );
};
# setup websocket message
handler
websocket '/monitor' => sub {
my $self = shift;
$self->on(
json => sub {
my ( $ws, $row ) = @_;
my $html = $ws->render_to_string( 'table', rows => [$row] );
$ws->send( { json => { row => $html } } );
# Start recurring
timer
my $i = 1;
my $id = Mojo::IOLoop->recurring(
1 => sub {
$html = $ws->render_to_string( 'table', rows => [$row]
);
$ws->send( { json => { row => $html } } );
$self->finish if $i++ == 5;
}
);
# Stop recurring
timer
$self->on( finish => sub { Mojo::IOLoop->remove($id) } );
}
);
};
app->start;
The problem is if I leave the "$loop->add($process);" line in code the
Websocket part doesn't work. This is probably due to how I setup the
IO::Async stuff.
Also, thinking ahead getting past this I would like the Websocket clients
to interact with the child process (see the output of the single child and
to restart it). However, it is not clear how to do that in Mojolicious.
Yes, these are probably very basic things and any assistance is appreciated.
Thanks,
John
--
You received this message because you are subscribed to the Google Groups
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.