-
Notifications
You must be signed in to change notification settings - Fork 14
Description
Hey @sep2, Thanks for making immer-yjs!
I have been thinking about making something similar and I am glad someone is already doing that :) (in my ideal world, one could even swap yjs with fluid framework or whatever, but thats for another time)
I have been playing with SyncedStore and I wonder how the two solutions compare in developer experience and performance. Some of my initial thoughts:
Developer Experience Advantages
-
immer-yjs has a plain object snapshot and translates immer patches to yjs, while syncedstore uses yjs as the store, and creates proxies around them. This means that reading the store is easy, no annoying proxies and cloning issues.
-
immer-yjs is also opinionated in the sense that an array set calls the yjs splice method by default - which might be not ideal in a collaborative setting. See my discussion here for reference. In any case, that is something that could potentially be configured in the future.
-
Wrapping everything around a produce plays nicely with transactions, which could be useful with the yjs support for transaction based undo/redo.
Sharing Granularity
The main issue I currently see with the "magic solution" is the crdt granularity. In most cases, you don't want the whole nested object to be composed of nested crdts, as this might create undesirable states. This is solved in SyncedStore with the Boxed values. This works but kind of annoying - you need to constantly wrap objects with a Box and then call .value on everything.
The ideal solution, in my opinion, is defining a schema and then updating the crdt's based on the schema. Are you open to a PR that adds support for something like that?
Performance
How does immer patches and maintaining the snapshot compare to the proxy based solution of synced store? I wonder what would be a good test for that.
Would love to hear your opinion about this, and if you are accepting PR's