From da052bdb0aaee266650d8f4ec070c51f42a6cd00 Mon Sep 17 00:00:00 2001 From: Adam Chelminski Date: Thu, 23 Jun 2022 15:50:35 +0200 Subject: [PATCH] Make encodeStateAsUpdate deterministic --- src/utils/DeleteSet.js | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/utils/DeleteSet.js b/src/utils/DeleteSet.js index d396c97b..6cde0655 100644 --- a/src/utils/DeleteSet.js +++ b/src/utils/DeleteSet.js @@ -219,17 +219,21 @@ export const createDeleteSetFromStructStore = ss => { */ export const writeDeleteSet = (encoder, ds) => { encoding.writeVarUint(encoder.restEncoder, ds.clients.size) - ds.clients.forEach((dsitems, client) => { - encoder.resetDsCurVal() - encoding.writeVarUint(encoder.restEncoder, client) - const len = dsitems.length - encoding.writeVarUint(encoder.restEncoder, len) - for (let i = 0; i < len; i++) { - const item = dsitems[i] - encoder.writeDsClock(item.clock) - encoder.writeDsLen(item.len) - } - }) + + // Ensure that the delete set is written in a deterministic order + Array.from(ds.clients.entries()) + .sort((clientA, clientB) => clientB[0] - clientA[0]) + .forEach(([client, dsitems]) => { + encoder.resetDsCurVal() + encoding.writeVarUint(encoder.restEncoder, client) + const len = dsitems.length + encoding.writeVarUint(encoder.restEncoder, len) + for (let i = 0; i < len; i++) { + const item = dsitems[i] + encoder.writeDsClock(item.clock) + encoder.writeDsLen(item.len) + } + }) } /**