async sendRequest()

in templates/nodejs/src/video-uploader.js [213:261]


  async sendRequest(context: VideoUploadRequestContext): Object {
    // Init a VideoUploadRequest
    const request = new VideoUploadRequest(this._api);
    var start_offset = context.startOffset;
    var end_offset = context.endOffset;
    const filePath = context.filePath;
    const fileSize = fs.statSync(filePath).size;

    // Give a chance to retry every 10M, or at least twice
    let numRetry = Math.max(fileSize / (1024 * 1024 * 10), 2);
    let response = null;
    // While there are still more chunks to send
    const videoFileDescriptor = fs.openSync(filePath, 'r');
    while (start_offset !== end_offset) {
      context.startOffset = start_offset;
      context.endOffset = end_offset;
      let params = {
        upload_phase: 'transfer',
        start_offset: context.startOffset,
        upload_session_id: context.sessionId,
        video_file_chunk: context.videoFileChunk,
      };
      request.setParams(params, {
        video_file_chunk: fs.createReadStream(context.filePath, {
          start: context.startOffset,
          end: context.endOffset - 1,
        }),
      });
      // Send the request
      try {
        response = await request.send([context.accountId, 'advideos']);
        start_offset = parseInt(response['start_offset']);
        end_offset = parseInt(response['end_offset']);
      } catch (error) {
        if (numRetry > 0) {
          numRetry = Math.max(numRetry - 1, 0);
          continue;
        }
        fs.close(videoFileDescriptor, err => {});
        throw error;
      }
    }

    this._startOffset = start_offset;
    this._endOffset = end_offset;
    fs.close(videoFileDescriptor, err => {});

    return response;
  }