aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/core/storage/BlobStorage.scala
blob: 0cde96a34fc47d2058bb020b2347cdb1b76f8149 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package xyz.driver.core.storage

import java.net.URL
import java.nio.file.Path

import akka.Done
import akka.stream.scaladsl.{Sink, Source}
import akka.util.ByteString

import scala.concurrent.Future
import scala.concurrent.duration.Duration

/** Binary key-value store, typically implemented by cloud storage. */
trait BlobStorage {

  /** Upload data by value. */
  def uploadContent(name: String, content: Array[Byte]): Future[String]

  /** Upload data from an existing file. */
  def uploadFile(name: String, content: Path): Future[String]

  def exists(name: String): Future[Boolean]

  /** List available keys. The prefix determines which keys should be listed
    * and depends on the implementation (for instance, a file system backed
    * blob store will treat a prefix as a directory path). */
  def list(prefix: String): Future[Set[String]]

  /** Get all the content of a given object. */
  def content(name: String): Future[Option[Array[Byte]]]

  /** Stream data asynchronously and with backpressure. */
  def download(name: String): Future[Option[Source[ByteString, Any]]]

  /** Get a sink to upload data. */
  def upload(name: String): Future[Sink[ByteString, Future[Done]]]

  /** Delete a stored value. */
  def delete(name: String): Future[String]

  /**
    * Path to specified resource. Checks that the resource exists and returns None if
    * it is not found. Depending on the implementation, may throw.
    */
  def url(name: String): Future[Option[URL]]
}

trait SignedBlobStorage extends BlobStorage {
  def signedDownloadUrl(name: String, duration: Duration): Future[Option[URL]]
}