109 lines
2.7 KiB
Objective-C
109 lines
2.7 KiB
Objective-C
#import <Foundation/Foundation.h>
|
|
|
|
@class HTTPMessage;
|
|
@class GCDAsyncSocket;
|
|
|
|
|
|
#define WebSocketDidDieNotification @"WebSocketDidDie"
|
|
|
|
@interface WebSocket : NSObject
|
|
{
|
|
dispatch_queue_t websocketQueue;
|
|
|
|
HTTPMessage *request;
|
|
GCDAsyncSocket *asyncSocket;
|
|
|
|
NSData *term;
|
|
|
|
BOOL isStarted;
|
|
BOOL isOpen;
|
|
BOOL isVersion76;
|
|
|
|
id __unsafe_unretained delegate;
|
|
}
|
|
|
|
+ (BOOL)isWebSocketRequest:(HTTPMessage *)request;
|
|
|
|
- (id)initWithRequest:(HTTPMessage *)request socket:(GCDAsyncSocket *)socket;
|
|
|
|
/**
|
|
* Delegate option.
|
|
*
|
|
* In most cases it will be easier to subclass WebSocket,
|
|
* but some circumstances may lead one to prefer standard delegate callbacks instead.
|
|
**/
|
|
@property (/* atomic */ unsafe_unretained) id delegate;
|
|
|
|
/**
|
|
* The WebSocket class is thread-safe, generally via it's GCD queue.
|
|
* All public API methods are thread-safe,
|
|
* and the subclass API methods are thread-safe as they are all invoked on the same GCD queue.
|
|
**/
|
|
@property (nonatomic, readonly) dispatch_queue_t websocketQueue;
|
|
|
|
/**
|
|
* Public API
|
|
*
|
|
* These methods are automatically called by the HTTPServer.
|
|
* You may invoke the stop method yourself to close the WebSocket manually.
|
|
**/
|
|
- (void)start;
|
|
- (void)stop;
|
|
|
|
/**
|
|
* Public API
|
|
*
|
|
* Sends a message over the WebSocket.
|
|
* This method is thread-safe.
|
|
**/
|
|
- (void)sendMessage:(NSString *)msg;
|
|
|
|
/**
|
|
* Public API
|
|
*
|
|
* Sends a message over the WebSocket.
|
|
* This method is thread-safe.
|
|
**/
|
|
- (void)sendData:(NSData *)msg;
|
|
|
|
/**
|
|
* Subclass API
|
|
*
|
|
* These methods are designed to be overriden by subclasses.
|
|
**/
|
|
- (void)didOpen;
|
|
- (void)didReceiveMessage:(NSString *)msg;
|
|
- (void)didReceiveData:(NSData *)data;
|
|
- (void)didClose;
|
|
|
|
@end
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
#pragma mark -
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/**
|
|
* There are two ways to create your own custom WebSocket:
|
|
*
|
|
* - Subclass it and override the methods you're interested in.
|
|
* - Use traditional delegate paradigm along with your own custom class.
|
|
*
|
|
* They both exist to allow for maximum flexibility.
|
|
* In most cases it will be easier to subclass WebSocket.
|
|
* However some circumstances may lead one to prefer standard delegate callbacks instead.
|
|
* One such example, you're already subclassing another class, so subclassing WebSocket isn't an option.
|
|
**/
|
|
|
|
@protocol WebSocketDelegate
|
|
@optional
|
|
|
|
- (void)webSocketDidOpen:(WebSocket *)ws;
|
|
|
|
- (void)webSocket:(WebSocket *)ws didReceiveMessage:(NSString *)msg;
|
|
|
|
- (void)webSocket:(WebSocket *)ws didReceiveData:(NSData *)data;
|
|
|
|
- (void)webSocketDidClose:(WebSocket *)ws;
|
|
|
|
@end
|