https://github.com/fission-codes/ipfs-haskell
IPFS wrapper for Haskell
https://github.com/fission-codes/ipfs-haskell
content-addressing ipfs library
Last synced: 3 months ago
JSON representation
IPFS wrapper for Haskell
- Host: GitHub
- URL: https://github.com/fission-codes/ipfs-haskell
- Owner: fission-codes
- License: apache-2.0
- Created: 2019-11-22T02:33:36.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2023-04-04T06:39:26.000Z (over 2 years ago)
- Last Synced: 2025-04-03T04:56:18.373Z (3 months ago)
- Topics: content-addressing, ipfs, library
- Language: Haskell
- Homepage: https://hackage.haskell.org/package/ipfs
- Size: 184 KB
- Stars: 43
- Watchers: 5
- Forks: 5
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
- Code of conduct: .github/CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# ipfs-haskell
[](https://travis-ci.org/fission-suite/ipfs-haskell)
[](https://github.com/fission-suite/blob/master/LICENSE)
[](https://codeclimate.com/github/fission-suite/ipfs-haskell/maintainability)
[](https://fission.codes)
[](https://discord.gg/zAQBDEq)
[](https://talk.fission.codes)Documentation: [ipfs on hackage](http://hackage.haskell.org/package/ipfs)
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:
```haskell
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:
```haskell
import Network.IPFS
import qualified Network.IPFS.Add as IPFS
import Network.IPFS.File.Types as Fileadd ::
MonadLocalIPFS m
=> File.Serialzed
-> m ()
add (Serialized rawData) = IPFS.addRaw rawData >>= \case
Right newCID ->
-- ...
Left err ->
-- ...```
You can see example instances below:
```haskell
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") : optsrunProc 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 stdErrinstance
( Has IPFS.URL cfg
, Has HTTP.Manager cfg
)
=> MonadRemoteIPFS (RIO cfg) where
runRemote query = do
IPFS.URL url <- view hasLens
manager <- view hasLensurl
& mkClientEnv manager
& runClientM query
& liftIO
```