@@ -94,6 +94,9 @@ + (BOOL)isPackagerRunning:(NSString *)hostPort scheme:(NSString *)scheme
9494 }
9595
9696 NSURL *url = [serverRootWithHostPort (hostPort, scheme) URLByAppendingPathComponent: @" status" ];
97+ if (url == nil ) {
98+ return NO ;
99+ }
97100
98101 NSURLSession *session = [NSURLSession sharedSession ];
99102 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: url
@@ -133,6 +136,73 @@ + (BOOL)isPackagerRunning:(NSString *)hostPort scheme:(NSString *)scheme
133136 return isRunning;
134137}
135138
139+ + (void )isPackagerRunningAsync : (NSString *)hostPort completion : (void (^)(BOOL isRunning))completion
140+ {
141+ [RCTBundleURLProvider isPackagerRunningAsync: hostPort scheme: nil completion: completion];
142+ }
143+
144+ + (void )isPackagerRunningAsync : (NSString *)hostPort
145+ scheme : (NSString *)scheme
146+ completion : (void (^)(BOOL isRunning))completion
147+ {
148+ if (!kRCTAllowPackagerAccess ) {
149+ completion (NO );
150+ return ;
151+ }
152+
153+ NSURL *url = [serverRootWithHostPort (hostPort, scheme) URLByAppendingPathComponent: @" status" ];
154+ if (url == nil ) {
155+ completion (NO );
156+ return ;
157+ }
158+
159+ NSURLSession *session = [NSURLSession sharedSession ];
160+ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: url
161+ cachePolicy: NSURLRequestUseProtocolCachePolicy
162+ timeoutInterval: kRCTPackagerStatusRequestTimeout ];
163+ [[RCTDevSupportHttpHeaders sharedInstance ] applyHeadersToRequest: request];
164+
165+ __block BOOL hasCompleted = NO ;
166+ NSObject *lock = [[NSObject alloc ] init ];
167+
168+ void (^safeCompletion)(BOOL ) = ^(BOOL isRunning) {
169+ @synchronized (lock) {
170+ if (!hasCompleted) {
171+ hasCompleted = YES ;
172+ completion (isRunning);
173+ }
174+ }
175+ };
176+
177+ NSURLSessionDataTask *task = [session dataTaskWithRequest: request
178+ completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) {
179+ if (error != nil || data == nil ) {
180+ safeCompletion (NO );
181+ return ;
182+ }
183+ NSString *status = [[NSString alloc ] initWithData: data
184+ encoding: NSUTF8StringEncoding];
185+ BOOL isRunning = [status isEqualToString: @" packager-status:running" ];
186+ safeCompletion (isRunning);
187+ }];
188+ [task resume ];
189+
190+ dispatch_after (
191+ dispatch_time (
192+ DISPATCH_TIME_NOW ,
193+ (int64_t )((kRCTPackagerStatusRequestTimeout + kRCTPackagerStatusRequestTimeoutGraceTime ) * NSEC_PER_SEC )),
194+ dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT , 0 ),
195+ ^{
196+ @synchronized (lock) {
197+ if (!hasCompleted) {
198+ hasCompleted = YES ;
199+ [task cancel ];
200+ completion (NO );
201+ }
202+ }
203+ });
204+ }
205+
136206- (NSString *)guessPackagerHost
137207{
138208 static NSString *ipGuess;
@@ -160,6 +230,18 @@ + (BOOL)isPackagerRunning:(NSString *)hostPort scheme:(NSString *)scheme
160230{
161231 return false ;
162232}
233+
234+ + (void )isPackagerRunningAsync : (NSString *)hostPort completion : (void (^)(BOOL isRunning))completion
235+ {
236+ completion (NO );
237+ }
238+
239+ + (void )isPackagerRunningAsync : (NSString *)hostPort
240+ scheme : (NSString *)scheme
241+ completion : (void (^)(BOOL isRunning))completion
242+ {
243+ completion (NO );
244+ }
163245#endif
164246
165247- (NSString *)packagerServerHost
0 commit comments