@periskope/baileys 6.7.18-alpha.4 → 6.7.18-alpha.5

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 (75) hide show
  1. package/README.md +1 -1
  2. package/WAProto/GenerateStatics.sh +2 -0
  3. package/WAProto/WAProto.proto +4633 -0
  4. package/lib/Signal/Group/ciphertext-message.d.ts +9 -0
  5. package/lib/Signal/Group/ciphertext-message.js +15 -0
  6. package/lib/Signal/Group/group-session-builder.d.ts +14 -0
  7. package/lib/Signal/Group/group-session-builder.js +64 -0
  8. package/lib/Signal/Group/group_cipher.d.ts +17 -0
  9. package/lib/Signal/Group/group_cipher.js +96 -0
  10. package/lib/Signal/Group/index.d.ts +11 -0
  11. package/lib/Signal/Group/index.js +57 -0
  12. package/lib/Signal/Group/keyhelper.d.ts +10 -0
  13. package/lib/Signal/Group/keyhelper.js +55 -0
  14. package/lib/Signal/Group/queue-job.d.ts +1 -0
  15. package/lib/Signal/Group/queue-job.js +57 -0
  16. package/lib/Signal/Group/sender-chain-key.d.ts +13 -0
  17. package/lib/Signal/Group/sender-chain-key.js +34 -0
  18. package/lib/Signal/Group/sender-key-distribution-message.d.ts +16 -0
  19. package/lib/Signal/Group/sender-key-distribution-message.js +66 -0
  20. package/lib/Signal/Group/sender-key-message.d.ts +18 -0
  21. package/lib/Signal/Group/sender-key-message.js +69 -0
  22. package/lib/Signal/Group/sender-key-name.d.ts +17 -0
  23. package/lib/Signal/Group/sender-key-name.js +51 -0
  24. package/lib/Signal/Group/sender-key-record.d.ts +30 -0
  25. package/lib/Signal/Group/sender-key-record.js +53 -0
  26. package/lib/Signal/Group/sender-key-state.d.ts +38 -0
  27. package/lib/Signal/Group/sender-key-state.js +99 -0
  28. package/lib/Signal/Group/sender-message-key.d.ts +11 -0
  29. package/{WASignalGroup/sender_message_key.js → lib/Signal/Group/sender-message-key.js} +29 -39
  30. package/lib/Signal/libsignal.js +28 -15
  31. package/lib/Socket/business.d.ts +29 -3
  32. package/lib/Socket/chats.d.ts +7 -5
  33. package/lib/Socket/chats.js +6 -4
  34. package/lib/Socket/groups.d.ts +7 -3
  35. package/lib/Socket/index.d.ts +29 -3
  36. package/lib/Socket/messages-recv.d.ts +29 -3
  37. package/lib/Socket/messages-recv.js +140 -0
  38. package/lib/Socket/messages-send.d.ts +29 -3
  39. package/lib/Socket/messages-send.js +28 -2
  40. package/lib/Socket/mex.d.ts +2 -0
  41. package/lib/Socket/mex.js +46 -0
  42. package/lib/Socket/newsletter.d.ts +139 -0
  43. package/lib/Socket/newsletter.js +183 -0
  44. package/lib/Socket/socket.d.ts +1 -1
  45. package/lib/Socket/socket.js +6 -2
  46. package/lib/Socket/usync.d.ts +1 -1
  47. package/lib/Types/Events.d.ts +26 -0
  48. package/lib/Types/Message.d.ts +8 -2
  49. package/lib/Types/Newsletter.d.ts +134 -0
  50. package/lib/Types/Newsletter.js +33 -0
  51. package/lib/Types/index.d.ts +1 -0
  52. package/lib/Types/index.js +1 -0
  53. package/lib/Utils/decode-wa-message.d.ts +3 -4
  54. package/lib/Utils/decode-wa-message.js +7 -2
  55. package/lib/Utils/generics.d.ts +1 -0
  56. package/lib/Utils/generics.js +4 -0
  57. package/lib/Utils/messages-media.d.ts +9 -1
  58. package/lib/Utils/messages-media.js +63 -28
  59. package/lib/Utils/messages.d.ts +2 -2
  60. package/lib/Utils/messages.js +39 -9
  61. package/package.json +2 -4
  62. package/WASignalGroup/GroupProtocol.js +0 -1697
  63. package/WASignalGroup/ciphertext_message.js +0 -16
  64. package/WASignalGroup/group_cipher.js +0 -120
  65. package/WASignalGroup/group_session_builder.js +0 -46
  66. package/WASignalGroup/index.js +0 -5
  67. package/WASignalGroup/keyhelper.js +0 -21
  68. package/WASignalGroup/protobufs.js +0 -3
  69. package/WASignalGroup/queue_job.js +0 -69
  70. package/WASignalGroup/sender_chain_key.js +0 -50
  71. package/WASignalGroup/sender_key_distribution_message.js +0 -78
  72. package/WASignalGroup/sender_key_message.js +0 -92
  73. package/WASignalGroup/sender_key_name.js +0 -70
  74. package/WASignalGroup/sender_key_record.js +0 -56
  75. package/WASignalGroup/sender_key_state.js +0 -129
