Path: blob/master/bitget-php-sdk-api/src/internal/BitgetWsHandle.php
518 views
<?php123namespace bitget\internal;456use bitget\Config;7use bitget\model\ws\SubscribeReq;8use bitget\model\ws\WsBaseReq;9use bitget\model\ws\WsLoginReq;10use WebSocket\BadOpcodeException;11use WebSocket\Client;12use Workerman\Connection\AsyncTcpConnection;13use Workerman\Lib\Timer;14use Workerman\Worker;1516class BitgetWsHandle extends Config implements BitgetWsClient17{18const WS_OP_LOGIN = "login";19const WS_OP_SUBSCRIBE = "subscribe";20const WS_OP_UNSUBSCRIBE = "unsubscribe";2122public Client $client;2324private BitgetClientBuilder $bitgetClientBuilder;2526private Listener $listener;2728private bool $connectStatus;2930private bool $loginStatus;3132private Utils $utils;3334private array $allSuribe;3536private array $scribeMap;3738/**39* BitegetWsClient constructor.40* @param BitgetClientBuilder $bitgetClientBuilder41*/42public function __construct(BitgetClientBuilder $bitgetClientBuilder)43{44$this->initClient($bitgetClientBuilder);454647}4849public function initClient(BitgetClientBuilder $bitgetClientBuilder): void50{51$this->bitgetClientBuilder = $bitgetClientBuilder;52$this->connectStatus = false;53$this->loginStatus = false;54$this->utils = new Utils();5556$this->client = new Client(self::websocketUrl);5758$this->sendTextMessage("ping");5960if ($this->bitgetClientBuilder->isLogin) {61$this->login();62}63$this->initTimer();64// $this->initWorker();6566}6768public function startWorker()69{70$worker = new Worker();71$worker->onWorkerStart = function () {72while (true) {73try {74$this->connectStatus = true;75$message = $this->client->receive();7677if ($message == "pong") {78print_r($message . "\n");79Utils::printLog("Keep connected:" . $message, "INFO");80continue;81}8283$jsonObject = json_decode($message);8485if ($jsonObject->code ?? false && $jsonObject->code != "0") {86if ($this->bitgetClientBuilder->errorListener != null) {87$this->bitgetClientBuilder->errorListener->recevie($message);88}89continue;90}9192if ($jsonObject->event ?? false && $jsonObject->event == "login") {93Utils::printLog("login msg:" . $message, "INFO");94$this->loginStatus = true;95continue;96}9798if($jsonObject->data ?? false){99$listener = $this->getListener($jsonObject);100101if($listener != null){102$listener->recevie($message);103continue;104}105106$this->bitgetClientBuilder->listener->recevie($message);107continue;108}109110Utils::printLog("receive op msg:" . $message, "INFO");111} catch (\Exception $e) {112}113}114};115Worker::runAll();116}117118public static function builder(): BitgetClientBuilder119{120return new BitgetClientBuilder();121}122123public function sendMessage(WsBaseReq $baseReq): void124{125$data = json_encode($baseReq);126$this->sendTextMessage($data);127}128129public function sendTextMessage(string $message): void130{131132try {133$this->client->send($message);134} catch (BadOpcodeException $e) {135$this->reconnect();136}137}138139public function reconnect()140{141$this->initClient($this->bitgetClientBuilder);142$this->subscribeDef($this->allSuribe);143}144145146public function unsubscribe(array $req): void147{148149foreach ($req as $value) {150unset($this->allSuribe[$value->toString()]);151}152153$this->sendMessage(new WsBaseReq(self::WS_OP_UNSUBSCRIBE, $req));154}155156public function subscribe(array $req, Listener $listener): void157{158foreach ($req as $value) {159$this->scribeMap[$value->toString()] = $listener;160}161$this->subscribeDef($req);162}163164public function subscribeDef(array $req): void165{166foreach ($req as $value) {167$this->allSuribe[$value->toString()] = "1";168}169print_r($this->allSuribe . "\n");170$this->sendMessage(new WsBaseReq(self::WS_OP_SUBSCRIBE, $req));171}172173public function getListener($jsonObject): ?Listener174{175try{176if($jsonObject->arg ?? false){177$argJson = $jsonObject->arg;178179$req = new SubscribeReq($argJson->instType,$argJson->channel,$argJson->instId);180181foreach ($this->scribeMap as $key=>$value){182if($req->toString() == $key){183return $value;184}185}186187}188189}catch (\Exception $e){190191}192return null;193}194195196public function login(): void197{198$timeStamp = Utils::getTimestamp() / 1000;199$sign = Utils::getSign($timeStamp, "GET", "/user/verify", "", self::apiSecret);200201$wsLoginReq = new WsLoginReq(self::apiKey, self::passphrase, $timeStamp, $sign);202203$args = array($wsLoginReq);204205$wsBaseReq = new WsBaseReq(self::WS_OP_LOGIN, $args);206207$this->sendMessage($wsBaseReq);208209}210211212private function initTimer()213{214Timer::add(5, function () {215$this->client->send("ping");216});217}218219220}221222