gifted-baileys 1.5.0 → 1.5.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 (222) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1429 -684
  3. package/package.json +11 -26
  4. package/src/Defaults/baileys-version.json +3 -0
  5. package/{lib → src}/Defaults/index.js +16 -8
  6. package/src/Defaults/index.ts +131 -0
  7. package/src/Defaults/phonenumber-mcc.json +223 -0
  8. package/src/Signal/libsignal.js +180 -0
  9. package/src/Signal/libsignal.ts +141 -0
  10. package/src/Socket/Client/abstract-socket-client.ts +19 -0
  11. package/src/Socket/Client/index.ts +3 -0
  12. package/src/Socket/Client/mobile-socket-client.js +78 -0
  13. package/src/Socket/Client/mobile-socket-client.ts +66 -0
  14. package/src/Socket/Client/web-socket-client.js +75 -0
  15. package/src/Socket/Client/web-socket-client.ts +57 -0
  16. package/{lib → src}/Socket/business.js +33 -27
  17. package/src/Socket/business.ts +281 -0
  18. package/{lib → src}/Socket/chats.js +197 -178
  19. package/src/Socket/chats.ts +1030 -0
  20. package/{lib → src}/Socket/groups.js +69 -79
  21. package/src/Socket/groups.ts +356 -0
  22. package/{lib → src}/Socket/index.js +1 -4
  23. package/src/Socket/index.ts +13 -0
  24. package/{lib → src}/Socket/messages-recv.js +160 -108
  25. package/src/Socket/messages-recv.ts +985 -0
  26. package/{lib → src}/Socket/messages-send.js +183 -100
  27. package/src/Socket/messages-send.ts +871 -0
  28. package/src/Socket/newsletter.js +227 -0
  29. package/src/Socket/newsletter.ts +282 -0
  30. package/{lib → src}/Socket/registration.js +55 -63
  31. package/src/Socket/registration.ts +250 -0
  32. package/{lib → src}/Socket/socket.js +107 -66
  33. package/src/Socket/socket.ts +777 -0
  34. package/src/Store/index.ts +3 -0
  35. package/{lib → src}/Store/make-cache-manager-store.js +34 -25
  36. package/src/Store/make-cache-manager-store.ts +100 -0
  37. package/{lib → src}/Store/make-in-memory-store.js +51 -61
  38. package/src/Store/make-in-memory-store.ts +475 -0
  39. package/src/Store/make-ordered-dictionary.ts +86 -0
  40. package/{lib → src}/Store/object-repository.js +1 -1
  41. package/src/Store/object-repository.ts +32 -0
  42. package/src/Tests/test.app-state-sync.js +204 -0
  43. package/src/Tests/test.app-state-sync.ts +207 -0
  44. package/src/Tests/test.event-buffer.js +270 -0
  45. package/src/Tests/test.event-buffer.ts +319 -0
  46. package/src/Tests/test.key-store.js +76 -0
  47. package/src/Tests/test.key-store.ts +92 -0
  48. package/src/Tests/test.libsignal.js +141 -0
  49. package/src/Tests/test.libsignal.ts +186 -0
  50. package/src/Tests/test.media-download.js +93 -0
  51. package/src/Tests/test.media-download.ts +76 -0
  52. package/src/Tests/test.messages.js +33 -0
  53. package/src/Tests/test.messages.ts +37 -0
  54. package/src/Tests/utils.js +34 -0
  55. package/src/Tests/utils.ts +36 -0
  56. package/src/Types/Auth.ts +113 -0
  57. package/src/Types/Call.ts +15 -0
  58. package/src/Types/Chat.ts +106 -0
  59. package/{lib/Types/Contact.d.ts → src/Types/Contact.ts} +9 -8
  60. package/src/Types/Events.ts +93 -0
  61. package/src/Types/GroupMetadata.ts +53 -0
  62. package/{lib → src}/Types/Label.js +1 -1
  63. package/src/Types/Label.ts +36 -0
  64. package/{lib → src}/Types/LabelAssociation.js +1 -1
  65. package/{lib/Types/LabelAssociation.d.ts → src/Types/LabelAssociation.ts} +22 -16
  66. package/src/Types/Message.ts +288 -0
  67. package/src/Types/Newsletter.js +32 -0
  68. package/src/Types/Newsletter.ts +98 -0
  69. package/src/Types/Product.ts +85 -0
  70. package/src/Types/Signal.ts +68 -0
  71. package/{lib/Types/Socket.d.ts → src/Types/Socket.ts} +68 -56
  72. package/src/Types/State.ts +29 -0
  73. package/{lib → src}/Types/index.js +2 -1
  74. package/src/Types/index.ts +59 -0
  75. package/{lib → src}/Utils/auth-utils.js +95 -76
  76. package/src/Utils/auth-utils.ts +222 -0
  77. package/src/Utils/baileys-event-stream.js +92 -0
  78. package/src/Utils/baileys-event-stream.ts +66 -0
  79. package/{lib → src}/Utils/business.js +45 -17
  80. package/src/Utils/business.ts +275 -0
  81. package/{lib → src}/Utils/chat-utils.js +74 -46
  82. package/src/Utils/chat-utils.ts +860 -0
  83. package/{lib → src}/Utils/crypto.js +31 -21
  84. package/src/Utils/crypto.ts +131 -0
  85. package/src/Utils/decode-wa-message.js +211 -0
  86. package/src/Utils/decode-wa-message.ts +228 -0
  87. package/{lib → src}/Utils/event-buffer.js +13 -4
  88. package/src/Utils/event-buffer.ts +613 -0
  89. package/{lib → src}/Utils/generics.js +98 -45
  90. package/src/Utils/generics.ts +434 -0
  91. package/{lib → src}/Utils/history.js +39 -10
  92. package/src/Utils/history.ts +112 -0
  93. package/src/Utils/index.ts +17 -0
  94. package/{lib → src}/Utils/link-preview.js +54 -17
  95. package/src/Utils/link-preview.ts +122 -0
  96. package/src/Utils/logger.ts +3 -0
  97. package/src/Utils/lt-hash.ts +61 -0
  98. package/{lib → src}/Utils/make-mutex.js +13 -4
  99. package/src/Utils/make-mutex.ts +44 -0
  100. package/{lib → src}/Utils/messages-media.js +296 -192
  101. package/src/Utils/messages-media.ts +847 -0
  102. package/{lib → src}/Utils/messages.js +124 -113
  103. package/src/Utils/messages.ts +956 -0
  104. package/{lib → src}/Utils/noise-handler.js +16 -3
  105. package/src/Utils/noise-handler.ts +197 -0
  106. package/{lib → src}/Utils/process-message.js +33 -29
  107. package/src/Utils/process-message.ts +414 -0
  108. package/{lib → src}/Utils/signal.js +23 -14
  109. package/src/Utils/signal.ts +177 -0
  110. package/{lib → src}/Utils/use-multi-file-auth-state.js +28 -19
  111. package/src/Utils/use-multi-file-auth-state.ts +90 -0
  112. package/{lib → src}/Utils/validate-connection.js +25 -42
  113. package/src/Utils/validate-connection.ts +238 -0
  114. package/src/WABinary/constants.ts +42 -0
  115. package/{lib → src}/WABinary/decode.js +17 -7
  116. package/src/WABinary/decode.ts +265 -0
  117. package/{lib → src}/WABinary/encode.js +17 -7
  118. package/src/WABinary/encode.ts +236 -0
  119. package/{lib → src}/WABinary/generic-utils.js +2 -2
  120. package/src/WABinary/generic-utils.ts +121 -0
  121. package/src/WABinary/index.ts +5 -0
  122. package/{lib → src}/WABinary/jid-utils.js +4 -1
  123. package/src/WABinary/jid-utils.ts +68 -0
  124. package/src/WABinary/types.ts +17 -0
  125. package/src/WAM/BinaryInfo.js +13 -0
  126. package/src/WAM/BinaryInfo.ts +12 -0
  127. package/src/WAM/constants.js +15350 -0
  128. package/src/WAM/constants.ts +15382 -0
  129. package/src/WAM/encode.js +155 -0
  130. package/src/WAM/encode.ts +174 -0
  131. package/src/WAM/index.js +19 -0
  132. package/src/WAM/index.ts +3 -0
  133. package/src/gifted +1 -0
  134. package/{lib → src}/index.js +1 -0
  135. package/src/index.ts +13 -0
  136. package/lib/Defaults/baileys-version.json +0 -3
  137. package/lib/Defaults/index.d.ts +0 -284
  138. package/lib/Defaults/phonenumber-mcc.json +0 -223
  139. package/lib/Signal/libsignal.d.ts +0 -3
  140. package/lib/Signal/libsignal.js +0 -152
  141. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
  142. package/lib/Socket/Client/index.d.ts +0 -3
  143. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
  144. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  145. package/lib/Socket/Client/web-socket-client.d.ts +0 -12
  146. package/lib/Socket/Client/web-socket-client.js +0 -62
  147. package/lib/Socket/business.d.ts +0 -135
  148. package/lib/Socket/chats.d.ts +0 -79
  149. package/lib/Socket/groups.d.ts +0 -113
  150. package/lib/Socket/index.d.ts +0 -137
  151. package/lib/Socket/messages-recv.d.ts +0 -124
  152. package/lib/Socket/messages-send.d.ts +0 -119
  153. package/lib/Socket/registration.d.ts +0 -232
  154. package/lib/Socket/socket.d.ts +0 -42
  155. package/lib/Store/index.d.ts +0 -3
  156. package/lib/Store/make-cache-manager-store.d.ts +0 -13
  157. package/lib/Store/make-in-memory-store.d.ts +0 -117
  158. package/lib/Store/make-ordered-dictionary.d.ts +0 -13
  159. package/lib/Store/object-repository.d.ts +0 -10
  160. package/lib/Types/Auth.d.ts +0 -108
  161. package/lib/Types/Call.d.ts +0 -13
  162. package/lib/Types/Chat.d.ts +0 -102
  163. package/lib/Types/Events.d.ts +0 -157
  164. package/lib/Types/GroupMetadata.d.ts +0 -52
  165. package/lib/Types/Label.d.ts +0 -35
  166. package/lib/Types/Message.d.ts +0 -261
  167. package/lib/Types/Product.d.ts +0 -78
  168. package/lib/Types/Signal.d.ts +0 -57
  169. package/lib/Types/State.d.ts +0 -27
  170. package/lib/Types/index.d.ts +0 -56
  171. package/lib/Utils/auth-utils.d.ts +0 -18
  172. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  173. package/lib/Utils/baileys-event-stream.js +0 -63
  174. package/lib/Utils/business.d.ts +0 -22
  175. package/lib/Utils/chat-utils.d.ts +0 -71
  176. package/lib/Utils/crypto.d.ts +0 -41
  177. package/lib/Utils/decode-wa-message.d.ts +0 -19
  178. package/lib/Utils/decode-wa-message.js +0 -174
  179. package/lib/Utils/event-buffer.d.ts +0 -35
  180. package/lib/Utils/generics.d.ts +0 -94
  181. package/lib/Utils/history.d.ts +0 -15
  182. package/lib/Utils/index.d.ts +0 -17
  183. package/lib/Utils/link-preview.d.ts +0 -21
  184. package/lib/Utils/logger.d.ts +0 -4
  185. package/lib/Utils/lt-hash.d.ts +0 -12
  186. package/lib/Utils/make-mutex.d.ts +0 -7
  187. package/lib/Utils/messages-media.d.ts +0 -107
  188. package/lib/Utils/messages.d.ts +0 -76
  189. package/lib/Utils/noise-handler.d.ts +0 -20
  190. package/lib/Utils/process-message.d.ts +0 -41
  191. package/lib/Utils/signal.d.ts +0 -32
  192. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -12
  193. package/lib/Utils/validate-connection.d.ts +0 -11
  194. package/lib/WABinary/constants.d.ts +0 -27
  195. package/lib/WABinary/decode.d.ts +0 -7
  196. package/lib/WABinary/encode.d.ts +0 -3
  197. package/lib/WABinary/generic-utils.d.ts +0 -15
  198. package/lib/WABinary/index.d.ts +0 -5
  199. package/lib/WABinary/jid-utils.d.ts +0 -29
  200. package/lib/WABinary/types.d.ts +0 -18
  201. package/lib/index.d.ts +0 -10
  202. /package/{lib → src}/Socket/Client/abstract-socket-client.js +0 -0
  203. /package/{lib → src}/Socket/Client/index.js +0 -0
  204. /package/{lib → src}/Store/index.js +0 -0
  205. /package/{lib → src}/Store/make-ordered-dictionary.js +0 -0
  206. /package/{lib → src}/Types/Auth.js +0 -0
  207. /package/{lib → src}/Types/Call.js +0 -0
  208. /package/{lib → src}/Types/Chat.js +0 -0
  209. /package/{lib → src}/Types/Contact.js +0 -0
  210. /package/{lib → src}/Types/Events.js +0 -0
  211. /package/{lib → src}/Types/GroupMetadata.js +0 -0
  212. /package/{lib → src}/Types/Message.js +0 -0
  213. /package/{lib → src}/Types/Product.js +0 -0
  214. /package/{lib → src}/Types/Signal.js +0 -0
  215. /package/{lib → src}/Types/Socket.js +0 -0
  216. /package/{lib → src}/Types/State.js +0 -0
  217. /package/{lib → src}/Utils/index.js +0 -0
  218. /package/{lib → src}/Utils/logger.js +0 -0
  219. /package/{lib → src}/Utils/lt-hash.js +0 -0
  220. /package/{lib → src}/WABinary/constants.js +0 -0
  221. /package/{lib → src}/WABinary/index.js +0 -0
  222. /package/{lib → src}/WABinary/types.js +0 -0
