-
Notifications
You must be signed in to change notification settings - Fork 44
/
Copy pathchat.pl
31 lines (24 loc) · 983 Bytes
/
chat.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use Mojolicious::Lite -signatures;
use Mojo::Pg;
helper pg => sub { state $pg = Mojo::Pg->new('postgresql://postgres@/test') };
get '/' => 'chat';
websocket '/channel' => sub ($c) {
$c->inactivity_timeout(3600);
# Forward messages from the browser to PostgreSQL
$c->on(message => sub ($c, $message) { $c->pg->pubsub->notify(mojochat => $message) });
# Forward messages from PostgreSQL to the browser
my $cb = $c->pg->pubsub->listen(mojochat => sub ($pubsub, $message) { $c->send($message) });
$c->on(finish => sub ($c) { $c->pg->pubsub->unlisten(mojochat => $cb) });
};
app->start;
__DATA__
@@ chat.html.ep
<form onsubmit="sendChat(this.children[0]); return false"><input></form>
<div id="log"></div>
<script>
var ws = new WebSocket('<%= url_for('channel')->to_abs %>');
ws.onmessage = function (e) {
document.getElementById('log').innerHTML += '<p>' + e.data + '</p>';
};
function sendChat(input) { ws.send(input.value); input.value = '' }
</script>