Description
Thanks for developing a great gem.
And thanks for answering some of my previous questions.
We have been using this gem for the past few months as a beta version and have found cases where messages are lost under certain conditions.
First, some information about our environment:
Ruby on Rails: 7.0.4
Ruby: 3.2.1
Backend Data Source: Redis
Frontend Frame Work: Next.js (We use y-actioncable npm package in app.)
Our scripts. For debug, I put some loggers.
class DocumentChannel < ApplicationCable::Channel
include Y::Actioncable::Sync
def subscribed
reject unless document
sync_for(document) do |id, update|
redis.save(id, update)
end
end
def unsubscribed
stop_stream_from canonical_channel_key
end
def receive(message)
sync_to(document, message)
end
def doc
@doc ||= load do |id|
redis.load(id)
end
end
def document
@document ||= organization.documents.find(params[:document_id])
end
def redis
@redis ||= Yrb::Editor::Redis.new
end
end
module Yrb
module Editor
class Redis
attr_reader :client, :logger
def initialize
@client ||= ::Redis.new(url: Rails.application.config.x.redis_url)
@logger = SemanticLogger[self.class.to_s]
end
def save(id, update)
begin
data = encode(update)
doc = client.set(id, data)
logger.info("Yrb::Editor::Redis Finish Save", name: self.class.to_s, id:)
doc
rescue ::Redis::BaseError => e
logger.error("Yrb::Editor::Redis Failed to Save", name: self.class.to_s, inspect: e.inspect, message: e.message)
end
end
def load(id)
begin
data = client.get(id)
if data.present?
logger.info("Yrb::Editor::Redis Finish Load", name: self.class.to_s, id:)
decode(data) unless data.nil?
else
logger.error("Yrb::Editor::Redis Not Found", name: self.class.to_s, id:)
nil
end
rescue ::Redis::BaseError => e
logger.error("Yrb::Editor::Redis Failed to Load", name: self.class.to_s, inspect: e.inspect, message: e.message)
end
end
def encode(update)
update.pack("C*")
end
def decode(data)
data.unpack("C*") unless data.nil?
end
end
end
end
Kapture.2023-09-04.at.15.32.41.mp4
In the video above, the message is saved correctly for normal input, but after a large amount of input, it is lost after the page is reloaded. (Lines of text beginning with "e" are missing.)
Could #25 be related to this issue?
If you want any information to understand the issue, please let us know.
Thank for reading.