@openclaw/crabline 0.1.9 → 0.1.11

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 (189) hide show
  1. package/README.md +47 -22
  2. package/assets/crabline-banner.svg +20 -0
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +25 -1
  5. package/dist/src/cli/program.js +579 -82
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +59 -6
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +116 -92
  10. package/dist/src/config/schema.js +179 -73
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.js +9 -2
  13. package/dist/src/core/errors.js.map +1 -1
  14. package/dist/src/core/exit-codes.js.map +1 -1
  15. package/dist/src/core/matcher.js +7 -6
  16. package/dist/src/core/matcher.js.map +1 -1
  17. package/dist/src/core/message-template.js.map +1 -1
  18. package/dist/src/core/nonces.d.ts +1 -0
  19. package/dist/src/core/nonces.js +4 -2
  20. package/dist/src/core/nonces.js.map +1 -1
  21. package/dist/src/core/reporters.d.ts +1 -0
  22. package/dist/src/core/reporters.js +42 -4
  23. package/dist/src/core/reporters.js.map +1 -1
  24. package/dist/src/core/run.d.ts +3 -0
  25. package/dist/src/core/run.js +415 -107
  26. package/dist/src/core/run.js.map +1 -1
  27. package/dist/src/core/safe-regex.d.ts +3 -0
  28. package/dist/src/core/safe-regex.js +21 -0
  29. package/dist/src/core/safe-regex.js.map +1 -0
  30. package/dist/src/index.d.ts +2 -2
  31. package/dist/src/index.js +1 -1
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/openclaw/artifact-generation.d.ts +43 -0
  34. package/dist/src/openclaw/artifact-generation.js +363 -0
  35. package/dist/src/openclaw/artifact-generation.js.map +1 -0
  36. package/dist/src/openclaw/bridges/matrix.js +97 -12
  37. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  38. package/dist/src/openclaw/bridges/mattermost.js +32 -10
  39. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  40. package/dist/src/openclaw/bridges/signal.js +55 -18
  41. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  42. package/dist/src/openclaw/bridges/slack.js +85 -7
  43. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  44. package/dist/src/openclaw/bridges/telegram.js +124 -30
  45. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  46. package/dist/src/openclaw/bridges/whatsapp.js +78 -17
  47. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  48. package/dist/src/openclaw/bridges/zalo.js +14 -5
  49. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  50. package/dist/src/openclaw/outbound-contract.d.ts +5 -0
  51. package/dist/src/openclaw/outbound-contract.js +40 -0
  52. package/dist/src/openclaw/outbound-contract.js.map +1 -0
  53. package/dist/src/openclaw/private-file.d.ts +28 -0
  54. package/dist/src/openclaw/private-file.js +465 -0
  55. package/dist/src/openclaw/private-file.js.map +1 -0
  56. package/dist/src/openclaw/shared.d.ts +21 -2
  57. package/dist/src/openclaw/shared.js +115 -18
  58. package/dist/src/openclaw/shared.js.map +1 -1
  59. package/dist/src/openclaw/smoke-lock.d.ts +63 -0
  60. package/dist/src/openclaw/smoke-lock.js +1004 -0
  61. package/dist/src/openclaw/smoke-lock.js.map +1 -0
  62. package/dist/src/openclaw.d.ts +16 -8
  63. package/dist/src/openclaw.js +334 -52
  64. package/dist/src/openclaw.js.map +1 -1
  65. package/dist/src/providers/builtin/discord.d.ts +10 -1
  66. package/dist/src/providers/builtin/discord.js +144 -18
  67. package/dist/src/providers/builtin/discord.js.map +1 -1
  68. package/dist/src/providers/builtin/external-webhook-auth.d.ts +11 -0
  69. package/dist/src/providers/builtin/external-webhook-auth.js +10 -0
  70. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -0
  71. package/dist/src/providers/builtin/feishu.d.ts +19 -2
  72. package/dist/src/providers/builtin/feishu.js +307 -25
  73. package/dist/src/providers/builtin/feishu.js.map +1 -1
  74. package/dist/src/providers/builtin/googlechat.d.ts +20 -1
  75. package/dist/src/providers/builtin/googlechat.js +178 -19
  76. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  77. package/dist/src/providers/builtin/imessage.d.ts +4 -0
  78. package/dist/src/providers/builtin/imessage.js +26 -11
  79. package/dist/src/providers/builtin/imessage.js.map +1 -1
  80. package/dist/src/providers/builtin/loopback.js +92 -30
  81. package/dist/src/providers/builtin/loopback.js.map +1 -1
  82. package/dist/src/providers/builtin/matrix.d.ts +11 -1
  83. package/dist/src/providers/builtin/matrix.js +53 -29
  84. package/dist/src/providers/builtin/matrix.js.map +1 -1
  85. package/dist/src/providers/builtin/mattermost.d.ts +10 -0
  86. package/dist/src/providers/builtin/mattermost.js +38 -15
  87. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  88. package/dist/src/providers/builtin/msteams.d.ts +17 -1
  89. package/dist/src/providers/builtin/msteams.js +113 -14
  90. package/dist/src/providers/builtin/msteams.js.map +1 -1
  91. package/dist/src/providers/builtin/native-local-mock.d.ts +2 -9
  92. package/dist/src/providers/builtin/native-local-mock.js +12 -35
  93. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  94. package/dist/src/providers/builtin/script.d.ts +11 -15
  95. package/dist/src/providers/builtin/script.js +566 -104
  96. package/dist/src/providers/builtin/script.js.map +1 -1
  97. package/dist/src/providers/builtin/slack.d.ts +6 -0
  98. package/dist/src/providers/builtin/slack.js +99 -40
  99. package/dist/src/providers/builtin/slack.js.map +1 -1
  100. package/dist/src/providers/builtin/telegram.d.ts +6 -0
  101. package/dist/src/providers/builtin/telegram.js +64 -43
  102. package/dist/src/providers/builtin/telegram.js.map +1 -1
  103. package/dist/src/providers/builtin/whatsapp.d.ts +28 -8
  104. package/dist/src/providers/builtin/whatsapp.js +567 -30
  105. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  106. package/dist/src/providers/builtin/zalo.js +30 -19
  107. package/dist/src/providers/builtin/zalo.js.map +1 -1
  108. package/dist/src/providers/catalog.d.ts +3 -3
  109. package/dist/src/providers/catalog.js +3 -3
  110. package/dist/src/providers/catalog.js.map +1 -1
  111. package/dist/src/providers/local-mock.d.ts +11 -2
  112. package/dist/src/providers/local-mock.js +322 -96
  113. package/dist/src/providers/local-mock.js.map +1 -1
  114. package/dist/src/providers/native-ids.d.ts +1 -0
  115. package/dist/src/providers/native-ids.js +6 -1
  116. package/dist/src/providers/native-ids.js.map +1 -1
  117. package/dist/src/providers/recorder.d.ts +30 -2
  118. package/dist/src/providers/recorder.js +549 -70
  119. package/dist/src/providers/recorder.js.map +1 -1
  120. package/dist/src/providers/registry.d.ts +25 -1
  121. package/dist/src/providers/registry.js +280 -40
  122. package/dist/src/providers/registry.js.map +1 -1
  123. package/dist/src/providers/signed-jwt.d.ts +29 -0
  124. package/dist/src/providers/signed-jwt.js +202 -0
  125. package/dist/src/providers/signed-jwt.js.map +1 -0
  126. package/dist/src/providers/slack-ids.js.map +1 -1
  127. package/dist/src/providers/target-normalizers.d.ts +26 -0
  128. package/dist/src/providers/target-normalizers.js +276 -0
  129. package/dist/src/providers/target-normalizers.js.map +1 -0
  130. package/dist/src/providers/types.d.ts +5 -0
  131. package/dist/src/providers/types.js.map +1 -1
  132. package/dist/src/providers/webhook-server.d.ts +2 -0
  133. package/dist/src/providers/webhook-server.js +72 -25
  134. package/dist/src/providers/webhook-server.js.map +1 -1
  135. package/dist/src/servers/http.d.ts +23 -3
  136. package/dist/src/servers/http.js +213 -20
  137. package/dist/src/servers/http.js.map +1 -1
  138. package/dist/src/servers/index.js +20 -21
  139. package/dist/src/servers/index.js.map +1 -1
  140. package/dist/src/servers/matrix.js +465 -51
  141. package/dist/src/servers/matrix.js.map +1 -1
  142. package/dist/src/servers/mattermost.d.ts +5 -0
  143. package/dist/src/servers/mattermost.js +306 -58
  144. package/dist/src/servers/mattermost.js.map +1 -1
  145. package/dist/src/servers/pending-events.d.ts +2 -0
  146. package/dist/src/servers/pending-events.js +11 -0
  147. package/dist/src/servers/pending-events.js.map +1 -0
  148. package/dist/src/servers/recorder.d.ts +5 -0
  149. package/dist/src/servers/recorder.js +262 -3
  150. package/dist/src/servers/recorder.js.map +1 -1
  151. package/dist/src/servers/signal.d.ts +2 -0
  152. package/dist/src/servers/signal.js +444 -56
  153. package/dist/src/servers/signal.js.map +1 -1
  154. package/dist/src/servers/slack.d.ts +5 -0
  155. package/dist/src/servers/slack.js +515 -49
  156. package/dist/src/servers/slack.js.map +1 -1
  157. package/dist/src/servers/telegram.d.ts +111 -0
  158. package/dist/src/servers/telegram.js +830 -158
  159. package/dist/src/servers/telegram.js.map +1 -1
  160. package/dist/src/servers/webhook-target.d.ts +40 -0
  161. package/dist/src/servers/webhook-target.js +349 -0
  162. package/dist/src/servers/webhook-target.js.map +1 -0
  163. package/dist/src/servers/websocket.d.ts +2 -0
  164. package/dist/src/servers/websocket.js +29 -0
  165. package/dist/src/servers/websocket.js.map +1 -0
  166. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +65 -1
  167. package/dist/src/servers/whatsapp-baileys-websocket.js +723 -99
  168. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  169. package/dist/src/servers/whatsapp-jid.d.ts +5 -0
  170. package/dist/src/servers/whatsapp-jid.js +32 -0
  171. package/dist/src/servers/whatsapp-jid.js.map +1 -0
  172. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +5 -0
  173. package/dist/src/servers/whatsapp-wire/binary-node.js +87 -20
  174. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  175. package/dist/src/servers/whatsapp-wire/crypto.d.ts +6 -1
  176. package/dist/src/servers/whatsapp-wire/crypto.js +99 -45
  177. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  178. package/dist/src/servers/whatsapp-wire/handshake.js +39 -4
  179. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  180. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  181. package/dist/src/servers/whatsapp.d.ts +12 -7
  182. package/dist/src/servers/whatsapp.js +269 -107
  183. package/dist/src/servers/whatsapp.js.map +1 -1
  184. package/dist/src/servers/zalo.d.ts +14 -0
  185. package/dist/src/servers/zalo.js +521 -88
  186. package/dist/src/servers/zalo.js.map +1 -1
  187. package/docs/channel-setup.md +197 -19
  188. package/fixtures/examples/crabline.example.yaml +10 -0
  189. package/package.json +20 -15
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../src/servers/telegram.ts"],"names":[],"mappings":"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"}
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 { randomBytes } from \"node:crypto\";\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 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\";\n\nconst TELEGRAM_MAX_REQUEST_BODY_BYTES = 50 * 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_CHAT_USERNAME_PATTERN = /^@[A-Za-z][A-Za-z0-9_]{3,31}$/u;\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;\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 botId: number;\n botToken: string;\n botUsername: string;\n closing: boolean;\n inboundAdmission: Promise<void>;\n maxPendingInboundEvents: number;\n nextMessageId: 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\ntype TelegramMessage = {\n chat: {\n id: number | string;\n title?: string;\n type: \"group\" | \"private\" | \"supergroup\";\n };\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 length: number;\n offset: number;\n type: string;\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 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 body = await readBody(request, TELEGRAM_MAX_REQUEST_BODY_BYTES);\n if (body.length === 0) {\n return {};\n }\n const contentType = request.headers[\"content-type\"] ?? \"\";\n const contentTypes = Array.isArray(contentType) ? contentType : [contentType];\n if (contentTypes.some((entry) => entry.toLowerCase().includes(\"json\"))) {\n try {\n return JSON.parse(body.toString(\"utf8\")) as unknown;\n } catch (error) {\n throw new InvalidJsonBodyError(error);\n }\n }\n const multipartType = contentTypes.find((entry) =>\n entry.toLowerCase().includes(\"multipart/form-data\"),\n );\n if (multipartType) {\n return await parseMultipartFormDataBody(body, multipartType);\n }\n const params = new URLSearchParams(body.toString(\"utf8\"));\n return Object.fromEntries(params.entries());\n}\n\nasync function parseMultipartFormDataBody(\n body: Buffer,\n contentType: string,\n): Promise<Record<string, unknown>> {\n let form: FormData;\n try {\n form = await new Request(\"http://localhost\", {\n body,\n headers: { \"content-type\": contentType },\n method: \"POST\",\n }).formData();\n } catch (error) {\n throw new InvalidJsonBodyError(error);\n }\n const fields: Record<string, unknown> = {};\n for (const [name, value] of form) {\n fields[name] = typeof value === \"string\" ? value : value.name;\n }\n return fields;\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 | string | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue) {\n return undefined;\n }\n if (/^-?\\d+$/u.test(stringValue)) {\n const integerValue = toIntegerValue(stringValue);\n return integerValue === 0 ? undefined : integerValue;\n }\n return TELEGRAM_CHAT_USERNAME_PATTERN.test(stringValue) ? stringValue : undefined;\n}\n\nasync function appendEvent(state: TelegramServerState, event: TelegramServerEvent) {\n await recordServerEvent({ event, onEvent: state.onEvent, recorderPath: state.recorderPath });\n}\n\nfunction redactTelegramSecrets<T>(body: Record<string, T>): Record<string, T | string> {\n return Object.fromEntries(\n Object.entries(body).map(([key, value]) => [\n key,\n key === \"secret_token\" ? \"<redacted>\" : 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 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 createChat(chatId: number | string): TelegramMessage[\"chat\"] {\n const type =\n typeof chatId === \"string\"\n ? \"supergroup\"\n : chatId >= 0\n ? \"private\"\n : String(chatId).startsWith(\"-100\")\n ? \"supergroup\"\n : \"group\";\n return {\n id: chatId,\n type,\n };\n}\n\nfunction createOutboundMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): TelegramMessage | undefined {\n const chatId = telegramChatId(body.chat_id);\n const text = toStringValue(body.text);\n if (chatId === undefined || !text) {\n return undefined;\n }\n const parsedThreadId = toIntegerValue(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n const threadId = parsedThreadId !== undefined && parsedThreadId > 0 ? parsedThreadId : undefined;\n return {\n chat: createChat(chatId),\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n message_id: state.nextMessageId++,\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n text,\n };\n}\n\nfunction createOutboundMediaMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n mediaKind: \"animation\" | \"audio\" | \"document\" | \"photo\" | \"video\",\n): TelegramMessage | undefined {\n const chatId = telegramChatId(body.chat_id);\n const fileName = toStringValue(body[mediaKind]);\n if (chatId === undefined || !fileName) {\n return undefined;\n }\n const parsedThreadId = toIntegerValue(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n const threadId = parsedThreadId !== undefined && parsedThreadId > 0 ? parsedThreadId : undefined;\n const caption = toStringValue(body.caption);\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 media = {\n file_id: `crabline-${mediaKind}-${state.nextMessageId}`,\n file_name: fileName,\n file_unique_id: `crabline-${mediaKind}-unique-${state.nextMessageId}`,\n };\n return {\n chat: createChat(chatId),\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n ...(caption ? { caption } : {}),\n [mediaKind]:\n mediaKind === \"photo\"\n ? [{ ...media, height: 1, width: 1 }]\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: state.nextMessageId++,\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n };\n}\n\nfunction createEditedMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): TelegramMessage | undefined {\n const chatId = telegramChatId(body.chat_id);\n const text = toStringValue(body.text);\n const messageId = toIntegerValue(body.message_id);\n if (chatId === undefined || !text || messageId === undefined) {\n return undefined;\n }\n const parsedThreadId = toIntegerValue(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n const threadId = parsedThreadId !== undefined && parsedThreadId > 0 ? parsedThreadId : undefined;\n return {\n chat: createChat(chatId),\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n message_id: messageId,\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n text,\n };\n}\n\nfunction createInboundUpdate(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): TelegramUpdate | undefined {\n const chatId = telegramChatId(body.chatId ?? body.chat_id);\n const text = toStringValue(body.text);\n if (chatId === undefined || !text) {\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 parsedThreadId = toIntegerValue(threadIdValue);\n const threadId = parsedThreadId !== undefined && parsedThreadId > 0 ? parsedThreadId : undefined;\n const fromUsername = toStringValue(body.fromUsername ?? body.from_username);\n const messageId = toIntegerValue(messageIdValue);\n const updateId = toIntegerValue(updateIdValue);\n if (\n (fromIdValue !== undefined && fromId === undefined) ||\n (threadIdValue !== undefined && parsedThreadId === undefined) ||\n (messageIdValue !== undefined && messageId === undefined) ||\n (updateIdValue !== undefined && updateId === undefined)\n ) {\n return undefined;\n }\n const entities = parseTelegramEntities(body.entities, text);\n if (body.entities !== undefined && !entities) {\n return undefined;\n }\n return {\n message: {\n chat: createChat(chatId),\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 ?? state.nextMessageId,\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): Array<{ length: number; offset: number; type: string }> | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n return undefined;\n }\n const entities: Array<{ length: number; offset: number; type: string }> = [];\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 = toStringValue(entry.type);\n if (\n length === undefined ||\n length < 1 ||\n offset === undefined ||\n offset < 0 ||\n offset + length > text.length ||\n !type\n ) {\n return undefined;\n }\n entities.push({ length, offset, type });\n }\n return entities;\n}\n\nfunction hasTelegramMedia(value: Record<string, unknown>): boolean {\n return TELEGRAM_MEDIA_FIELDS.some((field) => value[field] !== undefined);\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.messageThreadId,\n body.message_thread_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 if (\n updateId === undefined ||\n !chat ||\n telegramChatId(chat.id) === undefined ||\n toIntegerValue(message.message_id) === undefined ||\n (message.from !== undefined &&\n (!isJsonObject(message.from) || toIntegerValue(message.from.id) === undefined)) ||\n (message.message_thread_id !== undefined &&\n toIntegerValue(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 nextMessageId = params.state.nextMessageId;\n const nextUpdateId = params.state.nextUpdateId;\n const update = createInboundUpdate(params.state, params.body);\n params.state.nextMessageId = nextMessageId;\n params.state.nextUpdateId = nextUpdateId;\n if (!update) {\n if (isValidIgnoredTelegramUpdate(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 params.state.nextMessageId = Math.max(\n params.state.nextMessageId,\n update.message.message_id + 1,\n );\n params.state.nextUpdateId = Math.max(params.state.nextUpdateId, update.update_id + 1);\n const reservedNextMessageId = params.state.nextMessageId;\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.nextMessageId === reservedNextMessageId) {\n params.state.nextMessageId = nextMessageId;\n }\n if (params.state.nextUpdateId === reservedNextUpdateId) {\n params.state.nextUpdateId = nextUpdateId;\n }\n throw error;\n }\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 \"sendchataction\":\n case \"answercallbackquery\":\n case \"deletemessage\":\n case \"pinchatmessage\":\n case \"unpinchatmessage\":\n case \"setmessagereaction\":\n case \"editforumtopic\":\n return telegramOk(true);\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 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 const secretToken = toStringValue(params.body.secret_token);\n if (secretToken && !/^[A-Za-z0-9_-]{1,256}$/u.test(secretToken)) {\n return telegramError(\"Bad Request: invalid secret token\");\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 return telegramOk({\n icon_color: 0x6fb9f0,\n message_thread_id: params.state.nextMessageId++,\n name: toStringValue(params.body.name) ?? \"Crabline Topic\",\n });\n case \"editmessagetext\": {\n const message = createEditedMessage(params.state, params.body);\n return message\n ? telegramOk(message)\n : telegramError(\"Bad Request: chat_id, message_id, and text are required\");\n }\n case \"sendmessage\": {\n const message = createOutboundMessage(params.state, params.body);\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 message = createOutboundMediaMessage(params.state, params.body, mediaKind);\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 await appendEvent(params.state, event);\n return await handleTelegramApi({\n body,\n method: botPath.method,\n request: params.request,\n state: params.state,\n });\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 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 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 botId,\n botToken:\n params.botToken ??\n (isLoopbackHost(host)\n ? \"424242:crabline-telegram-token\"\n : `${botId}:${randomBytes(26).toString(\"base64url\")}`),\n botUsername: params.botUsername ?? \"crabline_bot\",\n inboundAdmission: Promise.resolve(),\n maxPendingInboundEvents: resolveMaxPendingInboundEvents(params.maxPendingInboundEvents),\n nextMessageId: 1,\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"]}
@@ -0,0 +1,40 @@
1
+ import { type ClientRequest } from "node:http";
2
+ export type WebhookAddress = {
3
+ address: string;
4
+ family: 4 | 6;
5
+ };
6
+ export type WebhookTargetError = "https-required" | "private-address" | "unresolvable";
7
+ export type ValidatedWebhookTarget = {
8
+ addresses: WebhookAddress[] | undefined;
9
+ } | {
10
+ error: WebhookTargetError;
11
+ };
12
+ export declare const MAX_CONCURRENT_WEBHOOK_DNS_LOOKUPS = 8;
13
+ type WebhookDnsLookupResult = ReadonlyArray<{
14
+ address: string;
15
+ family: number;
16
+ }>;
17
+ type WebhookDnsLookup = (hostname: string) => Promise<WebhookDnsLookupResult>;
18
+ export declare class WebhookDnsLookupPool {
19
+ #private;
20
+ private readonly maxConcurrent;
21
+ private readonly lookupHostname;
22
+ constructor(maxConcurrent: number, lookupHostname?: WebhookDnsLookup);
23
+ resolve(hostname: string, signal?: AbortSignal): Promise<WebhookDnsLookupResult>;
24
+ }
25
+ export declare function validateWebhookTarget(params: {
26
+ allowLoopbackHttp: boolean;
27
+ restrictPrivateAddresses: boolean;
28
+ signal?: AbortSignal | undefined;
29
+ url: URL;
30
+ }): Promise<ValidatedWebhookTarget>;
31
+ export declare function postWebhookRequest(params: {
32
+ activeRequests?: Set<ClientRequest> | undefined;
33
+ address?: WebhookAddress | undefined;
34
+ body: string;
35
+ headerEntries?: ReadonlyArray<readonly [string, string]> | undefined;
36
+ signal?: AbortSignal | undefined;
37
+ timeoutMs: number;
38
+ url: URL;
39
+ }): Promise<number>;
40
+ export {};
@@ -0,0 +1,349 @@
1
+ import { lookup } from "node:dns/promises";
2
+ import { request as requestHttp } from "node:http";
3
+ import { request as requestHttps } from "node:https";
4
+ import { BlockList, isIP } from "node:net";
5
+ import { isLoopbackHost } from "./http.js";
6
+ export const MAX_CONCURRENT_WEBHOOK_DNS_LOOKUPS = 8;
7
+ const BLOCKED_IPV4_ADDRESSES = createBlockedIpv4Addresses();
8
+ const BLOCKED_IPV6_ADDRESSES = createBlockedIpv6Addresses();
9
+ const GLOBAL_IPV4_EXCEPTIONS = createGlobalIpv4Exceptions();
10
+ const GLOBAL_IPV6_EXCEPTIONS = createGlobalIpv6Exceptions();
11
+ const ALLOCATED_GLOBAL_IPV6_RANGES = createAllocatedGlobalIpv6Ranges();
12
+ export class WebhookDnsLookupPool {
13
+ maxConcurrent;
14
+ lookupHostname;
15
+ #pending = [];
16
+ #active = 0;
17
+ constructor(maxConcurrent, lookupHostname = async (hostname) => await lookup(hostname, { all: true, verbatim: true })) {
18
+ this.maxConcurrent = maxConcurrent;
19
+ this.lookupHostname = lookupHostname;
20
+ if (!Number.isSafeInteger(maxConcurrent) || maxConcurrent < 1) {
21
+ throw new Error("Webhook DNS lookup concurrency must be a positive safe integer.");
22
+ }
23
+ }
24
+ resolve(hostname, signal) {
25
+ return new Promise((resolve, reject) => {
26
+ const pending = {
27
+ hostname,
28
+ onAbort: () => {
29
+ if (pending.settled) {
30
+ return;
31
+ }
32
+ pending.settled = true;
33
+ if (!pending.started) {
34
+ const index = this.#pending.indexOf(pending);
35
+ if (index >= 0) {
36
+ this.#pending.splice(index, 1);
37
+ }
38
+ }
39
+ signal?.removeEventListener("abort", pending.onAbort);
40
+ reject(abortSignalError(signal));
41
+ this.#pump();
42
+ },
43
+ reject,
44
+ resolve,
45
+ settled: false,
46
+ signal,
47
+ started: false,
48
+ };
49
+ if (signal?.aborted) {
50
+ pending.onAbort();
51
+ return;
52
+ }
53
+ signal?.addEventListener("abort", pending.onAbort, { once: true });
54
+ this.#pending.push(pending);
55
+ this.#pump();
56
+ });
57
+ }
58
+ #pump() {
59
+ while (this.#active < this.maxConcurrent) {
60
+ const pending = this.#pending.shift();
61
+ if (!pending) {
62
+ return;
63
+ }
64
+ if (pending.settled) {
65
+ continue;
66
+ }
67
+ pending.started = true;
68
+ this.#active += 1;
69
+ void this.lookupHostname(pending.hostname)
70
+ .then((addresses) => {
71
+ if (!pending.settled) {
72
+ pending.settled = true;
73
+ pending.resolve(addresses);
74
+ }
75
+ }, (error) => {
76
+ if (!pending.settled) {
77
+ pending.settled = true;
78
+ pending.reject(error);
79
+ }
80
+ })
81
+ .finally(() => {
82
+ pending.signal?.removeEventListener("abort", pending.onAbort);
83
+ this.#active -= 1;
84
+ this.#pump();
85
+ });
86
+ }
87
+ }
88
+ }
89
+ const webhookDnsLookupPool = new WebhookDnsLookupPool(MAX_CONCURRENT_WEBHOOK_DNS_LOOKUPS);
90
+ function abortSignalError(signal) {
91
+ return signal?.reason instanceof Error
92
+ ? signal.reason
93
+ : new DOMException("Webhook DNS lookup aborted", "AbortError");
94
+ }
95
+ function createBlockedIpv4Addresses() {
96
+ const blockList = new BlockList();
97
+ for (const [address, prefix] of [
98
+ ["0.0.0.0", 8],
99
+ ["10.0.0.0", 8],
100
+ ["100.64.0.0", 10],
101
+ ["127.0.0.0", 8],
102
+ ["169.254.0.0", 16],
103
+ ["172.16.0.0", 12],
104
+ ["192.0.0.0", 24],
105
+ ["192.0.2.0", 24],
106
+ ["192.88.99.0", 24],
107
+ ["192.168.0.0", 16],
108
+ ["198.18.0.0", 15],
109
+ ["198.51.100.0", 24],
110
+ ["203.0.113.0", 24],
111
+ ["224.0.0.0", 4],
112
+ ["240.0.0.0", 4],
113
+ ]) {
114
+ blockList.addSubnet(address, prefix, "ipv4");
115
+ }
116
+ return blockList;
117
+ }
118
+ function createBlockedIpv6Addresses() {
119
+ const blockList = new BlockList();
120
+ for (const [address, prefix] of [
121
+ ["::", 96],
122
+ ["::ffff:0:0", 96],
123
+ ["64:ff9b:1::", 48],
124
+ ["100::", 64],
125
+ ["100:0:0:1::", 64],
126
+ ["2001::", 23],
127
+ ["2001:db8::", 32],
128
+ ["2002::", 16],
129
+ ["3fff::", 20],
130
+ ["5f00::", 16],
131
+ ["fc00::", 7],
132
+ ["fe80::", 10],
133
+ ["ff00::", 8],
134
+ ]) {
135
+ blockList.addSubnet(address, prefix, "ipv6");
136
+ }
137
+ return blockList;
138
+ }
139
+ function createGlobalIpv4Exceptions() {
140
+ const blockList = new BlockList();
141
+ // These are globally reachable assignments inside 192.0.0.0/24.
142
+ for (const address of ["192.0.0.9", "192.0.0.10"]) {
143
+ blockList.addAddress(address, "ipv4");
144
+ }
145
+ return blockList;
146
+ }
147
+ function createGlobalIpv6Exceptions() {
148
+ const blockList = new BlockList();
149
+ // These are globally reachable assignments inside 2001::/23.
150
+ for (const [address, prefix] of [
151
+ ["2001:1::1", 128],
152
+ ["2001:1::2", 128],
153
+ ["2001:1::3", 128],
154
+ ["2001:3::", 32],
155
+ ["2001:4:112::", 48],
156
+ ["2001:20::", 28],
157
+ ["2001:30::", 28],
158
+ ]) {
159
+ blockList.addSubnet(address, prefix, "ipv6");
160
+ }
161
+ return blockList;
162
+ }
163
+ function createAllocatedGlobalIpv6Ranges() {
164
+ const blockList = new BlockList();
165
+ // IANA reserves unlisted portions of 2000::/3 for future allocation.
166
+ for (const [address, prefix] of [
167
+ ["2001:200::", 23],
168
+ ["2001:400::", 23],
169
+ ["2001:600::", 23],
170
+ ["2001:800::", 22],
171
+ ["2001:c00::", 23],
172
+ ["2001:e00::", 23],
173
+ ["2001:1200::", 23],
174
+ ["2001:1400::", 22],
175
+ ["2001:1800::", 23],
176
+ ["2001:1a00::", 23],
177
+ ["2001:1c00::", 22],
178
+ ["2001:2000::", 19],
179
+ ["2001:4000::", 23],
180
+ ["2001:4200::", 23],
181
+ ["2001:4400::", 23],
182
+ ["2001:4600::", 23],
183
+ ["2001:4800::", 23],
184
+ ["2001:4a00::", 23],
185
+ ["2001:4c00::", 23],
186
+ ["2001:5000::", 20],
187
+ ["2001:8000::", 19],
188
+ ["2001:a000::", 20],
189
+ ["2001:b000::", 20],
190
+ ["2003::", 18],
191
+ ["2400::", 12],
192
+ ["2410::", 12],
193
+ ["2600::", 12],
194
+ ["2610::", 23],
195
+ ["2620::", 23],
196
+ ["2630::", 12],
197
+ ["2800::", 12],
198
+ ["2a00::", 12],
199
+ ["2a10::", 12],
200
+ ["2c00::", 12],
201
+ ]) {
202
+ blockList.addSubnet(address, prefix, "ipv6");
203
+ }
204
+ blockList.addSubnet("64:ff9b::", 96, "ipv6");
205
+ return blockList;
206
+ }
207
+ function normalizeHostname(hostname) {
208
+ return hostname.replace(/^\[(.*)\]$/u, "$1").replace(/%25/gu, "%");
209
+ }
210
+ function parseIpv6Hextets(address) {
211
+ const sections = address.split("::");
212
+ if (sections.length > 2) {
213
+ return undefined;
214
+ }
215
+ const parseSection = (section) => section
216
+ ? section.split(":").flatMap((value) => {
217
+ if (!value.includes(".")) {
218
+ return [Number.parseInt(value, 16)];
219
+ }
220
+ const octets = value.split(".").map(Number);
221
+ return [(octets[0] << 8) | octets[1], (octets[2] << 8) | octets[3]];
222
+ })
223
+ : [];
224
+ const leading = parseSection(sections[0]);
225
+ const trailing = parseSection(sections[1] ?? "");
226
+ const omitted = sections.length === 2 ? 8 - leading.length - trailing.length : 0;
227
+ const hextets = [...leading, ...Array.from({ length: omitted }, () => 0), ...trailing];
228
+ return hextets.length === 8 ? hextets : undefined;
229
+ }
230
+ function embeddedNat64Ipv4(address) {
231
+ const hextets = parseIpv6Hextets(address);
232
+ if (!hextets ||
233
+ hextets[0] !== 0x64 ||
234
+ hextets[1] !== 0xff9b ||
235
+ hextets.slice(2, 6).some((value) => value !== 0)) {
236
+ return undefined;
237
+ }
238
+ return [hextets[6] >> 8, hextets[6] & 0xff, hextets[7] >> 8, hextets[7] & 0xff].join(".");
239
+ }
240
+ function isBlockedWebhookAddress(address) {
241
+ const normalized = normalizeHostname(address);
242
+ const family = isIP(normalized);
243
+ if (family === 4) {
244
+ return (!GLOBAL_IPV4_EXCEPTIONS.check(normalized, "ipv4") &&
245
+ BLOCKED_IPV4_ADDRESSES.check(normalized, "ipv4"));
246
+ }
247
+ if (family === 6) {
248
+ const embeddedIpv4 = embeddedNat64Ipv4(normalized);
249
+ if (embeddedIpv4 && isBlockedWebhookAddress(embeddedIpv4)) {
250
+ return true;
251
+ }
252
+ if (GLOBAL_IPV6_EXCEPTIONS.check(normalized, "ipv6")) {
253
+ return false;
254
+ }
255
+ return (BLOCKED_IPV6_ADDRESSES.check(normalized, "ipv6") ||
256
+ !ALLOCATED_GLOBAL_IPV6_RANGES.check(normalized, "ipv6"));
257
+ }
258
+ return false;
259
+ }
260
+ async function resolveWebhookAddresses(hostname, signal) {
261
+ const normalized = normalizeHostname(hostname);
262
+ const family = isIP(normalized);
263
+ if (family === 4 || family === 6) {
264
+ return [{ address: normalized, family }];
265
+ }
266
+ return (await webhookDnsLookupPool.resolve(normalized, signal)).flatMap((entry) => entry.family === 4 || entry.family === 6
267
+ ? [{ address: entry.address, family: entry.family }]
268
+ : []);
269
+ }
270
+ export async function validateWebhookTarget(params) {
271
+ const allowThisLoopbackHttp = params.url.protocol === "http:" &&
272
+ params.allowLoopbackHttp &&
273
+ isLoopbackHost(params.url.hostname);
274
+ if (params.url.protocol !== "https:" && !allowThisLoopbackHttp) {
275
+ return { error: "https-required" };
276
+ }
277
+ if (allowThisLoopbackHttp) {
278
+ return { addresses: undefined };
279
+ }
280
+ if (!params.restrictPrivateAddresses) {
281
+ return { addresses: undefined };
282
+ }
283
+ let addresses;
284
+ try {
285
+ addresses = await resolveWebhookAddresses(params.url.hostname, params.signal);
286
+ }
287
+ catch (error) {
288
+ if (params.signal?.aborted) {
289
+ throw error;
290
+ }
291
+ return { error: "unresolvable" };
292
+ }
293
+ if (addresses.length === 0) {
294
+ return { error: "unresolvable" };
295
+ }
296
+ if (addresses.some((entry) => isBlockedWebhookAddress(entry.address))) {
297
+ return { error: "private-address" };
298
+ }
299
+ return { addresses };
300
+ }
301
+ export async function postWebhookRequest(params) {
302
+ return await new Promise((resolve, reject) => {
303
+ const address = params.address;
304
+ let settled = false;
305
+ let response;
306
+ let deadline;
307
+ const finish = (callback) => {
308
+ if (settled) {
309
+ return;
310
+ }
311
+ settled = true;
312
+ clearTimeout(deadline);
313
+ params.activeRequests?.delete(request);
314
+ callback();
315
+ };
316
+ const send = params.url.protocol === "https:" ? requestHttps : requestHttp;
317
+ const request = send(params.url, {
318
+ agent: false,
319
+ ...(address ? { family: address.family } : {}),
320
+ headers: {
321
+ "content-length": String(Buffer.byteLength(params.body)),
322
+ "content-type": "application/json",
323
+ ...Object.fromEntries(params.headerEntries ?? []),
324
+ },
325
+ ...(address
326
+ ? {
327
+ lookup: (_hostname, _options, callback) => callback(null, address.address, address.family),
328
+ }
329
+ : {}),
330
+ method: "POST",
331
+ signal: params.signal,
332
+ }, (incoming) => {
333
+ response = incoming;
334
+ incoming.resume();
335
+ incoming.once("error", (error) => finish(() => reject(error)));
336
+ incoming.once("end", () => finish(() => resolve(incoming.statusCode ?? 0)));
337
+ });
338
+ params.activeRequests?.add(request);
339
+ deadline = setTimeout(() => {
340
+ const error = new DOMException(`Webhook delivery timed out after ${params.timeoutMs}ms`, "TimeoutError");
341
+ response?.destroy(error);
342
+ request.destroy(error);
343
+ }, params.timeoutMs);
344
+ deadline.unref();
345
+ request.once("error", (error) => finish(() => reject(error)));
346
+ request.end(params.body);
347
+ });
348
+ }
349
+ //# sourceMappingURL=webhook-target.js.map