class Sass::Embedded::Compiler

can be observed by an {Observer}.
‘dart-sass-embedded` using protocol buffers via stdio. Received messages
The {::Observable} {Compiler} for low level communication with

def add_observer(*args)

def add_observer(*args)
  @observerable_mutex.synchronize do
    raise ProtocolError, 'half-closed compiler' if half_closed?
    super(*args)
    id = @id
    @id = @id.next
    id
  end
end

def close

def close
  delete_observers
  @stdin_mutex.synchronize do
    @stdin.close unless @stdin.closed?
    @stdout.close unless @stdout.closed?
    @stderr.close unless @stderr.closed?
  end
  @wait_thread.value
end

def closed?

def closed?
  @stdin_mutex.synchronize do
    @stdin.closed?
  end
end

def delete_observer(*args)

def delete_observer(*args)
  @observerable_mutex.synchronize do
    super(*args)
    close if half_closed? && count_observers.zero?
  end
end

def half_closed?

def half_closed?
  @id == PROTOCOL_ERROR_ID
end

def initialize

def initialize
  @observerable_mutex = Mutex.new
  @id = 0
  @stdin_mutex = Mutex.new
  @stdin, @stdout, @stderr, @wait_thread = Open3.popen3(PATH)
  [@stdin, @stdout].each(&:binmode)
  poll do
    warn(@stderr.readline, uplevel: 1)
  end
  poll do
    receive_message Protofier.from_proto_message read
  end
end

def notify_observers(*args)

def notify_observers(*args)
  @observerable_mutex.synchronize do
    changed
    super(*args)
  end
end

def poll

def poll
  Thread.new do
    loop do
      yield
    rescue StandardError => e
      notify_observers(e, nil)
      close
      break
    end
  end
end

def read

def read
  length = Varint.read(@stdout)
  @stdout.read(length)
end

def receive_message(message)

def receive_message(message)
  case message
  when EmbeddedProtocol::ProtocolError
    raise ProtocolError, message.message
  else
    notify_observers(nil, message)
  end
end

def send_message(message)

def send_message(message)
  write Protofier.to_proto_message message
end

def write(payload)

def write(payload)
  @stdin_mutex.synchronize do
    Varint.write(@stdin, payload.length)
    @stdin.write(payload)
  end
end