@openclaw/crabline 0.1.18 → 0.1.20

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.
package/README.md CHANGED
@@ -49,6 +49,10 @@ The source checkout does not link its own `crabline` bin into
49
49
  `pnpm exec crabline`. An installed package exposes the `crabline` command used
50
50
  in the examples below.
51
51
 
52
+ Node.js consumers can bundle the package with its dependencies, including under
53
+ pnpm's isolated linker. WhatsApp's crypto dependency uses static imports so it
54
+ remains available when the bundle runs outside the original installation.
55
+
52
56
  ## Quality Gate
53
57
 
54
58
  ```bash
@@ -191,6 +195,8 @@ Provider servers initialize recorder ownership before reporting readiness,
191
195
  without creating recorder files or emitting synthetic events. Closing a server
192
196
  stops new recorder admissions and waits for admitted persistence to finish.
193
197
  Shutdown does not wait for event observers, which may themselves call `close()`.
198
+ Baileys recorder rejections remain handled when shutdown interrupts compressed
199
+ frame decoding and an event observer subsequently fails.
194
200
  Concurrent and repeated close calls share the same shutdown. All transports are
195
201
  closed even if one fails, and the persistence drain includes asynchronous cleanup
196
202
  after a failed recorder lock acquisition.
@@ -1604,7 +1604,7 @@ export declare const ManifestSchema: z.ZodPreprocess<z.ZodObject<{
1604
1604
  } | undefined;
1605
1605
  }>>>>;
1606
1606
  userName: z.ZodDefault<z.ZodString>;
1607
- }, z.core.$strict>>;
1607
+ }, z.core.$strict>, unknown>;
1608
1608
  export type BuiltinAdapterId = BuiltinAdapterName;
1609
1609
  export type FixtureDefinition = z.infer<typeof FixtureSchema>;
1610
1610
  export type FixtureMode = (typeof FIXTURE_MODES)[number];
@@ -43,10 +43,9 @@ async function awaitWithAbort(operation, signal) {
43
43
  if (!signal) {
44
44
  return await operation;
45
45
  }
46
- signal.throwIfAborted();
47
46
  return await new Promise((resolve, reject) => {
48
47
  const abort = () => reject(signal.reason);
49
- signal.addEventListener("abort", abort, { once: true });
48
+ // The operation already started; even pre-aborted waits must observe its rejection.
50
49
  void operation.then((value) => {
51
50
  signal.removeEventListener("abort", abort);
52
51
  resolve(value);
@@ -54,6 +53,8 @@ async function awaitWithAbort(operation, signal) {
54
53
  signal.removeEventListener("abort", abort);
55
54
  reject(error);
56
55
  });
56
+ signal.throwIfAborted();
57
+ signal.addEventListener("abort", abort, { once: true });
57
58
  });
58
59
  }
59
60
  export class WhatsAppSignalBundleStore {
@@ -1 +1 @@
1
- {"version":3,"file":"whatsapp-baileys-websocket.js","sourceRoot":"","sources":["../../../src/servers/whatsapp-baileys-websocket.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport type { IncomingMessage, Server } from \"node:http\";\nimport type { Duplex } from \"node:stream\";\nimport { ProtocolAddress, SessionCipher, SessionRecord, type SignalStorage } from \"libsignal\";\nimport {\n aesDecryptGCM,\n aesEncryptGCM,\n Curve,\n encodeBigEndian,\n ensureSignalPublicKey,\n generateSignalKeyPair,\n hkdf,\n NOISE_MODE,\n NOISE_WA_HEADER,\n sha256,\n signedKeyPair,\n scrubSignalPublicKey,\n type KeyPair,\n type SignedKeyPair,\n} from \"./whatsapp-wire/crypto.js\";\nimport {\n decodeBinaryNode,\n encodeBinaryNode,\n S_WHATSAPP_NET,\n type BinaryNode,\n} from \"./whatsapp-wire/binary-node.js\";\nimport { decodeHandshakeMessage, encodeHandshakeMessage } from \"./whatsapp-wire/handshake.js\";\nimport { KEY_BUNDLE_TYPE, xmppPreKey, xmppSignedPreKey } from \"./whatsapp-wire/signal.js\";\nimport { WebSocket, WebSocketServer, type ServerOptions } from \"ws\";\nimport type { ServerRequestEvent } from \"./http.js\";\nimport { closeWebSocketServer } from \"./websocket.js\";\nimport {\n canonicalizeWhatsAppChatCorrelationJid,\n canonicalizeWhatsAppUserCorrelationJid,\n} from \"./whatsapp-jid.js\";\n\n// Keep the local server independent from Baileys at runtime. Tests use Baileys\n// as a black-box client to verify this narrow WhatsApp Web wire subset.\nconst EMPTY_BUFFER = Buffer.alloc(0);\nconst IV_LENGTH = 12;\nconst MAX_PENDING_INBOUND_MESSAGES = 1_000;\nexport const MAX_WHATSAPP_NOISE_FRAME_BYTES = 2 * 1024 * 1024;\nexport const MAX_WHATSAPP_WEBSOCKET_BUFFERED_BYTES = 4 * 1024 * 1024;\nexport const MAX_WHATSAPP_WEBSOCKET_MESSAGE_BYTES = 4 * 1024 * 1024;\nexport const MAX_WHATSAPP_NOISE_BUFFER_CHUNKS = 1_024;\nexport const MAX_WHATSAPP_NOISE_FRAMES_PER_MESSAGE = 1_024;\nexport const WHATSAPP_WEBSOCKET_SEND_TIMEOUT_MS = 5_000;\nconst MAX_PENDING_WEBSOCKET_BYTES = 8 * 1024 * 1024;\nconst MAX_PENDING_WEBSOCKET_MESSAGES = 32;\nconst MAX_WHATSAPP_PENDING_ACKNOWLEDGEMENTS = 10_000;\nconst MAX_WHATSAPP_PENDING_ACKNOWLEDGEMENT_AGE_MS = 5 * 60 * 1_000;\nconst MAX_WHATSAPP_RECENT_ACKNOWLEDGEMENTS = 10_000;\nconst MAX_NODE_TIMER_DELAY_MS = 2_147_483_647;\nexport const MAX_WHATSAPP_WEBSOCKET_FRAGMENTS = 1_024;\nexport const MAX_WHATSAPP_SIGNAL_BUNDLES = 1_024;\nexport const MAX_WHATSAPP_SIGNAL_PREKEYS_PER_BUNDLE = 32;\nexport const MAX_WHATSAPP_SIGNAL_SESSIONS_PER_BUNDLE = 32;\nexport const MAX_WHATSAPP_WEBSOCKET_CLOSE_REASON_BYTES = 123;\nexport const WHATSAPP_MESSAGE_ACCEPTANCE_TIMEOUT_MS = 5_000;\nexport const WHATSAPP_SIGNAL_PREKEY_RESERVATION_TTL_MS = 5 * 60 * 1_000;\ntype NodeBuffer = Buffer<ArrayBufferLike>;\ntype WhatsAppWebSocketRawData = NodeBuffer | ArrayBuffer | NodeBuffer[];\ntype WhatsAppWebSocketSendTarget = {\n bufferedAmount: number;\n readyState: number;\n send(data: Uint8Array, callback: (error?: Error) => void): void;\n terminate(): void;\n};\nconst WHATSAPP_NOISE_CERT_CHAIN = Buffer.from(\n \"CncKMwjjAhADGiCRKg7Kg1iu4CSulwLBaxX51Tefw6VXGgZqcr5OEbXIRiDQ04bOBijQjZ/TBhJA34Bj82jAHhLpCWBNVBlGnFDieamd8+138S57uMt9ke9mrn5r4+VepwBPKEgHjob6bR70rlCmWDkxZv+CfVjIAxJ2CjIIAxAAGiAcUamsMDmUxsjQuS6hh4pTNHZZnMWZ++o1mX2aqQzOYiCAka6+Bij/3rfcBhJAJw8pRkhTn+1IcOJQVN1OlZg6uikYnCumyO7acFVVX3U3QPXsGSq2TCbCbWrebSC593Su43EgprIDlfU8ZgWFBw==\",\n \"base64\",\n);\n\nexport type WhatsAppBaileysWebSocketServer = {\n close(): Promise<void>;\n prepareInboundMessage(\n message: WhatsAppBaileysInboundMessage,\n ): PreparedWhatsAppBaileysInboundDelivery | undefined;\n};\n\nexport type WhatsAppBaileysWebSocketServerParams = {\n accessToken: string;\n appendEvent(event: ServerRequestEvent): Promise<void>;\n httpServer: Server;\n maxPendingInboundMessages?: number | undefined;\n messageAcceptanceTimeoutMs?: number | undefined;\n path: string;\n selfJid: string;\n};\n\nexport type PreparedWhatsAppBaileysInboundDelivery = {\n cancel(): void;\n commit(): Promise<\"delivered\" | \"queued\">;\n};\n\nexport type WhatsAppBaileysInboundMessage = {\n key: {\n fromMe: boolean;\n id: string;\n participant?: string | undefined;\n remoteJid: string;\n };\n message:\n | {\n audioMessage?: never;\n conversation: string;\n }\n | {\n audioMessage: WhatsAppBaileysAudioMessage;\n conversation?: never;\n };\n messageTimestamp: number;\n pushName?: string | undefined;\n};\n\nexport type WhatsAppBaileysAudioMessage = {\n fileEncSha256: Buffer;\n fileLength: number;\n fileSha256: Buffer;\n mediaKey: Buffer;\n mediaKeyTimestamp: number;\n mimetype: string;\n ptt: boolean;\n seconds?: number | undefined;\n url: string;\n};\n\nexport function resolveMaxPendingWhatsAppInboundMessages(value: number | undefined): number {\n const resolved = value ?? MAX_PENDING_INBOUND_MESSAGES;\n if (!Number.isSafeInteger(resolved) || resolved < 1) {\n throw new Error(\"WhatsApp maxPendingInboundMessages must be a positive safe integer.\");\n }\n return resolved;\n}\n\nexport type MockSignalBundle = {\n identityKey: KeyPair;\n preKey: KeyPair;\n preKeyId: number;\n registrationId: number;\n signedPreKey: SignedKeyPair;\n};\n\nexport type WhatsAppSignalDecryptResult<T> =\n | { status: \"accepted\"; value: T }\n | { error: unknown; status: \"decrypt-failed\" }\n | { status: \"unavailable\" }\n | { status: \"rejected\" };\n\nexport type WhatsAppSignalBundleStoreOptions = {\n maxPreKeysPerBundle?: number | undefined;\n maxSessionsPerBundle?: number | undefined;\n messageAcceptanceTimeoutMs?: number | undefined;\n preKeyReservationTtlMs?: number | undefined;\n};\n\ntype PendingWhatsAppAcknowledgement = {\n acceptance: Promise<boolean>;\n acceptedAt: number | undefined;\n acknowledged: boolean;\n};\n\ntype StoredSignalBundle = Omit<MockSignalBundle, \"preKey\" | \"preKeyId\"> & {\n availablePreKeyIds: number[];\n nextPreKeyId: number;\n pendingPreKeyIds: Set<number>;\n preKeyReservations: Map<number, number>;\n preKeys: Map<number, KeyPair>;\n protectedPreKeyIds: Map<number, number>;\n};\n\ntype WhatsAppMessageAcceptanceOptions = {\n onTerminalTimeout?: (() => void) | undefined;\n signal?: AbortSignal | undefined;\n terminalDrain?: (() => Promise<\"acknowledged\" | \"persisted\" | \"retryable\">) | undefined;\n timeoutMs?: number | undefined;\n};\n\ntype TerminalWhatsAppAcceptance = {\n error: Error;\n};\n\nasync function awaitWithAbort<T>(operation: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) {\n return await operation;\n }\n signal.throwIfAborted();\n return await new Promise<T>((resolve, reject) => {\n const abort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", abort, { once: true });\n void operation.then(\n (value) => {\n signal.removeEventListener(\"abort\", abort);\n resolve(value);\n },\n (error) => {\n signal.removeEventListener(\"abort\", abort);\n reject(error);\n },\n );\n });\n}\n\nexport class WhatsAppSignalBundleStore {\n readonly #acknowledgedMessageIds = new Map<string, true>();\n readonly #bundles = new Map<string, StoredSignalBundle>();\n readonly #lidByPhoneNumber = new Map<string, string>();\n readonly #maxPreKeysPerBundle: number;\n readonly #maxSessionsPerBundle: number;\n readonly #maxTerminalAcceptances: number;\n readonly #messagePreKeyProtections = new Map<string, Map<string, Set<number>>>();\n readonly #messageAcceptanceTimeoutMs: number;\n readonly #pendingAcknowledgements = new Map<string, PendingWhatsAppAcknowledgement>();\n readonly #pendingTransactions = new Map<string, Promise<void>>();\n readonly #persistedMessageIds = new Map<string, true>();\n readonly #preKeyReservationTtlMs: number;\n readonly #sessions = new Map<string, Map<string, SessionRecord>>();\n readonly #terminalAcceptances = new Map<string, TerminalWhatsAppAcceptance>();\n\n constructor(\n private readonly maxBundles = MAX_WHATSAPP_SIGNAL_BUNDLES,\n private readonly maxPendingAcknowledgements = MAX_WHATSAPP_PENDING_ACKNOWLEDGEMENTS,\n private readonly maxRecentAcknowledgements = MAX_WHATSAPP_RECENT_ACKNOWLEDGEMENTS,\n private readonly maxPendingAcknowledgementAgeMs = MAX_WHATSAPP_PENDING_ACKNOWLEDGEMENT_AGE_MS,\n private readonly now: () => number = Date.now,\n options: WhatsAppSignalBundleStoreOptions = {},\n ) {\n const maxPreKeysPerBundle =\n options.maxPreKeysPerBundle ?? MAX_WHATSAPP_SIGNAL_PREKEYS_PER_BUNDLE;\n const maxSessionsPerBundle =\n options.maxSessionsPerBundle ?? MAX_WHATSAPP_SIGNAL_SESSIONS_PER_BUNDLE;\n const messageAcceptanceTimeoutMs =\n options.messageAcceptanceTimeoutMs ?? WHATSAPP_MESSAGE_ACCEPTANCE_TIMEOUT_MS;\n const preKeyReservationTtlMs =\n options.preKeyReservationTtlMs ?? WHATSAPP_SIGNAL_PREKEY_RESERVATION_TTL_MS;\n if (!Number.isSafeInteger(maxBundles) || maxBundles < 1) {\n throw new Error(\"WhatsApp maxSignalBundles must be a positive safe integer.\");\n }\n if (!Number.isSafeInteger(maxSessionsPerBundle) || maxSessionsPerBundle < 1) {\n throw new Error(\"WhatsApp maxSignalSessionsPerBundle must be a positive safe integer.\");\n }\n if (!Number.isSafeInteger(maxPreKeysPerBundle) || maxPreKeysPerBundle < 1) {\n throw new Error(\"WhatsApp maxSignalPreKeysPerBundle must be a positive safe integer.\");\n }\n if (\n !Number.isSafeInteger(messageAcceptanceTimeoutMs) ||\n messageAcceptanceTimeoutMs < 1 ||\n messageAcceptanceTimeoutMs > MAX_NODE_TIMER_DELAY_MS\n ) {\n throw new Error(\n `WhatsApp messageAcceptanceTimeoutMs must be a positive integer no greater than ${MAX_NODE_TIMER_DELAY_MS}.`,\n );\n }\n if (!Number.isSafeInteger(preKeyReservationTtlMs) || preKeyReservationTtlMs < 1) {\n throw new Error(\"WhatsApp preKeyReservationTtlMs must be a positive safe integer.\");\n }\n if (!Number.isSafeInteger(maxPendingAcknowledgements) || maxPendingAcknowledgements < 1) {\n throw new Error(\"WhatsApp maxPendingAcknowledgements must be a positive safe integer.\");\n }\n if (!Number.isSafeInteger(maxRecentAcknowledgements) || maxRecentAcknowledgements < 1) {\n throw new Error(\"WhatsApp maxRecentAcknowledgements must be a positive safe integer.\");\n }\n if (\n !Number.isSafeInteger(maxPendingAcknowledgementAgeMs) ||\n maxPendingAcknowledgementAgeMs < 1\n ) {\n throw new Error(\"WhatsApp maxPendingAcknowledgementAgeMs must be a positive safe integer.\");\n }\n this.#maxPreKeysPerBundle = maxPreKeysPerBundle;\n this.#maxSessionsPerBundle = maxSessionsPerBundle;\n this.#maxTerminalAcceptances = Math.min(\n Number.MAX_SAFE_INTEGER,\n maxPendingAcknowledgements + maxRecentAcknowledgements,\n );\n this.#messageAcceptanceTimeoutMs = messageAcceptanceTimeoutMs;\n this.#preKeyReservationTtlMs = preKeyReservationTtlMs;\n }\n\n get size(): number {\n return this.#bundles.size;\n }\n\n get lidMappingSize(): number {\n return this.#lidByPhoneNumber.size;\n }\n\n get sessionCount(): number {\n let count = 0;\n for (const sessions of this.#sessions.values()) {\n count += sessions.size;\n }\n return count;\n }\n\n async acceptMessageOnce(\n messageKey: string,\n operation: (signal: AbortSignal) => Promise<boolean>,\n options: WhatsAppMessageAcceptanceOptions = {},\n ): Promise<boolean> {\n this.#recoverExpiredPendingAcknowledgements();\n const pendingAcceptance = this.#pendingAcknowledgements.get(messageKey);\n if (pendingAcceptance) {\n return await pendingAcceptance.acceptance;\n }\n const terminalAcceptance = this.#terminalAcceptances.get(messageKey);\n if (terminalAcceptance) {\n this.#terminalAcceptances.delete(messageKey);\n this.#terminalAcceptances.set(messageKey, terminalAcceptance);\n throw terminalAcceptance.error;\n }\n if (this.#acknowledgedMessageIds.delete(messageKey)) {\n this.#acknowledgedMessageIds.set(messageKey, true);\n return true;\n }\n if (\n this.#terminalAcceptances.size + this.#pendingAcknowledgements.size >=\n this.#maxTerminalAcceptances\n ) {\n throw new Error(\n `WhatsApp terminal acceptance limit exceeded (${this.#maxTerminalAcceptances}).`,\n );\n }\n if (this.#pendingAcknowledgements.size >= this.maxPendingAcknowledgements) {\n throw new Error(\n `WhatsApp pending acknowledgement limit exceeded (${this.maxPendingAcknowledgements}).`,\n );\n }\n const timeoutMs = options.timeoutMs ?? this.#messageAcceptanceTimeoutMs;\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > MAX_NODE_TIMER_DELAY_MS) {\n throw new Error(\n `WhatsApp message acceptance timeout must be a positive integer no greater than ${MAX_NODE_TIMER_DELAY_MS}.`,\n );\n }\n options.signal?.throwIfAborted();\n const controller = new AbortController();\n const operationPromise = Promise.resolve().then(() => operation(controller.signal));\n let terminalFenced = false;\n const fenceTerminalAcceptance = (error: Error) => {\n if (terminalFenced) {\n return;\n }\n terminalFenced = true;\n controller.abort(error);\n const terminalDrain = Promise.all([\n operationPromise.then(\n () => undefined,\n () => undefined,\n ),\n Promise.resolve()\n .then(() => options.terminalDrain?.())\n .then(\n (disposition) => disposition ?? \"retryable\",\n () => \"retryable\" as const,\n ),\n ]).then(([, disposition]) => disposition);\n this.#rememberTerminalAcceptance(messageKey, error, terminalDrain);\n };\n const abortFromOwner = () => {\n const reason = options.signal?.reason;\n fenceTerminalAcceptance(\n reason instanceof Error ? reason : new Error(\"WhatsApp message acceptance cancelled.\"),\n );\n };\n if (options.signal?.aborted) {\n abortFromOwner();\n } else {\n options.signal?.addEventListener(\"abort\", abortFromOwner, { once: true });\n }\n const timeout = setTimeout(() => {\n const error = new Error(\"WhatsApp message acceptance timed out.\");\n fenceTerminalAcceptance(error);\n try {\n options.onTerminalTimeout?.();\n } catch {}\n }, timeoutMs);\n timeout.unref();\n let pendingAcknowledgement: PendingWhatsAppAcknowledgement;\n const acceptance = Promise.resolve().then(async () => {\n try {\n const accepted = await awaitWithAbort(operationPromise, controller.signal);\n if (!accepted) {\n if (this.#pendingAcknowledgements.get(messageKey) === pendingAcknowledgement) {\n this.#pendingAcknowledgements.delete(messageKey);\n }\n return false;\n }\n if (pendingAcknowledgement.acknowledged) {\n if (this.#pendingAcknowledgements.get(messageKey) === pendingAcknowledgement) {\n this.#pendingAcknowledgements.delete(messageKey);\n }\n this.#rememberAcknowledgedMessage(messageKey);\n } else {\n pendingAcknowledgement.acceptedAt = this.now();\n }\n return true;\n } catch (error) {\n if (this.#pendingAcknowledgements.get(messageKey) === pendingAcknowledgement) {\n this.#pendingAcknowledgements.delete(messageKey);\n }\n throw error;\n } finally {\n clearTimeout(timeout);\n options.signal?.removeEventListener(\"abort\", abortFromOwner);\n }\n });\n pendingAcknowledgement = {\n acceptance,\n acceptedAt: undefined,\n acknowledged: false,\n };\n this.#pendingAcknowledgements.set(messageKey, pendingAcknowledgement);\n return await acceptance;\n }\n\n markMessageAcknowledged(peerJid: string, messageId: string): void {\n const peer = canonicalizeWhatsAppChatCorrelationJid(peerJid);\n if (peer && messageId) {\n const messageKey = `${peer}\\0${messageId}`;\n this.#recoverExpiredPendingAcknowledgements();\n const pendingAcknowledgement = this.#pendingAcknowledgements.get(messageKey);\n if (!pendingAcknowledgement) {\n return;\n }\n if (pendingAcknowledgement.acceptedAt === undefined) {\n pendingAcknowledgement.acknowledged = true;\n return;\n }\n this.#pendingAcknowledgements.delete(messageKey);\n this.#rememberAcknowledgedMessage(messageKey);\n }\n }\n\n hasPersistedMessage(messageKey: string): boolean {\n return this.#persistedMessageIds.has(messageKey);\n }\n\n clearPersistedMessage(messageKey: string): void {\n this.#persistedMessageIds.delete(messageKey);\n this.releaseMessagePreKeyProtection(messageKey);\n }\n\n releaseMessagePreKeyProtection(messageKey: string): void {\n const protections = this.#messagePreKeyProtections.get(messageKey);\n if (!protections) {\n return;\n }\n this.#messagePreKeyProtections.delete(messageKey);\n for (const [identityKey, preKeyIds] of protections) {\n const bundle = this.#bundles.get(identityKey);\n if (!bundle) {\n continue;\n }\n for (const preKeyId of preKeyIds) {\n const references = bundle.protectedPreKeyIds.get(preKeyId) ?? 0;\n if (references <= 1) {\n bundle.protectedPreKeyIds.delete(preKeyId);\n } else {\n bundle.protectedPreKeyIds.set(preKeyId, references - 1);\n }\n }\n }\n }\n\n associateLid(phoneNumberJid: string, lidJid: string): void {\n const phoneNumber = canonicalizeWhatsAppUserCorrelationJid(phoneNumberJid);\n const lid = canonicalizeWhatsAppUserCorrelationJid(lidJid);\n if (!phoneNumber?.endsWith(\"@s.whatsapp.net\") || !lid?.endsWith(\"@lid\")) {\n throw new Error(\"Invalid WhatsApp PN/LID signal mapping.\");\n }\n const phoneNumberKey = signalBundleIdentityKey(phoneNumber);\n this.#lidByPhoneNumber.delete(phoneNumberKey);\n this.#lidByPhoneNumber.set(phoneNumberKey, signalBundleIdentityKey(lid));\n if (this.#lidByPhoneNumber.size > this.maxBundles) {\n const oldestPhoneNumber = this.#lidByPhoneNumber.keys().next().value;\n if (oldestPhoneNumber !== undefined) {\n this.#lidByPhoneNumber.delete(oldestPhoneNumber);\n }\n }\n }\n\n resolveAssociatedLid(phoneNumberJid: string): string | undefined {\n const phoneNumber = canonicalizeWhatsAppUserCorrelationJid(phoneNumberJid);\n if (!phoneNumber?.endsWith(\"@s.whatsapp.net\")) {\n return undefined;\n }\n return this.#lidByPhoneNumber.get(signalBundleIdentityKey(phoneNumber));\n }\n\n resolveMany(jids: string[]): MockSignalBundle[] {\n const uniqueNewIdentities = new Set<string>();\n const identityKeys: string[] = [];\n for (const jid of jids) {\n const canonical = canonicalizeWhatsAppUserCorrelationJid(jid);\n if (!canonical) {\n throw new Error(`Invalid WhatsApp signal bundle JID: ${jid}.`);\n }\n const identityKey = signalBundleIdentityKey(canonical);\n identityKeys.push(identityKey);\n if (!this.#bundles.has(identityKey)) {\n uniqueNewIdentities.add(identityKey);\n }\n }\n if (this.#bundles.size + uniqueNewIdentities.size > this.maxBundles) {\n // Published bundle identities stay stable for the store lifetime.\n throw new Error(`WhatsApp signal bundle limit exceeded (${this.maxBundles}).`);\n }\n const stagedNewBundles = new Map<string, StoredSignalBundle>();\n const stagedReservations = new Map<\n string,\n {\n availablePreKeyIds: number[];\n bundle: StoredSignalBundle;\n nextPreKeyId: number;\n preKeyReservations: Map<number, number>;\n preKeys: Map<number, KeyPair>;\n }\n >();\n const reservationNow = this.now();\n const stagedForIdentity = (identityKey: string) => {\n let bundle = this.#bundles.get(identityKey) ?? stagedNewBundles.get(identityKey);\n if (!bundle) {\n bundle = this.#createBundle();\n stagedNewBundles.set(identityKey, bundle);\n }\n let staged = stagedReservations.get(identityKey);\n if (!staged) {\n const preKeys = new Map(bundle.preKeys);\n const preKeyReservations = new Map(bundle.preKeyReservations);\n for (const [preKeyId, reservedAt] of preKeyReservations) {\n if (\n reservationNow - reservedAt >= this.#preKeyReservationTtlMs &&\n !bundle.protectedPreKeyIds.has(preKeyId)\n ) {\n preKeyReservations.delete(preKeyId);\n preKeys.delete(preKeyId);\n }\n }\n staged = {\n availablePreKeyIds: bundle.availablePreKeyIds.filter((id) => preKeys.has(id)),\n bundle,\n nextPreKeyId: bundle.nextPreKeyId,\n preKeyReservations,\n preKeys,\n };\n stagedReservations.set(identityKey, staged);\n }\n return staged;\n };\n const requestedPreKeys = new Map<string, number>();\n for (const identityKey of identityKeys) {\n requestedPreKeys.set(identityKey, (requestedPreKeys.get(identityKey) ?? 0) + 1);\n }\n for (const [identityKey, requested] of requestedPreKeys) {\n const staged = stagedForIdentity(identityKey);\n const available = staged.availablePreKeyIds.length;\n const creatable = Math.max(\n 0,\n this.#maxPreKeysPerBundle - staged.preKeys.size - staged.bundle.pendingPreKeyIds.size,\n );\n if (requested > available + creatable) {\n throw new Error(\n `WhatsApp Signal prekey reservation limit exceeded (${this.#maxPreKeysPerBundle}).`,\n );\n }\n }\n const reservedBundles = identityKeys.map((identityKey) => {\n const staged = stagedForIdentity(identityKey);\n const { bundle } = staged;\n let preKeyId = staged.availablePreKeyIds.shift();\n if (preKeyId === undefined) {\n const created = this.#createPreKey(\n staged.preKeys,\n staged.nextPreKeyId,\n staged.bundle.pendingPreKeyIds,\n );\n preKeyId = created.id;\n staged.preKeys.set(created.id, created.keyPair);\n staged.nextPreKeyId = created.nextPreKeyId;\n }\n const preKey = staged.preKeys.get(preKeyId);\n if (!preKey) {\n throw new Error(\"WhatsApp Signal prekey reservation is unavailable.\");\n }\n staged.preKeyReservations.set(preKeyId, reservationNow);\n return {\n identityKey: bundle.identityKey,\n preKey,\n preKeyId,\n registrationId: bundle.registrationId,\n signedPreKey: bundle.signedPreKey,\n };\n });\n for (const [identityKey, bundle] of stagedNewBundles) {\n this.#bundles.set(identityKey, bundle);\n }\n for (const staged of stagedReservations.values()) {\n staged.bundle.availablePreKeyIds = staged.availablePreKeyIds;\n staged.bundle.nextPreKeyId = staged.nextPreKeyId;\n staged.bundle.preKeyReservations = staged.preKeyReservations;\n staged.bundle.preKeys = staged.preKeys;\n }\n return reservedBundles;\n }\n\n async decryptDirectMessage(params: {\n ciphertext: Uint8Array;\n recipientJid: string;\n remoteJid: string;\n type: \"msg\" | \"pkmsg\";\n }): Promise<Buffer | undefined> {\n const result = await this.transactDirectMessage({\n ...params,\n accept: async (plaintext) => plaintext,\n });\n if (result.status === \"decrypt-failed\") {\n throw result.error;\n }\n return result.status === \"accepted\" ? result.value : undefined;\n }\n\n async transactDirectMessage<T>(params: {\n accept(plaintext: Buffer): Promise<T | undefined>;\n ciphertext: Uint8Array;\n messageKey?: string | undefined;\n recipientJid: string;\n remoteJid: string;\n signal?: AbortSignal | undefined;\n type: \"msg\" | \"pkmsg\";\n }): Promise<WhatsAppSignalDecryptResult<T>> {\n params.signal?.throwIfAborted();\n const recipientJid = canonicalizeWhatsAppUserCorrelationJid(params.recipientJid);\n const recipientIdentityKey = recipientJid ? signalBundleIdentityKey(recipientJid) : undefined;\n const mappedLidIdentityKey = recipientIdentityKey\n ? this.resolveAssociatedLid(recipientIdentityKey)\n : undefined;\n const identityKey =\n mappedLidIdentityKey && this.#bundles.has(mappedLidIdentityKey)\n ? mappedLidIdentityKey\n : recipientIdentityKey;\n const bundle = identityKey ? this.#bundles.get(identityKey) : undefined;\n if (!identityKey || !bundle) {\n return { status: \"unavailable\" };\n }\n const remoteAddress = signalProtocolAddress(params.remoteJid);\n if (!remoteAddress) {\n return { status: \"unavailable\" };\n }\n const address = new ProtocolAddress(remoteAddress.name, remoteAddress.deviceId);\n // Capacity checks, staged writes, and commits stay atomic per recipient bundle.\n return await this.#runTransaction(identityKey, async () => {\n params.signal?.throwIfAborted();\n const sessions = this.#sessions.get(identityKey) ?? new Map<string, SessionRecord>();\n const sessionLimitError = new Error(\"WhatsApp Signal session limit exceeded.\");\n const maxSessionsPerBundle = this.#maxSessionsPerBundle;\n let stagedNewSessionCount = 0;\n const stagedPreKeyRemovals = new Set<number>();\n const stagedSessions = new Map<string, SessionRecord>();\n const storage: SignalStorage = {\n async loadSession(id) {\n const session = stagedSessions.get(id) ?? sessions.get(id);\n return session ? cloneSignalSession(session) : undefined;\n },\n async storeSession(id, session) {\n if (!sessions.has(id) && !stagedSessions.has(id)) {\n if (sessions.size + stagedNewSessionCount >= maxSessionsPerBundle) {\n throw sessionLimitError;\n }\n stagedNewSessionCount += 1;\n }\n stagedSessions.set(id, cloneSignalSession(session));\n },\n isTrustedIdentity: () => true,\n loadPreKey: async (id) => {\n const preKey = bundle.preKeys.get(Number(id));\n if (preKey && params.messageKey) {\n this.#protectMessagePreKey(params.messageKey, identityKey, Number(id));\n }\n return preKey ? signalKeyPair(preKey) : undefined;\n },\n removePreKey(id) {\n stagedPreKeyRemovals.add(id);\n },\n loadSignedPreKey: () => signalKeyPair(bundle.signedPreKey.keyPair),\n getOurRegistrationId: () => bundle.registrationId,\n getOurIdentity: () => signalKeyPair(bundle.identityKey),\n };\n const cipher = new SessionCipher(storage, address);\n let plaintext: Buffer;\n try {\n plaintext =\n params.type === \"pkmsg\"\n ? await cipher.decryptPreKeyWhisperMessage(params.ciphertext)\n : await cipher.decryptWhisperMessage(params.ciphertext);\n } catch (error) {\n if (error === sessionLimitError) {\n return { status: \"rejected\" };\n }\n return { error, status: \"decrypt-failed\" };\n }\n params.signal?.throwIfAborted();\n let stagedNextPreKeyId = bundle.nextPreKeyId;\n const stagedPreKeyIds = new Set<number>();\n const replacementPreKeys = [...stagedPreKeyRemovals]\n .filter((id) => bundle.preKeys.has(id))\n .map(() => {\n const unavailableIds = new Set([...bundle.pendingPreKeyIds, ...stagedPreKeyIds]);\n const created = this.#createPreKey(bundle.preKeys, stagedNextPreKeyId, unavailableIds);\n stagedNextPreKeyId = created.nextPreKeyId;\n stagedPreKeyIds.add(created.id);\n return created;\n });\n for (const replacementPreKey of replacementPreKeys) {\n bundle.pendingPreKeyIds.add(replacementPreKey.id);\n }\n bundle.nextPreKeyId = stagedNextPreKeyId;\n try {\n const accepted = await awaitWithAbort(\n Promise.resolve().then(() => params.accept(plaintext)),\n params.signal,\n );\n if (accepted === undefined) {\n return { status: \"rejected\" };\n }\n params.signal?.throwIfAborted();\n for (const [id, session] of stagedSessions) {\n sessions.set(id, session);\n }\n if (stagedSessions.size > 0) {\n this.#sessions.set(identityKey, sessions);\n }\n for (const id of stagedPreKeyRemovals) {\n bundle.preKeyReservations.delete(id);\n bundle.preKeys.delete(id);\n }\n for (const replacementPreKey of replacementPreKeys) {\n bundle.preKeys.set(replacementPreKey.id, replacementPreKey.keyPair);\n bundle.availablePreKeyIds.push(replacementPreKey.id);\n }\n return { status: \"accepted\", value: accepted };\n } finally {\n for (const replacementPreKey of replacementPreKeys) {\n bundle.pendingPreKeyIds.delete(replacementPreKey.id);\n }\n }\n });\n }\n\n #createBundle(): StoredSignalBundle {\n const identityKey = generateSignalKeyPair();\n return {\n availablePreKeyIds: [],\n identityKey,\n nextPreKeyId: 1,\n pendingPreKeyIds: new Set<number>(),\n preKeyReservations: new Map<number, number>(),\n preKeys: new Map<number, KeyPair>(),\n protectedPreKeyIds: new Map<number, number>(),\n registrationId: 1,\n signedPreKey: signedKeyPair(identityKey, 1),\n };\n }\n\n #createPreKey(\n preKeys: ReadonlyMap<number, KeyPair>,\n startingId: number,\n stagedIds: ReadonlySet<number> = new Set(),\n ): { id: number; keyPair: KeyPair; nextPreKeyId: number } {\n let id = startingId;\n while (preKeys.has(id) || stagedIds.has(id)) {\n id = id === 0xff_ff_ff ? 1 : id + 1;\n if (id === startingId) {\n throw new Error(\"WhatsApp Signal prekey identifier space exhausted.\");\n }\n }\n return {\n id,\n keyPair: generateSignalKeyPair(),\n nextPreKeyId: id === 0xff_ff_ff ? 1 : id + 1,\n };\n }\n\n #recoverExpiredPendingAcknowledgements(): void {\n const now = this.now();\n for (const [messageKey, pendingAcknowledgement] of this.#pendingAcknowledgements) {\n const { acceptedAt } = pendingAcknowledgement;\n if (acceptedAt === undefined) {\n continue;\n }\n if (now - acceptedAt < this.maxPendingAcknowledgementAgeMs) {\n continue;\n }\n this.#pendingAcknowledgements.delete(messageKey);\n this.#rememberAcknowledgedMessage(messageKey);\n }\n }\n\n #rememberAcknowledgedMessage(messageKey: string): void {\n this.#acknowledgedMessageIds.delete(messageKey);\n this.#acknowledgedMessageIds.set(messageKey, true);\n if (this.#acknowledgedMessageIds.size > this.maxRecentAcknowledgements) {\n const oldestMessageKey = this.#acknowledgedMessageIds.keys().next().value;\n if (oldestMessageKey !== undefined) {\n this.#acknowledgedMessageIds.delete(oldestMessageKey);\n }\n }\n }\n\n #rememberPersistedMessage(messageKey: string): void {\n this.#persistedMessageIds.delete(messageKey);\n this.#persistedMessageIds.set(messageKey, true);\n if (this.#persistedMessageIds.size > this.maxRecentAcknowledgements) {\n const oldestMessageKey = this.#persistedMessageIds.keys().next().value;\n if (oldestMessageKey !== undefined) {\n this.#persistedMessageIds.delete(oldestMessageKey);\n this.releaseMessagePreKeyProtection(oldestMessageKey);\n }\n }\n }\n\n #protectMessagePreKey(messageKey: string, identityKey: string, preKeyId: number): void {\n let protections = this.#messagePreKeyProtections.get(messageKey);\n if (!protections) {\n protections = new Map<string, Set<number>>();\n this.#messagePreKeyProtections.set(messageKey, protections);\n }\n let preKeyIds = protections.get(identityKey);\n if (!preKeyIds) {\n preKeyIds = new Set<number>();\n protections.set(identityKey, preKeyIds);\n }\n if (preKeyIds.has(preKeyId)) {\n return;\n }\n preKeyIds.add(preKeyId);\n const bundle = this.#bundles.get(identityKey);\n if (bundle) {\n bundle.protectedPreKeyIds.set(preKeyId, (bundle.protectedPreKeyIds.get(preKeyId) ?? 0) + 1);\n }\n }\n\n #rememberTerminalAcceptance(\n messageKey: string,\n error: Error,\n drain: Promise<\"acknowledged\" | \"persisted\" | \"retryable\">,\n ): void {\n const terminalAcceptance = { error };\n this.#terminalAcceptances.set(messageKey, terminalAcceptance);\n void drain.then((disposition) => {\n if (this.#terminalAcceptances.get(messageKey) === terminalAcceptance) {\n this.#terminalAcceptances.delete(messageKey);\n }\n if (disposition === \"acknowledged\") {\n this.#rememberAcknowledgedMessage(messageKey);\n } else if (disposition === \"persisted\") {\n this.#rememberPersistedMessage(messageKey);\n }\n });\n }\n\n async #runTransaction<T>(key: string, operation: () => Promise<T>): Promise<T> {\n return await this.#runSerialized(this.#pendingTransactions, key, operation);\n }\n\n async #runSerialized<T>(\n pending: Map<string, Promise<void>>,\n key: string,\n operation: () => Promise<T>,\n ): Promise<T> {\n const previous = pending.get(key) ?? Promise.resolve();\n const result = previous.catch(() => undefined).then(operation);\n const settled = result.then(\n () => undefined,\n () => undefined,\n );\n pending.set(key, settled);\n try {\n return await result;\n } finally {\n if (pending.get(key) === settled) {\n pending.delete(key);\n }\n }\n }\n}\n\nexport function createSerializedMessageHandler<T>(\n processMessage: (message: T) => Promise<void>,\n onError: (error: unknown) => void,\n options: {\n maxPendingBytes?: number | undefined;\n maxPendingMessages?: number | undefined;\n sizeOf?: ((message: T) => number) | undefined;\n } = {},\n): (message: T) => Promise<void> {\n const maxPendingBytes = options.maxPendingBytes ?? MAX_PENDING_WEBSOCKET_BYTES;\n const maxPendingMessages = options.maxPendingMessages ?? MAX_PENDING_WEBSOCKET_MESSAGES;\n const sizeOf = options.sizeOf ?? (() => 1);\n let failed = false;\n let pendingBytes = 0;\n let pendingMessages = 0;\n let pending = Promise.resolve();\n const fail = (error: unknown) => {\n if (!failed) {\n failed = true;\n onError(error);\n }\n };\n return (message) => {\n if (failed) {\n return pending;\n }\n const messageBytes = sizeOf(message);\n if (!Number.isSafeInteger(messageBytes) || messageBytes < 0) {\n fail(new Error(\"WhatsApp WebSocket message size must be a non-negative safe integer.\"));\n return pending;\n }\n if (pendingMessages >= maxPendingMessages || pendingBytes + messageBytes > maxPendingBytes) {\n fail(new Error(\"WhatsApp WebSocket inbound backlog limit exceeded.\"));\n return pending;\n }\n pendingMessages += 1;\n pendingBytes += messageBytes;\n const next = pending\n .then(async () => {\n if (!failed) {\n await processMessage(message);\n }\n })\n .finally(() => {\n pendingMessages -= 1;\n pendingBytes -= messageBytes;\n });\n pending = next.catch((error: unknown) => {\n fail(error);\n });\n return pending;\n };\n}\n\nexport class WhatsAppNoiseFrameDecoder {\n #bufferedBytes = 0;\n readonly #chunks: NodeBuffer[] = [];\n #expectIntro = true;\n #offset = 0;\n\n get bufferedBytes(): number {\n return this.#bufferedBytes;\n }\n\n decodeFrames(data: WhatsAppWebSocketRawData): NodeBuffer[] {\n let chunk = rawDataToBuffer(data);\n if (this.#expectIntro) {\n chunk = removeNoiseIntroHeader(chunk);\n this.#expectIntro = false;\n }\n if (chunk.length > 0) {\n if (this.#chunks.length >= MAX_WHATSAPP_NOISE_BUFFER_CHUNKS) {\n throw new Error(\n `WhatsApp Noise buffer exceeds ${MAX_WHATSAPP_NOISE_BUFFER_CHUNKS} chunks.`,\n );\n }\n this.#chunks.push(chunk);\n this.#bufferedBytes += chunk.length;\n }\n\n const frames: NodeBuffer[] = [];\n while (this.#bufferedBytes >= 3) {\n const size = (this.#peekByte(0) << 16) | (this.#peekByte(1) << 8) | this.#peekByte(2);\n if (size > MAX_WHATSAPP_NOISE_FRAME_BYTES) {\n throw new Error(`WhatsApp Noise frame exceeds ${MAX_WHATSAPP_NOISE_FRAME_BYTES} bytes.`);\n }\n if (this.#bufferedBytes < size + 3) {\n break;\n }\n if (frames.length >= MAX_WHATSAPP_NOISE_FRAMES_PER_MESSAGE) {\n throw new Error(\n `WhatsApp Noise message exceeds ${MAX_WHATSAPP_NOISE_FRAMES_PER_MESSAGE} frames.`,\n );\n }\n this.#consume(3);\n frames.push(this.#read(size));\n }\n return frames;\n }\n\n #consume(length: number): void {\n let remaining = length;\n while (remaining > 0) {\n const chunk = this.#chunks[0];\n if (!chunk) {\n throw new Error(\"Unexpected end of WhatsApp Noise frame buffer.\");\n }\n const available = chunk.length - this.#offset;\n const consumed = Math.min(available, remaining);\n this.#offset += consumed;\n this.#bufferedBytes -= consumed;\n remaining -= consumed;\n if (this.#offset === chunk.length) {\n this.#chunks.shift();\n this.#offset = 0;\n }\n }\n }\n\n #peekByte(index: number): number {\n let remaining = index + this.#offset;\n for (const chunk of this.#chunks) {\n if (remaining < chunk.length) {\n return chunk[remaining]!;\n }\n remaining -= chunk.length;\n }\n throw new Error(\"Unexpected end of WhatsApp Noise frame buffer.\");\n }\n\n #read(length: number): NodeBuffer {\n const result = Buffer.allocUnsafe(length);\n let resultOffset = 0;\n while (resultOffset < length) {\n const chunk = this.#chunks[0];\n if (!chunk) {\n throw new Error(\"Unexpected end of WhatsApp Noise frame buffer.\");\n }\n const copied = chunk.copy(\n result,\n resultOffset,\n this.#offset,\n Math.min(chunk.length, this.#offset + length - resultOffset),\n );\n this.#offset += copied;\n this.#bufferedBytes -= copied;\n resultOffset += copied;\n if (this.#offset === chunk.length) {\n this.#chunks.shift();\n this.#offset = 0;\n }\n }\n return result;\n }\n}\n\nclass TransportState {\n #readCounter = 0;\n #writeCounter = 0;\n\n constructor(\n private readonly encKey: NodeBuffer,\n private readonly decKey: NodeBuffer,\n ) {}\n\n decrypt(ciphertext: Uint8Array): NodeBuffer {\n const iv = createIv(this.#readCounter++);\n return aesDecryptGCM(Buffer.from(ciphertext), this.decKey, iv, EMPTY_BUFFER);\n }\n\n encrypt(plaintext: Uint8Array): NodeBuffer {\n const iv = createIv(this.#writeCounter++);\n return aesEncryptGCM(Buffer.from(plaintext), this.encKey, iv, EMPTY_BUFFER);\n }\n}\n\nclass BaileysNoiseServer {\n #counter = 0;\n #decKey: NodeBuffer;\n #encKey: NodeBuffer;\n readonly #frames = new WhatsAppNoiseFrameDecoder();\n #hash: NodeBuffer;\n #salt: NodeBuffer;\n #serverEphemeralKey: KeyPair | undefined;\n #serverStaticKey: KeyPair | undefined;\n #transport: TransportState | undefined;\n\n constructor() {\n const initial = Buffer.from(NOISE_MODE);\n this.#hash = Buffer.from(initial.byteLength === 32 ? initial : sha256(initial));\n this.#salt = this.#hash;\n this.#encKey = this.#hash;\n this.#decKey = this.#hash;\n this.#authenticate(NOISE_WA_HEADER);\n }\n\n decodeFrames(data: WhatsAppWebSocketRawData): NodeBuffer[] {\n return this.#frames.decodeFrames(data);\n }\n\n async decodeTransportNode(frame: Uint8Array): Promise<BinaryNode> {\n if (!this.#transport) {\n throw new Error(\"Cannot decode a Baileys node before the Noise transport is ready.\");\n }\n return await decodeBinaryNode(this.#transport.decrypt(frame));\n }\n\n finishClientHandshake(frame: Uint8Array): void {\n const message = decodeHandshakeMessage(frame);\n const finish = message.clientFinish;\n if (!finish?.staticKey || !finish.payload || !this.#serverEphemeralKey) {\n throw new Error(\"Invalid Baileys client finish handshake.\");\n }\n const clientNoisePublic = this.#decrypt(finish.staticKey);\n this.#mixIntoKey(Curve.sharedKey(this.#serverEphemeralKey.private, clientNoisePublic));\n this.#decrypt(finish.payload);\n const [writeKey, readKey] = this.#localHKDF(EMPTY_BUFFER);\n this.#transport = new TransportState(readKey, writeKey);\n }\n\n createServerHello(frame: Uint8Array): NodeBuffer {\n const message = decodeHandshakeMessage(frame);\n const clientHello = message.clientHello;\n if (!clientHello?.ephemeral) {\n throw new Error(\"Invalid Baileys client hello handshake.\");\n }\n\n this.#authenticate(clientHello.ephemeral);\n this.#serverEphemeralKey = Curve.generateKeyPair();\n this.#serverStaticKey = Curve.generateKeyPair();\n this.#authenticate(this.#serverEphemeralKey.public);\n this.#mixIntoKey(Curve.sharedKey(this.#serverEphemeralKey.private, clientHello.ephemeral));\n const staticKey = this.#encrypt(this.#serverStaticKey.public);\n this.#mixIntoKey(Curve.sharedKey(this.#serverStaticKey.private, clientHello.ephemeral));\n const payload = this.#encrypt(WHATSAPP_NOISE_CERT_CHAIN);\n return encodeLengthPrefixed(\n encodeHandshakeMessage({\n serverHello: {\n ephemeral: this.#serverEphemeralKey.public,\n payload,\n staticKey,\n },\n }),\n );\n }\n\n encodeNode(node: BinaryNode): NodeBuffer {\n if (!this.#transport) {\n throw new Error(\"Cannot encode a Baileys node before the Noise transport is ready.\");\n }\n return encodeLengthPrefixed(this.#transport.encrypt(encodeBinaryNode(node)));\n }\n\n #authenticate(data: Uint8Array) {\n this.#hash = sha256(Buffer.concat([this.#hash, Buffer.from(data)]));\n }\n\n #decrypt(ciphertext: Uint8Array): NodeBuffer {\n const result = aesDecryptGCM(\n Buffer.from(ciphertext),\n this.#decKey,\n createIv(this.#counter++),\n this.#hash,\n );\n this.#authenticate(ciphertext);\n return result;\n }\n\n #encrypt(plaintext: Uint8Array): NodeBuffer {\n const result = aesEncryptGCM(\n Buffer.from(plaintext),\n this.#encKey,\n createIv(this.#counter++),\n this.#hash,\n );\n this.#authenticate(result);\n return result;\n }\n\n #localHKDF(data: Uint8Array): [NodeBuffer, NodeBuffer] {\n const key = hkdf(Buffer.from(data), 64, { info: \"\", salt: this.#salt });\n return [Buffer.from(key.subarray(0, 32)), Buffer.from(key.subarray(32))];\n }\n\n #mixIntoKey(data: Uint8Array) {\n const [writeKey, readKey] = this.#localHKDF(data);\n this.#salt = writeKey;\n this.#encKey = readKey;\n this.#decKey = readKey;\n this.#counter = 0;\n }\n}\n\nclass WhatsAppBaileysWebSocketSession {\n readonly #acceptanceAbort = new AbortController();\n #handshakeState: \"client-finish\" | \"client-hello\" | \"open\" = \"client-hello\";\n readonly #handleSerializedMessage: (data: WhatsAppWebSocketRawData) => Promise<void>;\n readonly #noise = new BaileysNoiseServer();\n\n constructor(\n private readonly socket: WebSocket,\n private readonly params: {\n appendEvent(event: ServerRequestEvent): Promise<void>;\n path: string;\n onOpen(session: WhatsAppBaileysWebSocketSession): void;\n selfJid: string;\n signalBundles: WhatsAppSignalBundleStore;\n },\n ) {\n this.#handleSerializedMessage = createSerializedMessageHandler(\n (data) => this.#handleMessage(data),\n (error) => {\n const close = resolveWhatsAppWebSocketClose(error);\n this.socket.close(close.code, close.reason);\n },\n {\n sizeOf: rawDataByteLength,\n },\n );\n }\n\n get isOpen(): boolean {\n return this.#handshakeState === \"open\" && this.socket.readyState === WebSocket.OPEN;\n }\n\n handleMessage(data: WhatsAppWebSocketRawData): Promise<void> {\n return this.#handleSerializedMessage(data);\n }\n\n abortAcceptance(reason: unknown): void {\n if (!this.#acceptanceAbort.signal.aborted) {\n this.#acceptanceAbort.abort(reason);\n }\n }\n\n async deliverInboundMessage(message: WhatsAppBaileysInboundMessage): Promise<boolean> {\n if (!this.isOpen) {\n return false;\n }\n try {\n await this.#sendNode(createInboundMessageNode(message));\n return true;\n } catch {\n this.socket.terminate();\n return false;\n }\n }\n\n async #handleMessage(data: WhatsAppWebSocketRawData): Promise<void> {\n for (const frame of this.#noise.decodeFrames(data)) {\n if (this.#handshakeState === \"client-hello\") {\n await sendWhatsAppWebSocketPayload(this.socket, this.#noise.createServerHello(frame));\n this.#handshakeState = \"client-finish\";\n continue;\n }\n if (this.#handshakeState === \"client-finish\") {\n this.#noise.finishClientHandshake(frame);\n this.#handshakeState = \"open\";\n await this.#sendNode({\n attrs: {\n lid: lidForJid(this.params.selfJid),\n t: unixSeconds(),\n },\n tag: \"success\",\n });\n await this.#sendNode({\n attrs: {},\n content: [{ attrs: { count: \"0\" }, tag: \"offline\" }],\n tag: \"ib\",\n });\n this.params.onOpen(this);\n continue;\n }\n await this.#handleNode(await this.#noise.decodeTransportNode(frame));\n }\n }\n\n async #handleNode(node: BinaryNode): Promise<void> {\n await awaitWithAbort(this.#recordNode(node), this.#acceptanceAbort.signal);\n if (node.tag === \"iq\") {\n await this.#sendNode(this.#createIqResult(node));\n return;\n }\n if (node.tag === \"message\") {\n const peer = requireAttr(node, \"to\");\n const messageId = requireAttr(node, \"id\");\n const accepted = await persistAcceptedBaileysMessage({\n acceptanceSignal: this.#acceptanceAbort.signal,\n appendEvent: this.params.appendEvent,\n node,\n onAcceptanceTimeout: () => {\n const close = resolveWhatsAppWebSocketClose(\n new Error(\"WhatsApp message acceptance timed out.\"),\n );\n this.socket.close(close.code, close.reason);\n },\n path: this.params.path,\n remoteJid: this.params.selfJid,\n signalBundles: this.params.signalBundles,\n });\n if (!accepted) {\n return;\n }\n await this.#sendNode({\n attrs: {\n class: \"message\",\n from: peer,\n id: messageId,\n to: this.params.selfJid,\n ...(node.attrs.type ? { type: node.attrs.type } : {}),\n },\n tag: \"ack\",\n });\n this.params.signalBundles.markMessageAcknowledged(peer, messageId);\n }\n }\n\n #createIqResult(node: BinaryNode): BinaryNode {\n const child = firstChild(node);\n const id = requireAttr(node, \"id\");\n const attrs = {\n from: node.attrs.to ?? S_WHATSAPP_NET,\n id,\n t: unixSeconds(),\n type: \"result\",\n };\n\n if (node.attrs.xmlns === \"encrypt\" && child?.tag === \"count\") {\n return { attrs, content: [{ attrs: { value: \"50\" }, tag: \"count\" }], tag: \"iq\" };\n }\n if (node.attrs.xmlns === \"encrypt\" && child?.tag === \"digest\") {\n return { attrs, content: [{ attrs: {}, tag: \"digest\" }], tag: \"iq\" };\n }\n if (node.attrs.xmlns === \"encrypt\" && child?.tag === \"key\") {\n try {\n return { attrs, content: [this.#createKeyList(child)], tag: \"iq\" };\n } catch (error) {\n return {\n attrs: { ...attrs, type: \"error\" },\n content: [\n {\n attrs: {\n code: \"400\",\n text: error instanceof Error ? error.message : String(error),\n type: \"modify\",\n },\n tag: \"error\",\n },\n ],\n tag: \"iq\",\n };\n }\n }\n if (node.attrs.xmlns === \"usync\" && child?.tag === \"usync\") {\n return { attrs, content: [this.#createUSyncResult(child)], tag: \"iq\" };\n }\n if (node.attrs.xmlns === \"abt\") {\n return {\n attrs,\n content: [\n {\n attrs: { hash: \"mock\" },\n content: [\n { attrs: { name: \"10518\", value: \"false\" }, tag: \"prop\" },\n { attrs: { name: \"14303\", value: \"false\" }, tag: \"prop\" },\n ],\n tag: \"props\",\n },\n ],\n tag: \"iq\",\n };\n }\n if (node.attrs.xmlns === \"blocklist\") {\n return { attrs, content: [{ attrs: {}, content: [], tag: \"list\" }], tag: \"iq\" };\n }\n if (node.attrs.xmlns === \"privacy\") {\n return {\n attrs,\n content: [\n {\n attrs: {},\n content: [\n { attrs: { name: \"readreceipts\", value: \"all\" }, tag: \"category\" },\n { attrs: { name: \"profile\", value: \"all\" }, tag: \"category\" },\n ],\n tag: \"privacy\",\n },\n ],\n tag: \"iq\",\n };\n }\n if (node.attrs.xmlns === \"w:m\" && child?.tag === \"media_conn\") {\n return {\n attrs,\n content: [\n {\n attrs: { auth: \"mock\", ttl: \"3600\" },\n content: [\n {\n attrs: {\n hostname: \"127.0.0.1\",\n maxContentLengthBytes: \"10485760\",\n },\n tag: \"host\",\n },\n ],\n tag: \"media_conn\",\n },\n ],\n tag: \"iq\",\n };\n }\n if (node.attrs.xmlns === \"w:g2\") {\n if (node.attrs.type === \"get\" && child?.tag === \"participating\") {\n return {\n attrs,\n content: [{ attrs: {}, content: [], tag: \"groups\" }],\n tag: \"iq\",\n };\n }\n if (node.attrs.type !== \"get\" || child?.tag !== \"query\") {\n return {\n attrs: { ...attrs, type: \"error\" },\n content: [\n {\n attrs: { code: \"501\", text: \"unsupported group operation\", type: \"cancel\" },\n tag: \"error\",\n },\n ],\n tag: \"iq\",\n };\n }\n return {\n attrs,\n content: [\n {\n attrs: {\n id: node.attrs.to ?? \"120363000000000000@g.us\",\n owner: this.params.selfJid,\n subject: \"Test Group\",\n s_t: unixSeconds(),\n },\n content: [{ attrs: { jid: this.params.selfJid }, tag: \"participant\" }],\n tag: \"group\",\n },\n ],\n tag: \"iq\",\n };\n }\n return { attrs, tag: \"iq\" };\n }\n\n #createKeyList(keyNode: BinaryNode): BinaryNode {\n const users = children(keyNode).filter((child) => child.tag === \"user\");\n const jids = users.map((userNode) => requireAttr(userNode, \"jid\"));\n const bundles = this.params.signalBundles.resolveMany(jids);\n return {\n attrs: {},\n content: jids.map((jid, index) => this.#createKeyUser(jid, bundles[index]!)),\n tag: \"list\",\n };\n }\n\n #createKeyUser(jid: string, bundle: MockSignalBundle): BinaryNode {\n return {\n attrs: { jid },\n content: [\n { attrs: {}, content: encodeBigEndian(bundle.registrationId), tag: \"registration\" },\n { attrs: {}, content: KEY_BUNDLE_TYPE, tag: \"type\" },\n {\n attrs: {},\n content: scrubSignalPublicKey(bundle.identityKey.public),\n tag: \"identity\",\n },\n xmppSignedPreKey(bundle.signedPreKey),\n xmppPreKey(bundle.preKey, bundle.preKeyId),\n ],\n tag: \"user\",\n };\n }\n\n #createUSyncResult(usyncNode: BinaryNode): BinaryNode {\n const requestList = children(usyncNode).find((child) => child.tag === \"list\");\n const requestedUsers = requestList\n ? children(requestList).filter((child) => child.tag === \"user\")\n : [];\n return {\n attrs: {\n index: usyncNode.attrs.index ?? \"0\",\n last: \"true\",\n sid: usyncNode.attrs.sid ?? \"mock\",\n },\n content: [\n {\n attrs: {},\n content: requestedUsers.map((user) => this.#createUSyncUser(requireAttr(user, \"jid\"))),\n tag: \"list\",\n },\n ],\n tag: \"usync\",\n };\n }\n\n #createUSyncUser(jid: string): BinaryNode {\n const lid = lidForJid(jid);\n if (canonicalizeWhatsAppUserCorrelationJid(jid)?.endsWith(\"@s.whatsapp.net\")) {\n this.params.signalBundles.associateLid(jid, lid);\n }\n return {\n attrs: { jid },\n content: [\n {\n attrs: {},\n content: [\n {\n attrs: {},\n content: [{ attrs: { id: \"0\" }, tag: \"device\" }],\n tag: \"device-list\",\n },\n ],\n tag: \"devices\",\n },\n { attrs: { val: lid }, tag: \"lid\" },\n ],\n tag: \"user\",\n };\n }\n\n async #recordNode(node: BinaryNode): Promise<void> {\n await this.params.appendEvent({\n at: new Date().toISOString(),\n body: sanitizeNodeForJson(node),\n method: \"WEBSOCKET\",\n path: this.params.path,\n query: {},\n type: \"api\",\n });\n }\n\n async #sendNode(node: BinaryNode): Promise<void> {\n await sendWhatsAppWebSocketPayload(this.socket, this.#noise.encodeNode(node));\n }\n}\n\nexport async function sendWhatsAppWebSocketPayload(\n socket: WhatsAppWebSocketSendTarget,\n payload: Uint8Array,\n): Promise<void> {\n if (socket.readyState !== WebSocket.OPEN) {\n throw new Error(\"WhatsApp WebSocket is not open.\");\n }\n if (socket.bufferedAmount + payload.byteLength > MAX_WHATSAPP_WEBSOCKET_BUFFERED_BYTES) {\n socket.terminate();\n throw new Error(\"WhatsApp WebSocket outbound buffer limit exceeded.\");\n }\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const finish = (error?: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n };\n const timeout = setTimeout(() => {\n socket.terminate();\n finish(new Error(\"WhatsApp WebSocket send timed out.\"));\n }, WHATSAPP_WEBSOCKET_SEND_TIMEOUT_MS);\n try {\n socket.send(payload, finish);\n } catch (error) {\n finish(error instanceof Error ? error : new Error(String(error)));\n }\n });\n}\n\nexport function resolveWhatsAppWebSocketClose(error: unknown): {\n code: 1002 | 1009 | 1011;\n reason: string;\n} {\n const message = error instanceof Error ? error.message : String(error);\n const code = /(?:backlog|exceeds|limit|payload is too large|too many)/iu.test(message)\n ? 1009\n : /(?:baileys|binary node|handshake|noise|protocol|unexpected end|unsupported|invalid)/iu.test(\n message,\n )\n ? 1002\n : 1011;\n return { code, reason: truncateWebSocketCloseReason(message) };\n}\n\nfunction truncateWebSocketCloseReason(reason: string): string {\n let result = \"\";\n for (const character of reason) {\n if (Buffer.byteLength(result + character) > MAX_WHATSAPP_WEBSOCKET_CLOSE_REASON_BYTES) {\n break;\n }\n result += character;\n }\n return result;\n}\n\nexport function attachWhatsAppBaileysWebSocketServer(\n params: WhatsAppBaileysWebSocketServerParams,\n): WhatsAppBaileysWebSocketServer {\n const signalBundles = new WhatsAppSignalBundleStore(\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n { messageAcceptanceTimeoutMs: params.messageAcceptanceTimeoutMs },\n );\n const sessions = new Set<WhatsAppBaileysWebSocketSession>();\n const pendingSessionMessages = new Set<Promise<void>>();\n const pendingMessages: WhatsAppBaileysInboundMessage[] = [];\n const maxPendingInboundMessages = resolveMaxPendingWhatsAppInboundMessages(\n params.maxPendingInboundMessages,\n );\n let pendingReservations = 0;\n let closing = false;\n let flushPromise = Promise.resolve();\n const webSocketServerOptions: ServerOptions & {\n maxBufferedChunks: number;\n maxFragments: number;\n } = {\n maxBufferedChunks: MAX_WHATSAPP_WEBSOCKET_FRAGMENTS,\n maxFragments: MAX_WHATSAPP_WEBSOCKET_FRAGMENTS,\n maxPayload: MAX_WHATSAPP_WEBSOCKET_MESSAGE_BYTES,\n noServer: true,\n };\n const wss = new WebSocketServer(webSocketServerOptions);\n const flushPendingMessages = (): Promise<void> => {\n const next = flushPromise.then(async () => {\n while (pendingMessages.length > 0) {\n if (closing) {\n return;\n }\n const message = pendingMessages[0];\n if (!message) {\n return;\n }\n const results = await Promise.all(\n [...sessions].map((session) => session.deliverInboundMessage(message)),\n );\n if (!results.some(Boolean)) {\n return;\n }\n pendingMessages.shift();\n }\n });\n flushPromise = next.catch(() => undefined);\n return next;\n };\n const rejectUpgrade = (socket: Duplex, response: string) => {\n socket.end(response, () => socket.destroy());\n };\n const handleUpgrade = (request: IncomingMessage, socket: Duplex, head: Buffer) => {\n const url = parseWhatsAppWebSocketUpgradeUrl(request.url);\n if (!url) {\n rejectUpgrade(socket, \"HTTP/1.1 400 Bad Request\\r\\nConnection: close\\r\\n\\r\\n\");\n return;\n }\n if (url.pathname !== params.path) {\n socket.destroy();\n return;\n }\n if (url.searchParams.get(\"access_token\") !== params.accessToken) {\n rejectUpgrade(socket, \"HTTP/1.1 401 Unauthorized\\r\\nConnection: close\\r\\n\\r\\n\");\n return;\n }\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit(\"connection\", ws, request);\n });\n };\n params.httpServer.on(\"upgrade\", handleUpgrade);\n wss.on(\"connection\", (socket: WebSocket) => {\n const session = new WhatsAppBaileysWebSocketSession(socket, {\n appendEvent: params.appendEvent,\n onOpen: () => {\n void flushPendingMessages();\n },\n path: params.path,\n selfJid: params.selfJid,\n signalBundles,\n });\n sessions.add(session);\n socket.once(\"close\", () => {\n session.abortAcceptance(new Error(\"WhatsApp WebSocket closed.\"));\n sessions.delete(session);\n });\n socket.on(\"error\", () => {\n session.abortAcceptance(new Error(\"WhatsApp WebSocket failed.\"));\n sessions.delete(session);\n socket.terminate();\n });\n socket.on(\"message\", (data) => {\n const pending = session.handleMessage(data);\n pendingSessionMessages.add(pending);\n void pending.then(\n () => pendingSessionMessages.delete(pending),\n () => pendingSessionMessages.delete(pending),\n );\n });\n });\n return {\n async close() {\n closing = true;\n params.httpServer.off(\"upgrade\", handleUpgrade);\n pendingMessages.length = 0;\n for (const session of sessions) {\n session.abortAcceptance(new Error(\"WhatsApp WebSocket server is shutting down.\"));\n }\n await closeWebSocketServer(wss);\n const messageResults = await Promise.allSettled([...pendingSessionMessages]);\n await flushPromise;\n const messageErrors = messageResults.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (messageErrors.length === 1) {\n throw messageErrors[0];\n }\n if (messageErrors.length > 1) {\n throw new AggregateError(messageErrors, \"WhatsApp WebSocket message drain failed.\");\n }\n },\n prepareInboundMessage(message) {\n if (pendingMessages.length + pendingReservations >= maxPendingInboundMessages) {\n return undefined;\n }\n let reserved = true;\n let settled = false;\n pendingReservations += 1;\n const releaseReservation = () => {\n if (reserved) {\n reserved = false;\n pendingReservations -= 1;\n }\n };\n return {\n cancel() {\n if (!settled) {\n settled = true;\n releaseReservation();\n }\n },\n async commit() {\n if (settled) {\n throw new Error(\"WhatsApp inbound delivery reservation is already settled.\");\n }\n settled = true;\n try {\n releaseReservation();\n if (pendingMessages.length >= maxPendingInboundMessages) {\n throw new Error(\"WhatsApp inbound delivery reservation exceeded queue capacity.\");\n }\n pendingMessages.push(message);\n await flushPendingMessages();\n return pendingMessages.includes(message) ? \"queued\" : \"delivered\";\n } finally {\n releaseReservation();\n }\n },\n };\n },\n };\n}\n\nexport function parseWhatsAppWebSocketUpgradeUrl(\n requestTarget: string | undefined,\n): URL | undefined {\n try {\n return new URL(requestTarget ?? \"/\", \"http://127.0.0.1\");\n } catch {\n return undefined;\n }\n}\n\nfunction rawDataByteLength(data: WhatsAppWebSocketRawData): number {\n if (Array.isArray(data)) {\n return data.reduce((total, chunk) => total + chunk.byteLength, 0);\n }\n return data.byteLength;\n}\n\nfunction rawDataToBuffer(data: WhatsAppWebSocketRawData): NodeBuffer {\n if (Buffer.isBuffer(data)) {\n return data;\n }\n if (Array.isArray(data)) {\n return Buffer.concat(data);\n }\n return Buffer.from(data);\n}\n\nfunction removeNoiseIntroHeader(chunk: NodeBuffer): NodeBuffer {\n if (chunk.subarray(0, NOISE_WA_HEADER.length).equals(NOISE_WA_HEADER)) {\n return chunk.subarray(NOISE_WA_HEADER.length);\n }\n if (chunk.length >= 11 && chunk.subarray(0, 2).toString(\"utf8\") === \"ED\" && chunk[3] === 1) {\n const routingInfoPrefix = chunk[4];\n if (routingInfoPrefix === undefined) {\n throw new Error(\"Invalid Baileys Noise routing header.\");\n }\n const routingInfoLength = (routingInfoPrefix << 16) | chunk.readUInt16BE(5);\n const headerLength = 7 + routingInfoLength + NOISE_WA_HEADER.length;\n if (\n chunk.subarray(headerLength - NOISE_WA_HEADER.length, headerLength).equals(NOISE_WA_HEADER)\n ) {\n return chunk.subarray(headerLength);\n }\n }\n throw new Error(\"Invalid Baileys Noise intro header.\");\n}\n\nfunction children(node: BinaryNode): BinaryNode[] {\n return Array.isArray(node.content) ? node.content : [];\n}\n\nexport async function persistAcceptedBaileysMessage(params: {\n acceptanceSignal?: AbortSignal | undefined;\n appendEvent(event: ServerRequestEvent): Promise<void>;\n node: BinaryNode;\n onAcceptanceTimeout?: (() => void) | undefined;\n path: string;\n remoteJid: string;\n signalBundles: WhatsAppSignalBundleStore;\n}): Promise<boolean> {\n const peer = canonicalizeWhatsAppUserCorrelationJid(params.node.attrs.to ?? \"\");\n const messageId = params.node.attrs.id;\n if (!peer || !messageId) {\n return false;\n }\n const messageKey = `${peer}\\0${messageId}`;\n const wasPreviouslyPersisted = params.signalBundles.hasPersistedMessage(messageKey);\n let persistenceSucceeded = wasPreviouslyPersisted;\n let operationSettled!: () => void;\n const operationSettlement = new Promise<void>((resolve) => {\n operationSettled = resolve;\n });\n let requiresSignalCommit = wasPreviouslyPersisted;\n let signalCommitSucceeded = false;\n const pendingAcceptanceOperations = new Set<Promise<unknown>>();\n const trackAcceptanceOperation = <T>(operation: Promise<T>): Promise<T> => {\n pendingAcceptanceOperations.add(operation);\n void operation.then(\n () => {\n persistenceSucceeded = true;\n pendingAcceptanceOperations.delete(operation);\n },\n () => pendingAcceptanceOperations.delete(operation),\n );\n return operation;\n };\n const drainAcceptanceOperations = async (): Promise<\n \"acknowledged\" | \"persisted\" | \"retryable\"\n > => {\n while (pendingAcceptanceOperations.size > 0) {\n await Promise.allSettled([...pendingAcceptanceOperations]);\n }\n await operationSettlement;\n if (!persistenceSucceeded) {\n params.signalBundles.releaseMessagePreKeyProtection(messageKey);\n return \"retryable\";\n }\n if (!requiresSignalCommit || signalCommitSucceeded) {\n params.signalBundles.releaseMessagePreKeyProtection(messageKey);\n return \"acknowledged\";\n }\n return \"persisted\";\n };\n const accepted = await params.signalBundles.acceptMessageOnce(\n messageKey,\n async (acceptanceSignal) => {\n try {\n acceptanceSignal.throwIfAborted();\n const candidates = encryptedMessageCandidates(params.node);\n requiresSignalCommit = candidates.length > 0;\n if (candidates.length === 0) {\n if (!wasPreviouslyPersisted) {\n await awaitWithAbort(\n trackAcceptanceOperation(\n params.appendEvent({\n accepted: true,\n at: new Date().toISOString(),\n body: sanitizeNodeForJson(params.node),\n method: \"WEBSOCKET\",\n path: params.path,\n query: {},\n type: \"api\",\n } as ServerRequestEvent & { accepted: true }),\n ),\n acceptanceSignal,\n );\n }\n return true;\n }\n const remoteCorrelationJid = canonicalizeWhatsAppUserCorrelationJid(params.remoteJid);\n candidates.sort((left, right) => {\n const leftIsSelf =\n canonicalizeWhatsAppUserCorrelationJid(left.recipientJid) === remoteCorrelationJid;\n const rightIsSelf =\n canonicalizeWhatsAppUserCorrelationJid(right.recipientJid) === remoteCorrelationJid;\n return Number(leftIsSelf) - Number(rightIsSelf);\n });\n for (const candidate of candidates) {\n const result = await params.signalBundles.transactDirectMessage({\n accept: async (decrypted) => {\n let text: string | undefined;\n try {\n text = readWhatsAppConversation(unpadRandomMax16(decrypted));\n } catch {\n text = undefined;\n }\n const message: WhatsAppBaileysInboundMessage | undefined = text\n ? {\n key: {\n fromMe: true,\n id: messageId,\n remoteJid: peer,\n },\n message: { conversation: text },\n messageTimestamp: Math.floor(Date.now() / 1000),\n }\n : undefined;\n if (!wasPreviouslyPersisted) {\n await awaitWithAbort(\n trackAcceptanceOperation(\n params.appendEvent({\n accepted: true,\n at: new Date().toISOString(),\n body: message ?? sanitizeNodeForJson(params.node),\n method: \"WEBSOCKET\",\n path: params.path,\n query: {},\n type: \"api\",\n } as ServerRequestEvent & { accepted: true }),\n ),\n acceptanceSignal,\n );\n }\n return true;\n },\n ciphertext: candidate.ciphertext,\n messageKey,\n recipientJid: candidate.recipientJid,\n remoteJid: params.remoteJid,\n signal: acceptanceSignal,\n type: candidate.type,\n });\n if (result.status === \"accepted\") {\n signalCommitSucceeded = true;\n return true;\n }\n }\n return false;\n } finally {\n if (!acceptanceSignal.aborted && !signalCommitSucceeded) {\n params.signalBundles.releaseMessagePreKeyProtection(messageKey);\n }\n operationSettled();\n }\n },\n {\n onTerminalTimeout: params.onAcceptanceTimeout,\n signal: params.acceptanceSignal,\n terminalDrain: drainAcceptanceOperations,\n },\n );\n if (accepted) {\n params.signalBundles.clearPersistedMessage(messageKey);\n }\n return accepted;\n}\n\nfunction encryptedMessageCandidates(node: BinaryNode): Array<{\n ciphertext: Uint8Array;\n recipientJid: string;\n type: \"msg\" | \"pkmsg\";\n}> {\n const result: Array<{\n ciphertext: Uint8Array;\n recipientJid: string;\n type: \"msg\" | \"pkmsg\";\n }> = [];\n const visit = (current: BinaryNode, recipientJid?: string) => {\n const nextRecipient = current.tag === \"to\" ? current.attrs.jid : recipientJid;\n if (\n current.tag === \"enc\" &&\n nextRecipient &&\n (current.attrs.type === \"msg\" || current.attrs.type === \"pkmsg\") &&\n current.content instanceof Uint8Array\n ) {\n result.push({\n ciphertext: current.content,\n recipientJid: nextRecipient,\n type: current.attrs.type,\n });\n }\n for (const child of children(current)) {\n visit(child, nextRecipient);\n }\n };\n visit(node);\n return result;\n}\n\nfunction signalKeyPair(pair: KeyPair): { privKey: Buffer; pubKey: Buffer } {\n return {\n privKey: Buffer.from(pair.private),\n pubKey: ensureSignalPublicKey(pair.public),\n };\n}\n\nfunction cloneSignalSession(session: SessionRecord): SessionRecord {\n return SessionRecord.deserialize(session.serialize());\n}\n\nexport function signalBundleIdentityKey(jid: string): string {\n return jid.replace(/(?:_\\d+)?(?::\\d+)?(?=@)/u, \"\");\n}\n\nfunction signalProtocolAddress(jid: string): { deviceId: number; name: string } | undefined {\n const match = /^(\\d{7,15})(?:_(\\d+))?(?::(\\d+))?@(s\\.whatsapp\\.net|lid)$/iu.exec(jid);\n if (!match) {\n return undefined;\n }\n const deviceId = Number(match[3] ?? \"0\");\n if (!Number.isSafeInteger(deviceId) || deviceId < 0) {\n return undefined;\n }\n const agent = match[2];\n const server = match[4]!.toLowerCase();\n return {\n deviceId,\n name:\n agent !== undefined ? `${match[1]}_${agent}` : server === \"lid\" ? `${match[1]}_1` : match[1]!,\n };\n}\n\nfunction unpadRandomMax16(value: Uint8Array): Buffer {\n const buffer = Buffer.from(value);\n const padding = buffer.at(-1);\n if (!padding || padding > 16 || padding > buffer.length) {\n throw new Error(\"Invalid WhatsApp message padding.\");\n }\n for (let index = buffer.length - padding; index < buffer.length; index += 1) {\n if (buffer[index] !== padding) {\n throw new Error(\"Invalid WhatsApp message padding.\");\n }\n }\n return buffer.subarray(0, buffer.length - padding);\n}\n\nfunction readWhatsAppConversation(message: Uint8Array): string | undefined {\n const fields = readProtobufLengthDelimitedFields(message);\n const conversation = readUtf8(fields.get(1)?.[0]);\n if (conversation?.trim()) {\n return conversation;\n }\n const extendedText = fields.get(6)?.[0];\n const extendedConversation = extendedText\n ? readUtf8(readProtobufLengthDelimitedFields(extendedText).get(1)?.[0])\n : undefined;\n if (extendedConversation?.trim()) {\n return extendedConversation;\n }\n const deviceSentMessage = fields.get(31)?.[0];\n const nestedMessage = deviceSentMessage\n ? readProtobufLengthDelimitedFields(deviceSentMessage).get(2)?.[0]\n : undefined;\n return nestedMessage ? readWhatsAppConversation(nestedMessage) : undefined;\n}\n\nconst MAX_WHATSAPP_PROTOBUF_GROUP_DEPTH = 64;\n\nfunction readProtobufLengthDelimitedFields(value: Uint8Array): Map<number, Uint8Array[]> {\n const fields = new Map<number, Uint8Array[]>();\n let offset = 0;\n while (offset < value.length) {\n const tag = readProtobufVarint(value, offset);\n offset = tag.offset;\n const fieldNumber = tag.value >>> 3;\n const wireType = tag.value & 7;\n if (fieldNumber < 1) {\n throw new Error(\"Invalid WhatsApp protobuf field.\");\n }\n if (wireType === 2) {\n const length = readProtobufVarint(value, offset);\n offset = length.offset;\n const end = offset + length.value;\n if (end > value.length) {\n throw new Error(\"Invalid WhatsApp protobuf length.\");\n }\n const entries = fields.get(fieldNumber) ?? [];\n entries.push(value.subarray(offset, end));\n fields.set(fieldNumber, entries);\n offset = end;\n continue;\n }\n if (wireType === 0) {\n offset = skipWhatsAppProtobufField(value, offset, fieldNumber, wireType, 0);\n continue;\n }\n offset = skipWhatsAppProtobufField(value, offset, fieldNumber, wireType, 0);\n }\n return fields;\n}\n\nfunction skipWhatsAppProtobufField(\n value: Uint8Array,\n offset: number,\n fieldNumber: number,\n wireType: number,\n groupDepth: number,\n): number {\n if (wireType === 0) {\n return readProtobufVarint(value, offset).offset;\n }\n if (wireType === 1) {\n const end = offset + 8;\n if (end > value.length) {\n throw new Error(\"Invalid WhatsApp protobuf fixed64 field.\");\n }\n return end;\n }\n if (wireType === 2) {\n const length = readProtobufVarint(value, offset);\n const end = length.offset + length.value;\n if (end > value.length) {\n throw new Error(\"Invalid WhatsApp protobuf length.\");\n }\n return end;\n }\n if (wireType === 3) {\n if (groupDepth >= MAX_WHATSAPP_PROTOBUF_GROUP_DEPTH) {\n throw new Error(\"WhatsApp protobuf group nesting exceeds the supported depth.\");\n }\n let nestedOffset = offset;\n while (nestedOffset < value.length) {\n const tag = readProtobufVarint(value, nestedOffset);\n nestedOffset = tag.offset;\n const nestedFieldNumber = tag.value >>> 3;\n const nestedWireType = tag.value & 7;\n if (nestedFieldNumber < 1) {\n throw new Error(\"Invalid WhatsApp protobuf field.\");\n }\n if (nestedWireType === 4) {\n if (nestedFieldNumber !== fieldNumber) {\n throw new Error(\"Mismatched WhatsApp protobuf end group.\");\n }\n return nestedOffset;\n }\n nestedOffset = skipWhatsAppProtobufField(\n value,\n nestedOffset,\n nestedFieldNumber,\n nestedWireType,\n groupDepth + 1,\n );\n }\n throw new Error(\"Unterminated WhatsApp protobuf group.\");\n }\n if (wireType === 4) {\n throw new Error(\"Unexpected WhatsApp protobuf end group.\");\n }\n if (wireType === 5) {\n const end = offset + 4;\n if (end > value.length) {\n throw new Error(\"Invalid WhatsApp protobuf fixed32 field.\");\n }\n return end;\n }\n throw new Error(`Unsupported WhatsApp protobuf wire type: ${wireType}.`);\n}\n\nfunction readProtobufVarint(value: Uint8Array, start: number): { offset: number; value: number } {\n let result = 0;\n let shift = 0;\n let offset = start;\n while (offset < value.length && shift <= 28) {\n const byte = value[offset++]!;\n result += (byte & 0x7f) * 2 ** shift;\n if ((byte & 0x80) === 0) {\n if (!Number.isSafeInteger(result)) {\n break;\n }\n return { offset, value: result };\n }\n shift += 7;\n }\n throw new Error(\"Invalid WhatsApp protobuf varint.\");\n}\n\nfunction readUtf8(value: Uint8Array | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const text = Buffer.from(value).toString(\"utf8\");\n return Buffer.from(text, \"utf8\").equals(Buffer.from(value)) ? text : undefined;\n}\n\nfunction createInboundMessageNode(message: WhatsAppBaileysInboundMessage): BinaryNode {\n const from = message.key.remoteJid;\n const attrs: Record<string, string> = {\n from,\n id: message.key.id,\n notify: message.pushName ?? \"Test User\",\n t: String(message.messageTimestamp),\n };\n if (isGroupJid(from) && message.key.participant) {\n attrs.participant = message.key.participant;\n }\n return {\n attrs,\n content: [\n {\n attrs: {},\n content: encodePlaintextInboundMessage(message.message),\n tag: \"plaintext\",\n },\n ],\n tag: \"message\",\n };\n}\n\nfunction createIv(counter: number): NodeBuffer {\n const iv = Buffer.alloc(IV_LENGTH);\n iv.writeUInt32BE(counter, 8);\n return iv;\n}\n\nfunction encodeLengthPrefixed(data: Uint8Array): NodeBuffer {\n const frame = Buffer.allocUnsafe(3 + data.byteLength);\n frame[0] = (data.byteLength >>> 16) & 0xff;\n frame[1] = (data.byteLength >>> 8) & 0xff;\n frame[2] = data.byteLength & 0xff;\n frame.set(data, 3);\n return frame;\n}\n\nfunction firstChild(node: BinaryNode): BinaryNode | undefined {\n return children(node)[0];\n}\n\nfunction encodePlaintextConversationMessage(text: string): NodeBuffer {\n const textBytes = Buffer.from(text, \"utf8\");\n return Buffer.from([0x0a, ...encodeVarint(textBytes.byteLength), ...textBytes]);\n}\n\nfunction encodePlaintextInboundMessage(\n message: WhatsAppBaileysInboundMessage[\"message\"],\n): NodeBuffer {\n if (message.audioMessage) {\n return encodePlaintextAudioMessage(message.audioMessage);\n }\n return encodePlaintextConversationMessage(message.conversation);\n}\n\nfunction encodePlaintextAudioMessage(audio: WhatsAppBaileysAudioMessage): NodeBuffer {\n const fields = [\n encodeLengthDelimitedProtobufField(1, Buffer.from(audio.url, \"utf8\")),\n encodeLengthDelimitedProtobufField(2, Buffer.from(audio.mimetype, \"utf8\")),\n encodeLengthDelimitedProtobufField(3, audio.fileSha256),\n encodeVarintProtobufField(4, audio.fileLength),\n ...(audio.seconds === undefined ? [] : [encodeVarintProtobufField(5, audio.seconds)]),\n encodeVarintProtobufField(6, audio.ptt ? 1 : 0),\n encodeLengthDelimitedProtobufField(7, audio.mediaKey),\n encodeLengthDelimitedProtobufField(8, audio.fileEncSha256),\n encodeVarintProtobufField(10, audio.mediaKeyTimestamp),\n ];\n return encodeLengthDelimitedProtobufField(8, Buffer.concat(fields));\n}\n\nfunction encodeLengthDelimitedProtobufField(fieldNumber: number, value: Uint8Array): NodeBuffer {\n return Buffer.concat([\n Buffer.from(encodeVarint((fieldNumber << 3) | 2)),\n Buffer.from(encodeVarint(value.byteLength)),\n Buffer.from(value),\n ]);\n}\n\nfunction encodeVarintProtobufField(fieldNumber: number, value: number): NodeBuffer {\n return Buffer.from([...encodeVarint(fieldNumber << 3), ...encodeVarint(value)]);\n}\n\nfunction encodeVarint(value: number): number[] {\n const bytes: number[] = [];\n let remaining = value;\n while (remaining >= 0x80) {\n bytes.push((remaining & 0x7f) | 0x80);\n remaining = Math.floor(remaining / 0x80);\n }\n bytes.push(remaining);\n return bytes;\n}\n\nfunction isGroupJid(jid: string): boolean {\n return jid.endsWith(\"@g.us\");\n}\n\nfunction requireAttr(node: BinaryNode, name: string): string {\n const value = node.attrs[name];\n if (!value) {\n throw new Error(`Baileys node <${node.tag}> requires ${name}.`);\n }\n return value;\n}\n\nfunction lidForJid(jid: string): string {\n const user = jid.split(\"@\", 1)[0]?.split(\":\", 1)[0] ?? \"15550000000\";\n return `${user}@lid`;\n}\n\nfunction sanitizeNodeForJson(value: unknown): unknown {\n if (Buffer.isBuffer(value) || value instanceof Uint8Array) {\n return { base64: Buffer.from(value).toString(\"base64\"), type: \"Buffer\" };\n }\n if (Array.isArray(value)) {\n return value.map(sanitizeNodeForJson);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [key, sanitizeNodeForJson(entry)]),\n );\n }\n return value;\n}\n\nfunction unixSeconds(): string {\n return Math.floor(Date.now() / 1000).toString();\n}\n"]}
1
+ {"version":3,"file":"whatsapp-baileys-websocket.js","sourceRoot":"","sources":["../../../src/servers/whatsapp-baileys-websocket.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport type { IncomingMessage, Server } from \"node:http\";\nimport type { Duplex } from \"node:stream\";\nimport { ProtocolAddress, SessionCipher, SessionRecord, type SignalStorage } from \"libsignal\";\nimport {\n aesDecryptGCM,\n aesEncryptGCM,\n Curve,\n encodeBigEndian,\n ensureSignalPublicKey,\n generateSignalKeyPair,\n hkdf,\n NOISE_MODE,\n NOISE_WA_HEADER,\n sha256,\n signedKeyPair,\n scrubSignalPublicKey,\n type KeyPair,\n type SignedKeyPair,\n} from \"./whatsapp-wire/crypto.js\";\nimport {\n decodeBinaryNode,\n encodeBinaryNode,\n S_WHATSAPP_NET,\n type BinaryNode,\n} from \"./whatsapp-wire/binary-node.js\";\nimport { decodeHandshakeMessage, encodeHandshakeMessage } from \"./whatsapp-wire/handshake.js\";\nimport { KEY_BUNDLE_TYPE, xmppPreKey, xmppSignedPreKey } from \"./whatsapp-wire/signal.js\";\nimport { WebSocket, WebSocketServer, type ServerOptions } from \"ws\";\nimport type { ServerRequestEvent } from \"./http.js\";\nimport { closeWebSocketServer } from \"./websocket.js\";\nimport {\n canonicalizeWhatsAppChatCorrelationJid,\n canonicalizeWhatsAppUserCorrelationJid,\n} from \"./whatsapp-jid.js\";\n\n// Keep the local server independent from Baileys at runtime. Tests use Baileys\n// as a black-box client to verify this narrow WhatsApp Web wire subset.\nconst EMPTY_BUFFER = Buffer.alloc(0);\nconst IV_LENGTH = 12;\nconst MAX_PENDING_INBOUND_MESSAGES = 1_000;\nexport const MAX_WHATSAPP_NOISE_FRAME_BYTES = 2 * 1024 * 1024;\nexport const MAX_WHATSAPP_WEBSOCKET_BUFFERED_BYTES = 4 * 1024 * 1024;\nexport const MAX_WHATSAPP_WEBSOCKET_MESSAGE_BYTES = 4 * 1024 * 1024;\nexport const MAX_WHATSAPP_NOISE_BUFFER_CHUNKS = 1_024;\nexport const MAX_WHATSAPP_NOISE_FRAMES_PER_MESSAGE = 1_024;\nexport const WHATSAPP_WEBSOCKET_SEND_TIMEOUT_MS = 5_000;\nconst MAX_PENDING_WEBSOCKET_BYTES = 8 * 1024 * 1024;\nconst MAX_PENDING_WEBSOCKET_MESSAGES = 32;\nconst MAX_WHATSAPP_PENDING_ACKNOWLEDGEMENTS = 10_000;\nconst MAX_WHATSAPP_PENDING_ACKNOWLEDGEMENT_AGE_MS = 5 * 60 * 1_000;\nconst MAX_WHATSAPP_RECENT_ACKNOWLEDGEMENTS = 10_000;\nconst MAX_NODE_TIMER_DELAY_MS = 2_147_483_647;\nexport const MAX_WHATSAPP_WEBSOCKET_FRAGMENTS = 1_024;\nexport const MAX_WHATSAPP_SIGNAL_BUNDLES = 1_024;\nexport const MAX_WHATSAPP_SIGNAL_PREKEYS_PER_BUNDLE = 32;\nexport const MAX_WHATSAPP_SIGNAL_SESSIONS_PER_BUNDLE = 32;\nexport const MAX_WHATSAPP_WEBSOCKET_CLOSE_REASON_BYTES = 123;\nexport const WHATSAPP_MESSAGE_ACCEPTANCE_TIMEOUT_MS = 5_000;\nexport const WHATSAPP_SIGNAL_PREKEY_RESERVATION_TTL_MS = 5 * 60 * 1_000;\ntype NodeBuffer = Buffer<ArrayBufferLike>;\ntype WhatsAppWebSocketRawData = NodeBuffer | ArrayBuffer | NodeBuffer[];\ntype WhatsAppWebSocketSendTarget = {\n bufferedAmount: number;\n readyState: number;\n send(data: Uint8Array, callback: (error?: Error) => void): void;\n terminate(): void;\n};\nconst WHATSAPP_NOISE_CERT_CHAIN = Buffer.from(\n \"CncKMwjjAhADGiCRKg7Kg1iu4CSulwLBaxX51Tefw6VXGgZqcr5OEbXIRiDQ04bOBijQjZ/TBhJA34Bj82jAHhLpCWBNVBlGnFDieamd8+138S57uMt9ke9mrn5r4+VepwBPKEgHjob6bR70rlCmWDkxZv+CfVjIAxJ2CjIIAxAAGiAcUamsMDmUxsjQuS6hh4pTNHZZnMWZ++o1mX2aqQzOYiCAka6+Bij/3rfcBhJAJw8pRkhTn+1IcOJQVN1OlZg6uikYnCumyO7acFVVX3U3QPXsGSq2TCbCbWrebSC593Su43EgprIDlfU8ZgWFBw==\",\n \"base64\",\n);\n\nexport type WhatsAppBaileysWebSocketServer = {\n close(): Promise<void>;\n prepareInboundMessage(\n message: WhatsAppBaileysInboundMessage,\n ): PreparedWhatsAppBaileysInboundDelivery | undefined;\n};\n\nexport type WhatsAppBaileysWebSocketServerParams = {\n accessToken: string;\n appendEvent(event: ServerRequestEvent): Promise<void>;\n httpServer: Server;\n maxPendingInboundMessages?: number | undefined;\n messageAcceptanceTimeoutMs?: number | undefined;\n path: string;\n selfJid: string;\n};\n\nexport type PreparedWhatsAppBaileysInboundDelivery = {\n cancel(): void;\n commit(): Promise<\"delivered\" | \"queued\">;\n};\n\nexport type WhatsAppBaileysInboundMessage = {\n key: {\n fromMe: boolean;\n id: string;\n participant?: string | undefined;\n remoteJid: string;\n };\n message:\n | {\n audioMessage?: never;\n conversation: string;\n }\n | {\n audioMessage: WhatsAppBaileysAudioMessage;\n conversation?: never;\n };\n messageTimestamp: number;\n pushName?: string | undefined;\n};\n\nexport type WhatsAppBaileysAudioMessage = {\n fileEncSha256: Buffer;\n fileLength: number;\n fileSha256: Buffer;\n mediaKey: Buffer;\n mediaKeyTimestamp: number;\n mimetype: string;\n ptt: boolean;\n seconds?: number | undefined;\n url: string;\n};\n\nexport function resolveMaxPendingWhatsAppInboundMessages(value: number | undefined): number {\n const resolved = value ?? MAX_PENDING_INBOUND_MESSAGES;\n if (!Number.isSafeInteger(resolved) || resolved < 1) {\n throw new Error(\"WhatsApp maxPendingInboundMessages must be a positive safe integer.\");\n }\n return resolved;\n}\n\nexport type MockSignalBundle = {\n identityKey: KeyPair;\n preKey: KeyPair;\n preKeyId: number;\n registrationId: number;\n signedPreKey: SignedKeyPair;\n};\n\nexport type WhatsAppSignalDecryptResult<T> =\n | { status: \"accepted\"; value: T }\n | { error: unknown; status: \"decrypt-failed\" }\n | { status: \"unavailable\" }\n | { status: \"rejected\" };\n\nexport type WhatsAppSignalBundleStoreOptions = {\n maxPreKeysPerBundle?: number | undefined;\n maxSessionsPerBundle?: number | undefined;\n messageAcceptanceTimeoutMs?: number | undefined;\n preKeyReservationTtlMs?: number | undefined;\n};\n\ntype PendingWhatsAppAcknowledgement = {\n acceptance: Promise<boolean>;\n acceptedAt: number | undefined;\n acknowledged: boolean;\n};\n\ntype StoredSignalBundle = Omit<MockSignalBundle, \"preKey\" | \"preKeyId\"> & {\n availablePreKeyIds: number[];\n nextPreKeyId: number;\n pendingPreKeyIds: Set<number>;\n preKeyReservations: Map<number, number>;\n preKeys: Map<number, KeyPair>;\n protectedPreKeyIds: Map<number, number>;\n};\n\ntype WhatsAppMessageAcceptanceOptions = {\n onTerminalTimeout?: (() => void) | undefined;\n signal?: AbortSignal | undefined;\n terminalDrain?: (() => Promise<\"acknowledged\" | \"persisted\" | \"retryable\">) | undefined;\n timeoutMs?: number | undefined;\n};\n\ntype TerminalWhatsAppAcceptance = {\n error: Error;\n};\n\nasync function awaitWithAbort<T>(operation: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) {\n return await operation;\n }\n return await new Promise<T>((resolve, reject) => {\n const abort = () => reject(signal.reason);\n // The operation already started; even pre-aborted waits must observe its rejection.\n void operation.then(\n (value) => {\n signal.removeEventListener(\"abort\", abort);\n resolve(value);\n },\n (error) => {\n signal.removeEventListener(\"abort\", abort);\n reject(error);\n },\n );\n signal.throwIfAborted();\n signal.addEventListener(\"abort\", abort, { once: true });\n });\n}\n\nexport class WhatsAppSignalBundleStore {\n readonly #acknowledgedMessageIds = new Map<string, true>();\n readonly #bundles = new Map<string, StoredSignalBundle>();\n readonly #lidByPhoneNumber = new Map<string, string>();\n readonly #maxPreKeysPerBundle: number;\n readonly #maxSessionsPerBundle: number;\n readonly #maxTerminalAcceptances: number;\n readonly #messagePreKeyProtections = new Map<string, Map<string, Set<number>>>();\n readonly #messageAcceptanceTimeoutMs: number;\n readonly #pendingAcknowledgements = new Map<string, PendingWhatsAppAcknowledgement>();\n readonly #pendingTransactions = new Map<string, Promise<void>>();\n readonly #persistedMessageIds = new Map<string, true>();\n readonly #preKeyReservationTtlMs: number;\n readonly #sessions = new Map<string, Map<string, SessionRecord>>();\n readonly #terminalAcceptances = new Map<string, TerminalWhatsAppAcceptance>();\n\n constructor(\n private readonly maxBundles = MAX_WHATSAPP_SIGNAL_BUNDLES,\n private readonly maxPendingAcknowledgements = MAX_WHATSAPP_PENDING_ACKNOWLEDGEMENTS,\n private readonly maxRecentAcknowledgements = MAX_WHATSAPP_RECENT_ACKNOWLEDGEMENTS,\n private readonly maxPendingAcknowledgementAgeMs = MAX_WHATSAPP_PENDING_ACKNOWLEDGEMENT_AGE_MS,\n private readonly now: () => number = Date.now,\n options: WhatsAppSignalBundleStoreOptions = {},\n ) {\n const maxPreKeysPerBundle =\n options.maxPreKeysPerBundle ?? MAX_WHATSAPP_SIGNAL_PREKEYS_PER_BUNDLE;\n const maxSessionsPerBundle =\n options.maxSessionsPerBundle ?? MAX_WHATSAPP_SIGNAL_SESSIONS_PER_BUNDLE;\n const messageAcceptanceTimeoutMs =\n options.messageAcceptanceTimeoutMs ?? WHATSAPP_MESSAGE_ACCEPTANCE_TIMEOUT_MS;\n const preKeyReservationTtlMs =\n options.preKeyReservationTtlMs ?? WHATSAPP_SIGNAL_PREKEY_RESERVATION_TTL_MS;\n if (!Number.isSafeInteger(maxBundles) || maxBundles < 1) {\n throw new Error(\"WhatsApp maxSignalBundles must be a positive safe integer.\");\n }\n if (!Number.isSafeInteger(maxSessionsPerBundle) || maxSessionsPerBundle < 1) {\n throw new Error(\"WhatsApp maxSignalSessionsPerBundle must be a positive safe integer.\");\n }\n if (!Number.isSafeInteger(maxPreKeysPerBundle) || maxPreKeysPerBundle < 1) {\n throw new Error(\"WhatsApp maxSignalPreKeysPerBundle must be a positive safe integer.\");\n }\n if (\n !Number.isSafeInteger(messageAcceptanceTimeoutMs) ||\n messageAcceptanceTimeoutMs < 1 ||\n messageAcceptanceTimeoutMs > MAX_NODE_TIMER_DELAY_MS\n ) {\n throw new Error(\n `WhatsApp messageAcceptanceTimeoutMs must be a positive integer no greater than ${MAX_NODE_TIMER_DELAY_MS}.`,\n );\n }\n if (!Number.isSafeInteger(preKeyReservationTtlMs) || preKeyReservationTtlMs < 1) {\n throw new Error(\"WhatsApp preKeyReservationTtlMs must be a positive safe integer.\");\n }\n if (!Number.isSafeInteger(maxPendingAcknowledgements) || maxPendingAcknowledgements < 1) {\n throw new Error(\"WhatsApp maxPendingAcknowledgements must be a positive safe integer.\");\n }\n if (!Number.isSafeInteger(maxRecentAcknowledgements) || maxRecentAcknowledgements < 1) {\n throw new Error(\"WhatsApp maxRecentAcknowledgements must be a positive safe integer.\");\n }\n if (\n !Number.isSafeInteger(maxPendingAcknowledgementAgeMs) ||\n maxPendingAcknowledgementAgeMs < 1\n ) {\n throw new Error(\"WhatsApp maxPendingAcknowledgementAgeMs must be a positive safe integer.\");\n }\n this.#maxPreKeysPerBundle = maxPreKeysPerBundle;\n this.#maxSessionsPerBundle = maxSessionsPerBundle;\n this.#maxTerminalAcceptances = Math.min(\n Number.MAX_SAFE_INTEGER,\n maxPendingAcknowledgements + maxRecentAcknowledgements,\n );\n this.#messageAcceptanceTimeoutMs = messageAcceptanceTimeoutMs;\n this.#preKeyReservationTtlMs = preKeyReservationTtlMs;\n }\n\n get size(): number {\n return this.#bundles.size;\n }\n\n get lidMappingSize(): number {\n return this.#lidByPhoneNumber.size;\n }\n\n get sessionCount(): number {\n let count = 0;\n for (const sessions of this.#sessions.values()) {\n count += sessions.size;\n }\n return count;\n }\n\n async acceptMessageOnce(\n messageKey: string,\n operation: (signal: AbortSignal) => Promise<boolean>,\n options: WhatsAppMessageAcceptanceOptions = {},\n ): Promise<boolean> {\n this.#recoverExpiredPendingAcknowledgements();\n const pendingAcceptance = this.#pendingAcknowledgements.get(messageKey);\n if (pendingAcceptance) {\n return await pendingAcceptance.acceptance;\n }\n const terminalAcceptance = this.#terminalAcceptances.get(messageKey);\n if (terminalAcceptance) {\n this.#terminalAcceptances.delete(messageKey);\n this.#terminalAcceptances.set(messageKey, terminalAcceptance);\n throw terminalAcceptance.error;\n }\n if (this.#acknowledgedMessageIds.delete(messageKey)) {\n this.#acknowledgedMessageIds.set(messageKey, true);\n return true;\n }\n if (\n this.#terminalAcceptances.size + this.#pendingAcknowledgements.size >=\n this.#maxTerminalAcceptances\n ) {\n throw new Error(\n `WhatsApp terminal acceptance limit exceeded (${this.#maxTerminalAcceptances}).`,\n );\n }\n if (this.#pendingAcknowledgements.size >= this.maxPendingAcknowledgements) {\n throw new Error(\n `WhatsApp pending acknowledgement limit exceeded (${this.maxPendingAcknowledgements}).`,\n );\n }\n const timeoutMs = options.timeoutMs ?? this.#messageAcceptanceTimeoutMs;\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > MAX_NODE_TIMER_DELAY_MS) {\n throw new Error(\n `WhatsApp message acceptance timeout must be a positive integer no greater than ${MAX_NODE_TIMER_DELAY_MS}.`,\n );\n }\n options.signal?.throwIfAborted();\n const controller = new AbortController();\n const operationPromise = Promise.resolve().then(() => operation(controller.signal));\n let terminalFenced = false;\n const fenceTerminalAcceptance = (error: Error) => {\n if (terminalFenced) {\n return;\n }\n terminalFenced = true;\n controller.abort(error);\n const terminalDrain = Promise.all([\n operationPromise.then(\n () => undefined,\n () => undefined,\n ),\n Promise.resolve()\n .then(() => options.terminalDrain?.())\n .then(\n (disposition) => disposition ?? \"retryable\",\n () => \"retryable\" as const,\n ),\n ]).then(([, disposition]) => disposition);\n this.#rememberTerminalAcceptance(messageKey, error, terminalDrain);\n };\n const abortFromOwner = () => {\n const reason = options.signal?.reason;\n fenceTerminalAcceptance(\n reason instanceof Error ? reason : new Error(\"WhatsApp message acceptance cancelled.\"),\n );\n };\n if (options.signal?.aborted) {\n abortFromOwner();\n } else {\n options.signal?.addEventListener(\"abort\", abortFromOwner, { once: true });\n }\n const timeout = setTimeout(() => {\n const error = new Error(\"WhatsApp message acceptance timed out.\");\n fenceTerminalAcceptance(error);\n try {\n options.onTerminalTimeout?.();\n } catch {}\n }, timeoutMs);\n timeout.unref();\n let pendingAcknowledgement: PendingWhatsAppAcknowledgement;\n const acceptance = Promise.resolve().then(async () => {\n try {\n const accepted = await awaitWithAbort(operationPromise, controller.signal);\n if (!accepted) {\n if (this.#pendingAcknowledgements.get(messageKey) === pendingAcknowledgement) {\n this.#pendingAcknowledgements.delete(messageKey);\n }\n return false;\n }\n if (pendingAcknowledgement.acknowledged) {\n if (this.#pendingAcknowledgements.get(messageKey) === pendingAcknowledgement) {\n this.#pendingAcknowledgements.delete(messageKey);\n }\n this.#rememberAcknowledgedMessage(messageKey);\n } else {\n pendingAcknowledgement.acceptedAt = this.now();\n }\n return true;\n } catch (error) {\n if (this.#pendingAcknowledgements.get(messageKey) === pendingAcknowledgement) {\n this.#pendingAcknowledgements.delete(messageKey);\n }\n throw error;\n } finally {\n clearTimeout(timeout);\n options.signal?.removeEventListener(\"abort\", abortFromOwner);\n }\n });\n pendingAcknowledgement = {\n acceptance,\n acceptedAt: undefined,\n acknowledged: false,\n };\n this.#pendingAcknowledgements.set(messageKey, pendingAcknowledgement);\n return await acceptance;\n }\n\n markMessageAcknowledged(peerJid: string, messageId: string): void {\n const peer = canonicalizeWhatsAppChatCorrelationJid(peerJid);\n if (peer && messageId) {\n const messageKey = `${peer}\\0${messageId}`;\n this.#recoverExpiredPendingAcknowledgements();\n const pendingAcknowledgement = this.#pendingAcknowledgements.get(messageKey);\n if (!pendingAcknowledgement) {\n return;\n }\n if (pendingAcknowledgement.acceptedAt === undefined) {\n pendingAcknowledgement.acknowledged = true;\n return;\n }\n this.#pendingAcknowledgements.delete(messageKey);\n this.#rememberAcknowledgedMessage(messageKey);\n }\n }\n\n hasPersistedMessage(messageKey: string): boolean {\n return this.#persistedMessageIds.has(messageKey);\n }\n\n clearPersistedMessage(messageKey: string): void {\n this.#persistedMessageIds.delete(messageKey);\n this.releaseMessagePreKeyProtection(messageKey);\n }\n\n releaseMessagePreKeyProtection(messageKey: string): void {\n const protections = this.#messagePreKeyProtections.get(messageKey);\n if (!protections) {\n return;\n }\n this.#messagePreKeyProtections.delete(messageKey);\n for (const [identityKey, preKeyIds] of protections) {\n const bundle = this.#bundles.get(identityKey);\n if (!bundle) {\n continue;\n }\n for (const preKeyId of preKeyIds) {\n const references = bundle.protectedPreKeyIds.get(preKeyId) ?? 0;\n if (references <= 1) {\n bundle.protectedPreKeyIds.delete(preKeyId);\n } else {\n bundle.protectedPreKeyIds.set(preKeyId, references - 1);\n }\n }\n }\n }\n\n associateLid(phoneNumberJid: string, lidJid: string): void {\n const phoneNumber = canonicalizeWhatsAppUserCorrelationJid(phoneNumberJid);\n const lid = canonicalizeWhatsAppUserCorrelationJid(lidJid);\n if (!phoneNumber?.endsWith(\"@s.whatsapp.net\") || !lid?.endsWith(\"@lid\")) {\n throw new Error(\"Invalid WhatsApp PN/LID signal mapping.\");\n }\n const phoneNumberKey = signalBundleIdentityKey(phoneNumber);\n this.#lidByPhoneNumber.delete(phoneNumberKey);\n this.#lidByPhoneNumber.set(phoneNumberKey, signalBundleIdentityKey(lid));\n if (this.#lidByPhoneNumber.size > this.maxBundles) {\n const oldestPhoneNumber = this.#lidByPhoneNumber.keys().next().value;\n if (oldestPhoneNumber !== undefined) {\n this.#lidByPhoneNumber.delete(oldestPhoneNumber);\n }\n }\n }\n\n resolveAssociatedLid(phoneNumberJid: string): string | undefined {\n const phoneNumber = canonicalizeWhatsAppUserCorrelationJid(phoneNumberJid);\n if (!phoneNumber?.endsWith(\"@s.whatsapp.net\")) {\n return undefined;\n }\n return this.#lidByPhoneNumber.get(signalBundleIdentityKey(phoneNumber));\n }\n\n resolveMany(jids: string[]): MockSignalBundle[] {\n const uniqueNewIdentities = new Set<string>();\n const identityKeys: string[] = [];\n for (const jid of jids) {\n const canonical = canonicalizeWhatsAppUserCorrelationJid(jid);\n if (!canonical) {\n throw new Error(`Invalid WhatsApp signal bundle JID: ${jid}.`);\n }\n const identityKey = signalBundleIdentityKey(canonical);\n identityKeys.push(identityKey);\n if (!this.#bundles.has(identityKey)) {\n uniqueNewIdentities.add(identityKey);\n }\n }\n if (this.#bundles.size + uniqueNewIdentities.size > this.maxBundles) {\n // Published bundle identities stay stable for the store lifetime.\n throw new Error(`WhatsApp signal bundle limit exceeded (${this.maxBundles}).`);\n }\n const stagedNewBundles = new Map<string, StoredSignalBundle>();\n const stagedReservations = new Map<\n string,\n {\n availablePreKeyIds: number[];\n bundle: StoredSignalBundle;\n nextPreKeyId: number;\n preKeyReservations: Map<number, number>;\n preKeys: Map<number, KeyPair>;\n }\n >();\n const reservationNow = this.now();\n const stagedForIdentity = (identityKey: string) => {\n let bundle = this.#bundles.get(identityKey) ?? stagedNewBundles.get(identityKey);\n if (!bundle) {\n bundle = this.#createBundle();\n stagedNewBundles.set(identityKey, bundle);\n }\n let staged = stagedReservations.get(identityKey);\n if (!staged) {\n const preKeys = new Map(bundle.preKeys);\n const preKeyReservations = new Map(bundle.preKeyReservations);\n for (const [preKeyId, reservedAt] of preKeyReservations) {\n if (\n reservationNow - reservedAt >= this.#preKeyReservationTtlMs &&\n !bundle.protectedPreKeyIds.has(preKeyId)\n ) {\n preKeyReservations.delete(preKeyId);\n preKeys.delete(preKeyId);\n }\n }\n staged = {\n availablePreKeyIds: bundle.availablePreKeyIds.filter((id) => preKeys.has(id)),\n bundle,\n nextPreKeyId: bundle.nextPreKeyId,\n preKeyReservations,\n preKeys,\n };\n stagedReservations.set(identityKey, staged);\n }\n return staged;\n };\n const requestedPreKeys = new Map<string, number>();\n for (const identityKey of identityKeys) {\n requestedPreKeys.set(identityKey, (requestedPreKeys.get(identityKey) ?? 0) + 1);\n }\n for (const [identityKey, requested] of requestedPreKeys) {\n const staged = stagedForIdentity(identityKey);\n const available = staged.availablePreKeyIds.length;\n const creatable = Math.max(\n 0,\n this.#maxPreKeysPerBundle - staged.preKeys.size - staged.bundle.pendingPreKeyIds.size,\n );\n if (requested > available + creatable) {\n throw new Error(\n `WhatsApp Signal prekey reservation limit exceeded (${this.#maxPreKeysPerBundle}).`,\n );\n }\n }\n const reservedBundles = identityKeys.map((identityKey) => {\n const staged = stagedForIdentity(identityKey);\n const { bundle } = staged;\n let preKeyId = staged.availablePreKeyIds.shift();\n if (preKeyId === undefined) {\n const created = this.#createPreKey(\n staged.preKeys,\n staged.nextPreKeyId,\n staged.bundle.pendingPreKeyIds,\n );\n preKeyId = created.id;\n staged.preKeys.set(created.id, created.keyPair);\n staged.nextPreKeyId = created.nextPreKeyId;\n }\n const preKey = staged.preKeys.get(preKeyId);\n if (!preKey) {\n throw new Error(\"WhatsApp Signal prekey reservation is unavailable.\");\n }\n staged.preKeyReservations.set(preKeyId, reservationNow);\n return {\n identityKey: bundle.identityKey,\n preKey,\n preKeyId,\n registrationId: bundle.registrationId,\n signedPreKey: bundle.signedPreKey,\n };\n });\n for (const [identityKey, bundle] of stagedNewBundles) {\n this.#bundles.set(identityKey, bundle);\n }\n for (const staged of stagedReservations.values()) {\n staged.bundle.availablePreKeyIds = staged.availablePreKeyIds;\n staged.bundle.nextPreKeyId = staged.nextPreKeyId;\n staged.bundle.preKeyReservations = staged.preKeyReservations;\n staged.bundle.preKeys = staged.preKeys;\n }\n return reservedBundles;\n }\n\n async decryptDirectMessage(params: {\n ciphertext: Uint8Array;\n recipientJid: string;\n remoteJid: string;\n type: \"msg\" | \"pkmsg\";\n }): Promise<Buffer | undefined> {\n const result = await this.transactDirectMessage({\n ...params,\n accept: async (plaintext) => plaintext,\n });\n if (result.status === \"decrypt-failed\") {\n throw result.error;\n }\n return result.status === \"accepted\" ? result.value : undefined;\n }\n\n async transactDirectMessage<T>(params: {\n accept(plaintext: Buffer): Promise<T | undefined>;\n ciphertext: Uint8Array;\n messageKey?: string | undefined;\n recipientJid: string;\n remoteJid: string;\n signal?: AbortSignal | undefined;\n type: \"msg\" | \"pkmsg\";\n }): Promise<WhatsAppSignalDecryptResult<T>> {\n params.signal?.throwIfAborted();\n const recipientJid = canonicalizeWhatsAppUserCorrelationJid(params.recipientJid);\n const recipientIdentityKey = recipientJid ? signalBundleIdentityKey(recipientJid) : undefined;\n const mappedLidIdentityKey = recipientIdentityKey\n ? this.resolveAssociatedLid(recipientIdentityKey)\n : undefined;\n const identityKey =\n mappedLidIdentityKey && this.#bundles.has(mappedLidIdentityKey)\n ? mappedLidIdentityKey\n : recipientIdentityKey;\n const bundle = identityKey ? this.#bundles.get(identityKey) : undefined;\n if (!identityKey || !bundle) {\n return { status: \"unavailable\" };\n }\n const remoteAddress = signalProtocolAddress(params.remoteJid);\n if (!remoteAddress) {\n return { status: \"unavailable\" };\n }\n const address = new ProtocolAddress(remoteAddress.name, remoteAddress.deviceId);\n // Capacity checks, staged writes, and commits stay atomic per recipient bundle.\n return await this.#runTransaction(identityKey, async () => {\n params.signal?.throwIfAborted();\n const sessions = this.#sessions.get(identityKey) ?? new Map<string, SessionRecord>();\n const sessionLimitError = new Error(\"WhatsApp Signal session limit exceeded.\");\n const maxSessionsPerBundle = this.#maxSessionsPerBundle;\n let stagedNewSessionCount = 0;\n const stagedPreKeyRemovals = new Set<number>();\n const stagedSessions = new Map<string, SessionRecord>();\n const storage: SignalStorage = {\n async loadSession(id) {\n const session = stagedSessions.get(id) ?? sessions.get(id);\n return session ? cloneSignalSession(session) : undefined;\n },\n async storeSession(id, session) {\n if (!sessions.has(id) && !stagedSessions.has(id)) {\n if (sessions.size + stagedNewSessionCount >= maxSessionsPerBundle) {\n throw sessionLimitError;\n }\n stagedNewSessionCount += 1;\n }\n stagedSessions.set(id, cloneSignalSession(session));\n },\n isTrustedIdentity: () => true,\n loadPreKey: async (id) => {\n const preKey = bundle.preKeys.get(Number(id));\n if (preKey && params.messageKey) {\n this.#protectMessagePreKey(params.messageKey, identityKey, Number(id));\n }\n return preKey ? signalKeyPair(preKey) : undefined;\n },\n removePreKey(id) {\n stagedPreKeyRemovals.add(id);\n },\n loadSignedPreKey: () => signalKeyPair(bundle.signedPreKey.keyPair),\n getOurRegistrationId: () => bundle.registrationId,\n getOurIdentity: () => signalKeyPair(bundle.identityKey),\n };\n const cipher = new SessionCipher(storage, address);\n let plaintext: Buffer;\n try {\n plaintext =\n params.type === \"pkmsg\"\n ? await cipher.decryptPreKeyWhisperMessage(params.ciphertext)\n : await cipher.decryptWhisperMessage(params.ciphertext);\n } catch (error) {\n if (error === sessionLimitError) {\n return { status: \"rejected\" };\n }\n return { error, status: \"decrypt-failed\" };\n }\n params.signal?.throwIfAborted();\n let stagedNextPreKeyId = bundle.nextPreKeyId;\n const stagedPreKeyIds = new Set<number>();\n const replacementPreKeys = [...stagedPreKeyRemovals]\n .filter((id) => bundle.preKeys.has(id))\n .map(() => {\n const unavailableIds = new Set([...bundle.pendingPreKeyIds, ...stagedPreKeyIds]);\n const created = this.#createPreKey(bundle.preKeys, stagedNextPreKeyId, unavailableIds);\n stagedNextPreKeyId = created.nextPreKeyId;\n stagedPreKeyIds.add(created.id);\n return created;\n });\n for (const replacementPreKey of replacementPreKeys) {\n bundle.pendingPreKeyIds.add(replacementPreKey.id);\n }\n bundle.nextPreKeyId = stagedNextPreKeyId;\n try {\n const accepted = await awaitWithAbort(\n Promise.resolve().then(() => params.accept(plaintext)),\n params.signal,\n );\n if (accepted === undefined) {\n return { status: \"rejected\" };\n }\n params.signal?.throwIfAborted();\n for (const [id, session] of stagedSessions) {\n sessions.set(id, session);\n }\n if (stagedSessions.size > 0) {\n this.#sessions.set(identityKey, sessions);\n }\n for (const id of stagedPreKeyRemovals) {\n bundle.preKeyReservations.delete(id);\n bundle.preKeys.delete(id);\n }\n for (const replacementPreKey of replacementPreKeys) {\n bundle.preKeys.set(replacementPreKey.id, replacementPreKey.keyPair);\n bundle.availablePreKeyIds.push(replacementPreKey.id);\n }\n return { status: \"accepted\", value: accepted };\n } finally {\n for (const replacementPreKey of replacementPreKeys) {\n bundle.pendingPreKeyIds.delete(replacementPreKey.id);\n }\n }\n });\n }\n\n #createBundle(): StoredSignalBundle {\n const identityKey = generateSignalKeyPair();\n return {\n availablePreKeyIds: [],\n identityKey,\n nextPreKeyId: 1,\n pendingPreKeyIds: new Set<number>(),\n preKeyReservations: new Map<number, number>(),\n preKeys: new Map<number, KeyPair>(),\n protectedPreKeyIds: new Map<number, number>(),\n registrationId: 1,\n signedPreKey: signedKeyPair(identityKey, 1),\n };\n }\n\n #createPreKey(\n preKeys: ReadonlyMap<number, KeyPair>,\n startingId: number,\n stagedIds: ReadonlySet<number> = new Set(),\n ): { id: number; keyPair: KeyPair; nextPreKeyId: number } {\n let id = startingId;\n while (preKeys.has(id) || stagedIds.has(id)) {\n id = id === 0xff_ff_ff ? 1 : id + 1;\n if (id === startingId) {\n throw new Error(\"WhatsApp Signal prekey identifier space exhausted.\");\n }\n }\n return {\n id,\n keyPair: generateSignalKeyPair(),\n nextPreKeyId: id === 0xff_ff_ff ? 1 : id + 1,\n };\n }\n\n #recoverExpiredPendingAcknowledgements(): void {\n const now = this.now();\n for (const [messageKey, pendingAcknowledgement] of this.#pendingAcknowledgements) {\n const { acceptedAt } = pendingAcknowledgement;\n if (acceptedAt === undefined) {\n continue;\n }\n if (now - acceptedAt < this.maxPendingAcknowledgementAgeMs) {\n continue;\n }\n this.#pendingAcknowledgements.delete(messageKey);\n this.#rememberAcknowledgedMessage(messageKey);\n }\n }\n\n #rememberAcknowledgedMessage(messageKey: string): void {\n this.#acknowledgedMessageIds.delete(messageKey);\n this.#acknowledgedMessageIds.set(messageKey, true);\n if (this.#acknowledgedMessageIds.size > this.maxRecentAcknowledgements) {\n const oldestMessageKey = this.#acknowledgedMessageIds.keys().next().value;\n if (oldestMessageKey !== undefined) {\n this.#acknowledgedMessageIds.delete(oldestMessageKey);\n }\n }\n }\n\n #rememberPersistedMessage(messageKey: string): void {\n this.#persistedMessageIds.delete(messageKey);\n this.#persistedMessageIds.set(messageKey, true);\n if (this.#persistedMessageIds.size > this.maxRecentAcknowledgements) {\n const oldestMessageKey = this.#persistedMessageIds.keys().next().value;\n if (oldestMessageKey !== undefined) {\n this.#persistedMessageIds.delete(oldestMessageKey);\n this.releaseMessagePreKeyProtection(oldestMessageKey);\n }\n }\n }\n\n #protectMessagePreKey(messageKey: string, identityKey: string, preKeyId: number): void {\n let protections = this.#messagePreKeyProtections.get(messageKey);\n if (!protections) {\n protections = new Map<string, Set<number>>();\n this.#messagePreKeyProtections.set(messageKey, protections);\n }\n let preKeyIds = protections.get(identityKey);\n if (!preKeyIds) {\n preKeyIds = new Set<number>();\n protections.set(identityKey, preKeyIds);\n }\n if (preKeyIds.has(preKeyId)) {\n return;\n }\n preKeyIds.add(preKeyId);\n const bundle = this.#bundles.get(identityKey);\n if (bundle) {\n bundle.protectedPreKeyIds.set(preKeyId, (bundle.protectedPreKeyIds.get(preKeyId) ?? 0) + 1);\n }\n }\n\n #rememberTerminalAcceptance(\n messageKey: string,\n error: Error,\n drain: Promise<\"acknowledged\" | \"persisted\" | \"retryable\">,\n ): void {\n const terminalAcceptance = { error };\n this.#terminalAcceptances.set(messageKey, terminalAcceptance);\n void drain.then((disposition) => {\n if (this.#terminalAcceptances.get(messageKey) === terminalAcceptance) {\n this.#terminalAcceptances.delete(messageKey);\n }\n if (disposition === \"acknowledged\") {\n this.#rememberAcknowledgedMessage(messageKey);\n } else if (disposition === \"persisted\") {\n this.#rememberPersistedMessage(messageKey);\n }\n });\n }\n\n async #runTransaction<T>(key: string, operation: () => Promise<T>): Promise<T> {\n return await this.#runSerialized(this.#pendingTransactions, key, operation);\n }\n\n async #runSerialized<T>(\n pending: Map<string, Promise<void>>,\n key: string,\n operation: () => Promise<T>,\n ): Promise<T> {\n const previous = pending.get(key) ?? Promise.resolve();\n const result = previous.catch(() => undefined).then(operation);\n const settled = result.then(\n () => undefined,\n () => undefined,\n );\n pending.set(key, settled);\n try {\n return await result;\n } finally {\n if (pending.get(key) === settled) {\n pending.delete(key);\n }\n }\n }\n}\n\nexport function createSerializedMessageHandler<T>(\n processMessage: (message: T) => Promise<void>,\n onError: (error: unknown) => void,\n options: {\n maxPendingBytes?: number | undefined;\n maxPendingMessages?: number | undefined;\n sizeOf?: ((message: T) => number) | undefined;\n } = {},\n): (message: T) => Promise<void> {\n const maxPendingBytes = options.maxPendingBytes ?? MAX_PENDING_WEBSOCKET_BYTES;\n const maxPendingMessages = options.maxPendingMessages ?? MAX_PENDING_WEBSOCKET_MESSAGES;\n const sizeOf = options.sizeOf ?? (() => 1);\n let failed = false;\n let pendingBytes = 0;\n let pendingMessages = 0;\n let pending = Promise.resolve();\n const fail = (error: unknown) => {\n if (!failed) {\n failed = true;\n onError(error);\n }\n };\n return (message) => {\n if (failed) {\n return pending;\n }\n const messageBytes = sizeOf(message);\n if (!Number.isSafeInteger(messageBytes) || messageBytes < 0) {\n fail(new Error(\"WhatsApp WebSocket message size must be a non-negative safe integer.\"));\n return pending;\n }\n if (pendingMessages >= maxPendingMessages || pendingBytes + messageBytes > maxPendingBytes) {\n fail(new Error(\"WhatsApp WebSocket inbound backlog limit exceeded.\"));\n return pending;\n }\n pendingMessages += 1;\n pendingBytes += messageBytes;\n const next = pending\n .then(async () => {\n if (!failed) {\n await processMessage(message);\n }\n })\n .finally(() => {\n pendingMessages -= 1;\n pendingBytes -= messageBytes;\n });\n pending = next.catch((error: unknown) => {\n fail(error);\n });\n return pending;\n };\n}\n\nexport class WhatsAppNoiseFrameDecoder {\n #bufferedBytes = 0;\n readonly #chunks: NodeBuffer[] = [];\n #expectIntro = true;\n #offset = 0;\n\n get bufferedBytes(): number {\n return this.#bufferedBytes;\n }\n\n decodeFrames(data: WhatsAppWebSocketRawData): NodeBuffer[] {\n let chunk = rawDataToBuffer(data);\n if (this.#expectIntro) {\n chunk = removeNoiseIntroHeader(chunk);\n this.#expectIntro = false;\n }\n if (chunk.length > 0) {\n if (this.#chunks.length >= MAX_WHATSAPP_NOISE_BUFFER_CHUNKS) {\n throw new Error(\n `WhatsApp Noise buffer exceeds ${MAX_WHATSAPP_NOISE_BUFFER_CHUNKS} chunks.`,\n );\n }\n this.#chunks.push(chunk);\n this.#bufferedBytes += chunk.length;\n }\n\n const frames: NodeBuffer[] = [];\n while (this.#bufferedBytes >= 3) {\n const size = (this.#peekByte(0) << 16) | (this.#peekByte(1) << 8) | this.#peekByte(2);\n if (size > MAX_WHATSAPP_NOISE_FRAME_BYTES) {\n throw new Error(`WhatsApp Noise frame exceeds ${MAX_WHATSAPP_NOISE_FRAME_BYTES} bytes.`);\n }\n if (this.#bufferedBytes < size + 3) {\n break;\n }\n if (frames.length >= MAX_WHATSAPP_NOISE_FRAMES_PER_MESSAGE) {\n throw new Error(\n `WhatsApp Noise message exceeds ${MAX_WHATSAPP_NOISE_FRAMES_PER_MESSAGE} frames.`,\n );\n }\n this.#consume(3);\n frames.push(this.#read(size));\n }\n return frames;\n }\n\n #consume(length: number): void {\n let remaining = length;\n while (remaining > 0) {\n const chunk = this.#chunks[0];\n if (!chunk) {\n throw new Error(\"Unexpected end of WhatsApp Noise frame buffer.\");\n }\n const available = chunk.length - this.#offset;\n const consumed = Math.min(available, remaining);\n this.#offset += consumed;\n this.#bufferedBytes -= consumed;\n remaining -= consumed;\n if (this.#offset === chunk.length) {\n this.#chunks.shift();\n this.#offset = 0;\n }\n }\n }\n\n #peekByte(index: number): number {\n let remaining = index + this.#offset;\n for (const chunk of this.#chunks) {\n if (remaining < chunk.length) {\n return chunk[remaining]!;\n }\n remaining -= chunk.length;\n }\n throw new Error(\"Unexpected end of WhatsApp Noise frame buffer.\");\n }\n\n #read(length: number): NodeBuffer {\n const result = Buffer.allocUnsafe(length);\n let resultOffset = 0;\n while (resultOffset < length) {\n const chunk = this.#chunks[0];\n if (!chunk) {\n throw new Error(\"Unexpected end of WhatsApp Noise frame buffer.\");\n }\n const copied = chunk.copy(\n result,\n resultOffset,\n this.#offset,\n Math.min(chunk.length, this.#offset + length - resultOffset),\n );\n this.#offset += copied;\n this.#bufferedBytes -= copied;\n resultOffset += copied;\n if (this.#offset === chunk.length) {\n this.#chunks.shift();\n this.#offset = 0;\n }\n }\n return result;\n }\n}\n\nclass TransportState {\n #readCounter = 0;\n #writeCounter = 0;\n\n constructor(\n private readonly encKey: NodeBuffer,\n private readonly decKey: NodeBuffer,\n ) {}\n\n decrypt(ciphertext: Uint8Array): NodeBuffer {\n const iv = createIv(this.#readCounter++);\n return aesDecryptGCM(Buffer.from(ciphertext), this.decKey, iv, EMPTY_BUFFER);\n }\n\n encrypt(plaintext: Uint8Array): NodeBuffer {\n const iv = createIv(this.#writeCounter++);\n return aesEncryptGCM(Buffer.from(plaintext), this.encKey, iv, EMPTY_BUFFER);\n }\n}\n\nclass BaileysNoiseServer {\n #counter = 0;\n #decKey: NodeBuffer;\n #encKey: NodeBuffer;\n readonly #frames = new WhatsAppNoiseFrameDecoder();\n #hash: NodeBuffer;\n #salt: NodeBuffer;\n #serverEphemeralKey: KeyPair | undefined;\n #serverStaticKey: KeyPair | undefined;\n #transport: TransportState | undefined;\n\n constructor() {\n const initial = Buffer.from(NOISE_MODE);\n this.#hash = Buffer.from(initial.byteLength === 32 ? initial : sha256(initial));\n this.#salt = this.#hash;\n this.#encKey = this.#hash;\n this.#decKey = this.#hash;\n this.#authenticate(NOISE_WA_HEADER);\n }\n\n decodeFrames(data: WhatsAppWebSocketRawData): NodeBuffer[] {\n return this.#frames.decodeFrames(data);\n }\n\n async decodeTransportNode(frame: Uint8Array): Promise<BinaryNode> {\n if (!this.#transport) {\n throw new Error(\"Cannot decode a Baileys node before the Noise transport is ready.\");\n }\n return await decodeBinaryNode(this.#transport.decrypt(frame));\n }\n\n finishClientHandshake(frame: Uint8Array): void {\n const message = decodeHandshakeMessage(frame);\n const finish = message.clientFinish;\n if (!finish?.staticKey || !finish.payload || !this.#serverEphemeralKey) {\n throw new Error(\"Invalid Baileys client finish handshake.\");\n }\n const clientNoisePublic = this.#decrypt(finish.staticKey);\n this.#mixIntoKey(Curve.sharedKey(this.#serverEphemeralKey.private, clientNoisePublic));\n this.#decrypt(finish.payload);\n const [writeKey, readKey] = this.#localHKDF(EMPTY_BUFFER);\n this.#transport = new TransportState(readKey, writeKey);\n }\n\n createServerHello(frame: Uint8Array): NodeBuffer {\n const message = decodeHandshakeMessage(frame);\n const clientHello = message.clientHello;\n if (!clientHello?.ephemeral) {\n throw new Error(\"Invalid Baileys client hello handshake.\");\n }\n\n this.#authenticate(clientHello.ephemeral);\n this.#serverEphemeralKey = Curve.generateKeyPair();\n this.#serverStaticKey = Curve.generateKeyPair();\n this.#authenticate(this.#serverEphemeralKey.public);\n this.#mixIntoKey(Curve.sharedKey(this.#serverEphemeralKey.private, clientHello.ephemeral));\n const staticKey = this.#encrypt(this.#serverStaticKey.public);\n this.#mixIntoKey(Curve.sharedKey(this.#serverStaticKey.private, clientHello.ephemeral));\n const payload = this.#encrypt(WHATSAPP_NOISE_CERT_CHAIN);\n return encodeLengthPrefixed(\n encodeHandshakeMessage({\n serverHello: {\n ephemeral: this.#serverEphemeralKey.public,\n payload,\n staticKey,\n },\n }),\n );\n }\n\n encodeNode(node: BinaryNode): NodeBuffer {\n if (!this.#transport) {\n throw new Error(\"Cannot encode a Baileys node before the Noise transport is ready.\");\n }\n return encodeLengthPrefixed(this.#transport.encrypt(encodeBinaryNode(node)));\n }\n\n #authenticate(data: Uint8Array) {\n this.#hash = sha256(Buffer.concat([this.#hash, Buffer.from(data)]));\n }\n\n #decrypt(ciphertext: Uint8Array): NodeBuffer {\n const result = aesDecryptGCM(\n Buffer.from(ciphertext),\n this.#decKey,\n createIv(this.#counter++),\n this.#hash,\n );\n this.#authenticate(ciphertext);\n return result;\n }\n\n #encrypt(plaintext: Uint8Array): NodeBuffer {\n const result = aesEncryptGCM(\n Buffer.from(plaintext),\n this.#encKey,\n createIv(this.#counter++),\n this.#hash,\n );\n this.#authenticate(result);\n return result;\n }\n\n #localHKDF(data: Uint8Array): [NodeBuffer, NodeBuffer] {\n const key = hkdf(Buffer.from(data), 64, { info: \"\", salt: this.#salt });\n return [Buffer.from(key.subarray(0, 32)), Buffer.from(key.subarray(32))];\n }\n\n #mixIntoKey(data: Uint8Array) {\n const [writeKey, readKey] = this.#localHKDF(data);\n this.#salt = writeKey;\n this.#encKey = readKey;\n this.#decKey = readKey;\n this.#counter = 0;\n }\n}\n\nclass WhatsAppBaileysWebSocketSession {\n readonly #acceptanceAbort = new AbortController();\n #handshakeState: \"client-finish\" | \"client-hello\" | \"open\" = \"client-hello\";\n readonly #handleSerializedMessage: (data: WhatsAppWebSocketRawData) => Promise<void>;\n readonly #noise = new BaileysNoiseServer();\n\n constructor(\n private readonly socket: WebSocket,\n private readonly params: {\n appendEvent(event: ServerRequestEvent): Promise<void>;\n path: string;\n onOpen(session: WhatsAppBaileysWebSocketSession): void;\n selfJid: string;\n signalBundles: WhatsAppSignalBundleStore;\n },\n ) {\n this.#handleSerializedMessage = createSerializedMessageHandler(\n (data) => this.#handleMessage(data),\n (error) => {\n const close = resolveWhatsAppWebSocketClose(error);\n this.socket.close(close.code, close.reason);\n },\n {\n sizeOf: rawDataByteLength,\n },\n );\n }\n\n get isOpen(): boolean {\n return this.#handshakeState === \"open\" && this.socket.readyState === WebSocket.OPEN;\n }\n\n handleMessage(data: WhatsAppWebSocketRawData): Promise<void> {\n return this.#handleSerializedMessage(data);\n }\n\n abortAcceptance(reason: unknown): void {\n if (!this.#acceptanceAbort.signal.aborted) {\n this.#acceptanceAbort.abort(reason);\n }\n }\n\n async deliverInboundMessage(message: WhatsAppBaileysInboundMessage): Promise<boolean> {\n if (!this.isOpen) {\n return false;\n }\n try {\n await this.#sendNode(createInboundMessageNode(message));\n return true;\n } catch {\n this.socket.terminate();\n return false;\n }\n }\n\n async #handleMessage(data: WhatsAppWebSocketRawData): Promise<void> {\n for (const frame of this.#noise.decodeFrames(data)) {\n if (this.#handshakeState === \"client-hello\") {\n await sendWhatsAppWebSocketPayload(this.socket, this.#noise.createServerHello(frame));\n this.#handshakeState = \"client-finish\";\n continue;\n }\n if (this.#handshakeState === \"client-finish\") {\n this.#noise.finishClientHandshake(frame);\n this.#handshakeState = \"open\";\n await this.#sendNode({\n attrs: {\n lid: lidForJid(this.params.selfJid),\n t: unixSeconds(),\n },\n tag: \"success\",\n });\n await this.#sendNode({\n attrs: {},\n content: [{ attrs: { count: \"0\" }, tag: \"offline\" }],\n tag: \"ib\",\n });\n this.params.onOpen(this);\n continue;\n }\n await this.#handleNode(await this.#noise.decodeTransportNode(frame));\n }\n }\n\n async #handleNode(node: BinaryNode): Promise<void> {\n await awaitWithAbort(this.#recordNode(node), this.#acceptanceAbort.signal);\n if (node.tag === \"iq\") {\n await this.#sendNode(this.#createIqResult(node));\n return;\n }\n if (node.tag === \"message\") {\n const peer = requireAttr(node, \"to\");\n const messageId = requireAttr(node, \"id\");\n const accepted = await persistAcceptedBaileysMessage({\n acceptanceSignal: this.#acceptanceAbort.signal,\n appendEvent: this.params.appendEvent,\n node,\n onAcceptanceTimeout: () => {\n const close = resolveWhatsAppWebSocketClose(\n new Error(\"WhatsApp message acceptance timed out.\"),\n );\n this.socket.close(close.code, close.reason);\n },\n path: this.params.path,\n remoteJid: this.params.selfJid,\n signalBundles: this.params.signalBundles,\n });\n if (!accepted) {\n return;\n }\n await this.#sendNode({\n attrs: {\n class: \"message\",\n from: peer,\n id: messageId,\n to: this.params.selfJid,\n ...(node.attrs.type ? { type: node.attrs.type } : {}),\n },\n tag: \"ack\",\n });\n this.params.signalBundles.markMessageAcknowledged(peer, messageId);\n }\n }\n\n #createIqResult(node: BinaryNode): BinaryNode {\n const child = firstChild(node);\n const id = requireAttr(node, \"id\");\n const attrs = {\n from: node.attrs.to ?? S_WHATSAPP_NET,\n id,\n t: unixSeconds(),\n type: \"result\",\n };\n\n if (node.attrs.xmlns === \"encrypt\" && child?.tag === \"count\") {\n return { attrs, content: [{ attrs: { value: \"50\" }, tag: \"count\" }], tag: \"iq\" };\n }\n if (node.attrs.xmlns === \"encrypt\" && child?.tag === \"digest\") {\n return { attrs, content: [{ attrs: {}, tag: \"digest\" }], tag: \"iq\" };\n }\n if (node.attrs.xmlns === \"encrypt\" && child?.tag === \"key\") {\n try {\n return { attrs, content: [this.#createKeyList(child)], tag: \"iq\" };\n } catch (error) {\n return {\n attrs: { ...attrs, type: \"error\" },\n content: [\n {\n attrs: {\n code: \"400\",\n text: error instanceof Error ? error.message : String(error),\n type: \"modify\",\n },\n tag: \"error\",\n },\n ],\n tag: \"iq\",\n };\n }\n }\n if (node.attrs.xmlns === \"usync\" && child?.tag === \"usync\") {\n return { attrs, content: [this.#createUSyncResult(child)], tag: \"iq\" };\n }\n if (node.attrs.xmlns === \"abt\") {\n return {\n attrs,\n content: [\n {\n attrs: { hash: \"mock\" },\n content: [\n { attrs: { name: \"10518\", value: \"false\" }, tag: \"prop\" },\n { attrs: { name: \"14303\", value: \"false\" }, tag: \"prop\" },\n ],\n tag: \"props\",\n },\n ],\n tag: \"iq\",\n };\n }\n if (node.attrs.xmlns === \"blocklist\") {\n return { attrs, content: [{ attrs: {}, content: [], tag: \"list\" }], tag: \"iq\" };\n }\n if (node.attrs.xmlns === \"privacy\") {\n return {\n attrs,\n content: [\n {\n attrs: {},\n content: [\n { attrs: { name: \"readreceipts\", value: \"all\" }, tag: \"category\" },\n { attrs: { name: \"profile\", value: \"all\" }, tag: \"category\" },\n ],\n tag: \"privacy\",\n },\n ],\n tag: \"iq\",\n };\n }\n if (node.attrs.xmlns === \"w:m\" && child?.tag === \"media_conn\") {\n return {\n attrs,\n content: [\n {\n attrs: { auth: \"mock\", ttl: \"3600\" },\n content: [\n {\n attrs: {\n hostname: \"127.0.0.1\",\n maxContentLengthBytes: \"10485760\",\n },\n tag: \"host\",\n },\n ],\n tag: \"media_conn\",\n },\n ],\n tag: \"iq\",\n };\n }\n if (node.attrs.xmlns === \"w:g2\") {\n if (node.attrs.type === \"get\" && child?.tag === \"participating\") {\n return {\n attrs,\n content: [{ attrs: {}, content: [], tag: \"groups\" }],\n tag: \"iq\",\n };\n }\n if (node.attrs.type !== \"get\" || child?.tag !== \"query\") {\n return {\n attrs: { ...attrs, type: \"error\" },\n content: [\n {\n attrs: { code: \"501\", text: \"unsupported group operation\", type: \"cancel\" },\n tag: \"error\",\n },\n ],\n tag: \"iq\",\n };\n }\n return {\n attrs,\n content: [\n {\n attrs: {\n id: node.attrs.to ?? \"120363000000000000@g.us\",\n owner: this.params.selfJid,\n subject: \"Test Group\",\n s_t: unixSeconds(),\n },\n content: [{ attrs: { jid: this.params.selfJid }, tag: \"participant\" }],\n tag: \"group\",\n },\n ],\n tag: \"iq\",\n };\n }\n return { attrs, tag: \"iq\" };\n }\n\n #createKeyList(keyNode: BinaryNode): BinaryNode {\n const users = children(keyNode).filter((child) => child.tag === \"user\");\n const jids = users.map((userNode) => requireAttr(userNode, \"jid\"));\n const bundles = this.params.signalBundles.resolveMany(jids);\n return {\n attrs: {},\n content: jids.map((jid, index) => this.#createKeyUser(jid, bundles[index]!)),\n tag: \"list\",\n };\n }\n\n #createKeyUser(jid: string, bundle: MockSignalBundle): BinaryNode {\n return {\n attrs: { jid },\n content: [\n { attrs: {}, content: encodeBigEndian(bundle.registrationId), tag: \"registration\" },\n { attrs: {}, content: KEY_BUNDLE_TYPE, tag: \"type\" },\n {\n attrs: {},\n content: scrubSignalPublicKey(bundle.identityKey.public),\n tag: \"identity\",\n },\n xmppSignedPreKey(bundle.signedPreKey),\n xmppPreKey(bundle.preKey, bundle.preKeyId),\n ],\n tag: \"user\",\n };\n }\n\n #createUSyncResult(usyncNode: BinaryNode): BinaryNode {\n const requestList = children(usyncNode).find((child) => child.tag === \"list\");\n const requestedUsers = requestList\n ? children(requestList).filter((child) => child.tag === \"user\")\n : [];\n return {\n attrs: {\n index: usyncNode.attrs.index ?? \"0\",\n last: \"true\",\n sid: usyncNode.attrs.sid ?? \"mock\",\n },\n content: [\n {\n attrs: {},\n content: requestedUsers.map((user) => this.#createUSyncUser(requireAttr(user, \"jid\"))),\n tag: \"list\",\n },\n ],\n tag: \"usync\",\n };\n }\n\n #createUSyncUser(jid: string): BinaryNode {\n const lid = lidForJid(jid);\n if (canonicalizeWhatsAppUserCorrelationJid(jid)?.endsWith(\"@s.whatsapp.net\")) {\n this.params.signalBundles.associateLid(jid, lid);\n }\n return {\n attrs: { jid },\n content: [\n {\n attrs: {},\n content: [\n {\n attrs: {},\n content: [{ attrs: { id: \"0\" }, tag: \"device\" }],\n tag: \"device-list\",\n },\n ],\n tag: \"devices\",\n },\n { attrs: { val: lid }, tag: \"lid\" },\n ],\n tag: \"user\",\n };\n }\n\n async #recordNode(node: BinaryNode): Promise<void> {\n await this.params.appendEvent({\n at: new Date().toISOString(),\n body: sanitizeNodeForJson(node),\n method: \"WEBSOCKET\",\n path: this.params.path,\n query: {},\n type: \"api\",\n });\n }\n\n async #sendNode(node: BinaryNode): Promise<void> {\n await sendWhatsAppWebSocketPayload(this.socket, this.#noise.encodeNode(node));\n }\n}\n\nexport async function sendWhatsAppWebSocketPayload(\n socket: WhatsAppWebSocketSendTarget,\n payload: Uint8Array,\n): Promise<void> {\n if (socket.readyState !== WebSocket.OPEN) {\n throw new Error(\"WhatsApp WebSocket is not open.\");\n }\n if (socket.bufferedAmount + payload.byteLength > MAX_WHATSAPP_WEBSOCKET_BUFFERED_BYTES) {\n socket.terminate();\n throw new Error(\"WhatsApp WebSocket outbound buffer limit exceeded.\");\n }\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const finish = (error?: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n };\n const timeout = setTimeout(() => {\n socket.terminate();\n finish(new Error(\"WhatsApp WebSocket send timed out.\"));\n }, WHATSAPP_WEBSOCKET_SEND_TIMEOUT_MS);\n try {\n socket.send(payload, finish);\n } catch (error) {\n finish(error instanceof Error ? error : new Error(String(error)));\n }\n });\n}\n\nexport function resolveWhatsAppWebSocketClose(error: unknown): {\n code: 1002 | 1009 | 1011;\n reason: string;\n} {\n const message = error instanceof Error ? error.message : String(error);\n const code = /(?:backlog|exceeds|limit|payload is too large|too many)/iu.test(message)\n ? 1009\n : /(?:baileys|binary node|handshake|noise|protocol|unexpected end|unsupported|invalid)/iu.test(\n message,\n )\n ? 1002\n : 1011;\n return { code, reason: truncateWebSocketCloseReason(message) };\n}\n\nfunction truncateWebSocketCloseReason(reason: string): string {\n let result = \"\";\n for (const character of reason) {\n if (Buffer.byteLength(result + character) > MAX_WHATSAPP_WEBSOCKET_CLOSE_REASON_BYTES) {\n break;\n }\n result += character;\n }\n return result;\n}\n\nexport function attachWhatsAppBaileysWebSocketServer(\n params: WhatsAppBaileysWebSocketServerParams,\n): WhatsAppBaileysWebSocketServer {\n const signalBundles = new WhatsAppSignalBundleStore(\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n { messageAcceptanceTimeoutMs: params.messageAcceptanceTimeoutMs },\n );\n const sessions = new Set<WhatsAppBaileysWebSocketSession>();\n const pendingSessionMessages = new Set<Promise<void>>();\n const pendingMessages: WhatsAppBaileysInboundMessage[] = [];\n const maxPendingInboundMessages = resolveMaxPendingWhatsAppInboundMessages(\n params.maxPendingInboundMessages,\n );\n let pendingReservations = 0;\n let closing = false;\n let flushPromise = Promise.resolve();\n const webSocketServerOptions: ServerOptions & {\n maxBufferedChunks: number;\n maxFragments: number;\n } = {\n maxBufferedChunks: MAX_WHATSAPP_WEBSOCKET_FRAGMENTS,\n maxFragments: MAX_WHATSAPP_WEBSOCKET_FRAGMENTS,\n maxPayload: MAX_WHATSAPP_WEBSOCKET_MESSAGE_BYTES,\n noServer: true,\n };\n const wss = new WebSocketServer(webSocketServerOptions);\n const flushPendingMessages = (): Promise<void> => {\n const next = flushPromise.then(async () => {\n while (pendingMessages.length > 0) {\n if (closing) {\n return;\n }\n const message = pendingMessages[0];\n if (!message) {\n return;\n }\n const results = await Promise.all(\n [...sessions].map((session) => session.deliverInboundMessage(message)),\n );\n if (!results.some(Boolean)) {\n return;\n }\n pendingMessages.shift();\n }\n });\n flushPromise = next.catch(() => undefined);\n return next;\n };\n const rejectUpgrade = (socket: Duplex, response: string) => {\n socket.end(response, () => socket.destroy());\n };\n const handleUpgrade = (request: IncomingMessage, socket: Duplex, head: Buffer) => {\n const url = parseWhatsAppWebSocketUpgradeUrl(request.url);\n if (!url) {\n rejectUpgrade(socket, \"HTTP/1.1 400 Bad Request\\r\\nConnection: close\\r\\n\\r\\n\");\n return;\n }\n if (url.pathname !== params.path) {\n socket.destroy();\n return;\n }\n if (url.searchParams.get(\"access_token\") !== params.accessToken) {\n rejectUpgrade(socket, \"HTTP/1.1 401 Unauthorized\\r\\nConnection: close\\r\\n\\r\\n\");\n return;\n }\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit(\"connection\", ws, request);\n });\n };\n params.httpServer.on(\"upgrade\", handleUpgrade);\n wss.on(\"connection\", (socket: WebSocket) => {\n const session = new WhatsAppBaileysWebSocketSession(socket, {\n appendEvent: params.appendEvent,\n onOpen: () => {\n void flushPendingMessages();\n },\n path: params.path,\n selfJid: params.selfJid,\n signalBundles,\n });\n sessions.add(session);\n socket.once(\"close\", () => {\n session.abortAcceptance(new Error(\"WhatsApp WebSocket closed.\"));\n sessions.delete(session);\n });\n socket.on(\"error\", () => {\n session.abortAcceptance(new Error(\"WhatsApp WebSocket failed.\"));\n sessions.delete(session);\n socket.terminate();\n });\n socket.on(\"message\", (data) => {\n const pending = session.handleMessage(data);\n pendingSessionMessages.add(pending);\n void pending.then(\n () => pendingSessionMessages.delete(pending),\n () => pendingSessionMessages.delete(pending),\n );\n });\n });\n return {\n async close() {\n closing = true;\n params.httpServer.off(\"upgrade\", handleUpgrade);\n pendingMessages.length = 0;\n for (const session of sessions) {\n session.abortAcceptance(new Error(\"WhatsApp WebSocket server is shutting down.\"));\n }\n await closeWebSocketServer(wss);\n const messageResults = await Promise.allSettled([...pendingSessionMessages]);\n await flushPromise;\n const messageErrors = messageResults.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (messageErrors.length === 1) {\n throw messageErrors[0];\n }\n if (messageErrors.length > 1) {\n throw new AggregateError(messageErrors, \"WhatsApp WebSocket message drain failed.\");\n }\n },\n prepareInboundMessage(message) {\n if (pendingMessages.length + pendingReservations >= maxPendingInboundMessages) {\n return undefined;\n }\n let reserved = true;\n let settled = false;\n pendingReservations += 1;\n const releaseReservation = () => {\n if (reserved) {\n reserved = false;\n pendingReservations -= 1;\n }\n };\n return {\n cancel() {\n if (!settled) {\n settled = true;\n releaseReservation();\n }\n },\n async commit() {\n if (settled) {\n throw new Error(\"WhatsApp inbound delivery reservation is already settled.\");\n }\n settled = true;\n try {\n releaseReservation();\n if (pendingMessages.length >= maxPendingInboundMessages) {\n throw new Error(\"WhatsApp inbound delivery reservation exceeded queue capacity.\");\n }\n pendingMessages.push(message);\n await flushPendingMessages();\n return pendingMessages.includes(message) ? \"queued\" : \"delivered\";\n } finally {\n releaseReservation();\n }\n },\n };\n },\n };\n}\n\nexport function parseWhatsAppWebSocketUpgradeUrl(\n requestTarget: string | undefined,\n): URL | undefined {\n try {\n return new URL(requestTarget ?? \"/\", \"http://127.0.0.1\");\n } catch {\n return undefined;\n }\n}\n\nfunction rawDataByteLength(data: WhatsAppWebSocketRawData): number {\n if (Array.isArray(data)) {\n return data.reduce((total, chunk) => total + chunk.byteLength, 0);\n }\n return data.byteLength;\n}\n\nfunction rawDataToBuffer(data: WhatsAppWebSocketRawData): NodeBuffer {\n if (Buffer.isBuffer(data)) {\n return data;\n }\n if (Array.isArray(data)) {\n return Buffer.concat(data);\n }\n return Buffer.from(data);\n}\n\nfunction removeNoiseIntroHeader(chunk: NodeBuffer): NodeBuffer {\n if (chunk.subarray(0, NOISE_WA_HEADER.length).equals(NOISE_WA_HEADER)) {\n return chunk.subarray(NOISE_WA_HEADER.length);\n }\n if (chunk.length >= 11 && chunk.subarray(0, 2).toString(\"utf8\") === \"ED\" && chunk[3] === 1) {\n const routingInfoPrefix = chunk[4];\n if (routingInfoPrefix === undefined) {\n throw new Error(\"Invalid Baileys Noise routing header.\");\n }\n const routingInfoLength = (routingInfoPrefix << 16) | chunk.readUInt16BE(5);\n const headerLength = 7 + routingInfoLength + NOISE_WA_HEADER.length;\n if (\n chunk.subarray(headerLength - NOISE_WA_HEADER.length, headerLength).equals(NOISE_WA_HEADER)\n ) {\n return chunk.subarray(headerLength);\n }\n }\n throw new Error(\"Invalid Baileys Noise intro header.\");\n}\n\nfunction children(node: BinaryNode): BinaryNode[] {\n return Array.isArray(node.content) ? node.content : [];\n}\n\nexport async function persistAcceptedBaileysMessage(params: {\n acceptanceSignal?: AbortSignal | undefined;\n appendEvent(event: ServerRequestEvent): Promise<void>;\n node: BinaryNode;\n onAcceptanceTimeout?: (() => void) | undefined;\n path: string;\n remoteJid: string;\n signalBundles: WhatsAppSignalBundleStore;\n}): Promise<boolean> {\n const peer = canonicalizeWhatsAppUserCorrelationJid(params.node.attrs.to ?? \"\");\n const messageId = params.node.attrs.id;\n if (!peer || !messageId) {\n return false;\n }\n const messageKey = `${peer}\\0${messageId}`;\n const wasPreviouslyPersisted = params.signalBundles.hasPersistedMessage(messageKey);\n let persistenceSucceeded = wasPreviouslyPersisted;\n let operationSettled!: () => void;\n const operationSettlement = new Promise<void>((resolve) => {\n operationSettled = resolve;\n });\n let requiresSignalCommit = wasPreviouslyPersisted;\n let signalCommitSucceeded = false;\n const pendingAcceptanceOperations = new Set<Promise<unknown>>();\n const trackAcceptanceOperation = <T>(operation: Promise<T>): Promise<T> => {\n pendingAcceptanceOperations.add(operation);\n void operation.then(\n () => {\n persistenceSucceeded = true;\n pendingAcceptanceOperations.delete(operation);\n },\n () => pendingAcceptanceOperations.delete(operation),\n );\n return operation;\n };\n const drainAcceptanceOperations = async (): Promise<\n \"acknowledged\" | \"persisted\" | \"retryable\"\n > => {\n while (pendingAcceptanceOperations.size > 0) {\n await Promise.allSettled([...pendingAcceptanceOperations]);\n }\n await operationSettlement;\n if (!persistenceSucceeded) {\n params.signalBundles.releaseMessagePreKeyProtection(messageKey);\n return \"retryable\";\n }\n if (!requiresSignalCommit || signalCommitSucceeded) {\n params.signalBundles.releaseMessagePreKeyProtection(messageKey);\n return \"acknowledged\";\n }\n return \"persisted\";\n };\n const accepted = await params.signalBundles.acceptMessageOnce(\n messageKey,\n async (acceptanceSignal) => {\n try {\n acceptanceSignal.throwIfAborted();\n const candidates = encryptedMessageCandidates(params.node);\n requiresSignalCommit = candidates.length > 0;\n if (candidates.length === 0) {\n if (!wasPreviouslyPersisted) {\n await awaitWithAbort(\n trackAcceptanceOperation(\n params.appendEvent({\n accepted: true,\n at: new Date().toISOString(),\n body: sanitizeNodeForJson(params.node),\n method: \"WEBSOCKET\",\n path: params.path,\n query: {},\n type: \"api\",\n } as ServerRequestEvent & { accepted: true }),\n ),\n acceptanceSignal,\n );\n }\n return true;\n }\n const remoteCorrelationJid = canonicalizeWhatsAppUserCorrelationJid(params.remoteJid);\n candidates.sort((left, right) => {\n const leftIsSelf =\n canonicalizeWhatsAppUserCorrelationJid(left.recipientJid) === remoteCorrelationJid;\n const rightIsSelf =\n canonicalizeWhatsAppUserCorrelationJid(right.recipientJid) === remoteCorrelationJid;\n return Number(leftIsSelf) - Number(rightIsSelf);\n });\n for (const candidate of candidates) {\n const result = await params.signalBundles.transactDirectMessage({\n accept: async (decrypted) => {\n let text: string | undefined;\n try {\n text = readWhatsAppConversation(unpadRandomMax16(decrypted));\n } catch {\n text = undefined;\n }\n const message: WhatsAppBaileysInboundMessage | undefined = text\n ? {\n key: {\n fromMe: true,\n id: messageId,\n remoteJid: peer,\n },\n message: { conversation: text },\n messageTimestamp: Math.floor(Date.now() / 1000),\n }\n : undefined;\n if (!wasPreviouslyPersisted) {\n await awaitWithAbort(\n trackAcceptanceOperation(\n params.appendEvent({\n accepted: true,\n at: new Date().toISOString(),\n body: message ?? sanitizeNodeForJson(params.node),\n method: \"WEBSOCKET\",\n path: params.path,\n query: {},\n type: \"api\",\n } as ServerRequestEvent & { accepted: true }),\n ),\n acceptanceSignal,\n );\n }\n return true;\n },\n ciphertext: candidate.ciphertext,\n messageKey,\n recipientJid: candidate.recipientJid,\n remoteJid: params.remoteJid,\n signal: acceptanceSignal,\n type: candidate.type,\n });\n if (result.status === \"accepted\") {\n signalCommitSucceeded = true;\n return true;\n }\n }\n return false;\n } finally {\n if (!acceptanceSignal.aborted && !signalCommitSucceeded) {\n params.signalBundles.releaseMessagePreKeyProtection(messageKey);\n }\n operationSettled();\n }\n },\n {\n onTerminalTimeout: params.onAcceptanceTimeout,\n signal: params.acceptanceSignal,\n terminalDrain: drainAcceptanceOperations,\n },\n );\n if (accepted) {\n params.signalBundles.clearPersistedMessage(messageKey);\n }\n return accepted;\n}\n\nfunction encryptedMessageCandidates(node: BinaryNode): Array<{\n ciphertext: Uint8Array;\n recipientJid: string;\n type: \"msg\" | \"pkmsg\";\n}> {\n const result: Array<{\n ciphertext: Uint8Array;\n recipientJid: string;\n type: \"msg\" | \"pkmsg\";\n }> = [];\n const visit = (current: BinaryNode, recipientJid?: string) => {\n const nextRecipient = current.tag === \"to\" ? current.attrs.jid : recipientJid;\n if (\n current.tag === \"enc\" &&\n nextRecipient &&\n (current.attrs.type === \"msg\" || current.attrs.type === \"pkmsg\") &&\n current.content instanceof Uint8Array\n ) {\n result.push({\n ciphertext: current.content,\n recipientJid: nextRecipient,\n type: current.attrs.type,\n });\n }\n for (const child of children(current)) {\n visit(child, nextRecipient);\n }\n };\n visit(node);\n return result;\n}\n\nfunction signalKeyPair(pair: KeyPair): { privKey: Buffer; pubKey: Buffer } {\n return {\n privKey: Buffer.from(pair.private),\n pubKey: ensureSignalPublicKey(pair.public),\n };\n}\n\nfunction cloneSignalSession(session: SessionRecord): SessionRecord {\n return SessionRecord.deserialize(session.serialize());\n}\n\nexport function signalBundleIdentityKey(jid: string): string {\n return jid.replace(/(?:_\\d+)?(?::\\d+)?(?=@)/u, \"\");\n}\n\nfunction signalProtocolAddress(jid: string): { deviceId: number; name: string } | undefined {\n const match = /^(\\d{7,15})(?:_(\\d+))?(?::(\\d+))?@(s\\.whatsapp\\.net|lid)$/iu.exec(jid);\n if (!match) {\n return undefined;\n }\n const deviceId = Number(match[3] ?? \"0\");\n if (!Number.isSafeInteger(deviceId) || deviceId < 0) {\n return undefined;\n }\n const agent = match[2];\n const server = match[4]!.toLowerCase();\n return {\n deviceId,\n name:\n agent !== undefined ? `${match[1]}_${agent}` : server === \"lid\" ? `${match[1]}_1` : match[1]!,\n };\n}\n\nfunction unpadRandomMax16(value: Uint8Array): Buffer {\n const buffer = Buffer.from(value);\n const padding = buffer.at(-1);\n if (!padding || padding > 16 || padding > buffer.length) {\n throw new Error(\"Invalid WhatsApp message padding.\");\n }\n for (let index = buffer.length - padding; index < buffer.length; index += 1) {\n if (buffer[index] !== padding) {\n throw new Error(\"Invalid WhatsApp message padding.\");\n }\n }\n return buffer.subarray(0, buffer.length - padding);\n}\n\nfunction readWhatsAppConversation(message: Uint8Array): string | undefined {\n const fields = readProtobufLengthDelimitedFields(message);\n const conversation = readUtf8(fields.get(1)?.[0]);\n if (conversation?.trim()) {\n return conversation;\n }\n const extendedText = fields.get(6)?.[0];\n const extendedConversation = extendedText\n ? readUtf8(readProtobufLengthDelimitedFields(extendedText).get(1)?.[0])\n : undefined;\n if (extendedConversation?.trim()) {\n return extendedConversation;\n }\n const deviceSentMessage = fields.get(31)?.[0];\n const nestedMessage = deviceSentMessage\n ? readProtobufLengthDelimitedFields(deviceSentMessage).get(2)?.[0]\n : undefined;\n return nestedMessage ? readWhatsAppConversation(nestedMessage) : undefined;\n}\n\nconst MAX_WHATSAPP_PROTOBUF_GROUP_DEPTH = 64;\n\nfunction readProtobufLengthDelimitedFields(value: Uint8Array): Map<number, Uint8Array[]> {\n const fields = new Map<number, Uint8Array[]>();\n let offset = 0;\n while (offset < value.length) {\n const tag = readProtobufVarint(value, offset);\n offset = tag.offset;\n const fieldNumber = tag.value >>> 3;\n const wireType = tag.value & 7;\n if (fieldNumber < 1) {\n throw new Error(\"Invalid WhatsApp protobuf field.\");\n }\n if (wireType === 2) {\n const length = readProtobufVarint(value, offset);\n offset = length.offset;\n const end = offset + length.value;\n if (end > value.length) {\n throw new Error(\"Invalid WhatsApp protobuf length.\");\n }\n const entries = fields.get(fieldNumber) ?? [];\n entries.push(value.subarray(offset, end));\n fields.set(fieldNumber, entries);\n offset = end;\n continue;\n }\n if (wireType === 0) {\n offset = skipWhatsAppProtobufField(value, offset, fieldNumber, wireType, 0);\n continue;\n }\n offset = skipWhatsAppProtobufField(value, offset, fieldNumber, wireType, 0);\n }\n return fields;\n}\n\nfunction skipWhatsAppProtobufField(\n value: Uint8Array,\n offset: number,\n fieldNumber: number,\n wireType: number,\n groupDepth: number,\n): number {\n if (wireType === 0) {\n return readProtobufVarint(value, offset).offset;\n }\n if (wireType === 1) {\n const end = offset + 8;\n if (end > value.length) {\n throw new Error(\"Invalid WhatsApp protobuf fixed64 field.\");\n }\n return end;\n }\n if (wireType === 2) {\n const length = readProtobufVarint(value, offset);\n const end = length.offset + length.value;\n if (end > value.length) {\n throw new Error(\"Invalid WhatsApp protobuf length.\");\n }\n return end;\n }\n if (wireType === 3) {\n if (groupDepth >= MAX_WHATSAPP_PROTOBUF_GROUP_DEPTH) {\n throw new Error(\"WhatsApp protobuf group nesting exceeds the supported depth.\");\n }\n let nestedOffset = offset;\n while (nestedOffset < value.length) {\n const tag = readProtobufVarint(value, nestedOffset);\n nestedOffset = tag.offset;\n const nestedFieldNumber = tag.value >>> 3;\n const nestedWireType = tag.value & 7;\n if (nestedFieldNumber < 1) {\n throw new Error(\"Invalid WhatsApp protobuf field.\");\n }\n if (nestedWireType === 4) {\n if (nestedFieldNumber !== fieldNumber) {\n throw new Error(\"Mismatched WhatsApp protobuf end group.\");\n }\n return nestedOffset;\n }\n nestedOffset = skipWhatsAppProtobufField(\n value,\n nestedOffset,\n nestedFieldNumber,\n nestedWireType,\n groupDepth + 1,\n );\n }\n throw new Error(\"Unterminated WhatsApp protobuf group.\");\n }\n if (wireType === 4) {\n throw new Error(\"Unexpected WhatsApp protobuf end group.\");\n }\n if (wireType === 5) {\n const end = offset + 4;\n if (end > value.length) {\n throw new Error(\"Invalid WhatsApp protobuf fixed32 field.\");\n }\n return end;\n }\n throw new Error(`Unsupported WhatsApp protobuf wire type: ${wireType}.`);\n}\n\nfunction readProtobufVarint(value: Uint8Array, start: number): { offset: number; value: number } {\n let result = 0;\n let shift = 0;\n let offset = start;\n while (offset < value.length && shift <= 28) {\n const byte = value[offset++]!;\n result += (byte & 0x7f) * 2 ** shift;\n if ((byte & 0x80) === 0) {\n if (!Number.isSafeInteger(result)) {\n break;\n }\n return { offset, value: result };\n }\n shift += 7;\n }\n throw new Error(\"Invalid WhatsApp protobuf varint.\");\n}\n\nfunction readUtf8(value: Uint8Array | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const text = Buffer.from(value).toString(\"utf8\");\n return Buffer.from(text, \"utf8\").equals(Buffer.from(value)) ? text : undefined;\n}\n\nfunction createInboundMessageNode(message: WhatsAppBaileysInboundMessage): BinaryNode {\n const from = message.key.remoteJid;\n const attrs: Record<string, string> = {\n from,\n id: message.key.id,\n notify: message.pushName ?? \"Test User\",\n t: String(message.messageTimestamp),\n };\n if (isGroupJid(from) && message.key.participant) {\n attrs.participant = message.key.participant;\n }\n return {\n attrs,\n content: [\n {\n attrs: {},\n content: encodePlaintextInboundMessage(message.message),\n tag: \"plaintext\",\n },\n ],\n tag: \"message\",\n };\n}\n\nfunction createIv(counter: number): NodeBuffer {\n const iv = Buffer.alloc(IV_LENGTH);\n iv.writeUInt32BE(counter, 8);\n return iv;\n}\n\nfunction encodeLengthPrefixed(data: Uint8Array): NodeBuffer {\n const frame = Buffer.allocUnsafe(3 + data.byteLength);\n frame[0] = (data.byteLength >>> 16) & 0xff;\n frame[1] = (data.byteLength >>> 8) & 0xff;\n frame[2] = data.byteLength & 0xff;\n frame.set(data, 3);\n return frame;\n}\n\nfunction firstChild(node: BinaryNode): BinaryNode | undefined {\n return children(node)[0];\n}\n\nfunction encodePlaintextConversationMessage(text: string): NodeBuffer {\n const textBytes = Buffer.from(text, \"utf8\");\n return Buffer.from([0x0a, ...encodeVarint(textBytes.byteLength), ...textBytes]);\n}\n\nfunction encodePlaintextInboundMessage(\n message: WhatsAppBaileysInboundMessage[\"message\"],\n): NodeBuffer {\n if (message.audioMessage) {\n return encodePlaintextAudioMessage(message.audioMessage);\n }\n return encodePlaintextConversationMessage(message.conversation);\n}\n\nfunction encodePlaintextAudioMessage(audio: WhatsAppBaileysAudioMessage): NodeBuffer {\n const fields = [\n encodeLengthDelimitedProtobufField(1, Buffer.from(audio.url, \"utf8\")),\n encodeLengthDelimitedProtobufField(2, Buffer.from(audio.mimetype, \"utf8\")),\n encodeLengthDelimitedProtobufField(3, audio.fileSha256),\n encodeVarintProtobufField(4, audio.fileLength),\n ...(audio.seconds === undefined ? [] : [encodeVarintProtobufField(5, audio.seconds)]),\n encodeVarintProtobufField(6, audio.ptt ? 1 : 0),\n encodeLengthDelimitedProtobufField(7, audio.mediaKey),\n encodeLengthDelimitedProtobufField(8, audio.fileEncSha256),\n encodeVarintProtobufField(10, audio.mediaKeyTimestamp),\n ];\n return encodeLengthDelimitedProtobufField(8, Buffer.concat(fields));\n}\n\nfunction encodeLengthDelimitedProtobufField(fieldNumber: number, value: Uint8Array): NodeBuffer {\n return Buffer.concat([\n Buffer.from(encodeVarint((fieldNumber << 3) | 2)),\n Buffer.from(encodeVarint(value.byteLength)),\n Buffer.from(value),\n ]);\n}\n\nfunction encodeVarintProtobufField(fieldNumber: number, value: number): NodeBuffer {\n return Buffer.from([...encodeVarint(fieldNumber << 3), ...encodeVarint(value)]);\n}\n\nfunction encodeVarint(value: number): number[] {\n const bytes: number[] = [];\n let remaining = value;\n while (remaining >= 0x80) {\n bytes.push((remaining & 0x7f) | 0x80);\n remaining = Math.floor(remaining / 0x80);\n }\n bytes.push(remaining);\n return bytes;\n}\n\nfunction isGroupJid(jid: string): boolean {\n return jid.endsWith(\"@g.us\");\n}\n\nfunction requireAttr(node: BinaryNode, name: string): string {\n const value = node.attrs[name];\n if (!value) {\n throw new Error(`Baileys node <${node.tag}> requires ${name}.`);\n }\n return value;\n}\n\nfunction lidForJid(jid: string): string {\n const user = jid.split(\"@\", 1)[0]?.split(\":\", 1)[0] ?? \"15550000000\";\n return `${user}@lid`;\n}\n\nfunction sanitizeNodeForJson(value: unknown): unknown {\n if (Buffer.isBuffer(value) || value instanceof Uint8Array) {\n return { base64: Buffer.from(value).toString(\"base64\"), type: \"Buffer\" };\n }\n if (Array.isArray(value)) {\n return value.map(sanitizeNodeForJson);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [key, sanitizeNodeForJson(entry)]),\n );\n }\n return value;\n}\n\nfunction unixSeconds(): string {\n return Math.floor(Date.now() / 1000).toString();\n}\n"]}
@@ -1,8 +1,6 @@
1
1
  import { Buffer } from "node:buffer";
2
2
  import { createCipheriv, createDecipheriv, createHash, createPrivateKey, createPublicKey, diffieHellman, generateKeyPairSync, hkdfSync, randomBytes, } from "node:crypto";
3
- import { createRequire } from "node:module";
4
- const require = createRequire(import.meta.url);
5
- const curve25519 = require("curve25519-js");
3
+ import * as curve25519 from "curve25519-js";
6
4
  const AES_GCM_TAG_LENGTH = 16;
7
5
  const PRIVATE_KEY_DER_PREFIX = Buffer.from([
8
6
  48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 110, 4, 34, 4, 32,
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../../src/servers/whatsapp-wire/crypto.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport {\n createCipheriv,\n createDecipheriv,\n createHash,\n createPrivateKey,\n createPublicKey,\n diffieHellman,\n generateKeyPairSync,\n hkdfSync,\n randomBytes,\n} from \"node:crypto\";\nimport { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\n\ntype Curve25519Module = {\n generateKeyPair(seed: Uint8Array): { private: Uint8Array; public: Uint8Array };\n sharedKey(privateKey: Uint8Array, publicKey: Uint8Array): Uint8Array;\n sign(privateKey: Uint8Array, message: Uint8Array, random: Uint8Array): Uint8Array;\n};\n\nconst curve25519 = require(\"curve25519-js\") as Curve25519Module;\n\nconst AES_GCM_TAG_LENGTH = 16;\nconst PRIVATE_KEY_DER_PREFIX = Buffer.from([\n 48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 110, 4, 34, 4, 32,\n]);\nconst PUBLIC_KEY_DER_PREFIX = Buffer.from([48, 42, 48, 5, 6, 3, 43, 101, 110, 3, 33, 0]);\n\nexport const KEY_BUNDLE_TYPE = Buffer.from([5]);\nexport const NOISE_MODE = \"Noise_XX_25519_AESGCM_SHA256\\0\\0\\0\\0\";\nexport const NOISE_WA_HEADER = Buffer.from([87, 65, 6, 3]);\n\nexport type KeyPair = {\n private: Buffer;\n public: Buffer;\n};\n\nexport type SignedKeyPair = {\n keyId: number;\n keyPair: KeyPair;\n signature: Buffer;\n};\n\ntype NativeCurveBackend = {\n generateKeyPair(): KeyPair;\n sharedKey(privateKey: Uint8Array, publicKey: Uint8Array): Buffer;\n};\n\ntype CurveApi = NativeCurveBackend & {\n sign(privateKey: Uint8Array, message: Uint8Array): Buffer;\n};\n\nconst nativeCurveBackend: NativeCurveBackend = {\n generateKeyPair() {\n const { privateKey, publicKey } = generateKeyPairSync(\"x25519\", {\n privateKeyEncoding: { format: \"der\", type: \"pkcs8\" },\n publicKeyEncoding: { format: \"der\", type: \"spki\" },\n });\n return {\n private: privateKey.subarray(\n PRIVATE_KEY_DER_PREFIX.length,\n PRIVATE_KEY_DER_PREFIX.length + 32,\n ),\n public: publicKey.subarray(PUBLIC_KEY_DER_PREFIX.length, PUBLIC_KEY_DER_PREFIX.length + 32),\n };\n },\n sharedKey(privateKey, publicKey) {\n const nodePrivateKey = createPrivateKey({\n format: \"der\",\n key: Buffer.concat([PRIVATE_KEY_DER_PREFIX, Buffer.from(privateKey)]),\n type: \"pkcs8\",\n });\n const nodePublicKey = createPublicKey({\n format: \"der\",\n key: Buffer.concat([PUBLIC_KEY_DER_PREFIX, Buffer.from(publicKey)]),\n type: \"spki\",\n });\n return diffieHellman({ privateKey: nodePrivateKey, publicKey: nodePublicKey });\n },\n};\n\nfunction isUnsupportedNativeCurveError(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException | undefined)?.code;\n return (\n code === \"ERR_OSSL_EVP_UNSUPPORTED\" ||\n code === \"ERR_CRYPTO_UNSUPPORTED_OPERATION\" ||\n code === \"ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE\"\n );\n}\n\nexport function createCurve(nativeBackend: NativeCurveBackend = nativeCurveBackend): CurveApi {\n let nativeAvailable = true;\n return {\n generateKeyPair(): KeyPair {\n if (nativeAvailable) {\n try {\n return nativeBackend.generateKeyPair();\n } catch (error) {\n if (!isUnsupportedNativeCurveError(error)) {\n throw error;\n }\n nativeAvailable = false;\n }\n }\n const keyPair = curve25519.generateKeyPair(randomBytes(32));\n return {\n private: Buffer.from(keyPair.private),\n public: Buffer.from(keyPair.public),\n };\n },\n\n sharedKey(privateKey: Uint8Array, publicKey: Uint8Array): Buffer {\n if (privateKey.byteLength !== 32) {\n throw new Error(`Invalid Signal private key length: ${privateKey.byteLength}.`);\n }\n const rawPublicKey = scrubSignalPublicKey(publicKey);\n if (rawPublicKey.every((byte) => byte === 0)) {\n throw new Error(\"X25519 failed during derivation for an invalid peer key.\");\n }\n if (nativeAvailable) {\n try {\n return requireValidX25519SharedKey(nativeBackend.sharedKey(privateKey, rawPublicKey));\n } catch (error) {\n if (!isUnsupportedNativeCurveError(error)) {\n throw error;\n }\n nativeAvailable = false;\n }\n }\n return requireValidX25519SharedKey(\n curve25519.sharedKey(Buffer.from(privateKey), rawPublicKey),\n );\n },\n\n sign(privateKey: Uint8Array, message: Uint8Array): Buffer {\n return Buffer.from(\n curve25519.sign(Buffer.from(privateKey), Buffer.from(message), randomBytes(64)),\n );\n },\n };\n}\n\nfunction requireValidX25519SharedKey(sharedKey: Uint8Array): Buffer {\n const result = Buffer.from(sharedKey);\n if (result.every((byte) => byte === 0)) {\n throw new Error(\"X25519 failed during derivation for an invalid peer key.\");\n }\n return result;\n}\n\nexport const Curve = createCurve();\n\nexport function generateSignalKeyPair(): KeyPair {\n const keyPair = Curve.generateKeyPair();\n return {\n private: keyPair.private,\n public: ensureSignalPublicKey(keyPair.public),\n };\n}\n\nexport function aesEncryptGCM(\n plaintext: Uint8Array,\n key: Uint8Array,\n iv: Uint8Array,\n additionalData: Uint8Array,\n): Buffer {\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n cipher.setAAD(additionalData);\n return Buffer.concat([cipher.update(plaintext), cipher.final(), cipher.getAuthTag()]);\n}\n\nexport function aesDecryptGCM(\n ciphertext: Uint8Array,\n key: Uint8Array,\n iv: Uint8Array,\n additionalData: Uint8Array,\n): Buffer {\n if (ciphertext.byteLength < AES_GCM_TAG_LENGTH) {\n throw new Error(\n `AES-GCM ciphertext must include a ${AES_GCM_TAG_LENGTH}-byte authentication tag.`,\n );\n }\n const decipher = createDecipheriv(\"aes-256-gcm\", key, iv, {\n authTagLength: AES_GCM_TAG_LENGTH,\n });\n const encrypted = ciphertext.subarray(0, ciphertext.byteLength - AES_GCM_TAG_LENGTH);\n const tag = ciphertext.subarray(ciphertext.byteLength - AES_GCM_TAG_LENGTH);\n decipher.setAAD(additionalData);\n decipher.setAuthTag(tag);\n return Buffer.concat([decipher.update(encrypted), decipher.final()]);\n}\n\nexport function encodeBigEndian(value: number, length = 4): Buffer {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(\"Big-endian values must be non-negative safe integers.\");\n }\n if (!Number.isSafeInteger(length) || length < 1 || length > 1024) {\n throw new Error(\"Big-endian lengths must be safe integers between 1 and 1024.\");\n }\n let remaining = BigInt(value);\n if (remaining >= 1n << BigInt(length * 8)) {\n throw new Error(`Big-endian value ${value} does not fit in ${length} bytes.`);\n }\n const bytes = Buffer.alloc(length);\n for (let index = length - 1; index >= 0; index -= 1) {\n bytes[index] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n return bytes;\n}\n\nexport function hkdf(\n input: Uint8Array,\n length: number,\n params: { info: string; salt: Uint8Array },\n) {\n return Buffer.from(hkdfSync(\"sha256\", input, params.salt, params.info, length));\n}\n\nexport function sha256(input: Uint8Array): Buffer {\n return createHash(\"sha256\").update(input).digest();\n}\n\nexport function signedKeyPair(identityKeyPair: KeyPair, keyId: number): SignedKeyPair {\n const keyPair = generateSignalKeyPair();\n return {\n keyId,\n keyPair,\n signature: Curve.sign(identityKeyPair.private, keyPair.public),\n };\n}\n\nexport function ensureSignalPublicKey(publicKey: Uint8Array): Buffer {\n const buffer = Buffer.from(publicKey);\n if (buffer.length === 33 && buffer[0] === KEY_BUNDLE_TYPE[0]) {\n return buffer;\n }\n if (buffer.length === 32) {\n return Buffer.concat([KEY_BUNDLE_TYPE, buffer]);\n }\n throw new Error(`Invalid Signal public key length or type: ${buffer.length}.`);\n}\n\nexport function scrubSignalPublicKey(publicKey: Uint8Array): Buffer {\n const buffer = Buffer.from(publicKey);\n if (buffer.length === 33 && buffer[0] === KEY_BUNDLE_TYPE[0]) {\n return buffer.subarray(1);\n }\n if (buffer.length === 32) {\n return buffer;\n }\n throw new Error(`Invalid Signal public key length: ${buffer.length}.`);\n}\n"]}
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../../src/servers/whatsapp-wire/crypto.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport {\n createCipheriv,\n createDecipheriv,\n createHash,\n createPrivateKey,\n createPublicKey,\n diffieHellman,\n generateKeyPairSync,\n hkdfSync,\n randomBytes,\n} from \"node:crypto\";\nimport * as curve25519 from \"curve25519-js\";\n\nconst AES_GCM_TAG_LENGTH = 16;\nconst PRIVATE_KEY_DER_PREFIX = Buffer.from([\n 48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 110, 4, 34, 4, 32,\n]);\nconst PUBLIC_KEY_DER_PREFIX = Buffer.from([48, 42, 48, 5, 6, 3, 43, 101, 110, 3, 33, 0]);\n\nexport const KEY_BUNDLE_TYPE = Buffer.from([5]);\nexport const NOISE_MODE = \"Noise_XX_25519_AESGCM_SHA256\\0\\0\\0\\0\";\nexport const NOISE_WA_HEADER = Buffer.from([87, 65, 6, 3]);\n\nexport type KeyPair = {\n private: Buffer;\n public: Buffer;\n};\n\nexport type SignedKeyPair = {\n keyId: number;\n keyPair: KeyPair;\n signature: Buffer;\n};\n\ntype NativeCurveBackend = {\n generateKeyPair(): KeyPair;\n sharedKey(privateKey: Uint8Array, publicKey: Uint8Array): Buffer;\n};\n\ntype CurveApi = NativeCurveBackend & {\n sign(privateKey: Uint8Array, message: Uint8Array): Buffer;\n};\n\nconst nativeCurveBackend: NativeCurveBackend = {\n generateKeyPair() {\n const { privateKey, publicKey } = generateKeyPairSync(\"x25519\", {\n privateKeyEncoding: { format: \"der\", type: \"pkcs8\" },\n publicKeyEncoding: { format: \"der\", type: \"spki\" },\n });\n return {\n private: privateKey.subarray(\n PRIVATE_KEY_DER_PREFIX.length,\n PRIVATE_KEY_DER_PREFIX.length + 32,\n ),\n public: publicKey.subarray(PUBLIC_KEY_DER_PREFIX.length, PUBLIC_KEY_DER_PREFIX.length + 32),\n };\n },\n sharedKey(privateKey, publicKey) {\n const nodePrivateKey = createPrivateKey({\n format: \"der\",\n key: Buffer.concat([PRIVATE_KEY_DER_PREFIX, Buffer.from(privateKey)]),\n type: \"pkcs8\",\n });\n const nodePublicKey = createPublicKey({\n format: \"der\",\n key: Buffer.concat([PUBLIC_KEY_DER_PREFIX, Buffer.from(publicKey)]),\n type: \"spki\",\n });\n return diffieHellman({ privateKey: nodePrivateKey, publicKey: nodePublicKey });\n },\n};\n\nfunction isUnsupportedNativeCurveError(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException | undefined)?.code;\n return (\n code === \"ERR_OSSL_EVP_UNSUPPORTED\" ||\n code === \"ERR_CRYPTO_UNSUPPORTED_OPERATION\" ||\n code === \"ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE\"\n );\n}\n\nexport function createCurve(nativeBackend: NativeCurveBackend = nativeCurveBackend): CurveApi {\n let nativeAvailable = true;\n return {\n generateKeyPair(): KeyPair {\n if (nativeAvailable) {\n try {\n return nativeBackend.generateKeyPair();\n } catch (error) {\n if (!isUnsupportedNativeCurveError(error)) {\n throw error;\n }\n nativeAvailable = false;\n }\n }\n const keyPair = curve25519.generateKeyPair(randomBytes(32));\n return {\n private: Buffer.from(keyPair.private),\n public: Buffer.from(keyPair.public),\n };\n },\n\n sharedKey(privateKey: Uint8Array, publicKey: Uint8Array): Buffer {\n if (privateKey.byteLength !== 32) {\n throw new Error(`Invalid Signal private key length: ${privateKey.byteLength}.`);\n }\n const rawPublicKey = scrubSignalPublicKey(publicKey);\n if (rawPublicKey.every((byte) => byte === 0)) {\n throw new Error(\"X25519 failed during derivation for an invalid peer key.\");\n }\n if (nativeAvailable) {\n try {\n return requireValidX25519SharedKey(nativeBackend.sharedKey(privateKey, rawPublicKey));\n } catch (error) {\n if (!isUnsupportedNativeCurveError(error)) {\n throw error;\n }\n nativeAvailable = false;\n }\n }\n return requireValidX25519SharedKey(\n curve25519.sharedKey(Buffer.from(privateKey), rawPublicKey),\n );\n },\n\n sign(privateKey: Uint8Array, message: Uint8Array): Buffer {\n return Buffer.from(\n curve25519.sign(Buffer.from(privateKey), Buffer.from(message), randomBytes(64)),\n );\n },\n };\n}\n\nfunction requireValidX25519SharedKey(sharedKey: Uint8Array): Buffer {\n const result = Buffer.from(sharedKey);\n if (result.every((byte) => byte === 0)) {\n throw new Error(\"X25519 failed during derivation for an invalid peer key.\");\n }\n return result;\n}\n\nexport const Curve = createCurve();\n\nexport function generateSignalKeyPair(): KeyPair {\n const keyPair = Curve.generateKeyPair();\n return {\n private: keyPair.private,\n public: ensureSignalPublicKey(keyPair.public),\n };\n}\n\nexport function aesEncryptGCM(\n plaintext: Uint8Array,\n key: Uint8Array,\n iv: Uint8Array,\n additionalData: Uint8Array,\n): Buffer {\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n cipher.setAAD(additionalData);\n return Buffer.concat([cipher.update(plaintext), cipher.final(), cipher.getAuthTag()]);\n}\n\nexport function aesDecryptGCM(\n ciphertext: Uint8Array,\n key: Uint8Array,\n iv: Uint8Array,\n additionalData: Uint8Array,\n): Buffer {\n if (ciphertext.byteLength < AES_GCM_TAG_LENGTH) {\n throw new Error(\n `AES-GCM ciphertext must include a ${AES_GCM_TAG_LENGTH}-byte authentication tag.`,\n );\n }\n const decipher = createDecipheriv(\"aes-256-gcm\", key, iv, {\n authTagLength: AES_GCM_TAG_LENGTH,\n });\n const encrypted = ciphertext.subarray(0, ciphertext.byteLength - AES_GCM_TAG_LENGTH);\n const tag = ciphertext.subarray(ciphertext.byteLength - AES_GCM_TAG_LENGTH);\n decipher.setAAD(additionalData);\n decipher.setAuthTag(tag);\n return Buffer.concat([decipher.update(encrypted), decipher.final()]);\n}\n\nexport function encodeBigEndian(value: number, length = 4): Buffer {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(\"Big-endian values must be non-negative safe integers.\");\n }\n if (!Number.isSafeInteger(length) || length < 1 || length > 1024) {\n throw new Error(\"Big-endian lengths must be safe integers between 1 and 1024.\");\n }\n let remaining = BigInt(value);\n if (remaining >= 1n << BigInt(length * 8)) {\n throw new Error(`Big-endian value ${value} does not fit in ${length} bytes.`);\n }\n const bytes = Buffer.alloc(length);\n for (let index = length - 1; index >= 0; index -= 1) {\n bytes[index] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n return bytes;\n}\n\nexport function hkdf(\n input: Uint8Array,\n length: number,\n params: { info: string; salt: Uint8Array },\n) {\n return Buffer.from(hkdfSync(\"sha256\", input, params.salt, params.info, length));\n}\n\nexport function sha256(input: Uint8Array): Buffer {\n return createHash(\"sha256\").update(input).digest();\n}\n\nexport function signedKeyPair(identityKeyPair: KeyPair, keyId: number): SignedKeyPair {\n const keyPair = generateSignalKeyPair();\n return {\n keyId,\n keyPair,\n signature: Curve.sign(identityKeyPair.private, keyPair.public),\n };\n}\n\nexport function ensureSignalPublicKey(publicKey: Uint8Array): Buffer {\n const buffer = Buffer.from(publicKey);\n if (buffer.length === 33 && buffer[0] === KEY_BUNDLE_TYPE[0]) {\n return buffer;\n }\n if (buffer.length === 32) {\n return Buffer.concat([KEY_BUNDLE_TYPE, buffer]);\n }\n throw new Error(`Invalid Signal public key length or type: ${buffer.length}.`);\n}\n\nexport function scrubSignalPublicKey(publicKey: Uint8Array): Buffer {\n const buffer = Buffer.from(publicKey);\n if (buffer.length === 33 && buffer[0] === KEY_BUNDLE_TYPE[0]) {\n return buffer.subarray(1);\n }\n if (buffer.length === 32) {\n return buffer;\n }\n throw new Error(`Invalid Signal public key length: ${buffer.length}.`);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/crabline",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "Standalone CLI for deterministic messaging provider E2E tests",
5
5
  "homepage": "https://github.com/openclaw/crabline#readme",
6
6
  "bugs": {
@@ -60,7 +60,7 @@
60
60
  "re2js": "2.8.6",
61
61
  "ws": "^8.21.3",
62
62
  "yaml": "^2.9.0",
63
- "zod": "^4.4.3"
63
+ "zod": "^4.5.2"
64
64
  },
65
65
  "devDependencies": {
66
66
  "@types/proper-lockfile": "4.1.4",
@@ -72,6 +72,7 @@
72
72
  "oxfmt": "^0.65.0",
73
73
  "oxlint": "^1.80.0",
74
74
  "oxlint-tsgolint": "^7.0.2001",
75
+ "rolldown": "1.2.5",
75
76
  "tsx": "^4.23.12",
76
77
  "typescript": "npm:@typescript/typescript6@^6.0.2",
77
78
  "vitest": "^4.1.11"