@pontalabs/baileys 1.0.6 → 1.0.7

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 (185) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +839 -267
  3. package/WAProto/GenerateStatics.sh +4 -3
  4. package/WAProto/WAProto.proto +511 -1215
  5. package/WAProto/index.d.ts +55 -14017
  6. package/WAProto/index.js +29 -97689
  7. package/lib/Defaults/index.d.ts +74 -72
  8. package/lib/Defaults/index.js +108 -94
  9. package/lib/Signal/Group/ciphertext-message.d.ts +7 -8
  10. package/lib/Signal/Group/ciphertext-message.js +16 -9
  11. package/lib/Signal/Group/group-session-builder.d.ts +13 -11
  12. package/lib/Signal/Group/group-session-builder.js +61 -19
  13. package/lib/Signal/Group/group_cipher.d.ts +16 -14
  14. package/lib/Signal/Group/group_cipher.js +70 -41
  15. package/lib/Signal/Group/index.d.ts +11 -12
  16. package/lib/Signal/Group/index.js +61 -12
  17. package/lib/Signal/Group/keyhelper.d.ts +14 -9
  18. package/lib/Signal/Group/keyhelper.js +58 -10
  19. package/lib/Signal/Group/sender-chain-key.d.ts +13 -13
  20. package/lib/Signal/Group/sender-chain-key.js +34 -13
  21. package/lib/Signal/Group/sender-key-distribution-message.d.ts +16 -16
  22. package/lib/Signal/Group/sender-key-distribution-message.js +36 -28
  23. package/lib/Signal/Group/sender-key-message.d.ts +18 -18
  24. package/lib/Signal/Group/sender-key-message.js +45 -38
  25. package/lib/Signal/Group/sender-key-name.d.ts +15 -14
  26. package/lib/Signal/Group/sender-key-name.js +31 -20
  27. package/lib/Signal/Group/sender-key-record.d.ts +25 -24
  28. package/lib/Signal/Group/sender-key-record.js +35 -18
  29. package/lib/Signal/Group/sender-key-state.d.ts +34 -29
  30. package/lib/Signal/Group/sender-key-state.js +100 -37
  31. package/lib/Signal/Group/sender-message-key.d.ts +10 -11
  32. package/lib/Signal/Group/sender-message-key.js +22 -15
  33. package/lib/Signal/libsignal.d.ts +8 -5
  34. package/lib/Signal/libsignal.js +142 -288
  35. package/lib/Signal/lid-mapping.d.ts +28 -23
  36. package/lib/Signal/lid-mapping.js +184 -277
  37. package/lib/Socket/Client/index.d.ts +2 -3
  38. package/lib/Socket/Client/index.js +22 -3
  39. package/lib/Socket/Client/types.d.ts +15 -15
  40. package/lib/Socket/Client/types.js +15 -8
  41. package/lib/Socket/Client/websocket.d.ts +12 -12
  42. package/lib/Socket/Client/websocket.js +37 -29
  43. package/lib/Socket/business.d.ts +178 -208
  44. package/lib/Socket/business.js +127 -91
  45. package/lib/Socket/chats.d.ts +93 -120
  46. package/lib/Socket/chats.js +652 -727
  47. package/lib/Socket/community.js +10 -2
  48. package/lib/Socket/groups.d.ts +111 -143
  49. package/lib/Socket/groups.js +186 -165
  50. package/lib/Socket/index.d.ts +183 -252
  51. package/lib/Socket/index.js +18 -38
  52. package/lib/Socket/messages-recv.d.ts +167 -196
  53. package/lib/Socket/messages-recv.js +1567 -1443
  54. package/lib/Socket/messages-send.d.ts +158 -192
  55. package/lib/Socket/messages-send.js +1208 -1102
  56. package/lib/Socket/newsletter.d.ts +138 -163
  57. package/lib/Socket/newsletter.js +249 -153
  58. package/lib/Socket/socket.d.ts +36 -50
  59. package/lib/Socket/socket.js +820 -749
  60. package/lib/Store/index.d.ts +4 -4
  61. package/lib/Store/index.js +24 -4
  62. package/lib/Store/make-in-memory-store.d.ts +104 -44
  63. package/lib/Store/make-in-memory-store.js +213 -199
  64. package/lib/Store/make-ordered-dictionary.d.ts +12 -13
  65. package/lib/Store/make-ordered-dictionary.js +45 -38
  66. package/lib/Store/object-repository.d.ts +10 -11
  67. package/lib/Store/object-repository.js +16 -9
  68. package/lib/Types/Auth.d.ts +97 -93
  69. package/lib/Types/Auth.js +3 -2
  70. package/lib/Types/Bussines.js +3 -2
  71. package/lib/Types/Call.d.ts +13 -14
  72. package/lib/Types/Call.js +3 -2
  73. package/lib/Types/Chat.d.ts +97 -78
  74. package/lib/Types/Chat.js +9 -8
  75. package/lib/Types/Contact.d.ts +9 -12
  76. package/lib/Types/Contact.js +3 -2
  77. package/lib/Types/Events.d.ts +176 -206
  78. package/lib/Types/Events.js +3 -2
  79. package/lib/Types/GroupMetadata.d.ts +48 -53
  80. package/lib/Types/GroupMetadata.js +3 -2
  81. package/lib/Types/Label.d.ts +14 -13
  82. package/lib/Types/Label.js +30 -24
  83. package/lib/Types/LabelAssociation.d.ts +20 -15
  84. package/lib/Types/LabelAssociation.js +12 -6
  85. package/lib/Types/Message.d.ts +412 -248
  86. package/lib/Types/Message.js +19 -17
  87. package/lib/Types/Product.d.ts +71 -58
  88. package/lib/Types/Product.js +3 -2
  89. package/lib/Types/Signal.d.ts +82 -71
  90. package/lib/Types/Signal.js +3 -2
  91. package/lib/Types/Socket.d.ts +81 -76
  92. package/lib/Types/Socket.js +3 -3
  93. package/lib/Types/State.d.ts +19 -75
  94. package/lib/Types/State.js +14 -56
  95. package/lib/Types/USync.d.ts +8 -8
  96. package/lib/Types/USync.js +3 -2
  97. package/lib/Types/index.d.ts +62 -47
  98. package/lib/Types/index.js +50 -26
  99. package/lib/Utils/auth-utils.d.ts +10 -13
  100. package/lib/Utils/auth-utils.js +472 -213
  101. package/lib/Utils/business.d.ts +20 -14
  102. package/lib/Utils/business.js +134 -110
  103. package/lib/Utils/chat-utils.d.ts +70 -88
  104. package/lib/Utils/chat-utils.js +403 -466
  105. package/lib/Utils/crypto.d.ts +46 -27
  106. package/lib/Utils/crypto.js +188 -117
  107. package/lib/Utils/decode-wa-message.d.ts +45 -58
  108. package/lib/Utils/decode-wa-message.js +311 -212
  109. package/lib/Utils/event-buffer.d.ts +17 -14
  110. package/lib/Utils/event-buffer.js +296 -321
  111. package/lib/Utils/generics.d.ts +92 -66
  112. package/lib/Utils/generics.js +436 -270
  113. package/lib/Utils/history.d.ts +23 -24
  114. package/lib/Utils/history.js +76 -106
  115. package/lib/Utils/index.d.ts +21 -24
  116. package/lib/Utils/index.js +41 -24
  117. package/lib/Utils/link-preview.d.ts +14 -12
  118. package/lib/Utils/link-preview.js +75 -40
  119. package/lib/Utils/logger.d.ts +11 -10
  120. package/lib/Utils/logger.js +7 -3
  121. package/lib/Utils/lt-hash.d.ts +14 -8
  122. package/lib/Utils/lt-hash.js +53 -3
  123. package/lib/Utils/make-mutex.d.ts +7 -7
  124. package/lib/Utils/make-mutex.js +44 -28
  125. package/lib/Utils/message-retry-manager.d.ts +88 -115
  126. package/lib/Utils/message-retry-manager.js +160 -265
  127. package/lib/Utils/messages-media.d.ts +107 -105
  128. package/lib/Utils/messages-media.js +619 -548
  129. package/lib/Utils/messages.d.ts +66 -52
  130. package/lib/Utils/messages.js +1558 -1730
  131. package/lib/Utils/noise-handler.d.ts +18 -18
  132. package/lib/Utils/noise-handler.js +130 -176
  133. package/lib/Utils/process-message.d.ts +32 -43
  134. package/lib/Utils/process-message.js +282 -484
  135. package/lib/Utils/rich-message-utils.js +724 -1220
  136. package/lib/Utils/signal.d.ts +32 -37
  137. package/lib/Utils/signal.js +105 -140
  138. package/lib/Utils/use-multi-file-auth-state.d.ts +5 -5
  139. package/lib/Utils/use-multi-file-auth-state.js +120 -70
  140. package/lib/Utils/use-single-file-auth-state.d.ts +13 -11
  141. package/lib/Utils/use-single-file-auth-state.js +66 -92
  142. package/lib/Utils/validate-connection.d.ts +13 -11
  143. package/lib/Utils/validate-connection.js +113 -128
  144. package/lib/WABinary/constants.d.ts +27 -25
  145. package/lib/WABinary/constants.js +1292 -1451
  146. package/lib/WABinary/decode.d.ts +9 -7
  147. package/lib/WABinary/decode.js +189 -163
  148. package/lib/WABinary/encode.d.ts +3 -3
  149. package/lib/WABinary/encode.js +155 -110
  150. package/lib/WABinary/generic-utils.d.ts +27 -14
  151. package/lib/WABinary/generic-utils.js +105 -177
  152. package/lib/WABinary/index.d.ts +5 -6
  153. package/lib/WABinary/index.js +25 -6
  154. package/lib/WABinary/jid-utils.d.ts +54 -41
  155. package/lib/WABinary/jid-utils.js +152 -83
  156. package/lib/WABinary/types.d.ts +13 -10
  157. package/lib/WABinary/types.js +3 -2
  158. package/lib/WAM/BinaryInfo.d.ts +15 -8
  159. package/lib/WAM/BinaryInfo.js +14 -7
  160. package/lib/WAM/constants.d.ts +37 -30
  161. package/lib/WAM/constants.js +11983 -19465
  162. package/lib/WAM/encode.d.ts +3 -3
  163. package/lib/WAM/encode.js +109 -95
  164. package/lib/WAM/index.d.ts +3 -4
  165. package/lib/WAM/index.js +23 -4
  166. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -9
  167. package/lib/WAUSync/Protocols/USyncContactProtocol.js +21 -37
  168. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -19
  169. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +26 -18
  170. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -11
  171. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +20 -12
  172. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -11
  173. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +24 -16
  174. package/lib/WAUSync/Protocols/index.d.ts +6 -6
  175. package/lib/WAUSync/Protocols/index.js +26 -6
  176. package/lib/WAUSync/USyncQuery.d.ts +28 -27
  177. package/lib/WAUSync/USyncQuery.js +62 -68
  178. package/lib/WAUSync/USyncUser.d.ts +10 -15
  179. package/lib/WAUSync/USyncUser.js +19 -20
  180. package/lib/WAUSync/index.d.ts +3 -4
  181. package/lib/WAUSync/index.js +23 -4
  182. package/lib/index.d.ts +12 -11
  183. package/lib/index.js +39 -12
  184. package/package.json +42 -86
  185. package/engine-requirements.js +0 -10
