Andrey Antukh 3a6ee0003f ⚡ The frontend exports assets through the jobs substrate
Every shape, frame and simple export of the UI is one `:export-assets`
job now: the backend creates it with the items frozen, the external
worker renders it, and the client follows its life on the same
websocket channel the binfile export has ridden since it became a job.
The widget shows the real milestones of the worker (`:preparing`,
`:rendering`, `:packaging`, with the `objects` and `pages` counters,
two new translated stage labels), downloads the artifact of the
completed row, and its cancel asks the backend to stop the job. The
saturation of the export queue answers as the exporter's own busy
state, so the user is told to retry.

The three doors of the legacy surface are gone: `repo` no longer
carries `:export`, `:create-export-job` or `:cancel-export-job` —
there is no `/api/export*` call left in the frontend — and their other
two callers (copy-as-image and the plugin export) fetch their blob
from the row's `result` resource now. The single-object wasm render
stays client-side: it never leaves the browser, so it keeps
downloading locally without a job.

A viewer that exports through a public share names the share in the
items, and the creation validates every item the way the share fetches
do (the same 4-arity `check-read-permissions!` `get-file-fragment`
uses); the command stays authenticated, the same as the exporter
cookie it replaces, so an anonymous visitor is refused. Also here: the
management `complete`/`fail` settle closes the named render session
even when they lose the write, the piece the exporter's cancel work
left pending.

Two new translated strings (`exporting-preparing`,
`exporting-packaging`), a share-aware permission test of the assets
creation, and the data flow tests rewritten over the jobs channel.

AI-assisted-by: glm-5.3-flash
2026-10-07 14:09:04 +02:00
..
2026-09-29 09:07:34 +02:00
2026-10-06 15:12:15 +02:00
2026-10-06 15:12:15 +02:00
2024-05-29 19:05:04 +02:00