@baileys-md/baileys 10.1.0 → 11.0.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 (122) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1303 -2
  3. package/WAProto/GenerateStatics.sh +3 -0
  4. package/WAProto/WAProto.proto +4633 -0
  5. package/WAProto/fix-imports.js +29 -0
  6. package/WAProto/index.js +13516 -4182
  7. package/lib/Defaults/baileys-version.js +1 -0
  8. package/lib/Defaults/index.js +51 -72
  9. package/lib/Signal/Group/ciphertext-message.js +12 -0
  10. package/lib/Signal/Group/group-session-builder.js +30 -0
  11. package/lib/Signal/Group/group_cipher.js +94 -0
  12. package/lib/Signal/Group/index.js +12 -0
  13. package/lib/Signal/Group/keyhelper.js +19 -0
  14. package/lib/Signal/Group/queue-job.js +54 -0
  15. package/lib/Signal/Group/sender-chain-key.js +32 -0
  16. package/lib/Signal/Group/sender-key-distribution-message.js +63 -0
  17. package/lib/Signal/Group/sender-key-message.js +67 -0
  18. package/lib/Signal/Group/sender-key-name.js +48 -0
  19. package/lib/Signal/Group/sender-key-record.js +50 -0
  20. package/lib/Signal/Group/sender-key-state.js +96 -0
  21. package/{WASignalGroup/sender_message_key.js → lib/Signal/Group/sender-message-key.js} +4 -16
  22. package/lib/Signal/libsignal.js +41 -61
  23. package/lib/Socket/Client/index.js +3 -19
  24. package/lib/Socket/Client/types.js +11 -0
  25. package/lib/Socket/Client/websocket.js +50 -0
  26. package/lib/Socket/business.js +37 -42
  27. package/lib/Socket/chats.js +194 -187
  28. package/lib/Socket/communities.js +351 -0
  29. package/lib/Socket/groups.js +87 -90
  30. package/lib/Socket/index.js +7 -8
  31. package/lib/Socket/messages-recv.js +360 -335
  32. package/lib/Socket/messages-send.js +156 -279
  33. package/lib/Socket/mex.js +42 -0
  34. package/lib/Socket/newsletter.js +144 -213
  35. package/lib/Socket/socket.js +128 -161
  36. package/lib/Socket/usync.js +19 -26
  37. package/lib/Types/Auth.js +2 -2
  38. package/lib/Types/Call.js +2 -2
  39. package/lib/Types/Chat.js +8 -4
  40. package/lib/Types/Contact.js +2 -2
  41. package/lib/Types/Events.js +2 -2
  42. package/lib/Types/GroupMetadata.js +2 -2
  43. package/lib/Types/Label.js +3 -5
  44. package/lib/Types/LabelAssociation.js +3 -5
  45. package/lib/Types/Message.js +7 -7
  46. package/lib/Types/Newsletter.js +30 -17
  47. package/lib/Types/Product.js +2 -2
  48. package/lib/Types/Signal.js +2 -2
  49. package/lib/Types/Socket.js +3 -2
  50. package/lib/Types/State.js +2 -2
  51. package/lib/Types/USync.js +2 -2
  52. package/lib/Types/index.js +15 -31
  53. package/lib/Utils/auth-utils.js +31 -47
  54. package/lib/Utils/baileys-event-stream.js +15 -22
  55. package/lib/Utils/business.js +66 -69
  56. package/lib/Utils/chat-utils.js +200 -195
  57. package/lib/Utils/crypto.js +70 -85
  58. package/lib/Utils/decode-wa-message.js +47 -51
  59. package/lib/Utils/event-buffer.js +36 -46
  60. package/lib/Utils/generics.js +116 -188
  61. package/lib/Utils/history.js +37 -46
  62. package/lib/Utils/index.js +19 -33
  63. package/lib/Utils/link-preview.js +14 -55
  64. package/lib/Utils/logger.js +3 -7
  65. package/lib/Utils/lt-hash.js +23 -26
  66. package/lib/{Store → Utils}/make-in-memory-store.js +19 -27
  67. package/lib/Utils/make-mutex.js +7 -10
  68. package/lib/{Store → Utils}/make-ordered-dictionary.js +1 -3
  69. package/lib/Utils/messages-media.js +236 -368
  70. package/lib/Utils/messages.js +278 -510
  71. package/lib/Utils/noise-handler.js +22 -31
  72. package/lib/{Store → Utils}/object-repository.js +1 -4
  73. package/lib/Utils/process-message.js +144 -148
  74. package/lib/Utils/signal.js +71 -64
  75. package/lib/Utils/use-multi-file-auth-state.js +112 -84
  76. package/lib/Utils/validate-connection.js +72 -115
  77. package/lib/WABinary/constants.js +1281 -20
  78. package/lib/WABinary/decode.js +15 -52
  79. package/lib/WABinary/encode.js +14 -48
  80. package/lib/WABinary/generic-utils.js +31 -39
  81. package/lib/WABinary/index.js +6 -21
  82. package/lib/WABinary/jid-utils.js +23 -40
  83. package/lib/WABinary/types.js +2 -2
  84. package/lib/WAM/BinaryInfo.js +2 -5
  85. package/lib/WAM/constants.js +2257 -2366
  86. package/lib/WAM/encode.js +17 -21
  87. package/lib/WAM/index.js +4 -19
  88. package/lib/WAUSync/Protocols/USyncContactProtocol.js +8 -11
  89. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +11 -14
  90. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +9 -12
  91. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +9 -13
  92. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +20 -22
  93. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +3 -6
  94. package/lib/WAUSync/Protocols/index.js +5 -20
  95. package/lib/WAUSync/USyncQuery.js +34 -32
  96. package/lib/WAUSync/USyncUser.js +2 -5
  97. package/lib/WAUSync/index.js +4 -19
  98. package/lib/index.js +11 -33
  99. package/package.json +25 -54
  100. package/WASignalGroup/GroupProtocol.js +0 -1697
  101. package/WASignalGroup/ciphertext_message.js +0 -16
  102. package/WASignalGroup/group_cipher.js +0 -120
  103. package/WASignalGroup/group_session_builder.js +0 -46
  104. package/WASignalGroup/index.js +0 -5
  105. package/WASignalGroup/keyhelper.js +0 -21
  106. package/WASignalGroup/protobufs.js +0 -3
  107. package/WASignalGroup/queue_job.js +0 -69
  108. package/WASignalGroup/sender_chain_key.js +0 -50
  109. package/WASignalGroup/sender_key_distribution_message.js +0 -78
  110. package/WASignalGroup/sender_key_message.js +0 -92
  111. package/WASignalGroup/sender_key_name.js +0 -70
  112. package/WASignalGroup/sender_key_record.js +0 -56
  113. package/WASignalGroup/sender_key_state.js +0 -129
  114. package/lib/Defaults/baileys-version.json +0 -3
  115. package/lib/Defaults/phonenumber-mcc.json +0 -223
  116. package/lib/Socket/Client/abstract-socket-client.js +0 -13
  117. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  118. package/lib/Socket/Client/web-socket-client.js +0 -62
  119. package/lib/Socket/registration.js +0 -166
  120. package/lib/Store/index.js +0 -8
  121. package/lib/Store/make-cache-manager-store.js +0 -83
  122. package/lib/Store/make-mongo-store.js +0 -567
