Update to the latest SignalService.proto
This commit is contained in:
parent
cf5dc4b940
commit
d26d915a44
26 changed files with 464 additions and 536 deletions
|
@ -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",
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 }) => {
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
});
|
});
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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({
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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,
|
||||||
{
|
{
|
||||||
|
|
|
@ -280,7 +280,6 @@ describe('pnp/PNI Signature', function (this: Mocha.Suite) {
|
||||||
unidentifiedStatus: [
|
unidentifiedStatus: [
|
||||||
{
|
{
|
||||||
destinationServiceId,
|
destinationServiceId,
|
||||||
destination,
|
|
||||||
destinationPniIdentityKey: destinationPniIdentityKey.serialize(),
|
destinationPniIdentityKey: destinationPniIdentityKey.serialize(),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue