Path.width() - RangeError: Maximum call stack size exceeded
Closed this issue · 14 comments
I have working code for the browser and need to port it to a server side solution. It seems that there is a bug similar to this issue here but in this case it has to do with the bounding box when trying to get Path.width()
.
/cwd/node_modules/@svgdotjs/svg.js/dist/svg.node.js:1812
throw new Error(`Getting bbox of element "${el.node.nodeName}" is not possible: ${e.toString()}`);
^
Error: Getting bbox of element "path" is not possible: RangeError: Maximum call stack size exceeded
at retry (/cwd/node_modules/@svgdotjs/svg.js/dist/svg.node.js:1812:13)
at getBox (/cwd/node_modules/@svgdotjs/svg.js/dist/svg.node.js:1792:11)
at Path.bbox (/cwd/node_modules/@svgdotjs/svg.js/dist/svg.node.js:1816:15)
at Path.width (/cwd/node_modules/@svgdotjs/svg.js/dist/svg.node.js:4564:33)
at /cwd/src/minimal-example.js:10:48
at List.forEach (<anonymous>)
at Object.<anonymous> (/cwd/src/minimal-example.js:10:19)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
this is a minimal example of the code failing with svgdom
const fs = require('fs');
const { SVG, registerWindow } = require('@svgdotjs/svg.js')
const { createSVGWindow } = require('svgdom')
const window = createSVGWindow()
const document = window.document
registerWindow(window, document)
let svg = fs.readFileSync('./minimal-example-bug.svg', 'utf8')
let draw = SVG(document.documentElement)
draw.svg(svg)
draw.find('path').forEach(el => console.log(el.width()))
you can find the svg file here it is most definitely the complex object in the background.
Any ideas on how to solve this? In a browser environment the code ist working fine.
Do you use the latest version? If not try to update. If that doesn't work, paste the SVG file so i can debug it I cant read
Thanks for the prompt reply @Fuzzyma
Yes, using the lastest version, can you reproduce the error on you system?
You could download the SVG from the URL, right?
I did not test yet. It's a bit busy atm😅
@dreerr your minimal example file consists of thousands of paths and transformed groups. Its more like the most complicated example one can imagine :D. This is almost impossible to debug
I just run the example and it was working correctly. It could depend on the node version but since the error is a stack-size error, you can also try to run the example with a bigger stack (--max-stack afaik)
Yes the example is rather complex 😇 Which version of node were you running the example with?
Well, the whole reason of a minimal example is, that it is minimal :D. My code has to parse the whole svg file after all.
My node is v17.1
With running Node.js v17.1.0
and @svgdotjs/svg.js@3.1.1
I am getting the same Maximum call stack size exceeded
error, no matter what --stack_size=
I enter. Any idea on how I can debug this any further?
find out which path actually triggers this error. There are only a few thousands of them so that should be easy (irony off :D)
its just strange that it doesnt happen for me. what version of svgdom are you running?
Yes very strange indeed, I am using svgdom@0.1.10
that would be the most recent version. I will identify the path and get back to you.
Here minimal-example-path.svg is the SVG with the problematic path, it is a big compound path. I opened the SVG with Illustrator and saved it again just to be sure it has not to do with a faulty syntax.
UPDATE 1: It seems to be architecture specific 😩 when running the example on x64 it does not get an error, but with arm64 it throws the RangeError
UPDATE 2: I installed a x64 Version of Node with the help of this article and the example is working now.
Yeah this new file doesnt help with debugging. I would need to step through every single pass command in order to find the one failing and its not even failing for me :D - impossible to debug
Hope your solution works
Yes indeed, thanks for your support!