Packages
upstream
2.0.3
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/b2.ex
defmodule Upstream.B2 do
alias Upstream.{
Uploader, Job
}
@spec upload_chunk(binary(), binary() | map()) :: {:error, any()} | {:ok, any()}
def upload_chunk(chunk_path, params) do
job = Job.create(chunk_path, params)
if Job.State.errored?(job), do: Job.State.retry(job)
start_and_register(job, fn -> start_upload(Chunk, job) end)
end
@spec upload_file(binary(), binary() | %{file_id: any(), index: any()}, any()) ::
{:error, any()} | {:ok, any()}
def upload_file(file_path, name, metadata \\ %{}) do
job = Job.create(file_path, name, metadata)
if Job.State.errored?(job), do: Job.State.retry(job)
start_and_register(job, fn -> start_upload(file_worker_type(job.threads), job) end)
end
defp file_worker_type(1), do: StandardFile
defp file_worker_type(_), do: LargeFile
defp start_and_register(job, on_start) do
if Job.State.uploading?(job) || Job.State.done?(job) do
get_result_or_start(job, on_start)
else
on_start.()
end
end
defp get_result_or_start(job, on_start) do
case Job.State.get_result(job) do
{:ok, reply} ->
{:ok, reply}
{:error, %{error: :no_reply}} ->
Job.State.retry(job)
on_start.()
end
end
defp start_upload(module, job) do
with {:ok, pid, module} <- Uploader.start_worker(module, job),
{:ok, result} <- module.upload(pid)
do
{:ok, result}
else
{:error, reason} -> {:error, reason}
end
end
end