diff options
Diffstat (limited to 'shard/lib/net/chan.ex')
-rw-r--r-- | shard/lib/net/chan.ex | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/shard/lib/net/chan.ex b/shard/lib/net/chan.ex new file mode 100644 index 0000000..aa5c186 --- /dev/null +++ b/shard/lib/net/chan.ex @@ -0,0 +1,66 @@ +defprotocol SNet.Chan do + @moduledoc""" + Abstract definition for a communication channel + """ + + @doc""" + Function to send a message to relevant peers. + """ + def send(chan, msg) + + @doc""" + Function to declare a handler for a channel + """ + def handle(chan, func) +end + +def SNet.PeerChan do + @moduledoc""" + Direct channel to a peer + """ + + defstruct [:peer_id, :shard_id, :path] + + def new(peer_id, shard_id, path) do + %__MODULE__{peer_id: peer_id, shard_id: shard_id, path: path} + end + + defimpl SNet.Chan do + def send(chan, msg) do + Shard.Manager.send(chan.peer_id, {chan.shard_id, chan.path, msg}) + end + + def handle(chan, func) do + # DO NOT USE THIS + assert false + end + end +end + +def SNet.FloodChan do + @moduledoc""" + Channel that send a message to all know peers for shard (floods the network) + """ + + defstruct [:shard_id, :path] + + def new(shard_id, path) do + %__MODULE__{shard_id: shard_id, path: path} + end + + defimpl SNet.Chan do + def send(chan, msg) do + for x <- Shard.Manager.get_shard_peers(chan.shard_id) do + Shard.Manager.send(x, {chan.shard_id, chan.path, msg}) + end + end + + def handle(chan, func) do + # TODO + end + end +end + +def SNet.CipherChan do + # TODO +end |