gifted-baileys 1.5.6 → 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 (252) hide show
  1. package/README.md +9 -0
  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/README.md +0 -1
  136. package/src/Signal/libsignal.js +0 -180
  137. package/src/Signal/libsignal.ts +0 -141
  138. package/src/Socket/Client/abstract-socket-client.ts +0 -19
  139. package/src/Socket/Client/index.ts +0 -3
  140. package/src/Socket/Client/mobile-socket-client.js +0 -78
  141. package/src/Socket/Client/mobile-socket-client.ts +0 -66
  142. package/src/Socket/Client/web-socket-client.js +0 -75
  143. package/src/Socket/Client/web-socket-client.ts +0 -57
  144. package/src/Socket/business.ts +0 -281
  145. package/src/Socket/chats.ts +0 -1030
  146. package/src/Socket/groups.ts +0 -356
  147. package/src/Socket/index.ts +0 -13
  148. package/src/Socket/messages-recv.ts +0 -985
  149. package/src/Socket/messages-send.ts +0 -871
  150. package/src/Socket/newsletter.ts +0 -282
  151. package/src/Socket/registration.ts +0 -250
  152. package/src/Socket/socket.ts +0 -777
  153. package/src/Store/index.ts +0 -3
  154. package/src/Store/make-cache-manager-store.ts +0 -100
  155. package/src/Store/make-in-memory-store.ts +0 -475
  156. package/src/Store/make-ordered-dictionary.ts +0 -86
  157. package/src/Store/object-repository.ts +0 -32
  158. package/src/Tests/test.app-state-sync.js +0 -204
  159. package/src/Tests/test.app-state-sync.ts +0 -207
  160. package/src/Tests/test.event-buffer.js +0 -270
  161. package/src/Tests/test.event-buffer.ts +0 -319
  162. package/src/Tests/test.key-store.js +0 -76
  163. package/src/Tests/test.key-store.ts +0 -92
  164. package/src/Tests/test.libsignal.js +0 -141
  165. package/src/Tests/test.libsignal.ts +0 -186
  166. package/src/Tests/test.media-download.js +0 -93
  167. package/src/Tests/test.media-download.ts +0 -76
  168. package/src/Tests/test.messages.js +0 -33
  169. package/src/Tests/test.messages.ts +0 -37
  170. package/src/Tests/utils.js +0 -34
  171. package/src/Tests/utils.ts +0 -36
  172. package/src/Types/Auth.ts +0 -113
  173. package/src/Types/Call.ts +0 -15
  174. package/src/Types/Chat.ts +0 -106
  175. package/src/Types/Events.ts +0 -93
  176. package/src/Types/GroupMetadata.ts +0 -53
  177. package/src/Types/Label.ts +0 -36
  178. package/src/Types/Message.ts +0 -288
  179. package/src/Types/Newsletter.ts +0 -98
  180. package/src/Types/Product.ts +0 -85
  181. package/src/Types/Signal.ts +0 -68
  182. package/src/Types/State.ts +0 -29
  183. package/src/Types/index.ts +0 -59
  184. package/src/Utils/auth-utils.ts +0 -222
  185. package/src/Utils/baileys-event-stream.js +0 -92
  186. package/src/Utils/baileys-event-stream.ts +0 -66
  187. package/src/Utils/business.ts +0 -275
  188. package/src/Utils/chat-utils.ts +0 -860
  189. package/src/Utils/crypto.ts +0 -131
  190. package/src/Utils/decode-wa-message.js +0 -211
  191. package/src/Utils/decode-wa-message.ts +0 -228
  192. package/src/Utils/event-buffer.ts +0 -613
  193. package/src/Utils/generics.ts +0 -434
  194. package/src/Utils/history.ts +0 -112
  195. package/src/Utils/index.ts +0 -17
  196. package/src/Utils/link-preview.ts +0 -122
  197. package/src/Utils/logger.ts +0 -3
  198. package/src/Utils/lt-hash.ts +0 -61
  199. package/src/Utils/make-mutex.ts +0 -44
  200. package/src/Utils/messages-media.ts +0 -847
  201. package/src/Utils/messages.ts +0 -956
  202. package/src/Utils/noise-handler.ts +0 -197
  203. package/src/Utils/process-message.ts +0 -414
  204. package/src/Utils/signal.ts +0 -177
  205. package/src/Utils/use-multi-file-auth-state.ts +0 -90
  206. package/src/Utils/validate-connection.ts +0 -238
  207. package/src/WABinary/constants.ts +0 -42
  208. package/src/WABinary/decode.ts +0 -265
  209. package/src/WABinary/encode.ts +0 -236
  210. package/src/WABinary/generic-utils.ts +0 -121
  211. package/src/WABinary/index.ts +0 -5
  212. package/src/WABinary/jid-utils.ts +0 -68
  213. package/src/WABinary/types.ts +0 -17
  214. package/src/WAM/BinaryInfo.ts +0 -12
  215. package/src/WAM/constants.ts +0 -15382
  216. package/src/WAM/encode.ts +0 -174
  217. package/src/WAM/index.ts +0 -3
  218. package/src/gifted +0 -1
  219. package/src/index.ts +0 -13
  220. /package/{src → lib}/Defaults/phonenumber-mcc.json +0 -0
  221. /package/{src → lib}/Socket/Client/abstract-socket-client.js +0 -0
  222. /package/{src → lib}/Store/index.js +0 -0
  223. /package/{src → lib}/Store/make-ordered-dictionary.js +0 -0
  224. /package/{src → lib}/Types/Auth.js +0 -0
  225. /package/{src → lib}/Types/Call.js +0 -0
  226. /package/{src → lib}/Types/Chat.js +0 -0
  227. /package/{src → lib}/Types/Contact.js +0 -0
  228. /package/{src → lib}/Types/Events.js +0 -0
  229. /package/{src → lib}/Types/GroupMetadata.js +0 -0
  230. /package/{src → lib}/Types/Label.js +0 -0
  231. /package/{src → lib}/Types/LabelAssociation.js +0 -0
  232. /package/{src → lib}/Types/Message.js +0 -0
  233. /package/{src → lib}/Types/Newsletter.js +0 -0
  234. /package/{src → lib}/Types/Product.js +0 -0
  235. /package/{src → lib}/Types/Signal.js +0 -0
  236. /package/{src → lib}/Types/Socket.js +0 -0
  237. /package/{src → lib}/Types/State.js +0 -0
  238. /package/{src/WABinary/types.js → lib/Types/USync.js} +0 -0
  239. /package/{src → lib}/Types/index.js +0 -0
  240. /package/{src → lib}/Utils/index.js +0 -0
  241. /package/{src → lib}/Utils/logger.js +0 -0
  242. /package/{src → lib}/Utils/lt-hash.js +0 -0
  243. /package/{src → lib}/Utils/noise-handler.js +0 -0
  244. /package/{src → lib}/WABinary/constants.js +0 -0
  245. /package/{src → lib}/WABinary/decode.js +0 -0
  246. /package/{src → lib}/WABinary/generic-utils.js +0 -0
  247. /package/{src → lib}/WABinary/index.js +0 -0
  248. /package/{src → lib}/WABinary/jid-utils.js +0 -0
  249. /package/{src → lib}/WAM/BinaryInfo.js +0 -0
  250. /package/{src → lib}/WAM/constants.js +0 -0
  251. /package/{src → lib}/WAM/encode.js +0 -0
  252. /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()}"` })