@openclaw/crabline 0.1.12 → 0.1.14
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 +38 -11
- package/dist/src/cli/program.js +17 -2
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/index.d.ts +12 -10
- package/dist/src/index.js +6 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/openclaw/artifact-generation.d.ts +5 -9
- package/dist/src/openclaw/artifact-generation.js +41 -69
- package/dist/src/openclaw/artifact-generation.js.map +1 -1
- package/dist/src/openclaw/bridges/discord.d.ts +1 -0
- package/dist/src/openclaw/bridges/discord.js +149 -0
- package/dist/src/openclaw/bridges/discord.js.map +1 -0
- package/dist/src/openclaw/bridges/matrix.js +1 -1
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +1 -1
- package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
- package/dist/src/openclaw/bridges/signal.js +1 -1
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +1 -1
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +1 -1
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +1 -1
- package/dist/src/openclaw/bridges/zalo.js.map +1 -1
- package/dist/src/openclaw/outbound-contract.js +3 -0
- package/dist/src/openclaw/outbound-contract.js.map +1 -1
- package/dist/src/openclaw/{smoke-lock.d.ts → provider-readiness-lock.d.ts} +7 -7
- package/dist/src/openclaw/{smoke-lock.js → provider-readiness-lock.js} +122 -260
- package/dist/src/openclaw/provider-readiness-lock.js.map +1 -0
- package/dist/src/openclaw/shared.d.ts +9 -17
- package/dist/src/openclaw/shared.js +5 -6
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw.d.ts +3 -5
- package/dist/src/openclaw.js +22 -20
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/servers/discord.d.ts +40 -0
- package/dist/src/servers/discord.js +842 -0
- package/dist/src/servers/discord.js.map +1 -0
- package/dist/src/servers/index.d.ts +10 -4
- package/dist/src/servers/index.js +4 -0
- package/dist/src/servers/index.js.map +1 -1
- package/dist/src/servers/slack.js +11 -3
- package/dist/src/servers/slack.js.map +1 -1
- package/dist/src/servers/telegram.js +51 -2
- package/dist/src/servers/telegram.js.map +1 -1
- package/dist/src/servers/whatsapp-baileys-websocket.js +7 -0
- package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/binary-node.js +12 -0
- package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
- package/dist/src/servers/whatsapp.d.ts +0 -1
- package/dist/src/servers/whatsapp.js +0 -1
- package/dist/src/servers/whatsapp.js.map +1 -1
- package/docs/channel-setup.md +66 -21
- package/package.json +1 -1
- package/dist/src/openclaw/smoke-lock.js.map +0 -1
|
@@ -61,8 +61,11 @@ const SINGLE_BYTE_TOKENS = {
|
|
|
61
61
|
29: "enc",
|
|
62
62
|
31: "presence",
|
|
63
63
|
41: "get",
|
|
64
|
+
42: "read",
|
|
64
65
|
45: "0",
|
|
66
|
+
46: "chatstate",
|
|
65
67
|
48: "unavailable",
|
|
68
|
+
52: "composing",
|
|
66
69
|
56: "text",
|
|
67
70
|
58: "media_conn",
|
|
68
71
|
65: "count",
|
|
@@ -73,6 +76,9 @@ const SINGLE_BYTE_TOKENS = {
|
|
|
73
76
|
81: "v",
|
|
74
77
|
83: "pkmsg",
|
|
75
78
|
84: "version",
|
|
79
|
+
85: "1",
|
|
80
|
+
86: "ping",
|
|
81
|
+
87: "w:p",
|
|
76
82
|
90: "set",
|
|
77
83
|
92: "props",
|
|
78
84
|
95: "hash",
|
|
@@ -86,14 +92,17 @@ const SINGLE_BYTE_TOKENS = {
|
|
|
86
92
|
118: "lid",
|
|
87
93
|
121: "usync",
|
|
88
94
|
125: "context",
|
|
95
|
+
136: "available",
|
|
89
96
|
137: "name",
|
|
90
97
|
143: "index",
|
|
98
|
+
154: "paused",
|
|
91
99
|
155: "true",
|
|
92
100
|
156: "identity",
|
|
93
101
|
158: "key",
|
|
94
102
|
160: "background",
|
|
95
103
|
169: "auth",
|
|
96
104
|
173: "registration",
|
|
105
|
+
183: "description",
|
|
97
106
|
189: "ttl",
|
|
98
107
|
194: "w:m",
|
|
99
108
|
197: "token",
|
|
@@ -107,6 +116,7 @@ const SINGLE_BYTE_TOKENS = {
|
|
|
107
116
|
const DOUBLE_BYTE_TOKENS = {
|
|
108
117
|
0: {
|
|
109
118
|
1: "active",
|
|
119
|
+
3: "protocol",
|
|
110
120
|
15: "false",
|
|
111
121
|
24: "passive",
|
|
112
122
|
45: "skey",
|
|
@@ -116,9 +126,11 @@ const DOUBLE_BYTE_TOKENS = {
|
|
|
116
126
|
170: "group",
|
|
117
127
|
217: "blocklist",
|
|
118
128
|
238: "s_t",
|
|
129
|
+
239: "abt",
|
|
119
130
|
},
|
|
120
131
|
1: {
|
|
121
132
|
51: "w:g2",
|
|
133
|
+
120: "participating",
|
|
122
134
|
},
|
|
123
135
|
};
|
|
124
136
|
export const S_WHATSAPP_NET = "@s.whatsapp.net";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary-node.js","sourceRoot":"","sources":["../../../../src/servers/whatsapp-wire/binary-node.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { inflate } from \"node:zlib\";\n\nexport type BinaryNode = {\n attrs: Record<string, string>;\n content?: BinaryNode[] | string | Uint8Array;\n tag: string;\n};\n\nexport const WHATSAPP_BINARY_NODE_MAX_COMPRESSED_BYTES = 1024 * 1024;\nexport const WHATSAPP_BINARY_NODE_MAX_DECOMPRESSED_BYTES = 8 * 1024 * 1024;\nexport const WHATSAPP_BINARY_NODE_MAX_FRAME_BYTES = WHATSAPP_BINARY_NODE_MAX_DECOMPRESSED_BYTES + 1;\nexport const WHATSAPP_BINARY_NODE_MAX_DEPTH = 128;\nexport const WHATSAPP_BINARY_NODE_MAX_NODES = 32_768;\nexport const WHATSAPP_BINARY_NODE_MAX_LIST_ITEMS = 131_072;\n\ntype BinaryNodeBudget = {\n listItems: number;\n nodes: number;\n};\n\nfunction inflateWithInfo(\n buffer: Uint8Array,\n): Promise<{ buffer: Buffer; engine: { bytesWritten: number } }> {\n return new Promise((resolve, reject) => {\n inflate(\n buffer,\n { info: true, maxOutputLength: WHATSAPP_BINARY_NODE_MAX_DECOMPRESSED_BYTES },\n (error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result as unknown as { buffer: Buffer; engine: { bytesWritten: number } });\n }\n },\n );\n });\n}\n\nconst TAGS = {\n AD_JID: 247,\n BINARY_8: 252,\n BINARY_20: 253,\n BINARY_32: 254,\n DICTIONARY_0: 236,\n DICTIONARY_1: 237,\n DICTIONARY_2: 238,\n DICTIONARY_3: 239,\n FB_JID: 246,\n HEX_8: 251,\n INTEROP_JID: 245,\n JID_PAIR: 250,\n LIST_8: 248,\n LIST_16: 249,\n LIST_EMPTY: 0,\n NIBBLE_8: 255,\n PACKED_MAX: 127,\n} as const;\n\n// Minimal WhatsApp binary token dictionary for the nodes this local server handles.\nconst SINGLE_BYTE_TOKENS: Readonly<Record<number, string>> = {\n 3: \"s.whatsapp.net\",\n 4: \"type\",\n 5: \"participant\",\n 6: \"from\",\n 7: \"receipt\",\n 8: \"id\",\n 12: \"jid\",\n 14: \"user\",\n 15: \"devices\",\n 17: \"to\",\n 18: \"offline\",\n 19: \"message\",\n 20: \"result\",\n 21: \"class\",\n 22: \"xmlns\",\n 25: \"iq\",\n 26: \"t\",\n 27: \"ack\",\n 28: \"g.us\",\n 29: \"enc\",\n 31: \"presence\",\n 41: \"get\",\n 45: \"0\",\n 48: \"unavailable\",\n 56: \"text\",\n 58: \"media_conn\",\n 65: \"count\",\n 69: \"2\",\n 70: \"hostname\",\n 76: \"success\",\n 79: \"prop\",\n 81: \"v\",\n 83: \"pkmsg\",\n 84: \"version\",\n 90: \"set\",\n 92: \"props\",\n 95: \"hash\",\n 97: \"last\",\n 106: \"mode\",\n 107: \"participants\",\n 108: \"value\",\n 109: \"query\",\n 113: \"list\",\n 114: \"host\",\n 118: \"lid\",\n 121: \"usync\",\n 125: \"context\",\n 137: \"name\",\n 143: \"index\",\n 155: \"true\",\n 156: \"identity\",\n 158: \"key\",\n 160: \"background\",\n 169: \"auth\",\n 173: \"registration\",\n 189: \"ttl\",\n 194: \"w:m\",\n 197: \"token\",\n 198: \"inactive\",\n 203: \"encrypt\",\n 212: \"signature\",\n 217: \"trusted_contact\",\n 226: \"privacy\",\n 230: \"device-identity\",\n};\n\nconst DOUBLE_BYTE_TOKENS: Readonly<Record<number, Readonly<Record<number, string>>>> = {\n 0: {\n 1: \"active\",\n 15: \"false\",\n 24: \"passive\",\n 45: \"skey\",\n 46: \"reason\",\n 68: \"tokens\",\n 127: \"subject\",\n 170: \"group\",\n 217: \"blocklist\",\n 238: \"s_t\",\n },\n 1: {\n 51: \"w:g2\",\n },\n};\n\nexport const S_WHATSAPP_NET = \"@s.whatsapp.net\";\n\nexport async function decodeBinaryNode(frame: Buffer): Promise<BinaryNode> {\n const buffer = await decompressIfRequired(frame);\n const indexRef = { index: 0 };\n const node = decodeDecompressedBinaryNode(buffer, indexRef, 1, {\n listItems: 0,\n nodes: 0,\n });\n if (indexRef.index !== buffer.length) {\n throw new Error(\"WhatsApp binary node frame contains trailing data.\");\n }\n return node;\n}\n\nexport function encodeBinaryNode(node: BinaryNode): Buffer {\n return Buffer.from(\n encodeBinaryNodeInner(node, [0], 1, {\n listItems: 0,\n nodes: 0,\n }),\n );\n}\n\nasync function decompressIfRequired(buffer: Buffer): Promise<Buffer> {\n if (buffer.length === 0) {\n throw new Error(\"Cannot decode an empty WhatsApp binary node.\");\n }\n const flag = buffer.readUInt8();\n if ((flag & 2) !== 0) {\n const compressed = buffer.subarray(1);\n if (compressed.length > WHATSAPP_BINARY_NODE_MAX_COMPRESSED_BYTES) {\n throw new Error(`Compressed WhatsApp binary node frame is too large: ${compressed.length}.`);\n }\n try {\n const inflated = await inflateWithInfo(compressed);\n if (inflated.engine.bytesWritten !== compressed.length) {\n throw new Error(\"Compressed WhatsApp binary node frame contains trailing data.\");\n }\n return inflated.buffer;\n } catch (error) {\n if (\n error instanceof RangeError ||\n (error instanceof Error && (error as NodeJS.ErrnoException).code === \"ERR_BUFFER_TOO_LARGE\")\n ) {\n throw new Error(\n `WhatsApp binary node expands beyond ${WHATSAPP_BINARY_NODE_MAX_DECOMPRESSED_BYTES} bytes.`,\n { cause: error },\n );\n }\n throw error;\n }\n }\n const payload = buffer.subarray(1);\n if (payload.length > WHATSAPP_BINARY_NODE_MAX_DECOMPRESSED_BYTES) {\n throw new Error(`WhatsApp binary node payload is too large: ${payload.length}.`);\n }\n return payload;\n}\n\nfunction decodeDecompressedBinaryNode(\n buffer: Buffer,\n indexRef: { index: number },\n depth: number,\n budget: BinaryNodeBudget,\n): BinaryNode {\n if (depth > WHATSAPP_BINARY_NODE_MAX_DEPTH) {\n throw new Error(`WhatsApp binary node nesting exceeds ${WHATSAPP_BINARY_NODE_MAX_DEPTH}.`);\n }\n budget.nodes += 1;\n if (budget.nodes > WHATSAPP_BINARY_NODE_MAX_NODES) {\n throw new Error(`WhatsApp binary node count exceeds ${WHATSAPP_BINARY_NODE_MAX_NODES}.`);\n }\n const checkEOS = (length: number) => {\n if (!Number.isSafeInteger(length) || length < 0 || length > buffer.length - indexRef.index) {\n throw new Error(\"Unexpected end of WhatsApp binary node.\");\n }\n };\n const next = () => {\n const value = buffer[indexRef.index];\n indexRef.index += 1;\n if (value === undefined) {\n throw new Error(\"Unexpected end of WhatsApp binary node.\");\n }\n return value;\n };\n const readByte = () => {\n checkEOS(1);\n return next();\n };\n const readBytes = (length: number) => {\n checkEOS(length);\n const value = buffer.subarray(indexRef.index, indexRef.index + length);\n indexRef.index += length;\n return value;\n };\n const readInt = (length: number, littleEndian = false) => {\n checkEOS(length);\n let value = 0;\n for (let index = 0; index < length; index += 1) {\n const byte = next();\n value = littleEndian ? value + byte * 256 ** index : value * 256 + byte;\n }\n return value;\n };\n const readInt20 = () => {\n checkEOS(3);\n return ((next() & 15) << 16) + (next() << 8) + next();\n };\n const readStringFromChars = (length: number) => readBytes(length).toString(\"utf8\");\n const unpackHex = (value: number) => {\n if (value >= 0 && value < 16) {\n return value < 10 ? \"0\".charCodeAt(0) + value : \"A\".charCodeAt(0) + value - 10;\n }\n throw new Error(`Invalid WhatsApp hex token: ${value}.`);\n };\n const unpackNibble = (value: number) => {\n if (value >= 0 && value <= 9) {\n return \"0\".charCodeAt(0) + value;\n }\n if (value === 10) {\n return \"-\".charCodeAt(0);\n }\n if (value === 11) {\n return \".\".charCodeAt(0);\n }\n if (value === 15) {\n return \"\\0\".charCodeAt(0);\n }\n throw new Error(`Invalid WhatsApp nibble token: ${value}.`);\n };\n const unpackByte = (tag: number, value: number) => {\n if (tag === TAGS.NIBBLE_8) {\n return unpackNibble(value);\n }\n if (tag === TAGS.HEX_8) {\n return unpackHex(value);\n }\n throw new Error(`Unknown WhatsApp packed string tag: ${tag}.`);\n };\n const readPacked8 = (tag: number) => {\n const startByte = readByte();\n let value = \"\";\n for (let index = 0; index < (startByte & 127); index += 1) {\n const current = readByte();\n value += String.fromCharCode(unpackByte(tag, (current & 0xf0) >> 4));\n value += String.fromCharCode(unpackByte(tag, current & 0x0f));\n }\n return startByte >> 7 !== 0 ? value.slice(0, -1) : value;\n };\n const readListSize = (tag: number) => {\n let size: number;\n if (tag === TAGS.LIST_EMPTY) {\n size = 0;\n } else if (tag === TAGS.LIST_8) {\n size = readByte();\n } else if (tag === TAGS.LIST_16) {\n size = readInt(2);\n } else {\n throw new Error(`Invalid WhatsApp list tag: ${tag}.`);\n }\n budget.listItems += size;\n if (budget.listItems > WHATSAPP_BINARY_NODE_MAX_LIST_ITEMS) {\n throw new Error(\n `WhatsApp binary node list items exceed ${WHATSAPP_BINARY_NODE_MAX_LIST_ITEMS}.`,\n );\n }\n return size;\n };\n const isListTag = (tag: number) =>\n tag === TAGS.LIST_EMPTY || tag === TAGS.LIST_8 || tag === TAGS.LIST_16;\n const readString = (tag: number): string => {\n const token = SINGLE_BYTE_TOKENS[tag];\n if (token !== undefined) {\n return token;\n }\n if (tag >= 1 && tag < 236) {\n throw new Error(`Unsupported WhatsApp single-byte token: ${tag}.`);\n }\n if (\n tag === TAGS.DICTIONARY_0 ||\n tag === TAGS.DICTIONARY_1 ||\n tag === TAGS.DICTIONARY_2 ||\n tag === TAGS.DICTIONARY_3\n ) {\n return readDoubleToken(tag - TAGS.DICTIONARY_0, readByte());\n }\n if (tag === TAGS.LIST_EMPTY) {\n return \"\";\n }\n if (tag === TAGS.BINARY_8) {\n return readStringFromChars(readByte());\n }\n if (tag === TAGS.BINARY_20) {\n return readStringFromChars(readInt20());\n }\n if (tag === TAGS.BINARY_32) {\n return readStringFromChars(readInt(4));\n }\n if (tag === TAGS.JID_PAIR) {\n return readJidPair();\n }\n if (tag === TAGS.FB_JID) {\n return readFbJid();\n }\n if (tag === TAGS.INTEROP_JID) {\n return readInteropJid();\n }\n if (tag === TAGS.AD_JID) {\n return readAdJid();\n }\n if (tag === TAGS.HEX_8 || tag === TAGS.NIBBLE_8) {\n return readPacked8(tag);\n }\n throw new Error(`Invalid WhatsApp string tag: ${tag}.`);\n };\n const readList = (tag: number) => {\n const items: BinaryNode[] = [];\n const size = readListSize(tag);\n for (let index = 0; index < size; index += 1) {\n items.push(decodeDecompressedBinaryNode(buffer, indexRef, depth + 1, budget));\n }\n return items;\n };\n const readJidPair = () => {\n const user = readString(readByte());\n const server = readString(readByte());\n if (!server) {\n throw new Error(`Invalid WhatsApp JID pair: ${user}, ${server}.`);\n }\n return `${user || \"\"}@${server}`;\n };\n const readAdJid = () => {\n const domainType = readByte();\n const device = readByte();\n const user = readString(readByte());\n const server =\n domainType === 1\n ? \"lid\"\n : domainType === 128\n ? \"hosted\"\n : domainType === 129\n ? \"hosted.lid\"\n : \"s.whatsapp.net\";\n return `${user}${device ? `:${device}` : \"\"}@${server}`;\n };\n const readFbJid = () => {\n const user = readString(readByte());\n const device = readInt(2);\n const server = readString(readByte());\n return `${user}:${device}@${server}`;\n };\n const readInteropJid = () => {\n const user = readString(readByte());\n const device = readInt(2);\n const integrator = readInt(2);\n let server: string;\n try {\n server = readString(readByte());\n } catch (error) {\n throw new Error(\"Invalid WhatsApp interop JID server.\", { cause: error });\n }\n if (server !== \"interop\") {\n throw new Error(`Invalid WhatsApp interop JID server: ${server}.`);\n }\n return `${integrator}-${user}:${device}@${server}`;\n };\n const readDoubleToken = (dictionary: number, index: number) => {\n const value = DOUBLE_BYTE_TOKENS[dictionary]?.[index];\n if (value === undefined) {\n throw new Error(`Unsupported WhatsApp dictionary token: ${dictionary}:${index}.`);\n }\n return value;\n };\n\n const listSize = readListSize(readByte());\n const tag = readString(readByte());\n if (listSize === 0 || !tag) {\n throw new Error(\"Invalid WhatsApp binary node header.\");\n }\n const attrs = Object.create(null) as Record<string, string>;\n for (let index = 0; index < (listSize - 1) >> 1; index += 1) {\n attrs[readString(readByte())] = readString(readByte());\n }\n let content: BinaryNode[\"content\"];\n if (listSize % 2 === 0) {\n const contentTag = readByte();\n if (isListTag(contentTag)) {\n content = readList(contentTag);\n } else if (contentTag === TAGS.BINARY_8) {\n content = readBytes(readByte());\n } else if (contentTag === TAGS.BINARY_20) {\n content = readBytes(readInt20());\n } else if (contentTag === TAGS.BINARY_32) {\n content = readBytes(readInt(4));\n } else {\n content = readString(contentTag);\n }\n }\n return content === undefined ? { attrs, tag } : { attrs, content, tag };\n}\n\nfunction encodeBinaryNodeInner(\n node: BinaryNode,\n buffer: number[],\n depth: number,\n budget: BinaryNodeBudget,\n): number[] {\n if (depth > WHATSAPP_BINARY_NODE_MAX_DEPTH) {\n throw new Error(`WhatsApp binary node nesting exceeds ${WHATSAPP_BINARY_NODE_MAX_DEPTH}.`);\n }\n budget.nodes += 1;\n if (budget.nodes > WHATSAPP_BINARY_NODE_MAX_NODES) {\n throw new Error(`WhatsApp binary node count exceeds ${WHATSAPP_BINARY_NODE_MAX_NODES}.`);\n }\n if (!node.tag) {\n throw new Error(\"Invalid WhatsApp binary node: tag is required.\");\n }\n const validAttributes = Object.keys(node.attrs ?? {}).filter((key) => {\n const value = node.attrs[key];\n return value !== undefined && value !== null;\n });\n writeBudgetedListStart(\n buffer,\n 2 * validAttributes.length + 1 + (node.content !== undefined ? 1 : 0),\n budget,\n );\n writeString(buffer, node.tag);\n for (const key of validAttributes) {\n writeString(buffer, key);\n writeString(buffer, node.attrs[key] ?? \"\");\n }\n if (typeof node.content === \"string\") {\n writeString(buffer, node.content);\n } else if (node.content instanceof Uint8Array) {\n writeByteLength(buffer, node.content.length);\n pushBytes(buffer, node.content);\n } else if (Array.isArray(node.content)) {\n writeBudgetedListStart(buffer, node.content.length, budget);\n for (const child of node.content) {\n encodeBinaryNodeInner(child, buffer, depth + 1, budget);\n }\n } else if (node.content !== undefined) {\n throw new Error(`Invalid WhatsApp binary node content for <${node.tag}>.`);\n }\n return buffer;\n}\n\nfunction writeBudgetedListStart(buffer: number[], size: number, budget: BinaryNodeBudget): void {\n budget.listItems += size;\n if (budget.listItems > WHATSAPP_BINARY_NODE_MAX_LIST_ITEMS) {\n throw new Error(\n `WhatsApp binary node list items exceed ${WHATSAPP_BINARY_NODE_MAX_LIST_ITEMS}.`,\n );\n }\n writeListStart(buffer, size);\n}\n\nfunction pushByte(buffer: number[], value: number): void {\n assertEncodedCapacity(buffer, 1);\n buffer.push(value & 0xff);\n}\n\nfunction pushBytes(buffer: number[], bytes: Uint8Array): void {\n assertEncodedCapacity(buffer, bytes.length);\n for (const byte of bytes) {\n buffer.push(byte & 0xff);\n }\n}\n\nfunction assertEncodedCapacity(buffer: number[], additionalBytes: number): void {\n if (buffer.length + additionalBytes > WHATSAPP_BINARY_NODE_MAX_FRAME_BYTES) {\n throw new Error(\n `WhatsApp binary node frame exceeds ${WHATSAPP_BINARY_NODE_MAX_FRAME_BYTES} bytes.`,\n );\n }\n}\n\nfunction pushInt(buffer: number[], value: number, length: number): void {\n for (let index = 0; index < length; index += 1) {\n const shift = length - 1 - index;\n pushByte(buffer, value >> (shift * 8));\n }\n}\n\nfunction writeByteLength(buffer: number[], length: number): void {\n if (length >= 4294967296) {\n throw new Error(`WhatsApp binary node payload is too large: ${length}.`);\n }\n if (length >= 1 << 20) {\n pushByte(buffer, TAGS.BINARY_32);\n pushInt(buffer, length, 4);\n return;\n }\n if (length >= 256) {\n pushByte(buffer, TAGS.BINARY_20);\n pushByte(buffer, (length >> 16) & 0x0f);\n pushByte(buffer, length >> 8);\n pushByte(buffer, length);\n return;\n }\n pushByte(buffer, TAGS.BINARY_8);\n pushByte(buffer, length);\n}\n\nfunction writeString(buffer: number[], value: string): void {\n const bytes = Buffer.from(value, \"utf8\");\n writeByteLength(buffer, bytes.length);\n pushBytes(buffer, bytes);\n}\n\nfunction writeListStart(buffer: number[], size: number): void {\n if (!Number.isSafeInteger(size) || size < 0 || size > 0xffff) {\n throw new Error(`WhatsApp binary node list is too large: ${size}.`);\n }\n if (size === 0) {\n pushByte(buffer, TAGS.LIST_EMPTY);\n return;\n }\n if (size < 256) {\n pushByte(buffer, TAGS.LIST_8);\n pushByte(buffer, size);\n return;\n }\n pushByte(buffer, TAGS.LIST_16);\n pushInt(buffer, size, 2);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"binary-node.js","sourceRoot":"","sources":["../../../../src/servers/whatsapp-wire/binary-node.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { inflate } from \"node:zlib\";\n\nexport type BinaryNode = {\n attrs: Record<string, string>;\n content?: BinaryNode[] | string | Uint8Array;\n tag: string;\n};\n\nexport const WHATSAPP_BINARY_NODE_MAX_COMPRESSED_BYTES = 1024 * 1024;\nexport const WHATSAPP_BINARY_NODE_MAX_DECOMPRESSED_BYTES = 8 * 1024 * 1024;\nexport const WHATSAPP_BINARY_NODE_MAX_FRAME_BYTES = WHATSAPP_BINARY_NODE_MAX_DECOMPRESSED_BYTES + 1;\nexport const WHATSAPP_BINARY_NODE_MAX_DEPTH = 128;\nexport const WHATSAPP_BINARY_NODE_MAX_NODES = 32_768;\nexport const WHATSAPP_BINARY_NODE_MAX_LIST_ITEMS = 131_072;\n\ntype BinaryNodeBudget = {\n listItems: number;\n nodes: number;\n};\n\nfunction inflateWithInfo(\n buffer: Uint8Array,\n): Promise<{ buffer: Buffer; engine: { bytesWritten: number } }> {\n return new Promise((resolve, reject) => {\n inflate(\n buffer,\n { info: true, maxOutputLength: WHATSAPP_BINARY_NODE_MAX_DECOMPRESSED_BYTES },\n (error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result as unknown as { buffer: Buffer; engine: { bytesWritten: number } });\n }\n },\n );\n });\n}\n\nconst TAGS = {\n AD_JID: 247,\n BINARY_8: 252,\n BINARY_20: 253,\n BINARY_32: 254,\n DICTIONARY_0: 236,\n DICTIONARY_1: 237,\n DICTIONARY_2: 238,\n DICTIONARY_3: 239,\n FB_JID: 246,\n HEX_8: 251,\n INTEROP_JID: 245,\n JID_PAIR: 250,\n LIST_8: 248,\n LIST_16: 249,\n LIST_EMPTY: 0,\n NIBBLE_8: 255,\n PACKED_MAX: 127,\n} as const;\n\n// Minimal WhatsApp binary token dictionary for the nodes this local server handles.\nconst SINGLE_BYTE_TOKENS: Readonly<Record<number, string>> = {\n 3: \"s.whatsapp.net\",\n 4: \"type\",\n 5: \"participant\",\n 6: \"from\",\n 7: \"receipt\",\n 8: \"id\",\n 12: \"jid\",\n 14: \"user\",\n 15: \"devices\",\n 17: \"to\",\n 18: \"offline\",\n 19: \"message\",\n 20: \"result\",\n 21: \"class\",\n 22: \"xmlns\",\n 25: \"iq\",\n 26: \"t\",\n 27: \"ack\",\n 28: \"g.us\",\n 29: \"enc\",\n 31: \"presence\",\n 41: \"get\",\n 42: \"read\",\n 45: \"0\",\n 46: \"chatstate\",\n 48: \"unavailable\",\n 52: \"composing\",\n 56: \"text\",\n 58: \"media_conn\",\n 65: \"count\",\n 69: \"2\",\n 70: \"hostname\",\n 76: \"success\",\n 79: \"prop\",\n 81: \"v\",\n 83: \"pkmsg\",\n 84: \"version\",\n 85: \"1\",\n 86: \"ping\",\n 87: \"w:p\",\n 90: \"set\",\n 92: \"props\",\n 95: \"hash\",\n 97: \"last\",\n 106: \"mode\",\n 107: \"participants\",\n 108: \"value\",\n 109: \"query\",\n 113: \"list\",\n 114: \"host\",\n 118: \"lid\",\n 121: \"usync\",\n 125: \"context\",\n 136: \"available\",\n 137: \"name\",\n 143: \"index\",\n 154: \"paused\",\n 155: \"true\",\n 156: \"identity\",\n 158: \"key\",\n 160: \"background\",\n 169: \"auth\",\n 173: \"registration\",\n 183: \"description\",\n 189: \"ttl\",\n 194: \"w:m\",\n 197: \"token\",\n 198: \"inactive\",\n 203: \"encrypt\",\n 212: \"signature\",\n 217: \"trusted_contact\",\n 226: \"privacy\",\n 230: \"device-identity\",\n};\n\nconst DOUBLE_BYTE_TOKENS: Readonly<Record<number, Readonly<Record<number, string>>>> = {\n 0: {\n 1: \"active\",\n 3: \"protocol\",\n 15: \"false\",\n 24: \"passive\",\n 45: \"skey\",\n 46: \"reason\",\n 68: \"tokens\",\n 127: \"subject\",\n 170: \"group\",\n 217: \"blocklist\",\n 238: \"s_t\",\n 239: \"abt\",\n },\n 1: {\n 51: \"w:g2\",\n 120: \"participating\",\n },\n};\n\nexport const S_WHATSAPP_NET = \"@s.whatsapp.net\";\n\nexport async function decodeBinaryNode(frame: Buffer): Promise<BinaryNode> {\n const buffer = await decompressIfRequired(frame);\n const indexRef = { index: 0 };\n const node = decodeDecompressedBinaryNode(buffer, indexRef, 1, {\n listItems: 0,\n nodes: 0,\n });\n if (indexRef.index !== buffer.length) {\n throw new Error(\"WhatsApp binary node frame contains trailing data.\");\n }\n return node;\n}\n\nexport function encodeBinaryNode(node: BinaryNode): Buffer {\n return Buffer.from(\n encodeBinaryNodeInner(node, [0], 1, {\n listItems: 0,\n nodes: 0,\n }),\n );\n}\n\nasync function decompressIfRequired(buffer: Buffer): Promise<Buffer> {\n if (buffer.length === 0) {\n throw new Error(\"Cannot decode an empty WhatsApp binary node.\");\n }\n const flag = buffer.readUInt8();\n if ((flag & 2) !== 0) {\n const compressed = buffer.subarray(1);\n if (compressed.length > WHATSAPP_BINARY_NODE_MAX_COMPRESSED_BYTES) {\n throw new Error(`Compressed WhatsApp binary node frame is too large: ${compressed.length}.`);\n }\n try {\n const inflated = await inflateWithInfo(compressed);\n if (inflated.engine.bytesWritten !== compressed.length) {\n throw new Error(\"Compressed WhatsApp binary node frame contains trailing data.\");\n }\n return inflated.buffer;\n } catch (error) {\n if (\n error instanceof RangeError ||\n (error instanceof Error && (error as NodeJS.ErrnoException).code === \"ERR_BUFFER_TOO_LARGE\")\n ) {\n throw new Error(\n `WhatsApp binary node expands beyond ${WHATSAPP_BINARY_NODE_MAX_DECOMPRESSED_BYTES} bytes.`,\n { cause: error },\n );\n }\n throw error;\n }\n }\n const payload = buffer.subarray(1);\n if (payload.length > WHATSAPP_BINARY_NODE_MAX_DECOMPRESSED_BYTES) {\n throw new Error(`WhatsApp binary node payload is too large: ${payload.length}.`);\n }\n return payload;\n}\n\nfunction decodeDecompressedBinaryNode(\n buffer: Buffer,\n indexRef: { index: number },\n depth: number,\n budget: BinaryNodeBudget,\n): BinaryNode {\n if (depth > WHATSAPP_BINARY_NODE_MAX_DEPTH) {\n throw new Error(`WhatsApp binary node nesting exceeds ${WHATSAPP_BINARY_NODE_MAX_DEPTH}.`);\n }\n budget.nodes += 1;\n if (budget.nodes > WHATSAPP_BINARY_NODE_MAX_NODES) {\n throw new Error(`WhatsApp binary node count exceeds ${WHATSAPP_BINARY_NODE_MAX_NODES}.`);\n }\n const checkEOS = (length: number) => {\n if (!Number.isSafeInteger(length) || length < 0 || length > buffer.length - indexRef.index) {\n throw new Error(\"Unexpected end of WhatsApp binary node.\");\n }\n };\n const next = () => {\n const value = buffer[indexRef.index];\n indexRef.index += 1;\n if (value === undefined) {\n throw new Error(\"Unexpected end of WhatsApp binary node.\");\n }\n return value;\n };\n const readByte = () => {\n checkEOS(1);\n return next();\n };\n const readBytes = (length: number) => {\n checkEOS(length);\n const value = buffer.subarray(indexRef.index, indexRef.index + length);\n indexRef.index += length;\n return value;\n };\n const readInt = (length: number, littleEndian = false) => {\n checkEOS(length);\n let value = 0;\n for (let index = 0; index < length; index += 1) {\n const byte = next();\n value = littleEndian ? value + byte * 256 ** index : value * 256 + byte;\n }\n return value;\n };\n const readInt20 = () => {\n checkEOS(3);\n return ((next() & 15) << 16) + (next() << 8) + next();\n };\n const readStringFromChars = (length: number) => readBytes(length).toString(\"utf8\");\n const unpackHex = (value: number) => {\n if (value >= 0 && value < 16) {\n return value < 10 ? \"0\".charCodeAt(0) + value : \"A\".charCodeAt(0) + value - 10;\n }\n throw new Error(`Invalid WhatsApp hex token: ${value}.`);\n };\n const unpackNibble = (value: number) => {\n if (value >= 0 && value <= 9) {\n return \"0\".charCodeAt(0) + value;\n }\n if (value === 10) {\n return \"-\".charCodeAt(0);\n }\n if (value === 11) {\n return \".\".charCodeAt(0);\n }\n if (value === 15) {\n return \"\\0\".charCodeAt(0);\n }\n throw new Error(`Invalid WhatsApp nibble token: ${value}.`);\n };\n const unpackByte = (tag: number, value: number) => {\n if (tag === TAGS.NIBBLE_8) {\n return unpackNibble(value);\n }\n if (tag === TAGS.HEX_8) {\n return unpackHex(value);\n }\n throw new Error(`Unknown WhatsApp packed string tag: ${tag}.`);\n };\n const readPacked8 = (tag: number) => {\n const startByte = readByte();\n let value = \"\";\n for (let index = 0; index < (startByte & 127); index += 1) {\n const current = readByte();\n value += String.fromCharCode(unpackByte(tag, (current & 0xf0) >> 4));\n value += String.fromCharCode(unpackByte(tag, current & 0x0f));\n }\n return startByte >> 7 !== 0 ? value.slice(0, -1) : value;\n };\n const readListSize = (tag: number) => {\n let size: number;\n if (tag === TAGS.LIST_EMPTY) {\n size = 0;\n } else if (tag === TAGS.LIST_8) {\n size = readByte();\n } else if (tag === TAGS.LIST_16) {\n size = readInt(2);\n } else {\n throw new Error(`Invalid WhatsApp list tag: ${tag}.`);\n }\n budget.listItems += size;\n if (budget.listItems > WHATSAPP_BINARY_NODE_MAX_LIST_ITEMS) {\n throw new Error(\n `WhatsApp binary node list items exceed ${WHATSAPP_BINARY_NODE_MAX_LIST_ITEMS}.`,\n );\n }\n return size;\n };\n const isListTag = (tag: number) =>\n tag === TAGS.LIST_EMPTY || tag === TAGS.LIST_8 || tag === TAGS.LIST_16;\n const readString = (tag: number): string => {\n const token = SINGLE_BYTE_TOKENS[tag];\n if (token !== undefined) {\n return token;\n }\n if (tag >= 1 && tag < 236) {\n throw new Error(`Unsupported WhatsApp single-byte token: ${tag}.`);\n }\n if (\n tag === TAGS.DICTIONARY_0 ||\n tag === TAGS.DICTIONARY_1 ||\n tag === TAGS.DICTIONARY_2 ||\n tag === TAGS.DICTIONARY_3\n ) {\n return readDoubleToken(tag - TAGS.DICTIONARY_0, readByte());\n }\n if (tag === TAGS.LIST_EMPTY) {\n return \"\";\n }\n if (tag === TAGS.BINARY_8) {\n return readStringFromChars(readByte());\n }\n if (tag === TAGS.BINARY_20) {\n return readStringFromChars(readInt20());\n }\n if (tag === TAGS.BINARY_32) {\n return readStringFromChars(readInt(4));\n }\n if (tag === TAGS.JID_PAIR) {\n return readJidPair();\n }\n if (tag === TAGS.FB_JID) {\n return readFbJid();\n }\n if (tag === TAGS.INTEROP_JID) {\n return readInteropJid();\n }\n if (tag === TAGS.AD_JID) {\n return readAdJid();\n }\n if (tag === TAGS.HEX_8 || tag === TAGS.NIBBLE_8) {\n return readPacked8(tag);\n }\n throw new Error(`Invalid WhatsApp string tag: ${tag}.`);\n };\n const readList = (tag: number) => {\n const items: BinaryNode[] = [];\n const size = readListSize(tag);\n for (let index = 0; index < size; index += 1) {\n items.push(decodeDecompressedBinaryNode(buffer, indexRef, depth + 1, budget));\n }\n return items;\n };\n const readJidPair = () => {\n const user = readString(readByte());\n const server = readString(readByte());\n if (!server) {\n throw new Error(`Invalid WhatsApp JID pair: ${user}, ${server}.`);\n }\n return `${user || \"\"}@${server}`;\n };\n const readAdJid = () => {\n const domainType = readByte();\n const device = readByte();\n const user = readString(readByte());\n const server =\n domainType === 1\n ? \"lid\"\n : domainType === 128\n ? \"hosted\"\n : domainType === 129\n ? \"hosted.lid\"\n : \"s.whatsapp.net\";\n return `${user}${device ? `:${device}` : \"\"}@${server}`;\n };\n const readFbJid = () => {\n const user = readString(readByte());\n const device = readInt(2);\n const server = readString(readByte());\n return `${user}:${device}@${server}`;\n };\n const readInteropJid = () => {\n const user = readString(readByte());\n const device = readInt(2);\n const integrator = readInt(2);\n let server: string;\n try {\n server = readString(readByte());\n } catch (error) {\n throw new Error(\"Invalid WhatsApp interop JID server.\", { cause: error });\n }\n if (server !== \"interop\") {\n throw new Error(`Invalid WhatsApp interop JID server: ${server}.`);\n }\n return `${integrator}-${user}:${device}@${server}`;\n };\n const readDoubleToken = (dictionary: number, index: number) => {\n const value = DOUBLE_BYTE_TOKENS[dictionary]?.[index];\n if (value === undefined) {\n throw new Error(`Unsupported WhatsApp dictionary token: ${dictionary}:${index}.`);\n }\n return value;\n };\n\n const listSize = readListSize(readByte());\n const tag = readString(readByte());\n if (listSize === 0 || !tag) {\n throw new Error(\"Invalid WhatsApp binary node header.\");\n }\n const attrs = Object.create(null) as Record<string, string>;\n for (let index = 0; index < (listSize - 1) >> 1; index += 1) {\n attrs[readString(readByte())] = readString(readByte());\n }\n let content: BinaryNode[\"content\"];\n if (listSize % 2 === 0) {\n const contentTag = readByte();\n if (isListTag(contentTag)) {\n content = readList(contentTag);\n } else if (contentTag === TAGS.BINARY_8) {\n content = readBytes(readByte());\n } else if (contentTag === TAGS.BINARY_20) {\n content = readBytes(readInt20());\n } else if (contentTag === TAGS.BINARY_32) {\n content = readBytes(readInt(4));\n } else {\n content = readString(contentTag);\n }\n }\n return content === undefined ? { attrs, tag } : { attrs, content, tag };\n}\n\nfunction encodeBinaryNodeInner(\n node: BinaryNode,\n buffer: number[],\n depth: number,\n budget: BinaryNodeBudget,\n): number[] {\n if (depth > WHATSAPP_BINARY_NODE_MAX_DEPTH) {\n throw new Error(`WhatsApp binary node nesting exceeds ${WHATSAPP_BINARY_NODE_MAX_DEPTH}.`);\n }\n budget.nodes += 1;\n if (budget.nodes > WHATSAPP_BINARY_NODE_MAX_NODES) {\n throw new Error(`WhatsApp binary node count exceeds ${WHATSAPP_BINARY_NODE_MAX_NODES}.`);\n }\n if (!node.tag) {\n throw new Error(\"Invalid WhatsApp binary node: tag is required.\");\n }\n const validAttributes = Object.keys(node.attrs ?? {}).filter((key) => {\n const value = node.attrs[key];\n return value !== undefined && value !== null;\n });\n writeBudgetedListStart(\n buffer,\n 2 * validAttributes.length + 1 + (node.content !== undefined ? 1 : 0),\n budget,\n );\n writeString(buffer, node.tag);\n for (const key of validAttributes) {\n writeString(buffer, key);\n writeString(buffer, node.attrs[key] ?? \"\");\n }\n if (typeof node.content === \"string\") {\n writeString(buffer, node.content);\n } else if (node.content instanceof Uint8Array) {\n writeByteLength(buffer, node.content.length);\n pushBytes(buffer, node.content);\n } else if (Array.isArray(node.content)) {\n writeBudgetedListStart(buffer, node.content.length, budget);\n for (const child of node.content) {\n encodeBinaryNodeInner(child, buffer, depth + 1, budget);\n }\n } else if (node.content !== undefined) {\n throw new Error(`Invalid WhatsApp binary node content for <${node.tag}>.`);\n }\n return buffer;\n}\n\nfunction writeBudgetedListStart(buffer: number[], size: number, budget: BinaryNodeBudget): void {\n budget.listItems += size;\n if (budget.listItems > WHATSAPP_BINARY_NODE_MAX_LIST_ITEMS) {\n throw new Error(\n `WhatsApp binary node list items exceed ${WHATSAPP_BINARY_NODE_MAX_LIST_ITEMS}.`,\n );\n }\n writeListStart(buffer, size);\n}\n\nfunction pushByte(buffer: number[], value: number): void {\n assertEncodedCapacity(buffer, 1);\n buffer.push(value & 0xff);\n}\n\nfunction pushBytes(buffer: number[], bytes: Uint8Array): void {\n assertEncodedCapacity(buffer, bytes.length);\n for (const byte of bytes) {\n buffer.push(byte & 0xff);\n }\n}\n\nfunction assertEncodedCapacity(buffer: number[], additionalBytes: number): void {\n if (buffer.length + additionalBytes > WHATSAPP_BINARY_NODE_MAX_FRAME_BYTES) {\n throw new Error(\n `WhatsApp binary node frame exceeds ${WHATSAPP_BINARY_NODE_MAX_FRAME_BYTES} bytes.`,\n );\n }\n}\n\nfunction pushInt(buffer: number[], value: number, length: number): void {\n for (let index = 0; index < length; index += 1) {\n const shift = length - 1 - index;\n pushByte(buffer, value >> (shift * 8));\n }\n}\n\nfunction writeByteLength(buffer: number[], length: number): void {\n if (length >= 4294967296) {\n throw new Error(`WhatsApp binary node payload is too large: ${length}.`);\n }\n if (length >= 1 << 20) {\n pushByte(buffer, TAGS.BINARY_32);\n pushInt(buffer, length, 4);\n return;\n }\n if (length >= 256) {\n pushByte(buffer, TAGS.BINARY_20);\n pushByte(buffer, (length >> 16) & 0x0f);\n pushByte(buffer, length >> 8);\n pushByte(buffer, length);\n return;\n }\n pushByte(buffer, TAGS.BINARY_8);\n pushByte(buffer, length);\n}\n\nfunction writeString(buffer: number[], value: string): void {\n const bytes = Buffer.from(value, \"utf8\");\n writeByteLength(buffer, bytes.length);\n pushBytes(buffer, bytes);\n}\n\nfunction writeListStart(buffer: number[], size: number): void {\n if (!Number.isSafeInteger(size) || size < 0 || size > 0xffff) {\n throw new Error(`WhatsApp binary node list is too large: ${size}.`);\n }\n if (size === 0) {\n pushByte(buffer, TAGS.LIST_EMPTY);\n return;\n }\n if (size < 256) {\n pushByte(buffer, TAGS.LIST_8);\n pushByte(buffer, size);\n return;\n }\n pushByte(buffer, TAGS.LIST_16);\n pushInt(buffer, size, 2);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../../src/servers/whatsapp.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport { randomBytes } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n adminAuthError,\n constantTimeTokenEqual,\n drainRequestBody,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n isLoopbackHost,\n jsonResponse,\n parseUnknownRequestBody,\n queryRecord,\n readTrimmedString,\n RequestBodyTooLargeError,\n startHttpJsonServer,\n type ServerRequestEvent,\n} from \"./http.js\";\nimport {\n recordServerEvent,\n ServerRecorderCommittedError,\n type ServerEventObserver,\n} from \"./recorder.js\";\nimport {\n attachWhatsAppBaileysWebSocketServer,\n resolveMaxPendingWhatsAppInboundMessages,\n type PreparedWhatsAppBaileysInboundDelivery,\n type WhatsAppBaileysInboundMessage,\n} from \"./whatsapp-baileys-websocket.js\";\nimport {\n canonicalizeWhatsAppChatJid,\n canonicalizeWhatsAppUserCorrelationJid,\n canonicalizeWhatsAppUserJid,\n isWhatsAppGroupJid,\n} from \"./whatsapp-jid.js\";\n\nconst WHATSAPP_CLOUD_RECIPIENT_RE = /^\\d{7,15}$/u;\nconst WHATSAPP_GRAPH_VERSION_RE = /^v\\d+\\.\\d+$/u;\nconst WHATSAPP_GENERATED_MESSAGE_ID_RE = /^wamid\\.FAKE(\\d{8,})$/u;\nconst DEFAULT_GRAPH_VERSION = \"v25.0\";\nconst MAX_WHATSAPP_READABLE_MESSAGE_IDS = 10_000;\nconst MAX_WHATSAPP_RECENT_MESSAGE_IDS = 10_000;\nconst MAX_WHATSAPP_MESSAGE_ID_BYTES = 128;\nconst MAX_WHATSAPP_TEXT_MESSAGE_CHARACTERS = 4_096;\n\nfunction createDefaultAccessToken(): string {\n return `EAA${randomBytes(24).toString(\"base64url\")}`;\n}\n\ntype WhatsAppServerState = {\n accessToken: string;\n adminToken: string;\n displayPhoneNumber: string;\n prepareInboundMessage(\n message: WhatsAppBaileysInboundMessage,\n ): PreparedWhatsAppBaileysInboundDelivery | undefined;\n graphVersion: string;\n inboundMessageIds: Set<string>;\n pendingMessageIds: Set<string>;\n recentMessageIds: Map<string, true>;\n nextMessageId: bigint;\n onEvent: ServerEventObserver | undefined;\n phoneNumberId: string;\n recorderPath: string;\n selfJid: string;\n};\n\nexport type WhatsAppBaileysMessage = WhatsAppBaileysInboundMessage;\n\nexport type WhatsAppServerManifest = {\n accessToken: string;\n adminToken: string;\n baseUrl: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n baileysWebSocketUrl: string;\n messagesUrl: string;\n phoneNumberUrl: string;\n statusUrl: string;\n };\n env: {\n CLOUD_API_ACCESS_TOKEN: string;\n CLOUD_API_VERSION: string;\n WA_BASE_URL: string;\n WA_PHONE_NUMBER_ID: string;\n };\n graphVersion: string;\n phoneNumberId: string;\n provider: \"whatsapp\";\n recorderPath: string;\n selfJid: string;\n version: 1;\n};\n\nexport type StartedWhatsAppServer = {\n close(): Promise<void>;\n manifest: WhatsAppServerManifest;\n};\n\nexport type StartWhatsAppServerParams = {\n accessToken?: string | undefined;\n adminToken?: string | undefined;\n displayPhoneNumber?: string | undefined;\n graphVersion?: string | undefined;\n host?: string | undefined;\n maxPendingInboundMessages?: number | undefined;\n messageAcceptanceTimeoutMs?: number | undefined;\n onEvent?: ServerEventObserver | undefined;\n phoneNumberId?: string | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n selfJid?: string | undefined;\n};\n\ntype WhatsAppAdminInboundResult = {\n message?: WhatsAppBaileysMessage | undefined;\n messageIdReservation?: WhatsAppMessageIdReservation | undefined;\n response?: Response | undefined;\n webhook?: Record<string, unknown> | undefined;\n};\n\ntype WhatsAppRecorderEvent = ServerRequestEvent & {\n accepted?: boolean | undefined;\n message?: WhatsAppBaileysMessage | undefined;\n};\n\nfunction whatsappOk(value: Record<string, unknown> = {}): Response {\n return jsonResponse({ ok: true, ...value });\n}\n\nfunction graphError(params: {\n code?: number | undefined;\n details?: string | undefined;\n message: string;\n status?: number | undefined;\n type?: string | undefined;\n}): Response {\n return jsonResponse(\n {\n error: {\n code: params.code ?? 100,\n ...(params.details\n ? {\n error_data: {\n details: params.details,\n messaging_product: \"whatsapp\",\n },\n }\n : {}),\n fbtrace_id: \"A1B2C3D4E5F\",\n message: params.message,\n type: params.type ?? \"OAuthException\",\n },\n },\n params.status ?? 400,\n );\n}\n\nfunction graphParameterError(message: string, details?: string): Response {\n return graphError({ code: 100, details, message, status: 400 });\n}\n\nfunction graphAuthError(): Response {\n return graphError({\n code: 190,\n message: \"Invalid OAuth access token.\",\n status: 401,\n });\n}\n\nasync function appendEvent(state: WhatsAppServerState, event: WhatsAppRecorderEvent) {\n await recordServerEvent({ event, onEvent: state.onEvent, recorderPath: state.recorderPath });\n}\n\nfunction requireWhatsAppChatJid(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n const canonical = stringValue ? canonicalizeWhatsAppChatJid(stringValue) : undefined;\n if (!canonical) {\n return graphParameterError(\n \"(#100) Invalid parameter: chatJid\",\n \"chatJid must be a WhatsApp user or group JID.\",\n );\n }\n return canonical;\n}\n\nfunction requireWhatsAppSenderJid(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n const canonical = stringValue ? canonicalizeWhatsAppUserJid(stringValue) : undefined;\n if (!canonical) {\n return graphParameterError(\n \"(#100) Invalid parameter: senderJid\",\n \"senderJid must be a WhatsApp user JID.\",\n );\n }\n return canonical;\n}\n\nfunction requireCloudRecipient(value: unknown): string | Response {\n const recipient = readTrimmedString(value);\n if (!recipient || !WHATSAPP_CLOUD_RECIPIENT_RE.test(recipient)) {\n return graphParameterError(\n \"(#100) Invalid parameter: to\",\n \"to must be a WhatsApp phone number in international format without punctuation.\",\n );\n }\n return recipient;\n}\n\nfunction requireAuth(request: IncomingMessage, state: WhatsAppServerState): boolean {\n const authorization = request.headers.authorization;\n if (typeof authorization !== \"string\") {\n return false;\n }\n const match = /^Bearer +(.+)$/iu.exec(authorization.trimStart());\n const providedToken = match?.[1];\n return providedToken ? constantTimeTokenEqual(providedToken, state.accessToken) : false;\n}\n\ntype WhatsAppMessageIdReservation = {\n cancel(): void;\n commit(): void;\n id: string;\n};\n\n/** @internal */\nexport function isWhatsAppMessageIdInUse(\n state: {\n inboundMessageIds: ReadonlySet<string>;\n pendingMessageIds: ReadonlySet<string>;\n recentMessageIds: ReadonlyMap<string, true>;\n },\n id: string,\n): boolean {\n return (\n state.inboundMessageIds.has(id) ||\n state.pendingMessageIds.has(id) ||\n state.recentMessageIds.has(id)\n );\n}\n\nfunction reserveMessageId(\n state: WhatsAppServerState,\n requestedId?: string,\n): WhatsAppMessageIdReservation | Response {\n let id = requestedId;\n if (id) {\n if (Buffer.byteLength(id, \"utf8\") > MAX_WHATSAPP_MESSAGE_ID_BYTES) {\n return graphParameterError(\n \"(#100) Invalid parameter: messageId\",\n `messageId must not exceed ${MAX_WHATSAPP_MESSAGE_ID_BYTES} UTF-8 bytes.`,\n );\n }\n if (isWhatsAppMessageIdInUse(state, id)) {\n return graphParameterError(\n \"(#100) Invalid parameter: messageId\",\n \"messageId must be unique within this WhatsApp server.\",\n );\n }\n } else {\n do {\n id = `wamid.FAKE${String(state.nextMessageId++).padStart(8, \"0\")}`;\n } while (isWhatsAppMessageIdInUse(state, id));\n }\n state.pendingMessageIds.add(id);\n let settled = false;\n return {\n cancel() {\n if (!settled) {\n settled = true;\n state.pendingMessageIds.delete(id);\n }\n },\n commit() {\n if (settled) {\n return;\n }\n settled = true;\n state.pendingMessageIds.delete(id);\n state.recentMessageIds.delete(id);\n state.recentMessageIds.set(id, true);\n if (state.recentMessageIds.size > MAX_WHATSAPP_RECENT_MESSAGE_IDS) {\n const oldestId = state.recentMessageIds.keys().next().value;\n if (oldestId !== undefined) {\n state.recentMessageIds.delete(oldestId);\n }\n }\n const generatedSequence = WHATSAPP_GENERATED_MESSAGE_ID_RE.exec(id)?.[1];\n if (generatedSequence) {\n const sequence = BigInt(generatedSequence);\n if (sequence >= state.nextMessageId) {\n state.nextMessageId = sequence + 1n;\n }\n }\n },\n id,\n };\n}\n\nfunction waIdFromJid(jid: string): string {\n const correlationJid = canonicalizeWhatsAppUserCorrelationJid(jid);\n return correlationJid?.split(\"@\", 1)[0] ?? jid;\n}\n\nfunction directPeerIdentity(jid: string): string {\n return canonicalizeWhatsAppUserCorrelationJid(jid) ?? jid;\n}\n\nfunction requireMessagingProduct(body: Record<string, unknown>): Response | undefined {\n const messagingProduct = readTrimmedString(body.messaging_product);\n if (messagingProduct !== \"whatsapp\") {\n return graphParameterError(\n \"(#100) Invalid parameter: messaging_product\",\n 'messaging_product must be \"whatsapp\".',\n );\n }\n return undefined;\n}\n\nfunction readTextMessageBody(body: Record<string, unknown>): string | Response {\n const type = readTrimmedString(body.type);\n if (!type) {\n return graphParameterError(\n \"(#100) Missing required parameter: type\",\n 'A WhatsApp text send requires type to be \"text\".',\n );\n }\n if (type !== \"text\") {\n return graphParameterError(\n \"(#100) Unsupported message type\",\n \"This test API currently supports WhatsApp text message sends.\",\n );\n }\n const textPayload = body.text;\n const text =\n textPayload && typeof textPayload === \"object\"\n ? readMessageText((textPayload as Record<string, unknown>).body)\n : undefined;\n if (text === undefined) {\n return graphParameterError(\n \"(#100) Missing required parameter: text.body\",\n \"A WhatsApp text send requires text.body.\",\n );\n }\n if ([...text].length > MAX_WHATSAPP_TEXT_MESSAGE_CHARACTERS) {\n return graphParameterError(\n \"(#100) Invalid parameter: text.body\",\n `text.body must not exceed ${MAX_WHATSAPP_TEXT_MESSAGE_CHARACTERS} characters.`,\n );\n }\n return text;\n}\n\nfunction createWhatsAppMessage(params: {\n fromMe: boolean;\n id: string;\n pushName?: string | undefined;\n remoteJid: string;\n senderJid?: string | undefined;\n text: string;\n}) {\n return {\n key: {\n fromMe: params.fromMe,\n id: params.id,\n ...(params.senderJid ? { participant: params.senderJid } : {}),\n remoteJid: params.remoteJid,\n },\n message: {\n conversation: params.text,\n },\n messageTimestamp: Math.floor(Date.now() / 1000),\n pushName: params.pushName ?? (params.fromMe ? \"Test Bot\" : \"Test User\"),\n };\n}\n\ntype PreparedWhatsAppSend = {\n commit(): Response;\n};\n\nfunction prepareSendMessage(params: {\n body: Record<string, unknown>;\n state: WhatsAppServerState;\n}): PreparedWhatsAppSend | Response {\n const productError = requireMessagingProduct(params.body);\n if (productError) {\n return productError;\n }\n const recipientType = readTrimmedString(params.body.recipient_type);\n if (recipientType && recipientType !== \"individual\") {\n return graphParameterError(\n \"(#100) Invalid parameter: recipient_type\",\n 'recipient_type must be \"individual\".',\n );\n }\n const to = requireCloudRecipient(params.body.to);\n if (to instanceof Response) {\n return to;\n }\n const text = readTextMessageBody(params.body);\n if (text instanceof Response) {\n return text;\n }\n return {\n commit() {\n const reservation = reserveMessageId(params.state);\n if (reservation instanceof Response) {\n return reservation;\n }\n reservation.commit();\n const message = createWhatsAppMessage({\n fromMe: true,\n id: reservation.id,\n remoteJid: `${to}@s.whatsapp.net`,\n text,\n });\n return jsonResponse({\n contacts: [\n {\n input: to,\n wa_id: to,\n },\n ],\n messages: [{ id: message.key.id }],\n messaging_product: \"whatsapp\",\n });\n },\n };\n}\n\nfunction handleMessageStatus(state: WhatsAppServerState, body: Record<string, unknown>): Response {\n const productError = requireMessagingProduct(body);\n if (productError) {\n return productError;\n }\n if (readTrimmedString(body.status) !== \"read\") {\n return graphParameterError(\n \"(#100) Invalid parameter: status\",\n 'status must be \"read\" for message status updates.',\n );\n }\n const messageId = readTrimmedString(body.message_id);\n if (!messageId) {\n return graphParameterError(\n \"(#100) Missing required parameter: message_id\",\n \"A message status update requires message_id.\",\n );\n }\n if (!state.inboundMessageIds.has(messageId)) {\n return graphParameterError(\n \"(#100) Invalid parameter: message_id\",\n \"message_id must reference an accepted inbound message.\",\n );\n }\n return jsonResponse({ success: true });\n}\n\nfunction rememberInboundMessageId(state: WhatsAppServerState, messageId: string): void {\n state.inboundMessageIds.delete(messageId);\n state.inboundMessageIds.add(messageId);\n if (state.inboundMessageIds.size > MAX_WHATSAPP_READABLE_MESSAGE_IDS) {\n const oldest = state.inboundMessageIds.values().next().value;\n if (oldest !== undefined) {\n state.inboundMessageIds.delete(oldest);\n }\n }\n}\n\nasync function handleAdminInbound(params: {\n body: Record<string, unknown>;\n state: WhatsAppServerState;\n}): Promise<WhatsAppAdminInboundResult> {\n const chatJid = requireWhatsAppChatJid(params.body.chatJid ?? params.body.chatId);\n if (chatJid instanceof Response) {\n return { response: chatJid };\n }\n const senderJid = requireWhatsAppSenderJid(params.body.senderJid ?? params.body.from);\n if (senderJid instanceof Response) {\n return { response: senderJid };\n }\n if (directPeerIdentity(senderJid) === directPeerIdentity(params.state.selfJid)) {\n return {\n response: graphParameterError(\n \"(#100) Invalid parameter: senderJid\",\n \"senderJid must not identify the configured WhatsApp self identity.\",\n ),\n };\n }\n const isGroupChat = isWhatsAppGroupJid(chatJid);\n if (!isGroupChat && directPeerIdentity(chatJid) !== directPeerIdentity(senderJid)) {\n return {\n response: graphParameterError(\n \"(#100) Invalid parameter: senderJid\",\n \"senderJid must identify the direct chat peer.\",\n ),\n };\n }\n const text = readMessageText(params.body.text);\n if (text === undefined) {\n return {\n response: graphParameterError(\n \"(#100) Missing required parameter: text\",\n \"An inbound WhatsApp event requires text.\",\n ),\n };\n }\n const messageIdReservation = reserveMessageId(\n params.state,\n readTrimmedString(params.body.messageId),\n );\n if (messageIdReservation instanceof Response) {\n return { response: messageIdReservation };\n }\n const message = createWhatsAppMessage({\n fromMe: false,\n id: messageIdReservation.id,\n pushName: readTrimmedString(params.body.pushName) ?? \"Test User\",\n remoteJid: isGroupChat ? chatJid : directPeerIdentity(chatJid),\n senderJid: isGroupChat ? senderJid : undefined,\n text,\n });\n const timestamp = String(message.messageTimestamp);\n const webhook = {\n entry: [\n {\n changes: [\n {\n field: \"messages\",\n value: {\n contacts: [\n {\n profile: { name: readTrimmedString(params.body.pushName) ?? \"Test User\" },\n wa_id: waIdFromJid(senderJid),\n },\n ],\n messages: [\n {\n from: waIdFromJid(senderJid),\n id: message.key.id,\n text: { body: text },\n timestamp,\n type: \"text\",\n },\n ],\n messaging_product: \"whatsapp\",\n metadata: {\n display_phone_number: params.state.displayPhoneNumber,\n phone_number_id: params.state.phoneNumberId,\n },\n },\n },\n ],\n id: \"TEST_WABA\",\n },\n ],\n object: \"whatsapp_business_account\",\n };\n return { message, messageIdReservation, webhook };\n}\n\nasync function handleRequest(params: { request: IncomingMessage; state: WhatsAppServerState }) {\n const url = new URL(params.request.url ?? \"/\", \"http://127.0.0.1\");\n\n if (url.pathname === \"/_crabline/admin/whatsapp/inbound\") {\n if (params.request.method !== \"POST\") {\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n }\n if (!hasAdminToken(params.request, params.state.adminToken)) {\n drainRequestBody(params.request);\n return adminAuthError();\n }\n const body = await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n return graphParameterError(\n \"(#100) Invalid parameter: request body\",\n \"The request body must be a JSON object.\",\n );\n }\n const result = await handleAdminInbound({ body, state: params.state });\n if (result.response) {\n return result.response;\n }\n const event: WhatsAppRecorderEvent = {\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: queryRecord(url),\n type: \"admin\",\n };\n const preparedDelivery = result.message\n ? params.state.prepareInboundMessage(result.message)\n : undefined;\n if (result.message && !preparedDelivery) {\n result.messageIdReservation?.cancel();\n return graphError({\n code: 4,\n details: \"The pending WhatsApp inbound queue is full.\",\n message: \"(#4) Application request limit reached.\",\n status: 503,\n type: \"OAuthException\",\n });\n }\n if (result.message) {\n event.message = result.message;\n }\n try {\n await appendEvent(params.state, event);\n } catch (error) {\n if (!(error instanceof ServerRecorderCommittedError)) {\n preparedDelivery?.cancel();\n result.messageIdReservation?.cancel();\n throw error;\n }\n result.messageIdReservation?.commit();\n if (result.message && preparedDelivery) {\n try {\n await preparedDelivery.commit();\n rememberInboundMessageId(params.state, result.message.key.id);\n } catch (deliveryError) {\n const reconciliationError = new AggregateError(\n [error, deliveryError],\n \"WhatsApp recorder append committed, but inbound delivery reconciliation failed.\",\n );\n reconciliationError.cause = deliveryError;\n throw reconciliationError;\n }\n }\n throw error;\n }\n if (result.message && preparedDelivery) {\n try {\n const delivery = await preparedDelivery.commit();\n result.messageIdReservation?.commit();\n rememberInboundMessageId(params.state, result.message.key.id);\n return whatsappOk({ delivery, message: result.message, webhook: result.webhook });\n } catch (error) {\n result.messageIdReservation?.cancel();\n throw error;\n }\n }\n result.messageIdReservation?.cancel();\n return graphParameterError(\"(#100) Invalid inbound WhatsApp event\");\n }\n\n const phoneNumberPath = `/${params.state.graphVersion}/${params.state.phoneNumberId}`;\n const messagesPath = `${phoneNumberPath}/messages`;\n if (!requireAuth(params.request, params.state)) {\n drainRequestBody(params.request);\n return graphAuthError();\n }\n if (url.pathname === phoneNumberPath && params.request.method === \"GET\") {\n const body = queryRecord(url);\n await appendEvent(params.state, {\n accepted: true,\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: body,\n type: \"api\",\n });\n return jsonResponse({\n display_phone_number: params.state.displayPhoneNumber,\n id: params.state.phoneNumberId,\n quality_rating: \"GREEN\",\n verified_name: \"Crabline Test Bot\",\n });\n }\n if (url.pathname === messagesPath) {\n if (params.request.method !== \"POST\") {\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n }\n const body = await parseUnknownRequestBody(params.request);\n const event: WhatsAppRecorderEvent = {\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: queryRecord(url),\n type: \"api\",\n };\n let response: Response;\n if (!isJsonObject(body)) {\n response = graphParameterError(\n \"(#100) Invalid parameter: request body\",\n \"The request body must be a JSON object.\",\n );\n } else if (\"status\" in body || \"message_id\" in body) {\n response = handleMessageStatus(params.state, body);\n event.accepted = response.ok;\n } else {\n const prepared = prepareSendMessage({ body, state: params.state });\n if (!(prepared instanceof Response)) {\n response = prepared.commit();\n event.accepted = true;\n await appendEvent(params.state, event);\n return response;\n }\n response = prepared;\n }\n event.accepted ??= false;\n await appendEvent(params.state, event);\n return response;\n }\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n}\n\nexport async function startWhatsAppServer(\n params: StartWhatsAppServerParams = {},\n): Promise<StartedWhatsAppServer> {\n const host = params.host ?? \"127.0.0.1\";\n if (!isLoopbackHost(host)) {\n throw new Error(\n \"WhatsApp server requires a loopback host because its HTTP and WebSocket endpoints carry credentials over cleartext.\",\n );\n }\n if (\n params.accessToken !== undefined &&\n (!params.accessToken.trim() || params.accessToken !== params.accessToken.trim())\n ) {\n throw new Error(\"WhatsApp accessToken must not be empty or whitespace-padded.\");\n }\n if (\n params.adminToken !== undefined &&\n (!params.adminToken.trim() || params.adminToken !== params.adminToken.trim())\n ) {\n throw new Error(\"WhatsApp adminToken must not be empty or whitespace-padded.\");\n }\n const graphVersion = params.graphVersion ?? DEFAULT_GRAPH_VERSION;\n if (!WHATSAPP_GRAPH_VERSION_RE.test(graphVersion)) {\n throw new Error(`Invalid WhatsApp Graph API version: ${graphVersion}.`);\n }\n const phoneNumberId = params.phoneNumberId ?? \"100000000000000\";\n if (!/^\\d+$/u.test(phoneNumberId)) {\n throw new Error(\"WhatsApp phoneNumberId must contain only digits.\");\n }\n const maxPendingInboundMessages = resolveMaxPendingWhatsAppInboundMessages(\n params.maxPendingInboundMessages,\n );\n const selfJid = canonicalizeWhatsAppUserJid(params.selfJid ?? \"15550000000@s.whatsapp.net\");\n if (!selfJid) {\n throw new Error(\"WhatsApp selfJid must be a WhatsApp user JID.\");\n }\n const state: WhatsAppServerState = {\n accessToken: params.accessToken ?? createDefaultAccessToken(),\n adminToken: params.adminToken ?? randomBytes(24).toString(\"hex\"),\n prepareInboundMessage: () => undefined,\n displayPhoneNumber: params.displayPhoneNumber ?? \"15550000000\",\n graphVersion,\n inboundMessageIds: new Set(),\n pendingMessageIds: new Set(),\n recentMessageIds: new Map(),\n nextMessageId: 1n,\n onEvent: params.onEvent,\n phoneNumberId,\n recorderPath: params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"whatsapp.jsonl\"),\n selfJid,\n };\n const httpServer = await startHttpJsonServer({\n handle: (request) => handleRequest({ request, state }),\n handleError: (error) => {\n if (error instanceof InvalidJsonBodyError) {\n return graphParameterError(\n \"(#100) Invalid parameter: request body\",\n \"The request body must be valid JSON.\",\n );\n }\n if (error instanceof RequestBodyTooLargeError) {\n return graphError({\n code: 100,\n details: \"The request body exceeds the supported size limit.\",\n message: \"(#100) Request body is too large.\",\n status: 413,\n });\n }\n return undefined;\n },\n host,\n port: params.port ?? 0,\n serverName: \"WhatsApp\",\n });\n const baseUrl = httpServer.baseUrl;\n const apiRoot = `${baseUrl}/${state.graphVersion}`;\n const phoneNumberUrl = `${apiRoot}/${state.phoneNumberId}`;\n const messagesUrl = `${phoneNumberUrl}/messages`;\n const baileysWebSocketUrl = `${baseUrl.replace(\n /^http/u,\n \"ws\",\n )}/ws/chat?access_token=${encodeURIComponent(state.accessToken)}`;\n const baileysWebSocketOptions = {\n accessToken: state.accessToken,\n appendEvent: (event: ServerRequestEvent) => appendEvent(state, event),\n httpServer: httpServer.server,\n maxPendingInboundMessages,\n messageAcceptanceTimeoutMs: params.messageAcceptanceTimeoutMs,\n path: \"/ws/chat\",\n selfJid: state.selfJid,\n };\n let baileysWebSocketServer;\n try {\n baileysWebSocketServer = attachWhatsAppBaileysWebSocketServer(baileysWebSocketOptions);\n } catch (error) {\n try {\n await httpServer.close();\n } catch (closeError) {\n const aggregateError = new AggregateError(\n [error, closeError],\n \"WhatsApp WebSocket startup failed and HTTP rollback also failed.\",\n );\n aggregateError.cause = error;\n throw aggregateError;\n }\n throw error;\n }\n state.prepareInboundMessage = (message) => baileysWebSocketServer.prepareInboundMessage(message);\n return {\n async close() {\n const results = await Promise.allSettled([\n baileysWebSocketServer.close(),\n httpServer.close(),\n ]);\n const errors = results.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (errors.length === 1) {\n throw errors[0];\n }\n if (errors.length > 1) {\n throw new AggregateError(errors, \"WhatsApp server shutdown failed.\");\n }\n },\n manifest: {\n accessToken: state.accessToken,\n adminToken: state.adminToken,\n baseUrl,\n endpoints: {\n adminInboundUrl: `${baseUrl}/_crabline/admin/whatsapp/inbound`,\n apiRoot,\n baileysWebSocketUrl,\n messagesUrl,\n phoneNumberUrl,\n statusUrl: messagesUrl,\n },\n env: {\n CLOUD_API_ACCESS_TOKEN: state.accessToken,\n CLOUD_API_VERSION: state.graphVersion,\n WA_BASE_URL: baseUrl,\n WA_PHONE_NUMBER_ID: state.phoneNumberId,\n },\n graphVersion: state.graphVersion,\n phoneNumberId: state.phoneNumberId,\n provider: \"whatsapp\",\n recorderPath: state.recorderPath,\n selfJid: state.selfJid,\n version: 1,\n },\n };\n}\n\nfunction readMessageText(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../../src/servers/whatsapp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,WAAW,EACX,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,GAEpB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,iBAAiB,EACjB,4BAA4B,GAE7B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,oCAAoC,EACpC,wCAAwC,GAGzC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,2BAA2B,EAC3B,sCAAsC,EACtC,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,2BAA2B,GAAG,aAAa,CAAC;AAClD,MAAM,yBAAyB,GAAG,cAAc,CAAC;AACjD,MAAM,gCAAgC,GAAG,wBAAwB,CAAC;AAClE,MAAM,qBAAqB,GAAG,OAAO,CAAC;AACtC,MAAM,iCAAiC,GAAG,MAAM,CAAC;AACjD,MAAM,+BAA+B,GAAG,MAAM,CAAC;AAC/C,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAC1C,MAAM,oCAAoC,GAAG,KAAK,CAAC;AAEnD,SAAS,wBAAwB;IAC/B,OAAO,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;AACvD,CAAC;AA+ED,SAAS,UAAU,CAAC,KAAK,GAA4B,EAAE;IACrD,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,UAAU,CAAC,MAMnB;IACC,OAAO,YAAY,CACjB;QACE,KAAK,EAAE;YACL,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG;YACxB,GAAG,CAAC,MAAM,CAAC,OAAO;gBAChB,CAAC,CAAC;oBACE,UAAU,EAAE;wBACV,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,iBAAiB,EAAE,UAAU;qBAC9B;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,UAAU,EAAE,aAAa;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,gBAAgB;SACtC;KACF,EACD,MAAM,CAAC,MAAM,IAAI,GAAG,CACrB,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe,EAAE,OAAgB;IAC5D,OAAO,UAAU,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,6BAA6B;QACtC,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAA0B,EAAE,KAA4B;IACjF,MAAM,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,mBAAmB,CACxB,mCAAmC,EACnC,+CAA+C,CAChD,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,mBAAmB,CACxB,qCAAqC,EACrC,wCAAwC,CACzC,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,SAAS,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/D,OAAO,mBAAmB,CACxB,8BAA8B,EAC9B,iFAAiF,CAClF,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,OAAwB,EAAE,KAA0B;IACvE,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;IACpD,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO,aAAa,CAAC,CAAC,CAAC,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1F,CAAC;AAQD,gBAAgB;AAChB,MAAM,UAAU,wBAAwB,CACtC,KAIC,EACD,EAAU;IAEV,OAAO,CACL,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,KAA0B,EAC1B,WAAoB;IAEpB,IAAI,EAAE,GAAG,WAAW,CAAC;IACrB,IAAI,EAAE,EAAE,CAAC;QACP,IAAI,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,6BAA6B,EAAE,CAAC;YAClE,OAAO,mBAAmB,CACxB,qCAAqC,EACrC,6BAA6B,6BAA6B,eAAe,CAC1E,CAAC;QACJ,CAAC;QACD,IAAI,wBAAwB,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YACxC,OAAO,mBAAmB,CACxB,qCAAqC,EACrC,uDAAuD,CACxD,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,GAAG,CAAC;YACF,EAAE,GAAG,aAAa,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACrE,CAAC,QAAQ,wBAAwB,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE;IAChD,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO;QACL,MAAM;YACJ,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,CAAC;gBACf,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,MAAM;YACJ,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAClC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,GAAG,+BAA+B,EAAE,CAAC;gBAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;gBAC5D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;YACD,MAAM,iBAAiB,GAAG,gCAAgC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;gBAC3C,IAAI,QAAQ,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;oBACpC,KAAK,CAAC,aAAa,GAAG,QAAQ,GAAG,EAAE,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QACD,EAAE;KACH,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,cAAc,GAAG,sCAAsC,CAAC,GAAG,CAAC,CAAC;IACnE,OAAO,cAAc,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AACjD,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,OAAO,sCAAsC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AAC5D,CAAC;AAED,SAAS,uBAAuB,CAAC,IAA6B;IAC5D,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnE,IAAI,gBAAgB,KAAK,UAAU,EAAE,CAAC;QACpC,OAAO,mBAAmB,CACxB,6CAA6C,EAC7C,uCAAuC,CACxC,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAA6B;IACxD,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,mBAAmB,CACxB,yCAAyC,EACzC,kDAAkD,CACnD,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,mBAAmB,CACxB,iCAAiC,EACjC,+DAA+D,CAChE,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;IAC9B,MAAM,IAAI,GACR,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ;QAC5C,CAAC,CAAC,eAAe,CAAE,WAAuC,CAAC,IAAI,CAAC;QAChE,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,mBAAmB,CACxB,8CAA8C,EAC9C,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,GAAG,oCAAoC,EAAE,CAAC;QAC5D,OAAO,mBAAmB,CACxB,qCAAqC,EACrC,6BAA6B,oCAAoC,cAAc,CAChF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB,CAAC,MAO9B;IACC,OAAO;QACL,GAAG,EAAE;YACH,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B;QACD,OAAO,EAAE;YACP,YAAY,EAAE,MAAM,CAAC,IAAI;SAC1B;QACD,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAC/C,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;KACxE,CAAC;AACJ,CAAC;AAMD,SAAS,kBAAkB,CAAC,MAG3B;IACC,MAAM,YAAY,GAAG,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,aAAa,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpE,IAAI,aAAa,IAAI,aAAa,KAAK,YAAY,EAAE,CAAC;QACpD,OAAO,mBAAmB,CACxB,0CAA0C,EAC1C,sCAAsC,CACvC,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,IAAI,EAAE,YAAY,QAAQ,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,IAAI,YAAY,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,MAAM;YACJ,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,WAAW,YAAY,QAAQ,EAAE,CAAC;gBACpC,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,WAAW,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,qBAAqB,CAAC;gBACpC,MAAM,EAAE,IAAI;gBACZ,EAAE,EAAE,WAAW,CAAC,EAAE;gBAClB,SAAS,EAAE,GAAG,EAAE,iBAAiB;gBACjC,IAAI;aACL,CAAC,CAAC;YACH,OAAO,YAAY,CAAC;gBAClB,QAAQ,EAAE;oBACR;wBACE,KAAK,EAAE,EAAE;wBACT,KAAK,EAAE,EAAE;qBACV;iBACF;gBACD,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBAClC,iBAAiB,EAAE,UAAU;aAC9B,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA0B,EAAE,IAA6B;IACpF,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;QAC9C,OAAO,mBAAmB,CACxB,kCAAkC,EAClC,mDAAmD,CACpD,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,mBAAmB,CACxB,+CAA+C,EAC/C,8CAA8C,CAC/C,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5C,OAAO,mBAAmB,CACxB,sCAAsC,EACtC,wDAAwD,CACzD,CAAC;IACJ,CAAC;IACD,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,wBAAwB,CAAC,KAA0B,EAAE,SAAiB;IAC7E,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1C,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,GAAG,iCAAiC,EAAE,CAAC;QACrE,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,MAGjC;IACC,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClF,IAAI,OAAO,YAAY,QAAQ,EAAE,CAAC;QAChC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IACD,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtF,IAAI,SAAS,YAAY,QAAQ,EAAE,CAAC;QAClC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACjC,CAAC;IACD,IAAI,kBAAkB,CAAC,SAAS,CAAC,KAAK,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/E,OAAO;YACL,QAAQ,EAAE,mBAAmB,CAC3B,qCAAqC,EACrC,oEAAoE,CACrE;SACF,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,WAAW,IAAI,kBAAkB,CAAC,OAAO,CAAC,KAAK,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;QAClF,OAAO;YACL,QAAQ,EAAE,mBAAmB,CAC3B,qCAAqC,EACrC,+CAA+C,CAChD;SACF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO;YACL,QAAQ,EAAE,mBAAmB,CAC3B,yCAAyC,EACzC,0CAA0C,CAC3C;SACF,CAAC;IACJ,CAAC;IACD,MAAM,oBAAoB,GAAG,gBAAgB,CAC3C,MAAM,CAAC,KAAK,EACZ,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CACzC,CAAC;IACF,IAAI,oBAAoB,YAAY,QAAQ,EAAE,CAAC;QAC7C,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC;IAC5C,CAAC;IACD,MAAM,OAAO,GAAG,qBAAqB,CAAC;QACpC,MAAM,EAAE,KAAK;QACb,EAAE,EAAE,oBAAoB,CAAC,EAAE;QAC3B,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,WAAW;QAChE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC;QAC9D,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC9C,IAAI;KACL,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG;QACd,KAAK,EAAE;YACL;gBACE,OAAO,EAAE;oBACP;wBACE,KAAK,EAAE,UAAU;wBACjB,KAAK,EAAE;4BACL,QAAQ,EAAE;gCACR;oCACE,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,WAAW,EAAE;oCACzE,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC;iCAC9B;6BACF;4BACD,QAAQ,EAAE;gCACR;oCACE,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC;oCAC5B,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;oCAClB,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;oCACpB,SAAS;oCACT,IAAI,EAAE,MAAM;iCACb;6BACF;4BACD,iBAAiB,EAAE,UAAU;4BAC7B,QAAQ,EAAE;gCACR,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB;gCACrD,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa;6BAC5C;yBACF;qBACF;iBACF;gBACD,EAAE,EAAE,WAAW;aAChB;SACF;QACD,MAAM,EAAE,2BAA2B;KACpC,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAgE;IAC3F,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAEnE,IAAI,GAAG,CAAC,QAAQ,KAAK,mCAAmC,EAAE,CAAC;QACzD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACrC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5D,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,OAAO,cAAc,EAAE,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,mBAAmB,CACxB,wCAAwC,EACxC,yCAAyC,CAC1C,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACvE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB,CAAC;QACD,MAAM,KAAK,GAA0B;YACnC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC7B,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC;YACvB,IAAI,EAAE,OAAO;SACd,CAAC;QACF,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO;YACrC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC;YACpD,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxC,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,CAAC;YACtC,OAAO,UAAU,CAAC;gBAChB,IAAI,EAAE,CAAC;gBACP,OAAO,EAAE,6CAA6C;gBACtD,OAAO,EAAE,yCAAyC;gBAClD,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,gBAAgB;aACvB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QACjC,CAAC;QACD,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,4BAA4B,CAAC,EAAE,CAAC;gBACrD,gBAAgB,EAAE,MAAM,EAAE,CAAC;gBAC3B,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,CAAC;gBACtC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,CAAC;YACtC,IAAI,MAAM,CAAC,OAAO,IAAI,gBAAgB,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACH,MAAM,gBAAgB,CAAC,MAAM,EAAE,CAAC;oBAChC,wBAAwB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChE,CAAC;gBAAC,OAAO,aAAa,EAAE,CAAC;oBACvB,MAAM,mBAAmB,GAAG,IAAI,cAAc,CAC5C,CAAC,KAAK,EAAE,aAAa,CAAC,EACtB,iFAAiF,CAClF,CAAC;oBACF,mBAAmB,CAAC,KAAK,GAAG,aAAa,CAAC;oBAC1C,MAAM,mBAAmB,CAAC;gBAC5B,CAAC;YACH,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,CAAC;gBACjD,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,CAAC;gBACtC,wBAAwB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC9D,OAAO,UAAU,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACpF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,CAAC;gBACtC,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,CAAC;QACtC,OAAO,mBAAmB,CAAC,uCAAuC,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IACtF,MAAM,YAAY,GAAG,GAAG,eAAe,WAAW,CAAC;IACnD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,cAAc,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QACxE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE;YAC9B,QAAQ,EAAE,IAAI;YACd,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC7B,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,OAAO,YAAY,CAAC;YAClB,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB;YACrD,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa;YAC9B,cAAc,EAAE,OAAO;YACvB,aAAa,EAAE,mBAAmB;SACnC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACrC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,KAAK,GAA0B;YACnC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC7B,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC;YACvB,IAAI,EAAE,KAAK;SACZ,CAAC;QACF,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,QAAQ,GAAG,mBAAmB,CAC5B,wCAAwC,EACxC,yCAAyC,CAC1C,CAAC;QACJ,CAAC;aAAM,IAAI,QAAQ,IAAI,IAAI,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;YACpD,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACnD,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,CAAC,QAAQ,YAAY,QAAQ,CAAC,EAAE,CAAC;gBACpC,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC7B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACtB,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACvC,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,QAAQ,GAAG,QAAQ,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC;QACzB,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAM,GAA8B,EAAE;IAEtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;IACxC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,qHAAqH,CACtH,CAAC;IACJ,CAAC;IACD,IACE,MAAM,CAAC,WAAW,KAAK,SAAS;QAChC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAChF,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,IACE,MAAM,CAAC,UAAU,KAAK,SAAS;QAC/B,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAC7E,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,qBAAqB,CAAC;IAClE,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,uCAAuC,YAAY,GAAG,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,iBAAiB,CAAC;IAChE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,yBAAyB,GAAG,wCAAwC,CACxE,MAAM,CAAC,yBAAyB,CACjC,CAAC;IACF,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,CAAC,OAAO,IAAI,4BAA4B,CAAC,CAAC;IAC5F,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,KAAK,GAAwB;QACjC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,wBAAwB,EAAE;QAC7D,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChE,qBAAqB,EAAE,GAAG,EAAE,CAAC,SAAS;QACtC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,aAAa;QAC9D,YAAY;QACZ,iBAAiB,EAAE,IAAI,GAAG,EAAE;QAC5B,iBAAiB,EAAE,IAAI,GAAG,EAAE;QAC5B,gBAAgB,EAAE,IAAI,GAAG,EAAE;QAC3B,aAAa,EAAE,EAAE;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa;QACb,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,gBAAgB,CAAC;QAC3F,OAAO;KACR,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC;QAC3C,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACtD,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;YACrB,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;gBAC1C,OAAO,mBAAmB,CACxB,wCAAwC,EACxC,sCAAsC,CACvC,CAAC;YACJ,CAAC;YACD,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,UAAU,CAAC;oBAChB,IAAI,EAAE,GAAG;oBACT,OAAO,EAAE,oDAAoD;oBAC7D,OAAO,EAAE,mCAAmC;oBAC5C,MAAM,EAAE,GAAG;iBACZ,CAAC,CAAC;YACL,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI;QACJ,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC;QACtB,UAAU,EAAE,UAAU;KACvB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;IACnC,MAAM,OAAO,GAAG,GAAG,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;IACnD,MAAM,cAAc,GAAG,GAAG,OAAO,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;IAC3D,MAAM,WAAW,GAAG,GAAG,cAAc,WAAW,CAAC;IACjD,MAAM,mBAAmB,GAAG,GAAG,OAAO,CAAC,OAAO,CAC5C,QAAQ,EACR,IAAI,CACL,yBAAyB,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;IAClE,MAAM,uBAAuB,GAAG;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,WAAW,EAAE,CAAC,KAAyB,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;QACrE,UAAU,EAAE,UAAU,CAAC,MAAM;QAC7B,yBAAyB;QACzB,0BAA0B,EAAE,MAAM,CAAC,0BAA0B;QAC7D,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;IACF,IAAI,sBAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,sBAAsB,GAAG,oCAAoC,CAAC,uBAAuB,CAAC,CAAC;IACzF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,MAAM,cAAc,GAAG,IAAI,cAAc,CACvC,CAAC,KAAK,EAAE,UAAU,CAAC,EACnB,kEAAkE,CACnE,CAAC;YACF,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;YAC7B,MAAM,cAAc,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,KAAK,CAAC,qBAAqB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACjG,OAAO;QACL,KAAK,CAAC,KAAK;YACT,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;gBACvC,sBAAsB,CAAC,KAAK,EAAE;gBAC9B,UAAU,CAAC,KAAK,EAAE;aACnB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CACxC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CACpD,CAAC;YACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO;YACP,SAAS,EAAE;gBACT,eAAe,EAAE,GAAG,OAAO,mCAAmC;gBAC9D,OAAO;gBACP,mBAAmB;gBACnB,WAAW;gBACX,cAAc;aACf;YACD,GAAG,EAAE;gBACH,sBAAsB,EAAE,KAAK,CAAC,WAAW;gBACzC,iBAAiB,EAAE,KAAK,CAAC,YAAY;gBACrC,WAAW,EAAE,OAAO;gBACpB,kBAAkB,EAAE,KAAK,CAAC,aAAa;aACxC;YACD,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,QAAQ,EAAE,UAAU;YACpB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,CAAC;SACX;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC","sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport { randomBytes } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n adminAuthError,\n constantTimeTokenEqual,\n drainRequestBody,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n isLoopbackHost,\n jsonResponse,\n parseUnknownRequestBody,\n queryRecord,\n readTrimmedString,\n RequestBodyTooLargeError,\n startHttpJsonServer,\n type ServerRequestEvent,\n} from \"./http.js\";\nimport {\n recordServerEvent,\n ServerRecorderCommittedError,\n type ServerEventObserver,\n} from \"./recorder.js\";\nimport {\n attachWhatsAppBaileysWebSocketServer,\n resolveMaxPendingWhatsAppInboundMessages,\n type PreparedWhatsAppBaileysInboundDelivery,\n type WhatsAppBaileysInboundMessage,\n} from \"./whatsapp-baileys-websocket.js\";\nimport {\n canonicalizeWhatsAppChatJid,\n canonicalizeWhatsAppUserCorrelationJid,\n canonicalizeWhatsAppUserJid,\n isWhatsAppGroupJid,\n} from \"./whatsapp-jid.js\";\n\nconst WHATSAPP_CLOUD_RECIPIENT_RE = /^\\d{7,15}$/u;\nconst WHATSAPP_GRAPH_VERSION_RE = /^v\\d+\\.\\d+$/u;\nconst WHATSAPP_GENERATED_MESSAGE_ID_RE = /^wamid\\.FAKE(\\d{8,})$/u;\nconst DEFAULT_GRAPH_VERSION = \"v25.0\";\nconst MAX_WHATSAPP_READABLE_MESSAGE_IDS = 10_000;\nconst MAX_WHATSAPP_RECENT_MESSAGE_IDS = 10_000;\nconst MAX_WHATSAPP_MESSAGE_ID_BYTES = 128;\nconst MAX_WHATSAPP_TEXT_MESSAGE_CHARACTERS = 4_096;\n\nfunction createDefaultAccessToken(): string {\n return `EAA${randomBytes(24).toString(\"base64url\")}`;\n}\n\ntype WhatsAppServerState = {\n accessToken: string;\n adminToken: string;\n displayPhoneNumber: string;\n prepareInboundMessage(\n message: WhatsAppBaileysInboundMessage,\n ): PreparedWhatsAppBaileysInboundDelivery | undefined;\n graphVersion: string;\n inboundMessageIds: Set<string>;\n pendingMessageIds: Set<string>;\n recentMessageIds: Map<string, true>;\n nextMessageId: bigint;\n onEvent: ServerEventObserver | undefined;\n phoneNumberId: string;\n recorderPath: string;\n selfJid: string;\n};\n\nexport type WhatsAppBaileysMessage = WhatsAppBaileysInboundMessage;\n\nexport type WhatsAppServerManifest = {\n accessToken: string;\n adminToken: string;\n baseUrl: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n baileysWebSocketUrl: string;\n messagesUrl: string;\n phoneNumberUrl: string;\n };\n env: {\n CLOUD_API_ACCESS_TOKEN: string;\n CLOUD_API_VERSION: string;\n WA_BASE_URL: string;\n WA_PHONE_NUMBER_ID: string;\n };\n graphVersion: string;\n phoneNumberId: string;\n provider: \"whatsapp\";\n recorderPath: string;\n selfJid: string;\n version: 1;\n};\n\nexport type StartedWhatsAppServer = {\n close(): Promise<void>;\n manifest: WhatsAppServerManifest;\n};\n\nexport type StartWhatsAppServerParams = {\n accessToken?: string | undefined;\n adminToken?: string | undefined;\n displayPhoneNumber?: string | undefined;\n graphVersion?: string | undefined;\n host?: string | undefined;\n maxPendingInboundMessages?: number | undefined;\n messageAcceptanceTimeoutMs?: number | undefined;\n onEvent?: ServerEventObserver | undefined;\n phoneNumberId?: string | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n selfJid?: string | undefined;\n};\n\ntype WhatsAppAdminInboundResult = {\n message?: WhatsAppBaileysMessage | undefined;\n messageIdReservation?: WhatsAppMessageIdReservation | undefined;\n response?: Response | undefined;\n webhook?: Record<string, unknown> | undefined;\n};\n\ntype WhatsAppRecorderEvent = ServerRequestEvent & {\n accepted?: boolean | undefined;\n message?: WhatsAppBaileysMessage | undefined;\n};\n\nfunction whatsappOk(value: Record<string, unknown> = {}): Response {\n return jsonResponse({ ok: true, ...value });\n}\n\nfunction graphError(params: {\n code?: number | undefined;\n details?: string | undefined;\n message: string;\n status?: number | undefined;\n type?: string | undefined;\n}): Response {\n return jsonResponse(\n {\n error: {\n code: params.code ?? 100,\n ...(params.details\n ? {\n error_data: {\n details: params.details,\n messaging_product: \"whatsapp\",\n },\n }\n : {}),\n fbtrace_id: \"A1B2C3D4E5F\",\n message: params.message,\n type: params.type ?? \"OAuthException\",\n },\n },\n params.status ?? 400,\n );\n}\n\nfunction graphParameterError(message: string, details?: string): Response {\n return graphError({ code: 100, details, message, status: 400 });\n}\n\nfunction graphAuthError(): Response {\n return graphError({\n code: 190,\n message: \"Invalid OAuth access token.\",\n status: 401,\n });\n}\n\nasync function appendEvent(state: WhatsAppServerState, event: WhatsAppRecorderEvent) {\n await recordServerEvent({ event, onEvent: state.onEvent, recorderPath: state.recorderPath });\n}\n\nfunction requireWhatsAppChatJid(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n const canonical = stringValue ? canonicalizeWhatsAppChatJid(stringValue) : undefined;\n if (!canonical) {\n return graphParameterError(\n \"(#100) Invalid parameter: chatJid\",\n \"chatJid must be a WhatsApp user or group JID.\",\n );\n }\n return canonical;\n}\n\nfunction requireWhatsAppSenderJid(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n const canonical = stringValue ? canonicalizeWhatsAppUserJid(stringValue) : undefined;\n if (!canonical) {\n return graphParameterError(\n \"(#100) Invalid parameter: senderJid\",\n \"senderJid must be a WhatsApp user JID.\",\n );\n }\n return canonical;\n}\n\nfunction requireCloudRecipient(value: unknown): string | Response {\n const recipient = readTrimmedString(value);\n if (!recipient || !WHATSAPP_CLOUD_RECIPIENT_RE.test(recipient)) {\n return graphParameterError(\n \"(#100) Invalid parameter: to\",\n \"to must be a WhatsApp phone number in international format without punctuation.\",\n );\n }\n return recipient;\n}\n\nfunction requireAuth(request: IncomingMessage, state: WhatsAppServerState): boolean {\n const authorization = request.headers.authorization;\n if (typeof authorization !== \"string\") {\n return false;\n }\n const match = /^Bearer +(.+)$/iu.exec(authorization.trimStart());\n const providedToken = match?.[1];\n return providedToken ? constantTimeTokenEqual(providedToken, state.accessToken) : false;\n}\n\ntype WhatsAppMessageIdReservation = {\n cancel(): void;\n commit(): void;\n id: string;\n};\n\n/** @internal */\nexport function isWhatsAppMessageIdInUse(\n state: {\n inboundMessageIds: ReadonlySet<string>;\n pendingMessageIds: ReadonlySet<string>;\n recentMessageIds: ReadonlyMap<string, true>;\n },\n id: string,\n): boolean {\n return (\n state.inboundMessageIds.has(id) ||\n state.pendingMessageIds.has(id) ||\n state.recentMessageIds.has(id)\n );\n}\n\nfunction reserveMessageId(\n state: WhatsAppServerState,\n requestedId?: string,\n): WhatsAppMessageIdReservation | Response {\n let id = requestedId;\n if (id) {\n if (Buffer.byteLength(id, \"utf8\") > MAX_WHATSAPP_MESSAGE_ID_BYTES) {\n return graphParameterError(\n \"(#100) Invalid parameter: messageId\",\n `messageId must not exceed ${MAX_WHATSAPP_MESSAGE_ID_BYTES} UTF-8 bytes.`,\n );\n }\n if (isWhatsAppMessageIdInUse(state, id)) {\n return graphParameterError(\n \"(#100) Invalid parameter: messageId\",\n \"messageId must be unique within this WhatsApp server.\",\n );\n }\n } else {\n do {\n id = `wamid.FAKE${String(state.nextMessageId++).padStart(8, \"0\")}`;\n } while (isWhatsAppMessageIdInUse(state, id));\n }\n state.pendingMessageIds.add(id);\n let settled = false;\n return {\n cancel() {\n if (!settled) {\n settled = true;\n state.pendingMessageIds.delete(id);\n }\n },\n commit() {\n if (settled) {\n return;\n }\n settled = true;\n state.pendingMessageIds.delete(id);\n state.recentMessageIds.delete(id);\n state.recentMessageIds.set(id, true);\n if (state.recentMessageIds.size > MAX_WHATSAPP_RECENT_MESSAGE_IDS) {\n const oldestId = state.recentMessageIds.keys().next().value;\n if (oldestId !== undefined) {\n state.recentMessageIds.delete(oldestId);\n }\n }\n const generatedSequence = WHATSAPP_GENERATED_MESSAGE_ID_RE.exec(id)?.[1];\n if (generatedSequence) {\n const sequence = BigInt(generatedSequence);\n if (sequence >= state.nextMessageId) {\n state.nextMessageId = sequence + 1n;\n }\n }\n },\n id,\n };\n}\n\nfunction waIdFromJid(jid: string): string {\n const correlationJid = canonicalizeWhatsAppUserCorrelationJid(jid);\n return correlationJid?.split(\"@\", 1)[0] ?? jid;\n}\n\nfunction directPeerIdentity(jid: string): string {\n return canonicalizeWhatsAppUserCorrelationJid(jid) ?? jid;\n}\n\nfunction requireMessagingProduct(body: Record<string, unknown>): Response | undefined {\n const messagingProduct = readTrimmedString(body.messaging_product);\n if (messagingProduct !== \"whatsapp\") {\n return graphParameterError(\n \"(#100) Invalid parameter: messaging_product\",\n 'messaging_product must be \"whatsapp\".',\n );\n }\n return undefined;\n}\n\nfunction readTextMessageBody(body: Record<string, unknown>): string | Response {\n const type = readTrimmedString(body.type);\n if (!type) {\n return graphParameterError(\n \"(#100) Missing required parameter: type\",\n 'A WhatsApp text send requires type to be \"text\".',\n );\n }\n if (type !== \"text\") {\n return graphParameterError(\n \"(#100) Unsupported message type\",\n \"This test API currently supports WhatsApp text message sends.\",\n );\n }\n const textPayload = body.text;\n const text =\n textPayload && typeof textPayload === \"object\"\n ? readMessageText((textPayload as Record<string, unknown>).body)\n : undefined;\n if (text === undefined) {\n return graphParameterError(\n \"(#100) Missing required parameter: text.body\",\n \"A WhatsApp text send requires text.body.\",\n );\n }\n if ([...text].length > MAX_WHATSAPP_TEXT_MESSAGE_CHARACTERS) {\n return graphParameterError(\n \"(#100) Invalid parameter: text.body\",\n `text.body must not exceed ${MAX_WHATSAPP_TEXT_MESSAGE_CHARACTERS} characters.`,\n );\n }\n return text;\n}\n\nfunction createWhatsAppMessage(params: {\n fromMe: boolean;\n id: string;\n pushName?: string | undefined;\n remoteJid: string;\n senderJid?: string | undefined;\n text: string;\n}) {\n return {\n key: {\n fromMe: params.fromMe,\n id: params.id,\n ...(params.senderJid ? { participant: params.senderJid } : {}),\n remoteJid: params.remoteJid,\n },\n message: {\n conversation: params.text,\n },\n messageTimestamp: Math.floor(Date.now() / 1000),\n pushName: params.pushName ?? (params.fromMe ? \"Test Bot\" : \"Test User\"),\n };\n}\n\ntype PreparedWhatsAppSend = {\n commit(): Response;\n};\n\nfunction prepareSendMessage(params: {\n body: Record<string, unknown>;\n state: WhatsAppServerState;\n}): PreparedWhatsAppSend | Response {\n const productError = requireMessagingProduct(params.body);\n if (productError) {\n return productError;\n }\n const recipientType = readTrimmedString(params.body.recipient_type);\n if (recipientType && recipientType !== \"individual\") {\n return graphParameterError(\n \"(#100) Invalid parameter: recipient_type\",\n 'recipient_type must be \"individual\".',\n );\n }\n const to = requireCloudRecipient(params.body.to);\n if (to instanceof Response) {\n return to;\n }\n const text = readTextMessageBody(params.body);\n if (text instanceof Response) {\n return text;\n }\n return {\n commit() {\n const reservation = reserveMessageId(params.state);\n if (reservation instanceof Response) {\n return reservation;\n }\n reservation.commit();\n const message = createWhatsAppMessage({\n fromMe: true,\n id: reservation.id,\n remoteJid: `${to}@s.whatsapp.net`,\n text,\n });\n return jsonResponse({\n contacts: [\n {\n input: to,\n wa_id: to,\n },\n ],\n messages: [{ id: message.key.id }],\n messaging_product: \"whatsapp\",\n });\n },\n };\n}\n\nfunction handleMessageStatus(state: WhatsAppServerState, body: Record<string, unknown>): Response {\n const productError = requireMessagingProduct(body);\n if (productError) {\n return productError;\n }\n if (readTrimmedString(body.status) !== \"read\") {\n return graphParameterError(\n \"(#100) Invalid parameter: status\",\n 'status must be \"read\" for message status updates.',\n );\n }\n const messageId = readTrimmedString(body.message_id);\n if (!messageId) {\n return graphParameterError(\n \"(#100) Missing required parameter: message_id\",\n \"A message status update requires message_id.\",\n );\n }\n if (!state.inboundMessageIds.has(messageId)) {\n return graphParameterError(\n \"(#100) Invalid parameter: message_id\",\n \"message_id must reference an accepted inbound message.\",\n );\n }\n return jsonResponse({ success: true });\n}\n\nfunction rememberInboundMessageId(state: WhatsAppServerState, messageId: string): void {\n state.inboundMessageIds.delete(messageId);\n state.inboundMessageIds.add(messageId);\n if (state.inboundMessageIds.size > MAX_WHATSAPP_READABLE_MESSAGE_IDS) {\n const oldest = state.inboundMessageIds.values().next().value;\n if (oldest !== undefined) {\n state.inboundMessageIds.delete(oldest);\n }\n }\n}\n\nasync function handleAdminInbound(params: {\n body: Record<string, unknown>;\n state: WhatsAppServerState;\n}): Promise<WhatsAppAdminInboundResult> {\n const chatJid = requireWhatsAppChatJid(params.body.chatJid ?? params.body.chatId);\n if (chatJid instanceof Response) {\n return { response: chatJid };\n }\n const senderJid = requireWhatsAppSenderJid(params.body.senderJid ?? params.body.from);\n if (senderJid instanceof Response) {\n return { response: senderJid };\n }\n if (directPeerIdentity(senderJid) === directPeerIdentity(params.state.selfJid)) {\n return {\n response: graphParameterError(\n \"(#100) Invalid parameter: senderJid\",\n \"senderJid must not identify the configured WhatsApp self identity.\",\n ),\n };\n }\n const isGroupChat = isWhatsAppGroupJid(chatJid);\n if (!isGroupChat && directPeerIdentity(chatJid) !== directPeerIdentity(senderJid)) {\n return {\n response: graphParameterError(\n \"(#100) Invalid parameter: senderJid\",\n \"senderJid must identify the direct chat peer.\",\n ),\n };\n }\n const text = readMessageText(params.body.text);\n if (text === undefined) {\n return {\n response: graphParameterError(\n \"(#100) Missing required parameter: text\",\n \"An inbound WhatsApp event requires text.\",\n ),\n };\n }\n const messageIdReservation = reserveMessageId(\n params.state,\n readTrimmedString(params.body.messageId),\n );\n if (messageIdReservation instanceof Response) {\n return { response: messageIdReservation };\n }\n const message = createWhatsAppMessage({\n fromMe: false,\n id: messageIdReservation.id,\n pushName: readTrimmedString(params.body.pushName) ?? \"Test User\",\n remoteJid: isGroupChat ? chatJid : directPeerIdentity(chatJid),\n senderJid: isGroupChat ? senderJid : undefined,\n text,\n });\n const timestamp = String(message.messageTimestamp);\n const webhook = {\n entry: [\n {\n changes: [\n {\n field: \"messages\",\n value: {\n contacts: [\n {\n profile: { name: readTrimmedString(params.body.pushName) ?? \"Test User\" },\n wa_id: waIdFromJid(senderJid),\n },\n ],\n messages: [\n {\n from: waIdFromJid(senderJid),\n id: message.key.id,\n text: { body: text },\n timestamp,\n type: \"text\",\n },\n ],\n messaging_product: \"whatsapp\",\n metadata: {\n display_phone_number: params.state.displayPhoneNumber,\n phone_number_id: params.state.phoneNumberId,\n },\n },\n },\n ],\n id: \"TEST_WABA\",\n },\n ],\n object: \"whatsapp_business_account\",\n };\n return { message, messageIdReservation, webhook };\n}\n\nasync function handleRequest(params: { request: IncomingMessage; state: WhatsAppServerState }) {\n const url = new URL(params.request.url ?? \"/\", \"http://127.0.0.1\");\n\n if (url.pathname === \"/_crabline/admin/whatsapp/inbound\") {\n if (params.request.method !== \"POST\") {\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n }\n if (!hasAdminToken(params.request, params.state.adminToken)) {\n drainRequestBody(params.request);\n return adminAuthError();\n }\n const body = await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n return graphParameterError(\n \"(#100) Invalid parameter: request body\",\n \"The request body must be a JSON object.\",\n );\n }\n const result = await handleAdminInbound({ body, state: params.state });\n if (result.response) {\n return result.response;\n }\n const event: WhatsAppRecorderEvent = {\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: queryRecord(url),\n type: \"admin\",\n };\n const preparedDelivery = result.message\n ? params.state.prepareInboundMessage(result.message)\n : undefined;\n if (result.message && !preparedDelivery) {\n result.messageIdReservation?.cancel();\n return graphError({\n code: 4,\n details: \"The pending WhatsApp inbound queue is full.\",\n message: \"(#4) Application request limit reached.\",\n status: 503,\n type: \"OAuthException\",\n });\n }\n if (result.message) {\n event.message = result.message;\n }\n try {\n await appendEvent(params.state, event);\n } catch (error) {\n if (!(error instanceof ServerRecorderCommittedError)) {\n preparedDelivery?.cancel();\n result.messageIdReservation?.cancel();\n throw error;\n }\n result.messageIdReservation?.commit();\n if (result.message && preparedDelivery) {\n try {\n await preparedDelivery.commit();\n rememberInboundMessageId(params.state, result.message.key.id);\n } catch (deliveryError) {\n const reconciliationError = new AggregateError(\n [error, deliveryError],\n \"WhatsApp recorder append committed, but inbound delivery reconciliation failed.\",\n );\n reconciliationError.cause = deliveryError;\n throw reconciliationError;\n }\n }\n throw error;\n }\n if (result.message && preparedDelivery) {\n try {\n const delivery = await preparedDelivery.commit();\n result.messageIdReservation?.commit();\n rememberInboundMessageId(params.state, result.message.key.id);\n return whatsappOk({ delivery, message: result.message, webhook: result.webhook });\n } catch (error) {\n result.messageIdReservation?.cancel();\n throw error;\n }\n }\n result.messageIdReservation?.cancel();\n return graphParameterError(\"(#100) Invalid inbound WhatsApp event\");\n }\n\n const phoneNumberPath = `/${params.state.graphVersion}/${params.state.phoneNumberId}`;\n const messagesPath = `${phoneNumberPath}/messages`;\n if (!requireAuth(params.request, params.state)) {\n drainRequestBody(params.request);\n return graphAuthError();\n }\n if (url.pathname === phoneNumberPath && params.request.method === \"GET\") {\n const body = queryRecord(url);\n await appendEvent(params.state, {\n accepted: true,\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: body,\n type: \"api\",\n });\n return jsonResponse({\n display_phone_number: params.state.displayPhoneNumber,\n id: params.state.phoneNumberId,\n quality_rating: \"GREEN\",\n verified_name: \"Crabline Test Bot\",\n });\n }\n if (url.pathname === messagesPath) {\n if (params.request.method !== \"POST\") {\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n }\n const body = await parseUnknownRequestBody(params.request);\n const event: WhatsAppRecorderEvent = {\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: queryRecord(url),\n type: \"api\",\n };\n let response: Response;\n if (!isJsonObject(body)) {\n response = graphParameterError(\n \"(#100) Invalid parameter: request body\",\n \"The request body must be a JSON object.\",\n );\n } else if (\"status\" in body || \"message_id\" in body) {\n response = handleMessageStatus(params.state, body);\n event.accepted = response.ok;\n } else {\n const prepared = prepareSendMessage({ body, state: params.state });\n if (!(prepared instanceof Response)) {\n response = prepared.commit();\n event.accepted = true;\n await appendEvent(params.state, event);\n return response;\n }\n response = prepared;\n }\n event.accepted ??= false;\n await appendEvent(params.state, event);\n return response;\n }\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n}\n\nexport async function startWhatsAppServer(\n params: StartWhatsAppServerParams = {},\n): Promise<StartedWhatsAppServer> {\n const host = params.host ?? \"127.0.0.1\";\n if (!isLoopbackHost(host)) {\n throw new Error(\n \"WhatsApp server requires a loopback host because its HTTP and WebSocket endpoints carry credentials over cleartext.\",\n );\n }\n if (\n params.accessToken !== undefined &&\n (!params.accessToken.trim() || params.accessToken !== params.accessToken.trim())\n ) {\n throw new Error(\"WhatsApp accessToken must not be empty or whitespace-padded.\");\n }\n if (\n params.adminToken !== undefined &&\n (!params.adminToken.trim() || params.adminToken !== params.adminToken.trim())\n ) {\n throw new Error(\"WhatsApp adminToken must not be empty or whitespace-padded.\");\n }\n const graphVersion = params.graphVersion ?? DEFAULT_GRAPH_VERSION;\n if (!WHATSAPP_GRAPH_VERSION_RE.test(graphVersion)) {\n throw new Error(`Invalid WhatsApp Graph API version: ${graphVersion}.`);\n }\n const phoneNumberId = params.phoneNumberId ?? \"100000000000000\";\n if (!/^\\d+$/u.test(phoneNumberId)) {\n throw new Error(\"WhatsApp phoneNumberId must contain only digits.\");\n }\n const maxPendingInboundMessages = resolveMaxPendingWhatsAppInboundMessages(\n params.maxPendingInboundMessages,\n );\n const selfJid = canonicalizeWhatsAppUserJid(params.selfJid ?? \"15550000000@s.whatsapp.net\");\n if (!selfJid) {\n throw new Error(\"WhatsApp selfJid must be a WhatsApp user JID.\");\n }\n const state: WhatsAppServerState = {\n accessToken: params.accessToken ?? createDefaultAccessToken(),\n adminToken: params.adminToken ?? randomBytes(24).toString(\"hex\"),\n prepareInboundMessage: () => undefined,\n displayPhoneNumber: params.displayPhoneNumber ?? \"15550000000\",\n graphVersion,\n inboundMessageIds: new Set(),\n pendingMessageIds: new Set(),\n recentMessageIds: new Map(),\n nextMessageId: 1n,\n onEvent: params.onEvent,\n phoneNumberId,\n recorderPath: params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"whatsapp.jsonl\"),\n selfJid,\n };\n const httpServer = await startHttpJsonServer({\n handle: (request) => handleRequest({ request, state }),\n handleError: (error) => {\n if (error instanceof InvalidJsonBodyError) {\n return graphParameterError(\n \"(#100) Invalid parameter: request body\",\n \"The request body must be valid JSON.\",\n );\n }\n if (error instanceof RequestBodyTooLargeError) {\n return graphError({\n code: 100,\n details: \"The request body exceeds the supported size limit.\",\n message: \"(#100) Request body is too large.\",\n status: 413,\n });\n }\n return undefined;\n },\n host,\n port: params.port ?? 0,\n serverName: \"WhatsApp\",\n });\n const baseUrl = httpServer.baseUrl;\n const apiRoot = `${baseUrl}/${state.graphVersion}`;\n const phoneNumberUrl = `${apiRoot}/${state.phoneNumberId}`;\n const messagesUrl = `${phoneNumberUrl}/messages`;\n const baileysWebSocketUrl = `${baseUrl.replace(\n /^http/u,\n \"ws\",\n )}/ws/chat?access_token=${encodeURIComponent(state.accessToken)}`;\n const baileysWebSocketOptions = {\n accessToken: state.accessToken,\n appendEvent: (event: ServerRequestEvent) => appendEvent(state, event),\n httpServer: httpServer.server,\n maxPendingInboundMessages,\n messageAcceptanceTimeoutMs: params.messageAcceptanceTimeoutMs,\n path: \"/ws/chat\",\n selfJid: state.selfJid,\n };\n let baileysWebSocketServer;\n try {\n baileysWebSocketServer = attachWhatsAppBaileysWebSocketServer(baileysWebSocketOptions);\n } catch (error) {\n try {\n await httpServer.close();\n } catch (closeError) {\n const aggregateError = new AggregateError(\n [error, closeError],\n \"WhatsApp WebSocket startup failed and HTTP rollback also failed.\",\n );\n aggregateError.cause = error;\n throw aggregateError;\n }\n throw error;\n }\n state.prepareInboundMessage = (message) => baileysWebSocketServer.prepareInboundMessage(message);\n return {\n async close() {\n const results = await Promise.allSettled([\n baileysWebSocketServer.close(),\n httpServer.close(),\n ]);\n const errors = results.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (errors.length === 1) {\n throw errors[0];\n }\n if (errors.length > 1) {\n throw new AggregateError(errors, \"WhatsApp server shutdown failed.\");\n }\n },\n manifest: {\n accessToken: state.accessToken,\n adminToken: state.adminToken,\n baseUrl,\n endpoints: {\n adminInboundUrl: `${baseUrl}/_crabline/admin/whatsapp/inbound`,\n apiRoot,\n baileysWebSocketUrl,\n messagesUrl,\n phoneNumberUrl,\n },\n env: {\n CLOUD_API_ACCESS_TOKEN: state.accessToken,\n CLOUD_API_VERSION: state.graphVersion,\n WA_BASE_URL: baseUrl,\n WA_PHONE_NUMBER_ID: state.phoneNumberId,\n },\n graphVersion: state.graphVersion,\n phoneNumberId: state.phoneNumberId,\n provider: \"whatsapp\",\n recorderPath: state.recorderPath,\n selfJid: state.selfJid,\n version: 1,\n },\n };\n}\n\nfunction readMessageText(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n"]}
|