allow multiple clients for the same id

This commit is contained in:
Sebastian Jambor 2023-01-12 19:48:04 +01:00
parent 4bed6085a6
commit a3b8fa244a
3 changed files with 68 additions and 8 deletions

View file

@ -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

View file

@ -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

View 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