From d7c4d4be15a8b353b638c2390982dc6d4824ccb6 Mon Sep 17 00:00:00 2001 From: Douglas Barone Date: Mon, 8 Nov 2021 08:33:54 -0400 Subject: [PATCH] Added cancellation by timeout --- server/src/lib/ciscoController.js | 83 +++++++++++++++++++------------ 1 file changed, 51 insertions(+), 32 deletions(-) diff --git a/server/src/lib/ciscoController.js b/server/src/lib/ciscoController.js index d15f581..4cb81d1 100644 --- a/server/src/lib/ciscoController.js +++ b/server/src/lib/ciscoController.js @@ -1,8 +1,11 @@ -import { create } from 'axios' +import { create, CancelToken } from 'axios' import https from 'https' import { ouiFinder } from '../utils/ouiFinder' import { logError } from './logger' +const TIMEOUT_IN_MS = 120000 +const REQUEST_TIMEOUT_IN_MS = 20000 + const httpsAgent = new https.Agent({ rejectUnauthorized: false, ciphers: 'AES256-SHA' // That's necessary to connect to a TLS 1.0 server. Run node with --tls-min-v1.0 @@ -10,55 +13,71 @@ const httpsAgent = new https.Agent({ const axios = create({ httpsAgent: httpsAgent, + timeout: REQUEST_TIMEOUT_IN_MS, auth: { username: process.env.CISCO_USER, password: process.env.CISCO_PASSWORD } }) -const getUri = (skip, page, take) => +const getUrl = (skip, page, take) => `https://${process.env.CISCO_HOST}/data/client-table.html?columns=524287&take=${take}&skip=${skip}&page=${page}&pageSize=50&sort[0][field]=ST&sort[0][dir]=desc` -async function getDevices() { - let skip = 0 - let page = 1 - const take = 50 +function getDevices() { + return new Promise(async (resolve, reject) => { + const source = CancelToken.source() - const responsesPromises = [] + const timeout = setTimeout(() => { + source.cancel('timeout') + reject(new Error('A operação getDevices foi cancelada pelo tempo limite')) + }, TIMEOUT_IN_MS) - try { - let devices = [] - let url = getUri(skip, page, take) - const firstResponse = await axios.get(url) - const { total, data: page1devices } = firstResponse.data + let skip = 0 + let page = 1 + const take = 50 - devices = devices.concat(page1devices) + const responsesPromises = [] - do { + try { + const firstResponse = await axios.get(getUrl(skip, page, take), { + cancelToken: source.token + }) + + const { total, data: page1devices } = firstResponse.data + + let devices = page1devices skip += take - page++ - let uri = getUri(skip, page, take) + while (total > skip) { + responsesPromises.push( + axios.get(getUrl(skip, page, take), { + cancelToken: source.token + }) + ) - responsesPromises.push(axios.get(uri)) - } while (total > skip) + skip += take + page++ + } - const responses = await Promise.all(responsesPromises) + const responses = await Promise.all(responsesPromises) - responses.forEach( - ({ data: { data: pageDevices } }) => - (devices = devices.concat(pageDevices)) - ) + clearTimeout(timeout) - return devices - } catch (e) { - logError({ - tags: ['cisco', 'wifiDevices'], - message: e.message, - data: { ...e, config: { ...e.config, auth: '*****' } } - }) - return [] - } + responses.forEach( + ({ data: { data: pageDevices } }) => + (devices = devices.concat(pageDevices)) + ) + + resolve(devices) + } catch (e) { + logError({ + tags: ['cisco', 'wifiDevices'], + message: e.message, + data: { ...e, config: { ...e.config, auth: '*****' } } + }) + reject(e) + } + }) } export async function getOnlineWifiDevices() {