mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
setup test to use custom queue for RCTNetworking operations instead of module queue (#41251)
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/41251 Changelog: [Internal] remerge of https://github.com/facebook/react-native/pull/41183 >in my quest to get rid of all synthesized methodQueues, we have RCTNetworking which uses it internally as well as exposes its underlying execution queue. in this diff, i add a config that replaces that queue with one that is managed by the module itself instead of the one generated by the infra. this is the last one! Reviewed By: cipolleschi Differential Revision: D50764523 fbshipit-source-id: 442f3a9f112409f2f05c69c0aa8391c04e8b0173
This commit is contained in:
committed by
Facebook GitHub Bot
parent
052d20058b
commit
f513a883ed
@@ -159,11 +159,11 @@ RCT_EXPORT_METHOD(addNetworkingHandler)
|
||||
|
||||
// TODO(T63516227): Why can methodQueue be nil here?
|
||||
// We don't want to do anything when methodQueue is nil.
|
||||
if (!networking.methodQueue) {
|
||||
if (![networking requestQueue]) {
|
||||
return;
|
||||
}
|
||||
|
||||
dispatch_async(networking.methodQueue, ^{
|
||||
dispatch_async([networking requestQueue], ^{
|
||||
[networking addRequestHandler:self];
|
||||
[networking addResponseHandler:self];
|
||||
});
|
||||
|
||||
@@ -78,7 +78,8 @@ RCT_EXPORT_MODULE()
|
||||
|
||||
NSOperationQueue *callbackQueue = [NSOperationQueue new];
|
||||
callbackQueue.maxConcurrentOperationCount = 1;
|
||||
callbackQueue.underlyingQueue = [[_moduleRegistry moduleForName:"Networking"] methodQueue];
|
||||
RCTNetworking *networking = [_moduleRegistry moduleForName:"Networking"];
|
||||
callbackQueue.underlyingQueue = [networking requestQueue];
|
||||
NSURLSessionConfiguration *configuration;
|
||||
if (urlSessionConfigurationProvider) {
|
||||
configuration = urlSessionConfigurationProvider();
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
#import <React/RCTNetworkTask.h>
|
||||
#import <React/RCTURLRequestHandler.h>
|
||||
|
||||
RCT_EXTERN void RCTEnableNetworkingRequestQueue(BOOL enabled);
|
||||
|
||||
@protocol RCTNetworkingRequestHandler <NSObject>
|
||||
|
||||
// @lint-ignore FBOBJCUNTYPEDCOLLECTION1
|
||||
@@ -56,6 +58,8 @@
|
||||
|
||||
- (void)removeResponseHandler:(id<RCTNetworkingResponseHandler>)handler;
|
||||
|
||||
- (dispatch_queue_t)requestQueue;
|
||||
|
||||
@end
|
||||
|
||||
@interface RCTBridge (RCTNetworking)
|
||||
|
||||
@@ -19,6 +19,13 @@
|
||||
|
||||
#import "RCTNetworkPlugins.h"
|
||||
|
||||
static BOOL gEnableNetworkingRequestQueue = NO;
|
||||
|
||||
RCT_EXTERN void RCTEnableNetworkingRequestQueue(BOOL enabled)
|
||||
{
|
||||
gEnableNetworkingRequestQueue = enabled;
|
||||
}
|
||||
|
||||
typedef RCTURLRequestCancellationBlock (^RCTHTTPQueryResult)(NSError *error, NSDictionary<NSString *, id> *result);
|
||||
|
||||
NSString *const RCTNetworkingPHUploadHackScheme = @"ph-upload";
|
||||
@@ -69,7 +76,7 @@ static NSString *RCTGenerateFormBoundary()
|
||||
|
||||
- (RCTURLRequestCancellationBlock)process:(NSArray<NSDictionary *> *)formData callback:(RCTHTTPQueryResult)callback
|
||||
{
|
||||
RCTAssertThread(_networker.methodQueue, @"process: must be called on method queue");
|
||||
RCTAssertThread([_networker requestQueue], @"process: must be called on request queue");
|
||||
|
||||
if (formData.count == 0) {
|
||||
return callback(nil, nil);
|
||||
@@ -98,7 +105,7 @@ static NSString *RCTGenerateFormBoundary()
|
||||
|
||||
- (RCTURLRequestCancellationBlock)handleResult:(NSDictionary<NSString *, id> *)result error:(NSError *)error
|
||||
{
|
||||
RCTAssertThread(_networker.methodQueue, @"handleResult: must be called on method queue");
|
||||
RCTAssertThread([_networker requestQueue], @"handleResult: must be called on request queue");
|
||||
|
||||
if (error) {
|
||||
return _callback(error, nil);
|
||||
@@ -151,6 +158,7 @@ static NSString *RCTGenerateFormBoundary()
|
||||
NSArray<id<RCTURLRequestHandler>> * (^_handlersProvider)(RCTModuleRegistry *);
|
||||
NSMutableArray<id<RCTNetworkingRequestHandler>> *_requestHandlers;
|
||||
NSMutableArray<id<RCTNetworkingResponseHandler>> *_responseHandlers;
|
||||
dispatch_queue_t _requestQueue;
|
||||
}
|
||||
|
||||
@synthesize methodQueue = _methodQueue;
|
||||
@@ -164,7 +172,12 @@ RCT_EXPORT_MODULE()
|
||||
|
||||
- (instancetype)init
|
||||
{
|
||||
return [super initWithDisabledObservation];
|
||||
if (self = [super initWithDisabledObservation]) {
|
||||
if (gEnableNetworkingRequestQueue) {
|
||||
_requestQueue = dispatch_queue_create("com.facebook.react.network.request", DISPATCH_QUEUE_SERIAL);
|
||||
}
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithHandlersProvider:
|
||||
@@ -294,7 +307,7 @@ RCT_EXPORT_MODULE()
|
||||
- (RCTURLRequestCancellationBlock)buildRequest:(NSDictionary<NSString *, id> *)query
|
||||
completionBlock:(void (^)(NSURLRequest *request))block
|
||||
{
|
||||
RCTAssertThread(_methodQueue, @"buildRequest: must be called on method queue");
|
||||
RCTAssertThread([self requestQueue], @"buildRequest: must be called on request queue");
|
||||
|
||||
NSURL *URL = [RCTConvert NSURL:query[@"url"]]; // this is marked as nullable in JS, but should not be null
|
||||
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
|
||||
@@ -347,7 +360,7 @@ RCT_EXPORT_MODULE()
|
||||
forHTTPHeaderField:@"Content-Length"];
|
||||
}
|
||||
|
||||
dispatch_async(self->_methodQueue, ^{
|
||||
dispatch_async([self requestQueue], ^{
|
||||
block(request);
|
||||
});
|
||||
|
||||
@@ -385,7 +398,7 @@ RCT_EXPORT_MODULE()
|
||||
callback:(RCTURLRequestCancellationBlock (^)(NSError *error, NSDictionary<NSString *, id> *result))
|
||||
callback
|
||||
{
|
||||
RCTAssertThread(_methodQueue, @"processDataForHTTPQuery: must be called on method queue");
|
||||
RCTAssertThread([self requestQueue], @"processDataForHTTPQuery: must be called on request queue");
|
||||
|
||||
if (!query) {
|
||||
return callback(nil, nil);
|
||||
@@ -414,7 +427,7 @@ RCT_EXPORT_MODULE()
|
||||
RCTNetworkTask *task =
|
||||
[self networkTaskWithRequest:request
|
||||
completionBlock:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
dispatch_async(self->_methodQueue, ^{
|
||||
dispatch_async([self requestQueue], ^{
|
||||
cancellationBlock = callback(
|
||||
error, data ? @{@"body" : data, @"contentType" : RCTNullIfNil(response.MIMEType)} : nil);
|
||||
});
|
||||
@@ -514,7 +527,7 @@ RCT_EXPORT_MODULE()
|
||||
response:(NSURLResponse *)response
|
||||
forTask:(RCTNetworkTask *)task
|
||||
{
|
||||
RCTAssertThread(_methodQueue, @"sendData: must be called on method queue");
|
||||
RCTAssertThread([self requestQueue], @"sendData: must be called on request queue");
|
||||
|
||||
id responseData = nil;
|
||||
for (id<RCTNetworkingResponseHandler> handler in _responseHandlers) {
|
||||
@@ -552,7 +565,7 @@ RCT_EXPORT_MODULE()
|
||||
incrementalUpdates:(BOOL)incrementalUpdates
|
||||
responseSender:(RCTResponseSenderBlock)responseSender
|
||||
{
|
||||
RCTAssertThread(_methodQueue, @"sendRequest: must be called on method queue");
|
||||
RCTAssertThread([self requestQueue], @"sendRequest: must be called on request queue");
|
||||
__weak __typeof(self) weakSelf = self;
|
||||
__block RCTNetworkTask *task;
|
||||
RCTURLRequestProgressBlock uploadProgressBlock = ^(int64_t progress, int64_t total) {
|
||||
@@ -689,7 +702,9 @@ RCT_EXPORT_MODULE()
|
||||
return nil;
|
||||
}
|
||||
|
||||
RCTNetworkTask *task = [[RCTNetworkTask alloc] initWithRequest:request handler:handler callbackQueue:_methodQueue];
|
||||
RCTNetworkTask *task = [[RCTNetworkTask alloc] initWithRequest:request
|
||||
handler:handler
|
||||
callbackQueue:[self requestQueue]];
|
||||
task.completionBlock = completionBlock;
|
||||
return task;
|
||||
}
|
||||
@@ -709,7 +724,7 @@ RCT_EXPORT_METHOD(sendRequest
|
||||
double timeout = query.timeout();
|
||||
bool withCredentials = query.withCredentials();
|
||||
|
||||
dispatch_async(_methodQueue, ^{
|
||||
dispatch_async([self requestQueue], ^{
|
||||
NSDictionary *queryDict = @{
|
||||
@"method" : method,
|
||||
@"url" : url,
|
||||
@@ -738,7 +753,7 @@ RCT_EXPORT_METHOD(sendRequest
|
||||
|
||||
RCT_EXPORT_METHOD(abortRequest : (double)requestID)
|
||||
{
|
||||
dispatch_async(_methodQueue, ^{
|
||||
dispatch_async([self requestQueue], ^{
|
||||
[self->_tasksByRequestID[[NSNumber numberWithDouble:requestID]] cancel];
|
||||
[self->_tasksByRequestID removeObjectForKey:[NSNumber numberWithDouble:requestID]];
|
||||
});
|
||||
@@ -746,7 +761,7 @@ RCT_EXPORT_METHOD(abortRequest : (double)requestID)
|
||||
|
||||
RCT_EXPORT_METHOD(clearCookies : (RCTResponseSenderBlock)responseSender)
|
||||
{
|
||||
dispatch_async(_methodQueue, ^{
|
||||
dispatch_async([self requestQueue], ^{
|
||||
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
|
||||
if (!storage.cookies.count) {
|
||||
responseSender(@[ @NO ]);
|
||||
@@ -760,6 +775,11 @@ RCT_EXPORT_METHOD(clearCookies : (RCTResponseSenderBlock)responseSender)
|
||||
});
|
||||
}
|
||||
|
||||
- (dispatch_queue_t)requestQueue
|
||||
{
|
||||
return gEnableNetworkingRequestQueue ? _requestQueue : _methodQueue;
|
||||
}
|
||||
|
||||
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
||||
(const facebook::react::ObjCTurboModule::InitParams &)params
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user