First we probably need to wait for  the full read to complete.

Second, I think the fullRead probably fits in sync rather than here. The reason for it is simple: we don't need to ever fullRead unless the client does a sync. All other operations can be done without a fullRead ever being called. (set, subscribe). What you have done here is optimize for sync, which is called rather less number of times than other operations.