module TahoeLAFS.Storage.Server (
    StorageServerConfig (StorageServerConfig),
    app,
    main,
) where

import Control.Exception (
    Exception,
    throw,
 )
import Control.Monad.IO.Class (
    liftIO,
 )
import Data.Maybe (fromMaybe)
import Network.HTTP.Types (
    ByteRanges,
 )
import Network.Wai (
    Application,
 )
import Network.Wai.Handler.Warp (
    Port,
    defaultSettings,
    runSettings,
    setPort,
 )
import Network.Wai.Handler.WarpTLS (
    runTLS,
    tlsSettings,
 )
import Servant (
    Handler,
    Server,
    serve,
    (:<|>) (..),
 )
import TahoeLAFS.Storage.API (
    AllocateBuckets,
    AllocationResult (..),
    CBORSet (..),
    CorruptionDetails,
    LeaseSecret (Write),
    QueryRange,
    ReadTestWriteResult (..),
    ReadTestWriteVectors,
    ShareData,
    ShareNumber,
    StorageAPI,
    StorageIndex,
    Version (..),
    api,
 )
import TahoeLAFS.Storage.Backend (WriteImmutableError (MissingUploadSecret))
import qualified TahoeLAFS.Storage.Backend as Backend
import TahoeLAFS.Storage.Backend.Filesystem (
    FilesystemBackend (FilesystemBackend),
 )

version :: Backend.Backend b => b -> Handler Version
version :: b -> Handler Version
version b
backend =
    IO Version -> Handler Version
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (b -> IO Version
forall b. Backend b => b -> IO Version
Backend.version b
backend)

renewLease :: Backend.Backend b => b -> StorageIndex -> Maybe [LeaseSecret] -> Handler ()
renewLease :: b -> StorageIndex -> Maybe [LeaseSecret] -> Handler ()
renewLease b
backend StorageIndex
storageIndex Maybe [LeaseSecret]
secrets = IO () -> Handler ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (b -> StorageIndex -> [LeaseSecret] -> IO ()
forall b. Backend b => b -> StorageIndex -> [LeaseSecret] -> IO ()
Backend.renewLease b
backend StorageIndex
storageIndex ([LeaseSecret] -> Maybe [LeaseSecret] -> [LeaseSecret]
forall a. a -> Maybe a -> a
fromMaybe [] Maybe [LeaseSecret]
secrets))

createImmutableStorageIndex :: Backend.Backend b => b -> StorageIndex -> Maybe [LeaseSecret] -> AllocateBuckets -> Handler AllocationResult
createImmutableStorageIndex :: b
-> StorageIndex
-> Maybe [LeaseSecret]
-> AllocateBuckets
-> Handler AllocationResult
createImmutableStorageIndex b
backend StorageIndex
storageIndex Maybe [LeaseSecret]
secrets AllocateBuckets
params =
    IO AllocationResult -> Handler AllocationResult
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (b
-> StorageIndex
-> Maybe [LeaseSecret]
-> AllocateBuckets
-> IO AllocationResult
forall b.
Backend b =>
b
-> StorageIndex
-> Maybe [LeaseSecret]
-> AllocateBuckets
-> IO AllocationResult
Backend.createImmutableStorageIndex b
backend StorageIndex
storageIndex Maybe [LeaseSecret]
secrets AllocateBuckets
params)

writeImmutableShare :: Backend.Backend b => b -> StorageIndex -> ShareNumber -> Maybe [LeaseSecret] -> ShareData -> Maybe ByteRanges -> Handler ()
writeImmutableShare :: b
-> StorageIndex
-> ShareNumber
-> Maybe [LeaseSecret]
-> ShareData
-> Maybe ByteRanges
-> Handler ()
writeImmutableShare b
backend StorageIndex
storage_index ShareNumber
share_number Maybe [LeaseSecret]
secrets ShareData
share_data Maybe ByteRanges
content_ranges =
    IO () -> Handler ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (b
-> StorageIndex
-> ShareNumber
-> Maybe [LeaseSecret]
-> ShareData
-> Maybe ByteRanges
-> IO ()
forall b.
Backend b =>
b
-> StorageIndex
-> ShareNumber
-> Maybe [LeaseSecret]
-> ShareData
-> Maybe ByteRanges
-> IO ()
Backend.writeImmutableShare b
backend StorageIndex
storage_index ShareNumber
share_number Maybe [LeaseSecret]
secrets ShareData
share_data Maybe ByteRanges
content_ranges)

