lib/sass/embedded/channel.rb



# frozen_string_literal: true

module Sass
  class Embedded
    # The {Channel} class.
    #
    # It establishes connection between {Host} and {Dispatcher}.
    class Channel
      def initialize
        @dispatcher = Dispatcher.new
        @mutex = Mutex.new
      end

      def close
        @mutex.synchronize do
          @dispatcher.close
        end
      end

      def closed?
        @mutex.synchronize do
          @dispatcher.closed?
        end
      end

      def connect(observer)
        @mutex.synchronize do
          begin
            id = @dispatcher.subscribe(observer)
          rescue EOFError
            @dispatcher = Dispatcher.new
            id = @dispatcher.subscribe(observer)
          end
          Connection.new(@dispatcher, id)
        end
      end

      # The {Connection} between {Host} to {Dispatcher}.
      class Connection
        attr_reader :id

        def initialize(dispatcher, id)
          @dispatcher = dispatcher
          @id = id
        end

        def disconnect
          @dispatcher.unsubscribe(id)
        end

        def send_message(message)
          @dispatcher.send_message(message)
        end
      end

      private_constant :Connection
    end

    private_constant :Channel
  end
end