Fetch joinedAtVersion before change log fetch for new groups

This commit is contained in:
Fedor Indutny 2022-01-26 16:02:23 -08:00 committed by GitHub
parent 2603d53891
commit 437ef2d3a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 44 deletions

View File

@ -2946,11 +2946,6 @@ async function getGroupUpdates({
group,
serverPublicParamsBase64,
newRevision,
// If we just linked and this is a group where we have been a member
// from the beggining - applying all changes since the start is the best
// case scenario.
fallbackRevision: 0,
});
return result;
@ -2973,36 +2968,6 @@ async function getGroupUpdates({
throw error;
}
}
// Fetch of logs starting from the revision 0 failed, so we probably were
// just invited to the group. Try fetching logs from the same revision as in
// this message.
if (isFirstFetch) {
try {
const result = await updateGroupViaLogs({
group,
serverPublicParamsBase64,
newRevision,
fallbackRevision: newRevision,
});
return result;
} catch (error) {
if (error.code === TEMPORAL_AUTH_REJECTED_CODE) {
// We will fail over to the updateGroupViaState call below
log.info(
`getGroupUpdates/${logId}: Temporal credential failure, now fetching full state`
);
} else if (error.code === GROUP_ACCESS_DENIED_CODE) {
// We will fail over to the updateGroupViaState call below
log.info(
`getGroupUpdates/${logId}: Log access denied, now fetching full state`
);
} else {
throw error;
}
}
}
}
if (window.GV2_ENABLE_STATE_PROCESSING) {
@ -3120,11 +3085,9 @@ async function updateGroupViaSingleChange({
async function updateGroupViaLogs({
group,
serverPublicParamsBase64,
fallbackRevision,
newRevision,
}: {
group: ConversationAttributesType;
fallbackRevision: number;
newRevision: number;
serverPublicParamsBase64: string;
}): Promise<UpdatesResultType> {
@ -3137,7 +3100,6 @@ async function updateGroupViaLogs({
const groupCredentials = getCredentialsForToday(data);
const deltaOptions = {
group,
fallbackRevision,
newRevision,
serverPublicParamsBase64,
authCredentialBase64: groupCredentials.today.credential,
@ -3261,13 +3223,11 @@ function getGroupCredentials({
async function getGroupDelta({
group,
newRevision,
fallbackRevision,
serverPublicParamsBase64,
authCredentialBase64,
}: {
group: ConversationAttributesType;
newRevision: number;
fallbackRevision: number;
serverPublicParamsBase64: string;
authCredentialBase64: string;
}): Promise<UpdatesResultType> {
@ -3292,7 +3252,7 @@ async function getGroupDelta({
const currentRevision = group.revision;
let revisionToFetch = isNumber(currentRevision)
? currentRevision + 1
: fallbackRevision;
: undefined;
let response;
const changes: Array<Proto.IGroupChanges> = [];

View File

@ -2134,7 +2134,7 @@ export default class MessageSender {
}
async getGroupLog(
startVersion: number,
startVersion: number | undefined,
options: Readonly<GroupCredentialsType>
): Promise<GroupLogResponseType> {
return this.server.getGroupLog(startVersion, options);

View File

@ -538,6 +538,7 @@ const URL_CALLS = {
getIceServers: 'v1/accounts/turn',
getStickerPackUpload: 'v1/sticker/pack/form',
groupLog: 'v1/groups/logs',
groupJoinedAtVersion: 'v1/groups/joined_at_version',
groups: 'v1/groups',
groupsViaLink: 'v1/groups/join',
groupToken: 'v1/groups/token',
@ -803,7 +804,7 @@ export type WebAPIType = {
options: GroupCredentialsType
) => Promise<Proto.GroupExternalCredential>;
getGroupLog: (
startVersion: number,
startVersion: number | undefined,
options: GroupCredentialsType
) => Promise<GroupLogResponseType>;
getIceServers: () => Promise<GetIceServersResultType>;
@ -2590,7 +2591,7 @@ export function initialize({
}
async function getGroupLog(
startVersion: number,
startVersion: number | undefined,
options: GroupCredentialsType
): Promise<GroupLogResponseType> {
const basicAuth = generateGroupAuth(
@ -2598,6 +2599,22 @@ export function initialize({
options.authCredentialPresentationHex
);
// If we don't know starting revision - fetch it from the server
if (startVersion === undefined) {
const { data: joinedData } = await _ajax({
basicAuth,
call: 'groupJoinedAtVersion',
contentType: 'application/x-protobuf',
host: storageUrl,
httpType: 'GET',
responseType: 'byteswithdetails',
});
const { joinedAtVersion } = Proto.Member.decode(joinedData);
return getGroupLog(joinedAtVersion, options);
}
const withDetails = await _ajax({
basicAuth,
call: 'groupLog',