@neelegirl/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 (203) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +183 -10
  3. package/WAProto/WAProto.proto +5007 -0
  4. package/WAProto/index.d.ts +57712 -0
  5. package/WAProto/index.js +178969 -0
  6. package/lib/Defaults/baileys-version.json +3 -0
  7. package/lib/Defaults/index.d.ts +68 -0
  8. package/lib/Defaults/index.js +137 -0
  9. package/lib/Defaults/phonenumber-mcc.json +223 -0
  10. package/lib/Signal/WASignalGroup/GroupProtocol.js +1909 -0
  11. package/lib/Signal/WASignalGroup/ciphertext_message.js +16 -0
  12. package/lib/Signal/WASignalGroup/generate-proto.sh +1 -0
  13. package/lib/Signal/WASignalGroup/group.proto +42 -0
  14. package/lib/Signal/WASignalGroup/group_cipher.js +120 -0
  15. package/lib/Signal/WASignalGroup/group_session_builder.js +46 -0
  16. package/lib/Signal/WASignalGroup/index.js +6 -0
  17. package/lib/Signal/WASignalGroup/keyhelper.js +21 -0
  18. package/lib/Signal/WASignalGroup/protobufs.js +3 -0
  19. package/lib/Signal/WASignalGroup/queue_job.js +69 -0
  20. package/lib/Signal/WASignalGroup/readme.md +6 -0
  21. package/lib/Signal/WASignalGroup/sender_chain_key.js +50 -0
  22. package/lib/Signal/WASignalGroup/sender_key_distribution_message.js +78 -0
  23. package/lib/Signal/WASignalGroup/sender_key_message.js +92 -0
  24. package/lib/Signal/WASignalGroup/sender_key_name.js +70 -0
  25. package/lib/Signal/WASignalGroup/sender_key_record.js +56 -0
  26. package/lib/Signal/WASignalGroup/sender_key_state.js +129 -0
  27. package/lib/Signal/WASignalGroup/sender_message_key.js +39 -0
  28. package/lib/Signal/libsignal.d.ts +4 -0
  29. package/lib/Signal/libsignal.js +162 -0
  30. package/lib/Socket/Client/abstract-socket-client.d.ts +15 -0
  31. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  32. package/lib/Socket/Client/index.d.ts +2 -0
  33. package/lib/Socket/Client/index.js +22 -0
  34. package/lib/Socket/Client/mobile-socket-client.d.ts +12 -0
  35. package/lib/Socket/Client/mobile-socket-client.js +65 -0
  36. package/lib/Socket/Client/types.d.ts +16 -0
  37. package/lib/Socket/Client/types.js +18 -0
  38. package/lib/Socket/Client/websocket.d.ts +13 -0
  39. package/lib/Socket/Client/websocket.js +62 -0
  40. package/lib/Socket/business.d.ts +187 -0
  41. package/lib/Socket/business.js +268 -0
  42. package/lib/Socket/chats.d.ts +98 -0
  43. package/lib/Socket/chats.js +1113 -0
  44. package/lib/Socket/communities.d.ts +223 -0
  45. package/lib/Socket/communities.js +433 -0
  46. package/lib/Socket/groups.d.ts +131 -0
  47. package/lib/Socket/groups.js +352 -0
  48. package/lib/Socket/index.d.ts +191 -0
  49. package/lib/Socket/index.js +23 -0
  50. package/lib/Socket/messages-recv.d.ts +177 -0
  51. package/lib/Socket/messages-recv.js +1764 -0
  52. package/lib/Socket/messages-send.d.ts +168 -0
  53. package/lib/Socket/messages-send.js +1303 -0
  54. package/lib/Socket/mex.d.ts +2 -0
  55. package/lib/Socket/mex.js +47 -0
  56. package/lib/Socket/newsletter.d.ts +147 -0
  57. package/lib/Socket/newsletter.js +286 -0
  58. package/lib/Socket/registration.d.ts +266 -0
  59. package/lib/Socket/registration.js +166 -0
  60. package/lib/Socket/socket.d.ts +45 -0
  61. package/lib/Socket/socket.js +766 -0
  62. package/lib/Socket/usync.d.ts +37 -0
  63. package/lib/Socket/usync.js +83 -0
  64. package/lib/Store/index.d.ts +4 -0
  65. package/lib/Store/index.js +24 -0
  66. package/lib/Store/make-cache-manager-store.d.ts +14 -0
  67. package/lib/Store/make-cache-manager-store.js +90 -0
  68. package/lib/Store/make-in-memory-store.d.ts +123 -0
  69. package/lib/Store/make-in-memory-store.js +429 -0
  70. package/lib/Store/make-ordered-dictionary.d.ts +12 -0
  71. package/lib/Store/make-ordered-dictionary.js +86 -0
  72. package/lib/Store/object-repository.d.ts +10 -0
  73. package/lib/Store/object-repository.js +31 -0
  74. package/lib/Types/Auth.d.ts +120 -0
  75. package/lib/Types/Auth.js +3 -0
  76. package/lib/Types/Call.d.ts +14 -0
  77. package/lib/Types/Call.js +3 -0
  78. package/lib/Types/Chat.d.ts +138 -0
  79. package/lib/Types/Chat.js +9 -0
  80. package/lib/Types/Contact.d.ts +20 -0
  81. package/lib/Types/Contact.js +3 -0
  82. package/lib/Types/Events.d.ts +229 -0
  83. package/lib/Types/Events.js +3 -0
  84. package/lib/Types/GroupMetadata.d.ts +66 -0
  85. package/lib/Types/GroupMetadata.js +3 -0
  86. package/lib/Types/Label.d.ts +48 -0
  87. package/lib/Types/Label.js +31 -0
  88. package/lib/Types/LabelAssociation.d.ts +35 -0
  89. package/lib/Types/LabelAssociation.js +13 -0
  90. package/lib/Types/Message.d.ts +473 -0
  91. package/lib/Types/Message.js +13 -0
  92. package/lib/Types/MexUpdates.d.ts +9 -0
  93. package/lib/Types/MexUpdates.js +18 -0
  94. package/lib/Types/Newsletter.d.ts +109 -0
  95. package/lib/Types/Newsletter.js +40 -0
  96. package/lib/Types/Product.d.ts +92 -0
  97. package/lib/Types/Product.js +3 -0
  98. package/lib/Types/Signal.d.ts +68 -0
  99. package/lib/Types/Signal.js +3 -0
  100. package/lib/Types/Socket.d.ts +122 -0
  101. package/lib/Types/Socket.js +3 -0
  102. package/lib/Types/State.d.ts +41 -0
  103. package/lib/Types/State.js +14 -0
  104. package/lib/Types/USync.d.ts +26 -0
  105. package/lib/Types/USync.js +3 -0
  106. package/lib/Types/index.d.ts +79 -0
  107. package/lib/Types/index.js +48 -0
  108. package/lib/Utils/auth-utils.d.ts +21 -0
  109. package/lib/Utils/auth-utils.js +205 -0
  110. package/lib/Utils/baileys-event-stream.d.ts +18 -0
  111. package/lib/Utils/baileys-event-stream.js +70 -0
  112. package/lib/Utils/business.d.ts +29 -0
  113. package/lib/Utils/business.js +255 -0
  114. package/lib/Utils/chat-utils.d.ts +82 -0
  115. package/lib/Utils/chat-utils.js +781 -0
  116. package/lib/Utils/check-npm-version.d.ts +15 -0
  117. package/lib/Utils/check-npm-version.js +52 -0
  118. package/lib/Utils/crypto.d.ts +56 -0
  119. package/lib/Utils/crypto.js +179 -0
  120. package/lib/Utils/decode-wa-message.d.ts +41 -0
  121. package/lib/Utils/decode-wa-message.js +253 -0
  122. package/lib/Utils/event-buffer.d.ts +39 -0
  123. package/lib/Utils/event-buffer.js +565 -0
  124. package/lib/Utils/generics.d.ts +129 -0
  125. package/lib/Utils/generics.js +618 -0
  126. package/lib/Utils/history.d.ts +23 -0
  127. package/lib/Utils/history.js +110 -0
  128. package/lib/Utils/index.d.ts +19 -0
  129. package/lib/Utils/index.js +41 -0
  130. package/lib/Utils/link-preview.d.ts +23 -0
  131. package/lib/Utils/link-preview.js +120 -0
  132. package/lib/Utils/logger.d.ts +13 -0
  133. package/lib/Utils/logger.js +7 -0
  134. package/lib/Utils/lt-hash.d.ts +14 -0
  135. package/lib/Utils/lt-hash.js +58 -0
  136. package/lib/Utils/make-mutex.d.ts +9 -0
  137. package/lib/Utils/make-mutex.js +49 -0
  138. package/lib/Utils/message-retry-manager.d.ts +82 -0
  139. package/lib/Utils/message-retry-manager.js +177 -0
  140. package/lib/Utils/messages-media.d.ts +129 -0
  141. package/lib/Utils/messages-media.js +806 -0
  142. package/lib/Utils/messages.d.ts +103 -0
  143. package/lib/Utils/messages.js +1579 -0
  144. package/lib/Utils/noise-handler.d.ts +20 -0
  145. package/lib/Utils/noise-handler.js +155 -0
  146. package/lib/Utils/process-message.d.ts +49 -0
  147. package/lib/Utils/process-message.js +428 -0
  148. package/lib/Utils/signal.d.ts +42 -0
  149. package/lib/Utils/signal.js +166 -0
  150. package/lib/Utils/use-mongo-file-auth-state.d.ts +6 -0
  151. package/lib/Utils/use-mongo-file-auth-state.js +84 -0
  152. package/lib/Utils/use-multi-file-auth-state.d.ts +18 -0
  153. package/lib/Utils/use-multi-file-auth-state.js +238 -0
  154. package/lib/Utils/use-single-file-auth-state.d.ts +13 -0
  155. package/lib/Utils/use-single-file-auth-state.js +80 -0
  156. package/lib/Utils/validate-connection.d.ts +13 -0
  157. package/lib/Utils/validate-connection.js +187 -0
  158. package/lib/WABinary/constants.d.ts +30 -0
  159. package/lib/WABinary/constants.js +1316 -0
  160. package/lib/WABinary/decode.d.ts +9 -0
  161. package/lib/WABinary/decode.js +288 -0
  162. package/lib/WABinary/encode.d.ts +3 -0
  163. package/lib/WABinary/encode.js +265 -0
  164. package/lib/WABinary/generic-utils.d.ts +28 -0
  165. package/lib/WABinary/generic-utils.js +142 -0
  166. package/lib/WABinary/index.d.ts +5 -0
  167. package/lib/WABinary/index.js +25 -0
  168. package/lib/WABinary/jid-utils.d.ts +53 -0
  169. package/lib/WABinary/jid-utils.js +92 -0
  170. package/lib/WABinary/types.d.ts +22 -0
  171. package/lib/WABinary/types.js +3 -0
  172. package/lib/WAM/BinaryInfo.d.ts +16 -0
  173. package/lib/WAM/BinaryInfo.js +17 -0
  174. package/lib/WAM/constants.d.ts +47 -0
  175. package/lib/WAM/constants.js +15371 -0
  176. package/lib/WAM/encode.d.ts +3 -0
  177. package/lib/WAM/encode.js +165 -0
  178. package/lib/WAM/index.d.ts +3 -0
  179. package/lib/WAM/index.js +23 -0
  180. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.d.ts +28 -0
  181. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +69 -0
  182. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +10 -0
  183. package/lib/WAUSync/Protocols/USyncContactProtocol.js +36 -0
  184. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +26 -0
  185. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +62 -0
  186. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +14 -0
  187. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +35 -0
  188. package/lib/WAUSync/Protocols/USyncLIDProtocol.d.ts +9 -0
  189. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +30 -0
  190. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +14 -0
  191. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +46 -0
  192. package/lib/WAUSync/Protocols/index.d.ts +6 -0
  193. package/lib/WAUSync/Protocols/index.js +26 -0
  194. package/lib/WAUSync/USyncQuery.d.ts +31 -0
  195. package/lib/WAUSync/USyncQuery.js +92 -0
  196. package/lib/WAUSync/USyncUser.d.ts +12 -0
  197. package/lib/WAUSync/USyncUser.js +30 -0
  198. package/lib/WAUSync/index.d.ts +3 -0
  199. package/lib/WAUSync/index.js +23 -0
  200. package/lib/index.d.ts +13 -0
  201. package/lib/index.js +33 -0
  202. package/package.json +88 -10
  203. package/index.js +0 -38
