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.
- package/LICENSE +1 -1
- package/README.md +1429 -684
- package/package.json +11 -26
- package/src/Defaults/baileys-version.json +3 -0
- package/{lib → src}/Defaults/index.js +16 -8
- package/src/Defaults/index.ts +131 -0
- package/src/Defaults/phonenumber-mcc.json +223 -0
- package/src/Signal/libsignal.js +180 -0
- package/src/Signal/libsignal.ts +141 -0
- package/src/Socket/Client/abstract-socket-client.ts +19 -0
- package/src/Socket/Client/index.ts +3 -0
- package/src/Socket/Client/mobile-socket-client.js +78 -0
- package/src/Socket/Client/mobile-socket-client.ts +66 -0
- package/src/Socket/Client/web-socket-client.js +75 -0
- package/src/Socket/Client/web-socket-client.ts +57 -0
- package/{lib → src}/Socket/business.js +33 -27
- package/src/Socket/business.ts +281 -0
- package/{lib → src}/Socket/chats.js +197 -178
- package/src/Socket/chats.ts +1030 -0
- package/{lib → src}/Socket/groups.js +69 -79
- package/src/Socket/groups.ts +356 -0
- package/{lib → src}/Socket/index.js +1 -4
- package/src/Socket/index.ts +13 -0
- package/{lib → src}/Socket/messages-recv.js +160 -108
- package/src/Socket/messages-recv.ts +985 -0
- package/{lib → src}/Socket/messages-send.js +183 -100
- package/src/Socket/messages-send.ts +871 -0
- package/src/Socket/newsletter.js +227 -0
- package/src/Socket/newsletter.ts +282 -0
- package/{lib → src}/Socket/registration.js +55 -63
- package/src/Socket/registration.ts +250 -0
- package/{lib → src}/Socket/socket.js +107 -66
- package/src/Socket/socket.ts +777 -0
- package/src/Store/index.ts +3 -0
- package/{lib → src}/Store/make-cache-manager-store.js +34 -25
- package/src/Store/make-cache-manager-store.ts +100 -0
- package/{lib → src}/Store/make-in-memory-store.js +51 -61
- package/src/Store/make-in-memory-store.ts +475 -0
- package/src/Store/make-ordered-dictionary.ts +86 -0
- package/{lib → src}/Store/object-repository.js +1 -1
- package/src/Store/object-repository.ts +32 -0
- package/src/Tests/test.app-state-sync.js +204 -0
- package/src/Tests/test.app-state-sync.ts +207 -0
- package/src/Tests/test.event-buffer.js +270 -0
- package/src/Tests/test.event-buffer.ts +319 -0
- package/src/Tests/test.key-store.js +76 -0
- package/src/Tests/test.key-store.ts +92 -0
- package/src/Tests/test.libsignal.js +141 -0
- package/src/Tests/test.libsignal.ts +186 -0
- package/src/Tests/test.media-download.js +93 -0
- package/src/Tests/test.media-download.ts +76 -0
- package/src/Tests/test.messages.js +33 -0
- package/src/Tests/test.messages.ts +37 -0
- package/src/Tests/utils.js +34 -0
- package/src/Tests/utils.ts +36 -0
- package/src/Types/Auth.ts +113 -0
- package/src/Types/Call.ts +15 -0
- package/src/Types/Chat.ts +106 -0
- package/{lib/Types/Contact.d.ts → src/Types/Contact.ts} +9 -8
- package/src/Types/Events.ts +93 -0
- package/src/Types/GroupMetadata.ts +53 -0
- package/{lib → src}/Types/Label.js +1 -1
- package/src/Types/Label.ts +36 -0
- package/{lib → src}/Types/LabelAssociation.js +1 -1
- package/{lib/Types/LabelAssociation.d.ts → src/Types/LabelAssociation.ts} +22 -16
- package/src/Types/Message.ts +288 -0
- package/src/Types/Newsletter.js +32 -0
- package/src/Types/Newsletter.ts +98 -0
- package/src/Types/Product.ts +85 -0
- package/src/Types/Signal.ts +68 -0
- package/{lib/Types/Socket.d.ts → src/Types/Socket.ts} +68 -56
- package/src/Types/State.ts +29 -0
- package/{lib → src}/Types/index.js +2 -1
- package/src/Types/index.ts +59 -0
- package/{lib → src}/Utils/auth-utils.js +95 -76
- package/src/Utils/auth-utils.ts +222 -0
- package/src/Utils/baileys-event-stream.js +92 -0
- package/src/Utils/baileys-event-stream.ts +66 -0
- package/{lib → src}/Utils/business.js +45 -17
- package/src/Utils/business.ts +275 -0
- package/{lib → src}/Utils/chat-utils.js +74 -46
- package/src/Utils/chat-utils.ts +860 -0
- package/{lib → src}/Utils/crypto.js +31 -21
- package/src/Utils/crypto.ts +131 -0
- package/src/Utils/decode-wa-message.js +211 -0
- package/src/Utils/decode-wa-message.ts +228 -0
- package/{lib → src}/Utils/event-buffer.js +13 -4
- package/src/Utils/event-buffer.ts +613 -0
- package/{lib → src}/Utils/generics.js +98 -45
- package/src/Utils/generics.ts +434 -0
- package/{lib → src}/Utils/history.js +39 -10
- package/src/Utils/history.ts +112 -0
- package/src/Utils/index.ts +17 -0
- package/{lib → src}/Utils/link-preview.js +54 -17
- package/src/Utils/link-preview.ts +122 -0
- package/src/Utils/logger.ts +3 -0
- package/src/Utils/lt-hash.ts +61 -0
- package/{lib → src}/Utils/make-mutex.js +13 -4
- package/src/Utils/make-mutex.ts +44 -0
- package/{lib → src}/Utils/messages-media.js +296 -192
- package/src/Utils/messages-media.ts +847 -0
- package/{lib → src}/Utils/messages.js +124 -113
- package/src/Utils/messages.ts +956 -0
- package/{lib → src}/Utils/noise-handler.js +16 -3
- package/src/Utils/noise-handler.ts +197 -0
- package/{lib → src}/Utils/process-message.js +33 -29
- package/src/Utils/process-message.ts +414 -0
- package/{lib → src}/Utils/signal.js +23 -14
- package/src/Utils/signal.ts +177 -0
- package/{lib → src}/Utils/use-multi-file-auth-state.js +28 -19
- package/src/Utils/use-multi-file-auth-state.ts +90 -0
- package/{lib → src}/Utils/validate-connection.js +25 -42
- package/src/Utils/validate-connection.ts +238 -0
- package/src/WABinary/constants.ts +42 -0
- package/{lib → src}/WABinary/decode.js +17 -7
- package/src/WABinary/decode.ts +265 -0
- package/{lib → src}/WABinary/encode.js +17 -7
- package/src/WABinary/encode.ts +236 -0
- package/{lib → src}/WABinary/generic-utils.js +2 -2
- package/src/WABinary/generic-utils.ts +121 -0
- package/src/WABinary/index.ts +5 -0
- package/{lib → src}/WABinary/jid-utils.js +4 -1
- package/src/WABinary/jid-utils.ts +68 -0
- package/src/WABinary/types.ts +17 -0
- package/src/WAM/BinaryInfo.js +13 -0
- package/src/WAM/BinaryInfo.ts +12 -0
- package/src/WAM/constants.js +15350 -0
- package/src/WAM/constants.ts +15382 -0
- package/src/WAM/encode.js +155 -0
- package/src/WAM/encode.ts +174 -0
- package/src/WAM/index.js +19 -0
- package/src/WAM/index.ts +3 -0
- package/src/gifted +1 -0
- package/{lib → src}/index.js +1 -0
- package/src/index.ts +13 -0
- package/lib/Defaults/baileys-version.json +0 -3
- package/lib/Defaults/index.d.ts +0 -284
- package/lib/Defaults/phonenumber-mcc.json +0 -223
- package/lib/Signal/libsignal.d.ts +0 -3
- package/lib/Signal/libsignal.js +0 -152
- package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
- package/lib/Socket/Client/index.d.ts +0 -3
- package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
- package/lib/Socket/Client/mobile-socket-client.js +0 -65
- package/lib/Socket/Client/web-socket-client.d.ts +0 -12
- package/lib/Socket/Client/web-socket-client.js +0 -62
- package/lib/Socket/business.d.ts +0 -135
- package/lib/Socket/chats.d.ts +0 -79
- package/lib/Socket/groups.d.ts +0 -113
- package/lib/Socket/index.d.ts +0 -137
- package/lib/Socket/messages-recv.d.ts +0 -124
- package/lib/Socket/messages-send.d.ts +0 -119
- package/lib/Socket/registration.d.ts +0 -232
- package/lib/Socket/socket.d.ts +0 -42
- package/lib/Store/index.d.ts +0 -3
- package/lib/Store/make-cache-manager-store.d.ts +0 -13
- package/lib/Store/make-in-memory-store.d.ts +0 -117
- package/lib/Store/make-ordered-dictionary.d.ts +0 -13
- package/lib/Store/object-repository.d.ts +0 -10
- package/lib/Types/Auth.d.ts +0 -108
- package/lib/Types/Call.d.ts +0 -13
- package/lib/Types/Chat.d.ts +0 -102
- package/lib/Types/Events.d.ts +0 -157
- package/lib/Types/GroupMetadata.d.ts +0 -52
- package/lib/Types/Label.d.ts +0 -35
- package/lib/Types/Message.d.ts +0 -261
- package/lib/Types/Product.d.ts +0 -78
- package/lib/Types/Signal.d.ts +0 -57
- package/lib/Types/State.d.ts +0 -27
- package/lib/Types/index.d.ts +0 -56
- package/lib/Utils/auth-utils.d.ts +0 -18
- package/lib/Utils/baileys-event-stream.d.ts +0 -16
- package/lib/Utils/baileys-event-stream.js +0 -63
- package/lib/Utils/business.d.ts +0 -22
- package/lib/Utils/chat-utils.d.ts +0 -71
- package/lib/Utils/crypto.d.ts +0 -41
- package/lib/Utils/decode-wa-message.d.ts +0 -19
- package/lib/Utils/decode-wa-message.js +0 -174
- package/lib/Utils/event-buffer.d.ts +0 -35
- package/lib/Utils/generics.d.ts +0 -94
- package/lib/Utils/history.d.ts +0 -15
- package/lib/Utils/index.d.ts +0 -17
- package/lib/Utils/link-preview.d.ts +0 -21
- package/lib/Utils/logger.d.ts +0 -4
- package/lib/Utils/lt-hash.d.ts +0 -12
- package/lib/Utils/make-mutex.d.ts +0 -7
- package/lib/Utils/messages-media.d.ts +0 -107
- package/lib/Utils/messages.d.ts +0 -76
- package/lib/Utils/noise-handler.d.ts +0 -20
- package/lib/Utils/process-message.d.ts +0 -41
- package/lib/Utils/signal.d.ts +0 -32
- package/lib/Utils/use-multi-file-auth-state.d.ts +0 -12
- package/lib/Utils/validate-connection.d.ts +0 -11
- package/lib/WABinary/constants.d.ts +0 -27
- package/lib/WABinary/decode.d.ts +0 -7
- package/lib/WABinary/encode.d.ts +0 -3
- package/lib/WABinary/generic-utils.d.ts +0 -15
- package/lib/WABinary/index.d.ts +0 -5
- package/lib/WABinary/jid-utils.d.ts +0 -29
- package/lib/WABinary/types.d.ts +0 -18
- package/lib/index.d.ts +0 -10
- /package/{lib → src}/Socket/Client/abstract-socket-client.js +0 -0
- /package/{lib → src}/Socket/Client/index.js +0 -0
- /package/{lib → src}/Store/index.js +0 -0
- /package/{lib → src}/Store/make-ordered-dictionary.js +0 -0
- /package/{lib → src}/Types/Auth.js +0 -0
- /package/{lib → src}/Types/Call.js +0 -0
- /package/{lib → src}/Types/Chat.js +0 -0
- /package/{lib → src}/Types/Contact.js +0 -0
- /package/{lib → src}/Types/Events.js +0 -0
- /package/{lib → src}/Types/GroupMetadata.js +0 -0
- /package/{lib → src}/Types/Message.js +0 -0
- /package/{lib → src}/Types/Product.js +0 -0
- /package/{lib → src}/Types/Signal.js +0 -0
- /package/{lib → src}/Types/Socket.js +0 -0
- /package/{lib → src}/Types/State.js +0 -0
- /package/{lib → src}/Utils/index.js +0 -0
- /package/{lib → src}/Utils/logger.js +0 -0
- /package/{lib → src}/Utils/lt-hash.js +0 -0
- /package/{lib → src}/WABinary/constants.js +0 -0
- /package/{lib → src}/WABinary/index.js +0 -0
- /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.
|
|
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
|
-
|
|
185
|
-
product = {
|
|
186
|
-
|
|
187
|
-
|
|
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 =
|
|
196
|
-
const results =
|
|
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 } =
|
|
219
|
+
const { stream } = yield (0, messages_media_1.getStream)(img);
|
|
204
220
|
const hasher = (0, crypto_1.createHash)('sha256');
|
|
205
221
|
const contentBlocks = [];
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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 } =
|
|
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 = {
|
|
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 =
|
|
103
|
-
const key = !!myAppStateKeyId ?
|
|
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 = {
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
254
|
-
|
|
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
|
-
|
|
257
|
-
|
|
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 =
|
|
263
|
-
const buffer =
|
|
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 =
|
|
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 } =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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: {
|
|
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) {
|