@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.
- package/LICENSE +21 -0
- package/README.md +287 -0
- package/dist/index.cjs +1188 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +727 -0
- package/dist/index.d.ts +727 -0
- package/dist/index.js +1166 -0
- package/dist/index.js.map +1 -0
- package/package.json +74 -0
|
@@ -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"],"mappings":"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","file":"index.js","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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@starim-io/bot-sdk",
|
|
3
|
+
"version": "0.1.4",
|
|
4
|
+
"description": "Official Node.js SDK for StarIM Bot API and Webhooks",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"sideEffects": false,
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=18.0.0"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup",
|
|
32
|
+
"dev": "tsup --watch",
|
|
33
|
+
"lint": "eslint src --ext .ts",
|
|
34
|
+
"lint:fix": "eslint src --ext .ts --fix",
|
|
35
|
+
"test": "vitest run",
|
|
36
|
+
"test:watch": "vitest",
|
|
37
|
+
"prepublishOnly": "npm run build && npm run test",
|
|
38
|
+
"release:dry": "npm publish --dry-run",
|
|
39
|
+
"release": "npm publish"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"starim",
|
|
43
|
+
"bot",
|
|
44
|
+
"im",
|
|
45
|
+
"webhook",
|
|
46
|
+
"sdk"
|
|
47
|
+
],
|
|
48
|
+
"author": "StarIM Team",
|
|
49
|
+
"license": "MIT",
|
|
50
|
+
"homepage": "https://open.starim.io/robot-docs",
|
|
51
|
+
"repository": {
|
|
52
|
+
"type": "git",
|
|
53
|
+
"url": "git+https://github.com/starim-io/starim.git",
|
|
54
|
+
"directory": "botsdk/nodejs"
|
|
55
|
+
},
|
|
56
|
+
"bugs": {
|
|
57
|
+
"url": "https://open.starim.io/contact"
|
|
58
|
+
},
|
|
59
|
+
"publishConfig": {
|
|
60
|
+
"access": "public",
|
|
61
|
+
"registry": "https://registry.npmjs.org/"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@eslint/js": "^9.17.0",
|
|
65
|
+
"@types/node": "^22.10.2",
|
|
66
|
+
"eslint": "^9.17.0",
|
|
67
|
+
"globals": "^15.14.0",
|
|
68
|
+
"typescript-eslint": "^8.18.2",
|
|
69
|
+
"tsup": "^8.3.5",
|
|
70
|
+
"tsx": "^4.19.2",
|
|
71
|
+
"typescript": "^5.7.2",
|
|
72
|
+
"vitest": "^2.1.8"
|
|
73
|
+
}
|
|
74
|
+
}
|