Sha256: b8f05a9d80c513a632acfaf73d71771e51deff8668d9f26a84c5585ef11bcd6f

Contents?: true

Size: 1.63 KB

Versions: 11

Compression:

Stored size: 1.63 KB

Contents

# frozen_string_literal: true

require 'parallel'
require 'dry/monads'
require 'api_struct'

module Uploadcare
  module Client
    module MultipartUpload
      # This class splits file into chunks of set chunk_size
      # and uploads them into cloud storage.
      # Used for multipart uploads
      # @see https://uploadcare.com/api-refs/upload-api/#tag/Upload/paths/https:~1~1uploadcare.s3-accelerate.amazonaws.com~1%3C%3Cpresigned-url%3E/put
      class ChunksClient < ApiStruct::Client
        CHUNK_SIZE = 5_242_880

        # In multiple threads, split file into chunks and upload those chunks into respective Amazon links
        # @param object [File]
        # @param links [Array] of strings; by default list of Amazon storage urls
        def self.upload_chunks(object, links)
          Parallel.each(0...links.count, in_threads: Uploadcare.config.upload_threads) do |link_id|
            offset = link_id * CHUNK_SIZE
            chunk = File.read(object, CHUNK_SIZE, offset)
            new.upload_chunk(chunk, links[link_id])
            next unless block_given?

            yield(
              chunk_size: CHUNK_SIZE,
              object: object,
              offset: offset,
              link_id: link_id,
              links: links,
              links_count: links.count
            )
          end
        end

        def api_root
          ''
        end

        def headers
          {}
        end

        def upload_chunk(chunk, link)
          put(path: link, body: chunk, headers: { 'Content-Type': 'application/octet-stream' })
        end

        private

        def default_params
          {}
        end
      end
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
uploadcare-ruby-4.4.3 lib/uploadcare/client/multipart_upload/chunks_client.rb
uploadcare-ruby-4.4.2 lib/uploadcare/client/multipart_upload/chunks_client.rb
uploadcare-ruby-4.4.1 lib/uploadcare/client/multipart_upload/chunks_client.rb
uploadcare-ruby-4.4.0 lib/uploadcare/client/multipart_upload/chunks_client.rb
uploadcare-ruby-4.3.6 lib/uploadcare/client/multipart_upload/chunks_client.rb
uploadcare-ruby-4.3.5 lib/uploadcare/client/multipart_upload/chunks_client.rb
uploadcare-ruby-4.3.4 lib/uploadcare/client/multipart_upload/chunks_client.rb
uploadcare-ruby-4.3.3 lib/uploadcare/client/multipart_upload/chunks_client.rb
uploadcare-ruby-4.3.2 lib/uploadcare/client/multipart_upload/chunks_client.rb
uploadcare-ruby-4.3.1 lib/uploadcare/client/multipart_upload/chunks_client.rb
uploadcare-ruby-4.3.0 lib/uploadcare/client/multipart_upload/chunks_client.rb