From 8fd0fcbd3b682ff11b6ebe47df0120e524a11e8c Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Thu, 3 Apr 2025 13:46:36 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20feat:=20Add=20configurable=20S3?= =?UTF-8?q?=20URL=20refresh=20expiry=20time?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/server/services/Files/S3/crud.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/api/server/services/Files/S3/crud.js b/api/server/services/Files/S3/crud.js index 1d5768d147..e685c8c8c2 100644 --- a/api/server/services/Files/S3/crud.js +++ b/api/server/services/Files/S3/crud.js @@ -16,6 +16,7 @@ const bucketName = process.env.AWS_BUCKET_NAME; const defaultBasePath = 'images'; let s3UrlExpirySeconds = 7 * 24 * 60 * 60; +let s3RefreshExpiryMs = null; if (process.env.S3_URL_EXPIRY_SECONDS !== undefined) { const parsed = parseInt(process.env.S3_URL_EXPIRY_SECONDS, 10); @@ -29,6 +30,19 @@ if (process.env.S3_URL_EXPIRY_SECONDS !== undefined) { } } +if (process.env.S3_REFRESH_EXPIRY_MS !== null && process.env.S3_REFRESH_EXPIRY_MS) { + const parsed = parseInt(process.env.S3_REFRESH_EXPIRY_MS, 10); + + if (!isNaN(parsed) && parsed > 0) { + s3RefreshExpiryMs = parsed; + logger.info(`[S3] Using custom refresh expiry time: ${s3RefreshExpiryMs}ms`); + } else { + logger.warn( + `[S3] Invalid S3_REFRESH_EXPIRY_MS value: "${process.env.S3_REFRESH_EXPIRY_MS}". Using default refresh logic.`, + ); + } +} + /** * Constructs the S3 key based on the base path, user ID, and file name. */ @@ -293,8 +307,16 @@ function needsRefresh(signedUrl, bufferSeconds) { // Check if it's close to expiration const now = new Date(); - const bufferTime = new Date(now.getTime() + bufferSeconds * 1000); + // If S3_REFRESH_EXPIRY_MS is set, use it to determine if URL is expired + if (s3RefreshExpiryMs !== null) { + const urlCreationTime = dateObj.getTime(); + const urlAge = now.getTime() - urlCreationTime; + return urlAge >= s3RefreshExpiryMs; + } + + // Otherwise use the default buffer-based logic + const bufferTime = new Date(now.getTime() + bufferSeconds * 1000); return expiresAtDate <= bufferTime; } catch (error) { logger.error('Error checking URL expiration:', error);