class Sass::Embedded::Dispatcher

It dispatches messages between mutliple instances of {Host} and a single {Compiler}.
The {Dispatcher} class.

def close

def close
  @compiler.close
end

def closed?

def closed?
  @compiler.closed?
end

def initialize

def initialize
  @compiler = Compiler.new
  @observers = {}
  @id = 0
  @mutex = Mutex.new
  Thread.new do
    loop do
      receive_message EmbeddedProtocol::OutboundMessage.decode @compiler.read
    rescue IOError, Errno::EBADF => e
      @mutex.synchronize do
        @id = PROTOCOL_ERROR_ID
        @observers.values
      end.each do |observer|
        observer.error e
      end
      break
    end
  end
end

def receive_message(outbound_message)

def receive_message(outbound_message)
  oneof = outbound_message.message
  message = outbound_message.public_send(oneof)
  case oneof
  when :error
    @mutex.synchronize do
      @id = PROTOCOL_ERROR_ID
      message.id == PROTOCOL_ERROR_ID ? @observers.values : [@observers[message.id]]
    end.each do |observer|
      observer.public_send(oneof, message)
    end
  when :compile_response, :version_response
    @mutex.synchronize { @observers[message.id] }.public_send(oneof, message)
  when :log_event, :canonicalize_request, :import_request, :file_import_request, :function_call_request
    Thread.new(@mutex.synchronize { @observers[message.compilation_id] }) do |observer|
      observer.public_send(oneof, message)
    end
  else
    raise ArgumentError, "Unknown OutboundMessage.message #{message}"
  end
end

def send_message(inbound_message)

def send_message(inbound_message)
  @compiler.write(inbound_message.to_proto)
end

def subscribe(observer)

def subscribe(observer)
  @mutex.synchronize do
    raise EOFError if @id == PROTOCOL_ERROR_ID
    id = @id
    @id = id.next
    @observers[id] = observer
    id
  end
end

def unsubscribe(id)

def unsubscribe(id)
  @mutex.synchronize do
    @observers.delete(id)
    close if @id == PROTOCOL_ERROR_ID && @observers.empty?
  end
end