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,9 +1,55 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
2
44
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
45
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
46
  };
5
47
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.bytesToCrockford = exports.trimUndefined = exports.isWABusinessPlatform = exports.getCodeFromWSError = exports.getCallStatusFromNode = exports.getErrorCodeFromStreamError = exports.getStatusFromReceiptType = exports.generateMdTagPrefix = exports.fetchLatestWaWebVersion = exports.fetchLatestBaileysVersion = exports.printQRIfNecessaryListener = exports.bindWaitForConnectionUpdate = exports.bindWaitForEvent = exports.generateMessageID = exports.promiseTimeout = exports.delayCancellable = exports.delay = exports.debouncedTimeout = exports.unixTimestampSeconds = exports.toNumber = exports.encodeBigEndian = exports.generateRegistrationId = exports.encodeWAMessage = exports.unpadRandomMax16 = exports.writeRandomPadMax16 = exports.getKeyAuthor = exports.BufferJSON = exports.Browsers = void 0;
48
+ exports.isWABusinessPlatform = exports.getCodeFromWSError = exports.getCallStatusFromNode = exports.getErrorCodeFromStreamError = exports.getStatusFromReceiptType = exports.generateMdTagPrefix = exports.fetchLatestWaWebVersion = exports.fetchLatestBaileysVersion = exports.printQRIfNecessaryListener = exports.bindWaitForConnectionUpdate = exports.generateMessageID = exports.generateMessageIDV2 = exports.delayCancellable = exports.delay = exports.debouncedTimeout = exports.unixTimestampSeconds = exports.toNumber = exports.encodeBigEndian = exports.generateRegistrationId = exports.encodeWAMessage = exports.unpadRandomMax16 = exports.writeRandomPadMax16 = exports.getKeyAuthor = exports.BufferJSON = exports.Browsers = void 0;
49
+ exports.promiseTimeout = promiseTimeout;
50
+ exports.bindWaitForEvent = bindWaitForEvent;
51
+ exports.trimUndefined = trimUndefined;
52
+ exports.bytesToCrockford = bytesToCrockford;
7
53
  const boom_1 = require("@hapi/boom");
8
54
  const axios_1 = __importDefault(require("axios"));
9
55
  const crypto_1 = require("crypto");
@@ -125,36 +171,53 @@ const delayCancellable = (ms) => {
125
171
  return { delay, cancel };
126
172
  };
127
173
  exports.delayCancellable = delayCancellable;
