{- Copyright 2016 Joey Hess - - Licensed under the GNU AGPL version 3 or higher. -} {-# LANGUAGE OverloadedStrings #-} module Storage.Network ( networkStorage, ) where import Types import Types.Storage import Types.Server import Storage.Local import HTTP.Client import HTTP.ProofOfWork import System.FilePath networkStorage :: Maybe LocalStorageDirectory -> Server -> Storage networkStorage localdir server = Storage { storeShare = store server , retrieveShare = retrieve server , obscureShares = obscure server , countShares = count server , moveShares = move server , uploadQueue = Just $ localStorage (storageDir localdir) ("uploadqueue" name) , getServer = Just server } where ServerName name = serverName server store :: Server -> StorableObjectIdent -> Share -> IO StoreResult store srv i (Share _n o) = serverRequest srv StoreFailure id i $ \pow -> putObject i pow o retrieve :: Server -> ShareNum -> StorableObjectIdent -> IO RetrieveResult retrieve srv n i = serverRequest srv RetrieveFailure (RetrieveSuccess . Share n) i $ getObject i -- | Servers should automatically obscure, so do nothing. -- (Could upload chaff.) obscure :: Server -> IO ObscureResult obscure _ = return ObscureSuccess count :: Server -> IO CountResult count srv = serverRequest srv CountFailure id NoPOWIdent countObjects -- | Not needed for servers. move :: Server -> Storage -> IO [StoreResult] move _ _ = error "move is not implemented for servers"