Sha256: 7e65dfe88b075473932b85a70e2fe5216983b7f1af3dc6732a52a87a7d7bf0e6

Contents?: true

Size: 1.54 KB

Versions: 1

Compression:

Stored size: 1.54 KB

Contents

# frozen_string_literal: true

require_relative 'async_partial/railtie'

module AsyncPartial
  module Renderer
    def render(context, options, block)
      if (options.delete(:async) || (options[:locals]&.delete(:async)))
        AsyncResult.new(Thread.new { super })
      else
        super
      end
    end
  end

  class AsyncResult
    def initialize(thread)
      @thread = thread
    end

    def nil?
      false
    end

    def html_safe?
      true
    end

    def to_s
      self
    end

    def value
      val = @thread.value
      @thread.kill
      val
    end
  end

  module ArrayBuffer
    def initialize(*)
      super
      @values = []
    end

    def <<(value)
      @values << [value, :<<] unless value.nil?
      self
    end
    alias :append= :<<

    def safe_concat(value)
      raise ActiveSupport::SafeBuffer::SafeConcatError unless html_safe?
      @values << [value, :safe_concat] unless value.nil?
      self
    end
    alias :safe_append= :safe_concat

    def safe_expr_append=(val)
      @values << [val, :safe_expr_append] unless val.nil?
      self
    end

    def to_s
      result = @values.each_with_object(ActiveSupport::SafeBuffer.new) do |(v, meth), buf|
        if meth == :<<
          if AsyncPartial::AsyncResult === v
            buf << v.value
          else
            buf << v.to_s
          end
        else
          if AsyncPartial::AsyncResult === v
            buf.safe_concat(v.value)
          else
            buf.safe_concat(v.to_s)
          end
        end
      end
      result.to_s
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
async_partial-0.3.0 lib/async_partial.rb