I am connecting to gateio websocket servers with the nodejs code below. Authentication works correctly when connecting to the futures.usertrades channel. But I am getting unexpected errors when connecting to the futures.login channel.
import ReconnectingWebSocket from 'reconnecting-websocket';
import IsomorphicWS from 'isomorphic-ws';
import CryptoJS from 'crypto-js';
import GateAPI from 'gate-api';
let client = new GateAPI.ApiClient();
let rws;
let initialize = () => {
return new Promise((resolve) => {
rws = new ReconnectingWebSocket(`wss://fx-ws.gateio.ws/v4/ws/usdt`, [], {
WebSocket: IsomorphicWS,
debug: false,
maxReconnectionDelay: 10000,
maxRetries: Number.POSITIVE_INFINITY,
minReconnectionDelay: 5000,
minUptime: 7500,
connectionTimeout: 15000,
startClosed: true,
});
rws.addEventListener('close', wsClose);
rws.addEventListener('open', () => {
wsOpen();
return resolve(rws);
});
rws.reconnect();
});
};
let pong = () => {
return rws._ws.pong(function () {
return null;
});
};
let wsClose = () => {
rws.reconnect();
};
let wsOpen = () => {
if (rws._ws.on) {
rws._ws.on('ping', pong);
}
};
let data = {
apiKey: 'xxx',
apiSecret: 'yyy',
userId: 11110001,
};
initialize(data).then((RWS) => {
client.setApiKeySecret(data.apiKey, data.apiSecret);
let spot = new GateAPI.SpotApi(client);
let now = new Date().getTime();
spot.getSystemTime().then((result) => {
let processTime = new Date().getTime() - now;
let serverTime = result.body.serverTime;
RWS.addEventListener('message', (message) => {
console.log(message.data);
});
let timeStamp = Math.ceil((serverTime + processTime) / 1000);
let signatureString = `channel=futures.usertrades&event=subscribe&time=${timeStamp}`;
let signature = CryptoJS.HmacSHA512(signatureString, data.apiSecret).toString(
CryptoJS.enc.Hex
);
let auth = {
method: 'api_key',
KEY: data.apiKey,
SIGN: signature,
};
rws.send(
JSON.stringify({
time: timeStamp,
channel: 'futures.usertrades',
event: 'subscribe',
payload: [`${data.userId}`, '!all'],
auth,
})
);
signatureString = `channel=futures.login&event=api&req_param=&time=${timeStamp}`;
signature = CryptoJS.HmacSHA512(signatureString, data.apiSecret).toString(CryptoJS.enc.Hex);
let payload = {
req_id: 'api_request_id_1',
api_key: data.apiKey,
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
'Channel-ID': 'api_request_id_1',
},
signature: signature,
timestamp: timeStamp.toString(),
req_param: [],
};
let postData = JSON.stringify({
time: `${timeStamp}`,
id: 1,
channel: 'futures.login',
event: 'api',
payload,
});
rws.send(postData);
});
});
websocket futures.usertrades response;
{"time":1720051095,"time_ms":1720051095630,"conn_id":"61f6a33a935376da","trace_id":"2b3cf8924025c2d866e781c72775680c","channel":"futures.usertrades","event":"subscribe","payload":["11110001","!all"],"result":{"status":"success"}}
websocket futures.login response;
{"time":1720051095,"time_ms":1720051095632,"conn_id":"61f6a33a935376da","trace_id":"84ed781186f1da73ad60107c9e27386d","channel":"","event":"","error":{"code":1,"message":"request message need JSON scheme"},"result":{"status":"fail"}}
What am I missing or doing wrong. Thank you.