@@ -38,6 +38,29 @@ declare const makeWASocket: (config: UserFacingSocketConfig) => {
38
38
  getUSyncDevices: (jids: string[], useCache: boolean, ignoreZeroDevices: boolean) => Promise<import("..").JidWithDevice[]>;
39
39
  updateMediaMessage: (message: import("../Types").WAProto.IWebMessageInfo) => Promise<import("../Types").WAProto.IWebMessageInfo>;
40
40
  sendMessage: (jid: string, content: import("../Types").AnyMessageContent, options?: import("../Types").MiscMessageGenerationOptions) => Promise<import("../Types").WAProto.WebMessageInfo | undefined>;
41
+ newsletterCreate: (name: string, description?: string) => Promise<import("../Types").NewsletterMetadata>;
42
+ newsletterUpdate: (jid: string, updates: import("../Types").NewsletterUpdate) => Promise<unknown>;
43
+ newsletterSubscribers: (jid: string) => Promise<{
44
+ subscribers: number;
45
+ }>;
46
+ newsletterMetadata: (type: "invite" | "jid", key: string) => Promise<import("../Types").NewsletterMetadata | null>;
47
+ newsletterFollow: (jid: string) => Promise<unknown>;
48
+ newsletterUnfollow: (jid: string) => Promise<unknown>;
49
+ newsletterMute: (jid: string) => Promise<unknown>;
50
+ newsletterUnmute: (jid: string) => Promise<unknown>;
51
+ newsletterUpdateName: (jid: string, name: string) => Promise<unknown>;
52
+ newsletterUpdateDescription: (jid: string, description: string) => Promise<unknown>;
53
+ newsletterUpdatePicture: (jid: string, content: import("../Types").WAMediaUpload) => Promise<unknown>;
54
+ newsletterRemovePicture: (jid: string) => Promise<unknown>;
55
+ newsletterReactMessage: (jid: string, serverId: string, reaction?: string) => Promise<void>;
56
+ newsletterFetchMessages: (jid: string, count: number, since: number, after: number) => Promise<any>;
57
+ subscribeNewsletterUpdates: (jid: string) => Promise<{
58
+ duration: string;
59
+ } | null>;
60
+ newsletterAdminCount: (jid: string) => Promise<number>;
61
+ newsletterChangeOwner: (jid: string, newOwnerJid: string) => Promise<void>;
62
+ newsletterDemote: (jid: string, userJid: string) => Promise<void>;
63
+ newsletterDelete: (jid: string) => Promise<void>;
41
64
  groupMetadata: (jid: string) => Promise<import("../Types").GroupMetadata>;
42
65
  groupCreate: (subject: string, participants: string[]) => Promise<import("../Types").GroupMetadata>;
43
66
  groupLeave: (id: string) => Promise<void>;
@@ -72,7 +95,7 @@ declare const makeWASocket: (config: UserFacingSocketConfig) => {
72
95
  processingMutex: {
73
96
  mutex<T>(code: () => Promise<T> | T): Promise<T>;
74
97
  };
75
- upsertMessage: (msg: import("../Types").WAProto.IWebMessageInfo, type: import("../Types").MessageUpsertType) => Promise<void>;
98
+ upsertMessage: (msg: import("../Types").WAMessage, type: import("../Types").MessageUpsertType) => Promise<void>;
76
99
  appPatch: (patchCreate: import("../Types").WAPatchCreate) => Promise<void>;
77
100
  sendPresenceUpdate: (type: import("../Types").WAPresence, toJid?: string) => Promise<void>;
78
101
  presenceSubscribe: (toJid: string, tcToken?: Buffer) => Promise<void>;
@@ -85,7 +108,10 @@ declare const makeWASocket: (config: UserFacingSocketConfig) => {
85
108
  fetchBlocklist: () => Promise<string[]>;
86
109
  fetchStatus: (...jids: string[]) => Promise<import("..").USyncQueryResultList[] | undefined>;
87
110
  fetchDisappearingDuration: (...jids: string[]) => Promise<import("..").USyncQueryResultList[] | undefined>;
88
- updateProfilePicture: (jid: string, content: import("../Types").WAMediaUpload) => Promise<void>;
111
+ updateProfilePicture: (jid: string, content: import("../Types").WAMediaUpload, dimensions?: {
112
+ width: number;
113
+ height: number;
114
+ }) => Promise<void>;
89
115
  removeProfilePicture: (jid: string) => Promise<void>;
90
116
  updateProfileStatus: (status: string) => Promise<void>;
91
117
  updateProfileName: (name: string) => Promise<void>;
@@ -139,7 +165,7 @@ declare const makeWASocket: (config: UserFacingSocketConfig) => {
139
165
  onUnexpectedError: (err: Error | import("@hapi/boom").Boom, msg: string) => void;
140
166
  uploadPreKeys: (count?: number) => Promise<void>;
141
167
  uploadPreKeysToServerIfRequired: () => Promise<void>;
142
- requestPairingCode: (phoneNumber: string) => Promise<string>;
168
+ requestPairingCode: (phoneNumber: string, customPairingCode?: string) => Promise<string>;
143
169
  waitForConnectionUpdate: (check: (u: Partial<import("../Types").ConnectionState>) => Promise<boolean | undefined>, timeoutMs?: number) => Promise<void>;
144
170
  sendWAMBuffer: (wamBuffer: Buffer) => Promise<any>;
145
171
  };
@@ -28,6 +28,29 @@ export declare const makeMessagesRecvSocket: (config: SocketConfig) => {
28
28
  getUSyncDevices: (jids: string[], useCache: boolean, ignoreZeroDevices: boolean) => Promise<import("../WABinary").JidWithDevice[]>;
29
29
  updateMediaMessage: (message: proto.IWebMessageInfo) => Promise<proto.IWebMessageInfo>;
30
30
  sendMessage: (jid: string, content: import("../Types").AnyMessageContent, options?: import("../Types").MiscMessageGenerationOptions) => Promise<proto.WebMessageInfo | undefined>;
31
+ newsletterCreate: (name: string, description?: string) => Promise<import("../Types").NewsletterMetadata>;
32
+ newsletterUpdate: (jid: string, updates: import("../Types").NewsletterUpdate) => Promise<unknown>;
33
+ newsletterSubscribers: (jid: string) => Promise<{
34
+ subscribers: number;
35
+ }>;
36
+ newsletterMetadata: (type: "invite" | "jid", key: string) => Promise<import("../Types").NewsletterMetadata | null>;
37
+ newsletterFollow: (jid: string) => Promise<unknown>;
38
+ newsletterUnfollow: (jid: string) => Promise<unknown>;
39
+ newsletterMute: (jid: string) => Promise<unknown>;
40
+ newsletterUnmute: (jid: string) => Promise<unknown>;
41
+ newsletterUpdateName: (jid: string, name: string) => Promise<unknown>;
42
+ newsletterUpdateDescription: (jid: string, description: string) => Promise<unknown>;
43
+ newsletterUpdatePicture: (jid: string, content: import("../Types").WAMediaUpload) => Promise<unknown>;
44
+ newsletterRemovePicture: (jid: string) => Promise<unknown>;
45
+ newsletterReactMessage: (jid: string, serverId: string, reaction?: string) => Promise<void>;
46
+ newsletterFetchMessages: (jid: string, count: number, since: number, after: number) => Promise<any>;
47
+ subscribeNewsletterUpdates: (jid: string) => Promise<{
48
+ duration: string;
49
+ } | null>;
50
+ newsletterAdminCount: (jid: string) => Promise<number>;
51
+ newsletterChangeOwner: (jid: string, newOwnerJid: string) => Promise<void>;
52
+ newsletterDemote: (jid: string, userJid: string) => Promise<void>;
53
+ newsletterDelete: (jid: string) => Promise<void>;
31
54
  groupMetadata: (jid: string) => Promise<import("../Types").GroupMetadata>;
32
55
  groupCreate: (subject: string, participants: string[]) => Promise<import("../Types").GroupMetadata>;
33
56
  groupLeave: (id: string) => Promise<void>;
@@ -62,7 +85,7 @@ export declare const makeMessagesRecvSocket: (config: SocketConfig) => {
62
85
  processingMutex: {
63
86
  mutex<T>(code: () => Promise<T> | T): Promise<T>;
64
87
  };
65
- upsertMessage: (msg: proto.IWebMessageInfo, type: import("../Types").MessageUpsertType) => Promise<void>;
88
+ upsertMessage: (msg: import("../Types").WAMessage, type: import("../Types").MessageUpsertType) => Promise<void>;
66
89
  appPatch: (patchCreate: import("../Types").WAPatchCreate) => Promise<void>;
67
90
  sendPresenceUpdate: (type: import("../Types").WAPresence, toJid?: string) => Promise<void>;
68
91
  presenceSubscribe: (toJid: string, tcToken?: Buffer) => Promise<void>;
@@ -75,7 +98,10 @@ export declare const makeMessagesRecvSocket: (config: SocketConfig) => {
75
98
  fetchBlocklist: () => Promise<string[]>;
76
99
  fetchStatus: (...jids: string[]) => Promise<import("..").USyncQueryResultList[] | undefined>;
77
100
  fetchDisappearingDuration: (...jids: string[]) => Promise<import("..").USyncQueryResultList[] | undefined>;
78
- updateProfilePicture: (jid: string, content: import("../Types").WAMediaUpload) => Promise<void>;
101
+ updateProfilePicture: (jid: string, content: import("../Types").WAMediaUpload, dimensions?: {
102
+ width: number;
103
+ height: number;
104
+ }) => Promise<void>;
79
105
  removeProfilePicture: (jid: string) => Promise<void>;
80
106
  updateProfileStatus: (status: string) => Promise<void>;
81
107
  updateProfileName: (name: string) => Promise<void>;
@@ -129,7 +155,7 @@ export declare const makeMessagesRecvSocket: (config: SocketConfig) => {
129
155
  onUnexpectedError: (err: Error | Boom, msg: string) => void;
130
156
  uploadPreKeys: (count?: number) => Promise<void>;
131
157
  uploadPreKeysToServerIfRequired: () => Promise<void>;
132
- requestPairingCode: (phoneNumber: string) => Promise<string>;
158
+ requestPairingCode: (phoneNumber: string, customPairingCode?: string) => Promise<string>;
133
159
  waitForConnectionUpdate: (check: (u: Partial<import("../Types").ConnectionState>) => Promise<boolean | undefined>, timeoutMs?: number) => Promise<void>;
134
160
  sendWAMBuffer: (wamBuffer: Buffer) => Promise<any>;
135
161
  };
@@ -327,6 +327,12 @@ const makeMessagesRecvSocket = (config) => {
327
327
  logger.debug({ jid }, 'got privacy token update');
328
328
  }
329
329
  break;
330
+ case 'newsletter':
331
+ await handleNewsletterNotification(node);
332
+ break;
333
+ case 'mex':
334
+ await handleMexNewsletterNotification(node);
335
+ break;
330
336
  case 'w:gp2':
331
337
  handleGroupNotification(node.attrs.participant, child, result);
332
338
  break;
@@ -903,6 +909,140 @@ const makeMessagesRecvSocket = (config) => {
903
909
  processNodeWithBuffer(node, identifier, exec);
904
910
  }
905
911
  };
912
+ // Handles newsletter notifications
913
+ async function handleNewsletterNotification(node) {
914
+ var _a;
915
+ const from = node.attrs.from;
916
+ const [child] = (0, WABinary_1.getAllBinaryNodeChildren)(node);
917
+ const author = node.attrs.participant;
918
+ logger.info({ from, child }, 'got newsletter notification');
919
+ switch (child.tag) {
920
+ case 'reaction':
921
+ const reactionUpdate = {
922
+ id: from,
923
+ server_id: child.attrs.message_id,
924
+ reaction: {
925
+ code: (0, WABinary_1.getBinaryNodeChildString)(child, 'reaction'),
926
+ count: 1
927
+ }
928
+ };
929
+ ev.emit('newsletter.reaction', reactionUpdate);
930
+ break;
931
+ case 'view':
932
+ const viewUpdate = {
933
+ id: from,
934
+ server_id: child.attrs.message_id,
935
+ count: parseInt(((_a = child.content) === null || _a === void 0 ? void 0 : _a.toString()) || '0', 10)
936
+ };
937
+ ev.emit('newsletter.view', viewUpdate);
938
+ break;
939
+ case 'participant':
940
+ const participantUpdate = {
941
+ id: from,
942
+ author,
943
+ user: child.attrs.jid,
944
+ action: child.attrs.action,
945
+ new_role: child.attrs.role
946
+ };
947
+ ev.emit('newsletter-participants.update', participantUpdate);
948
+ break;
949
+ case 'update':
950
+ const settingsNode = (0, WABinary_1.getBinaryNodeChild)(child, 'settings');
951
+ if (settingsNode) {
952
+ const update = {};
953
+ const nameNode = (0, WABinary_1.getBinaryNodeChild)(settingsNode, 'name');
954
+ if (nameNode === null || nameNode === void 0 ? void 0 : nameNode.content)
955
+ update.name = nameNode.content.toString();
956
+ const descriptionNode = (0, WABinary_1.getBinaryNodeChild)(settingsNode, 'description');
957
+ if (descriptionNode === null || descriptionNode === void 0 ? void 0 : descriptionNode.content)
958
+ update.description = descriptionNode.content.toString();
959
+ ev.emit('newsletter-settings.update', {
960
+ id: from,
961
+ update
962
+ });
963
+ }
964
+ break;
965
+ case 'message':
966
+ const plaintextNode = (0, WABinary_1.getBinaryNodeChild)(child, 'plaintext');
967
+ if (plaintextNode === null || plaintextNode === void 0 ? void 0 : plaintextNode.content) {
968
+ try {
969
+ const contentBuf = typeof plaintextNode.content === 'string'
970
+ ? Buffer.from(plaintextNode.content, 'binary')
971
+ : Buffer.from(plaintextNode.content);
972
+ const messageProto = WAProto_1.proto.Message.decode(contentBuf);
973
+ const fullMessage = WAProto_1.proto.WebMessageInfo.fromObject({
974
+ key: {
975
+ remoteJid: from,
976
+ id: child.attrs.message_id || child.attrs.server_id,
977
+ fromMe: false
978
+ },
979
+ message: messageProto,
980
+ messageTimestamp: +child.attrs.t
981
+ });
982
+ await upsertMessage(fullMessage, 'append');
983
+ logger.info('Processed plaintext newsletter message');
984
+ }
985
+ catch (error) {
986
+ logger.error({ error }, 'Failed to decode plaintext newsletter message');
987
+ }
988
+ }
989
+ break;
990
+ default:
991
+ logger.warn({ node }, 'Unknown newsletter notification');
992
+ break;
993
+ }
994
+ }
995
+ // Handles mex newsletter notifications
996
+ async function handleMexNewsletterNotification(node) {
997
+ const mexNode = (0, WABinary_1.getBinaryNodeChild)(node, 'mex');
998
+ if (!(mexNode === null || mexNode === void 0 ? void 0 : mexNode.content)) {
999
+ logger.warn({ node }, 'Invalid mex newsletter notification');
1000
+ return;
1001
+ }
1002
+ let data;
1003
+ try {
1004
+ data = JSON.parse(mexNode.content.toString());
1005
+ }
1006
+ catch (error) {
1007
+ logger.error({ err: error, node }, 'Failed to parse mex newsletter notification');
1008
+ return;
1009
+ }
1010
+ const operation = data === null || data === void 0 ? void 0 : data.operation;
1011
+ const updates = data === null || data === void 0 ? void 0 : data.updates;
1012
+ if (!updates || !operation) {
1013
+ logger.warn({ data }, 'Invalid mex newsletter notification content');
1014
+ return;
1015
+ }
1016
+ logger.info({ operation, updates }, 'got mex newsletter notification');
1017
+ switch (operation) {
1018
+ case 'NotificationNewsletterUpdate':
1019
+ for (const update of updates) {
1020
+ if (update.jid && update.settings && Object.keys(update.settings).length > 0) {
1021
+ ev.emit('newsletter-settings.update', {
1022
+ id: update.jid,
1023
+ update: update.settings
1024
+ });
1025
+ }
1026
+ }
1027
+ break;
1028
+ case 'NotificationNewsletterAdminPromote':
1029
+ for (const update of updates) {
1030
+ if (update.jid && update.user) {
1031
+ ev.emit('newsletter-participants.update', {
1032
+ id: update.jid,
1033
+ author: node.attrs.from,
1034
+ user: update.user,
1035
+ new_role: 'ADMIN',
1036
+ action: 'promote'
1037
+ });
1038
+ }
1039
+ }
1040
+ break;
1041
+ default:
1042
+ logger.info({ operation, data }, 'Unhandled mex newsletter notification');
1043
+ break;
1044
+ }
1045
+ }
906
1046
  // recv a message
907
1047
  ws.on('CB:message', (node) => {
908
1048
  processNode('message', node, 'processing message', handleMessage);
@@ -23,6 +23,29 @@ export declare const makeMessagesSocket: (config: SocketConfig) => {
23
23
  getUSyncDevices: (jids: string[], useCache: boolean, ignoreZeroDevices: boolean) => Promise<JidWithDevice[]>;
24
24
  updateMediaMessage: (message: proto.IWebMessageInfo) => Promise<proto.IWebMessageInfo>;
25
25
  sendMessage: (jid: string, content: AnyMessageContent, options?: MiscMessageGenerationOptions) => Promise<proto.WebMessageInfo | undefined>;
26
+ newsletterCreate: (name: string, description?: string) => Promise<import("../Types").NewsletterMetadata>;
27
+ newsletterUpdate: (jid: string, updates: import("../Types").NewsletterUpdate) => Promise<unknown>;
28
+ newsletterSubscribers: (jid: string) => Promise<{
29
+ subscribers: number;
30
+ }>;
31
+ newsletterMetadata: (type: "invite" | "jid", key: string) => Promise<import("../Types").NewsletterMetadata | null>;
32
+ newsletterFollow: (jid: string) => Promise<unknown>;
33
+ newsletterUnfollow: (jid: string) => Promise<unknown>;
34
+ newsletterMute: (jid: string) => Promise<unknown>;
35
+ newsletterUnmute: (jid: string) => Promise<unknown>;
36
+ newsletterUpdateName: (jid: string, name: string) => Promise<unknown>;
37
+ newsletterUpdateDescription: (jid: string, description: string) => Promise<unknown>;
38
+ newsletterUpdatePicture: (jid: string, content: import("../Types").WAMediaUpload) => Promise<unknown>;
39
+ newsletterRemovePicture: (jid: string) => Promise<unknown>;
40
+ newsletterReactMessage: (jid: string, serverId: string, reaction?: string) => Promise<void>;
41
+ newsletterFetchMessages: (jid: string, count: number, since: number, after: number) => Promise<any>;
42
+ subscribeNewsletterUpdates: (jid: string) => Promise<{
43
+ duration: string;
44
+ } | null>;
45
+ newsletterAdminCount: (jid: string) => Promise<number>;
46
+ newsletterChangeOwner: (jid: string, newOwnerJid: string) => Promise<void>;
47
+ newsletterDemote: (jid: string, userJid: string) => Promise<void>;
48
+ newsletterDelete: (jid: string) => Promise<void>;
26
49
  groupMetadata: (jid: string) => Promise<import("../Types").GroupMetadata>;
27
50
  groupCreate: (subject: string, participants: string[]) => Promise<import("../Types").GroupMetadata>;
28
51
  groupLeave: (id: string) => Promise<void>;
@@ -57,7 +80,7 @@ export declare const makeMessagesSocket: (config: SocketConfig) => {
57
80
  processingMutex: {
58
81
  mutex<T>(code: () => Promise<T> | T): Promise<T>;
59
82
  };
60
- upsertMessage: (msg: proto.IWebMessageInfo, type: import("../Types").MessageUpsertType) => Promise<void>;
83
+ upsertMessage: (msg: import("../Types").WAMessage, type: import("../Types").MessageUpsertType) => Promise<void>;
61
84
  appPatch: (patchCreate: import("../Types").WAPatchCreate) => Promise<void>;
62
85
  sendPresenceUpdate: (type: import("../Types").WAPresence, toJid?: string) => Promise<void>;
63
86
  presenceSubscribe: (toJid: string, tcToken?: Buffer) => Promise<void>;
@@ -70,7 +93,10 @@ export declare const makeMessagesSocket: (config: SocketConfig) => {
70
93
  fetchBlocklist: () => Promise<string[]>;
71
94
  fetchStatus: (...jids: string[]) => Promise<import("../WAUSync").USyncQueryResultList[] | undefined>;
72
95
  fetchDisappearingDuration: (...jids: string[]) => Promise<import("../WAUSync").USyncQueryResultList[] | undefined>;
73
- updateProfilePicture: (jid: string, content: import("../Types").WAMediaUpload) => Promise<void>;
96
+ updateProfilePicture: (jid: string, content: import("../Types").WAMediaUpload, dimensions?: {
97
+ width: number;
98
+ height: number;
99
+ }) => Promise<void>;
74
100
  removeProfilePicture: (jid: string) => Promise<void>;
75
101
  updateProfileStatus: (status: string) => Promise<void>;
76
102
  updateProfileName: (name: string) => Promise<void>;
@@ -124,7 +150,7 @@ export declare const makeMessagesSocket: (config: SocketConfig) => {
124
150
  onUnexpectedError: (err: Error | Boom, msg: string) => void;
125
151
  uploadPreKeys: (count?: number) => Promise<void>;
126
152
  uploadPreKeysToServerIfRequired: () => Promise<void>;
127
- requestPairingCode: (phoneNumber: string) => Promise<string>;
153
+ requestPairingCode: (phoneNumber: string, customPairingCode?: string) => Promise<string>;
128
154
  waitForConnectionUpdate: (check: (u: Partial<import("../Types").ConnectionState>) => Promise<boolean | undefined>, timeoutMs?: number) => Promise<void>;
129
155
  sendWAMBuffer: (wamBuffer: Buffer) => Promise<any>;
130
156
  };
@@ -13,9 +13,10 @@ const link_preview_1 = require("../Utils/link-preview");
13
13
  const WABinary_1 = require("../WABinary");
14
14
  const WAUSync_1 = require("../WAUSync");
15
15
  const groups_1 = require("./groups");
16
+ const newsletter_1 = require("./newsletter");
16
17
  const makeMessagesSocket = (config) => {
17
18
  const { logger, linkPreviewImageThumbnailWidth, generateHighQualityLinkPreview, options: axiosOptions, patchMessageBeforeSending, cachedGroupMetadata } = config;
18
- const sock = (0, groups_1.makeGroupsSocket)(config);
19
+ const sock = (0, newsletter_1.makeNewsletterSocket)((0, groups_1.makeGroupsSocket)(config));
19
20
  const { ev, authState, processingMutex, signalRepository, upsertMessage, query, fetchPrivacySettings, sendNode, groupMetadata, groupToggleEphemeral } = sock;
20
21
  const userDevicesCache = config.userDevicesCache ||
21
22
  new node_cache_1.default({
@@ -265,6 +266,7 @@ const makeMessagesSocket = (config) => {
265
266
  const isGroup = server === 'g.us';
266
267
  const isStatus = jid === statusJid;
267
268
  const isLid = server === 'lid';
269
+ const isNewsletter = server === 'newsletter';
268
270
  msgId = msgId || (0, Utils_1.generateMessageIDV2)((_a = sock.user) === null || _a === void 0 ? void 0 : _a.id);
269
271
  useUserDevicesCache = useUserDevicesCache !== false;
270
272
  useCachedGroupMetadata = useCachedGroupMetadata !== false && !isStatus;
@@ -276,7 +278,8 @@ const makeMessagesSocket = (config) => {
276
278
  deviceSentMessage: {
277
279
  destinationJid,
278
280
  message
279
- }
281
+ },
282
+ messageContextInfo: message.messageContextInfo
280
283
  };
281
284
  const extraAttrs = {};
282
285
  if (participant) {
@@ -295,6 +298,29 @@ const makeMessagesSocket = (config) => {
295
298
  if (mediaType) {
296
299
  extraAttrs['mediatype'] = mediaType;
297
300
  }
301
+ if (isNewsletter) {
302
+ // Patch message if needed, then encode as plaintext
303
+ const patched = patchMessageBeforeSending ? await patchMessageBeforeSending(message, []) : message;
304
+ const bytes = (0, Utils_1.encodeNewsletterMessage)(patched);
305
+ binaryNodeContent.push({
306
+ tag: 'plaintext',
307
+ attrs: {},
308
+ content: bytes
309
+ });
310
+ const stanza = {
311
+ tag: 'message',
312
+ attrs: {
313
+ to: jid,
314
+ id: msgId,
315
+ type: getMessageType(message),
316
+ ...(additionalAttributes || {})
317
+ },
318
+ content: binaryNodeContent
319
+ };
320
+ logger.debug({ msgId }, `sending newsletter message to ${jid}`);
321
+ await sendNode(stanza);
322
+ return;
323
+ }
298
324
  if ((_a = (0, Utils_1.normalizeMessageContent)(message)) === null || _a === void 0 ? void 0 : _a.pinInChatMessage) {
299
325
  extraAttrs['decrypt-fail'] = 'hide';
300
326
  }
@@ -0,0 +1,2 @@
1
+ import { BinaryNode } from '../WABinary';
2
+ export declare const executeWMexQuery: <T>(variables: Record<string, unknown>, queryId: string, dataPath: string, query: (node: BinaryNode) => Promise<BinaryNode>, generateMessageTag: () => string) => Promise<T>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeWMexQuery = void 0;
4
+ const boom_1 = require("@hapi/boom");
5
+ const WABinary_1 = require("../WABinary");
6
+ const wMexQuery = (variables, queryId, query, generateMessageTag) => {
7
+ return query({
8
+ tag: 'iq',
9
+ attrs: {
10
+ id: generateMessageTag(),
11
+ type: 'get',
12
+ to: WABinary_1.S_WHATSAPP_NET,
13
+ xmlns: 'w:mex'
14
+ },
15
+ content: [
16
+ {
17
+ tag: 'query',
18
+ attrs: { query_id: queryId },
19
+ content: Buffer.from(JSON.stringify({ variables }), 'utf-8')
20
+ }
21
+ ]
22
+ });
23
+ };
24
+ const executeWMexQuery = async (variables, queryId, dataPath, query, generateMessageTag) => {
25
+ var _a, _b;
26
+ const result = await wMexQuery(variables, queryId, query, generateMessageTag);
27
+ const child = (0, WABinary_1.getBinaryNodeChild)(result, 'result');
28
+ if (child === null || child === void 0 ? void 0 : child.content) {
29
+ const data = JSON.parse(child.content.toString());
30
+ if (data.errors && data.errors.length > 0) {
31
+ const errorMessages = data.errors.map((err) => err.message || 'Unknown error').join(', ');
32
+ const firstError = data.errors[0];
33
+ const errorCode = ((_a = firstError.extensions) === null || _a === void 0 ? void 0 : _a.error_code) || 400;
34
+ throw new boom_1.Boom(`GraphQL server error: ${errorMessages}`, { statusCode: errorCode, data: firstError });
35
+ }
36
+ const response = dataPath ? (_b = data === null || data === void 0 ? void 0 : data.data) === null || _b === void 0 ? void 0 : _b[dataPath] : data === null || data === void 0 ? void 0 : data.data;
37
+ if (typeof response !== 'undefined') {
38
+ return response;
39
+ }
40
+ }
41
+ const action = (dataPath || '').startsWith('xwa2_')
42
+ ? dataPath.substring(5).replace(/_/g, ' ')
43
+ : dataPath === null || dataPath === void 0 ? void 0 : dataPath.replace(/_/g, ' ');
44
+ throw new boom_1.Boom(`Failed to ${action}, unexpected response structure.`, { statusCode: 400, data: result });
45
+ };
46
+ exports.executeWMexQuery = executeWMexQuery;
@@ -0,0 +1,139 @@
1
+ import type { WAMediaUpload } from '../Types';
2
+ import { NewsletterMetadata, NewsletterUpdate } from '../Types';
3
+ import { GroupsSocket } from './groups';
4
+ export declare const makeNewsletterSocket: (sock: GroupsSocket) => {
5
+ newsletterCreate: (name: string, description?: string) => Promise<NewsletterMetadata>;
6
+ newsletterUpdate: (jid: string, updates: NewsletterUpdate) => Promise<unknown>;
7
+ newsletterSubscribers: (jid: string) => Promise<{
8
+ subscribers: number;
9
+ }>;
10
+ newsletterMetadata: (type: "invite" | "jid", key: string) => Promise<NewsletterMetadata | null>;
11
+ newsletterFollow: (jid: string) => Promise<unknown>;
12
+ newsletterUnfollow: (jid: string) => Promise<unknown>;
13
+ newsletterMute: (jid: string) => Promise<unknown>;
14
+ newsletterUnmute: (jid: string) => Promise<unknown>;
15
+ newsletterUpdateName: (jid: string, name: string) => Promise<unknown>;
16
+ newsletterUpdateDescription: (jid: string, description: string) => Promise<unknown>;
17
+ newsletterUpdatePicture: (jid: string, content: WAMediaUpload) => Promise<unknown>;
18
+ newsletterRemovePicture: (jid: string) => Promise<unknown>;
19
+ newsletterReactMessage: (jid: string, serverId: string, reaction?: string) => Promise<void>;
20
+ newsletterFetchMessages: (jid: string, count: number, since: number, after: number) => Promise<any>;
21
+ subscribeNewsletterUpdates: (jid: string) => Promise<{
22
+ duration: string;
23
+ } | null>;
24
+ newsletterAdminCount: (jid: string) => Promise<number>;
25
+ newsletterChangeOwner: (jid: string, newOwnerJid: string) => Promise<void>;
26
+ newsletterDemote: (jid: string, userJid: string) => Promise<void>;
27
+ newsletterDelete: (jid: string) => Promise<void>;
28
+ groupMetadata: (jid: string) => Promise<import("../Types").GroupMetadata>;
29
+ groupCreate: (subject: string, participants: string[]) => Promise<import("../Types").GroupMetadata>;
30
+ groupLeave: (id: string) => Promise<void>;
31
+ groupUpdateSubject: (jid: string, subject: string) => Promise<void>;
32
+ groupRequestParticipantsList: (jid: string) => Promise<{
33
+ [key: string]: string;
34
+ }[]>;
35
+ groupRequestParticipantsUpdate: (jid: string, participants: string[], action: "approve" | "reject") => Promise<{
36
+ status: string;
37
+ jid: string;
38
+ }[]>;
39
+ groupParticipantsUpdate: (jid: string, participants: string[], action: import("../Types").ParticipantAction) => Promise<{
40
+ status: string;
41
+ jid: string;
42
+ content: import("../WABinary").BinaryNode;
43
+ }[]>;
44
+ groupUpdateDescription: (jid: string, description?: string) => Promise<void>;
45
+ groupInviteCode: (jid: string) => Promise<string | undefined>;
46
+ groupRevokeInvite: (jid: string) => Promise<string | undefined>;
47
+ groupAcceptInvite: (code: string) => Promise<string | undefined>;
48
+ groupRevokeInviteV4: (groupJid: string, invitedJid: string) => Promise<boolean>;
49
+ groupAcceptInviteV4: (key: string | import("../Types").WAMessageKey, inviteMessage: import("../Types").WAProto.Message.IGroupInviteMessage) => Promise<any>;
50
+ groupGetInviteInfo: (code: string) => Promise<import("../Types").GroupMetadata>;
51
+ groupToggleEphemeral: (jid: string, ephemeralExpiration: number) => Promise<void>;
52
+ groupSettingUpdate: (jid: string, setting: "announcement" | "not_announcement" | "locked" | "unlocked") => Promise<void>;
53
+ groupMemberAddMode: (jid: string, mode: "admin_add" | "all_member_add") => Promise<void>;
54
+ groupJoinApprovalMode: (jid: string, mode: "on" | "off") => Promise<void>;
55
+ groupFetchAllParticipating: () => Promise<{
56
+ [_: string]: import("../Types").GroupMetadata;
57
+ }>;
58
+ getBotListV2: () => Promise<import("../Types").BotListInfo[]>;
59
+ processingMutex: {
60
+ mutex<T>(code: () => Promise<T> | T): Promise<T>;
61
+ };
62
+ fetchPrivacySettings: (force?: boolean) => Promise<{
63
+ [_: string]: string;
64
+ }>;
65
+ upsertMessage: (msg: import("../Types").WAMessage, type: import("../Types").MessageUpsertType) => Promise<void>;
66
+ appPatch: (patchCreate: import("../Types").WAPatchCreate) => Promise<void>;
67
+ sendPresenceUpdate: (type: import("../Types").WAPresence, toJid?: string) => Promise<void>;
68
+ presenceSubscribe: (toJid: string, tcToken?: Buffer) => Promise<void>;
69
+ profilePictureUrl: (jid: string, type?: "preview" | "image", timeoutMs?: number) => Promise<string | undefined>;
70
+ onWhatsApp: (...jids: string[]) => Promise<{
71
+ jid: string;
72
+ exists: unknown;
73
+ lid: unknown;
74
+ }[] | undefined>;
75
+ fetchBlocklist: () => Promise<string[]>;
76
+ fetchStatus: (...jids: string[]) => Promise<import("..").USyncQueryResultList[] | undefined>;
77
+ fetchDisappearingDuration: (...jids: string[]) => Promise<import("..").USyncQueryResultList[] | undefined>;
78
+ updateProfilePicture: (jid: string, content: WAMediaUpload, dimensions?: {
79
+ width: number;
80
+ height: number;
81
+ }) => Promise<void>;
82
+ removeProfilePicture: (jid: string) => Promise<void>;
83
+ updateProfileStatus: (status: string) => Promise<void>;
84
+ updateProfileName: (name: string) => Promise<void>;
85
+ updateBlockStatus: (jid: string, action: "block" | "unblock") => Promise<void>;
86
+ updateCallPrivacy: (value: import("../Types").WAPrivacyCallValue) => Promise<void>;
87
+ updateMessagesPrivacy: (value: import("../Types").WAPrivacyMessagesValue) => Promise<void>;
88
+ updateLastSeenPrivacy: (value: import("../Types").WAPrivacyValue) => Promise<void>;
89
+ updateOnlinePrivacy: (value: import("../Types").WAPrivacyOnlineValue) => Promise<void>;
90
+ updateProfilePicturePrivacy: (value: import("../Types").WAPrivacyValue) => Promise<void>;
91
+ updateStatusPrivacy: (value: import("../Types").WAPrivacyValue) => Promise<void>;
92
+ updateReadReceiptsPrivacy: (value: import("../Types").WAReadReceiptsValue) => Promise<void>;
93
+ updateGroupsAddPrivacy: (value: import("../Types").WAPrivacyGroupAddValue) => Promise<void>;
94
+ updateDefaultDisappearingMode: (duration: number) => Promise<void>;
95
+ getBusinessProfile: (jid: string) => Promise<import("../Types").WABusinessProfile | void>;
96
+ resyncAppState: (collections: readonly ("critical_unblock_low" | "regular_high" | "regular_low" | "critical_block" | "regular")[], isInitialSync: boolean) => Promise<void>;
97
+ chatModify: (mod: import("../Types").ChatModification, jid: string) => Promise<void>;
98
+ cleanDirtyBits: (type: "account_sync" | "groups", fromTimestamp?: number | string) => Promise<void>;
99
+ addLabel: (jid: string, labels: import("../Types/Label").LabelActionBody) => Promise<void>;
100
+ addChatLabel: (jid: string, labelId: string) => Promise<void>;
101
+ removeChatLabel: (jid: string, labelId: string) => Promise<void>;
102
+ addMessageLabel: (jid: string, messageId: string, labelId: string) => Promise<void>;
103
+ removeMessageLabel: (jid: string, messageId: string, labelId: string) => Promise<void>;
104
+ star: (jid: string, messages: {
105
+ id: string;
106
+ fromMe?: boolean;
107
+ }[], star: boolean) => Promise<void>;
108
+ executeUSyncQuery: (usyncQuery: import("..").USyncQuery) => Promise<import("..").USyncQueryResult | undefined>;
109
+ type: "md";
110
+ ws: import("./Client").WebSocketClient;
111
+ ev: import("../Types").BaileysEventEmitter & {
112
+ process(handler: (events: Partial<import("../Types").BaileysEventMap>) => void | Promise<void>): () => void;
113
+ buffer(): void;
114
+ createBufferedFunction<A extends any[], T>(work: (...args: A) => Promise<T>): (...args: A) => Promise<T>;
115
+ flush(force?: boolean): boolean;
116
+ isBuffering(): boolean;
117
+ };
118
+ authState: {
119
+ creds: import("../Types").AuthenticationCreds;
120
+ keys: import("../Types").SignalKeyStoreWithTransaction;
121
+ };
122
+ signalRepository: import("../Types").SignalRepository;
123
+ user: import("../Types").Contact | undefined;
124
+ generateMessageTag: () => string;
125
+ query: (node: import("../WABinary").BinaryNode, timeoutMs?: number) => Promise<any>;
126
+ waitForMessage: <T>(msgId: string, timeoutMs?: number | undefined) => Promise<any>;
127
+ waitForSocketOpen: () => Promise<void>;
128
+ sendRawMessage: (data: Uint8Array | Buffer) => Promise<void>;
129
+ sendNode: (frame: import("../WABinary").BinaryNode) => Promise<void>;
130
+ logout: (msg?: string) => Promise<void>;
131
+ end: (error: Error | undefined) => void;
132
+ onUnexpectedError: (err: Error | import("@hapi/boom").Boom, msg: string) => void;
133
+ uploadPreKeys: (count?: number) => Promise<void>;
134
+ uploadPreKeysToServerIfRequired: () => Promise<void>;
135
+ requestPairingCode: (phoneNumber: string, customPairingCode?: string) => Promise<string>;
136
+ waitForConnectionUpdate: (check: (u: Partial<import("../Types").ConnectionState>) => Promise<boolean | undefined>, timeoutMs?: number) => Promise<void>;
137
+ sendWAMBuffer: (wamBuffer: Buffer) => Promise<any>;
138
+ };
139
+ export type NewsletterSocket = ReturnType<typeof makeNewsletterSocket>;