diff --git a/addon/lib/promises.js b/addon/lib/promises.js new file mode 100644 index 0000000..dc501f2 --- /dev/null +++ b/addon/lib/promises.js @@ -0,0 +1,22 @@ +/** + * Delay promise + */ +async function delay(duration) { + return new Promise((resolve) => setTimeout(resolve, duration)); +} + +/** + * Timeout promise after a set time in ms + */ +async function timeout(timeoutMs, promise, message = 'Timed out') { + return Promise.race([ + promise, + new Promise(function (resolve, reject) { + setTimeout(function () { + reject(message); + }, timeoutMs); + }) + ]); +} + +module.exports = { delay, timeout }; \ No newline at end of file diff --git a/addon/moch/debridlink.js b/addon/moch/debridlink.js index 630b7db..d344909 100644 --- a/addon/moch/debridlink.js +++ b/addon/moch/debridlink.js @@ -1,10 +1,10 @@ const DebridLinkClient = require('debrid-link-api'); const { Type } = require('../lib/types'); const { isVideo, isArchive } = require('../lib/extension'); +const { delay } = require('../lib/promises'); const StaticResponse = require('./static'); const { getMagnetLink } = require('../lib/magnetHelper'); const { chunkArray, BadTokenError } = require('./mochHelper'); -const delay = require('./delay'); const KEY = 'debridlink'; diff --git a/addon/moch/delay.js b/addon/moch/delay.js deleted file mode 100644 index 69e7710..0000000 --- a/addon/moch/delay.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = duration => new Promise((resolve) => setTimeout(resolve, duration)); \ No newline at end of file diff --git a/addon/moch/moch.js b/addon/moch/moch.js index 4836c4a..1f3214d 100644 --- a/addon/moch/moch.js +++ b/addon/moch/moch.js @@ -7,8 +7,10 @@ const debridlink = require('./debridlink'); const putio = require('./putio'); const StaticResponse = require('./static'); const { cacheWrapResolvedUrl } = require('../lib/cache'); +const { timeout } = require('../lib/promises'); const { BadTokenError } = require('./mochHelper'); +const RESOLVE_TIMEOUT = 10 * 60 * 1000; // 10 minutes const MIN_API_KEY_SYMBOLS = 15; const TOKEN_BLACKLIST = []; const RESOLVER_HOST = process.env.RESOLVER_HOST || 'http://localhost:7050'; @@ -87,12 +89,11 @@ async function resolve(parameters) { return Promise.reject("No valid parameters passed"); } const id = `${parameters.mochKey}_${parameters.apiKey}_${parameters.infoHash}_${parameters.fileIndex}`; - const method = () => cacheWrapResolvedUrl(id, () => moch.instance.resolve(parameters)) + const method = () => timeout(RESOLVE_TIMEOUT, cacheWrapResolvedUrl(id, () => moch.instance.resolve(parameters))) .catch(error => { console.warn(error); return StaticResponse.FAILED_UNEXPECTED; }); - console.log(`Starting [${parameters.infoHash}] link resolve with queue size: ${unrestrictQueue.length()}`); return new Promise(((resolve, reject) => { unrestrictQueue.push({ id, method }, (error, result) => result ? resolve(result) : reject(error)); })); diff --git a/addon/moch/putio.js b/addon/moch/putio.js index dd03f0e..4a54082 100644 --- a/addon/moch/putio.js +++ b/addon/moch/putio.js @@ -1,6 +1,6 @@ const PutioAPI = require('@putdotio/api-client').default const { isVideo } = require('../lib/extension'); -const delay = require('./delay'); +const { delay } = require('../lib/promises'); const StaticResponse = require('./static'); const { getMagnetLink } = require('../lib/magnetHelper'); diff --git a/addon/moch/realdebrid.js b/addon/moch/realdebrid.js index a0fbe59..f8968d1 100644 --- a/addon/moch/realdebrid.js +++ b/addon/moch/realdebrid.js @@ -1,7 +1,7 @@ const RealDebridClient = require('real-debrid-api'); const { Type } = require('../lib/types'); const { isVideo, isArchive } = require('../lib/extension'); -const delay = require('./delay'); +const { delay } = require('../lib/promises'); const StaticResponse = require('./static'); const { getMagnetLink } = require('../lib/magnetHelper'); const { chunkArray, BadTokenError } = require('./mochHelper');