@@ -1,96 +1,105 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getNextPreKeysNode = exports.getNextPreKeys = exports.extractDeviceJids = exports.parseAndInjectE2ESessions = exports.xmppPreKey = exports.xmppSignedPreKey = exports.generateOrGetPreKeys = exports.getPreKeys = exports.createSignalIdentity = void 0;
4
- const Defaults_1 = require("../Defaults");
5
- const WABinary_1 = require("../WABinary");
6
- const crypto_1 = require("./crypto");
7
- const generics_1 = require("./generics");
8
- const createSignalIdentity = (wid, accountSignatureKey) => {
1
+ import { KEY_BUNDLE_TYPE } from '../Defaults/index.js';
2
+ import { assertNodeErrorFree, getBinaryNodeChild, getBinaryNodeChildBuffer, getBinaryNodeChildren, getBinaryNodeChildUInt, jidDecode, S_WHATSAPP_NET } from '../WABinary/index.js';
3
+ import { Curve, generateSignalPubKey } from './crypto.js';
4
+ import { encodeBigEndian } from './generics.js';
5
+ function chunk(array, size) {
6
+ const chunks = [];
7
+ for (let i = 0; i < array.length; i += size) {
8
+ chunks.push(array.slice(i, i + size));
9
+ }
10
+ return chunks;
11
+ }
12
+ export const createSignalIdentity = (wid, accountSignatureKey) => {
9
13
  return {
10
14
  identifier: { name: wid, deviceId: 0 },
11
- identifierKey: (0, crypto_1.generateSignalPubKey)(accountSignatureKey)
15
+ identifierKey: generateSignalPubKey(accountSignatureKey)
12
16
  };
13
17
  };
14
- exports.createSignalIdentity = createSignalIdentity;
15
- const getPreKeys = async ({ get }, min, limit) => {
18
+ export const getPreKeys = async ({ get }, min, limit) => {
16
19
  const idList = [];
17
20
  for (let id = min; id < limit; id++) {
18
21
  idList.push(id.toString());
19
22
  }
20
23
  return get('pre-key', idList);
21
24
  };
22
- exports.getPreKeys = getPreKeys;
23
- const generateOrGetPreKeys = (creds, range) => {
25
+ export const generateOrGetPreKeys = (creds, range) => {
24
26
  const avaliable = creds.nextPreKeyId - creds.firstUnuploadedPreKeyId;
25
27
  const remaining = range - avaliable;
26
28
  const lastPreKeyId = creds.nextPreKeyId + remaining - 1;
27
29
  const newPreKeys = {};
28
30
  if (remaining > 0) {
29
31
  for (let i = creds.nextPreKeyId; i <= lastPreKeyId; i++) {
30
- newPreKeys[i] = crypto_1.Curve.generateKeyPair();
32
+ newPreKeys[i] = Curve.generateKeyPair();
31
33
  }
32
34
  }
33
35
  return {
34
36
  newPreKeys,
35
37
  lastPreKeyId,
36
- preKeysRange: [creds.firstUnuploadedPreKeyId, range],
38
+ preKeysRange: [creds.firstUnuploadedPreKeyId, range]
37
39
  };
38
40
  };
39
- exports.generateOrGetPreKeys = generateOrGetPreKeys;
40
- const xmppSignedPreKey = (key) => ({
41
+ export const xmppSignedPreKey = (key) => ({
41
42
  tag: 'skey',
42
43
  attrs: {},
43
44
  content: [
44
- { tag: 'id', attrs: {}, content: (0, generics_1.encodeBigEndian)(key.keyId, 3) },
45
+ { tag: 'id', attrs: {}, content: encodeBigEndian(key.keyId, 3) },
45
46
  { tag: 'value', attrs: {}, content: key.keyPair.public },
46
47
  { tag: 'signature', attrs: {}, content: key.signature }
47
48
  ]
48
49
  });
49
- exports.xmppSignedPreKey = xmppSignedPreKey;
50
- const xmppPreKey = (pair, id) => ({
50
+ export const xmppPreKey = (pair, id) => ({
51
51
  tag: 'key',
52
52
  attrs: {},
53
53
  content: [
54
- { tag: 'id', attrs: {}, content: (0, generics_1.encodeBigEndian)(id, 3) },
54
+ { tag: 'id', attrs: {}, content: encodeBigEndian(id, 3) },
55
55
  { tag: 'value', attrs: {}, content: pair.public }
56
56
  ]
57
57
  });
58
- exports.xmppPreKey = xmppPreKey;
59
- const parseAndInjectE2ESessions = async (node, repository) => {
60
- const extractKey = (key) => (key ? ({
61
- keyId: (0, WABinary_1.getBinaryNodeChildUInt)(key, 'id', 3),
62
- publicKey: (0, crypto_1.generateSignalPubKey)((0, WABinary_1.getBinaryNodeChildBuffer)(key, 'value')),
63
- signature: (0, WABinary_1.getBinaryNodeChildBuffer)(key, 'signature'),
64
- }) : undefined);
65
- const nodes = (0, WABinary_1.getBinaryNodeChildren)((0, WABinary_1.getBinaryNodeChild)(node, 'list'), 'user');
58
+ export const parseAndInjectE2ESessions = async (node, repository) => {
59
+ const extractKey = (key) => key
60
+ ? {
61
+ keyId: getBinaryNodeChildUInt(key, 'id', 3),
62
+ publicKey: generateSignalPubKey(getBinaryNodeChildBuffer(key, 'value')),
63
+ signature: getBinaryNodeChildBuffer(key, 'signature')
64
+ }
65
+ : undefined;
66
+ const nodes = getBinaryNodeChildren(getBinaryNodeChild(node, 'list'), 'user');
66
67
  for (const node of nodes) {
67
- (0, WABinary_1.assertNodeErrorFree)(node);
68
+ assertNodeErrorFree(node);
69
+ }
70
+ // Most of the work in repository.injectE2ESession is CPU intensive, not IO
71
+ // So Promise.all doesn't really help here,
72
+ // but blocks even loop if we're using it inside keys.transaction, and it makes it "sync" actually
73
+ // This way we chunk it in smaller parts and between those parts we can yield to the event loop
74
+ // It's rare case when you need to E2E sessions for so many users, but it's possible
75
+ const chunkSize = 100;
76
+ const chunks = chunk(nodes, chunkSize);
77
+ for (const nodesChunk of chunks) {
78
+ await Promise.all(nodesChunk.map(async (node) => {
79
+ const signedKey = getBinaryNodeChild(node, 'skey');
80
+ const key = getBinaryNodeChild(node, 'key');
81
+ const identity = getBinaryNodeChildBuffer(node, 'identity');
82
+ const jid = node.attrs.jid;
83
+ const registrationId = getBinaryNodeChildUInt(node, 'registration', 4);
84
+ await repository.injectE2ESession({
85
+ jid,
86
+ session: {
87
+ registrationId: registrationId,
88
+ identityKey: generateSignalPubKey(identity),
89
+ signedPreKey: extractKey(signedKey),
90
+ preKey: extractKey(key)
91
+ }
92
+ });
93
+ }));
68
94
  }
69
- await Promise.all(nodes.map(async (node) => {
70
- const signedKey = (0, WABinary_1.getBinaryNodeChild)(node, 'skey');
71
- const key = (0, WABinary_1.getBinaryNodeChild)(node, 'key');
72
- const identity = (0, WABinary_1.getBinaryNodeChildBuffer)(node, 'identity');
73
- const jid = node.attrs.jid;
74
- const registrationId = (0, WABinary_1.getBinaryNodeChildUInt)(node, 'registration', 4);
75
- await repository.injectE2ESession({
76
- jid,
77
- session: {
78
- registrationId: registrationId,
79
- identityKey: (0, crypto_1.generateSignalPubKey)(identity),
80
- signedPreKey: extractKey(signedKey),
81
- preKey: extractKey(key)
82
- }
83
- });
84
- }));
85
95
  };
86
- exports.parseAndInjectE2ESessions = parseAndInjectE2ESessions;
87
- const extractDeviceJids = (result, myJid, excludeZeroDevices) => {
88
- const { user: myUser, device: myDevice } = (0, WABinary_1.jidDecode)(myJid);
96
+ export const extractDeviceJids = (result, myJid, excludeZeroDevices) => {
97
+ const { user: myUser, device: myDevice } = jidDecode(myJid);
89
98
  const extracted = [];
90
99
  for (const userResult of result) {
91
100
  const { devices, id } = userResult;
92
- const { user } = (0, WABinary_1.jidDecode)(id);
93
- const deviceList = devices === null || devices === void 0 ? void 0 : devices.deviceList;
101
+ const { user } = jidDecode(id);
102
+ const deviceList = devices?.deviceList;
94
103
  if (Array.isArray(deviceList)) {
95
104
  for (const { id: device, keyIndex } of deviceList) {
96
105
  if ((!excludeZeroDevices || device !== 0) && // if zero devices are not-excluded, or device is non zero
@@ -104,40 +113,38 @@ const extractDeviceJids = (result, myJid, excludeZeroDevices) => {
104
113
  }
105
114
  return extracted;
106
115
  };
107
- exports.extractDeviceJids = extractDeviceJids;
108
116
  /**
109
117
  * get the next N keys for upload or processing
110
118
  * @param count number of pre-keys to get or generate
111
119
  */
112
- const getNextPreKeys = async ({ creds, keys }, count) => {
113
- const { newPreKeys, lastPreKeyId, preKeysRange } = (0, exports.generateOrGetPreKeys)(creds, count);
120
+ export const getNextPreKeys = async ({ creds, keys }, count) => {
121
+ const { newPreKeys, lastPreKeyId, preKeysRange } = generateOrGetPreKeys(creds, count);
114
122
  const update = {
115
123
  nextPreKeyId: Math.max(lastPreKeyId + 1, creds.nextPreKeyId),
116
124
  firstUnuploadedPreKeyId: Math.max(creds.firstUnuploadedPreKeyId, lastPreKeyId + 1)
117
125
  };
118
126
  await keys.set({ 'pre-key': newPreKeys });
119
- const preKeys = await (0, exports.getPreKeys)(keys, preKeysRange[0], preKeysRange[0] + preKeysRange[1]);
127
+ const preKeys = await getPreKeys(keys, preKeysRange[0], preKeysRange[0] + preKeysRange[1]);
120
128
  return { update, preKeys };
121
129
  };
122
- exports.getNextPreKeys = getNextPreKeys;
123
- const getNextPreKeysNode = async (state, count) => {
130
+ export const getNextPreKeysNode = async (state, count) => {
124
131
  const { creds } = state;
125
- const { update, preKeys } = await (0, exports.getNextPreKeys)(state, count);
132
+ const { update, preKeys } = await getNextPreKeys(state, count);
126
133
  const node = {
127
134
  tag: 'iq',
128
135
  attrs: {
129
136
  xmlns: 'encrypt',
130
137
  type: 'set',
131
- to: WABinary_1.S_WHATSAPP_NET,
138
+ to: S_WHATSAPP_NET
132
139
  },
133
140
  content: [
134
- { tag: 'registration', attrs: {}, content: (0, generics_1.encodeBigEndian)(creds.registrationId) },
135
- { tag: 'type', attrs: {}, content: Defaults_1.KEY_BUNDLE_TYPE },
141
+ { tag: 'registration', attrs: {}, content: encodeBigEndian(creds.registrationId) },
142
+ { tag: 'type', attrs: {}, content: KEY_BUNDLE_TYPE },
136
143
  { tag: 'identity', attrs: {}, content: creds.signedIdentityKey.public },
137
- { tag: 'list', attrs: {}, content: Object.keys(preKeys).map(k => (0, exports.xmppPreKey)(preKeys[+k], +k)) },
138
- (0, exports.xmppSignedPreKey)(creds.signedPreKey)
144
+ { tag: 'list', attrs: {}, content: Object.keys(preKeys).map(k => xmppPreKey(preKeys[+k], +k)) },
145
+ xmppSignedPreKey(creds.signedPreKey)
139
146
  ]
140
147
  };
141
148
  return { update, node };
142
149
  };
143
- exports.getNextPreKeysNode = getNextPreKeysNode;
150
+ //# sourceMappingURL=signal.js.map
@@ -1,18 +1,23 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function(mod) {
3
- return (mod && mod.__esModule) ? mod : {
4
- "default": mod
5
- };
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';
7
+ // We need to lock files due to the fact that we are using async functions to read and write files
8
+ // https://github.com/WhiskeySockets/Baileys/issues/794
9
+ // https://github.com/nodejs/node/issues/26338
10
+ // Use a Map to store mutexes for each file path
11
+ const fileLocks = new Map();
12
+ // Get or create a mutex for a specific file path
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;
6
20
  };
7
- Object.defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
- exports.useMultiFileAuthState = void 0;
11
- const fs = require("fs");
12
- const path_1 = require("path");
13
- const WAProto_1 = require("../../WAProto");
14
- const auth_utils_1 = require("./auth-utils");
15
- const generics_1 = require("./generics");
16
21
  /**
17
22
  * stores the full authentication state in a single folder.
18
23
  * Far more efficient than singlefileauthstate
@@ -20,74 +25,97 @@ const generics_1 = require("./generics");
20
25
  * Again, I wouldn't endorse this for any production level use other than perhaps a bot.
21
26
  * Would recommend writing an auth state for use with a proper SQL or No-SQL DB
22
27
  * */
23
- const useMultiFileAuthState = async (folder) => {
24
- const writeData = async (data, file) => {
25
- const filePath = await (0, path_1.join)(folder, fixFileName(file));
26
- return (0, fs.writeFileSync)((0, path_1.join)(filePath), JSON.stringify(data, generics_1.BufferJSON.replacer));
27
- };
28
- const readData = async (file) => {
29
- try {
30
- const filePath = await (0, path_1.join)(folder, fixFileName(file));
31
- const data = (0, fs.readFileSync)(filePath, {
32
- encoding: 'utf-8'
33
- });
34
- return JSON.parse(data, generics_1.BufferJSON.reviver);
35
- } catch (e) {
36
- return null;
37
- }
38
- };
39
- const removeData = async (file) => {
40
- try {
41
- const filePath = await (0, path_1.join)(folder, fixFileName(file));
42
- (0, fs.unlinkSync)(filePath);
43
- } catch (_a) {}
44
- };
45
- try {
46
- const stats = fs.statSync(folder);
47
- if (!stats.isDirectory()) {
48
- throw new Error(`found something that is not a directory at ${folder}, either delete it or specify a different location`);
49
- }
50
- } catch (error) {
51
- fs.mkdirSync(folder, {
52
- recursive: true
53
- });
54
- }
55
- const fixFileName = (file) => {
56
- var _a;
57
- return (_a = file === null || file === void 0 ? void 0 : file.replace(/\//g, '__')) === null || _a === void 0 ? void 0 : _a.replace(/:/g, '-');
58
- };
59
- const creds = await readData('creds.json') || await (0, await auth_utils_1.initAuthCreds)();
60
- return {
61
- state: {
62
- creds,
63
- keys: {
64
- get: async (type, ids) => {
65
- const data = {};
66
- await Promise.all(ids.map(async (id) => {
67
- let value = await readData(`${type}-${id}.json`);
68
- if (type === 'app-state-sync-key' && value) {
69
- value = WAProto_1.proto.Message.AppStateSyncKeyData.fromObject(value);
70
- }
71
- data[id] = value;
72
- }));
73
- return data;
74
- },
75
- set: async (data) => {
76
- const tasks = [];
77
- for (const category in data) {
78
- for (const id in data[category]) {
79
- const value = data[category][id];
80
- const file = `${category}-${id}.json`;
81
- tasks.push(value ? await writeData(value, file) : await removeData(file));
82
- }
83
- }
84
- await Promise.all(tasks);
85
- }
86
- }
87
- },
88
- saveCreds: () => {
89
- return writeData(creds, 'creds.json');
90
- }
91
- };
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 = await join(folder, fixFileName(file));
32
+ const mutex = await getFileLock(filePath);
33
+ return await mutex.acquire().then(async (release) => {
34
+ try {
35
+ await writeFile(filePath, JSON.stringify(data, BufferJSON.replacer));
36
+ }
37
+ finally {
38
+ await 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 ? await writeData(value, file) : await removeData(file));
110
+ }
111
+ }
112
+ await Promise.all(tasks);
113
+ }
114
+ }
115
+ },
116
+ saveCreds: async () => {
117
+ return await writeData(creds, 'creds.json');
118
+ }
119
+ };
92
120
  };
93
- exports.useMultiFileAuthState = useMultiFileAuthState;
121
+ //# sourceMappingURL=use-multi-file-auth-state.js.map