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

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




ruby

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

जनक:
Object
शामिल मॉड्यूल:
ActionCable::Connection::Identification , ActionCable::Connection::InternalChannel , ActionCable::Connection::Authorization

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

यहाँ एक मूल उदाहरण दिया गया है:

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
      logger.add_tags current_user.name
    end

    def disconnect
      # Any cleanup work needed when the cable connection is cut.
    end

    private
      def find_verified_user
        User.find_by_identity(cookies.encrypted[:identity_id]) ||
          reject_unauthorized_connection
      end
  end
end

सबसे पहले, हम यह घोषणा करते हैं कि इस कनेक्शन को इसके current_user द्वारा पहचाना जा सकता है। यह हमें बाद में उस current_user (और संभवतः उन्हें डिस्कनेक्ट करने के लिए) के लिए स्थापित सभी कनेक्शनों को खोजने में सक्षम बनाता है। आप जितनी चाहें उतनी पहचान इंडेक्स की घोषणा कर सकते हैं। पहचान की घोषणा करने का अर्थ है कि उस कुंजी के लिए एक attr_accessor स्वचालित रूप से सेट हो जाता है।

दूसरा, हम इस तथ्य पर भरोसा करते हैं कि डोमेन के साथ भेजे जा रहे डोमेन से कुकीज़ के साथ WebSocket कनेक्शन स्थापित है। इससे WebSocket कनेक्शन को अधिकृत करने के लिए वेब इंटरफ़ेस के माध्यम से लॉग इन करते समय सेट की गई कुकीज़ का उपयोग करना आसान हो जाता है।

अंत में, हम वर्तमान उपयोगकर्ता के नाम के साथ कनेक्शन-विशिष्ट लकड़हारे के लिए एक टैग जोड़ते हैं ताकि लॉग में उनके संदेशों को आसानी से अलग किया जा सके।

बहुत सरल, एह?

गुण

एनव [आर]
लकड़हारा [आर]
message_buffer [R]
प्रोटोकॉल [R]
सर्वर [R]
सदस्यताएँ [आर]
Websocket [R]

TODO इसे निजी में बदलें जब हमने रूबी 2.2 समर्थन को गिरा दिया है। रूबी 2.2 "निजी विशेषता?" चेतावनी के लिए समाधान।

कार्यकर्ता_पुल [आर]

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

नया (सर्वर, env, कोडर: ActiveSupport :: JSON) स्रोत दिखाएँ
# File actioncable/lib/action_cable/connection/base.rb, line 53
def initialize(server, env, coder: ActiveSupport::JSON)
  @server, @env, @coder = server, env, coder

  @worker_pool = server.worker_pool
  @logger = new_tagged_logger

  @websocket      = ActionCable::Connection::WebSocket.new(env, self, event_loop)
  @subscriptions  = ActionCable::Connection::Subscriptions.new(self)
  @message_buffer = ActionCable::Connection::MessageBuffer.new(self)

  @_internal_subscriptions = nil
  @started_at = Time.now
end

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

# File actioncable/lib/action_cable/connection/base.rb, line 118
def beat
  transmit type: ActionCable::INTERNAL[:message_types][:ping], message: Time.now.to_i
end
# File actioncable/lib/action_cable/connection/base.rb, line 98
def close
  websocket.close
end

WebSocket कनेक्शन बंद करें।

send_async (विधि, * तर्क) स्रोत दिखाएं
# File actioncable/lib/action_cable/connection/base.rb, line 103
def send_async(method, *arguments)
  worker_pool.async_invoke(self, method, *arguments)
end

धागा श्रमिकों के पूल के माध्यम से अतुल्यकालिक रूप से कनेक्शन पर एक विधि लागू करें।

# File actioncable/lib/action_cable/connection/base.rb, line 109
def statistics
  {
    identifier: connection_identifier,
    started_at: @started_at,
    subscriptions: subscriptions.identifiers,
    request_id: @env["action_dispatch.request_id"]
  }
end

identifier , started_at , subscriptions , और request_id साथ कनेक्शन के लिए आंकड़ों का एक मूल हैश लौटें। यह कनेक्शन के खिलाफ स्वास्थ्य जांच द्वारा वापस किया जा सकता है।

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

# File actioncable/lib/action_cable/connection/base.rb, line 155
def cookies # :doc:
  request.cookie_jar
end

WebSocket कनेक्शन को शुरू करने वाले अनुरोध की कुकीज़। प्राधिकरण जांच करने के लिए उपयोगी है।

# File actioncable/lib/action_cable/connection/base.rb, line 147
def request # :doc:
  @request ||= begin
    environment = Rails.application.env_config.merge(env) if defined?(Rails.application) && Rails.application
    ActionDispatch::Request.new(environment || env)
  end
end

WebSocket कनेक्शन शुरू करने का अनुरोध यहां उपलब्ध है। इससे पर्यावरण, कुकीज़ इत्यादि का उपयोग होता है।