@sixcore/baileys 1.0.0

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 (278) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +606 -0
  3. package/WAProto/GenerateStatics.sh +4 -0
  4. package/WAProto/WAProto.proto +4357 -0
  5. package/WAProto/index.d.ts +50383 -0
  6. package/WAProto/index.js +155693 -0
  7. package/WASignalGroup/GroupProtocol.js +1697 -0
  8. package/WASignalGroup/ciphertext_message.js +16 -0
  9. package/WASignalGroup/generate-proto.sh +1 -0
  10. package/WASignalGroup/group.proto +42 -0
  11. package/WASignalGroup/group_cipher.js +120 -0
  12. package/WASignalGroup/group_session_builder.js +46 -0
  13. package/WASignalGroup/index.js +5 -0
  14. package/WASignalGroup/keyhelper.js +21 -0
  15. package/WASignalGroup/protobufs.js +3 -0
  16. package/WASignalGroup/queue_job.js +69 -0
  17. package/WASignalGroup/sender_chain_key.js +50 -0
  18. package/WASignalGroup/sender_key_distribution_message.js +78 -0
  19. package/WASignalGroup/sender_key_message.js +92 -0
  20. package/WASignalGroup/sender_key_name.js +70 -0
  21. package/WASignalGroup/sender_key_record.js +56 -0
  22. package/WASignalGroup/sender_key_state.js +129 -0
  23. package/WASignalGroup/sender_message_key.js +39 -0
  24. package/lib/Defaults/baileys-version.json +3 -0
  25. package/lib/Defaults/index.d.ts +53 -0
  26. package/lib/Defaults/index.js +108 -0
  27. package/lib/Signal/libsignal.d.ts +3 -0
  28. package/lib/Signal/libsignal.js +152 -0
  29. package/lib/Socket/Client/abstract-socket-client.d.ts +17 -0
  30. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  31. package/lib/Socket/Client/index.d.ts +3 -0
  32. package/lib/Socket/Client/index.js +19 -0
  33. package/lib/Socket/Client/mobile-socket-client.d.ts +13 -0
  34. package/lib/Socket/Client/mobile-socket-client.js +65 -0
  35. package/lib/Socket/Client/web-socket-client.d.ts +12 -0
  36. package/lib/Socket/Client/web-socket-client.js +62 -0
  37. package/lib/Socket/business.d.ts +170 -0
  38. package/lib/Socket/business.js +260 -0
  39. package/lib/Socket/chats.d.ts +81 -0
  40. package/lib/Socket/chats.js +950 -0
  41. package/lib/Socket/groups.d.ts +115 -0
  42. package/lib/Socket/groups.js +315 -0
  43. package/lib/Socket/index.d.ts +172 -0
  44. package/lib/Socket/index.js +10 -0
  45. package/lib/Socket/messages-recv.d.ts +158 -0
  46. package/lib/Socket/messages-recv.js +972 -0
  47. package/lib/Socket/messages-send.d.ts +155 -0
  48. package/lib/Socket/messages-send.js +1087 -0
  49. package/lib/Socket/newsletter.d.ts +132 -0
  50. package/lib/Socket/newsletter.js +236 -0
  51. package/lib/Socket/registration.d.ts +264 -0
  52. package/lib/Socket/registration.js +166 -0
  53. package/lib/Socket/socket.d.ts +44 -0
  54. package/lib/Socket/socket.js +643 -0
  55. package/lib/Socket/usync.d.ts +37 -0
  56. package/lib/Socket/usync.js +70 -0
  57. package/lib/Store/index.d.ts +3 -0
  58. package/lib/Store/index.js +10 -0
  59. package/lib/Store/make-cache-manager-store.d.ts +14 -0
  60. package/lib/Store/make-cache-manager-store.js +83 -0
  61. package/lib/Store/make-in-memory-store.d.ts +118 -0
  62. package/lib/Store/make-in-memory-store.js +431 -0
  63. package/lib/Store/make-ordered-dictionary.d.ts +13 -0
  64. package/lib/Store/make-ordered-dictionary.js +81 -0
  65. package/lib/Store/object-repository.d.ts +10 -0
  66. package/lib/Store/object-repository.js +27 -0
  67. package/lib/Types/Auth.d.ts +109 -0
  68. package/lib/Types/Auth.js +2 -0
  69. package/lib/Types/Call.d.ts +13 -0
  70. package/lib/Types/Call.js +2 -0
  71. package/lib/Types/Chat.d.ts +107 -0
  72. package/lib/Types/Chat.js +4 -0
  73. package/lib/Types/Contact.d.ts +19 -0
  74. package/lib/Types/Contact.js +2 -0
  75. package/lib/Types/Events.d.ts +172 -0
  76. package/lib/Types/Events.js +2 -0
  77. package/lib/Types/GroupMetadata.d.ts +56 -0
  78. package/lib/Types/GroupMetadata.js +2 -0
  79. package/lib/Types/Label.d.ts +46 -0
  80. package/lib/Types/Label.js +27 -0
  81. package/lib/Types/LabelAssociation.d.ts +29 -0
  82. package/lib/Types/LabelAssociation.js +9 -0
  83. package/lib/Types/Message.d.ts +433 -0
  84. package/lib/Types/Message.js +9 -0
  85. package/lib/Types/Newsletter.d.ts +92 -0
  86. package/lib/Types/Newsletter.js +32 -0
  87. package/lib/Types/Product.d.ts +78 -0
  88. package/lib/Types/Product.js +2 -0
  89. package/lib/Types/Signal.d.ts +57 -0
  90. package/lib/Types/Signal.js +2 -0
  91. package/lib/Types/Socket.d.ts +116 -0
  92. package/lib/Types/Socket.js +2 -0
  93. package/lib/Types/State.d.ts +27 -0
  94. package/lib/Types/State.js +2 -0
  95. package/lib/Types/USync.d.ts +25 -0
  96. package/lib/Types/USync.js +2 -0
  97. package/lib/Types/index.d.ts +66 -0
  98. package/lib/Types/index.js +42 -0
  99. package/lib/Utils/auth-utils.d.ts +18 -0
  100. package/lib/Utils/auth-utils.js +227 -0
  101. package/lib/Utils/baileys-event-stream.d.ts +16 -0
  102. package/lib/Utils/baileys-event-stream.js +63 -0
  103. package/lib/Utils/business.d.ts +22 -0
  104. package/lib/Utils/business.js +234 -0
  105. package/lib/Utils/chat-utils.d.ts +70 -0
  106. package/lib/Utils/chat-utils.js +745 -0
  107. package/lib/Utils/crypto.d.ts +40 -0
  108. package/lib/Utils/crypto.js +199 -0
  109. package/lib/Utils/decode-wa-message.d.ts +36 -0
  110. package/lib/Utils/decode-wa-message.js +234 -0
  111. package/lib/Utils/event-buffer.d.ts +35 -0
  112. package/lib/Utils/event-buffer.js +517 -0
  113. package/lib/Utils/generics.d.ts +88 -0
  114. package/lib/Utils/generics.js +402 -0
  115. package/lib/Utils/history.d.ts +19 -0
  116. package/lib/Utils/history.js +94 -0
  117. package/lib/Utils/index.d.ts +17 -0
  118. package/lib/Utils/index.js +33 -0
  119. package/lib/Utils/link-preview.d.ts +21 -0
  120. package/lib/Utils/link-preview.js +93 -0
  121. package/lib/Utils/logger.d.ts +2 -0
  122. package/lib/Utils/logger.js +7 -0
  123. package/lib/Utils/lt-hash.d.ts +12 -0
  124. package/lib/Utils/lt-hash.js +51 -0
  125. package/lib/Utils/make-mutex.d.ts +7 -0
  126. package/lib/Utils/make-mutex.js +43 -0
  127. package/lib/Utils/messages-media.d.ts +113 -0
  128. package/lib/Utils/messages-media.js +643 -0
  129. package/lib/Utils/messages.d.ts +77 -0
  130. package/lib/Utils/messages.js +1221 -0
  131. package/lib/Utils/noise-handler.d.ts +20 -0
  132. package/lib/Utils/noise-handler.js +160 -0
  133. package/lib/Utils/process-message.d.ts +41 -0
  134. package/lib/Utils/process-message.js +373 -0
  135. package/lib/Utils/signal.d.ts +33 -0
  136. package/lib/Utils/signal.js +159 -0
  137. package/lib/Utils/use-multi-file-auth-state.d.ts +12 -0
  138. package/lib/Utils/use-multi-file-auth-state.js +295 -0
  139. package/lib/Utils/use-single-file-auth-state.d.ts +12 -0
  140. package/lib/Utils/use-single-file-auth-state.js +75 -0
  141. package/lib/Utils/validate-connection.d.ts +11 -0
  142. package/lib/Utils/validate-connection.js +205 -0
  143. package/lib/WABinary/constants.d.ts +27 -0
  144. package/lib/WABinary/constants.js +40 -0
  145. package/lib/WABinary/decode.d.ts +6 -0
  146. package/lib/WABinary/decode.js +264 -0
  147. package/lib/WABinary/encode.d.ts +2 -0
  148. package/lib/WABinary/encode.js +252 -0
  149. package/lib/WABinary/generic-utils.d.ts +14 -0
  150. package/lib/WABinary/generic-utils.js +110 -0
  151. package/lib/WABinary/index.d.ts +5 -0
  152. package/lib/WABinary/index.js +21 -0
  153. package/lib/WABinary/jid-utils.d.ts +31 -0
  154. package/lib/WABinary/jid-utils.js +62 -0
  155. package/lib/WABinary/types.d.ts +18 -0
  156. package/lib/WABinary/types.js +2 -0
  157. package/lib/WAM/BinaryInfo.d.ts +8 -0
  158. package/lib/WAM/BinaryInfo.js +13 -0
  159. package/lib/WAM/constants.d.ts +38 -0
  160. package/lib/WAM/constants.js +15350 -0
  161. package/lib/WAM/encode.d.ts +2 -0
  162. package/lib/WAM/encode.js +155 -0
  163. package/lib/WAM/index.d.ts +3 -0
  164. package/lib/WAM/index.js +19 -0
  165. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
  166. package/lib/WAUSync/Protocols/USyncContactProtocol.js +32 -0
  167. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  168. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
  169. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  170. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
  171. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  172. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
  173. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +25 -0
  174. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +53 -0
  175. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +8 -0
  176. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
  177. package/lib/WAUSync/Protocols/index.d.ts +4 -0
  178. package/lib/WAUSync/Protocols/index.js +20 -0
  179. package/lib/WAUSync/USyncQuery.d.ts +28 -0
  180. package/lib/WAUSync/USyncQuery.js +89 -0
  181. package/lib/WAUSync/USyncUser.d.ts +10 -0
  182. package/lib/WAUSync/USyncUser.js +26 -0
  183. package/lib/WAUSync/index.d.ts +3 -0
  184. package/lib/WAUSync/index.js +19 -0
  185. package/lib/index.js +31 -0
  186. package/package.json +51 -0
  187. package/src/Defaults/baileys-version.json +3 -0
  188. package/src/Defaults/index.ts +133 -0
  189. package/src/Signal/Group/ciphertext-message.ts +9 -0
  190. package/src/Signal/Group/group-session-builder.ts +56 -0
  191. package/src/Signal/Group/group_cipher.ts +117 -0
  192. package/src/Signal/Group/index.ts +11 -0
  193. package/src/Signal/Group/keyhelper.ts +28 -0
  194. package/src/Signal/Group/sender-chain-key.ts +34 -0
  195. package/src/Signal/Group/sender-key-distribution-message.ts +95 -0
  196. package/src/Signal/Group/sender-key-message.ts +96 -0
  197. package/src/Signal/Group/sender-key-name.ts +66 -0
  198. package/src/Signal/Group/sender-key-record.ts +69 -0
  199. package/src/Signal/Group/sender-key-state.ts +134 -0
  200. package/src/Signal/Group/sender-message-key.ts +36 -0
  201. package/src/Signal/libsignal.ts +447 -0
  202. package/src/Signal/lid-mapping.ts +209 -0
  203. package/src/Socket/Client/index.ts +2 -0
  204. package/src/Socket/Client/types.ts +22 -0
  205. package/src/Socket/Client/websocket.ts +56 -0
  206. package/src/Socket/business.ts +421 -0
  207. package/src/Socket/chats.ts +1223 -0
  208. package/src/Socket/communities.ts +477 -0
  209. package/src/Socket/groups.ts +361 -0
  210. package/src/Socket/index.ts +22 -0
  211. package/src/Socket/messages-recv.ts +1563 -0
  212. package/src/Socket/messages-send.ts +1210 -0
  213. package/src/Socket/mex.ts +58 -0
  214. package/src/Socket/newsletter.ts +229 -0
  215. package/src/Socket/socket.ts +1072 -0
  216. package/src/Types/Auth.ts +115 -0
  217. package/src/Types/Bussines.ts +20 -0
  218. package/src/Types/Call.ts +14 -0
  219. package/src/Types/Chat.ts +138 -0
  220. package/src/Types/Contact.ts +24 -0
  221. package/src/Types/Events.ts +132 -0
  222. package/src/Types/GroupMetadata.ts +70 -0
  223. package/src/Types/Label.ts +48 -0
  224. package/src/Types/LabelAssociation.ts +35 -0
  225. package/src/Types/Message.ts +424 -0
  226. package/src/Types/Newsletter.ts +98 -0
  227. package/src/Types/Product.ts +85 -0
  228. package/src/Types/Signal.ts +76 -0
  229. package/src/Types/Socket.ts +150 -0
  230. package/src/Types/State.ts +43 -0
  231. package/src/Types/USync.ts +27 -0
  232. package/src/Types/globals.d.ts +8 -0
  233. package/src/Types/index.ts +67 -0
  234. package/src/Utils/auth-utils.ts +331 -0
  235. package/src/Utils/browser-utils.ts +31 -0
  236. package/src/Utils/business.ts +286 -0
  237. package/src/Utils/chat-utils.ts +933 -0
  238. package/src/Utils/crypto.ts +184 -0
  239. package/src/Utils/decode-wa-message.ts +355 -0
  240. package/src/Utils/event-buffer.ts +662 -0
  241. package/src/Utils/generics.ts +470 -0
  242. package/src/Utils/history.ts +114 -0
  243. package/src/Utils/index.ts +18 -0
  244. package/src/Utils/link-preview.ts +111 -0
  245. package/src/Utils/logger.ts +13 -0
  246. package/src/Utils/lt-hash.ts +65 -0
  247. package/src/Utils/make-mutex.ts +45 -0
  248. package/src/Utils/message-retry-manager.ts +229 -0
  249. package/src/Utils/messages-media.ts +820 -0
  250. package/src/Utils/messages.ts +1137 -0
  251. package/src/Utils/noise-handler.ts +192 -0
  252. package/src/Utils/pre-key-manager.ts +126 -0
  253. package/src/Utils/process-message.ts +622 -0
  254. package/src/Utils/signal.ts +214 -0
  255. package/src/Utils/use-multi-file-auth-state.ts +136 -0
  256. package/src/Utils/validate-connection.ts +253 -0
  257. package/src/WABinary/constants.ts +1305 -0
  258. package/src/WABinary/decode.ts +281 -0
  259. package/src/WABinary/encode.ts +253 -0
  260. package/src/WABinary/generic-utils.ts +127 -0
  261. package/src/WABinary/index.ts +5 -0
  262. package/src/WABinary/jid-utils.ts +128 -0
  263. package/src/WABinary/types.ts +17 -0
  264. package/src/WAM/BinaryInfo.ts +12 -0
  265. package/src/WAM/constants.ts +22889 -0
  266. package/src/WAM/encode.ts +169 -0
  267. package/src/WAM/index.ts +3 -0
  268. package/src/WAUSync/Protocols/USyncContactProtocol.ts +32 -0
  269. package/src/WAUSync/Protocols/USyncDeviceProtocol.ts +78 -0
  270. package/src/WAUSync/Protocols/USyncDisappearingModeProtocol.ts +35 -0
  271. package/src/WAUSync/Protocols/USyncStatusProtocol.ts +44 -0
  272. package/src/WAUSync/Protocols/UsyncBotProfileProtocol.ts +76 -0
  273. package/src/WAUSync/Protocols/UsyncLIDProtocol.ts +33 -0
  274. package/src/WAUSync/Protocols/index.ts +4 -0
  275. package/src/WAUSync/USyncQuery.ts +133 -0
  276. package/src/WAUSync/USyncUser.ts +32 -0
  277. package/src/WAUSync/index.ts +3 -0
  278. package/src/index.ts +13 -0
