From c070273990821967f3ce5b625eedd6f2721e9d87 Mon Sep 17 00:00:00 2001 From: "C.J. Collier" Date: Sat, 18 Jul 2026 23:06:54 +0000 Subject: [PATCH 1/3] refactor: update Protocol to use Google::ProtocolBuffers::Dynamic shim --- lib/App/EvalServerAdvanced.pm | 12 ++++---- lib/App/EvalServerAdvanced/Protocol.pm | 41 ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 lib/App/EvalServerAdvanced/Protocol.pm 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..cc3f0b4 --- /dev/null +++ b/lib/App/EvalServerAdvanced/Protocol.pm @@ -0,0 +1,41 @@ +package App::EvalServerAdvanced::Protocol; + +use strict; +use warnings; +use Google::ProtocolBuffers::Dynamic; + +use Exporter 'import'; +our @EXPORT = qw(decode_message encode_message); + +our $dynamic = Google::ProtocolBuffers::Dynamic->new; +$dynamic->load_file('/usr/local/google/home/cjac/src/github/c9h/dbi/tmp/App-EvalServerAdvanced/share/proto/evalserver.proto'); +$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; From 8fa6c755946ee4a1f677013431ab53f74f37f715 Mon Sep 17 00:00:00 2001 From: "C.J. Collier" Date: Sat, 18 Jul 2026 23:08:51 +0000 Subject: [PATCH 2/3] feat: add share/proto/evalserver.proto and dynamic path resolution --- lib/App/EvalServerAdvanced/Protocol.pm | 8 +++++- share/proto/evalserver.proto | 40 ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 share/proto/evalserver.proto diff --git a/lib/App/EvalServerAdvanced/Protocol.pm b/lib/App/EvalServerAdvanced/Protocol.pm index cc3f0b4..2300cc5 100644 --- a/lib/App/EvalServerAdvanced/Protocol.pm +++ b/lib/App/EvalServerAdvanced/Protocol.pm @@ -7,8 +7,14 @@ use Google::ProtocolBuffers::Dynamic; use Exporter 'import'; our @EXPORT = qw(decode_message encode_message); +use File::Spec; +use File::Basename qw(dirname); + our $dynamic = Google::ProtocolBuffers::Dynamic->new; -$dynamic->load_file('/usr/local/google/home/cjac/src/github/c9h/dbi/tmp/App-EvalServerAdvanced/share/proto/evalserver.proto'); +my $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 { 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; +} From 80bddfc4be8d52d8a6b235fcde9289a399957463 Mon Sep 17 00:00:00 2001 From: "C.J. Collier" Date: Sat, 18 Jul 2026 23:20:16 +0000 Subject: [PATCH 3/3] refactor: use File::ShareDir::dist_file for evalserver.proto with local dev fallback --- lib/App/EvalServerAdvanced/Protocol.pm | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/App/EvalServerAdvanced/Protocol.pm b/lib/App/EvalServerAdvanced/Protocol.pm index 2300cc5..77da6b2 100644 --- a/lib/App/EvalServerAdvanced/Protocol.pm +++ b/lib/App/EvalServerAdvanced/Protocol.pm @@ -7,13 +7,20 @@ 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 = File::Spec->rel2abs(File::Spec->catfile( - dirname(__FILE__), '..', '..', '..', 'share', 'proto', 'evalserver.proto' -)); +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');