-
Notifications
You must be signed in to change notification settings - Fork 24.3k
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
earlyjs: Implement decoratedExtraDataKey #46932
Conversation
This pull request was exported from Phabricator. Differential Revision: D63927091 |
This pull request was exported from Phabricator. Differential Revision: D63927091 |
f799f1b
to
0719464
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
Summary: Pull Request resolved: facebook#46932 In the old error handling pipeline, when the app [assigns an object to error[ExceptionsManager.decoratedExtraDataKey]](https://fburl.com/code/9t9u8rgv) ``` const error = new Error('Some error happened'); // Annotates the error with some custom extra data. error[ExceptionsManager.decoratedExtraDataKey] = {foo: 'bar'}; ExceptionsManager.handleException(error, true); ``` That object [gets forwarded as extraData](https://fburl.com/code/gy7v173u) to ExceptionsManager. This diff implements that functionality within the c++ earlyjs pipeline. Changelog: [Internal] Reviewed By: javache Differential Revision: D63927091
54377f5
to
87fa947
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
1 similar comment
This pull request was exported from Phabricator. Differential Revision: D63927091 |
87fa947
to
ecdb29a
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
Summary: Pull Request resolved: facebook#46932 In the old error handling pipeline, when the app [assigns an object to error[ExceptionsManager.decoratedExtraDataKey]](https://fburl.com/code/9t9u8rgv) ``` const error = new Error('Some error happened'); // Annotates the error with some custom extra data. error[ExceptionsManager.decoratedExtraDataKey] = {foo: 'bar'}; ExceptionsManager.handleException(error, true); ``` That object [gets forwarded as extraData](https://fburl.com/code/gy7v173u) to ExceptionsManager. This diff implements that functionality within the c++ earlyjs pipeline. Changelog: [Internal] Reviewed By: javache Differential Revision: D63927091
ecdb29a
to
2004a4d
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
Summary: Pull Request resolved: facebook#46932 In the old error handling pipeline, when the app [assigns an object to error[ExceptionsManager.decoratedExtraDataKey]](https://fburl.com/code/9t9u8rgv) ``` const error = new Error('Some error happened'); // Annotates the error with some custom extra data. error[ExceptionsManager.decoratedExtraDataKey] = {foo: 'bar'}; ExceptionsManager.handleException(error, true); ``` That object [gets forwarded as extraData](https://fburl.com/code/gy7v173u) to ExceptionsManager. This diff implements that functionality within the c++ earlyjs pipeline. Changelog: [Internal] Reviewed By: javache Differential Revision: D63927091
2004a4d
to
e0158b9
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
Summary: Pull Request resolved: facebook#46932 In the old error handling pipeline, when the app [assigns an object to error[ExceptionsManager.decoratedExtraDataKey]](https://fburl.com/code/9t9u8rgv) ``` const error = new Error('Some error happened'); // Annotates the error with some custom extra data. error[ExceptionsManager.decoratedExtraDataKey] = {foo: 'bar'}; ExceptionsManager.handleException(error, true); ``` That object [gets forwarded as extraData](https://fburl.com/code/gy7v173u) to ExceptionsManager. This diff implements that functionality within the c++ earlyjs pipeline. Changelog: [Internal] Reviewed By: javache Differential Revision: D63927091
e0158b9
to
4b5f5cd
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
4b5f5cd
to
1b8cef2
Compare
Summary: Pull Request resolved: facebook#46932 In the old error handling pipeline, when the app [assigns an object to error[ExceptionsManager.decoratedExtraDataKey]](https://fburl.com/code/9t9u8rgv) ``` const error = new Error('Some error happened'); // Annotates the error with some custom extra data. error[ExceptionsManager.decoratedExtraDataKey] = {foo: 'bar'}; ExceptionsManager.handleException(error, true); ``` That object [gets forwarded as extraData](https://fburl.com/code/gy7v173u) to ExceptionsManager. This diff implements that functionality within the c++ earlyjs pipeline. Changelog: [Internal] Reviewed By: javache Differential Revision: D63927091
This pull request was exported from Phabricator. Differential Revision: D63927091 |
1b8cef2
to
cb2aebc
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
cb2aebc
to
ea1c1ae
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
Summary: Pull Request resolved: facebook#46932 In the old error handling pipeline, when the app [assigns an object to error[ExceptionsManager.decoratedExtraDataKey]](https://fburl.com/code/9t9u8rgv) ``` const error = new Error('Some error happened'); // Annotates the error with some custom extra data. error[ExceptionsManager.decoratedExtraDataKey] = {foo: 'bar'}; ExceptionsManager.handleException(error, true); ``` That object [gets forwarded as extraData](https://fburl.com/code/gy7v173u) to ExceptionsManager. This diff implements that functionality within the c++ earlyjs pipeline. Changelog: [Internal] Reviewed By: javache Differential Revision: D63927091
ea1c1ae
to
af41f50
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
Summary: Pull Request resolved: facebook#46932 In the old error handling pipeline, when the app [assigns an object to error[ExceptionsManager.decoratedExtraDataKey]](https://fburl.com/code/9t9u8rgv) ``` const error = new Error('Some error happened'); // Annotates the error with some custom extra data. error[ExceptionsManager.decoratedExtraDataKey] = {foo: 'bar'}; ExceptionsManager.handleException(error, true); ``` That object [gets forwarded as extraData](https://fburl.com/code/gy7v173u) to ExceptionsManager. This diff implements that functionality within the c++ earlyjs pipeline. Changelog: [Internal] Reviewed By: javache Differential Revision: D63927091
af41f50
to
d2e256c
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
Summary: Pull Request resolved: facebook#46932 In the old error handling pipeline, when the app [assigns an object to error[ExceptionsManager.decoratedExtraDataKey]](https://fburl.com/code/9t9u8rgv) ``` const error = new Error('Some error happened'); // Annotates the error with some custom extra data. error[ExceptionsManager.decoratedExtraDataKey] = {foo: 'bar'}; ExceptionsManager.handleException(error, true); ``` That object [gets forwarded as extraData](https://fburl.com/code/gy7v173u) to ExceptionsManager. This diff implements that functionality within the c++ earlyjs pipeline. Changelog: [Internal] Reviewed By: javache Differential Revision: D63927091
d2e256c
to
f57cf25
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
Summary: Pull Request resolved: facebook#46932 In the old error handling pipeline, when the app [assigns an object to error[ExceptionsManager.decoratedExtraDataKey]](https://fburl.com/code/9t9u8rgv) ``` const error = new Error('Some error happened'); // Annotates the error with some custom extra data. error[ExceptionsManager.decoratedExtraDataKey] = {foo: 'bar'}; ExceptionsManager.handleException(error, true); ``` That object [gets forwarded as extraData](https://fburl.com/code/gy7v173u) to ExceptionsManager. This diff implements that functionality within the c++ earlyjs pipeline. Changelog: [Internal] Reviewed By: javache Differential Revision: D63927091
f57cf25
to
ce4156a
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
ce4156a
to
c24e061
Compare
This pull request was exported from Phabricator. Differential Revision: D63927091 |
Summary: Pull Request resolved: facebook#46932 In the old error handling pipeline, when the app [assigns an object to error[ExceptionsManager.decoratedExtraDataKey]](https://fburl.com/code/9t9u8rgv) ``` const error = new Error('Some error happened'); // Annotates the error with some custom extra data. error[ExceptionsManager.decoratedExtraDataKey] = {foo: 'bar'}; ExceptionsManager.handleException(error, true); ``` That object [gets forwarded as extraData](https://fburl.com/code/gy7v173u) to ExceptionsManager. This diff implements that functionality within the c++ earlyjs pipeline. Changelog: [Internal] Reviewed By: javache Differential Revision: D63927091
c24e061
to
13723b8
Compare
Summary: For the js error handling pipeline, the javascript data structure looks like [this](https://www.internalfb.com/code/fbsource/[6181b57f4ba3619f58056bcec65382650d6ff59a]/xplat/js/react-native-github/packages/react-native/src/private/specs/modules/NativeExceptionsManager.js?lines=17-35): ``` export type StackFrame = {| column: ?number, file: ?string, lineNumber: ?number, methodName: string, collapse?: boolean, |}; export type ExceptionData = { message: string, originalMessage: ?string, name: ?string, componentStack: ?string, stack: Array<StackFrame>, id: number, isFatal: boolean, // flowlint-next-line unclear-type:off extraData?: Object, ... }; ``` So, I made the c++ data structure look similar ``` struct ParsedError { struct StackFrame { std::optional<std::string> file; std::string methodName; std::optional<int> lineNumber; std::optional<int> column; }; std::string message; std::optional<std::string> originalMessage; std::optional<std::string> name; std::optional<std::string> componentStack; std::vector<StackFrame> stack; int id; bool isFatal; jsi::Object extraData; }; ``` Notes: * [parseErrorStack](https://fburl.com/code/e27q9gkc) doesn't actually generate a collapse property on the error object. So, I omitted it from the c++. * ExceptionsManager [always provides an extraData field](https://fburl.com/code/2bvcsxac). So, I made it required. * In C++, I just stored extraData as a jsi::Object. I wanted the freedom to store arbitrary key/value pairs. But, I also didn't want to use folly::dynamic. Changelog: [Internal] Differential Revision: D63929580
Summary: This diff re-implements [js error stack trace parsing](https://github.com/facebook/react-native/blob/86cac6836502aaeb5c894bff6427e837c52c09e0/packages/react-native/Libraries/Core/Devtools/parseErrorStack.js#L41-L57) in c++. Details: - I migrated [stacktrace-parser](https://github.com/errwischt/stacktrace-parser/blob/ad379de5e5ac056012bbeb12923cf502aefe4710/src/stack-trace-parser.js#L7) - I migrated [parseHermesStack.js](https://github.com/facebook/react-native/blob/86cac6836502aaeb5c894bff6427e837c52c09e0/packages/react-native/Libraries/Core/Devtools/parseHermesStack.js#L82) I also migrated all their tests to c++: - [stacktrace-parser tests](https://github.com/errwischt/stacktrace-parser/blob/ad379de5e5ac056012bbeb12923cf502aefe4710/test/stack-trace-parser.spec.js#L5) - [parseHermesStack tests](https://github.com/facebook/react-native/blob/86cac6836502aaeb5c894bff6427e837c52c09e0/packages/react-native/Libraries/Core/Devtools/__tests__/parseHermesStack-test.js#L16) Changelog: [Internal] Differential Revision: D63659013 Reviewed By: javache, NickGerleman
Summary: Before, the c++ pipeline only supported fatal errors. Now, it supports soft errors! Changelog: [Internal] Differential Revision: D63927090
Summary: Pull Request resolved: facebook#46935 Now, whenever the earlyjs c++ pipeline handles an error, it'll invoke callbacks registered via javascript. ## The API ``` if (global.RN$registerExceptionListener != null) { global.RN$registerExceptionListener( (error: ExtendedExceptionData & {preventDefault: () => mixed}) => { error.preventDefault(); // show logbox }, ); } ``` ## The Future API We want something more aligned with the HTML spec: ``` addEventListener('error', (event) => { event.preventDefault(); // show logbox }); ``` ## Fatals vs soft errors The earlyjs pipeline covers just main bundle execution for now. So, it displays logbox only if there was a soft error. If there was a fatal error, it'll just continue to display redbox as usual. Changelog: [Internal] Differential Revision: D63769385 Reviewed By: javache
This pull request was exported from Phabricator. Differential Revision: D63927091 |
13723b8
to
bfbc243
Compare
Summary: Pull Request resolved: facebook#46932 In the old error handling pipeline, when the app [assigns an object to error[ExceptionsManager.decoratedExtraDataKey]](https://fburl.com/code/9t9u8rgv) ``` const error = new Error('Some error happened'); // Annotates the error with some custom extra data. error[ExceptionsManager.decoratedExtraDataKey] = {foo: 'bar'}; ExceptionsManager.handleException(error, true); ``` That object [gets forwarded as extraData](https://fburl.com/code/gy7v173u) to ExceptionsManager. This diff implements that functionality within the c++ earlyjs pipeline. Changelog: [Internal] Reviewed By: javache Differential Revision: D63927091
This pull request was exported from Phabricator. Differential Revision: D63927091 |
bfbc243
to
a08cc47
Compare
This pull request has been merged in 9119c32. |
Summary:
In the old error handling pipeline, when the app assigns an object to error[ExceptionsManager.decoratedExtraDataKey]
That object gets forwarded as extraData to ExceptionsManager.
This diff implements that functionality within the c++ earlyjs pipeline.
Changelog: [Internal]
Reviewed By: javache
Differential Revision: D63927091