From 1beb71132a03c8d737e9b0ee3c824a8ae681cf6b Mon Sep 17 00:00:00 2001 From: TurtIeSocks <58572875+TurtIeSocks@users.noreply.github.com> Date: Fri, 29 Apr 2022 23:45:15 -0400 Subject: [PATCH 1/2] Add Fetch Timeout --- server/src/configs/default.json | 3 ++- server/src/services/api/fetchJson.js | 14 +++++++++++++- server/src/services/api/scannerApi.js | 16 +++++++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/server/src/configs/default.json b/server/src/configs/default.json index eeb09204a..daea6f68e 100644 --- a/server/src/configs/default.json +++ b/server/src/configs/default.json @@ -67,7 +67,8 @@ "gymValidDataLimit": 30, "hideOldGyms": false, "stopValidDataLimit": 30, - "hideOldPokestops": false + "hideOldPokestops": false, + "fetchTimeoutMs": 3000 }, "multiDomains": [], "map": { diff --git a/server/src/services/api/fetchJson.js b/server/src/services/api/fetchJson.js index 1e3ddd3a9..68b8da0a2 100644 --- a/server/src/services/api/fetchJson.js +++ b/server/src/services/api/fetchJson.js @@ -1,7 +1,15 @@ /* eslint-disable no-console */ const fetch = require('node-fetch') +const { AbortError } = require('node-fetch') +const { api } = require('../config') module.exports = async function fetchJson(url, options = undefined, log = false) { + const controller = new AbortController() + + const timeout = setTimeout(() => { + controller.abort() + }, api.fetchTimeoutMs) + try { if (log) console.log(url, options) const response = await fetch(url, options) @@ -10,11 +18,15 @@ module.exports = async function fetchJson(url, options = undefined, log = false) } return response.json() } catch (e) { - if (log) { + if (e instanceof AbortError) { + console.log('Request to', url, 'timed out and was aborted') + } else if (log) { console.warn(e) } else { console.warn(e.message, '\n', e.code, `\nUnable to fetch ${url}`) } return null + } finally { + clearTimeout(timeout) } } diff --git a/server/src/services/api/scannerApi.js b/server/src/services/api/scannerApi.js index a11237911..4b2e67062 100644 --- a/server/src/services/api/scannerApi.js +++ b/server/src/services/api/scannerApi.js @@ -1,5 +1,7 @@ /* eslint-disable no-console */ const fetch = require('node-fetch') +const { AbortError } = require('node-fetch') + const config = require('../config') const scannerQueue = { @@ -8,6 +10,12 @@ const scannerQueue = { } module.exports = async function scannerApi(category, method, data = null) { + const controller = new AbortController() + + const timeout = setTimeout(() => { + controller.abort() + }, config.api.fetchTimeoutMs) + try { const headers = {} switch (config.scanner.backendConfig.platform) { @@ -88,7 +96,13 @@ module.exports = async function scannerApi(category, method, data = null) { return { status: 'error', message: 'scanner_error' } } } catch (e) { - console.log('[scannerApi] There was a problem processing that scanner request') + if (e instanceof AbortError) { + console.log('Request to the scanner timed out and was aborted') + } else { + console.log('[scannerApi] There was a problem processing that scanner request') + } return { status: 'error', message: 'scanner_error' } + } finally { + clearTimeout(timeout) } } From fc8c7f025ac4340393577da818a1586e1838204f Mon Sep 17 00:00:00 2001 From: TurtIeSocks <58572875+TurtIeSocks@users.noreply.github.com> Date: Sat, 30 Apr 2022 21:33:36 -0400 Subject: [PATCH 2/2] Update fetchJson.js --- server/src/services/api/fetchJson.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/src/services/api/fetchJson.js b/server/src/services/api/fetchJson.js index 68b8da0a2..7e323c2d2 100644 --- a/server/src/services/api/fetchJson.js +++ b/server/src/services/api/fetchJson.js @@ -1,14 +1,13 @@ /* eslint-disable no-console */ const fetch = require('node-fetch') const { AbortError } = require('node-fetch') -const { api } = require('../config') module.exports = async function fetchJson(url, options = undefined, log = false) { const controller = new AbortController() const timeout = setTimeout(() => { controller.abort() - }, api.fetchTimeoutMs) + }, 5000) try { if (log) console.log(url, options)