abortImmutableUpload :: Backend.Backend b => b -> StorageIndex -> ShareNumber -> Maybe [LeaseSecret] -> Handler ()
abortImmutableUpload :: b
-> StorageIndex -> ShareNumber -> Maybe [LeaseSecret] -> Handler ()
abortImmutableUpload b
backend StorageIndex
storageIndex ShareNumber
shareNum Maybe [LeaseSecret]
secrets = IO () -> Handler ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (b -> StorageIndex -> ShareNumber -> Maybe [LeaseSecret] -> IO ()
forall b.
Backend b =>
b -> StorageIndex -> ShareNumber -> Maybe [LeaseSecret] -> IO ()
Backend.abortImmutableUpload b
backend StorageIndex
storageIndex ShareNumber
shareNum Maybe [LeaseSecret]
secrets)

adviseCorruptImmutableShare :: Backend.Backend b => b -> StorageIndex -> ShareNumber -> CorruptionDetails -> Handler ()
adviseCorruptImmutableShare :: b -> StorageIndex -> ShareNumber -> CorruptionDetails -> Handler ()
adviseCorruptImmutableShare b
backend StorageIndex
storage_index ShareNumber
share_number CorruptionDetails
details =
    IO () -> Handler ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (b -> StorageIndex -> ShareNumber -> CorruptionDetails -> IO ()
forall b.
Backend b =>
b -> StorageIndex -> ShareNumber -> CorruptionDetails -> IO ()
Backend.adviseCorruptImmutableShare b
backend StorageIndex
storage_index ShareNumber
share_number CorruptionDetails
details)

getImmutableShareNumbers :: Backend.Backend b => b -> StorageIndex -> Handler (CBORSet ShareNumber)
getImmutableShareNumbers :: b -> StorageIndex -> Handler (CBORSet ShareNumber)
getImmutableShareNumbers b
backend StorageIndex
storage_index =
    IO (CBORSet ShareNumber) -> Handler (CBORSet ShareNumber)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (b -> StorageIndex -> IO (CBORSet ShareNumber)
forall b.
Backend b =>
b -> StorageIndex -> IO (CBORSet ShareNumber)
Backend.getImmutableShareNumbers b
backend StorageIndex
storage_index)

readImmutableShare :: Backend.Backend b => b -> StorageIndex -> ShareNumber -> QueryRange -> Handler ShareData
readImmutableShare :: b
-> StorageIndex
-> ShareNumber
-> Maybe ByteRanges
-> Handler ShareData
readImmutableShare b
backend StorageIndex
storage_index ShareNumber
share_number Maybe ByteRanges
qr =
    -- TODO Need to return NO CONTENT if the result is empty.
    -- TODO Need to make sure content-range is set in the header otherwise
    IO ShareData -> Handler ShareData
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (b
-> StorageIndex -> ShareNumber -> Maybe ByteRanges -> IO ShareData
forall b.
Backend b =>
b
-> StorageIndex -> ShareNumber -> Maybe ByteRanges -> IO ShareData
Backend.readImmutableShare b
backend StorageIndex
storage_index ShareNumber
share_number Maybe ByteRanges
qr)

readvAndTestvAndWritev :: Backend.Backend b => b -> StorageIndex -> Maybe [LeaseSecret] -> ReadTestWriteVectors -> Handler ReadTestWriteResult
readvAndTestvAndWritev :: b
-> StorageIndex
-> Maybe [LeaseSecret]
-> ReadTestWriteVectors
-> Handler ReadTestWriteResult
readvAndTestvAndWritev b
_ StorageIndex
_ Maybe [LeaseSecret]
Nothing ReadTestWriteVectors
_ = WriteImmutableError -> Handler ReadTestWriteResult
forall a e. Exception e => e -> a
throw WriteImmutableError
MissingUploadSecret
readvAndTestvAndWritev b
_ StorageIndex
_ (Just []) ReadTestWriteVectors
_ = WriteImmutableError -> Handler ReadTestWriteResult
forall a e. Exception e => e -> a
throw WriteImmutableError
MissingUploadSecret
readvAndTestvAndWritev b
backend StorageIndex
storageIndex (Just (Write WriteEnablerSecret
secret : [LeaseSecret]
_)) ReadTestWriteVectors
vectors =
    IO ReadTestWriteResult -> Handler ReadTestWriteResult
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (b
-> StorageIndex
-> WriteEnablerSecret
-> ReadTestWriteVectors
-> IO ReadTestWriteResult
forall b.
Backend b =>
b
-> StorageIndex
-> WriteEnablerSecret
-> ReadTestWriteVectors
-> IO ReadTestWriteResult
Backend.readvAndTestvAndWritev b
backend StorageIndex
storageIndex WriteEnablerSecret
secret ReadTestWriteVectors
vectors)
readvAndTestvAndWritev b
backend StorageIndex
storageIndex (Just (LeaseSecret
_ : [LeaseSecret]
ss)) ReadTestWriteVectors
vectors =
    b
