diff --git a/ts/interactions/conversationInteractions.ts b/ts/interactions/conversationInteractions.ts index 78144d6fc..68643a2e0 100644 --- a/ts/interactions/conversationInteractions.ts +++ b/ts/interactions/conversationInteractions.ts @@ -54,11 +54,11 @@ import { sendInviteResponseToGroup } from '../session/sending/group/GroupInviteR import { NetworkTime } from '../util/NetworkTime'; import { ClosedGroup } from '../session'; import { GroupUpdateMessageFactory } from '../session/messages/message_factory/group/groupUpdateMessageFactory'; -import { GroupPromote } from '../session/utils/job_runners/jobs/GroupPromoteJob'; import { MessageSender } from '../session/sending'; import { StoreGroupRequestFactory } from '../session/apis/snode_api/factories/StoreGroupRequestFactory'; import { DURATION } from '../session/constants'; import type { LocalizerComponentPropsObject } from '../localization/localeTools'; +import { GroupInvite } from '../session/utils/job_runners/jobs/GroupInviteJob'; export async function copyPublicKeyByConvoId(convoId: string) { if (OpenGroupUtils.isOpenGroupV2(convoId)) { @@ -1053,6 +1053,6 @@ export async function promoteUsersInGroup({ for (let index = 0; index < membersHex.length; index++) { const member = membersHex[index]; // eslint-disable-next-line no-await-in-loop - await GroupPromote.addJob({ groupPk, member }); + await GroupInvite.addJob({ groupPk, member, inviteAsAdmin: true, forceUnrevoke: true }); } } diff --git a/ts/session/utils/job_runners/jobs/GroupInviteJob.ts b/ts/session/utils/job_runners/jobs/GroupInviteJob.ts index 58f84ce1f..0eff4695c 100644 --- a/ts/session/utils/job_runners/jobs/GroupInviteJob.ts +++ b/ts/session/utils/job_runners/jobs/GroupInviteJob.ts @@ -251,7 +251,6 @@ class GroupInviteJob extends PersistedJob { controller ); - if (effectiveTimestamp !== null) { failed = false; } @@ -265,11 +264,6 @@ class GroupInviteJob extends PersistedJob { `${jobType} with groupPk:"${groupPk}" member: ${member} id:"${identifier}" finished. failed:${failed}` ); try { - if (failed) { - await MetaGroupWrapperActions.memberSetInviteFailed(groupPk, member); - } else { - await MetaGroupWrapperActions.memberSetInviteSent(groupPk, member); - } // Depending on this field, we either send an invite or an invite-as-admin message. // When we do send an invite-as-admin we also need to update the promoted state, so that the invited members // knows he needs to accept the promotion when accepting the invite @@ -279,6 +273,10 @@ class GroupInviteJob extends PersistedJob { } else { await MetaGroupWrapperActions.memberSetPromotionSent(groupPk, member); } + } else if (failed) { + await MetaGroupWrapperActions.memberSetInviteFailed(groupPk, member); + } else { + await MetaGroupWrapperActions.memberSetInviteSent(groupPk, member); } } catch (e) { window.log.warn( diff --git a/ts/session/utils/job_runners/jobs/GroupPromoteJob.ts b/ts/session/utils/job_runners/jobs/GroupPromoteJob.ts deleted file mode 100644 index 2346c3ab7..000000000 --- a/ts/session/utils/job_runners/jobs/GroupPromoteJob.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { GroupPubkeyType, PubkeyType } from 'libsession_util_nodejs'; -import { isNumber } from 'lodash'; -import { v4 } from 'uuid'; -import { UserUtils } from '../..'; -import { groupInfoActions } from '../../../../state/ducks/metaGroups'; -import { - MetaGroupWrapperActions, - UserGroupsWrapperActions, -} from '../../../../webworker/workers/browser/libsession_worker_interface'; -import { SnodeNamespaces } from '../../../apis/snode_api/namespaces'; -import { SnodeGroupSignature } from '../../../apis/snode_api/signature/groupSignature'; -import { PubKey } from '../../../types'; -import { runners } from '../JobRunner'; -import { - AddJobCheckReturn, - GroupPromotePersistedData, - PersistedJob, - RunJobResult, -} from '../PersistedJob'; -import { MessageQueue } from '../../../sending'; -import { DURATION } from '../../../constants'; - -const defaultMsBetweenRetries = 10000; -const defaultMaxAttempts = 1; - -type JobExtraArgs = { - groupPk: GroupPubkeyType; - member: PubkeyType; -}; - -export function shouldAddJob(args: JobExtraArgs) { - if (UserUtils.isUsFromCache(args.member)) { - return false; - } - - return true; -} - -async function addJob({ groupPk, member }: JobExtraArgs) { - if (shouldAddJob({ groupPk, member })) { - const groupPromoteJob = new GroupPromoteJob({ - groupPk, - member, - nextAttemptTimestamp: Date.now(), - }); - window.log.debug(`addGroupPromoteJob: adding group promote for ${groupPk}:${member} `); - await runners.groupPromoteJobRunner.addJob(groupPromoteJob); - window?.inboxStore?.dispatch( - groupInfoActions.refreshGroupDetailsFromWrapper({ groupPk }) as any - ); - } -} - -class GroupPromoteJob extends PersistedJob { - constructor({ - groupPk, - member, - nextAttemptTimestamp, - maxAttempts, - currentRetry, - identifier, - }: Pick & - Partial< - Pick< - GroupPromotePersistedData, - 'nextAttemptTimestamp' | 'identifier' | 'maxAttempts' | 'currentRetry' - > - >) { - super({ - jobType: 'GroupPromoteJobType', - identifier: identifier || v4(), - member, - groupPk, - delayBetweenRetries: defaultMsBetweenRetries, - maxAttempts: isNumber(maxAttempts) ? maxAttempts : defaultMaxAttempts, - nextAttemptTimestamp: nextAttemptTimestamp || Date.now() + defaultMsBetweenRetries, - currentRetry: isNumber(currentRetry) ? currentRetry : 0, - }); - } - - public async run(): Promise { - const { groupPk, member, jobType, identifier } = this.persistedData; - - window.log.info( - `running job ${jobType} with groupPk:"${groupPk}" member: ${member} id:"${identifier}" ` - ); - const group = await UserGroupsWrapperActions.getGroup(groupPk); - if (!group || !group.secretKey || !group.name) { - window.log.warn(`GroupPromoteJob: Did not find group in wrapper or no valid info in wrapper`); - return RunJobResult.PermanentFailure; - } - - if (UserUtils.isUsFromCache(member)) { - return RunJobResult.Success; - } - let failed = true; - try { - const message = await SnodeGroupSignature.getGroupPromoteMessage({ - member, - secretKey: group.secretKey, - groupPk, - groupName: group.name, - }); - - const storedAt = await MessageQueue.use().sendTo1o1NonDurably({ - message, - namespace: SnodeNamespaces.Default, - pubkey: PubKey.cast(member), - }); - if (storedAt !== null) { - failed = false; - } - } finally { - try { - if (failed) { - await MetaGroupWrapperActions.memberSetPromotionFailed(groupPk, member); - } else { - await MetaGroupWrapperActions.memberSetPromotionSent(groupPk, member); - } - } catch (e) { - window.log.warn('GroupPromoteJob memberSetPromoted failed with', e.message); - } - } - // return true so this job is marked as a success and we don't need to retry it - return RunJobResult.Success; - } - - public serializeJob(): GroupPromotePersistedData { - return super.serializeBase(); - } - - public nonRunningJobsToRemove(_jobs: Array) { - return []; - } - - public addJobCheck(jobs: Array): AddJobCheckReturn { - // avoid adding the same job if the exact same one is already planned - const hasSameJob = jobs.some(j => { - return j.groupPk === this.persistedData.groupPk && j.member === this.persistedData.member; - }); - - if (hasSameJob) { - return 'skipAddSameJobPresent'; - } - - return null; - } - - public getJobTimeoutMs(): number { - return 15 * DURATION.SECONDS; - } -} - -export const GroupPromote = { - GroupPromoteJob, - addJob, -};