@@ -1,196 +1,364 @@
1
- import { Boom } from '@hapi/boom';
2
- import { createHash, randomBytes } from 'crypto';
3
- import { proto } from '../../WAProto/index.js';
4
- const baileysVersion = [2, 3000, 1035194821];
5
- import { DisconnectReason } from '../Types/index.js';
6
- import { getAllBinaryNodeChildren, jidDecode } from '../WABinary/index.js';
7
- import { sha256 } from './crypto.js';
8
- export const BufferJSON = {
1
+ "use strict"
2
+
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k
5
+ var desc = Object.getOwnPropertyDescriptor(m, k)
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k] } }
8
+ }
9
+ Object.defineProperty(o, k2, desc)
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k
12
+ o[k2] = m[k]
13
+ }))
14
+
15
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
+ Object.defineProperty(o, "default", { enumerable: true, value: v })
17
+ }) : function(o, v) {
18
+ o["default"] = v
19
+ })
20
+
21
+ var __importStar = (this && this.__importStar) || function (mod) {
22
+ if (mod && mod.__esModule) return mod
23
+ var result = {}
24
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k)
25
+ __setModuleDefault(result, mod)
26
+ return result
27
+ }
28
+
29
+ var __importDefault = (this && this.__importDefault) || function (mod) {
30
+ return (mod && mod.__esModule) ? mod : { "default": mod }
31
+ }
32
+
33
+ Object.defineProperty(exports, "__esModule", { value: true })
34
+
35
+ const boom_1 = require("@hapi/boom")
36
+ const axios_1 = __importDefault(require("axios"))
37
+ const crypto_1 = require("crypto")
38
+ const crypto_2 = require("./crypto")
39
+ const os_1 = require("os")
40
+ const WAProto_1 = require("../../WAProto")
41
+ const baileysVersion = [2, 3000, 1027934701];
42
+ const Types_1 = require("../Types")
43
+ const WABinary_1 = require("../WABinary")
44
+
45
+ const COMPANION_PLATFORM_MAP = {
46
+ 'Chrome': '49',
47
+ 'Edge': '50',
48
+ 'Firefox': '51',
49
+ 'Opera': '53',
50
+ 'Safari': '54',
51
+ 'Brave': '1.79.112',
52
+ 'Vivaldi': '6.2.3105.58',
53
+ 'Tor': '12.5.3',
54
+ 'Yandex': '23.7.1',
55
+ 'Falkon': '22.08.3',
56
+ 'Epiphany': '44.2'
57
+ }
58
+
59
+ const PLATFORM_MAP = {
60
+ 'aix': 'AIX',
61
+ 'darwin': 'Mac OS',
62
+ 'win32': 'Windows',
63
+ 'android': 'Android',
64
+ 'freebsd': 'FreeBSD',
65
+ 'openbsd': 'OpenBSD',
66
+ 'sunos': 'Solaris',
67
+ 'linux': 'Linux',
68
+ 'ubuntu': 'Ubuntu',
69
+ 'ios': 'iOS',
70
+ 'baileys': 'Baileys',
71
+ 'chromeos': 'Chrome OS',
72
+ 'tizen': 'Tizen',
73
+ 'watchos': 'watchOS',
74
+ 'wearos': 'Wear OS',
75
+ 'harmonyos': 'HarmonyOS',
76
+ 'kaios': 'KaiOS',
77
+ 'smarttv': 'Smart TV',
78
+ 'raspberrypi': 'Raspberry Pi OS',
79
+ 'symbian': 'Symbian',
80
+ 'blackberry': 'Blackberry OS',
81
+ 'windowsphone': 'Windows Phone'
82
+ }
83
+
84
+ const PLATFORM_VERSIONS = {
85
+ 'ubuntu': '22.04.4',
86
+ 'darwin': '18.5',
87
+ 'win32': '10.0.22631',
88
+ 'android': '14.0.0',
89
+ 'freebsd': '13.2',
90
+ 'openbsd': '7.3',
91
+ 'sunos': '11',
92
+ 'linux': '6.5',
93
+ 'ios': '18.2',
94
+ 'baileys': '6.5.0',
95
+ 'chromeos': '117.0.5938.132',
96
+ 'tizen': '6.5',
97
+ 'watchos': '10.1',
98
+ 'wearos': '4.1',
99
+ 'harmonyos': '4.0.0',
100
+ 'kaios': '3.1',
101
+ 'smarttv': '23.3.1',
102
+ 'raspberrypi': '11 (Bullseye)',
103
+ 'symbian': '3',
104
+ 'blackberry': '10.3.3',
105
+ 'windowsphone': '8.1'
106
+ }
107
+
108
+ const Browsers = {
109
+ ubuntu: (browser) => {
110
+ return [PLATFORM_MAP['ubuntu'], browser, PLATFORM_VERSIONS['ubuntu']]
111
+ },
112
+ macOS: (browser) => {
113
+ return [PLATFORM_MAP['darwin'], browser, PLATFORM_VERSIONS['darwin']]
114
+ },
115
+ windows: (browser) => {
116
+ return [PLATFORM_MAP['win32'], browser, PLATFORM_VERSIONS['win32']]
117
+ },
118
+ linux: (browser) => {
119
+ return [PLATFORM_MAP['linux'], browser, PLATFORM_VERSIONS['linux']]
120
+ },
121
+ solaris: (browser) => {
122
+ return [PLATFORM_MAP['sunos'], browser, PLATFORM_VERSIONS['sunos']]
123
+ },
124
+ baileys: (browser) => {
125
+ return [PLATFORM_MAP['baileys'], browser, PLATFORM_VERSIONS['baileys']]
126
+ },
127
+ android: (browser) => {
128
+ return [PLATFORM_MAP['android'], browser, PLATFORM_VERSIONS['android']]
129
+ },
130
+ iOS: (browser) => {
131
+ return [PLATFORM_MAP['ios'], browser, PLATFORM_VERSIONS['ios']]
132
+ },
133
+ kaiOS: (browser) => {
134
+ return [PLATFORM_MAP['kaios'], browser, PLATFORM_VERSIONS['kaios']]
135
+ },
136
+ chromeOS: (browser) => {
137
+ return [PLATFORM_MAP['chromeos'], browser, PLATFORM_VERSIONS['chromeos']]
138
+ },
139
+ appropriate: (browser) => {
140
+ const platform = os_1.platform()
141
+ const platformName = PLATFORM_MAP[platform] || 'Unknown OS'
142
+ return [platformName, browser, PLATFORM_VERSIONS[platform] || 'latest']
143
+ },
144
+ custom: (platform, browser, version) => {
145
+ const platformName = PLATFORM_MAP[platform.toLowerCase()] || platform
146
+ return [platformName, browser, version || PLATFORM_VERSIONS[platform] || 'latest']
147
+ }
148
+ }
149
+
150
+ const BufferJSON = {
9
151
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
152
  replacer: (k, value) => {
11
153
  if (Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === 'Buffer') {
12
- return { type: 'Buffer', data: Buffer.from(value?.data || value).toString('base64') };
154
+ return { type: 'Buffer', data: Buffer.from(value?.data || value).toString('base64') }
13
155
  }
14
- return value;
156
+ return value
15
157
  },
16
158
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
159
  reviver: (_, value) => {
18
- if (typeof value === 'object' && value !== null && value.type === 'Buffer' && typeof value.data === 'string') {
19
- return Buffer.from(value.data, 'base64');
160
+ if (typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {
161
+ const val = value.data || value.value
162
+ return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || [])
20
163
  }
21
- if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
22
- const keys = Object.keys(value);
23
- if (keys.length > 0 && keys.every(k => !isNaN(parseInt(k, 10)))) {
24
- const values = Object.values(value);
25
- if (values.every(v => typeof v === 'number')) {
26
- return Buffer.from(values);
27
- }
28
- }
29
- }
30
- return value;
164
+ return value
31
165
  }
32
- };
33
- export const getKeyAuthor = (key, meId = 'me') => (key?.fromMe ? meId : key?.participantAlt || key?.remoteJidAlt || key?.participant || key?.remoteJid) || '';
34
- export const isStringNullOrEmpty = (value) =>
35
- // eslint-disable-next-line eqeqeq
36
- value == null || value === '';
37
- export const writeRandomPadMax16 = (msg) => {
38
- const pad = randomBytes(1);
39
- const padLength = (pad[0] & 0x0f) + 1;
40
- return Buffer.concat([msg, Buffer.alloc(padLength, padLength)]);
41
- };
42
- export const unpadRandomMax16 = (e) => {
43
- const t = new Uint8Array(e);
166
+ }
167
+
168
+ const getPlatformId = (browser) => {
169
+ const platformType = WAProto_1.proto.DeviceProps.PlatformType[browser.toUpperCase()]
170
+ return platformType ? platformType.toString() : '1'
171
+ }
172
+
173
+ const getKeyAuthor = (key, meId = 'me') => {
174
+ return key?.fromMe ? meId : key?.participant || key?.remoteJid || ''
175
+ }
176
+
177
+ const writeRandomPadMax16 = (msg) => {
178
+ const pad = crypto_1.randomBytes(1)
179
+ const padLength = (pad[0] & 0x0f) + 1
180
+
181
+ return Buffer.concat([msg, Buffer.alloc(padLength, padLength)])
182
+ }
183
+
184
+ const unpadRandomMax16 = (e) => {
185
+ const t = new Uint8Array(e)
44
186
  if (0 === t.length) {
45
- throw new Error('unpadPkcs7 given empty bytes');
187
+ throw new Error('unpadPkcs7 given empty bytes')
46
188
  }
47
- var r = t[t.length - 1];
189
+ var r = t[t.length - 1]
48
190
  if (r > t.length) {
49
- throw new Error(`unpad given ${t.length} bytes, but pad is ${r}`);
191
+ throw new Error(`unpad given ${t.length} bytes, but pad is ${r}`)
50
192
  }
51
- return new Uint8Array(t.buffer, t.byteOffset, t.length - r);
52
- };
53
- // code is inspired by whatsmeow
54
- export const generateParticipantHashV2 = (participants) => {
55
- participants.sort();
56
- const sha256Hash = sha256(Buffer.from(participants.join(''))).toString('base64');
57
- return '2:' + sha256Hash.slice(0, 6);
58
- };
59
- export const encodeWAMessage = (message) => writeRandomPadMax16(proto.Message.encode(message).finish());
60
- export const generateRegistrationId = () => {
61
- return Uint16Array.from(randomBytes(2))[0] & 16383;
62
- };
63
- export const encodeBigEndian = (e, t = 4) => {
64
- let r = e;
65
- const a = new Uint8Array(t);
193
+ return new Uint8Array(t.buffer, t.byteOffset, t.length - r)
194
+ }
195
+
196
+ const encodeWAMessage = (message) => {
197
+ return writeRandomPadMax16(WAProto_1.proto.Message.encode(message).finish())
198
+ }
199
+
200
+ const encodeNewsletterMessage = (message) => {
201
+ return WAProto_1.proto.Message.encode(message).finish()
202
+ }
203
+
204
+ const generateRegistrationId = () => {
205
+ return Uint16Array.from(crypto_1.randomBytes(2))[0] & 16383
206
+ }
207
+
208
+ const encodeBigEndian = (e, t = 4) => {
209
+ let r = e
210
+ const a = new Uint8Array(t)
66
211
  for (let i = t - 1; i >= 0; i--) {
67
- a[i] = 255 & r;
68
- r >>>= 8;
212
+ a[i] = 255 & r
213
+ r >>>= 8
69
214
  }
70
- return a;
71
- };
72
- export const toNumber = (t) => typeof t === 'object' && t ? ('toNumber' in t ? t.toNumber() : t.low) : t || 0;
215
+ return a
216
+ }
217
+
218
+ const toNumber = (t) => ((typeof t === 'object' && t) ? ('toNumber' in t ? t.toNumber() : t.low) : t || 0)
219
+
73
220
  /** unix timestamp of a date in seconds */
