PAGI
view release on metacpan or search on metacpan
examples/11-job-runner/lib/JobRunner/SSE.pm view on Meta::CPAN
if ($event->{type} eq 'sse.disconnect') {
last;
}
}
};
# Cleanup
$connected = 0;
remove_job_subscriber($job_id, $sub_id);
};
}
async sub _send_job_status {
my ($send, $job) = @_;
await $send->({
type => 'sse.send',
event => 'status',
data => $JSON->encode({
id => $job->{id},
type => $job->{type},
status => $job->{status},
progress => $job->{progress},
started_at => $job->{started_at},
}),
});
}
async sub _send_final_event {
my ($send, $job) = @_;
my $event_type;
my $data = { status => $job->{status} };
if ($job->{status} eq 'completed') {
$event_type = 'complete';
$data->{result} = $job->{result};
$data->{duration} = $job->{completed_at} - ($job->{started_at} // $job->{created_at});
}
elsif ($job->{status} eq 'failed') {
$event_type = 'failed';
$data->{error} = $job->{error};
}
elsif ($job->{status} eq 'cancelled') {
$event_type = 'cancelled';
}
await $send->({
type => 'sse.send',
event => $event_type,
data => $JSON->encode($data),
});
}
1;
__END__
# NAME
JobRunner::SSE - Server-Sent Events for job progress streaming
# DESCRIPTION
Provides real-time progress streaming for individual jobs via SSE.
## Endpoint
GET /api/jobs/:id/progress
## Events
- **status** - Initial job status on connection
- **progress** - Progress update { percent, message }
- **complete** - Job completed successfully { status, result, duration }
- **failed** - Job failed { status, error }
- **cancelled** - Job was cancelled { status }
( run in 1.033 second using v1.01-cache-2.11-cpan-140bd7fdf52 )