require "active_support/all" module ActionMerge class SyncChannel < ActionCable::Channel::Base cattr_accessor :peers @@peers ||= {} def subscribed @model = ActiveSupport::Inflector.constantize(params[:syncable_type]).find(params[:syncable_id]) reject unless @model.authorize_sync(self) @peer = ActionMerge::Peer.new(params[:id], storageId: params.dig(:metadata, :storageId), isEphemeral: params.dig(:metadata, :isEphemeral), model: @model) @@peers[@peer.to_gid_param] = @peer stream_for @peer end def perform_action(data) data.deep_symbolize_keys! if data.dig(:targetId).presence self.class.broadcast_to(@@peers[data[:targetId]], data) else @@peers.each do |id, peer| self.class.broadcast_to(peer, data) unless id == @peer&.to_gid_param end end end def unsubscribed @@peers[@peer&.to_gid_param] = nil @peer = nil end end end