mirror of
https://github.com/penpot/penpot.git
synced 2026-10-30 06:20:32 +00:00
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