class Sass::Compiler::Host

It communicates with {Dispatcher} and handles the host logic.
The {Host} class.

def await

def await
  listen do
    yield
    while (proto = @queue.pop)
      outbound_message = EmbeddedProtocol::OutboundMessage.decode(proto)
      oneof = outbound_message.message
      message = outbound_message.public_send(oneof)
      public_send(oneof, message)
    end
  rescue Exception => e # rubocop:disable Lint/RescueException
    @stream.error(e)
    raise
  end
end

def await0

def await0
  listen do
    yield
    @queue.pop
  end
end

def canonicalize_request(message)

def canonicalize_request(message)
  send_message(canonicalize_response: @importer_registry.canonicalize(message))
end

def compile_request(path:,

def compile_request(path:,
                    source:,
                    importer:,
                    load_paths:,
                    syntax:,
                    url:,
                    charset:,
                    source_map:,
                    source_map_include_sources:,
                    style:,
                    functions:,
                    importers:,
                    alert_ascii:,
                    alert_color:,
                    fatal_deprecations:,
                    future_deprecations:,
                    logger:,
                    quiet_deps:,
                    silence_deprecations:,
                    verbose:)
  alert_color = Exception.to_tty? if alert_color.nil?
  @function_registry = FunctionRegistry.new(functions, alert_color:)
  @importer_registry = ImporterRegistry.new(importers, load_paths, alert_color:)
  @logger_registry = LoggerRegistry.new(logger)
  compile_request = EmbeddedProtocol::InboundMessage::CompileRequest.new(
    string: unless source.nil?
              EmbeddedProtocol::InboundMessage::CompileRequest::StringInput.new(
                source: source.to_str,
                url: url&.to_s,
                syntax: @importer_registry.syntax_to_proto(syntax),
                importer: (@importer_registry.register(importer) unless importer.nil?)
              )
            end,
    path: (File.absolute_path(path) unless path.nil?),
    style: case style&.to_sym
           when :expanded
             EmbeddedProtocol::OutputStyle::EXPANDED
           when :compressed
             EmbeddedProtocol::OutputStyle::COMPRESSED
           else
             raise ArgumentError, 'style must be one of :expanded, :compressed'
           end,
    charset:,
    source_map:,
    source_map_include_sources:,
    importers: @importer_registry.importers,
    global_functions: @function_registry.global_functions,
    alert_ascii:,
    alert_color:,
    fatal_deprecation: fatal_deprecations.map(&:to_s),
    future_deprecation: future_deprecations.map(&:to_s),
    quiet_deps:,
    silent: logger == Logger.silent,
    silence_deprecation: silence_deprecations.map(&:to_s),
    verbose:
  )
  compile_response = await do
    send_message(compile_request:)
  end
  oneof = compile_response.result
  result = compile_response.public_send(oneof)
  case oneof
  when :failure
    raise CompileError.new(
      result.message,
      result.formatted == '' ? nil : result.formatted,
      result.stack_trace == '' ? nil : result.stack_trace,
      result.span.nil? ? nil : Logger::SourceSpan.new(result.span),
      compile_response.loaded_urls.to_a
    )
  when :success
    CompileResult.new(
      result.css,
      result.source_map == '' ? nil : result.source_map,
      compile_response.loaded_urls.to_a
    )
  else
    raise ArgumentError, "Unknown CompileResponse.result #{result}"
  end
end

def compile_response(message)

def compile_response(message)
  @result = message
  @queue.close
end

def error(message)

def error(message)
  case message
  when EmbeddedProtocol::ProtocolError
    raise Errno::EPROTO, message.message
  else
    @error ||= message
    @queue.close
  end
end

def file_import_request(message)

def file_import_request(message)
  send_message(file_import_response: @importer_registry.file_import(message))
end

def function_call_request(message)

def function_call_request(message)
  send_message(function_call_response: @function_registry.function_call(message))
end

def id

def id
  @stream.id
end

def import_request(message)

def import_request(message)
  send_message(import_response: @importer_registry.import(message))
end

def initialize(channel)

def initialize(channel)
  @channel = channel
end

def listen

def listen
  @queue = Queue.new
  @stream = @channel.stream(self)
  yield
  raise @error if @error
  @result
ensure
  @stream&.close
  @queue&.close
end

def log_event(message)

def log_event(message)
  @logger_registry.log(message)
end

def receive_proto(proto)

def receive_proto(proto)
  @queue.push(proto)
end

def send_message(...)

def send_message(...)
  inbound_message = EmbeddedProtocol::InboundMessage.new(...)
  @stream.send_proto(id, EmbeddedProtocol::InboundMessage.encode(inbound_message))
end

def send_message0(...)

def send_message0(...)
  inbound_message = EmbeddedProtocol::InboundMessage.new(...)
  @stream.send_proto(0, EmbeddedProtocol::InboundMessage.encode(inbound_message))
end

def version_request

def version_request
  version_response = await0 do
    send_message0(version_request: EmbeddedProtocol::InboundMessage::VersionRequest.new(
      id:
    ))
  end
  info = [
    version_response.implementation_name,
    version_response.implementation_version,
    '(Sass Compiler)'
  ]
  case version_response.implementation_name
  when 'dart-sass'
    info << (CLI::COMMAND.first == 'node' ? '[JavaScript]' : '[Dart]')
  end
  info
end

def version_response(message)

def version_response(message)
  @result = message
  @queue.close
end