class DEVp2p::MultiplexedSession

Public Class Methods

new(privkey, hello_packet, remote_pubkey=nil) click to toggle source
Calls superclass method
# File lib/devp2p/multiplexed_session.rb, line 6
def initialize(privkey, hello_packet, remote_pubkey=nil)
  @hello_packet = hello_packet
  @remote_pubkey = remote_pubkey

  @message_queue = SyncQueue.new # wire msg egress queue
  @packet_queue = SyncQueue.new # packet ingress queue

  @is_initiator = !!remote_pubkey
  @handshake_finished = false

  ecc = Crypto::ECCx.new privkey
  @rlpx_session = RLPxSession.new ecc, @is_initiator

  super(@rlpx_session)

  send_init_msg if @is_initiator
end

Public Instance Methods

add_message(msg) click to toggle source
# File lib/devp2p/multiplexed_session.rb, line 48
def add_message(msg)
  @handshake_finished ? add_message_post_handshake(msg) : add_message_during_handshake(msg)
end
add_packet(packet) click to toggle source

encodes a packet and adds the message(s) to the message queue.

Calls superclass method
# File lib/devp2p/multiplexed_session.rb, line 55
def add_packet(packet)
  raise MultiplexedSessionError, 'session is not ready' unless ready?
  raise ArgumentError, 'packet must be instance of Packet' unless packet.is_a?(Packet)

  super(packet)

  pop_all_frames.each {|f| @message_queue.enq f.as_bytes }
end
get_message() click to toggle source
# File lib/devp2p/multiplexed_session.rb, line 24
def get_message
  @message_queue.deq
end
get_packet() click to toggle source
# File lib/devp2p/multiplexed_session.rb, line 28
def get_packet
  @packet_queue.deq
end
initiator?() click to toggle source
# File lib/devp2p/multiplexed_session.rb, line 36
def initiator?
  @is_initiator
end
ready?() click to toggle source
# File lib/devp2p/multiplexed_session.rb, line 32
def ready?
  @rlpx_session.ready?
end
remote_pubkey() click to toggle source
# File lib/devp2p/multiplexed_session.rb, line 40
def remote_pubkey
  @remote_pubkey || @rlpx_session.remote_pubkey
end
remote_pubkey=(key) click to toggle source
# File lib/devp2p/multiplexed_session.rb, line 44
def remote_pubkey=(key)
  @remote_pubkey = key
end

Private Instance Methods

add_message_during_handshake(msg) click to toggle source
# File lib/devp2p/multiplexed_session.rb, line 73
def add_message_during_handshake(msg)
  raise MultiplexedSessionError, 'handshake after ready is not allowed' if ready?

  if initiator?
    # expecting auth ack message
    rest = @rlpx_session.decode_auth_ack_message msg
    @rlpx_session.setup_cipher

    # add remains (hello) to queue
    add_message_post_handshake(rest) unless rest.empty?
  else
    # expecting auth_init
    rest = @rlpx_session.decode_authentication msg
    auth_ack_msg = @rlpx_session.create_auth_ack_message
    auth_ack_msg_ct = @rlpx_session.encrypt_auth_ack_message auth_ack_msg

    @message_queue.enq auth_ack_msg_ct

    @rlpx_session.setup_cipher
    add_message_post_handshake(rest) unless rest.empty?
  end

  @handshake_finished = true
  raise MultiplexedSessionError, 'session is not ready after handshake' unless @rlpx_session.ready?

  add_packet @hello_packet
end
add_message_post_handshake(msg) click to toggle source
# File lib/devp2p/multiplexed_session.rb, line 101
def add_message_post_handshake(msg)
  decode(msg).each do |packet|
    @packet_queue.enq packet
  end
end
send_init_msg() click to toggle source
# File lib/devp2p/multiplexed_session.rb, line 66
def send_init_msg
  auth_msg = @rlpx_session.create_auth_message @remote_pubkey
  auth_msg_ct = @rlpx_session.encrypt_auth_message auth_msg

  @message_queue.enq auth_msg_ct
end