128
- async function promiseTimeout(ms, promise) {
129
- if (!ms) {
130
- return new Promise(promise);
131
- }
132
- const stack = new Error().stack;
133
- // Create a promise that rejects in <ms> milliseconds
134
- const { delay, cancel } = (0, exports.delayCancellable)(ms);
135
- const p = new Promise((resolve, reject) => {
136
- delay
137
- .then(() => reject(new boom_1.Boom('Timed Out', {
138
- statusCode: Types_1.DisconnectReason.timedOut,
139
- data: {
140
- stack
141
- }
142
- })))
143
- .catch(err => reject(err));
144
- promise(resolve, reject);
145
- })
146
- .finally(cancel);
147
- return p;
174
+ function promiseTimeout(ms, promise) {
175
+ return __awaiter(this, void 0, void 0, function* () {
176
+ if (!ms) {
177
+ return new Promise(promise);
178
+ }
179
+ const stack = new Error().stack;
180
+ // Create a promise that rejects in <ms> milliseconds
181
+ const { delay, cancel } = (0, exports.delayCancellable)(ms);
182
+ const p = new Promise((resolve, reject) => {
183
+ delay
184
+ .then(() => reject(new boom_1.Boom('Timed Out', {
185
+ statusCode: Types_1.DisconnectReason.timedOut,
186
+ data: {
187
+ stack
188
+ }
189
+ })))
190
+ .catch(err => reject(err));
191
+ promise(resolve, reject);
192
+ })
193
+ .finally(cancel);
194
+ return p;
195
+ });
148
196
  }
149
- exports.promiseTimeout = promiseTimeout;
197
+ const generateMessageIDV2 = (userId) => {
198
+ const data = Buffer.alloc(8 + 20 + 16);
199
+ data.writeBigUInt64BE(BigInt(Math.floor(Date.now() / 1000)));
200
+ if (userId) {
201
+ const id = (0, WABinary_1.jidDecode)(userId);
202
+ if (id === null || id === void 0 ? void 0 : id.user) {
203
+ data.write(id.user, 8);
204
+ data.write('@c.us', 8 + id.user.length);
205
+ }
206
+ }
207
+ const random = (0, crypto_1.randomBytes)(16);
208
+ random.copy(data, 28);
209
+ const hash = (0, crypto_1.createHash)('sha256').update(data).digest();
210
+ return 'ASS' + hash.toString('hex').toUpperCase().substring(0, 18);
211
+ };
212
+ exports.generateMessageIDV2 = generateMessageIDV2;
150
213
  // generate a random ID to attach to a message
151
- const generateMessageID = () => (0, crypto_1.randomBytes)(16).toString('hex').toUpperCase();
214
+ const generateMessageID = () => 'SSA' + (0, crypto_1.randomBytes)(6).toString('hex').toUpperCase();
152
215
  exports.generateMessageID = generateMessageID;
153
216
  function bindWaitForEvent(ev, event) {
154
- return async (check, timeoutMs) => {
217
+ return (check, timeoutMs) => __awaiter(this, void 0, void 0, function* () {
155
218
  let listener;
156
219
  let closeListener;
157
- await (promiseTimeout(timeoutMs, (resolve, reject) => {
220
+ yield (promiseTimeout(timeoutMs, (resolve, reject) => {
158
221
  closeListener = ({ connection, lastDisconnect }) => {
159
222
  if (connection === 'close') {
160
223
  reject((lastDisconnect === null || lastDisconnect === void 0 ? void 0 : lastDisconnect.error)
@@ -173,35 +236,30 @@ function bindWaitForEvent(ev, event) {
173
236
  ev.off(event, listener);
174
237
  ev.off('connection.update', closeListener);
175
238
  }));
176
- };
239
+ });
177
240
  }
178
- exports.bindWaitForEvent = bindWaitForEvent;
179
241
  const bindWaitForConnectionUpdate = (ev) => bindWaitForEvent(ev, 'connection.update');
180
242
  exports.bindWaitForConnectionUpdate = bindWaitForConnectionUpdate;
181
243
  const printQRIfNecessaryListener = (ev, logger) => {
182
- ev.on('connection.update', async ({ qr }) => {
244
+ ev.on('connection.update', (_a) => __awaiter(void 0, [_a], void 0, function* ({ qr }) {
183
245
  if (qr) {
184
- const QR = await import('qrcode-terminal')
185
- .then(m => m.default || m)
246
+ const QR = yield Promise.resolve().then(() => __importStar(require('qrcode-terminal'))).then(m => m.default || m)
186
247
  .catch(() => {
187
248
  logger.error('QR code terminal not added as dependency');
188
249
  });
189
250
  QR === null || QR === void 0 ? void 0 : QR.generate(qr, { small: true });
190
251
  }
191
- });
252
+ }));
192
253
  };
193
254
  exports.printQRIfNecessaryListener = printQRIfNecessaryListener;
194
255
  /**
195
256
  * utility that fetches latest baileys version from the master branch.
196
257
  * Use to ensure your WA connection is always on the latest version
197
258
  */
198
- const fetchLatestBaileysVersion = async (options = {}) => {
259
+ const fetchLatestBaileysVersion = (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (options = {}) {
199
260
  const URL = 'https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json';
200
261
  try {
201
- const result = await axios_1.default.get(URL, {
202
- ...options,
203
- responseType: 'json'
204
- });
262
+ const result = yield axios_1.default.get(URL, Object.assign(Object.assign({}, options), { responseType: 'json' }));
205
263
  return {
206
264
  version: result.data.version,
207
265
  isLatest: true
@@ -214,18 +272,15 @@ const fetchLatestBaileysVersion = async (options = {}) => {
214
272
  error
215
273
  };
216
274
  }
217
- };
275
+ });
218
276
  exports.fetchLatestBaileysVersion = fetchLatestBaileysVersion;
219
277
  /**
220
278
  * A utility that fetches the latest web version of whatsapp.
221
279
  * Use to ensure your WA connection is always on the latest version
222
280
  */
223
- const fetchLatestWaWebVersion = async (options) => {
281
+ const fetchLatestWaWebVersion = (options) => __awaiter(void 0, void 0, void 0, function* () {
224
282
  try {
225
- const result = await axios_1.default.get('https://web.whatsapp.com/check-update?version=1&platform=web', {
226
- ...options,
227
- responseType: 'json'
228
- });
283
+ const result = yield axios_1.default.get('https://web.whatsapp.com/check-update?version=1&platform=web', Object.assign(Object.assign({}, options), { responseType: 'json' }));
229
284
  const version = result.data.currentVersion.split('.');
230
285
  return {
231
286
  version: [+version[0], +version[1], +version[2]],
@@ -239,7 +294,7 @@ const fetchLatestWaWebVersion = async (options) => {
239
294
  error
240
295
  };
241
296
  }
242
- };
297
+ });
243
298
  exports.fetchLatestWaWebVersion = fetchLatestWaWebVersion;
244
299
  /** unique message tag prefix for MD clients */
245
300
  const generateMdTagPrefix = () => {
@@ -345,7 +400,6 @@ function trimUndefined(obj) {
345
400
  }
346
401
  return obj;
347
402
  }
348
- exports.trimUndefined = trimUndefined;
349
403
  const CROCKFORD_CHARACTERS = '123456789ABCDEFGHJKLMNPQRSTVWXYZ';
350
404
  function bytesToCrockford(buffer) {
351
405
  let value = 0;
@@ -364,4 +418,3 @@ function bytesToCrockford(buffer) {
364
418
  }
365
419
  return crockford.join('');
366
420
  }
367
- exports.bytesToCrockford = bytesToCrockford;
@@ -0,0 +1,434 @@
1
+ import { Boom } from '@hapi/boom'
2
+ import axios, { AxiosRequestConfig } from 'axios'
3
+ import { randomBytes, createHash } from 'crypto'
4
+ import { platform, release } from 'os'
5
+ import { Logger } from 'pino'
6
+ import { proto } from '../../WAProto'
7
+ import { version as baileysVersion } from '../Defaults/baileys-version.json'
8
+ import { BaileysEventEmitter, BaileysEventMap, DisconnectReason, WACallUpdateType, WAVersion } from '../Types'
9
+ import { BinaryNode, getAllBinaryNodeChildren, jidDecode } from '../WABinary'
10
+
11
+ const PLATFORM_MAP = {
12
+ 'aix': 'AIX',
13
+ 'darwin': 'Mac OS',
14
+ 'win32': 'Windows',
15
+ 'android': 'Android'
16
+ }
17
+
18
+ export const Browsers = {
19
+ ubuntu: browser => ['Ubuntu', browser, '20.0.04'] as [string, string, string],
20
+ macOS: browser => ['Mac OS', browser, '10.15.7'] as [string, string, string],
21
+ baileys: browser => ['Baileys', browser, '4.0.0'] as [string, string, string],
22
+ windows: browser => ['Windows', browser, '10.0.22621'] as [string, string, string],
23
+ /** The appropriate browser based on your OS & release */
24
+ appropriate: browser => [ PLATFORM_MAP[platform()] || 'Ubuntu', browser, release() ] as [string, string, string]
25
+ }
26
+
27
+ export const BufferJSON = {
28
+ replacer: (k, value: any) => {
29
+ if(Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === 'Buffer') {
30
+ return { type: 'Buffer', data: Buffer.from(value?.data || value).toString('base64') }
31
+ }
32
+
33
+ return value
34
+ },
35
+ reviver: (_, value: any) => {
36
+ if(typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {
37
+ const val = value.data || value.value
38
+ return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || [])
39
+ }
40
+
41
+ return value
42
+ }
43
+ }
44
+
45
+ export const getKeyAuthor = (
46
+ key: proto.IMessageKey | undefined | null,
47
+ meId: string = 'me'
48
+ ) => (
49
+ (key?.fromMe ? meId : key?.participant || key?.remoteJid) || ''
50
+ )
51
+
52
+ export const writeRandomPadMax16 = (msg: Uint8Array) => {
53
+ const pad = randomBytes(1)
54
+ pad[0] &= 0xf
55
+ if(!pad[0]) {
56
+ pad[0] = 0xf
57
+ }
58
+
59
+ return Buffer.concat([msg, Buffer.alloc(pad[0], pad[0])])
60
+ }
61
+
62
+ export const unpadRandomMax16 = (e: Uint8Array | Buffer) => {
63
+ const t = new Uint8Array(e)
64
+ if(0 === t.length) {
65
+ throw new Error('unpadPkcs7 given empty bytes')
66
+ }
67
+
68
+ var r = t[t.length - 1]
69
+ if(r > t.length) {
70
+ throw new Error(`unpad given ${t.length} bytes, but pad is ${r}`)
71
+ }
72
+
73
+ return new Uint8Array(t.buffer, t.byteOffset, t.length - r)
74
+ }
75
+
76
+ export const encodeWAMessage = (message: proto.IMessage) => (
77
+ writeRandomPadMax16(
78
+ proto.Message.encode(message).finish()
79
+ )
80
+ )
81
+
82
+ export const generateRegistrationId = (): number => {
83
+ return Uint16Array.from(randomBytes(2))[0] & 16383
84
+ }
85
+
86
+ export const encodeBigEndian = (e: number, t = 4) => {
87
+ let r = e
88
+ const a = new Uint8Array(t)
89
+ for(let i = t - 1; i >= 0; i--) {
90
+ a[i] = 255 & r
91
+ r >>>= 8
92
+ }
93
+
94
+ return a
95
+ }
96
+
97
+ export const toNumber = (t: Long | number | null | undefined): number => ((typeof t === 'object' && t) ? ('toNumber' in t ? t.toNumber() : (t as any).low) : t)
98
+
99
+ /** unix timestamp of a date in seconds */
100
+ export const unixTimestampSeconds = (date: Date = new Date()) => Math.floor(date.getTime() / 1000)
101
+
102
+ export type DebouncedTimeout = ReturnType<typeof debouncedTimeout>
103
+
104
+ export const debouncedTimeout = (intervalMs: number = 1000, task?: () => void) => {
105
+ let timeout: NodeJS.Timeout | undefined
106
+ return {
107
+ start: (newIntervalMs?: number, newTask?: () => void) => {
108
+ task = newTask || task
109
+ intervalMs = newIntervalMs || intervalMs
110
+ timeout && clearTimeout(timeout)
111
+ timeout = setTimeout(() => task?.(), intervalMs)
112
+ },
113
+ cancel: () => {
114
+ timeout && clearTimeout(timeout)
115
+ timeout = undefined
116
+ },
117
+ setTask: (newTask: () => void) => task = newTask,
118
+ setInterval: (newInterval: number) => intervalMs = newInterval
119
+ }
120
+ }
121
+
122
+ export const delay = (ms: number) => delayCancellable (ms).delay
123
+
124
+ export const delayCancellable = (ms: number) => {
125
+ const stack = new Error().stack
126
+ let timeout: NodeJS.Timeout
127
+ let reject: (error) => void
128
+ const delay: Promise<void> = new Promise((resolve, _reject) => {
129
+ timeout = setTimeout(resolve, ms)
130
+ reject = _reject
131
+ })
132
+ const cancel = () => {
133
+ clearTimeout (timeout)
134
+ reject(
135
+ new Boom('Cancelled', {
136
+ statusCode: 500,
137
+ data: {
138
+ stack
139
+ }
140
+ })
141
+ )
142
+ }
143
+
144
+ return { delay, cancel }
145
+ }
146
+
147
+ export async function promiseTimeout<T>(ms: number | undefined, promise: (resolve: (v: T) => void, reject: (error) => void) => void) {
148
+ if(!ms) {
149
+ return new Promise(promise)
150
+ }
151
+
152
+ const stack = new Error().stack
153
+ // Create a promise that rejects in <ms> milliseconds
154
+ const { delay, cancel } = delayCancellable (ms)
155
+ const p = new Promise((resolve, reject) => {
156
+ delay
157
+ .then(() => reject(
158
+ new Boom('Timed Out', {
159
+ statusCode: DisconnectReason.timedOut,
160
+ data: {
161
+ stack
162
+ }
163
+ })
164
+ ))
165
+ .catch (err => reject(err))
166
+
167
+ promise (resolve, reject)
168
+ })
169
+ .finally (cancel)
170
+ return p as Promise<T>
171
+ }
172
+
173
+ export const generateMessageIDV2 = (userId?: string): string => {
174
+ const data = Buffer.alloc(8 + 20 + 16)
175
+ data.writeBigUInt64BE(BigInt(Math.floor(Date.now() / 1000)))
176
+
177
+ if(userId) {
178
+ const id = jidDecode(userId)
179
+ if(id?.user) {
180
+ data.write(id.user, 8)
181
+ data.write('@c.us', 8 + id.user.length)
182
+ }
183
+ }
184
+
185
+ const random = randomBytes(16)
186
+ random.copy(data, 28)
187
+
188
+ const hash = createHash('sha256').update(data).digest()
189
+ return 'ASS' + hash.toString('hex').toUpperCase().substring(0, 18)
190
+ }
191
+
192
+ // generate a random ID to attach to a message
193
+ export const generateMessageID = () => 'SSA' + randomBytes(6).toString('hex').toUpperCase()
194
+
195
+ export function bindWaitForEvent<T extends keyof BaileysEventMap>(ev: BaileysEventEmitter, event: T) {
196
+ return async(check: (u: BaileysEventMap[T]) => boolean | undefined, timeoutMs?: number) => {
197
+ let listener: (item: BaileysEventMap[T]) => void
198
+ let closeListener: any
199
+ await (
200
+ promiseTimeout<void>(
201
+ timeoutMs,
202
+ (resolve, reject) => {
203
+ closeListener = ({ connection, lastDisconnect }) => {
204
+ if(connection === 'close') {
205
+ reject(
206
+ lastDisconnect?.error
207
+ || new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed })
208
+ )
209
+ }
210
+ }
211
+
212
+ ev.on('connection.update', closeListener)
213
+ listener = (update) => {
214
+ if(check(update)) {
215
+ resolve()
216
+ }
217
+ }
218
+
219
+ ev.on(event, listener)
220
+ }
221
+ )
222
+ .finally(() => {
223
+ ev.off(event, listener)
224
+ ev.off('connection.update', closeListener)
225
+ })
226
+ )
227
+ }
228
+ }
229
+
230
+ export const bindWaitForConnectionUpdate = (ev: BaileysEventEmitter) => bindWaitForEvent(ev, 'connection.update')
231
+
232
+ export const printQRIfNecessaryListener = (ev: BaileysEventEmitter, logger: Logger) => {
233
+ ev.on('connection.update', async({ qr }) => {
234
+ if(qr) {
235
+ const QR = await import('qrcode-terminal')
236
+ .then(m => m.default || m)
237
+ .catch(() => {
238
+ logger.error('QR code terminal not added as dependency')
239
+ })
240
+ QR?.generate(qr, { small: true })
241
+ }
242
+ })
243
+ }
244
+
245
+ /**
246
+ * utility that fetches latest baileys version from the master branch.
247
+ * Use to ensure your WA connection is always on the latest version
248
+ */
249
+ export const fetchLatestBaileysVersion = async(options: AxiosRequestConfig<any> = { }) => {
250
+ const URL = 'https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json'
251
+ try {
252
+ const result = await axios.get<{ version: WAVersion }>(
253
+ URL,
254
+ {
255
+ ...options,
256
+ responseType: 'json'
257
+ }
258
+ )
259
+ return {
260
+ version: result.data.version,
261
+ isLatest: true
262
+ }
263
+ } catch(error) {
264
+ return {
265
+ version: baileysVersion as WAVersion,
266
+ isLatest: false,
267
+ error
268
+ }
269
+ }
270
+ }
271
+
272
+ /**
273
+ * A utility that fetches the latest web version of whatsapp.
274
+ * Use to ensure your WA connection is always on the latest version
275
+ */
276
+ export const fetchLatestWaWebVersion = async(options: AxiosRequestConfig<any>) => {
277
+ try {
278
+ const result = await axios.get(
279
+ 'https://web.whatsapp.com/check-update?version=1&platform=web',
280
+ {
281
+ ...options,
282
+ responseType: 'json'
283
+ }
284
+ )
285
+ const version = result.data.currentVersion.split('.')
286
+ return {
287
+ version: [+version[0], +version[1], +version[2]] as WAVersion,
288
+ isLatest: true
289
+ }
290
+ } catch(error) {
291
+ return {
292
+ version: baileysVersion as WAVersion,
293
+ isLatest: false,
294
+ error
295
+ }
296
+ }
297
+ }
298
+
299
+ /** unique message tag prefix for MD clients */
300
+ export const generateMdTagPrefix = () => {
301
+ const bytes = randomBytes(4)
302
+ return `${bytes.readUInt16BE()}.${bytes.readUInt16BE(2)}-`
303
+ }
304
+
305
+ const STATUS_MAP: { [_: string]: proto.WebMessageInfo.Status } = {
306
+ 'played': proto.WebMessageInfo.Status.PLAYED,
307
+ 'read': proto.WebMessageInfo.Status.READ,
308
+ 'read-self': proto.WebMessageInfo.Status.READ
309
+ }
310
+ /**
311
+ * Given a type of receipt, returns what the new status of the message should be
312
+ * @param type type from receipt
313
+ */
314
+ export const getStatusFromReceiptType = (type: string | undefined) => {
315
+ const status = STATUS_MAP[type!]
316
+ if(typeof type === 'undefined') {
317
+ return proto.WebMessageInfo.Status.DELIVERY_ACK
318
+ }
319
+
320
+ return status
321
+ }
322
+
323
+ const CODE_MAP: { [_: string]: DisconnectReason } = {
324
+ conflict: DisconnectReason.connectionReplaced
325
+ }
326
+
327
+ /**
328
+ * Stream errors generally provide a reason, map that to a baileys DisconnectReason
329
+ * @param reason the string reason given, eg. "conflict"
330
+ */
331
+ export const getErrorCodeFromStreamError = (node: BinaryNode) => {
332
+ const [reasonNode] = getAllBinaryNodeChildren(node)
333
+ let reason = reasonNode?.tag || 'unknown'
334
+ const statusCode = +(node.attrs.code || CODE_MAP[reason] || DisconnectReason.badSession)
335
+
336
+ if(statusCode === DisconnectReason.restartRequired) {
337
+ reason = 'restart required'
338
+ }
339
+
340
+ return {
341
+ reason,
342
+ statusCode
343
+ }
344
+ }
345
+
346
+ export const getCallStatusFromNode = ({ tag, attrs }: BinaryNode) => {
347
+ let status: WACallUpdateType
348
+ switch (tag) {
349
+ case 'offer':
350
+ case 'offer_notice':
351
+ status = 'offer'
352
+ break
353
+ case 'terminate':
354
+ if(attrs.reason === 'timeout') {
355
+ status = 'timeout'
356
+ } else {
357
+ status = 'reject'
358
+ }
359
+
360
+ break
361
+ case 'reject':
362
+ status = 'reject'
363
+ break
364
+ case 'accept':
365
+ status = 'accept'
366
+ break
367
+ default:
368
+ status = 'ringing'
369
+ break
370
+ }
371
+
372
+ return status
373
+ }
374
+
375
+ const UNEXPECTED_SERVER_CODE_TEXT = 'Unexpected server response: '
376
+
377
+ export const getCodeFromWSError = (error: Error) => {
378
+ let statusCode = 500
379
+ if(error?.message?.includes(UNEXPECTED_SERVER_CODE_TEXT)) {
380
+ const code = +error?.message.slice(UNEXPECTED_SERVER_CODE_TEXT.length)
381
+ if(!Number.isNaN(code) && code >= 400) {
382
+ statusCode = code
383
+ }
384
+ } else if(
385
+ (error as any)?.code?.startsWith('E')
386
+ || error?.message?.includes('timed out')
387
+ ) { // handle ETIMEOUT, ENOTFOUND etc
388
+ statusCode = 408
389
+ }
390
+
391
+ return statusCode
392
+ }
393
+
394
+ /**
395
+ * Is the given platform WA business
396
+ * @param platform AuthenticationCreds.platform
397
+ */
398
+ export const isWABusinessPlatform = (platform: string) => {
399
+ return platform === 'smbi' || platform === 'smba'
400
+ }
401
+
402
+ export function trimUndefined(obj: any) {
403
+ for(const key in obj) {
404
+ if(typeof obj[key] === 'undefined') {
405
+ delete obj[key]
406
+ }
407
+ }
408
+
409
+ return obj
410
+ }
411
+
412
+ const CROCKFORD_CHARACTERS = '123456789ABCDEFGHJKLMNPQRSTVWXYZ'
413
+
414
+ export function bytesToCrockford(buffer: Buffer): string {
415
+ let value = 0
416
+ let bitCount = 0
417
+ const crockford: string[] = []
418
+
419
+ for(let i = 0; i < buffer.length; i++) {
420
+ value = (value << 8) | (buffer[i] & 0xff)
421
+ bitCount += 8
422
+
423
+ while(bitCount >= 5) {
424
+ crockford.push(CROCKFORD_CHARACTERS.charAt((value >>> (bitCount - 5)) & 31))
425
+ bitCount -= 5
426
+ }
427
+ }
428
+
429
+ if(bitCount > 0) {
430
+ crockford.push(CROCKFORD_CHARACTERS.charAt((value << (5 - bitCount)) & 31))
431
+ }
432
+
433
+ return crockford.join('')
434
+ }