]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Fix invalid token on upload
authorChocobozzz <me@florianbigard.com>
Wed, 16 Mar 2022 13:16:23 +0000 (14:16 +0100)
committerChocobozzz <me@florianbigard.com>
Wed, 16 Mar 2022 14:45:56 +0000 (15:45 +0100)
client/src/app/+videos/+video-edit/video-add-components/video-upload.component.ts

index c4438d77733fa6ee69840ceb1e957bd72365000c..ec858c8a84e87200dc151478ac95f2fa6a5eaaea 100644 (file)
@@ -50,10 +50,11 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
   // So that it can be accessed in the template
   protected readonly BASE_VIDEO_UPLOAD_URL = VideoService.BASE_VIDEO_URL + '/upload-resumable'
 
-  private uploadxOptions: UploadxOptions
   private isUpdatingVideo = false
   private fileToUpload: File
 
+  private alreadyRefreshedToken = false
+
   constructor (
     protected formValidatorService: FormValidatorService,
     protected loadingBar: LoadingBarService,
@@ -68,26 +69,6 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
     private resumableUploadService: UploadxService
   ) {
     super()
-
-    // FIXME: https://github.com/Chocobozzz/PeerTube/issues/4382#issuecomment-915854167
-    const chunkSize = isIOS()
-      ? 0
-      : undefined // Auto chunk size
-
-    this.uploadxOptions = {
-      endpoint: this.BASE_VIDEO_UPLOAD_URL,
-      multiple: false,
-      token: this.authService.getAccessToken(),
-      uploaderClass: UploaderXFormData,
-      chunkSize,
-      retryConfig: {
-        maxAttempts: 30, // maximum attempts for 503 codes, otherwise set to 6, see below
-        maxDelay: 120_000, // 2 min
-        shouldRetry: (code: number, attempts: number) => {
-          return code === HttpStatusCode.SERVICE_UNAVAILABLE_503 || ((code < 400 || code > 500) && attempts < 6)
-        }
-      }
-    }
   }
 
   get videoExtensions () {
@@ -135,6 +116,12 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
   onUploadVideoOngoing (state: UploadState) {
     switch (state.status) {
       case 'error': {
+        if (!this.alreadyRefreshedToken && state.response.status === HttpStatusCode.UNAUTHORIZED_401) {
+          this.alreadyRefreshedToken = true
+
+          return this.refereshTokenAndRetryUpload()
+        }
+
         const error = state.response?.error || 'Unknow error'
 
         this.handleUploadError({
@@ -281,9 +268,9 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
     }
 
     this.resumableUploadService.handleFiles(file, {
-      ...this.uploadxOptions,
-      metadata,
-      maxChunkSize: this.serverConfig.client.videos.resumableUpload.maxChunkSize
+      ...this.getUploadxOptions(),
+
+      metadata
     })
 
     this.isUploadingVideo = true
@@ -378,4 +365,36 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
 
     return name
   }
+
+  private refereshTokenAndRetryUpload () {
+    this.authService.refreshAccessToken()
+      .subscribe(() => this.retryUpload())
+  }
+
+  private getUploadxOptions (): UploadxOptions {
+    // FIXME: https://github.com/Chocobozzz/PeerTube/issues/4382#issuecomment-915854167
+    const chunkSize = isIOS()
+      ? 0
+      : undefined // Auto chunk size
+
+    return {
+      endpoint: this.BASE_VIDEO_UPLOAD_URL,
+      multiple: false,
+
+      maxChunkSize: this.serverConfig.client.videos.resumableUpload.maxChunkSize,
+      chunkSize,
+
+      token: this.authService.getAccessToken(),
+
+      uploaderClass: UploaderXFormData,
+
+      retryConfig: {
+        maxAttempts: 30, // maximum attempts for 503 codes, otherwise set to 6, see below
+        maxDelay: 120_000, // 2 min
+        shouldRetry: (code: number, attempts: number) => {
+          return code === HttpStatusCode.SERVICE_UNAVAILABLE_503 || ((code < 400 || code > 500) && attempts < 6)
+        }
+      }
+    }
+  }
 }