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
@interface RCTWebSocketObserver : NSObject <RCTSRWebSocketDelegate>
@interface RCTWebSocketObserver : NSObject <RCTSRWebSocketDelegate> {
NSURL *_url;
}
@property (nonatomic, strong) RCTSRWebSocket *socket;
@property (nonatomic, weak) id<RCTWebSocketProxyDelegate> delegate;
@ -35,9 +37,7 @@
- (instancetype)initWithURL:(NSURL *)url delegate:(id<RCTWebSocketProxyDelegate>)delegate
{
if ((self = [self init])) {
_socket = [[RCTSRWebSocket alloc] initWithURL:url];
_socket.delegate = self;
_url = url;
_delegate = delegate;
}
return self;
@ -45,9 +45,11 @@
- (void)start
{
_socketOpenSemaphore = dispatch_semaphore_create(0);
[self stop];
_socket = [[RCTSRWebSocket alloc] initWithURL:_url];
_socket.delegate = self;
[_socket open];
dispatch_semaphore_wait(_socketOpenSemaphore, dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 2));
}
- (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
{
dispatch_semaphore_signal(_socketOpenSemaphore);
dispatch_async(dispatch_get_main_queue(), ^{
// Give the setUp method an opportunity to report an error first
RCTLogError(@"WebSocket connection failed with error %@", error);
});
[self reconnect];
}
- (void)webSocket:(RCTSRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
{
[self reconnect];
}
@end