-> StorageIndex
-> Maybe [LeaseSecret]
-> ReadTestWriteVectors
-> Handler ReadTestWriteResult
forall b.
Backend b =>
b
-> StorageIndex
-> Maybe [LeaseSecret]
-> ReadTestWriteVectors
-> Handler ReadTestWriteResult
readvAndTestvAndWritev b
backend StorageIndex
storageIndex ([LeaseSecret] -> Maybe [LeaseSecret]
forall a. a -> Maybe a
Just [LeaseSecret]
ss) ReadTestWriteVectors
vectors

readMutableShare :: Backend.Backend b => b -> StorageIndex -> ShareNumber -> QueryRange -> Handler ShareData
readMutableShare :: b
-> StorageIndex
-> ShareNumber
-> Maybe ByteRanges
-> Handler ShareData
readMutableShare b
backend StorageIndex
storage_index ShareNumber
share_numbers Maybe ByteRanges
params =
    IO ShareData -> Handler ShareData
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (b
-> StorageIndex -> ShareNumber -> Maybe ByteRanges -> IO ShareData
forall b.
Backend b =>
b
-> StorageIndex -> ShareNumber -> Maybe ByteRanges -> IO ShareData
Backend.readMutableShare b
backend StorageIndex
storage_index ShareNumber
share_numbers Maybe ByteRanges
params)

getMutableShareNumbers :: Backend.Backend b => b -> StorageIndex -> Handler (CBORSet ShareNumber)
getMutableShareNumbers :: b -> StorageIndex -> Handler (CBORSet ShareNumber)
getMutableShareNumbers b
backend StorageIndex
storage_index =
    IO (CBORSet ShareNumber) -> Handler (CBORSet ShareNumber)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (b -> StorageIndex -> IO (CBORSet ShareNumber)
forall b.
Backend b =>
b -> StorageIndex -> IO (CBORSet ShareNumber)
Backend.getMutableShareNumbers b
backend StorageIndex
storage_index)

adviseCorruptMutableShare :: Backend.Backend b => b -> StorageIndex -> ShareNumber -> CorruptionDetails -> Handler ()
adviseCorruptMutableShare :: b -> StorageIndex -> ShareNumber -> CorruptionDetails -> Handler ()
adviseCorruptMutableShare b
backend StorageIndex
storage_index ShareNumber
share_number CorruptionDetails
details =
    IO () -> Handler ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (b -> StorageIndex -> ShareNumber -> CorruptionDetails -> IO ()
forall b.
Backend b =>
b -> StorageIndex -> ShareNumber -> CorruptionDetails -> IO ()
Backend.adviseCorruptMutableShare b
backend StorageIndex
storage_index ShareNumber
share_number CorruptionDetails
details)

data MisconfiguredTLS = MisconfiguredTLS
    deriving (Int -> MisconfiguredTLS -> ShowS
[MisconfiguredTLS] -> ShowS
MisconfiguredTLS -> StorageIndex
(Int -> MisconfiguredTLS -> ShowS)
-> (MisconfiguredTLS -> StorageIndex)
-> ([MisconfiguredTLS] -> ShowS)
-> Show MisconfiguredTLS
forall a.
(Int -> a -> ShowS)
-> (a -> StorageIndex) -> ([a] -> ShowS) -> Show a
showList :: [MisconfiguredTLS] -> ShowS
$cshowList :: [MisconfiguredTLS] -> ShowS
show :: MisconfiguredTLS -> StorageIndex
$cshow :: MisconfiguredTLS -> StorageIndex
showsPrec :: Int -> MisconfiguredTLS -> ShowS
$cshowsPrec :: Int -> MisconfiguredTLS -> ShowS
Show)
instance Exception MisconfiguredTLS

