Skip to content

Commit 1b1941a

Browse files
authored
fix: properly emit sync state right after starting/stopping (#725)
We didn't correctly emit `state.data.isSyncEnabled` right after starting or stopping; you needed to call the function twice to make it emit the correct state. This fixes that by emitting the event at a more correct time.
1 parent f5591d5 commit 1b1941a

File tree

2 files changed

+35
-21
lines changed

2 files changed

+35
-21
lines changed

src/sync/sync-api.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,9 +228,9 @@ export class SyncApi extends TypedEmitter {
228228
peerSyncController.setSyncEnabledState(syncEnabledState)
229229
}
230230

231-
this.emit('sync-state', this.#getState(namespaceSyncState))
232-
233231
this.#previousSyncEnabledState = syncEnabledState
232+
233+
this.emit('sync-state', this.#getState(namespaceSyncState))
234234
}
235235

236236
/**

test-e2e/sync.js

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { BLOCKED_ROLE_ID, COORDINATOR_ROLE_ID } from '../src/roles.js'
2929
import { kSyncState } from '../src/sync/sync-api.js'
3030
/** @typedef {import('../src/mapeo-project.js').MapeoProject} MapeoProject */
3131
/** @typedef {import('../src/sync/sync-api.js').SyncTypeState} SyncState */
32+
/** @typedef {import('../src/sync/sync-api.js').State} State */
3233

3334
const SCHEMAS_INITIAL_SYNC = ['preset', 'field']
3435

@@ -558,36 +559,49 @@ test('Sync state emitted when starting and stopping sync', async function (t) {
558559
const managers = await createManagers(COUNT, t)
559560
const [invitor, ...invitees] = managers
560561
const projectId = await invitor.createProject({ name: 'Mapeo' })
562+
const project = await invitor.getProject(projectId)
563+
t.after(() => project.close())
561564

562-
const disconnect = connectPeers(managers, { discovery: false })
565+
/** @type {State[]} */ const statesBeforeStart = []
566+
567+
/** @type {State[]} */ let states = statesBeforeStart
568+
project.$sync.on('sync-state', (state) => states.push(state))
563569

570+
const disconnect = connectPeers(managers, { discovery: false })
571+
t.after(disconnect)
564572
await invite({ invitor, invitees, projectId })
565573

566-
const projects = await Promise.all(
567-
managers.map((m) => m.getProject(projectId))
574+
/** @type {State[]} */ const statesAfterStart = []
575+
states = statesAfterStart
576+
project.$sync.start()
577+
assert(
578+
statesAfterStart.length >= 1,
579+
'Expected at least one event after starting'
568580
)
581+
for (const state of statesAfterStart) {
582+
assert(state.initial.isSyncEnabled, 'initial namespaces are enabled')
583+
assert(state.data.isSyncEnabled, 'data namespaces are enabled')
584+
}
569585

570-
const stateEvents = []
571-
572-
projects[0].$sync.on('sync-state', (state) => {
573-
const timestamp = Date.now()
574-
stateEvents.push({ state, timestamp })
575-
})
586+
await delay(500)
576587

577-
projects[0].$sync.start()
578-
assert(stateEvents.length === 1, 'sync-state event emitted after start')
588+
/** @type {State[]} */ const statesAfterStop = []
589+
states = statesAfterStop
590+
project.$sync.stop()
579591

580-
await delay(500)
592+
for (const state of statesAfterStart) {
593+
assert(state.initial.isSyncEnabled, 'initial namespaces are enabled')
594+
assert(state.data.isSyncEnabled, 'data namespaces are enabled')
595+
}
581596

582-
const eventCountBeforeStop = stateEvents.length
583-
projects[0].$sync.stop()
584597
assert(
585-
stateEvents.length > eventCountBeforeStop,
586-
'sync-state event emitted after stop'
598+
statesAfterStop.length >= 1,
599+
'Expected at least one event after stopping'
587600
)
588-
589-
await disconnect()
590-
await Promise.all(projects.map((p) => p.close()))
601+
for (const state of statesAfterStop) {
602+
assert(state.initial.isSyncEnabled, 'initial namespaces are still enabled')
603+
assert(!state.data.isSyncEnabled, 'data namespaces are disabled')
604+
}
591605
})
592606

593607
test('Correct sync state prior to data sync', async function (t) {

0 commit comments

Comments
 (0)