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