PAGI-Server
view release on metacpan or search on metacpan
lib/PAGI/Server/ConnectionState.pm view on Meta::CPAN
# Distinguishes the two terminal states once _connected is false:
# an abnormal disconnect (false) vs. a clean completion (true).
_completed => 0,
# Response progress (HTTP): set when http.response.start is emitted.
_response_started => 0,
# Lazy Future (only created if disconnect_future() called)
_future => undef,
# Callbacks registered via on_disconnect()
_callbacks => [],
# Callbacks registered via on_complete()
_complete_callbacks => [],
}, $class;
# Weaken to avoid circular reference: Connection -> ConnectionState -> Connection
weaken($self->{_connection}) if $self->{_connection};
return $self;
}
=head2 is_connected
my $connected = $conn->is_connected; # Boolean
Returns true if the connection is still open, false if disconnected.
This is a synchronous, non-destructive check that does not consume
messages from the receive queue.
=cut
sub is_connected {
my $self = shift;
return ${$self->{_connected}} ? 1 : 0;
}
=head2 response_started
my $started = $conn->response_started; # 0 or 1
True once the server has started this request's response (C<http.response.start>
emitted -- by the application, a framework, a middleware, or a server-synthesized
error/backstop response). Server-owned; read-only to applications.
=cut
sub response_started { return $_[0]->{_response_started} ? 1 : 0 }
# Server-internal: called from the send path when http.response.start is emitted.
sub _mark_response_started { $_[0]->{_response_started} = 1; return }
=head2 response_complete
my $done = $conn->response_complete; # undef = unsupported, else 0 or 1
Returns true once this request's response body has been fully sent, false
while a response is still streaming or has not started, and C<undef> if the
server does not track completion. This server does not currently track
response-body completion, so this accessor always returns C<undef>. SHOULD-level
per L<PAGI::Spec::Www/"Connection State">; test C<defined> before relying on it.
=cut
sub response_complete { return undef }
=head2 disconnect_reason
my $reason = $conn->disconnect_reason; # String or undef
Returns the disconnect reason string, or C<undef> if still connected B<or if the
request completed normally> -- every reason below describes an abnormal end.
Standard reason strings:
=over 4
=item * C<client_closed> - Client initiated clean close (TCP FIN) mid-request
=item * C<client_timeout> - Client stopped responding (read timeout)
=item * C<idle_timeout> - Connection or stream idle too long, before a request arrived or mid-stream on a quiet WebSocket or SSE session
=item * C<keepalive_timeout> - Keep-alive connection idled out between requests, or a WebSocket keepalive ping received no pong within its timeout
=item * C<write_timeout> - Response write timed out
=item * C<write_error> - Socket write failed (EPIPE, ECONNRESET)
=item * C<read_error> - Socket read failed
=item * C<protocol_error> - HTTP parse error, invalid request
=item * C<server_shutdown> - Server shutting down gracefully
=item * C<server_error> - Unhandled server-side error aborted the request
=item * C<body_too_large> - Request body exceeded limit
=item * C<queue_overflow> - A bounded server queue overflowed; connection dropped
=back
See L<PAGI::Spec::Www/"Standard Disconnect Reasons"> for the authoritative list.
=cut
sub disconnect_reason {
my $self = shift;
return ${$self->{_reason}};
}
=head2 disconnect_future
my $future = $conn->disconnect_future; # always a Future
my $reason = await $future;
Returns a Future that resolves when the connection closes B<abnormally>
( run in 2.407 seconds using v1.01-cache-2.11-cpan-5c0b1e786e0 )