@badzz88/baileys 8.5.7 → 8.5.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.
Files changed (142) hide show
  1. package/README.md +337 -1055
  2. package/WAProto/WAProto.proto +284 -264
  3. package/WAProto/index.js +5 -5
  4. package/engine-requirements.js +7 -15
  5. package/lib/Defaults/index.js +130 -187
  6. package/lib/Signal/Group/ciphertext-message.js +11 -14
  7. package/lib/Signal/Group/group-session-builder.js +29 -91
  8. package/lib/Signal/Group/group_cipher.js +81 -88
  9. package/lib/Signal/Group/index.js +12 -136
  10. package/lib/Signal/Group/keyhelper.js +15 -70
  11. package/lib/Signal/Group/sender-chain-key.js +25 -31
  12. package/lib/Signal/Group/sender-key-distribution-message.js +62 -65
  13. package/lib/Signal/Group/sender-key-message.js +65 -68
  14. package/lib/Signal/Group/sender-key-name.js +41 -43
  15. package/lib/Signal/Group/sender-key-record.js +40 -43
  16. package/lib/Signal/Group/sender-key-state.js +83 -96
  17. package/lib/Signal/Group/sender-message-key.js +25 -29
  18. package/lib/Signal/libsignal.js +425 -453
  19. package/lib/Signal/lid-mapping.js +276 -259
  20. package/lib/Socket/Client/index.js +3 -30
  21. package/lib/Socket/Client/types.js +10 -12
  22. package/lib/Socket/Client/websocket.js +53 -61
  23. package/lib/Socket/business.js +379 -422
  24. package/lib/Socket/chats.js +1193 -1816
  25. package/lib/Socket/communities.js +431 -549
  26. package/lib/Socket/graphql.js +672 -612
  27. package/lib/Socket/groups.js +374 -764
  28. package/lib/Socket/index.js +17 -38
  29. package/lib/Socket/interop.js +417 -503
  30. package/lib/Socket/messages-recv.js +1915 -2441
  31. package/lib/Socket/messages-send.js +1213 -1630
  32. package/lib/Socket/mex.js +9 -15
  33. package/lib/Socket/newsletter.js +746 -808
  34. package/lib/Socket/privacy.js +310 -441
  35. package/lib/Socket/socket.js +1025 -1022
  36. package/lib/Socket/username.js +8 -15
  37. package/lib/Store/index.js +10 -36
  38. package/lib/Store/make-cache-manager-store.js +80 -85
  39. package/lib/Store/make-in-memory-store.js +231 -591
  40. package/lib/Store/make-ordered-dictionary.js +72 -78
  41. package/lib/Store/object-repository.js +28 -25
  42. package/lib/Types/Auth.js +2 -38
  43. package/lib/Types/Bussines.js +2 -2
  44. package/lib/Types/Call.js +2 -2
  45. package/lib/Types/Chat.js +8 -4
  46. package/lib/Types/Contact.js +2 -2
  47. package/lib/Types/Events.js +2 -2
  48. package/lib/Types/GroupMetadata.js +2 -2
  49. package/lib/Types/Label.js +24 -26
  50. package/lib/Types/LabelAssociation.js +6 -8
  51. package/lib/Types/Message.js +11 -95
  52. package/lib/Types/Mex.js +111 -112
  53. package/lib/Types/Product.js +2 -2
  54. package/lib/Types/Signal.js +2 -2
  55. package/lib/Types/Socket.js +3 -2
  56. package/lib/Types/State.js +56 -70
  57. package/lib/Types/USync.js +2 -2
  58. package/lib/Types/index.js +26 -55
  59. package/lib/Utils/auth-utils.js +288 -292
  60. package/lib/Utils/browser-utils.js +47 -113
  61. package/lib/Utils/business.js +224 -240
  62. package/lib/Utils/chat-utils.js +869 -1205
  63. package/lib/Utils/companion-reg-client-utils.js +34 -41
  64. package/lib/Utils/crypto.js +107 -144
  65. package/lib/Utils/decode-wa-message.js +308 -518
  66. package/lib/Utils/event-buffer.js +611 -596
  67. package/lib/Utils/generics.js +355 -515
  68. package/lib/Utils/history.js +134 -244
  69. package/lib/Utils/identity-change-handler.js +49 -51
  70. package/lib/Utils/index.js +23 -57
  71. package/lib/Utils/link-preview.js +77 -135
  72. package/lib/Utils/logger.js +3 -9
  73. package/lib/Utils/lt-hash.js +6 -37
  74. package/lib/Utils/make-mutex.js +33 -36
  75. package/lib/Utils/message-composer.js +233 -439
  76. package/lib/Utils/message-retry-manager.js +260 -265
  77. package/lib/Utils/messages-media.js +829 -855
  78. package/lib/Utils/messages.js +961 -2528
  79. package/lib/Utils/noise-handler.js +200 -195
  80. package/lib/Utils/offline-node-processor.js +33 -35
  81. package/lib/Utils/pre-key-manager.js +102 -103
  82. package/lib/Utils/process-message.js +560 -978
  83. package/lib/Utils/reporting-utils.js +253 -257
  84. package/lib/Utils/signal.js +195 -218
  85. package/lib/Utils/stanza-ack.js +29 -31
  86. package/lib/Utils/sticker.js +109 -144
  87. package/lib/Utils/sync-action-utils.js +45 -50
  88. package/lib/Utils/tc-token-utils.js +139 -137
  89. package/lib/Utils/use-multi-file-auth-state.js +109 -109
  90. package/lib/Utils/validate-connection.js +202 -218
  91. package/lib/WABinary/constants.js +1299 -1302
  92. package/lib/WABinary/decode.js +262 -343
  93. package/lib/WABinary/encode.js +4 -12
  94. package/lib/WABinary/generic-utils.js +187 -223
  95. package/lib/WABinary/index.js +6 -33
  96. package/lib/WABinary/jid-utils.js +88 -351
  97. package/lib/WABinary/types.js +2 -2
  98. package/lib/WAM/BinaryInfo.js +9 -12
  99. package/lib/WAM/constants.js +22853 -39486
  100. package/lib/WAM/encode.js +140 -132
  101. package/lib/WAM/index.js +4 -31
  102. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +21 -23
  103. package/lib/WAUSync/Protocols/USyncBusinessProtocol.js +9 -9
  104. package/lib/WAUSync/Protocols/USyncContactProtocol.js +7 -7
  105. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +10 -10
  106. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +7 -7
  107. package/lib/WAUSync/Protocols/USyncFeatureProtocol.js +11 -12
  108. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +4 -5
  109. package/lib/WAUSync/Protocols/USyncPictureProtocol.js +7 -7
  110. package/lib/WAUSync/Protocols/USyncSidelistProtocol.js +7 -8
  111. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +7 -7
  112. package/lib/WAUSync/Protocols/USyncTextStatusProtocol.js +8 -8
  113. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +7 -7
  114. package/lib/WAUSync/Protocols/index.js +12 -39
  115. package/lib/WAUSync/USyncQuery.js +67 -49
  116. package/lib/WAUSync/USyncUser.js +11 -5
  117. package/lib/WAUSync/index.js +3 -31
  118. package/lib/index.js +15 -48
  119. package/package.json +129 -99
  120. package/LICENSE +0 -21
  121. package/lib/Defaults/phonenumber-mcc.json +0 -223
  122. package/lib/Socket/aigroups.js +0 -240
  123. package/lib/Socket/interactive-handler.js +0 -522
  124. package/lib/Socket/managed-account.js +0 -183
  125. package/lib/Socket/registration.js +0 -427
  126. package/lib/Socket/text-router.js +0 -83
  127. package/lib/Types/Newsletter.js +0 -121
  128. package/lib/Utils/command-loader.d.ts +0 -31
  129. package/lib/Utils/command-loader.js +0 -100
  130. package/lib/Utils/consumer-application.js +0 -107
  131. package/lib/Utils/curve25519-js.js +0 -275
  132. package/lib/Utils/group-history.js +0 -60
  133. package/lib/Utils/jid-display-normalization.js +0 -218
  134. package/lib/Utils/meta-ai-msmsg.js +0 -262
  135. package/lib/Utils/native-bridge.js +0 -82
  136. package/lib/Utils/session-pool.d.ts +0 -16
  137. package/lib/Utils/session-pool.js +0 -94
  138. package/lib/Utils/sticker.d.ts +0 -17
  139. package/lib/Utils/view-once-cache.d.ts +0 -9
  140. package/lib/Utils/view-once-cache.js +0 -79
  141. package/lib/Utils/voip-rekey.js +0 -22
  142. package/lib/antiban.js +0 -4637
