From fcfb1ce94df3dad57e0388d52477a89121aabbd0 Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Mon, 18 Jan 2021 13:11:31 -0500 Subject: [PATCH] Add timeout when processing user uploads --- .../skin-database/api/processUserUploads.ts | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/skin-database/api/processUserUploads.ts b/packages/skin-database/api/processUserUploads.ts index 6369b48d..f9d84d33 100644 --- a/packages/skin-database/api/processUserUploads.ts +++ b/packages/skin-database/api/processUserUploads.ts @@ -7,6 +7,7 @@ async function* reportedUploads() { const seen = new Set(); while (true) { const upload = await Skins.getReportedUpload(); + console.log("Found one", { upload }); if (upload == null) { return; } @@ -26,6 +27,17 @@ function log(...args: any[]) { console.log(...args); } +const ONE_MINUTE_IN_MS = 1000 * 60; + +function timeout(p: Promise, duration: number): Promise { + return Promise.race([ + p, + new Promise((resolve, reject) => + setTimeout(() => reject("timeout"), duration) + ), + ]); +} + export async function processUserUploads(eventHandler: EventHandler) { log("process user uploads"); // Ensure we only have one worker processing requests. @@ -34,16 +46,15 @@ export async function processUserUploads(eventHandler: EventHandler) { } processing = true; const uploads = reportedUploads(); - log("Uploads to process: ", uploads); + log("Uploads to process..."); for await (const upload of uploads) { log("Going to try: ", upload); try { const buffer = await S3.getUploadedSkin(upload.id); log("Got buffer: ", upload); - const result = await addSkinFromBuffer( - buffer, - upload.filename, - "Web API" + const result = await timeout( + addSkinFromBuffer(buffer, upload.filename, "Web API"), + ONE_MINUTE_IN_MS ); log("Added skin from buffer: ", upload, result); await Skins.recordUserUploadArchived(upload.id); @@ -73,6 +84,7 @@ export async function processUserUploads(eventHandler: EventHandler) { console.error(e); } } + log("Done processing uploads."); processing = false; }