- while(my @ready = $select->can_read) {
- foreach my $fh (@ready) {
- if ($fh == $web_socket) {
- my $nr = $wb_socket_read_available_bytes->();
- my ($payload, $req_close) = $parse_web_socket_frame->(\$wsbuf);
- print "GOT: $payload\n" if defined($payload);
- last if $req_close;
- last if !$nr; # eos
- } else {
- die "internal error - unknown handle";
+ # Write
+ foreach my $fh ($select->can_write(0.5)) {
+ if ($fh == $web_socket and my $msg = shift @messages) {
+ $fh->syswrite($msg, length($msg));
+ }
+ }
+
+ # Read
+ foreach my $fh ($select->can_read(0.5)) {
+
+ # From Web Socket
+ if ($fh == $web_socket) {
+ # Read from WebSocket
+ my $nr = $wb_socket_read_available_bytes->();
+ my ($payload, $req_close) = $parse_web_socket_frame->(\$wsbuf);
+
+ if ($payload ne "OK") {
+ syswrite(\*STDOUT, $payload, length($payload));
+ }
+ }
+
+ # From STDIN
+ elsif ($fh == fileno(STDIN)) {
+
+ # Read from STDIN
+ my $nr = read(\*STDIN, my $buff, 4096);
+ if (!$nr) {
+ next;
+ }
+
+ my $char = ord($buff);
+
+ if ($ctrl_a_pressed_before == 1 && $char == hex("0x71")) {
+ $client_exit->($select, $web_socket, $old_termios);
+ return;
+ }
+
+ if ($char == hex("0x01")) {
+ if ($ctrl_a_pressed_before == 0) {
+ $ctrl_a_pressed_before = 1;
+ }
+ }
+ else {
+ $ctrl_a_pressed_before = 0;
+ }
+
+ push(@messages, $create_websockt_frame->("0:" . $nr . ":" . $buff));
+ }