Path: blob/master/node_modules/@adiwajshing/baileys/lib/Utils/auth-utils.js
2593 views
"use strict";1Object.defineProperty(exports, "__esModule", { value: true });2exports.useSingleFileAuthState = exports.initAuthCreds = exports.addTransactionCapability = void 0;3const boom_1 = require("@hapi/boom");4const crypto_1 = require("crypto");5const WAProto_1 = require("../../WAProto");6const crypto_2 = require("./crypto");7const generics_1 = require("./generics");8const KEY_MAP = {9'pre-key': 'preKeys',10'session': 'sessions',11'sender-key': 'senderKeys',12'app-state-sync-key': 'appStateSyncKeys',13'app-state-sync-version': 'appStateVersions',14'sender-key-memory': 'senderKeyMemory'15};16const addTransactionCapability = (state, logger) => {17let inTransaction = false;18let transactionCache = {};19let mutations = {};20const prefetch = async (type, ids) => {21if (!inTransaction) {22throw new boom_1.Boom('Cannot prefetch without transaction');23}24const dict = transactionCache[type];25const idsRequiringFetch = dict ? ids.filter(item => !(item in dict)) : ids;26// only fetch if there are any items to fetch27if (idsRequiringFetch.length) {28const result = await state.get(type, idsRequiringFetch);29transactionCache[type] = transactionCache[type] || {};30Object.assign(transactionCache[type], result);31}32};33return {34get: async (type, ids) => {35if (inTransaction) {36await prefetch(type, ids);37return ids.reduce((dict, id) => {38var _a;39const value = (_a = transactionCache[type]) === null || _a === void 0 ? void 0 : _a[id];40if (value) {41dict[id] = value;42}43return dict;44}, {});45}46else {47return state.get(type, ids);48}49},50set: data => {51if (inTransaction) {52logger.trace({ types: Object.keys(data) }, 'caching in transaction');53for (const key in data) {54transactionCache[key] = transactionCache[key] || {};55Object.assign(transactionCache[key], data[key]);56mutations[key] = mutations[key] || {};57Object.assign(mutations[key], data[key]);58}59}60else {61return state.set(data);62}63},64isInTransaction: () => inTransaction,65prefetch: (type, ids) => {66logger.trace({ type, ids }, 'prefetching');67return prefetch(type, ids);68},69transaction: async (work) => {70if (inTransaction) {71await work();72}73else {74logger.debug('entering transaction');75inTransaction = true;76try {77await work();78if (Object.keys(mutations).length) {79logger.debug('committing transaction');80await state.set(mutations);81}82else {83logger.debug('no mutations in transaction');84}85}86finally {87inTransaction = false;88transactionCache = {};89mutations = {};90}91}92}93};94};95exports.addTransactionCapability = addTransactionCapability;96const initAuthCreds = () => {97const identityKey = crypto_2.Curve.generateKeyPair();98return {99noiseKey: crypto_2.Curve.generateKeyPair(),100signedIdentityKey: identityKey,101signedPreKey: crypto_2.signedKeyPair(identityKey, 1),102registrationId: generics_1.generateRegistrationId(),103advSecretKey: crypto_1.randomBytes(32).toString('base64'),104nextPreKeyId: 1,105firstUnuploadedPreKeyId: 1,106serverHasPreKeys: false107};108};109exports.initAuthCreds = initAuthCreds;110/** stores the full authentication state in a single JSON file */111const useSingleFileAuthState = (filename, logger) => {112// require fs here so that in case "fs" is not available -- the app does not crash113const { readFileSync, writeFileSync, existsSync } = require('fs');114let creds;115let keys = {};116// save the authentication state to a file117const saveState = () => {118logger && logger.trace('saving auth state');119writeFileSync(filename,120// BufferJSON replacer utility saves buffers nicely121JSON.stringify({ creds, keys }, generics_1.BufferJSON.replacer, 2));122};123if (existsSync(filename)) {124const result = JSON.parse(readFileSync(filename, { encoding: 'utf-8' }), generics_1.BufferJSON.reviver);125creds = result.creds;126keys = result.keys;127}128else {129creds = exports.initAuthCreds();130keys = {};131}132return {133state: {134creds,135keys: {136get: (type, ids) => {137const key = KEY_MAP[type];138return ids.reduce((dict, id) => {139var _a;140let value = (_a = keys[key]) === null || _a === void 0 ? void 0 : _a[id];141if (value) {142if (type === 'app-state-sync-key') {143value = WAProto_1.proto.AppStateSyncKeyData.fromObject(value);144}145dict[id] = value;146}147return dict;148}, {});149},150set: (data) => {151for (const _key in data) {152const key = KEY_MAP[_key];153keys[key] = keys[key] || {};154Object.assign(keys[key], data[_key]);155}156saveState();157}158}159},160saveState161};162};163exports.useSingleFileAuthState = useSingleFileAuthState;164165166