08793904e2
Surgical integration of WhiskeySockets/Baileys PR #2339 preserving all InfiniteAPI customizations (biz nodes, DSM skip, carousel, Prometheus, circuit breaker, LID mapping, CTWA recovery, identity debounce). Changes: - tc-token-utils.ts: rolling bucket expiration (28d/4 buckets), LID resolution, monotonicity guard, storeTcTokensFromIqResult parser - messages-send.ts: proactive fetch if missing/expired, fire-and-forget re-issuance on bucket boundary, getPrivacyTokens timestamp param - messages-recv.ts: persistent JID index for cross-session pruning, pruneExpiredTcTokens on connect (max 1x/24h), session_refreshed re-issuance, error 463/479 handling in handleBadAck - chats.ts: self-detection in profilePictureUrl, LID resolver in presenceSubscribe - socket.ts: granular stream error logging (device_removed, xml, ack) - Auth.ts: senderTimestamp field on tctoken type - Types/index.ts: sessionInvalidated = 516 disconnect reason - decode-wa-message.ts: SERVER_ERROR_CODES constant (463, 479, 421, 475) - generics.ts: enhanced getErrorCodeFromStreamError with device_removed - baileys-logger.ts: logTcToken function following [BAILEYS] prefix pattern Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
119 lines
3.1 KiB
TypeScript
119 lines
3.1 KiB
TypeScript
import type { proto } from '../../WAProto/index.js'
|
|
import type { Contact } from './Contact'
|
|
import type { MinimalMessage } from './Message'
|
|
|
|
export type KeyPair = { public: Uint8Array; private: Uint8Array }
|
|
export type SignedKeyPair = {
|
|
keyPair: KeyPair
|
|
signature: Uint8Array
|
|
keyId: number
|
|
timestampS?: number
|
|
}
|
|
|
|
export type ProtocolAddress = {
|
|
name: string // jid
|
|
deviceId: number
|
|
}
|
|
export type SignalIdentity = {
|
|
identifier: ProtocolAddress
|
|
identifierKey: Uint8Array
|
|
}
|
|
|
|
export type LIDMapping = {
|
|
pn: string
|
|
lid: string
|
|
}
|
|
|
|
export type LTHashState = {
|
|
version: number
|
|
hash: Buffer
|
|
indexValueMap: {
|
|
[indexMacBase64: string]: { valueMac: Uint8Array | Buffer }
|
|
}
|
|
}
|
|
|
|
export type SignalCreds = {
|
|
readonly signedIdentityKey: KeyPair
|
|
readonly signedPreKey: SignedKeyPair
|
|
readonly registrationId: number
|
|
}
|
|
|
|
export type AccountSettings = {
|
|
/** unarchive chats when a new message is received */
|
|
unarchiveChats: boolean
|
|
/** the default mode to start new conversations with */
|
|
defaultDisappearingMode?: Pick<proto.IConversation, 'ephemeralExpiration' | 'ephemeralSettingTimestamp'>
|
|
}
|
|
|
|
export type AuthenticationCreds = SignalCreds & {
|
|
readonly noiseKey: KeyPair
|
|
readonly pairingEphemeralKeyPair: KeyPair
|
|
advSecretKey: string
|
|
|
|
me?: Contact
|
|
account?: proto.IADVSignedDeviceIdentity
|
|
signalIdentities?: SignalIdentity[]
|
|
myAppStateKeyId?: string
|
|
firstUnuploadedPreKeyId: number
|
|
nextPreKeyId: number
|
|
|
|
lastAccountSyncTimestamp?: number
|
|
platform?: string
|
|
|
|
processedHistoryMessages: MinimalMessage[]
|
|
/** number of times history & app state has been synced */
|
|
accountSyncCounter: number
|
|
accountSettings: AccountSettings
|
|
registered: boolean
|
|
pairingCode: string | undefined
|
|
lastPropHash: string | undefined
|
|
routingInfo: Buffer | undefined
|
|
additionalData?: any | undefined
|
|
}
|
|
|
|
export type SignalDataTypeMap = {
|
|
'pre-key': KeyPair
|
|
session: Uint8Array
|
|
'sender-key': Uint8Array
|
|
'sender-key-memory': { [jid: string]: boolean }
|
|
'app-state-sync-key': proto.Message.IAppStateSyncKeyData
|
|
'app-state-sync-version': LTHashState
|
|
'lid-mapping': string
|
|
'device-list': string[]
|
|
tctoken: { token: Buffer; timestamp?: string; senderTimestamp?: number }
|
|
/** Identity key for Signal Protocol - used for detecting contact reinstalls */
|
|
'identity-key': Uint8Array
|
|
}
|
|
|
|
export type SignalDataSet = { [T in keyof SignalDataTypeMap]?: { [id: string]: SignalDataTypeMap[T] | null } }
|
|
|
|
type Awaitable<T> = T | Promise<T>
|
|
|
|
export type SignalKeyStore = {
|
|
get<T extends keyof SignalDataTypeMap>(type: T, ids: string[]): Awaitable<{ [id: string]: SignalDataTypeMap[T] }>
|
|
set(data: SignalDataSet): Awaitable<void>
|
|
/** clear all the data in the store */
|
|
clear?(): Awaitable<void>
|
|
}
|
|
|
|
export type SignalKeyStoreWithTransaction = SignalKeyStore & {
|
|
isInTransaction: () => boolean
|
|
transaction<T>(exec: () => Promise<T>, key: string): Promise<T>
|
|
destroy?: () => void
|
|
}
|
|
|
|
export type TransactionCapabilityOptions = {
|
|
maxCommitRetries: number
|
|
delayBetweenTriesMs: number
|
|
}
|
|
|
|
export type SignalAuthState = {
|
|
creds: SignalCreds
|
|
keys: SignalKeyStore | SignalKeyStoreWithTransaction
|
|
}
|
|
|
|
export type AuthenticationState = {
|
|
creds: AuthenticationCreds
|
|
keys: SignalKeyStore
|
|
}
|