Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
Bilb committed Sep 14, 2023
1 parent 90f4dd7 commit 4bd7cb6
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 13 deletions.
29 changes: 26 additions & 3 deletions ts/models/conversation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ import { from_hex } from 'libsodium-wrappers-sumo';
import { SignalService } from '../protobuf';
import { getMessageQueue } from '../session';
import { getConversationController } from '../session/conversations';
import { ClosedGroupVisibleMessage } from '../session/messages/outgoing/visibleMessage/ClosedGroupVisibleMessage';
import {
ClosedGroupV3VisibleMessage,
ClosedGroupVisibleMessage,
} from '../session/messages/outgoing/visibleMessage/ClosedGroupVisibleMessage';
import { PubKey } from '../session/types';
import { ToastUtils, UserUtils } from '../session/utils';
import { BlockedNumberController } from '../util';
Expand Down Expand Up @@ -1701,6 +1704,7 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
// we are trying to send a message to someone. Make sure this convo is not hidden
await this.unhideIfNeeded(true);

// TODO break down those functions (sendMessage and retrySend into smaller functions and narrow the VisibleMessageParams to preview, etc. with checks of types)
// an OpenGroupV2 message is just a visible message
const chatMessageParams: VisibleMessageParams = {
body,
Expand Down Expand Up @@ -1761,8 +1765,7 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {

if (this.isPrivate()) {
if (this.isMe()) {
chatMessageParams.syncTarget = this.id;
const chatMessageMe = new VisibleMessage(chatMessageParams);
const chatMessageMe = new VisibleMessage({ ...chatMessageParams, syncTarget: this.id });

await getMessageQueue().sendSyncMessage({
namespace: SnodeNamespaces.Default,
Expand Down Expand Up @@ -1798,6 +1801,12 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
return;
}

if (this.isClosedGroupV3()) {
// we need the return await so that errors are caught in the catch {}
await this.sendMessageToGroupV3(chatMessageParams);
return;
}

if (this.isClosedGroup()) {
const chatMessageMediumGroup = new VisibleMessage(chatMessageParams);
const closedGroupVisibleMessage = new ClosedGroupVisibleMessage({
Expand All @@ -1819,6 +1828,20 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
}
}

private async sendMessageToGroupV3(chatMessageParams: VisibleMessageParams) {
const visibleMessage = new VisibleMessage(chatMessageParams);
const groupVisibleMessage = new ClosedGroupV3VisibleMessage({
chatMessage: visibleMessage,
destination: this.id,
namespace: SnodeNamespaces.ClosedGroupMessages,
});

// we need the return await so that errors are caught in the catch {}
await getMessageQueue().sendToGroupV3({
message: groupVisibleMessage,
});
}

private async sendBlindedMessageRequest(messageParams: VisibleMessageParams) {
const ourSignKeyBytes = await UserUtils.getUserED25519KeyPairBytes();
const groupUrl = this.getSogsOriginMessage();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import { PubKey } from '../../../types';
import { StringUtils } from '../../../utils';
import { VisibleMessage } from './VisibleMessage';
import { ClosedGroupMessage } from '../controlMessage/group/ClosedGroupMessage';
import { DataMessage } from '../DataMessage';
import { GroupPubkeyType } from 'libsession_util_nodejs';
import { SnodeNamespaces } from '../../../apis/snode_api/namespaces';

interface ClosedGroupVisibleMessageParams {
identifier?: string;
Expand Down Expand Up @@ -45,3 +48,36 @@ export class ClosedGroupVisibleMessage extends ClosedGroupMessage {
return dataProto;
}
}

type WithDestinationGroupPk = { destination: GroupPubkeyType };
type WithGroupMessageNamespace = { namespace: SnodeNamespaces.ClosedGroupMessages };

export class ClosedGroupV3VisibleMessage extends DataMessage {
private readonly chatMessage: VisibleMessage;
public readonly destination: GroupPubkeyType;
public readonly namespace: SnodeNamespaces.ClosedGroupMessages;

constructor(
params: Pick<ClosedGroupVisibleMessageParams, 'chatMessage' | 'identifier'> &
WithDestinationGroupPk &
WithGroupMessageNamespace
) {
super({
timestamp: params.chatMessage.timestamp,
identifier: params.identifier ?? params.chatMessage.identifier,
});
this.chatMessage = params.chatMessage;

if (!PubKey.isClosedGroupV3(params.destination)) {
throw new Error('ClosedGroupV3VisibleMessage only work with 03-groups destination');
}
this.destination = params.destination;
this.namespace = params.namespace;
}

public dataProto(): SignalService.DataMessage {
// expireTimer is set in the dataProto in this call directly
const dataProto = this.chatMessage.dataProto();
return dataProto;
}
}
44 changes: 34 additions & 10 deletions ts/session/sending/MessageQueue.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,39 @@
import { AbortController } from 'abort-controller';

import { PendingMessageCache } from './PendingMessageCache';
import { JobQueue, MessageUtils, UserUtils } from '../utils';
import { PubKey, RawMessage } from '../types';
import { MessageSender } from '.';
import { ClosedGroupMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupMessage';
import { ConfigurationMessage } from '../messages/outgoing/controlMessage/ConfigurationMessage';
import { ClosedGroupMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupMessage';
import { ClosedGroupNameChangeMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupNameChangeMessage';
import { PubKey, RawMessage } from '../types';
import { JobQueue, MessageUtils, UserUtils } from '../utils';
import { PendingMessageCache } from './PendingMessageCache';

import { ClosedGroupMemberLeftMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupMemberLeftMessage';
import { MessageSentHandler } from './MessageSentHandler';
import { ContentMessage } from '../messages/outgoing';
import { ExpirationTimerUpdateMessage } from '../messages/outgoing/controlMessage/ExpirationTimerUpdateMessage';
import { ClosedGroupAddedMembersMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupAddedMembersMessage';
import { ClosedGroupEncryptionPairMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupEncryptionPairMessage';
import { ClosedGroupMemberLeftMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupMemberLeftMessage';
import { ClosedGroupNewMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupNewMessage';
import { ClosedGroupRemovedMembersMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupRemovedMembersMessage';
import { ClosedGroupVisibleMessage } from '../messages/outgoing/visibleMessage/ClosedGroupVisibleMessage';
import {
ClosedGroupV3VisibleMessage,
ClosedGroupVisibleMessage,
} from '../messages/outgoing/visibleMessage/ClosedGroupVisibleMessage';
import { SyncMessageType } from '../utils/sync/syncUtils';
import { MessageSentHandler } from './MessageSentHandler';

import { OpenGroupRequestCommonType } from '../apis/open_group_api/opengroupV2/ApiUtil';
import { OpenGroupVisibleMessage } from '../messages/outgoing/visibleMessage/OpenGroupVisibleMessage';
import { UnsendMessage } from '../messages/outgoing/controlMessage/UnsendMessage';
import { CallMessage } from '../messages/outgoing/controlMessage/CallMessage';
import { OpenGroupMessageV2 } from '../apis/open_group_api/opengroupV2/OpenGroupMessageV2';
import { sendSogsReactionOnionV4 } from '../apis/open_group_api/sogsv3/sogsV3SendReaction';
import {
SnodeNamespaces,
SnodeNamespacesLegacyGroup,
SnodeNamespacesUser,
} from '../apis/snode_api/namespaces';
import { CallMessage } from '../messages/outgoing/controlMessage/CallMessage';
import { SharedConfigMessage } from '../messages/outgoing/controlMessage/SharedConfigMessage';
import { UnsendMessage } from '../messages/outgoing/controlMessage/UnsendMessage';
import { OpenGroupVisibleMessage } from '../messages/outgoing/visibleMessage/OpenGroupVisibleMessage';

type ClosedGroupMessageType =
| ClosedGroupVisibleMessage
Expand Down Expand Up @@ -196,6 +199,27 @@ export class MessageQueue {
return this.sendToPubKey(PubKey.cast(destinationPubKey), message, namespace, sentCb, true);
}

public async sendToGroupV3({
message,
sentCb,
}: {
message: ClosedGroupV3VisibleMessage;

sentCb?: (message: RawMessage) => Promise<void>;
}): Promise<void> {
if (!message.destination) {
throw new Error('Invalid group message passed in sendToGroupV3.');
}

return this.sendToPubKey(
PubKey.cast(message.destination),
message,
message.namespace,
sentCb,
true
);
}

public async sendSyncMessage({
namespace,
message,
Expand Down

0 comments on commit 4bd7cb6

Please sign in to comment.