Sign inGet started

कनेक्शन जीवनचक्र और पुनः कनेक्शन

एक Realtime कनेक्शन एक WebSocket होता है। नेटवर्क बदलाव, स्लीप में जाने वाले डिवाइस और इन्फ्रास्ट्रक्चर रीस्टार्ट इसे बंद कर सकते हैं। क्लाइंट स्वचालित रूप से पुनः कनेक्ट करता है, और आपका ऐप मौजूदा कनेक्शन स्टेट दिखा सकता है।

छह स्टेट

ब्राउज़र क्लाइंट में bird.connection.state, और Swift तथा Kotlin में bird.connectionState, हमेशा इनमें से एक होता है (Kotlin इन्हें ConnectionState कॉन्स्टेंट के रूप में लिखता है, इसलिए unavailable को ConnectionState.UNAVAILABLE पढ़ा जाता है):
स्टेटइसका मतलब
initializedक्लाइंट मौजूद है और उसने अभी तक सॉकेट नहीं खोला है।
connectingसॉकेट खुल रहा है, या खुला है और हैंडशेक का इंतज़ार कर रहा है।
connectedहैंडशेक पूरा हुआ। कनेक्शन के पास एक ID है और वह सब्सक्राइब कर सकता है।
unavailableकनेक्शन टूट गया और पुनः कनेक्ट शेड्यूल है।
disconnectedआपने disconnect() कॉल किया। कुछ भी शेड्यूल नहीं है।
failedसर्वर ने इस कनेक्शन को अस्वीकार किया। क्लाइंट फिर से प्रयास नहीं करता।
हर ट्रांज़िशन देखने के लिए state_change बाइंड करें, या जब केवल एक स्टेट मायने रखता हो तो एक ही स्टेट नाम बाइंड करें:
import { BirdRealtime } from "@messagebird/realtime";

const bird = new BirdRealtime({ appKey: "your-app-key", region: "us1" });

bird.connection.bind("state_change", ({ previous, current }) => {
  console.log(previous, "->", current);
});

bird.connection.bind("unavailable", () => showReconnectingBanner());
bird.connection.bind("connected", () => hideReconnectingBanner());
Swift और Kotlin हर ट्रांज़िशन के लिए एक ऑब्ज़र्वर उपयोग करते हैं, इसलिए current पर ब्रांच करें। हैंडलर Swift में मेन क्यू पर और Kotlin में उपलब्ध होने पर Android मेन लूपर पर चलते हैं। दूसरे एक्ज़ीक्यूशन कॉन्टेक्स्ट के लिए deliveryQueue या Executor पास करें।
एक खुला सॉकेट सर्वर का हैंडशेक आने तक connecting में रहता है। हैंडशेक स्टेट connected बनने से पहले bird.connection.connectionId सेट करता है, ताकि ऑथराइज़ेशन उस ID को साइन कर सके। अगर हैंडशेक में ID नहीं आती, तो क्लाइंट एरर रिपोर्ट करता है और सॉकेट बंद कर देता है।

स्वचालित पुनः कनेक्शन

अप्रत्याशित ड्रॉप के बाद, क्लाइंट नया सॉकेट खोलने से पहले प्रतीक्षा करता है। यह विलंब full-jitter exponential backoff का उपयोग करता है जिसमें एक-सेकंड बेस और 30-सेकंड कैप होती है। हर सफल हैंडशेक backoff रीसेट करता है।
Close कोड तय करता है कि तीन में से कौन-सी चीज़ होगी:
Close कोडव्यवहार
4000 से 4099अस्वीकृत। कोई रीट्राई नहीं, स्टेट failed हो जाता है।
4200 से 4299तुरंत रीट्राई।
बाकी सब कुछस्टेट unavailable होता है, फिर backoff के साथ रीट्राई।
नेटवर्क विफलताएँ backoff पाथ का उपयोग करती हैं। अपने UI में रिफ़्यूज़ल कोड हैंडल करें क्योंकि ये टर्मिनल विफलताएँ स्वचालित रूप से पुनः कनेक्ट नहीं होतीं।

स्टेल-कनेक्शन जाँच

नेटवर्क पाथ विफल होने के बाद भी सॉकेट खुला दिख सकता है। क्लाइंट एक्टिविटी टाइमआउट के बाद एक ping भेजता है, जो डिफ़ॉल्ट रूप से 120 सेकंड होता है जब तक हैंडशेक कोई अन्य मान न दे। अगर 30-सेकंड के डिफ़ॉल्ट pong टाइमआउट के भीतर कोई pong नहीं आता, तो क्लाइंट सॉकेट को retry-immediately कोड के साथ बंद कर देता है।

