Class: WhereIsWaldo::Adapters::BaseAdapter

Inherits:
Object
  • Object
show all
Defined in:
app/services/where_is_waldo/adapters/base_adapter.rb

Direct Known Subclasses

DatabaseAdapter, RedisAdapter

Instance Method Summary collapse

Instance Method Details

#cleanup(timeout: nil) ⇒ Integer

Remove stale records

Parameters:

  • timeout (Integer) (defaults to: nil)

    Seconds threshold

Returns:

  • (Integer)

    Number removed

Raises:

  • (NotImplementedError)


83
84
85
# File 'app/services/where_is_waldo/adapters/base_adapter.rb', line 83

def cleanup(timeout: nil)
  raise NotImplementedError
end

#connect(session_id:, subject_id:, metadata: {}) ⇒ Boolean

Register a presence

Parameters:

  • session_id (String)

    Unique session identifier

  • subject_id (Integer/String)

    Subject identifier (user, member, etc.)

  • metadata (Hash) (defaults to: {})

    Additional data

Returns:

  • (Boolean)

    success

Raises:

  • (NotImplementedError)


11
12
13
# File 'app/services/where_is_waldo/adapters/base_adapter.rb', line 11

def connect(session_id:, subject_id:, metadata: {})
  raise NotImplementedError
end

#disconnect(session_id: nil, subject_id: nil) ⇒ Boolean

Remove a presence. Session-scoped disconnect requires both keys so a caller-supplied session_id can't disconnect another subject's row. Subject-only disconnect removes every session for that subject.

Parameters:

  • session_id (String) (defaults to: nil)

    Session identifier (requires subject_id when set)

  • subject_id (Integer/String) (defaults to: nil)

    Subject identifier

Returns:

  • (Boolean)

    success

Raises:

  • (NotImplementedError)


21
22
23
# File 'app/services/where_is_waldo/adapters/base_adapter.rb', line 21

def disconnect(session_id: nil, subject_id: nil)
  raise NotImplementedError
end

#heartbeat(session_id:, subject_id:, tab_visible: true, subject_active: true, metadata: {}) ⇒ Boolean

Update heartbeat

Parameters:

  • session_id (String)

    Session identifier

  • subject_id (Integer/String)

    Subject identifier (required — pairs with session_id to disambiguate colliding session ids across subjects)

  • tab_visible (Boolean) (defaults to: true)

    Is tab in foreground

  • subject_active (Boolean) (defaults to: true)

    Recent activity

  • metadata (Hash) (defaults to: {})

    Additional data

Returns:

  • (Boolean)

    success

Raises:

  • (NotImplementedError)


34
35
36
# File 'app/services/where_is_waldo/adapters/base_adapter.rb', line 34

def heartbeat(session_id:, subject_id:, tab_visible: true, subject_active: true, metadata: {})
  raise NotImplementedError
end

#online_subject_ids(timeout: nil) ⇒ Array<Integer>

Get all online subject IDs

Parameters:

  • timeout (Integer) (defaults to: nil)

    Seconds threshold

Returns:

  • (Array<Integer>)

    Subject IDs

Raises:

  • (NotImplementedError)


41
42
43
# File 'app/services/where_is_waldo/adapters/base_adapter.rb', line 41

def online_subject_ids(timeout: nil)
  raise NotImplementedError
end

#session_status(session_id, subject_id) ⇒ Hash?

Get session status

Parameters:

  • session_id (String)

    Session identifier

  • subject_id (Integer/String)

    Subject identifier — required for the same reason as heartbeat (see above)

Returns:

  • (Hash, nil)

    Presence record or nil

Raises:

  • (NotImplementedError)


76
77
78
# File 'app/services/where_is_waldo/adapters/base_adapter.rb', line 76

def session_status(session_id, subject_id)
  raise NotImplementedError
end

#sessions_for_subject(subject_id) ⇒ Array<Hash>

Get all sessions for a subject

Parameters:

  • subject_id (Integer/String)

    Subject identifier

Returns:

  • (Array<Hash>)

    Presence records

Raises:

  • (NotImplementedError)


48
49
50
# File 'app/services/where_is_waldo/adapters/base_adapter.rb', line 48

def sessions_for_subject(subject_id)
  raise NotImplementedError
end

#sessions_for_subjects(subject_ids, timeout: nil) ⇒ Hash{Integer/String => Array<Hash>}

Get live sessions for many subjects in one call, grouped by subject id. Subjects with no live sessions are omitted from the returned hash. Adapters should override for efficiency; this default is a correct but unoptimized fan-out over sessions_for_subject.

Parameters:

  • subject_ids (Array<Integer/String>)

    Subject identifiers

  • timeout (Integer, nil) (defaults to: nil)

    Seconds threshold; sessions with last_heartbeat older than Time.current - timeout are excluded

Returns:

  • (Hash{Integer/String => Array<Hash>})

    subject_id => sessions



60
61
62
63
64
65
66
67
68
69
# File 'app/services/where_is_waldo/adapters/base_adapter.rb', line 60

def sessions_for_subjects(subject_ids, timeout: nil)
  ids = Array(subject_ids).compact.uniq
  return {} if ids.empty?

  threshold = Time.current - (timeout || default_timeout)
  ids.each_with_object({}) do |sid, memo|
    live = sessions_for_subject(sid).select { |s| s[:last_heartbeat] && s[:last_heartbeat] >= threshold }
    memo[sid] = live if live.any?
  end
end