JavaScript में ऑफ़लाइन क्षमताएं चालू करना

Firebase ऐप्लिकेशन तब भी काम करते हैं, जब आपका ऐप्लिकेशन कुछ समय के लिए अपना नेटवर्क कनेक्शन बंद कर देता है. हम मौजूदगी को मॉनिटर करने और लोकल स्टेटस को सर्वर की स्थिति के साथ सिंक करने के लिए, कई टूल उपलब्ध कराते हैं. इनके बारे में इस दस्तावेज़ में बताया गया है.

मौजूदगी मैनेज करना

रीयलटाइम ऐप्लिकेशन में, यह पता लगाना अक्सर मददगार होता है कि क्लाइंट कब कनेक्ट और डिसकनेक्ट करने में मदद करता है. उदाहरण के लिए, आप किसी उपयोगकर्ता को 'ऑफ़लाइन' के तौर पर मार्क करना है जब उसका क्लाइंट डिसकनेक्ट हो जाता है.

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

डिस्कनेक्ट होने पर डेटा लिखने का एक आसान उदाहरण यहां दिया गया है. onDisconnect प्रिमिटिव:

Web

import { getDatabase, ref, onDisconnect } from "firebase/database";

const db = getDatabase();
const presenceRef = ref(db, "disconnectmessage");
// Write a string when this client loses connection
onDisconnect(presenceRef).set("I disconnected!");

Web

var presenceRef = firebase.database().ref("disconnectmessage");
// Write a string when this client loses connection
presenceRef.onDisconnect().set("I disconnected!");

डिसकनेक्ट करने का तरीका

जब आप onDisconnect() कार्रवाई करते हैं, तो कार्रवाई Firebase रीयल टाइम डेटाबेस सर्वर पर मौजूद होती है. सर्वर, इन कामों के लिए सुरक्षा की जांच करता है: पक्का करें कि उपयोगकर्ता, अनुरोध किए गए इवेंट में बदलाव कर सकता हो. साथ ही, यह भी बताता हो कि अगर आपका ऐप्लिकेशन अमान्य है, तो उसे सही तरीके से सेव किया जा सकता है. इसके बाद सर्वर कनेक्शन की निगरानी करता है. अगर किसी भी समय कनेक्शन का समय खत्म हो जाता है या रीयलटाइम डेटाबेस क्लाइंट द्वारा सक्रिय रूप से बंद किया जाता है, तो सर्वर दूसरी बार (यह पक्का करने के लिए कि कार्रवाई अब भी मान्य है) और फिर शुरू करती है इवेंट.

लिखने की कार्रवाई पर आपका ऐप्लिकेशन कॉलबैक का इस्तेमाल कर सकता है यह पक्का करने के लिए कि onDisconnect सही तरीके से अटैच किया गया था:

Web

onDisconnect(presenceRef).remove().catch((err) => {
  if (err) {
    console.error("could not establish onDisconnect event", err);
  }
});

Web

presenceRef.onDisconnect().remove((err) => {
  if (err) {
    console.error("could not establish onDisconnect event", err);
  }
});

.cancel() पर कॉल करके भी onDisconnect इवेंट को रद्द किया जा सकता है:

Web

const onDisconnectRef = onDisconnect(presenceRef);
onDisconnectRef.set("I disconnected");
// some time later when we change our minds
onDisconnectRef.cancel();

Web

var onDisconnectRef = presenceRef.onDisconnect();
onDisconnectRef.set("I disconnected");
// some time later when we change our minds
onDisconnectRef.cancel();

कनेक्शन की स्थिति का पता लगाया जा रहा है

मौजूदगी से जुड़ी कई सुविधाओं के लिए, यह आपके ऐप्लिकेशन के लिए उपयोगी है यह जानने के लिए कि यह कब ऑनलाइन है या ऑफ़लाइन. Firebase रीयलटाइम डेटाबेस /.info/connected पर एक विशेष स्थान देता है जो हर बार Firebase रीयल टाइम डेटाबेस क्लाइंट के कनेक्शन की स्थिति को अपडेट करने पर बदलाव. यहां एक उदाहरण दिया गया है:

Web

import { getDatabase, ref, onValue } from "firebase/database";

const db = getDatabase();
const connectedRef = ref(db, ".info/connected");
onValue(connectedRef, (snap) => {
  if (snap.val() === true) {
    console.log("connected");
  } else {
    console.log("not connected");
  }
});

Web

var connectedRef = firebase.database().ref(".info/connected");
connectedRef.on("value", (snap) => {
  if (snap.val() === true) {
    console.log("connected");
  } else {
    console.log("not connected");
  }
});

/.info/connected एक बूलियन वैल्यू है, जो रीयलटाइम डेटाबेस क्लाइंट के बीच सिंक किया गया, क्योंकि वैल्यू यह है यह क्लाइंट की स्थिति पर निर्भर करता है. दूसरे शब्दों में, अगर एक क्लाइंट /.info/connected को 'गलत' के तौर पर पढ़ता है, यह नहीं है इस बात की गारंटी देता है कि कोई दूसरा क्लाइंट भी गलत मैसेज पढ़ेगा.

हैंडलिंग में लगने वाले समय का अंतर

सर्वर टाइमस्टैंप

Firebase रीयल टाइम डेटाबेस सर्वर, रिपोर्ट इंसर्ट करने का तरीका उपलब्ध कराते हैं टाइमस्टैंप की मदद से सर्वर पर डेटा के तौर पर जनरेट किया जाता है. इस सुविधा को, onDisconnect, भरोसेमंद तरीके से नोट करने का आसान तरीका देता है रीयल टाइम डेटाबेस क्लाइंट के डिसकनेक्ट होने का समय:

