diff --git a/packages/@dcl/sdk/src/network/message-bus-sync.ts b/packages/@dcl/sdk/src/network/message-bus-sync.ts index 291d764f8..eac434947 100644 --- a/packages/@dcl/sdk/src/network/message-bus-sync.ts +++ b/packages/@dcl/sdk/src/network/message-bus-sync.ts @@ -34,8 +34,11 @@ export function addSyncTransport( pendingMessageBusMessagesToSend.length = 0 return messages } + const players = definePlayerHelper(engine) + let stateIsSyncronized = false let transportInitialzed = false + // Add Sync Transport const transport: Transport = { filter: syncFilter(engine), @@ -55,7 +58,7 @@ export function addSyncTransport( engine.addTransport(transport) // End add sync transport - // If we dont have any state initialized, and recieve a state message. + // Receive & Process CRDT_STATE binaryMessageBus.on(CommsMessage.RES_CRDT_STATE, (value) => { const { sender, data } = decodeCRDTState(value) if (sender !== myProfile.userId) return @@ -64,34 +67,21 @@ export function addSyncTransport( stateIsSyncronized = true }) + // Answer to REQ_CRDT_STATE binaryMessageBus.on(CommsMessage.REQ_CRDT_STATE, async (message, userId) => { console.log(`Sending CRDT State to: ${userId}`) transport.onmessage!(message) binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, encodeCRDTState(userId, engineToCrdt(engine))) }) - function sleep(ms: number) { - return new Promise<void>((resolve) => { - let timer = 0 - function sleepSystem(dt: number) { - timer += dt - if (timer * 1000 >= ms) { - engine.removeSystem(sleepSystem) - resolve() - } - } - engine.addSystem(sleepSystem) - }) - } - - const players = definePlayerHelper(engine) - - let stateIsSyncronized = false - - let requestCrdtStateWhenConnected = false + // Process CRDT messages here + binaryMessageBus.on(CommsMessage.CRDT, (value) => { + DEBUG_NETWORK_MESSAGES() && + console.log(Array.from(serializeCrdtMessages('[NetworkMessage received]:', value, engine))) + transport.onmessage!(value) + }) async function requestState() { - requestCrdtStateWhenConnected = false let players = Array.from(engine.getEntitiesWith(PlayerIdentityData)) DEBUG_NETWORK_MESSAGES() && console.log(`Requesting state. Players connected: ${players.length - 1}`) binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, engineToCrdt(engine)) @@ -112,18 +102,24 @@ export function addSyncTransport( players.onEnterScene((player) => { DEBUG_NETWORK_MESSAGES() && console.log('[onEnterScene]', player.userId) - if (player.userId === myProfile.userId && !requestCrdtStateWhenConnected) { - if (RealmInfo.getOrNull(engine.RootEntity)?.isConnectedSceneRoom) { - void requestState() - } else { - DEBUG_NETWORK_MESSAGES() && console.log('Waiting to be conneted') - requestCrdtStateWhenConnected = true - } - } + // if (player.userId === myProfile.userId && !requestCrdtStateWhenConnected) { + // if (RealmInfo.getOrNull(engine.RootEntity)?.isConnectedSceneRoom) { + // void requestState() + // } else { + // DEBUG_NETWORK_MESSAGES() && console.log('Waiting to be conneted') + // requestCrdtStateWhenConnected = true + // } + // } }) + // Asks for the REQ_CRDT_STATE when its connected to comms RealmInfo.onChange(engine.RootEntity, (value) => { - if (value?.isConnectedSceneRoom && requestCrdtStateWhenConnected) { + if (!value?.isConnectedSceneRoom) { + DEBUG_NETWORK_MESSAGES() && console.log('Disconnected from comms') + stateIsSyncronized = false + } + + if (value?.isConnectedSceneRoom && !stateIsSyncronized) { void requestState() } }) @@ -131,23 +127,28 @@ export function addSyncTransport( players.onLeaveScene((userId) => { DEBUG_NETWORK_MESSAGES() && console.log('[onLeaveScene]', userId) if (userId === myProfile.userId) { - DEBUG_NETWORK_MESSAGES() && console.log('Disconnected from comms') - stateIsSyncronized = false - requestCrdtStateWhenConnected = false + // stateIsSyncronized = false } }) - // Process CRDT messages here - binaryMessageBus.on(CommsMessage.CRDT, (value) => { - DEBUG_NETWORK_MESSAGES() && - console.log(Array.from(serializeCrdtMessages('[NetworkMessage received]:', value, engine))) - transport.onmessage!(value) - }) - function isStateSyncronized() { return stateIsSyncronized } + function sleep(ms: number) { + return new Promise<void>((resolve) => { + let timer = 0 + function sleepSystem(dt: number) { + timer += dt + if (timer * 1000 >= ms) { + engine.removeSystem(sleepSystem) + resolve() + } + } + engine.addSystem(sleepSystem) + }) + } + return { ...entityDefinitions, myProfile,