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

With React-Native, SSE aka EventSource does not receive Events on Android #28835

Open
kovkev opened this issue May 6, 2020 · 20 comments
Open
Labels
Needs: Repro This issue could be improved with a clear list of steps to reproduce the issue. Needs: Triage 🔍 Platform: Android Android applications.

Comments

@kovkev
Copy link

kovkev commented May 6, 2020

Please provide all the information requested. Issues that do not follow this format are likely to stall.

Description

I am trying to use rn-eventsource and react-native-event-source and they always get 200 status when sending a request to the server. However! I am able to receive Events on:

  • iOS emulator
  • my iOS device

but not from:

  • Android emulator
  • my Android device

I can get webpages with the browser provided EventSource to work on Chrome on ios and on Android.

It seems like this is an issue with React-Native on Android.

React Native version:

react-native info
info Fetching system and libraries information...
System:
    OS: macOS 10.15.4
    CPU: (8) x64 Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz
    Memory: 62.51 MB / 16.00 GB
    Shell: 3.2.57 - /bin/bash
  Binaries:
    Node: 13.3.0 - ~/.nvm/versions/node/v13.3.0/bin/node
    Yarn: 1.22.4 - /usr/local/bin/yarn
    npm: 6.13.1 - ~/.nvm/versions/node/v13.3.0/bin/npm
    Watchman: 4.9.0 - /usr/local/bin/watchman
  Managers:
    CocoaPods: 1.9.1 - /usr/local/bin/pod
  SDKs:
    iOS SDK:
      Platforms: iOS 13.4, DriverKit 19.0, macOS 10.15, tvOS 13.4, watchOS 6.2
    Android SDK: Not Found
  IDEs:
    Android Studio: 3.6 AI-192.7142.36.36.6241897
    Xcode: 11.4.1/11E503a - /usr/bin/xcodebuild
  Languages:
    Java: 11.0.2 - /usr/bin/javac
    Python: 2.7.16 - /usr/bin/python
  npmPackages:
    @react-native-community/cli: Not Found
    react: 16.11.0 => 16.11.0
    react-native: ^0.62.2 => 0.62.2
  npmGlobalPackages:
    *react-native*: Not Found

Steps To Reproduce

Provide a detailed list of steps that reproduce the issue.

  1. Install rn-eventsource or react-native-event-source
  2. Setup a simple EventSource("https://..../sse_listen")
  3. setup .onmessage, .onopen and .onerror which do console.log
  4. Look at the logs emitted by .onmessage .onopen and .onerror
  5. Notice that logs appear for iOS but not for Android

Expected Results

Events appear on Android

More details:
I'm pasting the comments I added to this thread : react-native-community/discussions-and-proposals#99
::

I'm having trouble getting this to work at all on my Android device and on my Android emulator. The server does receive the GET request, but the client never receives any messages. I'm not sure how to troubleshoot or debug this at all.

It works on ios and ios emulator, it works in Chrome App on ios and Android. I tried using mitmweb but that didn't show the returned Events.

In the Android Studio Network Traffic Monitoring tool, the returned events do not show up.

tail -f /var/log/nginx/error.log doesn't seem to show any issues.

Here are the differences in the headers sent in the request:

Android
{
"x-forwarded-for":"ip",
"host":"mysite.com",
"connection":"close",
"cache-control":"no-store",
"accept":"text/event-stream",
"user-agent":"okhttp/3.14.1"
"accept-encoding":"gzip",
}

iphone:
{
"x-forwarded-for":"ip",
"host":"mysite.com",
"connection":"close",
"cache-control":"no-store"
"accept":"text/event-stream",
"user-agent":"AppName/1 CFNetwork/1121.2.2 Darwin/19.3.0",
"accept-encoding":"gzip, deflate, br",
"accept-language":"en-us",

}

I'm not sure if the issue is with RCTNetworking or with rn-eventsource. My guess is that since this is failing with both rn-eventsource and with simple xhr, that the issue is in RCTNetworking?

@kovkev
Copy link
Author

kovkev commented May 6, 2020

