Update to the latest SignalService.proto

This commit is contained in:
Scott Nonnenberg 2025-02-11 08:20:14 +10:00 committed by GitHub
parent cf5dc4b940
commit d26d915a44
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
26 changed files with 464 additions and 536 deletions

View file

@ -30,7 +30,7 @@
"get-expire-time": "node ts/scripts/get-expire-time.js", "get-expire-time": "node ts/scripts/get-expire-time.js",
"copy-components": "node ts/scripts/copy.js", "copy-components": "node ts/scripts/copy.js",
"sass": "sass stylesheets/manifest.scss:stylesheets/manifest.css stylesheets/manifest_bridge.scss:stylesheets/manifest_bridge.css", "sass": "sass stylesheets/manifest.scss:stylesheets/manifest.css stylesheets/manifest_bridge.scss:stylesheets/manifest_bridge.css",
"build-module-protobuf": "pbjs --target static-module --force-long --no-typeurl --no-verify --no-create --no-convert --wrap commonjs --out ts/protobuf/compiled.js protos/*.proto && pbts --no-comments --out ts/protobuf/compiled.d.ts ts/protobuf/compiled.js", "build-module-protobuf": "pbjs --root='signal-desktop' --target static-module --force-long --no-typeurl --no-verify --no-create --no-convert --wrap commonjs --out ts/protobuf/compiled.js protos/*.proto && pbts --no-comments --out ts/protobuf/compiled.d.ts ts/protobuf/compiled.js",
"clean-module-protobuf": "rm -f ts/protobuf/compiled.d.ts ts/protobuf/compiled.js", "clean-module-protobuf": "rm -f ts/protobuf/compiled.d.ts ts/protobuf/compiled.js",
"build-protobuf": "npm run build-module-protobuf", "build-protobuf": "npm run build-module-protobuf",
"clean-protobuf": "npm run clean-module-protobuf", "clean-protobuf": "npm run clean-module-protobuf",

View file

