Синхронизация, фикс ошибок
This commit is contained in:
@@ -7,31 +7,33 @@ import { PacketSync, SyncStatus } from "../ProtocolProvider/protocol/packets/pac
|
||||
import { useSender } from "../ProtocolProvider/useSender";
|
||||
import { usePacket } from "../ProtocolProvider/usePacket";
|
||||
import { whenFinish } from "./dialogQueue";
|
||||
import { useProtocol } from "../ProtocolProvider/useProtocol";
|
||||
|
||||
/**
|
||||
* Хук отвечает за синхронизацию сообщений, запрос синхронизации
|
||||
* при подключении
|
||||
*/
|
||||
export function useSynchronize() {
|
||||
const [protocolState, setProtocolState] = useProtocolState();
|
||||
const {getQuery} = useDatabase();
|
||||
const [_, setProtocolState] = useProtocolState();
|
||||
const {getQuery, runQuery} = useDatabase();
|
||||
const publicKey = usePublicKey();
|
||||
const send = useSender();
|
||||
const {protocol} = useProtocol();
|
||||
|
||||
useEffect(() => {
|
||||
if(protocolState == ProtocolState.CONNECTED){
|
||||
const handshake_complete = () => {
|
||||
trySync();
|
||||
setProtocolState(ProtocolState.SYNCHRONIZATION);
|
||||
}
|
||||
}, [protocolState]);
|
||||
protocol.on('handshake_complete', handshake_complete);
|
||||
|
||||
return () => {
|
||||
protocol.off('handshake_complete', handshake_complete);
|
||||
}
|
||||
}, [protocol]);
|
||||
|
||||
const trySync = async () => {
|
||||
const lastMessage = await getQuery("SELECT timestamp FROM messages WHERE account = ? ORDER BY timestamp DESC LIMIT 1", [publicKey]);
|
||||
if(!lastMessage){
|
||||
sendSynchronize(0);
|
||||
return;
|
||||
}
|
||||
sendSynchronize(lastMessage.timestamp);
|
||||
const lastSyncTime = await getQuery(`SELECT last_sync FROM accounts_sync_times WHERE account = ?`, [publicKey]);
|
||||
sendSynchronize(lastSyncTime?.last_sync ?? 0);
|
||||
}
|
||||
|
||||
const sendSynchronize = (timestamp: number) => {
|
||||
@@ -43,9 +45,20 @@ export function useSynchronize() {
|
||||
|
||||
usePacket(25, async (packet: PacketSync) => {
|
||||
const status = packet.getStatus();
|
||||
if(status == SyncStatus.BATCH_START){
|
||||
setProtocolState(ProtocolState.SYNCHRONIZATION);
|
||||
}
|
||||
if(status == SyncStatus.BATCH_END){
|
||||
console.info("Batch start");
|
||||
await whenFinish();
|
||||
trySync();
|
||||
console.info("Batch finished");
|
||||
await runQuery(
|
||||
"INSERT INTO accounts_sync_times (account, last_sync) VALUES (?, ?) " +
|
||||
"ON CONFLICT(account) DO UPDATE SET last_sync = ?",
|
||||
[publicKey, packet.getTimestamp(), packet.getTimestamp()]
|
||||
);
|
||||
console.info("Batch complete", publicKey, packet.getTimestamp());
|
||||
trySync();
|
||||
}
|
||||
if(status == SyncStatus.NOT_NEEDED){
|
||||
/**
|
||||
@@ -53,5 +66,5 @@ export function useSynchronize() {
|
||||
*/
|
||||
setProtocolState(ProtocolState.CONNECTED);
|
||||
}
|
||||
});
|
||||
}, [publicKey]);
|
||||
}
|
||||
Reference in New Issue
Block a user