/* eslint-disable */ const fetch_ = require('node-fetch'); const fetchWithTimeout = async (url, options, timeout) => { const controller = new AbortController(); const id = setTimeout(() => controller.abort(), timeout); const response = await fetch(url, { ...options, signal: controller.signal, }); clearTimeout(id); return response; }; const readStream = (stream, timeout = 5000) => { let str = ''; let timer; return new Promise((resolve, reject) => { stream.on('data', (chunk) => { str += chunk.toString(); }); stream.on('end', () => { clearTimeout(timer); resolve(str); }); stream.on('error', (err) => { clearTimeout(timer); reject(err); }); timer = setTimeout(() => { stream.destroy(new Error('Stream timed out')); }, timeout); }); }; const readStreamWithReader = async (stream, timeout = 5000) => { let str = ''; const reader = stream.getReader(); let timer; try { timer = setTimeout(() => { reader.cancel(new Error('Stream timed out')); }, timeout); let result; while (!(result = await reader.read()).done) { str += result.value.toString(); } console.log('last result was', result, reader.); return str; } catch (error) { console.error('Error:', error.message); } finally { clearTimeout(timer); reader.releaseLock(); } }; const testFetch = async () => { let response, result, start; console.log('Scenario 1:'); start = Date.now(); response = await fetchWithTimeout('http://localhost:3003', {}, 15000); console.log('Response!', response.status); result = await readStream(response.body, 15000); // result = await response.text(); console.log('read', result, 'in', Date.now() - start, 'ms'); console.log('Scenario 2:'); start = Date.now(); try { response = await fetchWithTimeout('http://localhost:3003', {}, 500); console.log('Response!', response.status); result = await readStreamWithReader(response.body, 500); // result = await response.text(); } catch (error) { console.log('Request cancelled before 1 second'); } console.log('finished in', Date.now() - start, 'ms'); console.log('Scenario 3:'); start = Date.now(); try { response = await fetchWithTimeout('http://localhost:3003', {}, 5000); console.log('Response!', response.status); result = await readStreamWithReader(response.body, 5000); // result = await response.text(); } catch (error) { console.log('Request cancelled after 1 second but before 30 seconds', error); } console.log('finished in', Date.now() - start, 'ms'); }; testFetch();