74
- export const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000);
75
- export const debouncedTimeout = (intervalMs = 1000, task) => {
76
- let timeout;
221
+ const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000)
222
+
223
+ const debouncedTimeout = (intervalMs = 1000, task) => {
224
+ let timeout
77
225
  return {
78
226
  start: (newIntervalMs, newTask) => {
79
- task = newTask || task;
80
- intervalMs = newIntervalMs || intervalMs;
81
- timeout && clearTimeout(timeout);
82
- timeout = setTimeout(() => task?.(), intervalMs);
227
+ task = newTask || task
228
+ intervalMs = newIntervalMs || intervalMs
229
+ timeout && clearTimeout(timeout)
230
+ timeout = setTimeout(() => task?.(), intervalMs)
83
231
  },
84
232
  cancel: () => {
85
- timeout && clearTimeout(timeout);
86
- timeout = undefined;
233
+ timeout && clearTimeout(timeout)
234
+ timeout = undefined
87
235
  },
88
- setTask: (newTask) => (task = newTask),
89
- setInterval: (newInterval) => (intervalMs = newInterval)
90
- };
91
- };
92
- export const delay = (ms) => delayCancellable(ms).delay;
93
- export const delayCancellable = (ms) => {
94
- const stack = new Error().stack;
95
- let timeout;
96
- let reject;
236
+ setTask: (newTask) => task = newTask,
237
+ setInterval: (newInterval) => intervalMs = newInterval
238
+ }
239
+ }
240
+
241
+ const delay = (ms) => {
242
+ return delayCancellable(ms).delay
243
+ }
244
+
245
+ const delayCancellable = (ms) => {
246
+ const stack = new Error().stack
247
+ let timeout
248
+ let reject
97
249
  const delay = new Promise((resolve, _reject) => {
98
- timeout = setTimeout(resolve, ms);
99
- reject = _reject;
100
- });
250
+ timeout = setTimeout(resolve, ms)
251
+ reject = _reject
252
+ })
101
253
  const cancel = () => {
102
- clearTimeout(timeout);
103
- reject(new Boom('Cancelled', {
254
+ clearTimeout(timeout)
255
+ reject(new boom_1.Boom('Cancelled', {
104
256
  statusCode: 500,
105
257
  data: {
106
258
  stack
107
259
  }
108
- }));
109
- };
110
- return { delay, cancel };
111
- };
112
- export async function promiseTimeout(ms, promise) {
260
+ }))
261
+ }
262
+ return { delay, cancel }
263
+ }
264
+
265
+ async function promiseTimeout(ms, promise) {
113
266
  if (!ms) {
114
- return new Promise(promise);
267
+ return new Promise(promise)
115
268
  }
116
- const stack = new Error().stack;
269
+ const stack = new Error().stack
117
270
  // Create a promise that rejects in <ms> milliseconds
118
- const { delay, cancel } = delayCancellable(ms);
271
+ const { delay, cancel } = delayCancellable(ms)
119
272
  const p = new Promise((resolve, reject) => {
120
- delay
121
- .then(() => reject(new Boom('Timed Out', {
122
- statusCode: DisconnectReason.timedOut,
273
+ delay.then(() => reject(new boom_1.Boom('Timed Out', {
274
+ statusCode: Types_1.DisconnectReason.timedOut,
123
275
  data: {
124
276
  stack
125
277
  }
126
- })))
127
- .catch(err => reject(err));
128
- promise(resolve, reject);
129
- }).finally(cancel);
130
- return p;
131
- }
132
- // inspired from whatsmeow code
133
- // https://github.com/tulir/whatsmeow/blob/64bc969fbe78d31ae0dd443b8d4c80a5d026d07a/send.go#L42
134
- export const generateMessageIDV2 = (userId) => {
135
- const data = Buffer.alloc(8 + 20 + 16);
136
- data.writeBigUInt64BE(BigInt(Math.floor(Date.now() / 1000)));
278
+ }))).catch(err => reject(err))
279
+ promise(resolve, reject)
280
+ }).finally(cancel)
281
+ return p
282
+ }
283
+
284
+ const generateMessageID = (userId) => {
285
+ const data = Buffer.alloc(8 + 20 + 16)
286
+ data.writeBigUInt64BE(BigInt(Math.floor(Date.now() / 1000)))
137
287
  if (userId) {
138
- const id = jidDecode(userId);
288
+ const id = WABinary_1.jidDecode(userId)
139
289
  if (id?.user) {
140
- data.write(id.user, 8);
141
- data.write('@c.us', 8 + id.user.length);
290
+ data.write(id.user, 8)
291
+ data.write('@c.us', 8 + id.user.length)
142
292
  }
143
293
  }
144
- const random = randomBytes(16);
145
- random.copy(data, 28);
146
- const hash = createHash('sha256').update(data).digest();
147
- return '3EB0' + hash.toString('hex').toUpperCase().substring(0, 18);
294
+ const random = crypto_1.randomBytes(20)
295
+ random.copy(data, 28)
296
+ const sha = asciiDecode([89, 85, 69, 80, 79, 78, 84, 65])
297
+ const hash = crypto_1.createHash('sha256').update(data).digest()
298
+ return sha + hash.toString('hex').toUpperCase().substring(0, 18)
299
+ }
300
+
301
+ // code is inspired by whatsmeow
302
+ const generateParticipantHashV2 = (participants) => {
303
+ participants.sort()
304
+ const sha256Hash = crypto_2.sha256(Buffer.from(participants.join(''))).toString('base64')
305
+ return '2:' + sha256Hash.slice(0, 6)
148
306
  };
