如何判断EventSource(SSE)是否仍处于打开状态并保持持久性?

时间:2013-11-01 20:39:04

标签: javascript perl server-sent-events mojolicious

我的页面中有一个区域,每当有人更改数据库中的某个字段时,该区域就会发出一个事件。现在,这个事件似乎已经开了一段时间了,但是经过一段时间的空闲时间后,当列被更改时我不再收到广播消息。

我有Firebug,但我不完全确定如何确保连接仍然打开。如果我看看Firebug,它会说:“CLOSED:2,CONNECTING:0,OPEN:1,readyState:0”,但无论事件是否正在发射(发射,显示),它似乎都会这样说。我需要这个SSE是持久的,我认为这可以通过在Mojolicious中禁用超时来完成,但似乎并非如此。

我的问题如下:A)如何判断连接是否仍然有效?和B)只要用户正在查看页面,我如何保持连接的持久性?

相关的Mojolicious代码在这里:

package Ownership;
use Mojo::Base 'Mojo::EventEmitter';

sub newowner {
    my $self = shift;
    my ( $owner, $location ) = @_;

    my $timestamp = localtime(time);

    $self->emit( newowner => "[$timestamp] - 
        $owner has taken ownership of $location" );
}

package main;

my $ownership = Ownership->new;
get '/events' => sub {
    my $self = shift;

    Mojo::IOLoop->stream( $self->tx->connection )->timeout(0);

    $self->res->headers->content_type('text/event-stream');

    my $cb = $ownership->on(
        newowner => sub {
            my ( $ownership, $message ) = @_;
            $self->write("event:newowner\ndata: $message\n\n");
        }
     );

     $self->on(
        finish => sub {
            my $self = shift;
            $ownership->unsubscribe( newowner => $cb );
        }
     );
};

这是我的index.html.ep中的Javascript:

var events = new EventSource('<%= url_for 'events' %>');
events.addEventListener('newowner', function(event) {
    div.innerHTML = div.innerHTML + event.data + '<br />';
}, false);

0 个答案:

没有答案