BBAWebSocketTask.h 2.58 KB
//
//  BBAWebSocketTask.h
//  BBAAPIRequest
//
//  Created by chenjia09 on 2018/5/24.
//

#import <Foundation/Foundation.h>

// socket task 状态
typedef NS_ENUM(NSInteger, BBASocketTaskStatus) {
    BBASocketTaskStatusConnecting   = 0,
    BBASocketTaskStatusOpen         = 1,
    BBASocketTaskStatusClosing      = 2,
    BBASocketTaskStatusClosed       = 3,
};

// 消息类型
typedef NS_ENUM(NSInteger, BBASocketReceiveType) {
    BBASocketReceiveTypeString,
    BBASocketReceiveTypeData
};

// 连接成功回调
typedef void(^BBASocketDidConnectBlock)(NSDictionary<NSString *, NSString *> * _Nullable responseHeaders);

// 消息接收回调
typedef void(^BBASocketDidReceiveBlock)(id _Nullable message, BBASocketReceiveType type);

// 关闭回调
typedef void(^BBASocketDidCloseBlock)(NSInteger code, NSString * _Nullable reason);

// 失败回调
typedef void(^BBASocketDidErrorBlock)(NSError * _Nullable error);

/**
 *  WebSocketTask 的基类,所有的 WebSocketTask 必须直接使用本类或本类的子类创建 task 对象
 */
@interface BBAWebSocketTask : NSObject

/// 当前状态
@property (nonatomic, assign, readonly) BBASocketTaskStatus status;

/// 连接成功回调
@property (nonatomic, copy, nullable) BBASocketDidConnectBlock connectedCallBack;

/// 消息接受回调
@property (nonatomic, copy, nullable) BBASocketDidReceiveBlock receivedCallBack;

/// 关闭回调
@property (nonatomic, copy, nullable) BBASocketDidCloseBlock closedCallBack;

/// 失败回调
@property (nonatomic, copy, nullable) BBASocketDidErrorBlock failedCallBack;

/// 错误回调,例如连接失败,因为网络问题等被close等,触发didFailWithError代理时调用
@property (nonatomic, copy, nullable) BBASocketDidErrorBlock errorCallBack;

- (_Nonnull instancetype)init NS_UNAVAILABLE;
/**
 *  @brief 初始化方法
 *
 *  @param request      URLRequest 对象
 *  @param protocols    子协议数组
 *  @return 返回创建的 task 对象
 */
- (_Nonnull instancetype)initWithURLRequest:(nonnull NSURLRequest *)request protocols:(nullable NSArray<NSString *> *)protocols  NS_DESIGNATED_INITIALIZER;

/**
 *  @brief 开启socket
 */
- (void)open;

/**
 *  @brief 客户端关闭socket
 *  @param code     状态码:正常关闭为0
 *  @param reason   原因描述:正常为 nil
 */
- (void)closeWithCode:(NSInteger)code reason:(nullable NSString *)reason;

/**
 *  @brief 发送消息,NSString
 *
 *  @param string UTF8 字符串
 */
- (void)sendString:(nullable NSString *)string;

/**
 *  @brief 发送消息,NSData
 *
 *  @param data 二进制数据
 */
- (void)sendData:(nullable NSData *)data;

@end