Note, if I use https://github.com/JonnyBGod/react-native-eventsource , I am able to have .onmessage calls when an Event is sent from the server, but I am unable to see what was sent:

[Tue May 05 2020 19:31:21.748]  LOG      {"data": undefined, "type": "message"}

@react-native-bot react-native-bot added the Platform: Android Android applications. label May 6, 2020
@kovkev
Copy link
Author

kovkev commented May 6, 2020

Also, my ec2 instance runs nginx and routes the requests to Express. If that makes any difference. You can see the request headers above^ . The response headers should be the same I believe?

@selvinsmart
Copy link

Do you still have a problem with this?

@kovkev
Copy link
Author

kovkev commented May 24, 2020

Yes, it's still not working on Android

@xnguyen9a10
Copy link

Note, if I use https://github.com/JonnyBGod/react-native-eventsource , I am able to have .onmessage calls when an Event is sent from the server, but I am unable to see what was sent:

[Tue May 05 2020 19:31:21.748]  LOG      {"data": undefined, "type": "message"}

Im just facing same problem - "react-native-eventsource": "0.0.2", I open node_modules/react-native-eventsource/EventSource.js
Change

var event = new EventSourceEvent(ev.type, {
         data:ev.message
       });

To:

var event = new EventSourceEvent(ev.type, {
         data:ev.message || ev.data
       });

then it worked like a charm
Hope this helps

@kuznetsov-from-wonderland

Note, if I use https://github.com/JonnyBGod/react-native-eventsource , I am able to have .onmessage calls when an Event is sent from the server, but I am unable to see what was sent:

[Tue May 05 2020 19:31:21.748]  LOG      {"data": undefined, "type": "message"}

Im just facing same problem - "react-native-eventsource": "0.0.2", I open node_modules/react-native-eventsource/EventSource.js
Change

var event = new EventSourceEvent(ev.type, {
         data:ev.message
       });

To:

var event = new EventSourceEvent(ev.type, {
         data:ev.message || ev.data
       });

then it worked like a charm
Hope this helps

How you've managed to run this package? Did you link it manually? I face the same problem. ES events works just fine on ios and on Android simulator. But it does not work on real devices

@fkurniaw
Copy link

fkurniaw commented Sep 2, 2020

unfortunately i had to write a native module for android based on OkSse and register it on react-native to get SSE working

...
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.Headers;
import okhttp3.FormBody;

import com.here.oksse.OkSse;
import com.here.oksse.ServerSentEvent;

import java.util.Map;
import java.util.HashMap;

import com.facebook.react.modules.core.DeviceEventManagerModule;

// barebones Android EventSource java implementation
public class EventSource extends ReactContextBaseJavaModule {
    private static ReactApplicationContext reactContext;
    private OkSse okSse;
    private HashMap<String, ServerSentEvent> sseManager;
    private int sseCount;
  
    public EventSource(ReactApplicationContext context) {
        super(context);
        reactContext = context;
        this.okSse = new OkSse();
        this.sseManager = new HashMap(100);
    }

    public String getName() {
        return "EventSource";
    }

