Reconnect RCTWebSocketManager when packager restarts
Reviewed By: bottledwalter Differential Revision: D3434769 fbshipit-source-id: a0b165129b66d03403defb39a20c86ab982fc8b5
This commit is contained in:
Родитель
bc8954babb
Коммит
662ec705cb
|
@ -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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче