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 half_close
def half_close @mutex.synchronize do @id = PROTOCOL_ERROR_ID end end
def half_closed?
def half_closed? @id == PROTOCOL_ERROR_ID 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 => e half_close @observers.each_value do |observer| observer.error e end break end end end
def receive_message(outbound_message)
def receive_message(outbound_message) message = outbound_message.send(outbound_message.message) case outbound_message.message when :error half_close @observers[message.id]&.send(outbound_message.message, message) when :compile_response, :version_response @observers[message.id].send(outbound_message.message, message) when :log_event, :canonicalize_request, :import_request, :file_import_request, :function_call_request Thread.new(@observers[message.compilation_id]) do |observer| observer.send(outbound_message.message, 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 half_closed? id = @id @id = id.next @observers[id] = observer id end end
def unsubscribe(id)
def unsubscribe(id) @observers.delete(id) close if half_closed? && @observers.empty? end