From 26ac8265be9e153f4f4064e3e233657791203820 Mon Sep 17 00:00:00 2001 From: GarboMuffin Date: Fri, 7 Jul 2023 19:46:18 -0500 Subject: [PATCH 1/2] Clear abort timeout in fetchWithTimeout if fetch fails --- src/util/fetch-with-timeout.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/util/fetch-with-timeout.js b/src/util/fetch-with-timeout.js index 983c888b3b..41dbd0fc88 100644 --- a/src/util/fetch-with-timeout.js +++ b/src/util/fetch-with-timeout.js @@ -15,6 +15,9 @@ const fetchWithTimeout = (resource, init, timeout) => { fetch(resource, Object.assign({signal}, init)).then(response => { clearTimeout(timeoutID); return response; + }, error => { + clearTimeout(timeoutID); + throw error; }), new Promise((resolve, reject) => { timeoutID = setTimeout(() => { From a515991c3777d370600d899b2fd8a636bf76a15c Mon Sep 17 00:00:00 2001 From: GarboMuffin Date: Tue, 4 Jul 2023 13:00:15 -0500 Subject: [PATCH 2/2] Return original message if translation request fails For games that put their entire interface through translate blocks, this allows them to be more usable when no internet connection is present. Has convenient side effect of breaking some online detectors. --- src/extensions/scratch3_translate/index.js | 2 +- test/unit/tw_translate.js | 23 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 test/unit/tw_translate.js diff --git a/src/extensions/scratch3_translate/index.js b/src/extensions/scratch3_translate/index.js index e072710efe..1310bc3189 100644 --- a/src/extensions/scratch3_translate/index.js +++ b/src/extensions/scratch3_translate/index.js @@ -278,7 +278,7 @@ class Scratch3TranslateBlocks { }) .catch(err => { log.warn(`error fetching translate result! ${err}`); - return ''; + return args.WORDS; }); return translatePromise; } diff --git a/test/unit/tw_translate.js b/test/unit/tw_translate.js new file mode 100644 index 0000000000..b0f7bcbd54 --- /dev/null +++ b/test/unit/tw_translate.js @@ -0,0 +1,23 @@ +const {test} = require('tap'); +const Scratch3TranslateBlocks = require('../../src/extensions/scratch3_translate/index'); + +global.navigator = { + language: 'en' +}; + +// Translate tries to access AbortController from window, but does not require it to exist. +global.window = {}; + +test('translate returns original string on network error', t => { + t.plan(1); + + // Simulate the network being down or filtered + global.fetch = () => Promise.reject(new Error('Simulated network error')); + + const extension = new Scratch3TranslateBlocks(); + extension.getTranslate({WORDS: 'My message 123123', LANGUAGE: 'es'}) + .then(message => { + t.equal(message, 'My message 123123'); + t.end(); + }); +});