You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/session/messages/outgoing/content/sync/SentSyncMessage.ts

70 lines
2.5 KiB
TypeScript

import { SyncMessage } from './SyncMessage';
import { SignalService } from '../../../../../protobuf';
import { MessageParams } from '../../Message';
import { PubKey } from '../../../../types';
interface SentSyncMessageParams extends MessageParams {
dataMessage: SignalService.IDataMessage;
expirationStartTimestamp?: number;
sentTo?: Array<PubKey>;
unidentifiedDeliveries?: Array<PubKey>;
destination?: PubKey | string;
}
export class SentSyncMessage extends SyncMessage {
public readonly dataMessage: SignalService.IDataMessage;
public readonly expirationStartTimestamp?: number;
public readonly sentTo?: Array<PubKey>;
public readonly unidentifiedDeliveries?: Array<PubKey>;
public readonly destination?: PubKey;
constructor(params: SentSyncMessageParams) {
super({ timestamp: params.timestamp, identifier: params.identifier });
this.dataMessage = params.dataMessage;
this.expirationStartTimestamp = params.expirationStartTimestamp;
this.sentTo = params.sentTo;
this.unidentifiedDeliveries = params.unidentifiedDeliveries;
const { destination } = params;
this.destination = destination ? PubKey.cast(destination) : undefined;
}
protected syncProto(): SignalService.SyncMessage {
const syncMessage = super.syncProto();
syncMessage.sent = new SignalService.SyncMessage.Sent();
syncMessage.sent.timestamp = this.timestamp;
syncMessage.sent.message = this.dataMessage;
if (this.destination) {
syncMessage.sent.destination = this.destination.key;
}
if (this.expirationStartTimestamp) {
syncMessage.sent.expirationStartTimestamp = this.expirationStartTimestamp;
}
if (this.unidentifiedDeliveries) {
const unidentifiedLookup = this.unidentifiedDeliveries.reduce(
(accumulator, item) => {
// eslint-disable-next-line no-param-reassign
accumulator[item.key] = true;
return accumulator;
},
Object.create(null)
);
// Though this field has 'unidenified' in the name, it should have entries for each
// number we sent to.
if (this.sentTo && this.sentTo.length) {
syncMessage.sent.unidentifiedStatus = this.sentTo.map(number => {
const status = new SignalService.SyncMessage.Sent.UnidentifiedDeliveryStatus();
status.destination = number.key;
status.unidentified = Boolean(unidentifiedLookup[number.key]);
return status;
});
}
}
return syncMessage;
}
}