@starim-io/bot-sdk 0.1.4

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/media.ts","../src/client.ts","../src/webhook.ts","../src/bot.ts"],"names":["fs","path","createHmac","timingSafeEqual","createServer"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Bot API 或 Webhook 处理中的可恢复错误。\n */\nexport class StarIMApiError extends Error {\n readonly code?: string | number;\n readonly statusCode: number;\n readonly responseBody?: unknown;\n\n constructor(opts: {\n message: string;\n statusCode: number;\n code?: string | number;\n responseBody?: unknown;\n }) {\n super(opts.message);\n this.name = 'StarIMApiError';\n this.statusCode = opts.statusCode;\n this.code = opts.code;\n this.responseBody = opts.responseBody;\n }\n}\n\n/**\n * Webhook 签名校验失败。\n */\nexport class StarIMSignatureError extends Error {\n constructor(message = 'Invalid X-StarIM-Signature') {\n super(message);\n this.name = 'StarIMSignatureError';\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { StarIMBotClient } from './client.js';\nimport type { CompletedUpload, UploadCredentials } from './types.js';\n\nasync function putToS3(creds: UploadCredentials, body: Buffer): Promise<void> {\n const headers: Record<string, string> = {\n 'Content-Type': creds.contentType || 'application/octet-stream'\n };\n const ac = new AbortController();\n const to = setTimeout(() => ac.abort(), 120_000);\n try {\n const res = await fetch(creds.uploadUrl, {\n method: creds.method || 'PUT',\n headers,\n body,\n signal: ac.signal\n });\n if (!res.ok) {\n const t = await res.text().catch(() => '');\n throw new Error(`S3 upload failed: ${res.status} ${t.slice(0, 200)}`);\n }\n } finally {\n clearTimeout(to);\n }\n}\n\nasync function uploadBuffer(\n client: StarIMBotClient,\n buffer: Buffer,\n fileName: string,\n fileType?: string\n): Promise<CompletedUpload> {\n const creds = await client.issueUploadCredentials({\n fileName,\n fileSize: buffer.length,\n fileType: fileType || '',\n metadata: {}\n });\n await putToS3(creds, buffer);\n return client.completeUpload({\n key: creds.key,\n fileName,\n fileSize: buffer.length,\n fileType: fileType || creds.contentType,\n category: 'bot',\n isPublic: false\n });\n}\n\n/** 从本地路径读取并上传,返回登记后的 file id */\nexport async function uploadFileFromPath(\n client: StarIMBotClient,\n filePath: string,\n options?: { fileName?: string; fileType?: string }\n): Promise<CompletedUpload> {\n const buffer = await fs.readFile(filePath);\n const fileName = options?.fileName || path.basename(filePath);\n return uploadBuffer(client, buffer, fileName, options?.fileType);\n}\n\nexport async function uploadFromUrl(\n client: StarIMBotClient,\n sourceUrl: string,\n options?: { fileName?: string; fileType?: string }\n): Promise<CompletedUpload> {\n const res = await fetch(sourceUrl);\n if (!res.ok) {\n throw new Error(`Failed to fetch ${sourceUrl}: ${res.status}`);\n }\n const buf = Buffer.from(await res.arrayBuffer());\n const fileName =\n options?.fileName ||\n (() => {\n try {\n const u = new URL(sourceUrl);\n return path.basename(u.pathname) || 'download.bin';\n } catch {\n return 'download.bin';\n }\n })();\n return uploadBuffer(client, buf, fileName, options?.fileType || res.headers.get('content-type') || '');\n}\n\nexport async function sendPhotoFromPath(\n client: StarIMBotClient,\n chatId: string,\n filePath: string,\n options?: { caption?: string; fileName?: string; fileType?: string }\n): Promise<unknown> {\n const done = await uploadFileFromPath(client, filePath, {\n fileName: options?.fileName,\n fileType: options?.fileType\n });\n return client.sendPhoto({\n chat_id: chatId,\n file_id: done.id,\n caption: options?.caption\n });\n}\n\nexport async function sendDocumentFromPath(\n client: StarIMBotClient,\n chatId: string,\n filePath: string,\n options?: { caption?: string; fileName?: string; fileType?: string }\n): Promise<unknown> {\n const done = await uploadFileFromPath(client, filePath, {\n fileName: options?.fileName,\n fileType: options?.fileType\n });\n return client.sendDocument({\n chat_id: chatId,\n file_id: done.id,\n caption: options?.caption\n });\n}\n\n/**\n * Buffer 上传后发送图片。\n */\nexport async function sendPhotoFromBuffer(\n client: StarIMBotClient,\n chatId: string,\n buffer: Buffer,\n options?: { caption?: string; fileName?: string; fileType?: string }\n): Promise<unknown> {\n const done = await uploadBuffer(client, buffer, options?.fileName || 'image.bin', options?.fileType);\n return client.sendPhoto({\n chat_id: chatId,\n file_id: done.id,\n caption: options?.caption\n });\n}\n\n/**\n * 远程 URL 下载后发送图片。\n */\nexport async function sendPhotoFromUrl(\n client: StarIMBotClient,\n chatId: string,\n sourceUrl: string,\n options?: { caption?: string; fileName?: string; fileType?: string }\n): Promise<unknown> {\n const done = await uploadFromUrl(client, sourceUrl, options);\n return client.sendPhoto({\n chat_id: chatId,\n file_id: done.id,\n caption: options?.caption\n });\n}\n\n/**\n * 远程 URL 下载后发送视频(先上传再 sendVideo)。\n */\nexport async function sendVideoFromUrl(\n client: StarIMBotClient,\n chatId: string,\n sourceUrl: string,\n options?: {\n caption?: string;\n fileName?: string;\n fileType?: string;\n duration?: number;\n width?: number;\n height?: number;\n }\n): Promise<unknown> {\n const done = await uploadFromUrl(client, sourceUrl, {\n fileName: options?.fileName,\n fileType: options?.fileType\n });\n return client.sendVideo({\n chat_id: chatId,\n file_id: done.id,\n caption: options?.caption,\n duration: options?.duration,\n width: options?.width,\n height: options?.height\n });\n}\n","import { StarIMApiError } from './errors.js';\nimport type {\n CompleteUploadParams,\n CompletedUpload,\n IssueUploadCredentialsParams,\n SendLocationParams,\n SendVenueParams,\n SendDiceParams,\n SendPollParams,\n SendContactParams,\n SendMediaGroupParams,\n SendMediaParams,\n SendMessageParams,\n SetWebhookParams,\n StarIMBotClientOptions,\n UploadCredentials,\n EditMessageParams,\n DeleteMessageParams,\n EditMessageReplyMarkupParams,\n AnswerCallbackQueryParams,\n AnswerInlineQueryParams,\n AnswerFriendRequestParams,\n BotFriendRequestListItem,\n SetMyFriendRequestModeParams,\n KickChatMemberParams,\n BanChatMemberParams,\n SetMyCommandsParams,\n GetMyCommandsParams,\n DeleteMyCommandsParams,\n BotCommand,\n GetUpdatesParams,\n GetUpdatesResult,\n Update\n} from './types.js';\nimport { sendPhotoFromPath, sendDocumentFromPath } from './media.js';\n\nconst DEFAULT_BASE =\n typeof process !== 'undefined' && process.env.STARIM_API_BASE\n ? String(process.env.STARIM_API_BASE).replace(/\\/+$/, '')\n : 'https://api.starim.example/api/v1';\n\nfunction joinUrl(base: string, path: string): string {\n const b = base.replace(/\\/+$/, '');\n const p = path.startsWith('/') ? path : `/${path}`;\n return `${b}${p}`;\n}\n\nfunction unwrapData(body: unknown): unknown {\n if (!body || typeof body !== 'object') return body;\n const b = body as Record<string, unknown>;\n if (b.success !== true) return body;\n let d = b.data;\n if (d && typeof d === 'object') {\n const inner = d as Record<string, unknown>;\n if (\n inner.success === true &&\n 'data' in inner &&\n typeof inner.data !== 'undefined' &&\n Object.keys(inner).length <= 5\n ) {\n d = inner.data;\n }\n }\n return d;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nexport class StarIMBotClient {\n readonly token: string;\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly debug: boolean;\n /** 暴露给上层(如 StarIMBot polling 链路)以记录非致命错误 */\n readonly logger: Pick<Console, 'debug' | 'info' | 'warn' | 'error'>;\n\n readonly files: {\n issueUploadCredentials: (p: IssueUploadCredentialsParams) => Promise<UploadCredentials>;\n completeUpload: (p: CompleteUploadParams) => Promise<CompletedUpload>;\n };\n\n constructor(opts: StarIMBotClientOptions) {\n if (!opts.token?.trim()) {\n throw new Error('StarIMBotClient: token is required');\n }\n this.token = opts.token.trim();\n this.baseUrl = (opts.baseUrl || DEFAULT_BASE).replace(/\\/+$/, '');\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.debug = !!opts.debug;\n this.logger = opts.logger ?? console;\n this.files = {\n issueUploadCredentials: p => this.issueUploadCredentials(p),\n completeUpload: p => this.completeUpload(p)\n };\n }\n\n private log(level: 'debug' | 'info', msg: string, meta?: object): void {\n if (!this.debug) return;\n this.logger[level](`[StarIMBotClient] ${msg}`, meta ?? '');\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>,\n opts?: { auth?: boolean; timeoutMs?: number }\n ): Promise<T> {\n const url = joinUrl(this.baseUrl, path);\n const auth = opts?.auth !== false;\n const headers: Record<string, string> = {\n Accept: 'application/json'\n };\n if (auth) {\n headers.Authorization = `Bearer ${this.token}`;\n }\n const hasBody = body !== undefined && method !== 'GET' && method !== 'HEAD';\n if (hasBody) {\n headers['Content-Type'] = 'application/json';\n }\n\n const effectiveTimeout = opts?.timeoutMs ?? this.timeoutMs;\n const ac = new AbortController();\n const timer = setTimeout(() => ac.abort(), effectiveTimeout);\n this.log('debug', `${method} ${path}`);\n\n let res: Response;\n try {\n res = await fetch(url, {\n method,\n headers,\n body: hasBody ? JSON.stringify(body) : undefined,\n signal: ac.signal\n });\n } catch (e) {\n clearTimeout(timer);\n const msg = e instanceof Error ? e.message : String(e);\n throw new StarIMApiError({\n message: msg.includes('abort') ? 'Request timeout' : msg,\n statusCode: 0,\n responseBody: undefined\n });\n } finally {\n clearTimeout(timer);\n }\n\n const text = await res.text();\n let json: unknown;\n try {\n json = text ? JSON.parse(text) : {};\n } catch {\n throw new StarIMApiError({\n message: text.slice(0, 500) || 'Invalid JSON response',\n statusCode: res.status,\n responseBody: text\n });\n }\n\n if (!isPlainObject(json)) {\n throw new StarIMApiError({\n message: 'Unexpected response shape',\n statusCode: res.status,\n responseBody: json\n });\n }\n\n if (json.success === false) {\n throw new StarIMApiError({\n message: String(json.message || 'Request failed'),\n statusCode: res.status || Number(json.code) || 400,\n code: json.code as string | number | undefined,\n responseBody: json\n });\n }\n\n if (!res.ok && json.success !== true) {\n throw new StarIMApiError({\n message: String(json.message || res.statusText || 'HTTP error'),\n statusCode: res.status,\n code: json.code as string | number | undefined,\n responseBody: json\n });\n }\n\n if (json.success !== true) {\n throw new StarIMApiError({\n message: String(json.message || 'Request failed'),\n statusCode: res.status,\n code: json.code as string | number | undefined,\n responseBody: json\n });\n }\n\n return unwrapData(json) as T;\n }\n\n /** GET /bots/me */\n getMe(): Promise<Record<string, unknown>> {\n return this.request('GET', '/bots/me');\n }\n\n /** GET /bots/getChat?chat_id= */\n getChat(chat_id: string): Promise<Record<string, unknown>> {\n const q = new URLSearchParams({ chat_id });\n return this.request('GET', `/bots/getChat?${q.toString()}`);\n }\n\n getChatMember(chat_id: string, user_id: string): Promise<Record<string, unknown>> {\n const q = new URLSearchParams({ chat_id, user_id });\n return this.request('GET', `/bots/getChatMember?${q.toString()}`);\n }\n\n getChatMemberCount(chat_id: string): Promise<Record<string, unknown>> {\n const q = new URLSearchParams({ chat_id });\n return this.request('GET', `/bots/getChatMemberCount?${q.toString()}`);\n }\n\n getChatAdministrators(chat_id: string): Promise<Record<string, unknown>> {\n const q = new URLSearchParams({ chat_id });\n return this.request('GET', `/bots/getChatAdministrators?${q.toString()}`);\n }\n\n setChatTitle(chat_id: string, title: string): Promise<unknown> {\n return this.request('POST', '/bots/setChatTitle', { chat_id, title });\n }\n\n setChatDescription(chat_id: string, description: string): Promise<unknown> {\n return this.request('POST', '/bots/setChatDescription', { chat_id, description });\n }\n\n setChatPhoto(chat_id: string, photo: string): Promise<unknown> {\n return this.request('POST', '/bots/setChatPhoto', { chat_id, photo });\n }\n\n pinChatMessage(body: Record<string, unknown>): Promise<unknown> {\n return this.request('POST', '/bots/pinChatMessage', body);\n }\n\n unpinChatMessage(body: Record<string, unknown>): Promise<unknown> {\n return this.request('POST', '/bots/unpinChatMessage', body);\n }\n\n unpinAllChatMessages(chat_id: string): Promise<unknown> {\n return this.request('POST', '/bots/unpinAllChatMessages', { chat_id });\n }\n\n forwardMessage(body: Record<string, unknown>): Promise<unknown> {\n return this.request('POST', '/bots/forwardMessage', body);\n }\n\n copyMessage(body: Record<string, unknown>): Promise<unknown> {\n return this.request('POST', '/bots/copyMessage', body);\n }\n\n sendChatAction(chat_id: string, action: string): Promise<unknown> {\n return this.request('POST', '/bots/sendChatAction', { chat_id, action });\n }\n\n getFile(file_id: string): Promise<Record<string, unknown>> {\n const q = new URLSearchParams({ file_id });\n return this.request('GET', `/bots/getFile?${q.toString()}`);\n }\n\n /** POST /bots/sendMessage */\n sendMessage(params: SendMessageParams): Promise<unknown> {\n return this.request('POST', '/bots/sendMessage', {\n chat_id: params.chat_id,\n text: params.text,\n reply_markup: params.reply_markup\n });\n }\n\n /** POST /bots/setMyCommands */\n setMyCommands(params: SetMyCommandsParams): Promise<unknown> {\n return this.request('POST', '/bots/setMyCommands', {\n commands: params.commands,\n scope: params.scope,\n language_code: params.language_code\n });\n }\n\n /** GET /bots/getMyCommands */\n getMyCommands(params?: GetMyCommandsParams): Promise<{ commands: BotCommand[] }> {\n const q = new URLSearchParams();\n if (params?.scope) q.set('scope', params.scope);\n if (params?.language_code) q.set('language_code', params.language_code);\n const suffix = q.toString() ? `?${q.toString()}` : '';\n return this.request('GET', `/bots/getMyCommands${suffix}`);\n }\n\n /** POST /bots/deleteMyCommands */\n deleteMyCommands(params?: DeleteMyCommandsParams): Promise<unknown> {\n return this.request('POST', '/bots/deleteMyCommands', {\n scope: params?.scope,\n language_code: params?.language_code\n });\n }\n\n /** POST /bots/setMyShortDescription · 设置短描述(≤120 字) */\n setMyShortDescription(short_description: string): Promise<{ short_description: string }> {\n return this.request('POST', '/bots/setMyShortDescription', { short_description });\n }\n\n /** GET /bots/getMyShortDescription · 获取短描述 */\n getMyShortDescription(): Promise<{ short_description: string }> {\n return this.request('GET', '/bots/getMyShortDescription');\n }\n\n /** POST /bots/setMyDescription · 设置 Bot 主页大段「关于」文本(≤512 字) */\n setMyDescription(description: string): Promise<{ description: string }> {\n return this.request('POST', '/bots/setMyDescription', { description });\n }\n\n /** GET /bots/getMyDescription · 获取 Bot 主页大段「关于」文本 */\n getMyDescription(): Promise<{ description: string }> {\n return this.request('GET', '/bots/getMyDescription');\n }\n\n setWebhook(params: SetWebhookParams): Promise<unknown> {\n const defaultAllowed: string[] = [\n 'message',\n 'edited_message',\n 'message_deleted',\n 'message_read',\n 'message_delivered',\n 'callback_query',\n 'inline_query',\n 'friend_request'\n ];\n return this.request('POST', '/bots/setWebhook', {\n url: params.url,\n secret_token: params.secret_token ?? '',\n allowed_updates: params.allowed_updates ?? defaultAllowed,\n allowed_ips: params.allowed_ips ?? []\n });\n }\n\n deleteWebhook(): Promise<unknown> {\n return this.request('POST', '/bots/deleteWebhook', {});\n }\n\n /** GET /bots/getWebhookInfo */\n getWebhookInfo(): Promise<Record<string, unknown>> {\n return this.request('GET', '/bots/getWebhookInfo');\n }\n\n /**\n * POST /bots/getUpdates · 长轮询拉取 polling 模式 update。\n *\n * - 调本接口前请确保已 `deleteWebhook`,否则平台返回 409。\n * - HTTP 客户端的超时会按 `timeout + 5s` 自动放宽,避免比服务端先断开。\n *\n * @example\n * ```ts\n * let offset = 0;\n * while (true) {\n * const { updates } = await client.getUpdates({ timeout: 30, offset });\n * for (const u of updates) {\n * console.log(u);\n * if (typeof u.update_seq === 'number') offset = u.update_seq + 1;\n * }\n * }\n * ```\n */\n async getUpdates(params: GetUpdatesParams = {}): Promise<GetUpdatesResult> {\n const timeoutSec = Math.min(50, Math.max(0, Number(params.timeout) || 0));\n const httpTimeoutMs = (timeoutSec + 5) * 1000;\n const data = await this.request<GetUpdatesResult>(\n 'POST',\n '/bots/getUpdates',\n {\n offset: params.offset ?? 0,\n limit: params.limit ?? 100,\n timeout: timeoutSec,\n allowed_updates: params.allowed_updates ?? []\n },\n { timeoutMs: httpTimeoutMs }\n );\n return { updates: Array.isArray(data?.updates) ? (data.updates as Update[]) : [] };\n }\n\n sendPhoto(params: SendMediaParams): Promise<unknown> {\n return this.request('POST', '/bots/sendPhoto', this.buildSendMediaBody(params));\n }\n\n sendDocument(params: SendMediaParams): Promise<unknown> {\n return this.request('POST', '/bots/sendDocument', this.buildSendMediaBody(params));\n }\n\n sendVideo(params: SendMediaParams): Promise<unknown> {\n return this.request('POST', '/bots/sendVideo', this.buildSendMediaBody(params));\n }\n\n sendAudio(params: SendMediaParams): Promise<unknown> {\n return this.request('POST', '/bots/sendAudio', this.buildSendMediaBody(params));\n }\n\n sendVoice(params: SendMediaParams): Promise<unknown> {\n return this.request('POST', '/bots/sendVoice', this.buildSendMediaBody(params));\n }\n\n sendVideoNote(params: SendMediaParams): Promise<unknown> {\n return this.request('POST', '/bots/sendVideoNote', this.buildSendVideoNoteBody(params));\n }\n\n sendAnimation(params: SendMediaParams): Promise<unknown> {\n return this.request('POST', '/bots/sendAnimation', this.buildSendMediaBody(params));\n }\n\n sendSticker(params: SendMediaParams): Promise<unknown> {\n const body: Record<string, unknown> = {\n chat_id: params.chat_id,\n file_id: params.file_id\n };\n const w = Number(params.width);\n if (params.width != null && Number.isFinite(w) && w > 0) {\n body.width = w;\n }\n const h = Number(params.height);\n if (params.height != null && Number.isFinite(h) && h > 0) {\n body.height = h;\n }\n if (typeof params.thumbnail_url === 'string' && params.thumbnail_url.trim()) {\n body.thumbnail_url = params.thumbnail_url.trim();\n }\n return this.request('POST', '/bots/sendSticker', body);\n }\n\n sendDice(params: SendDiceParams): Promise<unknown> {\n const body: Record<string, unknown> = { chat_id: params.chat_id };\n if (params.emoji != null && String(params.emoji).trim()) {\n body.emoji = String(params.emoji).trim();\n }\n if (params.reply_markup !== undefined) {\n body.reply_markup = params.reply_markup;\n }\n return this.request('POST', '/bots/sendDice', body);\n }\n\n sendPoll(params: SendPollParams): Promise<unknown> {\n const body: Record<string, unknown> = {\n chat_id: params.chat_id,\n question: params.question,\n options: params.options\n };\n if (params.is_anonymous !== undefined) {\n body.is_anonymous = params.is_anonymous;\n }\n if (params.type !== undefined) {\n body.type = params.type;\n }\n if (params.correct_option_id != null) {\n body.correct_option_id = params.correct_option_id;\n }\n if (params.reply_markup !== undefined) {\n body.reply_markup = params.reply_markup;\n }\n return this.request('POST', '/bots/sendPoll', body);\n }\n\n sendContact(params: SendContactParams): Promise<unknown> {\n const body: Record<string, unknown> = {\n chat_id: params.chat_id,\n phone_number: params.phone_number,\n first_name: params.first_name\n };\n if (params.last_name != null) {\n body.last_name = params.last_name;\n }\n if (params.reply_markup !== undefined) {\n body.reply_markup = params.reply_markup;\n }\n return this.request('POST', '/bots/sendContact', body);\n }\n\n sendMediaGroup(params: SendMediaGroupParams): Promise<unknown> {\n const body: Record<string, unknown> = {\n chat_id: params.chat_id,\n media: params.media\n };\n if (params.reply_markup !== undefined) {\n body.reply_markup = params.reply_markup;\n }\n return this.request('POST', '/bots/sendMediaGroup', body);\n }\n\n private buildSendMediaBody(params: SendMediaParams): Record<string, unknown> {\n const body: Record<string, unknown> = {\n chat_id: params.chat_id,\n file_id: params.file_id,\n caption: params.caption ?? ''\n };\n const d = Number(params.duration);\n if (params.duration != null && Number.isFinite(d) && d > 0) {\n body.duration = d;\n }\n if (typeof params.performer === 'string' && params.performer.trim()) {\n body.performer = params.performer.trim();\n }\n if (typeof params.title === 'string' && params.title.trim()) {\n body.title = params.title.trim();\n }\n if (typeof params.thumbnail_url === 'string' && params.thumbnail_url.trim()) {\n body.thumbnail_url = params.thumbnail_url.trim();\n }\n const w = Number(params.width);\n if (params.width != null && Number.isFinite(w) && w > 0) {\n body.width = w;\n }\n const h = Number(params.height);\n if (params.height != null && Number.isFinite(h) && h > 0) {\n body.height = h;\n }\n return body;\n }\n\n private buildSendVideoNoteBody(params: SendMediaParams): Record<string, unknown> {\n const body = this.buildSendMediaBody(params);\n const durRaw = params.duration != null ? params.duration : params.length;\n const d = Number(durRaw);\n if (durRaw != null && Number.isFinite(d) && d > 0) {\n body.duration = d;\n }\n return body;\n }\n\n sendLocation(params: SendLocationParams): Promise<unknown> {\n return this.request('POST', '/bots/sendLocation', {\n chat_id: params.chat_id,\n latitude: params.latitude,\n longitude: params.longitude,\n name: params.name ?? '',\n address: params.address ?? ''\n });\n }\n\n sendVenue(params: SendVenueParams): Promise<unknown> {\n const body: Record<string, unknown> = {\n chat_id: params.chat_id,\n latitude: params.latitude,\n longitude: params.longitude,\n title: params.title,\n address: params.address ?? ''\n };\n if (params.reply_markup !== undefined) {\n body.reply_markup = params.reply_markup;\n }\n return this.request('POST', '/bots/sendVenue', body);\n }\n\n editMessage(params: EditMessageParams): Promise<unknown> {\n return this.request('POST', '/bots/editMessage', {\n message_id: params.message_id,\n text: params.text,\n content: params.content,\n reply_markup: params.reply_markup\n });\n }\n\n editMessageReplyMarkup(params: EditMessageReplyMarkupParams): Promise<unknown> {\n return this.request('POST', '/bots/editMessageReplyMarkup', {\n message_id: params.message_id,\n reply_markup: params.reply_markup ?? null\n });\n }\n\n answerCallbackQuery(params: AnswerCallbackQueryParams): Promise<unknown> {\n return this.request('POST', '/bots/answerCallbackQuery', {\n callback_query_id: params.callback_query_id,\n text: params.text ?? '',\n show_alert: params.show_alert ?? false,\n url: params.url ?? '',\n cache_time: params.cache_time ?? 0\n });\n }\n\n answerInlineQuery(params: AnswerInlineQueryParams): Promise<unknown> {\n return this.request('POST', '/bots/answerInlineQuery', {\n inline_query_id: params.inline_query_id,\n results: params.results,\n cache_time: params.cache_time ?? 300,\n is_personal: params.is_personal ?? false,\n next_offset: params.next_offset ?? ''\n });\n }\n\n /** POST /bots/answerFriendRequest · manual 模式下处理用户发起的好友申请 */\n answerFriendRequest(params: AnswerFriendRequestParams): Promise<unknown> {\n return this.request('POST', '/bots/answerFriendRequest', {\n friendship_id: params.friendship_id,\n action: params.action\n });\n }\n\n /** POST /bots/setMyFriendRequestMode · 配置当前机器人好友申请处理策略 */\n setMyFriendRequestMode(params: SetMyFriendRequestModeParams): Promise<{ friend_request_mode: string }> {\n return this.request('POST', '/bots/setMyFriendRequestMode', {\n friend_request_mode: params.friend_request_mode\n }) as Promise<{ friend_request_mode: string }>;\n }\n\n /** GET /bots/getMyFriendRequestMode · 获取当前机器人好友申请处理策略 */\n getMyFriendRequestMode(): Promise<{ friend_request_mode: string }> {\n return this.request('GET', '/bots/getMyFriendRequestMode') as Promise<{ friend_request_mode: string }>;\n }\n\n /** GET /bots/getFriendRequests · 待处理好友申请(数据库 Friendship) */\n getFriendRequests(): Promise<{ friend_requests: BotFriendRequestListItem[] }> {\n return this.request('GET', '/bots/getFriendRequests') as Promise<{\n friend_requests: BotFriendRequestListItem[];\n }>;\n }\n\n kickChatMember(params: KickChatMemberParams): Promise<unknown> {\n return this.request('POST', '/bots/kickChatMember', {\n chat_id: params.chat_id,\n user_id: params.user_id\n });\n }\n\n banChatMember(params: BanChatMemberParams): Promise<unknown> {\n return this.request('POST', '/bots/banChatMember', {\n chat_id: params.chat_id,\n user_id: params.user_id,\n reason: params.reason ?? ''\n });\n }\n\n unbanChatMember(params: KickChatMemberParams): Promise<unknown> {\n return this.request('POST', '/bots/unbanChatMember', {\n chat_id: params.chat_id,\n user_id: params.user_id\n });\n }\n\n deleteMessage(params: DeleteMessageParams): Promise<unknown> {\n return this.request('POST', '/bots/deleteMessage', {\n message_id: params.message_id\n });\n }\n\n issueUploadCredentials(p: IssueUploadCredentialsParams): Promise<UploadCredentials> {\n return this.request('POST', '/bots/files/upload-credentials', {\n fileName: p.fileName,\n fileSize: p.fileSize,\n fileType: p.fileType ?? '',\n checksum: p.checksum ?? '',\n metadata: p.metadata ?? {}\n });\n }\n\n completeUpload(p: CompleteUploadParams): Promise<CompletedUpload> {\n return this.request('POST', '/bots/files/complete', {\n key: p.key,\n fileName: p.fileName,\n fileSize: p.fileSize,\n fileType: p.fileType ?? '',\n checksum: p.checksum ?? '',\n category: p.category ?? 'bot',\n isPublic: p.isPublic ?? false\n });\n }\n\n /**\n * 校验 Token(公开接口,不强制带 Bearer,仅 body.token)。\n */\n verifyToken(): Promise<{ bot?: Record<string, unknown> }> {\n return this.request('POST', '/bots/verify-token', { token: this.token }, { auth: false });\n }\n\n /** 本地路径 → 上传 S3 → sendPhoto */\n sendPhotoFromFile(\n chatId: string,\n filePath: string,\n options?: { caption?: string; fileName?: string; fileType?: string }\n ): Promise<unknown> {\n return sendPhotoFromPath(this, chatId, filePath, options);\n }\n\n /** 本地路径 → 上传 S3 → sendDocument */\n sendDocumentFromFile(\n chatId: string,\n filePath: string,\n options?: { caption?: string; fileName?: string; fileType?: string }\n ): Promise<unknown> {\n return sendDocumentFromPath(this, chatId, filePath, options);\n }\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\nimport { StarIMSignatureError } from './errors.js';\nimport type { Update } from './types.js';\n\nconst SIG_PREFIX = 'sha256=';\n\n/** V2 时间戳容忍窗口(秒)。客户端时钟与服务端偏差超过此值则拒收,防 replay。 */\nexport const DEFAULT_TIMESTAMP_TOLERANCE_SEC = 300;\n\n/**\n * V2 签名:HMAC-SHA256(`${timestamp}.${body}`),hex 小写。\n *\n * timestamp 为 unix 秒(与服务端 `X-StarIM-Timestamp` 头一致)。\n */\nexport function computeWebhookSignatureV2(\n secret: string,\n timestampSec: number | string,\n rawBody: Buffer | string\n): string {\n const ts = String(timestampSec);\n const raw = typeof rawBody === 'string' ? Buffer.from(rawBody, 'utf8') : rawBody;\n const h = createHmac('sha256', secret);\n h.update(ts);\n h.update('.');\n h.update(raw);\n return h.digest('hex');\n}\n\nfunction timingSafeHexEqual(a: string, b: string): boolean {\n let bufA: Buffer;\n let bufB: Buffer;\n try {\n bufA = Buffer.from(a, 'hex');\n bufB = Buffer.from(b, 'hex');\n } catch {\n return false;\n }\n if (bufA.length !== bufB.length || bufA.length === 0) return false;\n return timingSafeEqual(bufA, bufB);\n}\n\nfunction parseSigHeader(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed.toLowerCase().startsWith(SIG_PREFIX)) return null;\n return trimmed.slice(SIG_PREFIX.length).trim();\n}\n\nexport interface VerifyWebhookOptions {\n /** V2 时间戳容忍窗口(秒),默认 300 */\n timestampToleranceSec?: number;\n /** 注入时钟,便于测试 */\n nowSec?: () => number;\n}\n\n/**\n * 校验 webhook V2 签名(须同时提供 X-StarIM-Signature-V2 与 X-StarIM-Timestamp)。\n *\n * @throws {StarIMSignatureError} 校验失败\n */\nexport function verifyWebhookSignature(\n secret: string,\n rawBody: Buffer | string,\n signatureHeaderV2: string | undefined,\n timestampHeader: string | undefined,\n opts: VerifyWebhookOptions = {}\n): void {\n const tolerance = opts.timestampToleranceSec ?? DEFAULT_TIMESTAMP_TOLERANCE_SEC;\n const nowSec = (opts.nowSec ?? (() => Math.floor(Date.now() / 1000)))();\n\n if (!signatureHeaderV2) {\n throw new StarIMSignatureError('Missing X-StarIM-Signature-V2');\n }\n if (!timestampHeader) {\n throw new StarIMSignatureError('Missing X-StarIM-Timestamp for V2 signature');\n }\n const ts = Number(timestampHeader);\n if (!Number.isFinite(ts)) {\n throw new StarIMSignatureError('Invalid X-StarIM-Timestamp');\n }\n if (Math.abs(nowSec - ts) > tolerance) {\n throw new StarIMSignatureError(\n `Timestamp out of tolerance window (±${tolerance}s); possible replay`\n );\n }\n const expected = parseSigHeader(signatureHeaderV2);\n if (!expected) {\n throw new StarIMSignatureError('Invalid X-StarIM-Signature-V2 format');\n }\n const actual = computeWebhookSignatureV2(secret, ts, rawBody);\n if (!timingSafeHexEqual(actual, expected)) {\n throw new StarIMSignatureError('V2 signature mismatch');\n }\n}\n\nfunction headerValue(\n headers: Record<string, string | string[] | undefined>,\n name: string\n): string | undefined {\n const key = Object.keys(headers).find(k => k.toLowerCase() === name.toLowerCase());\n if (!key) return undefined;\n const v = headers[key];\n if (Array.isArray(v)) return v[0];\n return v;\n}\n\nexport interface WebhookRequest {\n method?: string;\n headers: Record<string, string | string[] | undefined>;\n /** express.raw / body-parser raw 解析后的 Buffer */\n body?: unknown;\n /** 可选:在 json 解析前由中间件挂载的原始字节 */\n rawBody?: Buffer;\n}\n\nexport interface WebhookResponse {\n statusCode?: number;\n setHeader?(name: string, value: string | number | readonly string[]): unknown;\n end(chunk?: string | Uint8Array): void;\n}\n\nexport interface DedupeStore {\n /** 若已处理过该 update_id 返回 true */\n has(updateId: string): boolean;\n add(updateId: string): void;\n}\n\n/** 简单 LRU:超过容量时删除最旧条目 */\nexport class LruDedupe implements DedupeStore {\n private readonly order: string[] = [];\n private readonly set = new Set<string>();\n\n constructor(private readonly maxSize: number) {}\n\n has(updateId: string): boolean {\n return this.set.has(updateId);\n }\n\n add(updateId: string): void {\n if (this.set.has(updateId)) return;\n this.set.add(updateId);\n this.order.push(updateId);\n while (this.order.length > this.maxSize) {\n const rm = this.order.shift();\n if (rm) this.set.delete(rm);\n }\n }\n}\n\nfunction getRawBody(req: WebhookRequest): Buffer {\n if (Buffer.isBuffer(req.rawBody)) return req.rawBody;\n if (Buffer.isBuffer(req.body)) return req.body;\n throw new StarIMSignatureError(\n 'Raw JSON body required for HMAC: use express.raw({ type: \"*/*\" }) or express.json({ verify: (req, buf) => { (req as any).rawBody = buf } })'\n );\n}\n\nexport interface ProcessWebhookOptions {\n secretToken: string;\n dedupe?: DedupeStore;\n /** 透传给 verifyWebhookSignature */\n verify?: VerifyWebhookOptions;\n}\n\nexport interface ProcessWebhookResult {\n update: Update;\n duplicate: boolean;\n}\n\n/**\n * 校验签名、解析 Update、可选幂等去重。\n * duplicate 为 true 时表示 update_id 已见过,业务层可选择跳过重复投递。\n */\nexport function processWebhook(\n req: WebhookRequest,\n opts: ProcessWebhookOptions\n): ProcessWebhookResult {\n const raw = getRawBody(req);\n const sigV2 = headerValue(req.headers, 'x-starim-signature-v2');\n const ts = headerValue(req.headers, 'x-starim-timestamp');\n verifyWebhookSignature(opts.secretToken, raw, sigV2, ts, opts.verify);\n\n let update: Update;\n try {\n update = JSON.parse(raw.toString('utf8')) as Update;\n } catch {\n throw new StarIMSignatureError('Invalid JSON body');\n }\n if (!update || typeof update !== 'object' || typeof update.update_id !== 'string') {\n throw new StarIMSignatureError('Invalid Update payload');\n }\n\n const headerId = headerValue(req.headers, 'x-starim-update-id');\n if (headerId && headerId !== update.update_id) {\n throw new StarIMSignatureError('X-StarIM-Update-Id does not match body.update_id');\n }\n\n let duplicate = false;\n if (opts.dedupe) {\n if (opts.dedupe.has(update.update_id)) {\n duplicate = true;\n } else {\n opts.dedupe.add(update.update_id);\n }\n }\n\n return { update, duplicate };\n}\n\nexport interface WebhookMiddlewareOptions extends ProcessWebhookOptions {\n onUpdate: (update: Update, ctx: { rawBody: Buffer; duplicate: boolean }) => void | Promise<void>;\n /** 重复 update_id 时仍调用 onUpdate,默认 false */\n invokeOnDuplicate?: boolean;\n}\n\n/**\n * Connect/Express 风格中间件:请务必在 JSON 解析前保留 raw body。\n */\nexport function webhookMiddleware(\n opts: WebhookMiddlewareOptions\n): (req: WebhookRequest, res: WebhookResponse, next?: (err?: unknown) => void) => Promise<void> {\n return async (req, res, next) => {\n try {\n if (req.method && req.method !== 'POST') {\n res.statusCode = 405;\n res.end('Method Not Allowed');\n return;\n }\n const { update, duplicate } = processWebhook(req, {\n secretToken: opts.secretToken,\n dedupe: opts.dedupe,\n verify: opts.verify\n });\n if (duplicate && !opts.invokeOnDuplicate) {\n res.statusCode = 200;\n res.end('ok');\n return;\n }\n await opts.onUpdate(update, { rawBody: getRawBody(req), duplicate });\n res.statusCode = 200;\n res.end('ok');\n } catch (e) {\n if (e instanceof StarIMSignatureError) {\n res.statusCode = 401;\n res.end('unauthorized');\n return;\n }\n if (typeof next === 'function') {\n next(e);\n return;\n }\n res.statusCode = 500;\n res.end('error');\n }\n };\n}\n","import { createServer, type IncomingMessage, type Server } from 'node:http';\nimport { StarIMBotClient } from './client.js';\nimport { StarIMSignatureError } from './errors.js';\nimport type {\n AnswerCallbackQueryParams,\n AnswerInlineQueryParams,\n CallbackQuery,\n ChatJoinRequestUpdate,\n ChatMemberUpdated,\n FriendRequestUpdate,\n InlineQuery,\n ReplyMarkup,\n StarIMBotOptions,\n Update,\n UpdateType,\n WebhookMessage\n} from './types.js';\nimport { LruDedupe, processWebhook, type WebhookRequest, type WebhookResponse } from './webhook.js';\n\nexport type BotContext = {\n update: Update;\n /** 原始 POST body(与签名校验一致的字节) */\n rawBody: Buffer;\n /** 平台重试导致的重复 update_id */\n duplicate: boolean;\n client: StarIMBotClient;\n /** 当前载荷中的 message(编辑/删除场景字段可能不全) */\n message: WebhookMessage;\n chat: WebhookMessage['chat'];\n /** InlineKeyboard 点击事件,仅 callback_query Update 存在 */\n callbackQuery?: CallbackQuery;\n /** Inline Mode 查询,仅 inline_query Update 存在 */\n inlineQuery?: InlineQuery;\n /** 用户发起的好友申请,仅 friend_request Update 存在 */\n friendRequest?: FriendRequestUpdate;\n /** 机器人自身被加入/移出/状态变化,仅 my_chat_member Update 存在 */\n myChatMember?: ChatMemberUpdated;\n /** 群内其它成员状态变化(机器人需是管理员),仅 chat_member Update 存在 */\n chatMember?: ChatMemberUpdated;\n /** 群入群申请,仅 chat_join_request Update 存在 */\n chatJoinRequest?: ChatJoinRequestUpdate;\n /** 快捷回复文本到当前会话 */\n reply: (text: string, options?: { reply_markup?: ReplyMarkup }) => ReturnType<StarIMBotClient['sendMessage']>;\n /** 快捷回应当前 callback_query */\n answerCallback: (params?: Omit<AnswerCallbackQueryParams, 'callback_query_id'>) => ReturnType<StarIMBotClient['answerCallbackQuery']>;\n /** 快捷应答当前 inline_query */\n answerInlineQuery: (\n params: Omit<AnswerInlineQueryParams, 'inline_query_id'>\n ) => ReturnType<StarIMBotClient['answerInlineQuery']>;\n};\n\ntype Handler = (ctx: BotContext) => void | Promise<void>;\n\nfunction toNodeHeaders(h: IncomingMessage['headers']): Record<string, string | string[] | undefined> {\n const out: Record<string, string | string[] | undefined> = {};\n for (const [k, v] of Object.entries(h)) {\n out[k] = v;\n }\n return out;\n}\n\nasync function readBody(req: IncomingMessage): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n}\n\nexport class StarIMBot {\n readonly client: StarIMBotClient;\n private readonly secretToken: string;\n private readonly dedupe: LruDedupe;\n private readonly handlers = new Map<string, Handler[]>();\n private readonly commands = new Map<string, Handler[]>();\n private pollingActive = false;\n private pollingOffset = 0;\n\n constructor(opts: StarIMBotOptions) {\n this.secretToken = opts.secretToken;\n this.client = new StarIMBotClient({\n token: opts.token,\n baseUrl: opts.baseUrl,\n timeoutMs: opts.timeoutMs,\n debug: opts.debug,\n logger: opts.logger\n });\n this.dedupe = new LruDedupe(opts.dedupeSize ?? 1024);\n }\n\n on(type: UpdateType | '*', handler: Handler): this {\n const key = type;\n const list = this.handlers.get(key) ?? [];\n list.push(handler);\n this.handlers.set(key, list);\n return this;\n }\n\n /**\n * 仅匹配文本消息中以 `/name` 开头的命令(大小写不敏感)。\n */\n command(name: string, handler: Handler): this {\n const n = name.replace(/^\\//, '').toLowerCase();\n const list = this.commands.get(n) ?? [];\n list.push(handler);\n this.commands.set(n, list);\n return this;\n }\n\n private async dispatch(ctx: BotContext): Promise<void> {\n const { update } = ctx;\n const type = update.type;\n\n if (type === 'message' && ctx.message.text) {\n const text = ctx.message.text.trim();\n const m = /^\\/(\\w+)/i.exec(text);\n if (m) {\n const cmd = m[1].toLowerCase();\n const cmdHandlers = this.commands.get(cmd);\n if (cmdHandlers?.length) {\n for (const h of cmdHandlers) {\n await h(ctx);\n }\n return;\n }\n }\n }\n\n const specific = this.handlers.get(type) ?? [];\n for (const h of specific) {\n await h(ctx);\n }\n\n const star = this.handlers.get('*') ?? [];\n for (const h of star) {\n await h(ctx);\n }\n }\n\n /**\n * Express / Connect 中间件:先挂载 express.raw(例如 type: application/json),再使用本回调。\n */\n webhookCallback(): (req: WebhookRequest, res: WebhookResponse, next?: (err?: unknown) => void) => Promise<void> {\n return async (req, res, next) => {\n try {\n if (req.method && req.method !== 'POST') {\n res.statusCode = 405;\n res.end('Method Not Allowed');\n return;\n }\n const { update, duplicate } = processWebhook(req, {\n secretToken: this.secretToken,\n dedupe: this.dedupe\n });\n if (duplicate) {\n res.statusCode = 200;\n res.end('ok');\n return;\n }\n const ctx = this.createContext(update, getRaw(req), duplicate);\n await this.dispatch(ctx);\n res.statusCode = 200;\n res.end('ok');\n } catch (e) {\n if (e instanceof StarIMSignatureError) {\n res.statusCode = 401;\n res.end('unauthorized');\n return;\n }\n if (typeof next === 'function') {\n next(e);\n return;\n }\n res.statusCode = 500;\n res.end('error');\n }\n };\n }\n\n /**\n * 长轮询模式:循环调用 getUpdates,把 update 喂给与 Webhook 相同的 dispatch 链路。\n *\n * 适用场景:\n * - 没有公网 IP / HTTPS 证书的本机开发;\n * - CI / 测试环境快速接入。\n *\n * 使用前请先 `await client.deleteWebhook()`,否则平台返回 409。\n * 内部维护 offset、自动捕获错误并指数退避重试;调用 `stopPolling()` 优雅退出。\n *\n * @example\n * ```ts\n * await bot.client.deleteWebhook();\n * await bot.startPolling({ timeout: 30 });\n * ```\n */\n async startPolling(options: {\n timeout?: number;\n limit?: number;\n allowedUpdates?: string[];\n /** 平台返回错误时的最大退避秒数,默认 30 */\n maxBackoffSec?: number;\n } = {}): Promise<void> {\n if (this.pollingActive) return;\n this.pollingActive = true;\n this.pollingOffset = 0;\n const timeoutSec = Math.min(50, Math.max(0, options.timeout ?? 30));\n const limit = Math.min(100, Math.max(1, options.limit ?? 100));\n const allowed = options.allowedUpdates ?? [];\n const maxBackoff = Math.max(1, options.maxBackoffSec ?? 30);\n\n let consecutiveErrors = 0;\n while (this.pollingActive) {\n try {\n const { updates } = await this.client.getUpdates({\n offset: this.pollingOffset,\n limit,\n timeout: timeoutSec,\n allowed_updates: allowed as UpdateType[]\n });\n consecutiveErrors = 0;\n for (const u of updates) {\n if (typeof u.update_seq === 'number') {\n this.pollingOffset = Math.max(this.pollingOffset, u.update_seq + 1);\n }\n // polling 也用同一份 LRU 去重,跨重启可减少业务侧重复\n const uid = String(u.update_id);\n if (this.dedupe.has(uid)) continue;\n this.dedupe.add(uid);\n const ctx = this.createContext(u, Buffer.alloc(0), false);\n try {\n await this.dispatch(ctx);\n } catch (handlerErr) {\n try {\n this.client.logger?.error?.('[StarIMBot.polling] handler error', { error: (handlerErr as Error)?.message });\n } catch { /* logger 缺失时静默 */ }\n }\n }\n } catch (err) {\n consecutiveErrors += 1;\n const delay = Math.min(maxBackoff, Math.pow(2, Math.min(consecutiveErrors, 6))) * 1000;\n try {\n this.client.logger?.warn?.('[StarIMBot.polling] getUpdates failed, backing off', {\n error: (err as Error)?.message,\n delayMs: delay\n });\n } catch { /* logger 缺失时静默 */ }\n await new Promise(r => setTimeout(r, delay));\n }\n }\n }\n\n /** 停止 startPolling 的循环(不会立刻打断当前 long-poll,等当次 RPC 返回后退出) */\n stopPolling(): void {\n this.pollingActive = false;\n }\n\n /**\n * 内置 HTTP 服务,便于快速起 Webhook(生产环境建议使用反向代理 + TLS)。\n */\n start(options: { port: number; host?: string; path?: string }): Promise<Server> {\n const webhookPath = options.path ?? '/webhook';\n const server = createServer(async (req, res) => {\n try {\n if (req.method !== 'POST' || req.url?.split('?')[0] !== webhookPath) {\n res.statusCode = 404;\n res.end();\n return;\n }\n const raw = await readBody(req);\n const wreq: WebhookRequest = {\n method: req.method,\n headers: toNodeHeaders(req.headers),\n body: raw,\n rawBody: raw\n };\n const { update, duplicate } = processWebhook(wreq, {\n secretToken: this.secretToken,\n dedupe: this.dedupe\n });\n if (duplicate) {\n res.statusCode = 200;\n res.end('ok');\n return;\n }\n const ctx = this.createContext(update, raw, duplicate);\n await this.dispatch(ctx);\n res.statusCode = 200;\n res.end('ok');\n } catch (e) {\n if (e instanceof StarIMSignatureError) {\n res.statusCode = 401;\n res.end('unauthorized');\n return;\n }\n res.statusCode = 500;\n res.end('error');\n }\n });\n return new Promise((resolve, reject) => {\n server.listen(options.port, options.host ?? '0.0.0.0', () => resolve(server));\n server.on('error', reject);\n });\n }\n\n private createContext(update: Update, rawBody: Buffer, duplicate: boolean): BotContext {\n // StarIM 服务端对 my_chat_member / chat_member / chat_join_request 这三类 update\n // 采用扁平 payload(chat/from/old_chat_member/new_chat_member 直接放在 update 顶层)。\n // 这里做 normalize:若顶层有相应字段而嵌套字段缺失,则合成嵌套对象,\n // 让 BotContext 字段稳定可用。\n const flat = update as Update & {\n chat?: ChatMemberUpdated['chat'];\n from?: ChatMemberUpdated['from'];\n old_chat_member?: ChatMemberUpdated['old_chat_member'];\n new_chat_member?: ChatMemberUpdated['new_chat_member'];\n user_chat_id?: string;\n bio?: string;\n };\n if (update.type === 'my_chat_member' && !update.my_chat_member && flat.chat && flat.from) {\n update.my_chat_member = {\n chat: flat.chat,\n from: flat.from,\n date: typeof update.date === 'number' ? update.date : Math.floor(Date.now() / 1000),\n old_chat_member: flat.old_chat_member as ChatMemberUpdated['old_chat_member'],\n new_chat_member: flat.new_chat_member as ChatMemberUpdated['new_chat_member']\n };\n }\n if (update.type === 'chat_member' && !update.chat_member && flat.chat && flat.from) {\n update.chat_member = {\n chat: flat.chat,\n from: flat.from,\n date: typeof update.date === 'number' ? update.date : Math.floor(Date.now() / 1000),\n old_chat_member: flat.old_chat_member as ChatMemberUpdated['old_chat_member'],\n new_chat_member: flat.new_chat_member as ChatMemberUpdated['new_chat_member']\n };\n }\n if (update.type === 'chat_join_request' && !update.chat_join_request && flat.chat && flat.from) {\n update.chat_join_request = {\n chat: flat.chat,\n from: flat.from,\n date: typeof update.date === 'number' ? update.date : Math.floor(Date.now() / 1000),\n user_chat_id: flat.user_chat_id ?? '',\n bio: flat.bio\n };\n }\n\n const callbackQuery = update.callback_query;\n const inlineQuery = update.inline_query;\n const friendRequest = update.friend_request;\n const myChatMember = update.my_chat_member;\n const chatMember = update.chat_member;\n const chatJoinRequest = update.chat_join_request;\n // message fallback:成员事件没有 message,用对应 chat 占位,确保 ctx.chat / ctx.reply 等可用\n const memberChat = myChatMember?.chat ?? chatMember?.chat ?? chatJoinRequest?.chat;\n const message = update.message ?? callbackQuery?.message ?? {\n message_id: '',\n chat: memberChat ?? {\n id:\n inlineQuery?.from?.id != null\n ? String(inlineQuery.from.id)\n : friendRequest?.from?.id != null\n ? String(friendRequest.from.id)\n : '',\n type: 'private' as const\n },\n date: Math.floor(Date.now() / 1000)\n };\n const chat = message.chat;\n return {\n update,\n rawBody,\n duplicate,\n client: this.client,\n message,\n chat,\n callbackQuery,\n inlineQuery,\n friendRequest,\n myChatMember,\n chatMember,\n chatJoinRequest,\n reply: (text: string, options?: { reply_markup?: ReplyMarkup }) =>\n this.client.sendMessage({\n chat_id: String(chat.id),\n text,\n reply_markup: options?.reply_markup\n }),\n answerCallback: (params = {}) => {\n if (!callbackQuery?.id) {\n return Promise.reject(new Error('answerCallback: current update is not callback_query'));\n }\n return this.client.answerCallbackQuery({\n callback_query_id: callbackQuery.id,\n ...params\n });\n },\n answerInlineQuery: (params: Omit<AnswerInlineQueryParams, 'inline_query_id'>) => {\n if (!inlineQuery?.id) {\n return Promise.reject(new Error('answerInlineQuery: current update is not inline_query'));\n }\n return this.client.answerInlineQuery({\n inline_query_id: inlineQuery.id,\n ...params\n });\n }\n };\n }\n}\n\nfunction getRaw(req: WebhookRequest): Buffer {\n if (Buffer.isBuffer(req.rawBody)) return req.rawBody;\n if (Buffer.isBuffer(req.body)) return req.body;\n throw new Error('webhookCallback: missing raw body');\n}\n"]}