@ -1,131 +1,132 @@
// Copyright 2014 Signal Messenger, LLC /*
// SPDX-License-Identifier: AGPL-3.0-only * Copyright 2020-2022 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
// Source: https://github.com/signalapp/libsignal-service-java/blob/4684a49b2ed8f32be619e0d0eea423626b6cb2cb/protobuf/SignalService.proto
package signalservice; package signalservice;
option java_package = "org.whispersystems.signalservice.internal.push"; option java_package = "org.whispersystems.signalservice.internal.push";
option java_outer_classname = "SignalServiceProtos"; option java_outer_classname = "SignalServiceProtos";
message Envelope { message Envelope {
// Our parser does not handle reserved in enums: DESKTOP-1569
enum Type { enum Type {
UNKNOWN = 0; UNKNOWN = 0;
CIPHERTEXT = 1; CIPHERTEXT = 1; // content => (version byte | SignalMessage{Content})
KEY_EXCHANGE = 2; // reserved 2;
PREKEY_BUNDLE = 3; // reserved "KEY_EXCHANGE";
RECEIPT = 5; PREKEY_BUNDLE = 3; // content => (version byte | PreKeySignalMessage{Content})
UNIDENTIFIED_SENDER = 6; SERVER_DELIVERY_RECEIPT = 5; // legacyMessage => [] AND content => []
UNIDENTIFIED_SENDER = 6; // legacyMessage => [] AND content => ((version byte | UnidentifiedSenderMessage) OR (version byte | Multi-Recipient Sealed Sender Format))
// Our parser does not handle reserved in enums: DESKTOP-1569 SENDERKEY_MESSAGE = 7; // legacyMessage => [] AND content => (version byte | SenderKeyMessage)
// reserved 7; PLAINTEXT_CONTENT = 8; // legacyMessage => [] AND content => (marker byte | Content)
PLAINTEXT_CONTENT = 8;
} }
optional Type type = 1; optional Type type = 1;
reserved 2; // formerly optional string sourceE164 = 2;
optional string sourceServiceId = 11; optional string sourceServiceId = 11;
optional uint32 sourceDevice = 7; optional uint32 sourceDevice = 7;
optional string destinationServiceId = 13; optional string destinationServiceId = 13;
// reserved 3; // formerly optional string relay = 3; reserved 3; // formerly optional string relay = 3;
optional uint64 timestamp = 5; optional uint64 timestamp = 5;
// reserved 6; // formerly optional bytes legacyMessage = 6; reserved 6; // formerly optional bytes legacyMessage = 6; // Contains an encrypted DataMessage; this field could have been set historically for type 1 or 3 messages; no longer in use
optional bytes content = 8; // Contains an encrypted Content optional bytes content = 8; // Contains an encrypted Content
optional string serverGuid = 9; optional string serverGuid = 9;
optional uint64 serverTimestamp = 10; optional uint64 serverTimestamp = 10;
optional bool ephemeral = 12; // indicates that the message should not be persisted if the recipient is offline optional bool ephemeral = 12; // indicates that the message should not be persisted if the recipient is offline
optional bool urgent = 14 [default=true]; // indicates that the content is considered timely by the sender; defaults to true so senders have to opt-out to say something isn't time critical optional bool urgent = 14 [default = true]; // indicates that the content is considered timely by the sender; defaults to true so senders have to opt-out to say something isn't time critical
optional string updated_pni = 15; optional string updatedPni = 15; // for number-change synchronization messages, provides the new server-assigned phone number identifier associated with the changed number
optional bool story = 16; // indicates that the content is a story. optional bool story = 16; // indicates that the content is a story.
optional bytes reporting_token = 17; optional bytes report_spam_token = 17; // token sent when reporting spam
// next: 18 reserved 18; // internal server use
// next: 19
} }
message Content { message Content {
optional DataMessage dataMessage = 1; optional DataMessage dataMessage = 1;
optional SyncMessage syncMessage = 2; optional SyncMessage syncMessage = 2;
optional CallingMessage callingMessage = 3; optional CallMessage callMessage = 3;
optional NullMessage nullMessage = 4; optional NullMessage nullMessage = 4;
optional ReceiptMessage receiptMessage = 5; optional ReceiptMessage receiptMessage = 5;
optional TypingMessage typingMessage = 6; optional TypingMessage typingMessage = 6;
optional bytes senderKeyDistributionMessage = 7; optional bytes /* SenderKeyDistributionMessage */ senderKeyDistributionMessage = 7;
optional bytes decryptionErrorMessage = 8; optional bytes /* DecryptionErrorMessage */ decryptionErrorMessage = 8;
optional StoryMessage storyMessage = 9; optional StoryMessage storyMessage = 9;
optional PniSignatureMessage pniSignatureMessage = 10; optional PniSignatureMessage pniSignatureMessage = 10;
optional EditMessage editMessage = 11; optional EditMessage editMessage = 11;
} }
message CallingMessage { message CallMessage {
message Offer { message Offer {
enum Type { enum Type {
OFFER_AUDIO_CALL = 0; OFFER_AUDIO_CALL = 0;
OFFER_VIDEO_CALL = 1; OFFER_VIDEO_CALL = 1;
reserved /* OFFER_NEED_PERMISSION */ 2; // removed
} }
optional uint64 id = 1;
optional uint64 callId = 1; reserved /* sdp */ 2;
reserved /* sdp */ 2; optional Type type = 3;
optional Type type = 3; optional bytes opaque = 4;
optional bytes opaque = 4;
} }
message Answer { message Answer {
optional uint64 callId = 1; optional uint64 id = 1;
reserved /* sdp */ 2; reserved /* sdp */ 2;
optional bytes opaque = 3; optional bytes opaque = 3;
} }
message IceCandidate { message IceUpdate {
optional uint64 callId = 1; optional uint64 id = 1;
reserved /* mid */ 2; reserved /* mid */ 2;
reserved /* line */ 3; reserved /* line */ 3;
reserved /* sdp */ 4; reserved /* sdp */ 4;
optional bytes opaque = 5; optional bytes opaque = 5;
} }
message Busy { message Busy {
optional uint64 callId = 1; optional uint64 id = 1;
} }
message Hangup { message Hangup {
enum Type { enum Type {
HANGUP_NORMAL = 0; HANGUP_NORMAL = 0;
HANGUP_ACCEPTED = 1; HANGUP_ACCEPTED = 1;
HANGUP_DECLINED = 2; HANGUP_DECLINED = 2;
HANGUP_BUSY = 3; HANGUP_BUSY = 3;
HANGUP_NEED_PERMISSION = 4; HANGUP_NEED_PERMISSION = 4;
} }
optional uint64 id = 1;
optional uint64 callId = 1; optional Type type = 2;
optional Type type = 2;
optional uint32 deviceId = 3; optional uint32 deviceId = 3;
} }
message Opaque { message Opaque {
enum Urgency { enum Urgency {
DROPPABLE = 0; DROPPABLE = 0;
HANDLE_IMMEDIATELY = 1; HANDLE_IMMEDIATELY = 1;
} }
optional bytes data = 1;
optional bytes data = 1; optional Urgency urgency = 2; // If missing, treat as DROPPABLE.
optional Urgency urgency = 2;
} }
optional Offer offer = 1; optional Offer offer = 1;
optional Answer answer = 2; optional Answer answer = 2;
repeated IceCandidate iceCandidates = 3; repeated IceUpdate iceUpdate = 3;
reserved /* legacyHangup */ 4; reserved /* legacyHangup */ 4;
optional Busy busy = 5; optional Busy busy = 5;
reserved /* profileKey */ 6; reserved /* profileKey */ 6;
optional Hangup hangup = 7; optional Hangup hangup = 7;
reserved /* multiRing */ 8; reserved /* multiRing */ 8;
optional uint32 destinationDeviceId = 9; optional uint32 destinationDeviceId = 9;
optional Opaque opaque = 10; optional Opaque opaque = 10;
} }
message DataMessage { message DataMessage {
enum Flags { enum Flags {
END_SESSION = 1; END_SESSION = 1;
EXPIRATION_TIMER_UPDATE = 2; EXPIRATION_TIMER_UPDATE = 2;
PROFILE_KEY_UPDATE = 4; PROFILE_KEY_UPDATE = 4;
FORWARD = 8;
} }
message Payment { message Payment {
@ -139,19 +140,9 @@ message DataMessage {
} }
} }
message RequestId {
optional string uuid = 1;
}
message Request {
optional RequestId requestId = 1;
optional Amount amount = 2;
optional string note = 3;
}
message Notification { message Notification {
message MobileCoin { message MobileCoin {
optional bytes receipt = 1; optional bytes receipt = 1;
} }
oneof Transaction { oneof Transaction {
@ -159,12 +150,8 @@ message DataMessage {
} }
// Optional, Refers to the PaymentRequest message, if any. // Optional, Refers to the PaymentRequest message, if any.
optional string note = 2; optional string note = 2;
optional RequestId requestId = 1003; reserved /*requestId*/ 1003;
}
message Cancellation {
optional RequestId requestId = 1;
} }
message Activation { message Activation {
@ -179,9 +166,10 @@ message DataMessage {
oneof Item { oneof Item {
Notification notification = 1; Notification notification = 1;
Activation activation = 2; Activation activation = 2;
Request request = 1002;
Cancellation cancellation = 1003;
} }
reserved /*request*/ 1002;
reserved /*cancellation*/ 1003;
} }
message Quote { message Quote {
@ -191,135 +179,108 @@ message DataMessage {
} }
message QuotedAttachment { message QuotedAttachment {
optional string contentType = 1; optional string contentType = 1;
optional string fileName = 2; optional string fileName = 2;
optional AttachmentPointer thumbnail = 3; optional AttachmentPointer thumbnail = 3;
} }
optional uint64 id = 1; optional uint64 id = 1;
reserved /* author */ 2; // removed reserved /*authorE164*/ 2;
optional string authorAci = 5; optional string authorAci = 5;
optional string text = 3; optional string text = 3;
repeated QuotedAttachment attachments = 4; repeated QuotedAttachment attachments = 4;
repeated BodyRange bodyRanges = 6; repeated BodyRange bodyRanges = 6;
optional Type type = 7; optional Type type = 7;
} }
message Contact { message Contact {
message Name { message Name {
optional string givenName = 1; optional string givenName = 1;
optional string familyName = 2; optional string familyName = 2;
optional string prefix = 3; optional string prefix = 3;
optional string suffix = 4; optional string suffix = 4;
optional string middleName = 5; optional string middleName = 5;
reserved /* displayName */ 6; reserved /*displayName*/ 6;
optional string nickname = 7; optional string nickname = 7;
} }
message Phone { message Phone {
enum Type { enum Type {
HOME = 1; HOME = 1;
MOBILE = 2; MOBILE = 2;
WORK = 3; WORK = 3;
CUSTOM = 4; CUSTOM = 4;
} }
optional string value = 1; optional string value = 1;
optional Type type = 2; optional Type type = 2;
optional string label = 3; optional string label = 3;
} }
message Email { message Email {
enum Type { enum Type {
HOME = 1; HOME = 1;
MOBILE = 2; MOBILE = 2;
WORK = 3; WORK = 3;
CUSTOM = 4; CUSTOM = 4;
} }
optional string value = 1; optional string value = 1;
optional Type type = 2; optional Type type = 2;
optional string label = 3; optional string label = 3;
} }
message PostalAddress { message PostalAddress {
enum Type { enum Type {
HOME = 1; HOME = 1;
WORK = 2; WORK = 2;
CUSTOM = 3; CUSTOM = 3;
} }
optional Type type = 1; optional Type type = 1;
optional string label = 2; optional string label = 2;
optional string street = 3; optional string street = 3;
optional string pobox = 4; optional string pobox = 4;
optional string neighborhood = 5; optional string neighborhood = 5;
optional string city = 6; optional string city = 6;
optional string region = 7; optional string region = 7;
optional string postcode = 8; optional string postcode = 8;
optional string country = 9; optional string country = 9;
} }
message Avatar { message Avatar {
optional AttachmentPointer avatar = 1; optional AttachmentPointer avatar = 1;
optional bool isProfile = 2; optional bool isProfile = 2;
} }
optional Name name = 1; optional Name name = 1;
repeated Phone number = 3; repeated Phone number = 3;
repeated Email email = 4; repeated Email email = 4;
repeated PostalAddress address = 5; repeated PostalAddress address = 5;
optional Avatar avatar = 6; optional Avatar avatar = 6;
optional string organization = 7; optional string organization = 7;
}
message Preview {
optional string url = 1;
optional string title = 2;
optional AttachmentPointer image = 3;
optional string description = 4;
optional uint64 date = 5;
} }
message Sticker { message Sticker {
optional bytes packId = 1; optional bytes packId = 1;
optional bytes packKey = 2; optional bytes packKey = 2;
optional uint32 stickerId = 3; optional uint32 stickerId = 3;
optional AttachmentPointer data = 4; optional AttachmentPointer data = 4;
optional string emoji = 5; optional string emoji = 5;
} }
message Reaction { message Reaction {
optional string emoji = 1; optional string emoji = 1;
optional bool remove = 2; optional bool remove = 2;
reserved /* targetAuthorE164 */ 3; // removed reserved /* targetAuthorE164 */ 3;
optional string targetAuthorAci = 4; optional string targetAuthorAci = 4;
optional uint64 targetTimestamp = 5; optional uint64 targetSentTimestamp = 5;
} }
message Delete { message Delete {
optional uint64 targetSentTimestamp = 1; optional uint64 targetSentTimestamp = 1;
} }
message BodyRange {
enum Style {
NONE = 0;
BOLD = 1;
ITALIC = 2;
SPOILER = 3;
STRIKETHROUGH = 4;
MONOSPACE = 5;
}
optional uint32 start = 1; // Starting index in UTF-16 code units/raw string representation
optional uint32 length = 2; // Length of range in UTF-16 code units/raw string representation
oneof associatedValue {
string mentionAci = 3;
Style style = 4;
}
}
message GroupCallUpdate { message GroupCallUpdate {
optional string eraId = 1; optional string eraId = 1;
} }
@ -347,28 +308,29 @@ message DataMessage {
optional bytes receiptCredentialPresentation = 1; optional bytes receiptCredentialPresentation = 1;
} }
optional string body = 1; optional string body = 1;
repeated AttachmentPointer attachments = 2; repeated AttachmentPointer attachments = 2;
reserved /*groupV1*/ 3; reserved /*groupV1*/ 3;
optional GroupContextV2 groupV2 = 15; optional GroupContextV2 groupV2 = 15;
optional uint32 flags = 4; optional uint32 flags = 4;
optional uint32 expireTimer = 5; optional uint32 expireTimer = 5;
optional uint32 expireTimerVersion = 23; optional uint32 expireTimerVersion = 23;
optional bytes profileKey = 6; optional bytes profileKey = 6;
optional uint64 timestamp = 7; optional uint64 timestamp = 7;
optional Quote quote = 8; optional Quote quote = 8;
repeated Contact contact = 9; repeated Contact contact = 9;
repeated Preview preview = 10; repeated Preview preview = 10;
optional Sticker sticker = 11; optional Sticker sticker = 11;
optional uint32 requiredProtocolVersion = 12; optional uint32 requiredProtocolVersion = 12;
optional bool isViewOnce = 14; optional bool isViewOnce = 14;
optional Reaction reaction = 16; optional Reaction reaction = 16;
optional Delete delete = 17; optional Delete delete = 17;
repeated BodyRange bodyRanges = 18; repeated BodyRange bodyRanges = 18;
optional GroupCallUpdate groupCallUpdate = 19; optional GroupCallUpdate groupCallUpdate = 19;
optional Payment payment = 20; optional Payment payment = 20;
optional StoryContext storyContext = 21; optional StoryContext storyContext = 21;
optional GiftBadge giftBadge = 22; optional GiftBadge giftBadge = 22;
// NEXT ID: 24
} }
message NullMessage { message NullMessage {
@ -378,23 +340,23 @@ message NullMessage {
message ReceiptMessage { message ReceiptMessage {
enum Type { enum Type {
DELIVERY = 0; DELIVERY = 0;
READ = 1; READ = 1;
VIEWED = 2; VIEWED = 2;
} }
optional Type type = 1; optional Type type = 1;
repeated uint64 timestamp = 2; repeated uint64 timestamp = 2;
} }
message TypingMessage { message TypingMessage {
enum Action { enum Action {
STARTED = 0; STARTED = 0;
STOPPED = 1; STOPPED = 1;
} }
optional uint64 timestamp = 1; optional uint64 timestamp = 1;
optional Action action = 2; optional Action action = 2;
optional bytes groupId = 3; optional bytes groupId = 3;
} }
message StoryMessage { message StoryMessage {
@ -408,6 +370,14 @@ message StoryMessage {
repeated BodyRange bodyRanges = 6; repeated BodyRange bodyRanges = 6;
} }
message Preview {
optional string url = 1;
optional string title = 2;
optional AttachmentPointer image = 3;
optional string description = 4;
optional uint64 date = 5;
}
message TextAttachment { message TextAttachment {
enum Style { enum Style {
DEFAULT = 0; DEFAULT = 0;
@ -439,25 +409,25 @@ message TextAttachment {
message Verified { message Verified {
enum State { enum State {
DEFAULT = 0; DEFAULT = 0;
VERIFIED = 1; VERIFIED = 1;
UNVERIFIED = 2; UNVERIFIED = 2;
} }
optional string destination = 1; reserved /*destinationE164*/ 1;
optional string destinationAci = 5; optional string destinationAci = 5;
optional bytes identityKey = 2; optional bytes identityKey = 2;
optional State state = 3; optional State state = 3;
optional bytes nullMessage = 4; optional bytes nullMessage = 4;
} }
message SyncMessage { message SyncMessage {
message Sent { message Sent {
message UnidentifiedDeliveryStatus { message UnidentifiedDeliveryStatus {
optional string destination = 1; reserved /*destinationE164*/ 1;
optional string destinationServiceId = 3; optional string destinationServiceId = 3;
optional bool unidentified = 2; optional bool unidentified = 2;
reserved /* destinationPni */ 4; reserved /*destinationPni */ 4;
optional bytes destinationPniIdentityKey = 5; // Only set for PNI destinations optional bytes destinationPniIdentityKey = 5; // Only set for PNI destinations
} }
@ -465,121 +435,129 @@ message SyncMessage {
optional string destinationServiceId = 1; optional string destinationServiceId = 1;
repeated string distributionListIds = 2; repeated string distributionListIds = 2;
optional bool isAllowedToReply = 3; optional bool isAllowedToReply = 3;
reserved /*destinationPni */ 4;
} }
optional string destination = 1; optional string destinationE164 = 1;
optional string destinationServiceId = 7; optional string destinationServiceId = 7;
optional uint64 timestamp = 2; optional uint64 timestamp = 2;
optional DataMessage message = 3; optional DataMessage message = 3;
optional uint64 expirationStartTimestamp = 4; optional uint64 expirationStartTimestamp = 4;
repeated UnidentifiedDeliveryStatus unidentifiedStatus = 5; repeated UnidentifiedDeliveryStatus unidentifiedStatus = 5;
optional bool isRecipientUpdate = 6 [default = false]; optional bool isRecipientUpdate = 6 [default = false];
optional StoryMessage storyMessage = 8; optional StoryMessage storyMessage = 8;
repeated StoryMessageRecipient storyMessageRecipients = 9; repeated StoryMessageRecipient storyMessageRecipients = 9;
optional EditMessage editMessage = 10; optional EditMessage editMessage = 10;
reserved /*destinationPni */ 11;
// Next ID: 12
} }
message Contacts { message Contacts {
optional AttachmentPointer blob = 1; optional AttachmentPointer blob = 1;
optional bool complete = 2 [default = false]; optional bool complete = 2 [default = false];
} }
message Blocked { message Blocked {
repeated string numbers = 1; repeated string numbers = 1;
repeated string acis = 3; repeated string acis = 3;
repeated bytes groupIds = 2; repeated bytes groupIds = 2;
} }
message Request { message Request {
enum Type { enum Type {
UNKNOWN = 0; UNKNOWN = 0;
CONTACTS = 1; CONTACTS = 1;
reserved /* GROUPS */ 2; reserved /*GROUPS*/ 2;
BLOCKED = 3; BLOCKED = 3;
CONFIGURATION = 4; CONFIGURATION = 4;
KEYS = 5; KEYS = 5;
reserved /* PNI_IDENTITY */ 6; reserved /*PNI_IDENTITY*/ 6;
} }
optional Type type = 1; optional Type type = 1;
} }
message Keys {
reserved /* storageService */ 1; // deprecated: this field will be removed in a future release.
optional bytes master = 2; // deprecated: this field will be removed in a future release.
optional string accountEntropyPool = 3;
optional bytes mediaRootBackupKey = 4;
}
message Read { message Read {
optional string sender = 1; reserved /*senderE164*/ 1;
optional string senderAci = 3; optional string senderAci = 3;
optional uint64 timestamp = 2; optional uint64 timestamp = 2;
} }
message Viewed { message Viewed {
optional string senderE164 = 1; reserved /*senderE164*/ 1;
optional string senderAci = 3; optional string senderAci = 3;
optional uint64 timestamp = 2; optional uint64 timestamp = 2;
} }
message Configuration { message Configuration {
optional bool readReceipts = 1; optional bool readReceipts = 1;
optional bool unidentifiedDeliveryIndicators = 2; optional bool unidentifiedDeliveryIndicators = 2;
optional bool typingIndicators = 3; optional bool typingIndicators = 3;
reserved 4; reserved /* linkPreviews */ 4;
optional uint32 provisioningVersion = 5; optional uint32 provisioningVersion = 5;
optional bool linkPreviews = 6; optional bool linkPreviews = 6;
} }
message StickerPackOperation { message StickerPackOperation {
enum Type { enum Type {
INSTALL = 0; INSTALL = 0;
REMOVE = 1; REMOVE = 1;
} }
optional bytes packId = 1; optional bytes packId = 1;
optional bytes packKey = 2; optional bytes packKey = 2;
optional Type type = 3; optional Type type = 3;
} }
message ViewOnceOpen { message ViewOnceOpen {
optional string sender = 1; reserved /*senderE164*/ 1;
optional string senderAci = 3; optional string senderAci = 3;
optional uint64 timestamp = 2; optional uint64 timestamp = 2;
}
message MessageRequestResponse {
enum Type {
UNKNOWN = 0;
ACCEPT = 1;
DELETE = 2;
BLOCK = 3;
BLOCK_AND_DELETE = 4;
SPAM = 5;
BLOCK_AND_SPAM = 6;
}
optional string threadE164 = 1;
optional string threadAci = 2;
optional bytes groupId = 3;
optional Type type = 4;
} }
message FetchLatest { message FetchLatest {
enum Type { enum Type {
UNKNOWN = 0; UNKNOWN = 0;
LOCAL_PROFILE = 1; LOCAL_PROFILE = 1;
STORAGE_MANIFEST = 2; STORAGE_MANIFEST = 2;
SUBSCRIPTION_STATUS = 3; SUBSCRIPTION_STATUS = 3;
} }
optional Type type = 1; optional Type type = 1;
} }
message Keys {
reserved /* storageService */ 1;
optional bytes master = 2; // deprecated: this field will be removed in a future release.
optional string accountEntropyPool = 3;
optional bytes mediaRootBackupKey = 4;
}
message PniIdentity {
optional bytes publicKey = 1;
optional bytes privateKey = 2;
}
message MessageRequestResponse {
enum Type {
UNKNOWN = 0;
ACCEPT = 1;
DELETE = 2;
BLOCK = 3;
BLOCK_AND_DELETE = 4;
SPAM = 5;
BLOCK_AND_SPAM = 6;
}
reserved /*threadE164*/ 1;
optional string threadAci = 2;
optional bytes groupId = 3;
optional Type type = 4;
}
message PniChangeNumber { message PniChangeNumber {
optional bytes identityKeyPair = 1; // Serialized libsignal-client IdentityKeyPair optional bytes identityKeyPair = 1; // Serialized libsignal-client IdentityKeyPair
optional bytes signedPreKey = 2; // Serialized libsignal-client SignedPreKeyRecord optional bytes signedPreKey = 2; // Serialized libsignal-client SignedPreKeyRecord
optional bytes lastResortKyberPreKey = 5; // Serialized libsignal-client KyberPreKeyRecord optional bytes lastResortKyberPreKey = 5; // Serialized libsignal-client KyberPreKeyRecord
optional uint32 registrationId = 3; optional uint32 registrationId = 3;
optional string newE164 = 4; // The e164 we have changed our number to optional string newE164 = 4; // The e164 we have changed our number to
@ -588,38 +566,38 @@ message SyncMessage {
message CallEvent { message CallEvent {
enum Type { enum Type {
UNKNOWN = 0; UNKNOWN_TYPE = 0;
AUDIO_CALL = 1; AUDIO_CALL = 1;
VIDEO_CALL = 2; VIDEO_CALL = 2;
GROUP_CALL = 3; GROUP_CALL = 3;
AD_HOC_CALL = 4; AD_HOC_CALL = 4;
} }
enum Direction { enum Direction {
UNKNOWN = 0; UNKNOWN_DIRECTION = 0;
INCOMING = 1; INCOMING = 1;
OUTGOING = 2; OUTGOING = 2;
} }
enum Event { enum Event {
UNKNOWN = 0; UNKNOWN_EVENT = 0;
ACCEPTED = 1; ACCEPTED = 1;
NOT_ACCEPTED = 2; NOT_ACCEPTED = 2;
DELETE = 3; DELETE = 3;
OBSERVED = 4; OBSERVED = 4;
} }
/* Data identifying a conversation. The service ID for 1:1, the group ID for /* Data identifying a conversation. The service ID for 1:1, the group ID for
* group, or the room ID for an ad-hoc call. See also * group, or the room ID for an ad-hoc call. See also
* `CallLogEvent/peerId`. */ * `CallLogEvent/peerId`. */
optional bytes peerId = 1; optional bytes peerId = 1;
/* An identifier for a call. Generated directly for 1:1, or derived from /* An identifier for a call. Generated directly for 1:1, or derived from
* the era ID for group and ad-hoc calls. See also `CallLogEvent/callId`. */ * the era ID for group and ad-hoc calls. See also `CallLogEvent/callId`. */
optional uint64 callId = 2; optional uint64 callId = 2;
optional uint64 timestamp = 3; optional uint64 timestamp = 3;
optional Type type = 4; optional Type type = 4;
optional Direction direction = 5; optional Direction direction = 5;
optional Event event = 6; optional Event event = 6;
} }
message CallLinkUpdate { message CallLinkUpdate {
@ -628,9 +606,9 @@ message SyncMessage {
reserved 1; // was DELETE, superseded by storage service reserved 1; // was DELETE, superseded by storage service
} }
optional bytes rootKey = 1; optional bytes rootKey = 1;
optional bytes adminPasskey = 2; optional bytes adminPasskey = 2;
optional Type type = 3; // defaults to UPDATE optional Type type = 3; // defaults to UPDATE
} }
message CallLogEvent { message CallLogEvent {
@ -638,17 +616,18 @@ message SyncMessage {
CLEAR = 0; CLEAR = 0;
MARKED_AS_READ = 1; MARKED_AS_READ = 1;
MARKED_AS_READ_IN_CONVERSATION = 2; MARKED_AS_READ_IN_CONVERSATION = 2;
CLEAR_IN_CONVERSATION = 3;
} }
optional Type type = 1; optional Type type = 1;
optional uint64 timestamp = 2; optional uint64 timestamp = 2;
/* Data identifying a conversation. The service ID for 1:1, the group ID for /* Data identifying a conversation. The service ID for 1:1, the group ID for
* group, or the room ID for an ad-hoc call. See also * group, or the room ID for an ad-hoc call. See also
* `CallEvent/peerId`. */ * `CallEvent/peerId`. */
optional bytes peerId = 3; optional bytes peerId = 3;
/* An identifier for a call. Generated directly for 1:1, or derived from /* An identifier for a call. Generated directly for 1:1, or derived from
* the era ID for group and ad-hoc calls. See also `CallEvent/callId`. */ * the era ID for group and ad-hoc calls. See also `CallEvent/callId`. */
optional uint64 callId = 4; optional uint64 callId = 4;
} }
message DeleteForMe { message DeleteForMe {
@ -700,42 +679,41 @@ message SyncMessage {
repeated LocalOnlyConversationDelete localOnlyConversationDeletes = 3; repeated LocalOnlyConversationDelete localOnlyConversationDeletes = 3;
repeated AttachmentDelete attachmentDeletes = 4; repeated AttachmentDelete attachmentDeletes = 4;
} }
message DeviceNameChange { message DeviceNameChange {
reserved /*name*/ 1; reserved /*name*/ 1;
optional uint32 deviceId = 2; optional uint32 deviceId = 2;
} }
optional Sent sent = 1; optional Sent sent = 1;
optional Contacts contacts = 2; optional Contacts contacts = 2;
reserved /* groups */ 3; reserved /*groups*/ 3;
optional Request request = 4; optional Request request = 4;
repeated Read read = 5; repeated Read read = 5;
optional Blocked blocked = 6; optional Blocked blocked = 6;
optional Verified verified = 7; optional Verified verified = 7;
optional Configuration configuration = 9; optional Configuration configuration = 9;
optional bytes padding = 8; optional bytes padding = 8;
repeated StickerPackOperation stickerPackOperation = 10; repeated StickerPackOperation stickerPackOperation = 10;
optional ViewOnceOpen viewOnceOpen = 11; optional ViewOnceOpen viewOnceOpen = 11;
optional FetchLatest fetchLatest = 12; optional FetchLatest fetchLatest = 12;
optional Keys keys = 13; optional Keys keys = 13;
optional MessageRequestResponse messageRequestResponse = 14; optional MessageRequestResponse messageRequestResponse = 14;
reserved 15; // not yet added repeated Viewed viewed = 16;
repeated Viewed viewed = 16; reserved /*pniIdentity*/ 17;
reserved 17; // pniIdentity optional PniChangeNumber pniChangeNumber = 18;
optional PniChangeNumber pniChangeNumber = 18; optional CallEvent callEvent = 19;
optional CallEvent callEvent = 19; optional CallLinkUpdate callLinkUpdate = 20;
optional CallLinkUpdate callLinkUpdate = 20; optional CallLogEvent callLogEvent = 21;
optional CallLogEvent callLogEvent = 21; optional DeleteForMe deleteForMe = 22;
optional DeleteForMe deleteForMe = 22; optional DeviceNameChange deviceNameChange = 23;
optional DeviceNameChange deviceNameChange = 23;
} }
message AttachmentPointer { message AttachmentPointer {
// Our parser does not handle reserved in enums: DESKTOP-1569
enum Flags { enum Flags {
VOICE_MESSAGE = 1; VOICE_MESSAGE = 1;
BORDERLESS = 2; BORDERLESS = 2;
// Our parser does not handle reserved in enums: DESKTOP-1569
// reserved 4; // reserved 4;
GIF = 8; GIF = 8;
} }
@ -768,28 +746,36 @@ message AttachmentPointer {
} }
message GroupContextV2 { message GroupContextV2 {
optional bytes masterKey = 1; optional bytes masterKey = 1;
optional uint32 revision = 2; optional uint32 revision = 2;
optional bytes groupChange = 3; optional bytes groupChange = 3;
} }
message ContactDetails { message ContactDetails {
message Avatar { message Avatar {
optional string contentType = 1; optional string contentType = 1;
optional uint32 length = 2; optional uint32 length = 2;
} }
optional string number = 1; optional string number = 1;
optional string aci = 9; optional string aci = 9;
optional string name = 2; optional string name = 2;
optional Avatar avatar = 3; optional Avatar avatar = 3;
// reserved 4; // formerly color reserved /* color */ 4;
// reserved 5; // formerly verified reserved /* verified */ 5;
// reserved 6; // formerly profileKey reserved /* profileKey */ 6;
// reserved 7; // formerly blocked reserved /* blocked */ 7;
optional uint32 expireTimer = 8; optional uint32 expireTimer = 8;
optional uint32 expireTimerVersion = 12; optional uint32 expireTimerVersion = 12;
optional uint32 inboxPosition = 10; optional uint32 inboxPosition = 10;
reserved /* archived */ 11;
// NEXT ID: 13
}
message DecryptionErrorMessage {
optional bytes ratchetKey = 1; // set to the public ratchet key from the SignalMessage if a 1-1 payload fails to decrypt
optional uint64 timestamp = 2;
optional uint32 deviceId = 3;
} }
message PniSignatureMessage { message PniSignatureMessage {
@ -802,3 +788,22 @@ message EditMessage {
optional uint64 targetSentTimestamp = 1; optional uint64 targetSentTimestamp = 1;
optional DataMessage dataMessage = 2; optional DataMessage dataMessage = 2;
} }
message BodyRange {
enum Style {
NONE = 0;
BOLD = 1;
ITALIC = 2;
SPOILER = 3;
STRIKETHROUGH = 4;
MONOSPACE = 5;
}
optional uint32 start = 1; // Starting index in UTF-16 code units/raw string representation
optional uint32 length = 2; // Length of range in UTF-16 code units/raw string representation
oneof associatedValue {
string mentionAci = 3;
Style style = 4;
}
}

View file

@ -2476,7 +2476,7 @@ export async function startApp(): Promise<void> {
const messageDescriptor = getMessageDescriptor({ const messageDescriptor = getMessageDescriptor({
// 'message' event: for 1:1 converations, the conversation is same as sender // 'message' event: for 1:1 converations, the conversation is same as sender
destination: data.source, destinationE164: data.source,
destinationServiceId: data.sourceAci, destinationServiceId: data.sourceAci,
envelopeId: data.envelopeId, envelopeId: data.envelopeId,
message: data.message, message: data.message,
@ -2736,12 +2736,10 @@ export async function startApp(): Promise<void> {
for (const { for (const {
destinationServiceId, destinationServiceId,
destination,
isAllowedToReplyToStory, isAllowedToReplyToStory,
} of unidentifiedStatus) { } of unidentifiedStatus) {
const conversation = window.ConversationController.get( const conversation =
destinationServiceId || destination window.ConversationController.get(destinationServiceId);
);
if (!conversation || conversation.id === ourId) { if (!conversation || conversation.id === ourId) {
continue; continue;
} }
@ -2788,7 +2786,7 @@ export async function startApp(): Promise<void> {
if (unidentifiedStatus.length) { if (unidentifiedStatus.length) {
unidentifiedDeliveries = unidentifiedStatus unidentifiedDeliveries = unidentifiedStatus
.filter(item => Boolean(item.unidentified)) .filter(item => Boolean(item.unidentified))
.map(item => item.destinationServiceId || item.destination) .map(item => item.destinationServiceId)
.filter(isNotNil); .filter(isNotNil);
} }
@ -2823,14 +2821,14 @@ export async function startApp(): Promise<void> {
// Works with 'sent' and 'message' data sent from MessageReceiver // Works with 'sent' and 'message' data sent from MessageReceiver
const getMessageDescriptor = ({ const getMessageDescriptor = ({
destination, destinationE164,
destinationServiceId, destinationServiceId,
envelopeId, envelopeId,
message, message,
source, source,
sourceDevice, sourceDevice,
}: { }: {
destination?: string; destinationE164?: string;
destinationServiceId?: ServiceIdString; destinationServiceId?: ServiceIdString;
envelopeId: string; envelopeId: string;
message: ProcessedDataMessage; message: ProcessedDataMessage;
@ -2877,7 +2875,7 @@ export async function startApp(): Promise<void> {
}; };
} }
const id = destinationServiceId || destination; const id = destinationServiceId || destinationE164;
strictAssert( strictAssert(
id, id,
`${logId}: We need some sort of destination for the conversation` `${logId}: We need some sort of destination for the conversation`
@ -2910,7 +2908,7 @@ export async function startApp(): Promise<void> {
) { ) {
const { mergePromises } = const { mergePromises } =
window.ConversationController.maybeMergeContacts({ window.ConversationController.maybeMergeContacts({
e164: data.destination, e164: data.destinationE164,
aci: isAciString(data.destinationServiceId) aci: isAciString(data.destinationServiceId)
? data.destinationServiceId ? data.destinationServiceId
: undefined, : undefined,
@ -3241,14 +3239,13 @@ export async function startApp(): Promise<void> {
} }
function onViewOnceOpenSync(ev: ViewOnceOpenSyncEvent): void { function onViewOnceOpenSync(ev: ViewOnceOpenSyncEvent): void {
const { source, sourceAci, timestamp } = ev; const { sourceAci, timestamp } = ev;
log.info(`view once open sync ${source} ${timestamp}`); log.info(`view once open sync ${sourceAci} ${timestamp}`);
strictAssert(sourceAci, 'ViewOnceOpen without sourceAci'); strictAssert(sourceAci, 'ViewOnceOpen without sourceAci');
strictAssert(timestamp, 'ViewOnceOpen without timestamp'); strictAssert(timestamp, 'ViewOnceOpen without timestamp');
const attributes: ViewOnceOpenSyncAttributesType = { const attributes: ViewOnceOpenSyncAttributesType = {
removeFromMessageReceiverCache: ev.confirm, removeFromMessageReceiverCache: ev.confirm,
source,
sourceAci, sourceAci,
timestamp, timestamp,
}; };
@ -3379,10 +3376,9 @@ export async function startApp(): Promise<void> {
} }
function onMessageRequestResponse(ev: MessageRequestResponseEvent): void { function onMessageRequestResponse(ev: MessageRequestResponseEvent): void {
const { threadE164, threadAci, groupV2Id, messageRequestResponseType } = ev; const { threadAci, groupV2Id, messageRequestResponseType } = ev;
log.info('onMessageRequestResponse', { log.info('onMessageRequestResponse', {
threadE164,
threadAci, threadAci,
groupV2Id: `groupv2(${groupV2Id})`, groupV2Id: `groupv2(${groupV2Id})`,
messageRequestResponseType, messageRequestResponseType,
@ -3398,7 +3394,6 @@ export async function startApp(): Promise<void> {
const attributes: MessageRequestAttributesType = { const attributes: MessageRequestAttributesType = {
envelopeId: ev.envelopeId, envelopeId: ev.envelopeId,
removeFromMessageReceiverCache: ev.confirm, removeFromMessageReceiverCache: ev.confirm,
threadE164,
threadAci, threadAci,
groupV2Id, groupV2Id,
type: messageRequestResponseType, type: messageRequestResponseType,

View file

@ -90,9 +90,7 @@ export async function sendCallingMessage(
groupId, groupId,
}); });
const callingMessage = Proto.CallingMessage.decode( const callMessage = Proto.CallMessage.decode(Bytes.fromBase64(protoBase64));
Bytes.fromBase64(protoBase64)
);
const { ContentHint } = Proto.UnidentifiedSenderMessage.Message; const { ContentHint } = Proto.UnidentifiedSenderMessage.Message;
@ -101,7 +99,7 @@ export async function sendCallingMessage(
await handleMessageSend( await handleMessageSend(
sendContentMessageToGroup({ sendContentMessageToGroup({
contentHint: ContentHint.DEFAULT, contentHint: ContentHint.DEFAULT,
contentMessage: new Proto.Content({ callingMessage }), contentMessage: new Proto.Content({ callMessage }),
isPartialSend, isPartialSend,
messageId: undefined, messageId: undefined,
recipients, recipients,
@ -122,7 +120,7 @@ export async function sendCallingMessage(
await handleMessageSend( await handleMessageSend(
messaging.sendCallingMessage( messaging.sendCallingMessage(
sendTarget, sendTarget,
callingMessage, callMessage,
timestamp, timestamp,
urgent, urgent,
sendOptions sendOptions

View file

@ -144,7 +144,7 @@ export async function sendDeleteForEveryone(
encodedDataMessage: Proto.DataMessage.encode( encodedDataMessage: Proto.DataMessage.encode(
proto.dataMessage proto.dataMessage
).finish(), ).finish(),
destination: conversation.get('e164'), destinationE164: conversation.get('e164'),
destinationServiceId: conversation.getServiceId(), destinationServiceId: conversation.getServiceId(),
expirationStartTimestamp: null, expirationStartTimestamp: null,
options: sendOptions, options: sendOptions,

View file

@ -241,7 +241,7 @@ export async function sendDeleteStoryForEveryone(
// Sync message for other devices // Sync message for other devices
await handleMessageSend( await handleMessageSend(
messaging.sendSyncMessage({ messaging.sendSyncMessage({
destination: undefined, destinationE164: undefined,
destinationServiceId, destinationServiceId,
storyMessageRecipients: updatedStoryRecipients?.map( storyMessageRecipients: updatedStoryRecipients?.map(
({ destinationServiceId: legacyDestinationUuid, ...rest }) => { ({ destinationServiceId: legacyDestinationUuid, ...rest }) => {

View file

@ -105,7 +105,7 @@ export async function sendDirectExpirationTimerUpdate(
encodedDataMessage: Proto.DataMessage.encode( encodedDataMessage: Proto.DataMessage.encode(
proto.dataMessage proto.dataMessage
).finish(), ).finish(),
destination: conversation.get('e164'), destinationE164: conversation.get('e164'),
destinationServiceId: conversation.getServiceId(), destinationServiceId: conversation.getServiceId(),
expirationStartTimestamp: null, expirationStartTimestamp: null,
options: sendOptions, options: sendOptions,

View file

@ -583,7 +583,7 @@ export async function sendStory(
await messaging.sendSyncMessage({ await messaging.sendSyncMessage({
// Note: these two fields will be undefined if we're sending to a group // Note: these two fields will be undefined if we're sending to a group
destination: conversation.get('e164'), destinationE164: conversation.get('e164'),
destinationServiceId: conversation.getServiceId(), destinationServiceId: conversation.getServiceId(),
storyMessage: originalStoryMessage, storyMessage: originalStoryMessage,
storyMessageRecipients, storyMessageRecipients,

View file

@ -13,7 +13,6 @@ export type MessageRequestAttributesType = {
groupV2Id?: string; groupV2Id?: string;
removeFromMessageReceiverCache: () => unknown; removeFromMessageReceiverCache: () => unknown;
threadAci?: AciString; threadAci?: AciString;
threadE164?: string;
type: number; type: number;
}; };
@ -33,17 +32,6 @@ export function forConversation(
const messageRequestValues = Array.from(messageRequests.values()); const messageRequestValues = Array.from(messageRequests.values());
if (conversation.get('e164')) {
const syncByE164 = messageRequestValues.find(
item => item.threadE164 === conversation.get('e164')
);
if (syncByE164) {
log.info(`${logId}: Found early message request response for E164`);
remove(syncByE164);
return syncByE164;
}
}
if (conversation.getServiceId()) { if (conversation.getServiceId()) {
const syncByServiceId = messageRequestValues.find( const syncByServiceId = messageRequestValues.find(
item => item.threadAci === conversation.getServiceId() item => item.threadAci === conversation.getServiceId()
@ -74,9 +62,9 @@ export async function onResponse(
sync: MessageRequestAttributesType sync: MessageRequestAttributesType
): Promise<void> { ): Promise<void> {
messageRequests.set(sync.envelopeId, sync); messageRequests.set(sync.envelopeId, sync);
const { threadE164, threadAci, groupV2Id } = sync; const { threadAci, groupV2Id } = sync;
const logId = `MessageRequests.onResponse(groupv2(${groupV2Id}) ${threadAci} ${threadE164})`; const logId = `MessageRequests.onResponse(groupv2(${groupV2Id}) ${threadAci}`;
try { try {
let conversation; let conversation;
@ -85,9 +73,8 @@ export async function onResponse(
if (groupV2Id) { if (groupV2Id) {
conversation = window.ConversationController.get(groupV2Id); conversation = window.ConversationController.get(groupV2Id);
} }
if (!conversation && (threadE164 || threadAci)) { if (!conversation && threadAci) {
conversation = window.ConversationController.lookupOrCreate({ conversation = window.ConversationController.lookupOrCreate({
e164: threadE164,
serviceId: threadAci, serviceId: threadAci,
reason: logId, reason: logId,
}); });

View file

@ -12,7 +12,6 @@ import { MessageModel } from '../models/messages';
export type ViewOnceOpenSyncAttributesType = { export type ViewOnceOpenSyncAttributesType = {
removeFromMessageReceiverCache: () => unknown; removeFromMessageReceiverCache: () => unknown;
source?: string;
sourceAci: AciString; sourceAci: AciString;
timestamp: number; timestamp: number;
}; };
@ -46,15 +45,6 @@ export function forMessage(
return syncBySourceServiceId; return syncBySourceServiceId;
} }
const syncBySource = viewOnceSyncValues.find(item => {
return item.source === message.source && item.timestamp === message.sent_at;
});
if (syncBySource) {
log.info(`${logId}: Found early view once open sync for message`);
remove(syncBySource);
return syncBySource;
}
return null; return null;
} }
@ -69,23 +59,16 @@ export async function onSync(
const messages = await DataReader.getMessagesBySentAt(sync.timestamp); const messages = await DataReader.getMessagesBySentAt(sync.timestamp);
const found = messages.find(item => { const found = messages.find(item => {
const itemSourceAci = item.sourceServiceId; const itemSource = item.sourceServiceId;
const syncSourceAci = sync.sourceAci; const syncSource = sync.sourceAci;
const itemSource = item.source;
const syncSource = sync.source;
return Boolean( return Boolean(itemSource && syncSource && itemSource === syncSource);
(itemSourceAci && syncSourceAci && itemSourceAci === syncSourceAci) ||
(itemSource && syncSource && itemSource === syncSource)
);
}); });
const syncSource = sync.source;
const syncSourceAci = sync.sourceAci; const syncSourceAci = sync.sourceAci;
const syncTimestamp = sync.timestamp; const syncTimestamp = sync.timestamp;
const wasMessageFound = Boolean(found); const wasMessageFound = Boolean(found);
log.info(`${logId} receive:`, { log.info(`${logId} receive:`, {
syncSource,
syncSourceAci, syncSourceAci,
syncTimestamp, syncTimestamp,
wasMessageFound, wasMessageFound,

View file

@ -153,48 +153,44 @@ export async function handleDataMessage(
? data.unidentifiedStatus ? data.unidentifiedStatus
: []; : [];
unidentifiedStatus.forEach( unidentifiedStatus.forEach(({ destinationServiceId, unidentified }) => {
({ destinationServiceId, destination, unidentified }) => { if (!destinationServiceId) {
const identifier = destinationServiceId || destination; return;
if (!identifier) {
return;
}
const destinationConversation =
window.ConversationController.lookupOrCreate({
serviceId: destinationServiceId,
e164: destination || undefined,
reason: `handleDataMessage(${initialMessage.timestamp})`,
});
if (!destinationConversation) {
return;
}
const updatedAt: number =
data && isNormalNumber(data.timestamp)
? data.timestamp
: Date.now();
const previousSendState = getOwn(
sendStateByConversationId,
destinationConversation.id
);
sendStateByConversationId[destinationConversation.id] =
previousSendState
? sendStateReducer(previousSendState, {
type: SendActionType.Sent,
updatedAt,
})
: {
status: SendStatus.Sent,
updatedAt,
};
if (unidentified) {
unidentifiedDeliveriesSet.add(identifier);
}
} }
);
const destinationConversation =
window.ConversationController.lookupOrCreate({
serviceId: destinationServiceId,
reason: `handleDataMessage(${initialMessage.timestamp})`,
});
if (!destinationConversation) {
return;
}
const updatedAt: number =
data && isNormalNumber(data.timestamp)
? data.timestamp
: Date.now();
const previousSendState = getOwn(
sendStateByConversationId,
destinationConversation.id
);
sendStateByConversationId[destinationConversation.id] =
previousSendState
? sendStateReducer(previousSendState, {
type: SendActionType.Sent,
updatedAt,
})
: {
status: SendStatus.Sent,
updatedAt,
};
if (unidentified) {
unidentifiedDeliveriesSet.add(destinationServiceId);
}
});
toUpdate.set({ toUpdate.set({
sendStateByConversationId, sendStateByConversationId,

View file

@ -408,7 +408,7 @@ export async function sendSyncMessage(
messaging.sendSyncMessage({ messaging.sendSyncMessage({
...encodedContent, ...encodedContent,
timestamp: targetTimestamp, timestamp: targetTimestamp,
destination: conv.get('e164'), destinationE164: conv.get('e164'),
destinationServiceId: conv.getServiceId(), destinationServiceId: conv.getServiceId(),
expirationStartTimestamp: expirationStartTimestamp:
message.get('expirationStartTimestamp') || null, message.get('expirationStartTimestamp') || null,

View file

@ -262,21 +262,18 @@ function cleanForLogging(settings?: MediaDeviceSettings): unknown {
function protoToCallingMessage({ function protoToCallingMessage({
offer, offer,
answer, answer,
iceCandidates, iceUpdate,
busy, busy,
hangup, hangup,
destinationDeviceId, destinationDeviceId,
opaque, opaque,
}: Proto.ICallingMessage): CallingMessage { }: Proto.ICallMessage): CallingMessage {
const newIceCandidates: Array<IceCandidateMessage> = []; const newIceCandidates: Array<IceCandidateMessage> = [];
if (iceCandidates) { if (iceUpdate) {
iceCandidates.forEach(candidate => { iceUpdate.forEach(candidate => {
if (candidate.callId && candidate.opaque) { if (candidate.id && candidate.opaque) {
newIceCandidates.push( newIceCandidates.push(
new IceCandidateMessage( new IceCandidateMessage(candidate.id, Buffer.from(candidate.opaque))
candidate.callId,
Buffer.from(candidate.opaque)
)
); );
} }
}); });
@ -284,23 +281,23 @@ function protoToCallingMessage({
return { return {
offer: offer:
offer && offer.callId && offer.opaque offer && offer.id && offer.opaque
? new OfferMessage( ? new OfferMessage(
offer.callId, offer.id,
dropNull(offer.type) as number, dropNull(offer.type) as number,
Buffer.from(offer.opaque) Buffer.from(offer.opaque)
) )
: undefined, : undefined,
answer: answer:
answer && answer.callId && answer.opaque answer && answer.id && answer.opaque
? new AnswerMessage(answer.callId, Buffer.from(answer.opaque)) ? new AnswerMessage(answer.id, Buffer.from(answer.opaque))
: undefined, : undefined,
iceCandidates: newIceCandidates.length > 0 ? newIceCandidates : undefined, iceCandidates: newIceCandidates.length > 0 ? newIceCandidates : undefined,
busy: busy && busy.callId ? new BusyMessage(busy.callId) : undefined, busy: busy && busy.id ? new BusyMessage(busy.id) : undefined,
hangup: hangup:
hangup && hangup.callId hangup && hangup.id
? new HangupMessage( ? new HangupMessage(
hangup.callId, hangup.id,
dropNull(hangup.type) as number, dropNull(hangup.type) as number,
hangup.deviceId || 0 hangup.deviceId || 0
) )
@ -2444,7 +2441,7 @@ export class CallingClass {
async handleCallingMessage( async handleCallingMessage(
envelope: ProcessedEnvelope, envelope: ProcessedEnvelope,
callingMessage: Proto.ICallingMessage callingMessage: Proto.ICallMessage
): Promise<void> { ): Promise<void> {
const logId = `CallingClass.handleCallingMessage(${envelope.timestamp})`; const logId = `CallingClass.handleCallingMessage(${envelope.timestamp})`;
@ -2500,7 +2497,7 @@ export class CallingClass {
'rejecting call message.' 'rejecting call message.'
); );
const { callId } = callingMessage.offer; const { id: callId } = callingMessage.offer;
assertDev(callId != null, 'Call ID missing from offer'); assertDev(callId != null, 'Call ID missing from offer');
const hangup = new HangupMessage( const hangup = new HangupMessage(
@ -2516,7 +2513,7 @@ export class CallingClass {
const wasVideoCall = const wasVideoCall =
callingMessage.offer.type === callingMessage.offer.type ===
Proto.CallingMessage.Offer.Type.OFFER_VIDEO_CALL; Proto.CallMessage.Offer.Type.OFFER_VIDEO_CALL;
const peerId = getPeerIdFromConversation(conversation.attributes); const peerId = getPeerIdFromConversation(conversation.attributes);
const callDetails = getCallDetailsFromEndedDirectCall( const callDetails = getCallDetailsFromEndedDirectCall(
@ -2684,7 +2681,7 @@ export class CallingClass {
callingMessage.opaque.data = data; callingMessage.opaque.data = data;
const proto = callingMessageToProto(callingMessage, urgency); const proto = callingMessageToProto(callingMessage, urgency);
const protoBytes = Proto.CallingMessage.encode(proto).finish(); const protoBytes = Proto.CallMessage.encode(proto).finish();
const protoBase64 = Bytes.toBase64(protoBytes); const protoBase64 = Bytes.toBase64(protoBytes);
await conversationJobQueue.add({ await conversationJobQueue.add({
@ -2845,7 +2842,7 @@ export class CallingClass {
try { try {
const proto = callingMessageToProto(message, urgency); const proto = callingMessageToProto(message, urgency);
const protoBytes = Proto.CallingMessage.encode(proto).finish(); const protoBytes = Proto.CallMessage.encode(proto).finish();
const protoBase64 = Bytes.toBase64(protoBytes); const protoBase64 = Bytes.toBase64(protoBytes);
await conversationJobQueue.add({ await conversationJobQueue.add({

View file

@ -150,8 +150,8 @@ export function updateToSchemaVersion1280(
: undefined, : undefined,
// Sadly not captured previously // Sadly not captured previously
messageAgeSec: 0, messageAgeSec: 0,
reportingToken: decoded.reportingToken?.length reportingToken: decoded.reportSpamToken?.length
? decoded.reportingToken ? decoded.reportSpamToken
: null, : null,
}); });
} catch (error) { } catch (error) {

View file

@ -222,7 +222,7 @@ describe('processDataMessage', () => {
reaction: { reaction: {
emoji: '😎', emoji: '😎',
targetAuthorAci: ACI_1, targetAuthorAci: ACI_1,
targetTimestamp: Long.fromNumber(TIMESTAMP), targetSentTimestamp: Long.fromNumber(TIMESTAMP),
}, },
}).reaction, }).reaction,
{ {
@ -239,7 +239,7 @@ describe('processDataMessage', () => {
emoji: '😎', emoji: '😎',
remove: true, remove: true,
targetAuthorAci: ACI_1, targetAuthorAci: ACI_1,
targetTimestamp: Long.fromNumber(TIMESTAMP), targetSentTimestamp: Long.fromNumber(TIMESTAMP),
}, },
}).reaction, }).reaction,
{ {

View file

@ -280,7 +280,6 @@ describe('pnp/PNI Signature', function (this: Mocha.Suite) {
unidentifiedStatus: [ unidentifiedStatus: [
{ {
destinationServiceId, destinationServiceId,
destination,
destinationPniIdentityKey: destinationPniIdentityKey.serialize(), destinationPniIdentityKey: destinationPniIdentityKey.serialize(),
}, },
], ],

View file

@ -59,7 +59,7 @@ describe('SQL/updateToSchemaVersion1280', () => {
Proto.Envelope.encode({ Proto.Envelope.encode({
destinationServiceId: THEIR_ACI, destinationServiceId: THEIR_ACI,
content: Buffer.from('encrypted1'), content: Buffer.from('encrypted1'),
reportingToken: Buffer.from('token'), reportSpamToken: Buffer.from('token'),
}).finish() }).finish()
).toString('base64'), ).toString('base64'),
serverTimestamp: 6, serverTimestamp: 6,

View file

@ -58,7 +58,7 @@ describe('callingMessageToProto', () => {
); );
assert.deepEqual( assert.deepEqual(
droppableResult.opaque?.urgency, droppableResult.opaque?.urgency,
Proto.CallingMessage.Opaque.Urgency.DROPPABLE Proto.CallMessage.Opaque.Urgency.DROPPABLE
); );
const urgentResult = callingMessageToProto( const urgentResult = callingMessageToProto(
@ -67,7 +67,7 @@ describe('callingMessageToProto', () => {
); );
assert.deepEqual( assert.deepEqual(
urgentResult.opaque?.urgency, urgentResult.opaque?.urgency,
Proto.CallingMessage.Opaque.Urgency.HANDLE_IMMEDIATELY Proto.CallMessage.Opaque.Urgency.HANDLE_IMMEDIATELY
); );
}); });
@ -84,7 +84,7 @@ describe('callingMessageToProto', () => {
assert.deepEqual(result.opaque?.data, new Uint8Array([1, 2, 3])); assert.deepEqual(result.opaque?.data, new Uint8Array([1, 2, 3]));
assert.deepEqual( assert.deepEqual(
result.opaque?.urgency, result.opaque?.urgency,
Proto.CallingMessage.Opaque.Urgency.HANDLE_IMMEDIATELY Proto.CallMessage.Opaque.Urgency.HANDLE_IMMEDIATELY
); );
}); });
}); });

View file

@ -447,8 +447,8 @@ export default class MessageReceiver
serverTimestamp, serverTimestamp,
urgent: isBoolean(decoded.urgent) ? decoded.urgent : true, urgent: isBoolean(decoded.urgent) ? decoded.urgent : true,
story: decoded.story ?? false, story: decoded.story ?? false,
reportingToken: Bytes.isNotEmpty(decoded.reportingToken) reportingToken: Bytes.isNotEmpty(decoded.reportSpamToken)
? decoded.reportingToken ? decoded.reportSpamToken
: undefined, : undefined,
groupId: undefined, groupId: undefined,
}; };
@ -1447,7 +1447,7 @@ export default class MessageReceiver
throw new Error('Unsealed envelope dropped due to stopping processing'); throw new Error('Unsealed envelope dropped due to stopping processing');
} }
if (envelope.type === Proto.Envelope.Type.RECEIPT) { if (envelope.type === Proto.Envelope.Type.SERVER_DELIVERY_RECEIPT) {
strictAssert( strictAssert(
envelope.sourceServiceId, envelope.sourceServiceId,
'Unsealed delivery receipt must have sourceServiceId' 'Unsealed delivery receipt must have sourceServiceId'
@ -2145,7 +2145,7 @@ export default class MessageReceiver
logUnexpectedUrgentValue(envelope, 'sentSync'); logUnexpectedUrgentValue(envelope, 'sentSync');
const { const {
destination, destinationE164,
destinationServiceId, destinationServiceId,
timestamp, timestamp,
message: msg, message: msg,
@ -2178,7 +2178,7 @@ export default class MessageReceiver
const ev = new SentEvent( const ev = new SentEvent(
{ {
envelopeId: envelope.id, envelopeId: envelope.id,
destination: dropNull(destination), destinationE164: dropNull(destinationE164),
destinationServiceId, destinationServiceId,
timestamp: timestamp?.toNumber(), timestamp: timestamp?.toNumber(),
serverTimestamp: envelope.serverTimestamp, serverTimestamp: envelope.serverTimestamp,
@ -2673,8 +2673,8 @@ export default class MessageReceiver
this.#handleNullMessage(envelope); this.#handleNullMessage(envelope);
return; return;
} }
if (content.callingMessage) { if (content.callMessage) {
await this.#handleCallingMessage(envelope, content.callingMessage); await this.#handleCallingMessage(envelope, content.callMessage);
return; return;
} }
if (content.receiptMessage) { if (content.receiptMessage) {
@ -2832,7 +2832,7 @@ export default class MessageReceiver
async #handleCallingMessage( async #handleCallingMessage(
envelope: UnsealedEnvelope, envelope: UnsealedEnvelope,
callingMessage: Proto.ICallingMessage callingMessage: Proto.ICallMessage
): Promise<void> { ): Promise<void> {
logUnexpectedUrgentValue(envelope, 'callingMessage'); logUnexpectedUrgentValue(envelope, 'callingMessage');
@ -3215,7 +3215,7 @@ export default class MessageReceiver
} }
const { const {
destination, destinationE164,
destinationServiceId, destinationServiceId,
expirationStartTimestamp, expirationStartTimestamp,
unidentifiedStatus, unidentifiedStatus,
@ -3227,7 +3227,7 @@ export default class MessageReceiver
const ev = new SentEvent( const ev = new SentEvent(
{ {
envelopeId: envelope.id, envelopeId: envelope.id,
destination: dropNull(destination), destinationE164: dropNull(destinationE164),
destinationServiceId, destinationServiceId,
timestamp: envelope.timestamp, timestamp: envelope.timestamp,
serverTimestamp: envelope.serverTimestamp, serverTimestamp: envelope.serverTimestamp,
@ -3274,7 +3274,6 @@ export default class MessageReceiver
const ev = new ViewOnceOpenSyncEvent( const ev = new ViewOnceOpenSyncEvent(
{ {
source: dropNull(sync.sender),
sourceAci: sync.senderAci sourceAci: sync.senderAci
? normalizeAci(sync.senderAci, 'handleViewOnceOpen.senderUuid') ? normalizeAci(sync.senderAci, 'handleViewOnceOpen.senderUuid')
: undefined, : undefined,
@ -3311,7 +3310,6 @@ export default class MessageReceiver
const ev = new MessageRequestResponseEvent( const ev = new MessageRequestResponseEvent(
{ {
envelopeId: envelope.id, envelopeId: envelope.id,
threadE164: dropNull(sync.threadE164),
threadAci: sync.threadAci threadAci: sync.threadAci
? normalizeAci( ? normalizeAci(
sync.threadAci, sync.threadAci,
@ -3454,11 +3452,10 @@ export default class MessageReceiver
logUnexpectedUrgentValue(envelope, 'readSync'); logUnexpectedUrgentValue(envelope, 'readSync');
const reads = read.map( const reads = read.map(
({ timestamp, sender, senderAci }): ReadSyncEventData => ({ ({ timestamp, senderAci }): ReadSyncEventData => ({
envelopeId: envelope.id, envelopeId: envelope.id,
envelopeTimestamp: envelope.timestamp, envelopeTimestamp: envelope.timestamp,
timestamp: timestamp?.toNumber(), timestamp: timestamp?.toNumber(),
sender: dropNull(sender),
senderAci: senderAci senderAci: senderAci
? normalizeAci(senderAci, 'handleRead.senderAci') ? normalizeAci(senderAci, 'handleRead.senderAci')
: undefined, : undefined,
@ -3486,9 +3483,8 @@ export default class MessageReceiver
logUnexpectedUrgentValue(envelope, 'viewSync'); logUnexpectedUrgentValue(envelope, 'viewSync');
const views = viewed.map( const views = viewed.map(
({ timestamp, senderE164, senderAci }): ViewSyncEventData => ({ ({ timestamp, senderAci }): ViewSyncEventData => ({
timestamp: timestamp?.toNumber(), timestamp: timestamp?.toNumber(),
senderE164: dropNull(senderE164),
senderAci: senderAci senderAci: senderAci
? normalizeAci(senderAci, 'handleViewed.senderAci') ? normalizeAci(senderAci, 'handleViewed.senderAci')
: undefined, : undefined,
@ -4027,18 +4023,13 @@ function envelopeTypeToCiphertextType(type: number | undefined): number {
if (type === Type.CIPHERTEXT) { if (type === Type.CIPHERTEXT) {
return CiphertextMessageType.Whisper; return CiphertextMessageType.Whisper;
} }
if (type === Type.KEY_EXCHANGE) {
throw new Error(
'envelopeTypeToCiphertextType: Cannot process KEY_EXCHANGE messages'
);
}
if (type === Type.PLAINTEXT_CONTENT) { if (type === Type.PLAINTEXT_CONTENT) {
return CiphertextMessageType.Plaintext; return CiphertextMessageType.Plaintext;
} }
if (type === Type.PREKEY_BUNDLE) { if (type === Type.PREKEY_BUNDLE) {
return CiphertextMessageType.PreKey; return CiphertextMessageType.PreKey;
} }
if (type === Type.RECEIPT) { if (type === Type.SERVER_DELIVERY_RECEIPT) {
return CiphertextMessageType.Plaintext; return CiphertextMessageType.Plaintext;
} }
if (type === Type.UNIDENTIFIED_SENDER) { if (type === Type.UNIDENTIFIED_SENDER) {

View file

@ -414,7 +414,7 @@ class Message {
proto.reaction.emoji = this.reaction.emoji || null; proto.reaction.emoji = this.reaction.emoji || null;
proto.reaction.remove = this.reaction.remove || false; proto.reaction.remove = this.reaction.remove || false;
proto.reaction.targetAuthorAci = this.reaction.targetAuthorAci || null; proto.reaction.targetAuthorAci = this.reaction.targetAuthorAci || null;
proto.reaction.targetTimestamp = proto.reaction.targetSentTimestamp =
this.reaction.targetTimestamp === undefined this.reaction.targetTimestamp === undefined
? null ? null
: Long.fromNumber(this.reaction.targetTimestamp); : Long.fromNumber(this.reaction.targetTimestamp);
@ -422,7 +422,7 @@ class Message {
if (Array.isArray(this.preview)) { if (Array.isArray(this.preview)) {
proto.preview = this.preview.map(preview => { proto.preview = this.preview.map(preview => {
const item = new Proto.DataMessage.Preview(); const item = new Proto.Preview();
item.title = preview.title; item.title = preview.title;
item.url = preview.url; item.url = preview.url;
item.description = preview.description || null; item.description = preview.description || null;
@ -504,7 +504,8 @@ class Message {
} }
if (this.quote) { if (this.quote) {
const { BodyRange: ProtoBodyRange, Quote } = Proto.DataMessage; const ProtoBodyRange = Proto.BodyRange;
const { Quote } = Proto.DataMessage;
proto.quote = new Quote(); proto.quote = new Quote();
const { quote } = proto; const { quote } = proto;
@ -1256,7 +1257,7 @@ export default class MessageSender {
encodedDataMessage, encodedDataMessage,
encodedEditMessage, encodedEditMessage,
timestamp, timestamp,
destination, destinationE164,
destinationServiceId, destinationServiceId,
expirationStartTimestamp, expirationStartTimestamp,
conversationIdsSentTo = [], conversationIdsSentTo = [],
@ -1270,7 +1271,7 @@ export default class MessageSender {
encodedDataMessage?: Uint8Array; encodedDataMessage?: Uint8Array;
encodedEditMessage?: Uint8Array; encodedEditMessage?: Uint8Array;
timestamp: number; timestamp: number;
destination: string | undefined; destinationE164: string | undefined;
destinationServiceId: ServiceIdString | undefined; destinationServiceId: ServiceIdString | undefined;
expirationStartTimestamp: number | null; expirationStartTimestamp: number | null;
conversationIdsSentTo?: Iterable<string>; conversationIdsSentTo?: Iterable<string>;
@ -1293,8 +1294,8 @@ export default class MessageSender {
const dataMessage = Proto.DataMessage.decode(encodedDataMessage); const dataMessage = Proto.DataMessage.decode(encodedDataMessage);
sentMessage.message = dataMessage; sentMessage.message = dataMessage;
} }
if (destination) { if (destinationE164) {
sentMessage.destination = destination; sentMessage.destinationE164 = destinationE164;
} }
if (destinationServiceId) { if (destinationServiceId) {
sentMessage.destinationServiceId = destinationServiceId; sentMessage.destinationServiceId = destinationServiceId;
@ -1325,10 +1326,6 @@ export default class MessageSender {
new Proto.SyncMessage.Sent.UnidentifiedDeliveryStatus(); new Proto.SyncMessage.Sent.UnidentifiedDeliveryStatus();
const conv = window.ConversationController.get(conversationId); const conv = window.ConversationController.get(conversationId);
if (conv) { if (conv) {
const e164 = conv.get('e164');
if (e164) {
status.destination = e164;
}
const serviceId = conv.getServiceId(); const serviceId = conv.getServiceId();
if (serviceId) { if (serviceId) {
status.destinationServiceId = serviceId; status.destinationServiceId = serviceId;
@ -1763,7 +1760,7 @@ export default class MessageSender {
`syncViewOnceOpen: ${viewOnceOpens.length} opens provided. Can only handle one.` `syncViewOnceOpen: ${viewOnceOpens.length} opens provided. Can only handle one.`
); );
} }
const { senderE164, senderAci, timestamp } = viewOnceOpens[0]; const { senderAci, timestamp } = viewOnceOpens[0];
if (!senderAci) { if (!senderAci) {
throw new Error('syncViewOnceOpen: Missing senderAci'); throw new Error('syncViewOnceOpen: Missing senderAci');
@ -1774,9 +1771,6 @@ export default class MessageSender {
const syncMessage = MessageSender.createSyncMessage(); const syncMessage = MessageSender.createSyncMessage();
const viewOnceOpen = new Proto.SyncMessage.ViewOnceOpen(); const viewOnceOpen = new Proto.SyncMessage.ViewOnceOpen();
if (senderE164 !== undefined) {
viewOnceOpen.sender = senderE164;
}
viewOnceOpen.senderAci = senderAci; viewOnceOpen.senderAci = senderAci;
viewOnceOpen.timestamp = Long.fromNumber(timestamp); viewOnceOpen.timestamp = Long.fromNumber(timestamp);
syncMessage.viewOnceOpen = viewOnceOpen; syncMessage.viewOnceOpen = viewOnceOpen;
@ -1832,7 +1826,6 @@ export default class MessageSender {
static getMessageRequestResponseSync( static getMessageRequestResponseSync(
options: Readonly<{ options: Readonly<{
threadE164?: string;
threadAci?: AciString; threadAci?: AciString;
groupId?: Uint8Array; groupId?: Uint8Array;
type: number; type: number;
@ -1843,9 +1836,6 @@ export default class MessageSender {
const syncMessage = MessageSender.createSyncMessage(); const syncMessage = MessageSender.createSyncMessage();
const response = new Proto.SyncMessage.MessageRequestResponse(); const response = new Proto.SyncMessage.MessageRequestResponse();
if (options.threadE164 !== undefined) {
response.threadE164 = options.threadE164;
}
if (options.threadAci !== undefined) { if (options.threadAci !== undefined) {
response.threadAci = options.threadAci; response.threadAci = options.threadAci;
} }
@ -1929,9 +1919,6 @@ export default class MessageSender {
const verified = new Proto.Verified(); const verified = new Proto.Verified();
verified.state = state; verified.state = state;
if (destinationE164) {
verified.destination = destinationE164;
}
if (destinationAci) { if (destinationAci) {
verified.destinationAci = destinationAci; verified.destinationAci = destinationAci;
} }
@ -1962,7 +1949,7 @@ export default class MessageSender {
async sendCallingMessage( async sendCallingMessage(
serviceId: ServiceIdString, serviceId: ServiceIdString,
callingMessage: Readonly<Proto.ICallingMessage>, callingMessage: Readonly<Proto.ICallMessage>,
timestamp: number, timestamp: number,
urgent: boolean, urgent: boolean,
options?: Readonly<SendOptionsType> options?: Readonly<SendOptionsType>
@ -1970,7 +1957,7 @@ export default class MessageSender {
const recipients = [serviceId]; const recipients = [serviceId];
const contentMessage = new Proto.Content(); const contentMessage = new Proto.Content();
contentMessage.callingMessage = callingMessage; contentMessage.callMessage = callingMessage;
const conversation = window.ConversationController.get(serviceId); const conversation = window.ConversationController.get(serviceId);

View file

@ -208,7 +208,7 @@ export class RetryRequestEvent extends ConfirmableEvent {
export type SentEventData = Readonly<{ export type SentEventData = Readonly<{
envelopeId: string; envelopeId: string;
destination?: string; destinationE164?: string;
destinationServiceId?: ServiceIdString; destinationServiceId?: ServiceIdString;
timestamp?: number; timestamp?: number;
serverTimestamp: number; serverTimestamp: number;
@ -311,25 +311,21 @@ export class ConfigurationEvent extends ConfirmableEvent {
} }
export type ViewOnceOpenSyncOptions = { export type ViewOnceOpenSyncOptions = {
source?: string;
sourceAci?: AciString; sourceAci?: AciString;
timestamp?: number; timestamp?: number;
}; };
export class ViewOnceOpenSyncEvent extends ConfirmableEvent { export class ViewOnceOpenSyncEvent extends ConfirmableEvent {
public readonly source?: string;
public readonly sourceAci?: AciString; public readonly sourceAci?: AciString;
public readonly timestamp?: number; public readonly timestamp?: number;
constructor( constructor(
{ source, sourceAci, timestamp }: ViewOnceOpenSyncOptions, { sourceAci, timestamp }: ViewOnceOpenSyncOptions,
confirm: ConfirmCallback confirm: ConfirmCallback
) { ) {
super('viewOnceOpenSync', confirm); super('viewOnceOpenSync', confirm);
this.source = source;
this.sourceAci = sourceAci; this.sourceAci = sourceAci;
this.timestamp = timestamp; this.timestamp = timestamp;
} }
@ -345,8 +341,6 @@ export type MessageRequestResponseOptions = {
}; };
export class MessageRequestResponseEvent extends ConfirmableEvent { export class MessageRequestResponseEvent extends ConfirmableEvent {
public readonly threadE164?: string;
public readonly threadAci?: AciString; public readonly threadAci?: AciString;
public readonly messageRequestResponseType?: MessageRequestResponseOptions['messageRequestResponseType']; public readonly messageRequestResponseType?: MessageRequestResponseOptions['messageRequestResponseType'];
@ -360,7 +354,6 @@ export class MessageRequestResponseEvent extends ConfirmableEvent {
constructor( constructor(
{ {
envelopeId, envelopeId,
threadE164,
threadAci, threadAci,
messageRequestResponseType, messageRequestResponseType,
groupId, groupId,
@ -371,7 +364,6 @@ export class MessageRequestResponseEvent extends ConfirmableEvent {
super('messageRequestResponse', confirm); super('messageRequestResponse', confirm);
this.envelopeId = envelopeId; this.envelopeId = envelopeId;
this.threadE164 = threadE164;
this.threadAci = threadAci; this.threadAci = threadAci;
this.messageRequestResponseType = messageRequestResponseType; this.messageRequestResponseType = messageRequestResponseType;
this.groupId = groupId; this.groupId = groupId;

View file

@ -198,7 +198,7 @@ function cleanLinkPreviewDate(value?: Long | null): number | undefined {
} }
export function processPreview( export function processPreview(
preview?: ReadonlyArray<Proto.DataMessage.IPreview> | null preview?: ReadonlyArray<Proto.IPreview> | null
): ReadonlyArray<ProcessedPreview> | undefined { ): ReadonlyArray<ProcessedPreview> | undefined {
if (!preview) { if (!preview) {
return undefined; return undefined;
@ -247,7 +247,7 @@ export function processReaction(
emoji: dropNull(reaction.emoji), emoji: dropNull(reaction.emoji),
remove: Boolean(reaction.remove), remove: Boolean(reaction.remove),
targetAuthorAci: normalizeAci(targetAuthorAci, 'Reaction.targetAuthorAci'), targetAuthorAci: normalizeAci(targetAuthorAci, 'Reaction.targetAuthorAci'),
targetTimestamp: reaction.targetTimestamp?.toNumber(), targetTimestamp: reaction.targetSentTimestamp?.toNumber(),
}; };
} }

View file

@ -36,8 +36,8 @@ export enum DisplayStyle {
// eslint-disable-next-line @typescript-eslint/no-redeclare // eslint-disable-next-line @typescript-eslint/no-redeclare
export namespace BodyRange { export namespace BodyRange {
// re-export for convenience // re-export for convenience
export type Style = Proto.DataMessage.BodyRange.Style; export type Style = Proto.BodyRange.Style;
export const { Style } = Proto.DataMessage.BodyRange; export const { Style } = Proto.BodyRange;
export type Mention = { export type Mention = {
mentionAci: AciString; mentionAci: AciString;
@ -147,10 +147,7 @@ const MENTION_NAME = 'mention';
// We drop unknown bodyRanges and remove extra stuff so they serialize properly // We drop unknown bodyRanges and remove extra stuff so they serialize properly
export function filterAndClean( export function filterAndClean(
ranges: ranges: ReadonlyArray<Proto.IBodyRange | RawBodyRange> | undefined | null
| ReadonlyArray<Proto.DataMessage.IBodyRange | RawBodyRange>
| undefined
| null
): ReadonlyArray<RawBodyRange> | undefined { ): ReadonlyArray<RawBodyRange> | undefined {
if (!ranges) { if (!ranges) {
return undefined; return undefined;

View file

@ -307,7 +307,8 @@ export function getCallLogEventForProto(
const directionToProto = { const directionToProto = {
[CallDirection.Incoming]: Proto.SyncMessage.CallEvent.Direction.INCOMING, [CallDirection.Incoming]: Proto.SyncMessage.CallEvent.Direction.INCOMING,
[CallDirection.Outgoing]: Proto.SyncMessage.CallEvent.Direction.OUTGOING, [CallDirection.Outgoing]: Proto.SyncMessage.CallEvent.Direction.OUTGOING,
[CallDirection.Unknown]: Proto.SyncMessage.CallEvent.Direction.UNKNOWN, [CallDirection.Unknown]:
Proto.SyncMessage.CallEvent.Direction.UNKNOWN_DIRECTION,
}; };
const typeToProto = { const typeToProto = {
@ -315,7 +316,7 @@ const typeToProto = {
[CallType.Video]: Proto.SyncMessage.CallEvent.Type.VIDEO_CALL, [CallType.Video]: Proto.SyncMessage.CallEvent.Type.VIDEO_CALL,
[CallType.Group]: Proto.SyncMessage.CallEvent.Type.GROUP_CALL, [CallType.Group]: Proto.SyncMessage.CallEvent.Type.GROUP_CALL,
[CallType.Adhoc]: Proto.SyncMessage.CallEvent.Type.AD_HOC_CALL, [CallType.Adhoc]: Proto.SyncMessage.CallEvent.Type.AD_HOC_CALL,
[CallType.Unknown]: Proto.SyncMessage.CallEvent.Type.UNKNOWN, [CallType.Unknown]: Proto.SyncMessage.CallEvent.Type.UNKNOWN_TYPE,
}; };
const statusToProto: Record< const statusToProto: Record<
@ -335,7 +336,7 @@ const statusToProto: Record<
[CallStatusValue.Ringing]: null, [CallStatusValue.Ringing]: null,
[CallStatusValue.Joined]: null, [CallStatusValue.Joined]: null,
[CallStatusValue.JoinedAdhoc]: Proto.SyncMessage.CallEvent.Event.ACCEPTED, [CallStatusValue.JoinedAdhoc]: Proto.SyncMessage.CallEvent.Event.ACCEPTED,
[CallStatusValue.Unknown]: Proto.SyncMessage.CallEvent.Event.UNKNOWN, [CallStatusValue.Unknown]: Proto.SyncMessage.CallEvent.Event.UNKNOWN_EVENT,
}; };
function shouldSyncStatus(callStatus: CallStatus) { function shouldSyncStatus(callStatus: CallStatus) {

View file

@ -19,8 +19,8 @@ export function callingMessageToProto(
opaque, opaque,
}: CallingMessage, }: CallingMessage,
urgency?: CallMessageUrgency urgency?: CallMessageUrgency
): Proto.ICallingMessage { ): Proto.ICallMessage {
let opaqueField: undefined | Proto.CallingMessage.IOpaque; let opaqueField: undefined | Proto.CallMessage.IOpaque;
if (opaque) { if (opaque) {
opaqueField = { opaqueField = {
...opaque, ...opaque,
@ -38,7 +38,7 @@ export function callingMessageToProto(
offer: offer offer: offer
? { ? {
...offer, ...offer,
callId: Long.fromValue(offer.callId), id: Long.fromValue(offer.callId),
type: offer.type as number, type: offer.type as number,
opaque: bufferToProto(offer.opaque), opaque: bufferToProto(offer.opaque),
} }
@ -46,11 +46,11 @@ export function callingMessageToProto(
answer: answer answer: answer
? { ? {
...answer, ...answer,
callId: Long.fromValue(answer.callId), id: Long.fromValue(answer.callId),
opaque: bufferToProto(answer.opaque), opaque: bufferToProto(answer.opaque),
} }
: undefined, : undefined,
iceCandidates: iceCandidates iceUpdate: iceCandidates
? iceCandidates.map(candidate => { ? iceCandidates.map(candidate => {
return { return {
...candidate, ...candidate,
@ -62,13 +62,13 @@ export function callingMessageToProto(
busy: busy busy: busy
? { ? {
...busy, ...busy,
callId: Long.fromValue(busy.callId), id: Long.fromValue(busy.callId),
} }
: undefined, : undefined,
hangup: hangup hangup: hangup
? { ? {
...hangup, ...hangup,
callId: Long.fromValue(hangup.callId), id: Long.fromValue(hangup.callId),
type: hangup.type as number, type: hangup.type as number,
} }
: undefined, : undefined,
@ -92,14 +92,14 @@ function bufferToProto(
function urgencyToProto( function urgencyToProto(
urgency: CallMessageUrgency urgency: CallMessageUrgency
): Proto.CallingMessage.Opaque.Urgency { ): Proto.CallMessage.Opaque.Urgency {
switch (urgency) { switch (urgency) {
case CallMessageUrgency.Droppable: case CallMessageUrgency.Droppable:
return Proto.CallingMessage.Opaque.Urgency.DROPPABLE; return Proto.CallMessage.Opaque.Urgency.DROPPABLE;
case CallMessageUrgency.HandleImmediately: case CallMessageUrgency.HandleImmediately:
return Proto.CallingMessage.Opaque.Urgency.HANDLE_IMMEDIATELY; return Proto.CallMessage.Opaque.Urgency.HANDLE_IMMEDIATELY;
default: default:
log.error(missingCaseError(urgency)); log.error(missingCaseError(urgency));
return Proto.CallingMessage.Opaque.Urgency.DROPPABLE; return Proto.CallMessage.Opaque.Urgency.DROPPABLE;
} }
} }

View file

@ -76,7 +76,7 @@ export async function wrapWithSyncMessageSend({
}); });
await handleMessageSend( await handleMessageSend(
sender.sendSyncMessage({ sender.sendSyncMessage({
destination: conversation.get('e164'), destinationE164: conversation.get('e164'),
destinationServiceId: conversation.getServiceId(), destinationServiceId: conversation.getServiceId(),
encodedDataMessage: dataMessage, encodedDataMessage: dataMessage,
expirationStartTimestamp: null, expirationStartTimestamp: null,