From 1a83a4c6d4f75adec117422318659decda0815f2 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Tue, 28 Sep 2021 19:33:21 +0530 Subject: [PATCH] nicer patch API --- src/Socket/chats.ts | 17 +++++------------ src/Types/Chat.ts | 7 +++++++ src/Utils/chat-utils.ts | 11 +++++------ 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/Socket/chats.ts b/src/Socket/chats.ts index 40ae97f..fd10bfc 100644 --- a/src/Socket/chats.ts +++ b/src/Socket/chats.ts @@ -1,9 +1,8 @@ import { encodeSyncdPatch, decodePatches, extractSyncdPatches } from "../Utils/chat-utils"; -import { SocketConfig, WAPresence, PresenceData, Chat, ChatModification, WAMediaUpload, ChatMutation, WAPatchName, LTHashState } from "../Types"; +import { SocketConfig, WAPresence, PresenceData, Chat, WAPatchCreate, WAMediaUpload, ChatMutation, WAPatchName, LTHashState } from "../Types"; import { BinaryNode, getBinaryNodeChild, getBinaryNodeChildren, jidNormalizedUser, S_WHATSAPP_NET } from "../WABinary"; import { proto } from '../../WAProto' import { generateProfilePicture, toNumber } from "../Utils"; -import { randomBytes } from "crypto"; import { makeMessagesRecvSocket } from "./messages-recv"; export const makeChatsSocket = (config: SocketConfig) => { @@ -327,18 +326,12 @@ export const makeChatsSocket = (config: SocketConfig) => { ev.emit('chats.update', updates) } - const appPatch = async( - syncAction: proto.ISyncActionValue, - index: [string, string], - name: WAPatchName, - operation: proto.SyncdMutation.SyncdMutationSyncdOperation.SET, - ) => { + const appPatch = async(patchCreate: WAPatchCreate) => { + const name = patchCreate.type + await resyncState(name, false) const { patch, state } = await encodeSyncdPatch( - syncAction, - index, - name, - operation, + patchCreate, authState, ) const initial = await authState.keys.getAppStateSyncVersion(name) diff --git a/src/Types/Chat.ts b/src/Types/Chat.ts index 8c872ef..8d2c320 100644 --- a/src/Types/Chat.ts +++ b/src/Types/Chat.ts @@ -12,6 +12,13 @@ export interface PresenceData { export type ChatMutation = { action: proto.ISyncActionValue, index: [string, string], indexMac: Uint8Array, valueMac: Uint8Array, operation: number } +export type WAPatchCreate = { + syncAction: proto.ISyncActionValue + index: [string, string] + type: WAPatchName + apiVersion: number +} + export type Chat = Omit & { /** unix timestamp of date when mute ends, if applicable */ mute?: number | null diff --git a/src/Utils/chat-utils.ts b/src/Utils/chat-utils.ts index bc2c60e..e78dd1e 100644 --- a/src/Utils/chat-utils.ts +++ b/src/Utils/chat-utils.ts @@ -1,6 +1,6 @@ import { Boom } from '@hapi/boom' import { aesDecrypt, hmacSign, aesEncrypt, hkdf } from "./crypto" -import { AuthenticationState, ChatModification, ChatMutation, WAPatchName, LTHashState } from "../Types" +import { AuthenticationState, WAPatchCreate, ChatMutation, WAPatchName, LTHashState } from "../Types" import { proto } from '../../WAProto' import { LT_HASH_ANTI_TAMPERING } from '../WABinary/LTHash' import { BinaryNode, getBinaryNodeChild, getBinaryNodeChildren } from '../WABinary' @@ -92,10 +92,7 @@ const generatePatchMac = (snapshotMac: Uint8Array, valueMacs: Uint8Array[], vers } export const encodeSyncdPatch = async( - syncAction: proto.ISyncActionValue, - index: [string, string], - type: WAPatchName, - operation: proto.SyncdMutation.SyncdMutationSyncdOperation, + { type, index, syncAction, apiVersion }: WAPatchCreate, { creds: { myAppStateKeyId }, keys }: AuthenticationState ) => { const key = !!myAppStateKeyId ? await keys.getAppStateSyncKey(myAppStateKeyId) : undefined @@ -104,6 +101,8 @@ export const encodeSyncdPatch = async( } const encKeyId = Buffer.from(myAppStateKeyId, 'base64') + const operation = proto.SyncdMutation.SyncdMutationSyncdOperation.SET + const state = { ...await keys.getAppStateSyncVersion(type) } const indexBuffer = Buffer.from(JSON.stringify(index)) @@ -111,7 +110,7 @@ export const encodeSyncdPatch = async( index: indexBuffer, value: syncAction, padding: new Uint8Array(0), - version: 2 + version: apiVersion }).finish() const keyValue = mutationKeys(key!.keyData!)