Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RFC: (WIP) Improve error marshaling from JS to Ruby #37

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

julik
Copy link

@julik julik commented Apr 24, 2016

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).

Preserve the message and the name of the error if the runtime provides them.
Also, if possible use Object.assign(...) to copy any additional properties
from the thrown error into the return metadata. Pack the error stack
into the response value together with the error metadata.

Adds :metadata reader to the Ruby error classes so that additional JS
error metadata can be recovered on the Ruby side if desired.
@rails-bot
Copy link

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants