Class: WhereIsWaldo::PresenceService

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

Class Method Summary collapse

Class Method Details

.all_online_ids(timeout: nil) ⇒ Array<Integer>

Get all online subject IDs (no scope filtering)

Parameters:

  • timeout (Integer) (defaults to: nil)

    Seconds threshold

Returns:

  • (Array<Integer>)


68
69
70
# File 'app/services/where_is_waldo/presence_service.rb', line 68

def all_online_ids(timeout: nil)
  adapter.online_subject_ids(timeout: timeout)
end

.cleanup(timeout: nil) ⇒ Integer

Cleanup stale records

Parameters:

  • timeout (Integer) (defaults to: nil)

    Seconds threshold (defaults to config.timeout)

Returns:

  • (Integer)

    Number of records removed



92
93
94
# File 'app/services/where_is_waldo/presence_service.rb', line 92

def cleanup(timeout: nil)
  adapter.cleanup(timeout: timeout)
end

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

Register a new 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



11
12
13
14
15
16
17
# File 'app/services/where_is_waldo/presence_service.rb', line 11

def connect(session_id:, subject_id:, metadata: {})
  adapter.connect(
    session_id: session_id,
    subject_id: subject_id,
    metadata: 
  )
end

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

Remove a presence by session, or all presences for a subject

Parameters:

  • session_id (String) (defaults to: nil)

    Session identifier (optional)

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

    Subject identifier (optional)

Returns:

  • (Boolean)

    success



23
24
25
26
27
28
# File 'app/services/where_is_waldo/presence_service.rb', line 23

def disconnect(session_id: nil, subject_id: nil)
  adapter.disconnect(
    session_id: session_id,
    subject_id: subject_id
  )
end

.heartbeat(session_id:, tab_visible: true, subject_active: true, last_activity_at: nil, metadata: {}) ⇒ Boolean

Update heartbeat for a session

Parameters:

  • session_id (String)

    Session identifier

  • tab_visible (Boolean) (defaults to: true)

    Is tab in foreground

  • subject_active (Boolean) (defaults to: true)

    Recent activity

  • last_activity_at (Integer) (defaults to: nil)

    Unix timestamp (ms) of last user activity

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

    Additional data to merge

Returns:

  • (Boolean)

    success



37
38
39
40
41
42
43
44
45
# File 'app/services/where_is_waldo/presence_service.rb', line 37

def heartbeat(session_id:, tab_visible: true, subject_active: true, last_activity_at: nil, metadata: {})
  adapter.heartbeat(
    session_id: session_id,
    tab_visible: tab_visible,
    subject_active: subject_active,
    last_activity_at: last_activity_at,
    metadata: 
  )
end

.online(scope, timeout: nil) ⇒ ActiveRecord::Relation

Get online subjects from an AR scope

Parameters:

  • scope (ActiveRecord::Relation)

    Scope to filter

  • timeout (Integer) (defaults to: nil)

    Seconds threshold (defaults to config.timeout)

Returns:

  • (ActiveRecord::Relation)

    Online subjects from the scope



51
52
53
54
# File 'app/services/where_is_waldo/presence_service.rb', line 51

def online(scope, timeout: nil)
  online_ids = adapter.online_subject_ids(timeout: timeout)
  scope.where(id: online_ids)
end

.online_ids(scope, timeout: nil) ⇒ Array<Integer>

Get online subject IDs from an AR scope

Parameters:

  • scope (ActiveRecord::Relation)

    Scope to filter

  • timeout (Integer) (defaults to: nil)

    Seconds threshold (defaults to config.timeout)

Returns:

  • (Array<Integer>)

    Online subject IDs



60
61
62
63
# File 'app/services/where_is_waldo/presence_service.rb', line 60

def online_ids(scope, timeout: nil)
  online_ids = adapter.online_subject_ids(timeout: timeout)
  scope.where(id: online_ids).pluck(:id)
end

.session_statusHash?

Get status of a specific session

Parameters:

  • session_id (String)

    Session identifier

Returns:

  • (Hash, nil)

    Presence record or nil



80
# File 'app/services/where_is_waldo/presence_service.rb', line 80

delegate :session_status, to: :adapter

.sessions_for_subjectArray<Hash>

Get all sessions for a subject

Parameters:

  • subject_id (Integer/String)

    Subject identifier

Returns:

  • (Array<Hash>)

    Presence records



75
# File 'app/services/where_is_waldo/presence_service.rb', line 75

delegate :sessions_for_subject, to: :adapter

.subject_online?(subject_id) ⇒ Boolean

Check if a subject is online

Parameters:

  • subject_id (Integer/String)

    Subject identifier

Returns:

  • (Boolean)


85
86
87
# File 'app/services/where_is_waldo/presence_service.rb', line 85

def subject_online?(subject_id)
  sessions_for_subject(subject_id).any?
end