Class: Raindrops::DownloadManager

Inherits:
Object
  • Object
show all
Includes:
ActionView::Helpers
Defined in:
app/models/raindrops/download_manager.rb

Overview

Modèle identifiant un gestionnaire de téléchargements

Instance Method Summary collapse

Instance Method Details

#send_events(sse, events) ⇒ Object

BOUCLE INFINIE ! Gestion de évènements liés aux téléchargements (progression, ajout, suppression, complétion). Un heartbeat est envoyé périodiquement pour s'assurer de la présence du client.

Parameters:

  • sse (SSE)

    Classe d'écriture des SSE

  • events (Array)

    Evènements de communication. Ceux-ci peuvent-être :

Options Hash (events):

  • :progress (Symbol)

    Notifications de progression de téléchargement

  • :created (Symbol)

    Notifications de création de téléchargement

  • :destroyed (Symbol)

    Notifications de suppression de téléchargement

  • :completed (Symbol)

    Notifications de complétion de téléchargement


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
42
43
# File 'app/models/raindrops/download_manager.rb', line 16

def send_events(sse, events)
  @sse = sse
  downloads = Raindrops::Download.all.index_by(&:id)
  old_downloads = downloads

  loop do
    send_heartbeat
    send_created_events(downloads, old_downloads) if events.include? :created
    send_destroyed_events(downloads, old_downloads) if events.include? :destroyed
    send_completed_events(downloads, old_downloads) if events.include? :completed

    20.times do
      if events.include? :progress
        downloads.each do |_download_id, download|
          send_progress_events download
        end
      end

      sleep 0.5
    end

    # Un clean cache est nécessaire ici, sinon rails continue a resservir les résultats du cache,
    # et donc ne voit pas les nouveaux téléchargements
    ActiveRecord::Base.connection.query_cache.clear
    old_downloads = downloads
    downloads = Raindrops::Download.all.index_by(&:id)
  end
end