From dc2060faec7c453c88b271d9e020dfb6eabbda6e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Wed, 24 Apr 2024 13:38:50 +0200
Subject: [PATCH] Abort a multipart upload if it fails

#113
---
 src/stores/s3objects.ts | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/stores/s3objects.ts b/src/stores/s3objects.ts
index 149a3eb..29a7e10 100644
--- a/src/stores/s3objects.ts
+++ b/src/stores/s3objects.ts
@@ -1,6 +1,7 @@
 import { defineStore } from "pinia";
 import type { _Object as S3Object, HeadObjectOutput } from "@aws-sdk/client-s3";
 import {
+  AbortMultipartUploadCommand,
   CopyObjectCommand,
   GetObjectCommand,
   HeadObjectCommand,
@@ -237,7 +238,23 @@ export const useS3ObjectStore = defineStore({
       if (onProgress != undefined) {
         parallelUploads3.on("httpUploadProgress", onProgress);
       }
-      await parallelUploads3.done();
+      try {
+        await parallelUploads3.done();
+      } catch (e) {
+        // if there is an error with the multipart upload, send an abort multipart upload command
+        const uploadObject = JSON.parse(JSON.stringify(parallelUploads3));
+        if (uploadObject["isMultiPart"] && uploadObject["uploadId"]) {
+          await this.client.send(
+            new AbortMultipartUploadCommand({
+              // AbortMultipartUploadRequest
+              Bucket: bucketName, // required
+              Key: key, // required
+              UploadId: uploadObject["uploadId"], // required
+            }),
+          );
+        }
+        throw e;
+      }
       const newObj = {
         Key: key,
         Size: file.size ?? 0,
-- 
GitLab