class Farcall::JsonTransport

The transport that uses delimited texts formatted with JSON. Delimiter should be a character sequence that will never appear in data, by default “x00” is used. Also several nnn can be used, most JSON codecs never insert several empty strings

Public Class Methods

new(delimiter: "\x00", **params) click to toggle source

Create json transport, see Farcall::Transpor#create for parameters

Calls superclass method Farcall::Transport::new
# File lib/farcall/json_transport.rb, line 94
def initialize delimiter: "\x00", **params
  super()
  setup_streams **params
  @delimiter = delimiter
  @dlength   = -delimiter.length
  @thread = Thread.start {
    load_loop
  }
end

Public Instance Methods

close() click to toggle source
# File lib/farcall/json_transport.rb, line 108
def close
  if !@closing
    @closing  = true
    close_connection
    @thread and @thread.join
    @thread = nil
  end
end
send_data(hash) click to toggle source
# File lib/farcall/json_transport.rb, line 104
def send_data hash
  @output << JSON.unparse(hash) + @delimiter
end

Private Instance Methods

load_loop() click to toggle source
# File lib/farcall/json_transport.rb, line 119
def load_loop
  buffer = ''
  while !@input.eof?
    buffer << @input.read(1)
    if buffer[@dlength..-1] == @delimiter
      push_input JSON.parse(buffer[0...@dlength])
      buffer = ''
    end
  end
rescue Errno::EPIPE
  close
rescue
  if !@closing
    STDERR.puts "Farcall::JsonTransport read loop failed: #{$!.class.name}: #$!"
    STDERR.puts $!.backtrace.join("\n")
    connection_aborted $!
  else
    close
  end
end