diff --git a/src/__tests__/sync/client.spec.luau b/src/__tests__/sync/client.spec.luau index faae0f7..afea44e 100644 --- a/src/__tests__/sync/client.spec.luau +++ b/src/__tests__/sync/client.spec.luau @@ -67,4 +67,29 @@ return function() expect(calls[1]).to.equal(2) expect(calls[2]).to.equal(3) end) + + it("batches patches", function() + local a = atom(0) + local b = atom(0) + local client = sync.client({ atoms = { a = a, b = b } }) + local states = {} + + subscribe(a, function() + states.b = b() + end) + + subscribe(b, function() + states.a = a() + end) + + client:sync({ + type = "patch", + data = { a = 1, b = 2 }, + }) + + expect(a()).to.equal(1) + expect(b()).to.equal(2) + expect(states.a).to.equal(1) + expect(states.b).to.equal(2) + end) end diff --git a/src/sync/client.luau b/src/sync/client.luau index fa214dd..ce6993e 100644 --- a/src/sync/client.luau +++ b/src/sync/client.luau @@ -1,3 +1,4 @@ +local store = require(script.Parent.Parent.store) local types = require(script.Parent.Parent.types) type Atom = types.Atom type SyncPayload = types.SyncPayload @@ -36,13 +37,17 @@ local function client(options: ClientOptions): ClientSyncer for index = 1, select("#", ...) do local payload = select(index, ...) - for key, state in next, payload.data do - if payload.type == "patch" then - atoms[key](patch.apply(atoms[key](), state)) - else - atoms[key](state) + store.batch(function() + for key, state in next, payload.data do + local atom = atoms[key] + + if payload.type == "patch" then + atom(patch.apply(atom(), state)) + else + atom(state) + end end - end + end) end end