Ruby on Rails 5.2 - ActionCable::Channel::Streams

मॉड्यूल ActionCable :: चैनल :: स्ट्रीम




ruby

मॉड्यूल ActionCable :: चैनल :: स्ट्रीम

Streams चैनल को सब्सक्राइबर के रूट प्रसारण की अनुमति देती हैं। एक प्रसारण, जैसा कि कहीं और चर्चा की गई है, एक पबस क्यू है जहां कोई भी डेटा इसमें रखा गया है जो उस समय जुड़े ग्राहकों को स्वचालित रूप से भेजा जाता है। यह विशुद्ध रूप से एक ऑनलाइन कतार है, हालांकि। यदि आप एक प्रसारण को स्ट्रीमिंग नहीं कर रहे हैं, तो यह एक अपडेट भेजता है, तो आपको वह अपडेट नहीं मिलेगा, भले ही आप इसे भेजे जाने के बाद कनेक्ट करें।

आमतौर पर, स्ट्रीम किए गए प्रसारण को क्लाइंट-साइड पर ग्राहक को सीधे भेजा जाता है। चैनल केवल दो पक्षों (ब्रॉडकास्टर और चैनल ग्राहक) के बीच एक कनेक्टर के रूप में कार्य करता है। यहां एक चैनल का एक उदाहरण दिया गया है जो ग्राहकों को किसी दिए गए पृष्ठ पर सभी नई टिप्पणियाँ प्राप्त करने की अनुमति देता है:

class CommentsChannel < ApplicationCable::Channel
  def follow(data)
    stream_from "comments_for_#{data['recording_id']}"
  end

  def unfollow
    stop_all_streams
  end
end

उपर्युक्त उदाहरण के आधार पर, इस चैनल के ग्राहकों को जो भी डेटा डाला जाएगा, उसे कहते हैं, जैसे ही इसे वहां रखा जाएगा, comments_for_45 for_45 प्रसारित करें।

इस चैनल के लिए प्रसारित एक उदाहरण ऐसा दिखता है:

ActionCable.server.broadcast "comments_for_45", author: 'DHH', content: 'Rails is just swell'

यदि आपके पास एक धारा है जो एक मॉडल से संबंधित है, तो उपयोग किया जाने वाला प्रसारण मॉडल और चैनल से उत्पन्न हो सकता है। निम्न उदाहरण comments:Z2lkOi8vVGVzdEFwcC9Qb3N0LzE तरह एक प्रसारण की सदस्यता comments:Z2lkOi8vVGVzdEFwcC9Qb3N0LzE

class CommentsChannel < ApplicationCable::Channel
  def subscribed
    post = Post.find(params[:id])
    stream_for post
  end
end

आप इस चैनल का उपयोग करके प्रसारण कर सकते हैं:

CommentsChannel.broadcast_to(@post, @comment)

यदि आप सब्सक्राइबर के लिए प्रसारित प्रसारण को केवल पार्ले नहीं करना चाहते हैं, तो आप एक कॉलबैक की आपूर्ति भी कर सकते हैं जो आपको भेजे गए बदलाव को बदलने की सुविधा देता है। नीचे दिए गए उदाहरण से पता चलता है कि आप इस प्रक्रिया में प्रदर्शन आत्मनिरीक्षण प्रदान करने के लिए इसका उपयोग कैसे कर सकते हैं:

class ChatChannel < ApplicationCable::Channel
  def subscribed
    @room = Chat::Room[params[:room_number]]

    stream_for @room, coder: ActiveSupport::JSON do |message|
      if message['originated_at'].present?
        elapsed_time = (Time.now.to_f - message['originated_at']).round(2)

        ActiveSupport::Notifications.instrument :performance, measurement: 'Chat.message_delay', value: elapsed_time, action: :timing
        logger.info "Message took #{elapsed_time}s to arrive"
      end

      transmit message
    end
  end
end

आप stop_all_streams कॉल करके सभी प्रसारणों से स्ट्रीमिंग रोक सकते हैं।

सार्वजनिक प्रवृत्ति के तरीके

# File actioncable/lib/action_cable/channel/streams.rb, line 106
def stop_all_streams
  streams.each do |broadcasting, callback|
    pubsub.unsubscribe broadcasting, callback
    logger.info "#{self.class.name} stopped streaming from #{broadcasting}"
  end.clear
end

इस चैनल से जुड़े सभी स्ट्रीम पबबस क्यू से अनसब्सक्राइब करते हैं।

stream_for (मॉडल, कॉलबैक = नील, कोडर: शून्य, और ब्लॉक) शो स्रोत
# File actioncable/lib/action_cable/channel/streams.rb, line 101
def stream_for(model, callback = nil, coder: nil, &block)
  stream_from(broadcasting_for([ channel_name, model ]), callback || block, coder: coder)
end

इस चैनल में model लिए पबसु कतार की स्ट्रीमिंग शुरू करें। वैकल्पिक रूप से, आप ग्राहक को सीधे अपडेट संचारित करने के डिफ़ॉल्ट के बजाय callback पास कर सकते हैं।

पास coder: ActiveSupport::JSON कॉलबैक से गुजरने से पहले JSON संदेशों को JSON के रूप में डिकोड करने के लिए। coder: nil चूक coder: nil जो कोई डिकोडिंग नहीं करता है, कच्चे संदेशों को पारित करता है।

stream_from (प्रसारण, कॉलबैक = nil, कोडर: nil, & block) स्रोत दिखाएं
# File actioncable/lib/action_cable/channel/streams.rb, line 76
def stream_from(broadcasting, callback = nil, coder: nil, &block)
  broadcasting = String(broadcasting)

  # Don't send the confirmation until pubsub#subscribe is successful
  defer_subscription_confirmation!

  # Build a stream handler by wrapping the user-provided callback with
  # a decoder or defaulting to a JSON-decoding retransmitter.
  handler = worker_pool_stream_handler(broadcasting, callback || block, coder: coder)
  streams << [ broadcasting, handler ]

  connection.server.event_loop.post do
    pubsub.subscribe(broadcasting, handler, lambda do
      ensure_confirmation_sent
      logger.info "#{self.class.name} is streaming from #{broadcasting}"
    end)
  end
end

नामित broadcasting पब क्यू से स्ट्रीमिंग शुरू करें। वैकल्पिक रूप से, आप ग्राहक को सीधे अपडेट संचारित करने के डिफ़ॉल्ट के बजाय callback पास कर सकते हैं। पास coder: ActiveSupport::JSON कॉलबैक से गुजरने से पहले JSON संदेशों को JSON के रूप में डिकोड करने के लिए। coder: nil चूक coder: nil जो कोई डिकोडिंग नहीं करता है, कच्चे संदेशों को पारित करता है।