README
ipfs-haskell
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.