Skip to content

Instantly share code, notes, and snippets.

@jberger
Last active August 29, 2015 14:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jberger/93b3a192fc68a0d7ca14 to your computer and use it in GitHub Desktop.
Save jberger/93b3a192fc68a0d7ca14 to your computer and use it in GitHub Desktop.
Stream command output to browser via websocket
#!/usr/bin/env perl
use Mojolicious::Lite;
use 5.20.0;
use experimental 'signatures';
get '/' => {template => 'index'};
my $cmd = 'sleep 1; echo "hello world"; sleep 1; echo "yo peeps"';
websocket '/output' => sub ($c) {
$c->send("Running command: $cmd\n");
open my $output, '-|', $cmd or die "Couldn't spawn: $!";
my $stream = Mojo::IOLoop::Stream->new($output);
$stream->on(read => sub ($stream, $bytes) { $c->send({text => $bytes}) });
my $sid = Mojo::IOLoop->stream($stream);
$c->on(finish => sub { Mojo::IOLoop->remove($sid) });
};
app->start;
__DATA__
@@ index.html.ep
<pre id="log"></pre>
<script>
var ws = new WebSocket('<%= url_for('output')->to_abs %>');
var log = document.getElementById('log');
ws.onmessage = function (event) { log.innerHTML += event.data };
</script>
@jberger
Copy link
Author

jberger commented May 2, 2015

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment