SRTWebSocketOperation.m 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //
  2. // Copyright 2012 Square Inc.
  3. // Portions Copyright (c) 2016-present, Facebook, Inc.
  4. //
  5. // All rights reserved.
  6. //
  7. // This source code is licensed under the BSD-style license found in the
  8. // LICENSE file in the root directory of this source tree. An additional grant
  9. // of patent rights can be found in the PATENTS file in the same directory.
  10. //
  11. #import "SRTWebSocketOperation.h"
  12. #import "SRAutobahnUtilities.h"
  13. @interface SRTWebSocketOperation ()
  14. @end
  15. @implementation SRTWebSocketOperation {
  16. NSInteger _testNumber;
  17. SRWebSocket *_webSocket;
  18. NSURL *_url;
  19. }
  20. @synthesize isFinished = _isFinished;
  21. @synthesize isExecuting = _isExecuting;
  22. @synthesize error = _error;
  23. - (instancetype)initWithURL:(NSURL *)URL;
  24. {
  25. self = [super init];
  26. if (self) {
  27. _url = URL;
  28. _isExecuting = NO;
  29. _isFinished = NO;
  30. }
  31. return self;
  32. }
  33. - (BOOL)isConcurrent;
  34. {
  35. return YES;
  36. }
  37. - (void)start;
  38. {
  39. dispatch_async(dispatch_get_main_queue(), ^{
  40. SRWebSocket *socket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:self->_url]];
  41. socket.delegate = self;
  42. self->_webSocket = socket;
  43. [socket open];
  44. });
  45. self.isExecuting = YES;
  46. }
  47. - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
  48. {
  49. [self willChangeValueForKey:@"isExecuting"];
  50. [self willChangeValueForKey:@"isFinished"];
  51. _isFinished = YES;
  52. _isExecuting = NO;
  53. [self didChangeValueForKey:@"isExecuting"];
  54. [self didChangeValueForKey:@"isFinished"];
  55. _webSocket.delegate = nil;
  56. _webSocket = nil;
  57. }
  58. - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
  59. {
  60. _error = error;
  61. [self willChangeValueForKey:@"isExecuting"];
  62. [self willChangeValueForKey:@"isFinished"];
  63. _isFinished = YES;
  64. _isExecuting = NO;
  65. [self didChangeValueForKey:@"isExecuting"];
  66. [self didChangeValueForKey:@"isFinished"];
  67. _webSocket.delegate = nil;
  68. _webSocket = nil;
  69. }
  70. - (BOOL)waitUntilFinishedWithTimeout:(NSTimeInterval)timeout
  71. {
  72. if (self.isFinished) {
  73. return YES;
  74. }
  75. return SRRunLoopRunUntil(^BOOL{
  76. return self.isFinished;
  77. }, timeout);
  78. }
  79. @end