PAGI-Tools

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

    1008.
  - PAGI::WebSocket try_send_text/bytes/json no longer fabricate a 1006
    "Connection lost" close (and no longer mark the socket closed) when a send
    errors. A failed send returns false without mutating connection state; a
    real disconnect is still detected via the websocket.disconnect event.
  - Docs: PAGI::SSE scope caching described accurately (cached while
    referenced via a weak ref, not a guaranteed singleton);
    PAGI::Request::Negotiate content-negotiation example reads the Accept
    header through PAGI::Request instead of the (fatal) $scope->{headers}{...};
    try_send_* documented as best-effort with a send-method ladder; a cookbook
    recipe on declining an SSE request (404 / 401 / 204 stop-reconnect);
    examples and Endpoint POD migrated off the removed 4-arg middleware form.
  - REMOVED PAGI::Middleware::WebSocket::Compression. permessage-deflate
    (RFC 7692) is a WebSocket framing-layer feature -- a compressed message is
    signalled by the RSV1 frame bit, which only the server's framing layer can
    set. A middleware at the PAGI event layer can deflate the payload bytes but
    cannot flag the frame, so the deflated bytes went out in a normal RSV1=0
    frame (garbage on the wire). It also wrote a non-spec `extensions` key on
    websocket.accept (the event allows only `subprotocol`/`headers`), which the
    reference server ignores -- and that server explicitly does not implement
    permessage-deflate (RSV bits forced to 0). If WebSocket compression is
    wanted, it must be a server feature, not an application middleware.
  - PAGI::App::Router: an unmatched SSE or WebSocket route now returns a real
    404 instead of crashing the connection. The 404 is emitted with the event
    family that matches the scope -- sse.http.response.* on SSE and
    websocket.http.response.* on WebSocket, plain http.response.* on HTTP --
    since those scopes reject a plain http.response.* before a stream or
    handshake starts. A custom not_found app still takes over for every scope
    type. Requires a server supporting the sse.http.response.* decline events
    (PAGI-Server 0.002005+).

0.002000 - 2026-06-26
  - Split out of the PAGI distribution into its own distribution (git history
    preserved).
  - New PAGI::Tools module anchors the distribution.
  - The application runner ships in PAGI-Server as PAGI::Server::Runner.
  - B<BREAKING>: PAGI::Response is now a value — factories build detached
    responses, body methods return $self, respond($send) sends, to_app makes any
    response mountable; Endpoint HTTP handlers RETURN a response value
    (await $res->json(...) no longer sends).
  - B<BREAKING>: PAGI::Request->configure/->config removed; path_param strict and
    multipart limits are now per-call options.
  - PAGI::Headers: ordered, case-insensitive, multi-value header container
    (rejects undef values; to_hash); Response and Request route headers through it.
  - is_sent now reads response_started off the pagi.connection object, not a scope
    scalar, so it survives middleware's scope copy. Adds PAGI::Test::ConnectionState.
  - PAGI::Response->has_body_source: predicate for whether a body source was
    registered.
  - PAGI::Response: charset follows the body — text/html/send gain
    "; charset=utf-8", json() stays bare application/json.
  - PAGI::Utils::to_app coerces coderefs, component objects, and class names; every
    composition point accepts anything it accepts.
  - builder's enable() accepts configured middleware instances.
  - PAGI::App::Router: coderef route middleware can transform the channel.
  - PAGI::Endpoint::Router route middleware are value-flow (await $next->() returns
    the handler's response); App::Router dispatch returns the matched route's value.
  - PAGI::Context: $ctx->text/html/json/redirect shorthands,
    assert_http/websocket/sse guards, on_default catch-all, raw_send accessor.
  - Backpressure/lifecycle helpers: on_complete, buffered_amount/high_water_mark/
    low_water_mark, on_high_water/on_drain/is_writable, WebSocket->deny().
  - PAGI::Request->multipart_stream: pull-based streaming multipart parsing with
    app-controlled sinks; mutually exclusive with the buffered body methods.
  - PAGI::App::Redirect and ::NotFound build a PAGI::Response value (modules kept
    for the dynamic case).
  - PAGI::Lifespan coerces its app arg via to_app, and reports shutdown-handler
    failures instead of swallowing them.
  - Spec: URLMap sets root_path; WrapCGI builds SCRIPT_NAME from root_path.
  - Canonical scope-adding middleware route through the modify_scope helper.
  - Documented the PAGI::Response subclassing seam for framework authors.
  - Docs: recipes are now PAGI::Tools::Cookbook; Tutorial/Cookbook examples
    corrected against the current API; chat-showcase example uses PAGI::App::Router
    + PAGI::Lifespan.
  - For changes prior to 0.002000, see the Changes file of the PAGI distribution
    (versions up to 0.001023).



( run in 0.541 second using v1.01-cache-2.11-cpan-6aa56a78535 )