Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sile/erl_dist
Rust Implementation of Erlang Distribution Protocol
https://github.com/sile/erl_dist
asynchronous distributed erlang rust
Last synced: 4 days ago
JSON representation
Rust Implementation of Erlang Distribution Protocol
- Host: GitHub
- URL: https://github.com/sile/erl_dist
- Owner: sile
- License: mit
- Created: 2016-12-13T18:08:07.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2024-06-15T12:36:17.000Z (6 months ago)
- Last Synced: 2024-12-01T04:04:57.662Z (11 days ago)
- Topics: asynchronous, distributed, erlang, rust
- Language: Rust
- Homepage:
- Size: 207 KB
- Stars: 151
- Watchers: 5
- Forks: 13
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- beamtoolbox - [erl
README
erl_dist
========[![erl_dist](https://img.shields.io/crates/v/erl_dist.svg)](https://crates.io/crates/erl_dist)
[![Documentation](https://docs.rs/erl_dist/badge.svg)](https://docs.rs/erl_dist)
[![Actions Status](https://github.com/sile/erl_dist/workflows/CI/badge.svg)](https://github.com/sile/erl_dist/actions)
[![Coverage Status](https://coveralls.io/repos/github/sile/erl_dist/badge.svg?branch=master)](https://coveralls.io/github/sile/erl_dist?branch=master)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)Rust Implementation of [Erlang Distribution Protocol](http://erlang.org/doc/apps/erts/erl_dist_protocol.html).
The distribution protocol is used to communicate with distributed erlang nodes.
Examples
---------Gets a node entry from EPMD:
```rust
use erl_dist::epmd::{DEFAULT_EPMD_PORT, EpmdClient};// Connect to the local EPMD.
let connection = TcpStream::connect(("localhost", DEFAULT_EPMD_PORT)).await?;
let client = EpmdClient::new(connection);// Get the information of a node.
let node_name = "foo";
if let Some(node) = client.get_node(node_name).await? {
println!("Found: {:?}", node);
} else {
println!("Not found");
}
```Sends a message to an Erlang node:
```rust
use erl_dist::LOWEST_DISTRIBUTION_PROTOCOL_VERSION;
use erl_dist::node::{Creation, LocalNode};
use erl_dist::handshake::ClientSideHandshake;
use erl_dist::term::{Atom, Pid};
use erl_dist::message::{channel, Message};// Connect to a peer node.
let peer_host = "localhost";
let peer_port = 7483; // NOTE: Usually, port number is retrieved from EPMD.
let connection = TcpStream::connect((peer_host, peer_port)).await?;// Local node information.
let creation = Creation::random();
let local_node = LocalNode::new("foo@localhost".parse()?, creation);// Do handshake.
let mut handshake = ClientSideHandshake::new(connection, local_node.clone(), "cookie");
let _status = handshake.execute_send_name(LOWEST_DISTRIBUTION_PROTOCOL_VERSION).await?;
let (connection, peer_node) = handshake.execute_rest(true).await?;// Create a channel.
let capability_flags = local_node.flags & peer_node.flags;
let (mut tx, _) = channel(connection, capability_flags);// Send a message.
let from_pid = Pid::new(local_node.name.to_string(), 0, 0, local_node.creation.get());
let to_name = Atom::from("bar");
let msg = Message::reg_send(from_pid, to_name, Atom::from("hello").into());
tx.send(msg).await?;
```Example commands:
- EPMD Client Example: [epmd_cli.rs](examples/epmd_cli.rs)
- Client Node Example: [send_msg.rs](examples/send_msg.rs)
- Server Node Example: [recv_msg.rs](examples/recv_msg.rs)Related Crates
--------------- [erl_rpc](https://github.com/sile/erl_rpc): Erlang RPC client for Rust
- [erldash](https://github.com/sile/erldash): Terminal-based Erlang dashboard