whatsapp-web-sj.js 1.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/.env.example +3 -0
  2. package/CODE_OF_CONDUCT.md +133 -0
  3. package/LICENSE +201 -0
  4. package/README.md +185 -0
  5. package/example.js +634 -0
  6. package/index.d.ts +1842 -0
  7. package/index.js +32 -0
  8. package/package.json +55 -0
  9. package/shell.js +36 -0
  10. package/src/Client.js +1747 -0
  11. package/src/authStrategies/BaseAuthStrategy.js +27 -0
  12. package/src/authStrategies/LocalAuth.js +56 -0
  13. package/src/authStrategies/NoAuth.js +12 -0
  14. package/src/authStrategies/RemoteAuth.js +204 -0
  15. package/src/factories/ChatFactory.js +16 -0
  16. package/src/factories/ContactFactory.js +16 -0
  17. package/src/structures/Base.js +22 -0
  18. package/src/structures/BusinessContact.js +21 -0
  19. package/src/structures/Buttons.js +82 -0
  20. package/src/structures/Call.js +76 -0
  21. package/src/structures/Chat.js +275 -0
  22. package/src/structures/ClientInfo.js +71 -0
  23. package/src/structures/Contact.js +208 -0
  24. package/src/structures/GroupChat.js +475 -0
  25. package/src/structures/GroupNotification.js +104 -0
  26. package/src/structures/Label.js +50 -0
  27. package/src/structures/List.js +79 -0
  28. package/src/structures/Location.js +61 -0
  29. package/src/structures/Message.js +711 -0
  30. package/src/structures/MessageMedia.js +111 -0
  31. package/src/structures/Order.js +52 -0
  32. package/src/structures/Payment.js +79 -0
  33. package/src/structures/Poll.js +44 -0
  34. package/src/structures/PollVote.js +61 -0
  35. package/src/structures/PrivateChat.js +13 -0
  36. package/src/structures/PrivateContact.js +13 -0
  37. package/src/structures/Product.js +68 -0
  38. package/src/structures/ProductMetadata.js +25 -0
  39. package/src/structures/Reaction.js +69 -0
  40. package/src/structures/index.js +24 -0
  41. package/src/util/Constants.js +176 -0
  42. package/src/util/Injected/AuthStore/AuthStore.js +17 -0
  43. package/src/util/Injected/AuthStore/LegacyAuthStore.js +22 -0
  44. package/src/util/Injected/LegacyStore.js +146 -0
  45. package/src/util/Injected/Store.js +167 -0
  46. package/src/util/Injected/Utils.js +1017 -0
  47. package/src/util/InterfaceController.js +127 -0
  48. package/src/util/Util.js +186 -0
  49. package/src/webCache/LocalWebCache.js +40 -0
  50. package/src/webCache/RemoteWebCache.js +40 -0
  51. package/src/webCache/WebCache.js +14 -0
  52. package/src/webCache/WebCacheFactory.js +20 -0
