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 )