data StorageServerConfig = StorageServerConfig
    { StorageServerConfig -> StorageIndex
storagePath :: FilePath
    , StorageServerConfig -> Int
listenPort :: Port
    , StorageServerConfig -> Maybe StorageIndex
certificate :: Maybe FilePath
    , StorageServerConfig -> Maybe StorageIndex
key :: Maybe FilePath
    }
    deriving (Int -> StorageServerConfig -> ShowS
[StorageServerConfig] -> ShowS
StorageServerConfig -> StorageIndex
(Int -> StorageServerConfig -> ShowS)
-> (StorageServerConfig -> StorageIndex)
-> ([StorageServerConfig] -> ShowS)
-> Show StorageServerConfig
forall a.
(Int -> a -> ShowS)
-> (a -> StorageIndex) -> ([a] -> ShowS) -> Show a
showList :: [StorageServerConfig] -> ShowS
$cshowList :: [StorageServerConfig] -> ShowS
show :: StorageServerConfig -> StorageIndex
$cshow :: StorageServerConfig -> StorageIndex
showsPrec :: Int -> StorageServerConfig -> ShowS
$cshowsPrec :: Int -> StorageServerConfig -> ShowS
Show, StorageServerConfig -> StorageServerConfig -> Bool
(StorageServerConfig -> StorageServerConfig -> Bool)
-> (StorageServerConfig -> StorageServerConfig -> Bool)
-> Eq StorageServerConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: StorageServerConfig -> StorageServerConfig -> Bool
$c/= :: StorageServerConfig -> StorageServerConfig -> Bool
== :: StorageServerConfig -> StorageServerConfig -> Bool
$c== :: StorageServerConfig -> StorageServerConfig -> Bool
Eq)

app :: Backend.Backend b => b -> Application
app :: b -> Application
app b
backend =
    Proxy StorageAPI -> Server StorageAPI -> Application
forall api.
HasServer api '[] =>
Proxy api -> Server api -> Application
serve Proxy StorageAPI
api Server StorageAPI
storageServer
  where
    storageServer :: Server StorageAPI
    storageServer :: Server StorageAPI
storageServer =
        b -> Handler Version
forall b. Backend b => b -> Handler Version
version b
backend
            Handler Version
-> ((StorageIndex -> Maybe [LeaseSecret] -> Handler ())
    :<|> ((StorageIndex
           -> Maybe [LeaseSecret]
           -> AllocateBuckets
           -> Handler AllocationResult)
          :<|> ((StorageIndex
                 -> ShareNumber
                 -> Maybe [LeaseSecret]
                 -> ShareData
                 -> Maybe ByteRanges
                 -> Handler ())
                :<|> ((StorageIndex
                       -> ShareNumber -> Maybe [LeaseSecret] -> Handler ())
                      :<|> ((StorageIndex
                             -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                            :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                                  :<|> ((StorageIndex
                                         -> ShareNumber -> CorruptionDetails -> Handler ())
                                        :<|> ((StorageIndex
                                               -> Maybe [LeaseSecret]
                                               -> ReadTestWriteVectors
                                               -> Handler ReadTestWriteResult)
                                              :<|> ((StorageIndex
                                                     -> ShareNumber
                                                     -> Maybe ByteRanges
                                                     -> Handler ShareData)
                                                    :<|> ((StorageIndex
                                                           -> Handler (CBORSet ShareNumber))
                                                          :<|> (StorageIndex
                                                                -> ShareNumber
                                                                -> CorruptionDetails
                                                                -> Handler ())))))))))))
-> Handler Version
   :<|> ((StorageIndex -> Maybe [LeaseSecret] -> Handler ())
         :<|> ((StorageIndex
                -> Maybe [LeaseSecret]
                -> AllocateBuckets
                -> Handler AllocationResult)
               :<|> ((StorageIndex
                      -> ShareNumber
                      -> Maybe [LeaseSecret]
                      -> ShareData
                      -> Maybe ByteRanges
                      -> Handler ())
                     :<|> ((StorageIndex
                            -> ShareNumber -> Maybe [LeaseSecret] -> Handler ())
                           :<|> ((StorageIndex
                                  -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                                 :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                                       :<|> ((StorageIndex
                                              -> ShareNumber -> CorruptionDetails -> Handler ())
                                             :<|> ((StorageIndex
                                                    -> Maybe [LeaseSecret]
                                                    -> ReadTestWriteVectors
                                                    -> Handler ReadTestWriteResult)
                                                   :<|> ((StorageIndex
                                                          -> ShareNumber
                                                          -> Maybe ByteRanges
                                                          -> Handler ShareData)
                                                         :<|> ((StorageIndex
                                                                -> Handler (CBORSet ShareNumber))
                                                               :<|> (StorageIndex
                                                                     -> ShareNumber
                                                                     -> CorruptionDetails
                                                                     -> Handler ())))))))))))
