package com.xcong.excoin.modules.okxApi.wsHandler;
import com.alibaba.fastjson.JSONObject;
import org.java_websocket.client.WebSocketClient;
/**
* OKX WebSocket 频道处理器接口。
*
*
定位
* 每个 OKX 频道对应一个实现类。新增频道只需实现此接口,
* 然后通过 {@code OkxKlineWebSocketClient.addPublicHandler()} 或
* {@code addPrivateHandler()} 注册即可。
*
* 与 Gate 版本的区别
* OKX 的公开频道和私有频道使用不同的 WebSocket 端点(public/private),
* 订阅格式为 {@code {"op":"subscribe","args":[{"channel":"candle1m","instId":"ETH-USDT-SWAP"}]}},
* 与 Gate 的 {@code event/payload} 格式不同。
*
* 实现类
*
* - {@code CandlestickOkxChannelHandler} — 公开频道,K线数据
* - {@code AbstractOkxPrivateChannelHandler} — 私有频道抽象基类(separate WS + login auth)
* - {@code PositionsOkxChannelHandler} — 私有频道,仓位更新
* - {@code OrderAlgoOkxChannelHandler} — 私有频道,条件订单(algo)状态推送
*
*
* OKX 订阅确认格式
* {@code {"event":"subscribe","arg":{"channel":"candle1m"}}} 表示订阅成功。
*
* OKX 数据推送格式
* {@code {"arg":{"channel":"positions","instType":"SWAP"},"data":[...]}}。
*
* @author Administrator
*/
public interface OkxChannelHandler {
/**
* 频道名称,如 {@code "candle1m"}、{@code "positions"}、{@code "orders-algo"}。
*
* @return OKX 频道标识字符串
*/
String getChannelName();
/**
* 交易对标识,如 {@code "ETH-USDT-SWAP"}。
* OKX 订阅需要 instId 参数来指定订阅的交易对。
*
* @return OKX 格式的交易对标识
*/
String getInstId();
/**
* 发送订阅请求到指定的 WebSocket 连接。
*
* 公开频道格式
*
* {"op":"subscribe","args":[{"channel":"candle1m","instId":"ETH-USDT-SWAP"}]}
*
*
* 私有频道格式
*
* {"op":"subscribe","args":[{"channel":"positions","instType":"SWAP"}]}
*
*
* @param ws 目标 WebSocket 客户端(公开或私有端点)
*/
void subscribe(WebSocketClient ws);
/**
* 发送取消订阅请求到指定的 WebSocket 连接。
*
* @param ws 目标 WebSocket 客户端
*/
void unsubscribe(WebSocketClient ws);
/**
* 处理频道推送消息。
*
* 路由规则
* 如果消息的 {@code arg.channel} 匹配当前处理器的频道名,
* 则提取 {@code data} 数组并处理业务逻辑,返回 {@code true};
* 否则返回 {@code false}(让路由器继续遍历其他 handler)。
*
* @param response WebSocket 推送的完整 JSON
* @return true 表示已处理(循环停止),false 表示频道不匹配(继续遍历下一个 handler)
*/
boolean handleMessage(JSONObject response);
/**
* 是否已收到订阅成功确认(即收到 {@code event:"subscribe"} 响应)。
*
* @return true 表示订阅已确认
*/
boolean isSubscribed();
/**
* 标记订阅已确认/未确认。
*
* @param subscribed true=已确认,false=未确认
*/
void setSubscribed(boolean subscribed);
}