PhoenixKit.Modules.Publishing.Presence (phoenix_kit v1.7.42)

Copy Markdown View Source

Presence tracking for collaborative post editing.

Uses Phoenix.Presence to track who is currently editing a post. 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 the editor, they join a Presence topic (e.g., "publishing_edit:docs:post-slug")
  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. No manual cleanup needed.

Topics

  • Post editing: "publishing_edit:<form_key>"

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.