Popularity
8.0
Stable
Activity
1.6
Stable
43
5
5

Monthly Downloads: 42
Programming language: Haskell
License: Apache License 2.0
Tags: Network     Networking     Ipfs    
Add another 'ipfs' Package

README

ipfs-haskell

Build Status License Maintainability Built by FISSION Discord Discourse

Documentation: ipfs on hackage

A library for integrating IPFS into your haskell applications. Interact with the IPFS network by shelling out to a local IPFS node or communicating via the HTTP interface of a remote node.

QuickStart

Define instances for MonadLocalIPFS and/or MonadRemoteIPFS. Each requires only one function:

class Monad m => MonadRemoteIPFS m where runRemote :: Servant.ClientM a -> m (Either Servant.ClientError a) class Monad m => MonadLocalIPFS m where runLocal :: [IPFS.Opt] -> Lazy.ByteString -> m (Either Process.Error Process.RawMessage) 

We use RIO processes to shell out to a local IPFS node and Servant for HTTP requests to a remote node.

After that, simply add MonadLocalIPFS m as a constraint to a function and you'll be able to call IPFS within it. For instance:

import Network.IPFS import qualified Network.IPFS.Add as IPFS import Network.IPFS.File.Types as File add :: MonadLocalIPFS m => File.Serialzed -> m () add (Serialized rawData) = IPFS.addRaw rawData >>= \case Right newCID -> -- ... Left err -> -- ... 

You can see example instances below:

instance ( HasProcessContext cfg , HasLogFunc cfg , Has IPFS.BinPath cfg , Has IPFS.Timeout cfg ) => MonadLocalIPFS (RIO cfg) where runLocal opts arg = do IPFS.BinPath ipfs <- view hasLens IPFS.Timeout secs <- view hasLens let opts' = ("--timeout=" <> show secs <> "s") : opts runProc readProcess ipfs (byteStringInput arg) byteStringOutput opts' >>= \case (ExitSuccess, contents, _) -> return $ Right contents (ExitFailure _, _, stdErr) | Lazy.isSuffixOf "context deadline exceeded" stdErr -> return . Left $ Process.Timeout secs | otherwise -> return . Left $ Process.UnknownErr stdErr instance ( Has IPFS.URL cfg , Has HTTP.Manager cfg ) => MonadRemoteIPFS (RIO cfg) where runRemote query = do IPFS.URL url <- view hasLens manager <- view hasLens url & mkClientEnv manager & runClientM query & liftIO 


*Note that all licence references and agreements mentioned in the ipfs README section above are relevant to that project's source code only.