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 defmodule 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 raise :do_not_use_this # assert false end end end defmodule 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 defmodule SNet.CipherChan do # TODO end