From da052bdb0aaee266650d8f4ec070c51f42a6cd00 Mon Sep 17 00:00:00 2001 From: Adam Chelminski Date: Thu, 23 Jun 2022 15:50:35 +0200 Subject: [PATCH 1/2] 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) + } + }) } /** From 6b7b3136e01314b98dcfec58fd139402a6229325 Mon Sep 17 00:00:00 2001 From: Adam Chelminski Date: Thu, 23 Jun 2022 16:01:29 +0200 Subject: [PATCH 2/2] delete set encoding should be in descending order --- src/utils/DeleteSet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/DeleteSet.js b/src/utils/DeleteSet.js index 6cde0655..32fd089b 100644 --- a/src/utils/DeleteSet.js +++ b/src/utils/DeleteSet.js @@ -222,7 +222,7 @@ export const writeDeleteSet = (encoder, ds) => { // Ensure that the delete set is written in a deterministic order Array.from(ds.clients.entries()) - .sort((clientA, clientB) => clientB[0] - clientA[0]) + .sort((clientA, clientB) => clientA[0] - clientB[0]) .forEach(([client, dsitems]) => { encoder.resetDsCurVal() encoding.writeVarUint(encoder.restEncoder, client)