Packages
upstream
1.6.1
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.7
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.0
1.8.2
1.8.1
1.7.2
1.7.1
1.7.0
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.12
1.5.11
1.5.11-dev-3
1.5.11-dev-2
1.5.11-dev-1
1.5.11-dev
1.5.10
1.5.9
1.5.8
1.5.7
1.5.6
1.5.5
1.5.2
1.5.1
1.5.0
1.4.12
1.4.9
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.7
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.3
1.2.1
Upstream is for integrating into projects that need to do large file uploads to B2 service. It integrates tightly with Backblaze B2 for now, with plans to support Amazon S3.
Current section
Files
Jump to
Current section
Files
lib/upstream/uploader.ex
defmodule Upstream.Uploader do
@moduledoc """
Manages Supervisors for Uploaders
"""
use Supervisor
alias Upstream.Job
def start_link(_args) do
Supervisor.start_link(__MODULE__, [], name: __MODULE__)
end
def init(_) do
children = [
supervisor(__MODULE__.Chunk, []),
supervisor(__MODULE__.LargeFile, []),
supervisor(__MODULE__.StandardFile, []),
supervisor(Task.Supervisor, [[name: __MODULE__.TaskSupervisor]])
]
supervise(children, strategy: :one_for_one)
end
def upload_chunk!(chunk_path, params) do
job = Job.create(chunk_path, params)
if Job.errored?(job), do: Job.retry(job)
start_and_register(job, fn ->
start_uploader(:chunk, job)
end)
end
def upload_file!(file_path, name, metadata \\ %{}) do
job = Job.create(file_path, name, metadata)
if Job.errored?(job), do: Job.retry(job)
file_type = if job.threads == 1, do: :standard, else: :large
start_and_register(job, fn ->
start_uploader(file_type, job)
end)
end
defp start_and_register(job, on_start) do
if Job.uploading?(job) || Job.done?(job) do
Job.get_result(job)
else
on_start.()
end
end
defp start_uploader(:chunk, job) do
__MODULE__.Chunk.perform(job)
end
defp start_uploader(:standard, job) do
__MODULE__.StandardFile.perform(job)
end
defp start_uploader(:large, job) do
__MODULE__.LargeFile.perform(job)
end
end