2018-06-20 20:23:16 +03:00
|
|
|
# scala-multiaddr
|
|
|
|
|
|
|
|
> [multiaddr](https://github.com/multiformats/multiaddr) implementation in scala
|
|
|
|
|
|
|
|
Multiaddr is a standard way to represent addresses that:
|
|
|
|
|
|
|
|
- Support any standard network protocols.
|
|
|
|
- Self-describe (include protocols).
|
|
|
|
- Have a binary packed format.
|
|
|
|
- Have a nice string representation.
|
|
|
|
- Encapsulate well.
|
|
|
|
|
|
|
|
## Install
|
|
|
|
|
|
|
|
```scala
|
|
|
|
// Bintray repo is used so far. Migration to Maven Central is planned
|
|
|
|
resolvers += Resolver.bintrayRepo("fluencelabs", "releases")
|
|
|
|
|
|
|
|
libraryDependencies += "one.fluence" %%% "scala-multiaddr" % "0.0.1"
|
|
|
|
```
|
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
### Example
|
|
|
|
|
|
|
|
#### Simple
|
|
|
|
|
|
|
|
```scala
|
|
|
|
import fluence.multiaddr.Multiaddr
|
|
|
|
|
|
|
|
val addr = "/ip4/127.0.0.1/tcp/1234"
|
|
|
|
// construct from a string (ErrorMessage return error message in ther parsing process)
|
|
|
|
val mEither: Either[ErrorMessage, Multiaddr] = Multiaddr(addr)
|
|
|
|
val m = mEither.right.get
|
|
|
|
|
|
|
|
// true
|
|
|
|
m.address == "/ip4/127.0.0.1/tcp/1234"
|
|
|
|
```
|
|
|
|
|
|
|
|
#### Protocols
|
|
|
|
|
|
|
|
```scala
|
|
|
|
// get the multiaddr protocol description objects
|
|
|
|
m.protoParameters
|
|
|
|
|
|
|
|
//List(
|
|
|
|
// StringProtoParameter(IP4, "127.0.0.1"),
|
|
|
|
// IntProtoParameter(TCP, 1234),
|
|
|
|
// EmptyProtoParameter(HTTP)
|
|
|
|
//)
|
|
|
|
```
|
|
|
|
|
|
|
|
#### En/decapsulate
|
|
|
|
|
|
|
|
```scala
|
|
|
|
m.encapsulate(Multiaddr.unsafe("/sctp/5678"))
|
|
|
|
// Multiaddr(/ip4/127.0.0.1/tcp/1234/sctp/5678,List(StringProtoParameter(IP4,127.0.0.1), IntProtoParameter(TCP,1234), IntProtoParameter(SCTP,5678)))
|
|
|
|
m.decapsulate("/tcp") // up to + inc last occurrence of subaddr
|
|
|
|
// Multiaddr(/ip4/127.0.0.1,List(StringProtoParameter(IP4,127.0.0.1)))
|
|
|
|
```
|
|
|
|
|
|
|
|
#### Tunneling
|
|
|
|
|
|
|
|
Multiaddr allows expressing tunnels very nicely.
|
|
|
|
|
|
|
|
```scala
|
|
|
|
val addr = Multiaddr.unsafe("/ip4/192.168.0.13/tcp/80")
|
|
|
|
val proxy = Multiaddr.unsafe("/ip4/10.20.30.40/tcp/443")
|
|
|
|
val addrOverProxy := proxy.encapsulate(m)
|
|
|
|
// /ip4/10.20.30.40/tcp/443/ip4/192.168.0.13/tcp/80
|
|
|
|
|
|
|
|
val proxyAgain = addrOverProxy.decapsulate(addr)
|
|
|
|
// /ip4/10.20.30.40/tcp/443
|
|
|
|
```
|