@@ -1,18 +1,7 @@
1
- 'use strict'
2
- Object.defineProperty(exports, '__esModule', { value: true })
3
- exports.TC_TOKEN_INDEX_KEY = void 0
4
- exports.readTcTokenIndex = readTcTokenIndex
5
- exports.buildMergedTcTokenIndexWrite = buildMergedTcTokenIndexWrite
6
- exports.isTcTokenExpired = isTcTokenExpired
7
- exports.shouldSendNewTcToken = shouldSendNewTcToken
8
- exports.resolveTcTokenJid = resolveTcTokenJid
9
- exports.resolveIssuanceJid = resolveIssuanceJid
10
- exports.buildTcTokenFromJid = buildTcTokenFromJid
11
- exports.storeTcTokensFromIqResult = storeTcTokensFromIqResult
12
- const WABinary_1 = require('../WABinary')
1
+ import { getBinaryNodeChild, getBinaryNodeChildren, isHostedLidUser, isHostedPnUser, isJidMetaAI, isLidUser, isPnUser, jidNormalizedUser } from '../WABinary/index.js';
13
2
  // Same phone-number pattern as WABinary's isJidBot, applied against the user
14
3
  // part so the check is invariant to @c.us ↔ @s.whatsapp.net normalization.
15
- const BOT_PHONE_REGEX = /^1313555\d{4}$|^131655500\d{2}$/
4
+ const BOT_PHONE_REGEX = /^1313555\d{4}$|^131655500\d{2}$/;
16
5
  /**
17
6
  * Mirrors WA Web's `Wid.isRegularUser()` (user ∧ ¬PSA ∧ ¬Bot). Used to gate tctoken
18
7
  * storage against malformed notifications — WA Web filters server-side but we
@@ -20,142 +9,155 @@ const BOT_PHONE_REGEX = /^1313555\d{4}$|^131655500\d{2}$/
20
9
  * Works for both pre- and post-normalized JIDs (`@c.us` vs `@s.whatsapp.net`).
21
10
  */
