diff --git a/lib/App/EvalServerAdvanced.pm b/lib/App/EvalServerAdvanced.pm index c2e61cc..b1fb2fe 100644 --- a/lib/App/EvalServerAdvanced.pm +++ b/lib/App/EvalServerAdvanced.pm @@ -80,15 +80,15 @@ method init() { if ($res) { $$buffref = $newbuf; - if ($message->isa("App::EvalServerAdvanced::Protocol::Eval")) { + if ($message->isa('App::EvalServerAdvanced::Protocol::Evalserver::Eval')) { my $sequence = $message->sequence; - my $out_encoding = eval {$message->encoding} // "utf8"; + my $out_encoding = eval {$message->encoding} // 'utf8'; try { - my $prio = ($message->prio->has_pr_deadline ? "deadline" : - ($message->prio->has_pr_batch ? "batch" : "realtime")); + my $prio = (defined $message->prio->pr_deadline ? 'deadline' : + ($message->prio->pr_batch ? 'batch' : 'realtime')); my $evalobj = { - files => $message->{files}, + files => $message->files, priority => $prio, language => $message->language, }; @@ -96,7 +96,7 @@ method init() { debug Dumper($evalobj); if ($prio eq 'deadline') { - $evalobj->{priority_deadline} = $message->prio->pr_deadline->milliseconds; + $evalobj->{priority_deadline} = $message->prio->pr_deadline; }; my $job = $es_self->jobman->add_job($evalobj); diff --git a/lib/App/EvalServerAdvanced/Protocol.pm b/lib/App/EvalServerAdvanced/Protocol.pm new file mode 100644 index 0000000..77da6b2 --- /dev/null +++ b/lib/App/EvalServerAdvanced/Protocol.pm @@ -0,0 +1,54 @@ +package App::EvalServerAdvanced::Protocol; + +use strict; +use warnings; +use Google::ProtocolBuffers::Dynamic; + +use Exporter 'import'; +our @EXPORT = qw(decode_message encode_message); + +use File::ShareDir (); +use File::Spec; +use File::Basename qw(dirname); + +our $dynamic = Google::ProtocolBuffers::Dynamic->new; +my $proto_file; +eval { + $proto_file = File::ShareDir::dist_file('App-EvalServerAdvanced', 'proto/evalserver.proto'); +}; +if (!$proto_file || !-f $proto_file) { + $proto_file = File::Spec->rel2abs(File::Spec->catfile( + dirname(__FILE__), '..', '..', '..', 'share', 'proto', 'evalserver.proto' + )); +} +$dynamic->load_file($proto_file); +$dynamic->map_package('App.EvalServerAdvanced.Protocol', 'App::EvalServerAdvanced::Protocol'); + +sub decode_message { + my ($data_ref) = @_; + return (0, undef, $$data_ref) unless length($$data_ref) >= 4; + + my $len = unpack('N', substr($$data_ref, 0, 4)); + return (0, undef, $$data_ref) if length($$data_ref) < 4 + $len; + + my $payload = substr($$data_ref, 4, $len); + my $newbuf = substr($$data_ref, 4 + $len); + + my $packet = $dynamic->decode('App.EvalServerAdvanced.Protocol.Packet', $payload); + my $inner_msg = $packet->eval // $packet->response // $packet->warning; + + return (1, $inner_msg, $newbuf); +} + +sub encode_message { + my ($type, $args) = @_; + + my $packet_data = { + $type => $args + }; + + my $bytes = $dynamic->encode('App.EvalServerAdvanced.Protocol.Packet', $packet_data); + return pack('N', length($bytes)) . $bytes; +} + +1; diff --git a/share/proto/evalserver.proto b/share/proto/evalserver.proto new file mode 100644 index 0000000..e576861 --- /dev/null +++ b/share/proto/evalserver.proto @@ -0,0 +1,40 @@ +syntax = "proto2"; + +package App.EvalServerAdvanced.Protocol; + +message Priority { + optional uint64 pr_deadline = 1; + optional bool pr_batch = 2; + optional bool pr_realtime = 3; +} + +message File { + optional string name = 1; + optional bytes content = 2; +} + +message Eval { + optional uint64 sequence = 1; + optional string language = 2; + optional string encoding = 3; + optional Priority prio = 4; + repeated File files = 5; +} + +message Response { + optional uint64 sequence = 1; + optional string contents = 2; + optional string encoding = 3; +} + +message Warning { + optional uint64 sequence = 1; + optional string message = 2; + optional string encoding = 3; +} + +message Packet { + optional Eval eval = 1; + optional Response response = 2; + optional Warning warning = 3; +}