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

क्लास एक्शनकेबल :: चैनल :: बेस




ruby

क्लास एक्शनकेबल :: चैनल :: बेस

जनक:
Object
शामिल मॉड्यूल:
ActionCable :: Channel :: Callbacks , ActionCable :: Channel :: PeriodicTimers , ActionCable::Channel::Streams , ActionCable :: Channel :: नामकरण , एक्शनकेबल :: चैनल :: प्रसारण

WebSocket कनेक्शन पर संचार करते समय चैनल तार्किक व्यवहार में समूहन व्यवहार की मूल संरचना प्रदान करता है। आप किसी चैनल को कंट्रोलर के रूप की तरह सोच सकते हैं, लेकिन ग्राहक के सीधे अनुरोधों का जवाब देने के अलावा वह सब्सक्राइबर को कंटेंट पुश करने में सक्षम है।

चैनल उदाहरण लंबे समय तक जीवित रहते हैं। जब केबल उपभोक्ता एक ग्राहक बन जाता है, और तब तब तक रहता है जब तक उपभोक्ता डिस्कनेक्ट नहीं करता है तब चैनल ऑब्जेक्ट को तत्काल किया जाएगा। यह कुछ सेकंड, मिनट, घंटे या दिन भी हो सकते हैं। इसका मतलब है कि आपको इस बात का विशेष ध्यान रखना होगा कि चैनल में ऐसा कुछ भी न करें जो उसकी मेमोरी फुटप्रिंट या जो कुछ भी हो, को गुब्बारा कर दे। संदर्भ हमेशा के लिए हैं, इसलिए उन्हें जारी नहीं किया जाएगा क्योंकि आमतौर पर नियंत्रक उदाहरण के साथ ऐसा होता है जो हर अनुरोध के बाद फेंक दिया जाता है।

लंबे समय तक रहने वाले चैनल (और कनेक्शन) का मतलब यह भी है कि डेटा ताज़ा होने के लिए आप ज़िम्मेदार हैं। यदि आप किसी उपयोगकर्ता रिकॉर्ड का संदर्भ रखते हैं, लेकिन उस संदर्भ को रखने के दौरान नाम बदल दिया जाता है, तो आप बासी डेटा भेज सकते हैं यदि आप इससे बचने के लिए सावधानी नहीं बरतते हैं।

लंबे समय तक रहने वाले चैनल उदाहरणों का उल्टा यह है कि आप उदाहरण के चर का उपयोग उन वस्तुओं के संदर्भ में कर सकते हैं जो भविष्य के ग्राहक अनुरोधों के साथ बातचीत कर सकते हैं। यहाँ एक त्वरित उदाहरण है:

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

  def speak(data)
    @room.speak data, user: current_user
  end
end

टॉक एक्शन बस चैट :: रूम ऑब्जेक्ट का उपयोग करता है जो तब बनाया गया था जब चैनल को पहली बार उपभोक्ता द्वारा सब्सक्राइब किया गया था जब वह ग्राहक कमरे में कुछ कहना चाहता था।

कार्रवाई प्रसंस्करण

ActionController::Base उपवर्गों के विपरीत, चैनल अपने कार्यों के लिए एक ActionController::Base बाधा रूप का पालन नहीं करते हैं। इसके बजाय, एक्शन केबल एक दूरस्थ-प्रक्रिया कॉल मॉडल के माध्यम से संचालित होती है। आप चैनल पर किसी भी सार्वजनिक विधि की घोषणा कर सकते हैं (वैकल्पिक रूप से एक data तर्क ले रहे हैं), और यह विधि ग्राहक के लिए कॉल करने योग्य के रूप में स्वतः उजागर हो जाती है।

उदाहरण:

class AppearanceChannel < ApplicationCable::Channel
  def subscribed
    @connection_token = generate_connection_token
  end

  def unsubscribed
    current_user.disappear @connection_token
  end

  def appear(data)
    current_user.appear @connection_token, on: data['appearing_on']
  end

  def away
    current_user.away @connection_token
  end

  private
    def generate_connection_token
      SecureRandom.hex(36)
    end
end