@@ -0,0 +1,110 @@
1
+ "use strict"
2
+
3
+ Object.defineProperty(exports, "__esModule", { value: true })
4
+
5
+ const util_1 = require("util")
6
+ const zlib_1 = require("zlib")
7
+ const WAProto_1 = require("../../WAProto")
8
+ const Types_1 = require("../Types")
9
+ const WABinary_1 = require("../WABinary")
10
+ const generics_1 = require("./generics")
11
+ const messages_1 = require("./messages")
12
+ const messages_media_1 = require("./messages-media")
13
+ const inflatePromise = util_1.promisify(zlib_1.inflate)
14
+
15
+ const downloadHistory = async (msg, options) => {
16
+ const stream = await messages_media_1.downloadContentFromMessage(msg, 'md-msg-hist', { options })
17
+ const bufferArray = []
18
+ for await (const chunk of stream) {
19
+ bufferArray.push(chunk)
20
+ }
21
+ let buffer = Buffer.concat(bufferArray)
22
+ // decompress buffer
23
+ buffer = await inflatePromise(buffer)
24
+ const syncData = WAProto_1.proto.HistorySync.decode(buffer)
25
+ return syncData
26
+ }
27
+
28
+ const processHistoryMessage = (item) => {
29
+ const messages = []
30
+ const contacts = []
31
+ const chats = []
32
+ switch (item.syncType) {
33
+ case WAProto_1.proto.HistorySync.HistorySyncType.INITIAL_BOOTSTRAP:
34
+ case WAProto_1.proto.HistorySync.HistorySyncType.RECENT:
35
+ case WAProto_1.proto.HistorySync.HistorySyncType.FULL:
36
+ case WAProto_1.proto.HistorySync.HistorySyncType.ON_DEMAND:
37
+ for (const chat of item.conversations) {
38
+ contacts.push({
39
+ id: chat.id,
40
+ name: chat.name || undefined,
41
+ lid: chat.lidJid || undefined,
42
+ jid: (0, WABinary_1.isJidUser)(chat.id) ? chat.id : undefined
43
+ });
44
+ const msgs = chat.messages || []
45
+ delete chat.messages
46
+ delete chat.archived
47
+ delete chat.muteEndTime
48
+ delete chat.pinned
49
+ for (const item of msgs) {
50
+ const message = item.message
51
+ messages.push(message)
52
+ if (!chat.messages?.length) {
53
+ // keep only the most recent message in the chat array
54
+ chat.messages = [{ message }]
55
+ }
56
+ if (!message.key.fromMe && !chat.lastMessageRecvTimestamp) {
57
+ chat.lastMessageRecvTimestamp = generics_1.toNumber(message.messageTimestamp)
58
+ }
59
+ if (message.messageStubType === Types_1.WAMessageStubType.BIZ_PRIVACY_MODE_TO_BSP
60
+ || message.messageStubType === Types_1.WAMessageStubType.BIZ_PRIVACY_MODE_TO_FB
61
+ && message.messageStubParameters?.[0]) {
62
+ contacts.push({
63
+ id: message.key.participant || message.key.remoteJid,
64
+ verifiedName: message.messageStubParameters?.[0]
65
+ })
66
+ }
67
+ }
68
+ if (WABinary_1.isJidUser(chat.id) && chat.readOnly && chat.archived) {
69
+ delete chat.readOnly
70
+ }
71
+ chats.push({ ...chat })
72
+ }
73
+ break
74
+ case WAProto_1.proto.HistorySync.HistorySyncType.PUSH_NAME:
75
+ for (const c of item.pushnames) {
76
+ contacts.push({
77
+ id: c.id,
78
+ name: c.name || undefined,
79
+ lid: c.lidJid || undefined,
80
+ jid: WABinary_1.isJidUser(c.id) ? c.id : undefined
81
+ })
82
+ }
83
+ break
84
+ }
85
+ return {
86
+ chats,
87
+ contacts,
88
+ messages,
89
+ syncType: item.syncType,
90
+ progress: item.progress
91
+ }
92
+ }
93
+
94
+ const downloadAndProcessHistorySyncNotification = async (msg, options) => {
95
+ const historyMsg = await downloadHistory(msg, options)
96
+ return processHistoryMessage(historyMsg)
97
+ }
98
+
99
+ const getHistoryMsg = (message) => {
100
+ const normalizedContent = !!message ? messages_1.normalizeMessageContent(message) : undefined
101
+ const anyHistoryMsg = normalizedContent?.protocolMessage?.historySyncNotification
102
+ return anyHistoryMsg
103
+ }
104
+
105
+ module.exports = {
106
+ downloadHistory,
107
+ processHistoryMessage,
108
+ downloadAndProcessHistorySyncNotification,
109
+ getHistoryMsg
110
+ }
@@ -0,0 +1,19 @@
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-mongo-file-auth-state'
15
+ export * from './use-single-file-auth-state'
16
+ export * from './use-multi-file-auth-state'
17
+ export * from './link-preview'
18
+ export * from './event-buffer'
19
+ export * from './process-message'
@@ -0,0 +1,41 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
16
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p)
17
+ }
18
+
19
+ Object.defineProperty(exports, "__esModule", { value: true })
20
+
21
+ __exportStar(require("./generics"), exports)
22
+ __exportStar(require("./decode-wa-message"), exports)
23
+ __exportStar(require("./messages"), exports)
24
+ __exportStar(require("./messages-media"), exports)
25
+ __exportStar(require("./validate-connection"), exports)
26
+ __exportStar(require("./crypto"), exports)
27
+ __exportStar(require("./signal"), exports)
28
+ __exportStar(require("./noise-handler"), exports)
29
+ __exportStar(require("./history"), exports)
30
+ __exportStar(require("./chat-utils"), exports)
31
+ __exportStar(require("./lt-hash"), exports)
32
+ __exportStar(require("./auth-utils"), exports)
33
+ __exportStar(require("./baileys-event-stream"), exports)
34
+ __exportStar(require("./use-mongo-file-auth-state"), exports)
35
+ __exportStar(require("./use-single-file-auth-state"), exports)
36
+ __exportStar(require("./use-multi-file-auth-state"), exports)
37
+ __exportStar(require("./link-preview"), exports)
38
+ __exportStar(require("./event-buffer"), exports)
39
+ __exportStar(require("./process-message"), exports)
40
+ __exportStar(require("./message-retry-manager"), exports)
41
+ __exportStar(require("./check-npm-version"), exports)
@@ -0,0 +1,23 @@
1
+ import { AxiosRequestConfig } from 'axios'
2
+ import { WAMediaUploadFunction, WAUrlInfo } from '../Types'
3
+ import { ILogger } from './logger'
4
+
5
+ export type URLGenerationOptions = {
6
+ thumbnailWidth: number
7
+ fetchOpts: {
8
+ /** Timeout in ms */
9
+ timeout: number
10
+ proxyUrl?: string
11
+ headers?: AxiosRequestConfig<{}>['headers']
12
+ }
13
+ uploadImage?: WAMediaUploadFunction
14
+ logger?: ILogger
15
+ }
16
+
17
+ /**
18
+ * Given a piece of text, checks for any URL present, generates link preview for the same and returns it
19
+ * Return undefined if the fetch failed or no URL was found
20
+ * @param text first matched URL in text
21
+ * @returns the URL info required to generate link preview
22
+ */
23
+ export declare const getUrlInfo: (text: string, opts?: URLGenerationOptions) => Promise<WAUrlInfo | undefined>
@@ -0,0 +1,120 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true })
30
+
31
+ const messages_1 = require("./messages")
32
+ const messages_media_1 = require("./messages-media")
33
+ const THUMBNAIL_WIDTH_PX = 192
34
+
35
+ /** Fetches an image and generates a thumbnail for it */
36
+ const getCompressedJpegThumbnail = async (url, { thumbnailWidth, fetchOpts }) => {
37
+ const stream = await messages_media_1.getHttpStream(url, fetchOpts)
38
+ const result = await messages_media_1.extractImageThumb(stream, thumbnailWidth)
39
+ return result
40
+ }
41
+
42
+ /**
43
+ * Given a piece of text, checks for any URL present, generates link preview for the same and returns it
44
+ * Return undefined if the fetch failed or no URL was found
45
+ * @param text first matched URL in text
46
+ * @returns the URL info required to generate link preview
47
+ */
48
+ const getUrlInfo = async (text, opts = { thumbnailWidth: THUMBNAIL_WIDTH_PX, fetchOpts: { timeout: 3000 }}) => {
49
+ try {
50
+ const retries = 0
51
+ const maxRetry = 5
52
+ const { getLinkPreview } = await Promise.resolve().then(() => __importStar(require('link-preview-js')))
53
+ let previewLink = text
54
+ if (!text.startsWith('https://') && !text.startsWith('http://')) {
55
+ previewLink = 'https://' + previewLink
56
+ }
57
+ const info = await getLinkPreview(previewLink, {
58
+ ...opts.fetchOpts,
59
+ followRedirects: 'follow',
60
+ handleRedirects: (baseURL, forwardedURL) => {
61
+ const urlObj = new URL(baseURL)
62
+ const forwardedURLObj = new URL(forwardedURL)
63
+ if (retries >= maxRetry) {
64
+ return false
65
+ }
66
+ if (forwardedURLObj.hostname === urlObj.hostname
67
+ || forwardedURLObj.hostname === 'www.' + urlObj.hostname
68
+ || 'www.' + forwardedURLObj.hostname === urlObj.hostname) {
69
+ retries + 1
70
+ return true
71
+ }
72
+ else {
73
+ return false
74
+ }
75
+ },
76
+ headers: opts.fetchOpts
77
+ })
78
+ if (info && 'title' in info && info.title) {
79
+ const [image] = info.images
80
+ const urlInfo = {
81
+ 'canonical-url': info.url,
82
+ 'matched-text': text,
83
+ title: info.title,
84
+ description: info.description,
85
+ originalThumbnailUrl: image
86
+ }
87
+ if (opts.uploadImage) {
88
+ const { imageMessage } = await messages_1.prepareWAMessageMedia({ image: { url: image } }, {
89
+ upload: opts.uploadImage,
90
+ mediaTypeOverride: 'thumbnail-link',
91
+ options: opts.fetchOpts
92
+ })
93
+ urlInfo.jpegThumbnail = imageMessage?.jpegThumbnail
94
+ ? Buffer.from(imageMessage.jpegThumbnail)
95
+ : undefined
96
+ urlInfo.highQualityThumbnail = imageMessage || undefined
97
+ }
98
+ else {
99
+ try {
100
+ urlInfo.jpegThumbnail = image
101
+ ? (await getCompressedJpegThumbnail(image, opts)).buffer
102
+ : undefined
103
+ }
104
+ catch (error) {
105
+ opts.logger?.debug({ err: error.stack, url: previewLink }, 'error in generating thumbnail')
106
+ }
107
+ }
108
+ return urlInfo
109
+ }
110
+ }
111
+ catch (error) {
112
+ if (!error.message.includes('receive a valid')) {
113
+ throw error
114
+ }
115
+ }
116
+ }
117
+
118
+ module.exports = {
119
+ getUrlInfo
120
+ }
@@ -0,0 +1,13 @@
1
+ export interface ILogger {
2
+ level: string
3
+ child(obj: Record<string, unknown>): ILogger
4
+ trace(obj: unknown, msg?: string): any
5
+ debug(obj: unknown, msg?: string): any
6
+ info(obj: unknown, msg?: string): any
7
+ warn(obj: unknown, msg?: string): any
8
+ error(obj: unknown, msg?: string): any
9
+ }
10
+
11
+ declare const _default: import("pino").Logger<never, boolean>
12
+
13
+ export default _default
@@ -0,0 +1,7 @@
1
+ "use strict"
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod }
4
+ }
5
+ Object.defineProperty(exports, "__esModule", { value: true })
6
+ const pino_1 = __importDefault(require("pino"))
7
+ exports.default = pino_1.default({ timestamp: () => `,"time":"${new Date().toJSON()}"` })
@@ -0,0 +1,14 @@
1
+ declare class d {
2
+ salt: string
3
+ constructor(e: string)
4
+ add(e: any, t: any): any
5
+ subtract(e: any, t: any): any
6
+ subtractThenAdd(e: any, t: any, r: any): any
7
+ _addSingle(e: any, t: any): Promise<ArrayBuffer>
8
+ _subtractSingle(e: any, t: any): Promise<ArrayBuffer>
9
+ performPointwiseWithOverflow(e: any, t: any, r: any): ArrayBuffer
10
+ }
11
+
12
+ export declare const LT_HASH_ANTI_TAMPERING: d
13
+
14
+ export {}
@@ -0,0 +1,58 @@
1
+ "use strict"
2
+
3
+ Object.defineProperty(exports, "__esModule", { value: true })
4
+
5
+ const crypto_1 = require("./crypto")
6
+
7
+ /**
8
+ * LT Hash is a summation based hash algorithm that maintains the integrity of a piece of data
9
+ * over a series of mutations. You can add/remove mutations and it'll return a hash equal to
10
+ * if the same series of mutations was made sequentially.
11
+ */
12
+ const o = 128
13
+ class d {
14
+ constructor(e) {
15
+ this.salt = e
16
+ }
17
+ add(e, t) {
18
+ var r = this
19
+ for (const item of t) {
20
+ e = r._addSingle(e, item)
21
+ }
22
+ return e
23
+ }
24
+ subtract(e, t) {
25
+ var r = this
26
+ for (const item of t) {
27
+ e = r._subtractSingle(e, item)
28
+ }
29
+ return e
30
+ }
31
+ subtractThenAdd(e, t, r) {
32
+ var n = this
33
+ return n.add(n.subtract(e, r), t)
34
+ }
35
+ async _addSingle(e, t) {
36
+ var r = this
37
+ const n = new Uint8Array(await crypto_1.hkdf(Buffer.from(t), o, { info: r.salt })).buffer
38
+ return r.performPointwiseWithOverflow(await e, n, ((e, t) => e + t))
39
+ }
40
+ async _subtractSingle(e, t) {
41
+ var r = this
42
+ const n = new Uint8Array(await crypto_1.hkdf(Buffer.from(t), o, { info: r.salt })).buffer
43
+ return r.performPointwiseWithOverflow(await e, n, ((e, t) => e - t))
44
+ }
45
+ performPointwiseWithOverflow(e, t, r) {
46
+ const n = new DataView(e), i = new DataView(t), a = new ArrayBuffer(n.byteLength), s = new DataView(a)
47
+ for (let e = 0; e < n.byteLength; e += 2) {
48
+ s.setUint16(e, r(n.getUint16(e, !0), i.getUint16(e, !0)), !0)
49
+ }
50
+ return a
51
+ }
52
+ }
53
+
54
+ const LT_HASH_ANTI_TAMPERING = new d('WhatsApp Patch Integrity')
55
+
56
+ module.exports = {
57
+ LT_HASH_ANTI_TAMPERING
58
+ }
@@ -0,0 +1,9 @@
1
+ export declare const makeMutex: () => {
2
+ mutex<T>(code: () => T | Promise<T>): Promise<T>
3
+ }
4
+
5
+ export type Mutex = ReturnType<typeof makeMutex>
6
+
7
+ export declare const makeKeyedMutex: () => {
8
+ mutex<T>(key: string, task: () => T | Promise<T>): Promise<T>
9
+ }
@@ -0,0 +1,49 @@
1
+ "use strict"
2
+
3
+ Object.defineProperty(exports, "__esModule", { value: true })
4
+
5
+ const makeMutex = () => {
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ let task = Promise.resolve()
8
+ let taskTimeout
9
+ return {
10
+ mutex(code) {
11
+ task = (async () => {
12
+ // wait for the previous task to complete
13
+ // if there is an error, we swallow so as to not block the queue
14
+ try {
15
+ await task
16
+ }
17
+ catch (_a) { }
18
+ try {
19
+ // execute the current task
20
+ const result = await code()
21
+ return result
22
+ }
23
+ finally {
24
+ clearTimeout(taskTimeout)
25
+ }
26
+ })()
27
+ // we replace the existing task, appending the new piece of execution to it
28
+ // so the next task will have to wait for this one to finish
29
+ return task
30
+ },
31
+ }
32
+ }
33
+
34
+ const makeKeyedMutex = () => {
35
+ const map = {}
36
+ return {
37
+ mutex(key, task) {
38
+ if (!map[key]) {
39
+ map[key] = makeMutex()
40
+ }
41
+ return map[key].mutex(task)
42
+ }
43
+ }
44
+ }
45
+
46
+ module.exports = {
47
+ makeMutex,
48
+ makeKeyedMutex
49
+ }
@@ -0,0 +1,82 @@
1
+ import type { proto } from '../../WAProto';
2
+ import type { ILogger } from './logger';
3
+ export interface RecentMessageKey {
4
+ to: string;
5
+ id: string;
6
+ }
7
+ export interface RecentMessage {
8
+ message: proto.IMessage;
9
+ timestamp: number;
10
+ }
11
+ export interface SessionRecreateHistory {
12
+ [jid: string]: number;
13
+ }
14
+ export interface RetryCounter {
15
+ [messageId: string]: number;
16
+ }
17
+ export type PendingPhoneRequest = Record<string, ReturnType<typeof setTimeout>>;
18
+ export interface RetryStatistics {
19
+ totalRetries: number;
20
+ successfulRetries: number;
21
+ failedRetries: number;
22
+ mediaRetries: number;
23
+ sessionRecreations: number;
24
+ phoneRequests: number;
25
+ }
26
+ export declare class MessageRetryManager {
27
+ private logger;
28
+ private recentMessagesMap;
29
+ private messageKeyIndex;
30
+ private sessionRecreateHistory;
31
+ private retryCounters;
32
+ private pendingPhoneRequests;
33
+ private readonly maxMsgRetryCount;
34
+ private statistics;
35
+ constructor(logger: ILogger, maxMsgRetryCount: number);
36
+ /**
37
+ * Add a recent message to the cache for retry handling
38
+ */
39
+ addRecentMessage(to: string, id: string, message: proto.IMessage): void;
40
+ /**
41
+ * Get a recent message from the cache
42
+ */
43
+ getRecentMessage(to: string, id: string): RecentMessage | undefined;
44
+ /**
45
+ * Check if a session should be recreated based on retry count and history
46
+ */
47
+ shouldRecreateSession(jid: string, retryCount: number, hasSession: boolean): {
48
+ reason: string;
49
+ recreate: boolean;
50
+ };
51
+ /**
52
+ * Increment retry counter for a message
53
+ */
54
+ incrementRetryCount(messageId: string): number;
55
+ /**
56
+ * Get retry count for a message
57
+ */
58
+ getRetryCount(messageId: string): number;
59
+ /**
60
+ * Check if message has exceeded maximum retry attempts
61
+ */
62
+ hasExceededMaxRetries(messageId: string): boolean;
63
+ /**
64
+ * Mark retry as successful
65
+ */
66
+ markRetrySuccess(messageId: string): void;
67
+ /**
68
+ * Mark retry as failed
69
+ */
70
+ markRetryFailed(messageId: string): void;
71
+ /**
72
+ * Schedule a phone request with delay
73
+ */
74
+ schedulePhoneRequest(messageId: string, callback: () => void, delay?: number): void;
75
+ /**
76
+ * Cancel pending phone request
77
+ */
78
+ cancelPendingPhoneRequest(messageId: string): void;
79
+ private keyToString;
80
+ private removeRecentMessage;
81
+ }
82
+