@@ -0,0 +1,176 @@
1
+ 'use strict';
2
+
3
+ exports.WhatsWebURL = 'https://web.whatsapp.com/';
4
+
5
+ exports.DefaultOptions = {
6
+ puppeteer: {
7
+ headless: true,
8
+ defaultViewport: null
9
+ },
10
+ webVersion: '2.3000.1016590837',
11
+ webVersionCache: {
12
+ type: 'local',
13
+ },
14
+ authTimeoutMs: 0,
15
+ qrMaxRetries: 0,
16
+ takeoverOnConflict: false,
17
+ takeoverTimeoutMs: 0,
18
+ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36',
19
+ ffmpegPath: 'ffmpeg',
20
+ bypassCSP: false,
21
+ proxyAuthentication: undefined
22
+ };
23
+
24
+ /**
25
+ * Client status
26
+ * @readonly
27
+ * @enum {number}
28
+ */
29
+ exports.Status = {
30
+ INITIALIZING: 0,
31
+ AUTHENTICATING: 1,
32
+ READY: 3
33
+ };
34
+
35
+ /**
36
+ * Events that can be emitted by the client
37
+ * @readonly
38
+ * @enum {string}
39
+ */
40
+ exports.Events = {
41
+ AUTHENTICATED: 'authenticated',
42
+ AUTHENTICATION_FAILURE: 'auth_failure',
43
+ READY: 'ready',
44
+ CHAT_REMOVED: 'chat_removed',
45
+ CHAT_ARCHIVED: 'chat_archived',
46
+ MESSAGE_RECEIVED: 'message',
47
+ MESSAGE_CIPHERTEXT: 'message_ciphertext',
48
+ MESSAGE_CREATE: 'message_create',
49
+ MESSAGE_REVOKED_EVERYONE: 'message_revoke_everyone',
50
+ MESSAGE_REVOKED_ME: 'message_revoke_me',
51
+ MESSAGE_ACK: 'message_ack',
52
+ MESSAGE_EDIT: 'message_edit',
53
+ UNREAD_COUNT: 'unread_count',
54
+ MESSAGE_REACTION: 'message_reaction',
55
+ MEDIA_UPLOADED: 'media_uploaded',
56
+ CONTACT_CHANGED: 'contact_changed',
57
+ GROUP_JOIN: 'group_join',
58
+ GROUP_LEAVE: 'group_leave',
59
+ GROUP_ADMIN_CHANGED: 'group_admin_changed',
60
+ GROUP_MEMBERSHIP_REQUEST: 'group_membership_request',
61
+ GROUP_UPDATE: 'group_update',
62
+ QR_RECEIVED: 'qr',
63
+ LOADING_SCREEN: 'loading_screen',
64
+ DISCONNECTED: 'disconnected',
65
+ STATE_CHANGED: 'change_state',
66
+ BATTERY_CHANGED: 'change_battery',
67
+ INCOMING_CALL: 'call',
68
+ REMOTE_SESSION_SAVED: 'remote_session_saved',
69
+ VOTE_UPDATE: 'vote_update'
70
+ };
71
+
72
+ /**
73
+ * Message types
74
+ * @readonly
75
+ * @enum {string}
76
+ */
77
+ exports.MessageTypes = {
78
+ TEXT: 'chat',
79
+ AUDIO: 'audio',
80
+ VOICE: 'ptt',
81
+ IMAGE: 'image',
82
+ VIDEO: 'video',
83
+ DOCUMENT: 'document',
84
+ STICKER: 'sticker',
85
+ LOCATION: 'location',
86
+ CONTACT_CARD: 'vcard',
87
+ CONTACT_CARD_MULTI: 'multi_vcard',
88
+ ORDER: 'order',
89
+ REVOKED: 'revoked',
90
+ PRODUCT: 'product',
91
+ UNKNOWN: 'unknown',
92
+ GROUP_INVITE: 'groups_v4_invite',
93
+ LIST: 'list',
94
+ LIST_RESPONSE: 'list_response',
95
+ BUTTONS_RESPONSE: 'buttons_response',
96
+ PAYMENT: 'payment',
97
+ BROADCAST_NOTIFICATION: 'broadcast_notification',
98
+ CALL_LOG: 'call_log',
99
+ CIPHERTEXT: 'ciphertext',
100
+ DEBUG: 'debug',
101
+ E2E_NOTIFICATION: 'e2e_notification',
102
+ GP2: 'gp2',
103
+ GROUP_NOTIFICATION: 'group_notification',
104
+ HSM: 'hsm',
105
+ INTERACTIVE: 'interactive',
106
+ NATIVE_FLOW: 'native_flow',
107
+ NOTIFICATION: 'notification',
108
+ NOTIFICATION_TEMPLATE: 'notification_template',
109
+ OVERSIZED: 'oversized',
110
+ PROTOCOL: 'protocol',
111
+ REACTION: 'reaction',
112
+ TEMPLATE_BUTTON_REPLY: 'template_button_reply',
113
+ POLL_CREATION: 'poll_creation',
114
+ };
115
+
116
+ /**
117
+ * Group notification types
118
+ * @readonly
119
+ * @enum {string}
120
+ */
121
+ exports.GroupNotificationTypes = {
122
+ ADD: 'add',
123
+ INVITE: 'invite',
124
+ REMOVE: 'remove',
125
+ LEAVE: 'leave',
126
+ SUBJECT: 'subject',
127
+ DESCRIPTION: 'description',
128
+ PICTURE: 'picture',
129
+ ANNOUNCE: 'announce',
130
+ RESTRICT: 'restrict',
131
+ };
132
+
133
+ /**
134
+ * Chat types
135
+ * @readonly
136
+ * @enum {string}
137
+ */
138
+ exports.ChatTypes = {
139
+ SOLO: 'solo',
140
+ GROUP: 'group',
141
+ UNKNOWN: 'unknown'
142
+ };
143
+
144
+ /**
145
+ * WhatsApp state
146
+ * @readonly
147
+ * @enum {string}
148
+ */
149
+ exports.WAState = {
150
+ CONFLICT: 'CONFLICT',
151
+ CONNECTED: 'CONNECTED',
152
+ DEPRECATED_VERSION: 'DEPRECATED_VERSION',
153
+ OPENING: 'OPENING',
154
+ PAIRING: 'PAIRING',
155
+ PROXYBLOCK: 'PROXYBLOCK',
156
+ SMB_TOS_BLOCK: 'SMB_TOS_BLOCK',
157
+ TIMEOUT: 'TIMEOUT',
158
+ TOS_BLOCK: 'TOS_BLOCK',
159
+ UNLAUNCHED: 'UNLAUNCHED',
160
+ UNPAIRED: 'UNPAIRED',
161
+ UNPAIRED_IDLE: 'UNPAIRED_IDLE'
162
+ };
163
+
164
+ /**
165
+ * Message ACK
166
+ * @readonly
167
+ * @enum {number}
168
+ */
169
+ exports.MessageAck = {
170
+ ACK_ERROR: -1,
171
+ ACK_PENDING: 0,
172
+ ACK_SERVER: 1,
173
+ ACK_DEVICE: 2,
174
+ ACK_READ: 3,
175
+ ACK_PLAYED: 4,
176
+ };
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ exports.ExposeAuthStore = () => {
4
+ window.AuthStore = {};
5
+ window.AuthStore.AppState = window.require('WAWebSocketModel').Socket;
6
+ window.AuthStore.Cmd = window.require('WAWebCmd').Cmd;
7
+ window.AuthStore.Conn = window.require('WAWebConnModel').Conn;
8
+ window.AuthStore.OfflineMessageHandler = window.require('WAWebOfflineHandler').OfflineMessageHandler;
9
+ window.AuthStore.PairingCodeLinkUtils = window.require('WAWebAltDeviceLinkingApi');
10
+ window.AuthStore.Base64Tools = window.require('WABase64');
11
+ window.AuthStore.RegistrationUtils = {
12
+ ...window.require('WAWebCompanionRegClientUtils'),
13
+ ...window.require('WAWebAdvSignatureApi'),
14
+ ...window.require('WAWebUserPrefsInfoStore'),
15
+ ...window.require('WAWebSignalStoreApi'),
16
+ };
17
+ };
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ //TODO: To be removed by version 2.3000.x hard release
4
+
5
+ exports.ExposeLegacyAuthStore = (moduleRaidStr) => {
6
+ eval('var moduleRaid = ' + moduleRaidStr);
7
+ // eslint-disable-next-line no-undef
8
+ window.mR = moduleRaid();
9
+ window.AuthStore = {};
10
+ window.AuthStore.AppState = window.mR.findModule('Socket')[0].Socket;
11
+ window.AuthStore.Cmd = window.mR.findModule('Cmd')[0].Cmd;
12
+ window.AuthStore.Conn = window.mR.findModule('Conn')[0].Conn;
13
+ window.AuthStore.OfflineMessageHandler = window.mR.findModule('OfflineMessageHandler')[0].OfflineMessageHandler;
14
+ window.AuthStore.PairingCodeLinkUtils = window.mR.findModule('initializeAltDeviceLinking')[0];
15
+ window.AuthStore.Base64Tools = window.mR.findModule('encodeB64')[0];
16
+ window.AuthStore.RegistrationUtils = {
17
+ ...window.mR.findModule('getCompanionWebClientFromBrowser')[0],
18
+ ...window.mR.findModule('verifyKeyIndexListAccountSignature')[0],
19
+ ...window.mR.findModule('waNoiseInfo')[0],
20
+ ...window.mR.findModule('waSignalStore')[0],
21
+ };
22
+ };
@@ -0,0 +1,146 @@
1
+ 'use strict';
2
+
3
+ //TODO: To be removed by version 2.3000.x hard release
4
+
5
+ // Exposes the internal Store to the WhatsApp Web client
6
+ exports.ExposeLegacyStore = () => {
7
+ window.Store = Object.assign({}, window.mR.findModule(m => m.default && m.default.Chat)[0].default);
8
+ window.Store.AppState = window.mR.findModule('Socket')[0].Socket;
9
+ window.Store.Conn = window.mR.findModule('Conn')[0].Conn;
10
+ window.Store.BlockContact = window.mR.findModule('blockContact')[0];
11
+ window.Store.Call = window.mR.findModule((module) => module.default && module.default.Call)[0].default.Call;
12
+ window.Store.Cmd = window.mR.findModule('Cmd')[0].Cmd;
13
+ window.Store.CryptoLib = window.mR.findModule('decryptE2EMedia')[0];
14
+ window.Store.DownloadManager = window.mR.findModule('downloadManager')[0].downloadManager;
15
+ window.Store.GroupMetadata = window.mR.findModule('GroupMetadata')[0].default.GroupMetadata;
16
+ window.Store.GroupQueryAndUpdate = window.mR.findModule('queryAndUpdateGroupMetadataById')[0].queryAndUpdateGroupMetadataById;
17
+ window.Store.Label = window.mR.findModule('LabelCollection')[0].LabelCollection;
18
+ window.Store.MediaPrep = window.mR.findModule('prepRawMedia')[0];
19
+ window.Store.MediaObject = window.mR.findModule('getOrCreateMediaObject')[0];
20
+ window.Store.NumberInfo = window.mR.findModule('formattedPhoneNumber')[0];
21
+ window.Store.MediaTypes = window.mR.findModule('msgToMediaType')[0];
22
+ window.Store.MediaUpload = window.mR.findModule('uploadMedia')[0];
23
+ window.Store.MsgKey = window.mR.findModule((module) => module.default && module.default.fromString)[0].default;
24
+ window.Store.OpaqueData = window.mR.findModule(module => module.default && module.default.createFromData)[0].default;
25
+ window.Store.QueryProduct = window.mR.findModule('queryProduct')[0];
26
+ window.Store.QueryOrder = window.mR.findModule('queryOrder')[0];
27
+ window.Store.SendClear = window.mR.findModule('sendClear')[0];
28
+ window.Store.SendDelete = window.mR.findModule('sendDelete')[0];
29
+ window.Store.SendMessage = window.mR.findModule('addAndSendMsgToChat')[0];
30
+ window.Store.EditMessage = window.mR.findModule('addAndSendMessageEdit')[0];
31
+ window.Store.SendSeen = window.mR.findModule('sendSeen')[0];
32
+ window.Store.User = window.mR.findModule('getMaybeMeUser')[0];
33
+ window.Store.ContactMethods = window.mR.findModule('getUserid')[0];
34
+ window.Store.UploadUtils = window.mR.findModule((module) => (module.default && module.default.encryptAndUpload) ? module.default : null)[0].default;
35
+ window.Store.UserConstructor = window.mR.findModule((module) => (module.default && module.default.prototype && module.default.prototype.isServer && module.default.prototype.isUser) ? module.default : null)[0].default;
36
+ window.Store.Validators = window.mR.findModule('findLinks')[0];
37
+ window.Store.VCard = window.mR.findModule('vcardFromContactModel')[0];
38
+ window.Store.WidFactory = window.mR.findModule('createWid')[0];
39
+ window.Store.ProfilePic = window.mR.findModule('profilePicResync')[0];
40
+ window.Store.PresenceUtils = window.mR.findModule('sendPresenceAvailable')[0];
41
+ window.Store.ChatState = window.mR.findModule('sendChatStateComposing')[0];
42
+ window.Store.findCommonGroups = window.mR.findModule('findCommonGroups')[0].findCommonGroups;
43
+ window.Store.StatusUtils = window.mR.findModule('setMyStatus')[0];
44
+ window.Store.ConversationMsgs = window.mR.findModule('loadEarlierMsgs')[0];
45
+ window.Store.sendReactionToMsg = window.mR.findModule('sendReactionToMsg')[0].sendReactionToMsg;
46
+ window.Store.createOrUpdateReactionsModule = window.mR.findModule('createOrUpdateReactions')[0];
47
+ window.Store.EphemeralFields = window.mR.findModule('getEphemeralFields')[0];
48
+ window.Store.MsgActionChecks = window.mR.findModule('canSenderRevokeMsg')[0];
49
+ window.Store.QuotedMsg = window.mR.findModule('getQuotedMsgObj')[0];
50
+ window.Store.LinkPreview = window.mR.findModule('getLinkPreview')[0];
51
+ window.Store.Socket = window.mR.findModule('deprecatedSendIq')[0];
52
+ window.Store.SocketWap = window.mR.findModule('wap')[0];
53
+ window.Store.SearchContext = window.mR.findModule('getSearchContext')[0].getSearchContext;
54
+ window.Store.DrawerManager = window.mR.findModule('DrawerManager')[0].DrawerManager;
55
+ window.Store.LidUtils = window.mR.findModule('getCurrentLid')[0];
56
+ window.Store.WidToJid = window.mR.findModule('widToUserJid')[0];
57
+ window.Store.JidToWid = window.mR.findModule('userJidToUserWid')[0];
58
+ window.Store.getMsgInfo = (window.mR.findModule('sendQueryMsgInfo')[0] || {}).sendQueryMsgInfo || window.mR.findModule('queryMsgInfo')[0].queryMsgInfo;
59
+ window.Store.pinUnpinMsg = window.mR.findModule('sendPinInChatMsg')[0].sendPinInChatMsg;
60
+
61
+ /* eslint-disable no-undef, no-cond-assign */
62
+ window.Store.QueryExist = ((m = window.mR.findModule('queryExists')[0]) ? m.queryExists : window.mR.findModule('queryExist')[0].queryWidExists);
63
+ window.Store.ReplyUtils = (m = window.mR.findModule('canReplyMsg')).length > 0 && m[0];
64
+ /* eslint-enable no-undef, no-cond-assign */
65
+
66
+ window.Store.Settings = {
67
+ ...window.mR.findModule('ChatlistPanelState')[0],
68
+ setPushname: window.mR.findModule((m) => m.setPushname && !m.ChatlistPanelState)[0].setPushname
69
+ };
70
+ window.Store.StickerTools = {
71
+ ...window.mR.findModule('toWebpSticker')[0],
72
+ ...window.mR.findModule('addWebpMetadata')[0]
73
+ };
74
+ window.Store.GroupUtils = {
75
+ ...window.mR.findModule('createGroup')[0],
76
+ ...window.mR.findModule('setGroupDescription')[0],
77
+ ...window.mR.findModule('sendExitGroup')[0],
78
+ ...window.mR.findModule('sendSetPicture')[0]
79
+ };
80
+ window.Store.GroupParticipants = {
81
+ ...window.mR.findModule('promoteParticipants')[0],
82
+ ...window.mR.findModule('sendAddParticipantsRPC')[0]
83
+ };
84
+ window.Store.GroupInvite = {
85
+ ...window.mR.findModule('resetGroupInviteCode')[0],
86
+ ...window.mR.findModule('queryGroupInvite')[0]
87
+ };
88
+ window.Store.GroupInviteV4 = {
89
+ ...window.mR.findModule('queryGroupInviteV4')[0],
90
+ ...window.mR.findModule('sendGroupInviteMessage')[0]
91
+ };
92
+ window.Store.MembershipRequestUtils = {
93
+ ...window.mR.findModule('getMembershipApprovalRequests')[0],
94
+ ...window.mR.findModule('sendMembershipRequestsActionRPC')[0]
95
+ };
96
+
97
+ if (!window.Store.Chat._find) {
98
+ window.Store.Chat._find = e => {
99
+ const target = window.Store.Chat.get(e);
100
+ return target ? Promise.resolve(target) : Promise.resolve({
101
+ id: e
102
+ });
103
+ };
104
+ }
105
+
106
+ // eslint-disable-next-line no-undef
107
+ if ((m = window.mR.findModule('ChatCollection')[0]) && m.ChatCollection && typeof m.ChatCollection.findImpl === 'undefined' && typeof m.ChatCollection._find !== 'undefined') m.ChatCollection.findImpl = m.ChatCollection._find;
108
+
109
+ const _isMDBackend = window.mR.findModule('isMDBackend');
110
+ if(_isMDBackend && _isMDBackend[0] && _isMDBackend[0].isMDBackend) {
111
+ window.Store.MDBackend = _isMDBackend[0].isMDBackend();
112
+ } else {
113
+ window.Store.MDBackend = true;
114
+ }
115
+
116
+ const _features = window.mR.findModule('FEATURE_CHANGE_EVENT')[0];
117
+ if(_features) {
118
+ window.Store.Features = _features.LegacyPhoneFeatures;
119
+ }
120
+
121
+ /**
122
+ * Target options object description
123
+ * @typedef {Object} TargetOptions
124
+ * @property {string|number} module The name or a key of the target module to search
125
+ * @property {number} index The index value of the target module
126
+ * @property {string} function The function name to get from a module
127
+ */
128
+
129
+ /**
130
+ * Function to modify functions
131
+ * @param {TargetOptions} target Options specifying the target function to search for modifying
132
+ * @param {Function} callback Modified function
133
+ */
134
+ window.injectToFunction = (target, callback) => {
135
+ const module = typeof target.module === 'string'
136
+ ? window.mR.findModule(target.module)
137
+ : window.mR.modules[target.module];
138
+ const originalFunction = module[target.index][target.function];
139
+ const modifiedFunction = (...args) => callback(originalFunction, ...args);
140
+ module[target.index][target.function] = modifiedFunction;
141
+ };
142
+
143
+ window.injectToFunction({ module: 'mediaTypeFromProtobuf', index: 0, function: 'mediaTypeFromProtobuf' }, (func, ...args) => { const [proto] = args; return proto.locationMessage ? null : func(...args); });
144
+
145
+ window.injectToFunction({ module: 'typeAttributeFromProtobuf', index: 0, function: 'typeAttributeFromProtobuf' }, (func, ...args) => { const [proto] = args; return proto.locationMessage || proto.groupInviteMessage ? 'text' : func(...args); });
146
+ };
@@ -0,0 +1,167 @@
1
+ 'use strict';
2
+
3
+ exports.ExposeStore = () => {
4
+ /**
5
+ * Helper function that compares between two WWeb versions. Its purpose is to help the developer to choose the correct code implementation depending on the comparison value and the WWeb version.
6
+ * @param {string} lOperand The left operand for the WWeb version string to compare with
7
+ * @param {string} operator The comparison operator
8
+ * @param {string} rOperand The right operand for the WWeb version string to compare with
9
+ * @returns {boolean} Boolean value that indicates the result of the comparison
10
+ */
11
+ window.compareWwebVersions = (lOperand, operator, rOperand) => {
12
+ if (!['>', '>=', '<', '<=', '='].includes(operator)) {
13
+ throw new class _ extends Error {
14
+ constructor(m) { super(m); this.name = 'CompareWwebVersionsError'; }
15
+ }('Invalid comparison operator is provided');
16
+
17
+ }
18
+ if (typeof lOperand !== 'string' || typeof rOperand !== 'string') {
19
+ throw new class _ extends Error {
20
+ constructor(m) { super(m); this.name = 'CompareWwebVersionsError'; }
21
+ }('A non-string WWeb version type is provided');
22
+ }
23
+
24
+ lOperand = lOperand.replace(/-beta$/, '');
25
+ rOperand = rOperand.replace(/-beta$/, '');
26
+
27
+ while (lOperand.length !== rOperand.length) {
28
+ lOperand.length > rOperand.length
29
+ ? rOperand = rOperand.concat('0')
30
+ : lOperand = lOperand.concat('0');
31
+ }
32
+
33
+ lOperand = Number(lOperand.replace(/\./g, ''));
34
+ rOperand = Number(rOperand.replace(/\./g, ''));
35
+
36
+ return (
37
+ operator === '>' ? lOperand > rOperand :
38
+ operator === '>=' ? lOperand >= rOperand :
39
+ operator === '<' ? lOperand < rOperand :
40
+ operator === '<=' ? lOperand <= rOperand :
41
+ operator === '=' ? lOperand === rOperand :
42
+ false
43
+ );
44
+ };
45
+
46
+ window.Store = Object.assign({}, window.require('WAWebCollections'));
47
+ window.Store.AppState = window.require('WAWebSocketModel').Socket;
48
+ window.Store.BlockContact = window.require('WAWebBlockContactAction');
49
+ window.Store.Conn = window.require('WAWebConnModel').Conn;
50
+ window.Store.Cmd = window.require('WAWebCmd').Cmd;
51
+ window.Store.DownloadManager = window.require('WAWebDownloadManager').downloadManager;
52
+ window.Store.GroupQueryAndUpdate = window.require('WAWebGroupQueryJob').queryAndUpdateGroupMetadataById;
53
+ window.Store.MediaPrep = window.require('WAWebPrepRawMedia');
54
+ window.Store.MediaObject = window.require('WAWebMediaStorage');
55
+ window.Store.MediaTypes = window.require('WAWebMmsMediaTypes');
56
+ window.Store.MediaUpload = window.require('WAWebMediaMmsV4Upload');
57
+ window.Store.MsgKey = window.require('WAWebMsgKey');
58
+ window.Store.NumberInfo = window.require('WAPhoneUtils');
59
+ window.Store.OpaqueData = window.require('WAWebMediaOpaqueData');
60
+ window.Store.QueryProduct = window.require('WAWebBizProductCatalogBridge');
61
+ window.Store.QueryOrder = window.require('WAWebBizOrderBridge');
62
+ window.Store.SendClear = window.require('WAWebChatClearBridge');
63
+ window.Store.SendDelete = window.require('WAWebDeleteChatAction');
64
+ window.Store.SendMessage = window.require('WAWebSendMsgChatAction');
65
+ window.Store.EditMessage = window.require('WAWebSendMessageEditAction');
66
+ window.Store.SendSeen = window.require('WAWebUpdateUnreadChatAction');
67
+ window.Store.User = window.require('WAWebUserPrefsMeUser');
68
+ window.Store.ContactMethods = window.require('WAWebContactGetters');
69
+ window.Store.UploadUtils = window.require('WAWebUploadManager');
70
+ window.Store.UserConstructor = window.require('WAWebWid');
71
+ window.Store.Validators = window.require('WALinkify');
72
+ window.Store.VCard = window.require('WAWebFrontendVcardUtils');
73
+ window.Store.WidFactory = window.require('WAWebWidFactory');
74
+ window.Store.ProfilePic = window.require('WAWebContactProfilePicThumbBridge');
75
+ window.Store.PresenceUtils = window.require('WAWebPresenceChatAction');
76
+ window.Store.ChatState = window.require('WAWebChatStateBridge');
77
+ window.Store.findCommonGroups = window.require('WAWebFindCommonGroupsContactAction').findCommonGroups;
78
+ window.Store.StatusUtils = window.require('WAWebContactStatusBridge');
79
+ window.Store.ConversationMsgs = window.require('WAWebChatLoadMessages');
80
+ window.Store.sendReactionToMsg = window.require('WAWebSendReactionMsgAction').sendReactionToMsg;
81
+ window.Store.createOrUpdateReactionsModule = window.require('WAWebDBCreateOrUpdateReactions');
82
+ window.Store.EphemeralFields = window.require('WAWebGetEphemeralFieldsMsgActionsUtils');
83
+ window.Store.MsgActionChecks = window.require('WAWebMsgActionCapability');
84
+ window.Store.QuotedMsg = window.require('WAWebQuotedMsgModelUtils');
85
+ window.Store.LinkPreview = window.require('WAWebLinkPreviewChatAction');
86
+ window.Store.Socket = window.require('WADeprecatedSendIq');
87
+ window.Store.SocketWap = window.require('WAWap');
88
+ window.Store.SearchContext = window.require('WAWebChatMessageSearch').getSearchContext;
89
+ window.Store.DrawerManager = window.require('WAWebDrawerManager').DrawerManager;
90
+ window.Store.LidUtils = window.require('WAWebApiContact');
91
+ window.Store.WidToJid = window.require('WAWebWidToJid');
92
+ window.Store.JidToWid = window.require('WAWebJidToWid');
93
+ window.Store.getMsgInfo = window.require('WAWebApiMessageInfoStore').queryMsgInfo;
94
+ window.Store.pinUnpinMsg = window.require('WAWebSendPinMessageAction').sendPinInChatMsg;
95
+ window.Store.QueryExist = window.require('WAWebQueryExistsJob').queryWidExists;
96
+ window.Store.ReplyUtils = window.require('WAWebMsgReply');
97
+ window.Store.Settings = window.require('WAWebUserPrefsGeneral');
98
+ window.Store.BotSecret = window.require('WAWebBotMessageSecret');
99
+ window.Store.BotProfiles = window.require('WAWebBotProfileCollection');
100
+ window.Store.DeviceList = window.require('WAWebApiDeviceList');
101
+ if (window.compareWwebVersions(window.Debug.VERSION, '>=', '2.3000.1014111620'))
102
+ window.Store.AddonReactionTable = window.require('WAWebAddonReactionTableMode').reactionTableMode;
103
+
104
+ window.Store.ForwardUtils = {
105
+ ...window.require('WAWebForwardMessagesToChat')
106
+ };
107
+
108
+ window.Store.StickerTools = {
109
+ ...window.require('WAWebImageUtils'),
110
+ ...window.require('WAWebAddWebpMetadata')
111
+ };
112
+ window.Store.GroupUtils = {
113
+ ...window.require('WAWebGroupCreateJob'),
114
+ ...window.require('WAWebGroupModifyInfoJob'),
115
+ ...window.require('WAWebExitGroupAction'),
116
+ ...window.require('WAWebContactProfilePicThumbBridge')
117
+ };
118
+ window.Store.GroupParticipants = {
119
+ ...window.require('WAWebModifyParticipantsGroupAction'),
120
+ ...window.require('WASmaxGroupsAddParticipantsRPC')
121
+ };
122
+ window.Store.GroupInvite = {
123
+ ...window.require('WAWebGroupInviteJob'),
124
+ ...window.require('WAWebGroupQueryJob')
125
+ };
126
+ window.Store.GroupInviteV4 = {
127
+ ...window.require('WAWebGroupInviteV4Job'),
128
+ ...window.require('WAWebChatSendMessages')
129
+ };
130
+ window.Store.MembershipRequestUtils = {
131
+ ...window.require('WAWebApiMembershipApprovalRequestStore'),
132
+ ...window.require('WASmaxGroupsMembershipRequestsActionRPC')
133
+ };
134
+
135
+ if (!window.Store.Chat._find || !window.Store.Chat.findImpl) {
136
+ window.Store.Chat._find = e => {
137
+ const target = window.Store.Chat.get(e);
138
+ return target ? Promise.resolve(target) : Promise.resolve({
139
+ id: e
140
+ });
141
+ };
142
+ window.Store.Chat.findImpl = window.Store.Chat._find;
143
+ }
144
+
145
+ /**
146
+ * Target options object description
147
+ * @typedef {Object} TargetOptions
148
+ * @property {string|number} module The target module
149
+ * @property {string} function The function name to get from a module
150
+ */
151
+ /**
152
+ * Function to modify functions
153
+ * @param {TargetOptions} target Options specifying the target function to search for modifying
154
+ * @param {Function} callback Modified function
155
+ */
156
+ window.injectToFunction = (target, callback) => {
157
+ const module = window.require(target.module);
158
+ const originalFunction = module[target.function];
159
+ const modifiedFunction = (...args) => callback(originalFunction, ...args);
160
+ module[target.function] = modifiedFunction;
161
+ };
162
+
163
+ window.injectToFunction({ module: 'WAWebBackendJobsCommon', function: 'mediaTypeFromProtobuf' }, (func, ...args) => { const [proto] = args; return proto.locationMessage ? null : func(...args); });
164
+
165
+ window.injectToFunction({ module: 'WAWebE2EProtoUtils', function: 'typeAttributeFromProtobuf' }, (func, ...args) => { const [proto] = args; return proto.locationMessage || proto.groupInviteMessage ? 'text' : func(...args); });
166
+
167
+ };