From 662ec705cbc42f1cbba5d20f6d0d4d809cbb8556 Mon Sep 17 00:00:00 2001 From: Alex Kotliarskyi Date: Mon, 20 Jun 2016 10:49:59 -0700 Subject: [PATCH] Reconnect RCTWebSocketManager when packager restarts Reviewed By: bottledwalter Differential Revision: D3434769 fbshipit-source-id: a0b165129b66d03403defb39a20c86ab982fc8b5 --- Libraries/WebSocket/RCTWebSocketManager.m | 35 ++++++++++++++--------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/Libraries/WebSocket/RCTWebSocketManager.m b/Libraries/WebSocket/RCTWebSocketManager.m index eaf67d78e..16b319583 100644 --- a/Libraries/WebSocket/RCTWebSocketManager.m +++ b/Libraries/WebSocket/RCTWebSocketManager.m @@ -20,7 +20,9 @@ #pragma mark - RCTWebSocketObserver -@interface RCTWebSocketObserver : NSObject +@interface RCTWebSocketObserver : NSObject { + NSURL *_url; +} @property (nonatomic, strong) RCTSRWebSocket *socket; @property (nonatomic, weak) id delegate; @@ -35,9 +37,7 @@ - (instancetype)initWithURL:(NSURL *)url delegate:(id)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