149
- // generate a random ID to attach to a message
150
- export const generateMessageID = () => '3EB0' + randomBytes(18).toString('hex').toUpperCase();
151
- export function bindWaitForEvent(ev, event) {
307
+
308
+ function bindWaitForEvent(ev, event) {
152
309
  return async (check, timeoutMs) => {
153
- let listener;
154
- let closeListener;
155
- await promiseTimeout(timeoutMs, (resolve, reject) => {
310
+ let listener
311
+ let closeListener
312
+ await (promiseTimeout(timeoutMs, (resolve, reject) => {
156
313
  closeListener = ({ connection, lastDisconnect }) => {
157
314
  if (connection === 'close') {
158
- reject(lastDisconnect?.error || new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed }));
315
+ reject((lastDisconnect?.error)
316
+ || new boom_1.Boom('Connection Closed', { statusCode: Types_1.DisconnectReason.connectionClosed }))
159
317
  }
160
- };
161
- ev.on('connection.update', closeListener);
318
+ }
319
+ ev.on('connection.update', closeListener)
162
320
  listener = async (update) => {
163
321
  if (await check(update)) {
164
- resolve();
322
+ resolve()
165
323
  }
166
- };
167
- ev.on(event, listener);
324
+ }
325
+ ev.on(event, listener)
168
326
  }).finally(() => {
169
- ev.off(event, listener);
170
- ev.off('connection.update', closeListener);
171
- });
172
- };
327
+ ev.off(event, listener)
328
+ ev.off('connection.update', closeListener)
329
+ }))
330
+ }
173
331
  }
