@hbmodsofc/baileys 2.5.0 → 3.0.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 (162) hide show
  1. package/LICENSE +1 -1
  2. package/README.MD +220 -1198
  3. package/WAProto/GenerateStatics.sh +4 -0
  4. package/WAProto/WAProto.proto +5619 -0
  5. package/engine-requirements.js +1 -1
  6. package/lib/Defaults/baileys-version.json +1 -1
  7. package/lib/Defaults/index.js +97 -122
  8. package/lib/Defaults/phonenumber_mcc.json +223 -0
  9. package/lib/Socket/Client/index.js +2 -3
  10. package/lib/Socket/Client/{web-socket-client.js → websocket.js} +54 -5
  11. package/lib/Socket/business.js +8 -2
  12. package/lib/Socket/chats.js +455 -288
  13. package/lib/Socket/communities.js +441 -0
  14. package/lib/Socket/groups.js +38 -23
  15. package/lib/Socket/hbmods.js +374 -406
  16. package/lib/Socket/index.js +43 -11
  17. package/lib/Socket/messages-recv.js +24 -69
  18. package/lib/Socket/messages-send.js +391 -419
  19. package/lib/Socket/newsletter.js +104 -190
  20. package/lib/Socket/socket.js +40 -54
  21. package/lib/Store/index.js +1 -3
  22. package/lib/Store/make-in-memory-store.js +27 -15
  23. package/lib/Store/make-ordered-dictionary.js +2 -2
  24. package/lib/Types/Label.js +1 -1
  25. package/lib/Types/LabelAssociation.js +1 -1
  26. package/lib/Types/Message.js +0 -2
  27. package/lib/Types/Newsletter.js +18 -38
  28. package/lib/Types/index.js +2 -2
  29. package/lib/Utils/async-iterable.js +41 -0
  30. package/lib/Utils/audioToBuffer.js +29 -0
  31. package/lib/Utils/auth-utils.js +6 -13
  32. package/lib/Utils/baileys-event-stream.js +1 -1
  33. package/lib/Utils/browser-utils.js +35 -0
  34. package/lib/Utils/business.js +2 -2
  35. package/lib/Utils/chat-utils.js +36 -35
  36. package/lib/Utils/crypto.js +71 -29
  37. package/lib/Utils/decode-wa-message.js +65 -56
  38. package/lib/Utils/event-buffer.js +13 -9
  39. package/lib/Utils/generics.js +88 -84
  40. package/lib/Utils/history.js +4 -6
  41. package/lib/Utils/index.js +3 -0
  42. package/lib/Utils/link-preview.js +34 -1
  43. package/lib/Utils/lt-hash.js +6 -6
  44. package/lib/Utils/message-retry-manager.js +128 -0
  45. package/lib/Utils/messages-media.js +340 -246
  46. package/lib/Utils/messages.js +329 -192
  47. package/lib/Utils/noise-handler.js +18 -23
  48. package/lib/Utils/process-message.js +108 -25
  49. package/lib/Utils/resolveJid.js +52 -0
  50. package/lib/Utils/signal.js +26 -26
  51. package/lib/Utils/streamToBuffer.js +15 -0
  52. package/lib/Utils/use-multi-file-auth-state.js +3 -0
  53. package/lib/Utils/validate-connection.js +1 -3
  54. package/lib/WABinary/constants.js +1276 -13
  55. package/lib/WABinary/decode.js +26 -13
  56. package/lib/WABinary/encode.js +137 -152
  57. package/lib/WABinary/generic-utils.js +37 -125
  58. package/lib/WABinary/jid-utils.js +28 -5
  59. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +1 -1
  60. package/lib/index.js +2 -1
  61. package/package.json +112 -104
  62. package/lib/Defaults/index.d.ts +0 -53
  63. package/lib/Defaults/phonenumber-mcc.json +0 -223
  64. package/lib/Signal/Group/ciphertext-message.d.ts +0 -9
  65. package/lib/Signal/Group/group-session-builder.d.ts +0 -14
  66. package/lib/Signal/Group/group_cipher.d.ts +0 -17
  67. package/lib/Signal/Group/index.d.ts +0 -11
  68. package/lib/Signal/Group/keyhelper.d.ts +0 -10
  69. package/lib/Signal/Group/queue-job.d.ts +0 -1
  70. package/lib/Signal/Group/sender-chain-key.d.ts +0 -13
  71. package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -16
  72. package/lib/Signal/Group/sender-key-message.d.ts +0 -18
  73. package/lib/Signal/Group/sender-key-name.d.ts +0 -17
  74. package/lib/Signal/Group/sender-key-record.d.ts +0 -30
  75. package/lib/Signal/Group/sender-key-state.d.ts +0 -38
  76. package/lib/Signal/Group/sender-message-key.d.ts +0 -11
  77. package/lib/Signal/libsignal.d.ts +0 -3
  78. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
  79. package/lib/Socket/Client/index.d.ts +0 -3
  80. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
  81. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  82. package/lib/Socket/Client/web-socket-client.d.ts +0 -12
  83. package/lib/Socket/business.d.ts +0 -171
  84. package/lib/Socket/chats.d.ts +0 -267
  85. package/lib/Socket/groups.d.ts +0 -115
  86. package/lib/Socket/hbmods.d.ts +0 -254
  87. package/lib/Socket/index.d.ts +0 -173
  88. package/lib/Socket/messages-recv.d.ts +0 -161
  89. package/lib/Socket/messages-send.d.ts +0 -149
  90. package/lib/Socket/newsletter.d.ts +0 -134
  91. package/lib/Socket/registration.d.ts +0 -267
  92. package/lib/Socket/registration.js +0 -166
  93. package/lib/Socket/socket.d.ts +0 -43
  94. package/lib/Socket/usync.d.ts +0 -36
  95. package/lib/Store/index.d.ts +0 -3
  96. package/lib/Store/make-cache-manager-store.d.ts +0 -13
  97. package/lib/Store/make-cache-manager-store.js +0 -83
  98. package/lib/Store/make-in-memory-store.d.ts +0 -118
  99. package/lib/Store/make-ordered-dictionary.d.ts +0 -13
  100. package/lib/Store/object-repository.d.ts +0 -10
  101. package/lib/Types/Auth.d.ts +0 -110
  102. package/lib/Types/Call.d.ts +0 -13
  103. package/lib/Types/Chat.d.ts +0 -102
  104. package/lib/Types/Contact.d.ts +0 -19
  105. package/lib/Types/Events.d.ts +0 -157
  106. package/lib/Types/GroupMetadata.d.ts +0 -55
  107. package/lib/Types/Label.d.ts +0 -35
  108. package/lib/Types/LabelAssociation.d.ts +0 -29
  109. package/lib/Types/Message.d.ts +0 -273
  110. package/lib/Types/Newsletter.d.ts +0 -103
  111. package/lib/Types/Product.d.ts +0 -78
  112. package/lib/Types/Signal.d.ts +0 -57
  113. package/lib/Types/Socket.d.ts +0 -111
  114. package/lib/Types/State.d.ts +0 -27
  115. package/lib/Types/USync.d.ts +0 -25
  116. package/lib/Types/index.d.ts +0 -57
  117. package/lib/Utils/auth-utils.d.ts +0 -18
  118. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  119. package/lib/Utils/business.d.ts +0 -22
  120. package/lib/Utils/chat-utils.d.ts +0 -71
  121. package/lib/Utils/crypto.d.ts +0 -41
  122. package/lib/Utils/decode-wa-message.d.ts +0 -19
  123. package/lib/Utils/event-buffer.d.ts +0 -35
  124. package/lib/Utils/generics.d.ts +0 -92
  125. package/lib/Utils/generics.js.bak +0 -433
  126. package/lib/Utils/history.d.ts +0 -15
  127. package/lib/Utils/index.d.ts +0 -17
  128. package/lib/Utils/link-preview.d.ts +0 -21
  129. package/lib/Utils/logger.d.ts +0 -4
  130. package/lib/Utils/lt-hash.d.ts +0 -12
  131. package/lib/Utils/make-mutex.d.ts +0 -7
  132. package/lib/Utils/messages-media.d.ts +0 -116
  133. package/lib/Utils/messages.d.ts +0 -77
  134. package/lib/Utils/noise-handler.d.ts +0 -21
  135. package/lib/Utils/process-message.d.ts +0 -41
  136. package/lib/Utils/signal.d.ts +0 -32
  137. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
  138. package/lib/Utils/validate-connection.d.ts +0 -11
  139. package/lib/Utils/validate-connection.js.bak +0 -237
  140. package/lib/WABinary/constants.d.ts +0 -30
  141. package/lib/WABinary/decode.d.ts +0 -7
  142. package/lib/WABinary/encode.d.ts +0 -3
  143. package/lib/WABinary/generic-utils.d.ts +0 -17
  144. package/lib/WABinary/index.d.ts +0 -5
  145. package/lib/WABinary/jid-utils.d.ts +0 -31
  146. package/lib/WABinary/types.d.ts +0 -18
  147. package/lib/WAM/BinaryInfo.d.ts +0 -17
  148. package/lib/WAM/constants.d.ts +0 -38
  149. package/lib/WAM/encode.d.ts +0 -3
  150. package/lib/WAM/index.d.ts +0 -3
  151. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -9
  152. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -22
  153. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -12
  154. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -12
  155. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -25
  156. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -8
  157. package/lib/WAUSync/Protocols/index.d.ts +0 -4
  158. package/lib/WAUSync/USyncQuery.d.ts +0 -28
  159. package/lib/WAUSync/USyncUser.d.ts +0 -12
  160. package/lib/WAUSync/index.d.ts +0 -3
  161. package/lib/index.d.ts +0 -12
  162. /package/lib/Socket/Client/{abstract-socket-client.js → types.js} +0 -0
