Skip to content

Presence

firekitPresence uses the Realtime Database’s connection state to track user presence. It writes an online/offline record to RTDB and cleans it up via onDisconnect.

import { firekitPresence } from 'svelte-firekit';
import { onMount } from 'svelte';
onMount(async () => {
await firekitPresence.initialize(user, {
sessionTTL: 30 * 60_000, // 30 minutes in ms
trackDeviceInfo: true,
geolocation: {
enabled: true,
type: 'browser',
requireConsent: true,
},
});
});
OptionTypeDefaultDescription
sessionTTLnumber1800000Session time-to-live in ms
trackDeviceInfobooleanfalseInclude device/browser info in the presence record
geolocation.enabledbooleanfalseTrack approximate location
geolocation.type'browser' | 'ip''browser'How to obtain location
geolocation.requireConsentbooleantrueOnly track after user consent
await firekitPresence.setPresence('online');
await firekitPresence.setPresence('away');
await firekitPresence.setPresence('offline');
const stats = firekitPresence.getStats();
console.log(stats.onlineSessions); // number of active sessions
console.log(stats.totalSessions); // all sessions including offline
console.log(stats.uniqueDevices); // number of distinct device types

Call dispose when the user signs out or the component that owns presence is destroyed:

await firekitPresence.dispose();

This removes the user’s presence record and cleans up the onDisconnect handler.

src/routes/+layout.svelte
<script lang="ts">
import { firekitPresence, firekitUser } from 'svelte-firekit';
import { onMount, onDestroy } from 'svelte';
onMount(async () => {
if (firekitUser.isAuthenticated && firekitUser.user) {
await firekitPresence.initialize(firekitUser.user, {
sessionTTL: 15 * 60_000,
trackDeviceInfo: true,
});
}
});
onDestroy(async () => {
await firekitPresence.dispose();
});
</script>