    // returns an SSE id which you need to refer back to for closing the connection
    // assumes that you're making a GET request, but you can also modify this to accept POST/PATCH requests as well
    @ReactMethod
    public void initRequest(
        String path,
        ReadableMap headersMap,
        Promise promise
    ) { 
        Request.Builder requestBuilder = new Request.Builder().url(path);
        HashMap<String, Object> headersHashMap = headersMap.toHashMap();
        for (Map.Entry<String, Object> entry : headersHashMap.entrySet()) {
            String headerKey = entry.getKey();
            String headerValue = (String) entry.getValue(); // assumes that the key-value JSON passed into headers are <String, String>
            requestBuilder.addHeader(headerKey, headerValue);
        }

        Request request = requestBuilder.build();

        String sseRefID = String.valueOf(this.sseCount) + " - " + path;
        ServerSentEvent sse = this.okSse.newServerSentEvent(request, new ServerSentEvent.Listener() {
            @Override
            public void onOpen(ServerSentEvent sse, Response response) {
            }
        
            @Override
            public void onMessage(ServerSentEvent sse, String id, String event, String message) {
                // When a message is received
                WritableMap map = new WritableNativeMap();
                map.putString("id", id);
                map.putString("event", event);
                map.putString("message", message);

                reactContext
                    .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                    .emit(sseRefID, map);
            }
        
            @WorkerThread
            @Override
            public void onComment(ServerSentEvent sse, String comment) {
               WritableMap map = new WritableNativeMap();
               map.putString("comment", comment);
               reactContext
                    .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                    .emit(sseRefID, map); // this identifies the HTTP connection and respective SSEs we want to be listening to on JS
            }
        
            @WorkerThread
            @Override
            public Request onPreRetry(ServerSentEvent sse, Request sseRequest) {
                return request;
            }

            @WorkerThread
            @Override
            public boolean onRetryTime(ServerSentEvent sse, long milliseconds) {
                return true; // True to use the new retry time received by SSE
            }
        
            @WorkerThread
            @Override
            public boolean onRetryError(ServerSentEvent sse, Throwable throwable, Response response) {
                return true; // True to retry, false otherwise
            }
        
            @WorkerThread
            @Override
            public void onClosed(ServerSentEvent sse) {
                // Channel closed
                sse.close();
            }
        });
        this.sseManager.put(sseRefID, sse);
        this.sseCount++;
        promise.resolve(sseRefID);
    }

    @ReactMethod
    public void close(String sseRefID, Promise promise) {
        try {
            this.sseManager.get(sseRefID).close();
            this.sseManager.remove(sseRefID);
            promise.resolve(true);
        } catch (Exception e) {
            System.out.println("failed to close connection");
            promise.resolve(false);
        }
    }
}

on the react-native side

// NativeAndroidEventSource.js
import { NativeEventEmitter, NativeModules, Platform } from 'react-native';

export const eventEmitter = Platform.OS === 'ios'
    ? null
    : new NativeEventEmitter(NativeModules.EventSource);

export default Platform.OS === 'ios' ? null : NativeModules.EventSource;

...
// other module
import AndroidEventSource from './NativeAndroidEventSource.js';

...
// inside an async function
const url = 'http:localhost:3000/sse';
const headers = { 'Content-Type': 'text/event-stream' };
const sseRefID = await AndroidEventSource.initRequest(
    url,
    headers
);
AndroidEventSource.addListener(sseRefID, { message } => {
    console.log(message);
});

for ios you can use the existing XHR-based EventSource polyfills

@TheSalarKhan
Copy link

TheSalarKhan commented Oct 22, 2020

I am having the same issue but this is what I found. I am using react-native-event-source and following is a comment in its code in EventSource.js file:
image

https://github.com/jordanbyron/react-native-event-source/blob/master/EventSource.js#L47

And just as I killed the server all the events came trickling down, as killing the server kills the connections. So I'm guessing that onreadystatechange on android does not trigger unless the connection is closed from the server. I am not sure why and what but killing the server or closing the connections from the server side triggers the event listeners.

@TheSalarKhan
Copy link

Unless Android changes the way it handles stuff this bug doesn't seem to be going away. For now there are some really good native libraries. I am using https://github.com/gpsgate/react-native-eventsource and it works like a dream. However its a non pure js solution so really relies upon updated code.

@tmirun
Copy link

tmirun commented Dec 12, 2020

hey guys, I found these interesting library, to try to solve the android problem with pure js solution:

@tmirun
Copy link

tmirun commented Dec 12, 2020

I understand the big problem of polyfill is XHR of RN doesn't work the same as html5

🤔 so it is some thing should change in the core of RN?

@GaylordP
Copy link

Hello,

I encountered the same problem, I tried 4 libraries and always the same observation: the mesages are displayed on iOS, but not on Android.

Any ideas ?
thank you in advance

@axeljeremy7
Copy link

https://github.com/gpsgate/react-native-eventsource
I try this on android and no response, I'm in rn 0.62

