Sha256: 2e72e6816964caca2234ab7c84c276163c3f6aeaf761e295e45b72b077d16984

Contents?: true

Size: 883 Bytes

Versions: 7

Compression:

Stored size: 883 Bytes

Contents

# frozen_string_literal: true

module SolidCable
  class Message < SolidCable::Record
    scope :trimmable, lambda {
      where(created_at: ...::SolidCable.message_retention.ago)
    }
    scope :broadcastable, lambda { |channels, last_id|
      where(channel_hash: channel_hashes_for(channels)).
        where(id: (last_id + 1)..).order(:id)
    }

    class << self
      def broadcast(channel, payload)
        insert({ created_at: Time.current, channel:, payload:,
          channel_hash: channel_hash_for(channel) })
      end

      def channel_hashes_for(channels)
        channels.map { |channel| channel_hash_for(channel) }
      end

      # Need to unpack this as a signed integer since Postgresql and SQLite
      # don't support unsigned integers
      def channel_hash_for(channel)
        Digest::SHA256.digest(channel.to_s).unpack1("q>")
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
solid_cable-3.0.7 app/models/solid_cable/message.rb
solid_cable-3.0.6 app/models/solid_cable/message.rb
solid_cable-3.0.5 app/models/solid_cable/message.rb
solid_cable-3.0.4 app/models/solid_cable/message.rb
solid_cable-3.0.3 app/models/solid_cable/message.rb
solid_cable-3.0.2 app/models/solid_cable/message.rb
solid_cable-3.0.1 app/models/solid_cable/message.rb