@alannxd/baileys 6.0.6 → 6.0.9
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 +341 -286
- package/WAProto/GenerateStatics.sh +3 -0
- package/WAProto/WAProto.proto +6902 -0
- package/WAProto/fix-imports.js +85 -0
- package/WAProto/index.d.ts +79257 -0
- package/WAProto/index.js +205861 -60565
- package/engine-requirements.js +1 -1
- package/lib/Defaults/index.js +119 -136
- package/lib/Signal/Group/ciphertext-message.js +2 -5
- package/lib/Signal/Group/group-session-builder.js +7 -41
- package/lib/Signal/Group/group_cipher.js +37 -51
- package/lib/Signal/Group/index.js +12 -57
- package/lib/Signal/Group/keyhelper.js +7 -44
- package/lib/Signal/Group/sender-chain-key.js +7 -15
- package/lib/Signal/Group/sender-key-distribution-message.js +8 -11
- package/lib/Signal/Group/sender-key-message.js +9 -12
- package/lib/Signal/Group/sender-key-name.js +2 -5
- package/lib/Signal/Group/sender-key-record.js +9 -21
- package/lib/Signal/Group/sender-key-state.js +27 -42
- package/lib/Signal/Group/sender-message-key.js +4 -7
- package/lib/Signal/libsignal.js +347 -90
- package/lib/Signal/lid-mapping.js +277 -0
- package/lib/Socket/Client/index.js +3 -19
- package/lib/Socket/Client/types.js +11 -0
- package/lib/Socket/Client/websocket.js +54 -0
- package/lib/Socket/business.js +162 -43
- package/lib/Socket/chats.js +627 -427
- package/lib/Socket/communities.js +90 -80
- package/lib/Socket/groups.js +154 -161
- package/lib/Socket/index.js +11 -10
- package/lib/Socket/luxu.js +315 -469
- package/lib/Socket/messages-recv.js +1421 -615
- package/lib/Socket/messages-send.js +1150 -799
- package/lib/Socket/mex.js +42 -0
- package/lib/Socket/newsletter.js +152 -204
- package/lib/Socket/socket.js +544 -313
- package/lib/Store/index.js +10 -10
- package/lib/Store/keyed-db.js +108 -0
- package/lib/Store/make-cache-manager-store.js +43 -41
- package/lib/Store/make-in-memory-store.js +112 -341
- package/lib/Store/make-ordered-dictionary.js +14 -20
- package/lib/Store/object-repository.js +11 -6
- package/lib/Types/Auth.js +2 -2
- package/lib/Types/Bussines.js +2 -0
- package/lib/Types/Call.js +2 -2
- package/lib/Types/Chat.js +8 -4
- package/lib/Types/Contact.js +2 -2
- package/lib/Types/Events.js +2 -2
- package/lib/Types/GroupMetadata.js +2 -2
- package/lib/Types/Label.js +3 -5
- package/lib/Types/LabelAssociation.js +3 -5
- package/lib/Types/Message.js +11 -9
- package/lib/Types/Mex.js +37 -0
- package/lib/Types/Product.js +2 -2
- package/lib/Types/Signal.js +2 -2
- package/lib/Types/Socket.js +3 -2
- package/lib/Types/State.js +56 -2
- package/lib/Types/USync.js +2 -2
- package/lib/Types/index.js +15 -31
- package/lib/Utils/auth-utils.js +239 -143
- package/lib/Utils/browser-utils.js +48 -0
- package/lib/Utils/business.js +66 -69
- package/lib/Utils/chat-utils.js +396 -253
- package/lib/Utils/companion-reg-client-utils.js +35 -0
- package/lib/Utils/crypto.js +57 -90
- package/lib/Utils/decode-wa-message.js +236 -84
- package/lib/Utils/event-buffer.js +185 -77
- package/lib/Utils/generics.js +189 -209
- package/lib/Utils/history.js +93 -55
- package/lib/Utils/identity-change-handler.js +50 -0
- package/lib/Utils/index.js +23 -33
- package/lib/Utils/link-preview.js +16 -24
- package/lib/Utils/logger.js +3 -7
- package/lib/Utils/lt-hash.js +3 -46
- package/lib/Utils/make-mutex.js +24 -34
- package/lib/Utils/message-composer.js +273 -0
- package/lib/Utils/message-retry-manager.js +265 -0
- package/lib/Utils/messages-media.js +451 -482
- package/lib/Utils/messages.js +795 -369
- package/lib/Utils/noise-handler.js +145 -99
- package/lib/Utils/offline-node-processor.js +40 -0
- package/lib/Utils/pre-key-manager.js +106 -0
- package/lib/Utils/process-message.js +459 -150
- package/lib/Utils/reporting-utils.js +258 -0
- package/lib/Utils/signal.js +120 -72
- package/lib/Utils/stanza-ack.js +38 -0
- package/lib/Utils/sync-action-utils.js +49 -0
- package/lib/Utils/tc-token-utils.js +163 -0
- package/lib/Utils/use-multi-file-auth-state.js +29 -27
- package/lib/Utils/validate-connection.js +73 -99
- package/lib/WABinary/constants.js +1281 -20
- package/lib/WABinary/decode.js +52 -42
- package/lib/WABinary/encode.js +110 -155
- package/lib/WABinary/generic-utils.js +55 -49
- package/lib/WABinary/index.js +6 -21
- package/lib/WABinary/jid-utils.js +76 -40
- package/lib/WABinary/types.js +2 -2
- package/lib/WAM/BinaryInfo.js +2 -5
- package/lib/WAM/constants.js +19071 -11568
- package/lib/WAM/encode.js +17 -22
- package/lib/WAM/index.js +4 -19
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +33 -13
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +11 -14
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +9 -12
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +9 -13
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +20 -22
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +13 -8
- package/lib/WAUSync/Protocols/index.js +6 -20
- package/lib/WAUSync/USyncQuery.js +44 -35
- package/lib/WAUSync/USyncUser.js +10 -5
- package/lib/WAUSync/index.js +4 -19
- package/lib/index.js +13 -36
- package/package.json +85 -51
- package/WAProto/fix-import.js +0 -29
- package/lib/Defaults/baileys-version.json +0 -3
- package/lib/Defaults/index.d.ts +0 -53
- package/lib/Defaults/phonenumber-mcc.json +0 -223
- package/lib/Signal/Group/ciphertext-message.d.ts +0 -9
- package/lib/Signal/Group/group-session-builder.d.ts +0 -14
- package/lib/Signal/Group/group_cipher.d.ts +0 -17
- package/lib/Signal/Group/index.d.ts +0 -11
- package/lib/Signal/Group/keyhelper.d.ts +0 -10
- package/lib/Signal/Group/queue-job.d.ts +0 -1
- package/lib/Signal/Group/queue-job.js +0 -57
- package/lib/Signal/Group/sender-chain-key.d.ts +0 -13
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -16
- package/lib/Signal/Group/sender-key-message.d.ts +0 -18
- package/lib/Signal/Group/sender-key-name.d.ts +0 -17
- package/lib/Signal/Group/sender-key-record.d.ts +0 -30
- package/lib/Signal/Group/sender-key-state.d.ts +0 -38
- package/lib/Signal/Group/sender-message-key.d.ts +0 -11
- package/lib/Signal/libsignal.d.ts +0 -3
- package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
- package/lib/Socket/Client/abstract-socket-client.js +0 -13
- 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 -171
- package/lib/Socket/chats.d.ts +0 -267
- package/lib/Socket/communities.d.ts +0 -180
- package/lib/Socket/groups.d.ts +0 -115
- package/lib/Socket/index.d.ts +0 -173
- package/lib/Socket/luxu.d.ts +0 -266
- package/lib/Socket/messages-recv.d.ts +0 -161
- package/lib/Socket/messages-send.d.ts +0 -183
- package/lib/Socket/newsletter.d.ts +0 -134
- package/lib/Socket/registration.d.ts +0 -267
- package/lib/Socket/registration.js +0 -166
- package/lib/Socket/socket.d.ts +0 -44
- package/lib/Socket/usync.d.ts +0 -36
- package/lib/Socket/usync.js +0 -70
- 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 -118
- 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 -110
- package/lib/Types/Call.d.ts +0 -13
- package/lib/Types/Chat.d.ts +0 -102
- package/lib/Types/Contact.d.ts +0 -19
- package/lib/Types/Events.d.ts +0 -157
- package/lib/Types/GroupMetadata.d.ts +0 -55
- package/lib/Types/Label.d.ts +0 -35
- package/lib/Types/LabelAssociation.d.ts +0 -29
- package/lib/Types/Message.d.ts +0 -273
- package/lib/Types/Newsletter.d.ts +0 -103
- package/lib/Types/Newsletter.js +0 -38
- package/lib/Types/Product.d.ts +0 -78
- package/lib/Types/Signal.d.ts +0 -57
- package/lib/Types/Socket.d.ts +0 -111
- package/lib/Types/State.d.ts +0 -27
- package/lib/Types/USync.d.ts +0 -25
- package/lib/Types/index.d.ts +0 -57
- 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/event-buffer.d.ts +0 -35
- package/lib/Utils/generics.d.ts +0 -92
- 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 -116
- package/lib/Utils/messages.d.ts +0 -77
- package/lib/Utils/noise-handler.d.ts +0 -21
- 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 -13
- package/lib/Utils/validate-connection.d.ts +0 -11
- package/lib/WABinary/constants.d.ts +0 -30
- package/lib/WABinary/decode.d.ts +0 -7
- package/lib/WABinary/encode.d.ts +0 -3
- package/lib/WABinary/generic-utils.d.ts +0 -17
- package/lib/WABinary/index.d.ts +0 -5
- package/lib/WABinary/jid-utils.d.ts +0 -31
- package/lib/WABinary/types.d.ts +0 -18
- package/lib/WAM/BinaryInfo.d.ts +0 -17
- package/lib/WAM/constants.d.ts +0 -38
- package/lib/WAM/encode.d.ts +0 -3
- package/lib/WAM/index.d.ts +0 -3
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -9
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -22
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -12
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -12
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -25
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -8
- package/lib/WAUSync/Protocols/index.d.ts +0 -4
- package/lib/WAUSync/USyncQuery.d.ts +0 -28
- package/lib/WAUSync/USyncUser.d.ts +0 -12
- package/lib/index.d.ts +0 -12
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { LRUCache } from 'lru-cache';
|
|
2
|
+
import { isHostedPnUser, isLidUser, isPnUser, jidDecode, jidNormalizedUser, WAJIDDomains } from '../WABinary/index.js';
|
|
3
|
+
export class LIDMappingStore {
|
|
4
|
+
constructor(keys, logger, pnToLIDFunc) {
|
|
5
|
+
this.mappingCache = new LRUCache({
|
|
6
|
+
ttl: 3 * 24 * 60 * 60 * 1000, // 7 days
|
|
7
|
+
ttlAutopurge: true,
|
|
8
|
+
updateAgeOnGet: true
|
|
9
|
+
});
|
|
10
|
+
this.inflightLIDLookups = new Map();
|
|
11
|
+
this.inflightPNLookups = new Map();
|
|
12
|
+
this.keys = keys;
|
|
13
|
+
this.pnToLIDFunc = pnToLIDFunc;
|
|
14
|
+
this.logger = logger;
|
|
15
|
+
}
|
|
16
|
+
async storeLIDPNMappings(pairs) {
|
|
17
|
+
if (pairs.length === 0)
|
|
18
|
+
return;
|
|
19
|
+
const validatedPairs = [];
|
|
20
|
+
for (const { lid, pn } of pairs) {
|
|
21
|
+
if (!((isLidUser(lid) && isPnUser(pn)) || (isPnUser(lid) && isLidUser(pn)))) {
|
|
22
|
+
this.logger.warn(`Invalid LID-PN mapping: ${lid}, ${pn}`);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const lidDecoded = jidDecode(lid);
|
|
26
|
+
const pnDecoded = jidDecode(pn);
|
|
27
|
+
if (!lidDecoded || !pnDecoded)
|
|
28
|
+
continue;
|
|
29
|
+
validatedPairs.push({ pnUser: pnDecoded.user, lidUser: lidDecoded.user });
|
|
30
|
+
}
|
|
31
|
+
if (validatedPairs.length === 0)
|
|
32
|
+
return;
|
|
33
|
+
const cacheMissSet = new Set();
|
|
34
|
+
const existingMappings = new Map();
|
|
35
|
+
for (const { pnUser } of validatedPairs) {
|
|
36
|
+
const cached = this.mappingCache.get(`pn:${pnUser}`);
|
|
37
|
+
if (cached) {
|
|
38
|
+
existingMappings.set(pnUser, cached);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
cacheMissSet.add(pnUser);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (cacheMissSet.size > 0) {
|
|
45
|
+
const cacheMisses = [...cacheMissSet];
|
|
46
|
+
this.logger.trace(`Batch fetching ${cacheMisses.length} LID mappings from database`);
|
|
47
|
+
const stored = await this.keys.get('lid-mapping', cacheMisses);
|
|
48
|
+
for (const pnUser of cacheMisses) {
|
|
49
|
+
const existingLidUser = stored[pnUser];
|
|
50
|
+
if (existingLidUser) {
|
|
51
|
+
existingMappings.set(pnUser, existingLidUser);
|
|
52
|
+
this.mappingCache.set(`pn:${pnUser}`, existingLidUser);
|
|
53
|
+
this.mappingCache.set(`lid:${existingLidUser}`, pnUser);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const pairMap = {};
|
|
58
|
+
for (const { pnUser, lidUser } of validatedPairs) {
|
|
59
|
+
const existingLidUser = existingMappings.get(pnUser);
|
|
60
|
+
if (existingLidUser === lidUser) {
|
|
61
|
+
this.logger.debug({ pnUser, lidUser }, 'LID mapping already exists, skipping');
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
pairMap[pnUser] = lidUser;
|
|
65
|
+
}
|
|
66
|
+
if (Object.keys(pairMap).length === 0)
|
|
67
|
+
return;
|
|
68
|
+
this.logger.trace({ pairMap }, `Storing ${Object.keys(pairMap).length} pn mappings`);
|
|
69
|
+
const batchData = {};
|
|
70
|
+
for (const [pnUser, lidUser] of Object.entries(pairMap)) {
|
|
71
|
+
batchData[pnUser] = lidUser;
|
|
72
|
+
batchData[`${lidUser}_reverse`] = pnUser;
|
|
73
|
+
}
|
|
74
|
+
await this.keys.transaction(async () => {
|
|
75
|
+
await this.keys.set({ 'lid-mapping': batchData });
|
|
76
|
+
}, 'lid-mapping');
|
|
77
|
+
// Update cache after successful DB write
|
|
78
|
+
for (const [pnUser, lidUser] of Object.entries(pairMap)) {
|
|
79
|
+
this.mappingCache.set(`pn:${pnUser}`, lidUser);
|
|
80
|
+
this.mappingCache.set(`lid:${lidUser}`, pnUser);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async getLIDForPN(pn) {
|
|
84
|
+
return (await this.getLIDsForPNs([pn]))?.[0]?.lid || null;
|
|
85
|
+
}
|
|
86
|
+
async getLIDsForPNs(pns) {
|
|
87
|
+
if (pns.length === 0)
|
|
88
|
+
return null;
|
|
89
|
+
const sortedPns = [...new Set(pns)].sort();
|
|
90
|
+
const cacheKey = sortedPns.join(',');
|
|
91
|
+
const inflight = this.inflightLIDLookups.get(cacheKey);
|
|
92
|
+
if (inflight) {
|
|
93
|
+
this.logger.trace(`Coalescing getLIDsForPNs request for ${sortedPns.length} PNs`);
|
|
94
|
+
return inflight;
|
|
95
|
+
}
|
|
96
|
+
const promise = this._getLIDsForPNsImpl(pns);
|
|
97
|
+
this.inflightLIDLookups.set(cacheKey, promise);
|
|
98
|
+
try {
|
|
99
|
+
return await promise;
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
this.inflightLIDLookups.delete(cacheKey);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async _getLIDsForPNsImpl(pns) {
|
|
106
|
+
const usyncFetch = {};
|
|
107
|
+
const successfulPairs = {};
|
|
108
|
+
const pending = [];
|
|
109
|
+
const addResolvedPair = (pn, decoded, lidUser) => {
|
|
110
|
+
const normalizedLidUser = lidUser.toString();
|
|
111
|
+
if (!normalizedLidUser) {
|
|
112
|
+
this.logger.warn(`Invalid or empty LID user for PN ${pn}: lidUser = "${lidUser}"`);
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
// Push the PN device ID to the LID to maintain device separation
|
|
116
|
+
const pnDevice = decoded.device !== undefined ? decoded.device : 0;
|
|
117
|
+
const deviceSpecificLid = `${normalizedLidUser}${!!pnDevice ? `:${pnDevice}` : ``}@${decoded.server === 'hosted' ? 'hosted.lid' : 'lid'}`;
|
|
118
|
+
this.logger.trace(`getLIDForPN: ${pn} → ${deviceSpecificLid} (user mapping with device ${pnDevice})`);
|
|
119
|
+
successfulPairs[pn] = { lid: deviceSpecificLid, pn };
|
|
120
|
+
return true;
|
|
121
|
+
};
|
|
122
|
+
for (const pn of pns) {
|
|
123
|
+
if (!isPnUser(pn) && !isHostedPnUser(pn))
|
|
124
|
+
continue;
|
|
125
|
+
const decoded = jidDecode(pn);
|
|
126
|
+
if (!decoded)
|
|
127
|
+
continue;
|
|
128
|
+
const pnUser = decoded.user;
|
|
129
|
+
const cached = this.mappingCache.get(`pn:${pnUser}`);
|
|
130
|
+
if (cached && typeof cached === 'string') {
|
|
131
|
+
if (!addResolvedPair(pn, decoded, cached)) {
|
|
132
|
+
this.logger.warn(`Invalid entry for ${pn} (pair not resolved)`);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
pending.push({ pn, pnUser, decoded });
|
|
138
|
+
}
|
|
139
|
+
if (pending.length) {
|
|
140
|
+
const pnUsers = [...new Set(pending.map(item => item.pnUser))];
|
|
141
|
+
const stored = await this.keys.get('lid-mapping', pnUsers);
|
|
142
|
+
for (const pnUser of pnUsers) {
|
|
143
|
+
const lidUser = stored[pnUser];
|
|
144
|
+
if (lidUser && typeof lidUser === 'string') {
|
|
145
|
+
this.mappingCache.set(`pn:${pnUser}`, lidUser);
|
|
146
|
+
this.mappingCache.set(`lid:${lidUser}`, pnUser);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
for (const { pn, pnUser, decoded } of pending) {
|
|
150
|
+
const cached = this.mappingCache.get(`pn:${pnUser}`);
|
|
151
|
+
if (cached && typeof cached === 'string') {
|
|
152
|
+
if (!addResolvedPair(pn, decoded, cached)) {
|
|
153
|
+
this.logger.warn(`Invalid entry for ${pn} (pair not resolved)`);
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
this.logger.trace(`No LID mapping found for PN user ${pnUser}; batch getting from USync`);
|
|
159
|
+
const device = decoded.device || 0;
|
|
160
|
+
let normalizedPn = jidNormalizedUser(pn);
|
|
161
|
+
if (isHostedPnUser(normalizedPn)) {
|
|
162
|
+
normalizedPn = `${pnUser}@s.whatsapp.net`;
|
|
163
|
+
}
|
|
164
|
+
if (!usyncFetch[normalizedPn]) {
|
|
165
|
+
usyncFetch[normalizedPn] = [device];
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
usyncFetch[normalizedPn]?.push(device);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (Object.keys(usyncFetch).length > 0) {
|
|
174
|
+
const result = await this.pnToLIDFunc?.(Object.keys(usyncFetch)); // this function already adds LIDs to mapping
|
|
175
|
+
if (result && result.length > 0) {
|
|
176
|
+
await this.storeLIDPNMappings(result);
|
|
177
|
+
for (const pair of result) {
|
|
178
|
+
const pnDecoded = jidDecode(pair.pn);
|
|
179
|
+
const pnUser = pnDecoded?.user;
|
|
180
|
+
if (!pnUser)
|
|
181
|
+
continue;
|
|
182
|
+
const lidUser = jidDecode(pair.lid)?.user;
|
|
183
|
+
if (!lidUser)
|
|
184
|
+
continue;
|
|
185
|
+
for (const device of usyncFetch[pair.pn]) {
|
|
186
|
+
const deviceSpecificLid = `${lidUser}${!!device ? `:${device}` : ``}@${device === 99 ? 'hosted.lid' : 'lid'}`;
|
|
187
|
+
this.logger.trace(`getLIDForPN: USYNC success for ${pair.pn} → ${deviceSpecificLid} (user mapping with device ${device})`);
|
|
188
|
+
const deviceSpecificPn = `${pnUser}${!!device ? `:${device}` : ``}@${device === 99 ? 'hosted' : 's.whatsapp.net'}`;
|
|
189
|
+
successfulPairs[deviceSpecificPn] = { lid: deviceSpecificLid, pn: deviceSpecificPn };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
this.logger.warn('USync fetch yielded no results for pending PNs');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return Object.values(successfulPairs).length > 0 ? Object.values(successfulPairs) : null;
|
|
198
|
+
}
|
|
199
|
+
async getPNForLID(lid) {
|
|
200
|
+
return (await this.getPNsForLIDs([lid]))?.[0]?.pn || null;
|
|
201
|
+
}
|
|
202
|
+
async getPNsForLIDs(lids) {
|
|
203
|
+
if (lids.length === 0)
|
|
204
|
+
return null;
|
|
205
|
+
const sortedLids = [...new Set(lids)].sort();
|
|
206
|
+
const cacheKey = sortedLids.join(',');
|
|
207
|
+
const inflight = this.inflightPNLookups.get(cacheKey);
|
|
208
|
+
if (inflight) {
|
|
209
|
+
this.logger.trace(`Coalescing getPNsForLIDs request for ${sortedLids.length} LIDs`);
|
|
210
|
+
return inflight;
|
|
211
|
+
}
|
|
212
|
+
const promise = this._getPNsForLIDsImpl(lids);
|
|
213
|
+
this.inflightPNLookups.set(cacheKey, promise);
|
|
214
|
+
try {
|
|
215
|
+
return await promise;
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
this.inflightPNLookups.delete(cacheKey);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async _getPNsForLIDsImpl(lids) {
|
|
222
|
+
const successfulPairs = {};
|
|
223
|
+
const pending = [];
|
|
224
|
+
const addResolvedPair = (lid, decoded, pnUser) => {
|
|
225
|
+
if (!pnUser || typeof pnUser !== 'string') {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
const lidDevice = decoded.device !== undefined ? decoded.device : 0;
|
|
229
|
+
const pnJid = `${pnUser}:${lidDevice}@${decoded.domainType === WAJIDDomains.HOSTED_LID ? 'hosted' : 's.whatsapp.net'}`;
|
|
230
|
+
this.logger.trace(`Found reverse mapping: ${lid} → ${pnJid}`);
|
|
231
|
+
successfulPairs[lid] = { lid, pn: pnJid };
|
|
232
|
+
return true;
|
|
233
|
+
};
|
|
234
|
+
for (const lid of lids) {
|
|
235
|
+
if (!isLidUser(lid))
|
|
236
|
+
continue;
|
|
237
|
+
const decoded = jidDecode(lid);
|
|
238
|
+
if (!decoded)
|
|
239
|
+
continue;
|
|
240
|
+
const lidUser = decoded.user;
|
|
241
|
+
const cached = this.mappingCache.get(`lid:${lidUser}`);
|
|
242
|
+
if (cached && typeof cached === 'string') {
|
|
243
|
+
addResolvedPair(lid, decoded, cached);
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
pending.push({ lid, lidUser, decoded });
|
|
247
|
+
}
|
|
248
|
+
if (pending.length) {
|
|
249
|
+
const reverseKeys = [...new Set(pending.map(item => `${item.lidUser}_reverse`))];
|
|
250
|
+
const stored = await this.keys.get('lid-mapping', reverseKeys);
|
|
251
|
+
for (const { lid, lidUser, decoded } of pending) {
|
|
252
|
+
let pnUser = this.mappingCache.get(`lid:${lidUser}`);
|
|
253
|
+
if (!pnUser || typeof pnUser !== 'string') {
|
|
254
|
+
pnUser = stored[`${lidUser}_reverse`];
|
|
255
|
+
if (pnUser && typeof pnUser === 'string') {
|
|
256
|
+
this.mappingCache.set(`lid:${lidUser}`, pnUser);
|
|
257
|
+
this.mappingCache.set(`pn:${pnUser}`, lidUser);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (pnUser && typeof pnUser === 'string') {
|
|
261
|
+
addResolvedPair(lid, decoded, pnUser);
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
this.logger.trace(`No reverse mapping found for LID user: ${lidUser}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return Object.values(successfulPairs).length ? Object.values(successfulPairs) : null;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Close the cache and release resources
|
|
272
|
+
*/
|
|
273
|
+
close() {
|
|
274
|
+
this.mappingCache.clear();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=lid-mapping.js.map
|
|
@@ -1,19 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./abstract-socket-client"), exports);
|
|
18
|
-
__exportStar(require("./mobile-socket-client"), exports);
|
|
19
|
-
__exportStar(require("./web-socket-client"), exports);
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export * from './websocket.js';
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { URL } from 'url';
|
|
3
|
+
export class AbstractSocketClient extends EventEmitter {
|
|
4
|
+
constructor(url, config) {
|
|
5
|
+
super();
|
|
6
|
+
this.url = url;
|
|
7
|
+
this.config = config;
|
|
8
|
+
this.setMaxListeners(0);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
|
+
import { DEFAULT_ORIGIN } from '../../Defaults/index.js';
|
|
3
|
+
import { AbstractSocketClient } from './types.js';
|
|
4
|
+
export class WebSocketClient extends AbstractSocketClient {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
this.socket = null;
|
|
8
|
+
}
|
|
9
|
+
get isOpen() {
|
|
10
|
+
return this.socket?.readyState === WebSocket.OPEN;
|
|
11
|
+
}
|
|
12
|
+
get isClosed() {
|
|
13
|
+
return this.socket === null || this.socket?.readyState === WebSocket.CLOSED;
|
|
14
|
+
}
|
|
15
|
+
get isClosing() {
|
|
16
|
+
return this.socket === null || this.socket?.readyState === WebSocket.CLOSING;
|
|
17
|
+
}
|
|
18
|
+
get isConnecting() {
|
|
19
|
+
return this.socket?.readyState === WebSocket.CONNECTING;
|
|
20
|
+
}
|
|
21
|
+
connect() {
|
|
22
|
+
if (this.socket) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
this.socket = new WebSocket(this.url, {
|
|
26
|
+
origin: DEFAULT_ORIGIN,
|
|
27
|
+
headers: this.config.options?.headers,
|
|
28
|
+
handshakeTimeout: this.config.connectTimeoutMs,
|
|
29
|
+
timeout: this.config.connectTimeoutMs,
|
|
30
|
+
agent: this.config.agent
|
|
31
|
+
});
|
|
32
|
+
this.socket.setMaxListeners(0);
|
|
33
|
+
const events = ['close', 'error', 'upgrade', 'message', 'open', 'ping', 'pong', 'unexpected-response'];
|
|
34
|
+
for (const event of events) {
|
|
35
|
+
this.socket?.on(event, (...args) => this.emit(event, ...args));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async close() {
|
|
39
|
+
if (!this.socket) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const closePromise = new Promise(resolve => {
|
|
43
|
+
this.socket?.once('close', resolve);
|
|
44
|
+
});
|
|
45
|
+
this.socket.close();
|
|
46
|
+
await closePromise;
|
|
47
|
+
this.socket = null;
|
|
48
|
+
}
|
|
49
|
+
send(str, cb) {
|
|
50
|
+
this.socket?.send(str, cb);
|
|
51
|
+
return Boolean(this.socket);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=websocket.js.map
|
package/lib/Socket/business.js
CHANGED
|
@@ -1,17 +1,134 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const makeBusinessSocket = (config) => {
|
|
9
|
-
const sock = (0, messages_recv_1.makeMessagesRecvSocket)(config);
|
|
1
|
+
import { getRawMediaUploadData } from '../Utils/index.js';
|
|
2
|
+
import { parseCatalogNode, parseCollectionsNode, parseOrderDetailsNode, parseProductNode, toProductNode, uploadingNecessaryImagesOfProduct } from '../Utils/business.js';
|
|
3
|
+
import { jidNormalizedUser, S_WHATSAPP_NET } from '../WABinary/index.js';
|
|
4
|
+
import { getBinaryNodeChild } from '../WABinary/generic-utils.js';
|
|
5
|
+
import { makeMessagesRecvSocket } from './messages-recv.js';
|
|
6
|
+
export const makeBusinessSocket = (config) => {
|
|
7
|
+
const sock = makeMessagesRecvSocket(config);
|
|
10
8
|
const { authState, query, waUploadToServer } = sock;
|
|
9
|
+
const updateBussinesProfile = async (args) => {
|
|
10
|
+
const node = [];
|
|
11
|
+
const simpleFields = ['address', 'email', 'description'];
|
|
12
|
+
node.push(...simpleFields
|
|
13
|
+
.filter(key => args[key] !== undefined && args[key] !== null)
|
|
14
|
+
.map(key => ({
|
|
15
|
+
tag: key,
|
|
16
|
+
attrs: {},
|
|
17
|
+
content: args[key]
|
|
18
|
+
})));
|
|
19
|
+
if (args.websites !== undefined) {
|
|
20
|
+
node.push(...args.websites.map(website => ({
|
|
21
|
+
tag: 'website',
|
|
22
|
+
attrs: {},
|
|
23
|
+
content: website
|
|
24
|
+
})));
|
|
25
|
+
}
|
|
26
|
+
if (args.hours !== undefined) {
|
|
27
|
+
node.push({
|
|
28
|
+
tag: 'business_hours',
|
|
29
|
+
attrs: { timezone: args.hours.timezone },
|
|
30
|
+
content: args.hours.days.map(dayConfig => {
|
|
31
|
+
const base = {
|
|
32
|
+
tag: 'business_hours_config',
|
|
33
|
+
attrs: {
|
|
34
|
+
day_of_week: dayConfig.day,
|
|
35
|
+
mode: dayConfig.mode
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
if (dayConfig.mode === 'specific_hours') {
|
|
39
|
+
return {
|
|
40
|
+
...base,
|
|
41
|
+
attrs: {
|
|
42
|
+
...base.attrs,
|
|
43
|
+
open_time: dayConfig.openTimeInMinutes,
|
|
44
|
+
close_time: dayConfig.closeTimeInMinutes
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return base;
|
|
49
|
+
})
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const result = await query({
|
|
53
|
+
tag: 'iq',
|
|
54
|
+
attrs: {
|
|
55
|
+
to: S_WHATSAPP_NET,
|
|
56
|
+
type: 'set',
|
|
57
|
+
xmlns: 'w:biz'
|
|
58
|
+
},
|
|
59
|
+
content: [
|
|
60
|
+
{
|
|
61
|
+
tag: 'business_profile',
|
|
62
|
+
attrs: {
|
|
63
|
+
v: '3',
|
|
64
|
+
mutation_type: 'delta'
|
|
65
|
+
},
|
|
66
|
+
content: node
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
});
|
|
70
|
+
return result;
|
|
71
|
+
};
|
|
72
|
+
const updateCoverPhoto = async (photo) => {
|
|
73
|
+
const { fileSha256, filePath } = await getRawMediaUploadData(photo, 'biz-cover-photo');
|
|
74
|
+
const fileSha256B64 = fileSha256.toString('base64');
|
|
75
|
+
const { meta_hmac, fbid, ts } = await waUploadToServer(filePath, {
|
|
76
|
+
fileEncSha256B64: fileSha256B64,
|
|
77
|
+
mediaType: 'biz-cover-photo'
|
|
78
|
+
});
|
|
79
|
+
await query({
|
|
80
|
+
tag: 'iq',
|
|
81
|
+
attrs: {
|
|
82
|
+
to: S_WHATSAPP_NET,
|
|
83
|
+
type: 'set',
|
|
84
|
+
xmlns: 'w:biz'
|
|
85
|
+
},
|
|
86
|
+
content: [
|
|
87
|
+
{
|
|
88
|
+
tag: 'business_profile',
|
|
89
|
+
attrs: {
|
|
90
|
+
v: '3',
|
|
91
|
+
mutation_type: 'delta'
|
|
92
|
+
},
|
|
93
|
+
content: [
|
|
94
|
+
{
|
|
95
|
+
tag: 'cover_photo',
|
|
96
|
+
attrs: { id: String(fbid), op: 'update', token: meta_hmac, ts: String(ts) }
|
|
97
|
+
}
|
|
98
|
+
]
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
});
|
|
102
|
+
return fbid;
|
|
103
|
+
};
|
|
104
|
+
const removeCoverPhoto = async (id) => {
|
|
105
|
+
return await query({
|
|
106
|
+
tag: 'iq',
|
|
107
|
+
attrs: {
|
|
108
|
+
to: S_WHATSAPP_NET,
|
|
109
|
+
type: 'set',
|
|
110
|
+
xmlns: 'w:biz'
|
|
111
|
+
},
|
|
112
|
+
content: [
|
|
113
|
+
{
|
|
114
|
+
tag: 'business_profile',
|
|
115
|
+
attrs: {
|
|
116
|
+
v: '3',
|
|
117
|
+
mutation_type: 'delta'
|
|
118
|
+
},
|
|
119
|
+
content: [
|
|
120
|
+
{
|
|
121
|
+
tag: 'cover_photo',
|
|
122
|
+
attrs: { op: 'delete', id }
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
});
|
|
128
|
+
};
|
|
11
129
|
const getCatalog = async ({ jid, limit, cursor }) => {
|
|
12
|
-
|
|
13
|
-
jid = jid
|
|
14
|
-
jid = (0, WABinary_1.jidNormalizedUser)(jid);
|
|
130
|
+
jid = jid || authState.creds.me?.id;
|
|
131
|
+
jid = jidNormalizedUser(jid);
|
|
15
132
|
const queryParamNodes = [
|
|
16
133
|
{
|
|
17
134
|
tag: 'limit',
|
|
@@ -27,7 +144,7 @@ const makeBusinessSocket = (config) => {
|
|
|
27
144
|
tag: 'height',
|
|
28
145
|
attrs: {},
|
|
29
146
|
content: Buffer.from('100')
|
|
30
|
-
}
|
|
147
|
+
}
|
|
31
148
|
];
|
|
32
149
|
if (cursor) {
|
|
33
150
|
queryParamNodes.push({
|
|
@@ -39,7 +156,7 @@ const makeBusinessSocket = (config) => {
|
|
|
39
156
|
const result = await query({
|
|
40
157
|
tag: 'iq',
|
|
41
158
|
attrs: {
|
|
42
|
-
to:
|
|
159
|
+
to: S_WHATSAPP_NET,
|
|
43
160
|
type: 'get',
|
|
44
161
|
xmlns: 'w:biz:catalog'
|
|
45
162
|
},
|
|
@@ -48,31 +165,30 @@ const makeBusinessSocket = (config) => {
|
|
|
48
165
|
tag: 'product_catalog',
|
|
49
166
|
attrs: {
|
|
50
167
|
jid,
|
|
51
|
-
|
|
168
|
+
allow_shop_source: 'true'
|
|
52
169
|
},
|
|
53
170
|
content: queryParamNodes
|
|
54
171
|
}
|
|
55
172
|
]
|
|
56
173
|
});
|
|
57
|
-
return
|
|
174
|
+
return parseCatalogNode(result);
|
|
58
175
|
};
|
|
59
176
|
const getCollections = async (jid, limit = 51) => {
|
|
60
|
-
|
|
61
|
-
jid = jid
|
|
62
|
-
jid = (0, WABinary_1.jidNormalizedUser)(jid);
|
|
177
|
+
jid = jid || authState.creds.me?.id;
|
|
178
|
+
jid = jidNormalizedUser(jid);
|
|
63
179
|
const result = await query({
|
|
64
180
|
tag: 'iq',
|
|
65
181
|
attrs: {
|
|
66
|
-
to:
|
|
182
|
+
to: S_WHATSAPP_NET,
|
|
67
183
|
type: 'get',
|
|
68
184
|
xmlns: 'w:biz:catalog',
|
|
69
|
-
|
|
185
|
+
smax_id: '35'
|
|
70
186
|
},
|
|
71
187
|
content: [
|
|
72
188
|
{
|
|
73
189
|
tag: 'collections',
|
|
74
190
|
attrs: {
|
|
75
|
-
|
|
191
|
+
biz_jid: jid
|
|
76
192
|
},
|
|
77
193
|
content: [
|
|
78
194
|
{
|
|
@@ -99,16 +215,16 @@ const makeBusinessSocket = (config) => {
|
|
|
99
215
|
}
|
|
100
216
|
]
|
|
101
217
|
});
|
|
102
|
-
return
|
|
218
|
+
return parseCollectionsNode(result);
|
|
103
219
|
};
|
|
104
220
|
const getOrderDetails = async (orderId, tokenBase64) => {
|
|
105
221
|
const result = await query({
|
|
106
222
|
tag: 'iq',
|
|
107
223
|
attrs: {
|
|
108
|
-
to:
|
|
224
|
+
to: S_WHATSAPP_NET,
|
|
109
225
|
type: 'get',
|
|
110
226
|
xmlns: 'fb:thrift_iq',
|
|
111
|
-
|
|
227
|
+
smax_id: '5'
|
|
112
228
|
},
|
|
113
229
|
content: [
|
|
114
230
|
{
|
|
@@ -143,15 +259,15 @@ const makeBusinessSocket = (config) => {
|
|
|
143
259
|
}
|
|
144
260
|
]
|
|
145
261
|
});
|
|
146
|
-
return
|
|
262
|
+
return parseOrderDetailsNode(result);
|
|
147
263
|
};
|
|
148
264
|
const productUpdate = async (productId, update) => {
|
|
149
|
-
update = await
|
|
150
|
-
const editNode =
|
|
265
|
+
update = await uploadingNecessaryImagesOfProduct(update, waUploadToServer);
|
|
266
|
+
const editNode = toProductNode(productId, update);
|
|
151
267
|
const result = await query({
|
|
152
268
|
tag: 'iq',
|
|
153
269
|
attrs: {
|
|
154
|
-
to:
|
|
270
|
+
to: S_WHATSAPP_NET,
|
|
155
271
|
type: 'set',
|
|
156
272
|
xmlns: 'w:biz:catalog'
|
|
157
273
|
},
|
|
@@ -175,19 +291,19 @@ const makeBusinessSocket = (config) => {
|
|
|
175
291
|
}
|
|
176
292
|
]
|
|
177
293
|
});
|
|
178
|
-
const productCatalogEditNode =
|
|
179
|
-
const productNode =
|
|
180
|
-
return
|
|
294
|
+
const productCatalogEditNode = getBinaryNodeChild(result, 'product_catalog_edit');
|
|
295
|
+
const productNode = getBinaryNodeChild(productCatalogEditNode, 'product');
|
|
296
|
+
return parseProductNode(productNode);
|
|
181
297
|
};
|
|
182
298
|
const productCreate = async (create) => {
|
|
183
299
|
// ensure isHidden is defined
|
|
184
300
|
create.isHidden = !!create.isHidden;
|
|
185
|
-
create = await
|
|
186
|
-
const createNode =
|
|
301
|
+
create = await uploadingNecessaryImagesOfProduct(create, waUploadToServer);
|
|
302
|
+
const createNode = toProductNode(undefined, create);
|
|
187
303
|
const result = await query({
|
|
188
304
|
tag: 'iq',
|
|
189
305
|
attrs: {
|
|
190
|
-
to:
|
|
306
|
+
to: S_WHATSAPP_NET,
|
|
191
307
|
type: 'set',
|
|
192
308
|
xmlns: 'w:biz:catalog'
|
|
193
309
|
},
|
|
@@ -211,15 +327,15 @@ const makeBusinessSocket = (config) => {
|
|
|
211
327
|
}
|
|
212
328
|
]
|
|
213
329
|
});
|
|
214
|
-
const productCatalogAddNode =
|
|
215
|
-
const productNode =
|
|
216
|
-
return
|
|
330
|
+
const productCatalogAddNode = getBinaryNodeChild(result, 'product_catalog_add');
|
|
331
|
+
const productNode = getBinaryNodeChild(productCatalogAddNode, 'product');
|
|
332
|
+
return parseProductNode(productNode);
|
|
217
333
|
};
|
|
218
334
|
const productDelete = async (productIds) => {
|
|
219
335
|
const result = await query({
|
|
220
336
|
tag: 'iq',
|
|
221
337
|
attrs: {
|
|
222
|
-
to:
|
|
338
|
+
to: S_WHATSAPP_NET,
|
|
223
339
|
type: 'set',
|
|
224
340
|
xmlns: 'w:biz:catalog'
|
|
225
341
|
},
|
|
@@ -241,9 +357,9 @@ const makeBusinessSocket = (config) => {
|
|
|
241
357
|
}
|
|
242
358
|
]
|
|
243
359
|
});
|
|
244
|
-
const productCatalogDelNode =
|
|
360
|
+
const productCatalogDelNode = getBinaryNodeChild(result, 'product_catalog_delete');
|
|
245
361
|
return {
|
|
246
|
-
deleted: +(
|
|
362
|
+
deleted: +(productCatalogDelNode?.attrs.deleted_count || 0)
|
|
247
363
|
};
|
|
248
364
|
};
|
|
249
365
|
return {
|
|
@@ -254,7 +370,10 @@ const makeBusinessSocket = (config) => {
|
|
|
254
370
|
getCollections,
|
|
255
371
|
productCreate,
|
|
256
372
|
productDelete,
|
|
257
|
-
productUpdate
|
|
373
|
+
productUpdate,
|
|
374
|
+
updateBussinesProfile,
|
|
375
|
+
updateCoverPhoto,
|
|
376
|
+
removeCoverPhoto
|
|
258
377
|
};
|
|
259
378
|
};
|
|
260
|
-
|
|
379
|
+
//# sourceMappingURL=business.js.map
|