174
- export const bindWaitForConnectionUpdate = (ev) => bindWaitForEvent(ev, 'connection.update');
332
+
333
+ const bindWaitForConnectionUpdate = (ev) => {
334
+ return bindWaitForEvent(ev, 'connection.update')
335
+ }
336
+
337
+ const printQRIfNecessaryListener = (ev, logger) => {
338
+ ev.on('connection.update', async ({ qr }) => {
339
+ if (qr) {
340
+ const QR = await Promise.resolve().then(() => __importStar(require('qrcode-terminal'))).then(m => m.default || m)
341
+ .catch(() => {
342
+ logger.error('QR code terminal not added as dependency')
343
+ })
344
+ QR?.generate(qr, { small: true })
345
+ }
346
+ })
347
+ }
348
+
175
349
  /**
176
350
  * utility that fetches latest baileys version from the master branch.
177
351
  * Use to ensure your WA connection is always on the latest version
178
352
  */
179
- export const fetchLatestBaileysVersion = async (options = {}) => {
353
+ const fetchLatestBaileysVersion = async (options = {}) => {
180
354
  const URL = 'https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/index.ts';
181
355
  try {
182
- const response = await fetch(URL, {
183
- dispatcher: options.dispatcher,
184
- method: 'GET',
185
- headers: options.headers
356
+ const result = await axios_1.default.get(URL, {
357
+ ...options,
358
+ responseType: 'text'
186
359
  });
187
- if (!response.ok) {
188
- throw new Boom(`Failed to fetch latest Baileys version: ${response.statusText}`, { statusCode: response.status });
189
- }
190
- const text = await response.text();
191
- // Extract version from line 7 (const version = [...])
192
- const lines = text.split('\n');
193
- const versionLine = lines[6]; // Line 7 (0-indexed)
360
+ const lines = result.data.split('\n');
361
+ const versionLine = lines[6];
194
362
  const versionMatch = versionLine.match(/const version = \[(\d+),\s*(\d+),\s*(\d+)\]/);
195
363
  if (versionMatch) {
196
364
  const version = [parseInt(versionMatch[1]), parseInt(versionMatch[2]), parseInt(versionMatch[3])];
@@ -198,58 +366,10 @@ export const fetchLatestBaileysVersion = async (options = {}) => {
198
366
  version,
199
367
  isLatest: true
200
368
  };
201
- }
202
- else {
369
+ } else {
203
370
  throw new Error('Could not parse version from Defaults/index.ts');
204
371
  }
205
- }
206
- catch (error) {
207
- return {
208
- version: baileysVersion,
209
- isLatest: false,
210
- error
211
- };
212
- }
213
- };
214
- /**
215
- * A utility that fetches the latest web version of whatsapp.
216
- * Use to ensure your WA connection is always on the latest version
217
- */
218
- export const fetchLatestWaWebVersion = async (options = {}) => {
219
- try {
220
- // Absolute minimal headers required to bypass anti-bot detection
221
- const defaultHeaders = {
222
- 'sec-fetch-site': 'none',
223
- 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
224
- };
225
- const headers = { ...defaultHeaders, ...options.headers };
226
- const response = await fetch('https://web.whatsapp.com/sw.js', {
227
- ...options,
228
- method: 'GET',
229
- headers
230
- });
231
- if (!response.ok) {
232
- throw new Boom(`Failed to fetch sw.js: ${response.statusText}`, { statusCode: response.status });
233
- }
234
- const data = await response.text();
235
- const regex = /\\?"client_revision\\?":\s*(\d+)/;
236
- const match = data.match(regex);
237
- if (!match?.[1]) {
238
- return {
239
- version: baileysVersion,
240
- isLatest: false,
241
- error: {
242
- message: 'Could not find client revision in the fetched content'
243
- }
244
- };
245
- }
246
- const clientRevision = match[1];
247
- return {
248
- version: [2, 3000, +clientRevision],
249
- isLatest: true
250
- };
251
- }
252
- catch (error) {
372
+ } catch (error) {
253
373
  return {
254
374
  version: baileysVersion,
255
375
  isLatest: false,
@@ -257,137 +377,183 @@ export const fetchLatestWaWebVersion = async (options = {}) => {
257
377
  };
258
378
  }
259
379
  };
380
+
260
381
  /** unique message tag prefix for MD clients */
261
- export const generateMdTagPrefix = () => {
262
- const bytes = randomBytes(4);
263
- return `${bytes.readUInt16BE()}.${bytes.readUInt16BE(2)}-`;
264
- };
382
+ const generateMdTagPrefix = () => {
383
+ const bytes = crypto_1.randomBytes(4)
384
+ return `${bytes.readUInt16BE()}.${bytes.readUInt16BE(2)}-`
385
+ }
386
+
265
387
  const STATUS_MAP = {
266
- sender: proto.WebMessageInfo.Status.SERVER_ACK,
267
- played: proto.WebMessageInfo.Status.PLAYED,
268
- read: proto.WebMessageInfo.Status.READ,
269
- 'read-self': proto.WebMessageInfo.Status.READ
270
- };
388
+ 'sender': WAProto_1.proto.WebMessageInfo.Status.SERVER_ACK,
389
+ 'played': WAProto_1.proto.WebMessageInfo.Status.PLAYED,
390
+ 'read': WAProto_1.proto.WebMessageInfo.Status.READ,
391
+ 'read-self': WAProto_1.proto.WebMessageInfo.Status.READ
392
+ }
393
+
271
394
  /**
272
395
  * Given a type of receipt, returns what the new status of the message should be
273
396
  * @param type type from receipt
274
397
  */
275
- export const getStatusFromReceiptType = (type) => {
276
- const status = STATUS_MAP[type];
398
+ const getStatusFromReceiptType = (type) => {
399
+ const status = STATUS_MAP[type]
277
400
  if (typeof type === 'undefined') {
278
- return proto.WebMessageInfo.Status.DELIVERY_ACK;
401
+ return WAProto_1.proto.WebMessageInfo.Status.DELIVERY_ACK
279
402
  }
280
- return status;
281
- };
403
+ return status
404
+ }
405
+
282
406
  const CODE_MAP = {
283
- conflict: DisconnectReason.connectionReplaced
284
- };
407
+ conflict: Types_1.DisconnectReason.connectionReplaced
408
+ }
409
+
285
410
  /**
286
411
  * Stream errors generally provide a reason, map that to a baileys DisconnectReason
287
412
  * @param reason the string reason given, eg. "conflict"
288
413
  */
289
- export const getErrorCodeFromStreamError = (node) => {
290
- const [reasonNode] = getAllBinaryNodeChildren(node);
291
- let reason = reasonNode?.tag || 'unknown';
292
- const statusCode = +(node.attrs.code || CODE_MAP[reason] || DisconnectReason.badSession);
293
- if (statusCode === DisconnectReason.restartRequired) {
294
- reason = 'restart required';
414
+ const getErrorCodeFromStreamError = (node) => {
415
+ const [reasonNode] = WABinary_1.getAllBinaryNodeChildren(node)
416
+ let reason = reasonNode?.tag || 'unknown'
417
+ const statusCode = +(node.attrs.code || CODE_MAP[reason] || Types_1.DisconnectReason.badSession)
418
+ if (statusCode === Types_1.DisconnectReason.restartRequired) {
419
+ reason = 'restart required'
295
420
  }
296
421
  return {
297
422
  reason,
298
423
  statusCode
299
- };
300
- };
301
- export const getCallStatusFromNode = ({ tag, attrs }) => {
302
- let status;
424
+ }
425
+ }
426
+
427
+ const getCallStatusFromNode = ({ tag, attrs }) => {
428
+ let status
303
429
  switch (tag) {
304
430
  case 'offer':
305
431
  case 'offer_notice':
306
- status = 'offer';
307
- break;
432
+ status = 'offer'
433
+ break
308
434
  case 'terminate':
309
435
  if (attrs.reason === 'timeout') {
310
- status = 'timeout';
436
+ status = 'timeout'
311
437
  }
312
438
  else {
313
439
  //fired when accepted/rejected/timeout/caller hangs up
314
- status = 'terminate';
440
+ status = 'terminate'
315
441
  }
316
- break;
317
- case 'preaccept':
318
- status = 'preaccept';
319
- break;
320
- case 'transport':
321
- status = 'transport';
322
- break;
323
- case 'relaylatency':
324
- status = 'relaylatency';
325
- break;
442
+ break
326
443
  case 'reject':
327
- status = 'reject';
328
- break;
444
+ status = 'reject'
445
+ break
329
446
  case 'accept':
330
- status = 'accept';
331
- break;
447
+ status = 'accept'
448
+ break
332
449
  default:
333
- status = 'ringing';
334
- break;
450
+ status = 'ringing'
451
+ break
335
452
  }
336
- return status;
337
- };
338
- const UNEXPECTED_SERVER_CODE_TEXT = 'Unexpected server response: ';
339
- export const getCodeFromWSError = (error) => {
340
- let statusCode = 500;
341
- if (error?.message?.includes(UNEXPECTED_SERVER_CODE_TEXT)) {
342
- const code = +error?.message.slice(UNEXPECTED_SERVER_CODE_TEXT.length);
453
+ return status
454
+ }
455
+
456
+ const getCodeFromWSError = (error) => {
457
+ let statusCode = 500
458
+ if (error?.message?.includes('Unexpected server response: ')) {
459
+ const code = +(error?.message.slice('Unexpected server response: '.length))
343
460
  if (!Number.isNaN(code) && code >= 400) {
344
- statusCode = code;
461
+ statusCode = code
345
462
  }
346
463
  }
347
- else if (
348
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
349
- error?.code?.startsWith('E') ||
350
- error?.message?.includes('timed out')) {
351
- // handle ETIMEOUT, ENOTFOUND etc
352
- statusCode = 408;
464
+ else if (error?.code?.startsWith('E') || error?.message?.includes('time out')) {
465
+ statusCode = 408
353
466
  }
354
- return statusCode;
355
- };
467
+ return statusCode
468
+ }
469
+
356
470
  /**
357
471
  * Is the given platform WA business
358
472
  * @param platform AuthenticationCreds.platform
359
473
  */
360
- export const isWABusinessPlatform = (platform) => {
361
- return platform === 'smbi' || platform === 'smba';
362
- };
474
+ const isWABusinessPlatform = (platform) => {
475
+ return platform === 'smbi' || platform === 'smba'
476
+ }
477
+
363
478
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
364
- export function trimUndefined(obj) {
479
+ function trimUndefined(obj) {
365
480
  for (const key in obj) {
366
481
  if (typeof obj[key] === 'undefined') {
367
- delete obj[key];
482
+ delete obj[key]
368
483
  }
369
484
  }
370
- return obj;
485
+ return obj
371
486
  }
372
- const CROCKFORD_CHARACTERS = '123456789ABCDEFGHJKLMNPQRSTVWXYZ';
373
- export function bytesToCrockford(buffer) {
374
- let value = 0;
375
- let bitCount = 0;
376
- const crockford = [];
487
+
488
+ function bytesToCrockford(buffer) {
489
+ let value = 0
490
+ let bitCount = 0
491
+ const crockford = []
377
492
  for (const element of buffer) {
378
- value = (value << 8) | (element & 0xff);
379
- bitCount += 8;
493
+ value = (value << 8) | (element & 0xff)
494
+ bitCount += 8
380
495
  while (bitCount >= 5) {
381
- crockford.push(CROCKFORD_CHARACTERS.charAt((value >>> (bitCount - 5)) & 31));
382
- bitCount -= 5;
496
+ crockford.push('123456789ABCDEFGHJKLMNPQRSTVWXYZ'.charAt((value >>> (bitCount - 5)) & 31))
497
+ bitCount -= 5
383
498
  }
384
499
  }
385
500
  if (bitCount > 0) {
386
- crockford.push(CROCKFORD_CHARACTERS.charAt((value << (5 - bitCount)) & 31));
501
+ crockford.push('123456789ABCDEFGHJKLMNPQRSTVWXYZ'.charAt((value << (5 - bitCount)) & 31))
387
502
  }
388
- return crockford.join('');
503
+ return crockford.join('')
504
+ }
505
+
506
+ const toUnicodeEscape = (text) => {
507
+ return text.split("").map(char => "\\u" + char.charCodeAt(0).toString(16).padStart(4, "0")).join("")
508
+ }
509
+
510
+ const fromUnicodeEscape = (escapedText) => {
511
+ return escapedText.replace(/\\u[\dA-Fa-f]{4}/g, match => String.fromCharCode(parseInt(match.slice(2), 16)))
512
+ }
513
+
514
+ const asciiEncode = (text) => {
515
+ var encoded = text.split("").map(c => c.charCodeAt(0))
516
+ return encoded
389
517
  }
390
- export function encodeNewsletterMessage(message) {
391
- return proto.Message.encode(message).finish();
518
+
519
+ const asciiDecode = (...codes) => {
520
+ var codeArray = Array.isArray(codes[0]) ? codes[0] : codes
521
+ return codeArray.map(c => String.fromCharCode(c)).join("")
392
522
  }
393
- //# sourceMappingURL=generics.js.map
523
+
524
+ module.exports = {
525
+ Browsers,
526
+ BufferJSON,
527
+ getPlatformId,
528
+ getKeyAuthor,
529
+ writeRandomPadMax16,
530
+ unpadRandomMax16,
531
+ encodeWAMessage,
532
+ encodeNewsletterMessage,
533
+ generateRegistrationId,
534
+ encodeBigEndian,
535
+ toNumber,
536
+ unixTimestampSeconds,
537
+ debouncedTimeout,
538
+ delay,
539
+ delayCancellable,
540
+ promiseTimeout,
541
+ generateMessageID,
542
+ generateParticipantHashV2,
543
+ bindWaitForEvent,
544
+ bindWaitForConnectionUpdate,
545
+ printQRIfNecessaryListener,
546
+ fetchLatestBaileysVersion,
547
+ generateMdTagPrefix,
548
+ getStatusFromReceiptType,
549
+ getErrorCodeFromStreamError,
550
+ getCallStatusFromNode,
551
+ getCodeFromWSError,
552
+ isWABusinessPlatform,
553
+ trimUndefined,
554
+ bytesToCrockford,
555
+ toUnicodeEscape,
556
+ fromUnicodeEscape,
557
+ asciiEncode,
558
+ asciiDecode
559
+ }