diff --git a/server/src/configs/default.json b/server/src/configs/default.json index e530f5768..94a4f26ea 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..7e323c2d2 100644 --- a/server/src/services/api/fetchJson.js +++ b/server/src/services/api/fetchJson.js @@ -1,7 +1,14 @@ /* eslint-disable no-console */ const fetch = require('node-fetch') +const { AbortError } = require('node-fetch') module.exports = async function fetchJson(url, options = undefined, log = false) { + const controller = new AbortController() + + const timeout = setTimeout(() => { + controller.abort() + }, 5000) + try { if (log) console.log(url, options) const response = await fetch(url, options) @@ -10,11 +17,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) } }