@@ -0,0 +1,286 @@
1
+ import { Boom } from '@hapi/boom'
2
+ import { createHash } from 'crypto'
3
+ import { createWriteStream, promises as fs } from 'fs'
4
+ import { tmpdir } from 'os'
5
+ import { join } from 'path'
6
+ import type {
7
+ CatalogCollection,
8
+ CatalogStatus,
9
+ OrderDetails,
10
+ OrderProduct,
11
+ Product,
12
+ ProductCreate,
13
+ ProductUpdate,
14
+ WAMediaUpload,
15
+ WAMediaUploadFunction
16
+ } from '../Types'
17
+ import { type BinaryNode, getBinaryNodeChild, getBinaryNodeChildren, getBinaryNodeChildString } from '../WABinary'
18
+ import { generateMessageIDV2 } from './generics'
19
+ import { getStream, getUrlFromDirectPath } from './messages-media'
20
+
21
+ export const parseCatalogNode = (node: BinaryNode) => {
22
+ const catalogNode = getBinaryNodeChild(node, 'product_catalog')
23
+ const products = getBinaryNodeChildren(catalogNode, 'product').map(parseProductNode)
24
+ const paging = getBinaryNodeChild(catalogNode, 'paging')
25
+
26
+ return {
27
+ products,
28
+ nextPageCursor: paging ? getBinaryNodeChildString(paging, 'after') : undefined
29
+ }
30
+ }
31
+
32
+ export const parseCollectionsNode = (node: BinaryNode) => {
33
+ const collectionsNode = getBinaryNodeChild(node, 'collections')
34
+ const collections = getBinaryNodeChildren(collectionsNode, 'collection').map<CatalogCollection>(collectionNode => {
35
+ const id = getBinaryNodeChildString(collectionNode, 'id')!
36
+ const name = getBinaryNodeChildString(collectionNode, 'name')!
37
+
38
+ const products = getBinaryNodeChildren(collectionNode, 'product').map(parseProductNode)
39
+ return {
40
+ id,
41
+ name,
42
+ products,
43
+ status: parseStatusInfo(collectionNode)
44
+ }
45
+ })
46
+
47
+ return {
48
+ collections
49
+ }
50
+ }
51
+
52
+ export const parseOrderDetailsNode = (node: BinaryNode) => {
53
+ const orderNode = getBinaryNodeChild(node, 'order')
54
+ const products = getBinaryNodeChildren(orderNode, 'product').map<OrderProduct>(productNode => {
55
+ const imageNode = getBinaryNodeChild(productNode, 'image')!
56
+ return {
57
+ id: getBinaryNodeChildString(productNode, 'id')!,
58
+ name: getBinaryNodeChildString(productNode, 'name')!,
59
+ imageUrl: getBinaryNodeChildString(imageNode, 'url')!,
60
+ price: +getBinaryNodeChildString(productNode, 'price')!,
61
+ currency: getBinaryNodeChildString(productNode, 'currency')!,
62
+ quantity: +getBinaryNodeChildString(productNode, 'quantity')!
63
+ }
64
+ })
65
+
66
+ const priceNode = getBinaryNodeChild(orderNode, 'price')
67
+
68
+ const orderDetails: OrderDetails = {
69
+ price: {
70
+ total: +getBinaryNodeChildString(priceNode, 'total')!,
71
+ currency: getBinaryNodeChildString(priceNode, 'currency')!
72
+ },
73
+ products
74
+ }
75
+
76
+ return orderDetails
77
+ }
78
+
79
+ export const toProductNode = (productId: string | undefined, product: ProductCreate | ProductUpdate) => {
80
+ const attrs: BinaryNode['attrs'] = {}
81
+ const content: BinaryNode[] = []
82
+
83
+ if (typeof productId !== 'undefined') {
84
+ content.push({
85
+ tag: 'id',
86
+ attrs: {},
87
+ content: Buffer.from(productId)
88
+ })
89
+ }
90
+
91
+ if (typeof product.name !== 'undefined') {
92
+ content.push({
93
+ tag: 'name',
94
+ attrs: {},
95
+ content: Buffer.from(product.name)
96
+ })
97
+ }
98
+
99
+ if (typeof product.description !== 'undefined') {
100
+ content.push({
101
+ tag: 'description',
102
+ attrs: {},
103
+ content: Buffer.from(product.description)
104
+ })
105
+ }
106
+
107
+ if (typeof product.retailerId !== 'undefined') {
108
+ content.push({
109
+ tag: 'retailer_id',
110
+ attrs: {},
111
+ content: Buffer.from(product.retailerId)
112
+ })
113
+ }
114
+
115
+ if (product.images.length) {
116
+ content.push({
117
+ tag: 'media',
118
+ attrs: {},
119
+ content: product.images.map(img => {
120
+ if (!('url' in img)) {
121
+ throw new Boom('Expected img for product to already be uploaded', { statusCode: 400 })
122
+ }
123
+
124
+ return {
125
+ tag: 'image',
126
+ attrs: {},
127
+ content: [
128
+ {
129
+ tag: 'url',
130
+ attrs: {},
131
+ content: Buffer.from(img.url.toString())
132
+ }
133
+ ]
134
+ }
135
+ })
136
+ })
137
+ }
138
+
139
+ if (typeof product.price !== 'undefined') {
140
+ content.push({
141
+ tag: 'price',
142
+ attrs: {},
143
+ content: Buffer.from(product.price.toString())
144
+ })
145
+ }
146
+
147
+ if (typeof product.currency !== 'undefined') {
148
+ content.push({
149
+ tag: 'currency',
150
+ attrs: {},
151
+ content: Buffer.from(product.currency)
152
+ })
153
+ }
154
+
155
+ if ('originCountryCode' in product) {
156
+ if (typeof product.originCountryCode === 'undefined') {
157
+ attrs['compliance_category'] = 'COUNTRY_ORIGIN_EXEMPT'
158
+ } else {
159
+ content.push({
160
+ tag: 'compliance_info',
161
+ attrs: {},
162
+ content: [
163
+ {
164
+ tag: 'country_code_origin',
165
+ attrs: {},
166
+ content: Buffer.from(product.originCountryCode)
167
+ }
168
+ ]
169
+ })
170
+ }
171
+ }
172
+
173
+ if (typeof product.isHidden !== 'undefined') {
174
+ attrs['is_hidden'] = product.isHidden.toString()
175
+ }
176
+
177
+ const node: BinaryNode = {
178
+ tag: 'product',
179
+ attrs,
180
+ content
181
+ }
182
+ return node
183
+ }
184
+
185
+ export const parseProductNode = (productNode: BinaryNode) => {
186
+ const isHidden = productNode.attrs.is_hidden === 'true'
187
+ const id = getBinaryNodeChildString(productNode, 'id')!
188
+
189
+ const mediaNode = getBinaryNodeChild(productNode, 'media')!
190
+ const statusInfoNode = getBinaryNodeChild(productNode, 'status_info')!
191
+
192
+ const product: Product = {
193
+ id,
194
+ imageUrls: parseImageUrls(mediaNode),
195
+ reviewStatus: {
196
+ whatsapp: getBinaryNodeChildString(statusInfoNode, 'status')!
197
+ },
198
+ availability: 'in stock',
199
+ name: getBinaryNodeChildString(productNode, 'name')!,
200
+ retailerId: getBinaryNodeChildString(productNode, 'retailer_id'),
201
+ url: getBinaryNodeChildString(productNode, 'url'),
202
+ description: getBinaryNodeChildString(productNode, 'description')!,
203
+ price: +getBinaryNodeChildString(productNode, 'price')!,
204
+ currency: getBinaryNodeChildString(productNode, 'currency')!,
205
+ isHidden
206
+ }
207
+
208
+ return product
209
+ }
210
+
211
+ /**
212
+ * Uploads images not already uploaded to WA's servers
213
+ */
214
+ export async function uploadingNecessaryImagesOfProduct<T extends ProductUpdate | ProductCreate>(
215
+ product: T,
216
+ waUploadToServer: WAMediaUploadFunction,
217
+ timeoutMs = 30_000
218
+ ) {
219
+ product = {
220
+ ...product,
221
+ images: product.images
222
+ ? await uploadingNecessaryImages(product.images, waUploadToServer, timeoutMs)
223
+ : product.images
224
+ }
225
+ return product
226
+ }
227
+
228
+ /**
229
+ * Uploads images not already uploaded to WA's servers
230
+ */
231
+ export const uploadingNecessaryImages = async (
232
+ images: WAMediaUpload[],
233
+ waUploadToServer: WAMediaUploadFunction,
234
+ timeoutMs = 30_000
235
+ ) => {
236
+ const results = await Promise.all(
237
+ images.map<Promise<{ url: string }>>(async img => {
238
+ if ('url' in img) {
239
+ const url = img.url.toString()
240
+ if (url.includes('.whatsapp.net')) {
241
+ return { url }
242
+ }
243
+ }
244
+
245
+ const { stream } = await getStream(img)
246
+ const hasher = createHash('sha256')
247
+
248
+ const filePath = join(tmpdir(), 'img' + generateMessageIDV2())
249
+ const encFileWriteStream = createWriteStream(filePath)
250
+
251
+ for await (const block of stream) {
252
+ hasher.update(block)
253
+ encFileWriteStream.write(block)
254
+ }
255
+
256
+ const sha = hasher.digest('base64')
257
+
258
+ const { directPath } = await waUploadToServer(filePath, {
259
+ mediaType: 'product-catalog-image',
260
+ fileEncSha256B64: sha,
261
+ timeoutMs
262
+ })
263
+
264
+ await fs.unlink(filePath).catch(err => console.log('Error deleting temp file ', err))
265
+
266
+ return { url: getUrlFromDirectPath(directPath) }
267
+ })
268
+ )
269
+ return results
270
+ }
271
+
272
+ const parseImageUrls = (mediaNode: BinaryNode) => {
273
+ const imgNode = getBinaryNodeChild(mediaNode, 'image')
274
+ return {
275
+ requested: getBinaryNodeChildString(imgNode, 'request_image_url')!,
276
+ original: getBinaryNodeChildString(imgNode, 'original_image_url')!
277
+ }
278
+ }
279
+
280
+ const parseStatusInfo = (mediaNode: BinaryNode): CatalogStatus => {
281
+ const node = getBinaryNodeChild(mediaNode, 'status_info')
282
+ return {
283
+ status: getBinaryNodeChildString(node, 'status')!,
284
+ canAppeal: getBinaryNodeChildString(node, 'can_appeal') === 'true'
285
+ }
286
+ }