@blckrose/baileys 1.0.0 → 1.0.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.
@@ -365,13 +365,50 @@ export const generateWAMessageContent = async (message, options) => {
365
365
  else if (hasNonNullishProperty(message, 'pin')) {
366
366
  m.pinInChatMessage = {};
367
367
  m.messageContextInfo = {};
368
- m.pinInChatMessage.key = message.pin;
369
- m.pinInChatMessage.type = message.type;
370
- m.pinInChatMessage.senderTimestampMs = Date.now();
371
- m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
368
+ m.pinInChatMessage.key = message.pin.key;
369
+ m.pinInChatMessage.type = message.pin?.type || 1;
370
+ m.pinInChatMessage.senderTimestampMs = message.pin?.time || Date.now();
371
+ m.messageContextInfo.messageAddOnDurationInSecs = message.pin.type === 1 ? message.pin.time || 86400 : 0;
372
+ m.messageContextInfo.messageAddOnExpiryType = proto.MessageContextInfo.MessageAddonExpiryType.STATIC;
373
+ }
374
+ else if (hasNonNullishProperty(message, 'keep')) {
375
+ m.keepInChatMessage = {};
376
+ m.keepInChatMessage.key = message.keep.key;
377
+ m.keepInChatMessage.keepType = message.keep?.type || 1;
378
+ m.keepInChatMessage.timestampMs = message.keep?.time || Date.now();
379
+ }
380
+ else if (hasNonNullishProperty(message, 'call')) {
381
+ m.scheduledCallCreationMessage = {};
382
+ m.scheduledCallCreationMessage.scheduledTimestampMs = message.call?.time || Date.now();
383
+ m.scheduledCallCreationMessage.callType = message.call?.type || 1;
384
+ m.scheduledCallCreationMessage.title = message.call?.name || 'Call Creation';
385
+ m.scheduledCallCreationMessage.contextInfo = {
386
+ ...(message.contextInfo || {}),
387
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
388
+ };
389
+ }
390
+ else if (hasNonNullishProperty(message, 'paymentInvite')) {
391
+ m.messageContextInfo = {};
392
+ m.paymentInviteMessage = {};
393
+ m.paymentInviteMessage.expiryTimestamp = message.paymentInvite?.expiry || 0;
394
+ m.paymentInviteMessage.serviceType = message.paymentInvite?.type || 2;
395
+ m.paymentInviteMessage.contextInfo = {
396
+ ...(message.contextInfo || {}),
397
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
398
+ };
372
399
  }
373
400
  else if (hasNonNullishProperty(message, 'buttonReply')) {
374
401
  switch (message.type) {
402
+ case 'list':
403
+ m.listResponseMessage = {
404
+ title: message.buttonReply.title,
405
+ description: message.buttonReply.description,
406
+ singleSelectReply: {
407
+ selectedRowId: message.buttonReply.rowId
408
+ },
409
+ listType: proto.Message.ListResponseMessage.ListType.SINGLE_SELECT
410
+ };
411
+ break;
375
412
  case 'template':
376
413
  m.templateButtonReplyMessage = {
377
414
  selectedDisplayText: message.buttonReply.displayText,
@@ -386,7 +423,81 @@ export const generateWAMessageContent = async (message, options) => {
386
423
  type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
387
424
  };
388
425
  break;
426
+ case 'interactive':
427
+ m.interactiveResponseMessage = {
428
+ body: {
429
+ text: message.buttonReply.displayText,
430
+ format: proto.Message.InteractiveResponseMessage.Body.Format.EXTENSIONS_1
431
+ },
432
+ nativeFlowResponseMessage: {
433
+ name: message.buttonReply.nativeFlows.name,
434
+ paramsJson: message.buttonReply.nativeFlows.paramsJson,
435
+ version: message.buttonReply.nativeFlows.version
436
+ }
437
+ };
438
+ break;
439
+ }
440
+ }
441
+ else if (hasNonNullishProperty(message, 'album')) {
442
+ const imageMessages = message.album.filter(item => 'image' in item);
443
+ const videoMessages = message.album.filter(item => 'video' in item);
444
+ m.albumMessage = WAProto.Message.AlbumMessage.fromObject({
445
+ expectedImageCount: imageMessages.length,
446
+ expectedVideoCount: videoMessages.length
447
+ });
448
+ }
449
+ else if (hasNonNullishProperty(message, 'order')) {
450
+ m.orderMessage = WAProto.Message.OrderMessage.fromObject(message.order);
451
+ m.orderMessage.contextInfo = {
452
+ ...(message.contextInfo || {}),
453
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
454
+ };
455
+ }
456
+ else if (hasNonNullishProperty(message, 'payment')) {
457
+ const requestPaymentMessage = {
458
+ amount: {
459
+ currencyCode: message.payment?.currency || 'IDR',
460
+ offset: message.payment?.offset || 0,
461
+ value: message.payment?.amount || 999999999
462
+ },
463
+ expiryTimestamp: message.payment?.expiry || 0,
464
+ amount1000: (message.payment?.amount || 999999999) * 1000,
465
+ currencyCodeIso4217: message.payment?.currency || 'IDR',
466
+ requestFrom: message.payment?.from || '0@s.whatsapp.net',
467
+ noteMessage: {
468
+ extendedTextMessage: {
469
+ text: message.payment?.note || 'Notes'
470
+ }
471
+ },
472
+ background: {
473
+ placeholderArgb: message.payment?.image?.placeholderArgb || 4278190080,
474
+ textArgb: message.payment?.image?.textArgb || 4294967295,
475
+ subtextArgb: message.payment?.image?.subtextArgb || 4294967295,
476
+ type: 1
477
+ }
478
+ };
479
+ requestPaymentMessage.noteMessage.extendedTextMessage.contextInfo = {
480
+ ...(message.contextInfo || {}),
481
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
482
+ };
483
+ m.requestPaymentMessage = requestPaymentMessage;
484
+ }
485
+ else if (hasNonNullishProperty(message, 'pollResult')) {
486
+ if (!Array.isArray(message.pollResult.values)) {
487
+ throw new Boom('Invalid pollResult values', { statusCode: 400 });
389
488
  }
489
+ const pollResultSnapshotMessage = {
490
+ name: message.pollResult.name,
491
+ pollVotes: message.pollResult.values.map(([optionName, optionVoteCount]) => ({
492
+ optionName,
493
+ optionVoteCount
494
+ }))
495
+ };
496
+ pollResultSnapshotMessage.contextInfo = {
497
+ ...(message.contextInfo || {}),
498
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
499
+ };
500
+ m.pollResultSnapshotMessage = pollResultSnapshotMessage;
390
501
  }
391
502
  else if (hasOptionalProperty(message, 'ptv') && message.ptv) {
392
503
  const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
@@ -482,8 +593,267 @@ export const generateWAMessageContent = async (message, options) => {
482
593
  else {
483
594
  m = await prepareWAMessageMedia(message, options);
484
595
  }
596
+ if ('sections' in message && !!message.sections) {
597
+ const listMessage = {
598
+ title: message.title,
599
+ buttonText: message.buttonText,
600
+ footerText: message.footer,
601
+ description: message.text,
602
+ sections: message.sections,
603
+ listType: proto.Message.ListMessage.ListType.SINGLE_SELECT
604
+ };
605
+ listMessage.contextInfo = {
606
+ ...(message.contextInfo || {}),
607
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
608
+ };
609
+ m = { listMessage };
610
+ }
611
+ else if ('productList' in message && !!message.productList) {
612
+ const thumbnail = message.thumbnail ? await generateThumbnail(message.thumbnail, 'image') : null;
613
+ const listMessage = {
614
+ title: message.title,
615
+ buttonText: message.buttonText,
616
+ footerText: message.footer,
617
+ description: message.text,
618
+ productListInfo: {
619
+ productSections: message.productList,
620
+ headerImage: {
621
+ productId: message.productList[0].products[0].productId,
622
+ jpegThumbnail: thumbnail?.thumbnail || null
623
+ },
624
+ businessOwnerJid: message.businessOwnerJid
625
+ },
626
+ listType: proto.Message.ListMessage.ListType.PRODUCT_LIST
627
+ };
628
+ listMessage.contextInfo = {
629
+ ...(message.contextInfo || {}),
630
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
631
+ };
632
+ m = { listMessage };
633
+ }
634
+ else if ('buttons' in message && !!message.buttons) {
635
+ const buttonsMessage = {
636
+ buttons: message.buttons.map(b => ({ ...b, type: proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
637
+ };
638
+ if ('text' in message) {
639
+ buttonsMessage.contentText = message.text;
640
+ buttonsMessage.headerType = proto.Message.ButtonsMessage.HeaderType.EMPTY;
641
+ }
642
+ else {
643
+ if ('caption' in message) {
644
+ buttonsMessage.contentText = message.caption;
645
+ }
646
+ const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
647
+ buttonsMessage.headerType = proto.Message.ButtonsMessage.HeaderType[type];
648
+ Object.assign(buttonsMessage, m);
649
+ }
650
+ if ('footer' in message && !!message.footer) {
651
+ buttonsMessage.footerText = message.footer;
652
+ }
653
+ if ('title' in message && !!message.title) {
654
+ buttonsMessage.text = message.title;
655
+ buttonsMessage.headerType = proto.Message.ButtonsMessage.HeaderType.TEXT;
656
+ }
657
+ buttonsMessage.contextInfo = {
658
+ ...(message.contextInfo || {}),
659
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
660
+ };
661
+ m = { buttonsMessage };
662
+ }
663
+ else if ('templateButtons' in message && !!message.templateButtons) {
664
+ const hydratedTemplate = {
665
+ hydratedButtons: message.templateButtons
666
+ };
667
+ if ('text' in message) {
668
+ hydratedTemplate.hydratedContentText = message.text;
669
+ }
670
+ else {
671
+ if ('caption' in message) {
672
+ hydratedTemplate.hydratedContentText = message.caption;
673
+ }
674
+ Object.assign(hydratedTemplate, m);
675
+ }
676
+ if ('footer' in message && !!message.footer) {
677
+ hydratedTemplate.hydratedFooterText = message.footer;
678
+ }
679
+ hydratedTemplate.contextInfo = {
680
+ ...(message.contextInfo || {}),
681
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
682
+ };
683
+ m = { templateMessage: { fourRowTemplate: hydratedTemplate, hydratedTemplate } };
684
+ }
685
+ else if ('interactiveButtons' in message && !!message.interactiveButtons) {
686
+ const interactiveMessage = {
687
+ nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
688
+ buttons: message.interactiveButtons,
689
+ })
690
+ };
691
+ if ('text' in message) {
692
+ interactiveMessage.body = { text: message.text };
693
+ }
694
+ else if ('caption' in message) {
695
+ interactiveMessage.body = { text: message.caption };
696
+ interactiveMessage.header = {
697
+ title: message.title,
698
+ subtitle: message.subtitle,
699
+ hasMediaAttachment: message?.media ?? false,
700
+ };
701
+ Object.assign(interactiveMessage.header, m);
702
+ }
703
+ if ('footer' in message && !!message.footer) {
704
+ interactiveMessage.footer = { text: message.footer };
705
+ }
706
+ if ('title' in message && !!message.title) {
707
+ interactiveMessage.header = {
708
+ title: message.title,
709
+ subtitle: message.subtitle,
710
+ hasMediaAttachment: message?.media ?? false,
711
+ };
712
+ Object.assign(interactiveMessage.header, m);
713
+ }
714
+ if ('contextInfo' in message && !!message.contextInfo) {
715
+ interactiveMessage.contextInfo = message.contextInfo;
716
+ }
717
+ if ('mentions' in message && !!message.mentions) {
718
+ interactiveMessage.contextInfo = { mentionedJid: message.mentions };
719
+ }
720
+ m = { interactiveMessage };
721
+ }
722
+ else if ('shop' in message && !!message.shop) {
723
+ const interactiveMessage = {
724
+ shopStorefrontMessage: proto.Message.InteractiveMessage.ShopMessage.fromObject({
725
+ surface: message.shop,
726
+ id: message.id
727
+ })
728
+ };
729
+ if ('text' in message) {
730
+ interactiveMessage.body = { text: message.text };
731
+ }
732
+ else if ('caption' in message) {
733
+ interactiveMessage.body = { text: message.caption };
734
+ interactiveMessage.header = {
735
+ title: message.title,
736
+ subtitle: message.subtitle,
737
+ hasMediaAttachment: message?.media ?? false,
738
+ };
739
+ Object.assign(interactiveMessage.header, m);
740
+ }
741
+ if ('footer' in message && !!message.footer) {
742
+ interactiveMessage.footer = { text: message.footer };
743
+ }
744
+ if ('title' in message && !!message.title) {
745
+ interactiveMessage.header = {
746
+ title: message.title,
747
+ subtitle: message.subtitle,
748
+ hasMediaAttachment: message?.media ?? false,
749
+ };
750
+ Object.assign(interactiveMessage.header, m);
751
+ }
752
+ if ('contextInfo' in message && !!message.contextInfo) {
753
+ interactiveMessage.contextInfo = message.contextInfo;
754
+ }
755
+ if ('mentions' in message && !!message.mentions) {
756
+ interactiveMessage.contextInfo = { mentionedJid: message.mentions };
757
+ }
758
+ m = { interactiveMessage };
759
+ }
760
+ else if ('collection' in message && !!message.collection) {
761
+ const interactiveMessage = {
762
+ collectionMessage: {
763
+ bizJid: message.collection.bizJid,
764
+ id: message.collection.id,
765
+ messageVersion: message?.collection?.version
766
+ }
767
+ };
768
+ if ('text' in message) {
769
+ interactiveMessage.body = { text: message.text };
770
+ interactiveMessage.header = {
771
+ title: message.title,
772
+ subtitle: message.subtitle,
773
+ hasMediaAttachment: false
774
+ };
775
+ }
776
+ else {
777
+ if ('caption' in message) {
778
+ interactiveMessage.body = { text: message.caption };
779
+ interactiveMessage.header = {
780
+ title: message.title,
781
+ subtitle: message.subtitle,
782
+ hasMediaAttachment: message.hasMediaAttachment ? message.hasMediaAttachment : false,
783
+ ...Object.assign(interactiveMessage, m)
784
+ };
785
+ }
786
+ }
787
+ if ('footer' in message && !!message.footer) {
788
+ interactiveMessage.footer = { text: message.footer };
789
+ }
790
+ interactiveMessage.contextInfo = {
791
+ ...(message.contextInfo || {}),
792
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
793
+ };
794
+ m = { interactiveMessage };
795
+ }
796
+ else if ('cards' in message && !!message.cards) {
797
+ const slides = await Promise.all(message.cards.map(async (slide) => {
798
+ const { image, video, product, title, body, footer, buttons } = slide;
799
+ let header;
800
+ if (product) {
801
+ const { imageMessage } = await prepareWAMessageMedia({ image: product.productImage, ...options }, options);
802
+ header = {
803
+ productMessage: {
804
+ product: {
805
+ ...product,
806
+ productImage: imageMessage,
807
+ },
808
+ ...slide
809
+ }
810
+ };
811
+ }
812
+ else if (image) {
813
+ header = await prepareWAMessageMedia({ image: image, ...options }, options);
814
+ }
815
+ else if (video) {
816
+ header = await prepareWAMessageMedia({ video: video, ...options }, options);
817
+ }
818
+ return {
819
+ header: {
820
+ title,
821
+ hasMediaAttachment: true,
822
+ ...header
823
+ },
824
+ body: { text: body },
825
+ footer: { text: footer },
826
+ nativeFlowMessage: { buttons }
827
+ };
828
+ }));
829
+ const interactiveMessage = {
830
+ carouselMessage: { cards: slides }
831
+ };
832
+ if ('text' in message) {
833
+ interactiveMessage.body = { text: message.text };
834
+ interactiveMessage.header = {
835
+ title: message.title,
836
+ subtitle: message.subtitle,
837
+ hasMediaAttachment: false
838
+ };
839
+ }
840
+ if ('footer' in message && !!message.footer) {
841
+ interactiveMessage.footer = { text: message.footer };
842
+ }
843
+ interactiveMessage.contextInfo = {
844
+ ...(message.contextInfo || {}),
845
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
846
+ };
847
+ m = { interactiveMessage };
848
+ }
849
+ if (hasOptionalProperty(message, 'ephemeral') && !!message.ephemeral) {
850
+ m = { ephemeralMessage: { message: m } };
851
+ }
485
852
  if (hasOptionalProperty(message, 'viewOnce') && !!message.viewOnce) {
486
- m = { viewOnceMessage: { message: m } };
853
+ m = { viewOnceMessageV2: { message: m } };
854
+ }
855
+ if (hasOptionalProperty(message, 'viewOnceExt') && !!message.viewOnceExt) {
856
+ m = { viewOnceMessageV2Extension: { message: m } };
487
857
  }
488
858
  if (hasOptionalProperty(message, 'mentions') && message.mentions?.length) {
489
859
  const messageType = Object.keys(m)[0];
@@ -867,4 +1237,72 @@ export const assertMediaContent = (content) => {
867
1237
  }
868
1238
  return mediaContent;
869
1239
  };
1240
+
1241
+ export const patchMessageForMdIfRequired = (message) => {
1242
+ if (message?.buttonsMessage ||
1243
+ message?.templateMessage ||
1244
+ message?.listMessage ||
1245
+ message?.interactiveMessage?.nativeFlowMessage
1246
+ ) {
1247
+ message = {
1248
+ viewOnceMessageV2Extension: {
1249
+ message: {
1250
+ messageContextInfo: {
1251
+ deviceListMetadataVersion: 2,
1252
+ deviceListMetadata: {}
1253
+ },
1254
+ ...message
1255
+ }
1256
+ }
1257
+ };
1258
+ }
1259
+ return message;
1260
+ };
1261
+ export const prepareAlbumMessageContent = async (jid, albums, options) => {
1262
+ let mediaHandle;
1263
+ let mediaMsg;
1264
+ const message = [];
1265
+ const albumMsg = generateWAMessageFromContent(jid, {
1266
+ albumMessage: {
1267
+ expectedImageCount: albums.filter(item => 'image' in item).length,
1268
+ expectedVideoCount: albums.filter(item => 'video' in item).length
1269
+ }
1270
+ }, options);
1271
+ await options.sock.relayMessage(jid, albumMsg.message, { messageId: albumMsg.key.id });
1272
+ for (const i in albums) {
1273
+ const media = albums[i];
1274
+ if ('image' in media) {
1275
+ mediaMsg = await generateWAMessage(jid, { image: media.image, ...media, ...options }, {
1276
+ userJid: options.userJid,
1277
+ upload: async (encFilePath, opts) => {
1278
+ const up = await options.sock.waUploadToServer(encFilePath, { ...opts, newsletter: isJidNewsletter(jid) });
1279
+ mediaHandle = up.handle;
1280
+ return up;
1281
+ },
1282
+ ...options
1283
+ });
1284
+ } else if ('video' in media) {
1285
+ mediaMsg = await generateWAMessage(jid, { video: media.video, ...media, ...options }, {
1286
+ userJid: options.userJid,
1287
+ upload: async (encFilePath, opts) => {
1288
+ const up = await options.sock.waUploadToServer(encFilePath, { ...opts, newsletter: isJidNewsletter(jid) });
1289
+ mediaHandle = up.handle;
1290
+ return up;
1291
+ },
1292
+ ...options
1293
+ });
1294
+ }
1295
+ if (mediaMsg) {
1296
+ mediaMsg.message.messageContextInfo = {
1297
+ messageSecret: randomBytes(32),
1298
+ messageAssociation: {
1299
+ associationType: 1,
1300
+ parentMessageKey: albumMsg.key
1301
+ }
1302
+ };
1303
+ }
1304
+ message.push(mediaMsg);
1305
+ }
1306
+ return message;
1307
+ };
870
1308
  //# sourceMappingURL=messages.js.map
@@ -0,0 +1,17 @@
1
+ import { Readable } from 'stream';
2
+
3
+ /**
4
+ * Mengonversi Node.js Readable Stream menjadi Buffer.
5
+ * @param {Readable} stream Aliran data yang dapat dibaca.
6
+ * @returns {Promise<Buffer>} Promise yang diselesaikan dengan Buffer berisi semua data dari aliran.
7
+ */
8
+ async function streamToBuffer(stream) {
9
+ const chunks = [];
10
+ return new Promise((resolve, reject) => {
11
+ stream.on('data', chunk => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
12
+ stream.on('end', () => resolve(Buffer.concat(chunks)));
13
+ stream.on('error', reject);
14
+ });
15
+ }
16
+
17
+ export { streamToBuffer };
@@ -0,0 +1,77 @@
1
+ import { proto } from '../../WAProto/index.js';
2
+ import { initAuthCreds } from './auth-utils.js';
3
+ import { BufferJSON } from './generics.js';
4
+
5
+ /*
6
+ code from amiruldev readjusted by @irull2nd, don't delete WM!
7
+ */
8
+ export const useMongoFileAuthState = async (collection) => {
9
+ const writeData = (data, id) => {
10
+ const informationToStore = JSON.parse(
11
+ JSON.stringify(data, BufferJSON.replacer)
12
+ );
13
+ const update = {
14
+ $set: {
15
+ ...informationToStore,
16
+ },
17
+ };
18
+
19
+ return collection.updateOne({ _id: id }, update, { upsert: true });
20
+ };
21
+
22
+ const readData = async (id) => {
23
+ try {
24
+ const data = JSON.stringify(await collection.findOne({ _id: id }));
25
+ return JSON.parse(data, BufferJSON.reviver);
26
+ }
27
+ catch (err) {
28
+ console.log(err);
29
+ }
30
+ };
31
+
32
+ const removeData = async (id) => {
33
+ try {
34
+ await collection.deleteOne({ _id: id });
35
+ }
36
+ catch (err) {
37
+ console.log('error', err);
38
+ }
39
+ };
40
+
41
+ const creds = (await readData('creds')) || initAuthCreds();
42
+
43
+ return {
44
+ state: {
45
+ creds,
46
+ keys: {
47
+ get: async (type, ids) => {
48
+ const data = {};
49
+ await Promise.all(
50
+ ids.map(async (id) => {
51
+ let value = await readData(`${type}-${id}`);
52
+ if (type === 'app-state-sync-key') {
53
+ value = proto.Message.AppStateSyncKeyData.fromObject(data);
54
+ }
55
+ data[id] = value;
56
+ })
57
+ );
58
+ return data;
59
+ },
60
+ set: async (data) => {
61
+ const tasks = [];
62
+ for (const category of Object.keys(data)) {
63
+ for (const id of Object.keys(data[category])) {
64
+ const value = data[category][id];
65
+ const key = `${category}-${id}`;
66
+ tasks.push(value ? writeData(value, key) : removeData(key));
67
+ }
68
+ }
69
+ await Promise.all(tasks);
70
+ },
71
+ },
72
+ },
73
+ saveCreds: () => {
74
+ return writeData(creds, 'creds');
75
+ }
76
+ };
77
+ };
@@ -0,0 +1,74 @@
1
+ import { createRequire } from 'module';
2
+ import { proto } from '../../WAProto/index.js';
3
+ import { initAuthCreds } from './auth-utils.js';
4
+ import { BufferJSON } from './generics.js';
5
+
6
+ const require = createRequire(import.meta.url);
7
+
8
+ // useless key map only there to maintain backwards compatibility
9
+ // do not use in your own systems please
10
+ const KEY_MAP = {
11
+ 'pre-key': 'preKeys',
12
+ 'session': 'sessions',
13
+ 'sender-key': 'senderKeys',
14
+ 'app-state-sync-key': 'appStateSyncKeys',
15
+ 'app-state-sync-version': 'appStateVersions',
16
+ 'sender-key-memory': 'senderKeyMemory'
17
+ };
18
+
19
+ /**
20
+ * @deprecated use multi file auth state instead please
21
+ * stores the full authentication state in a single JSON file
22
+ *
23
+ * DO NOT USE IN A PROD ENVIRONMENT, only meant to serve as an example
24
+ * */
25
+ export const useSingleFileAuthState = (filename, logger) => {
26
+ const { readFileSync, writeFileSync, existsSync } = require('fs');
27
+ let creds;
28
+ let keys = {};
29
+ // save the authentication state to a file
30
+ const saveState = () => {
31
+ logger && logger.trace('saving auth state');
32
+ writeFileSync(filename,
33
+ // BufferJSON replacer utility saves buffers nicely
34
+ JSON.stringify({ creds, keys }, BufferJSON.replacer, 2));
35
+ };
36
+ if (existsSync(filename)) {
37
+ const result = JSON.parse(readFileSync(filename, { encoding: 'utf-8' }), BufferJSON.reviver);
38
+ creds = result.creds;
39
+ keys = result.keys;
40
+ }
41
+ else {
42
+ creds = initAuthCreds();
43
+ keys = {};
44
+ }
45
+ return {
46
+ state: {
47
+ creds,
48
+ keys: {
49
+ get: (type, ids) => {
50
+ const key = KEY_MAP[type];
51
+ return ids.reduce((dict, id) => {
52
+ let value = keys[key]?.[id];
53
+ if (value) {
54
+ if (type === 'app-state-sync-key') {
55
+ value = proto.Message.AppStateSyncKeyData.fromObject(value);
56
+ }
57
+ dict[id] = value;
58
+ }
59
+ return dict;
60
+ }, {});
61
+ },
62
+ set: (data) => {
63
+ for (const _key in data) {
64
+ const key = KEY_MAP[_key];
65
+ keys[key] = keys[key] || {};
66
+ Object.assign(keys[key], data[_key]);
67
+ }
68
+ saveState();
69
+ }
70
+ }
71
+ },
72
+ saveState
73
+ };
74
+ };
@@ -110,4 +110,19 @@ export function binaryNodeToString(node, i = 0) {
110
110
  const content = children ? `>\n${children}\n${tabs(i)}</${node.tag}>` : '/>';
111
111
  return tag + content;
112
112
  }
113
+
114
+ export const getBinaryFilteredButtons = (nodeContent) => {
115
+ if (!Array.isArray(nodeContent)) return false;
116
+ return nodeContent.some(a =>
117
+ ['native_flow'].includes(a?.content?.[0]?.content?.[0]?.tag) ||
118
+ ['interactive', 'buttons', 'list'].includes(a?.content?.[0]?.tag) ||
119
+ ['hsm', 'biz'].includes(a?.tag)
120
+ );
121
+ };
122
+ export const getBinaryFilteredBizBot = (nodeContent) => {
123
+ if (!Array.isArray(nodeContent)) return false;
124
+ return nodeContent.some(b =>
125
+ ['bot'].includes(b?.tag) && b?.attrs?.biz_bot === '1'
126
+ );
127
+ };
113
128
  //# sourceMappingURL=generic-utils.js.map
@@ -1,6 +1,7 @@
1
1
  export * from './encode.js';
2
2
  export * from './decode.js';
3
3
  export * from './generic-utils.js';
4
+ export { getBinaryFilteredButtons, getBinaryFilteredBizBot } from './generic-utils.js';
4
5
  export * from './jid-utils.js';
5
6
  export * from './types.js';
6
7
  //# sourceMappingURL=index.js.map
@@ -93,4 +93,6 @@ export const transferDevice = (fromJid, toJid) => {
93
93
  const { server, user } = jidDecode(toJid);
94
94
  return jidEncode(user, server, deviceId);
95
95
  };
96
+
97
+ export const isJidUser = (jid) => jid?.endsWith('@s.whatsapp.net');
96
98
  //# sourceMappingURL=jid-utils.js.map