// // Copyright 2012 Square Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #import #import typedef enum { SR_CONNECTING = 0, SR_OPEN = 1, SR_CLOSING = 2, SR_CLOSED = 3, } SRReadyState; typedef enum SRStatusCode : NSInteger { SRStatusCodeNormal = 1000, SRStatusCodeGoingAway = 1001, SRStatusCodeProtocolError = 1002, SRStatusCodeUnhandledType = 1003, // 1004 reserved. SRStatusNoStatusReceived = 1005, // 1004-1006 reserved. SRStatusCodeInvalidUTF8 = 1007, SRStatusCodePolicyViolated = 1008, SRStatusCodeMessageTooBig = 1009, } SRStatusCode; @class SRWebSocket; extern NSString *const SRWebSocketErrorDomain; extern NSString *const SRHTTPResponseErrorKey; #pragma mark - SRWebSocketDelegate @protocol SRWebSocketDelegate; #pragma mark - SRWebSocket @interface SRWebSocket : NSObject @property(nonatomic, weak) id delegate; @property(nonatomic, readonly) SRReadyState readyState; @property(nonatomic, readonly, retain) NSURL *url; // This returns the negotiated protocol. // It will be nil until after the handshake completes. @property(nonatomic, readonly, copy) NSString *protocol; // Protocols should be an array of strings that turn into Sec-WebSocket-Protocol. - (id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols; - (id)initWithURLRequest:(NSURLRequest *)request; // Some helper constructors. - (id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols; - (id)initWithURL:(NSURL *)url; // Delegate queue will be dispatch_main_queue by default. // You cannot set both OperationQueue and dispatch_queue. - (void)setDelegateOperationQueue:(NSOperationQueue *)queue; - (void)setDelegateDispatchQueue:(dispatch_queue_t)queue; // By default, it will schedule itself on +[NSRunLoop SR_networkRunLoop] using defaultModes. - (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; - (void)unscheduleFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; // SRWebSockets are intended for one-time-use only. Open should be called once and only once. - (void)open; - (void)close; - (void)closeWithCode:(NSInteger)code reason:(NSString *)reason; // Send a UTF8 String or Data. - (void)send:(id)data; // Send Data (can be nil) in a ping message. - (void)sendPing:(NSData *)data; @end #pragma mark - SRWebSocketDelegate @protocol SRWebSocketDelegate // message will either be an NSString if the server is using text // or NSData if the server is using binary. - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message; @optional - (void)webSocketDidOpen:(SRWebSocket *)webSocket; - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error; - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean; - (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload; @end #pragma mark - NSURLRequest (CertificateAdditions) @interface NSURLRequest (CertificateAdditions) @property(nonatomic, retain, readonly) NSArray *SR_SSLPinnedCertificates; @end #pragma mark - NSMutableURLRequest (CertificateAdditions) @interface NSMutableURLRequest (CertificateAdditions) @property(nonatomic, retain) NSArray *SR_SSLPinnedCertificates; @end #pragma mark - NSRunLoop (SRWebSocket) @interface NSRunLoop (SRWebSocket) + (NSRunLoop *)SR_networkRunLoop; @end