इस उदाहरण में, सब्स्क्राइब्ड और अनसब्सक्राइब किए गए तरीके ActionCable::Channel::Base योग्य तरीके नहीं हैं, क्योंकि वे पहले से ActionCable::Channel::Base में घोषित किए गए थे, लेकिन #appear और #away हैं। #generate_connection_token भी #generate_connection_token योग्य नहीं है, क्योंकि यह एक निजी तरीका है। आप देखेंगे कि प्रकट एक डेटा पैरामीटर को स्वीकार करता है, जिसे वह तब अपने मॉडल कॉल के हिस्से के रूप में उपयोग करता है। #away नहीं है, क्योंकि यह केवल एक ट्रिगर क्रिया है।

यह भी ध्यान दें कि इस उदाहरण में, current_user उपलब्ध है क्योंकि यह कनेक्शन पर एक पहचान विशेषता के रूप में चिह्नित किया गया था। ऐसे सभी पहचानकर्ता स्वचालित रूप से चैनल उदाहरण पर एक ही नाम का एक प्रतिनिधिमंडल विधि बनाएंगे।

सदस्यता अनुरोधों को अस्वीकार करना

कोई चैनल अस्वीकृत कॉलबैक द्वारा subscribed कॉलबैक में सदस्यता अनुरोध को reject है:

class ChatChannel < ApplicationCable::Channel
  def subscribed
    @room = Chat::Room[params[:room_number]]
    reject unless current_user.can_access?(@room)
  end
end

इस उदाहरण में, सदस्यता को अस्वीकार कर दिया जाएगा यदि current_user पास चैट रूम तक पहुंच नहीं है। क्लाइंट-साइड पर, सर्वर द्वारा सदस्यता अनुरोध को Channel#rejected करने पर Channel#rejected कॉलबैक Channel#rejected हो जाएगा।

गुण

कनेक्शन [R]
पहचानकर्ता [आर]
परम [आर]

पब्लिक क्लास के तरीके

# File actioncable/lib/action_cable/channel/base.rb, line 115
def action_methods
  @action_methods ||= begin
    # All public instance methods of this class, including ancestors
    methods = (public_instance_methods(true) -
      # Except for public instance methods of Base and its ancestors
      ActionCable::Channel::Base.public_instance_methods(true) +
      # Be sure to include shadowed public instance methods of this class
      public_instance_methods(false)).uniq.map(&:to_s)
    methods.to_set
  end
end

विधि नामों की एक सूची जिसे कार्रवाई माना जाना चाहिए। इसमें चैनल पर सभी सार्वजनिक उदाहरण विधियाँ शामिल हैं, किसी भी आंतरिक विधियाँ ( ActionCable::Channel::Base पर परिभाषित), किसी भी तरीके से वापस जोड़ना जो आंतरिक हैं, लेकिन अभी भी कक्षा में ही मौजूद हैं।

रिटर्न

  • Set - सभी तरीकों का एक सेट जिसे कार्रवाई माना जाना चाहिए।

नया (कनेक्शन, पहचानकर्ता, params = {}) स्रोत दिखाएं
# File actioncable/lib/action_cable/channel/base.rb, line 142
def initialize(connection, identifier, params = {})
  @connection = connection
  @identifier = identifier
  @params     = params

  # When a channel is streaming via pubsub, we want to delay the confirmation
  # transmission until pubsub subscription is confirmed.
  #
  # The counter starts at 1 because it's awaiting a call to #subscribe_to_channel
  @defer_subscription_confirmation_counter = Concurrent::AtomicFixnum.new(1)

  @reject_subscription = nil
  @subscription_confirmation_sent = nil

  delegate_connection_identifiers
end

निजी कक्षा के तरीके

clear_action_methods! () स्रोत दिखाएं
# File actioncable/lib/action_cable/channel/base.rb, line 131
def clear_action_methods! # :doc:
  @action_methods = nil
end

::action_methods कैश किए ::action_methods हैं और कभी-कभी उन्हें ताज़ा करने की आवश्यकता होती है। ::clear_action_methods! आपको ऐसा करने की अनुमति देता है, इसलिए अगली बार जब आप ::action_methods चलाते हैं, तो उन्हें पुनर्गणना होगी।

method_added (नाम) स्रोत दिखाएं
# File actioncable/lib/action_cable/channel/base.rb, line 136
def method_added(name) # :doc:
  super
  clear_action_methods!
end

कैश्ड को रीफ़्रेश करें ::action_methods जब नया एक्शन_मेथोड जोड़ा जाता है तो एक्शन_मेथोड्स।

सुपरक्लास विधि कहता है

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