Web

import { getDatabase, ref, onDisconnect, serverTimestamp } from "firebase/database";

const db = getDatabase();
const userLastOnlineRef = ref(db, "users/joe/lastOnline");
onDisconnect(userLastOnlineRef).set(serverTimestamp());

Web

var userLastOnlineRef = firebase.database().ref("users/joe/lastOnline");
userLastOnlineRef.onDisconnect().set(firebase.database.ServerValue.TIMESTAMP);

क्लॉक स्क्यू

हालांकि, firebase.database.ServerValue.TIMESTAMP का मतलब है कि सटीक और ज़्यादातर रीड/राइट ऑपरेशन के लिए बेहतर होता है, कभी-कभी क्लाइंट के क्लॉक स्क्यू का अनुमान लगाना मददगार हो सकता है. के हिसाब से कार्रवाई करते हैं. आपने लोगों तक पहुंचाया मुफ़्त में /.info/serverTimeOffset जगह के लिए कॉलबैक अटैच कर सकते हैं मिलीसेकंड में, Firebase रीयल टाइम डेटाबेस क्लाइंट की वैल्यू पाने के लिए अनुमान लगाने के लिए, रिपोर्ट किए गए स्थानीय समय (मिलीसेकंड में Epoch समय) में जोड़ें सर्वर समय. ध्यान दें कि इस ऑफ़सेट की सटीक जानकारी पर इन चीज़ों से असर पड़ सकता है नेटवर्किंग इंतज़ार का समय. इसलिए, खास तौर पर यह पता लगाने में मददगार होता है कि घड़ी के समय में (1 सेकंड से ज़्यादा) का अंतर हो सकता है.

Web

import { getDatabase, ref, onValue } from "firebase/database";

const db = getDatabase();
const offsetRef = ref(db, ".info/serverTimeOffset");
onValue(offsetRef, (snap) => {
  const offset = snap.val();
  const estimatedServerTimeMs = new Date().getTime() + offset;
});

Web

var offsetRef = firebase.database().ref(".info/serverTimeOffset");
offsetRef.on("value", (snap) => {
  var offset = snap.val();
  var estimatedServerTimeMs = new Date().getTime() + offset;
});

मौजूदगी ऐप्लिकेशन का नमूना

डिस्कनेक्ट करने की कार्रवाइयों को कनेक्शन की स्थिति पर नज़र रखने की सुविधा के साथ जोड़कर और सर्वर टाइमस्टैंप के साथ, आप उपयोगकर्ता की मौजूदगी का सिस्टम बना सकते हैं. इस सिस्टम में, हर उपयोगकर्ता, डेटाबेस की लोकेशन पर डेटा सेव करता है. इससे यह पता चलता है कि रीयलटाइम डेटाबेस क्लाइंट ऑनलाइन है. क्लाइंट इस जगह को 'सही' पर तब सेट करते हैं, जब वे ऑनलाइन आते हैं और उनके डिसकनेक्ट होने पर टाइमस्टैंप भी दिखता है. यह टाइमस्टैंप बताता है कि दिया गया उपयोगकर्ता पिछली बार कब ऑनलाइन हुआ था.

ध्यान दें कि आपके ऐप को उपयोगकर्ता के को ऑनलाइन मार्क किया गया हो, ताकि क्लाइंट के पैदा होने की स्थिति में होने वाली किसी भी रेस से बचने के लिए दोनों निर्देश सर्वर को भेजे जाने से पहले, इंटरनेट बंद हो जाता है.

यहां उपयोगकर्ता की मौजूदगी का एक सामान्य सिस्टम दिया गया है:

Web

import { getDatabase, ref, onValue, push, onDisconnect, set, serverTimestamp } from "firebase/database";

// Since I can connect from multiple devices or browser tabs, we store each connection instance separately
// any time that connectionsRef's value is null (i.e. has no children) I am offline
const db = getDatabase();
const myConnectionsRef = ref(db, 'users/joe/connections');

// stores the timestamp of my last disconnect (the last time I was seen online)
const lastOnlineRef = ref(db, 'users/joe/lastOnline');

const connectedRef = ref(db, '.info/connected');
onValue(connectedRef, (snap) => {
  if (snap.val() === true) {
    // We're connected (or reconnected)! Do anything here that should happen only if online (or on reconnect)
    const con = push(myConnectionsRef);

    // When I disconnect, remove this device
    onDisconnect(con).remove();

    // Add this device to my connections list
    // this value could contain info about the device or a timestamp too
    set(con, true);

    // When I disconnect, update the last time I was seen online
    onDisconnect(lastOnlineRef).set(serverTimestamp());
  }
});

Web

// Since I can connect from multiple devices or browser tabs, we store each connection instance separately
// any time that connectionsRef's value is null (i.e. has no children) I am offline
var myConnectionsRef = firebase.database().ref('users/joe/connections');

// stores the timestamp of my last disconnect (the last time I was seen online)
var lastOnlineRef = firebase.database().ref('users/joe/lastOnline');

var connectedRef = firebase.database().ref('.info/connected');
connectedRef.on('value', (snap) => {
  if (snap.val() === true) {
    // We're connected (or reconnected)! Do anything here that should happen only if online (or on reconnect)
    var con = myConnectionsRef.push();

    // When I disconnect, remove this device
    con.onDisconnect().remove();

    // Add this device to my connections list
    // this value could contain info about the device or a timestamp too
    con.set(true);

    // When I disconnect, update the last time I was seen online
    lastOnlineRef.onDisconnect().set(firebase.database.ServerValue.TIMESTAMP);
  }
});