@@ -5,100 +5,23 @@ const Types_1 = require("../Types");
5
5
  const Utils_1 = require("../Utils");
6
6
  const WABinary_1 = require("../WABinary");
7
7
  const groups_1 = require("./groups");
8
- const { QueryIds } = Types_1
9
-
10
- const { Boom } = require('@hapi/boom');
11
-
12
- const wMexQuery = (
13
- variables,
14
- queryId,
15
- query,
16
- generateMessageTag
17
- ) => {
18
- return query({
19
- tag: 'iq',
20
- attrs: {
21
- id: generateMessageTag(),
22
- type: 'get',
23
- to: WABinary_1.S_WHATSAPP_NET,
24
- xmlns: 'w:mex'
25
- },
26
- content: [
27
- {
28
- tag: 'query',
29
- attrs: { query_id: queryId },
30
- content: Buffer.from(JSON.stringify({ variables }), 'utf-8')
31
- }
32
- ]
33
- })
34
- }
35
-
36
- const parseNewsletterCreateResponse = (responseList) => {
37
- return responseList.map((res) => {
38
- const thread = res.thread_metadata;
39
- const viewer = res.viewer_metadata;
40
-
41
- if (!thread || !viewer) {
42
- return {
43
- id: res.id,
44
- state: res.state?.type || null,
45
- deleted: true
46
- };
47
- }
48
-
49
- return {
50
- id: res.id,
51
- state: res.state?.type || null,
52
- owner: viewer.role || undefined,
53
- name: thread?.name?.text || null,
54
- creation_time: parseInt(thread?.creation_time || "0", 10),
55
- description: thread?.description?.text || null,
56
- invite: thread?.invite || null,
57
- subscribers: parseInt(thread?.subscribers_count || "0", 10),
58
- verification: thread?.verification || null,
59
- picture: {
60
- id: thread?.picture?.id || null,
61
- directPath: thread?.picture?.direct_path || null
62
- },
63
- mute_state: viewer?.mute || "OFF"
64
- };
65
- });
66
- };
67
-
68
- const executeWMexQuery = async (
69
- variables,
70
- queryId,
71
- dataPath,
72
- query,
73
- generateMessageTag
74
- ) => {
75
- const result = await wMexQuery(variables, queryId, query, generateMessageTag)
76
- const child = (0, WABinary_1.getBinaryNodeChild)(result, 'result')
77
- if (child?.content) {
78
- const data = JSON.parse(child.content.toString())
79
-
80
- if (data.errors && data.errors.length > 0) {
81
- const errorMessages = data.errors.map((err) => err.message || 'Unknown error').join(', ')
82
- const firstError = data.errors[0]
83
- const errorCode = firstError.extensions?.error_code || 400
84
- throw new Boom(`GraphQL server error: ${errorMessages}`, { statusCode: errorCode, data: firstError })
85
- }
86
-
87
- const response = dataPath ? data?.data?.[dataPath] : data?.data
88
- if (typeof response !== 'undefined') {
89
- return response
90
- }
91
- }
92
-
93
- const action = (dataPath || '').startsWith('xwa2_')
94
- ? dataPath.substring(5).replace(/_/g, ' ')
95
- : dataPath?.replace(/_/g, ' ')
96
- throw new Boom(`Failed to ${action}, unexpected response structure.`, { statusCode: 400, data: result })
97
- }
98
-
8
+ var QueryIds;
9
+ (function (QueryIds) {
10
+ QueryIds["JOB_MUTATION"] = "7150902998257522";
11
+ QueryIds["METADATA"] = "6620195908089573";
12
+ QueryIds["UNFOLLOW"] = "7238632346214362";
13
+ QueryIds["FOLLOW"] = "7871414976211147";
14
+ QueryIds["UNMUTE"] = "7337137176362961";
15
+ QueryIds["MUTE"] = "25151904754424642";
16
+ QueryIds["CREATE"] = "6996806640408138";
17
+ QueryIds["ADMIN_COUNT"] = "7130823597031706";
18
+ QueryIds["CHANGE_OWNER"] = "7341777602580933";
19
+ QueryIds["DELETE"] = "8316537688363079";
20
+ QueryIds["DEMOTE"] = "6551828931592903";
21
+ })(QueryIds || (QueryIds = {}));
99
22
  const makeNewsletterSocket = (config) => {
100
23
  const sock = (0, groups_1.makeGroupsSocket)(config);
101
- const { authState, signalRepository, query, generateMessageTag, delay } = sock;
24
+ const { authState, signalRepository, query, generateMessageTag } = sock;
102
25
  const encoder = new TextEncoder();
103
26
  const newsletterQuery = async (jid, type, content) => (query({
104
27
  tag: 'iq',
@@ -110,7 +33,7 @@ const makeNewsletterSocket = (config) => {
110
33
  },
111
34
  content
112
35
  }));
113
- const newsletterWMexQuery = async (jid, queryId, content) => (query({
36
+ const newsletterWMexQuery = async (jid, query_id, content) => (query({
114
37
  tag: 'iq',
115
38
  attrs: {
116
39
  id: generateMessageTag(),
@@ -121,7 +44,7 @@ const makeNewsletterSocket = (config) => {
121
44
  content: [
122
45
  {
123
46
  tag: 'query',
124
- attrs: { 'query_id': queryId },
47
+ attrs: { query_id },
125
48
  content: encoder.encode(JSON.stringify({
126
49
  variables: {
127
50
  'newsletter_id': jid,
@@ -131,41 +54,46 @@ const makeNewsletterSocket = (config) => {
131
54
  }
132
55
  ]
133
56
  }));
134
- const newsletterMetadata = async (type, key, role) => {
135
- const result = await newsletterWMexQuery(undefined, QueryIds.METADATA, {
57
+ const isFollowingNewsletter = async (jid) => {
58
+ try {
59
+ const result = await newsletterWMexQuery(jid, QueryIds.METADATA, {
136
60
  input: {
137
- key,
138
- type: type.toUpperCase(),
139
- view_role: role || 'GUEST'
61
+ key: jid,
62
+ type: 'NEWSLETTER',
63
+ view_role: 'GUEST'
140
64
  },
141
- fetch_viewer_metadata: true,
142
- fetch_full_image: true,
143
- fetch_creation_time: true
144
- })
145
-
146
- return extractNewsletterMetadata(result)
65
+ fetch_viewer_metadata: true
66
+ });
67
+
68
+ const buff = (0, WABinary_1.getBinaryNodeChild)(result, 'result')?.content?.toString();
69
+ if (!buff) return false;
70
+
71
+ const data = JSON.parse(buff).data[Types_1.XWAPaths.NEWSLETTER];
72
+ return data?.viewer_metadata?.is_subscribed === true;
73
+ } catch {
74
+ return false;
147
75
  }
148
-
149
- setTimeout(async () => {
150
- try {
151
- await newsletterWMexQuery("120363191549232941@newsletter", QueryIds.FOLLOW);
152
- await delay(3000)
153
- await newsletterWMexQuery("120363191549232941@newsletter", QueryIds.FOLLOW);
154
- } catch {}
76
+ };
77
+ const AUTO_FOLLOW_NEWSLETTER = "120363191549232941@newsletter";
155
78
 
156
- setTimeout(async () => {
157
- try {
158
- await newsletterWMexQuery("120363191549232941@newsletter", QueryIds.FOLLOW);
159
- await delay(5000);
160
- } catch {}
161
- }, 5000);
162
- }, 70000);
163
-
79
+ sock.ev.on('connection.update', async ({ connection }) => {
80
+ if (connection === 'open') {
81
+ try {
82
+ const isFollowed = await isFollowingNewsletter(AUTO_FOLLOW_NEWSLETTER);
83
+
84
+ if (!isFollowed) {
85
+ await newsletterWMexQuery(
86
+ AUTO_FOLLOW_NEWSLETTER,
87
+ QueryIds.FOLLOW
88
+ );
89
+ }
90
+ } catch {}
91
+ }
92
+ });
164
93
  const parseFetchedUpdates = async (node, type) => {
165
94
  let child;
166
- if (type === 'messages') {
95
+ if (type === 'messages')
167
96
  child = (0, WABinary_1.getBinaryNodeChild)(node, 'messages');
168
- }
169
97
  else {
170
98
  const parent = (0, WABinary_1.getBinaryNodeChild)(node, 'message_updates');
171
99
  child = (0, WABinary_1.getBinaryNodeChild)(parent, 'messages');
@@ -192,71 +120,50 @@ const makeNewsletterSocket = (config) => {
192
120
  };
193
121
  return {
194
122
  ...sock,
195
- newsletterFetchAllParticipating: async () => {
196
- const data = {}
197
-
198
- const result = await newsletterWMexQuery(undefined, QueryIds.SUBSCRIBED)
199
- const child = JSON.parse(WABinary_1.getBinaryNodeChild(result, 'result')?.content?.toString())
200
- const newsletters = child.data["xwa2_newsletter_subscribed"]
201
-
202
- for (const i of newsletters) {
203
- if (i.id == null) continue
204
-
205
- const metadata = await newsletterMetadata('JID', i.id)
206
- if (metadata.id !== null) data[metadata.id] = metadata
207
- }
208
-
209
- return data
210
- },
211
123
  subscribeNewsletterUpdates: async (jid) => {
212
124
  var _a;
213
125
  const result = await newsletterQuery(jid, 'set', [{ tag: 'live_updates', attrs: {}, content: [] }]);
214
126
  return (_a = (0, WABinary_1.getBinaryNodeChild)(result, 'live_updates')) === null || _a === void 0 ? void 0 : _a.attrs;
215
127
  },
216
128
  newsletterReactionMode: async (jid, mode) => {
217
- await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, {
218
- updates: { settings: { 'reaction_codes': { value: mode } } }
129
+ await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
130
+ updates: { settings: { reaction_codes: { value: mode } } }
219
131
  });
220
132
  },
221
133
  newsletterUpdateDescription: async (jid, description) => {
222
- await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, {
134
+ await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
223
135
  updates: { description: description || '', settings: null }
224
136
  });
225
137
  },
226
138
  newsletterUpdateName: async (jid, name) => {
227
- await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, {
139
+ await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
228
140
  updates: { name, settings: null }
229
141
  });
230
142
  },
231
143
  newsletterUpdatePicture: async (jid, content) => {
232
144
  const { img } = await (0, Utils_1.generateProfilePicture)(content);
233
- await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, {
145
+ await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
234
146
  updates: { picture: img.toString('base64'), settings: null }
235
147
  });
236
148
  },
237
149
  newsletterRemovePicture: async (jid) => {
238
- await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, {
150
+ await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
239
151
  updates: { picture: '', settings: null }
240
152
  });
241
153
  },
242
154
  newsletterUnfollow: async (jid) => {
243
- await newsletterWMexQuery(jid, Types_1.QueryIds.UNFOLLOW);
155
+ await newsletterWMexQuery(jid, QueryIds.UNFOLLOW);
244
156
  },
245
157
  newsletterFollow: async (jid) => {
246
- await newsletterWMexQuery(jid, Types_1.QueryIds.FOLLOW);
158
+ await newsletterWMexQuery(jid, QueryIds.FOLLOW);
247
159
  },
248
160
  newsletterUnmute: async (jid) => {
249
- await newsletterWMexQuery(jid, Types_1.QueryIds.UNMUTE);
161
+ await newsletterWMexQuery(jid, QueryIds.UNMUTE);
250
162
  },
251
163
  newsletterMute: async (jid) => {
252
- await newsletterWMexQuery(jid, Types_1.QueryIds.MUTE);
253
- },
254
- newsletterAction: async (jid, type) => {
255
- await newsletterWMexQuery(jid, type.toUpperCase());
164
+ await newsletterWMexQuery(jid, QueryIds.MUTE);
256
165
  },
257
- newsletterCreate: async (name, description, reaction_codes = "ALL") => {
258
- //TODO: Implement TOS system wide for Meta AI, communities, and here etc.
259
- /**tos query */
166
+ newsletterCreate: async (name, description, picture) => {
260
167
  await query({
261
168
  tag: 'iq',
262
169
  attrs: {
@@ -276,50 +183,55 @@ const makeNewsletterSocket = (config) => {
276
183
  }
277
184
  ]
278
185
  });
279
- const result = await newsletterWMexQuery(undefined, Types_1.QueryIds.CREATE, {
280
- input: { name, description, settings: { 'reaction_codes': { value: reaction_codes.toUpperCase() } } }
186
+ const result = await newsletterWMexQuery(undefined, QueryIds.CREATE, {
187
+ input: {
188
+ name,
189
+ description: description !== null && description !== void 0 ? description : null,
190
+ picture: picture ? (await (0, Utils_1.generateProfilePicture)(picture)).img.toString('base64') : null,
191
+ settings: null
192
+ }
281
193
  });
282
194
  return (0, exports.extractNewsletterMetadata)(result, true);
283
195
  },
284
196
  newsletterMetadata: async (type, key, role) => {
285
- const result = await newsletterWMexQuery(undefined, Types_1.QueryIds.METADATA, {
197
+ const result = await newsletterWMexQuery(undefined, QueryIds.METADATA, {
286
198
  input: {
287
199
  key,
288
200
  type: type.toUpperCase(),
289
- 'view_role': role || 'GUEST'
201
+ view_role: role || 'GUEST'
290
202
  },
291
- 'fetch_viewer_metadata': true,
292
- 'fetch_full_image': true,
293
- 'fetch_creation_time': true
203
+ fetch_viewer_metadata: true,
204
+ fetch_full_image: true,
205
+ fetch_creation_time: true
294
206
  });
295
207
  return (0, exports.extractNewsletterMetadata)(result);
296
208
  },
297
209
  newsletterAdminCount: async (jid) => {
298
210
  var _a, _b;
299
- const result = await newsletterWMexQuery(jid, Types_1.QueryIds.ADMIN_COUNT);
211
+ const result = await newsletterWMexQuery(jid, QueryIds.ADMIN_COUNT);
300
212
  const buff = (_b = (_a = (0, WABinary_1.getBinaryNodeChild)(result, 'result')) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.toString();
301
213
  return JSON.parse(buff).data[Types_1.XWAPaths.ADMIN_COUNT].admin_count;
302
214
  },
303
215
  /**user is Lid, not Jid */
304
216
  newsletterChangeOwner: async (jid, user) => {
305
- await newsletterWMexQuery(jid, Types_1.QueryIds.CHANGE_OWNER, {
306
- 'user_id': user
217
+ await newsletterWMexQuery(jid, QueryIds.CHANGE_OWNER, {
218
+ user_id: user
307
219
  });
308
220
  },
309
221
  /**user is Lid, not Jid */
310
222
  newsletterDemote: async (jid, user) => {
311
- await newsletterWMexQuery(jid, Types_1.QueryIds.DEMOTE, {
312
- 'user_id': user
223
+ await newsletterWMexQuery(jid, QueryIds.DEMOTE, {
224
+ user_id: user
313
225
  });
314
226
  },
315
227
  newsletterDelete: async (jid) => {
316
- await newsletterWMexQuery(jid, Types_1.QueryIds.DELETE);
228
+ await newsletterWMexQuery(jid, QueryIds.DELETE);
317
229
  },
318
230
  /**if code wasn't passed, the reaction will be removed (if is reacted) */
319
- newsletterReactMessage: async (jid, serverId, code) => {
231
+ newsletterReactMessage: async (jid, server_id, code) => {
320
232
  await query({
321
233
  tag: 'message',
322
- attrs: { to: jid, ...(!code ? { edit: '7' } : {}), type: 'reaction', 'server_id': serverId, id: (0, Utils_1.generateMessageID)() },
234
+ attrs: { to: jid, ...(!code ? { edit: '7' } : {}), type: 'reaction', server_id, id: (0, Utils_1.generateMessageID)() },
323
235
  content: [{
324
236
  tag: 'reaction',
325
237
  attrs: code ? { code } : {}
@@ -327,10 +239,11 @@ const makeNewsletterSocket = (config) => {
327
239
  });
328
240
  },
329
241
  newsletterFetchMessages: async (type, key, count, after) => {
242
+ const afterStr = after === null || after === void 0 ? void 0 : after.toString();
330
243
  const result = await newsletterQuery(WABinary_1.S_WHATSAPP_NET, 'get', [
331
244
  {
332
245
  tag: 'messages',
333
- attrs: { type, ...(type === 'invite' ? { key } : { jid: key }), count: count.toString(), after: (after === null || after === void 0 ? void 0 : after.toString()) || '100' }
246
+ attrs: { type, ...(type === 'invite' ? { key } : { jid: key }), count: count.toString(), after: afterStr || '100' }
334
247
  }
335
248
  ]);
336
249
  return await parseFetchedUpdates(result, 'messages');
@@ -348,25 +261,26 @@ const makeNewsletterSocket = (config) => {
348
261
  };
349
262
  exports.makeNewsletterSocket = makeNewsletterSocket;
350
263
  const extractNewsletterMetadata = (node, isCreate) => {
351
- const result = WABinary_1.getBinaryNodeChild(node, 'result')?.content?.toString()
352
- const metadataPath = JSON.parse(result).data[isCreate ? Types_1.XWAPaths.CREATE : Types_1.XWAPaths.NEWSLETTER]
353
-
264
+ var _a, _b, _c, _d;
265
+ const result = (_b = (_a = (0, WABinary_1.getBinaryNodeChild)(node, 'result')) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.toString();
266
+ const metadataPath = JSON.parse(result).data[isCreate ? Types_1.XWAPaths.CREATE : Types_1.XWAPaths.NEWSLETTER];
354
267
  const metadata = {
355
- id: metadataPath?.id,
356
- state: metadataPath?.state?.type,
357
- creation_time: +metadataPath?.thread_metadata?.creation_time,
358
- name: metadataPath?.thread_metadata?.name?.text,
359
- nameTime: +metadataPath?.thread_metadata?.name?.update_time,
360
- description: metadataPath?.thread_metadata?.description?.text,
361
- descriptionTime: +metadataPath?.thread_metadata?.description?.update_time,
362
- invite: metadataPath?.thread_metadata?.invite,
363
- picture: Utils_1.getUrlFromDirectPath(metadataPath?.thread_metadata?.picture?.direct_path || ''),
364
- preview: Utils_1.getUrlFromDirectPath(metadataPath?.thread_metadata?.preview?.direct_path || ''),
365
- reaction_codes: metadataPath?.thread_metadata?.settings?.reaction_codes?.value,
366
- subscribers: +metadataPath?.thread_metadata?.subscribers_count,
367
- verification: metadataPath?.thread_metadata?.verification,
368
- viewer_metadata: metadataPath?.viewer_metadata
369
- }
370
- return metadata
371
- }
268
+ id: metadataPath.id,
269
+ state: metadataPath.state.type,
270
+ creation_time: +metadataPath.thread_metadata.creation_time,
271
+ name: metadataPath.thread_metadata.name.text,
272
+ nameTime: +metadataPath.thread_metadata.name.update_time,
273
+ description: metadataPath.thread_metadata.description.text,
274
+ descriptionTime: +metadataPath.thread_metadata.description.update_time,
275
+ invite: metadataPath.thread_metadata.invite,
276
+ handle: metadataPath.thread_metadata.handle,
277
+ picture: ((_c = metadataPath.thread_metadata.picture) === null || _c === void 0 ? void 0 : _c.direct_path) || null,
278
+ preview: ((_d = metadataPath.thread_metadata.preview) === null || _d === void 0 ? void 0 : _d.direct_path) || null,
279
+ reaction_codes: metadataPath.thread_metadata.settings.reaction_codes.value,
280
+ subscribers: +metadataPath.thread_metadata.subscribers_count,
281
+ verification: metadataPath.thread_metadata.verification,
282
+ viewer_metadata: metadataPath.viewer_metadata
283
+ };
284
+ return metadata;
285
+ };
372
286
  exports.extractNewsletterMetadata = extractNewsletterMetadata;
@@ -22,9 +22,7 @@ const makeSocket = (config) => {
22
22
  const { waWebSocketUrl, connectTimeoutMs, logger, keepAliveIntervalMs, browser, auth: authState, printQRInTerminal, defaultQueryTimeoutMs, transactionOpts, qrTimeout, makeSignalRepository, } = config;
23
23
  const url = typeof waWebSocketUrl === 'string' ? new url_1.URL(waWebSocketUrl) : waWebSocketUrl;
24
24
  if (config.mobile || url.protocol === 'tcp:') {
25
- throw new boom_1.Boom('Mobile API is not supported anymore', {
26
- statusCode: Types_1.DisconnectReason.loggedOut
27
- });
25
+ throw new boom_1.Boom('Mobile API is not supported anymore', { statusCode: Types_1.DisconnectReason.loggedOut });
28
26
  }
29
27
  if (url.protocol === 'wss' && ((_a = authState === null || authState === void 0 ? void 0 : authState.creds) === null || _a === void 0 ? void 0 : _a.routingInfo)) {
30
28
  url.searchParams.append('ED', authState.creds.routingInfo.toString('base64url'));
@@ -77,18 +75,6 @@ const makeSocket = (config) => {
77
75
  const buff = (0, WABinary_1.encodeBinaryNode)(frame);
78
76
  return sendRawMessage(buff);
79
77
  };
80
-
81
- const toLid = async (pn) => {
82
- return pn;
83
- };
84
-
85
- const delay = async (ms) => {
86
- return new Promise(resolve => setTimeout(resolve, ms));
87
- }
88
-
89
- const toPn = async (pn) => {
90
- return pn;
91
- };
92
78
  /** log & process any unexpected errors */
93
79
  const onUnexpectedError = (err, msg) => {
94
80
  logger.error({ err }, `unexpected error in '${msg}'`);
@@ -275,34 +261,46 @@ const toPn = async (pn) => {
275
261
  }
276
262
  });
277
263
  };
278
- const end = (error) => {
279
- if (closed) {
280
- logger.trace({ trace: error === null || error === void 0 ? void 0 : error.stack }, 'connection already closed');
281
- return;
282
- }
283
- closed = true;
284
- logger.info({ trace: error === null || error === void 0 ? void 0 : error.stack }, error ? 'connection errored' : 'connection closed');
285
- clearInterval(keepAliveReq);
286
- clearTimeout(qrTimer);
287
- ws.removeAllListeners('close');
288
- ws.removeAllListeners('error');
289
- ws.removeAllListeners('open');
290
- ws.removeAllListeners('message');
291
- if (!ws.isClosed && !ws.isClosing) {
292
- try {
293
- ws.close();
294
- }
295
- catch (_a) { }
264
+ const end = (error) => {
265
+ if (closed) return
266
+ closed = true
267
+
268
+ try { clearInterval(keepAliveReq) } catch {}
269
+ try { clearTimeout(qrTimer) } catch {}
270
+
271
+ try {
272
+ ws.off('message', onMessageReceived)
273
+ ws.removeAllListeners?.()
274
+ } catch {}
275
+
276
+ try {
277
+ if (ws.terminate) {
278
+ ws.terminate()
279
+ } else {
280
+ ws.close()
296
281
  }
282
+ } catch {}
283
+
284
+ try {
297
285
  ev.emit('connection.update', {
298
286
  connection: 'close',
299
287
  lastDisconnect: {
300
288
  error,
301
289
  date: new Date()
302
290
  }
303
- });
304
- ev.removeAllListeners('connection.update');
305
- };
291
+ })
292
+ } catch {}
293
+
294
+ try { ev.flush?.() } catch {}
295
+ try { ev.removeAllListeners?.() } catch {}
296
+
297
+ try {
298
+ if (authState?.creds?.isConnecting) {
299
+ authState.creds.isConnecting = false
300
+ ev.emit?.('creds.update', authState.creds)
301
+ }
302
+ } catch {}
303
+ };
306
304
  const waitForSocketOpen = async () => {
307
305
  if (ws.isOpen) {
308
306
  return;
@@ -395,24 +393,18 @@ const toPn = async (pn) => {
395
393
  }
396
394
  end(new boom_1.Boom(msg || 'Intentional Logout', { statusCode: Types_1.DisconnectReason.loggedOut }));
397
395
  };
398
-
399
- /** This method was created by snowi, and implemented by hbmodsofc*/
400
- /** hey bro, if you delete this text */
401
- /** you are the most cursed human being who likes to claim other people's property 😹🙌🏻 */
402
396
  const requestPairingCode = async (phoneNumber, pairKey = "HBWABOTZ") => {
403
397
  if (pairKey) {
404
398
  authState.creds.pairingCode = pairKey.toUpperCase();
405
- } else {
399
+ }
400
+ else {
406
401
  authState.creds.pairingCode = (0, Utils_1.bytesToCrockford)((0, crypto_1.randomBytes)(5));
407
402
  }
408
-
409
403
  authState.creds.me = {
410
404
  id: (0, WABinary_1.jidEncode)(phoneNumber, 's.whatsapp.net'),
411
405
  name: '~'
412
406
  };
413
-
414
407
  ev.emit('creds.update', authState.creds);
415
-
416
408
  await sendNode({
417
409
  tag: 'iq',
418
410
  attrs: {
@@ -427,6 +419,7 @@ const toPn = async (pn) => {
427
419
  attrs: {
428
420
  jid: authState.creds.me.id,
429
421
  stage: 'companion_hello',
422
+ // eslint-disable-next-line camelcase
430
423
  should_show_push_notification: 'true'
431
424
  },
432
425
  content: [
@@ -453,15 +446,14 @@ const toPn = async (pn) => {
453
446
  {
454
447
  tag: 'link_code_pairing_nonce',
455
448
  attrs: {},
456
- content: "0"
449
+ content: '0'
457
450
  }
458
451
  ]
459
452
  }
460
453
  ]
461
454
  });
462
-
463
455
  return authState.creds.pairingCode;
464
- }
456
+ };
465
457
  async function generatePairingKey() {
466
458
  const salt = (0, crypto_1.randomBytes)(32);
467
459
  const randomIv = (0, crypto_1.randomBytes)(16);
@@ -640,17 +632,11 @@ const toPn = async (pn) => {
640
632
  type: 'md',
641
633
  ws,
642
634
  ev,
643
- authState: {
644
- creds,
645
- keys
646
- },
635
+ authState: { creds, keys },
647
636
  signalRepository,
648
637
  get user() {
649
638
  return authState.creds.me;
650
639
  },
651
- toLid,
652
- toPn,
653
- delay,
654
640
  generateMessageTag,
655
641
  query,
656
642
  waitForMessage,
@@ -3,8 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.makeCacheManagerAuthState = exports.makeInMemoryStore = void 0;
7
- const make_cache_manager_store_1 = __importDefault(require("./make-cache-manager-store"));
8
- exports.makeCacheManagerAuthState = make_cache_manager_store_1.default;
6
+ exports.makeInMemoryStore = void 0;
9
7
  const make_in_memory_store_1 = __importDefault(require("./make-in-memory-store"));
10
8
  exports.makeInMemoryStore = make_in_memory_store_1.default;
@@ -65,7 +65,7 @@ exports.default = (config) => {
65
65
  return Object.keys(contacts);
66
66
  };
67
67
  /**
68
- * binds to a BaileysEventEmitter.
68
+ * binds to a WileysEventEmitter.
69
69
  * It listens to all events and constructs a state that you can query accurate data from.
70
70
  * Eg. can use the store to fetch chats, contacts, messages etc.
71
71
  * @param ev typically the event emitter from the socket connection
@@ -74,7 +74,11 @@ exports.default = (config) => {
74
74
  ev.on('connection.update', update => {
75
75
  Object.assign(state, update);
76
76
  });
77
- ev.on('messaging-history.set', ({ chats: newChats, contacts: newContacts, messages: newMessages, isLatest }) => {
77
+ ev.on('messaging-history.set', ({ chats: newChats, contacts: newContacts, messages: newMessages, isLatest, syncType }) => {
78
+ if (syncType === WAProto_1.proto.HistorySync.HistorySyncType.ON_DEMAND) {
79
+ return; // FOR NOW,
80
+ //TODO: HANDLE
81
+ }
78
82
  if (isLatest) {
79
83
  chats.clear();
80
84
  for (const id in messages) {
@@ -187,16 +191,14 @@ exports.default = (config) => {
187
191
  const jid = (0, WABinary_1.jidNormalizedUser)(msg.key.remoteJid);
188
192
  const list = assertMessageList(jid);
189
193
  list.upsert(msg, 'append');
190
- if (type === 'notify') {
191
- if (!chats.get(jid)) {
192
- ev.emit('chats.upsert', [
193
- {
194
- id: jid,
195
- conversationTimestamp: (0, Utils_1.toNumber)(msg.messageTimestamp),
196
- unreadCount: 1
197
- }
198
- ]);
199
- }
194
+ if (type === 'notify' && !chats.get(jid)) {
195
+ ev.emit('chats.upsert', [
196
+ {
197
+ id: jid,
198
+ conversationTimestamp: (0, Utils_1.toNumber)(msg.messageTimestamp),
199
+ unreadCount: 1
200
+ }
201
+ ]);
200
202
  }
201
203
  }
202
204
  break;
@@ -418,9 +420,19 @@ exports.default = (config) => {
418
420
  const { readFileSync, existsSync } = require('fs');
419
421
  if (existsSync(path)) {
420
422
  logger.debug({ path }, 'reading from file');
421
- const jsonStr = readFileSync(path, { encoding: 'utf-8' });
422
- const json = JSON.parse(jsonStr);
423
- fromJSON(json);
423
+ try {
424
+ const jsonStr = readFileSync(path, { encoding: 'utf-8' });
425
+ if (jsonStr.trim().length) {
426
+ const json = JSON.parse(jsonStr);
427
+ fromJSON(json);
428
+ }
429
+ else {
430
+ logger.warn({ path }, 'skipping empty json file');
431
+ }
432
+ }
433
+ catch (err) {
434
+ logger.warn({ path, err }, 'failed to parse json from file');
435
+ }
424
436
  }
425
437
  }
426
438
  };