From 6764ea7d408b05936ed1522c8128d410a15ab51c Mon Sep 17 00:00:00 2001 From: A Ibrahim Date: Thu, 26 Mar 2026 10:45:46 +0100 Subject: [PATCH 1/2] fix(storage): handleClientUpload throwing errors --- packages/storage/src/lib/object/multipart.ts | 25 +++--- packages/storage/src/lib/upload/server.ts | 81 +++++++++++--------- 2 files changed, 61 insertions(+), 45 deletions(-) diff --git a/packages/storage/src/lib/object/multipart.ts b/packages/storage/src/lib/object/multipart.ts index 092a827..76eeeca 100644 --- a/packages/storage/src/lib/object/multipart.ts +++ b/packages/storage/src/lib/object/multipart.ts @@ -32,17 +32,24 @@ export async function initMultipartUpload( Key: path, }); - const { UploadId } = await tigrisClient.send(createCommand); + try { + const { UploadId } = await tigrisClient.send(createCommand); - if (!UploadId) { - return { error: new Error('Unable to initialize multipart upload') }; - } + if (!UploadId) { + return { error: new Error('Unable to initialize multipart upload') }; + } - return { - data: { - uploadId: UploadId, - }, - }; + return { + data: { + uploadId: UploadId, + }, + }; + } catch (error) { + const { message } = error as { message: string }; + return { + error: new Error(`Unable to initialize multipart upload: ${message}`), + }; + } } export type GetPartsPresignedUrlsOptions = { diff --git a/packages/storage/src/lib/upload/server.ts b/packages/storage/src/lib/upload/server.ts index 2c51b35..73be206 100644 --- a/packages/storage/src/lib/upload/server.ts +++ b/packages/storage/src/lib/upload/server.ts @@ -22,43 +22,52 @@ export async function handleClientUpload( ): Promise> { const { action, name, contentType, uploadId, parts, partIds } = request; - switch (action) { - case UploadAction.SinglepartInit: - return await getPresignedUrl(name, { - contentType, - operation: 'put', - expiresIn: 3600, // 1 hour - config, - }); - case UploadAction.MultipartInit: - return await initMultipartUpload(name, { - config, - }); - case UploadAction.MultipartGetParts: - if (!uploadId || !parts) { + try { + switch (action) { + case UploadAction.SinglepartInit: + return await getPresignedUrl(name, { + contentType, + operation: 'put', + expiresIn: 3600, // 1 hour + config, + }); + case UploadAction.MultipartInit: + return await initMultipartUpload(name, { + config, + }); + case UploadAction.MultipartGetParts: + if (!uploadId || !parts) { + return { + error: new Error( + 'uploadId and parts are required for multipart-parts' + ), + }; + } + return await getPartsPresignedUrls(name, parts, uploadId, { + config, + }); + case UploadAction.MultipartComplete: + if (!uploadId || !partIds) { + return { + error: new Error( + 'uploadId and partIds are required for multipart-complete' + ), + }; + } + return await completeMultipartUpload(name, uploadId, partIds, { + config, + }); + default: return { - error: new Error( - 'uploadId and parts are required for multipart-parts' - ), + error: new Error(`Invalid action: ${action}`), }; - } - return await getPartsPresignedUrls(name, parts, uploadId, { - config, - }); - case UploadAction.MultipartComplete: - if (!uploadId || !partIds) { - return { - error: new Error( - 'uploadId and partIds are required for multipart-complete' - ), - }; - } - return await completeMultipartUpload(name, uploadId, partIds, { - config, - }); - default: - return { - error: new Error(`Invalid action: ${action}`), - }; + } + } catch (error: unknown) { + const { message } = error as { message: string }; + return { + error: message + ? new Error(message) + : new Error('Unexpected error in handleClientUpload'), + }; } } From 9474601fd90e1bae111f523833c0f2e8cb5e05be Mon Sep 17 00:00:00 2001 From: A Ibrahim Date: Thu, 26 Mar 2026 11:01:47 +0100 Subject: [PATCH 2/2] fix(storage): handleClientUpload throwing errors --- packages/storage/src/lib/object/multipart.ts | 6 ++++-- packages/storage/src/lib/object/put.ts | 12 +++--------- packages/storage/src/lib/upload/server.ts | 10 +++------- shared/index.ts | 2 +- shared/utils.ts | 6 ++++++ 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/packages/storage/src/lib/object/multipart.ts b/packages/storage/src/lib/object/multipart.ts index 76eeeca..2e9022c 100644 --- a/packages/storage/src/lib/object/multipart.ts +++ b/packages/storage/src/lib/object/multipart.ts @@ -4,6 +4,7 @@ import { UploadPartCommand, } from '@aws-sdk/client-s3'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; +import { toError } from '@shared/utils'; import { config } from '../config'; import { createTigrisClient } from '../tigris-client'; import type { TigrisStorageConfig, TigrisStorageResponse } from '../types'; @@ -45,9 +46,10 @@ export async function initMultipartUpload( }, }; } catch (error) { - const { message } = error as { message: string }; return { - error: new Error(`Unable to initialize multipart upload: ${message}`), + error: new Error( + `Unable to initialize multipart upload: ${toError(error).message}` + ), }; } } diff --git a/packages/storage/src/lib/object/put.ts b/packages/storage/src/lib/object/put.ts index 45a0fdb..f5d2d8e 100644 --- a/packages/storage/src/lib/object/put.ts +++ b/packages/storage/src/lib/object/put.ts @@ -1,6 +1,7 @@ import { GetObjectCommand } from '@aws-sdk/client-s3'; import { Upload } from '@aws-sdk/lib-storage'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; +import { toError } from '@shared/utils'; import { config } from '../config'; import { createTigrisClient } from '../tigris-client'; import type { TigrisStorageConfig, TigrisStorageResponse } from '../types'; @@ -115,15 +116,8 @@ export async function put( try { await upload.done(); - } catch (error: unknown) { - const { message } = error as { - message: string; - }; - return { - error: message - ? new Error(message) - : new Error(`Unexpected error while uploading to Tigris Storage`), - }; + } catch (error) { + return { error: toError(error) }; } let signedUrl: string; diff --git a/packages/storage/src/lib/upload/server.ts b/packages/storage/src/lib/upload/server.ts index 73be206..238c8af 100644 --- a/packages/storage/src/lib/upload/server.ts +++ b/packages/storage/src/lib/upload/server.ts @@ -6,6 +6,7 @@ import { import { getPresignedUrl } from '../object/presigned-url'; import { TigrisStorageConfig, TigrisStorageResponse } from '../types'; import { UploadAction } from './shared'; +import { toError } from '@shared/utils'; export interface ClientUploadRequest { action: UploadAction; @@ -62,12 +63,7 @@ export async function handleClientUpload( error: new Error(`Invalid action: ${action}`), }; } - } catch (error: unknown) { - const { message } = error as { message: string }; - return { - error: message - ? new Error(message) - : new Error('Unexpected error in handleClientUpload'), - }; + } catch (error) { + return { error: toError(error) }; } } diff --git a/shared/index.ts b/shared/index.ts index 5af37d8..4c2eedd 100644 --- a/shared/index.ts +++ b/shared/index.ts @@ -1,6 +1,6 @@ export { isNode, loadEnv, missingConfigError } from './config'; export type { TigrisResponse } from './types'; -export { executeWithConcurrency, handleError } from './utils'; +export { executeWithConcurrency, handleError, toError } from './utils'; export { TigrisHeaders } from './headers'; export { createTigrisHttpClient, diff --git a/shared/utils.ts b/shared/utils.ts index e24a621..1e53325 100644 --- a/shared/utils.ts +++ b/shared/utils.ts @@ -31,6 +31,12 @@ export async function executeWithConcurrency( return results; } +export function toError(value: unknown): Error { + if (value instanceof Error) return value; + if (typeof value === 'string') return new Error(value); + return new Error('An unexpected error occurred'); +} + export const handleError = (error: Error) => { let errorMessage: string | undefined;