| export function elide(text?: string, limit = 400) { |
| if (!text) { |
| return text; |
| } |
| if (text.length <= limit) { |
| return text; |
| } |
| return `${text.slice(0, limit)}… (truncated ${text.length - limit} chars)`; |
| } |
|
|
| export function isLikelyWhatsAppCryptoError(reason: unknown) { |
| const formatReason = (value: unknown): string => { |
| if (value == null) { |
| return ""; |
| } |
| if (typeof value === "string") { |
| return value; |
| } |
| if (value instanceof Error) { |
| return `${value.message}\n${value.stack ?? ""}`; |
| } |
| if (typeof value === "object") { |
| try { |
| return JSON.stringify(value); |
| } catch { |
| return Object.prototype.toString.call(value); |
| } |
| } |
| if (typeof value === "number") { |
| return String(value); |
| } |
| if (typeof value === "boolean") { |
| return String(value); |
| } |
| if (typeof value === "bigint") { |
| return String(value); |
| } |
| if (typeof value === "symbol") { |
| return value.description ?? value.toString(); |
| } |
| if (typeof value === "function") { |
| return value.name ? `[function ${value.name}]` : "[function]"; |
| } |
| return Object.prototype.toString.call(value); |
| }; |
| const raw = |
| reason instanceof Error ? `${reason.message}\n${reason.stack ?? ""}` : formatReason(reason); |
| const haystack = raw.toLowerCase(); |
| const hasAuthError = |
| haystack.includes("unsupported state or unable to authenticate data") || |
| haystack.includes("bad mac"); |
| if (!hasAuthError) { |
| return false; |
| } |
| return ( |
| haystack.includes("@whiskeysockets/baileys") || |
| haystack.includes("baileys") || |
| haystack.includes("noise-handler") || |
| haystack.includes("aesdecryptgcm") |
| ); |
| } |
|
|