gifted-baileys 1.5.5 → 1.5.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 (251) hide show
  1. package/README.md +6 -1642
  2. package/WAProto/WAProto.proto +969 -88
  3. package/WAProto/index.d.ts +13199 -1260
  4. package/WAProto/index.js +124901 -74525
  5. package/lib/Defaults/baileys-version.json +3 -0
  6. package/lib/Defaults/index.d.ts +284 -0
  7. package/{src → lib}/Defaults/index.js +7 -14
  8. package/lib/Signal/libsignal.d.ts +3 -0
  9. package/lib/Signal/libsignal.js +161 -0
  10. package/lib/Socket/Client/abstract-socket-client.d.ts +15 -0
  11. package/lib/Socket/Client/index.d.ts +2 -0
  12. package/{src → lib}/Socket/Client/index.js +2 -3
  13. package/lib/Socket/Client/mobile-socket-client.d.ts +12 -0
  14. package/lib/Socket/Client/mobile-socket-client.js +65 -0
  15. package/lib/Socket/Client/types.d.ts +17 -0
  16. package/lib/Socket/Client/types.js +13 -0
  17. package/lib/Socket/Client/websocket.d.ts +12 -0
  18. package/lib/Socket/Client/websocket.js +62 -0
  19. package/lib/Socket/business.d.ts +170 -0
  20. package/{src → lib}/Socket/business.js +28 -33
  21. package/lib/Socket/chats.d.ts +81 -0
  22. package/{src → lib}/Socket/chats.js +174 -176
  23. package/lib/Socket/groups.d.ts +115 -0
  24. package/{src → lib}/Socket/groups.js +80 -68
  25. package/lib/Socket/index.d.ts +172 -0
  26. package/{src → lib}/Socket/index.js +4 -1
  27. package/lib/Socket/messages-recv.d.ts +158 -0
  28. package/{src → lib}/Socket/messages-recv.js +378 -211
  29. package/lib/Socket/messages-send.d.ts +155 -0
  30. package/{src → lib}/Socket/messages-send.js +452 -177
  31. package/lib/Socket/newsletter.d.ts +132 -0
  32. package/{src → lib}/Socket/newsletter.js +107 -98
  33. package/lib/Socket/registration.d.ts +264 -0
  34. package/{src → lib}/Socket/registration.js +56 -48
  35. package/lib/Socket/socket.d.ts +44 -0
  36. package/{src → lib}/Socket/socket.js +77 -77
  37. package/lib/Socket/usync.d.ts +37 -0
  38. package/lib/Socket/usync.js +70 -0
  39. package/lib/Store/index.d.ts +3 -0
  40. package/lib/Store/make-cache-manager-store.d.ts +14 -0
  41. package/{src → lib}/Store/make-cache-manager-store.js +25 -34
  42. package/lib/Store/make-in-memory-store.d.ts +118 -0
  43. package/{src → lib}/Store/make-in-memory-store.js +36 -32
  44. package/lib/Store/make-ordered-dictionary.d.ts +13 -0
  45. package/lib/Store/object-repository.d.ts +10 -0
  46. package/{src → lib}/Store/object-repository.js +1 -1
  47. package/lib/Types/Auth.d.ts +109 -0
  48. package/lib/Types/Call.d.ts +13 -0
  49. package/lib/Types/Chat.d.ts +107 -0
  50. package/{src/Types/Contact.ts → lib/Types/Contact.d.ts} +8 -9
  51. package/lib/Types/Events.d.ts +172 -0
  52. package/lib/Types/GroupMetadata.d.ts +56 -0
  53. package/lib/Types/Label.d.ts +46 -0
  54. package/{src/Types/LabelAssociation.ts → lib/Types/LabelAssociation.d.ts} +16 -22
  55. package/lib/Types/Message.d.ts +433 -0
  56. package/lib/Types/Newsletter.d.ts +92 -0
  57. package/lib/Types/Product.d.ts +78 -0
  58. package/lib/Types/Signal.d.ts +57 -0
  59. package/{src/Types/Socket.ts → lib/Types/Socket.d.ts} +61 -68
  60. package/lib/Types/State.d.ts +27 -0
  61. package/lib/Types/USync.d.ts +25 -0
  62. package/lib/Types/index.d.ts +66 -0
  63. package/lib/Utils/auth-utils.d.ts +18 -0
  64. package/{src → lib}/Utils/auth-utils.js +73 -90
  65. package/lib/Utils/baileys-event-stream.d.ts +16 -0
  66. package/lib/Utils/baileys-event-stream.js +63 -0
  67. package/lib/Utils/business.d.ts +22 -0
  68. package/{src → lib}/Utils/business.js +15 -43
  69. package/lib/Utils/chat-utils.d.ts +70 -0
  70. package/{src → lib}/Utils/chat-utils.js +87 -94
  71. package/lib/Utils/crypto.d.ts +40 -0
  72. package/{src → lib}/Utils/crypto.js +4 -2
  73. package/lib/Utils/decode-wa-message.d.ts +36 -0
  74. package/lib/Utils/decode-wa-message.js +226 -0
  75. package/lib/Utils/event-buffer.d.ts +35 -0
  76. package/{src → lib}/Utils/event-buffer.js +4 -13
  77. package/lib/Utils/generics.d.ts +88 -0
  78. package/{src → lib}/Utils/generics.js +67 -86
  79. package/lib/Utils/history.d.ts +19 -0
  80. package/{src → lib}/Utils/history.js +13 -39
  81. package/lib/Utils/index.d.ts +17 -0
  82. package/lib/Utils/link-preview.d.ts +21 -0
  83. package/{src → lib}/Utils/link-preview.js +17 -54
  84. package/lib/Utils/logger.d.ts +2 -0
  85. package/lib/Utils/lt-hash.d.ts +12 -0
  86. package/lib/Utils/make-mutex.d.ts +7 -0
  87. package/{src → lib}/Utils/make-mutex.js +4 -13
  88. package/lib/Utils/messages-media.d.ts +113 -0
  89. package/{src → lib}/Utils/messages-media.js +193 -255
  90. package/lib/Utils/messages.d.ts +77 -0
  91. package/{src → lib}/Utils/messages.js +588 -118
  92. package/lib/Utils/noise-handler.d.ts +20 -0
  93. package/lib/Utils/process-message.d.ts +41 -0
  94. package/{src → lib}/Utils/process-message.js +27 -30
  95. package/lib/Utils/signal.d.ts +33 -0
  96. package/{src → lib}/Utils/signal.js +25 -42
  97. package/lib/Utils/use-multi-file-auth-state.d.ts +12 -0
  98. package/{src → lib}/Utils/use-multi-file-auth-state.js +27 -28
  99. package/lib/Utils/validate-connection.d.ts +11 -0
  100. package/{src → lib}/Utils/validate-connection.js +40 -9
  101. package/lib/WABinary/constants.d.ts +27 -0
  102. package/lib/WABinary/decode.d.ts +6 -0
  103. package/lib/WABinary/encode.d.ts +2 -0
  104. package/{src → lib}/WABinary/encode.js +16 -10
  105. package/lib/WABinary/generic-utils.d.ts +14 -0
  106. package/lib/WABinary/index.d.ts +5 -0
  107. package/lib/WABinary/jid-utils.d.ts +31 -0
  108. package/lib/WABinary/types.d.ts +18 -0
  109. package/lib/WABinary/types.js +2 -0
  110. package/lib/WAM/BinaryInfo.d.ts +8 -0
  111. package/lib/WAM/constants.d.ts +38 -0
  112. package/lib/WAM/encode.d.ts +2 -0
  113. package/lib/WAM/index.d.ts +3 -0
  114. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
  115. package/lib/WAUSync/Protocols/USyncContactProtocol.js +32 -0
  116. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  117. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
  118. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  119. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
  120. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  121. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
  122. package/lib/WAUSync/Protocols/index.d.ts +4 -0
  123. package/lib/WAUSync/Protocols/index.js +20 -0
  124. package/lib/WAUSync/USyncQuery.d.ts +26 -0
  125. package/lib/WAUSync/USyncQuery.js +79 -0
  126. package/lib/WAUSync/USyncUser.d.ts +10 -0
  127. package/lib/WAUSync/USyncUser.js +22 -0
  128. package/lib/WAUSync/index.d.ts +3 -0
  129. package/lib/WAUSync/index.js +19 -0
  130. package/{src → lib}/index.js +1 -0
  131. package/package.json +26 -8
  132. package/LICENSE +0 -21
  133. package/src/Defaults/baileys-version.json +0 -3
  134. package/src/Defaults/index.ts +0 -131
  135. package/src/Signal/libsignal.js +0 -180
  136. package/src/Signal/libsignal.ts +0 -141
  137. package/src/Socket/Client/abstract-socket-client.ts +0 -19
  138. package/src/Socket/Client/index.ts +0 -3
  139. package/src/Socket/Client/mobile-socket-client.js +0 -78
  140. package/src/Socket/Client/mobile-socket-client.ts +0 -66
  141. package/src/Socket/Client/web-socket-client.js +0 -75
  142. package/src/Socket/Client/web-socket-client.ts +0 -57
  143. package/src/Socket/business.ts +0 -281
  144. package/src/Socket/chats.ts +0 -1030
  145. package/src/Socket/groups.ts +0 -356
  146. package/src/Socket/index.ts +0 -13
  147. package/src/Socket/messages-recv.ts +0 -985
  148. package/src/Socket/messages-send.ts +0 -871
  149. package/src/Socket/newsletter.ts +0 -282
  150. package/src/Socket/registration.ts +0 -250
  151. package/src/Socket/socket.ts +0 -777
  152. package/src/Store/index.ts +0 -3
  153. package/src/Store/make-cache-manager-store.ts +0 -100
  154. package/src/Store/make-in-memory-store.ts +0 -475
  155. package/src/Store/make-ordered-dictionary.ts +0 -86
  156. package/src/Store/object-repository.ts +0 -32
  157. package/src/Tests/test.app-state-sync.js +0 -204
  158. package/src/Tests/test.app-state-sync.ts +0 -207
  159. package/src/Tests/test.event-buffer.js +0 -270
  160. package/src/Tests/test.event-buffer.ts +0 -319
  161. package/src/Tests/test.key-store.js +0 -76
  162. package/src/Tests/test.key-store.ts +0 -92
  163. package/src/Tests/test.libsignal.js +0 -141
  164. package/src/Tests/test.libsignal.ts +0 -186
  165. package/src/Tests/test.media-download.js +0 -93
  166. package/src/Tests/test.media-download.ts +0 -76
  167. package/src/Tests/test.messages.js +0 -33
  168. package/src/Tests/test.messages.ts +0 -37
  169. package/src/Tests/utils.js +0 -34
  170. package/src/Tests/utils.ts +0 -36
  171. package/src/Types/Auth.ts +0 -113
  172. package/src/Types/Call.ts +0 -15
  173. package/src/Types/Chat.ts +0 -106
  174. package/src/Types/Events.ts +0 -93
  175. package/src/Types/GroupMetadata.ts +0 -53
  176. package/src/Types/Label.ts +0 -36
  177. package/src/Types/Message.ts +0 -288
  178. package/src/Types/Newsletter.ts +0 -98
  179. package/src/Types/Product.ts +0 -85
  180. package/src/Types/Signal.ts +0 -68
  181. package/src/Types/State.ts +0 -29
  182. package/src/Types/index.ts +0 -59
  183. package/src/Utils/auth-utils.ts +0 -222
  184. package/src/Utils/baileys-event-stream.js +0 -92
  185. package/src/Utils/baileys-event-stream.ts +0 -66
  186. package/src/Utils/business.ts +0 -275
  187. package/src/Utils/chat-utils.ts +0 -860
  188. package/src/Utils/crypto.ts +0 -131
  189. package/src/Utils/decode-wa-message.js +0 -211
  190. package/src/Utils/decode-wa-message.ts +0 -228
  191. package/src/Utils/event-buffer.ts +0 -613
  192. package/src/Utils/generics.ts +0 -434
  193. package/src/Utils/history.ts +0 -112
  194. package/src/Utils/index.ts +0 -17
  195. package/src/Utils/link-preview.ts +0 -122
  196. package/src/Utils/logger.ts +0 -3
  197. package/src/Utils/lt-hash.ts +0 -61
  198. package/src/Utils/make-mutex.ts +0 -44
  199. package/src/Utils/messages-media.ts +0 -847
  200. package/src/Utils/messages.ts +0 -956
  201. package/src/Utils/noise-handler.ts +0 -197
  202. package/src/Utils/process-message.ts +0 -414
  203. package/src/Utils/signal.ts +0 -177
  204. package/src/Utils/use-multi-file-auth-state.ts +0 -90
  205. package/src/Utils/validate-connection.ts +0 -238
  206. package/src/WABinary/constants.ts +0 -42
  207. package/src/WABinary/decode.ts +0 -265
  208. package/src/WABinary/encode.ts +0 -236
  209. package/src/WABinary/generic-utils.ts +0 -121
  210. package/src/WABinary/index.ts +0 -5
  211. package/src/WABinary/jid-utils.ts +0 -68
  212. package/src/WABinary/types.ts +0 -17
  213. package/src/WAM/BinaryInfo.ts +0 -12
  214. package/src/WAM/constants.ts +0 -15382
  215. package/src/WAM/encode.ts +0 -174
  216. package/src/WAM/index.ts +0 -3
  217. package/src/gifted +0 -1
  218. package/src/index.ts +0 -13
  219. /package/{src → lib}/Defaults/phonenumber-mcc.json +0 -0
  220. /package/{src → lib}/Socket/Client/abstract-socket-client.js +0 -0
  221. /package/{src → lib}/Store/index.js +0 -0
  222. /package/{src → lib}/Store/make-ordered-dictionary.js +0 -0
  223. /package/{src → lib}/Types/Auth.js +0 -0
  224. /package/{src → lib}/Types/Call.js +0 -0
  225. /package/{src → lib}/Types/Chat.js +0 -0
  226. /package/{src → lib}/Types/Contact.js +0 -0
  227. /package/{src → lib}/Types/Events.js +0 -0
  228. /package/{src → lib}/Types/GroupMetadata.js +0 -0
  229. /package/{src → lib}/Types/Label.js +0 -0
  230. /package/{src → lib}/Types/LabelAssociation.js +0 -0
  231. /package/{src → lib}/Types/Message.js +0 -0
  232. /package/{src → lib}/Types/Newsletter.js +0 -0
  233. /package/{src → lib}/Types/Product.js +0 -0
  234. /package/{src → lib}/Types/Signal.js +0 -0
  235. /package/{src → lib}/Types/Socket.js +0 -0
  236. /package/{src → lib}/Types/State.js +0 -0
  237. /package/{src/WABinary/types.js → lib/Types/USync.js} +0 -0
  238. /package/{src → lib}/Types/index.js +0 -0
  239. /package/{src → lib}/Utils/index.js +0 -0
  240. /package/{src → lib}/Utils/logger.js +0 -0
  241. /package/{src → lib}/Utils/lt-hash.js +0 -0
  242. /package/{src → lib}/Utils/noise-handler.js +0 -0
  243. /package/{src → lib}/WABinary/constants.js +0 -0
  244. /package/{src → lib}/WABinary/decode.js +0 -0
  245. /package/{src → lib}/WABinary/generic-utils.js +0 -0
  246. /package/{src → lib}/WABinary/index.js +0 -0
  247. /package/{src → lib}/WABinary/jid-utils.js +0 -0
  248. /package/{src → lib}/WAM/BinaryInfo.js +0 -0
  249. /package/{src → lib}/WAM/constants.js +0 -0
  250. /package/{src → lib}/WAM/encode.js +0 -0
  251. /package/{src → lib}/WAM/index.js +0 -0
