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 (#41183)
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/41183 Changelog: [Internal] 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: D50588308 fbshipit-source-id: 98fa54a2b5851898a4514b1fb7feaf586cfdbb0c
This commit is contained in:
committed by
Facebook GitHub Bot
parent
7093a45b1c
commit
1e21b5b08c
@@ -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
|
||||
@@ -54,6 +56,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";
|
||||
@@ -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;
|
||||
@@ -162,15 +170,13 @@ RCT_EXPORT_MODULE()
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (instancetype)init
|
||||
{
|
||||
return [super initWithDisabledObservation];
|
||||
}
|
||||
|
||||
- (instancetype)initWithHandlersProvider:
|
||||
(NSArray<id<RCTURLRequestHandler>> * (^)(RCTModuleRegistry *moduleRegistry))getHandlers
|
||||
{
|
||||
if (self = [super initWithDisabledObservation]) {
|
||||
if (gEnableNetworkingRequestQueue) {
|
||||
_requestQueue = dispatch_queue_create("com.facebook.react.network.request", DISPATCH_QUEUE_SERIAL);
|
||||
}
|
||||
_handlersProvider = getHandlers;
|
||||
}
|
||||
return self;
|
||||
@@ -294,7 +300,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 method 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 +353,7 @@ RCT_EXPORT_MODULE()
|
||||
forHTTPHeaderField:@"Content-Length"];
|
||||
}
|
||||
|
||||
dispatch_async(self->_methodQueue, ^{
|
||||
dispatch_async([self requestQueue], ^{
|
||||
block(request);
|
||||
});
|
||||
|
||||
@@ -385,7 +391,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 method queue");
|
||||
|
||||
if (!query) {
|
||||
return callback(nil, nil);
|
||||
@@ -414,7 +420,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 +520,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 method queue");
|
||||
|
||||
id responseData = nil;
|
||||
for (id<RCTNetworkingResponseHandler> handler in _responseHandlers) {
|
||||
@@ -552,7 +558,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 method queue");
|
||||
__weak __typeof(self) weakSelf = self;
|
||||
__block RCTNetworkTask *task;
|
||||
RCTURLRequestProgressBlock uploadProgressBlock = ^(int64_t progress, int64_t total) {
|
||||
@@ -689,7 +695,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 +717,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 +746,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 +754,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 +768,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