mirror of
https://github.com/penpot/penpot.git
synced 2026-11-07 18:40:41 +00:00
The `:exporter` queue gets its consumer: K pollers (the new `:exporter-worker-concurrency`), each one with its own Redis connection, so the blocking BLPOP is both the semaphore of the slot and the backpressure: a poller claims one job and does not pop again until the job settles. The dispatcher's `[job-id, scheduled-at]` payloads are read per pop; a corrupt payload is logged and dropped, a Redis hiccup is a failed turn that the loop retries after a small delay, and no test exercises the forever loop directly. The run of the `:export-assets` job ports the legacy export machinery to the substrate: the item transducers and partitioning of export-shapes, the zip assembly and the pdfunite join of export-frames, rendering as the session the backend minted. The progress contract dresses the beats (`:preparing`, `:rendering`, `:packaging` with the `objects` and `pages` counters, throttled per object) and the settle is one `complete-job` multipart that stores the artifact and closes the session; an export failure settles as `fail-job` with the session id, self-contained, so the loop only ever sees a resolved run. AI-assisted-by: glm-5.3-flash