* Margin Userdata websockets function * @param {function} all_updates_callback * @param {function} execution_callback - optional execution callback * @param {function} subscribed_callback - subscription callback * @param {function} list_status_callback - status callback * @r
(all_updates_callback?: Callback, balance_callback?: Callback, execution_callback?: Callback, subscribed_callback?: Callback, list_status_callback?: Callback)
| 6168 | * @return {undefined} |
| 6169 | */ |
| 6170 | userMarginData(all_updates_callback?: Callback, balance_callback?: Callback, execution_callback?: Callback, subscribed_callback?: Callback, list_status_callback?: Callback) { |
| 6171 | const self = this; |
| 6172 | const reconnect = () => { |
| 6173 | if (this.Options.reconnect) this.userMarginData(all_updates_callback, balance_callback, execution_callback, subscribed_callback, list_status_callback); |
| 6174 | }; |
| 6175 | |
| 6176 | // Set up callbacks |
| 6177 | this.Options.margin_all_updates_callback = all_updates_callback; |
| 6178 | this.Options.margin_balance_callback = balance_callback; |
| 6179 | this.Options.margin_execution_callback = execution_callback; |
| 6180 | this.Options.margin_list_status_callback = list_status_callback; |
| 6181 | |
| 6182 | // Get listenToken from REST API |
| 6183 | this.apiRequest(this.sapi + 'v1/userListenToken', {}, 'POST').then((response: any) => { |
| 6184 | const listenToken = response.token; |
| 6185 | const expirationTime = response.expirationTime; |
| 6186 | this.Options.marginListenToken = listenToken; |
| 6187 | this.Options.marginListenTokenExpiry = expirationTime; |
| 6188 | |
| 6189 | if (this.Options.verbose) { |
| 6190 | this.Options.log(`Margin listenToken obtained, expires at: ${new Date(expirationTime).toISOString()}`); |
| 6191 | } |
| 6192 | |
| 6193 | // Connect to WebSocket API |
| 6194 | const connectionId = 'userMarginData'; |
| 6195 | const ws = this.connectWsApi(connectionId, this.userMarginDataHandler.bind(this), reconnect); |
| 6196 | |
| 6197 | ws.on('open', async () => { |
| 6198 | try { |
| 6199 | // Subscribe using userDataStream.subscribe.listenToken method |
| 6200 | const result = await this.sendWsApiRequest(connectionId, 'userDataStream.subscribe.listenToken', { |
| 6201 | listenToken: listenToken |
| 6202 | }); |
| 6203 | |
| 6204 | this.Options.marginDataSubscriptionId = result.subscriptionId; |
| 6205 | const subscriptionExpiry = result.expirationTime; |
| 6206 | |
| 6207 | if (this.Options.verbose) { |
| 6208 | this.Options.log(`Margin Data Stream subscribed with subscriptionId: ${result.subscriptionId}`); |
| 6209 | this.Options.log(`Subscription expires at: ${new Date(subscriptionExpiry).toISOString()}`); |
| 6210 | } |
| 6211 | |
| 6212 | // Set up renewal before expiration (renew 5 minutes before expiry) |
| 6213 | const renewalTime = subscriptionExpiry - Date.now() - (5 * 60 * 1000); |
| 6214 | if (renewalTime > 0) { |
| 6215 | setTimeout(async function renewSubscription() { |
| 6216 | try { |
| 6217 | // Get new listenToken |
| 6218 | const renewResponse: any = await self.apiRequest(self.sapi + 'v1/userListenToken', {}, 'POST'); |
| 6219 | const newListenToken = renewResponse.token; |
| 6220 | const newExpirationTime = renewResponse.expirationTime; |
| 6221 | |
| 6222 | if (self.Options.verbose) { |
| 6223 | self.Options.log(`New margin listenToken obtained, expires at: ${new Date(newExpirationTime).toISOString()}`); |
| 6224 | } |
| 6225 | |
| 6226 | // Re-subscribe with new token |
| 6227 | const renewResult = await self.sendWsApiRequest(connectionId, 'userDataStream.subscribe.listenToken', { |
no test coverage detected