Changes for version 0.003001 - 2026-10-22
- Packaging
- Requires Perl 5.24 (was 5.18). Future 0.54 requires Perl 5.20, and Future is the one hard dependency of a PAGI application, so the floor had to move; it moves to 5.24 because that is where Future::AsyncAwait passes a cancel on to what an async sub awaits, and where Future::XS is available. "Perl version support" in PAGI.pm describes the support horizon: Future supports Perls at least ten years old, and an older Perl is in grace time.
- Specification
- Www: an application MAY cancel a pending $receive Future (as Future->wait_any cancels the loser of a race), and that MUST NOT affect the scope: the cancelled receive consumes no event, a later receive returns the next event, and another pending receive is unaffected. No new specification version.
- Documentation
- The specification and its guides no longer teach PAGI-Tools' API; they keep only pointers to it (install lines, the ecosystem description, the PSGI adapter, a see-also link).
- PAGI::EventLoops no longer tells applications never to let a race cancel the live $receive; examples 14, 17 and 18 drop the same claim from their comments.
- The Tutorial names Future as a PAGI application's only hard dependency, with Future::AsyncAwait as the recommended way to write one.
Documentation
building frameworks and toolkits on PAGI
worked, runnable recipes for the PAGI protocol
how PAGI stays loop-agnostic, how not to block, and how a server binds to an event loop
coming to PAGI from PSGI
The base PAGI specification: application interface and core concepts
The PAGI server extension mechanism
The PAGI Lifespan protocol for startup and shutdown events
PAGI server and application-runner integration guidance
The PAGI TLS extension for reporting connection security in scope
PAGI message formats for HTTP, WebSocket, and SSE
Learn the PAGI protocol for async Perl web applications
What changed between sub-spec versions, and what to do about it
Modules
Perl Asynchronous Gateway Interface
Examples
- examples/01-hello-http/README.md
- examples/01-hello-http/app.pl
- examples/02-streaming-response/README.md
- examples/02-streaming-response/app.pl
- examples/03-request-body/README.md
- examples/03-request-body/app.pl
- examples/04-websocket-echo/README.md
- examples/04-websocket-echo/app.pl
- examples/05-sse-broadcaster/README.md
- examples/05-sse-broadcaster/app.pl
- examples/06-lifespan-state/README.md
- examples/06-lifespan-state/app.pl
- examples/07-extension-fullflush/README.md
- examples/07-extension-fullflush/app.pl
- examples/08-tls-introspection/README.md
- examples/08-tls-introspection/app.pl
- examples/11-job-runner/README.md
- examples/11-job-runner/app.pl
- examples/11-job-runner/lib/JobRunner/HTTP.pm
- examples/11-job-runner/lib/JobRunner/Jobs.pm
- examples/11-job-runner/lib/JobRunner/Queue.pm
- examples/11-job-runner/lib/JobRunner/SSE.pm
- examples/11-job-runner/lib/JobRunner/WebSocket.pm
- examples/11-job-runner/lib/JobRunner/Worker.pm
- examples/11-job-runner/public/css/style.css
- examples/11-job-runner/public/index.html
- examples/11-job-runner/public/js/app.js
- examples/12-utf8/README.md
- examples/12-utf8/app.pl
- examples/13-flow-control/README.md
- examples/13-flow-control/app.pl
- examples/14-periodic-events/README.md
- examples/14-periodic-events/app.pl
- examples/14-periodic-events/cpanfile
- examples/15-embedded-ioasync/README.md
- examples/15-embedded-ioasync/cpanfile
- examples/15-embedded-ioasync/server.pl
- examples/16-foreign-loop/README.md
- examples/16-foreign-loop/cpanfile
- examples/16-foreign-loop/server.pl
- examples/17-event-middleware/README.md
- examples/17-event-middleware/app.pl
- examples/17-event-middleware/cpanfile
- examples/18-bidirectional-websocket/README.md
- examples/18-bidirectional-websocket/app.pl
- examples/18-bidirectional-websocket/cpanfile
- examples/19-shutdown-cleanup/README.md
- examples/19-shutdown-cleanup/app.pl
- examples/README.md
- examples/mini-framework/README.md
- examples/mini-framework/app.pl