perform_action (डेटा) स्रोत दिखाएं
# File actioncable/lib/action_cable/channel/base.rb, line 162
def perform_action(data)
  action = extract_action(data)

  if processable_action?(action)
    payload = { channel_class: self.class.name, action: action, data: data }
    ActiveSupport::Notifications.instrument("perform_action.action_cable", payload) do
      dispatch_action(action, data)
    end
  else
    logger.error "Unable to process #{action_signature(action, data)}"
  end
end

पारित डेटा से कार्रवाई का नाम निकालें और इसे चैनल के माध्यम से संसाधित करें। प्रक्रिया यह सुनिश्चित करेगी कि अनुरोध की गई कार्रवाई उपयोगकर्ता द्वारा घोषित चैनल पर एक सार्वजनिक विधि है (इसलिए subscribed गए कॉलबैक में से एक नहीं)।

subscribe_to_channel () स्रोत दिखाएं
# File actioncable/lib/action_cable/channel/base.rb, line 177
def subscribe_to_channel
  run_callbacks :subscribe do
    subscribed
  end

  reject_subscription if subscription_rejected?
  ensure_confirmation_sent
end

सदस्यता में जुड़ने के बाद और सदस्यता की पुष्टि या अस्वीकार करने के बाद इस विधि को कहा जाता है।

निजी उदाहरण तरीके

defer_subscription_confirmation! () स्रोत दिखाएं
# File actioncable/lib/action_cable/channel/base.rb, line 226
def defer_subscription_confirmation! # :doc:
  @defer_subscription_confirmation_counter.increment
end
defer_subscription_confirmation? () स्रोत दिखाएं
# File actioncable/lib/action_cable/channel/base.rb, line 230
def defer_subscription_confirmation? # :doc:
  @defer_subscription_confirmation_counter.value > 0
end
सुनिश्चित करें_confirmation_sent () स्रोत दिखाएं
# File actioncable/lib/action_cable/channel/base.rb, line 220
def ensure_confirmation_sent # :doc:
  return if subscription_rejected?
  @defer_subscription_confirmation_counter.decrement
  transmit_subscription_confirmation unless defer_subscription_confirmation?
end
अस्वीकार () स्रोत दिखाएं
# File actioncable/lib/action_cable/channel/base.rb, line 238
def reject # :doc:
  @reject_subscription = true
end
सदस्यता () दिखाएँ स्रोत
# File actioncable/lib/action_cable/channel/base.rb, line 197
def subscribed # :doc:
  # Override in subclasses
end

एक बार उपभोक्ता को चैनल का ग्राहक बनने के बाद कॉल किया जाता है। आमतौर पर किसी भी स्ट्रीम को सेटअप करने की जगह जिसे आप चाहते हैं कि यह चैनल सब्सक्राइबर को भेज रहा है।

subscription_confirmation_sent? () स्रोत दिखाएं
# File actioncable/lib/action_cable/channel/base.rb, line 234
def subscription_confirmation_sent? # :doc:
  @subscription_confirmation_sent
end
subscription_rejected? () स्रोत दिखाएं
# File actioncable/lib/action_cable/channel/base.rb, line 242
def subscription_rejected? # :doc:
  @reject_subscription
end
संचारित (डेटा, के माध्यम से: शून्य) दिखाएँ स्रोत
# File actioncable/lib/action_cable/channel/base.rb, line 209
def transmit(data, via: nil) # :doc:
  status = "#{self.class.name} transmitting #{data.inspect.truncate(300)}"
  status += " (via #{via})" if via
  logger.debug(status)

  payload = { channel_class: self.class.name, data: data, via: via }
  ActiveSupport::Notifications.instrument("transmit.action_cable", payload) do
    connection.transmit identifier: @identifier, message: data
  end
end

ग्राहक को डेटा का हैश प्रसारित करें। हैश स्वचालित रूप से प्राप्तकर्ता के रूप में चिह्नित उचित चैनल पहचानकर्ता के साथ एक JSON लिफाफे में लपेटा जाएगा।

सदस्यता समाप्त () दिखाएँ स्रोत
# File actioncable/lib/action_cable/channel/base.rb, line 203
def unsubscribed # :doc:
  # Override in subclasses
end

एक बार कॉल करने के बाद उपभोक्ता ने अपने केबल कनेक्शन को काट दिया। कनेक्शन को साफ करने या उपयोगकर्ताओं को ऑफ़लाइन या पसंद के रूप में चिह्नित करने के लिए उपयोग किया जा सकता है।