आपके चैनलों का क्या होता है

सब्सक्रिप्शन कनेक्शन से जुड़े होते हैं, इसलिए ड्रॉप उन्हें हटा देता है। क्लाइंट हर चैनल ऑब्जेक्ट को बनाए रखता है, अगले connected स्टेट के बाद दोबारा सब्सक्राइब करता है, और अपने मौजूदा हैंडलर रखता है।
क्लाइंट नई कनेक्शन ID का उपयोग करके हर प्राइवेट और प्रेज़ेंस चैनल के लिए आपके authEndpoint को फिर से कॉल करता है। वह पुराने सिग्नेचर का पुनः उपयोग नहीं कर सकता क्योंकि उस सिग्नेचर में पिछली कनेक्शन ID शामिल है। एक signin() कॉल के बाद, क्लाइंट हर नए कनेक्शन पर साइन इन भी करता है और बाद की विफलताओं को signin_error के ज़रिए रिपोर्ट करता है।
bird.connection.bind("signin_error", ({ message }) => {
  console.warn("connection has no identity:", message);
});
जब कोई चैनल पुनः कनेक्ट हो रहा होता है, तो channel.trigger क्लाइंट इवेंट भेजे बिना false लौटाता है। channel.subscribed जाँचें, या bird:subscription_succeeded के बाद भेजें, जो हर सफल पुनः सब्सक्रिप्शन के बाद फ़ायर होता है।
const room = bird.subscribe("presence-room-1");

room.bind("bird:subscription_succeeded", ({ members }) => {
  renderMembers(members);
});
Realtime क्लाइंट के डिस्कनेक्ट रहने के दौरान प्रकाशित इवेंट रीप्ले नहीं करता। अगर किसी व्यू को गैप के बाद रिकवर करना है, तो bird:subscription_succeeded पर उसकी वर्तमान स्थिति फ़ेच करें और वहाँ से बाद के इवेंट लागू करें।

जानबूझकर डिस्कनेक्ट करना

bird.disconnect() पुनः कनेक्ट शेड्यूल किए बिना सॉकेट बंद करता है। इसका उपयोग तब करें जब साइन-आउट या निष्क्रिय क्लाइंट को अब लाइव डेटा की ज़रूरत न हो। क्लाइंट चैनल बनाए रखता है, इसलिए बाद में bird.connect() सॉकेट फिर से खोलता है और दोबारा सब्सक्राइब करता है।
bird.disconnect(); // state: disconnected, no reconnect
bird.connect(); // reopens and re-subscribes
मोबाइल पर, जब संबंधित व्यू या एक्टिविटी रुके तो डिस्कनेक्ट करें और जब वह फिर शुरू हो तो पुनः कनेक्ट करें। चैनल ऑब्जेक्ट और बाइंडिंग उपलब्ध रहते हैं।

कनेक्शन पर एरर बनाम चैनल पर एरर

एक चैनल से संबंधित सर्वर एरर उसी चैनल पर आते हैं। अस्वीकृत सब्सक्रिप्शन सबसे आम है, और 403 लौटाने वाला ऑथराइज़र यहाँ दिखता है:
room.bind("bird:subscription_error", (err) => {
  console.warn("could not join:", err);
});
जो कुछ भी वायर किसी चैनल से नहीं जोड़ता, वह इसके बजाय कनेक्शन पर आता है:
bird.connection.bind("error", ({ code, message }) => {
  console.warn(code, message);
});

Close कोड 4009 हैंडल करें

कोड 4009 no-retry बैंड में है, इसलिए कनेक्शन failed में प्रवेश करता है। इन स्थितियों में अंतर करने के लिए reason जाँचें:
क्लाइंट स्वचालित रूप से पुनः कनेक्ट नहीं करता, इसलिए आगे क्या होगा यह आपका ऐप तय करता है:
bird.connection.bind("error", ({ code }) => {
  if (code === 4009) showSignedOutScreen();
});
जब प्रमाणीकरण समाप्त हो गया हो तो साइन-आउट स्टेट उचित है। bird.connect() कॉल करना एक नया कनेक्शन शुरू करता है और ऑथराइज़ेशन दोहराता है, इसलिए कॉलर की ऑथराइज़ेशन स्थिति बदलने के बाद ही पुनः कनेक्ट करें।

अगले कदम

संबंधित संसाधन

इस विषय के लिए डॉक्यूमेंटेशन, गाइड और उदाहरणों के साथ आगे बढ़ें। संसाधन अंग्रेज़ी में हैं।

अभ्यास करें और इम्प्लीमेंटेशन ब्रीफ़ पाएँ