diff --git a/ts/session/messages/index.ts b/ts/session/messages/index.ts index 7b89a8948..1358ed9f6 100644 --- a/ts/session/messages/index.ts +++ b/ts/session/messages/index.ts @@ -1,4 +1,3 @@ import * as Outgoing from './outgoing'; -// For Audric: Do you think we need to namespace? export { Outgoing }; diff --git a/ts/session/messages/outgoing/Message.ts b/ts/session/messages/outgoing/Message.ts new file mode 100644 index 000000000..2e23284c8 --- /dev/null +++ b/ts/session/messages/outgoing/Message.ts @@ -0,0 +1,3 @@ +export interface Message { + timestamp: number; +} diff --git a/ts/session/messages/outgoing/OpenGroupMessage.ts b/ts/session/messages/outgoing/OpenGroupMessage.ts index 0279934b9..65c23c6ba 100644 --- a/ts/session/messages/outgoing/OpenGroupMessage.ts +++ b/ts/session/messages/outgoing/OpenGroupMessage.ts @@ -1,13 +1,13 @@ -import { OutgoingMessage } from './OutgoingMessage'; +import { Message } from './Message'; import { AttachmentType } from '../../../types/Attachment'; import { QuotedAttachmentType } from '../../../components/conversation/Quote'; -export class OpenGroupMessage implements OutgoingMessage { - public timestamp: number; - public server: string; - public body?: string; - public attachments: [AttachmentType]; // TODO: Not sure if we should only use a subset of this type - public quote?: QuotedAttachmentType; +export class OpenGroupMessage implements Message { + public readonly timestamp: number; + public readonly server: string; + public readonly body?: string; + public readonly attachments: [AttachmentType]; // TODO: Not sure if we should only use a subset of this type + public readonly quote?: QuotedAttachmentType; constructor( timestamp: number, diff --git a/ts/session/messages/outgoing/OutgoingDataMessage.ts b/ts/session/messages/outgoing/OutgoingDataMessage.ts deleted file mode 100644 index c5585a21d..000000000 --- a/ts/session/messages/outgoing/OutgoingDataMessage.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { OutgoingContentMessage } from './OutgoingContentMessage'; -import { SignalService } from '../../../protobuf'; - -export class OutgoingDataMessage extends OutgoingContentMessage { - public contentProto(): SignalService.Content { - return new SignalService.Content({ - dataMessage: this.dataProto(), - }); - } - - protected dataProto(): SignalService.DataMessage { - throw new Error('dataProto() needs to be implemented.'); - } -} diff --git a/ts/session/messages/outgoing/OutgoingMessage.ts b/ts/session/messages/outgoing/OutgoingMessage.ts deleted file mode 100644 index 0c019cf49..000000000 --- a/ts/session/messages/outgoing/OutgoingMessage.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface OutgoingMessage { - timestamp: number; -} - -// Remove me once this is read -// Note for Audric, we don't have a `plainText()` function here because i realised that we use Uint8Arrays when encrypting -// It wouldn't make sense for this then to be `plainTextBuffer(): UInt8Array` as that's specific to OutgoingContentMessage. -// Thus i've left it out and moved it to outgoing content message diff --git a/ts/session/messages/outgoing/OutgoingContentMessage.ts b/ts/session/messages/outgoing/content/ContentMessage.ts similarity index 61% rename from ts/session/messages/outgoing/OutgoingContentMessage.ts rename to ts/session/messages/outgoing/content/ContentMessage.ts index da01ec9f7..559268188 100644 --- a/ts/session/messages/outgoing/OutgoingContentMessage.ts +++ b/ts/session/messages/outgoing/content/ContentMessage.ts @@ -1,28 +1,23 @@ -import { OutgoingMessage } from './OutgoingMessage'; -import { SignalService } from '../../../protobuf'; +import { Message } from '../Message'; +import { SignalService } from '../../../../protobuf'; -export class OutgoingContentMessage implements OutgoingMessage { - public timestamp: number; - public identifier: string; - public ttl: number; +export abstract class ContentMessage implements Message { + public readonly timestamp: number; + public readonly identifier: string; + public readonly ttl: number; constructor(timestamp: number, identifier: string, ttl: number) { this.timestamp = timestamp; this.identifier = identifier; this.ttl = ttl; } - // To discuss: - // should padding be the responsibility of the message or should it be the responsibility of the message sender to pad messages - // If it is the responsibility of the sender then `contentProto()` needs to become `protected` and not `public` public plainTextBuffer(): Uint8Array { const encoded = SignalService.Content.encode(this.contentProto()).finish(); return this.processPlainTextBuffer(encoded); } - public contentProto(): SignalService.Content { - throw new Error('contentProto() needs to be implemented.'); - } + protected abstract contentProto(): SignalService.Content; private processPlainTextBuffer(buffer: Uint8Array): Uint8Array { const paddedMessageLength = this.getPaddedMessageLength( diff --git a/ts/session/messages/outgoing/content/DeviceLinkMessage.ts b/ts/session/messages/outgoing/content/DeviceLinkMessage.ts new file mode 100644 index 000000000..b31e6fea7 --- /dev/null +++ b/ts/session/messages/outgoing/content/DeviceLinkMessage.ts @@ -0,0 +1,9 @@ +import { ContentMessage } from './ContentMessage'; +import { SignalService } from '../../../../protobuf'; + +export class DeviceLinkMessage extends ContentMessage { + + protected contentProto(): SignalService.Content { + throw new Error('Not implemented'); + } +} diff --git a/ts/session/messages/outgoing/content/EndSessionMessage.ts b/ts/session/messages/outgoing/content/EndSessionMessage.ts new file mode 100644 index 000000000..bb46233a6 --- /dev/null +++ b/ts/session/messages/outgoing/content/EndSessionMessage.ts @@ -0,0 +1,9 @@ +import { SessionResetMessage } from './SessionResetMessage'; +import { SignalService } from '../../../../protobuf'; + +export class EndSessionMessage extends SessionResetMessage { + + protected contentProto(): SignalService.Content { + throw new Error('Not implemented'); + } +} diff --git a/ts/session/messages/outgoing/content/ReceiptMessage.ts b/ts/session/messages/outgoing/content/ReceiptMessage.ts new file mode 100644 index 000000000..8cc8a43c6 --- /dev/null +++ b/ts/session/messages/outgoing/content/ReceiptMessage.ts @@ -0,0 +1,15 @@ +import { ContentMessage } from './ContentMessage'; +import { SignalService } from '../../../../protobuf'; + +export class ReceiptMessage extends ContentMessage { + + protected contentProto(): SignalService.Content { + return new SignalService.Content({ + receiptMessage: this.receiptProto(), + }); + } + + protected receiptProto(): SignalService.ReceiptMessage { + throw new Error('Not implemented'); + } +} diff --git a/ts/session/messages/outgoing/content/SessionEstablishedMessage.ts b/ts/session/messages/outgoing/content/SessionEstablishedMessage.ts new file mode 100644 index 000000000..16e1a8025 --- /dev/null +++ b/ts/session/messages/outgoing/content/SessionEstablishedMessage.ts @@ -0,0 +1,9 @@ +import { ContentMessage } from './ContentMessage'; +import { SignalService } from '../../../../protobuf'; + +export class SessionEstablishedMessage extends ContentMessage { + + protected contentProto(): SignalService.Content { + throw new Error('Not implemented'); + } +} diff --git a/ts/session/messages/outgoing/content/SessionResetMessage.ts b/ts/session/messages/outgoing/content/SessionResetMessage.ts new file mode 100644 index 000000000..4af9ae611 --- /dev/null +++ b/ts/session/messages/outgoing/content/SessionResetMessage.ts @@ -0,0 +1,9 @@ +import { ContentMessage } from './ContentMessage'; +import { SignalService } from '../../../../protobuf'; + +export class SessionResetMessage extends ContentMessage { + + protected contentProto(): SignalService.Content { + throw new Error('Not implemented'); + } +} diff --git a/ts/session/messages/outgoing/content/TypingMessage.ts b/ts/session/messages/outgoing/content/TypingMessage.ts new file mode 100644 index 000000000..8efb163b2 --- /dev/null +++ b/ts/session/messages/outgoing/content/TypingMessage.ts @@ -0,0 +1,13 @@ +import { ContentMessage } from './ContentMessage'; +import { SignalService } from '../../../../protobuf'; + +export abstract class TypingMessage extends ContentMessage { + + protected contentProto(): SignalService.Content { + return new SignalService.Content({ + typingMessage: this.typingProto(), + }); + } + + protected abstract typingProto(): SignalService.TypingMessage; +} diff --git a/ts/session/messages/outgoing/content/data/ClosedGroupMessage.ts b/ts/session/messages/outgoing/content/data/ClosedGroupMessage.ts new file mode 100644 index 000000000..8cc2e16a4 --- /dev/null +++ b/ts/session/messages/outgoing/content/data/ClosedGroupMessage.ts @@ -0,0 +1,9 @@ +import { DataMessage } from './DataMessage'; +import { SignalService } from '../../../../../protobuf'; + +export class ClosedGroupMessage extends DataMessage { + + protected dataProto(): SignalService.DataMessage { + throw new Error('Not implemented'); + } +} diff --git a/ts/session/messages/outgoing/content/data/DataMessage.ts b/ts/session/messages/outgoing/content/data/DataMessage.ts new file mode 100644 index 000000000..03582177d --- /dev/null +++ b/ts/session/messages/outgoing/content/data/DataMessage.ts @@ -0,0 +1,13 @@ +import { ContentMessage } from '../ContentMessage'; +import { SignalService } from '../../../../../protobuf'; + +export abstract class DataMessage extends ContentMessage { + + protected contentProto(): SignalService.Content { + return new SignalService.Content({ + dataMessage: this.dataProto(), + }); + } + + protected abstract dataProto(): SignalService.DataMessage; +} diff --git a/ts/session/messages/outgoing/content/data/DeviceUnlinkMessage.ts b/ts/session/messages/outgoing/content/data/DeviceUnlinkMessage.ts new file mode 100644 index 000000000..b2120e00d --- /dev/null +++ b/ts/session/messages/outgoing/content/data/DeviceUnlinkMessage.ts @@ -0,0 +1,9 @@ +import { DataMessage } from './DataMessage'; +import { SignalService } from '../../../../../protobuf'; + +export class DeviceUnlinkMessage extends DataMessage { + + protected dataProto(): SignalService.DataMessage { + throw new Error('Not implemented'); + } +} diff --git a/ts/session/messages/outgoing/content/data/GroupInvitationMessage.ts b/ts/session/messages/outgoing/content/data/GroupInvitationMessage.ts new file mode 100644 index 000000000..8b53b0b2b --- /dev/null +++ b/ts/session/messages/outgoing/content/data/GroupInvitationMessage.ts @@ -0,0 +1,9 @@ +import { DataMessage } from './DataMessage'; +import { SignalService } from '../../../../../protobuf'; + +export class GroupInvitationMessage extends DataMessage { + + protected dataProto(): SignalService.DataMessage { + throw new Error('Not implemented'); + } +} diff --git a/ts/session/messages/outgoing/content/data/RegularMessage.ts b/ts/session/messages/outgoing/content/data/RegularMessage.ts new file mode 100644 index 000000000..bfa3387fa --- /dev/null +++ b/ts/session/messages/outgoing/content/data/RegularMessage.ts @@ -0,0 +1,11 @@ +import { DataMessage } from './DataMessage'; +import { SignalService } from '../../../../../protobuf'; + +// this message type is probably to sub divise again. +// should handle quote, body, attachmentsPointer, ... @see DataMessage in compiled.d.ts +export abstract class RegularMessage extends DataMessage { + + protected dataProto(): SignalService.DataMessage { + throw new Error('Not implemented'); + } +} diff --git a/ts/session/messages/outgoing/content/sync/SyncMessage.ts b/ts/session/messages/outgoing/content/sync/SyncMessage.ts new file mode 100644 index 000000000..70ae7816b --- /dev/null +++ b/ts/session/messages/outgoing/content/sync/SyncMessage.ts @@ -0,0 +1,13 @@ +import { ContentMessage } from '../ContentMessage'; +import { SignalService } from '../../../../../protobuf'; + +export abstract class SyncMessage extends ContentMessage { + + protected contentProto(): SignalService.Content { + return new SignalService.Content({ + syncMessage: this.syncProto(), + }); + } + + protected abstract syncProto(): SignalService.SyncMessage; +} diff --git a/ts/session/messages/outgoing/index.ts b/ts/session/messages/outgoing/index.ts index c098ab627..99f4a33b6 100644 --- a/ts/session/messages/outgoing/index.ts +++ b/ts/session/messages/outgoing/index.ts @@ -1,11 +1,40 @@ -import { OutgoingMessage } from './OutgoingMessage'; -import { OutgoingContentMessage } from './OutgoingContentMessage'; -import { OutgoingDataMessage } from './OutgoingDataMessage'; +import { Message } from './Message'; +import { ContentMessage } from './content/ContentMessage'; +import { DataMessage } from './content/data/DataMessage'; import { OpenGroupMessage } from './OpenGroupMessage'; +import { SyncMessage } from './content/sync/SyncMessage'; +import { TypingMessage } from './content/TypingMessage'; +import { ReceiptMessage } from './content/ReceiptMessage'; +import { ClosedGroupMessage } from './content/data/ClosedGroupMessage'; +import { DeviceUnlinkMessage } from './content/data/DeviceUnlinkMessage'; +import { GroupInvitationMessage } from './content/data/GroupInvitationMessage'; +import { RegularMessage } from './content/data/RegularMessage'; +import { SessionResetMessage } from './content/SessionResetMessage'; +import { SessionEstablishedMessage } from './content/SessionEstablishedMessage'; +import { EndSessionMessage } from './content/EndSessionMessage'; +import { DeviceLinkMessage } from './content/DeviceLinkMessage'; export { - OutgoingMessage, - OutgoingContentMessage, - OutgoingDataMessage, + Message, OpenGroupMessage, + + ContentMessage, + + // children of ContentMessage + DeviceLinkMessage, + EndSessionMessage, + ReceiptMessage, + SessionEstablishedMessage, + SessionResetMessage, + SyncMessage, + TypingMessage, + + + DataMessage, + + // children of DataMessage + ClosedGroupMessage, + DeviceUnlinkMessage, + GroupInvitationMessage, + RegularMessage };