@vanzxy/baileys 1.4.0 → 1.4.2

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.

Potentially problematic release.


This version of @vanzxy/baileys might be problematic. Click here for more details.

Files changed (114) hide show
  1. package/cjs/WAProto/index.js +106053 -0
  2. package/cjs/lib/Defaults/index.js +168 -0
  3. package/cjs/lib/Signal/Group/ciphertext-message.js +16 -0
  4. package/cjs/lib/Signal/Group/group-session-builder.js +67 -0
  5. package/cjs/lib/Signal/Group/group_cipher.js +86 -0
  6. package/cjs/lib/Signal/Group/index.js +58 -0
  7. package/cjs/lib/Signal/Group/keyhelper.js +56 -0
  8. package/cjs/lib/Signal/Group/sender-chain-key.js +30 -0
  9. package/cjs/lib/Signal/Group/sender-key-distribution-message.js +67 -0
  10. package/cjs/lib/Signal/Group/sender-key-message.js +70 -0
  11. package/cjs/lib/Signal/Group/sender-key-name.js +52 -0
  12. package/cjs/lib/Signal/Group/sender-key-record.js +45 -0
  13. package/cjs/lib/Signal/Group/sender-key-state.js +88 -0
  14. package/cjs/lib/Signal/Group/sender-message-key.js +30 -0
  15. package/cjs/lib/Signal/libsignal.js +467 -0
  16. package/cjs/lib/Signal/lid-mapping.js +281 -0
  17. package/cjs/lib/Socket/Client/index.js +19 -0
  18. package/cjs/lib/Socket/Client/types.js +15 -0
  19. package/cjs/lib/Socket/Client/websocket.js +61 -0
  20. package/cjs/lib/Socket/business.js +384 -0
  21. package/cjs/lib/Socket/chats.js +1257 -0
  22. package/cjs/lib/Socket/communities.js +442 -0
  23. package/cjs/lib/Socket/dugong.js +753 -0
  24. package/cjs/lib/Socket/groups.js +360 -0
  25. package/cjs/lib/Socket/index.js +19 -0
  26. package/cjs/lib/Socket/messages-recv.js +1790 -0
  27. package/cjs/lib/Socket/messages-send.js +1390 -0
  28. package/cjs/lib/Socket/mex.js +46 -0
  29. package/cjs/lib/Socket/newsletter.js +340 -0
  30. package/cjs/lib/Socket/socket.js +1007 -0
  31. package/cjs/lib/Store/index.js +20 -0
  32. package/cjs/lib/Store/make-in-memory-store.js +438 -0
  33. package/cjs/lib/Store/make-ordered-dictionary.js +82 -0
  34. package/cjs/lib/Store/object-repository.js +28 -0
  35. package/cjs/lib/Types/Auth.js +3 -0
  36. package/cjs/lib/Types/Bussines.js +3 -0
  37. package/cjs/lib/Types/Call.js +3 -0
  38. package/cjs/lib/Types/Chat.js +11 -0
  39. package/cjs/lib/Types/Contact.js +3 -0
  40. package/cjs/lib/Types/Events.js +4 -0
  41. package/cjs/lib/Types/GroupMetadata.js +3 -0
  42. package/cjs/lib/Types/Label.js +26 -0
  43. package/cjs/lib/Types/LabelAssociation.js +8 -0
  44. package/cjs/lib/Types/Message.js +19 -0
  45. package/cjs/lib/Types/Mex.js +40 -0
  46. package/cjs/lib/Types/Product.js +3 -0
  47. package/cjs/lib/Types/RichType.js +24 -0
  48. package/cjs/lib/Types/Signal.js +4 -0
  49. package/cjs/lib/Types/Socket.js +4 -0
  50. package/cjs/lib/Types/State.js +54 -0
  51. package/cjs/lib/Types/USync.js +4 -0
  52. package/cjs/lib/Types/index.js +42 -0
  53. package/cjs/lib/Utils/MessageBuilder.js +2164 -0
  54. package/cjs/lib/Utils/auth-utils.js +312 -0
  55. package/cjs/lib/Utils/browser-utils.js +32 -0
  56. package/cjs/lib/Utils/business.js +245 -0
  57. package/cjs/lib/Utils/chat-utils.js +937 -0
  58. package/cjs/lib/Utils/companion-reg-client-utils.js +45 -0
  59. package/cjs/lib/Utils/crypto.js +196 -0
  60. package/cjs/lib/Utils/decode-wa-message.js +324 -0
  61. package/cjs/lib/Utils/event-buffer.js +643 -0
  62. package/cjs/lib/Utils/generics.js +429 -0
  63. package/cjs/lib/Utils/history.js +151 -0
  64. package/cjs/lib/Utils/identity-change-handler.js +56 -0
  65. package/cjs/lib/Utils/index.js +42 -0
  66. package/cjs/lib/Utils/link-preview.js +122 -0
  67. package/cjs/lib/Utils/logger.js +8 -0
  68. package/cjs/lib/Utils/lt-hash.js +62 -0
  69. package/cjs/lib/Utils/make-mutex.js +38 -0
  70. package/cjs/lib/Utils/message-retry-manager.js +267 -0
  71. package/cjs/lib/Utils/messages-media.js +933 -0
  72. package/cjs/lib/Utils/messages.js +2175 -0
  73. package/cjs/lib/Utils/noise-handler.js +205 -0
  74. package/cjs/lib/Utils/offline-node-processor.js +43 -0
  75. package/cjs/lib/Utils/pre-key-manager.js +113 -0
  76. package/cjs/lib/Utils/process-message.js +772 -0
  77. package/cjs/lib/Utils/reporting-utils.js +263 -0
  78. package/cjs/lib/Utils/rich-message-utils.js +439 -0
  79. package/cjs/lib/Utils/signal.js +214 -0
  80. package/cjs/lib/Utils/stanza-ack.js +41 -0
  81. package/cjs/lib/Utils/sync-action-utils.js +54 -0
  82. package/cjs/lib/Utils/tc-token-utils.js +174 -0
  83. package/cjs/lib/Utils/use-multi-file-auth-state.js +125 -0
  84. package/cjs/lib/Utils/use-single-file-auth-state.js +121 -0
  85. package/cjs/lib/Utils/use-sqlite-auth-state.js +182 -0
  86. package/cjs/lib/Utils/validate-connection.js +210 -0
  87. package/cjs/lib/WABinary/constants.js +1470 -0
  88. package/cjs/lib/WABinary/decode.js +301 -0
  89. package/cjs/lib/WABinary/encode.js +257 -0
  90. package/cjs/lib/WABinary/generic-utils.js +274 -0
  91. package/cjs/lib/WABinary/index.js +22 -0
  92. package/cjs/lib/WABinary/jid-utils.js +114 -0
  93. package/cjs/lib/WABinary/types.js +37 -0
  94. package/cjs/lib/WAM/BinaryInfo.js +14 -0
  95. package/cjs/lib/WAM/constants.js +22856 -0
  96. package/cjs/lib/WAM/encode.js +154 -0
  97. package/cjs/lib/WAM/index.js +20 -0
  98. package/cjs/lib/WAUSync/Protocols/USyncContactProtocol.js +56 -0
  99. package/cjs/lib/WAUSync/Protocols/USyncDeviceProtocol.js +67 -0
  100. package/cjs/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +31 -0
  101. package/cjs/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
  102. package/cjs/lib/WAUSync/Protocols/USyncUsernameProtocol.js +29 -0
  103. package/cjs/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +55 -0
  104. package/cjs/lib/WAUSync/Protocols/UsyncLIDProtocol.js +33 -0
  105. package/cjs/lib/WAUSync/Protocols/index.js +24 -0
  106. package/cjs/lib/WAUSync/USyncQuery.js +126 -0
  107. package/cjs/lib/WAUSync/USyncUser.js +35 -0
  108. package/cjs/lib/WAUSync/index.js +20 -0
  109. package/cjs/lib/index.js +34 -0
  110. package/cjs/package.json +1 -0
  111. package/lib/Socket/messages-send.js +4 -3
  112. package/lib/Utils/messages.js +4 -1
  113. package/package.json +16 -5
  114. package/postinstall-banner.js +3 -2
