allow multiple clients for the same id
This commit is contained in:
parent
4bed6085a6
commit
a3b8fa244a
3 changed files with 68 additions and 8 deletions
|
@ -33,7 +33,7 @@ class Api::V1::ActivityLogController < Api::BaseController
|
|||
sleep 10
|
||||
end
|
||||
ensure
|
||||
ActivityLogger.unregister(id)
|
||||
ActivityLogger.unregister(id, sse)
|
||||
sse.close
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,19 +2,21 @@
|
|||
|
||||
class ActivityLogger
|
||||
|
||||
@@loggers = Hash.new
|
||||
@@loggers = Hash.new { |hash, key| hash[key] = [] }
|
||||
|
||||
def self.register(id, sse)
|
||||
@@loggers[id] = sse
|
||||
@@loggers[id] << sse
|
||||
end
|
||||
|
||||
def self.unregister(id)
|
||||
@@loggers.delete(id)
|
||||
def self.unregister(id, sse)
|
||||
@@loggers[id].delete(sse)
|
||||
end
|
||||
|
||||
def self.log(id, event)
|
||||
if @@loggers[id]
|
||||
@@loggers[id].write event
|
||||
end
|
||||
@@loggers[id].each { |logger| logger.write event }
|
||||
end
|
||||
|
||||
def self.reset
|
||||
@@loggers.clear
|
||||
end
|
||||
end
|
||||
|
|
58
spec/lib/activity_logger_spec.rb
Normal file
58
spec/lib/activity_logger_spec.rb
Normal file
|
@ -0,0 +1,58 @@
|
|||
require 'json'
|
||||
require 'rails_helper'
|
||||
|
||||
def activity_log_event_fixture(name)
|
||||
json_string = File.read(Rails.root.join('spec', 'fixtures', 'activity_log_events', name))
|
||||
|
||||
ActivityLogEvent.from_json_string(json_string)
|
||||
end
|
||||
|
||||
RSpec.describe ActivityLogger do
|
||||
|
||||
after(:each) do
|
||||
ActivityLogger.reset
|
||||
end
|
||||
|
||||
describe 'log' do
|
||||
|
||||
it 'sends events to all listeners of the same id' do
|
||||
sse1 = spy('sse1')
|
||||
sse2 = spy('sse2')
|
||||
event = double('event')
|
||||
|
||||
ActivityLogger.register('test_id', sse1)
|
||||
ActivityLogger.register('test_id', sse2)
|
||||
|
||||
ActivityLogger.log('test_id', event)
|
||||
|
||||
expect(sse1).to have_received(:write).with(event)
|
||||
expect(sse2).to have_received(:write).with(event)
|
||||
end
|
||||
|
||||
it 'does not send events to listeners of a different id' do
|
||||
sse = spy('sse')
|
||||
event = double('event')
|
||||
|
||||
ActivityLogger.register('test_id', sse)
|
||||
|
||||
ActivityLogger.log('other_id', event)
|
||||
|
||||
expect(sse).to_not have_received(:write).with(event)
|
||||
end
|
||||
|
||||
it 'does not send events to listeners after unregistering' do
|
||||
sse1 = spy('sse1')
|
||||
sse2 = spy('sse2')
|
||||
event = double('event')
|
||||
|
||||
ActivityLogger.register('test_id', sse1)
|
||||
ActivityLogger.register('test_id', sse2)
|
||||
ActivityLogger.unregister('test_id', sse1)
|
||||
|
||||
ActivityLogger.log('test_id', event)
|
||||
|
||||
expect(sse1).to_not have_received(:write).with(event)
|
||||
expect(sse2).to have_received(:write).with(event)
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Reference in a new issue