renderCanvas panics (Option::unwrap on None, canvas.rs:32) when canvas is an HTMLCanvasElement, though the type allows it

#888 · open · 0 comments

View on GitHub ↗

petfold

**Versions.** `@myriaddreamin/typst-ts-renderer` 0.7.0 and 0.8.0-rc3 (same result), Chromium, Linux. **Steps.** ```js const renderer = createTypstRenderer(); await renderer.init({ getModule: () => rendererWasmUrl }); await renderer.runWithSession(async (session) => { renderer.manipulateData({ renderSession: session, action: 'reset', data: vectorArtifact }); session.pixelPerPt = 2; session.backgroundColor = '#ffffff'; const c = document.createElement('canvas'); c.width = 1191; c.height = 1684; document.body.append(c); await renderer.renderCanvas({ renderSession: session, canvas: c, pageOffset: 0, pixelPerPt: 2 }); }); ``` **Observed (0.8.0-rc3).** ``` panicked at packages/renderer/src/render/canvas.rs:32:22: called `Option::unwrap()` on a `None` value RuntimeError: unreachable (from render_page_to_canvas via TypstRenderer.renderCanvas) ``` 0.7.0 traps the same way without the panic message. Passing `canvas: c.getContext('2d')` renders fine. **Expected.** `RenderCanvasOptions.canvas` is typed `HTMLCanvasElement | CanvasRenderingContext2D` (`options.render.d.mts`), and `TypstRenderer.renderCanvas` hands `options.canvas` straight to `render_page_to_canvas`. Either call `getContext('2d')` on an element in JS (as `renderDisplayLayer` already does before calling `renderCanvas`), or narrow the type to the context and throw a JS `Error` instead of trapping the module.

Comments