@whiskeysockets/baileys
Version:
WhatsApp API
94 lines (93 loc) • 4.12 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.useMultiFileAuthState = void 0;
const async_lock_1 = __importDefault(require("async-lock"));
const promises_1 = require("fs/promises");
const path_1 = require("path");
const WAProto_1 = require("../../WAProto");
const auth_utils_1 = require("./auth-utils");
const generics_1 = require("./generics");
// We need to lock files due to the fact that we are using async functions to read and write files
// https://github.com/WhiskeySockets/Baileys/issues/794
// https://github.com/nodejs/node/issues/26338
// Default pending is 1000, set it to infinity
// https://github.com/rogierschouten/async-lock/issues/63
const fileLock = new async_lock_1.default({ maxPending: Infinity });
/**
* stores the full authentication state in a single folder.
* Far more efficient than singlefileauthstate
*
* Again, I wouldn't endorse this for any production level use other than perhaps a bot.
* Would recommend writing an auth state for use with a proper SQL or No-SQL DB
* */
const useMultiFileAuthState = async (folder) => {
const writeData = (data, file) => {
const filePath = (0, path_1.join)(folder, fixFileName(file));
return fileLock.acquire(filePath, () => (0, promises_1.writeFile)((0, path_1.join)(filePath), JSON.stringify(data, generics_1.BufferJSON.replacer)));
};
const readData = async (file) => {
try {
const filePath = (0, path_1.join)(folder, fixFileName(file));
const data = await fileLock.acquire(filePath, () => (0, promises_1.readFile)(filePath, { encoding: 'utf-8' }));
return JSON.parse(data, generics_1.BufferJSON.reviver);
}
catch (error) {
return null;
}
};
const removeData = async (file) => {
try {
const filePath = (0, path_1.join)(folder, fixFileName(file));
await fileLock.acquire(filePath, () => (0, promises_1.unlink)(filePath));
}
catch (_a) {
}
};
const folderInfo = await (0, promises_1.stat)(folder).catch(() => { });
if (folderInfo) {
if (!folderInfo.isDirectory()) {
throw new Error(`found something that is not a directory at ${folder}, either delete it or specify a different location`);
}
}
else {
await (0, promises_1.mkdir)(folder, { recursive: true });
}
const fixFileName = (file) => { var _a; return (_a = file === null || file === void 0 ? void 0 : file.replace(/\//g, '__')) === null || _a === void 0 ? void 0 : _a.replace(/:/g, '-'); };
const creds = await readData('creds.json') || (0, auth_utils_1.initAuthCreds)();
return {
state: {
creds,
keys: {
get: async (type, ids) => {
const data = {};
await Promise.all(ids.map(async (id) => {
let value = await readData(`${type}-${id}.json`);
if (type === 'app-state-sync-key' && value) {
value = WAProto_1.proto.Message.AppStateSyncKeyData.fromObject(value);
}
data[id] = value;
}));
return data;
},
set: async (data) => {
const tasks = [];
for (const category in data) {
for (const id in data[category]) {
const value = data[category][id];
const file = `${category}-${id}.json`;
tasks.push(value ? writeData(value, file) : removeData(file));
}
}
await Promise.all(tasks);
}
}
},
saveCreds: () => {
return writeData(creds, 'creds.json');
}
};
};
exports.useMultiFileAuthState = useMultiFileAuthState;
;