@thiago7almeida
Copy link

Try to disable Flipper network interceptor. Go to android/app/src/debug/java//ReactNativeFlipper.java and comment next lines of code:

  // try to comment this code
  NetworkingModule.setCustomClientBuilder(
    new NetworkingModule.CustomClientBuilder() {
      @Override
      public void apply(OkHttpClient.Builder builder) {
        builder.addNetworkInterceptor(new     FlipperOkhttpInterceptor(networkFlipperPlugin));
      }
    }
  );

@tmirun
Copy link

tmirun commented Jun 21, 2021

i will tell to flipper team if this is a bug, or if they have some solution to solve it

@Slava-Ini
Copy link

Most of the sse React-Native libraries are using xhr, and it doesn't seem to be working properly on Android.
I've struggled a lot lately with other unrelated issues and they all have been caused by xhr (though it was working well on iOS) , after swapping it to node-fetch everything started to work fine

@ninadjoshi20
Copy link

Most of the sse React-Native libraries are using xhr, and it doesn't seem to be working properly on Android. I've struggled a lot lately with other unrelated issues and they all have been caused by xhr (though it was working well on iOS) , after swapping it to node-fetch everything started to work fine

Hi can you share the node-fetch implementation of event source. Facing all the above issues for react-native-sse library in Android

@github-actions github-actions bot added the Needs: Repro This issue could be improved with a clear list of steps to reproduce the issue. label Jul 20, 2023
@sevoflurane-molecules
Copy link

sevoflurane-molecules commented Jul 20, 2023

Try to disable Flipper network interceptor. Go to android/app/src/debug/java//ReactNativeFlipper.java and comment next lines of code:

  // try to comment this code
  NetworkingModule.setCustomClientBuilder(
    new NetworkingModule.CustomClientBuilder() {
      @Override
      public void apply(OkHttpClient.Builder builder) {
        builder.addNetworkInterceptor(new     FlipperOkhttpInterceptor(networkFlipperPlugin));
      }
    }
  );

The flipper network interceptor was in fact responsible for react-native-sse not working on Android. The above did not work for me, but the following did. In this code, I have added a boolean variable shouldAddInterceptor that you can set based on your conditions. If shouldAddInterceptor is true, the interceptor will be added. If false, it won't be added. You will need to replace shouldAddInterceptor with your condition for whether or not to add the Flipper network interceptor:

`
public class ReactNativeFlipper {
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
if (FlipperUtils.shouldEnableFlipper(context)) {
final FlipperClient client = AndroidFlipperClient.getInstance(context);

  client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
  client.addPlugin(new DatabasesFlipperPlugin(context));
  client.addPlugin(new SharedPreferencesFlipperPlugin(context));
  client.addPlugin(CrashReporterPlugin.getInstance());

  NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
  
  boolean shouldAddInterceptor = false; // set this based on your conditions
  
  if (shouldAddInterceptor) {
    NetworkingModule.setCustomClientBuilder(
      new NetworkingModule.CustomClientBuilder() {
        @Override
        public void apply(OkHttpClient.Builder builder) {
          builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
        }
      });
  }

  client.addPlugin(networkFlipperPlugin);
  client.start();

  // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
  // Hence we run if after all native modules have been initialized
  ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
  if (reactContext == null) {
    reactInstanceManager.addReactInstanceEventListener(
        new ReactInstanceEventListener() {
          @Override
          public void onReactContextInitialized(ReactContext reactContext) {
            reactInstanceManager.removeReactInstanceEventListener(this);
            reactContext.runOnNativeModulesQueueThread(
                new Runnable() {
                  @Override
                  public void run() {
                    client.addPlugin(new FrescoFlipperPlugin());
                  }
                });
          }
        });
  } else {
    client.addPlugin(new FrescoFlipperPlugin());
  }
}

}
}
`

You can just copy/paste this over existing code in the ReactNativeFlipper.java file. Just leave the imports how they are at the top of the file. After this, Android received server sent events as intended with only react-native-sse and react-native-url-polyfill packages. iOS worked fine without any changes.