@@ -1,4 +1,13 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
12
  exports.extractGroupMetadata = exports.makeGroupsSocket = void 0;
4
13
  const WAProto_1 = require("../../WAProto");
@@ -9,21 +18,23 @@ const chats_1 = require("./chats");
9
18
  const makeGroupsSocket = (config) => {
10
19
  const sock = (0, chats_1.makeChatsSocket)(config);
11
20
  const { authState, ev, query, upsertMessage } = sock;
12
- const groupQuery = async (jid, type, content) => (query({
13
- tag: 'iq',
14
- attrs: {
15
- type,
16
- xmlns: 'w:g2',
17
- to: jid,
18
- },
19
- content
20
- }));
21
- const groupMetadata = async (jid) => {
22
- const result = await groupQuery(jid, 'get', [{ tag: 'query', attrs: { request: 'interactive' } }]);
21
+ const groupQuery = (jid, type, content) => __awaiter(void 0, void 0, void 0, function* () {
22
+ return (query({
23
+ tag: 'iq',
24
+ attrs: {
25
+ type,
26
+ xmlns: 'w:g2',
27
+ to: jid,
28
+ },
29
+ content
30
+ }));
31
+ });
32
+ const groupMetadata = (jid) => __awaiter(void 0, void 0, void 0, function* () {
33
+ const result = yield groupQuery(jid, 'get', [{ tag: 'query', attrs: { request: 'interactive' } }]);
23
34
  return (0, exports.extractGroupMetadata)(result);
24
- };
25
- const groupFetchAllParticipating = async () => {
26
- const result = await query({
35
+ });
36
+ const groupFetchAllParticipating = () => __awaiter(void 0, void 0, void 0, function* () {
37
+ const result = yield query({
27
38
  tag: 'iq',
28
39
  attrs: {
29
40
  to: '@g.us',
@@ -56,21 +67,18 @@ const makeGroupsSocket = (config) => {
56
67
  }
57
68
  sock.ev.emit('groups.update', Object.values(data));
58
69
  return data;
59
- };
60
- sock.ws.on('CB:ib,,dirty', async (node) => {
70
+ });
71
+ sock.ws.on('CB:ib,,dirty', (node) => __awaiter(void 0, void 0, void 0, function* () {
61
72
  const { attrs } = (0, WABinary_1.getBinaryNodeChild)(node, 'dirty');
62
73
  if (attrs.type !== 'groups') {
63
74
  return;
64
75
  }
65
- await groupFetchAllParticipating();
66
- await sock.cleanDirtyBits('groups');
67
- });
68
- return {
69
- ...sock,
70
- groupMetadata,
71
- groupCreate: async (subject, participants) => {
76
+ yield groupFetchAllParticipating();
77
+ yield sock.cleanDirtyBits('groups');
78
+ }));
79
+ return Object.assign(Object.assign({}, sock), { groupMetadata, groupCreate: (subject, participants) => __awaiter(void 0, void 0, void 0, function* () {
72
80
  const key = (0, Utils_1.generateMessageID)();
73
- const result = await groupQuery('@g.us', 'set', [
81
+ const result = yield groupQuery('@g.us', 'set', [
74
82
  {
75
83
  tag: 'create',
76
84
  attrs: {
@@ -84,9 +92,8 @@ const makeGroupsSocket = (config) => {
84
92
  }
85
93
  ]);
86
94
  return (0, exports.extractGroupMetadata)(result);
87
- },
88
- groupLeave: async (id) => {
89
- await groupQuery('@g.us', 'set', [
95
+ }), groupLeave: (id) => __awaiter(void 0, void 0, void 0, function* () {
96
+ yield groupQuery('@g.us', 'set', [
90
97
  {
91
98
  tag: 'leave',
92
99
  attrs: {},
@@ -95,18 +102,16 @@ const makeGroupsSocket = (config) => {
95
102
  ]
96
103
  }
97
104
  ]);
98
- },
99
- groupUpdateSubject: async (jid, subject) => {
100
- await groupQuery(jid, 'set', [
105
+ }), groupUpdateSubject: (jid, subject) => __awaiter(void 0, void 0, void 0, function* () {
106
+ yield groupQuery(jid, 'set', [
101
107
  {
102
108
  tag: 'subject',
103
109
  attrs: {},
104
110
  content: Buffer.from(subject, 'utf-8')
105
111
  }
106
112
  ]);
107
- },
108
- groupRequestParticipantsList: async (jid) => {
109
- const result = await groupQuery(jid, 'get', [
113
+ }), groupRequestParticipantsList: (jid) => __awaiter(void 0, void 0, void 0, function* () {
114
+ const result = yield groupQuery(jid, 'get', [
110
115
  {
111
116
  tag: 'membership_approval_requests',
112
117
  attrs: {}
@@ -115,9 +120,8 @@ const makeGroupsSocket = (config) => {
115
120
  const node = (0, WABinary_1.getBinaryNodeChild)(result, 'membership_approval_requests');
116
121
  const participants = (0, WABinary_1.getBinaryNodeChildren)(node, 'membership_approval_request');
117
122
  return participants.map(v => v.attrs);
118
- },
119
- groupRequestParticipantsUpdate: async (jid, participants, action) => {
120
- const result = await groupQuery(jid, 'set', [{
123
+ }), groupRequestParticipantsUpdate: (jid, participants, action) => __awaiter(void 0, void 0, void 0, function* () {
124
+ const result = yield groupQuery(jid, 'set', [{
121
125
  tag: 'membership_requests_action',
122
126
  attrs: {},
123
127
  content: [
@@ -137,9 +141,8 @@ const makeGroupsSocket = (config) => {
137
141
  return participantsAffected.map(p => {
138
142
  return { status: p.attrs.error || '200', jid: p.attrs.jid };
139
143
  });
140
- },
141
- groupParticipantsUpdate: async (jid, participants, action) => {
142
- const result = await groupQuery(jid, 'set', [
144
+ }), groupParticipantsUpdate: (jid, participants, action) => __awaiter(void 0, void 0, void 0, function* () {
145
+ const result = yield groupQuery(jid, 'set', [
143
146
  {
144
147
  tag: action,
145
148
  attrs: {},
@@ -154,47 +157,40 @@ const makeGroupsSocket = (config) => {
154
157
  return participantsAffected.map(p => {
155
158
  return { status: p.attrs.error || '200', jid: p.attrs.jid, content: p };
156
159
  });
157
- },
158
- groupUpdateDescription: async (jid, description) => {
160
+ }), groupUpdateDescription: (jid, description) => __awaiter(void 0, void 0, void 0, function* () {
159
161
  var _a;
160
- const metadata = await groupMetadata(jid);
162
+ const metadata = yield groupMetadata(jid);
161
163
  const prev = (_a = metadata.descId) !== null && _a !== void 0 ? _a : null;
162
- await groupQuery(jid, 'set', [
164
+ yield groupQuery(jid, 'set', [
163
165
  {
164
166
  tag: 'description',
165
- attrs: {
166
- ...(description ? { id: (0, Utils_1.generateMessageID)() } : { delete: 'true' }),
167
- ...(prev ? { prev } : {})
168
- },
167
+ attrs: Object.assign(Object.assign({}, (description ? { id: (0, Utils_1.generateMessageID)() } : { delete: 'true' })), (prev ? { prev } : {})),
169
168
  content: description ? [
170
169
  { tag: 'body', attrs: {}, content: Buffer.from(description, 'utf-8') }
171
170
  ] : undefined
172
171
  }
173
172
  ]);
174
- },
175
- groupInviteCode: async (jid) => {
176
- const result = await groupQuery(jid, 'get', [{ tag: 'invite', attrs: {} }]);
173
+ }), groupInviteCode: (jid) => __awaiter(void 0, void 0, void 0, function* () {
174
+ const result = yield groupQuery(jid, 'get', [{ tag: 'invite', attrs: {} }]);
177
175
  const inviteNode = (0, WABinary_1.getBinaryNodeChild)(result, 'invite');
178
176
  return inviteNode === null || inviteNode === void 0 ? void 0 : inviteNode.attrs.code;
179
- },
180
- groupRevokeInvite: async (jid) => {
181
- const result = await groupQuery(jid, 'set', [{ tag: 'invite', attrs: {} }]);
177
+ }), groupRevokeInvite: (jid) => __awaiter(void 0, void 0, void 0, function* () {
178
+ const result = yield groupQuery(jid, 'set', [{ tag: 'invite', attrs: {} }]);
182
179
  const inviteNode = (0, WABinary_1.getBinaryNodeChild)(result, 'invite');
183
180
  return inviteNode === null || inviteNode === void 0 ? void 0 : inviteNode.attrs.code;
184
- },
185
- groupAcceptInvite: async (code) => {
186
- const results = await groupQuery('@g.us', 'set', [{ tag: 'invite', attrs: { code } }]);
181
+ }), groupAcceptInvite: (code) => __awaiter(void 0, void 0, void 0, function* () {
182
+ const results = yield groupQuery('@g.us', 'set', [{ tag: 'invite', attrs: { code } }]);
187
183
  const result = (0, WABinary_1.getBinaryNodeChild)(results, 'group');
188
184
  return result === null || result === void 0 ? void 0 : result.attrs.jid;
189
- },
185
+ }),
190
186
  /**
191
187
  * accept a GroupInviteMessage
192
188
  * @param key the key of the invite message, or optionally only provide the jid of the person who sent the invite
193
189
  * @param inviteMessage the message to accept
194
190
  */
195
- groupAcceptInviteV4: ev.createBufferedFunction(async (key, inviteMessage) => {
191
+ groupAcceptInviteV4: ev.createBufferedFunction((key, inviteMessage) => __awaiter(void 0, void 0, void 0, function* () {
196
192
  key = typeof key === 'string' ? { remoteJid: key } : key;
197
- const results = await groupQuery(inviteMessage.groupJid, 'set', [{
193
+ const results = yield groupQuery(inviteMessage.groupJid, 'set', [{
198
194
  tag: 'accept',
199
195
  attrs: {
200
196
  code: inviteMessage.inviteCode,
@@ -221,7 +217,7 @@ const makeGroupsSocket = (config) => {
221
217
  ]);
222
218
  }
223
219
  // generate the group add message
224
- await upsertMessage({
220
+ yield upsertMessage({
225
221
  key: {
226
222
  remoteJid: inviteMessage.groupJid,
227
223
  id: (0, Utils_1.generateMessageID)(),
@@ -236,32 +232,25 @@ const makeGroupsSocket = (config) => {
236
232
  messageTimestamp: (0, Utils_1.unixTimestampSeconds)()
237
233
  }, 'notify');
238
234
  return results.attrs.from;
239
- }),
240
- groupGetInviteInfo: async (code) => {
241
- const results = await groupQuery('@g.us', 'get', [{ tag: 'invite', attrs: { code } }]);
235
+ })), groupGetInviteInfo: (code) => __awaiter(void 0, void 0, void 0, function* () {
236
+ const results = yield groupQuery('@g.us', 'get', [{ tag: 'invite', attrs: { code } }]);
242
237
  return (0, exports.extractGroupMetadata)(results);
243
- },
244
- groupToggleEphemeral: async (jid, ephemeralExpiration) => {
238
+ }), groupToggleEphemeral: (jid, ephemeralExpiration) => __awaiter(void 0, void 0, void 0, function* () {
245
239
  const content = ephemeralExpiration ?
246
240
  { tag: 'ephemeral', attrs: { expiration: ephemeralExpiration.toString() } } :
247
241
  { tag: 'not_ephemeral', attrs: {} };
248
- await groupQuery(jid, 'set', [content]);
249
- },
250
- groupSettingUpdate: async (jid, setting) => {
251
- await groupQuery(jid, 'set', [{ tag: setting, attrs: {} }]);
252
- },
253
- groupMemberAddMode: async (jid, mode) => {
254
- await groupQuery(jid, 'set', [{ tag: 'member_add_mode', attrs: {}, content: mode }]);
255
- },
256
- groupJoinApprovalMode: async (jid, mode) => {
257
- await groupQuery(jid, 'set', [{ tag: 'membership_approval_mode', attrs: {}, content: [{ tag: 'group_join', attrs: { state: mode } }] }]);
258
- },
259
- groupFetchAllParticipating
260
- };
242
+ yield groupQuery(jid, 'set', [content]);
243
+ }), groupSettingUpdate: (jid, setting) => __awaiter(void 0, void 0, void 0, function* () {
244
+ yield groupQuery(jid, 'set', [{ tag: setting, attrs: {} }]);
245
+ }), groupMemberAddMode: (jid, mode) => __awaiter(void 0, void 0, void 0, function* () {
246
+ yield groupQuery(jid, 'set', [{ tag: 'member_add_mode', attrs: {}, content: mode }]);
247
+ }), groupJoinApprovalMode: (jid, mode) => __awaiter(void 0, void 0, void 0, function* () {
248
+ yield groupQuery(jid, 'set', [{ tag: 'membership_approval_mode', attrs: {}, content: [{ tag: 'group_join', attrs: { state: mode } }] }]);
249
+ }), groupFetchAllParticipating });
261
250
  };
262
251
  exports.makeGroupsSocket = makeGroupsSocket;
263
252
  const extractGroupMetadata = (result) => {
264
- var _a;
253
+ var _a, _b;
265
254
  const group = (0, WABinary_1.getBinaryNodeChild)(result, 'group');
266
255
  const descChild = (0, WABinary_1.getBinaryNodeChild)(group, 'description');
267
256
  let desc;
@@ -283,6 +272,7 @@ const extractGroupMetadata = (result) => {
283
272
  owner: group.attrs.creator ? (0, WABinary_1.jidNormalizedUser)(group.attrs.creator) : undefined,
284
273
  desc,
285
274
  descId,
275
+ linkedParent: ((_b = (0, WABinary_1.getBinaryNodeChild)(group, 'linked_parent')) === null || _b === void 0 ? void 0 : _b.attrs.jid) || undefined,
286
276
  restrict: !!(0, WABinary_1.getBinaryNodeChild)(group, 'locked'),
287
277
  announce: !!(0, WABinary_1.getBinaryNodeChild)(group, 'announcement'),
288
278
  isCommunity: !!(0, WABinary_1.getBinaryNodeChild)(group, 'parent'),
@@ -0,0 +1,356 @@
1
+ import { proto } from '../../WAProto'
2
+ import { GroupMetadata, GroupParticipant, ParticipantAction, SocketConfig, WAMessageKey, WAMessageStubType } from '../Types'
3
+ import { generateMessageID, unixTimestampSeconds } from '../Utils'
4
+ import { BinaryNode, getBinaryNodeChild, getBinaryNodeChildren, getBinaryNodeChildString, jidEncode, jidNormalizedUser } from '../WABinary'
5
+ import { makeChatsSocket } from './chats'
6
+
7
+ export const makeGroupsSocket = (config: SocketConfig) => {
8
+ const sock = makeChatsSocket(config)
9
+ const { authState, ev, query, upsertMessage } = sock
10
+
11
+ const groupQuery = async(jid: string, type: 'get' | 'set', content: BinaryNode[]) => (
12
+ query({
13
+ tag: 'iq',
14
+ attrs: {
15
+ type,
16
+ xmlns: 'w:g2',
17
+ to: jid,
18
+ },
19
+ content
20
+ })
21
+ )
22
+
23
+ const groupMetadata = async(jid: string) => {
24
+ const result = await groupQuery(
25
+ jid,
26
+ 'get',
27
+ [ { tag: 'query', attrs: { request: 'interactive' } } ]
28
+ )
29
+ return extractGroupMetadata(result)
30
+ }
31
+
32
+
33
+ const groupFetchAllParticipating = async() => {
34
+ const result = await query({
35
+ tag: 'iq',
36
+ attrs: {
37
+ to: '@g.us',
38
+ xmlns: 'w:g2',
39
+ type: 'get',
40
+ },
41
+ content: [
42
+ {
43
+ tag: 'participating',
44
+ attrs: { },
45
+ content: [
46
+ { tag: 'participants', attrs: { } },
47
+ { tag: 'description', attrs: { } }
48
+ ]
49
+ }
50
+ ]
51
+ })
52
+ const data: { [_: string]: GroupMetadata } = { }
53
+ const groupsChild = getBinaryNodeChild(result, 'groups')
54
+ if(groupsChild) {
55
+ const groups = getBinaryNodeChildren(groupsChild, 'group')
56
+ for(const groupNode of groups) {
57
+ const meta = extractGroupMetadata({
58
+ tag: 'result',
59
+ attrs: { },
60
+ content: [groupNode]
61
+ })
62
+ data[meta.id] = meta
63
+ }
64
+ }
65
+
66
+ sock.ev.emit('groups.update', Object.values(data))
67
+
68
+ return data
69
+ }
70
+
71
+ sock.ws.on('CB:ib,,dirty', async(node: BinaryNode) => {
72
+ const { attrs } = getBinaryNodeChild(node, 'dirty')!
73
+ if(attrs.type !== 'groups') {
74
+ return
75
+ }
76
+
77
+ await groupFetchAllParticipating()
78
+ await sock.cleanDirtyBits('groups')
79
+ })
80
+
81
+ return {
82
+ ...sock,
83
+ groupMetadata,
84
+ groupCreate: async(subject: string, participants: string[]) => {
85
+ const key = generateMessageID()
86
+ const result = await groupQuery(
87
+ '@g.us',
88
+ 'set',
89
+ [
90
+ {
91
+ tag: 'create',
92
+ attrs: {
93
+ subject,
94
+ key
95
+ },
96
+ content: participants.map(jid => ({
97
+ tag: 'participant',
98
+ attrs: { jid }
99
+ }))
100
+ }
101
+ ]
102
+ )
103
+ return extractGroupMetadata(result)
104
+ },
105
+ groupLeave: async(id: string) => {
106
+ await groupQuery(
107
+ '@g.us',
108
+ 'set',
109
+ [
110
+ {
111
+ tag: 'leave',
112
+ attrs: { },
113
+ content: [
114
+ { tag: 'group', attrs: { id } }
115
+ ]
116
+ }
117
+ ]
118
+ )
119
+ },
120
+ groupUpdateSubject: async(jid: string, subject: string) => {
121
+ await groupQuery(
122
+ jid,
123
+ 'set',
124
+ [
125
+ {
126
+ tag: 'subject',
127
+ attrs: { },
128
+ content: Buffer.from(subject, 'utf-8')
129
+ }
130
+ ]
131
+ )
132
+ },
133
+ groupRequestParticipantsList: async(jid: string) => {
134
+ const result = await groupQuery(
135
+ jid,
136
+ 'get',
137
+ [
138
+ {
139
+ tag: 'membership_approval_requests',
140
+ attrs: {}
141
+ }
142
+ ]
143
+ )
144
+ const node = getBinaryNodeChild(result, 'membership_approval_requests')
145
+ const participants = getBinaryNodeChildren(node, 'membership_approval_request')
146
+ return participants.map(v => v.attrs)
147
+ },
148
+ groupRequestParticipantsUpdate: async(jid: string, participants: string[], action: 'approve' | 'reject') => {
149
+ const result = await groupQuery(
150
+ jid,
151
+ 'set',
152
+ [{
153
+ tag: 'membership_requests_action',
154
+ attrs: {},
155
+ content: [
156
+ {
157
+ tag: action,
158
+ attrs: { },
159
+ content: participants.map(jid => ({
160
+ tag: 'participant',
161
+ attrs: { jid }
162
+ }))
163
+ }
164
+ ]
165
+ }]
166
+ )
167
+ const node = getBinaryNodeChild(result, 'membership_requests_action')
168
+ const nodeAction = getBinaryNodeChild(node, action)
169
+ const participantsAffected = getBinaryNodeChildren(nodeAction, 'participant')
170
+ return participantsAffected.map(p => {
171
+ return { status: p.attrs.error || '200', jid: p.attrs.jid }
172
+ })
173
+ },
174
+ groupParticipantsUpdate: async(
175
+ jid: string,
176
+ participants: string[],
177
+ action: ParticipantAction
178
+ ) => {
179
+ const result = await groupQuery(
180
+ jid,
181
+ 'set',
182
+ [
183
+ {
184
+ tag: action,
185
+ attrs: { },
186
+ content: participants.map(jid => ({
187
+ tag: 'participant',
188
+ attrs: { jid }
189
+ }))
190
+ }
191
+ ]
192
+ )
193
+ const node = getBinaryNodeChild(result, action)
194
+ const participantsAffected = getBinaryNodeChildren(node!, 'participant')
195
+ return participantsAffected.map(p => {
196
+ return { status: p.attrs.error || '200', jid: p.attrs.jid, content: p }
197
+ })
198
+ },
199
+ groupUpdateDescription: async(jid: string, description?: string) => {
200
+ const metadata = await groupMetadata(jid)
201
+ const prev = metadata.descId ?? null
202
+
203
+ await groupQuery(
204
+ jid,
205
+ 'set',
206
+ [
207
+ {
208
+ tag: 'description',
209
+ attrs: {
210
+ ...(description ? { id: generateMessageID() } : { delete: 'true' }),
211
+ ...(prev ? { prev } : {})
212
+ },
213
+ content: description ? [
214
+ { tag: 'body', attrs: {}, content: Buffer.from(description, 'utf-8') }
215
+ ] : undefined
216
+ }
217
+ ]
218
+ )
219
+ },
220
+ groupInviteCode: async(jid: string) => {
221
+ const result = await groupQuery(jid, 'get', [{ tag: 'invite', attrs: {} }])
222
+ const inviteNode = getBinaryNodeChild(result, 'invite')
223
+ return inviteNode?.attrs.code
224
+ },
225
+ groupRevokeInvite: async(jid: string) => {
226
+ const result = await groupQuery(jid, 'set', [{ tag: 'invite', attrs: {} }])
227
+ const inviteNode = getBinaryNodeChild(result, 'invite')
228
+ return inviteNode?.attrs.code
229
+ },
230
+ groupAcceptInvite: async(code: string) => {
231
+ const results = await groupQuery('@g.us', 'set', [{ tag: 'invite', attrs: { code } }])
232
+ const result = getBinaryNodeChild(results, 'group')
233
+ return result?.attrs.jid
234
+ },
235
+ /**
236
+ * accept a GroupInviteMessage
237
+ * @param key the key of the invite message, or optionally only provide the jid of the person who sent the invite
238
+ * @param inviteMessage the message to accept
239
+ */
240
+ groupAcceptInviteV4: ev.createBufferedFunction(async(key: string | WAMessageKey, inviteMessage: proto.Message.IGroupInviteMessage) => {
241
+ key = typeof key === 'string' ? { remoteJid: key } : key
242
+ const results = await groupQuery(inviteMessage.groupJid!, 'set', [{
243
+ tag: 'accept',
244
+ attrs: {
245
+ code: inviteMessage.inviteCode!,
246
+ expiration: inviteMessage.inviteExpiration!.toString(),
247
+ admin: key.remoteJid!
248
+ }
249
+ }])
250
+
251
+ // if we have the full message key
252
+ // update the invite message to be expired
253
+ if(key.id) {
254
+ // create new invite message that is expired
255
+ inviteMessage = proto.Message.GroupInviteMessage.fromObject(inviteMessage)
256
+ inviteMessage.inviteExpiration = 0
257
+ inviteMessage.inviteCode = ''
258
+ ev.emit('messages.update', [
259
+ {
260
+ key,
261
+ update: {
262
+ message: {
263
+ groupInviteMessage: inviteMessage
264
+ }
265
+ }
266
+ }
267
+ ])
268
+ }
269
+
270
+ // generate the group add message
271
+ await upsertMessage(
272
+ {
273
+ key: {
274
+ remoteJid: inviteMessage.groupJid,
275
+ id: generateMessageID(),
276
+ fromMe: false,
277
+ participant: key.remoteJid,
278
+ },
279
+ messageStubType: WAMessageStubType.GROUP_PARTICIPANT_ADD,
280
+ messageStubParameters: [
281
+ authState.creds.me!.id
282
+ ],
283
+ participant: key.remoteJid,
284
+ messageTimestamp: unixTimestampSeconds()
285
+ },
286
+ 'notify'
287
+ )
288
+
289
+ return results.attrs.from
290
+ }),
291
+ groupGetInviteInfo: async(code: string) => {
292
+ const results = await groupQuery('@g.us', 'get', [{ tag: 'invite', attrs: { code } }])
293
+ return extractGroupMetadata(results)
294
+ },
295
+ groupToggleEphemeral: async(jid: string, ephemeralExpiration: number) => {
296
+ const content: BinaryNode = ephemeralExpiration ?
297
+ { tag: 'ephemeral', attrs: { expiration: ephemeralExpiration.toString() } } :
298
+ { tag: 'not_ephemeral', attrs: { } }
299
+ await groupQuery(jid, 'set', [content])
300
+ },
301
+ groupSettingUpdate: async(jid: string, setting: 'announcement' | 'not_announcement' | 'locked' | 'unlocked') => {
302
+ await groupQuery(jid, 'set', [ { tag: setting, attrs: { } } ])
303
+ },
304
+ groupMemberAddMode: async(jid: string, mode: 'admin_add' | 'all_member_add') => {
305
+ await groupQuery(jid, 'set', [ { tag: 'member_add_mode', attrs: { }, content: mode } ])
306
+ },
307
+ groupJoinApprovalMode: async(jid: string, mode: 'on' | 'off') => {
308
+ await groupQuery(jid, 'set', [ { tag: 'membership_approval_mode', attrs: { }, content: [ { tag: 'group_join', attrs: { state: mode } } ] } ])
309
+ },
310
+ groupFetchAllParticipating
311
+ }
312
+ }
313
+
314
+
315
+ export const extractGroupMetadata = (result: BinaryNode) => {
316
+ const group = getBinaryNodeChild(result, 'group')!
317
+ const descChild = getBinaryNodeChild(group, 'description')
318
+ let desc: string | undefined
319
+ let descId: string | undefined
320
+ if(descChild) {
321
+ desc = getBinaryNodeChildString(descChild, 'body')
322
+ descId = descChild.attrs.id
323
+ }
324
+
325
+ const groupId = group.attrs.id.includes('@') ? group.attrs.id : jidEncode(group.attrs.id, 'g.us')
326
+ const eph = getBinaryNodeChild(group, 'ephemeral')?.attrs.expiration
327
+ const memberAddMode = getBinaryNodeChildString(group, 'member_add_mode') === 'all_member_add'
328
+ const metadata: GroupMetadata = {
329
+ id: groupId,
330
+ subject: group.attrs.subject,
331
+ subjectOwner: group.attrs.s_o,
332
+ subjectTime: +group.attrs.s_t,
333
+ size: getBinaryNodeChildren(group, 'participant').length,
334
+ creation: +group.attrs.creation,
335
+ owner: group.attrs.creator ? jidNormalizedUser(group.attrs.creator) : undefined,
336
+ desc,
337
+ descId,
338
+ linkedParent: getBinaryNodeChild(group, 'linked_parent')?.attrs.jid || undefined,
339
+ restrict: !!getBinaryNodeChild(group, 'locked'),
340
+ announce: !!getBinaryNodeChild(group, 'announcement'),
341
+ isCommunity: !!getBinaryNodeChild(group, 'parent'),
342
+ isCommunityAnnounce: !!getBinaryNodeChild(group, 'default_sub_group'),
343
+ joinApprovalMode: !!getBinaryNodeChild(group, 'membership_approval_mode'),
344
+ memberAddMode,
345
+ participants: getBinaryNodeChildren(group, 'participant').map(
346
+ ({ attrs }) => {
347
+ return {
348
+ id: attrs.jid,
349
+ admin: (attrs.type || null) as GroupParticipant['admin'],
350
+ }
351
+ }
352
+ ),
353
+ ephemeralDuration: eph ? +eph : undefined
354
+ }
355
+ return metadata
356
+ }
@@ -3,8 +3,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const Defaults_1 = require("../Defaults");
4
4
  const registration_1 = require("./registration");
5
5
  // export the last socket layer
6
- const makeWASocket = (config) => ((0, registration_1.makeRegistrationSocket)({
7
- ...Defaults_1.DEFAULT_CONNECTION_CONFIG,
8
- ...config
9
- }));
6
+ const makeWASocket = (config) => ((0, registration_1.makeRegistrationSocket)(Object.assign(Object.assign({}, Defaults_1.DEFAULT_CONNECTION_CONFIG), config)));
10
7
  exports.default = makeWASocket;
@@ -0,0 +1,13 @@
1
+ import { DEFAULT_CONNECTION_CONFIG } from '../Defaults'
2
+ import { UserFacingSocketConfig } from '../Types'
3
+ import { makeRegistrationSocket as _makeSocket } from './registration'
4
+
5
+ // export the last socket layer
6
+ const makeWASocket = (config: UserFacingSocketConfig) => (
7
+ _makeSocket({
8
+ ...DEFAULT_CONNECTION_CONFIG,
9
+ ...config
10
+ })
11
+ )
12
+
13
+ export default makeWASocket