forall a b. a -> b -> a :<|> b
:<|> b -> StorageIndex -> Maybe [LeaseSecret] -> Handler ()
forall b.
Backend b =>
b -> StorageIndex -> Maybe [LeaseSecret] -> Handler ()
renewLease b
backend
            (StorageIndex -> Maybe [LeaseSecret] -> Handler ())
-> ((StorageIndex
     -> Maybe [LeaseSecret]
     -> AllocateBuckets
     -> Handler AllocationResult)
    :<|> ((StorageIndex
           -> ShareNumber
           -> Maybe [LeaseSecret]
           -> ShareData
           -> Maybe ByteRanges
           -> Handler ())
          :<|> ((StorageIndex
                 -> ShareNumber -> Maybe [LeaseSecret] -> Handler ())
                :<|> ((StorageIndex
                       -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                      :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                            :<|> ((StorageIndex
                                   -> ShareNumber -> CorruptionDetails -> Handler ())
                                  :<|> ((StorageIndex
                                         -> Maybe [LeaseSecret]
                                         -> ReadTestWriteVectors
                                         -> Handler ReadTestWriteResult)
                                        :<|> ((StorageIndex
                                               -> ShareNumber
                                               -> Maybe ByteRanges
                                               -> Handler ShareData)
                                              :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                                                    :<|> (StorageIndex
                                                          -> ShareNumber
                                                          -> CorruptionDetails
                                                          -> Handler ()))))))))))
-> (StorageIndex -> Maybe [LeaseSecret] -> Handler ())
   :<|> ((StorageIndex
          -> Maybe [LeaseSecret]
          -> AllocateBuckets
          -> Handler AllocationResult)
         :<|> ((StorageIndex
                -> ShareNumber
                -> Maybe [LeaseSecret]
                -> ShareData
                -> Maybe ByteRanges
                -> Handler ())
               :<|> ((StorageIndex
                      -> ShareNumber -> Maybe [LeaseSecret] -> Handler ())
                     :<|> ((StorageIndex
                            -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                           :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                                 :<|> ((StorageIndex
                                        -> ShareNumber -> CorruptionDetails -> Handler ())
                                       :<|> ((StorageIndex
                                              -> Maybe [LeaseSecret]
                                              -> ReadTestWriteVectors
                                              -> Handler ReadTestWriteResult)
                                             :<|> ((StorageIndex
                                                    -> ShareNumber
                                                    -> Maybe ByteRanges
                                                    -> Handler ShareData)
                                                   :<|> ((StorageIndex
                                                          -> Handler (CBORSet ShareNumber))
                                                         :<|> (StorageIndex
                                                               -> ShareNumber
                                                               -> CorruptionDetails
                                                               -> Handler ()))))))))))
forall a b. a -> b -> a :<|> b
:<|> b
-> StorageIndex
-> Maybe [LeaseSecret]
-> AllocateBuckets
-> Handler AllocationResult
forall b.
Backend b =>
b
-> StorageIndex
-> Maybe [LeaseSecret]
-> AllocateBuckets
-> Handler AllocationResult
createImmutableStorageIndex b
backend
            (StorageIndex
 -> Maybe [LeaseSecret]
 -> AllocateBuckets
 -> Handler AllocationResult)
-> ((StorageIndex
     -> ShareNumber
     -> Maybe [LeaseSecret]
     -> ShareData
     -> Maybe ByteRanges
     -> Handler ())
    :<|> ((StorageIndex
           -> ShareNumber -> Maybe [LeaseSecret] -> Handler ())
          :<|> ((StorageIndex
                 -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                      :<|> ((StorageIndex
                             -> ShareNumber -> CorruptionDetails -> Handler ())
                            :<|> ((StorageIndex
                                   -> Maybe [LeaseSecret]
                                   -> ReadTestWriteVectors
                                   -> Handler ReadTestWriteResult)
                                  :<|> ((StorageIndex
                                         -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                                        :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                                              :<|> (StorageIndex
                                                    -> ShareNumber
                                                    -> CorruptionDetails
                                                    -> Handler ())))))))))
