gifted-baileys 1.5.0 → 1.5.5

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 (222) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1429 -684
  3. package/package.json +11 -26
  4. package/src/Defaults/baileys-version.json +3 -0
  5. package/{lib → src}/Defaults/index.js +16 -8
  6. package/src/Defaults/index.ts +131 -0
  7. package/src/Defaults/phonenumber-mcc.json +223 -0
  8. package/src/Signal/libsignal.js +180 -0
  9. package/src/Signal/libsignal.ts +141 -0
  10. package/src/Socket/Client/abstract-socket-client.ts +19 -0
  11. package/src/Socket/Client/index.ts +3 -0
  12. package/src/Socket/Client/mobile-socket-client.js +78 -0
  13. package/src/Socket/Client/mobile-socket-client.ts +66 -0
  14. package/src/Socket/Client/web-socket-client.js +75 -0
  15. package/src/Socket/Client/web-socket-client.ts +57 -0
  16. package/{lib → src}/Socket/business.js +33 -27
  17. package/src/Socket/business.ts +281 -0
  18. package/{lib → src}/Socket/chats.js +197 -178
  19. package/src/Socket/chats.ts +1030 -0
  20. package/{lib → src}/Socket/groups.js +69 -79
  21. package/src/Socket/groups.ts +356 -0
  22. package/{lib → src}/Socket/index.js +1 -4
  23. package/src/Socket/index.ts +13 -0
  24. package/{lib → src}/Socket/messages-recv.js +160 -108
  25. package/src/Socket/messages-recv.ts +985 -0
  26. package/{lib → src}/Socket/messages-send.js +183 -100
  27. package/src/Socket/messages-send.ts +871 -0
  28. package/src/Socket/newsletter.js +227 -0
  29. package/src/Socket/newsletter.ts +282 -0
  30. package/{lib → src}/Socket/registration.js +55 -63
  31. package/src/Socket/registration.ts +250 -0
  32. package/{lib → src}/Socket/socket.js +107 -66
  33. package/src/Socket/socket.ts +777 -0
  34. package/src/Store/index.ts +3 -0
  35. package/{lib → src}/Store/make-cache-manager-store.js +34 -25
  36. package/src/Store/make-cache-manager-store.ts +100 -0
  37. package/{lib → src}/Store/make-in-memory-store.js +51 -61
  38. package/src/Store/make-in-memory-store.ts +475 -0
  39. package/src/Store/make-ordered-dictionary.ts +86 -0
  40. package/{lib → src}/Store/object-repository.js +1 -1
  41. package/src/Store/object-repository.ts +32 -0
  42. package/src/Tests/test.app-state-sync.js +204 -0
  43. package/src/Tests/test.app-state-sync.ts +207 -0
  44. package/src/Tests/test.event-buffer.js +270 -0
  45. package/src/Tests/test.event-buffer.ts +319 -0
  46. package/src/Tests/test.key-store.js +76 -0
  47. package/src/Tests/test.key-store.ts +92 -0
  48. package/src/Tests/test.libsignal.js +141 -0
  49. package/src/Tests/test.libsignal.ts +186 -0
  50. package/src/Tests/test.media-download.js +93 -0
  51. package/src/Tests/test.media-download.ts +76 -0
  52. package/src/Tests/test.messages.js +33 -0
  53. package/src/Tests/test.messages.ts +37 -0
  54. package/src/Tests/utils.js +34 -0
  55. package/src/Tests/utils.ts +36 -0
  56. package/src/Types/Auth.ts +113 -0
  57. package/src/Types/Call.ts +15 -0
  58. package/src/Types/Chat.ts +106 -0
  59. package/{lib/Types/Contact.d.ts → src/Types/Contact.ts} +9 -8
  60. package/src/Types/Events.ts +93 -0
  61. package/src/Types/GroupMetadata.ts +53 -0
  62. package/{lib → src}/Types/Label.js +1 -1
  63. package/src/Types/Label.ts +36 -0
  64. package/{lib → src}/Types/LabelAssociation.js +1 -1
  65. package/{lib/Types/LabelAssociation.d.ts → src/Types/LabelAssociation.ts} +22 -16
  66. package/src/Types/Message.ts +288 -0
  67. package/src/Types/Newsletter.js +32 -0
  68. package/src/Types/Newsletter.ts +98 -0
  69. package/src/Types/Product.ts +85 -0
  70. package/src/Types/Signal.ts +68 -0
  71. package/{lib/Types/Socket.d.ts → src/Types/Socket.ts} +68 -56
  72. package/src/Types/State.ts +29 -0
  73. package/{lib → src}/Types/index.js +2 -1
  74. package/src/Types/index.ts +59 -0
  75. package/{lib → src}/Utils/auth-utils.js +95 -76
  76. package/src/Utils/auth-utils.ts +222 -0
  77. package/src/Utils/baileys-event-stream.js +92 -0
  78. package/src/Utils/baileys-event-stream.ts +66 -0
  79. package/{lib → src}/Utils/business.js +45 -17
  80. package/src/Utils/business.ts +275 -0
  81. package/{lib → src}/Utils/chat-utils.js +74 -46
  82. package/src/Utils/chat-utils.ts +860 -0
  83. package/{lib → src}/Utils/crypto.js +31 -21
  84. package/src/Utils/crypto.ts +131 -0
  85. package/src/Utils/decode-wa-message.js +211 -0
  86. package/src/Utils/decode-wa-message.ts +228 -0
  87. package/{lib → src}/Utils/event-buffer.js +13 -4
  88. package/src/Utils/event-buffer.ts +613 -0
  89. package/{lib → src}/Utils/generics.js +98 -45
  90. package/src/Utils/generics.ts +434 -0
  91. package/{lib → src}/Utils/history.js +39 -10
  92. package/src/Utils/history.ts +112 -0
  93. package/src/Utils/index.ts +17 -0
  94. package/{lib → src}/Utils/link-preview.js +54 -17
  95. package/src/Utils/link-preview.ts +122 -0
  96. package/src/Utils/logger.ts +3 -0
  97. package/src/Utils/lt-hash.ts +61 -0
  98. package/{lib → src}/Utils/make-mutex.js +13 -4
  99. package/src/Utils/make-mutex.ts +44 -0
  100. package/{lib → src}/Utils/messages-media.js +296 -192
  101. package/src/Utils/messages-media.ts +847 -0
  102. package/{lib → src}/Utils/messages.js +124 -113
  103. package/src/Utils/messages.ts +956 -0
  104. package/{lib → src}/Utils/noise-handler.js +16 -3
  105. package/src/Utils/noise-handler.ts +197 -0
  106. package/{lib → src}/Utils/process-message.js +33 -29
  107. package/src/Utils/process-message.ts +414 -0
  108. package/{lib → src}/Utils/signal.js +23 -14
  109. package/src/Utils/signal.ts +177 -0
  110. package/{lib → src}/Utils/use-multi-file-auth-state.js +28 -19
  111. package/src/Utils/use-multi-file-auth-state.ts +90 -0
  112. package/{lib → src}/Utils/validate-connection.js +25 -42
  113. package/src/Utils/validate-connection.ts +238 -0
  114. package/src/WABinary/constants.ts +42 -0
  115. package/{lib → src}/WABinary/decode.js +17 -7
  116. package/src/WABinary/decode.ts +265 -0
  117. package/{lib → src}/WABinary/encode.js +17 -7
  118. package/src/WABinary/encode.ts +236 -0
  119. package/{lib → src}/WABinary/generic-utils.js +2 -2
  120. package/src/WABinary/generic-utils.ts +121 -0
  121. package/src/WABinary/index.ts +5 -0
  122. package/{lib → src}/WABinary/jid-utils.js +4 -1
  123. package/src/WABinary/jid-utils.ts +68 -0
  124. package/src/WABinary/types.ts +17 -0
  125. package/src/WAM/BinaryInfo.js +13 -0
  126. package/src/WAM/BinaryInfo.ts +12 -0
  127. package/src/WAM/constants.js +15350 -0
  128. package/src/WAM/constants.ts +15382 -0
  129. package/src/WAM/encode.js +155 -0
  130. package/src/WAM/encode.ts +174 -0
  131. package/src/WAM/index.js +19 -0
  132. package/src/WAM/index.ts +3 -0
  133. package/src/gifted +1 -0
  134. package/{lib → src}/index.js +1 -0
  135. package/src/index.ts +13 -0
  136. package/lib/Defaults/baileys-version.json +0 -3
  137. package/lib/Defaults/index.d.ts +0 -284
  138. package/lib/Defaults/phonenumber-mcc.json +0 -223
  139. package/lib/Signal/libsignal.d.ts +0 -3
  140. package/lib/Signal/libsignal.js +0 -152
  141. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
  142. package/lib/Socket/Client/index.d.ts +0 -3
  143. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
  144. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  145. package/lib/Socket/Client/web-socket-client.d.ts +0 -12
  146. package/lib/Socket/Client/web-socket-client.js +0 -62
  147. package/lib/Socket/business.d.ts +0 -135
  148. package/lib/Socket/chats.d.ts +0 -79
  149. package/lib/Socket/groups.d.ts +0 -113
  150. package/lib/Socket/index.d.ts +0 -137
  151. package/lib/Socket/messages-recv.d.ts +0 -124
  152. package/lib/Socket/messages-send.d.ts +0 -119
  153. package/lib/Socket/registration.d.ts +0 -232
  154. package/lib/Socket/socket.d.ts +0 -42
  155. package/lib/Store/index.d.ts +0 -3
  156. package/lib/Store/make-cache-manager-store.d.ts +0 -13
  157. package/lib/Store/make-in-memory-store.d.ts +0 -117
  158. package/lib/Store/make-ordered-dictionary.d.ts +0 -13
  159. package/lib/Store/object-repository.d.ts +0 -10
  160. package/lib/Types/Auth.d.ts +0 -108
  161. package/lib/Types/Call.d.ts +0 -13
  162. package/lib/Types/Chat.d.ts +0 -102
  163. package/lib/Types/Events.d.ts +0 -157
  164. package/lib/Types/GroupMetadata.d.ts +0 -52
  165. package/lib/Types/Label.d.ts +0 -35
  166. package/lib/Types/Message.d.ts +0 -261
  167. package/lib/Types/Product.d.ts +0 -78
  168. package/lib/Types/Signal.d.ts +0 -57
  169. package/lib/Types/State.d.ts +0 -27
  170. package/lib/Types/index.d.ts +0 -56
  171. package/lib/Utils/auth-utils.d.ts +0 -18
  172. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  173. package/lib/Utils/baileys-event-stream.js +0 -63
  174. package/lib/Utils/business.d.ts +0 -22
  175. package/lib/Utils/chat-utils.d.ts +0 -71
  176. package/lib/Utils/crypto.d.ts +0 -41
  177. package/lib/Utils/decode-wa-message.d.ts +0 -19
  178. package/lib/Utils/decode-wa-message.js +0 -174
  179. package/lib/Utils/event-buffer.d.ts +0 -35
  180. package/lib/Utils/generics.d.ts +0 -94
  181. package/lib/Utils/history.d.ts +0 -15
  182. package/lib/Utils/index.d.ts +0 -17
  183. package/lib/Utils/link-preview.d.ts +0 -21
  184. package/lib/Utils/logger.d.ts +0 -4
  185. package/lib/Utils/lt-hash.d.ts +0 -12
  186. package/lib/Utils/make-mutex.d.ts +0 -7
  187. package/lib/Utils/messages-media.d.ts +0 -107
  188. package/lib/Utils/messages.d.ts +0 -76
  189. package/lib/Utils/noise-handler.d.ts +0 -20
  190. package/lib/Utils/process-message.d.ts +0 -41
  191. package/lib/Utils/signal.d.ts +0 -32
  192. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -12
  193. package/lib/Utils/validate-connection.d.ts +0 -11
  194. package/lib/WABinary/constants.d.ts +0 -27
  195. package/lib/WABinary/decode.d.ts +0 -7
  196. package/lib/WABinary/encode.d.ts +0 -3
  197. package/lib/WABinary/generic-utils.d.ts +0 -15
  198. package/lib/WABinary/index.d.ts +0 -5
  199. package/lib/WABinary/jid-utils.d.ts +0 -29
  200. package/lib/WABinary/types.d.ts +0 -18
  201. package/lib/index.d.ts +0 -10
  202. /package/{lib → src}/Socket/Client/abstract-socket-client.js +0 -0
  203. /package/{lib → src}/Socket/Client/index.js +0 -0
  204. /package/{lib → src}/Store/index.js +0 -0
  205. /package/{lib → src}/Store/make-ordered-dictionary.js +0 -0
  206. /package/{lib → src}/Types/Auth.js +0 -0
  207. /package/{lib → src}/Types/Call.js +0 -0
  208. /package/{lib → src}/Types/Chat.js +0 -0
  209. /package/{lib → src}/Types/Contact.js +0 -0
  210. /package/{lib → src}/Types/Events.js +0 -0
  211. /package/{lib → src}/Types/GroupMetadata.js +0 -0
  212. /package/{lib → src}/Types/Message.js +0 -0
  213. /package/{lib → src}/Types/Product.js +0 -0
  214. /package/{lib → src}/Types/Signal.js +0 -0
  215. /package/{lib → src}/Types/Socket.js +0 -0
  216. /package/{lib → src}/Types/State.js +0 -0
  217. /package/{lib → src}/Utils/index.js +0 -0
  218. /package/{lib → src}/Utils/logger.js +0 -0
  219. /package/{lib → src}/Utils/lt-hash.js +0 -0
  220. /package/{lib → src}/WABinary/constants.js +0 -0
  221. /package/{lib → src}/WABinary/index.js +0 -0
  222. /package/{lib → src}/WABinary/types.js +0 -0
