@openclaw/crabline 0.1.17 → 0.1.19

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.
Files changed (33) hide show
  1. package/README.md +8 -0
  2. package/dist/src/openclaw/private-file.js +71 -24
  3. package/dist/src/openclaw/private-file.js.map +1 -1
  4. package/dist/src/platform/process-owned-lock.d.ts +5 -2
  5. package/dist/src/platform/process-owned-lock.js +20 -10
  6. package/dist/src/platform/process-owned-lock.js.map +1 -1
  7. package/dist/src/servers/discord.js +25 -35
  8. package/dist/src/servers/discord.js.map +1 -1
  9. package/dist/src/servers/http.d.ts +3 -0
  10. package/dist/src/servers/http.js +15 -0
  11. package/dist/src/servers/http.js.map +1 -1
  12. package/dist/src/servers/matrix.js +8 -8
  13. package/dist/src/servers/matrix.js.map +1 -1
  14. package/dist/src/servers/mattermost.js +7 -10
  15. package/dist/src/servers/mattermost.js.map +1 -1
  16. package/dist/src/servers/recorder.d.ts +16 -6
  17. package/dist/src/servers/recorder.js +52 -12
  18. package/dist/src/servers/recorder.js.map +1 -1
  19. package/dist/src/servers/signal.js +8 -8
  20. package/dist/src/servers/signal.js.map +1 -1
  21. package/dist/src/servers/slack.js +8 -8
  22. package/dist/src/servers/slack.js.map +1 -1
  23. package/dist/src/servers/telegram.d.ts +2 -2
  24. package/dist/src/servers/telegram.js +8 -8
  25. package/dist/src/servers/telegram.js.map +1 -1
  26. package/dist/src/servers/whatsapp-baileys-websocket.js +4 -3
  27. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  28. package/dist/src/servers/whatsapp.js +13 -18
  29. package/dist/src/servers/whatsapp.js.map +1 -1
  30. package/dist/src/servers/zalo.js +8 -7
  31. package/dist/src/servers/zalo.js.map +1 -1
  32. package/docs/channel-setup.md +14 -1
  33. package/package.json +11 -11
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../src/servers/telegram.ts"],"names":[],"mappings":"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","sourcesContent":["import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { Buffer } from \"node:buffer\";\nimport path from \"node:path\";\nimport { CrablineError } from \"../core/errors.js\";\nimport {\n adminAuthError,\n closeServer,\n drainRequestBody,\n formatUrlHost,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n isJsonMediaType,\n isLoopbackHost,\n jsonResponse,\n queryRecord,\n readBody,\n RequestBodyTooLargeError,\n writeResponse,\n} from \"./http.js\";\nimport { recordServerEvent, type ServerEventObserver } from \"./recorder.js\";\nimport { resolveMaxPendingInboundEvents } from \"./pending-events.js\";\nimport {\n postWebhookRequest,\n validateWebhookTarget,\n type WebhookAddress,\n} from \"./webhook-target.js\";\nimport {\n canonicalizeTelegramUsername,\n isTelegramUsernameChatId,\n TELEGRAM_BOT_USERNAME_PATTERN,\n TELEGRAM_NATIVE_CHAT_ID_MAX,\n telegramUsernameChatId,\n} from \"./telegram-identity.js\";\n\nconst TELEGRAM_MAX_REQUEST_BODY_BYTES = 50 * 1024 * 1024;\nconst TELEGRAM_MAX_MULTIPART_HEADER_BYTES = 16 * 1024;\nconst TELEGRAM_MAX_MULTIPART_PARTS = 128;\nconst TELEGRAM_MAX_MULTIPART_TEXT_BYTES = 1024 * 1024;\nconst TELEGRAM_WEBHOOK_MAX_BACKOFF_EXPONENT = 5;\nconst TELEGRAM_WEBHOOK_RETRY_BASE_MS = 100;\nconst TELEGRAM_WEBHOOK_DELIVERY_TIMEOUT_MS = 3_000;\nconst MAX_ACTIVE_TELEGRAM_WEBHOOK_VALIDATIONS = 8;\nconst TELEGRAM_WEBHOOK_SECRET_PATTERN = /^[A-Za-z0-9_-]{1,256}(?![\\s\\S])/u;\nconst TELEGRAM_MAX_TEXT_LENGTH = 4096;\nconst TELEGRAM_MAX_CAPTION_LENGTH = 1024;\nconst TELEGRAM_HTML_TAG_PATTERN =\n /<\\/?(?:a|b|blockquote|code|del|em|i|ins|pre|s|span|strike|strong|tg-emoji|tg-spoiler|tg-time|u)(?:\\s+[^<>]*)?>/giu;\nconst TELEGRAM_HTML_ENTITY_PATTERN = /&(?:#\\d+|#x[\\da-f]+|amp|gt|lt|quot);/giu;\nconst TELEGRAM_SEND_METHODS = new Set([\n \"sendanimation\",\n \"sendaudio\",\n \"senddocument\",\n \"sendmessage\",\n \"sendphoto\",\n \"sendvideo\",\n]);\nconst TELEGRAM_MEDIA_FIELDS = [\n \"animation\",\n \"audio\",\n \"document\",\n \"paid_media\",\n \"photo\",\n \"sticker\",\n \"story\",\n \"video\",\n \"video_note\",\n \"voice\",\n] as const;\nconst TELEGRAM_UNSUPPORTED_UPDATE_FIELDS = [\n \"business_connection\",\n \"business_message\",\n \"callback_query\",\n \"channel_post\",\n \"chat_boost\",\n \"chat_join_request\",\n \"chat_member\",\n \"chosen_inline_result\",\n \"deleted_business_messages\",\n \"edited_business_message\",\n \"edited_channel_post\",\n \"edited_message\",\n \"guest_message\",\n \"inline_query\",\n \"managed_bot\",\n \"message_reaction\",\n \"message_reaction_count\",\n \"my_chat_member\",\n \"poll\",\n \"poll_answer\",\n \"pre_checkout_query\",\n \"purchased_paid_media\",\n \"removed_chat_boost\",\n \"shipping_query\",\n] as const;\nconst TELEGRAM_NEW_MESSAGE_UPDATE_FIELDS = [\"business_message\", \"channel_post\", \"message\"] as const;\nconst TELEGRAM_MESSAGE_REFERENCE_FIELDS = [\n \"edited_business_message\",\n \"edited_channel_post\",\n \"edited_message\",\n] as const;\nconst TELEGRAM_MESSAGE_UPDATE_FIELDS = [\n ...TELEGRAM_NEW_MESSAGE_UPDATE_FIELDS,\n ...TELEGRAM_MESSAGE_REFERENCE_FIELDS,\n] as const;\nconst TELEGRAM_CHAT_UPDATE_FIELDS = [\n \"chat_boost\",\n \"chat_join_request\",\n \"chat_member\",\n \"deleted_business_messages\",\n \"message_reaction\",\n \"message_reaction_count\",\n \"my_chat_member\",\n \"removed_chat_boost\",\n] as const;\n\ntype TelegramServerEvent = {\n accepted?: boolean | undefined;\n at: string;\n body?: unknown;\n method: string;\n path: string;\n query: Record<string, string>;\n type: \"admin\" | \"api\";\n};\n\ntype TelegramWebhook = {\n lastErrorDate?: number;\n lastErrorMessage?: string;\n secretToken?: string;\n url: string;\n};\n\ntype TelegramServerState = {\n activeUpdatePoll: TelegramUpdatePoll | undefined;\n activeWebhookDeliveries: Set<AbortController>;\n activeWebhookValidations: Set<AbortController>;\n adminToken: string;\n allowLoopbackHttpWebhook: boolean;\n botHasTopicsEnabled: boolean;\n botId: number;\n botToken: string;\n botUsername: string;\n chatsById: Map<number, TelegramChat>;\n chatsByUsername: Map<string, TelegramChat>;\n closing: boolean;\n inboundAdmission: Promise<void>;\n maxPendingInboundEvents: number;\n nextMessageIds: Map<string, number>;\n nextUpdateId: number;\n onEvent: ServerEventObserver | undefined;\n recorderPath: string;\n restrictWebhookTargets: boolean;\n updates: TelegramUpdate[];\n webhook: TelegramWebhook | undefined;\n webhookAdmission: Promise<void>;\n webhookDelivery: Promise<Response | undefined> | undefined;\n webhookRetryAttempts: number;\n webhookRetryTimer: NodeJS.Timeout | undefined;\n webhookRetryUpdateId: number | undefined;\n};\n\ntype TelegramUpdatePoll = {\n finish(result: TelegramUpdatePollResult): void;\n};\n\ntype TelegramUpdatePollResult = \"conflict\" | \"shutdown\" | \"timeout\" | \"update\";\n\ntype TelegramGetUpdatesState = Pick<\n TelegramServerState,\n \"activeUpdatePoll\" | \"closing\" | \"updates\"\n>;\n\nconst TELEGRAM_MULTIPART_FILE = Symbol(\"telegramMultipartFile\");\n\ntype TelegramMultipartFile = {\n [TELEGRAM_MULTIPART_FILE]: true;\n contentDigest: string;\n fileName: string;\n};\n\ntype TelegramMultipartDisposition = {\n fileName?: string | undefined;\n name: string;\n};\n\ntype TelegramMimeParameter = {\n quoted: boolean;\n value: string;\n};\n\ntype TelegramChat = {\n id: number;\n is_forum?: true;\n title?: string;\n type: \"channel\" | \"group\" | \"private\" | \"supergroup\";\n username?: string;\n};\n\ntype TelegramMessage = {\n chat: TelegramChat;\n animation?: {\n duration: number;\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n height: number;\n mime_type?: string;\n width: number;\n };\n caption?: string;\n date: number;\n document?: {\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n mime_type?: string;\n };\n audio?: {\n duration: number;\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n mime_type?: string;\n };\n entities?: Array<{\n custom_emoji_id?: string;\n language?: string;\n length: number;\n offset: number;\n type: string;\n url?: string;\n user?: Record<string, unknown>;\n }>;\n from: {\n first_name: string;\n id: number;\n is_bot: boolean;\n username?: string;\n };\n message_id: number;\n message_thread_id?: number;\n photo?: Array<{\n file_id: string;\n file_unique_id: string;\n height: number;\n width: number;\n }>;\n text?: string;\n video?: {\n duration: number;\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n height: number;\n mime_type?: string;\n width: number;\n };\n};\n\ntype TelegramUpdate = {\n message: TelegramMessage;\n update_id: number;\n};\n\nexport type TelegramServerManifest = {\n adminToken: string;\n baseUrl: string;\n botToken: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n };\n env: {\n TELEGRAM_BOT_TOKEN: string;\n };\n provider: \"telegram\";\n recorderPath: string;\n version: 1;\n};\n\nexport type StartedTelegramServer = {\n close(): Promise<void>;\n manifest: TelegramServerManifest;\n};\n\nexport type StartTelegramServerParams = {\n adminToken?: string | undefined;\n botHasTopicsEnabled?: boolean | undefined;\n botId?: number | undefined;\n botToken?: string | undefined;\n botUsername?: string | undefined;\n host?: string | undefined;\n onEvent?: ServerEventObserver | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n maxPendingInboundEvents?: number | undefined;\n};\n\nfunction telegramOk(result: unknown): Response {\n return jsonResponse({ ok: true, result });\n}\n\nfunction telegramError(description: string, status = 400): Response {\n return jsonResponse({ description, error_code: status, ok: false }, status);\n}\n\nasync function parseRequestBody(request: IncomingMessage): Promise<unknown> {\n const contentType = request.headers[\"content-type\"] ?? \"\";\n const contentTypes = Array.isArray(contentType) ? contentType : [contentType];\n const multipartType = contentTypes.find((entry) =>\n entry.toLowerCase().includes(\"multipart/form-data\"),\n );\n if (multipartType) {\n return await parseMultipartFormDataRequest(request, multipartType);\n }\n\n const body = await readBody(request, TELEGRAM_MAX_REQUEST_BODY_BYTES);\n if (body.length === 0) {\n return {};\n }\n if (contentTypes.some(isJsonMediaType)) {\n try {\n return JSON.parse(body.toString(\"utf8\")) as unknown;\n } catch (error) {\n throw new InvalidJsonBodyError(error);\n }\n }\n const params = new URLSearchParams(body.toString(\"utf8\"));\n return Object.fromEntries(params.entries());\n}\n\nfunction invalidTelegramMultipartBody(message: string): InvalidJsonBodyError {\n return new InvalidJsonBodyError(new Error(message));\n}\n\nfunction parseTelegramMimeParameters(\n value: string,\n options: { decodeQuotedPairs?: boolean } = {},\n): {\n parameters: Map<string, TelegramMimeParameter>;\n type: string;\n} {\n const separator = value.indexOf(\";\");\n const type = value\n .slice(0, separator < 0 ? value.length : separator)\n .trim()\n .toLowerCase();\n const parameters = new Map<string, TelegramMimeParameter>();\n let index = separator < 0 ? value.length : separator + 1;\n while (index < value.length) {\n while (index < value.length && /[\\t ;]/u.test(value[index] ?? \"\")) {\n index += 1;\n }\n if (index >= value.length) {\n break;\n }\n\n const nameStart = index;\n while (index < value.length && /[!#$%&'*+\\-.^_`|~0-9A-Za-z]/u.test(value[index] ?? \"\")) {\n index += 1;\n }\n const name = value.slice(nameStart, index).toLowerCase();\n while (index < value.length && /[\\t ]/u.test(value[index] ?? \"\")) {\n index += 1;\n }\n if (!name || value[index] !== \"=\") {\n throw invalidTelegramMultipartBody(\"Multipart header contains a malformed parameter.\");\n }\n index += 1;\n while (index < value.length && /[\\t ]/u.test(value[index] ?? \"\")) {\n index += 1;\n }\n\n let parameterValue = \"\";\n let quoted = false;\n if (value[index] === '\"') {\n quoted = true;\n index += 1;\n let closed = false;\n while (index < value.length) {\n const character = value[index];\n index += 1;\n if (character === \"\\\\\" && options.decodeQuotedPairs) {\n if (index >= value.length) {\n break;\n }\n const quotedCharacter = value[index];\n if (quotedCharacter === \"\\r\" || quotedCharacter === \"\\n\") {\n break;\n }\n parameterValue += quotedCharacter;\n index += 1;\n } else if (character === '\"') {\n closed = true;\n break;\n } else if (character === \"\\r\" || character === \"\\n\") {\n break;\n } else {\n parameterValue += character;\n }\n }\n if (!closed) {\n throw invalidTelegramMultipartBody(\"Multipart header contains an unterminated quote.\");\n }\n while (index < value.length && /[\\t ]/u.test(value[index] ?? \"\")) {\n index += 1;\n }\n if (index < value.length && value[index] !== \";\") {\n throw invalidTelegramMultipartBody(\"Multipart header contains trailing parameter data.\");\n }\n } else {\n const parameterStart = index;\n while (index < value.length && value[index] !== \";\") {\n if (value[index] === \"\\r\" || value[index] === \"\\n\") {\n throw invalidTelegramMultipartBody(\"Multipart header contains a line break.\");\n }\n index += 1;\n }\n parameterValue = value.slice(parameterStart, index).trim();\n }\n parameters.set(name, { quoted, value: parameterValue });\n if (value[index] === \";\") {\n index += 1;\n }\n }\n return { parameters, type };\n}\n\nfunction parseTelegramMultipartBoundary(contentType: string): Buffer {\n const parsed = parseTelegramMimeParameters(contentType, { decodeQuotedPairs: true });\n const boundary = parsed.parameters.get(\"boundary\")?.value;\n if (\n parsed.type !== \"multipart/form-data\" ||\n !boundary ||\n boundary.length > 70 ||\n boundary.endsWith(\" \") ||\n !/^[0-9A-Za-z'()+_,./:=? -]+$/u.test(boundary)\n ) {\n throw invalidTelegramMultipartBody(\"Multipart boundary is missing or invalid.\");\n }\n return Buffer.from(`--${boundary}`, \"ascii\");\n}\n\nfunction decodeTelegramMultipartParameter(parameter: TelegramMimeParameter): string {\n return parameter.quoted\n ? parameter.value.replace(/%0A/giu, \"\\n\").replace(/%0D/giu, \"\\r\").replace(/%22/giu, '\"')\n : parameter.value;\n}\n\nfunction decodeTelegramMultipartExtendedParameter(parameter: TelegramMimeParameter): string {\n const extended = /^([^']*)'[^']*'(.*)$/u.exec(parameter.value);\n if (!extended) {\n return decodeTelegramMultipartParameter(parameter);\n }\n const charset = extended[1]?.toLowerCase();\n if (charset !== \"utf-8\" && charset !== \"us-ascii\") {\n return decodeTelegramMultipartParameter(parameter);\n }\n try {\n return decodeURIComponent(extended[2] ?? \"\");\n } catch {\n return extended[2] ?? \"\";\n }\n}\n\nfunction parseTelegramMultipartDisposition(headerBlock: Buffer): TelegramMultipartDisposition {\n let contentDisposition: string | undefined;\n for (const line of headerBlock.toString(\"utf8\").split(\"\\r\\n\")) {\n const separator = line.indexOf(\":\");\n if (separator <= 0) {\n throw invalidTelegramMultipartBody(\"Multipart part contains a malformed header.\");\n }\n if (line.slice(0, separator).trim().toLowerCase() === \"content-disposition\") {\n contentDisposition = line.slice(separator + 1).trim();\n }\n }\n if (!contentDisposition) {\n throw invalidTelegramMultipartBody(\"Multipart part is missing a form-data disposition.\");\n }\n\n const parsed = parseTelegramMimeParameters(contentDisposition, { decodeQuotedPairs: true });\n if (parsed.type !== \"form-data\") {\n throw invalidTelegramMultipartBody(\"Multipart part is missing a form-data disposition.\");\n }\n const rawName = parsed.parameters.get(\"name\");\n if (rawName === undefined) {\n throw invalidTelegramMultipartBody(\"Multipart part is missing a field name.\");\n }\n const rawFileName = parsed.parameters.get(\"filename\");\n const rawExtendedFileName = parsed.parameters.get(\"filename*\");\n return {\n ...(rawExtendedFileName !== undefined\n ? { fileName: decodeTelegramMultipartExtendedParameter(rawExtendedFileName) }\n : rawFileName !== undefined\n ? { fileName: decodeTelegramMultipartParameter(rawFileName) }\n : {}),\n name: decodeTelegramMultipartParameter(rawName),\n };\n}\n\nclass TelegramMultipartReader {\n readonly #iterator: AsyncIterator<Buffer | string>;\n #buffer: Buffer<ArrayBufferLike> = Buffer.alloc(0);\n #ended = false;\n #totalBytes = 0;\n\n constructor(\n private readonly request: IncomingMessage,\n private readonly maxBytes: number,\n ) {\n this.#iterator = request[Symbol.asyncIterator]() as AsyncIterator<Buffer | string>;\n }\n\n async readUntil(delimiter: Buffer, maxBytes: number): Promise<Buffer> {\n const chunks: Buffer[] = [];\n let length = 0;\n while (true) {\n const delimiterIndex = this.#buffer.indexOf(delimiter);\n if (delimiterIndex >= 0) {\n length += delimiterIndex;\n if (length > maxBytes) {\n throw new RequestBodyTooLargeError(maxBytes);\n }\n chunks.push(this.#buffer.subarray(0, delimiterIndex));\n this.#consume(delimiterIndex + delimiter.length);\n return Buffer.concat(chunks, length);\n }\n\n const emitLength = Math.max(0, this.#buffer.length - delimiter.length + 1);\n if (emitLength > 0) {\n length += emitLength;\n if (length > maxBytes) {\n throw new RequestBodyTooLargeError(maxBytes);\n }\n chunks.push(this.#buffer.subarray(0, emitLength));\n this.#consume(emitLength);\n }\n if (!(await this.#readMore())) {\n throw invalidTelegramMultipartBody(\"Multipart delimiter is incomplete.\");\n }\n }\n }\n\n async readInitialBoundary(boundary: Buffer, maxPreambleBytes: number): Promise<\"final\" | \"next\"> {\n const lineBoundary = Buffer.concat([Buffer.from(\"\\r\\n\"), boundary]);\n let preambleBytes = 0;\n let checkBodyStart = true;\n while (true) {\n if (checkBodyStart) {\n await this.#ensure(boundary.length + 2);\n checkBodyStart = false;\n if (this.#buffer.subarray(0, boundary.length).equals(boundary)) {\n const suffix = await this.#readBoundarySuffix(boundary.length);\n if (suffix) {\n this.#consume(suffix.consumedBytes);\n return suffix.kind;\n }\n }\n }\n\n const boundaryIndex = this.#buffer.indexOf(lineBoundary);\n if (boundaryIndex >= 0) {\n const suffixOffset = boundaryIndex + lineBoundary.length;\n if (this.#buffer.length < suffixOffset + 2) {\n if (boundaryIndex > 0) {\n preambleBytes += boundaryIndex;\n if (preambleBytes > maxPreambleBytes) {\n throw new RequestBodyTooLargeError(maxPreambleBytes);\n }\n this.#consume(boundaryIndex);\n }\n if (!(await this.#readMore())) {\n throw invalidTelegramMultipartBody(\"Multipart boundary is incomplete.\");\n }\n continue;\n }\n\n const suffix = await this.#readBoundarySuffix(suffixOffset);\n if (suffix) {\n preambleBytes += boundaryIndex;\n if (preambleBytes > maxPreambleBytes) {\n throw new RequestBodyTooLargeError(maxPreambleBytes);\n }\n this.#consume(suffix.consumedBytes);\n return suffix.kind;\n }\n\n const emitLength = suffixOffset;\n preambleBytes += emitLength;\n if (preambleBytes > maxPreambleBytes) {\n throw new RequestBodyTooLargeError(maxPreambleBytes);\n }\n this.#consume(emitLength);\n continue;\n }\n\n const emitLength = Math.max(0, this.#buffer.length - lineBoundary.length + 1);\n if (emitLength > 0) {\n preambleBytes += emitLength;\n if (preambleBytes > maxPreambleBytes) {\n throw new RequestBodyTooLargeError(maxPreambleBytes);\n }\n this.#consume(emitLength);\n }\n if (!(await this.#readMore())) {\n throw invalidTelegramMultipartBody(\"Multipart body is missing its initial boundary.\");\n }\n }\n }\n\n async readPartBody(\n boundaryMarker: Buffer,\n onChunk: (chunk: Buffer) => void,\n ): Promise<\"final\" | \"next\"> {\n while (true) {\n const boundaryIndex = this.#buffer.indexOf(boundaryMarker);\n if (boundaryIndex >= 0) {\n const suffixOffset = boundaryIndex + boundaryMarker.length;\n if (this.#buffer.length < suffixOffset + 2) {\n if (boundaryIndex > 0) {\n onChunk(this.#buffer.subarray(0, boundaryIndex));\n this.#consume(boundaryIndex);\n }\n if (!(await this.#readMore())) {\n throw invalidTelegramMultipartBody(\"Multipart boundary is incomplete.\");\n }\n continue;\n }\n\n const suffix = await this.#readBoundarySuffix(suffixOffset);\n if (suffix) {\n if (boundaryIndex > 0) {\n onChunk(this.#buffer.subarray(0, boundaryIndex));\n }\n this.#consume(suffix.consumedBytes);\n return suffix.kind;\n }\n\n const emitLength = suffixOffset;\n onChunk(this.#buffer.subarray(0, emitLength));\n this.#consume(emitLength);\n continue;\n }\n\n const emitLength = Math.max(0, this.#buffer.length - boundaryMarker.length + 1);\n if (emitLength > 0) {\n onChunk(this.#buffer.subarray(0, emitLength));\n this.#consume(emitLength);\n }\n if (!(await this.#readMore())) {\n throw invalidTelegramMultipartBody(\"Multipart body is missing its closing boundary.\");\n }\n }\n }\n\n async consumeRemainder(): Promise<void> {\n while (await this.#readMore()) {\n this.#buffer = Buffer.alloc(0);\n }\n }\n\n #consume(length: number): void {\n this.#buffer = this.#buffer.subarray(length);\n }\n\n async #ensure(length: number): Promise<void> {\n while (this.#buffer.length < length) {\n if (!(await this.#readMore())) {\n throw invalidTelegramMultipartBody(\"Multipart body ended unexpectedly.\");\n }\n }\n }\n\n async #readBoundarySuffix(\n suffixOffset: number,\n ): Promise<{ consumedBytes: number; kind: \"final\" | \"next\" } | undefined> {\n await this.#ensure(suffixOffset + 2);\n const suffix = this.#buffer.subarray(suffixOffset, suffixOffset + 2);\n const final = suffix.equals(Buffer.from(\"--\"));\n let lineEnd = suffixOffset + (final ? 2 : 0);\n while (true) {\n while (\n lineEnd < this.#buffer.length &&\n (this.#buffer[lineEnd] === 0x20 || this.#buffer[lineEnd] === 0x09)\n ) {\n lineEnd += 1;\n if (lineEnd - suffixOffset > TELEGRAM_MAX_MULTIPART_HEADER_BYTES) {\n return undefined;\n }\n }\n if (lineEnd >= this.#buffer.length) {\n if (await this.#readMore()) {\n continue;\n }\n return final ? { consumedBytes: lineEnd, kind: \"final\" } : undefined;\n }\n if (this.#buffer[lineEnd] !== 0x0d) {\n return undefined;\n }\n if (lineEnd + 1 >= this.#buffer.length) {\n if (await this.#readMore()) {\n continue;\n }\n return undefined;\n }\n return this.#buffer[lineEnd + 1] === 0x0a\n ? { consumedBytes: lineEnd + 2, kind: final ? \"final\" : \"next\" }\n : undefined;\n }\n }\n\n async #readMore(): Promise<boolean> {\n if (this.#ended) {\n return false;\n }\n const next = await this.#iterator.next();\n if (next.done) {\n this.#ended = true;\n return false;\n }\n const chunk = Buffer.isBuffer(next.value) ? next.value : Buffer.from(next.value);\n this.#totalBytes += chunk.length;\n if (this.#totalBytes > this.maxBytes) {\n throw new RequestBodyTooLargeError(this.maxBytes);\n }\n this.#buffer =\n this.#buffer.length === 0\n ? chunk\n : Buffer.concat([this.#buffer, chunk], this.#buffer.length + chunk.length);\n return true;\n }\n}\n\nfunction enforceTelegramMultipartContentLength(request: IncomingMessage): void {\n const contentLengthHeader = request.headers[\"content-length\"];\n const contentLength = Array.isArray(contentLengthHeader)\n ? contentLengthHeader[0]\n : contentLengthHeader;\n if (contentLength && /^\\d+$/u.test(contentLength)) {\n const bytes = Number(contentLength);\n if (!Number.isSafeInteger(bytes) || bytes > TELEGRAM_MAX_REQUEST_BODY_BYTES) {\n drainRequestBody(request);\n throw new RequestBodyTooLargeError(TELEGRAM_MAX_REQUEST_BODY_BYTES);\n }\n }\n}\n\nasync function parseMultipartFormDataRequest(\n request: IncomingMessage,\n contentType: string,\n): Promise<Record<string, unknown>> {\n enforceTelegramMultipartContentLength(request);\n try {\n const boundary = parseTelegramMultipartBoundary(contentType);\n const bodyBoundary = Buffer.concat([Buffer.from(\"\\r\\n\"), boundary]);\n const reader = new TelegramMultipartReader(request, TELEGRAM_MAX_REQUEST_BODY_BYTES);\n const fields = Object.create(null) as Record<string, unknown>;\n let retainedTextBytes = 0;\n let partCount = 0;\n let boundaryKind = await reader.readInitialBoundary(\n boundary,\n TELEGRAM_MAX_MULTIPART_HEADER_BYTES,\n );\n while (boundaryKind !== \"final\") {\n partCount += 1;\n if (partCount > TELEGRAM_MAX_MULTIPART_PARTS) {\n throw new RequestBodyTooLargeError(TELEGRAM_MAX_MULTIPART_PARTS);\n }\n const disposition = parseTelegramMultipartDisposition(\n await reader.readUntil(Buffer.from(\"\\r\\n\\r\\n\"), TELEGRAM_MAX_MULTIPART_HEADER_BYTES),\n );\n const digest = disposition.fileName === undefined ? undefined : createHash(\"sha256\");\n const textChunks: Buffer[] = [];\n let textLength = 0;\n boundaryKind = await reader.readPartBody(bodyBoundary, (chunk) => {\n if (digest) {\n digest.update(chunk);\n return;\n }\n retainedTextBytes += chunk.length;\n textLength += chunk.length;\n if (retainedTextBytes > TELEGRAM_MAX_MULTIPART_TEXT_BYTES) {\n throw new RequestBodyTooLargeError(TELEGRAM_MAX_MULTIPART_TEXT_BYTES);\n }\n textChunks.push(Buffer.from(chunk));\n });\n fields[disposition.name] =\n digest && disposition.fileName !== undefined\n ? ({\n [TELEGRAM_MULTIPART_FILE]: true,\n contentDigest: digest.digest(\"base64url\"),\n fileName: disposition.fileName,\n } satisfies TelegramMultipartFile)\n : Buffer.concat(textChunks, textLength).toString(\"utf8\");\n }\n await reader.consumeRemainder();\n return fields;\n } catch (error) {\n drainRequestBody(request);\n throw error;\n }\n}\n\nfunction requireTelegramBotPath(pathname: string): { method: string; token: string } | undefined {\n const match = /^\\/bot([^/]+)\\/([A-Za-z][A-Za-z0-9_]*)$/u.exec(pathname);\n if (!match?.[1] || !match[2]) {\n return undefined;\n }\n return { method: match[2], token: match[1] };\n}\n\nfunction toStringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0\n ? value\n : typeof value === \"number\" || typeof value === \"bigint\"\n ? value.toString()\n : undefined;\n}\n\nfunction toIntegerValue(value: unknown): number | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue || !/^-?\\d+$/u.test(stringValue)) {\n return undefined;\n }\n const integerValue = Number(stringValue);\n return Number.isSafeInteger(integerValue) ? integerValue : undefined;\n}\n\nfunction toBooleanValue(value: unknown): boolean {\n return value === true || (typeof value === \"string\" && value.toLowerCase() === \"true\");\n}\n\nfunction telegramChatId(value: unknown): number | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue) {\n return undefined;\n }\n if (/^-?\\d+$/u.test(stringValue)) {\n return telegramNumericChatId(stringValue);\n }\n return telegramUsernameChatId(stringValue);\n}\n\nfunction telegramNumericChatId(value: unknown): number | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue || !/^-?\\d+$/u.test(stringValue)) {\n return undefined;\n }\n const integerValue = BigInt(stringValue);\n if (\n integerValue === 0n ||\n integerValue < -TELEGRAM_NATIVE_CHAT_ID_MAX ||\n integerValue > TELEGRAM_NATIVE_CHAT_ID_MAX\n ) {\n return undefined;\n }\n return Number(integerValue);\n}\n\nfunction telegramStoredChatId(value: unknown): number | undefined {\n const nativeChatId = telegramNumericChatId(value);\n if (nativeChatId !== undefined) {\n return nativeChatId;\n }\n const chatId = toIntegerValue(value);\n return chatId !== undefined && isTelegramUsernameChatId(chatId) ? chatId : undefined;\n}\n\nasync function appendEvent(state: TelegramServerState, event: TelegramServerEvent) {\n await recordServerEvent({ event, onEvent: state.onEvent, recorderPath: state.recorderPath });\n}\n\nfunction isTelegramMultipartFile(value: unknown): value is TelegramMultipartFile {\n return (\n typeof value === \"object\" &&\n value !== null &&\n TELEGRAM_MULTIPART_FILE in value &&\n value[TELEGRAM_MULTIPART_FILE] === true\n );\n}\n\nfunction redactTelegramSecrets(body: Record<string, string>): Record<string, string>;\nfunction redactTelegramSecrets(body: Record<string, unknown>): Record<string, unknown>;\nfunction redactTelegramSecrets(body: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(body).map(([key, value]) => [\n key,\n key === \"secret_token\"\n ? \"<redacted>\"\n : isTelegramMultipartFile(value)\n ? value.fileName\n : value,\n ]),\n );\n}\n\nfunction createBotUser(state: TelegramServerState) {\n return {\n can_join_groups: true,\n can_read_all_group_messages: true,\n first_name: \"Crabline\",\n ...(state.botHasTopicsEnabled ? { has_topics_enabled: true } : {}),\n id: state.botId,\n is_bot: true,\n supports_inline_queries: false,\n username: state.botUsername,\n };\n}\n\nfunction inferTelegramChatType(chatId: number): TelegramChat[\"type\"] {\n return chatId >= 0\n ? \"private\"\n : String(chatId).startsWith(\"-100\") || isTelegramUsernameChatId(chatId)\n ? \"supergroup\"\n : \"group\";\n}\n\nfunction createChat(chatId: number): TelegramChat {\n return {\n id: chatId,\n type: inferTelegramChatType(chatId),\n };\n}\n\nfunction telegramDestinationUsername(value: unknown): string | undefined {\n const username = toStringValue(value);\n return username ? canonicalizeTelegramUsername(username) : undefined;\n}\n\nfunction telegramStoredUsername(value: unknown): string | undefined {\n const username = toStringValue(value)?.trim();\n if (!username) {\n return undefined;\n }\n return canonicalizeTelegramUsername(username.startsWith(\"@\") ? username : `@${username}`)?.slice(\n 1,\n );\n}\n\nfunction telegramChatType(value: unknown): TelegramChat[\"type\"] | undefined {\n return value === \"channel\" || value === \"group\" || value === \"private\" || value === \"supergroup\"\n ? value\n : undefined;\n}\n\nfunction registerTelegramChat(state: TelegramServerState, chat: TelegramChat): void {\n const previous = state.chatsById.get(chat.id);\n const previousUsername = telegramStoredUsername(previous?.username);\n if (previousUsername && state.chatsByUsername.get(previousUsername)?.id === chat.id) {\n state.chatsByUsername.delete(previousUsername);\n }\n const username = telegramStoredUsername(chat.username);\n const stored: TelegramChat = {\n id: chat.id,\n ...(chat.type === \"supergroup\" && chat.is_forum === true ? { is_forum: true } : {}),\n ...(chat.title ? { title: chat.title } : {}),\n type: chat.type,\n ...(username ? { username } : {}),\n };\n state.chatsById.set(chat.id, stored);\n if (username) {\n state.chatsByUsername.set(username, stored);\n }\n}\n\nfunction resolveTelegramChat(state: TelegramServerState, value: unknown): TelegramChat | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue) {\n return undefined;\n }\n if (/^-?\\d+$/u.test(stringValue)) {\n const chatId = telegramChatId(stringValue);\n if (chatId === undefined) {\n return undefined;\n }\n return state.chatsById.get(chatId) ?? createChat(chatId);\n }\n const username = telegramDestinationUsername(stringValue);\n if (!username) {\n return undefined;\n }\n const storedUsername = username.slice(1);\n const registered = state.chatsByUsername.get(storedUsername);\n if (registered) {\n return registered;\n }\n const chatId = telegramUsernameChatId(username);\n return chatId === undefined\n ? undefined\n : {\n id: chatId,\n type: inferTelegramChatType(chatId),\n username: storedUsername,\n };\n}\n\nfunction telegramChatFromRecord(value: unknown): TelegramChat | undefined {\n if (!isJsonObject(value)) {\n return undefined;\n }\n const id = telegramStoredChatId(value.id);\n const type = telegramChatType(value.type);\n if (id === undefined || !type) {\n return undefined;\n }\n const username = telegramStoredUsername(value.username);\n const title = toStringValue(value.title);\n const isForum = value.is_forum === true;\n if (isForum && type !== \"supergroup\") {\n return undefined;\n }\n return {\n id,\n ...(isForum ? { is_forum: true } : {}),\n ...(title ? { title } : {}),\n type,\n ...(username ? { username } : {}),\n };\n}\n\nfunction registerTelegramMessageChat(\n state: TelegramServerState,\n message: Record<string, unknown>,\n): void {\n const chat = telegramChatFromRecord(message.chat);\n if (!chat) {\n return;\n }\n registerTelegramChat(state, chat);\n}\n\nfunction registerTelegramUpdateChats(state: TelegramServerState, body: Record<string, unknown>) {\n for (const field of TELEGRAM_MESSAGE_UPDATE_FIELDS) {\n const message = body[field];\n if (!isJsonObject(message)) {\n continue;\n }\n registerTelegramMessageChat(state, message);\n }\n const callbackQuery = isJsonObject(body.callback_query) ? body.callback_query : undefined;\n const callbackMessage =\n callbackQuery && isJsonObject(callbackQuery.message) ? callbackQuery.message : undefined;\n if (callbackMessage) {\n registerTelegramMessageChat(state, callbackMessage);\n }\n for (const field of TELEGRAM_CHAT_UPDATE_FIELDS) {\n const update = body[field];\n if (!isJsonObject(update)) {\n continue;\n }\n const chat = telegramChatFromRecord(update.chat);\n if (chat) {\n registerTelegramChat(state, chat);\n }\n }\n}\n\nfunction telegramChatKey(chatId: number): string {\n return `number:${chatId}`;\n}\n\nfunction nextTelegramMessageId(state: TelegramServerState, chatId: number): number {\n return state.nextMessageIds.get(telegramChatKey(chatId)) ?? 1;\n}\n\nfunction takeNextTelegramMessageId(state: TelegramServerState, chatId: number): number | undefined {\n const messageId = nextTelegramMessageId(state, chatId);\n if (messageId >= Number.MAX_SAFE_INTEGER) {\n return undefined;\n }\n state.nextMessageIds.set(telegramChatKey(chatId), messageId + 1);\n return messageId;\n}\n\nfunction createOutboundMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n text: string,\n): TelegramMessage | undefined {\n const chat = resolveTelegramChat(state, body.chat_id);\n if (!chat) {\n return undefined;\n }\n const parsedThreadId = telegramMessageThreadId(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n if (parsedThreadId !== undefined && !canTargetTelegramTopic(state, chat)) {\n return undefined;\n }\n const messageId = takeNextTelegramMessageId(state, chat.id);\n if (messageId === undefined) {\n return undefined;\n }\n return {\n chat,\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n message_id: messageId,\n ...(parsedThreadId !== undefined ? { message_thread_id: parsedThreadId } : {}),\n text,\n };\n}\n\nfunction createOutboundMediaMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n mediaKind: \"animation\" | \"audio\" | \"document\" | \"photo\" | \"video\",\n caption: string | undefined,\n): TelegramMessage | undefined {\n const chat = resolveTelegramChat(state, body.chat_id);\n const mediaInput = body[mediaKind];\n const multipartFile = isTelegramMultipartFile(mediaInput) ? mediaInput : undefined;\n const fileName = multipartFile?.fileName ?? toStringValue(mediaInput);\n if (!chat || !fileName) {\n return undefined;\n }\n const parsedThreadId = telegramMessageThreadId(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n if (parsedThreadId !== undefined && !canTargetTelegramTopic(state, chat)) {\n return undefined;\n }\n const messageId = takeNextTelegramMessageId(state, chat.id);\n if (messageId === undefined) {\n return undefined;\n }\n const duration = Math.max(0, toIntegerValue(body.duration) ?? 0);\n const height = Math.max(1, toIntegerValue(body.height) ?? 1);\n const width = Math.max(1, toIntegerValue(body.width) ?? 1);\n const chatIdentity = Buffer.from(telegramChatKey(chat.id)).toString(\"base64url\");\n let fileIdentity: string;\n if (multipartFile) {\n fileIdentity = multipartFile.contentDigest.slice(0, 32);\n } else {\n fileIdentity =\n new RegExp(`^crabline-${mediaKind}-([A-Za-z0-9_-]{32})-`, \"u\").exec(fileName)?.[1] ??\n createHash(\"sha256\")\n .update(mediaKind)\n .update(\"\\0\")\n .update(fileName)\n .digest(\"base64url\")\n .slice(0, 32);\n }\n const fileId = `crabline-${mediaKind}-${fileIdentity}-${chatIdentity}-${messageId}`;\n const fileUniqueId = `crabline-${mediaKind}-unique-${fileIdentity}`;\n const media = {\n file_id: fileId,\n file_name: fileName,\n file_unique_id: fileUniqueId,\n };\n return {\n chat,\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n ...(caption ? { caption } : {}),\n [mediaKind]:\n mediaKind === \"photo\"\n ? [\n {\n file_id: media.file_id,\n file_unique_id: media.file_unique_id,\n height: 1,\n width: 1,\n },\n ]\n : {\n ...media,\n ...(mediaKind === \"audio\"\n ? { duration }\n : mediaKind === \"animation\" || mediaKind === \"video\"\n ? { duration, height, width }\n : {}),\n mime_type: \"application/octet-stream\",\n },\n message_id: messageId,\n ...(parsedThreadId !== undefined ? { message_thread_id: parsedThreadId } : {}),\n };\n}\n\nfunction createEditedMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n text: string,\n): TelegramMessage | undefined {\n const chat = resolveTelegramChat(state, body.chat_id);\n const messageId = toIntegerValue(body.message_id);\n if (!chat || messageId === undefined || messageId < 1) {\n return undefined;\n }\n const parsedThreadId = telegramMessageThreadId(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n if (parsedThreadId !== undefined && !canTargetTelegramTopic(state, chat)) {\n return undefined;\n }\n return {\n chat,\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n message_id: messageId,\n ...(parsedThreadId !== undefined ? { message_thread_id: parsedThreadId } : {}),\n text,\n };\n}\n\nfunction createInboundUpdate(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): TelegramUpdate | undefined {\n const chat = resolveTelegramChat(state, body.chatId ?? body.chat_id);\n const text = body.text;\n if (\n !chat ||\n typeof text !== \"string\" ||\n text.length < 1 ||\n text.length > TELEGRAM_MAX_TEXT_LENGTH\n ) {\n return undefined;\n }\n const fromIdValue = body.fromId ?? body.from_id;\n const threadIdValue = body.messageThreadId ?? body.message_thread_id;\n const messageIdValue = body.messageId ?? body.message_id;\n const updateIdValue = body.updateId ?? body.update_id;\n const fromId = toIntegerValue(fromIdValue);\n const threadId = telegramMessageThreadId(threadIdValue);\n const fromUsernameValue = body.fromUsername ?? body.from_username;\n const fromUsername = telegramStoredUsername(fromUsernameValue);\n const messageId = toIntegerValue(messageIdValue);\n const updateId = toIntegerValue(updateIdValue);\n const explicitChatType = telegramChatType(body.chatType ?? body.chat_type);\n const isForumValue = body.isForum ?? body.is_forum;\n if (\n ((body.chatType !== undefined || body.chat_type !== undefined) && !explicitChatType) ||\n (isForumValue !== undefined && typeof isForumValue !== \"boolean\") ||\n (fromIdValue !== undefined && (fromId === undefined || fromId < 1)) ||\n (fromUsernameValue !== undefined && !fromUsername) ||\n (threadIdValue !== undefined && threadId === undefined) ||\n (messageIdValue !== undefined && (messageId === undefined || messageId < 1)) ||\n (updateIdValue !== undefined && (updateId === undefined || updateId < 1))\n ) {\n return undefined;\n }\n const entities = parseTelegramEntities(body.entities, text);\n if (body.entities !== undefined && !entities) {\n return undefined;\n }\n const inboundChat: TelegramChat = {\n ...chat,\n ...(explicitChatType ? { type: explicitChatType } : {}),\n ...(isForumValue === true ? { is_forum: true } : {}),\n };\n if (isForumValue === false) {\n delete inboundChat.is_forum;\n }\n if (inboundChat.is_forum === true && inboundChat.type !== \"supergroup\") {\n return undefined;\n }\n if (threadId !== undefined && !canTargetTelegramTopic(state, inboundChat)) {\n return undefined;\n }\n return {\n message: {\n chat: inboundChat,\n date: Math.floor(Date.now() / 1000),\n from: {\n first_name: toStringValue(body.fromName ?? body.from_name) ?? \"QA User\",\n id: fromId ?? 100001,\n is_bot: false,\n ...(fromUsername ? { username: fromUsername } : {}),\n },\n message_id: messageId ?? nextTelegramMessageId(state, chat.id),\n ...(entities && entities.length > 0 ? { entities } : {}),\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n text,\n },\n update_id: updateId ?? state.nextUpdateId,\n };\n}\n\nfunction parseTelegramEntities(\n value: unknown,\n text: string,\n): TelegramMessage[\"entities\"] | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n return undefined;\n }\n const entities: NonNullable<TelegramMessage[\"entities\"]> = [];\n for (const entry of value) {\n if (!isJsonObject(entry)) {\n return undefined;\n }\n const length = toIntegerValue(entry.length);\n const offset = toIntegerValue(entry.offset);\n const type = typeof entry.type === \"string\" && entry.type.length > 0 ? entry.type : undefined;\n const customEmojiId = entry.custom_emoji_id;\n const language = entry.language;\n const url = entry.url;\n const user = entry.user;\n if (\n length === undefined ||\n length < 1 ||\n offset === undefined ||\n offset < 0 ||\n offset + length > text.length ||\n !isTelegramUtf16Boundary(text, offset) ||\n !isTelegramUtf16Boundary(text, offset + length) ||\n !type ||\n (customEmojiId !== undefined &&\n (typeof customEmojiId !== \"string\" || customEmojiId.length === 0)) ||\n (language !== undefined && (typeof language !== \"string\" || language.length === 0)) ||\n (url !== undefined && (typeof url !== \"string\" || url.length === 0)) ||\n (user !== undefined && !isJsonObject(user))\n ) {\n return undefined;\n }\n entities.push({\n ...(customEmojiId !== undefined ? { custom_emoji_id: customEmojiId } : {}),\n ...(language !== undefined ? { language } : {}),\n length,\n offset,\n type,\n ...(url !== undefined ? { url } : {}),\n ...(user !== undefined ? { user } : {}),\n });\n }\n return entities;\n}\n\nfunction isTelegramUtf16Boundary(text: string, index: number): boolean {\n if (index <= 0 || index >= text.length) {\n return true;\n }\n const previous = text.charCodeAt(index - 1);\n const next = text.charCodeAt(index);\n return !(previous >= 0xd800 && previous <= 0xdbff && next >= 0xdc00 && next <= 0xdfff);\n}\n\nfunction hasTelegramMedia(value: Record<string, unknown>): boolean {\n return TELEGRAM_MEDIA_FIELDS.some((field) => value[field] !== undefined);\n}\n\nfunction telegramMessageThreadId(value: unknown): number | undefined {\n const threadId = toIntegerValue(value);\n return threadId !== undefined && threadId > 0 ? threadId : undefined;\n}\n\nfunction canTargetTelegramTopic(state: TelegramServerState, chat: TelegramChat): boolean {\n if (chat.type === \"supergroup\") {\n return chat.is_forum === true;\n }\n if (chat.type === \"private\") {\n return state.botHasTopicsEnabled;\n }\n return false;\n}\n\nfunction telegramMessageTargetsValidTopic(\n state: TelegramServerState,\n message: Record<string, unknown>,\n): boolean {\n if (message.message_thread_id === undefined) {\n return true;\n }\n const chat = telegramChatFromRecord(message.chat);\n if (!chat) {\n return false;\n }\n return canTargetTelegramTopic(state, chat);\n}\n\nfunction hasValidTelegramTopicDestinations(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): boolean {\n const topLevelThreadId = body.messageThreadId ?? body.message_thread_id;\n if (topLevelThreadId !== undefined) {\n const chat = resolveTelegramChat(state, body.chatId ?? body.chat_id);\n const explicitType = telegramChatType(body.chatType ?? body.chat_type);\n if (!chat || ((body.chatType !== undefined || body.chat_type !== undefined) && !explicitType)) {\n return false;\n }\n const topicChat: TelegramChat = {\n ...chat,\n ...(explicitType ? { type: explicitType } : {}),\n ...((body.isForum ?? body.is_forum) === true ? { is_forum: true } : {}),\n };\n if ((body.isForum ?? body.is_forum) === false) {\n delete topicChat.is_forum;\n }\n if (\n (body.isForum !== undefined || body.is_forum !== undefined) &&\n typeof (body.isForum ?? body.is_forum) !== \"boolean\"\n ) {\n return false;\n }\n if (!canTargetTelegramTopic(state, topicChat)) {\n return false;\n }\n }\n for (const field of TELEGRAM_MESSAGE_UPDATE_FIELDS) {\n const message = body[field];\n if (isJsonObject(message) && !telegramMessageTargetsValidTopic(state, message)) {\n return false;\n }\n }\n const callbackQuery = isJsonObject(body.callback_query) ? body.callback_query : undefined;\n const callbackMessage =\n callbackQuery && isJsonObject(callbackQuery.message) ? callbackQuery.message : undefined;\n return !callbackMessage || telegramMessageTargetsValidTopic(state, callbackMessage);\n}\n\nfunction hasValidTelegramMessageThreadIds(body: Record<string, unknown>): boolean {\n const values = [\n body.messageThreadId,\n body.message_thread_id,\n ...TELEGRAM_MESSAGE_UPDATE_FIELDS.flatMap((field) => {\n const message = body[field];\n return isJsonObject(message) ? [message.message_thread_id] : [];\n }),\n ];\n const callbackQuery = isJsonObject(body.callback_query) ? body.callback_query : undefined;\n const callbackMessage =\n callbackQuery && isJsonObject(callbackQuery.message) ? callbackQuery.message : undefined;\n if (callbackMessage) {\n values.push(callbackMessage.message_thread_id);\n }\n return values.every(\n (value) => value === undefined || telegramMessageThreadId(value) !== undefined,\n );\n}\n\nfunction explicitTelegramId(\n body: Record<string, unknown>,\n names: readonly string[],\n additionalValues: readonly unknown[] = [],\n options: { allowZero?: boolean } = {},\n): { present: false } | { present: true; value: number } | undefined {\n const values = [\n ...names.flatMap((name) => (body[name] === undefined ? [] : [body[name]])),\n ...additionalValues.filter((value) => value !== undefined),\n ];\n if (values.length === 0) {\n return { present: false };\n }\n const parsed = values.map(toIntegerValue);\n const minimum = options.allowZero ? 0 : 1;\n if (\n parsed.some(\n (value) => value === undefined || value < minimum || value >= Number.MAX_SAFE_INTEGER,\n ) ||\n new Set(parsed).size !== 1\n ) {\n return undefined;\n }\n return { present: true, value: parsed[0]! };\n}\n\nfunction explicitTelegramMessageIdValues(body: Record<string, unknown>): unknown[] {\n return TELEGRAM_NEW_MESSAGE_UPDATE_FIELDS.flatMap((field) => {\n const message = body[field];\n return isJsonObject(message) ? [message.message_id] : [];\n });\n}\n\nfunction referencedTelegramMessageIdValues(body: Record<string, unknown>): unknown[] {\n const values = TELEGRAM_MESSAGE_REFERENCE_FIELDS.flatMap((field) => {\n const message = body[field];\n return isJsonObject(message) ? [message.message_id] : [];\n });\n const callbackQuery = isJsonObject(body.callback_query) ? body.callback_query : undefined;\n const callbackMessage =\n callbackQuery && isJsonObject(callbackQuery.message) ? callbackQuery.message : undefined;\n return callbackMessage ? [...values, callbackMessage.message_id] : values;\n}\n\nfunction explicitTelegramMessageChatId(body: Record<string, unknown>): number | undefined | false {\n const chatIds: number[] = [];\n if (body.messageId !== undefined || body.message_id !== undefined) {\n const chatId = telegramChatId(body.chatId ?? body.chat_id);\n if (chatId === undefined) {\n return false;\n }\n chatIds.push(chatId);\n }\n for (const field of TELEGRAM_MESSAGE_UPDATE_FIELDS) {\n const message = body[field];\n if (!isJsonObject(message) || message.message_id === undefined) {\n continue;\n }\n const chat = isJsonObject(message.chat) ? message.chat : undefined;\n const chatId = telegramStoredChatId(chat?.id);\n if (chatId === undefined) {\n return false;\n }\n chatIds.push(chatId);\n }\n const callbackQuery = isJsonObject(body.callback_query) ? body.callback_query : undefined;\n const callbackMessage =\n callbackQuery && isJsonObject(callbackQuery.message) ? callbackQuery.message : undefined;\n if (callbackMessage?.message_id !== undefined) {\n const chat = isJsonObject(callbackMessage.chat) ? callbackMessage.chat : undefined;\n const chatId = telegramStoredChatId(chat?.id);\n if (chatId === undefined) {\n return false;\n }\n chatIds.push(chatId);\n }\n if (chatIds.length === 0) {\n return undefined;\n }\n const firstChatId = chatIds[0]!;\n return chatIds.every((chatId) => telegramChatKey(chatId) === telegramChatKey(firstChatId))\n ? firstChatId\n : false;\n}\n\nfunction readTelegramTextField(\n value: unknown,\n field: \"caption\" | \"text\",\n options: { parseMode?: unknown; required: boolean },\n): Response | string | undefined {\n if (value === undefined) {\n return options.required ? telegramError(`Bad Request: ${field} is required`) : undefined;\n }\n if (typeof value !== \"string\") {\n return telegramError(`Bad Request: ${field} must be a string`);\n }\n const parsedLength = telegramTextLength(value, options.parseMode);\n if (options.required && parsedLength === 0) {\n return telegramError(`Bad Request: ${field} must not be empty`);\n }\n const maxLength = field === \"text\" ? TELEGRAM_MAX_TEXT_LENGTH : TELEGRAM_MAX_CAPTION_LENGTH;\n if (parsedLength > maxLength) {\n return telegramError(`Bad Request: ${field} is too long`);\n }\n return value;\n}\n\nfunction telegramTextLength(value: string, parseMode: unknown): number {\n const normalizedParseMode = typeof parseMode === \"string\" ? parseMode.toLowerCase() : undefined;\n if (normalizedParseMode === \"html\") {\n return telegramHtmlText(value).length;\n }\n if (normalizedParseMode === \"markdown\" || normalizedParseMode === \"markdownv2\") {\n return telegramMarkdownText(value, normalizedParseMode === \"markdownv2\").length;\n }\n return value.length;\n}\n\nfunction telegramHtmlText(value: string): string {\n return value\n .replace(TELEGRAM_HTML_TAG_PATTERN, \"\")\n .replace(TELEGRAM_HTML_ENTITY_PATTERN, (entity) => {\n const normalized = entity.toLowerCase();\n if (normalized === \"&amp;\") {\n return \"&\";\n }\n if (normalized === \"&gt;\") {\n return \">\";\n }\n if (normalized === \"&lt;\") {\n return \"<\";\n }\n if (normalized === \"&quot;\") {\n return '\"';\n }\n const radix = normalized.startsWith(\"&#x\") ? 16 : 10;\n const digits = normalized.slice(radix === 16 ? 3 : 2, -1);\n const codePoint = Number.parseInt(digits, radix);\n return Number.isSafeInteger(codePoint) && codePoint <= 0x10ffff\n ? String.fromCodePoint(codePoint)\n : entity;\n });\n}\n\nfunction protectTelegramMarkdownEscapes(value: string, versionTwo: boolean): string {\n let protectedText = \"\";\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index]!;\n const escapedCharacter = value[index + 1];\n if (\n character === \"\\\\\" &&\n escapedCharacter !== undefined &&\n (versionTwo\n ? escapedCharacter.charCodeAt(0) >= 1 && escapedCharacter.charCodeAt(0) <= 0x7e\n : \"*_[]`\".includes(escapedCharacter))\n ) {\n protectedText += \"\\0\";\n index += 1;\n continue;\n }\n protectedText += character;\n }\n return protectedText;\n}\n\nfunction telegramMarkdownLiteralMask(value: string): string {\n return \"\\0\".repeat(value.length);\n}\n\nfunction stripTelegramMarkdownExpandableMarker(line: string): string {\n if (!line.endsWith(\"||\")) {\n return line;\n }\n let markers = 0;\n for (let index = line.indexOf(\"||\"); index >= 0; index = line.indexOf(\"||\", index + 2)) {\n markers += 1;\n }\n return markers % 2 === 1 ? line.slice(0, -2) : line;\n}\n\n// Keep this scan strictly forward-only: this request path accepts client-controlled\n// Markdown, and backtracking over malformed link destinations amplifies CPU use.\nfunction stripTelegramMarkdownLinks(value: string): string {\n const output: string[] = [];\n let copyStart = 0;\n let searchStart = 0;\n\n while (searchStart < value.length) {\n const labelStart = value.indexOf(\"[\", searchStart);\n if (labelStart < 0) {\n break;\n }\n\n let labelEnd = labelStart + 1;\n while (labelEnd < value.length && value[labelEnd] !== \"]\" && value[labelEnd] !== \"\\n\") {\n labelEnd += 1;\n }\n if (labelEnd === labelStart + 1 || value[labelEnd] !== \"]\" || value[labelEnd + 1] !== \"(\") {\n searchStart = labelEnd < value.length ? labelEnd + 1 : value.length;\n continue;\n }\n\n let destinationEnd = labelEnd + 2;\n let matched = false;\n while (destinationEnd < value.length) {\n const character = value[destinationEnd]!;\n if (character === \"\\n\") {\n break;\n }\n if (character === \")\") {\n output.push(value.slice(copyStart, labelStart), value.slice(labelStart + 1, labelEnd));\n copyStart = destinationEnd + 1;\n searchStart = copyStart;\n matched = true;\n break;\n }\n if (\n character === \"\\\\\" &&\n destinationEnd + 1 < value.length &&\n value[destinationEnd + 1] !== \"\\n\"\n ) {\n destinationEnd += 2;\n continue;\n }\n destinationEnd += 1;\n }\n if (matched) {\n continue;\n }\n searchStart = destinationEnd < value.length ? destinationEnd + 1 : value.length;\n }\n\n output.push(value.slice(copyStart));\n return output.join(\"\");\n}\n\nfunction telegramMarkdownText(value: string, versionTwo: boolean): string {\n let parsed = protectTelegramMarkdownEscapes(value, versionTwo)\n .replace(/```(?:[^\\n]*\\n)?([\\s\\S]*?)```/gu, (_match, content: string) =>\n telegramMarkdownLiteralMask(content),\n )\n .replace(/`([^`\\n]*)`/gu, (_match, content: string) => telegramMarkdownLiteralMask(content))\n .replace(\n /!\\[([^\\]\\n]+)\\]\\(tg:\\/\\/(?:emoji\\?id=\\d+|time\\?unix=-?\\d+(?:&format=[rwdDtT]+)?)\\)/gu,\n \"$1\",\n );\n parsed = stripTelegramMarkdownLinks(parsed);\n if (versionTwo) {\n parsed = parsed\n .replace(/^(?:\\*\\*)?>[^\\n]*$/gmu, stripTelegramMarkdownExpandableMarker)\n .replace(/^\\*\\*(?=>)/gmu, \"\")\n .replace(/^>/gmu, \"\")\n .replace(/\\|\\|([\\s\\S]*?)\\|\\|/gu, \"$1\")\n .replace(/__([\\s\\S]*?)__/gu, \"$1\")\n .replace(/~([\\s\\S]*?)~/gu, \"$1\");\n }\n let previous: string;\n do {\n previous = parsed;\n parsed = parsed.replace(/\\*([\\s\\S]*?)\\*/gu, \"$1\").replace(/_([\\s\\S]*?)_/gu, \"$1\");\n } while (parsed !== previous);\n return parsed;\n}\n\nfunction hasValidExplicitTelegramIdentities(body: Record<string, unknown>): boolean {\n return (\n [body.chatId, body.chat_id].every(\n (value) => value === undefined || telegramChatId(value) !== undefined,\n ) &&\n [\n body.fromId,\n body.from_id,\n body.messageId,\n body.message_id,\n body.updateId,\n body.update_id,\n ].every((value) => value === undefined || toIntegerValue(value) !== undefined)\n );\n}\n\nfunction isValidIgnoredTelegramUpdate(body: Record<string, unknown>): boolean {\n const updateIdValue = body.updateId ?? body.update_id;\n const updateId = toIntegerValue(updateIdValue);\n\n if (isJsonObject(body.message)) {\n const message = body.message;\n const chat = isJsonObject(message.chat) ? message.chat : undefined;\n const messageId = toIntegerValue(message.message_id);\n if (\n updateId === undefined ||\n updateId < 1 ||\n !chat ||\n telegramStoredChatId(chat.id) === undefined ||\n messageId === undefined ||\n messageId < 0 ||\n (message.from !== undefined &&\n (!isJsonObject(message.from) || (toIntegerValue(message.from.id) ?? 0) < 1)) ||\n (message.message_thread_id !== undefined &&\n telegramMessageThreadId(message.message_thread_id) === undefined)\n ) {\n return false;\n }\n return toStringValue(message.text) === undefined;\n }\n\n const chatId = telegramChatId(body.chatId ?? body.chat_id);\n if (\n chatId !== undefined &&\n hasValidExplicitTelegramIdentities(body) &&\n hasTelegramMedia(body) &&\n toStringValue(body.text) === undefined\n ) {\n return true;\n }\n\n return (\n updateId !== undefined &&\n TELEGRAM_UNSUPPORTED_UPDATE_FIELDS.some((field) => isJsonObject(body[field]))\n );\n}\n\nasync function handleTelegramAdminInbound(params: {\n body: Record<string, unknown>;\n request: IncomingMessage;\n state: TelegramServerState;\n url: URL;\n}): Promise<Response> {\n let releaseAdmission!: () => void;\n const previousAdmission = params.state.inboundAdmission;\n params.state.inboundAdmission = new Promise<void>((resolve) => {\n releaseAdmission = resolve;\n });\n await previousAdmission;\n try {\n const nextUpdateId = params.state.nextUpdateId;\n const explicitMessageId = explicitTelegramId(\n params.body,\n [\"messageId\", \"message_id\"],\n explicitTelegramMessageIdValues(params.body),\n { allowZero: true },\n );\n const explicitMessageChatId = explicitTelegramMessageChatId(params.body);\n const explicitUpdateId = explicitTelegramId(params.body, [\"updateId\", \"update_id\"]);\n const referencedMessageId = explicitTelegramId(\n {},\n [],\n referencedTelegramMessageIdValues(params.body),\n );\n const topLevelChatId = resolveTelegramChat(\n params.state,\n params.body.chatId ?? params.body.chat_id,\n )?.id;\n const messageChatId =\n explicitMessageChatId === false ? undefined : (explicitMessageChatId ?? topLevelChatId);\n const messageChatKey = messageChatId === undefined ? undefined : telegramChatKey(messageChatId);\n const previousNextMessageId =\n messageChatKey === undefined ? undefined : params.state.nextMessageIds.get(messageChatKey);\n const nextMessageId =\n messageChatId === undefined ? undefined : nextTelegramMessageId(params.state, messageChatId);\n if (\n !hasValidTelegramMessageThreadIds(params.body) ||\n !hasValidTelegramTopicDestinations(params.state, params.body) ||\n explicitMessageId === undefined ||\n explicitMessageChatId === false ||\n explicitUpdateId === undefined ||\n referencedMessageId === undefined ||\n (explicitMessageId.present &&\n explicitMessageId.value > 0 &&\n (nextMessageId === undefined || explicitMessageId.value < nextMessageId)) ||\n (explicitUpdateId.present && explicitUpdateId.value < nextUpdateId)\n ) {\n return telegramError(\"Bad Request: explicit IDs must be valid and monotonic\");\n }\n const update = createInboundUpdate(params.state, params.body);\n params.state.nextUpdateId = nextUpdateId;\n if (\n update &&\n ((!explicitMessageId.present &&\n (nextMessageId ?? Number.MAX_SAFE_INTEGER) >= Number.MAX_SAFE_INTEGER) ||\n (!explicitUpdateId.present && nextUpdateId >= Number.MAX_SAFE_INTEGER))\n ) {\n return telegramError(\"Bad Request: generated ID space is exhausted\");\n }\n if (!update) {\n if (isValidIgnoredTelegramUpdate(params.body)) {\n if (messageChatKey !== undefined) {\n const observedNextMessageIds = [\n ...(explicitMessageId.present && explicitMessageId.value > 0\n ? [explicitMessageId.value + 1]\n : []),\n ...(referencedMessageId.present && referencedMessageId.value > 0\n ? [referencedMessageId.value + 1]\n : []),\n ];\n if (observedNextMessageIds.length > 0) {\n params.state.nextMessageIds.set(\n messageChatKey,\n Math.max(\n params.state.nextMessageIds.get(messageChatKey) ?? 1,\n ...observedNextMessageIds,\n ),\n );\n }\n }\n if (explicitUpdateId.present) {\n params.state.nextUpdateId = explicitUpdateId.value + 1;\n }\n registerTelegramUpdateChats(params.state, params.body);\n return jsonResponse({ ok: true });\n }\n return telegramError(\"Bad Request: chatId and text are required\");\n }\n if (params.state.updates.length >= params.state.maxPendingInboundEvents) {\n return telegramError(\n `Too Many Requests: pending inbound queue is full (${params.state.maxPendingInboundEvents} updates)`,\n 429,\n );\n }\n const updateChatKey = telegramChatKey(update.message.chat.id);\n params.state.nextMessageIds.set(\n updateChatKey,\n Math.max(\n params.state.nextMessageIds.get(updateChatKey) ?? 1,\n update.message.message_id + 1,\n ...(referencedMessageId.present && referencedMessageId.value > 0\n ? [referencedMessageId.value + 1]\n : []),\n ),\n );\n params.state.nextUpdateId = Math.max(params.state.nextUpdateId, update.update_id + 1);\n const reservedNextMessageId = params.state.nextMessageIds.get(updateChatKey)!;\n const reservedNextUpdateId = params.state.nextUpdateId;\n try {\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n body: params.body,\n method: params.request.method ?? \"POST\",\n path: params.url.pathname,\n query: queryRecord(params.url),\n type: \"admin\",\n });\n } catch (error) {\n if (params.state.nextMessageIds.get(updateChatKey) === reservedNextMessageId) {\n if (previousNextMessageId === undefined) {\n params.state.nextMessageIds.delete(updateChatKey);\n } else {\n params.state.nextMessageIds.set(updateChatKey, previousNextMessageId);\n }\n }\n if (params.state.nextUpdateId === reservedNextUpdateId) {\n params.state.nextUpdateId = nextUpdateId;\n }\n throw error;\n }\n registerTelegramChat(params.state, update.message.chat);\n params.state.updates.push(update);\n params.state.updates.sort((left, right) => left.update_id - right.update_id);\n if (params.state.webhook) {\n scheduleTelegramWebhookDelivery(params.state, 0);\n return jsonResponse({ ok: true, update });\n }\n finishTelegramUpdatePoll(params.state, \"update\");\n return jsonResponse({ ok: true, update });\n } finally {\n releaseAdmission();\n }\n}\n\nasync function flushTelegramWebhookUpdates(\n state: TelegramServerState,\n onAttempt: (updateId: number) => void,\n): Promise<Response | undefined> {\n if (!state.webhook) {\n return undefined;\n }\n while (state.updates.length > 0 && state.webhook) {\n syncTelegramWebhookRetryHead(state);\n const webhook: TelegramWebhook = state.webhook;\n const update = state.updates[0]!;\n onAttempt(update.update_id);\n try {\n const delivery = await postTelegramWebhook(state, webhook, update);\n if (\"error\" in delivery) {\n if (state.webhook === webhook) {\n webhook.lastErrorDate = Math.floor(Date.now() / 1_000);\n webhook.lastErrorMessage = delivery.error;\n }\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n if (delivery.status < 200 || delivery.status >= 300) {\n if (state.webhook === webhook) {\n webhook.lastErrorDate = Math.floor(Date.now() / 1_000);\n webhook.lastErrorMessage = `Wrong response from the webhook: ${delivery.status}`;\n }\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n if (state.webhook !== webhook) {\n return undefined;\n }\n const deliveredIndex = state.updates.indexOf(update);\n if (deliveredIndex >= 0) {\n state.updates.splice(deliveredIndex, 1);\n }\n if (state.webhook === webhook) {\n state.webhookRetryAttempts = 0;\n }\n } catch {\n if (state.webhook === webhook) {\n webhook.lastErrorDate = Math.floor(Date.now() / 1_000);\n webhook.lastErrorMessage = \"Webhook delivery failed\";\n }\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n }\n return undefined;\n}\n\nasync function validateTelegramWebhookUrl(\n state: Pick<TelegramServerState, \"allowLoopbackHttpWebhook\" | \"restrictWebhookTargets\">,\n url: URL,\n deadlineAt: number,\n signal: AbortSignal,\n): Promise<Response | { addresses: WebhookAddress[] | undefined }> {\n const remainingMs = deadlineAt - Date.now();\n if (remainingMs <= 0) {\n return telegramError(\"Bad Request: webhook host could not be resolved\");\n }\n const deadline = new AbortController();\n const timer = setTimeout(\n () => deadline.abort(new DOMException(\"Webhook delivery timed out\", \"TimeoutError\")),\n remainingMs,\n );\n timer.unref();\n let target;\n try {\n target = await validateWebhookTarget({\n allowLoopbackHttp: state.allowLoopbackHttpWebhook,\n restrictPrivateAddresses: state.restrictWebhookTargets,\n signal: AbortSignal.any([signal, deadline.signal]),\n url,\n });\n } catch {\n return telegramError(\"Bad Request: webhook host could not be resolved\");\n } finally {\n clearTimeout(timer);\n }\n if (!(\"error\" in target)) {\n return target;\n }\n return target.error === \"unresolvable\"\n ? telegramError(\"Bad Request: webhook host could not be resolved\")\n : target.error === \"private-address\"\n ? telegramError(\"Bad Request: webhook URL must not target a private or link-local address\")\n : telegramError(\"Bad Request: webhook URL must use HTTPS\");\n}\n\n/** @internal */\nexport async function withTelegramWebhookDeadline<T>(\n promise: Promise<T>,\n deadlineAt: number,\n signal: AbortSignal,\n): Promise<T> {\n const remainingMs = deadlineAt - Date.now();\n if (remainingMs <= 0) {\n throw new DOMException(\"Webhook delivery timed out\", \"TimeoutError\");\n }\n return await new Promise<T>((resolve, reject) => {\n let settled = false;\n const finish = (callback: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n callback();\n };\n const onAbort = () =>\n finish(() =>\n reject(\n signal.reason instanceof Error\n ? signal.reason\n : new DOMException(\"Webhook delivery aborted\", \"AbortError\"),\n ),\n );\n const timer = setTimeout(\n () => finish(() => reject(new DOMException(\"Webhook delivery timed out\", \"TimeoutError\"))),\n remainingMs,\n );\n timer.unref();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) {\n onAbort();\n return;\n }\n promise.then(\n (value) => finish(() => resolve(value)),\n (error: unknown) => finish(() => reject(error)),\n );\n });\n}\n\nasync function postTelegramWebhook(\n state: TelegramServerState,\n webhook: TelegramWebhook,\n update: TelegramUpdate,\n): Promise<{ error: string } | { status: number }> {\n const url = new URL(webhook.url);\n const deadlineAt = Date.now() + TELEGRAM_WEBHOOK_DELIVERY_TIMEOUT_MS;\n const controller = new AbortController();\n state.activeWebhookDeliveries.add(controller);\n try {\n const target = await validateTelegramWebhookUrl(state, url, deadlineAt, controller.signal);\n if (target instanceof Response) {\n return { error: \"Webhook target is no longer allowed\" };\n }\n const addresses: Array<WebhookAddress | undefined> =\n target.addresses && target.addresses.length > 0 ? target.addresses : [undefined];\n let lastError: unknown;\n for (const [index, address] of addresses.entries()) {\n if (state.closing) {\n throw new Error(\"Telegram server is shutting down.\");\n }\n const remainingMs = deadlineAt - Date.now();\n if (remainingMs <= 0) {\n throw new DOMException(\"Webhook delivery timed out\", \"TimeoutError\");\n }\n try {\n const attemptsRemaining = addresses.length - index;\n const status = await postWebhookRequest({\n address,\n body: JSON.stringify(update),\n headerEntries: webhook.secretToken\n ? [[\"x-telegram-bot-api-secret-token\", webhook.secretToken]]\n : undefined,\n signal: controller.signal,\n timeoutMs: Math.max(1, Math.floor(remainingMs / attemptsRemaining)),\n url,\n });\n return { status };\n } catch (error) {\n lastError = error;\n if (state.closing || controller.signal.aborted) {\n throw error;\n }\n }\n }\n throw lastError;\n } finally {\n state.activeWebhookDeliveries.delete(controller);\n }\n}\n\nasync function replaceTelegramWebhook(\n state: TelegramServerState,\n webhook: TelegramWebhook | undefined,\n dropPendingUpdates: boolean,\n): Promise<void> {\n let releaseAdmission!: () => void;\n const previousAdmission = state.webhookAdmission;\n state.webhookAdmission = new Promise<void>((resolve) => {\n releaseAdmission = resolve;\n });\n await previousAdmission;\n try {\n state.webhook = undefined;\n clearTelegramWebhookRetry(state, true);\n for (const controller of state.activeWebhookDeliveries) {\n controller.abort();\n }\n await state.webhookDelivery;\n if (dropPendingUpdates) {\n state.updates.length = 0;\n }\n state.webhook = webhook;\n if (webhook) {\n finishTelegramUpdatePoll(state, \"conflict\");\n scheduleTelegramWebhookDelivery(state, 0);\n }\n } finally {\n releaseAdmission();\n }\n}\n\nfunction clearTelegramWebhookRetry(state: TelegramServerState, resetAttempts = false): void {\n if (state.webhookRetryTimer) {\n clearTimeout(state.webhookRetryTimer);\n state.webhookRetryTimer = undefined;\n }\n if (resetAttempts) {\n state.webhookRetryAttempts = 0;\n state.webhookRetryUpdateId = undefined;\n }\n}\n\nfunction syncTelegramWebhookRetryHead(state: TelegramServerState): void {\n const updateId = state.updates[0]?.update_id;\n if (updateId === state.webhookRetryUpdateId) {\n return;\n }\n clearTelegramWebhookRetry(state);\n state.webhookRetryAttempts = 0;\n state.webhookRetryUpdateId = updateId;\n}\n\nfunction scheduleTelegramWebhookDelivery(state: TelegramServerState, delayMs: number): void {\n if (\n state.closing ||\n !state.webhook ||\n state.updates.length === 0 ||\n state.webhookDelivery ||\n state.webhookRetryTimer\n ) {\n return;\n }\n state.webhookRetryTimer = setTimeout(() => {\n state.webhookRetryTimer = undefined;\n void deliverTelegramWebhookUpdates(state, true);\n }, delayMs);\n state.webhookRetryTimer.unref();\n}\n\nasync function deliverTelegramWebhookUpdates(\n state: TelegramServerState,\n scheduledRetry = false,\n): Promise<Response | undefined> {\n if (state.webhookDelivery) {\n return await state.webhookDelivery;\n }\n syncTelegramWebhookRetryHead(state);\n if (!scheduledRetry && state.webhookRetryTimer) {\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n let attemptedUpdateId: number | undefined;\n const delivery = flushTelegramWebhookUpdates(state, (updateId) => {\n attemptedUpdateId = updateId;\n });\n state.webhookDelivery = delivery;\n let result: Response | undefined;\n try {\n result = await delivery;\n return result;\n } finally {\n if (state.webhookDelivery === delivery) {\n state.webhookDelivery = undefined;\n }\n if (state.webhook && state.updates.length > 0) {\n if (state.updates[0]?.update_id !== attemptedUpdateId) {\n syncTelegramWebhookRetryHead(state);\n scheduleTelegramWebhookDelivery(state, 0);\n } else if (result) {\n const delayMs =\n TELEGRAM_WEBHOOK_RETRY_BASE_MS *\n 2 ** Math.min(state.webhookRetryAttempts, TELEGRAM_WEBHOOK_MAX_BACKOFF_EXPONENT);\n state.webhookRetryAttempts = Math.min(\n state.webhookRetryAttempts + 1,\n TELEGRAM_WEBHOOK_MAX_BACKOFF_EXPONENT,\n );\n scheduleTelegramWebhookDelivery(state, delayMs);\n } else {\n state.webhookRetryAttempts = 0;\n scheduleTelegramWebhookDelivery(state, 0);\n }\n }\n }\n}\n\nasync function handleTelegramApi(params: {\n body: Record<string, unknown>;\n method: string;\n request: IncomingMessage;\n state: TelegramServerState;\n}) {\n const method = params.method.toLowerCase();\n switch (method) {\n case \"getme\":\n return telegramOk(createBotUser(params.state));\n case \"setmycommands\":\n case \"deletemycommands\":\n case \"answercallbackquery\":\n case \"deletemessage\":\n case \"pinchatmessage\":\n case \"unpinchatmessage\":\n case \"setmessagereaction\":\n return telegramOk(true);\n case \"sendchataction\": {\n if (params.body.message_thread_id === undefined) {\n return telegramOk(true);\n }\n const chat = resolveTelegramChat(params.state, params.body.chat_id);\n const messageThreadId = telegramMessageThreadId(params.body.message_thread_id);\n return chat && messageThreadId !== undefined && canTargetTelegramTopic(params.state, chat)\n ? telegramOk(true)\n : telegramError(\"Bad Request: chat is not a forum or message_thread_id is invalid\");\n }\n case \"editforumtopic\": {\n const chat = resolveTelegramChat(params.state, params.body.chat_id);\n const messageThreadId = telegramMessageThreadId(params.body.message_thread_id);\n return chat && messageThreadId !== undefined && canTargetTelegramTopic(params.state, chat)\n ? telegramOk(true)\n : telegramError(\"Bad Request: chat is not a forum or message_thread_id is invalid\");\n }\n case \"setwebhook\": {\n if (params.body.url === \"\") {\n await replaceTelegramWebhook(\n params.state,\n undefined,\n toBooleanValue(params.body.drop_pending_updates),\n );\n return telegramOk(true);\n }\n const webhookUrl = toStringValue(params.body.url);\n if (!webhookUrl) {\n return telegramError(\"Bad Request: url is required\");\n }\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(webhookUrl);\n } catch {\n return telegramError(\"Bad Request: bad webhook URL\");\n }\n if (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\") {\n return telegramError(\"Bad Request: bad webhook URL\");\n }\n const secretToken =\n params.body.secret_token === undefined\n ? undefined\n : typeof params.body.secret_token === \"string\"\n ? params.body.secret_token\n : null;\n if (\n secretToken === null ||\n (secretToken !== undefined && !TELEGRAM_WEBHOOK_SECRET_PATTERN.test(secretToken))\n ) {\n return telegramError(\"Bad Request: invalid secret token\");\n }\n if (params.state.activeWebhookValidations.size >= MAX_ACTIVE_TELEGRAM_WEBHOOK_VALIDATIONS) {\n return telegramError(\"Too Many Requests: too many webhook validations\", 429);\n }\n const validation = new AbortController();\n params.state.activeWebhookValidations.add(validation);\n const target = await validateTelegramWebhookUrl(\n params.state,\n parsedUrl,\n Date.now() + TELEGRAM_WEBHOOK_DELIVERY_TIMEOUT_MS,\n validation.signal,\n ).finally(() => {\n params.state.activeWebhookValidations.delete(validation);\n });\n if (target instanceof Response) {\n return target;\n }\n await replaceTelegramWebhook(\n params.state,\n {\n ...(secretToken ? { secretToken } : {}),\n url: parsedUrl.href,\n },\n toBooleanValue(params.body.drop_pending_updates),\n );\n return telegramOk(true);\n }\n case \"deletewebhook\":\n await replaceTelegramWebhook(\n params.state,\n undefined,\n toBooleanValue(params.body.drop_pending_updates),\n );\n return telegramOk(true);\n case \"getwebhookinfo\":\n return telegramOk({\n has_custom_certificate: false,\n ...(params.state.webhook?.lastErrorDate\n ? { last_error_date: params.state.webhook.lastErrorDate }\n : {}),\n ...(params.state.webhook?.lastErrorMessage\n ? { last_error_message: params.state.webhook.lastErrorMessage }\n : {}),\n pending_update_count: params.state.updates.length,\n url: params.state.webhook?.url ?? \"\",\n });\n case \"createforumtopic\": {\n const chat = resolveTelegramChat(params.state, params.body.chat_id);\n if (!chat) {\n return telegramError(\"Bad Request: chat_id is required\");\n }\n if (!canTargetTelegramTopic(params.state, chat)) {\n return telegramError(\"Bad Request: chat is not a forum\");\n }\n const messageThreadId = takeNextTelegramMessageId(params.state, chat.id);\n if (messageThreadId === undefined) {\n return telegramError(\"Bad Request: generated ID space is exhausted\");\n }\n return telegramOk({\n icon_color: 0x6fb9f0,\n message_thread_id: messageThreadId,\n name: toStringValue(params.body.name) ?? \"Crabline Topic\",\n });\n }\n case \"editmessagetext\": {\n const text = readTelegramTextField(params.body.text, \"text\", {\n parseMode: params.body.parse_mode,\n required: true,\n });\n if (text instanceof Response) {\n return text;\n }\n const message = createEditedMessage(params.state, params.body, text!);\n return message\n ? telegramOk(message)\n : telegramError(\"Bad Request: chat_id, message_id, and text are required\");\n }\n case \"sendmessage\": {\n const text = readTelegramTextField(params.body.text, \"text\", {\n parseMode: params.body.parse_mode,\n required: true,\n });\n if (text instanceof Response) {\n return text;\n }\n const chat = resolveTelegramChat(params.state, params.body.chat_id);\n if (chat && nextTelegramMessageId(params.state, chat.id) >= Number.MAX_SAFE_INTEGER) {\n return telegramError(\"Bad Request: generated ID space is exhausted\");\n }\n const message = createOutboundMessage(params.state, params.body, text!);\n return message\n ? telegramOk(message)\n : telegramError(\"Bad Request: chat_id and text are required\");\n }\n case \"sendanimation\":\n case \"sendaudio\":\n case \"senddocument\":\n case \"sendphoto\":\n case \"sendvideo\": {\n const mediaKind = method.slice(\"send\".length) as\n | \"animation\"\n | \"audio\"\n | \"document\"\n | \"photo\"\n | \"video\";\n const caption = readTelegramTextField(params.body.caption, \"caption\", {\n parseMode: params.body.parse_mode,\n required: false,\n });\n if (caption instanceof Response) {\n return caption;\n }\n const chat = resolveTelegramChat(params.state, params.body.chat_id);\n if (chat && nextTelegramMessageId(params.state, chat.id) >= Number.MAX_SAFE_INTEGER) {\n return telegramError(\"Bad Request: generated ID space is exhausted\");\n }\n const message = createOutboundMediaMessage(params.state, params.body, mediaKind, caption);\n return message\n ? telegramOk(message)\n : telegramError(`Bad Request: chat_id and ${mediaKind} are required`);\n }\n case \"getupdates\":\n if (params.state.webhook) {\n return telegramError(\"Conflict: can't use getUpdates method while webhook is active\", 409);\n }\n return await handleTelegramGetUpdates(params);\n default:\n return telegramError(`Not Found: unsupported method ${params.method}`, 404);\n }\n}\n\n/** @internal */\nexport async function handleTelegramGetUpdates(params: {\n body: Record<string, unknown>;\n request: IncomingMessage;\n state: TelegramGetUpdatesState;\n}): Promise<Response> {\n const offset = toIntegerValue(params.body.offset);\n const limit = toIntegerValue(params.body.limit) ?? 100;\n const timeout = toIntegerValue(params.body.timeout) ?? 0;\n if (params.body.offset !== undefined && offset === undefined) {\n return telegramError(\"Bad Request: offset must be a safe integer\");\n }\n if (params.body.limit !== undefined && toIntegerValue(params.body.limit) === undefined) {\n return telegramError(\"Bad Request: limit must be a safe integer\");\n }\n if (params.body.timeout !== undefined && toIntegerValue(params.body.timeout) === undefined) {\n return telegramError(\"Bad Request: timeout must be a safe integer\");\n }\n if (limit < 1 || limit > 100) {\n return telegramError(\"Bad Request: limit must be between 1 and 100\");\n }\n if (timeout < 0) {\n return telegramError(\"Bad Request: timeout must be non-negative\");\n }\n\n finishTelegramUpdatePoll(params.state, \"conflict\");\n let updates = takeTelegramUpdates(params.state, offset, limit);\n const deadline = Date.now() + Math.min(timeout * 1_000, 2_147_483_647);\n if (updates.length === 0 && timeout > 0) {\n while (updates.length === 0) {\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n break;\n }\n const pollResult = await waitForTelegramUpdate(\n params.state,\n params.request,\n remainingMs,\n () => hasTelegramUpdates(params.state, offset),\n );\n if (pollResult === \"conflict\") {\n return telegramError(\n \"Conflict: terminated by other getUpdates request; make sure that only one bot instance is running\",\n 409,\n );\n }\n if (pollResult !== \"update\") {\n break;\n }\n updates = takeTelegramUpdates(params.state, offset, limit);\n }\n }\n return telegramOk(updates);\n}\n\nfunction takeTelegramUpdates(\n state: TelegramGetUpdatesState,\n offset: number | undefined,\n limit: number,\n): TelegramUpdate[] {\n if (offset !== undefined && offset < 0) {\n const retainedCount = Math.min(Math.abs(offset), state.updates.length);\n state.updates.splice(0, state.updates.length - retainedCount);\n } else if (offset !== undefined) {\n const firstUnconfirmed = state.updates.findIndex((update) => update.update_id >= offset);\n if (firstUnconfirmed === -1) {\n state.updates.length = 0;\n } else if (firstUnconfirmed > 0) {\n state.updates.splice(0, firstUnconfirmed);\n }\n }\n return state.updates.slice(0, limit);\n}\n\nfunction hasTelegramUpdates(state: TelegramGetUpdatesState, offset: number | undefined): boolean {\n if (offset === undefined || offset < 0) {\n return state.updates.length > 0;\n }\n return state.updates.some((update) => update.update_id >= offset);\n}\n\nfunction finishTelegramUpdatePoll(\n state: TelegramGetUpdatesState,\n result: TelegramUpdatePollResult,\n): void {\n state.activeUpdatePoll?.finish(result);\n}\n\nasync function waitForTelegramUpdate(\n state: TelegramGetUpdatesState,\n request: IncomingMessage,\n timeoutMs: number,\n hasUpdate: () => boolean,\n): Promise<TelegramUpdatePollResult> {\n if (state.closing || request.socket.destroyed) {\n return \"shutdown\";\n }\n return await new Promise<TelegramUpdatePollResult>((resolve) => {\n let settled = false;\n const poll: TelegramUpdatePoll = {\n finish(result) {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n request.socket.off(\"close\", onSocketClose);\n if (state.activeUpdatePoll === poll) {\n state.activeUpdatePoll = undefined;\n }\n resolve(result);\n },\n };\n const onSocketClose = () => poll.finish(\"shutdown\");\n const timer = setTimeout(() => poll.finish(\"timeout\"), timeoutMs);\n timer.unref();\n const previousPoll = state.activeUpdatePoll;\n state.activeUpdatePoll = poll;\n previousPoll?.finish(\"conflict\");\n request.socket.once(\"close\", onSocketClose);\n if (state.closing || request.socket.destroyed) {\n poll.finish(\"shutdown\");\n } else if (hasUpdate()) {\n poll.finish(\"update\");\n }\n });\n}\n\nfunction telegramMethodNotAllowed(): Response {\n const response = telegramError(\"Method Not Allowed\", 405);\n response.headers.set(\"allow\", \"GET, POST\");\n return response;\n}\n\nasync function handleRequest(params: { request: IncomingMessage; state: TelegramServerState }) {\n const url = new URL(params.request.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname === \"/crabline/telegram/inbound\") {\n if (params.request.method !== \"POST\") {\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 parseRequestBody(params.request);\n if (!isJsonObject(body)) {\n return telegramError(\"Bad Request: request body must be a JSON object\");\n }\n return await handleTelegramAdminInbound({\n body,\n request: params.request,\n state: params.state,\n url,\n });\n }\n\n const botPath = requireTelegramBotPath(url.pathname);\n if (!botPath || botPath.token !== params.state.botToken) {\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n }\n const requestMethod = params.request.method ?? \"GET\";\n if (requestMethod !== \"GET\" && requestMethod !== \"POST\") {\n drainRequestBody(params.request);\n return telegramMethodNotAllowed();\n }\n const body = requestMethod === \"GET\" ? queryRecord(url) : await parseRequestBody(params.request);\n if (!isJsonObject(body)) {\n return telegramError(\"Bad Request: can't parse JSON object\");\n }\n const event: TelegramServerEvent = {\n at: new Date().toISOString(),\n body: redactTelegramSecrets(body),\n method: requestMethod,\n path: `/bot<redacted>/${botPath.method}`,\n query: redactTelegramSecrets(queryRecord(url)),\n type: \"api\",\n };\n if (TELEGRAM_SEND_METHODS.has(botPath.method.toLowerCase())) {\n const response = await handleTelegramApi({\n body,\n method: botPath.method,\n request: params.request,\n state: params.state,\n });\n event.accepted = response.ok;\n try {\n await appendEvent(params.state, event);\n } catch (error) {\n if (!event.accepted) {\n throw error;\n }\n }\n return response;\n }\n const response = await handleTelegramApi({\n body,\n method: botPath.method,\n request: params.request,\n state: params.state,\n });\n event.accepted = response.ok;\n await appendEvent(params.state, event);\n return response;\n}\n\nasync function serveRequest(params: {\n request: IncomingMessage;\n response: ServerResponse;\n state: TelegramServerState;\n}): Promise<void> {\n let fetchResponse: Response;\n try {\n fetchResponse = await handleRequest({ request: params.request, state: params.state });\n } catch (error) {\n fetchResponse =\n error instanceof InvalidJsonBodyError\n ? telegramError(\"Bad Request: can't parse JSON object\")\n : error instanceof RequestBodyTooLargeError\n ? telegramError(\"Request Entity Too Large\", 413)\n : jsonResponse({ error: \"internal server error\", ok: false }, 500);\n }\n\n try {\n await writeResponse(params.response, fetchResponse);\n } catch {\n // A disconnected client cannot receive an error fallback. End delivery here\n // so the Node request callback never leaks an unhandled rejection.\n params.response.destroy();\n }\n}\n\nexport async function startTelegramServer(\n params: StartTelegramServerParams = {},\n): Promise<StartedTelegramServer> {\n const host = params.host ?? \"127.0.0.1\";\n if (params.botHasTopicsEnabled !== undefined && typeof params.botHasTopicsEnabled !== \"boolean\") {\n throw new Error(\"botHasTopicsEnabled must be a boolean.\");\n }\n const botId = params.botId ?? 424242;\n if (!Number.isSafeInteger(botId) || botId < 1) {\n throw new Error(\"botId must be a positive safe integer.\");\n }\n const botUsernameValue = params.botUsername ?? \"crabline_bot\";\n const botUsername = botUsernameValue.trim().replace(/^@/u, \"\").toLowerCase();\n if (!TELEGRAM_BOT_USERNAME_PATTERN.test(`@${botUsername}`)) {\n throw new Error(\"botUsername must be a valid 5-32 character Telegram username.\");\n }\n const state: TelegramServerState = {\n activeUpdatePoll: undefined,\n activeWebhookDeliveries: new Set(),\n activeWebhookValidations: new Set(),\n adminToken: params.adminToken ?? randomBytes(24).toString(\"hex\"),\n allowLoopbackHttpWebhook: isLoopbackHost(host),\n botHasTopicsEnabled: params.botHasTopicsEnabled ?? true,\n botId,\n botToken:\n params.botToken ??\n (isLoopbackHost(host)\n ? \"424242:crabline-telegram-token\"\n : `${botId}:${randomBytes(26).toString(\"base64url\")}`),\n botUsername,\n chatsById: new Map(),\n chatsByUsername: new Map(),\n inboundAdmission: Promise.resolve(),\n maxPendingInboundEvents: resolveMaxPendingInboundEvents(params.maxPendingInboundEvents),\n nextMessageIds: new Map(),\n nextUpdateId: 1,\n onEvent: params.onEvent,\n recorderPath: params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"telegram.jsonl\"),\n restrictWebhookTargets: true,\n closing: false,\n updates: [],\n webhook: undefined,\n webhookAdmission: Promise.resolve(),\n webhookDelivery: undefined,\n webhookRetryAttempts: 0,\n webhookRetryTimer: undefined,\n webhookRetryUpdateId: undefined,\n };\n const port = params.port ?? 0;\n const server = createServer((request, response) => {\n void serveRequest({ request, response, state });\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, host, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address();\n if (!address || typeof address === \"string\") {\n throw new CrablineError(\"Unable to resolve Telegram local server address.\", {\n kind: \"connectivity\",\n });\n }\n const baseUrl = `http://${formatUrlHost(host)}:${address.port}`;\n return {\n async close() {\n state.closing = true;\n finishTelegramUpdatePoll(state, \"shutdown\");\n clearTelegramWebhookRetry(state);\n for (const controller of state.activeWebhookDeliveries) {\n controller.abort();\n }\n for (const controller of state.activeWebhookValidations) {\n controller.abort();\n }\n await state.webhookDelivery;\n await state.webhookAdmission;\n await state.inboundAdmission;\n await closeServer(server);\n },\n manifest: {\n adminToken: state.adminToken,\n baseUrl,\n botToken: state.botToken,\n endpoints: {\n adminInboundUrl: `${baseUrl}/crabline/telegram/inbound`,\n apiRoot: baseUrl,\n },\n env: {\n TELEGRAM_BOT_TOKEN: state.botToken,\n },\n provider: \"telegram\",\n recorderPath: state.recorderPath,\n version: 1,\n },\n };\n}\n"]}
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../src/servers/telegram.ts"],"names":[],"mappings":"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","sourcesContent":["import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { Buffer } from \"node:buffer\";\nimport path from \"node:path\";\nimport { CrablineError } from \"../core/errors.js\";\nimport {\n adminAuthError,\n closeServer,\n createServerClose,\n drainRequestBody,\n formatUrlHost,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n isJsonMediaType,\n isLoopbackHost,\n jsonResponse,\n queryRecord,\n readBody,\n RequestBodyTooLargeError,\n writeResponse,\n} from \"./http.js\";\nimport { createServerRecorder, type ServerEventObserver, type ServerRecorder } from \"./recorder.js\";\nimport { resolveMaxPendingInboundEvents } from \"./pending-events.js\";\nimport {\n postWebhookRequest,\n validateWebhookTarget,\n type WebhookAddress,\n} from \"./webhook-target.js\";\nimport {\n canonicalizeTelegramUsername,\n isTelegramUsernameChatId,\n TELEGRAM_BOT_USERNAME_PATTERN,\n TELEGRAM_NATIVE_CHAT_ID_MAX,\n telegramUsernameChatId,\n} from \"./telegram-identity.js\";\n\nconst TELEGRAM_MAX_REQUEST_BODY_BYTES = 50 * 1024 * 1024;\nconst TELEGRAM_MAX_MULTIPART_HEADER_BYTES = 16 * 1024;\nconst TELEGRAM_MAX_MULTIPART_PARTS = 128;\nconst TELEGRAM_MAX_MULTIPART_TEXT_BYTES = 1024 * 1024;\nconst TELEGRAM_WEBHOOK_MAX_BACKOFF_EXPONENT = 5;\nconst TELEGRAM_WEBHOOK_RETRY_BASE_MS = 100;\nconst TELEGRAM_WEBHOOK_DELIVERY_TIMEOUT_MS = 3_000;\nconst MAX_ACTIVE_TELEGRAM_WEBHOOK_VALIDATIONS = 8;\nconst TELEGRAM_WEBHOOK_SECRET_PATTERN = /^[A-Za-z0-9_-]{1,256}(?![\\s\\S])/u;\nconst TELEGRAM_MAX_TEXT_LENGTH = 4096;\nconst TELEGRAM_MAX_CAPTION_LENGTH = 1024;\nconst TELEGRAM_HTML_TAG_PATTERN =\n /<\\/?(?:a|b|blockquote|code|del|em|i|ins|pre|s|span|strike|strong|tg-emoji|tg-spoiler|tg-time|u)(?:\\s+[^<>]*)?>/giu;\nconst TELEGRAM_HTML_ENTITY_PATTERN = /&(?:#\\d+|#x[\\da-f]+|amp|gt|lt|quot);/giu;\nconst TELEGRAM_SEND_METHODS = new Set([\n \"sendanimation\",\n \"sendaudio\",\n \"senddocument\",\n \"sendmessage\",\n \"sendphoto\",\n \"sendvideo\",\n]);\nconst TELEGRAM_MEDIA_FIELDS = [\n \"animation\",\n \"audio\",\n \"document\",\n \"paid_media\",\n \"photo\",\n \"sticker\",\n \"story\",\n \"video\",\n \"video_note\",\n \"voice\",\n] as const;\nconst TELEGRAM_UNSUPPORTED_UPDATE_FIELDS = [\n \"business_connection\",\n \"business_message\",\n \"callback_query\",\n \"channel_post\",\n \"chat_boost\",\n \"chat_join_request\",\n \"chat_member\",\n \"chosen_inline_result\",\n \"deleted_business_messages\",\n \"edited_business_message\",\n \"edited_channel_post\",\n \"edited_message\",\n \"guest_message\",\n \"inline_query\",\n \"managed_bot\",\n \"message_reaction\",\n \"message_reaction_count\",\n \"my_chat_member\",\n \"poll\",\n \"poll_answer\",\n \"pre_checkout_query\",\n \"purchased_paid_media\",\n \"removed_chat_boost\",\n \"shipping_query\",\n] as const;\nconst TELEGRAM_NEW_MESSAGE_UPDATE_FIELDS = [\"business_message\", \"channel_post\", \"message\"] as const;\nconst TELEGRAM_MESSAGE_REFERENCE_FIELDS = [\n \"edited_business_message\",\n \"edited_channel_post\",\n \"edited_message\",\n] as const;\nconst TELEGRAM_MESSAGE_UPDATE_FIELDS = [\n ...TELEGRAM_NEW_MESSAGE_UPDATE_FIELDS,\n ...TELEGRAM_MESSAGE_REFERENCE_FIELDS,\n] as const;\nconst TELEGRAM_CHAT_UPDATE_FIELDS = [\n \"chat_boost\",\n \"chat_join_request\",\n \"chat_member\",\n \"deleted_business_messages\",\n \"message_reaction\",\n \"message_reaction_count\",\n \"my_chat_member\",\n \"removed_chat_boost\",\n] as const;\n\ntype TelegramServerEvent = {\n accepted?: boolean | undefined;\n at: string;\n body?: unknown;\n method: string;\n path: string;\n query: Record<string, string>;\n type: \"admin\" | \"api\";\n};\n\ntype TelegramWebhook = {\n lastErrorDate?: number;\n lastErrorMessage?: string;\n secretToken?: string;\n url: string;\n};\n\ntype TelegramServerState = {\n activeUpdatePoll: TelegramUpdatePoll | undefined;\n activeWebhookDeliveries: Set<AbortController>;\n activeWebhookValidations: Set<AbortController>;\n adminToken: string;\n allowLoopbackHttpWebhook: boolean;\n botHasTopicsEnabled: boolean;\n botId: number;\n botToken: string;\n botUsername: string;\n chatsById: Map<number, TelegramChat>;\n chatsByUsername: Map<string, TelegramChat>;\n closing: boolean;\n inboundAdmission: Promise<void>;\n maxPendingInboundEvents: number;\n nextMessageIds: Map<string, number>;\n nextUpdateId: number;\n recorder: ServerRecorder;\n recorderPath: string;\n restrictWebhookTargets: boolean;\n updates: TelegramUpdate[];\n webhook: TelegramWebhook | undefined;\n webhookAdmission: Promise<void>;\n webhookDelivery: Promise<Response | undefined> | undefined;\n webhookRetryAttempts: number;\n webhookRetryTimer: NodeJS.Timeout | undefined;\n webhookRetryUpdateId: number | undefined;\n};\n\ntype TelegramUpdatePoll = {\n finish(result: TelegramUpdatePollResult): void;\n};\n\ntype TelegramUpdatePollResult = \"conflict\" | \"shutdown\" | \"timeout\" | \"update\";\n\ntype TelegramGetUpdatesState = Pick<\n TelegramServerState,\n \"activeUpdatePoll\" | \"closing\" | \"updates\"\n>;\n\nconst TELEGRAM_MULTIPART_FILE = Symbol(\"telegramMultipartFile\");\n\ntype TelegramMultipartFile = {\n [TELEGRAM_MULTIPART_FILE]: true;\n contentDigest: string;\n fileName: string;\n};\n\ntype TelegramMultipartDisposition = {\n fileName?: string | undefined;\n name: string;\n};\n\ntype TelegramMimeParameter = {\n quoted: boolean;\n value: string;\n};\n\ntype TelegramChat = {\n id: number;\n is_forum?: true;\n title?: string;\n type: \"channel\" | \"group\" | \"private\" | \"supergroup\";\n username?: string;\n};\n\ntype TelegramMessage = {\n chat: TelegramChat;\n animation?: {\n duration: number;\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n height: number;\n mime_type?: string;\n width: number;\n };\n caption?: string;\n date: number;\n document?: {\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n mime_type?: string;\n };\n audio?: {\n duration: number;\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n mime_type?: string;\n };\n entities?: Array<{\n custom_emoji_id?: string;\n language?: string;\n length: number;\n offset: number;\n type: string;\n url?: string;\n user?: Record<string, unknown>;\n }>;\n from: {\n first_name: string;\n id: number;\n is_bot: boolean;\n username?: string;\n };\n message_id: number;\n message_thread_id?: number;\n photo?: Array<{\n file_id: string;\n file_unique_id: string;\n height: number;\n width: number;\n }>;\n text?: string;\n video?: {\n duration: number;\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n height: number;\n mime_type?: string;\n width: number;\n };\n};\n\ntype TelegramUpdate = {\n message: TelegramMessage;\n update_id: number;\n};\n\nexport type TelegramServerManifest = {\n adminToken: string;\n baseUrl: string;\n botToken: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n };\n env: {\n TELEGRAM_BOT_TOKEN: string;\n };\n provider: \"telegram\";\n recorderPath: string;\n version: 1;\n};\n\nexport type StartedTelegramServer = {\n close(): Promise<void>;\n manifest: TelegramServerManifest;\n};\n\nexport type StartTelegramServerParams = {\n adminToken?: string | undefined;\n botHasTopicsEnabled?: boolean | undefined;\n botId?: number | undefined;\n botToken?: string | undefined;\n botUsername?: string | undefined;\n host?: string | undefined;\n onEvent?: ServerEventObserver | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n maxPendingInboundEvents?: number | undefined;\n};\n\nfunction telegramOk(result: unknown): Response {\n return jsonResponse({ ok: true, result });\n}\n\nfunction telegramError(description: string, status = 400): Response {\n return jsonResponse({ description, error_code: status, ok: false }, status);\n}\n\nasync function parseRequestBody(request: IncomingMessage): Promise<unknown> {\n const contentType = request.headers[\"content-type\"] ?? \"\";\n const contentTypes = Array.isArray(contentType) ? contentType : [contentType];\n const multipartType = contentTypes.find((entry) =>\n entry.toLowerCase().includes(\"multipart/form-data\"),\n );\n if (multipartType) {\n return await parseMultipartFormDataRequest(request, multipartType);\n }\n\n const body = await readBody(request, TELEGRAM_MAX_REQUEST_BODY_BYTES);\n if (body.length === 0) {\n return {};\n }\n if (contentTypes.some(isJsonMediaType)) {\n try {\n return JSON.parse(body.toString(\"utf8\")) as unknown;\n } catch (error) {\n throw new InvalidJsonBodyError(error);\n }\n }\n const params = new URLSearchParams(body.toString(\"utf8\"));\n return Object.fromEntries(params.entries());\n}\n\nfunction invalidTelegramMultipartBody(message: string): InvalidJsonBodyError {\n return new InvalidJsonBodyError(new Error(message));\n}\n\nfunction parseTelegramMimeParameters(\n value: string,\n options: { decodeQuotedPairs?: boolean } = {},\n): {\n parameters: Map<string, TelegramMimeParameter>;\n type: string;\n} {\n const separator = value.indexOf(\";\");\n const type = value\n .slice(0, separator < 0 ? value.length : separator)\n .trim()\n .toLowerCase();\n const parameters = new Map<string, TelegramMimeParameter>();\n let index = separator < 0 ? value.length : separator + 1;\n while (index < value.length) {\n while (index < value.length && /[\\t ;]/u.test(value[index] ?? \"\")) {\n index += 1;\n }\n if (index >= value.length) {\n break;\n }\n\n const nameStart = index;\n while (index < value.length && /[!#$%&'*+\\-.^_`|~0-9A-Za-z]/u.test(value[index] ?? \"\")) {\n index += 1;\n }\n const name = value.slice(nameStart, index).toLowerCase();\n while (index < value.length && /[\\t ]/u.test(value[index] ?? \"\")) {\n index += 1;\n }\n if (!name || value[index] !== \"=\") {\n throw invalidTelegramMultipartBody(\"Multipart header contains a malformed parameter.\");\n }\n index += 1;\n while (index < value.length && /[\\t ]/u.test(value[index] ?? \"\")) {\n index += 1;\n }\n\n let parameterValue = \"\";\n let quoted = false;\n if (value[index] === '\"') {\n quoted = true;\n index += 1;\n let closed = false;\n while (index < value.length) {\n const character = value[index];\n index += 1;\n if (character === \"\\\\\" && options.decodeQuotedPairs) {\n if (index >= value.length) {\n break;\n }\n const quotedCharacter = value[index];\n if (quotedCharacter === \"\\r\" || quotedCharacter === \"\\n\") {\n break;\n }\n parameterValue += quotedCharacter;\n index += 1;\n } else if (character === '\"') {\n closed = true;\n break;\n } else if (character === \"\\r\" || character === \"\\n\") {\n break;\n } else {\n parameterValue += character;\n }\n }\n if (!closed) {\n throw invalidTelegramMultipartBody(\"Multipart header contains an unterminated quote.\");\n }\n while (index < value.length && /[\\t ]/u.test(value[index] ?? \"\")) {\n index += 1;\n }\n if (index < value.length && value[index] !== \";\") {\n throw invalidTelegramMultipartBody(\"Multipart header contains trailing parameter data.\");\n }\n } else {\n const parameterStart = index;\n while (index < value.length && value[index] !== \";\") {\n if (value[index] === \"\\r\" || value[index] === \"\\n\") {\n throw invalidTelegramMultipartBody(\"Multipart header contains a line break.\");\n }\n index += 1;\n }\n parameterValue = value.slice(parameterStart, index).trim();\n }\n parameters.set(name, { quoted, value: parameterValue });\n if (value[index] === \";\") {\n index += 1;\n }\n }\n return { parameters, type };\n}\n\nfunction parseTelegramMultipartBoundary(contentType: string): Buffer {\n const parsed = parseTelegramMimeParameters(contentType, { decodeQuotedPairs: true });\n const boundary = parsed.parameters.get(\"boundary\")?.value;\n if (\n parsed.type !== \"multipart/form-data\" ||\n !boundary ||\n boundary.length > 70 ||\n boundary.endsWith(\" \") ||\n !/^[0-9A-Za-z'()+_,./:=? -]+$/u.test(boundary)\n ) {\n throw invalidTelegramMultipartBody(\"Multipart boundary is missing or invalid.\");\n }\n return Buffer.from(`--${boundary}`, \"ascii\");\n}\n\nfunction decodeTelegramMultipartParameter(parameter: TelegramMimeParameter): string {\n return parameter.quoted\n ? parameter.value.replace(/%0A/giu, \"\\n\").replace(/%0D/giu, \"\\r\").replace(/%22/giu, '\"')\n : parameter.value;\n}\n\nfunction decodeTelegramMultipartExtendedParameter(parameter: TelegramMimeParameter): string {\n const extended = /^([^']*)'[^']*'(.*)$/u.exec(parameter.value);\n if (!extended) {\n return decodeTelegramMultipartParameter(parameter);\n }\n const charset = extended[1]?.toLowerCase();\n if (charset !== \"utf-8\" && charset !== \"us-ascii\") {\n return decodeTelegramMultipartParameter(parameter);\n }\n try {\n return decodeURIComponent(extended[2] ?? \"\");\n } catch {\n return extended[2] ?? \"\";\n }\n}\n\nfunction parseTelegramMultipartDisposition(headerBlock: Buffer): TelegramMultipartDisposition {\n let contentDisposition: string | undefined;\n for (const line of headerBlock.toString(\"utf8\").split(\"\\r\\n\")) {\n const separator = line.indexOf(\":\");\n if (separator <= 0) {\n throw invalidTelegramMultipartBody(\"Multipart part contains a malformed header.\");\n }\n if (line.slice(0, separator).trim().toLowerCase() === \"content-disposition\") {\n contentDisposition = line.slice(separator + 1).trim();\n }\n }\n if (!contentDisposition) {\n throw invalidTelegramMultipartBody(\"Multipart part is missing a form-data disposition.\");\n }\n\n const parsed = parseTelegramMimeParameters(contentDisposition, { decodeQuotedPairs: true });\n if (parsed.type !== \"form-data\") {\n throw invalidTelegramMultipartBody(\"Multipart part is missing a form-data disposition.\");\n }\n const rawName = parsed.parameters.get(\"name\");\n if (rawName === undefined) {\n throw invalidTelegramMultipartBody(\"Multipart part is missing a field name.\");\n }\n const rawFileName = parsed.parameters.get(\"filename\");\n const rawExtendedFileName = parsed.parameters.get(\"filename*\");\n return {\n ...(rawExtendedFileName !== undefined\n ? { fileName: decodeTelegramMultipartExtendedParameter(rawExtendedFileName) }\n : rawFileName !== undefined\n ? { fileName: decodeTelegramMultipartParameter(rawFileName) }\n : {}),\n name: decodeTelegramMultipartParameter(rawName),\n };\n}\n\nclass TelegramMultipartReader {\n readonly #iterator: AsyncIterator<Buffer | string>;\n #buffer: Buffer<ArrayBufferLike> = Buffer.alloc(0);\n #ended = false;\n #totalBytes = 0;\n\n constructor(\n private readonly request: IncomingMessage,\n private readonly maxBytes: number,\n ) {\n this.#iterator = request[Symbol.asyncIterator]() as AsyncIterator<Buffer | string>;\n }\n\n async readUntil(delimiter: Buffer, maxBytes: number): Promise<Buffer> {\n const chunks: Buffer[] = [];\n let length = 0;\n while (true) {\n const delimiterIndex = this.#buffer.indexOf(delimiter);\n if (delimiterIndex >= 0) {\n length += delimiterIndex;\n if (length > maxBytes) {\n throw new RequestBodyTooLargeError(maxBytes);\n }\n chunks.push(this.#buffer.subarray(0, delimiterIndex));\n this.#consume(delimiterIndex + delimiter.length);\n return Buffer.concat(chunks, length);\n }\n\n const emitLength = Math.max(0, this.#buffer.length - delimiter.length + 1);\n if (emitLength > 0) {\n length += emitLength;\n if (length > maxBytes) {\n throw new RequestBodyTooLargeError(maxBytes);\n }\n chunks.push(this.#buffer.subarray(0, emitLength));\n this.#consume(emitLength);\n }\n if (!(await this.#readMore())) {\n throw invalidTelegramMultipartBody(\"Multipart delimiter is incomplete.\");\n }\n }\n }\n\n async readInitialBoundary(boundary: Buffer, maxPreambleBytes: number): Promise<\"final\" | \"next\"> {\n const lineBoundary = Buffer.concat([Buffer.from(\"\\r\\n\"), boundary]);\n let preambleBytes = 0;\n let checkBodyStart = true;\n while (true) {\n if (checkBodyStart) {\n await this.#ensure(boundary.length + 2);\n checkBodyStart = false;\n if (this.#buffer.subarray(0, boundary.length).equals(boundary)) {\n const suffix = await this.#readBoundarySuffix(boundary.length);\n if (suffix) {\n this.#consume(suffix.consumedBytes);\n return suffix.kind;\n }\n }\n }\n\n const boundaryIndex = this.#buffer.indexOf(lineBoundary);\n if (boundaryIndex >= 0) {\n const suffixOffset = boundaryIndex + lineBoundary.length;\n if (this.#buffer.length < suffixOffset + 2) {\n if (boundaryIndex > 0) {\n preambleBytes += boundaryIndex;\n if (preambleBytes > maxPreambleBytes) {\n throw new RequestBodyTooLargeError(maxPreambleBytes);\n }\n this.#consume(boundaryIndex);\n }\n if (!(await this.#readMore())) {\n throw invalidTelegramMultipartBody(\"Multipart boundary is incomplete.\");\n }\n continue;\n }\n\n const suffix = await this.#readBoundarySuffix(suffixOffset);\n if (suffix) {\n preambleBytes += boundaryIndex;\n if (preambleBytes > maxPreambleBytes) {\n throw new RequestBodyTooLargeError(maxPreambleBytes);\n }\n this.#consume(suffix.consumedBytes);\n return suffix.kind;\n }\n\n const emitLength = suffixOffset;\n preambleBytes += emitLength;\n if (preambleBytes > maxPreambleBytes) {\n throw new RequestBodyTooLargeError(maxPreambleBytes);\n }\n this.#consume(emitLength);\n continue;\n }\n\n const emitLength = Math.max(0, this.#buffer.length - lineBoundary.length + 1);\n if (emitLength > 0) {\n preambleBytes += emitLength;\n if (preambleBytes > maxPreambleBytes) {\n throw new RequestBodyTooLargeError(maxPreambleBytes);\n }\n this.#consume(emitLength);\n }\n if (!(await this.#readMore())) {\n throw invalidTelegramMultipartBody(\"Multipart body is missing its initial boundary.\");\n }\n }\n }\n\n async readPartBody(\n boundaryMarker: Buffer,\n onChunk: (chunk: Buffer) => void,\n ): Promise<\"final\" | \"next\"> {\n while (true) {\n const boundaryIndex = this.#buffer.indexOf(boundaryMarker);\n if (boundaryIndex >= 0) {\n const suffixOffset = boundaryIndex + boundaryMarker.length;\n if (this.#buffer.length < suffixOffset + 2) {\n if (boundaryIndex > 0) {\n onChunk(this.#buffer.subarray(0, boundaryIndex));\n this.#consume(boundaryIndex);\n }\n if (!(await this.#readMore())) {\n throw invalidTelegramMultipartBody(\"Multipart boundary is incomplete.\");\n }\n continue;\n }\n\n const suffix = await this.#readBoundarySuffix(suffixOffset);\n if (suffix) {\n if (boundaryIndex > 0) {\n onChunk(this.#buffer.subarray(0, boundaryIndex));\n }\n this.#consume(suffix.consumedBytes);\n return suffix.kind;\n }\n\n const emitLength = suffixOffset;\n onChunk(this.#buffer.subarray(0, emitLength));\n this.#consume(emitLength);\n continue;\n }\n\n const emitLength = Math.max(0, this.#buffer.length - boundaryMarker.length + 1);\n if (emitLength > 0) {\n onChunk(this.#buffer.subarray(0, emitLength));\n this.#consume(emitLength);\n }\n if (!(await this.#readMore())) {\n throw invalidTelegramMultipartBody(\"Multipart body is missing its closing boundary.\");\n }\n }\n }\n\n async consumeRemainder(): Promise<void> {\n while (await this.#readMore()) {\n this.#buffer = Buffer.alloc(0);\n }\n }\n\n #consume(length: number): void {\n this.#buffer = this.#buffer.subarray(length);\n }\n\n async #ensure(length: number): Promise<void> {\n while (this.#buffer.length < length) {\n if (!(await this.#readMore())) {\n throw invalidTelegramMultipartBody(\"Multipart body ended unexpectedly.\");\n }\n }\n }\n\n async #readBoundarySuffix(\n suffixOffset: number,\n ): Promise<{ consumedBytes: number; kind: \"final\" | \"next\" } | undefined> {\n await this.#ensure(suffixOffset + 2);\n const suffix = this.#buffer.subarray(suffixOffset, suffixOffset + 2);\n const final = suffix.equals(Buffer.from(\"--\"));\n let lineEnd = suffixOffset + (final ? 2 : 0);\n while (true) {\n while (\n lineEnd < this.#buffer.length &&\n (this.#buffer[lineEnd] === 0x20 || this.#buffer[lineEnd] === 0x09)\n ) {\n lineEnd += 1;\n if (lineEnd - suffixOffset > TELEGRAM_MAX_MULTIPART_HEADER_BYTES) {\n return undefined;\n }\n }\n if (lineEnd >= this.#buffer.length) {\n if (await this.#readMore()) {\n continue;\n }\n return final ? { consumedBytes: lineEnd, kind: \"final\" } : undefined;\n }\n if (this.#buffer[lineEnd] !== 0x0d) {\n return undefined;\n }\n if (lineEnd + 1 >= this.#buffer.length) {\n if (await this.#readMore()) {\n continue;\n }\n return undefined;\n }\n return this.#buffer[lineEnd + 1] === 0x0a\n ? { consumedBytes: lineEnd + 2, kind: final ? \"final\" : \"next\" }\n : undefined;\n }\n }\n\n async #readMore(): Promise<boolean> {\n if (this.#ended) {\n return false;\n }\n const next = await this.#iterator.next();\n if (next.done) {\n this.#ended = true;\n return false;\n }\n const chunk = Buffer.isBuffer(next.value) ? next.value : Buffer.from(next.value);\n this.#totalBytes += chunk.length;\n if (this.#totalBytes > this.maxBytes) {\n throw new RequestBodyTooLargeError(this.maxBytes);\n }\n this.#buffer =\n this.#buffer.length === 0\n ? chunk\n : Buffer.concat([this.#buffer, chunk], this.#buffer.length + chunk.length);\n return true;\n }\n}\n\nfunction enforceTelegramMultipartContentLength(request: IncomingMessage): void {\n const contentLengthHeader = request.headers[\"content-length\"];\n const contentLength = Array.isArray(contentLengthHeader)\n ? contentLengthHeader[0]\n : contentLengthHeader;\n if (contentLength && /^\\d+$/u.test(contentLength)) {\n const bytes = Number(contentLength);\n if (!Number.isSafeInteger(bytes) || bytes > TELEGRAM_MAX_REQUEST_BODY_BYTES) {\n drainRequestBody(request);\n throw new RequestBodyTooLargeError(TELEGRAM_MAX_REQUEST_BODY_BYTES);\n }\n }\n}\n\nasync function parseMultipartFormDataRequest(\n request: IncomingMessage,\n contentType: string,\n): Promise<Record<string, unknown>> {\n enforceTelegramMultipartContentLength(request);\n try {\n const boundary = parseTelegramMultipartBoundary(contentType);\n const bodyBoundary = Buffer.concat([Buffer.from(\"\\r\\n\"), boundary]);\n const reader = new TelegramMultipartReader(request, TELEGRAM_MAX_REQUEST_BODY_BYTES);\n const fields = Object.create(null) as Record<string, unknown>;\n let retainedTextBytes = 0;\n let partCount = 0;\n let boundaryKind = await reader.readInitialBoundary(\n boundary,\n TELEGRAM_MAX_MULTIPART_HEADER_BYTES,\n );\n while (boundaryKind !== \"final\") {\n partCount += 1;\n if (partCount > TELEGRAM_MAX_MULTIPART_PARTS) {\n throw new RequestBodyTooLargeError(TELEGRAM_MAX_MULTIPART_PARTS);\n }\n const disposition = parseTelegramMultipartDisposition(\n await reader.readUntil(Buffer.from(\"\\r\\n\\r\\n\"), TELEGRAM_MAX_MULTIPART_HEADER_BYTES),\n );\n const digest = disposition.fileName === undefined ? undefined : createHash(\"sha256\");\n const textChunks: Buffer[] = [];\n let textLength = 0;\n boundaryKind = await reader.readPartBody(bodyBoundary, (chunk) => {\n if (digest) {\n digest.update(chunk);\n return;\n }\n retainedTextBytes += chunk.length;\n textLength += chunk.length;\n if (retainedTextBytes > TELEGRAM_MAX_MULTIPART_TEXT_BYTES) {\n throw new RequestBodyTooLargeError(TELEGRAM_MAX_MULTIPART_TEXT_BYTES);\n }\n textChunks.push(Buffer.from(chunk));\n });\n fields[disposition.name] =\n digest && disposition.fileName !== undefined\n ? ({\n [TELEGRAM_MULTIPART_FILE]: true,\n contentDigest: digest.digest(\"base64url\"),\n fileName: disposition.fileName,\n } satisfies TelegramMultipartFile)\n : Buffer.concat(textChunks, textLength).toString(\"utf8\");\n }\n await reader.consumeRemainder();\n return fields;\n } catch (error) {\n drainRequestBody(request);\n throw error;\n }\n}\n\nfunction requireTelegramBotPath(pathname: string): { method: string; token: string } | undefined {\n const match = /^\\/bot([^/]+)\\/([A-Za-z][A-Za-z0-9_]*)$/u.exec(pathname);\n if (!match?.[1] || !match[2]) {\n return undefined;\n }\n return { method: match[2], token: match[1] };\n}\n\nfunction toStringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0\n ? value\n : typeof value === \"number\" || typeof value === \"bigint\"\n ? value.toString()\n : undefined;\n}\n\nfunction toIntegerValue(value: unknown): number | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue || !/^-?\\d+$/u.test(stringValue)) {\n return undefined;\n }\n const integerValue = Number(stringValue);\n return Number.isSafeInteger(integerValue) ? integerValue : undefined;\n}\n\nfunction toBooleanValue(value: unknown): boolean {\n return value === true || (typeof value === \"string\" && value.toLowerCase() === \"true\");\n}\n\nfunction telegramChatId(value: unknown): number | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue) {\n return undefined;\n }\n if (/^-?\\d+$/u.test(stringValue)) {\n return telegramNumericChatId(stringValue);\n }\n return telegramUsernameChatId(stringValue);\n}\n\nfunction telegramNumericChatId(value: unknown): number | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue || !/^-?\\d+$/u.test(stringValue)) {\n return undefined;\n }\n const integerValue = BigInt(stringValue);\n if (\n integerValue === 0n ||\n integerValue < -TELEGRAM_NATIVE_CHAT_ID_MAX ||\n integerValue > TELEGRAM_NATIVE_CHAT_ID_MAX\n ) {\n return undefined;\n }\n return Number(integerValue);\n}\n\nfunction telegramStoredChatId(value: unknown): number | undefined {\n const nativeChatId = telegramNumericChatId(value);\n if (nativeChatId !== undefined) {\n return nativeChatId;\n }\n const chatId = toIntegerValue(value);\n return chatId !== undefined && isTelegramUsernameChatId(chatId) ? chatId : undefined;\n}\n\nasync function appendEvent(state: TelegramServerState, event: TelegramServerEvent) {\n await state.recorder.record(event);\n}\n\nfunction isTelegramMultipartFile(value: unknown): value is TelegramMultipartFile {\n return (\n typeof value === \"object\" &&\n value !== null &&\n TELEGRAM_MULTIPART_FILE in value &&\n value[TELEGRAM_MULTIPART_FILE] === true\n );\n}\n\nfunction redactTelegramSecrets(body: Record<string, string>): Record<string, string>;\nfunction redactTelegramSecrets(body: Record<string, unknown>): Record<string, unknown>;\nfunction redactTelegramSecrets(body: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(body).map(([key, value]) => [\n key,\n key === \"secret_token\"\n ? \"<redacted>\"\n : isTelegramMultipartFile(value)\n ? value.fileName\n : value,\n ]),\n );\n}\n\nfunction createBotUser(state: TelegramServerState) {\n return {\n can_join_groups: true,\n can_read_all_group_messages: true,\n first_name: \"Crabline\",\n ...(state.botHasTopicsEnabled ? { has_topics_enabled: true } : {}),\n id: state.botId,\n is_bot: true,\n supports_inline_queries: false,\n username: state.botUsername,\n };\n}\n\nfunction inferTelegramChatType(chatId: number): TelegramChat[\"type\"] {\n return chatId >= 0\n ? \"private\"\n : String(chatId).startsWith(\"-100\") || isTelegramUsernameChatId(chatId)\n ? \"supergroup\"\n : \"group\";\n}\n\nfunction createChat(chatId: number): TelegramChat {\n return {\n id: chatId,\n type: inferTelegramChatType(chatId),\n };\n}\n\nfunction telegramDestinationUsername(value: unknown): string | undefined {\n const username = toStringValue(value);\n return username ? canonicalizeTelegramUsername(username) : undefined;\n}\n\nfunction telegramStoredUsername(value: unknown): string | undefined {\n const username = toStringValue(value)?.trim();\n if (!username) {\n return undefined;\n }\n return canonicalizeTelegramUsername(username.startsWith(\"@\") ? username : `@${username}`)?.slice(\n 1,\n );\n}\n\nfunction telegramChatType(value: unknown): TelegramChat[\"type\"] | undefined {\n return value === \"channel\" || value === \"group\" || value === \"private\" || value === \"supergroup\"\n ? value\n : undefined;\n}\n\nfunction registerTelegramChat(state: TelegramServerState, chat: TelegramChat): void {\n const previous = state.chatsById.get(chat.id);\n const previousUsername = telegramStoredUsername(previous?.username);\n if (previousUsername && state.chatsByUsername.get(previousUsername)?.id === chat.id) {\n state.chatsByUsername.delete(previousUsername);\n }\n const username = telegramStoredUsername(chat.username);\n const stored: TelegramChat = {\n id: chat.id,\n ...(chat.type === \"supergroup\" && chat.is_forum === true ? { is_forum: true } : {}),\n ...(chat.title ? { title: chat.title } : {}),\n type: chat.type,\n ...(username ? { username } : {}),\n };\n state.chatsById.set(chat.id, stored);\n if (username) {\n state.chatsByUsername.set(username, stored);\n }\n}\n\nfunction resolveTelegramChat(state: TelegramServerState, value: unknown): TelegramChat | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue) {\n return undefined;\n }\n if (/^-?\\d+$/u.test(stringValue)) {\n const chatId = telegramChatId(stringValue);\n if (chatId === undefined) {\n return undefined;\n }\n return state.chatsById.get(chatId) ?? createChat(chatId);\n }\n const username = telegramDestinationUsername(stringValue);\n if (!username) {\n return undefined;\n }\n const storedUsername = username.slice(1);\n const registered = state.chatsByUsername.get(storedUsername);\n if (registered) {\n return registered;\n }\n const chatId = telegramUsernameChatId(username);\n return chatId === undefined\n ? undefined\n : {\n id: chatId,\n type: inferTelegramChatType(chatId),\n username: storedUsername,\n };\n}\n\nfunction telegramChatFromRecord(value: unknown): TelegramChat | undefined {\n if (!isJsonObject(value)) {\n return undefined;\n }\n const id = telegramStoredChatId(value.id);\n const type = telegramChatType(value.type);\n if (id === undefined || !type) {\n return undefined;\n }\n const username = telegramStoredUsername(value.username);\n const title = toStringValue(value.title);\n const isForum = value.is_forum === true;\n if (isForum && type !== \"supergroup\") {\n return undefined;\n }\n return {\n id,\n ...(isForum ? { is_forum: true } : {}),\n ...(title ? { title } : {}),\n type,\n ...(username ? { username } : {}),\n };\n}\n\nfunction registerTelegramMessageChat(\n state: TelegramServerState,\n message: Record<string, unknown>,\n): void {\n const chat = telegramChatFromRecord(message.chat);\n if (!chat) {\n return;\n }\n registerTelegramChat(state, chat);\n}\n\nfunction registerTelegramUpdateChats(state: TelegramServerState, body: Record<string, unknown>) {\n for (const field of TELEGRAM_MESSAGE_UPDATE_FIELDS) {\n const message = body[field];\n if (!isJsonObject(message)) {\n continue;\n }\n registerTelegramMessageChat(state, message);\n }\n const callbackQuery = isJsonObject(body.callback_query) ? body.callback_query : undefined;\n const callbackMessage =\n callbackQuery && isJsonObject(callbackQuery.message) ? callbackQuery.message : undefined;\n if (callbackMessage) {\n registerTelegramMessageChat(state, callbackMessage);\n }\n for (const field of TELEGRAM_CHAT_UPDATE_FIELDS) {\n const update = body[field];\n if (!isJsonObject(update)) {\n continue;\n }\n const chat = telegramChatFromRecord(update.chat);\n if (chat) {\n registerTelegramChat(state, chat);\n }\n }\n}\n\nfunction telegramChatKey(chatId: number): string {\n return `number:${chatId}`;\n}\n\nfunction nextTelegramMessageId(state: TelegramServerState, chatId: number): number {\n return state.nextMessageIds.get(telegramChatKey(chatId)) ?? 1;\n}\n\nfunction takeNextTelegramMessageId(state: TelegramServerState, chatId: number): number | undefined {\n const messageId = nextTelegramMessageId(state, chatId);\n if (messageId >= Number.MAX_SAFE_INTEGER) {\n return undefined;\n }\n state.nextMessageIds.set(telegramChatKey(chatId), messageId + 1);\n return messageId;\n}\n\nfunction createOutboundMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n text: string,\n): TelegramMessage | undefined {\n const chat = resolveTelegramChat(state, body.chat_id);\n if (!chat) {\n return undefined;\n }\n const parsedThreadId = telegramMessageThreadId(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n if (parsedThreadId !== undefined && !canTargetTelegramTopic(state, chat)) {\n return undefined;\n }\n const messageId = takeNextTelegramMessageId(state, chat.id);\n if (messageId === undefined) {\n return undefined;\n }\n return {\n chat,\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n message_id: messageId,\n ...(parsedThreadId !== undefined ? { message_thread_id: parsedThreadId } : {}),\n text,\n };\n}\n\nfunction createOutboundMediaMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n mediaKind: \"animation\" | \"audio\" | \"document\" | \"photo\" | \"video\",\n caption: string | undefined,\n): TelegramMessage | undefined {\n const chat = resolveTelegramChat(state, body.chat_id);\n const mediaInput = body[mediaKind];\n const multipartFile = isTelegramMultipartFile(mediaInput) ? mediaInput : undefined;\n const fileName = multipartFile?.fileName ?? toStringValue(mediaInput);\n if (!chat || !fileName) {\n return undefined;\n }\n const parsedThreadId = telegramMessageThreadId(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n if (parsedThreadId !== undefined && !canTargetTelegramTopic(state, chat)) {\n return undefined;\n }\n const messageId = takeNextTelegramMessageId(state, chat.id);\n if (messageId === undefined) {\n return undefined;\n }\n const duration = Math.max(0, toIntegerValue(body.duration) ?? 0);\n const height = Math.max(1, toIntegerValue(body.height) ?? 1);\n const width = Math.max(1, toIntegerValue(body.width) ?? 1);\n const chatIdentity = Buffer.from(telegramChatKey(chat.id)).toString(\"base64url\");\n let fileIdentity: string;\n if (multipartFile) {\n fileIdentity = multipartFile.contentDigest.slice(0, 32);\n } else {\n fileIdentity =\n new RegExp(`^crabline-${mediaKind}-([A-Za-z0-9_-]{32})-`, \"u\").exec(fileName)?.[1] ??\n createHash(\"sha256\")\n .update(mediaKind)\n .update(\"\\0\")\n .update(fileName)\n .digest(\"base64url\")\n .slice(0, 32);\n }\n const fileId = `crabline-${mediaKind}-${fileIdentity}-${chatIdentity}-${messageId}`;\n const fileUniqueId = `crabline-${mediaKind}-unique-${fileIdentity}`;\n const media = {\n file_id: fileId,\n file_name: fileName,\n file_unique_id: fileUniqueId,\n };\n return {\n chat,\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n ...(caption ? { caption } : {}),\n [mediaKind]:\n mediaKind === \"photo\"\n ? [\n {\n file_id: media.file_id,\n file_unique_id: media.file_unique_id,\n height: 1,\n width: 1,\n },\n ]\n : {\n ...media,\n ...(mediaKind === \"audio\"\n ? { duration }\n : mediaKind === \"animation\" || mediaKind === \"video\"\n ? { duration, height, width }\n : {}),\n mime_type: \"application/octet-stream\",\n },\n message_id: messageId,\n ...(parsedThreadId !== undefined ? { message_thread_id: parsedThreadId } : {}),\n };\n}\n\nfunction createEditedMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n text: string,\n): TelegramMessage | undefined {\n const chat = resolveTelegramChat(state, body.chat_id);\n const messageId = toIntegerValue(body.message_id);\n if (!chat || messageId === undefined || messageId < 1) {\n return undefined;\n }\n const parsedThreadId = telegramMessageThreadId(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n if (parsedThreadId !== undefined && !canTargetTelegramTopic(state, chat)) {\n return undefined;\n }\n return {\n chat,\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n message_id: messageId,\n ...(parsedThreadId !== undefined ? { message_thread_id: parsedThreadId } : {}),\n text,\n };\n}\n\nfunction createInboundUpdate(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): TelegramUpdate | undefined {\n const chat = resolveTelegramChat(state, body.chatId ?? body.chat_id);\n const text = body.text;\n if (\n !chat ||\n typeof text !== \"string\" ||\n text.length < 1 ||\n text.length > TELEGRAM_MAX_TEXT_LENGTH\n ) {\n return undefined;\n }\n const fromIdValue = body.fromId ?? body.from_id;\n const threadIdValue = body.messageThreadId ?? body.message_thread_id;\n const messageIdValue = body.messageId ?? body.message_id;\n const updateIdValue = body.updateId ?? body.update_id;\n const fromId = toIntegerValue(fromIdValue);\n const threadId = telegramMessageThreadId(threadIdValue);\n const fromUsernameValue = body.fromUsername ?? body.from_username;\n const fromUsername = telegramStoredUsername(fromUsernameValue);\n const messageId = toIntegerValue(messageIdValue);\n const updateId = toIntegerValue(updateIdValue);\n const explicitChatType = telegramChatType(body.chatType ?? body.chat_type);\n const isForumValue = body.isForum ?? body.is_forum;\n if (\n ((body.chatType !== undefined || body.chat_type !== undefined) && !explicitChatType) ||\n (isForumValue !== undefined && typeof isForumValue !== \"boolean\") ||\n (fromIdValue !== undefined && (fromId === undefined || fromId < 1)) ||\n (fromUsernameValue !== undefined && !fromUsername) ||\n (threadIdValue !== undefined && threadId === undefined) ||\n (messageIdValue !== undefined && (messageId === undefined || messageId < 1)) ||\n (updateIdValue !== undefined && (updateId === undefined || updateId < 1))\n ) {\n return undefined;\n }\n const entities = parseTelegramEntities(body.entities, text);\n if (body.entities !== undefined && !entities) {\n return undefined;\n }\n const inboundChat: TelegramChat = {\n ...chat,\n ...(explicitChatType ? { type: explicitChatType } : {}),\n ...(isForumValue === true ? { is_forum: true } : {}),\n };\n if (isForumValue === false) {\n delete inboundChat.is_forum;\n }\n if (inboundChat.is_forum === true && inboundChat.type !== \"supergroup\") {\n return undefined;\n }\n if (threadId !== undefined && !canTargetTelegramTopic(state, inboundChat)) {\n return undefined;\n }\n return {\n message: {\n chat: inboundChat,\n date: Math.floor(Date.now() / 1000),\n from: {\n first_name: toStringValue(body.fromName ?? body.from_name) ?? \"QA User\",\n id: fromId ?? 100001,\n is_bot: false,\n ...(fromUsername ? { username: fromUsername } : {}),\n },\n message_id: messageId ?? nextTelegramMessageId(state, chat.id),\n ...(entities && entities.length > 0 ? { entities } : {}),\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n text,\n },\n update_id: updateId ?? state.nextUpdateId,\n };\n}\n\nfunction parseTelegramEntities(\n value: unknown,\n text: string,\n): TelegramMessage[\"entities\"] | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n return undefined;\n }\n const entities: NonNullable<TelegramMessage[\"entities\"]> = [];\n for (const entry of value) {\n if (!isJsonObject(entry)) {\n return undefined;\n }\n const length = toIntegerValue(entry.length);\n const offset = toIntegerValue(entry.offset);\n const type = typeof entry.type === \"string\" && entry.type.length > 0 ? entry.type : undefined;\n const customEmojiId = entry.custom_emoji_id;\n const language = entry.language;\n const url = entry.url;\n const user = entry.user;\n if (\n length === undefined ||\n length < 1 ||\n offset === undefined ||\n offset < 0 ||\n offset + length > text.length ||\n !isTelegramUtf16Boundary(text, offset) ||\n !isTelegramUtf16Boundary(text, offset + length) ||\n !type ||\n (customEmojiId !== undefined &&\n (typeof customEmojiId !== \"string\" || customEmojiId.length === 0)) ||\n (language !== undefined && (typeof language !== \"string\" || language.length === 0)) ||\n (url !== undefined && (typeof url !== \"string\" || url.length === 0)) ||\n (user !== undefined && !isJsonObject(user))\n ) {\n return undefined;\n }\n entities.push({\n ...(customEmojiId !== undefined ? { custom_emoji_id: customEmojiId } : {}),\n ...(language !== undefined ? { language } : {}),\n length,\n offset,\n type,\n ...(url !== undefined ? { url } : {}),\n ...(user !== undefined ? { user } : {}),\n });\n }\n return entities;\n}\n\nfunction isTelegramUtf16Boundary(text: string, index: number): boolean {\n if (index <= 0 || index >= text.length) {\n return true;\n }\n const previous = text.charCodeAt(index - 1);\n const next = text.charCodeAt(index);\n return !(previous >= 0xd800 && previous <= 0xdbff && next >= 0xdc00 && next <= 0xdfff);\n}\n\nfunction hasTelegramMedia(value: Record<string, unknown>): boolean {\n return TELEGRAM_MEDIA_FIELDS.some((field) => value[field] !== undefined);\n}\n\nfunction telegramMessageThreadId(value: unknown): number | undefined {\n const threadId = toIntegerValue(value);\n return threadId !== undefined && threadId > 0 ? threadId : undefined;\n}\n\nfunction canTargetTelegramTopic(state: TelegramServerState, chat: TelegramChat): boolean {\n if (chat.type === \"supergroup\") {\n return chat.is_forum === true;\n }\n if (chat.type === \"private\") {\n return state.botHasTopicsEnabled;\n }\n return false;\n}\n\nfunction telegramMessageTargetsValidTopic(\n state: TelegramServerState,\n message: Record<string, unknown>,\n): boolean {\n if (message.message_thread_id === undefined) {\n return true;\n }\n const chat = telegramChatFromRecord(message.chat);\n if (!chat) {\n return false;\n }\n return canTargetTelegramTopic(state, chat);\n}\n\nfunction hasValidTelegramTopicDestinations(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): boolean {\n const topLevelThreadId = body.messageThreadId ?? body.message_thread_id;\n if (topLevelThreadId !== undefined) {\n const chat = resolveTelegramChat(state, body.chatId ?? body.chat_id);\n const explicitType = telegramChatType(body.chatType ?? body.chat_type);\n if (!chat || ((body.chatType !== undefined || body.chat_type !== undefined) && !explicitType)) {\n return false;\n }\n const topicChat: TelegramChat = {\n ...chat,\n ...(explicitType ? { type: explicitType } : {}),\n ...((body.isForum ?? body.is_forum) === true ? { is_forum: true } : {}),\n };\n if ((body.isForum ?? body.is_forum) === false) {\n delete topicChat.is_forum;\n }\n if (\n (body.isForum !== undefined || body.is_forum !== undefined) &&\n typeof (body.isForum ?? body.is_forum) !== \"boolean\"\n ) {\n return false;\n }\n if (!canTargetTelegramTopic(state, topicChat)) {\n return false;\n }\n }\n for (const field of TELEGRAM_MESSAGE_UPDATE_FIELDS) {\n const message = body[field];\n if (isJsonObject(message) && !telegramMessageTargetsValidTopic(state, message)) {\n return false;\n }\n }\n const callbackQuery = isJsonObject(body.callback_query) ? body.callback_query : undefined;\n const callbackMessage =\n callbackQuery && isJsonObject(callbackQuery.message) ? callbackQuery.message : undefined;\n return !callbackMessage || telegramMessageTargetsValidTopic(state, callbackMessage);\n}\n\nfunction hasValidTelegramMessageThreadIds(body: Record<string, unknown>): boolean {\n const values = [\n body.messageThreadId,\n body.message_thread_id,\n ...TELEGRAM_MESSAGE_UPDATE_FIELDS.flatMap((field) => {\n const message = body[field];\n return isJsonObject(message) ? [message.message_thread_id] : [];\n }),\n ];\n const callbackQuery = isJsonObject(body.callback_query) ? body.callback_query : undefined;\n const callbackMessage =\n callbackQuery && isJsonObject(callbackQuery.message) ? callbackQuery.message : undefined;\n if (callbackMessage) {\n values.push(callbackMessage.message_thread_id);\n }\n return values.every(\n (value) => value === undefined || telegramMessageThreadId(value) !== undefined,\n );\n}\n\nfunction explicitTelegramId(\n body: Record<string, unknown>,\n names: readonly string[],\n additionalValues: readonly unknown[] = [],\n options: { allowZero?: boolean } = {},\n): { present: false } | { present: true; value: number } | undefined {\n const values = [\n ...names.flatMap((name) => (body[name] === undefined ? [] : [body[name]])),\n ...additionalValues.filter((value) => value !== undefined),\n ];\n if (values.length === 0) {\n return { present: false };\n }\n const parsed = values.map(toIntegerValue);\n const minimum = options.allowZero ? 0 : 1;\n if (\n parsed.some(\n (value) => value === undefined || value < minimum || value >= Number.MAX_SAFE_INTEGER,\n ) ||\n new Set(parsed).size !== 1\n ) {\n return undefined;\n }\n return { present: true, value: parsed[0]! };\n}\n\nfunction explicitTelegramMessageIdValues(body: Record<string, unknown>): unknown[] {\n return TELEGRAM_NEW_MESSAGE_UPDATE_FIELDS.flatMap((field) => {\n const message = body[field];\n return isJsonObject(message) ? [message.message_id] : [];\n });\n}\n\nfunction referencedTelegramMessageIdValues(body: Record<string, unknown>): unknown[] {\n const values = TELEGRAM_MESSAGE_REFERENCE_FIELDS.flatMap((field) => {\n const message = body[field];\n return isJsonObject(message) ? [message.message_id] : [];\n });\n const callbackQuery = isJsonObject(body.callback_query) ? body.callback_query : undefined;\n const callbackMessage =\n callbackQuery && isJsonObject(callbackQuery.message) ? callbackQuery.message : undefined;\n return callbackMessage ? [...values, callbackMessage.message_id] : values;\n}\n\nfunction explicitTelegramMessageChatId(body: Record<string, unknown>): number | undefined | false {\n const chatIds: number[] = [];\n if (body.messageId !== undefined || body.message_id !== undefined) {\n const chatId = telegramChatId(body.chatId ?? body.chat_id);\n if (chatId === undefined) {\n return false;\n }\n chatIds.push(chatId);\n }\n for (const field of TELEGRAM_MESSAGE_UPDATE_FIELDS) {\n const message = body[field];\n if (!isJsonObject(message) || message.message_id === undefined) {\n continue;\n }\n const chat = isJsonObject(message.chat) ? message.chat : undefined;\n const chatId = telegramStoredChatId(chat?.id);\n if (chatId === undefined) {\n return false;\n }\n chatIds.push(chatId);\n }\n const callbackQuery = isJsonObject(body.callback_query) ? body.callback_query : undefined;\n const callbackMessage =\n callbackQuery && isJsonObject(callbackQuery.message) ? callbackQuery.message : undefined;\n if (callbackMessage?.message_id !== undefined) {\n const chat = isJsonObject(callbackMessage.chat) ? callbackMessage.chat : undefined;\n const chatId = telegramStoredChatId(chat?.id);\n if (chatId === undefined) {\n return false;\n }\n chatIds.push(chatId);\n }\n if (chatIds.length === 0) {\n return undefined;\n }\n const firstChatId = chatIds[0]!;\n return chatIds.every((chatId) => telegramChatKey(chatId) === telegramChatKey(firstChatId))\n ? firstChatId\n : false;\n}\n\nfunction readTelegramTextField(\n value: unknown,\n field: \"caption\" | \"text\",\n options: { parseMode?: unknown; required: boolean },\n): Response | string | undefined {\n if (value === undefined) {\n return options.required ? telegramError(`Bad Request: ${field} is required`) : undefined;\n }\n if (typeof value !== \"string\") {\n return telegramError(`Bad Request: ${field} must be a string`);\n }\n const parsedLength = telegramTextLength(value, options.parseMode);\n if (options.required && parsedLength === 0) {\n return telegramError(`Bad Request: ${field} must not be empty`);\n }\n const maxLength = field === \"text\" ? TELEGRAM_MAX_TEXT_LENGTH : TELEGRAM_MAX_CAPTION_LENGTH;\n if (parsedLength > maxLength) {\n return telegramError(`Bad Request: ${field} is too long`);\n }\n return value;\n}\n\nfunction telegramTextLength(value: string, parseMode: unknown): number {\n const normalizedParseMode = typeof parseMode === \"string\" ? parseMode.toLowerCase() : undefined;\n if (normalizedParseMode === \"html\") {\n return telegramHtmlText(value).length;\n }\n if (normalizedParseMode === \"markdown\" || normalizedParseMode === \"markdownv2\") {\n return telegramMarkdownText(value, normalizedParseMode === \"markdownv2\").length;\n }\n return value.length;\n}\n\nfunction telegramHtmlText(value: string): string {\n return value\n .replace(TELEGRAM_HTML_TAG_PATTERN, \"\")\n .replace(TELEGRAM_HTML_ENTITY_PATTERN, (entity) => {\n const normalized = entity.toLowerCase();\n if (normalized === \"&amp;\") {\n return \"&\";\n }\n if (normalized === \"&gt;\") {\n return \">\";\n }\n if (normalized === \"&lt;\") {\n return \"<\";\n }\n if (normalized === \"&quot;\") {\n return '\"';\n }\n const radix = normalized.startsWith(\"&#x\") ? 16 : 10;\n const digits = normalized.slice(radix === 16 ? 3 : 2, -1);\n const codePoint = Number.parseInt(digits, radix);\n return Number.isSafeInteger(codePoint) && codePoint <= 0x10ffff\n ? String.fromCodePoint(codePoint)\n : entity;\n });\n}\n\nfunction protectTelegramMarkdownEscapes(value: string, versionTwo: boolean): string {\n let protectedText = \"\";\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index]!;\n const escapedCharacter = value[index + 1];\n if (\n character === \"\\\\\" &&\n escapedCharacter !== undefined &&\n (versionTwo\n ? escapedCharacter.charCodeAt(0) >= 1 && escapedCharacter.charCodeAt(0) <= 0x7e\n : \"*_[]`\".includes(escapedCharacter))\n ) {\n protectedText += \"\\0\";\n index += 1;\n continue;\n }\n protectedText += character;\n }\n return protectedText;\n}\n\nfunction telegramMarkdownLiteralMask(value: string): string {\n return \"\\0\".repeat(value.length);\n}\n\nfunction stripTelegramMarkdownExpandableMarker(line: string): string {\n if (!line.endsWith(\"||\")) {\n return line;\n }\n let markers = 0;\n for (let index = line.indexOf(\"||\"); index >= 0; index = line.indexOf(\"||\", index + 2)) {\n markers += 1;\n }\n return markers % 2 === 1 ? line.slice(0, -2) : line;\n}\n\n// Keep this scan strictly forward-only: this request path accepts client-controlled\n// Markdown, and backtracking over malformed link destinations amplifies CPU use.\nfunction stripTelegramMarkdownLinks(value: string): string {\n const output: string[] = [];\n let copyStart = 0;\n let searchStart = 0;\n\n while (searchStart < value.length) {\n const labelStart = value.indexOf(\"[\", searchStart);\n if (labelStart < 0) {\n break;\n }\n\n let labelEnd = labelStart + 1;\n while (labelEnd < value.length && value[labelEnd] !== \"]\" && value[labelEnd] !== \"\\n\") {\n labelEnd += 1;\n }\n if (labelEnd === labelStart + 1 || value[labelEnd] !== \"]\" || value[labelEnd + 1] !== \"(\") {\n searchStart = labelEnd < value.length ? labelEnd + 1 : value.length;\n continue;\n }\n\n let destinationEnd = labelEnd + 2;\n let matched = false;\n while (destinationEnd < value.length) {\n const character = value[destinationEnd]!;\n if (character === \"\\n\") {\n break;\n }\n if (character === \")\") {\n output.push(value.slice(copyStart, labelStart), value.slice(labelStart + 1, labelEnd));\n copyStart = destinationEnd + 1;\n searchStart = copyStart;\n matched = true;\n break;\n }\n if (\n character === \"\\\\\" &&\n destinationEnd + 1 < value.length &&\n value[destinationEnd + 1] !== \"\\n\"\n ) {\n destinationEnd += 2;\n continue;\n }\n destinationEnd += 1;\n }\n if (matched) {\n continue;\n }\n searchStart = destinationEnd < value.length ? destinationEnd + 1 : value.length;\n }\n\n output.push(value.slice(copyStart));\n return output.join(\"\");\n}\n\nfunction telegramMarkdownText(value: string, versionTwo: boolean): string {\n let parsed = protectTelegramMarkdownEscapes(value, versionTwo)\n .replace(/```(?:[^\\n]*\\n)?([\\s\\S]*?)```/gu, (_match, content: string) =>\n telegramMarkdownLiteralMask(content),\n )\n .replace(/`([^`\\n]*)`/gu, (_match, content: string) => telegramMarkdownLiteralMask(content))\n .replace(\n /!\\[([^\\]\\n]+)\\]\\(tg:\\/\\/(?:emoji\\?id=\\d+|time\\?unix=-?\\d+(?:&format=[rwdDtT]+)?)\\)/gu,\n \"$1\",\n );\n parsed = stripTelegramMarkdownLinks(parsed);\n if (versionTwo) {\n parsed = parsed\n .replace(/^(?:\\*\\*)?>[^\\n]*$/gmu, stripTelegramMarkdownExpandableMarker)\n .replace(/^\\*\\*(?=>)/gmu, \"\")\n .replace(/^>/gmu, \"\")\n .replace(/\\|\\|([\\s\\S]*?)\\|\\|/gu, \"$1\")\n .replace(/__([\\s\\S]*?)__/gu, \"$1\")\n .replace(/~([\\s\\S]*?)~/gu, \"$1\");\n }\n let previous: string;\n do {\n previous = parsed;\n parsed = parsed.replace(/\\*([\\s\\S]*?)\\*/gu, \"$1\").replace(/_([\\s\\S]*?)_/gu, \"$1\");\n } while (parsed !== previous);\n return parsed;\n}\n\nfunction hasValidExplicitTelegramIdentities(body: Record<string, unknown>): boolean {\n return (\n [body.chatId, body.chat_id].every(\n (value) => value === undefined || telegramChatId(value) !== undefined,\n ) &&\n [\n body.fromId,\n body.from_id,\n body.messageId,\n body.message_id,\n body.updateId,\n body.update_id,\n ].every((value) => value === undefined || toIntegerValue(value) !== undefined)\n );\n}\n\nfunction isValidIgnoredTelegramUpdate(body: Record<string, unknown>): boolean {\n const updateIdValue = body.updateId ?? body.update_id;\n const updateId = toIntegerValue(updateIdValue);\n\n if (isJsonObject(body.message)) {\n const message = body.message;\n const chat = isJsonObject(message.chat) ? message.chat : undefined;\n const messageId = toIntegerValue(message.message_id);\n if (\n updateId === undefined ||\n updateId < 1 ||\n !chat ||\n telegramStoredChatId(chat.id) === undefined ||\n messageId === undefined ||\n messageId < 0 ||\n (message.from !== undefined &&\n (!isJsonObject(message.from) || (toIntegerValue(message.from.id) ?? 0) < 1)) ||\n (message.message_thread_id !== undefined &&\n telegramMessageThreadId(message.message_thread_id) === undefined)\n ) {\n return false;\n }\n return toStringValue(message.text) === undefined;\n }\n\n const chatId = telegramChatId(body.chatId ?? body.chat_id);\n if (\n chatId !== undefined &&\n hasValidExplicitTelegramIdentities(body) &&\n hasTelegramMedia(body) &&\n toStringValue(body.text) === undefined\n ) {\n return true;\n }\n\n return (\n updateId !== undefined &&\n TELEGRAM_UNSUPPORTED_UPDATE_FIELDS.some((field) => isJsonObject(body[field]))\n );\n}\n\nasync function handleTelegramAdminInbound(params: {\n body: Record<string, unknown>;\n request: IncomingMessage;\n state: TelegramServerState;\n url: URL;\n}): Promise<Response> {\n let releaseAdmission!: () => void;\n const previousAdmission = params.state.inboundAdmission;\n params.state.inboundAdmission = new Promise<void>((resolve) => {\n releaseAdmission = resolve;\n });\n await previousAdmission;\n try {\n const nextUpdateId = params.state.nextUpdateId;\n const explicitMessageId = explicitTelegramId(\n params.body,\n [\"messageId\", \"message_id\"],\n explicitTelegramMessageIdValues(params.body),\n { allowZero: true },\n );\n const explicitMessageChatId = explicitTelegramMessageChatId(params.body);\n const explicitUpdateId = explicitTelegramId(params.body, [\"updateId\", \"update_id\"]);\n const referencedMessageId = explicitTelegramId(\n {},\n [],\n referencedTelegramMessageIdValues(params.body),\n );\n const topLevelChatId = resolveTelegramChat(\n params.state,\n params.body.chatId ?? params.body.chat_id,\n )?.id;\n const messageChatId =\n explicitMessageChatId === false ? undefined : (explicitMessageChatId ?? topLevelChatId);\n const messageChatKey = messageChatId === undefined ? undefined : telegramChatKey(messageChatId);\n const previousNextMessageId =\n messageChatKey === undefined ? undefined : params.state.nextMessageIds.get(messageChatKey);\n const nextMessageId =\n messageChatId === undefined ? undefined : nextTelegramMessageId(params.state, messageChatId);\n if (\n !hasValidTelegramMessageThreadIds(params.body) ||\n !hasValidTelegramTopicDestinations(params.state, params.body) ||\n explicitMessageId === undefined ||\n explicitMessageChatId === false ||\n explicitUpdateId === undefined ||\n referencedMessageId === undefined ||\n (explicitMessageId.present &&\n explicitMessageId.value > 0 &&\n (nextMessageId === undefined || explicitMessageId.value < nextMessageId)) ||\n (explicitUpdateId.present && explicitUpdateId.value < nextUpdateId)\n ) {\n return telegramError(\"Bad Request: explicit IDs must be valid and monotonic\");\n }\n const update = createInboundUpdate(params.state, params.body);\n params.state.nextUpdateId = nextUpdateId;\n if (\n update &&\n ((!explicitMessageId.present &&\n (nextMessageId ?? Number.MAX_SAFE_INTEGER) >= Number.MAX_SAFE_INTEGER) ||\n (!explicitUpdateId.present && nextUpdateId >= Number.MAX_SAFE_INTEGER))\n ) {\n return telegramError(\"Bad Request: generated ID space is exhausted\");\n }\n if (!update) {\n if (isValidIgnoredTelegramUpdate(params.body)) {\n if (messageChatKey !== undefined) {\n const observedNextMessageIds = [\n ...(explicitMessageId.present && explicitMessageId.value > 0\n ? [explicitMessageId.value + 1]\n : []),\n ...(referencedMessageId.present && referencedMessageId.value > 0\n ? [referencedMessageId.value + 1]\n : []),\n ];\n if (observedNextMessageIds.length > 0) {\n params.state.nextMessageIds.set(\n messageChatKey,\n Math.max(\n params.state.nextMessageIds.get(messageChatKey) ?? 1,\n ...observedNextMessageIds,\n ),\n );\n }\n }\n if (explicitUpdateId.present) {\n params.state.nextUpdateId = explicitUpdateId.value + 1;\n }\n registerTelegramUpdateChats(params.state, params.body);\n return jsonResponse({ ok: true });\n }\n return telegramError(\"Bad Request: chatId and text are required\");\n }\n if (params.state.updates.length >= params.state.maxPendingInboundEvents) {\n return telegramError(\n `Too Many Requests: pending inbound queue is full (${params.state.maxPendingInboundEvents} updates)`,\n 429,\n );\n }\n const updateChatKey = telegramChatKey(update.message.chat.id);\n params.state.nextMessageIds.set(\n updateChatKey,\n Math.max(\n params.state.nextMessageIds.get(updateChatKey) ?? 1,\n update.message.message_id + 1,\n ...(referencedMessageId.present && referencedMessageId.value > 0\n ? [referencedMessageId.value + 1]\n : []),\n ),\n );\n params.state.nextUpdateId = Math.max(params.state.nextUpdateId, update.update_id + 1);\n const reservedNextMessageId = params.state.nextMessageIds.get(updateChatKey)!;\n const reservedNextUpdateId = params.state.nextUpdateId;\n try {\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n body: params.body,\n method: params.request.method ?? \"POST\",\n path: params.url.pathname,\n query: queryRecord(params.url),\n type: \"admin\",\n });\n } catch (error) {\n if (params.state.nextMessageIds.get(updateChatKey) === reservedNextMessageId) {\n if (previousNextMessageId === undefined) {\n params.state.nextMessageIds.delete(updateChatKey);\n } else {\n params.state.nextMessageIds.set(updateChatKey, previousNextMessageId);\n }\n }\n if (params.state.nextUpdateId === reservedNextUpdateId) {\n params.state.nextUpdateId = nextUpdateId;\n }\n throw error;\n }\n registerTelegramChat(params.state, update.message.chat);\n params.state.updates.push(update);\n params.state.updates.sort((left, right) => left.update_id - right.update_id);\n if (params.state.webhook) {\n scheduleTelegramWebhookDelivery(params.state, 0);\n return jsonResponse({ ok: true, update });\n }\n finishTelegramUpdatePoll(params.state, \"update\");\n return jsonResponse({ ok: true, update });\n } finally {\n releaseAdmission();\n }\n}\n\nasync function flushTelegramWebhookUpdates(\n state: TelegramServerState,\n onAttempt: (updateId: number) => void,\n): Promise<Response | undefined> {\n if (!state.webhook) {\n return undefined;\n }\n while (state.updates.length > 0 && state.webhook) {\n syncTelegramWebhookRetryHead(state);\n const webhook: TelegramWebhook = state.webhook;\n const update = state.updates[0]!;\n onAttempt(update.update_id);\n try {\n const delivery = await postTelegramWebhook(state, webhook, update);\n if (\"error\" in delivery) {\n if (state.webhook === webhook) {\n webhook.lastErrorDate = Math.floor(Date.now() / 1_000);\n webhook.lastErrorMessage = delivery.error;\n }\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n if (delivery.status < 200 || delivery.status >= 300) {\n if (state.webhook === webhook) {\n webhook.lastErrorDate = Math.floor(Date.now() / 1_000);\n webhook.lastErrorMessage = `Wrong response from the webhook: ${delivery.status}`;\n }\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n if (state.webhook !== webhook) {\n return undefined;\n }\n const deliveredIndex = state.updates.indexOf(update);\n if (deliveredIndex >= 0) {\n state.updates.splice(deliveredIndex, 1);\n }\n if (state.webhook === webhook) {\n state.webhookRetryAttempts = 0;\n }\n } catch {\n if (state.webhook === webhook) {\n webhook.lastErrorDate = Math.floor(Date.now() / 1_000);\n webhook.lastErrorMessage = \"Webhook delivery failed\";\n }\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n }\n return undefined;\n}\n\nasync function validateTelegramWebhookUrl(\n state: Pick<TelegramServerState, \"allowLoopbackHttpWebhook\" | \"restrictWebhookTargets\">,\n url: URL,\n deadlineAt: number,\n signal: AbortSignal,\n): Promise<Response | { addresses: WebhookAddress[] | undefined }> {\n const remainingMs = deadlineAt - Date.now();\n if (remainingMs <= 0) {\n return telegramError(\"Bad Request: webhook host could not be resolved\");\n }\n const deadline = new AbortController();\n const timer = setTimeout(\n () => deadline.abort(new DOMException(\"Webhook delivery timed out\", \"TimeoutError\")),\n remainingMs,\n );\n timer.unref();\n let target;\n try {\n target = await validateWebhookTarget({\n allowLoopbackHttp: state.allowLoopbackHttpWebhook,\n restrictPrivateAddresses: state.restrictWebhookTargets,\n signal: AbortSignal.any([signal, deadline.signal]),\n url,\n });\n } catch {\n return telegramError(\"Bad Request: webhook host could not be resolved\");\n } finally {\n clearTimeout(timer);\n }\n if (!(\"error\" in target)) {\n return target;\n }\n return target.error === \"unresolvable\"\n ? telegramError(\"Bad Request: webhook host could not be resolved\")\n : target.error === \"private-address\"\n ? telegramError(\"Bad Request: webhook URL must not target a private or link-local address\")\n : telegramError(\"Bad Request: webhook URL must use HTTPS\");\n}\n\n/** @internal */\nexport async function withTelegramWebhookDeadline<T>(\n promise: Promise<T>,\n deadlineAt: number,\n signal: AbortSignal,\n): Promise<T> {\n const remainingMs = deadlineAt - Date.now();\n if (remainingMs <= 0) {\n throw new DOMException(\"Webhook delivery timed out\", \"TimeoutError\");\n }\n return await new Promise<T>((resolve, reject) => {\n let settled = false;\n const finish = (callback: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n callback();\n };\n const onAbort = () =>\n finish(() =>\n reject(\n signal.reason instanceof Error\n ? signal.reason\n : new DOMException(\"Webhook delivery aborted\", \"AbortError\"),\n ),\n );\n const timer = setTimeout(\n () => finish(() => reject(new DOMException(\"Webhook delivery timed out\", \"TimeoutError\"))),\n remainingMs,\n );\n timer.unref();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) {\n onAbort();\n return;\n }\n promise.then(\n (value) => finish(() => resolve(value)),\n (error: unknown) => finish(() => reject(error)),\n );\n });\n}\n\nasync function postTelegramWebhook(\n state: TelegramServerState,\n webhook: TelegramWebhook,\n update: TelegramUpdate,\n): Promise<{ error: string } | { status: number }> {\n const url = new URL(webhook.url);\n const deadlineAt = Date.now() + TELEGRAM_WEBHOOK_DELIVERY_TIMEOUT_MS;\n const controller = new AbortController();\n state.activeWebhookDeliveries.add(controller);\n try {\n const target = await validateTelegramWebhookUrl(state, url, deadlineAt, controller.signal);\n if (target instanceof Response) {\n return { error: \"Webhook target is no longer allowed\" };\n }\n const addresses: Array<WebhookAddress | undefined> =\n target.addresses && target.addresses.length > 0 ? target.addresses : [undefined];\n let lastError: unknown;\n for (const [index, address] of addresses.entries()) {\n if (state.closing) {\n throw new Error(\"Telegram server is shutting down.\");\n }\n const remainingMs = deadlineAt - Date.now();\n if (remainingMs <= 0) {\n throw new DOMException(\"Webhook delivery timed out\", \"TimeoutError\");\n }\n try {\n const attemptsRemaining = addresses.length - index;\n const status = await postWebhookRequest({\n address,\n body: JSON.stringify(update),\n headerEntries: webhook.secretToken\n ? [[\"x-telegram-bot-api-secret-token\", webhook.secretToken]]\n : undefined,\n signal: controller.signal,\n timeoutMs: Math.max(1, Math.floor(remainingMs / attemptsRemaining)),\n url,\n });\n return { status };\n } catch (error) {\n lastError = error;\n if (state.closing || controller.signal.aborted) {\n throw error;\n }\n }\n }\n throw lastError;\n } finally {\n state.activeWebhookDeliveries.delete(controller);\n }\n}\n\nasync function replaceTelegramWebhook(\n state: TelegramServerState,\n webhook: TelegramWebhook | undefined,\n dropPendingUpdates: boolean,\n): Promise<void> {\n let releaseAdmission!: () => void;\n const previousAdmission = state.webhookAdmission;\n state.webhookAdmission = new Promise<void>((resolve) => {\n releaseAdmission = resolve;\n });\n await previousAdmission;\n try {\n state.webhook = undefined;\n clearTelegramWebhookRetry(state, true);\n for (const controller of state.activeWebhookDeliveries) {\n controller.abort();\n }\n await state.webhookDelivery;\n if (dropPendingUpdates) {\n state.updates.length = 0;\n }\n state.webhook = webhook;\n if (webhook) {\n finishTelegramUpdatePoll(state, \"conflict\");\n scheduleTelegramWebhookDelivery(state, 0);\n }\n } finally {\n releaseAdmission();\n }\n}\n\nfunction clearTelegramWebhookRetry(state: TelegramServerState, resetAttempts = false): void {\n if (state.webhookRetryTimer) {\n clearTimeout(state.webhookRetryTimer);\n state.webhookRetryTimer = undefined;\n }\n if (resetAttempts) {\n state.webhookRetryAttempts = 0;\n state.webhookRetryUpdateId = undefined;\n }\n}\n\nfunction syncTelegramWebhookRetryHead(state: TelegramServerState): void {\n const updateId = state.updates[0]?.update_id;\n if (updateId === state.webhookRetryUpdateId) {\n return;\n }\n clearTelegramWebhookRetry(state);\n state.webhookRetryAttempts = 0;\n state.webhookRetryUpdateId = updateId;\n}\n\nfunction scheduleTelegramWebhookDelivery(state: TelegramServerState, delayMs: number): void {\n if (\n state.closing ||\n !state.webhook ||\n state.updates.length === 0 ||\n state.webhookDelivery ||\n state.webhookRetryTimer\n ) {\n return;\n }\n state.webhookRetryTimer = setTimeout(() => {\n state.webhookRetryTimer = undefined;\n void deliverTelegramWebhookUpdates(state, true);\n }, delayMs);\n state.webhookRetryTimer.unref();\n}\n\nasync function deliverTelegramWebhookUpdates(\n state: TelegramServerState,\n scheduledRetry = false,\n): Promise<Response | undefined> {\n if (state.webhookDelivery) {\n return await state.webhookDelivery;\n }\n syncTelegramWebhookRetryHead(state);\n if (!scheduledRetry && state.webhookRetryTimer) {\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n let attemptedUpdateId: number | undefined;\n const delivery = flushTelegramWebhookUpdates(state, (updateId) => {\n attemptedUpdateId = updateId;\n });\n state.webhookDelivery = delivery;\n let result: Response | undefined;\n try {\n result = await delivery;\n return result;\n } finally {\n if (state.webhookDelivery === delivery) {\n state.webhookDelivery = undefined;\n }\n if (state.webhook && state.updates.length > 0) {\n if (state.updates[0]?.update_id !== attemptedUpdateId) {\n syncTelegramWebhookRetryHead(state);\n scheduleTelegramWebhookDelivery(state, 0);\n } else if (result) {\n const delayMs =\n TELEGRAM_WEBHOOK_RETRY_BASE_MS *\n 2 ** Math.min(state.webhookRetryAttempts, TELEGRAM_WEBHOOK_MAX_BACKOFF_EXPONENT);\n state.webhookRetryAttempts = Math.min(\n state.webhookRetryAttempts + 1,\n TELEGRAM_WEBHOOK_MAX_BACKOFF_EXPONENT,\n );\n scheduleTelegramWebhookDelivery(state, delayMs);\n } else {\n state.webhookRetryAttempts = 0;\n scheduleTelegramWebhookDelivery(state, 0);\n }\n }\n }\n}\n\nasync function handleTelegramApi(params: {\n body: Record<string, unknown>;\n method: string;\n request: IncomingMessage;\n state: TelegramServerState;\n}) {\n const method = params.method.toLowerCase();\n switch (method) {\n case \"getme\":\n return telegramOk(createBotUser(params.state));\n case \"setmycommands\":\n case \"deletemycommands\":\n case \"answercallbackquery\":\n case \"deletemessage\":\n case \"pinchatmessage\":\n case \"unpinchatmessage\":\n case \"setmessagereaction\":\n return telegramOk(true);\n case \"sendchataction\": {\n if (params.body.message_thread_id === undefined) {\n return telegramOk(true);\n }\n const chat = resolveTelegramChat(params.state, params.body.chat_id);\n const messageThreadId = telegramMessageThreadId(params.body.message_thread_id);\n return chat && messageThreadId !== undefined && canTargetTelegramTopic(params.state, chat)\n ? telegramOk(true)\n : telegramError(\"Bad Request: chat is not a forum or message_thread_id is invalid\");\n }\n case \"editforumtopic\": {\n const chat = resolveTelegramChat(params.state, params.body.chat_id);\n const messageThreadId = telegramMessageThreadId(params.body.message_thread_id);\n return chat && messageThreadId !== undefined && canTargetTelegramTopic(params.state, chat)\n ? telegramOk(true)\n : telegramError(\"Bad Request: chat is not a forum or message_thread_id is invalid\");\n }\n case \"setwebhook\": {\n if (params.body.url === \"\") {\n await replaceTelegramWebhook(\n params.state,\n undefined,\n toBooleanValue(params.body.drop_pending_updates),\n );\n return telegramOk(true);\n }\n const webhookUrl = toStringValue(params.body.url);\n if (!webhookUrl) {\n return telegramError(\"Bad Request: url is required\");\n }\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(webhookUrl);\n } catch {\n return telegramError(\"Bad Request: bad webhook URL\");\n }\n if (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\") {\n return telegramError(\"Bad Request: bad webhook URL\");\n }\n const secretToken =\n params.body.secret_token === undefined\n ? undefined\n : typeof params.body.secret_token === \"string\"\n ? params.body.secret_token\n : null;\n if (\n secretToken === null ||\n (secretToken !== undefined && !TELEGRAM_WEBHOOK_SECRET_PATTERN.test(secretToken))\n ) {\n return telegramError(\"Bad Request: invalid secret token\");\n }\n if (params.state.activeWebhookValidations.size >= MAX_ACTIVE_TELEGRAM_WEBHOOK_VALIDATIONS) {\n return telegramError(\"Too Many Requests: too many webhook validations\", 429);\n }\n const validation = new AbortController();\n params.state.activeWebhookValidations.add(validation);\n const target = await validateTelegramWebhookUrl(\n params.state,\n parsedUrl,\n Date.now() + TELEGRAM_WEBHOOK_DELIVERY_TIMEOUT_MS,\n validation.signal,\n ).finally(() => {\n params.state.activeWebhookValidations.delete(validation);\n });\n if (target instanceof Response) {\n return target;\n }\n await replaceTelegramWebhook(\n params.state,\n {\n ...(secretToken ? { secretToken } : {}),\n url: parsedUrl.href,\n },\n toBooleanValue(params.body.drop_pending_updates),\n );\n return telegramOk(true);\n }\n case \"deletewebhook\":\n await replaceTelegramWebhook(\n params.state,\n undefined,\n toBooleanValue(params.body.drop_pending_updates),\n );\n return telegramOk(true);\n case \"getwebhookinfo\":\n return telegramOk({\n has_custom_certificate: false,\n ...(params.state.webhook?.lastErrorDate\n ? { last_error_date: params.state.webhook.lastErrorDate }\n : {}),\n ...(params.state.webhook?.lastErrorMessage\n ? { last_error_message: params.state.webhook.lastErrorMessage }\n : {}),\n pending_update_count: params.state.updates.length,\n url: params.state.webhook?.url ?? \"\",\n });\n case \"createforumtopic\": {\n const chat = resolveTelegramChat(params.state, params.body.chat_id);\n if (!chat) {\n return telegramError(\"Bad Request: chat_id is required\");\n }\n if (!canTargetTelegramTopic(params.state, chat)) {\n return telegramError(\"Bad Request: chat is not a forum\");\n }\n const messageThreadId = takeNextTelegramMessageId(params.state, chat.id);\n if (messageThreadId === undefined) {\n return telegramError(\"Bad Request: generated ID space is exhausted\");\n }\n return telegramOk({\n icon_color: 0x6fb9f0,\n message_thread_id: messageThreadId,\n name: toStringValue(params.body.name) ?? \"Crabline Topic\",\n });\n }\n case \"editmessagetext\": {\n const text = readTelegramTextField(params.body.text, \"text\", {\n parseMode: params.body.parse_mode,\n required: true,\n });\n if (text instanceof Response) {\n return text;\n }\n const message = createEditedMessage(params.state, params.body, text!);\n return message\n ? telegramOk(message)\n : telegramError(\"Bad Request: chat_id, message_id, and text are required\");\n }\n case \"sendmessage\": {\n const text = readTelegramTextField(params.body.text, \"text\", {\n parseMode: params.body.parse_mode,\n required: true,\n });\n if (text instanceof Response) {\n return text;\n }\n const chat = resolveTelegramChat(params.state, params.body.chat_id);\n if (chat && nextTelegramMessageId(params.state, chat.id) >= Number.MAX_SAFE_INTEGER) {\n return telegramError(\"Bad Request: generated ID space is exhausted\");\n }\n const message = createOutboundMessage(params.state, params.body, text!);\n return message\n ? telegramOk(message)\n : telegramError(\"Bad Request: chat_id and text are required\");\n }\n case \"sendanimation\":\n case \"sendaudio\":\n case \"senddocument\":\n case \"sendphoto\":\n case \"sendvideo\": {\n const mediaKind = method.slice(\"send\".length) as\n | \"animation\"\n | \"audio\"\n | \"document\"\n | \"photo\"\n | \"video\";\n const caption = readTelegramTextField(params.body.caption, \"caption\", {\n parseMode: params.body.parse_mode,\n required: false,\n });\n if (caption instanceof Response) {\n return caption;\n }\n const chat = resolveTelegramChat(params.state, params.body.chat_id);\n if (chat && nextTelegramMessageId(params.state, chat.id) >= Number.MAX_SAFE_INTEGER) {\n return telegramError(\"Bad Request: generated ID space is exhausted\");\n }\n const message = createOutboundMediaMessage(params.state, params.body, mediaKind, caption);\n return message\n ? telegramOk(message)\n : telegramError(`Bad Request: chat_id and ${mediaKind} are required`);\n }\n case \"getupdates\":\n if (params.state.webhook) {\n return telegramError(\"Conflict: can't use getUpdates method while webhook is active\", 409);\n }\n return await handleTelegramGetUpdates(params);\n default:\n return telegramError(`Not Found: unsupported method ${params.method}`, 404);\n }\n}\n\n/** @internal */\nexport async function handleTelegramGetUpdates(params: {\n body: Record<string, unknown>;\n request: IncomingMessage;\n state: TelegramGetUpdatesState;\n}): Promise<Response> {\n const offset = toIntegerValue(params.body.offset);\n const limit = toIntegerValue(params.body.limit) ?? 100;\n const timeout = toIntegerValue(params.body.timeout) ?? 0;\n if (params.body.offset !== undefined && offset === undefined) {\n return telegramError(\"Bad Request: offset must be a safe integer\");\n }\n if (params.body.limit !== undefined && toIntegerValue(params.body.limit) === undefined) {\n return telegramError(\"Bad Request: limit must be a safe integer\");\n }\n if (params.body.timeout !== undefined && toIntegerValue(params.body.timeout) === undefined) {\n return telegramError(\"Bad Request: timeout must be a safe integer\");\n }\n if (limit < 1 || limit > 100) {\n return telegramError(\"Bad Request: limit must be between 1 and 100\");\n }\n if (timeout < 0) {\n return telegramError(\"Bad Request: timeout must be non-negative\");\n }\n\n finishTelegramUpdatePoll(params.state, \"conflict\");\n let updates = takeTelegramUpdates(params.state, offset, limit);\n const deadline = Date.now() + Math.min(timeout * 1_000, 2_147_483_647);\n if (updates.length === 0 && timeout > 0) {\n while (updates.length === 0) {\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n break;\n }\n const pollResult = await waitForTelegramUpdate(\n params.state,\n params.request,\n remainingMs,\n () => hasTelegramUpdates(params.state, offset),\n );\n if (pollResult === \"conflict\") {\n return telegramError(\n \"Conflict: terminated by other getUpdates request; make sure that only one bot instance is running\",\n 409,\n );\n }\n if (pollResult !== \"update\") {\n break;\n }\n updates = takeTelegramUpdates(params.state, offset, limit);\n }\n }\n return telegramOk(updates);\n}\n\nfunction takeTelegramUpdates(\n state: TelegramGetUpdatesState,\n offset: number | undefined,\n limit: number,\n): TelegramUpdate[] {\n if (offset !== undefined && offset < 0) {\n const retainedCount = Math.min(Math.abs(offset), state.updates.length);\n state.updates.splice(0, state.updates.length - retainedCount);\n } else if (offset !== undefined) {\n const firstUnconfirmed = state.updates.findIndex((update) => update.update_id >= offset);\n if (firstUnconfirmed === -1) {\n state.updates.length = 0;\n } else if (firstUnconfirmed > 0) {\n state.updates.splice(0, firstUnconfirmed);\n }\n }\n return state.updates.slice(0, limit);\n}\n\nfunction hasTelegramUpdates(state: TelegramGetUpdatesState, offset: number | undefined): boolean {\n if (offset === undefined || offset < 0) {\n return state.updates.length > 0;\n }\n return state.updates.some((update) => update.update_id >= offset);\n}\n\nfunction finishTelegramUpdatePoll(\n state: TelegramGetUpdatesState,\n result: TelegramUpdatePollResult,\n): void {\n state.activeUpdatePoll?.finish(result);\n}\n\nasync function waitForTelegramUpdate(\n state: TelegramGetUpdatesState,\n request: IncomingMessage,\n timeoutMs: number,\n hasUpdate: () => boolean,\n): Promise<TelegramUpdatePollResult> {\n if (state.closing || request.socket.destroyed) {\n return \"shutdown\";\n }\n return await new Promise<TelegramUpdatePollResult>((resolve) => {\n let settled = false;\n const poll: TelegramUpdatePoll = {\n finish(result) {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n request.socket.off(\"close\", onSocketClose);\n if (state.activeUpdatePoll === poll) {\n state.activeUpdatePoll = undefined;\n }\n resolve(result);\n },\n };\n const onSocketClose = () => poll.finish(\"shutdown\");\n const timer = setTimeout(() => poll.finish(\"timeout\"), timeoutMs);\n timer.unref();\n const previousPoll = state.activeUpdatePoll;\n state.activeUpdatePoll = poll;\n previousPoll?.finish(\"conflict\");\n request.socket.once(\"close\", onSocketClose);\n if (state.closing || request.socket.destroyed) {\n poll.finish(\"shutdown\");\n } else if (hasUpdate()) {\n poll.finish(\"update\");\n }\n });\n}\n\nfunction telegramMethodNotAllowed(): Response {\n const response = telegramError(\"Method Not Allowed\", 405);\n response.headers.set(\"allow\", \"GET, POST\");\n return response;\n}\n\nasync function handleRequest(params: { request: IncomingMessage; state: TelegramServerState }) {\n const url = new URL(params.request.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname === \"/crabline/telegram/inbound\") {\n if (params.request.method !== \"POST\") {\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 parseRequestBody(params.request);\n if (!isJsonObject(body)) {\n return telegramError(\"Bad Request: request body must be a JSON object\");\n }\n return await handleTelegramAdminInbound({\n body,\n request: params.request,\n state: params.state,\n url,\n });\n }\n\n const botPath = requireTelegramBotPath(url.pathname);\n if (!botPath || botPath.token !== params.state.botToken) {\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n }\n const requestMethod = params.request.method ?? \"GET\";\n if (requestMethod !== \"GET\" && requestMethod !== \"POST\") {\n drainRequestBody(params.request);\n return telegramMethodNotAllowed();\n }\n const body = requestMethod === \"GET\" ? queryRecord(url) : await parseRequestBody(params.request);\n if (!isJsonObject(body)) {\n return telegramError(\"Bad Request: can't parse JSON object\");\n }\n const event: TelegramServerEvent = {\n at: new Date().toISOString(),\n body: redactTelegramSecrets(body),\n method: requestMethod,\n path: `/bot<redacted>/${botPath.method}`,\n query: redactTelegramSecrets(queryRecord(url)),\n type: \"api\",\n };\n if (TELEGRAM_SEND_METHODS.has(botPath.method.toLowerCase())) {\n const response = await handleTelegramApi({\n body,\n method: botPath.method,\n request: params.request,\n state: params.state,\n });\n event.accepted = response.ok;\n try {\n await appendEvent(params.state, event);\n } catch (error) {\n if (!event.accepted) {\n throw error;\n }\n }\n return response;\n }\n const response = await handleTelegramApi({\n body,\n method: botPath.method,\n request: params.request,\n state: params.state,\n });\n event.accepted = response.ok;\n await appendEvent(params.state, event);\n return response;\n}\n\nasync function serveRequest(params: {\n request: IncomingMessage;\n response: ServerResponse;\n state: TelegramServerState;\n}): Promise<void> {\n let fetchResponse: Response;\n try {\n fetchResponse = await handleRequest({ request: params.request, state: params.state });\n } catch (error) {\n fetchResponse =\n error instanceof InvalidJsonBodyError\n ? telegramError(\"Bad Request: can't parse JSON object\")\n : error instanceof RequestBodyTooLargeError\n ? telegramError(\"Request Entity Too Large\", 413)\n : jsonResponse({ error: \"internal server error\", ok: false }, 500);\n }\n\n try {\n await writeResponse(params.response, fetchResponse);\n } catch {\n // A disconnected client cannot receive an error fallback. End delivery here\n // so the Node request callback never leaks an unhandled rejection.\n params.response.destroy();\n }\n}\n\nexport async function startTelegramServer(\n params: StartTelegramServerParams = {},\n): Promise<StartedTelegramServer> {\n const host = params.host ?? \"127.0.0.1\";\n if (params.botHasTopicsEnabled !== undefined && typeof params.botHasTopicsEnabled !== \"boolean\") {\n throw new Error(\"botHasTopicsEnabled must be a boolean.\");\n }\n const botId = params.botId ?? 424242;\n if (!Number.isSafeInteger(botId) || botId < 1) {\n throw new Error(\"botId must be a positive safe integer.\");\n }\n const botUsernameValue = params.botUsername ?? \"crabline_bot\";\n const botUsername = botUsernameValue.trim().replace(/^@/u, \"\").toLowerCase();\n if (!TELEGRAM_BOT_USERNAME_PATTERN.test(`@${botUsername}`)) {\n throw new Error(\"botUsername must be a valid 5-32 character Telegram username.\");\n }\n const recorderPath =\n params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"telegram.jsonl\");\n const state: TelegramServerState = {\n activeUpdatePoll: undefined,\n activeWebhookDeliveries: new Set(),\n activeWebhookValidations: new Set(),\n adminToken: params.adminToken ?? randomBytes(24).toString(\"hex\"),\n allowLoopbackHttpWebhook: isLoopbackHost(host),\n botHasTopicsEnabled: params.botHasTopicsEnabled ?? true,\n botId,\n botToken:\n params.botToken ??\n (isLoopbackHost(host)\n ? \"424242:crabline-telegram-token\"\n : `${botId}:${randomBytes(26).toString(\"base64url\")}`),\n botUsername,\n chatsById: new Map(),\n chatsByUsername: new Map(),\n inboundAdmission: Promise.resolve(),\n maxPendingInboundEvents: resolveMaxPendingInboundEvents(params.maxPendingInboundEvents),\n nextMessageIds: new Map(),\n nextUpdateId: 1,\n recorder: createServerRecorder({ recorderPath, onEvent: params.onEvent }),\n recorderPath,\n restrictWebhookTargets: true,\n closing: false,\n updates: [],\n webhook: undefined,\n webhookAdmission: Promise.resolve(),\n webhookDelivery: undefined,\n webhookRetryAttempts: 0,\n webhookRetryTimer: undefined,\n webhookRetryUpdateId: undefined,\n };\n const port = params.port ?? 0;\n const server = createServer((request, response) => {\n void serveRequest({ request, response, state });\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, host, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address();\n if (!address || typeof address === \"string\") {\n throw new CrablineError(\"Unable to resolve Telegram local server address.\", {\n kind: \"connectivity\",\n });\n }\n const baseUrl = `http://${formatUrlHost(host)}:${address.port}`;\n return {\n close: createServerClose(state.recorder, async () => {\n state.closing = true;\n finishTelegramUpdatePoll(state, \"shutdown\");\n clearTelegramWebhookRetry(state);\n for (const controller of state.activeWebhookDeliveries) {\n controller.abort();\n }\n for (const controller of state.activeWebhookValidations) {\n controller.abort();\n }\n await state.webhookDelivery;\n await state.webhookAdmission;\n await closeServer(server);\n }),\n manifest: {\n adminToken: state.adminToken,\n baseUrl,\n botToken: state.botToken,\n endpoints: {\n adminInboundUrl: `${baseUrl}/crabline/telegram/inbound`,\n apiRoot: baseUrl,\n },\n env: {\n TELEGRAM_BOT_TOKEN: state.botToken,\n },\n provider: \"telegram\",\n recorderPath: state.recorderPath,\n version: 1,\n },\n };\n}\n"]}