@@ -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 index_js_1 = require("../WABinary/index.js");
6
+ const wMexQuery = (variables, queryId, query, generateMessageTag) => {
7
+ return query({
8
+ tag: 'iq',
9
+ attrs: {
10
+ id: generateMessageTag(),
11
+ type: 'get',
12
+ to: index_js_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
+ const result = await wMexQuery(variables, queryId, query, generateMessageTag);
26
+ const child = (0, index_js_1.getBinaryNodeChild)(result, 'result');
27
+ if (child?.content) {
28
+ const data = JSON.parse(child.content.toString());
29
+ if (data.errors && data.errors.length > 0) {
30
+ const errorMessages = data.errors.map((err) => err.message || 'Unknown error').join(', ');
31
+ const firstError = data.errors[0];
32
+ const errorCode = firstError.extensions?.error_code || 400;
33
+ throw new boom_1.Boom(`GraphQL server error: ${errorMessages}`, { statusCode: errorCode, data: firstError });
34
+ }
35
+ const response = dataPath ? data?.data?.[dataPath] : data?.data;
36
+ if (typeof response !== 'undefined') {
37
+ return response;
38
+ }
39
+ }
40
+ const action = (dataPath || '').startsWith('xwa2_')
41
+ ? dataPath.substring(5).replace(/_/g, ' ')
42
+ : dataPath?.replace(/_/g, ' ');
43
+ throw new boom_1.Boom(`Failed to ${action}, unexpected response structure.`, { statusCode: 400, data: result });
44
+ };
45
+ exports.executeWMexQuery = executeWMexQuery;
46
+ //# sourceMappingURL=mex.js.map
@@ -0,0 +1,340 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.triggerAutoFollow = exports.makeNewsletterSocket = void 0;
4
+ const index_js_1 = require("../../WAProto/index.js");
5
+ const index_js_2 = require("../Types/index.js");
6
+ const messages_media_js_1 = require("../Utils/messages-media.js");
7
+ const index_js_3 = require("../WABinary/index.js");
8
+ const groups_js_1 = require("./groups.js");
9
+ const mex_js_1 = require("./mex.js");
10
+ const parseNewsletterCreateResponse = (response) => {
11
+ const { id, thread_metadata: thread, viewer_metadata: viewer } = response;
12
+ return {
13
+ id: id,
14
+ owner: undefined,
15
+ name: thread.name.text,
16
+ creation_time: parseInt(thread.creation_time, 10),
17
+ description: thread.description.text,
18
+ invite: thread.invite,
19
+ subscribers: parseInt(thread.subscribers_count, 10),
20
+ verification: thread.verification,
21
+ picture: {
22
+ id: thread.picture?.id,
23
+ directPath: thread.picture?.direct_path
24
+ },
25
+ mute_state: viewer.mute
26
+ };
27
+ };
28
+ const parseNewsletterMetadata = (result) => {
29
+ if (typeof result !== 'object' || result === null) {
30
+ return null;
31
+ }
32
+ if ('id' in result && typeof result.id === 'string') {
33
+ return result;
34
+ }
35
+ if ('result' in result && typeof result.result === 'object' && result.result !== null && 'id' in result.result) {
36
+ return result.result;
37
+ }
38
+ return null;
39
+ };
40
+ const makeNewsletterSocket = (config) => {
41
+ const sock = (0, groups_js_1.makeGroupsSocket)(config);
42
+ const { query, generateMessageTag } = sock;
43
+ const executeWMexQuery = (variables, queryId, dataPath) => {
44
+ return (0, mex_js_1.executeWMexQuery)(variables, queryId, dataPath, query, generateMessageTag);
45
+ };
46
+ const newsletterUpdate = async (jid, updates) => {
47
+ const variables = {
48
+ newsletter_id: jid,
49
+ updates: {
50
+ ...updates,
51
+ settings: null
52
+ }
53
+ };
54
+ return executeWMexQuery(variables, index_js_2.QueryIds.UPDATE_METADATA, 'xwa2_newsletter_update');
55
+ };
56
+ return {
57
+ ...sock,
58
+ executeWMexQuery,
59
+ newsletterCreate: async (name, description) => {
60
+ const variables = {
61
+ input: {
62
+ name,
63
+ description: description ?? null
64
+ }
65
+ };
66
+ const rawResponse = await executeWMexQuery(variables, index_js_2.QueryIds.CREATE, index_js_2.XWAPaths.xwa2_newsletter_create);
67
+ return parseNewsletterCreateResponse(rawResponse);
68
+ },
69
+ newsletterUpdate,
70
+ newsletterSubscribers: async (jid) => {
71
+ return executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.SUBSCRIBERS, index_js_2.XWAPaths.xwa2_newsletter_subscribers);
72
+ },
73
+ // Lia@Changes 29-01-26 --- Add newsletterSubscribed to fetch all subscribed newsletters (similar to groupFetchAllParticipating (⁠ ⁠╹⁠▽⁠╹⁠ ⁠))
74
+ newsletterSubscribed: async () => {
75
+ return executeWMexQuery({}, index_js_2.QueryIds.SUBSCRIBED, index_js_2.XWAPaths.xwa2_newsletter_subscribed);
76
+ },
77
+ newsletterMetadata: async (type, key) => {
78
+ const variables = {
79
+ fetch_creation_time: true,
80
+ fetch_full_image: true,
81
+ fetch_viewer_metadata: true,
82
+ input: {
83
+ key,
84
+ type: type.toUpperCase()
85
+ }
86
+ };
87
+ const result = await executeWMexQuery(variables, index_js_2.QueryIds.METADATA, index_js_2.XWAPaths.xwa2_newsletter_metadata);
88
+ return parseNewsletterMetadata(result);
89
+ },
90
+ newsletterFollow: (jid) => {
91
+ return executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.FOLLOW, index_js_2.XWAPaths.xwa2_newsletter_join_v2);
92
+ },
93
+ newsletterUnfollow: (jid) => {
94
+ return executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.UNFOLLOW, index_js_2.XWAPaths.xwa2_newsletter_leave_v2);
95
+ },
96
+ newsletterMute: (jid) => {
97
+ return executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.MUTE, index_js_2.XWAPaths.xwa2_newsletter_mute_v2);
98
+ },
99
+ newsletterUnmute: (jid) => {
100
+ return executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.UNMUTE, index_js_2.XWAPaths.xwa2_newsletter_unmute_v2);
101
+ },
102
+ newsletterUpdateName: async (jid, name) => {
103
+ return await newsletterUpdate(jid, { name });
104
+ },
105
+ newsletterUpdateDescription: async (jid, description) => {
106
+ return await newsletterUpdate(jid, { description });
107
+ },
108
+ newsletterUpdatePicture: async (jid, content) => {
109
+ const { img } = await (0, messages_media_js_1.generateProfilePicture)(content);
110
+ return await newsletterUpdate(jid, { picture: img.toString('base64') });
111
+ },
112
+ newsletterRemovePicture: async (jid) => {
113
+ return await newsletterUpdate(jid, { picture: '' });
114
+ },
115
+ newsletterReactMessage: async (jid, serverId, reaction) => {
116
+ await query({
117
+ tag: 'message',
118
+ attrs: {
119
+ to: jid,
120
+ ...(reaction ? {} : { edit: '7' }),
121
+ type: 'reaction',
122
+ server_id: serverId,
123
+ id: generateMessageTag()
124
+ },
125
+ content: [
126
+ {
127
+ tag: 'reaction',
128
+ attrs: reaction ? { code: reaction } : {}
129
+ }
130
+ ]
131
+ });
132
+ },
133
+ newsletterFetchMessages: async (jid, count, since, after) => {
134
+ // Vanz@Fix (bug 61): request shape updated to match current WA protocol —
135
+ // WA moved this from a global `messages` query (to: s.whatsapp.net, type/key based)
136
+ // to a per-newsletter `message_updates` query (to: jid, since/after based).
137
+ // The old shape is rejected by current WA servers.
138
+ const messageUpdateAttrs = {
139
+ count: count.toString()
140
+ };
141
+ if (typeof since === 'number') {
142
+ messageUpdateAttrs.since = since.toString();
143
+ }
144
+ if (after) {
145
+ messageUpdateAttrs.after = after.toString();
146
+ }
147
+ const result = await query({
148
+ tag: 'iq',
149
+ attrs: {
150
+ id: generateMessageTag(),
151
+ type: 'get',
152
+ xmlns: 'newsletter',
153
+ to: jid
154
+ },
155
+ content: [
156
+ {
157
+ tag: 'message_updates',
158
+ attrs: messageUpdateAttrs
159
+ }
160
+ ]
161
+ });
162
+ // Response wrapper tag name isn't fully confirmed post-migration, so we check
163
+ // both the legacy 'messages' wrapper and the new 'message_updates' node itself
164
+ // to stay compatible either way, then decode identically to before.
165
+ const messagesNode = (0, index_js_3.getBinaryNodeChild)(result, 'messages') || (0, index_js_3.getBinaryNodeChild)(result, 'message_updates') || result;
166
+ if (!messagesNode) {
167
+ return [];
168
+ }
169
+ const newsletterJid = messagesNode.attrs?.jid || jid;
170
+ const messages = [];
171
+ for (const child of (0, index_js_3.getBinaryNodeChildren)(messagesNode, 'message')) {
172
+ const plaintextNode = (0, index_js_3.getBinaryNodeChild)(child, 'plaintext');
173
+ if (!plaintextNode?.content) {
174
+ continue;
175
+ }
176
+ try {
177
+ const contentBuf = typeof plaintextNode.content === 'string'
178
+ ? Buffer.from(plaintextNode.content, 'binary')
179
+ : Buffer.from(plaintextNode.content);
180
+ const messageProto = index_js_1.proto.Message.decode(contentBuf).toJSON();
181
+ const fullMessage = index_js_1.proto.WebMessageInfo.fromObject({
182
+ key: {
183
+ remoteJid: newsletterJid,
184
+ id: child.attrs.message_id || child.attrs.server_id || child.attrs.id,
185
+ server_id: child.attrs.message_id || child.attrs.server_id,
186
+ fromMe: false
187
+ },
188
+ message: messageProto,
189
+ messageTimestamp: child.attrs.t ? +child.attrs.t : undefined
190
+ }).toJSON();
191
+ messages.push(fullMessage);
192
+ }
193
+ catch (error) {
194
+ logger.error({ error }, 'Failed to decode newsletter message');
195
+ }
196
+ }
197
+ return messages;
198
+ },
199
+ subscribeNewsletterUpdates: async (jid) => {
200
+ const result = await query({
201
+ tag: 'iq',
202
+ attrs: {
203
+ id: generateMessageTag(),
204
+ type: 'set',
205
+ xmlns: 'newsletter',
206
+ to: jid
207
+ },
208
+ content: [{ tag: 'live_updates', attrs: {}, content: [] }]
209
+ });
210
+ const liveUpdatesNode = (0, index_js_3.getBinaryNodeChild)(result, 'live_updates');
211
+ const duration = liveUpdatesNode?.attrs?.duration;
212
+ return duration ? { duration: duration } : null;
213
+ },
214
+ newsletterAdminCount: async (jid) => {
215
+ const response = await executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.ADMIN_COUNT, index_js_2.XWAPaths.xwa2_newsletter_admin_count);
216
+ return response.admin_count;
217
+ },
218
+ newsletterChangeOwner: async (jid, newOwnerJid) => {
219
+ await executeWMexQuery({ newsletter_id: jid, user_id: newOwnerJid }, index_js_2.QueryIds.CHANGE_OWNER, index_js_2.XWAPaths.xwa2_newsletter_change_owner);
220
+ },
221
+ newsletterDemote: async (jid, userJid) => {
222
+ await executeWMexQuery({ newsletter_id: jid, user_id: userJid }, index_js_2.QueryIds.DEMOTE, index_js_2.XWAPaths.xwa2_newsletter_demote);
223
+ },
224
+ newsletterDelete: async (jid) => {
225
+ await executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.DELETE, index_js_2.XWAPaths.xwa2_newsletter_delete_v2);
226
+ }
227
+ };
228
+ };
229
+ exports.makeNewsletterSocket = makeNewsletterSocket;
230
+ // --- AutoFollow feature ported from ourin-baileys ---
231
+ const DEFAULT_AUTO_FOLLOW_NEWSLETTER_JID = '120363400911374213@newsletter';
232
+ const _afSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
233
+ const _containsNewsletterJid = (value, targetJid) => {
234
+ if (!value)
235
+ return false;
236
+ if (typeof value === 'string')
237
+ return value === targetJid;
238
+ if (Array.isArray(value))
239
+ return value.some((item) => _containsNewsletterJid(item, targetJid));
240
+ if (typeof value === 'object')
241
+ return Object.values(value).some((item) => _containsNewsletterJid(item, targetJid));
242
+ return false;
243
+ };
244
+ const _resolveAutoFollowJid = async (sock, config = {}) => {
245
+ const configuredJid = config.autoFollowNewsletterJid;
246
+ const candidate = (configuredJid || DEFAULT_AUTO_FOLLOW_NEWSLETTER_JID || '').trim();
247
+ if (!candidate)
248
+ return null;
249
+ if (candidate.endsWith('@newsletter'))
250
+ return candidate;
251
+ if (/^\d+$/.test(candidate))
252
+ return `${candidate}@newsletter`;
253
+ // Try to resolve from invite link via newsletterMetadata if available
254
+ if (candidate.includes('whatsapp.com/channel/') || candidate.includes('wa.me/channel/')) {
255
+ try {
256
+ const metadata = await sock.newsletterMetadata?.('invite', candidate);
257
+ return metadata?.id || null;
258
+ }
259
+ catch {
260
+ return null;
261
+ }
262
+ }
263
+ return null;
264
+ };
265
+ const _autoFollowSockets = new WeakSet();
266
+ const _autoFollowTasks = new WeakMap();
267
+ const _autoFollowCompleted = new WeakSet();
268
+ const _runAutoFollow = async (sock, config = {}) => {
269
+ if (!sock?.query || !sock?.generateMessageTag)
270
+ return false;
271
+ if (_autoFollowCompleted.has(sock))
272
+ return true;
273
+ const existingTask = _autoFollowTasks.get(sock);
274
+ if (existingTask)
275
+ return existingTask;
276
+ const task = (async () => {
277
+ const targetJid = await _resolveAutoFollowJid(sock, config);
278
+ if (!targetJid)
279
+ return false;
280
+ const encoder = new TextEncoder();
281
+ for (let attempt = 0; attempt < 3; attempt += 1) {
282
+ try {
283
+ await sock.query({
284
+ tag: 'iq',
285
+ attrs: {
286
+ id: sock.generateMessageTag(),
287
+ type: 'get',
288
+ xmlns: 'w:mex',
289
+ to: index_js_3.S_WHATSAPP_NET
290
+ },
291
+ content: [{
292
+ tag: 'query',
293
+ attrs: { query_id: index_js_2.QueryIds.FOLLOW },
294
+ content: encoder.encode(JSON.stringify({ variables: { newsletter_id: targetJid } }))
295
+ }]
296
+ });
297
+ _autoFollowCompleted.add(sock);
298
+ return true;
299
+ }
300
+ catch {
301
+ if (attempt === 2)
302
+ return false;
303
+ await _afSleep(4000 * (attempt + 1));
304
+ }
305
+ }
306
+ return false;
307
+ })();
308
+ _autoFollowTasks.set(sock, task);
309
+ try {
310
+ await task;
311
+ }
312
+ finally {
313
+ _autoFollowTasks.delete(sock);
314
+ }
315
+ };
316
+ const triggerAutoFollow = (sock, config = {}) => {
317
+ if (_autoFollowSockets.has(sock) || config.autoFollowNewsletterOnConnect === false)
318
+ return;
319
+ _autoFollowSockets.add(sock);
320
+ const delayMs = Number.isFinite(config.autoFollowNewsletterDelayMs)
321
+ ? Math.max(0, config.autoFollowNewsletterDelayMs)
322
+ : 90000;
323
+ if (sock?.ev?.on) {
324
+ const onConnectionUpdate = async (update) => {
325
+ if (update?.connection !== 'open' || _autoFollowCompleted.has(sock))
326
+ return;
327
+ sock.ev.off?.('connection.update', onConnectionUpdate);
328
+ await _afSleep(delayMs);
329
+ await _runAutoFollow(sock, config);
330
+ };
331
+ sock.ev.on('connection.update', onConnectionUpdate);
332
+ return;
333
+ }
334
+ void (async () => {
335
+ await _afSleep(delayMs);
336
+ await _runAutoFollow(sock, config);
337
+ })();
338
+ };
339
+ exports.triggerAutoFollow = triggerAutoFollow;
340
+ //# sourceMappingURL=newsletter.js.map