-
Notifications
You must be signed in to change notification settings - Fork 10
Description
We are attempting to modify the same ydoc in the browser using yjs, and on our server using yrb. I have a pretty simple setup client side (this is simplified further for the sake of this report, but captures our use case fairly):
const ydoc = new Y.Doc();
const localBinder = bindImmerYjs(ydoc.getMap("data"));
localBinder.update((s) => {
return {
testString: "foo",
testInt: 1,
testFloat: 3.1415,
testBool: false,
testArray: [1, "two", true],
testHash: { a: 1, b: "2", c: false }
}
})This ydoc is encoded as a uint8array, base64'd, then sent to the server where it's saved to a file store. In ruby, we load this content and try to access these values. This is mostly working. Roughly, this looks like:
ydata = Base64.decode64(stored_data)
ydoc = Y::Doc.new
ydoc.transact { |tx| tx.apply(ydata.bytes.to_a) }
ymap = ydoc.get_map("data")All that is working, but this is where we run into problems:
# Works as expected
ymap[:testString] # => "foo"
ymap[:testBool] # => false
ymap[:testFloat] # => 3.1415
# Works close enough, but still wrong
ymap[:testInt] # => 1.0 (notice this is a Float now)
# Panick!
ymap[:testArray]
ymap[:testHash]These Panicks are identical, producing:
thread '<unnamed>' panicked at /bundle/ruby/3.1.0/gems/y-rb-0.5.2/ext/yrb/.rb-sys/stable/cargo/registry/src/index.crates.io-6f17d22bba15001f/yrs-0.16.9/src/doc.rs:775:41:
called `Option::unwrap()` on a `None` value
There's an obvious workaround here where we can encode our hashes and arrays as a JSON string, but if we're going to do that, we might as well encode the whole map as a JSON string instead of as a map in the first place.
Note that this is not a problem when we decode these values on the client side.