execjs
execjs copied to clipboard
RFC: (WIP) Improve error marshaling from JS to Ruby
WIP - this is a request for feedback mostly and not finished.
I encountered a need to interface with a library that adds meaningful properties to a JS Error object when throwing. Thus came an idea of passing more meaningful error metadata to the runtime from the JS engine. The main change is that the error object caught during parsing/execution is converted to a plain JS object, and as much metadata as can be collected gets tacked onto it. The data is then available on the Ruby side in Error#metadata
as a Hash. It is done using a conversion because I found that doing JSON.stringify(err)
has really varying behaviors depending on the JS engine used.
The implementation I've made so far works with all the runtimes I could spin up at the moment on OSX 10.11 except for Duktape - it does not use a wrapper shim but executes via runtime handles. So if this has to work with Duktape I will need to look into adding error metadata to duktape.rb with Magnus. But if this goes out of scope for ExecJS (which I think it is not) then it's not really worth the effort I guess.
If this is accepted nothing should ideally change for consumer code, so this is a minor feature.
The library I need this for is https://code.google.com/archive/p/glsl-unit/ (somewhat abandonware but still working quite well). And they use a customized SyntaxError, and pass along the line and column from the parse error which is tremendously useful (and gets discarded if passed via string concatenation).
Thanks for the pull request, and welcome! The Rails team is excited to review your changes, and you should hear from @arthurnn (or someone else) soon.
If any changes to this PR are deemed necessary, please add them as extra commits. This ensures that the reviewer can see what has changed since they last reviewed the code. Due to the way GitHub handles out-of-date commits, this should also make it reasonably obvious what issues have or haven't been addressed. Large or tricky changes may require several passes of review and changes.
Please see the contribution instructions for more information.