mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-10-23 06:16:52 +09:00
Reuse epoch-verified record snapshots and avoid empty push payloads
This commit is contained in:
1 parent
74381e8b58
commit
bbee420097
9 files changed
+159
-21
No files matched your search
@@ -0,0 +1,24 @@
|
||||
# Rebuild request-local models from bounded, immutable database snapshots.
|
||||
# The observer must still see the captured epoch after lookup and admission.
|
||||
class RecordCache
|
||||
def self.fetch(key, version)
|
||||
return yield unless version && ResponseCache.instance.budget.positive? && !ActiveRecord::Base.connection.transaction_open?
|
||||
|
||||
key = ActiveSupport::Cache.expand_cache_key([ "record-snapshot-v1", version, key ])
|
||||
return yield if key.bytesize > ResponseCache::MAX_KEY_BYTES
|
||||
|
||||
if snapshot = FragmentCache.store.read(key)
|
||||
if ResponseCache.instance.version == version
|
||||
return ActiveSupport::JSON.decode(snapshot).map { |name, attributes| name.constantize.instantiate(attributes) }
|
||||
end
|
||||
end
|
||||
|
||||
records = yield
|
||||
if records.all? { |record| record&.persisted? && !record.changed? } && ResponseCache.instance.version == version
|
||||
# Raw database values retain timestamp precision and native enum binding.
|
||||
snapshot = ActiveSupport::JSON.encode(records.map { |record| [ record.class.name, record.attributes_before_type_cast ] })
|
||||
FragmentCache.store.write(key, snapshot) if snapshot.bytesize <= ResponseCache::MAX_ENTRY_BYTES
|
||||
end
|
||||
records
|
||||
end
|
||||
end
|
||||
@@ -6,9 +6,9 @@ class Room::MessagePusher
|
||||
end
|
||||
|
||||
def push
|
||||
build_payload.tap do |payload|
|
||||
push_to_users_involved_in_everything(payload)
|
||||
push_to_users_involved_in_mentions(payload)
|
||||
subscriptions = push_subscriptions_for_users_involved_in_everything.or(push_subscriptions_for_mentionable_users(message.mentionees))
|
||||
if subscriptions.exists?
|
||||
Rails.configuration.x.web_push_pool.queue(build_payload, subscriptions)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -37,14 +37,6 @@ class Room::MessagePusher
|
||||
}
|
||||
end
|
||||
|
||||
def push_to_users_involved_in_everything(payload)
|
||||
enqueue_payload_for_delivery payload, push_subscriptions_for_users_involved_in_everything
|
||||
end
|
||||
|
||||
def push_to_users_involved_in_mentions(payload)
|
||||
enqueue_payload_for_delivery payload, push_subscriptions_for_mentionable_users(message.mentionees)
|
||||
end
|
||||
|
||||
def push_subscriptions_for_users_involved_in_everything
|
||||
relevant_subscriptions.merge(Membership.involved_in_everything)
|
||||
end
|
||||
@@ -59,10 +51,6 @@ class Room::MessagePusher
|
||||
Push::Subscription
|
||||
.joins(user: :memberships)
|
||||
.merge(User.active)
|
||||
.merge(Membership.visible.disconnected.where(room: room).where.not(user: message.creator))
|
||||
end
|
||||
|
||||
def enqueue_payload_for_delivery(payload, subscriptions)
|
||||
Rails.configuration.x.web_push_pool.queue(payload, subscriptions)
|
||||
.merge(Membership.visible.disconnected.where(room: room).where.not(user_id: message.creator_id))
|
||||
end
|
||||
end
|
||||
Reference in new issue
Block a user