diff --git a/database-next/offline.js b/database-next/offline.js new file mode 100644 index 00000000..461f3854 --- /dev/null +++ b/database-next/offline.js @@ -0,0 +1,121 @@ +// [SNIPPET_REGISTRY disabled] +// [SNIPPETS_SEPARATION enabled] + +import { initializeApp } from "firebase/app"; + +const firebaseApp = initializeApp({ + apiKey: '### FIREBASE API KEY ###', + appId: '### FIREBASE APP ID ###', + projectId: '### FIREBASE PROJECT ID ###' +}); + +function onDisconnectSimple() { + // [START rtdb_ondisconnect_simple] + const { getDatabase } = require("firebase/database"); + + const db = getDatabase(firebaseApp); + const presenceRef = db.ref("disconnectmessage"); + // Write a string when this client loses connection + presenceRef.onDisconnect().set("I disconnected!"); + // [END rtdb_ondisconnect_simple] +} + +function onDisconnectCallback() { + const { getDatabase } = require("firebase/database"); + + const db = getDatabase(firebaseApp); + const presenceRef = db.ref("disconnectmessage"); + + // [START rtdb_ondisconnect_callback] + presenceRef.onDisconnect().remove((err) => { + if (err) { + console.error("could not establish onDisconnect event", err); + } + }); + // [END rtdb_ondisconnect_callback] +} + +function onDisconnectCancel() { + const { getDatabase } = require("firebase/database"); + + const db = getDatabase(firebaseApp); + const presenceRef = db.ref("disconnectmessage"); + + // [START rtdb_ondisconnect_cancel] + const onDisconnectRef = presenceRef.onDisconnect(); + onDisconnectRef.set("I disconnected"); + // some time later when we change our minds + onDisconnectRef.cancel(); + // [END rtdb_ondisconnect_cancel] +} + +function detectConnectionState() { + // [START rtdb_detect_connection_state] + const { getDatabase } = require("firebase/database"); + + const db = getDatabase(firebaseApp); + const connectedRef = db.ref(".info/connected"); + connectedRef.on("value", (snap) => { + if (snap.val() === true) { + console.log("connected"); + } else { + console.log("not connected"); + } + }); + // [END rtdb_detect_connection_state] +} + +function setServerTimestamp() { + // [START rtdb_set_server_timestamp] + const { getDatabase, ServerValue } = require("firebase/database"); + + const db = getDatabase(firebaseApp); + const userLastOnlineRef = db.ref("users/joe/lastOnline"); + userLastOnlineRef.onDisconnect().set(ServerValue.TIMESTAMP); + // [END rtdb_set_server_timestamp] +} + +function estimateClockSkew() { + // [START rtdb_estimate_clock_skew] + const { getDatabase } = require("firebase/database"); + + const db = getDatabase(firebaseApp); + const offsetRef = db.ref(".info/serverTimeOffset"); + offsetRef.on("value", (snap) => { + const offset = snap.val(); + const estimatedServerTimeMs = new Date().getTime() + offset; + }); + // [END rtdb_estimate_clock_skew] +} + +function samplePresenceApp() { + // [START rtdb_sample_presence_app] + const { getDatabase, ServerValue } = require("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(firebaseApp); + const myConnectionsRef = db.ref('users/joe/connections'); + + // stores the timestamp of my last disconnect (the last time I was seen online) + const lastOnlineRef = db.ref('users/joe/lastOnline'); + + const connectedRef = db.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) + const 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(ServerValue.TIMESTAMP); + } + }); + // [END rtdb_sample_presence_app] +} diff --git a/database/offline.js b/database/offline.js new file mode 100644 index 00000000..66df4825 --- /dev/null +++ b/database/offline.js @@ -0,0 +1,95 @@ +// These samples are intended for Web so this import would normally be +// done in HTML however using modules here is more convenient for +// ensuring sample correctness offline. +import firebase from "firebase/app"; +import "firebase/database"; + +function onDisconnectSimple() { + // [START rtdb_ondisconnect_simple] + var presenceRef = firebase.database().ref("disconnectmessage"); + // Write a string when this client loses connection + presenceRef.onDisconnect().set("I disconnected!"); + // [END rtdb_ondisconnect_simple] +} + +function onDisconnectCallback() { + var presenceRef = firebase.database().ref("disconnectmessage"); + + // [START rtdb_ondisconnect_callback] + presenceRef.onDisconnect().remove((err) => { + if (err) { + console.error("could not establish onDisconnect event", err); + } + }); + // [END rtdb_ondisconnect_callback] +} + +function onDisconnectCancel() { + var presenceRef = firebase.database().ref("disconnectmessage"); + + // [START rtdb_ondisconnect_cancel] + var onDisconnectRef = presenceRef.onDisconnect(); + onDisconnectRef.set("I disconnected"); + // some time later when we change our minds + onDisconnectRef.cancel(); + // [END rtdb_ondisconnect_cancel] +} + +function detectConnectionState() { + // [START rtdb_detect_connection_state] + var connectedRef = firebase.database().ref(".info/connected"); + connectedRef.on("value", (snap) => { + if (snap.val() === true) { + console.log("connected"); + } else { + console.log("not connected"); + } + }); + // [END rtdb_detect_connection_state] +} + +function setServerTimestamp() { + // [START rtdb_set_server_timestamp] + var userLastOnlineRef = firebase.database().ref("users/joe/lastOnline"); + userLastOnlineRef.onDisconnect().set(firebase.database.ServerValue.TIMESTAMP); + // [END rtdb_set_server_timestamp] +} + +function estimateClockSkew() { + // [START rtdb_estimate_clock_skew] + var offsetRef = firebase.database().ref(".info/serverTimeOffset"); + offsetRef.on("value", (snap) => { + var offset = snap.val(); + var estimatedServerTimeMs = new Date().getTime() + offset; + }); + // [END rtdb_estimate_clock_skew] +} + +function samplePresenceApp() { + // [START rtdb_sample_presence_app] + // 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); + } + }); + // [END rtdb_sample_presence_app] +} diff --git a/snippets/database-next/offline/rtdb_detect_connection_state.js b/snippets/database-next/offline/rtdb_detect_connection_state.js new file mode 100644 index 00000000..3756f5be --- /dev/null +++ b/snippets/database-next/offline/rtdb_detect_connection_state.js @@ -0,0 +1,18 @@ +// This snippet file was generated by processing the source file: +// ./database-next/offline.js +// +// To make edits to the snippets in this file, please edit the source + +// [START rtdb_detect_connection_state_modular] +import { getDatabase } from "firebase/database"; + +const db = getDatabase(firebaseApp); +const connectedRef = db.ref(".info/connected"); +connectedRef.on("value", (snap) => { + if (snap.val() === true) { + console.log("connected"); + } else { + console.log("not connected"); + } +}); +// [END rtdb_detect_connection_state_modular] \ No newline at end of file diff --git a/snippets/database-next/offline/rtdb_estimate_clock_skew.js b/snippets/database-next/offline/rtdb_estimate_clock_skew.js new file mode 100644 index 00000000..cdb19491 --- /dev/null +++ b/snippets/database-next/offline/rtdb_estimate_clock_skew.js @@ -0,0 +1,15 @@ +// This snippet file was generated by processing the source file: +// ./database-next/offline.js +// +// To make edits to the snippets in this file, please edit the source + +// [START rtdb_estimate_clock_skew_modular] +import { getDatabase } from "firebase/database"; + +const db = getDatabase(firebaseApp); +const offsetRef = db.ref(".info/serverTimeOffset"); +offsetRef.on("value", (snap) => { + const offset = snap.val(); + const estimatedServerTimeMs = new Date().getTime() + offset; +}); +// [END rtdb_estimate_clock_skew_modular] \ No newline at end of file diff --git a/snippets/database-next/offline/rtdb_ondisconnect_callback.js b/snippets/database-next/offline/rtdb_ondisconnect_callback.js new file mode 100644 index 00000000..6af1ee61 --- /dev/null +++ b/snippets/database-next/offline/rtdb_ondisconnect_callback.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./database-next/offline.js +// +// To make edits to the snippets in this file, please edit the source + +// [START rtdb_ondisconnect_callback_modular] +presenceRef.onDisconnect().remove((err) => { + if (err) { + console.error("could not establish onDisconnect event", err); + } +}); +// [END rtdb_ondisconnect_callback_modular] \ No newline at end of file diff --git a/snippets/database-next/offline/rtdb_ondisconnect_cancel.js b/snippets/database-next/offline/rtdb_ondisconnect_cancel.js new file mode 100644 index 00000000..7af11312 --- /dev/null +++ b/snippets/database-next/offline/rtdb_ondisconnect_cancel.js @@ -0,0 +1,11 @@ +// This snippet file was generated by processing the source file: +// ./database-next/offline.js +// +// To make edits to the snippets in this file, please edit the source + +// [START rtdb_ondisconnect_cancel_modular] +const onDisconnectRef = presenceRef.onDisconnect(); +onDisconnectRef.set("I disconnected"); +// some time later when we change our minds +onDisconnectRef.cancel(); +// [END rtdb_ondisconnect_cancel_modular] \ No newline at end of file diff --git a/snippets/database-next/offline/rtdb_ondisconnect_simple.js b/snippets/database-next/offline/rtdb_ondisconnect_simple.js new file mode 100644 index 00000000..eedfab7f --- /dev/null +++ b/snippets/database-next/offline/rtdb_ondisconnect_simple.js @@ -0,0 +1,13 @@ +// This snippet file was generated by processing the source file: +// ./database-next/offline.js +// +// To make edits to the snippets in this file, please edit the source + +// [START rtdb_ondisconnect_simple_modular] +import { getDatabase } from "firebase/database"; + +const db = getDatabase(firebaseApp); +const presenceRef = db.ref("disconnectmessage"); +// Write a string when this client loses connection +presenceRef.onDisconnect().set("I disconnected!"); +// [END rtdb_ondisconnect_simple_modular] \ No newline at end of file diff --git a/snippets/database-next/offline/rtdb_sample_presence_app.js b/snippets/database-next/offline/rtdb_sample_presence_app.js new file mode 100644 index 00000000..bef04145 --- /dev/null +++ b/snippets/database-next/offline/rtdb_sample_presence_app.js @@ -0,0 +1,34 @@ +// This snippet file was generated by processing the source file: +// ./database-next/offline.js +// +// To make edits to the snippets in this file, please edit the source + +// [START rtdb_sample_presence_app_modular] +import { getDatabase, ServerValue } 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(firebaseApp); +const myConnectionsRef = db.ref('users/joe/connections'); + +// stores the timestamp of my last disconnect (the last time I was seen online) +const lastOnlineRef = db.ref('users/joe/lastOnline'); + +const connectedRef = db.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) + const 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(ServerValue.TIMESTAMP); + } +}); +// [END rtdb_sample_presence_app_modular] \ No newline at end of file diff --git a/snippets/database-next/offline/rtdb_set_server_timestamp.js b/snippets/database-next/offline/rtdb_set_server_timestamp.js new file mode 100644 index 00000000..f9319e07 --- /dev/null +++ b/snippets/database-next/offline/rtdb_set_server_timestamp.js @@ -0,0 +1,12 @@ +// This snippet file was generated by processing the source file: +// ./database-next/offline.js +// +// To make edits to the snippets in this file, please edit the source + +// [START rtdb_set_server_timestamp_modular] +import { getDatabase, ServerValue } from "firebase/database"; + +const db = getDatabase(firebaseApp); +const userLastOnlineRef = db.ref("users/joe/lastOnline"); +userLastOnlineRef.onDisconnect().set(ServerValue.TIMESTAMP); +// [END rtdb_set_server_timestamp_modular] \ No newline at end of file