Hi!

I need some help in debugging my script. Sometimes it hangs and i don't know why.

There's a channel with all the values, and then i create N promises to take a value from the channel and to write it to a socket. (one producer with multiple consumers)


I'm attaching two scripts (client.raku and server.raku). The problem is in the client.raku (42 lines). The server.raku script is just a slightly modified version of  IO::Socket::Async::SSL documentation example.


To reproduce the problem first start the server (raku ./server.raku), and then run the client script (raku client.raku)


raku --version:

Welcome to Rakudo(tm) v2020.12-5-g3beb71cc9.
Implementing the Raku(tm) programming language v6.d.
Built on MoarVM version 2020.12-7-g6bf54d784.



Thank you,

David Santiago




#!/usr/bin/env perl6
use IO::Socket::Async::SSL;

sub MAIN() {
    my $counter = 0;
    react {
        my %ssl-config =
                certificate-file => 'server-crt.pem',
                private-key-file => 'server-key.pem';
        whenever IO::Socket::Async::SSL.listen('localhost', 4433, |%ssl-config) 
-> $conn {
            say "Got conn!";
            await $conn.print(get_fortune());
            #await $conn.print(get_fortune());
            whenever $conn -> $line {
                say $line;
                if $line.contains("SENDING") {
                    await $conn.print("340 OK {$counter++}\r\n");
                } else {
                    await $conn.print("200 OK\r\n");
                    #$conn.close;
                }
            }
        }
    }
}

sub get_fortune(-->Str) {
    return run('fortune', :out).out.slurp(:close)~"200 OK\r\n";
}
multi MAIN() {
    my $channel = Channel.new();
    $channel.send($_) for ^29;
    $channel.close();
    my @promises = do for ^4 -> $consumer {
        start {

            my $p = IO::Socket::Async::SSL.connect('localhost', 4433, insecure 
=> True);
            my $conn;
            # Read the MOTD
            await $p.then: -> $prom {
                $conn = $prom.result;
                react whenever $conn.Supply.lines -> $line {
                    say "[$consumer] Intro: $line";
                    done if $line ~~ /^200/;
                }
            }

            # Start consuming
            $channel.Supply.tap(-> $val {
                await $conn.print("SENDING\r\n").then: -> $promise {
                    react whenever $conn.Supply -> $line {
                        print "[$consumer] $line";
                        if $line ~~ /^340/ {
                            await $conn.print("[$consumer]: value $val\r\n");
                        } else {
                            done;
                        }

                    }
                }
            }, done=>{say "[$consumer] DONE!";});
            say "[$consumer] TAP DONE!";
        }
    }

    await Promise.allof(@promises);

    say $_.status for @promises;
}

Reply via email to