Skip to content

jef-sure/pef-front-websocket

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NAME

PEF::Front::WebSocket - WebSocket framework for PEF::Front

SYNOPSIS

# startup.pl
use PEF::Front::Websocket;
# usual startup stuff...

# $PROJECT_DIR/app/WSTest/WebSocket/Echo.pm
package WSTest::WebSocket::Echo;

sub on_message {
    my ($self, $message) = @_;
    $self->send($message); 
}

1;

DESCRIPTION

This module makes WebSockets really easy. Every kind of WebSocket is in its own module. Default routing scheme is /ws$WebSocketClass. WebSocket handlers are located in $PROJECT_DIR/app/$MyAPP/WebSocket.

Prerequisites

This module requires Coro, AnyEvent and PSGI server that must meet the following requirements.

  • psgi.streaming environment is true.

  • psgi.nonblocking environment is true.

  • psgix.io environment holds a valid raw IO socket object. See PSGI::Extensions.

uwsgi version 2.0.14+ meets all of them with psgi-enable-psgix-io = true.

WEBSOCKET INTERFACE METHODS

on_message($message, $type)

A subroutine that is called on new message from client.

on_drain()

A subroutine that is called when there's nothing to send to client after some successful send.

on_open()

A subroutine that is called each time it establishes a new WebSocket connection to a client.

on_error($message)

A subroutine that is called when some error happens while processing a request.

on_close()

A subroutine that is called on WebSocket close event.

no_compression()

When defined and true then no compression will be used even when it supported by browser and server.

INHERITED METHODS

Every WebSocket class is derived from PEF::Front::Websocket::Base which is derived from PEF::Front::Websocket::Interface. Even when you don't derive your class from PEF::Front::Websocket::Base explicitly, this class will be added automatically to hierarchy.

send($buffer[, $type])

Sends $buffer to client. By default $type is 'text'.

close()

Closes WebSocket.

is_defunct()

Returns true when socket is closed or there's some error on it.

CONFIGURATION

cfg_websocket_heartbeat_interval

WebSocket connection has to be ping-ed to stay alive. This paramters specifies a positive number of seconds for ping interval. Default is 30.

cfg_websocket_max_payload_size

Maximum payload size for incoming messages in bytes. Default is 262144.

cfg_websocket_deflate_minimum_size

Minimum message size for deflate compression. If message size is less than this value then it will not be compressed. Default is 96.

cfg_websocket_deflate_window_bits

WindowBits parameter for deflate compression. Default is 12.

cfg_websocket_deflate_memory_level

MemLevel parameter for deflate compression. Default is 5.

EXAMPLE

#startup.pl
use WSTest::AppFrontConfig;
use PEF::Front::Config;
use PEF::Front::WebSocket;
use PEF::Front::Route;

PEF::Front::Route::add_route(
  get '/' => '/appWs',
);
PEF::Front::Route->to_app();


# $PROJECT_DIR/app/WSTest/WebSocket/Echo.pm
package WSTest::WebSocket::Echo;
 
sub on_message {
    my ($self, $message) = @_;
    $self->send($message); 
}

1;

# $PROJECT_DIR/templates/ws.html
<html>
<head>
<script language="Javascript">
  var s = new WebSocket("ws://[% hostname %]:[% request.port %]/wsEcho");
  s.onopen = function() {
      alert("connected !!!");
      s.send("ciao");
  };
  s.onmessage = function(e) {
      var bb = document.getElementById('blackboard')
      var html = bb.innerHTML;
      bb.innerHTML = html + '<br/>' + e.data;
  };
  s.onerror = function(e) {
      alert(e);
  }
  s.onclose = function(e) {
      alert("connection closed");
  }
  function invia() {
      var value = document.getElementById('testo').value;
      s.send(value);
  }
</script>
</head>
<body>
  <h1>WebSocket</h1>
  <input type="text" id="testo" />
  <input type="button" value="invia" onClick="invia();" />
  <div id="blackboard"
      style="width: 640px; height: 480px; background-color: black; color: white; border: solid 2px red; overflow: auto">
  </div>
</body>
</html>

# wstest.ini
[uwsgi]
plugins = coroae
chdir = /$PROJECT_DIR
logger = file:log/demo.log
psgi = bin/startup.pl
master = true
processes = 4
coroae = 1000
perl-no-plack = true
psgi-enable-psgix-io = true
uid = $PROJECT_USER
gid = www-data
chmod-socket = 664

AUTHOR

This module was written and is maintained by Anton Petrusevich.

Copyright and License

Copyright (c) 2016 Anton Petrusevich. Some Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

About

PEF::Front WebSocket and SSE

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages