fb-messenger-e2ee 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/DOCS.md +310 -0
  2. package/LICENSE +660 -0
  3. package/README.md +153 -0
  4. package/bun.lock +1014 -0
  5. package/examples/basic-usage.ts +52 -0
  6. package/jest.config.ts +18 -0
  7. package/package.json +56 -0
  8. package/src/config/env.ts +15 -0
  9. package/src/controllers/client.controller.ts +805 -0
  10. package/src/controllers/dgw-handler.ts +171 -0
  11. package/src/controllers/e2ee-handler.ts +832 -0
  12. package/src/controllers/event-mapper.ts +327 -0
  13. package/src/core/client.ts +151 -0
  14. package/src/e2ee/application/e2ee-client.ts +376 -0
  15. package/src/e2ee/application/fanout-planner.ts +79 -0
  16. package/src/e2ee/application/outbound-message-cache.ts +58 -0
  17. package/src/e2ee/application/prekey-maintenance.ts +55 -0
  18. package/src/e2ee/application/retry-manager.ts +156 -0
  19. package/src/e2ee/facebook/facebook-protocol-utils.ts +230 -0
  20. package/src/e2ee/facebook/icdc-payload.ts +31 -0
  21. package/src/e2ee/index.ts +76 -0
  22. package/src/e2ee/internal.ts +27 -0
  23. package/src/e2ee/media/media-crypto.ts +147 -0
  24. package/src/e2ee/media/media-upload.ts +90 -0
  25. package/src/e2ee/message/builders/client-payload.ts +54 -0
  26. package/src/e2ee/message/builders/consumer-application.ts +362 -0
  27. package/src/e2ee/message/builders/message-application.ts +64 -0
  28. package/src/e2ee/message/builders/message-transport.ts +84 -0
  29. package/src/e2ee/message/codecs/protobuf-codecs.ts +101 -0
  30. package/src/e2ee/message/constants.ts +4 -0
  31. package/src/e2ee/message/message-builder.ts +15 -0
  32. package/src/e2ee/message/proto/ArmadilloApplication.proto +281 -0
  33. package/src/e2ee/message/proto/ArmadilloICDC.proto +14 -0
  34. package/src/e2ee/message/proto/ConsumerApplication.proto +232 -0
  35. package/src/e2ee/message/proto/MessageApplication.proto +82 -0
  36. package/src/e2ee/message/proto/MessageTransport.proto +77 -0
  37. package/src/e2ee/message/proto/WACommon.proto +66 -0
  38. package/src/e2ee/message/proto/WAMediaTransport.proto +176 -0
  39. package/src/e2ee/message/proto/proto-writer.ts +76 -0
  40. package/src/e2ee/signal/prekey-manager.ts +140 -0
  41. package/src/e2ee/signal/signal-manager.ts +365 -0
  42. package/src/e2ee/store/device-json.ts +47 -0
  43. package/src/e2ee/store/device-repository.ts +12 -0
  44. package/src/e2ee/store/device-store.ts +538 -0
  45. package/src/e2ee/transport/binary/decoder.ts +180 -0
  46. package/src/e2ee/transport/binary/encoder.ts +143 -0
  47. package/src/e2ee/transport/binary/stanzas.ts +97 -0
  48. package/src/e2ee/transport/binary/tokens.ts +64 -0
  49. package/src/e2ee/transport/binary/wa-binary.ts +8 -0
  50. package/src/e2ee/transport/dgw/dgw-socket.ts +345 -0
  51. package/src/e2ee/transport/noise/noise-handshake.ts +417 -0
  52. package/src/e2ee/transport/noise/noise-socket.ts +230 -0
  53. package/src/index.ts +34 -0
  54. package/src/models/client.ts +26 -0
  55. package/src/models/config.ts +14 -0
  56. package/src/models/domain.ts +299 -0
  57. package/src/models/e2ee.ts +295 -0
  58. package/src/models/media.ts +41 -0
  59. package/src/models/messaging.ts +88 -0
  60. package/src/models/thread.ts +69 -0
  61. package/src/repositories/session.repository.ts +20 -0
  62. package/src/services/auth.service.ts +55 -0
  63. package/src/services/e2ee.service.ts +174 -0
  64. package/src/services/facebook-gateway.service.ts +245 -0
  65. package/src/services/icdc.service.ts +177 -0
  66. package/src/services/media.service.ts +304 -0
  67. package/src/services/messaging.service.ts +28 -0
  68. package/src/services/thread.service.ts +199 -0
  69. package/src/types/advanced-types.ts +61 -0
  70. package/src/types/fca-unofficial.d.ts +212 -0
  71. package/src/types/protocol-types.ts +43 -0
  72. package/src/utils/fca-utils.ts +30 -0
  73. package/src/utils/logger.ts +24 -0
  74. package/src/utils/mime.ts +51 -0
  75. package/tests/.env.example +87 -0
  76. package/tests/data/1x1.png +0 -0
  77. package/tests/data/example.txt +1 -0
  78. package/tests/data/file_example.mp3 +0 -0
  79. package/tests/data/file_example.mp4 +0 -0
  80. package/tests/integration.test.ts +498 -0
  81. package/tests/script/echo-e2ee.ts +174 -0
  82. package/tests/script/send-e2ee-media.ts +227 -0
  83. package/tests/script/send-e2ee-reaction.ts +108 -0
  84. package/tests/script/send-e2ee-unsend.ts +115 -0
  85. package/tests/script/send-typing.ts +107 -0
  86. package/tests/script/test-group-send.ts +105 -0
  87. package/tests/setup.ts +3 -0
  88. package/tests/types.test.ts +57 -0
  89. package/tests/unit/controllers/dgw-handler.test.ts +60 -0
  90. package/tests/unit/controllers/e2ee-handler.test.ts +293 -0
  91. package/tests/unit/controllers/event-mapper.test.ts +252 -0
  92. package/tests/unit/e2ee/application-helpers.test.ts +418 -0
  93. package/tests/unit/e2ee/device-store.test.ts +126 -0
  94. package/tests/unit/e2ee/facebook-protocol-utils.test.ts +134 -0
  95. package/tests/unit/e2ee/media-crypto.test.ts +55 -0
  96. package/tests/unit/e2ee/media-upload.test.ts +60 -0
  97. package/tests/unit/e2ee/message-builder.test.ts +42 -0
  98. package/tests/unit/e2ee/message-builders.test.ts +230 -0
  99. package/tests/unit/e2ee/noise-handshake.test.ts +260 -0
  100. package/tests/unit/e2ee/prekey-manager.test.ts +55 -0
  101. package/tests/unit/e2ee/wa-binary.test.ts +127 -0
  102. package/tests/unit/services/e2ee.service.test.ts +101 -0
  103. package/tests/unit/services/facebook-gateway.service.test.ts +138 -0
  104. package/tests/unit/services/media.service.test.ts +169 -0
  105. package/tests/unit/utils/fca-utils.test.ts +48 -0
  106. package/tsconfig.json +19 -0
@@ -0,0 +1,101 @@
1
+ import * as protobuf from "protobufjs";
2
+ import { fileURLToPath } from "node:url";
3
+ import { dirname, join } from "node:path";
4
+
5
+ // Protobuf Decoders (using protobufjs for simplicity)
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+
10
+ const root = new ((protobuf as any).default?.Root || protobuf.Root)();
11
+ root.resolvePath = (origin: string, target: string) => {
12
+ return join(__dirname, "../proto", target);
13
+ };
14
+ root.loadSync([
15
+ "WACommon.proto",
16
+ "MessageTransport.proto",
17
+ "WAMediaTransport.proto",
18
+ "MessageApplication.proto",
19
+ "ConsumerApplication.proto",
20
+ "ArmadilloApplication.proto",
21
+ "ArmadilloICDC.proto"
22
+ ]);
23
+
24
+ const MsgTransportType = root.lookupType("waMsgTransport.MessageTransport");
25
+ const MsgApplicationType = root.lookupType("WAMsgApplication.MessageApplication");
26
+ const ConsumerAppType = root.lookupType("waConsumerApplication.ConsumerApplication");
27
+ const ArmadilloAppType = root.lookupType("waArmadilloApplication.Armadillo");
28
+ const ICDCIdentityListType = root.lookupType("waArmadilloICDC.ICDCIdentityList");
29
+ const SignedICDCIdentityListType = root.lookupType("waArmadilloICDC.SignedICDCIdentityList");
30
+ const ImageTransportType = root.lookupType("WAMediaTransport.ImageTransport");
31
+ const VideoTransportType = root.lookupType("WAMediaTransport.VideoTransport");
32
+ const AudioTransportType = root.lookupType("WAMediaTransport.AudioTransport");
33
+ const DocumentTransportType = root.lookupType("WAMediaTransport.DocumentTransport");
34
+ const StickerTransportType = root.lookupType("WAMediaTransport.StickerTransport");
35
+
36
+ export function decodeMessageTransport(buffer: Buffer): any {
37
+ const msg = MsgTransportType.decode(buffer);
38
+ return MsgTransportType.toObject(msg, { longs: Number, enums: String, bytes: Buffer });
39
+ }
40
+
41
+ export function decodeMessageApplication(buffer: Buffer): any {
42
+ const msg = MsgApplicationType.decode(buffer);
43
+ return MsgApplicationType.toObject(msg, { longs: Number, enums: String, bytes: Buffer });
44
+ }
45
+
46
+ export function decodeConsumerApplication(buffer: Buffer): any {
47
+ const msg = ConsumerAppType.decode(buffer);
48
+ return ConsumerAppType.toObject(msg, { longs: String, enums: String, bytes: Buffer });
49
+ }
50
+
51
+ export function decodeArmadillo(buffer: Buffer): any {
52
+ const msg = ArmadilloAppType.decode(buffer);
53
+ return ArmadilloAppType.toObject(msg, { longs: String, enums: String, bytes: Buffer });
54
+ }
55
+
56
+ export function decodeImageTransport(buffer: Buffer): any {
57
+ const msg = ImageTransportType.decode(buffer);
58
+ return ImageTransportType.toObject(msg, { longs: Number, enums: String, bytes: Buffer });
59
+ }
60
+
61
+ export function decodeVideoTransport(buffer: Buffer): any {
62
+ const msg = VideoTransportType.decode(buffer);
63
+ return VideoTransportType.toObject(msg, { longs: Number, enums: String, bytes: Buffer });
64
+ }
65
+
66
+ export function decodeAudioTransport(buffer: Buffer): any {
67
+ const msg = AudioTransportType.decode(buffer);
68
+ return AudioTransportType.toObject(msg, { longs: Number, enums: String, bytes: Buffer });
69
+ }
70
+
71
+ export function decodeDocumentTransport(buffer: Buffer): any {
72
+ const msg = DocumentTransportType.decode(buffer);
73
+ return DocumentTransportType.toObject(msg, { longs: Number, enums: String, bytes: Buffer });
74
+ }
75
+
76
+ export function decodeStickerTransport(buffer: Buffer): any {
77
+ const msg = StickerTransportType.decode(buffer);
78
+ return StickerTransportType.toObject(msg, { longs: Number, enums: String, bytes: Buffer });
79
+ }
80
+
81
+ export function encodeICDCIdentityList(data: {
82
+ seq: number;
83
+ timestamp: number;
84
+ devices: Buffer[];
85
+ signingDeviceIndex: number;
86
+ }): Buffer {
87
+ const msg = ICDCIdentityListType.create(data);
88
+ return Buffer.from(ICDCIdentityListType.encode(msg).finish());
89
+ }
90
+
91
+ export function encodeSignedICDCIdentityList(data: {
92
+ details: Buffer;
93
+ signature: Buffer;
94
+ }): Buffer {
95
+ const msg = SignedICDCIdentityListType.create(data);
96
+ return Buffer.from(SignedICDCIdentityListType.encode(msg).finish());
97
+ }
98
+
99
+ export function decodeICDCFetchResponse(buffer: Buffer): any {
100
+ // Not a proto, but we might need it
101
+ }
@@ -0,0 +1,4 @@
1
+ export const FB_MESSAGE_VERSION = 3;
2
+ export const FB_MESSAGE_APPLICATION_VERSION = 2;
3
+ export const FB_CONSUMER_MESSAGE_VERSION = 1;
4
+ export const FB_ARMADILLO_MESSAGE_VERSION = 1;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Message layer public barrel.
3
+ *
4
+ * Keep imports here stable while implementations live under proto/, builders/,
5
+ * and codecs/. The top-level compatibility shim re-exports this barrel.
6
+ */
7
+
8
+ export type { MediaFields, MessageTransportOptions } from "../../models/e2ee.ts";
9
+ export * from "./constants.ts";
10
+ export { ProtoWriter } from "./proto/proto-writer.ts";
11
+ export * from "./builders/client-payload.ts";
12
+ export * from "./builders/consumer-application.ts";
13
+ export * from "./builders/message-application.ts";
14
+ export * from "./builders/message-transport.ts";
15
+ export * from "./codecs/protobuf-codecs.ts";
@@ -0,0 +1,281 @@
1
+ syntax = "proto2";
2
+ package waArmadilloApplication;
3
+
4
+ import "WACommon.proto";
5
+
6
+ message Armadillo {
7
+ message Metadata {
8
+ }
9
+
10
+ message Payload {
11
+ oneof payload {
12
+ Content content = 1;
13
+ ApplicationData applicationData = 2;
14
+ Signal signal = 3;
15
+ SubProtocolPayload subProtocol = 4;
16
+ }
17
+ }
18
+
19
+ message SubProtocolPayload {
20
+ optional WACommon.FutureProofBehavior futureProof = 1;
21
+ }
22
+
23
+ message Signal {
24
+ message EncryptedBackupsSecrets {
25
+ message Epoch {
26
+ enum EpochStatus {
27
+ ES_OPEN = 1;
28
+ ES_CLOSE = 2;
29
+ }
30
+
31
+ optional uint64 ID = 1;
32
+ optional bytes anonID = 2;
33
+ optional bytes rootKey = 3;
34
+ optional EpochStatus status = 4;
35
+ }
36
+
37
+ optional uint64 backupID = 1;
38
+ optional uint64 serverDataID = 2;
39
+ repeated Epoch epoch = 3;
40
+ optional bytes tempOcmfClientState = 4;
41
+ optional bytes mailboxRootKey = 5;
42
+ optional bytes obliviousValidationToken = 6;
43
+ }
44
+
45
+ oneof signal {
46
+ EncryptedBackupsSecrets encryptedBackupsSecrets = 1;
47
+ }
48
+ }
49
+
50
+ message ApplicationData {
51
+ message MessageHistoryDocumentMessage {
52
+ optional WACommon.SubProtocol document = 1;
53
+ }
54
+
55
+ message AIBotResponseMessage {
56
+ optional string summonToken = 1;
57
+ optional string messageText = 2;
58
+ optional string serializedExtras = 3;
59
+ }
60
+
61
+ message MetadataSyncAction {
62
+ message SyncAttachmentInterventionAction {
63
+ enum InterventionType {
64
+ UNKNOWN = 0;
65
+ NUDE = 1;
66
+ NOT_NUDE = 2;
67
+ }
68
+
69
+ optional WACommon.MessageKey messageKey = 1;
70
+ optional InterventionType interventionType = 2;
71
+ }
72
+
73
+ message SyncSpectraAction {
74
+ enum SpectraActionType {
75
+ TAKEDOWN = 0;
76
+ RESTORE = 1;
77
+ }
78
+
79
+ optional WACommon.MessageKey key = 1;
80
+ optional SpectraActionType actionType = 2;
81
+ optional int64 takedownActionID = 3;
82
+ optional string config = 4;
83
+ }
84
+
85
+ message SyncMessageAction {
86
+ message ActionMessageDelete {
87
+ }
88
+
89
+ oneof action {
90
+ ActionMessageDelete messageDelete = 101;
91
+ }
92
+
93
+ optional WACommon.MessageKey key = 1;
94
+ }
95
+
96
+ message SyncChatAction {
97
+ message ActionChatRead {
98
+ optional SyncActionMessageRange messageRange = 1;
99
+ optional bool read = 2;
100
+ }
101
+
102
+ message ActionChatDelete {
103
+ optional SyncActionMessageRange messageRange = 1;
104
+ }
105
+
106
+ message ActionChatArchive {
107
+ optional SyncActionMessageRange messageRange = 1;
108
+ optional bool archived = 2;
109
+ }
110
+
111
+ oneof action {
112
+ ActionChatArchive chatArchive = 101;
113
+ ActionChatDelete chatDelete = 102;
114
+ ActionChatRead chatRead = 103;
115
+ }
116
+
117
+ optional string chatID = 1;
118
+ }
119
+
120
+ message SyncActionMessage {
121
+ optional WACommon.MessageKey key = 1;
122
+ optional int64 timestamp = 2;
123
+ }
124
+
125
+ message SyncActionMessageRange {
126
+ optional int64 lastMessageTimestamp = 1;
127
+ optional int64 lastSystemMessageTimestamp = 2;
128
+ repeated SyncActionMessage messages = 3;
129
+ }
130
+
131
+ oneof actionType {
132
+ SyncChatAction chatAction = 101;
133
+ SyncMessageAction messageAction = 102;
134
+ SyncSpectraAction spectraAction = 103;
135
+ SyncAttachmentInterventionAction attachmentInterventionAction = 104;
136
+ }
137
+
138
+ optional int64 actionTimestamp = 1;
139
+ }
140
+
141
+ message MetadataSyncNotification {
142
+ repeated MetadataSyncAction actions = 2;
143
+ }
144
+
145
+ oneof applicationData {
146
+ MetadataSyncNotification metadataSync = 1;
147
+ AIBotResponseMessage aiBotResponse = 2;
148
+ MessageHistoryDocumentMessage messageHistoryDocumentMessage = 3;
149
+ }
150
+ }
151
+
152
+ message Content {
153
+ message PaymentsTransactionMessage {
154
+ enum PaymentStatus {
155
+ PAYMENT_UNKNOWN = 0;
156
+ REQUEST_INITED = 4;
157
+ REQUEST_DECLINED = 5;
158
+ REQUEST_TRANSFER_INITED = 6;
159
+ REQUEST_TRANSFER_COMPLETED = 7;
160
+ REQUEST_TRANSFER_FAILED = 8;
161
+ REQUEST_CANCELED = 9;
162
+ REQUEST_EXPIRED = 10;
163
+ TRANSFER_INITED = 11;
164
+ TRANSFER_PENDING = 12;
165
+ TRANSFER_PENDING_RECIPIENT_VERIFICATION = 13;
166
+ TRANSFER_CANCELED = 14;
167
+ TRANSFER_COMPLETED = 15;
168
+ TRANSFER_NO_RECEIVER_CREDENTIAL_NO_RTS_PENDING_CANCELED = 16;
169
+ TRANSFER_NO_RECEIVER_CREDENTIAL_NO_RTS_PENDING_OTHER = 17;
170
+ TRANSFER_REFUNDED = 18;
171
+ TRANSFER_PARTIAL_REFUND = 19;
172
+ TRANSFER_CHARGED_BACK = 20;
173
+ TRANSFER_EXPIRED = 21;
174
+ TRANSFER_DECLINED = 22;
175
+ TRANSFER_UNAVAILABLE = 23;
176
+ }
177
+
178
+ optional uint64 transactionID = 1;
179
+ optional string amount = 2;
180
+ optional string currency = 3;
181
+ optional PaymentStatus paymentStatus = 4;
182
+ // optional waArmadilloXMA.ExtendedContentMessage extendedContentMessage = 5;
183
+ }
184
+
185
+ message NetworkVerificationMessage {
186
+ optional string codeText = 1;
187
+ }
188
+
189
+ message NoteReplyMessage {
190
+ oneof noteReplyContent {
191
+ WACommon.MessageText textContent = 4;
192
+ WACommon.SubProtocol stickerContent = 5;
193
+ WACommon.SubProtocol videoContent = 6;
194
+ }
195
+
196
+ optional string noteID = 1;
197
+ optional WACommon.MessageText noteText = 2;
198
+ optional int64 noteTimestampMS = 3;
199
+ }
200
+
201
+ message BumpExistingMessage {
202
+ optional WACommon.MessageKey key = 1;
203
+ }
204
+
205
+ message ImageGalleryMessage {
206
+ repeated WACommon.SubProtocol images = 1;
207
+ }
208
+
209
+ message ScreenshotAction {
210
+ enum ScreenshotType {
211
+ SCREENSHOT_IMAGE = 1;
212
+ SCREEN_RECORDING = 2;
213
+ }
214
+
215
+ optional ScreenshotType screenshotType = 1;
216
+ }
217
+
218
+ message ExtendedContentMessageWithSear {
219
+ optional string searID = 1;
220
+ optional bytes payload = 2;
221
+ optional string nativeURL = 3;
222
+ optional WACommon.SubProtocol searAssociatedMessage = 4;
223
+ optional string searSentWithMessageID = 5;
224
+ }
225
+
226
+ message RavenActionNotifMessage {
227
+ enum ActionType {
228
+ PLAYED = 0;
229
+ SCREENSHOT = 1;
230
+ FORCE_DISABLE = 2;
231
+ }
232
+
233
+ optional WACommon.MessageKey key = 1;
234
+ optional int64 actionTimestamp = 2;
235
+ optional ActionType actionType = 3;
236
+ }
237
+
238
+ message RavenMessage {
239
+ enum EphemeralType {
240
+ VIEW_ONCE = 0;
241
+ ALLOW_REPLAY = 1;
242
+ KEEP_IN_CHAT = 2;
243
+ }
244
+
245
+ oneof mediaContent {
246
+ WACommon.SubProtocol imageMessage = 2;
247
+ WACommon.SubProtocol videoMessage = 3;
248
+ }
249
+
250
+ optional EphemeralType ephemeralType = 1;
251
+ }
252
+
253
+ message CommonSticker {
254
+ enum StickerType {
255
+ SMALL_LIKE = 1;
256
+ MEDIUM_LIKE = 2;
257
+ LARGE_LIKE = 3;
258
+ }
259
+
260
+ optional StickerType stickerType = 1;
261
+ }
262
+
263
+ oneof content {
264
+ CommonSticker commonSticker = 1;
265
+ ScreenshotAction screenshotAction = 3;
266
+ // waArmadilloXMA.ExtendedContentMessage extendedContentMessage = 4;
267
+ RavenMessage ravenMessage = 5;
268
+ RavenActionNotifMessage ravenActionNotifMessage = 6;
269
+ ExtendedContentMessageWithSear extendedMessageContentWithSear = 7;
270
+ ImageGalleryMessage imageGalleryMessage = 8;
271
+ PaymentsTransactionMessage paymentsTransactionMessage = 10;
272
+ BumpExistingMessage bumpExistingMessage = 11;
273
+ NoteReplyMessage noteReplyMessage = 13;
274
+ RavenMessage ravenMessageMsgr = 14;
275
+ NetworkVerificationMessage networkVerificationMessage = 15;
276
+ }
277
+ }
278
+
279
+ optional Payload payload = 1;
280
+ optional Metadata metadata = 2;
281
+ }
@@ -0,0 +1,14 @@
1
+ syntax = "proto2";
2
+ package waArmadilloICDC;
3
+
4
+ message ICDCIdentityList {
5
+ optional int32 seq = 1;
6
+ optional int64 timestamp = 2;
7
+ repeated bytes devices = 3;
8
+ optional int32 signingDeviceIndex = 4;
9
+ }
10
+
11
+ message SignedICDCIdentityList {
12
+ optional bytes details = 1;
13
+ optional bytes signature = 2;
14
+ }
@@ -0,0 +1,232 @@
1
+ syntax = "proto2";
2
+ package waConsumerApplication;
3
+
4
+ import "WACommon.proto";
5
+
6
+ message ConsumerApplication {
7
+ message Payload {
8
+ oneof payload {
9
+ Content content = 1;
10
+ ApplicationData applicationData = 2;
11
+ Signal signal = 3;
12
+ SubProtocolPayload subProtocol = 4;
13
+ }
14
+ }
15
+
16
+ message SubProtocolPayload {
17
+ optional WACommon.FutureProofBehavior futureProof = 1;
18
+ }
19
+
20
+ message Metadata {
21
+ enum SpecialTextSize {
22
+ SMALL = 1;
23
+ MEDIUM = 2;
24
+ LARGE = 3;
25
+ }
26
+
27
+ optional SpecialTextSize specialTextSize = 1;
28
+ }
29
+
30
+ message Signal {
31
+ }
32
+
33
+ message ApplicationData {
34
+ oneof applicationContent {
35
+ RevokeMessage revoke = 1;
36
+ }
37
+ }
38
+
39
+ message Content {
40
+ oneof content {
41
+ WACommon.MessageText messageText = 1;
42
+ ImageMessage imageMessage = 2;
43
+ ContactMessage contactMessage = 3;
44
+ LocationMessage locationMessage = 4;
45
+ ExtendedTextMessage extendedTextMessage = 5;
46
+ StatusTextMesage statusTextMessage = 6;
47
+ DocumentMessage documentMessage = 7;
48
+ AudioMessage audioMessage = 8;
49
+ VideoMessage videoMessage = 9;
50
+ ContactsArrayMessage contactsArrayMessage = 10;
51
+ LiveLocationMessage liveLocationMessage = 11;
52
+ StickerMessage stickerMessage = 12;
53
+ GroupInviteMessage groupInviteMessage = 13;
54
+ ViewOnceMessage viewOnceMessage = 14;
55
+ ReactionMessage reactionMessage = 16;
56
+ PollCreationMessage pollCreationMessage = 17;
57
+ PollUpdateMessage pollUpdateMessage = 18;
58
+ EditMessage editMessage = 19;
59
+ }
60
+ }
61
+
62
+ message EditMessage {
63
+ optional WACommon.MessageKey key = 1;
64
+ optional WACommon.MessageText message = 2;
65
+ optional int64 timestampMS = 3;
66
+ }
67
+
68
+ message PollAddOptionMessage {
69
+ repeated Option pollOption = 1;
70
+ }
71
+
72
+ message PollVoteMessage {
73
+ repeated bytes selectedOptions = 1;
74
+ optional int64 senderTimestampMS = 2;
75
+ }
76
+
77
+ message PollEncValue {
78
+ optional bytes encPayload = 1;
79
+ optional bytes encIV = 2;
80
+ }
81
+
82
+ message PollUpdateMessage {
83
+ optional WACommon.MessageKey pollCreationMessageKey = 1;
84
+ optional PollEncValue vote = 2;
85
+ optional PollEncValue addOption = 3;
86
+ }
87
+
88
+ message PollCreationMessage {
89
+ optional bytes encKey = 1;
90
+ optional string name = 2;
91
+ repeated Option options = 3;
92
+ optional uint32 selectableOptionsCount = 4;
93
+ }
94
+
95
+ message Option {
96
+ optional string optionName = 1;
97
+ }
98
+
99
+ message ReactionMessage {
100
+ optional WACommon.MessageKey key = 1;
101
+ optional string text = 2;
102
+ optional string groupingKey = 3;
103
+ optional int64 senderTimestampMS = 4;
104
+ optional string reactionMetadataDataclassData = 5;
105
+ optional int32 style = 6;
106
+ }
107
+
108
+ message RevokeMessage {
109
+ optional WACommon.MessageKey key = 1;
110
+ }
111
+
112
+ message ViewOnceMessage {
113
+ oneof viewOnceContent {
114
+ ImageMessage imageMessage = 1;
115
+ VideoMessage videoMessage = 2;
116
+ }
117
+ }
118
+
119
+ message GroupInviteMessage {
120
+ optional string groupJID = 1;
121
+ optional string inviteCode = 2;
122
+ optional int64 inviteExpiration = 3;
123
+ optional string groupName = 4;
124
+ optional bytes JPEGThumbnail = 5;
125
+ optional WACommon.MessageText caption = 6;
126
+ }
127
+
128
+ message LiveLocationMessage {
129
+ optional Location location = 1;
130
+ optional uint32 accuracyInMeters = 2;
131
+ optional float speedInMps = 3;
132
+ optional uint32 degreesClockwiseFromMagneticNorth = 4;
133
+ optional WACommon.MessageText caption = 5;
134
+ optional int64 sequenceNumber = 6;
135
+ optional uint32 timeOffset = 7;
136
+ }
137
+
138
+ message ContactsArrayMessage {
139
+ optional string displayName = 1;
140
+ repeated ContactMessage contacts = 2;
141
+ }
142
+
143
+ message ContactMessage {
144
+ optional WACommon.SubProtocol contact = 1;
145
+ }
146
+
147
+ message StatusTextMesage {
148
+ enum FontType {
149
+ SANS_SERIF = 0;
150
+ SERIF = 1;
151
+ NORICAN_REGULAR = 2;
152
+ BRYNDAN_WRITE = 3;
153
+ BEBASNEUE_REGULAR = 4;
154
+ OSWALD_HEAVY = 5;
155
+ }
156
+
157
+ optional ExtendedTextMessage text = 1;
158
+ optional fixed32 textArgb = 6;
159
+ optional fixed32 backgroundArgb = 7;
160
+ optional FontType font = 8;
161
+ }
162
+
163
+ message ExtendedTextMessage {
164
+ enum PreviewType {
165
+ NONE = 0;
166
+ VIDEO = 1;
167
+ }
168
+
169
+ optional WACommon.MessageText text = 1;
170
+ optional string matchedText = 2;
171
+ optional string canonicalURL = 3;
172
+ optional string description = 4;
173
+ optional string title = 5;
174
+ optional WACommon.SubProtocol thumbnail = 6;
175
+ optional PreviewType previewType = 7;
176
+ }
177
+
178
+ message LocationMessage {
179
+ optional Location location = 1;
180
+ optional string address = 2;
181
+ }
182
+
183
+ message StickerMessage {
184
+ optional WACommon.SubProtocol sticker = 1;
185
+ }
186
+
187
+ message DocumentMessage {
188
+ optional WACommon.SubProtocol document = 1;
189
+ optional string fileName = 2;
190
+ }
191
+
192
+ message VideoMessage {
193
+ optional WACommon.SubProtocol video = 1;
194
+ optional WACommon.MessageText caption = 2;
195
+ }
196
+
197
+ message AudioMessage {
198
+ optional WACommon.SubProtocol audio = 1;
199
+ optional bool PTT = 2;
200
+ }
201
+
202
+ message ImageMessage {
203
+ optional WACommon.SubProtocol image = 1;
204
+ optional WACommon.MessageText caption = 2;
205
+ }
206
+
207
+ message InteractiveAnnotation {
208
+ oneof action {
209
+ Location location = 2;
210
+ }
211
+
212
+ repeated Point polygonVertices = 1;
213
+ }
214
+
215
+ message Point {
216
+ optional double x = 1;
217
+ optional double y = 2;
218
+ }
219
+
220
+ message Location {
221
+ optional double degreesLatitude = 1;
222
+ optional double degreesLongitude = 2;
223
+ optional string name = 3;
224
+ }
225
+
226
+ message MediaPayload {
227
+ optional WACommon.SubProtocol protocol = 1;
228
+ }
229
+
230
+ optional Payload payload = 1;
231
+ optional Metadata metadata = 2;
232
+ }