@@ -1,6 +1,23 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
12
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
13
+ var m = o[Symbol.asyncIterator], i;
14
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
15
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
16
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
17
+ };
2
18
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.uploadingNecessaryImages = exports.uploadingNecessaryImagesOfProduct = exports.parseProductNode = exports.toProductNode = exports.parseOrderDetailsNode = exports.parseCollectionsNode = exports.parseCatalogNode = void 0;
19
+ exports.uploadingNecessaryImages = exports.parseProductNode = exports.toProductNode = exports.parseOrderDetailsNode = exports.parseCollectionsNode = exports.parseCatalogNode = void 0;
20
+ exports.uploadingNecessaryImagesOfProduct = uploadingNecessaryImagesOfProduct;
4
21
  const boom_1 = require("@hapi/boom");
5
22
  const crypto_1 = require("crypto");
6
23
  const WABinary_1 = require("../WABinary");
@@ -181,42 +198,53 @@ exports.parseProductNode = parseProductNode;
181
198
  /**
182
199
  * Uploads images not already uploaded to WA's servers
183
200
  */
184
- async function uploadingNecessaryImagesOfProduct(product, waUploadToServer, timeoutMs = 30000) {
185
- product = {
186
- ...product,
187
- images: product.images ? await (0, exports.uploadingNecessaryImages)(product.images, waUploadToServer, timeoutMs) : product.images
188
- };
189
- return product;
201
+ function uploadingNecessaryImagesOfProduct(product_1, waUploadToServer_1) {
202
+ return __awaiter(this, arguments, void 0, function* (product, waUploadToServer, timeoutMs = 30000) {
203
+ product = Object.assign(Object.assign({}, product), { images: product.images ? yield (0, exports.uploadingNecessaryImages)(product.images, waUploadToServer, timeoutMs) : product.images });
204
+ return product;
205
+ });
190
206
  }
191
- exports.uploadingNecessaryImagesOfProduct = uploadingNecessaryImagesOfProduct;
192
207
  /**
193
208
  * Uploads images not already uploaded to WA's servers
194
209
  */
195
- const uploadingNecessaryImages = async (images, waUploadToServer, timeoutMs = 30000) => {
196
- const results = await Promise.all(images.map(async (img) => {
210
+ const uploadingNecessaryImages = (images_1, waUploadToServer_1, ...args_1) => __awaiter(void 0, [images_1, waUploadToServer_1, ...args_1], void 0, function* (images, waUploadToServer, timeoutMs = 30000) {
211
+ const results = yield Promise.all(images.map((img) => __awaiter(void 0, void 0, void 0, function* () {
212
+ var _a, e_1, _b, _c;
197
213
  if ('url' in img) {
198
214
  const url = img.url.toString();
199
215
  if (url.includes('.whatsapp.net')) {
200
216
  return { url };
201
217
  }
202
218
  }
203
- const { stream } = await (0, messages_media_1.getStream)(img);
219
+ const { stream } = yield (0, messages_media_1.getStream)(img);
204
220
  const hasher = (0, crypto_1.createHash)('sha256');
205
221
  const contentBlocks = [];
206
- for await (const block of stream) {
207
- hasher.update(block);
208
- contentBlocks.push(block);
222
+ try {
223
+ for (var _d = true, stream_1 = __asyncValues(stream), stream_1_1; stream_1_1 = yield stream_1.next(), _a = stream_1_1.done, !_a; _d = true) {
224
+ _c = stream_1_1.value;
225
+ _d = false;
226
+ const block = _c;
227
+ hasher.update(block);
228
+ contentBlocks.push(block);
229
+ }
230
+ }
231
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
232
+ finally {
233
+ try {
234
+ if (!_d && !_a && (_b = stream_1.return)) yield _b.call(stream_1);
235
+ }
236
+ finally { if (e_1) throw e_1.error; }
209
237
  }
210
238
  const sha = hasher.digest('base64');
211
- const { directPath } = await waUploadToServer((0, messages_media_1.toReadable)(Buffer.concat(contentBlocks)), {
239
+ const { directPath } = yield waUploadToServer((0, messages_media_1.toReadable)(Buffer.concat(contentBlocks)), {
212
240
  mediaType: 'product-catalog-image',
213
241
  fileEncSha256B64: sha,
214
242
  timeoutMs
215
243
  });
216
244
  return { url: (0, messages_media_1.getUrlFromDirectPath)(directPath) };
217
- }));
245
+ })));
218
246
  return results;
219
- };
247
+ });
220
248
  exports.uploadingNecessaryImages = uploadingNecessaryImages;
221
249
  const parseImageUrls = (mediaNode) => {
222
250
  const imgNode = (0, WABinary_1.getBinaryNodeChild)(mediaNode, 'image');
@@ -0,0 +1,275 @@
1
+ import { Boom } from '@hapi/boom'
2
+ import { createHash } from 'crypto'
3
+ import { CatalogCollection, CatalogStatus, OrderDetails, OrderProduct, Product, ProductCreate, ProductUpdate, WAMediaUpload, WAMediaUploadFunction } from '../Types'
4
+ import { BinaryNode, getBinaryNodeChild, getBinaryNodeChildren, getBinaryNodeChildString } from '../WABinary'
5
+ import { getStream, getUrlFromDirectPath, toReadable } from './messages-media'
6
+
7
+ export const parseCatalogNode = (node: BinaryNode) => {
8
+ const catalogNode = getBinaryNodeChild(node, 'product_catalog')
9
+ const products = getBinaryNodeChildren(catalogNode, 'product').map(parseProductNode)
10
+ const paging = getBinaryNodeChild(catalogNode, 'paging')
11
+
12
+ return {
13
+ products,
14
+ nextPageCursor: paging
15
+ ? getBinaryNodeChildString(paging, 'after')
16
+ : undefined
17
+ }
18
+ }
19
+
20
+ export const parseCollectionsNode = (node: BinaryNode) => {
21
+ const collectionsNode = getBinaryNodeChild(node, 'collections')
22
+ const collections = getBinaryNodeChildren(collectionsNode, 'collection').map<CatalogCollection>(
23
+ collectionNode => {
24
+ const id = getBinaryNodeChildString(collectionNode, 'id')!
25
+ const name = getBinaryNodeChildString(collectionNode, 'name')!
26
+
27
+ const products = getBinaryNodeChildren(collectionNode, 'product').map(parseProductNode)
28
+ return {
29
+ id,
30
+ name,
31
+ products,
32
+ status: parseStatusInfo(collectionNode)
33
+ }
34
+ }
35
+ )
36
+
37
+ return {
38
+ collections
39
+ }
40
+ }
41
+
42
+ export const parseOrderDetailsNode = (node: BinaryNode) => {
43
+ const orderNode = getBinaryNodeChild(node, 'order')
44
+ const products = getBinaryNodeChildren(orderNode, 'product').map<OrderProduct>(
45
+ productNode => {
46
+ const imageNode = getBinaryNodeChild(productNode, 'image')!
47
+ return {
48
+ id: getBinaryNodeChildString(productNode, 'id')!,
49
+ name: getBinaryNodeChildString(productNode, 'name')!,
50
+ imageUrl: getBinaryNodeChildString(imageNode, 'url')!,
51
+ price: +getBinaryNodeChildString(productNode, 'price')!,
52
+ currency: getBinaryNodeChildString(productNode, 'currency')!,
53
+ quantity: +getBinaryNodeChildString(productNode, 'quantity')!
54
+ }
55
+ }
56
+ )
57
+
58
+ const priceNode = getBinaryNodeChild(orderNode, 'price')
59
+
60
+ const orderDetails: OrderDetails = {
61
+ price: {
62
+ total: +getBinaryNodeChildString(priceNode, 'total')!,
63
+ currency: getBinaryNodeChildString(priceNode, 'currency')!,
64
+ },
65
+ products
66
+ }
67
+
68
+ return orderDetails
69
+ }
70
+
71
+ export const toProductNode = (productId: string | undefined, product: ProductCreate | ProductUpdate) => {
72
+ const attrs: BinaryNode['attrs'] = { }
73
+ const content: BinaryNode[] = [ ]
74
+
75
+ if(typeof productId !== 'undefined') {
76
+ content.push({
77
+ tag: 'id',
78
+ attrs: { },
79
+ content: Buffer.from(productId)
80
+ })
81
+ }
82
+
83
+ if(typeof product.name !== 'undefined') {
84
+ content.push({
85
+ tag: 'name',
86
+ attrs: { },
87
+ content: Buffer.from(product.name)
88
+ })
89
+ }
90
+
91
+ if(typeof product.description !== 'undefined') {
92
+ content.push({
93
+ tag: 'description',
94
+ attrs: { },
95
+ content: Buffer.from(product.description)
96
+ })
97
+ }
98
+
99
+ if(typeof product.retailerId !== 'undefined') {
100
+ content.push({
101
+ tag: 'retailer_id',
102
+ attrs: { },
103
+ content: Buffer.from(product.retailerId)
104
+ })
105
+ }
106
+
107
+ if(product.images.length) {
108
+ content.push({
109
+ tag: 'media',
110
+ attrs: { },
111
+ content: product.images.map(
112
+ img => {
113
+ if(!('url' in img)) {
114
+ throw new Boom('Expected img for product to already be uploaded', { statusCode: 400 })
115
+ }
116
+
117
+ return {
118
+ tag: 'image',
119
+ attrs: { },
120
+ content: [
121
+ {
122
+ tag: 'url',
123
+ attrs: { },
124
+ content: Buffer.from(img.url.toString())
125
+ }
126
+ ]
127
+ }
128
+ }
129
+ )
130
+ })
131
+ }
132
+
133
+ if(typeof product.price !== 'undefined') {
134
+ content.push({
135
+ tag: 'price',
136
+ attrs: { },
137
+ content: Buffer.from(product.price.toString())
138
+ })
139
+ }
140
+
141
+ if(typeof product.currency !== 'undefined') {
142
+ content.push({
143
+ tag: 'currency',
144
+ attrs: { },
145
+ content: Buffer.from(product.currency)
146
+ })
147
+ }
148
+
149
+ if('originCountryCode' in product) {
150
+ if(typeof product.originCountryCode === 'undefined') {
151
+ attrs['compliance_category'] = 'COUNTRY_ORIGIN_EXEMPT'
152
+ } else {
153
+ content.push({
154
+ tag: 'compliance_info',
155
+ attrs: { },
156
+ content: [
157
+ {
158
+ tag: 'country_code_origin',
159
+ attrs: { },
160
+ content: Buffer.from(product.originCountryCode)
161
+ }
162
+ ]
163
+ })
164
+ }
165
+ }
166
+
167
+
168
+ if(typeof product.isHidden !== 'undefined') {
169
+ attrs['is_hidden'] = product.isHidden.toString()
170
+ }
171
+
172
+ const node: BinaryNode = {
173
+ tag: 'product',
174
+ attrs,
175
+ content
176
+ }
177
+ return node
178
+ }
179
+
180
+ export const parseProductNode = (productNode: BinaryNode) => {
181
+ const isHidden = productNode.attrs.is_hidden === 'true'
182
+ const id = getBinaryNodeChildString(productNode, 'id')!
183
+
184
+ const mediaNode = getBinaryNodeChild(productNode, 'media')!
185
+ const statusInfoNode = getBinaryNodeChild(productNode, 'status_info')!
186
+
187
+ const product: Product = {
188
+ id,
189
+ imageUrls: parseImageUrls(mediaNode),
190
+ reviewStatus: {
191
+ whatsapp: getBinaryNodeChildString(statusInfoNode, 'status')!,
192
+ },
193
+ availability: 'in stock',
194
+ name: getBinaryNodeChildString(productNode, 'name')!,
195
+ retailerId: getBinaryNodeChildString(productNode, 'retailer_id'),
196
+ url: getBinaryNodeChildString(productNode, 'url'),
197
+ description: getBinaryNodeChildString(productNode, 'description')!,
198
+ price: +getBinaryNodeChildString(productNode, 'price')!,
199
+ currency: getBinaryNodeChildString(productNode, 'currency')!,
200
+ isHidden,
201
+ }
202
+
203
+ return product
204
+ }
205
+
206
+ /**
207
+ * Uploads images not already uploaded to WA's servers
208
+ */
209
+ export async function uploadingNecessaryImagesOfProduct<T extends ProductUpdate | ProductCreate>(product: T, waUploadToServer: WAMediaUploadFunction, timeoutMs = 30_000) {
210
+ product = {
211
+ ...product,
212
+ images: product.images ? await uploadingNecessaryImages(product.images, waUploadToServer, timeoutMs) : product.images
213
+ }
214
+ return product
215
+ }
216
+
217
+ /**
218
+ * Uploads images not already uploaded to WA's servers
219
+ */
220
+ export const uploadingNecessaryImages = async(
221
+ images: WAMediaUpload[],
222
+ waUploadToServer: WAMediaUploadFunction,
223
+ timeoutMs = 30_000
224
+ ) => {
225
+ const results = await Promise.all(
226
+ images.map<Promise<{ url: string }>>(
227
+ async img => {
228
+
229
+ if('url' in img) {
230
+ const url = img.url.toString()
231
+ if(url.includes('.whatsapp.net')) {
232
+ return { url }
233
+ }
234
+ }
235
+
236
+ const { stream } = await getStream(img)
237
+ const hasher = createHash('sha256')
238
+ const contentBlocks: Buffer[] = []
239
+ for await (const block of stream) {
240
+ hasher.update(block)
241
+ contentBlocks.push(block)
242
+ }
243
+
244
+ const sha = hasher.digest('base64')
245
+
246
+ const { directPath } = await waUploadToServer(
247
+ toReadable(Buffer.concat(contentBlocks)),
248
+ {
249
+ mediaType: 'product-catalog-image',
250
+ fileEncSha256B64: sha,
251
+ timeoutMs
252
+ }
253
+ )
254
+ return { url: getUrlFromDirectPath(directPath) }
255
+ }
256
+ )
257
+ )
258
+ return results
259
+ }
260
+
261
+ const parseImageUrls = (mediaNode: BinaryNode) => {
262
+ const imgNode = getBinaryNodeChild(mediaNode, 'image')
263
+ return {
264
+ requested: getBinaryNodeChildString(imgNode, 'request_image_url')!,
265
+ original: getBinaryNodeChildString(imgNode, 'original_image_url')!
266
+ }
267
+ }
268
+
269
+ const parseStatusInfo = (mediaNode: BinaryNode): CatalogStatus => {
270
+ const node = getBinaryNodeChild(mediaNode, 'status_info')
271
+ return {
272
+ status: getBinaryNodeChildString(node, 'status')!,
273
+ canAppeal: getBinaryNodeChildString(node, 'can_appeal') === 'true',
274
+ }
275
+ }
@@ -1,4 +1,20 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
12
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
13
+ var m = o[Symbol.asyncIterator], i;
14
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
15
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
16
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
17
+ };
2
18
  Object.defineProperty(exports, "__esModule", { value: true });
3
19
  exports.processSyncAction = exports.chatModificationToAppPatch = exports.decodePatches = exports.decodeSyncdSnapshot = exports.downloadExternalPatch = exports.downloadExternalBlob = exports.extractSyncdPatches = exports.decodeSyncdPatch = exports.decodeSyncdMutations = exports.encodeSyncdPatch = exports.newLTHashState = void 0;
4
20
  const boom_1 = require("@hapi/boom");
@@ -46,7 +62,7 @@ const to64BitNetworkOrder = (e) => {
46
62
  return buff;
47
63
  };
48
64
  const makeLtHashGenerator = ({ indexValueMap, hash }) => {
49
- indexValueMap = { ...indexValueMap };
65
+ indexValueMap = Object.assign({}, indexValueMap);
50
66
  const addBuffs = [];
51
67
  const subBuffs = [];
52
68
  return {
@@ -99,13 +115,13 @@ const generatePatchMac = (snapshotMac, valueMacs, version, type, key) => {
99
115
  };
100
116
  const newLTHashState = () => ({ version: 0, hash: Buffer.alloc(128), indexValueMap: {} });
101
117
  exports.newLTHashState = newLTHashState;
102
- const encodeSyncdPatch = async ({ type, index, syncAction, apiVersion, operation }, myAppStateKeyId, state, getAppStateSyncKey) => {
103
- const key = !!myAppStateKeyId ? await getAppStateSyncKey(myAppStateKeyId) : undefined;
118
+ const encodeSyncdPatch = (_a, myAppStateKeyId_1, state_1, getAppStateSyncKey_1) => __awaiter(void 0, [_a, myAppStateKeyId_1, state_1, getAppStateSyncKey_1], void 0, function* ({ type, index, syncAction, apiVersion, operation }, myAppStateKeyId, state, getAppStateSyncKey) {
119
+ const key = !!myAppStateKeyId ? yield getAppStateSyncKey(myAppStateKeyId) : undefined;
104
120
  if (!key) {
105
121
  throw new boom_1.Boom(`myAppStateKey ("${myAppStateKeyId}") not present`, { statusCode: 404 });
106
122
  }
107
123
  const encKeyId = Buffer.from(myAppStateKeyId, 'base64');
108
- state = { ...state, indexValueMap: { ...state.indexValueMap } };
124
+ state = Object.assign(Object.assign({}, state), { indexValueMap: Object.assign({}, state.indexValueMap) });
109
125
  const indexBuffer = Buffer.from(JSON.stringify(index));
110
126
  const dataProto = WAProto_1.proto.SyncActionData.fromObject({
111
127
  index: indexBuffer,
@@ -146,9 +162,9 @@ const encodeSyncdPatch = async ({ type, index, syncAction, apiVersion, operation
146
162
  const base64Index = indexMac.toString('base64');
147
163
  state.indexValueMap[base64Index] = { valueMac };
148
164
  return { patch, state };
149
- };
165
+ });
150
166
  exports.encodeSyncdPatch = encodeSyncdPatch;
151
- const decodeSyncdMutations = async (msgMutations, initialState, getAppStateSyncKey, onMutation, validateMacs) => {
167
+ const decodeSyncdMutations = (msgMutations, initialState, getAppStateSyncKey, onMutation, validateMacs) => __awaiter(void 0, void 0, void 0, function* () {
152
168
  const ltGenerator = makeLtHashGenerator(initialState);
153
169
  // indexKey used to HMAC sign record.index.blob
154
170
  // valueEncryptionKey used to AES-256-CBC encrypt record.value.blob[0:-32]
@@ -158,7 +174,7 @@ const decodeSyncdMutations = async (msgMutations, initialState, getAppStateSyncK
158
174
  // otherwise, if it's only a record -- it'll be a SET mutation
159
175
  const operation = 'operation' in msgMutation ? msgMutation.operation : WAProto_1.proto.SyncdMutation.SyncdOperation.SET;
160
176
  const record = ('record' in msgMutation && !!msgMutation.record) ? msgMutation.record : msgMutation;
161
- const key = await getKey(record.keyId.id);
177
+ const key = yield getKey(record.keyId.id);
162
178
  const content = Buffer.from(record.value.blob);
163
179
  const encContent = content.slice(0, -32);
164
180
  const ogValueMac = content.slice(-32);
@@ -185,20 +201,22 @@ const decodeSyncdMutations = async (msgMutations, initialState, getAppStateSyncK
185
201
  });
186
202
  }
187
203
  return ltGenerator.finish();
188
- async function getKey(keyId) {
189
- const base64Key = Buffer.from(keyId).toString('base64');
190
- const keyEnc = await getAppStateSyncKey(base64Key);
191
- if (!keyEnc) {
192
- throw new boom_1.Boom(`failed to find key "${base64Key}" to decode mutation`, { statusCode: 404, data: { msgMutations } });
193
- }
194
- return mutationKeys(keyEnc.keyData);
204
+ function getKey(keyId) {
205
+ return __awaiter(this, void 0, void 0, function* () {
206
+ const base64Key = Buffer.from(keyId).toString('base64');
207
+ const keyEnc = yield getAppStateSyncKey(base64Key);
208
+ if (!keyEnc) {
209
+ throw new boom_1.Boom(`failed to find key "${base64Key}" to decode mutation`, { statusCode: 404, data: { msgMutations } });
210
+ }
211
+ return mutationKeys(keyEnc.keyData);
212
+ });
195
213
  }
196
- };
214
+ });
197
215
  exports.decodeSyncdMutations = decodeSyncdMutations;
198
- const decodeSyncdPatch = async (msg, name, initialState, getAppStateSyncKey, onMutation, validateMacs) => {
216
+ const decodeSyncdPatch = (msg, name, initialState, getAppStateSyncKey, onMutation, validateMacs) => __awaiter(void 0, void 0, void 0, function* () {
199
217
  if (validateMacs) {
200
218
  const base64Key = Buffer.from(msg.keyId.id).toString('base64');
201
- const mainKeyObj = await getAppStateSyncKey(base64Key);
219
+ const mainKeyObj = yield getAppStateSyncKey(base64Key);
202
220
  if (!mainKeyObj) {
203
221
  throw new boom_1.Boom(`failed to find key "${base64Key}" to decode patch`, { statusCode: 404, data: { msg } });
204
222
  }
@@ -209,15 +227,15 @@ const decodeSyncdPatch = async (msg, name, initialState, getAppStateSyncKey, onM
209
227
  throw new boom_1.Boom('Invalid patch mac');
210
228
  }
211
229
  }
212
- const result = await (0, exports.decodeSyncdMutations)(msg.mutations, initialState, getAppStateSyncKey, onMutation, validateMacs);
230
+ const result = yield (0, exports.decodeSyncdMutations)(msg.mutations, initialState, getAppStateSyncKey, onMutation, validateMacs);
213
231
  return result;
214
- };
232
+ });
215
233
  exports.decodeSyncdPatch = decodeSyncdPatch;
216
- const extractSyncdPatches = async (result, options) => {
234
+ const extractSyncdPatches = (result, options) => __awaiter(void 0, void 0, void 0, function* () {
217
235
  const syncNode = (0, WABinary_1.getBinaryNodeChild)(result, 'sync');
218
236
  const collectionNodes = (0, WABinary_1.getBinaryNodeChildren)(syncNode, 'collection');
219
237
  const final = {};
220
- await Promise.all(collectionNodes.map(async (collectionNode) => {
238
+ yield Promise.all(collectionNodes.map((collectionNode) => __awaiter(void 0, void 0, void 0, function* () {
221
239
  const patchesNode = (0, WABinary_1.getBinaryNodeChild)(collectionNode, 'patches');
222
240
  const patches = (0, WABinary_1.getBinaryNodeChildren)(patchesNode || collectionNode, 'patch');
223
241
  const snapshotNode = (0, WABinary_1.getBinaryNodeChild)(collectionNode, 'snapshot');
@@ -230,7 +248,7 @@ const extractSyncdPatches = async (result, options) => {
230
248
  snapshotNode.content = Buffer.from(Object.values(snapshotNode.content));
231
249
  }
232
250
  const blobRef = WAProto_1.proto.ExternalBlobReference.decode(snapshotNode.content);
233
- const data = await (0, exports.downloadExternalBlob)(blobRef, options);
251
+ const data = yield (0, exports.downloadExternalBlob)(blobRef, options);
234
252
  snapshot = WAProto_1.proto.SyncdSnapshot.decode(data);
235
253
  }
236
254
  for (let { content } of patches) {
@@ -246,32 +264,45 @@ const extractSyncdPatches = async (result, options) => {
246
264
  }
247
265
  }
248
266
  final[name] = { patches: syncds, hasMorePatches, snapshot };
249
- }));
267
+ })));
250
268
  return final;
251
- };
269
+ });
252
270
  exports.extractSyncdPatches = extractSyncdPatches;
253
- const downloadExternalBlob = async (blob, options) => {
254
- const stream = await (0, messages_media_1.downloadContentFromMessage)(blob, 'md-app-state', { options });
271
+ const downloadExternalBlob = (blob, options) => __awaiter(void 0, void 0, void 0, function* () {
272
+ var _a, e_1, _b, _c;
273
+ const stream = yield (0, messages_media_1.downloadContentFromMessage)(blob, 'md-app-state', { options });
255
274
  const bufferArray = [];
256
- for await (const chunk of stream) {
257
- bufferArray.push(chunk);
275
+ try {
276
+ for (var _d = true, stream_1 = __asyncValues(stream), stream_1_1; stream_1_1 = yield stream_1.next(), _a = stream_1_1.done, !_a; _d = true) {
277
+ _c = stream_1_1.value;
278
+ _d = false;
279
+ const chunk = _c;
280
+ bufferArray.push(chunk);
281
+ }
282
+ }
283
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
284
+ finally {
285
+ try {
286
+ if (!_d && !_a && (_b = stream_1.return)) yield _b.call(stream_1);
287
+ }
288
+ finally { if (e_1) throw e_1.error; }
258
289
  }
259
290
  return Buffer.concat(bufferArray);
260
- };
291
+ });
261
292
  exports.downloadExternalBlob = downloadExternalBlob;
262
- const downloadExternalPatch = async (blob, options) => {
263
- const buffer = await (0, exports.downloadExternalBlob)(blob, options);
293
+ const downloadExternalPatch = (blob, options) => __awaiter(void 0, void 0, void 0, function* () {
294
+ const buffer = yield (0, exports.downloadExternalBlob)(blob, options);
264
295
  const syncData = WAProto_1.proto.SyncdMutations.decode(buffer);
265
296
  return syncData;
266
- };
297
+ });
267
298
  exports.downloadExternalPatch = downloadExternalPatch;
268
- const decodeSyncdSnapshot = async (name, snapshot, getAppStateSyncKey, minimumVersionNumber, validateMacs = true) => {
299
+ const decodeSyncdSnapshot = (name_1, snapshot_1, getAppStateSyncKey_1, minimumVersionNumber_1, ...args_1) => __awaiter(void 0, [name_1, snapshot_1, getAppStateSyncKey_1, minimumVersionNumber_1, ...args_1], void 0, function* (name, snapshot, getAppStateSyncKey, minimumVersionNumber, validateMacs = true) {
269
300
  const newState = (0, exports.newLTHashState)();
270
301
  newState.version = (0, generics_1.toNumber)(snapshot.version.version);
271
302
  const mutationMap = {};
272
303
  const areMutationsRequired = typeof minimumVersionNumber === 'undefined'
273
304
  || newState.version > minimumVersionNumber;
274
- const { hash, indexValueMap } = await (0, exports.decodeSyncdMutations)(snapshot.records, newState, getAppStateSyncKey, areMutationsRequired
305
+ const { hash, indexValueMap } = yield (0, exports.decodeSyncdMutations)(snapshot.records, newState, getAppStateSyncKey, areMutationsRequired
275
306
  ? (mutation) => {
276
307
  var _a;
277
308
  const index = (_a = mutation.syncAction.index) === null || _a === void 0 ? void 0 : _a.toString();
@@ -282,7 +313,7 @@ const decodeSyncdSnapshot = async (name, snapshot, getAppStateSyncKey, minimumVe
282
313
  newState.indexValueMap = indexValueMap;
283
314
  if (validateMacs) {
284
315
  const base64Key = Buffer.from(snapshot.keyId.id).toString('base64');
285
- const keyEnc = await getAppStateSyncKey(base64Key);
316
+ const keyEnc = yield getAppStateSyncKey(base64Key);
286
317
  if (!keyEnc) {
287
318
  throw new boom_1.Boom(`failed to find key "${base64Key}" to decode mutation`);
288
319
  }
@@ -296,28 +327,25 @@ const decodeSyncdSnapshot = async (name, snapshot, getAppStateSyncKey, minimumVe
296
327
  state: newState,
297
328
  mutationMap
298
329
  };
299
- };
330
+ });
300
331
  exports.decodeSyncdSnapshot = decodeSyncdSnapshot;
301
- const decodePatches = async (name, syncds, initial, getAppStateSyncKey, options, minimumVersionNumber, logger, validateMacs = true) => {
332
+ const decodePatches = (name_1, syncds_1, initial_1, getAppStateSyncKey_1, options_1, minimumVersionNumber_1, logger_1, ...args_1) => __awaiter(void 0, [name_1, syncds_1, initial_1, getAppStateSyncKey_1, options_1, minimumVersionNumber_1, logger_1, ...args_1], void 0, function* (name, syncds, initial, getAppStateSyncKey, options, minimumVersionNumber, logger, validateMacs = true) {
302
333
  var _a;
303
- const newState = {
304
- ...initial,
305
- indexValueMap: { ...initial.indexValueMap }
306
- };
334
+ const newState = Object.assign(Object.assign({}, initial), { indexValueMap: Object.assign({}, initial.indexValueMap) });
307
335
  const mutationMap = {};
308
336
  for (let i = 0; i < syncds.length; i++) {
309
337
  const syncd = syncds[i];
310
338
  const { version, keyId, snapshotMac } = syncd;
311
339
  if (syncd.externalMutations) {
312
340
  logger === null || logger === void 0 ? void 0 : logger.trace({ name, version }, 'downloading external patch');
313
- const ref = await (0, exports.downloadExternalPatch)(syncd.externalMutations, options);
341
+ const ref = yield (0, exports.downloadExternalPatch)(syncd.externalMutations, options);
314
342
  logger === null || logger === void 0 ? void 0 : logger.debug({ name, version, mutations: ref.mutations.length }, 'downloaded external patch');
315
343
  (_a = syncd.mutations) === null || _a === void 0 ? void 0 : _a.push(...ref.mutations);
316
344
  }
317
345
  const patchVersion = (0, generics_1.toNumber)(version.version);
318
346
  newState.version = patchVersion;
319
347
  const shouldMutate = typeof minimumVersionNumber === 'undefined' || patchVersion > minimumVersionNumber;
320
- const decodeResult = await (0, exports.decodeSyncdPatch)(syncd, name, newState, getAppStateSyncKey, shouldMutate
348
+ const decodeResult = yield (0, exports.decodeSyncdPatch)(syncd, name, newState, getAppStateSyncKey, shouldMutate
321
349
  ? mutation => {
322
350
  var _a;
323
351
  const index = (_a = mutation.syncAction.index) === null || _a === void 0 ? void 0 : _a.toString();
@@ -328,7 +356,7 @@ const decodePatches = async (name, syncds, initial, getAppStateSyncKey, options,
328
356
  newState.indexValueMap = decodeResult.indexValueMap;
329
357
  if (validateMacs) {
330
358
  const base64Key = Buffer.from(keyId.id).toString('base64');
331
- const keyEnc = await getAppStateSyncKey(base64Key);
359
+ const keyEnc = yield getAppStateSyncKey(base64Key);
332
360
  if (!keyEnc) {
333
361
  throw new boom_1.Boom(`failed to find key "${base64Key}" to decode mutation`);
334
362
  }
@@ -342,7 +370,7 @@ const decodePatches = async (name, syncds, initial, getAppStateSyncKey, options,
342
370
  syncd.mutations = [];
343
371
  }
344
372
  return { state: newState, mutationMap };
345
- };
373
+ });
346
374
  exports.decodePatches = decodePatches;
347
375
  const chatModificationToAppPatch = (mod, jid) => {
348
376
  const OP = WAProto_1.proto.SyncdMutation.SyncdOperation;
@@ -638,7 +666,7 @@ const processSyncAction = (syncAction, ev, me, initialSyncOpts, logger) => {
638
666
  else if (action === null || action === void 0 ? void 0 : action.pushNameSetting) {
639
667
  const name = (_b = action === null || action === void 0 ? void 0 : action.pushNameSetting) === null || _b === void 0 ? void 0 : _b.name;
640
668
  if (name && (me === null || me === void 0 ? void 0 : me.name) !== name) {
641
- ev.emit('creds.update', { me: { ...me, name } });
669
+ ev.emit('creds.update', { me: Object.assign(Object.assign({}, me), { name }) });
642
670
  }
643
671
  }
644
672
  else if (action === null || action === void 0 ? void 0 : action.pinAction) {