-> (StorageIndex
    -> Maybe [LeaseSecret]
    -> AllocateBuckets
    -> Handler AllocationResult)
   :<|> ((StorageIndex
          -> ShareNumber
          -> Maybe [LeaseSecret]
          -> ShareData
          -> Maybe ByteRanges
          -> Handler ())
         :<|> ((StorageIndex
                -> ShareNumber -> Maybe [LeaseSecret] -> Handler ())
               :<|> ((StorageIndex
                      -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                     :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                           :<|> ((StorageIndex
                                  -> ShareNumber -> CorruptionDetails -> Handler ())
                                 :<|> ((StorageIndex
                                        -> Maybe [LeaseSecret]
                                        -> ReadTestWriteVectors
                                        -> Handler ReadTestWriteResult)
                                       :<|> ((StorageIndex
                                              -> ShareNumber
                                              -> Maybe ByteRanges
                                              -> Handler ShareData)
                                             :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                                                   :<|> (StorageIndex
                                                         -> ShareNumber
                                                         -> CorruptionDetails
                                                         -> Handler ())))))))))
forall a b. a -> b -> a :<|> b
:<|> b
-> StorageIndex
-> ShareNumber
-> Maybe [LeaseSecret]
-> ShareData
-> Maybe ByteRanges
-> Handler ()
forall b.
Backend b =>
b
-> StorageIndex
-> ShareNumber
-> Maybe [LeaseSecret]
-> ShareData
-> Maybe ByteRanges
-> Handler ()
writeImmutableShare b
backend
            (StorageIndex
 -> ShareNumber
 -> Maybe [LeaseSecret]
 -> ShareData
 -> Maybe ByteRanges
 -> Handler ())
-> ((StorageIndex
     -> ShareNumber -> Maybe [LeaseSecret] -> Handler ())
    :<|> ((StorageIndex
           -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
          :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                :<|> ((StorageIndex
                       -> ShareNumber -> CorruptionDetails -> Handler ())
                      :<|> ((StorageIndex
                             -> Maybe [LeaseSecret]
                             -> ReadTestWriteVectors
                             -> Handler ReadTestWriteResult)
                            :<|> ((StorageIndex
                                   -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                                  :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                                        :<|> (StorageIndex
                                              -> ShareNumber
                                              -> CorruptionDetails
                                              -> Handler ()))))))))
-> (StorageIndex
    -> ShareNumber
    -> Maybe [LeaseSecret]
    -> ShareData
    -> Maybe ByteRanges
    -> Handler ())
   :<|> ((StorageIndex
          -> ShareNumber -> Maybe [LeaseSecret] -> Handler ())
         :<|> ((StorageIndex
                -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
               :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                     :<|> ((StorageIndex
                            -> ShareNumber -> CorruptionDetails -> Handler ())
                           :<|> ((StorageIndex
                                  -> Maybe [LeaseSecret]
                                  -> ReadTestWriteVectors
                                  -> Handler ReadTestWriteResult)
                                 :<|> ((StorageIndex
                                        -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                                       :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                                             :<|> (StorageIndex
                                                   -> ShareNumber
                                                   -> CorruptionDetails
                                                   -> Handler ()))))))))
forall a b. a -> b -> a :<|> b
:<|> b
-> StorageIndex -> ShareNumber -> Maybe [LeaseSecret] -> Handler ()
forall b.
Backend b =>
b
-> StorageIndex -> ShareNumber -> Maybe [LeaseSecret] -> Handler ()
abortImmutableUpload b
backend
            (StorageIndex -> ShareNumber -> Maybe [LeaseSecret] -> Handler ())
-> ((StorageIndex
     -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
    :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
          :<|> ((StorageIndex
                 -> ShareNumber -> CorruptionDetails -> Handler ())
                :<|> ((StorageIndex
                       -> Maybe [LeaseSecret]
                       -> ReadTestWriteVectors
                       -> Handler ReadTestWriteResult)
                      :<|> ((StorageIndex
                             -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                            :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                                  :<|> (StorageIndex
                                        -> ShareNumber -> CorruptionDetails -> Handler ())))))))
