PhoenixKit.Entities.Presence (phoenix_kit v1.6.15)

View Source

Presence tracking for collaborative entity editing.

Uses Phoenix.Presence to track who is currently editing an entity or data record. The first person to join a topic becomes the "owner" (can edit), and everyone else becomes "spectators" (read-only mode).

How It Works

  1. When a user opens an edit form, they join a Presence topic (e.g., "entity_edit:5")
  2. Presence tracks all connected users with metadata (user info, joined_at timestamp)
  3. Users are sorted by joined_at to determine order (FIFO)
  4. First user in the sorted list = owner (readonly?: false)
  5. All other users = spectators (readonly?: true)
  6. When owner leaves, Presence removes them automatically
  7. All connected users receive presence_diff event
  8. Each user re-evaluates: "Am I first now?"
  9. New first user auto-promotes to owner

Automatic Cleanup

Phoenix.Presence automatically detects when LiveView processes die and removes them immediately via process monitoring. When a user closes a tab or navigates away:

  1. WebSocket disconnects
  2. LiveView process terminates
  3. Presence automatically cleaned up (via process monitoring)
  4. All other users receive presence_diff event instantly

No manual cleanup or timeout configuration needed!

Topics

  • Entity editing: "entity_edit:<entity_id>"
  • Data editing: "data_edit:<data_id>"

Summary

Functions

child_spec(opts)

fetch(topic, presences)

Callback implementation for Phoenix.Presence.fetch/2.

fetchers_pids()

get_by_key(topic, key)

Callback implementation for Phoenix.Presence.get_by_key/2.

list(topic)

Callback implementation for Phoenix.Presence.list/1.

track(socket, key, meta)

Callback implementation for Phoenix.Presence.track/3.

track(pid, topic, key, meta)

Callback implementation for Phoenix.Presence.track/4.

untrack(socket, key)

Callback implementation for Phoenix.Presence.untrack/2.

untrack(pid, topic, key)

Callback implementation for Phoenix.Presence.untrack/3.

update(socket, key, meta)

Callback implementation for Phoenix.Presence.update/3.

update(pid, topic, key, meta)

Callback implementation for Phoenix.Presence.update/4.