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