| |
| import * as Y from 'yjs' |
| import * as t from 'lib0/testing' |
| import * as awareness from './awareness' |
| |
| /** |
| * @param {t.TestCase} tc |
| */ |
| export const testAwareness = tc => { |
| const doc1 = new Y.Doc() |
| doc1.clientID = 0 |
| const doc2 = new Y.Doc() |
| doc2.clientID = 1 |
| const aw1 = new awareness.Awareness(doc1) |
| const aw2 = new awareness.Awareness(doc2) |
| aw1.on('update', /** @param {any} p */ ({ added, updated, removed }) => { |
| const enc = awareness.encodeAwarenessUpdate(aw1, added.concat(updated).concat(removed)) |
| awareness.applyAwarenessUpdate(aw2, enc, 'custom') |
| }) |
| let lastChangeLocal = /** @type {any} */ (null) |
| aw1.on('change', /** @param {any} change */ change => { |
| lastChangeLocal = change |
| }) |
| let lastChange = /** @type {any} */ (null) |
| aw2.on('change', /** @param {any} change */ change => { |
| lastChange = change |
| }) |
| aw1.setLocalState({ x: 3 }) |
| t.compare(aw2.getStates().get(0), { x: 3 }) |
| t.assert(/** @type {any} */ (aw2.meta.get(0)).clock === 1) |
| t.compare(lastChange.added, [0]) |
| // When creating an Awareness instance, the the local client is already marked as available, so it is not updated. |
| t.compare(lastChangeLocal, { added: [], updated: [0], removed: [] }) |
| |
| // update state |
| lastChange = null |
| lastChangeLocal = null |
| aw1.setLocalState({ x: 4 }) |
| t.compare(aw2.getStates().get(0), { x: 4 }) |
| t.compare(lastChangeLocal, { added: [], updated: [0], removed: [] }) |
| t.compare(lastChangeLocal, lastChange) |
| |
| lastChange = null |
| lastChangeLocal = null |
| aw1.setLocalState({ x: 4 }) |
| t.assert(lastChange === null) |
| t.assert(/** @type {any} */ (aw2.meta.get(0)).clock === 3) |
| t.compare(lastChangeLocal, lastChange) |
| aw1.setLocalState(null) |
| t.assert(lastChange.removed.length === 1) |
| t.compare(aw1.getStates().get(0), undefined) |
| t.compare(lastChangeLocal, lastChange) |
| } |