summaryrefslogtreecommitdiff
path: root/app/models/concerns/awareness.rb
blob: da87d87e838aeb8a30e0ede117d185e21963c74b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# frozen_string_literal: true

module Awareness
  extend ActiveSupport::Concern

  KEY_NAMESPACE = "gitlab:awareness"
  private_constant :KEY_NAMESPACE

  def join(session)
    session.join(self)

    nil
  end

  def leave(session)
    session.leave(self)

    nil
  end

  def session_ids
    with_redis do |redis|
      redis
        .smembers(user_sessions_key)
        # converts session ids from (internal) integer to hex presentation
        .map { |key| key.to_i.to_s(16) }
    end
  end

  private

  def user_sessions_key
    "#{KEY_NAMESPACE}:user:#{id}:sessions"
  end

  def with_redis
    Gitlab::Redis::SharedState.with do |redis|
      yield redis if block_given?
    end
  end
end