Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number

Re: Constructive thoughts on Dancer2 v Mojolicious

by alexander_lunev (Monk)
on Jun 04, 2020 at 06:22 UTC ( #11117685=note: print w/replies, xml ) Need Help??

in reply to Constructive thoughts on Dancer2 v Mojolicious

I don't know anything about Dancer or Dancer2, really. Because when I first start using Mojolicious, I loved it with my heart and stop searching. I've done 10+ projects with Mojolicious, for Internet and localhost, half of them on Windows, and I just can't think of anything else because everything I need already there, be it Mojo::JSON or Mojo::WebSocket or Mojo::UserAgent or Mojo::IOLoop. I'm using various Vue.js frameworks for frontend (be it vanilla Vue.js or more complex Quasar framework) with Mojolicious and this couple is a full toolset for everything I need.
  • Comment on Re: Constructive thoughts on Dancer2 v Mojolicious

Replies are listed 'Best First'.
Re^2: Constructive thoughts on Dancer2 v Mojolicious
by marto (Cardinal) on Jun 04, 2020 at 08:04 UTC

    I'm curious about your setup. The FAQ touches on the potential for some issues, and a note about advanced features which won't work. If you have the time I'd like to hear about your setup/experiences. Thanks.

      I'm using Strawberry Perl, and in most cases I'm not using anything too complex or too UNIX-ish on Windows, at maximum I'm using fork. As for database, it's often SQLite DB (using Mojo::SQLite), there was once a project with database in DBF files, and now I'm writing a project with Firebird SQL server as a database (using DBD::ODBC and Firebird ODBC connector). Frontend is always some flavour of Vue.js.

      To make things more like it's done on Windows, I'm using two files, START.CMD for starting whole project, which is:

      @echo off set PATH=perl;%PATH% perl -Iperl\lib "script/project" pause

      Here's project structure:

      [lib] [perl] [public] [script] [templates] [uploads] db.sqlite db.sqlite-shm db.sqlite-wal init.sql START.CMD project.conf

      Here you see that I rewrite %PATH% variable. It's my Electron-like application harness, in perl dir there's a stripped Strawberry Perl with modules to run on other Windows machines.

      Then there is starter perl script,

      #!perl use Mojo::Base -strict; use Mojo::Server::Morbo; use Mojo::Util qw(extract_usage getopt); my $morbo = Mojo::Server::Morbo->new; my $pid = fork(); if ($pid) { # PARENT $morbo->daemon->listen(["http://*:3000"]); $morbo->run(shift); } else { # CHILD use Socket; my $host = 'localhost'; my $port = '3000'; my $timeout = 30; my $started = 0; while (not $started) { sleep 1; $started = portAlive(); } system("start http://localhost:3000"); exit; sub portAlive { my $proto = getprotobyname('tcp'); my $iaddr = inet_aton($host); my $paddr = sockaddr_in($port, $iaddr); socket(SOCKET, PF_INET, SOCK_STREAM, $proto) || warn "socket: +$!"; eval { local $SIG{ALRM} = sub { die "timeout" }; alarm($timeout); connect(SOCKET, $paddr) || error(); alarm(0); }; if ($@) { close SOCKET || warn "close: $!"; print "$host is NOT listening on tcp port $port.\n"; return 0; } else { close SOCKET || warn "close: $!"; print "$host is listening on tcp port $port.\n"; return 1; } } }

      When Morbo server started, script will start browser with URL of project, and voila. Also, there could be no black CMD.EXE windows at all with wperl.exe + WebSocket + Mojolicious trick:

      $r->websocket('/bus' => sub { my $self = shift; $self->inactivity_timeout(1000); #$log->debug(sprintf 'Client connected: %s', $self->tx); my $id = sprintf "%s", $self->tx; $clients->{$id} = $self->tx; $self->on(message => sub { my ($self, $msg) = @_; for (keys %$clients) { $clients->{$_}->send({json => {message => $msg}}); } }); $self->on(finish => sub { #$log->debug('Client disconnected'); delete $clients->{$id}; Mojo::IOLoop->timer(10 => sub { my $loop = shift; if (not scalar keys %{ $clients }) { #$log->debug('No clients! exiting!'); exit; } else { #$log->debug('Have clients! not exiting!'); } }); }); } );

      When last client disconnects from WebSocket (browser window/tab with project closes) - server exits.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11117685]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (3)
As of 2020-11-27 03:53 GMT
Find Nodes?
    Voting Booth?

    No recent polls found