PhoenixKitEntities.Presence (PhoenixKitEntities v0.2.0)

Copy Markdown 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_uuid>"
  • Data editing: "data_edit:<data_uuid>"

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.