Reconnect RCTWebSocketManager when packager restarts

Reviewed By: bottledwalter

Differential Revision: D3434769

fbshipit-source-id: a0b165129b66d03403defb39a20c86ab982fc8b5
This commit is contained in:
Alex Kotliarskyi 2016-06-20 10:49:59 -07:00 коммит произвёл Facebook Github Bot 7
Родитель bc8954babb
Коммит 662ec705cb
1 изменённых файлов: 22 добавлений и 13 удалений

Просмотреть файл

@ -20,7 +20,9 @@
#pragma mark - RCTWebSocketObserver #pragma mark - RCTWebSocketObserver
@interface RCTWebSocketObserver : NSObject <RCTSRWebSocketDelegate> @interface RCTWebSocketObserver : NSObject <RCTSRWebSocketDelegate> {
NSURL *_url;
}
@property (nonatomic, strong) RCTSRWebSocket *socket; @property (nonatomic, strong) RCTSRWebSocket *socket;
@property (nonatomic, weak) id<RCTWebSocketProxyDelegate> delegate; @property (nonatomic, weak) id<RCTWebSocketProxyDelegate> delegate;
@ -35,9 +37,7 @@
- (instancetype)initWithURL:(NSURL *)url delegate:(id<RCTWebSocketProxyDelegate>)delegate - (instancetype)initWithURL:(NSURL *)url delegate:(id<RCTWebSocketProxyDelegate>)delegate
{ {
if ((self = [self init])) { if ((self = [self init])) {
_socket = [[RCTSRWebSocket alloc] initWithURL:url]; _url = url;
_socket.delegate = self;
_delegate = delegate; _delegate = delegate;
} }
return self; return self;
@ -45,9 +45,11 @@
- (void)start - (void)start
{ {
_socketOpenSemaphore = dispatch_semaphore_create(0); [self stop];
_socket = [[RCTSRWebSocket alloc] initWithURL:_url];
_socket.delegate = self;
[_socket open]; [_socket open];
dispatch_semaphore_wait(_socketOpenSemaphore, dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 2));
} }
- (void)stop - (void)stop
@ -71,18 +73,25 @@
} }
} }
- (void)webSocketDidOpen:(RCTSRWebSocket *)webSocket - (void)reconnect
{ {
dispatch_semaphore_signal(_socketOpenSemaphore); __weak RCTSRWebSocket *socket = _socket;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// Only reconnect if the observer wasn't stoppped while we were waiting
if (socket) {
[self start];
}
});
} }
- (void)webSocket:(RCTSRWebSocket *)webSocket didFailWithError:(NSError *)error - (void)webSocket:(RCTSRWebSocket *)webSocket didFailWithError:(NSError *)error
{ {
dispatch_semaphore_signal(_socketOpenSemaphore); [self reconnect];
dispatch_async(dispatch_get_main_queue(), ^{ }
// Give the setUp method an opportunity to report an error first
RCTLogError(@"WebSocket connection failed with error %@", error); - (void)webSocket:(RCTSRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
}); {
[self reconnect];
} }
@end @end