22
11
  function isRegularUser(jid) {
23
- if (!jid) return false
24
- const user = jid.split('@')[0] ?? ''
25
- if (user === '0') return false // PSA
26
- if (BOT_PHONE_REGEX.test(user)) return false // Bot by phone pattern
27
- if ((0, WABinary_1.isJidMetaAI)(jid)) return false // MetaAI (@bot server)
28
- return !!(
29
- (0, WABinary_1.isPnUser)(jid) ||
30
- (0, WABinary_1.isLidUser)(jid) ||
31
- (0, WABinary_1.isHostedPnUser)(jid) ||
32
- (0, WABinary_1.isHostedLidUser)(jid) ||
33
- jid.endsWith('@c.us')
34
- )
12
+ if (!jid)
13
+ return false;
14
+ const user = jid.split('@')[0] ?? '';
15
+ if (user === '0')
16
+ return false; // PSA
17
+ if (BOT_PHONE_REGEX.test(user))
18
+ return false; // Bot by phone pattern
19
+ if (isJidMetaAI(jid))
20
+ return false; // MetaAI (@bot server)
21
+ return !!(isPnUser(jid) || isLidUser(jid) || isHostedPnUser(jid) || isHostedLidUser(jid) || jid.endsWith('@c.us'));
35
22
  }
36
- const TC_TOKEN_BUCKET_DURATION = 604800 // 7 days
37
- const TC_TOKEN_NUM_BUCKETS = 4 // ~28-day rolling window
23
+ const TC_TOKEN_BUCKET_DURATION = 604800; // 7 days
24
+ const TC_TOKEN_NUM_BUCKETS = 4; // ~28-day rolling window
38
25
  /** Sentinel key under `tctoken` store holding a JSON array of tracked storage JIDs for cross-session pruning. */
39
- exports.TC_TOKEN_INDEX_KEY = '__index'
26
+ export const TC_TOKEN_INDEX_KEY = '__index';
40
27
  /** Read the persisted tctoken JID index and return its entries (never contains the sentinel key itself). */
