Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bitgetlimited
GitHub Repository: bitgetlimited/v3-bitget-api-sdk
Path: blob/master/bitget-php-sdk-api/src/internal/BitgetWsHandle.php
518 views
1
<?php
2
3
4
namespace bitget\internal;
5
6
7
use bitget\Config;
8
use bitget\model\ws\SubscribeReq;
9
use bitget\model\ws\WsBaseReq;
10
use bitget\model\ws\WsLoginReq;
11
use WebSocket\BadOpcodeException;
12
use WebSocket\Client;
13
use Workerman\Connection\AsyncTcpConnection;
14
use Workerman\Lib\Timer;
15
use Workerman\Worker;
16
17
class BitgetWsHandle extends Config implements BitgetWsClient
18
{
19
const WS_OP_LOGIN = "login";
20
const WS_OP_SUBSCRIBE = "subscribe";
21
const WS_OP_UNSUBSCRIBE = "unsubscribe";
22
23
public Client $client;
24
25
private BitgetClientBuilder $bitgetClientBuilder;
26
27
private Listener $listener;
28
29
private bool $connectStatus;
30
31
private bool $loginStatus;
32
33
private Utils $utils;
34
35
private array $allSuribe;
36
37
private array $scribeMap;
38
39
/**
40
* BitegetWsClient constructor.
41
* @param BitgetClientBuilder $bitgetClientBuilder
42
*/
43
public function __construct(BitgetClientBuilder $bitgetClientBuilder)
44
{
45
$this->initClient($bitgetClientBuilder);
46
47
48
}
49
50
public function initClient(BitgetClientBuilder $bitgetClientBuilder): void
51
{
52
$this->bitgetClientBuilder = $bitgetClientBuilder;
53
$this->connectStatus = false;
54
$this->loginStatus = false;
55
$this->utils = new Utils();
56
57
$this->client = new Client(self::websocketUrl);
58
59
$this->sendTextMessage("ping");
60
61
if ($this->bitgetClientBuilder->isLogin) {
62
$this->login();
63
}
64
$this->initTimer();
65
// $this->initWorker();
66
67
}
68
69
public function startWorker()
70
{
71
$worker = new Worker();
72
$worker->onWorkerStart = function () {
73
while (true) {
74
try {
75
$this->connectStatus = true;
76
$message = $this->client->receive();
77
78
if ($message == "pong") {
79
print_r($message . "\n");
80
Utils::printLog("Keep connected:" . $message, "INFO");
81
continue;
82
}
83
84
$jsonObject = json_decode($message);
85
86
if ($jsonObject->code ?? false && $jsonObject->code != "0") {
87
if ($this->bitgetClientBuilder->errorListener != null) {
88
$this->bitgetClientBuilder->errorListener->recevie($message);
89
}
90
continue;
91
}
92
93
if ($jsonObject->event ?? false && $jsonObject->event == "login") {
94
Utils::printLog("login msg:" . $message, "INFO");
95
$this->loginStatus = true;
96
continue;
97
}
98
99
if($jsonObject->data ?? false){
100
$listener = $this->getListener($jsonObject);
101
102
if($listener != null){
103
$listener->recevie($message);
104
continue;
105
}
106
107
$this->bitgetClientBuilder->listener->recevie($message);
108
continue;
109
}
110
111
Utils::printLog("receive op msg:" . $message, "INFO");
112
} catch (\Exception $e) {
113
}
114
}
115
};
116
Worker::runAll();
117
}
118
119
public static function builder(): BitgetClientBuilder
120
{
121
return new BitgetClientBuilder();
122
}
123
124
public function sendMessage(WsBaseReq $baseReq): void
125
{
126
$data = json_encode($baseReq);
127
$this->sendTextMessage($data);
128
}
129
130
public function sendTextMessage(string $message): void
131
{
132
133
try {
134
$this->client->send($message);
135
} catch (BadOpcodeException $e) {
136
$this->reconnect();
137
}
138
}
139
140
public function reconnect()
141
{
142
$this->initClient($this->bitgetClientBuilder);
143
$this->subscribeDef($this->allSuribe);
144
}
145
146
147
public function unsubscribe(array $req): void
148
{
149
150
foreach ($req as $value) {
151
unset($this->allSuribe[$value->toString()]);
152
}
153
154
$this->sendMessage(new WsBaseReq(self::WS_OP_UNSUBSCRIBE, $req));
155
}
156
157
public function subscribe(array $req, Listener $listener): void
158
{
159
foreach ($req as $value) {
160
$this->scribeMap[$value->toString()] = $listener;
161
}
162
$this->subscribeDef($req);
163
}
164
165
public function subscribeDef(array $req): void
166
{
167
foreach ($req as $value) {
168
$this->allSuribe[$value->toString()] = "1";
169
}
170
print_r($this->allSuribe . "\n");
171
$this->sendMessage(new WsBaseReq(self::WS_OP_SUBSCRIBE, $req));
172
}
173
174
public function getListener($jsonObject): ?Listener
175
{
176
try{
177
if($jsonObject->arg ?? false){
178
$argJson = $jsonObject->arg;
179
180
$req = new SubscribeReq($argJson->instType,$argJson->channel,$argJson->instId);
181
182
foreach ($this->scribeMap as $key=>$value){
183
if($req->toString() == $key){
184
return $value;
185
}
186
}
187
188
}
189
190
}catch (\Exception $e){
191
192
}
193
return null;
194
}
195
196
197
public function login(): void
198
{
199
$timeStamp = Utils::getTimestamp() / 1000;
200
$sign = Utils::getSign($timeStamp, "GET", "/user/verify", "", self::apiSecret);
201
202
$wsLoginReq = new WsLoginReq(self::apiKey, self::passphrase, $timeStamp, $sign);
203
204
$args = array($wsLoginReq);
205
206
$wsBaseReq = new WsBaseReq(self::WS_OP_LOGIN, $args);
207
208
$this->sendMessage($wsBaseReq);
209
210
}
211
212
213
private function initTimer()
214
{
215
Timer::add(5, function () {
216
$this->client->send("ping");
217
});
218
}
219
220
221
}
222