@@ -1,434 +0,0 @@
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
- }
@@ -1,112 +0,0 @@
1
- import { AxiosRequestConfig } from 'axios'
2
- import { promisify } from 'util'
3
- import { inflate } from 'zlib'
4
- import { proto } from '../../WAProto'
5
- import { Chat, Contact, WAMessageStubType } from '../Types'
6
- import { isJidUser } from '../WABinary'
7
- import { toNumber } from './generics'
8
- import { normalizeMessageContent } from './messages'
9
- import { downloadContentFromMessage } from './messages-media'
10
-
11
- const inflatePromise = promisify(inflate)
12
-
13
- export const downloadHistory = async(
14
- msg: proto.Message.IHistorySyncNotification,
15
- options: AxiosRequestConfig<any>
16
- ) => {
17
- const stream = await downloadContentFromMessage(msg, 'md-msg-hist', { options })
18
- const bufferArray: Buffer[] = []
19
- for await (const chunk of stream) {
20
- bufferArray.push(chunk)
21
- }
22
-
23
- let buffer = Buffer.concat(bufferArray)
24
-
25
- // decompress buffer
26
- buffer = await inflatePromise(buffer)
27
-
28
- const syncData = proto.HistorySync.decode(buffer)
29
- return syncData
30
- }
31
-
32
- export const processHistoryMessage = (item: proto.IHistorySync) => {
33
- const messages: proto.IWebMessageInfo[] = []
34
- const contacts: Contact[] = []
35
- const chats: Chat[] = []
36
-
37
- switch (item.syncType) {
38
- case proto.HistorySync.HistorySyncType.INITIAL_BOOTSTRAP:
39
- case proto.HistorySync.HistorySyncType.RECENT:
40
- case proto.HistorySync.HistorySyncType.FULL:
41
- for(const chat of item.conversations! as Chat[]) {
42
- contacts.push({ id: chat.id, name: chat.name || undefined })
43
-
44
- const msgs = chat.messages || []
45
- delete chat.messages
46
- delete chat.archived
47
- delete chat.muteEndTime
48
- delete chat.pinned
49
-
50
- for(const item of msgs) {
51
- const message = item.message!
52
- messages.push(message)
53
-
54
- if(!chat.messages?.length) {
55
- // keep only the most recent message in the chat array
56
- chat.messages = [{ message }]
57
- }
58
-
59
- if(!message.key.fromMe && !chat.lastMessageRecvTimestamp) {
60
- chat.lastMessageRecvTimestamp = toNumber(message.messageTimestamp)
61
- }
62
-
63
- if(
64
- (message.messageStubType === WAMessageStubType.BIZ_PRIVACY_MODE_TO_BSP
65
- || message.messageStubType === WAMessageStubType.BIZ_PRIVACY_MODE_TO_FB
66
- )
67
- && message.messageStubParameters?.[0]
68
- ) {
69
- contacts.push({
70
- id: message.key.participant || message.key.remoteJid!,
71
- verifiedName: message.messageStubParameters?.[0],
72
- })
73
- }
74
- }
75
-
76
- if(isJidUser(chat.id) && chat.readOnly && chat.archived) {
77
- delete chat.readOnly
78
- }
79
-
80
- chats.push({ ...chat })
81
- }
82
-
83
- break
84
- case proto.HistorySync.HistorySyncType.PUSH_NAME:
85
- for(const c of item.pushnames!) {
86
- contacts.push({ id: c.id!, notify: c.pushname! })
87
- }
88
-
89
- break
90
- }
91
-
92
- return {
93
- chats,
94
- contacts,
95
- messages,
96
- }
97
- }
98
-
99
- export const downloadAndProcessHistorySyncNotification = async(
100
- msg: proto.Message.IHistorySyncNotification,
101
- options: AxiosRequestConfig<any>
102
- ) => {
103
- const historyMsg = await downloadHistory(msg, options)
104
- return processHistoryMessage(historyMsg)
105
- }
106
-
107
- export const getHistoryMsg = (message: proto.IMessage) => {
108
- const normalizedContent = !!message ? normalizeMessageContent(message) : undefined
109
- const anyHistoryMsg = normalizedContent?.protocolMessage?.historySyncNotification
110
-
111
- return anyHistoryMsg
112
- }
@@ -1,17 +0,0 @@
1
- export * from './generics'
2
- export * from './decode-wa-message'
3
- export * from './messages'
4
- export * from './messages-media'
5
- export * from './validate-connection'
6
- export * from './crypto'
7
- export * from './signal'
8
- export * from './noise-handler'
9
- export * from './history'
10
- export * from './chat-utils'
11
- export * from './lt-hash'
12
- export * from './auth-utils'
13
- export * from './baileys-event-stream'
14
- export * from './use-multi-file-auth-state'
15
- export * from './link-preview'
16
- export * from './event-buffer'
17
- export * from './process-message'
@@ -1,122 +0,0 @@
1
- import { AxiosRequestConfig } from 'axios'
2
- import { Logger } from 'pino'
3
- import { WAMediaUploadFunction, WAUrlInfo } from '../Types'
4
- import { prepareWAMessageMedia } from './messages'
5
- import { extractImageThumb, getHttpStream } from './messages-media'
6
-
7
- const THUMBNAIL_WIDTH_PX = 192
8
-
9
- /** Fetches an image and generates a thumbnail for it */
10
- const getCompressedJpegThumbnail = async(
11
- url: string,
12
- { thumbnailWidth, fetchOpts }: URLGenerationOptions
13
- ) => {
14
- const stream = await getHttpStream(url, fetchOpts)
15
- const result = await extractImageThumb(stream, thumbnailWidth)
16
- return result
17
- }
18
-
19
- export type URLGenerationOptions = {
20
- thumbnailWidth: number
21
- fetchOpts: {
22
- /** Timeout in ms */
23
- timeout: number
24
- proxyUrl?: string
25
- headers?: AxiosRequestConfig<{}>['headers']
26
- }
27
- uploadImage?: WAMediaUploadFunction
28
- logger?: Logger
29
- }
30
-
31
- /**
32
- * Given a piece of text, checks for any URL present, generates link preview for the same and returns it
33
- * Return undefined if the fetch failed or no URL was found
34
- * @param text first matched URL in text
35
- * @returns the URL info required to generate link preview
36
- */
37
- export const getUrlInfo = async(
38
- text: string,
39
- opts: URLGenerationOptions = {
40
- thumbnailWidth: THUMBNAIL_WIDTH_PX,
41
- fetchOpts: { timeout: 3000 }
42
- },
43
- ): Promise<WAUrlInfo | undefined> => {
44
- try {
45
- // retries
46
- const retries = 0
47
- const maxRetry = 5
48
-
49
- const { getLinkPreview } = await import('link-preview-js')
50
- let previewLink = text
51
- if(!text.startsWith('https://') && !text.startsWith('http://')) {
52
- previewLink = 'https://' + previewLink
53
- }
54
-
55
- const info = await getLinkPreview(previewLink, {
56
- ...opts.fetchOpts,
57
- followRedirects: 'follow',
58
- handleRedirects: (baseURL: string, forwardedURL: string) => {
59
- const urlObj = new URL(baseURL)
60
- const forwardedURLObj = new URL(forwardedURL)
61
- if(retries >= maxRetry) {
62
- return false
63
- }
64
-
65
- if(
66
- forwardedURLObj.hostname === urlObj.hostname
67
- || forwardedURLObj.hostname === 'www.' + urlObj.hostname
68
- || 'www.' + forwardedURLObj.hostname === urlObj.hostname
69
- ) {
70
- retries + 1
71
- return true
72
- } else {
73
- return false
74
- }
75
- },
76
- headers: opts.fetchOpts as {}
77
- })
78
- if(info && 'title' in info && info.title) {
79
- const [image] = info.images
80
-
81
- const urlInfo: WAUrlInfo = {
82
- 'canonical-url': info.url,
83
- 'matched-text': text,
84
- title: info.title,
85
- description: info.description,
86
- originalThumbnailUrl: image
87
- }
88
-
89
- if(opts.uploadImage) {
90
- const { imageMessage } = await prepareWAMessageMedia(
91
- { image: { url: image } },
92
- {
93
- upload: opts.uploadImage,
94
- mediaTypeOverride: 'thumbnail-link',
95
- options: opts.fetchOpts
96
- }
97
- )
98
- urlInfo.jpegThumbnail = imageMessage?.jpegThumbnail
99
- ? Buffer.from(imageMessage.jpegThumbnail)
100
- : undefined
101
- urlInfo.highQualityThumbnail = imageMessage || undefined
102
- } else {
103
- try {
104
- urlInfo.jpegThumbnail = image
105
- ? (await getCompressedJpegThumbnail(image, opts)).buffer
106
- : undefined
107
- } catch(error) {
108
- opts.logger?.debug(
109
- { err: error.stack, url: previewLink },
110
- 'error in generating thumbnail'
111
- )
112
- }
113
- }
114
-
115
- return urlInfo
116
- }
117
- } catch(error) {
118
- if(!error.message.includes('receive a valid')) {
119
- throw error
120
- }
121
- }
122
- }
@@ -1,3 +0,0 @@
1
- import P from 'pino'
2
-
3
- export default P({ timestamp: () => `,"time":"${new Date().toJSON()}"` })