41
- async function readTcTokenIndex(keys) {
42
- const data = await keys.get('tctoken', [exports.TC_TOKEN_INDEX_KEY])
43
- const entry = data[exports.TC_TOKEN_INDEX_KEY]
44
- if (!entry?.token?.length) return []
45
- try {
46
- const parsed = JSON.parse(Buffer.from(entry.token).toString())
47
- if (!Array.isArray(parsed)) return []
48
- return parsed.filter(j => typeof j === 'string' && j.length > 0 && j !== exports.TC_TOKEN_INDEX_KEY)
49
- } catch {
50
- return []
51
- }
28
+ export async function readTcTokenIndex(keys) {
29
+ const data = await keys.get('tctoken', [TC_TOKEN_INDEX_KEY]);
30
+ const entry = data[TC_TOKEN_INDEX_KEY];
31
+ if (!entry?.token?.length)
32
+ return [];
33
+ try {
34
+ const parsed = JSON.parse(Buffer.from(entry.token).toString());
35
+ if (!Array.isArray(parsed))
36
+ return [];
37
+ return parsed.filter((j) => typeof j === 'string' && j.length > 0 && j !== TC_TOKEN_INDEX_KEY);
38
+ }
39
+ catch {
40
+ return [];
41
+ }
52
42
  }
53
43
  /** Build a SignalDataSet fragment that writes the merged index (persisted ∪ added) under the sentinel key. */
54
- async function buildMergedTcTokenIndexWrite(keys, addedJids) {
55
- const persisted = await readTcTokenIndex(keys)
56
- const merged = new Set(persisted)
57
- for (const jid of addedJids) {
58
- if (jid && jid !== exports.TC_TOKEN_INDEX_KEY) merged.add(jid)
59
- }
60
- return {
61
- [exports.TC_TOKEN_INDEX_KEY]: { token: Buffer.from(JSON.stringify([...merged])) }
62
- }
44
+ export async function buildMergedTcTokenIndexWrite(keys, addedJids) {
45
+ const persisted = await readTcTokenIndex(keys);
46
+ const merged = new Set(persisted);
47
+ for (const jid of addedJids) {
48
+ if (jid && jid !== TC_TOKEN_INDEX_KEY)
49
+ merged.add(jid);
50
+ }
51
+ return {
52
+ [TC_TOKEN_INDEX_KEY]: { token: Buffer.from(JSON.stringify([...merged])) }
53
+ };
63
54
  }
64
55
  // WA Web has separate sender/receiver AB props for these but they're identical today
65
- function isTcTokenExpired(timestamp) {
66
- if (timestamp === null || timestamp === undefined) return true
67
- const ts = typeof timestamp === 'string' ? parseInt(timestamp) : timestamp
68
- if (isNaN(ts)) return true
69
- const now = Math.floor(Date.now() / 1000)
70
- const currentBucket = Math.floor(now / TC_TOKEN_BUCKET_DURATION)
71
- const cutoffBucket = currentBucket - (TC_TOKEN_NUM_BUCKETS - 1)
72
- const cutoffTimestamp = cutoffBucket * TC_TOKEN_BUCKET_DURATION
73
- return ts < cutoffTimestamp
56
+ export function isTcTokenExpired(timestamp) {
57
+ if (timestamp === null || timestamp === undefined)
58
+ return true;
59
+ const ts = typeof timestamp === 'string' ? parseInt(timestamp) : timestamp;
60
+ if (isNaN(ts))
61
+ return true;
62
+ const now = Math.floor(Date.now() / 1000);
63
+ const currentBucket = Math.floor(now / TC_TOKEN_BUCKET_DURATION);
64
+ const cutoffBucket = currentBucket - (TC_TOKEN_NUM_BUCKETS - 1);
65
+ const cutoffTimestamp = cutoffBucket * TC_TOKEN_BUCKET_DURATION;
66
+ return ts < cutoffTimestamp;
74
67
  }
75
- function shouldSendNewTcToken(senderTimestamp) {
76
- if (senderTimestamp === undefined) return true
77
- const now = Math.floor(Date.now() / 1000)
78
- const currentBucket = Math.floor(now / TC_TOKEN_BUCKET_DURATION)
79
- const senderBucket = Math.floor(senderTimestamp / TC_TOKEN_BUCKET_DURATION)
80
- return currentBucket > senderBucket
68
+ export function shouldSendNewTcToken(senderTimestamp) {
69
+ if (senderTimestamp === undefined)
70
+ return true;
71
+ const now = Math.floor(Date.now() / 1000);
72
+ const currentBucket = Math.floor(now / TC_TOKEN_BUCKET_DURATION);
73
+ const senderBucket = Math.floor(senderTimestamp / TC_TOKEN_BUCKET_DURATION);
74
+ return currentBucket > senderBucket;
81
75
  }
82
76
  /** Resolve JID to LID for tctoken storage (WA Web stores under LID) */
83
- async function resolveTcTokenJid(jid, getLIDForPN) {
84
- if ((0, WABinary_1.isLidUser)(jid)) return jid
85
- const lid = await getLIDForPN(jid)
86
- return lid ?? jid
77
+ export async function resolveTcTokenJid(jid, getLIDForPN) {
78
+ if (isLidUser(jid))
79
+ return jid;
80
+ const lid = await getLIDForPN(jid);
81
+ return lid ?? jid;
87
82
  }
88
83
  /** Resolve target JID for issuing privacy token based on AB prop 14303 */
89
- async function resolveIssuanceJid(jid, issueToLid, getLIDForPN, getPNForLID) {
90
- if (issueToLid) {
91
- if ((0, WABinary_1.isLidUser)(jid)) return jid
92
- const lid = await getLIDForPN(jid)
93
- return lid ?? jid
94
- }
95
- if (!(0, WABinary_1.isLidUser)(jid)) return jid
96
- if (getPNForLID) {
97
- const pn = await getPNForLID(jid)
98
- return pn ?? jid
99
- }
100
- return jid
84
+ export async function resolveIssuanceJid(jid, issueToLid, getLIDForPN, getPNForLID) {
85
+ if (issueToLid) {
86
+ if (isLidUser(jid))
87
+ return jid;
88
+ const lid = await getLIDForPN(jid);
89
+ return lid ?? jid;
90
+ }
91
+ if (!isLidUser(jid))
92
+ return jid;
93
+ if (getPNForLID) {
94
+ const pn = await getPNForLID(jid);
95
+ return pn ?? jid;
96
+ }
97
+ return jid;
101
98
  }
102
- async function buildTcTokenFromJid({ authState, jid, baseContent = [], getLIDForPN }) {
103
- try {
104
- const storageJid = await resolveTcTokenJid(jid, getLIDForPN)
105
- const tcTokenData = await authState.keys.get('tctoken', [storageJid])
106
- const entry = tcTokenData?.[storageJid]
107
- const tcTokenBuffer = entry?.token
108
- if (!tcTokenBuffer?.length || isTcTokenExpired(entry?.timestamp)) {
109
- if (tcTokenBuffer) {
110
- // Preserve senderTimestamp so shouldSendNewTcToken() keeps its dedupe state
111
- // after we drop the unusable peer token. Only wipe the record entirely when
112
- // there's nothing worth keeping.
113
- const cleared =
114
- entry?.senderTimestamp !== undefined
115
- ? { token: Buffer.alloc(0), senderTimestamp: entry.senderTimestamp }
116
- : null
117
- await authState.keys.set({ tctoken: { [storageJid]: cleared } })
118
- }
119
- return baseContent.length > 0 ? baseContent : undefined
120
- }
121
- baseContent.push({
122
- tag: 'tctoken',
123
- attrs: {},
124
- content: tcTokenBuffer
125
- })
126
- return baseContent
127
- } catch (error) {
128
- return baseContent.length > 0 ? baseContent : undefined
129
- }
99
+ export async function buildTcTokenFromJid({ authState, jid, baseContent = [], getLIDForPN }) {
100
+ try {
101
+ const storageJid = await resolveTcTokenJid(jid, getLIDForPN);
102
+ const tcTokenData = await authState.keys.get('tctoken', [storageJid]);
103
+ const entry = tcTokenData?.[storageJid];
104
+ const tcTokenBuffer = entry?.token;
105
+ if (!tcTokenBuffer?.length || isTcTokenExpired(entry?.timestamp)) {
106
+ if (tcTokenBuffer) {
107
+ // Preserve senderTimestamp so shouldSendNewTcToken() keeps its dedupe state
108
+ // after we drop the unusable peer token. Only wipe the record entirely when
109
+ // there's nothing worth keeping.
110
+ const cleared = entry?.senderTimestamp !== undefined
111
+ ? { token: Buffer.alloc(0), senderTimestamp: entry.senderTimestamp }
112
+ : null;
113
+ await authState.keys.set({ tctoken: { [storageJid]: cleared } });
114
+ }
115
+ return baseContent.length > 0 ? baseContent : undefined;
116
+ }
117
+ baseContent.push({
118
+ tag: 'tctoken',
119
+ attrs: {},
120
+ content: tcTokenBuffer
121
+ });
122
+ return baseContent;
123
+ }
124
+ catch (error) {
125
+ return baseContent.length > 0 ? baseContent : undefined;
126
+ }
130
127
  }
131
- async function storeTcTokensFromIqResult({ result, fallbackJid, keys, getLIDForPN, onNewJidStored }) {
132
- const tokensNode = (0, WABinary_1.getBinaryNodeChild)(result, 'tokens')
133
- if (!tokensNode) return
134
- const tokenNodes = (0, WABinary_1.getBinaryNodeChildren)(tokensNode, 'token')
135
- for (const tokenNode of tokenNodes) {
136
- if (tokenNode.attrs.type !== 'trusted_contact' || !(tokenNode.content instanceof Uint8Array)) {
137
- continue
138
- }
139
- // In notifications tokenNode.attrs.jid is your own device JID, not the sender's
140
- const rawJid = (0, WABinary_1.jidNormalizedUser)(fallbackJid || tokenNode.attrs.jid)
141
- if (!isRegularUser(rawJid)) continue
142
- const storageJid = await resolveTcTokenJid(rawJid, getLIDForPN)
143
- const existingTcData = await keys.get('tctoken', [storageJid])
144
- const existingEntry = existingTcData[storageJid]
145
- const existingTs = existingEntry?.timestamp ? Number(existingEntry.timestamp) : 0
146
- const incomingTs = tokenNode.attrs.t ? Number(tokenNode.attrs.t) : 0
147
- // timestamp-less tokens would be immediately expired
148
- if (!incomingTs) continue
149
- if (existingTs > 0 && existingTs > incomingTs) continue
150
- await keys.set({
151
- tctoken: {
152
- [storageJid]: {
153
- ...existingEntry,
154
- token: Buffer.from(tokenNode.content),
155
- timestamp: tokenNode.attrs.t
156
- }
157
- }
158
- })
159
- onNewJidStored?.(storageJid)
160
- }
128
+ export async function storeTcTokensFromIqResult({ result, fallbackJid, keys, getLIDForPN, onNewJidStored }) {
129
+ const tokensNode = getBinaryNodeChild(result, 'tokens');
130
+ if (!tokensNode)
131
+ return;
132
+ const tokenNodes = getBinaryNodeChildren(tokensNode, 'token');
133
+ for (const tokenNode of tokenNodes) {
134
+ if (tokenNode.attrs.type !== 'trusted_contact' || !(tokenNode.content instanceof Uint8Array)) {
135
+ continue;
136
+ }
137
+ // In notifications tokenNode.attrs.jid is your own device JID, not the sender's
138
+ const rawJid = jidNormalizedUser(fallbackJid || tokenNode.attrs.jid);
139
+ if (!isRegularUser(rawJid))
140
+ continue;
141
+ const storageJid = await resolveTcTokenJid(rawJid, getLIDForPN);
142
+ const existingTcData = await keys.get('tctoken', [storageJid]);
143
+ const existingEntry = existingTcData[storageJid];
144
+ const existingTs = existingEntry?.timestamp ? Number(existingEntry.timestamp) : 0;
145
+ const incomingTs = tokenNode.attrs.t ? Number(tokenNode.attrs.t) : 0;
146
+ // timestamp-less tokens would be immediately expired
147
+ if (!incomingTs)
148
+ continue;
149
+ if (existingTs > 0 && existingTs > incomingTs)
150
+ continue;
151
+ await keys.set({
152
+ tctoken: {
153
+ [storageJid]: {
154
+ ...existingEntry,
155
+ token: Buffer.from(tokenNode.content),
156
+ timestamp: tokenNode.attrs.t
157
+ }
158
+ }
159
+ });
160
+ onNewJidStored?.(storageJid);
161
+ }
161
162
  }
163
+ //# sourceMappingURL=tc-token-utils.js.map
@@ -1,26 +1,23 @@
1
- 'use strict'
2
- Object.defineProperty(exports, '__esModule', { value: true })
3
- exports.useMultiFileAuthState = void 0
4
- const async_mutex_1 = require('async-mutex')
5
- const promises_1 = require('fs/promises')
6
- const path_1 = require('path')
7
- const index_js_1 = require('../../WAProto/index.js')
8
- const auth_utils_1 = require('./auth-utils')
9
- const generics_1 = require('./generics')
1
+ import { Mutex } from 'async-mutex';
2
+ import { mkdir, readFile, stat, unlink, writeFile } from 'fs/promises';
3
+ import { join } from 'path';
4
+ import { proto } from '../../WAProto/index.js';
5
+ import { initAuthCreds } from './auth-utils.js';
6
+ import { BufferJSON } from './generics.js';
10
7
  // We need to lock files due to the fact that we are using async functions to read and write files
11
8
  // https://github.com/WhiskeySockets/Baileys/issues/794
12
9
  // https://github.com/nodejs/node/issues/26338
13
10
  // Use a Map to store mutexes for each file path
14
- const fileLocks = new Map()
11
+ const fileLocks = new Map();
15
12
  // Get or create a mutex for a specific file path
16
- const getFileLock = path => {
17
- let mutex = fileLocks.get(path)
18
- if (!mutex) {
19
- mutex = new async_mutex_1.Mutex()
20
- fileLocks.set(path, mutex)
21
- }
22
- return mutex
23
- }
13
+ const getFileLock = (path) => {
14
+ let mutex = fileLocks.get(path);
15
+ if (!mutex) {
16
+ mutex = new Mutex();
17
+ fileLocks.set(path, mutex);
18
+ }
19
+ return mutex;
20
+ };
24
21
  /**
25
22
  * stores the full authentication state in a single folder.
26
23
  * Far more efficient than singlefileauthstate
@@ -28,94 +25,97 @@ const getFileLock = path => {
28
25
  * Again, I wouldn't endorse this for any production level use other than perhaps a bot.
29
26
  * Would recommend writing an auth state for use with a proper SQL or No-SQL DB
30
27
  * */
31
- const useMultiFileAuthState = async folder => {
32
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
- const writeData = async (data, file) => {
34
- const filePath = (0, path_1.join)(folder, fixFileName(file))
35
- const mutex = getFileLock(filePath)
36
- return mutex.acquire().then(async release => {
37
- try {
38
- await (0, promises_1.writeFile)(filePath, JSON.stringify(data, generics_1.BufferJSON.replacer))
39
- } finally {
40
- release()
41
- }
42
- })
43
- }
44
- const readData = async file => {
45
- try {
46
- const filePath = (0, path_1.join)(folder, fixFileName(file))
47
- const mutex = getFileLock(filePath)
48
- return await mutex.acquire().then(async release => {
49
- try {
50
- const data = await (0, promises_1.readFile)(filePath, { encoding: 'utf-8' })
51
- return JSON.parse(data, generics_1.BufferJSON.reviver)
52
- } finally {
53
- release()
54
- }
55
- })
56
- } catch (error) {
57
- return null
58
- }
59
- }
60
- const removeData = async file => {
61
- try {
62
- const filePath = (0, path_1.join)(folder, fixFileName(file))
63
- const mutex = getFileLock(filePath)
64
- return mutex.acquire().then(async release => {
65
- try {
66
- await (0, promises_1.unlink)(filePath)
67
- } catch {
68
- } finally {
69
- release()
70
- }
71
- })
72
- } catch {}
73
- }
74
- const folderInfo = await (0, promises_1.stat)(folder).catch(() => {})
75
- if (folderInfo) {
76
- if (!folderInfo.isDirectory()) {
77
- throw new Error(
78
- `found something that is not a directory at ${folder}, either delete it or specify a different location`
79
- )
80
- }
81
- } else {
82
- await (0, promises_1.mkdir)(folder, { recursive: true })
83
- }
84
- const fixFileName = file => file?.replace(/\//g, '__')?.replace(/:/g, '-')
85
- const creds = (await readData('creds.json')) || (0, auth_utils_1.initAuthCreds)()
86
- return {
87
- state: {
88
- creds,
89
- keys: {
90
- get: async (type, ids) => {
91
- const data = {}
92
- await Promise.all(
93
- ids.map(async id => {
94
- let value = await readData(`${type}-${id}.json`)
95
- if (type === 'app-state-sync-key' && value) {
96
- value = index_js_1.proto.Message.AppStateSyncKeyData.fromObject(value)
97
- }
98
- data[id] = value
99
- })
100
- )
101
- return data
102
- },
103
- set: async data => {
104
- const tasks = []
105
- for (const category in data) {
106
- for (const id in data[category]) {
107
- const value = data[category][id]
108
- const file = `${category}-${id}.json`
109
- tasks.push(value ? writeData(value, file) : removeData(file))
110
- }
111
- }
112
- await Promise.all(tasks)
113
- }
114
- }
115
- },
116
- saveCreds: async () => {
117
- return writeData(creds, 'creds.json')
118
- }
119
- }
120
- }
121
- exports.useMultiFileAuthState = useMultiFileAuthState
28
+ export const useMultiFileAuthState = async (folder) => {
29
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
+ const writeData = async (data, file) => {
31
+ const filePath = join(folder, fixFileName(file));
32
+ const mutex = getFileLock(filePath);
33
+ return mutex.acquire().then(async (release) => {
34
+ try {
35
+ await writeFile(filePath, JSON.stringify(data, BufferJSON.replacer));
36
+ }
37
+ finally {
38
+ release();
39
+ }
40
+ });
41
+ };
42
+ const readData = async (file) => {
43
+ try {
44
+ const filePath = join(folder, fixFileName(file));
45
+ const mutex = getFileLock(filePath);
46
+ return await mutex.acquire().then(async (release) => {
47
+ try {
48
+ const data = await readFile(filePath, { encoding: 'utf-8' });
49
+ return JSON.parse(data, BufferJSON.reviver);
50
+ }
51
+ finally {
52
+ release();
53
+ }
54
+ });
55
+ }
56
+ catch (error) {
57
+ return null;
58
+ }
59
+ };
60
+ const removeData = async (file) => {
61
+ try {
62
+ const filePath = join(folder, fixFileName(file));
63
+ const mutex = getFileLock(filePath);
64
+ return mutex.acquire().then(async (release) => {
65
+ try {
66
+ await unlink(filePath);
67
+ }
68
+ catch {
69
+ }
70
+ finally {
71
+ release();
72
+ }
73
+ });
74
+ }
75
+ catch { }
76
+ };
77
+ const folderInfo = await stat(folder).catch(() => { });
78
+ if (folderInfo) {
79
+ if (!folderInfo.isDirectory()) {
80
+ throw new Error(`found something that is not a directory at ${folder}, either delete it or specify a different location`);
81
+ }
82
+ }
83
+ else {
84
+ await mkdir(folder, { recursive: true });
85
+ }
86
+ const fixFileName = (file) => file?.replace(/\//g, '__')?.replace(/:/g, '-');
87
+ const creds = (await readData('creds.json')) || initAuthCreds();
88
+ return {
89
+ state: {
90
+ creds,
91
+ keys: {
92
+ get: async (type, ids) => {
93
+ const data = {};
94
+ await Promise.all(ids.map(async (id) => {
95
+ let value = await readData(`${type}-${id}.json`);
96
+ if (type === 'app-state-sync-key' && value) {
97
+ value = proto.Message.AppStateSyncKeyData.fromObject(value);
98
+ }
99
+ data[id] = value;
100
+ }));
101
+ return data;
102
+ },
103
+ set: async (data) => {
104
+ const tasks = [];
105
+ for (const category in data) {
106
+ for (const id in data[category]) {
107
+ const value = data[category][id];
108
+ const file = `${category}-${id}.json`;
109
+ tasks.push(value ? writeData(value, file) : removeData(file));
110
+ }
111
+ }
112
+ await Promise.all(tasks);
113
+ }
114
+ }
115
+ },
116
+ saveCreds: async () => {
117
+ return writeData(creds, 'creds.json');
118
+ }
119
+ };
120
+ };
121
+ //# sourceMappingURL=use-multi-file-auth-state.js.map