-> (StorageIndex
    -> ShareNumber -> Maybe [LeaseSecret] -> Handler ())
   :<|> ((StorageIndex
          -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
         :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
               :<|> ((StorageIndex
                      -> ShareNumber -> CorruptionDetails -> Handler ())
                     :<|> ((StorageIndex
                            -> Maybe [LeaseSecret]
                            -> ReadTestWriteVectors
                            -> Handler ReadTestWriteResult)
                           :<|> ((StorageIndex
                                  -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                                 :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                                       :<|> (StorageIndex
                                             -> ShareNumber
                                             -> CorruptionDetails
                                             -> Handler ())))))))
forall a b. a -> b -> a :<|> b
:<|> b
-> StorageIndex
-> ShareNumber
-> Maybe ByteRanges
-> Handler ShareData
forall b.
Backend b =>
b
-> StorageIndex
-> ShareNumber
-> Maybe ByteRanges
-> Handler ShareData
readImmutableShare b
backend
            (StorageIndex
 -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
-> ((StorageIndex -> Handler (CBORSet ShareNumber))
    :<|> ((StorageIndex
           -> ShareNumber -> CorruptionDetails -> Handler ())
          :<|> ((StorageIndex
                 -> Maybe [LeaseSecret]
                 -> ReadTestWriteVectors
                 -> Handler ReadTestWriteResult)
                :<|> ((StorageIndex
                       -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                      :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                            :<|> (StorageIndex
                                  -> ShareNumber -> CorruptionDetails -> Handler ()))))))
-> (StorageIndex
    -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
   :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
         :<|> ((StorageIndex
                -> ShareNumber -> CorruptionDetails -> Handler ())
               :<|> ((StorageIndex
                      -> Maybe [LeaseSecret]
                      -> ReadTestWriteVectors
                      -> Handler ReadTestWriteResult)
                     :<|> ((StorageIndex
                            -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                           :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                                 :<|> (StorageIndex
                                       -> ShareNumber -> CorruptionDetails -> Handler ()))))))
forall a b. a -> b -> a :<|> b
:<|> b -> StorageIndex -> Handler (CBORSet ShareNumber)
forall b.
Backend b =>
b -> StorageIndex -> Handler (CBORSet ShareNumber)
getImmutableShareNumbers b
backend
            (StorageIndex -> Handler (CBORSet ShareNumber))
-> ((StorageIndex
     -> ShareNumber -> CorruptionDetails -> Handler ())
    :<|> ((StorageIndex
           -> Maybe [LeaseSecret]
           -> ReadTestWriteVectors
           -> Handler ReadTestWriteResult)
          :<|> ((StorageIndex
                 -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                      :<|> (StorageIndex
                            -> ShareNumber -> CorruptionDetails -> Handler ())))))
-> (StorageIndex -> Handler (CBORSet ShareNumber))
   :<|> ((StorageIndex
          -> ShareNumber -> CorruptionDetails -> Handler ())
         :<|> ((StorageIndex
                -> Maybe [LeaseSecret]
                -> ReadTestWriteVectors
                -> Handler ReadTestWriteResult)
               :<|> ((StorageIndex
                      -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
                     :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                           :<|> (StorageIndex
                                 -> ShareNumber -> CorruptionDetails -> Handler ())))))
forall a b. a -> b -> a :<|> b
:<|> b -> StorageIndex -> ShareNumber -> CorruptionDetails -> Handler ()
forall b.
Backend b =>
b -> StorageIndex -> ShareNumber -> CorruptionDetails -> Handler ()
adviseCorruptImmutableShare b
backend
            (StorageIndex -> ShareNumber -> CorruptionDetails -> Handler ())
-> ((StorageIndex
     -> Maybe [LeaseSecret]
     -> ReadTestWriteVectors
     -> Handler ReadTestWriteResult)
    :<|> ((StorageIndex
           -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
          :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                :<|> (StorageIndex
                      -> ShareNumber -> CorruptionDetails -> Handler ()))))
-> (StorageIndex -> ShareNumber -> CorruptionDetails -> Handler ())
   :<|> ((StorageIndex
          -> Maybe [LeaseSecret]
          -> ReadTestWriteVectors
          -> Handler ReadTestWriteResult)
         :<|> ((StorageIndex
                -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
               :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
                     :<|> (StorageIndex
                           -> ShareNumber -> CorruptionDetails -> Handler ()))))
forall a b. a -> b -> a :<|> b
:<|> b
-> StorageIndex
-> Maybe [LeaseSecret]
-> ReadTestWriteVectors
-> Handler ReadTestWriteResult
forall b.
Backend b =>
b
-> StorageIndex
-> Maybe [LeaseSecret]
-> ReadTestWriteVectors
-> Handler ReadTestWriteResult
readvAndTestvAndWritev b
backend
            (StorageIndex
 -> Maybe [LeaseSecret]
 -> ReadTestWriteVectors
 -> Handler ReadTestWriteResult)
-> ((StorageIndex
     -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
    :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
          :<|> (StorageIndex
                -> ShareNumber -> CorruptionDetails -> Handler ())))
-> (StorageIndex
    -> Maybe [LeaseSecret]
    -> ReadTestWriteVectors
    -> Handler ReadTestWriteResult)
   :<|> ((StorageIndex
          -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
         :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
               :<|> (StorageIndex
                     -> ShareNumber -> CorruptionDetails -> Handler ())))
forall a b. a -> b -> a :<|> b
:<|> b
-> StorageIndex
-> ShareNumber
-> Maybe ByteRanges
-> Handler ShareData
forall b.
Backend b =>
b
-> StorageIndex
-> ShareNumber
-> Maybe ByteRanges
-> Handler ShareData
readMutableShare b
backend
            (StorageIndex
 -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
-> ((StorageIndex -> Handler (CBORSet ShareNumber))
    :<|> (StorageIndex
          -> ShareNumber -> CorruptionDetails -> Handler ()))
-> (StorageIndex
    -> ShareNumber -> Maybe ByteRanges -> Handler ShareData)
   :<|> ((StorageIndex -> Handler (CBORSet ShareNumber))
         :<|> (StorageIndex
               -> ShareNumber -> CorruptionDetails -> Handler ()))
forall a b. a -> b -> a :<|> b
:<|> b -> StorageIndex -> Handler (CBORSet ShareNumber)
forall b.
Backend b =>
b -> StorageIndex -> Handler (CBORSet ShareNumber)
getMutableShareNumbers b
backend
            (StorageIndex -> Handler (CBORSet ShareNumber))
-> (StorageIndex -> ShareNumber -> CorruptionDetails -> Handler ())
-> (StorageIndex -> Handler (CBORSet ShareNumber))
   :<|> (StorageIndex
         -> ShareNumber -> CorruptionDetails -> Handler ())
forall a b. a -> b -> a :<|> b
:<|> b -> StorageIndex -> ShareNumber -> CorruptionDetails -> Handler ()
forall b.
Backend b =>
b -> StorageIndex -> ShareNumber -> CorruptionDetails -> Handler ()
adviseCorruptMutableShare b
backend

main :: StorageServerConfig -> IO ()
main :: StorageServerConfig -> IO ()
main StorageServerConfig
config =
    Application -> IO ()
run (Application -> IO ()) -> Application -> IO ()
forall a b. (a -> b) -> a -> b
$ FilesystemBackend -> Application
forall b. Backend b => b -> Application
app (StorageIndex -> FilesystemBackend
FilesystemBackend (StorageIndex -> FilesystemBackend)
-> StorageIndex -> FilesystemBackend
forall a b. (a -> b) -> a -> b
$ StorageServerConfig -> StorageIndex
storagePath StorageServerConfig
config)
  where
    settings :: Settings
settings = Int -> Settings -> Settings
setPort (StorageServerConfig -> Int
listenPort StorageServerConfig
config) Settings
defaultSettings
    run :: Application -> IO ()
run Application
a =
        case (StorageServerConfig -> Maybe StorageIndex
certificate StorageServerConfig
config, StorageServerConfig -> Maybe StorageIndex
key StorageServerConfig
config) of
            (Maybe StorageIndex
Nothing, Maybe StorageIndex
Nothing) -> Settings -> Application -> IO ()
runSettings Settings
settings Application
a
            (Just StorageIndex
c, Just StorageIndex
k) -> TLSSettings -> Settings -> Application -> IO ()
runTLS (StorageIndex -> StorageIndex -> TLSSettings
tlsSettings StorageIndex
c StorageIndex
k) Settings
settings Application
a
            (Maybe StorageIndex, Maybe StorageIndex)
_ -> MisconfiguredTLS -> IO ()
forall a e. Exception e => e -> a
throw MisconfiguredTLS
MisconfiguredTLS