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

earlyjs: Implement decoratedExtraDataKey #46932

Closed
wants to merge 5 commits into from

Commits on Oct 10, 2024

  1. easy: Align earlyjs c++ native data structures with js

    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
    RSNara authored and facebook-github-bot committed Oct 10, 2024
    Configuration menu
    Copy the full SHA
    d529081 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    8fcacaa View commit details
    Browse the repository at this point in the history
  3. Extend earlyjs c++ pipeline for soft errors

    Summary:
    Before, the c++ pipeline only supported fatal errors.
    
    Now, it supports soft errors!
    
    Changelog: [Internal]
    
    Differential Revision: D63927090
    RSNara authored and facebook-github-bot committed Oct 10, 2024
    Configuration menu
    Copy the full SHA
    65396c2 View commit details
    Browse the repository at this point in the history
  4. Integrate logbox into earlyjs c++ pipeline (facebook#46935)

    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
    RSNara authored and facebook-github-bot committed Oct 10, 2024
    Configuration menu
    Copy the full SHA
    f2a97bb View commit details
    Browse the repository at this point in the history
  5. earlyjs: Implement decoratedExtraDataKey (facebook#46932)

    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
    RSNara authored and facebook-github-bot committed Oct 10, 2024
    Configuration menu
    Copy the full SHA
    a08cc47 View commit details
    Browse the repository at this point in the history