कनेक्शन जीवनचक्र और पुनः कनेक्शन
एक 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());import BirdRealtime
let bird = BirdRealtime(options: .init(appKey: "your-app-key", region: "us1"))
bird.onConnectionStateChange { previous, current in
print(previous, "->", current)
if current == .unavailable { showReconnectingBanner() }
if current == .connected { hideReconnectingBanner() }
}import com.bird.realtime.BirdRealtime
import com.bird.realtime.BirdRealtimeOptions
import com.bird.realtime.ConnectionState
val bird = BirdRealtime(BirdRealtimeOptions(appKey = "your-app-key", region = "us1"))
bird.onConnectionStateChange { previous, current ->
println("$previous -> $current")
if (current == ConnectionState.UNAVAILABLE) showReconnectingBanner()
if (current == ConnectionState.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);
});bird.onSigninError { error in
print("connection has no identity:", error.message)
}bird.onSigninError { error ->
println("connection has no identity: ${error.message}")
}जब कोई चैनल पुनः कनेक्ट हो रहा होता है, तो channel.trigger क्लाइंट इवेंट भेजे बिना false लौटाता है। channel.subscribed जाँचें, या bird:subscription_succeeded के बाद भेजें, जो हर सफल पुनः सब्सक्रिप्शन के बाद फ़ायर होता है।
const room = bird.subscribe("presence-room-1");
room.bind("bird:subscription_succeeded", ({ members }) => {
renderMembers(members);
});guard let room = bird.subscribe("presence-room-1") as? PresenceChannel else { return }
room.bind(BirdProtocol.Event.subscriptionSucceeded) { _ in
renderMembers(room.members)
}val room = bird.subscribe("presence-room-1")
if (room is PresenceChannel) {
room.bind(BirdProtocol.Event.SUBSCRIPTION_SUCCEEDED) {
renderMembers(room.members)
}
}Realtime क्लाइंट के डिस्कनेक्ट रहने के दौरान प्रकाशित इवेंट रीप्ले नहीं करता। अगर किसी व्यू को गैप के बाद रिकवर करना है, तो bird:subscription_succeeded पर उसकी वर्तमान स्थिति फ़ेच करें और वहाँ से बाद के इवेंट लागू करें।
जानबूझकर डिस्कनेक्ट करना
bird.disconnect() पुनः कनेक्ट शेड्यूल किए बिना सॉकेट बंद करता है। इसका उपयोग तब करें जब साइन-आउट या निष्क्रिय क्लाइंट को अब लाइव डेटा की ज़रूरत न हो। क्लाइंट चैनल बनाए रखता है, इसलिए बाद में bird.connect() सॉकेट फिर से खोलता है और दोबारा सब्सक्राइब करता है।
bird.disconnect(); // state: disconnected, no reconnect
bird.connect(); // reopens and re-subscribesbird.disconnect() // state: disconnected, no reconnect
bird.connect() // reopens and re-subscribesbird.disconnect() // state: DISCONNECTED, no reconnect
bird.connect() // reopens and re-subscribesमोबाइल पर, जब संबंधित व्यू या एक्टिविटी रुके तो डिस्कनेक्ट करें और जब वह फिर शुरू हो तो पुनः कनेक्ट करें। चैनल ऑब्जेक्ट और बाइंडिंग उपलब्ध रहते हैं।
कनेक्शन पर एरर बनाम चैनल पर एरर
एक चैनल से संबंधित सर्वर एरर उसी चैनल पर आते हैं। अस्वीकृत सब्सक्रिप्शन सबसे आम है, और 403 लौटाने वाला ऑथराइज़र यहाँ दिखता है:
room.bind("bird:subscription_error", (err) => {
console.warn("could not join:", err);
});room.bind(BirdProtocol.Event.subscriptionError) { error in
print("could not join:", error ?? "")
}room.bind(BirdProtocol.Event.SUBSCRIPTION_ERROR) { error ->
println("could not join: $error")
}जो कुछ भी वायर किसी चैनल से नहीं जोड़ता, वह इसके बजाय कनेक्शन पर आता है:
bird.connection.bind("error", ({ code, message }) => {
console.warn(code, message);
});bird.onError { error in
print(error.code ?? 0, error.message)
}bird.onError { error ->
println("${error.code} ${error.message}")
}Close कोड 4009 हैंडल करें
कोड 4009 no-retry बैंड में है, इसलिए कनेक्शन failed में प्रवेश करता है। इन स्थितियों में अंतर करने के लिए reason जाँचें:
- एक टर्मिनेट किया गया मेंबर। आपके बैकएंड ने इस मेंबर के लिए disconnect API कॉल किया, इसलिए उनके सभी कनेक्शन बंद कर दिए गए। देखें मेंबर कनेक्शन टर्मिनेट करना।
- एक ऐसा कनेक्शन जिसने कभी ऑथराइज़ नहीं किया। ऐप को ऑथराइज़्ड कनेक्शन चाहिए और इसने समय पर ऑथराइज़ नहीं किया। देखें ऑथराइज़्ड कनेक्शन अनिवार्य करना।
क्लाइंट स्वचालित रूप से पुनः कनेक्ट नहीं करता, इसलिए आगे क्या होगा यह आपका ऐप तय करता है:
bird.connection.bind("error", ({ code }) => {
if (code === 4009) showSignedOutScreen();
});bird.onError { error in
if error.code == 4009 { showSignedOutScreen() }
}bird.onError { error ->
if (error.code == 4009) showSignedOutScreen()
}जब प्रमाणीकरण समाप्त हो गया हो तो साइन-आउट स्टेट उचित है। bird.connect() कॉल करना एक नया कनेक्शन शुरू करता है और ऑथराइज़ेशन दोहराता है, इसलिए कॉलर की ऑथराइज़ेशन स्थिति बदलने के बाद ही पुनः कनेक्ट करें।
अगले कदम
- चैनल ऑथराइज़ करना वह अनुबंध है जो आपका बैकएंड लागू करता है, और वह अनुरोध जो क्लाइंट हर पुनः कनेक्ट पर दोहराता है।
- ऑथराइज़्ड कनेक्शन अनिवार्य करना एक अनऑथराइज़्ड कनेक्शन को बंद कनेक्शन में बदल देता है।
- मेंबर कनेक्शन टर्मिनेट करना इस तरह एक कनेक्शन जानबूझकर 4009 के साथ बंद किया जाता है।
- Realtime अवलोकन चैनल, मेंबर और कनेक्शन को एक मॉडल के रूप में कवर करता है।
संबंधित संसाधन
इस विषय के लिए डॉक्यूमेंटेशन, गाइड और उदाहरणों के साथ आगे बढ़ें। संसाधन अंग्रेज़ी में हैं।
क्षमता जानेंRealtimeलर्निंग पाथ फ़ॉलो करेंBuild your first integrationइम्प्लीमेंटेशन गाइडSend your first realtime event
अभ्यास करें और इम्प्लीमेंटेशन ब्रीफ़ पाएँ