Packages
upstream
1.6.5
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/worker/large_file/status.ex
defmodule Upstream.Worker.LargeFile.Status do
@moduledoc """
used to track the status of the upload process
"""
defstruct [:uploaded, :progress]
@type t :: %__MODULE__{
uploaded: List.t(),
progress: map
}
# TODO need to track sha1 array order correctly
def start_link do
Agent.start_link(fn ->
%__MODULE__{
uploaded: [],
progress: %{}
}
end)
end
def upload_complete?(pid) do
progress_count(pid) == uploaded_count(pid)
end
def uploaded_count(pid) do
Agent.get(pid, fn reports ->
Enum.count(reports.uploaded)
end)
end
def progress_count(pid) do
Agent.get(pid, fn reports ->
Enum.count(reports.progress)
end)
end
def stop(pid), do: Agent.stop(pid)
def thread_count(pid) do
Agent.get(pid, fn reports ->
Enum.count(reports.progress)
end)
end
def bytes_transferred(pid) do
Agent.get(pid, fn reports ->
reports.progress
|> Enum.map(fn {_, transferred} ->
transferred
end)
|> Enum.sum()
end)
end
def add_uploaded({index, checksum}, pid) do
Agent.get_and_update(pid, fn reports ->
new_uploaded = List.insert_at(reports.uploaded, index, checksum)
{reports, Map.put(reports, :uploaded, new_uploaded)}
end)
{index, checksum}
end
def get_uploaded_sha1(pid) do
Agent.get(pid, fn reports -> reports.uploaded end)
end
def add_bytes_out(bytes, pid, key \\ 0) do
Agent.get_and_update(pid, fn reports ->
{_old, new_progress} =
Map.get_and_update(reports.progress, "#{key}", fn transferred ->
{transferred, (transferred || 0) + bytes}
end)
{reports, Map.put(reports, :progress, new_progress)}
end)
end
end