web3-0.9.0.0: src/Network/Ipfs/Api/Core.hs
{-# LANGUAGE OverloadedStrings #-}
-- |
-- Module : Network.Ipfs.Api.Core
-- Copyright : Alexander Krupenkin 2016
-- License : BSD3
--
-- Maintainer : mail@akru.me
-- Stability : experimental
-- Portability : unknown
--
-- Core IPFS API calls.
--
module Network.Ipfs.Api.Core where
import qualified Codec.Archive.Tar as Tar
import Control.Monad.IO.Class (MonadIO (..))
import Data.Aeson (decode)
import Data.ByteString.Lazy (fromStrict)
import Data.Text (Text)
import Data.Text.Encoding (encodeUtf8)
import Network.HTTP.Client (responseBody)
import Servant.API.ContentTypes (NoContent)
import Network.Ipfs.Api.Internal (_cat, _dns, _get, _id,
_idPeer, _ls, _shutdown,
_version)
import Network.Ipfs.Api.Internal.Call (call, multipartCall,
streamCall)
import Network.Ipfs.Api.Internal.Stream (_ping, _refs, _refsLocal)
import Network.Ipfs.Api.Types (AddObj, CatReturnType,
DnsObj, IdObj, LsObj,
VersionObj)
import Network.Ipfs.Client (IpfsT)
-- | Show IPFS object data.
cat :: MonadIO m => Text -> IpfsT m CatReturnType
cat = call . _cat
-- | Add a file or directory to ipfs.
add :: MonadIO m => Text -> IpfsT m (Maybe AddObj)
add = fmap decodeResponse . multipartCall "add"
where
decodeResponse = decode . responseBody
-- | List directory contents for Unix filesystem objects.
ls :: MonadIO m => Text -> IpfsT m LsObj
ls = call . _ls
-- | Download IPFS objects.
get :: MonadIO m => Text -> IpfsT m Text
get hash = do
ret <- call $ _get hash
do liftIO $ Tar.unpack "getResponseDirectory" . Tar.read . fromStrict $ encodeUtf8 ret
pure "The content has been stored in getResponseDirectory."
-- | Show ipfs version information.
version :: MonadIO m => IpfsT m VersionObj
version = call _version
-- | Show ipfs node id info.
id :: MonadIO m => IpfsT m IdObj
id = call _id
-- | Show ipfs node id info of the given peerId.
idPeer :: MonadIO m => Text -> IpfsT m IdObj
idPeer = call . _idPeer
-- | Resolve DNS links.
dns :: MonadIO m => Text -> IpfsT m DnsObj
dns = call . _dns
-- | List links (references) from an object.
refs :: MonadIO m => Text -> m ()
refs = streamCall . _refs
-- | List all local references.
refsLocal :: MonadIO m => m ()
refsLocal = streamCall _refsLocal
-- | Send echo request packets to IPFS hosts.
ping :: MonadIO m => Text -> m ()
ping = streamCall . _ping
-- | Shut down the ipfs daemon.
shutdown :: MonadIO m => IpfsT m NoContent
shutdown = call _shutdown