@dullkingsman
Copy link

Hey guys. I went ahead and implemented react-native-oksse. A wrapper around the java extension library oksse. Check it out.

andybharness added a commit to harness/ff-javascript-client-sdk that referenced this issue Feb 20, 2024
What
Make the JS SDK fall back to polling when it detects that it is running inside Android on React native

Why
XMLHttpRequest does not work correctly on React Native when Android is used.
For more context: facebook/react-native#28835
We will use this work around until a better fix is identified.

Testing
Manual
andybharness added a commit to harness/ff-javascript-client-sdk that referenced this issue Feb 21, 2024
…ted (#115)

* [FFM-10442] - Disable streaming if Reactive Native + Android is detected

What
Make the JS SDK fall back to polling when it detects that it is running inside Android on React native

Why
XMLHttpRequest does not work correctly on React Native when Android is used.
For more context: facebook/react-native#28835
We will use this work around until a better fix is identified.

Testing
Manual
@MartinHarkins
Copy link

MartinHarkins commented Mar 8, 2024

In case you are using expo SDK 50, you could try with the plugins i've developed to patch the Android SSE issues while in debug variant (both are needed):

  • react-native: comment out flipper
  • expo: patch ChromeDevTools Interceptor

expo-sse-patch

Edit: note to the react-native team, perhaps the flipper issue is caused by the same type of problem as described there: expo/expo#27526 ?

facebook-github-bot pushed a commit that referenced this issue Apr 19, 2024
Summary:
This sync includes the changes from:
- D56103750
- [TODO] A shim for SECRET_INTERNALS

This sync includes the following changes:
- **[b5e5ce8e0](facebook/react@b5e5ce8e0 )**: Update ReactNativeTypes for root options (part 2) ([#28857](facebook/react#28857)) //<Ricky>//
- **[da6ba53b1](facebook/react@da6ba53b1 )**: [UMD] Remove umd builds ([#28735](facebook/react#28735)) //<Josh Story>//
- **[0c245df1d](facebook/react@0c245df1d )**: Complete the typo fix ([#28856](facebook/react#28856)) //<Sebastian Silbermann>//
- **[f82051d7a](facebook/react@f82051d7a )**: console test utils fix: match entire string, not just first letter ([#28855](facebook/react#28855)) //<Andrew Clark>//
- **[4ca20fd36](facebook/react@4ca20fd36 )**: Test top level fragment inside lazy semantics ([#28852](facebook/react#28852)) //<Sebastian Markbåge>//
- **[c0cf7c696](facebook/react@c0cf7c696 )**: Promote ASYNC_ITERATOR symbol to React Symbols ([#28851](facebook/react#28851)) //<Sebastian Markbåge>//
- **[657428a9e](facebook/react@657428a9e )**: Add ReactNativeTypes for root options ([#28850](facebook/react#28850)) //<Ricky>//
- **[7909d8eab](facebook/react@7909d8eab )**: [Flight] Encode ReadableStream and AsyncIterables ([#28847](facebook/react#28847)) //<Sebastian Markbåge>//
- **[13eb61d05](facebook/react@13eb61d05 )**: Move enableUseDeferredValueInitialArg to canary ([#28818](facebook/react#28818)) //<Andrew Clark>//
- **[8afa144bd](facebook/react@8afa144bd )**: Enable flag disableClientCache ([#28846](facebook/react#28846)) //<Jan Kassens>//
- **[734956ace](facebook/react@734956ace )**: Devtools: Add support for useFormStatus ([#28413](facebook/react#28413)) //<Sebastian Silbermann>//
- **[17e920c00](facebook/react@17e920c00 )**: [Flight Reply] Encode Typed Arrays and Blobs ([#28819](facebook/react#28819)) //<Sebastian Markbåge>//
- **[0347fcd00](facebook/react@0347fcd00 )**: Add on(Caught|Uncaught|Recoverable) opts to RN ([#28836](facebook/react#28836)) //<Ricky>//
- **[c113503ad](facebook/react@c113503ad )**: Flush direct streams in Bun ([#28837](facebook/react#28837)) //<Kenta Iwasaki>//
- **[9defcd56b](facebook/react@9defcd56b )**: Remove redundant props assign ([#28829](facebook/react#28829)) //<Sebastian Silbermann>//
- **[ed4023603](facebook/react@ed4023603 )**: Fix mistaken "react-server" condition ([#28835](facebook/react#28835)) //<Sebastian Markbåge>//
- **[c8a035036](facebook/react@c8a035036 )**: [Fizz] hoistables should never flush before the preamble ([#28802](facebook/react#28802)) //<Josh Story>//
- **[4f5c812a3](facebook/react@4f5c812a3 )**: DevTools: Rely on sourcemaps to compute hook name of built-in hooks in newer versions ([#28593](facebook/react#28593)) //<Sebastian Silbermann>//
- **[435415962](facebook/react@435415962 )**: Backwards compatibility for string refs on WWW ([#28826](facebook/react#28826)) //<Jack Pope>//
- **[608edcc90](facebook/react@608edcc90 )**: [tests] add `assertConsole<method>Dev` helpers ([#28732](facebook/react#28732)) //<Ricky>//
- **[da69b6af9](facebook/react@da69b6af9 )**: ReactDOM.requestFormReset  ([#28809](facebook/react#28809)) //<Andrew Clark>//
- **[374b5d26c](facebook/react@374b5d26c )**: Scaffolding for requestFormReset API ([#28808](facebook/react#28808)) //<Andrew Clark>//
- **[41950d14a](facebook/react@41950d14a )**: Automatically reset forms after action finishes ([#28804](facebook/react#28804)) //<Andrew Clark>//
- **[dc6a7e01e](facebook/react@dc6a7e01e )**: [Float] Don't preload images inside `<noscript>` ([#28815](facebook/react#28815)) //<Josh Story>//
- **[3f947b1b4](facebook/react@3f947b1b4 )**: [tests] Assert scheduler log empty in internalAct ([#28737](facebook/react#28737)) //<Ricky>//
- **[bf09089f6](facebook/react@bf09089f6 )**: Remove Scheduler.log from ReactSuspenseFuzz-test ([#28812](facebook/react#28812)) //<Ricky>//
- **[84cb3b4cb](facebook/react@84cb3b4cb )**: Hardcode disableIEWorkarounds for www ([#28811](facebook/react#28811)) //<Ricky>//
- **[2243b40ab](facebook/react@2243b40ab )**: [tests] assertLog before act in useEffectEvent ([#28763](facebook/react#28763)) //<Ricky>//
- **[dfc64c6e3](facebook/react@dfc64c6e3 )**: [tests] assertLog before act in ReactUse ([#28762](facebook/react#28762)) //<Ricky>//
- **[42eff4bc7](facebook/react@42eff4bc7 )**: [tests] Fix assertions not flushed before act ([#28745](facebook/react#28745)) //<Ricky>//
- **[ed3c65caf](facebook/react@ed3c65caf )**: Warn if outdated JSX transform is detected ([#28781](facebook/react#28781)) //<Andrew Clark>//
- **[3f9e237a2](facebook/react@3f9e237a2 )**: Fix: Suspend while recovering from hydration error ([#28800](facebook/react#28800)) //<Andrew Clark>//
- **[7f5d25e23](facebook/react@7f5d25e23 )**: Fix cloneElement using string ref w no owner ([#28797](facebook/react#28797)) //<Joseph Savona>//
- **[bf40b0244](facebook/react@bf40b0244 )**: [Fizz] Stop publishing external-runtime to stable channel ([#28796](facebook/react#28796)) //<Josh Story>//
- **[7f93cb41c](facebook/react@7f93cb41c )**: [DOM] Infer react-server entries bundles if not explicitly configured ([#28795](facebook/react#28795)) //<Josh Story>//
- **[f61316535](facebook/react@f61316535 )**: Rename SECRET INTERNALS to `__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE` ([#28789](facebook/react#28789)) //<Sebastian Markbåge>//
- **[9644d206e](facebook/react@9644d206e )**: Soften useFormState warning ([#28788](facebook/react#28788)) //<Ricky>//
- **[c771016e1](facebook/react@c771016e1 )**: Rename The Secret Export of Server Internals ([#28786](facebook/react#28786)) //<Sebastian Markbåge>//
- **[d50323eb8](facebook/react@d50323eb8 )**: Flatten ReactSharedInternals ([#28783](facebook/react#28783)) //<Sebastian Markbåge>//
- **[f62cf8c62](facebook/react@f62cf8c62 )**: [Float] treat `props.async` in Float consistent with the rest of react-dom ([#26760](facebook/react#26760)) //<Josh Story>//
- **[dfd3d5af8](facebook/react@dfd3d5af8 )**: Add support for transition{run,start,cancel} events ([#27345](facebook/react#27345)) //<Hugo Sales>//
- **[1f8327f83](facebook/react@1f8327f83 )**: [Fiber] Use real event priority for hydration scheduling ([#28765](facebook/react#28765)) //<Josh Story>//
- **[97c90ed88](facebook/react@97c90ed88 )**: [DOM] Shrink ReactDOMCurrentDispatcher method names ([#28770](facebook/react#28770)) //<Josh Story>//
- **[9007fdc8f](facebook/react@9007fdc8f )**: [DOM] Shrink ReactDOMSharedInternals source representation ([#28771](facebook/react#28771)) //<Josh Story>//
- **[14f50ad15](facebook/react@14f50ad15 )**: [Flight] Allow lazily resolving outlined models ([#28780](facebook/react#28780)) //<Sebastian Markbåge>//
- **[4c12339ce](facebook/react@4c12339ce )**: [DOM] move `flushSync` out of the reconciler ([#28500](facebook/react#28500)) //<Josh Story>//
- **[8e1462e8c](facebook/react@8e1462e8c )**: [Fiber] Move updatePriority tracking to renderers ([#28751](facebook/react#28751)) //<Josh Story>//
- **[0b3b8a6a3](facebook/react@0b3b8a6a3 )**: jsx: Remove unnecessary hasOwnProperty check ([#28775](facebook/react#28775)) //<Andrew Clark>//
- **[2acfb7b60](facebook/react@2acfb7b60 )**: [Flight] Support FormData from Server to Client ([#28754](facebook/react#28754)) //<Sebastian Markbåge>//
- **[d1547defe](facebook/react@d1547defe )**: Fast JSX: Don't clone props object ([#28768](facebook/react#28768)) //<Andrew Clark>//
- **[bfd8da807](facebook/react@bfd8da807 )**: Make class prop resolution faster ([#28766](facebook/react#28766)) //<Andrew Clark>//
- **[cbb6f2b54](facebook/react@cbb6f2b54 )**: [Flight] Support Blobs from Server to Client ([#28755](facebook/react#28755)) //<Sebastian Markbåge>//
- **[f33a6b69c](facebook/react@f33a6b69c )**: Track Owner for Server Components in DEV ([#28753](facebook/react#28753)) //<Sebastian Markbåge>//
- **[e3ebcd54b](facebook/react@e3ebcd54b )**: Move string ref coercion to JSX runtime ([#28473](facebook/react#28473)) //<Andrew Clark>//
- **[fd0da3eef](facebook/react@fd0da3eef )**: Remove _owner field from JSX elements in prod if string refs are disabled ([#28739](facebook/react#28739)) //<Sebastian Markbåge>//

Changelog:
[General][Changed] - React Native sync for revisions 48b4ecc...b5e5ce8

jest_e2e[run_all_tests]
bypass-github-export-checks

Reviewed By: kassens

Differential Revision: D56251607

fbshipit-source-id: e16db2fa101fc7ed1e009158c76388206beabd5f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Needs: Repro This issue could be improved with a clear list of steps to reproduce the issue. Needs: Triage 🔍 Platform: Android Android applications.
Projects
None yet
Development

No branches or pull requests