133 lines
3.6 KiB
TypeScript
133 lines
3.6 KiB
TypeScript
|
// Copyright 2020-2021 Signal Messenger, LLC
|
||
|
// SPDX-License-Identifier: AGPL-3.0-only
|
||
|
|
||
|
/* eslint-disable max-classes-per-file */
|
||
|
|
||
|
import { Collection, Model } from 'backbone';
|
||
|
import { ConversationModel } from '../models/conversations';
|
||
|
|
||
|
type MessageRequestAttributesType = {
|
||
|
threadE164?: string;
|
||
|
threadUuid?: string;
|
||
|
groupId?: string;
|
||
|
groupV2Id?: string;
|
||
|
type: number;
|
||
|
};
|
||
|
|
||
|
class MessageRequestModel extends Model<MessageRequestAttributesType> {}
|
||
|
|
||
|
let singleton: MessageRequests | undefined;
|
||
|
|
||
|
export class MessageRequests extends Collection<MessageRequestModel> {
|
||
|
static getSingleton(): MessageRequests {
|
||
|
if (!singleton) {
|
||
|
singleton = new MessageRequests();
|
||
|
}
|
||
|
|
||
|
return singleton;
|
||
|
}
|
||
|
|
||
|
forConversation(conversation: ConversationModel): MessageRequestModel | null {
|
||
|
if (conversation.get('e164')) {
|
||
|
const syncByE164 = this.findWhere({
|
||
|
threadE164: conversation.get('e164'),
|
||
|
});
|
||
|
if (syncByE164) {
|
||
|
window.log.info(
|
||
|
`Found early message request response for E164 ${conversation.idForLogging()}`
|
||
|
);
|
||
|
this.remove(syncByE164);
|
||
|
return syncByE164;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (conversation.get('uuid')) {
|
||
|
const syncByUuid = this.findWhere({
|
||
|
threadUuid: conversation.get('uuid'),
|
||
|
});
|
||
|
if (syncByUuid) {
|
||
|
window.log.info(
|
||
|
`Found early message request response for UUID ${conversation.idForLogging()}`
|
||
|
);
|
||
|
this.remove(syncByUuid);
|
||
|
return syncByUuid;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// V1 Group
|
||
|
if (conversation.get('groupId')) {
|
||
|
const syncByGroupId = this.findWhere({
|
||
|
groupId: conversation.get('groupId'),
|
||
|
});
|
||
|
if (syncByGroupId) {
|
||
|
window.log.info(
|
||
|
`Found early message request response for group v1 ID ${conversation.idForLogging()}`
|
||
|
);
|
||
|
this.remove(syncByGroupId);
|
||
|
return syncByGroupId;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// V2 group
|
||
|
if (conversation.get('groupId')) {
|
||
|
const syncByGroupId = this.findWhere({
|
||
|
groupV2Id: conversation.get('groupId'),
|
||
|
});
|
||
|
if (syncByGroupId) {
|
||
|
window.log.info(
|
||
|
`Found early message request response for group v2 ID ${conversation.idForLogging()}`
|
||
|
);
|
||
|
this.remove(syncByGroupId);
|
||
|
return syncByGroupId;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
async onResponse(sync: MessageRequestModel): Promise<void> {
|
||
|
try {
|
||
|
const threadE164 = sync.get('threadE164');
|
||
|
const threadUuid = sync.get('threadUuid');
|
||
|
const groupId = sync.get('groupId');
|
||
|
const groupV2Id = sync.get('groupV2Id');
|
||
|
|
||
|
let conversation;
|
||
|
|
||
|
// We multiplex between GV1/GV2 groups here, but we don't kick off migrations
|
||
|
if (groupV2Id) {
|
||
|
conversation = window.ConversationController.get(groupV2Id);
|
||
|
}
|
||
|
if (!conversation && groupId) {
|
||
|
conversation = window.ConversationController.get(groupId);
|
||
|
}
|
||
|
if (!conversation && (threadE164 || threadUuid)) {
|
||
|
conversation = window.ConversationController.get(
|
||
|
window.ConversationController.ensureContactIds({
|
||
|
e164: threadE164,
|
||
|
uuid: threadUuid,
|
||
|
})
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if (!conversation) {
|
||
|
window.log.warn(
|
||
|
`Received message request response for unknown conversation: groupv2(${groupV2Id}) group(${groupId}) ${threadUuid} ${threadE164}`
|
||
|
);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
conversation.applyMessageRequestResponse(sync.get('type'), {
|
||
|
fromSync: true,
|
||
|
});
|
||
|
|
||
|
this.remove(sync);
|
||
|
} catch (error) {
|
||
|
window.log.error(
|
||
|
'MessageRequests.onResponse error:',
|
||
|
error && error.stack ? error.stack : error
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
}
|