@meet-im/meet-bot-jssdk 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -21
- package/dist/index.cjs +19 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -8
- package/dist/index.d.ts +7 -8
- package/dist/index.js +19 -23
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
# @meet/meet-bot-jssdk
|
|
1
|
+
# @meet-im/meet-bot-jssdk
|
|
2
2
|
|
|
3
3
|
MeetIM Chatbot JavaScript SDK - 支持 Long Polling 消息获取和消息发送
|
|
4
4
|
|
|
5
5
|
## 安装
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
pnpm add @meet/meet-bot-jssdk
|
|
8
|
+
pnpm add @meet-im/meet-bot-jssdk
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## 快速开始
|
|
@@ -13,7 +13,7 @@ pnpm add @meet/meet-bot-jssdk
|
|
|
13
13
|
### 类实例风格
|
|
14
14
|
|
|
15
15
|
```typescript
|
|
16
|
-
import { MeetBot } from '@meet/meet-bot-jssdk'
|
|
16
|
+
import { MeetBot } from '@meet-im/meet-bot-jssdk'
|
|
17
17
|
|
|
18
18
|
const bot = new MeetBot({
|
|
19
19
|
token: 'bot_id:secret',
|
|
@@ -34,7 +34,7 @@ bot.startPolling()
|
|
|
34
34
|
### 函数式风格
|
|
35
35
|
|
|
36
36
|
```typescript
|
|
37
|
-
import { getUpdates, sendMessage } from '@meet/meet-bot-jssdk'
|
|
37
|
+
import { getUpdates, sendMessage } from '@meet-im/meet-bot-jssdk'
|
|
38
38
|
|
|
39
39
|
const token = 'bot_id:secret'
|
|
40
40
|
const baseUrl = 'https://staging-meet-api.miyachat.com'
|
|
@@ -65,14 +65,14 @@ for (const update of updates) {
|
|
|
65
65
|
new MeetBot(config: MeetBotConfig)
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
-
| 参数
|
|
69
|
-
|
|
|
70
|
-
| token
|
|
71
|
-
| botId
|
|
72
|
-
| botToken
|
|
73
|
-
| baseUrl
|
|
74
|
-
| pollingLimit
|
|
75
|
-
|
|
|
68
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
69
|
+
| ------------------ | ---------------- | ---- | ------------------------------------------------------ |
|
|
70
|
+
| token | string | 是\* | Bot Token,格式:`bot_id:secret` |
|
|
71
|
+
| botId | string \| number | 是\* | Bot ID(与 botToken 配合使用) |
|
|
72
|
+
| botToken | string | 是\* | Bot Token(与 botId 配合使用) |
|
|
73
|
+
| baseUrl | string | 否 | API 地址,默认 `https://staging-meet-api.miyachat.com` |
|
|
74
|
+
| pollingLimit | number | 否 | 每次拉取消息条数,默认 100 |
|
|
75
|
+
| longPollingTimeout | number | 否 | 长轮询超时时间(秒),默认 30 |
|
|
76
76
|
|
|
77
77
|
\*token 或 (botId + botToken) 二选一
|
|
78
78
|
|
|
@@ -90,14 +90,13 @@ new MeetBot(config: MeetBotConfig)
|
|
|
90
90
|
|
|
91
91
|
#### startPolling options
|
|
92
92
|
|
|
93
|
-
| 参数
|
|
94
|
-
|
|
|
95
|
-
|
|
|
96
|
-
| limit
|
|
97
|
-
|
|
|
98
|
-
|
|
|
99
|
-
|
|
|
100
|
-
| onOffsetUpdate | (offset: number) => void | - | offset 更新回调 |
|
|
93
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
94
|
+
| -------------- | ------------------------ | ------ | ------------------------------ |
|
|
95
|
+
| timeout | number | 30 | 长轮询超时时间(秒) |
|
|
96
|
+
| limit | number | 100 | 每次拉取消息条数 |
|
|
97
|
+
| retryDelay | number | 1000 | 重试延迟基础时间(毫秒) |
|
|
98
|
+
| maxRetries | number | 0 | 最大重试次数(0 表示无限重试) |
|
|
99
|
+
| onOffsetUpdate | (offset: number) => void | - | offset 更新回调 |
|
|
101
100
|
|
|
102
101
|
#### 事件
|
|
103
102
|
|
|
@@ -190,7 +189,7 @@ SDK 提供以下错误类型:
|
|
|
190
189
|
| `ValidationError` | 参数验证错误 |
|
|
191
190
|
|
|
192
191
|
```typescript
|
|
193
|
-
import { ApiError, NetworkError } from '@meet/meet-bot-jssdk'
|
|
192
|
+
import { ApiError, NetworkError } from '@meet-im/meet-bot-jssdk'
|
|
194
193
|
|
|
195
194
|
try {
|
|
196
195
|
await bot.sendMessage(sessionInfo, { content: 'Hello' })
|
package/dist/index.cjs
CHANGED
|
@@ -77,14 +77,16 @@ var DEFAULT_BASE_URL = "https://staging-meet-api.miyachat.com";
|
|
|
77
77
|
var POLLING = {
|
|
78
78
|
/** 每次拉取消息条数上限,默认 100 条 */
|
|
79
79
|
DEFAULT_LIMIT: 100,
|
|
80
|
-
/**
|
|
81
|
-
|
|
80
|
+
/** 长轮询超时时间(秒),默认 30 秒 */
|
|
81
|
+
DEFAULT_TIMEOUT: 30,
|
|
82
|
+
/** 成功返回后等待时间(毫秒),默认 1 秒 */
|
|
83
|
+
SUCCESS_DELAY: 1e3,
|
|
82
84
|
/** 重试延迟基础时间(毫秒),默认 1000ms */
|
|
83
85
|
DEFAULT_RETRY_DELAY: 1e3,
|
|
84
86
|
/** 重试延迟最大时间(毫秒),默认 30000ms */
|
|
85
87
|
MAX_RETRY_DELAY: 3e4,
|
|
86
|
-
/**
|
|
87
|
-
DEFAULT_MAX_RETRIES:
|
|
88
|
+
/** 最大重试次数,默认无限(0 表示不限制) */
|
|
89
|
+
DEFAULT_MAX_RETRIES: 0
|
|
88
90
|
};
|
|
89
91
|
var HTTP = {
|
|
90
92
|
/** 请求超时时间(毫秒),默认 60000ms */
|
|
@@ -93,8 +95,8 @@ var HTTP = {
|
|
|
93
95
|
POLLING_TIMEOUT_BUFFER: 1e4
|
|
94
96
|
};
|
|
95
97
|
var API = {
|
|
96
|
-
/** getUpdates 默认超时时间(秒),默认
|
|
97
|
-
DEFAULT_TIMEOUT:
|
|
98
|
+
/** getUpdates 默认超时时间(秒),默认 30(long polling) */
|
|
99
|
+
DEFAULT_TIMEOUT: 30,
|
|
98
100
|
/** getUpdates 默认拉取条数,默认 100 条 */
|
|
99
101
|
DEFAULT_LIMIT: 100
|
|
100
102
|
};
|
|
@@ -135,7 +137,6 @@ async function request(options) {
|
|
|
135
137
|
Authorization: `Bot ${extractBotToken(token)}`
|
|
136
138
|
};
|
|
137
139
|
console.log("[Request]", method, url);
|
|
138
|
-
console.log("[Headers]", JSON.stringify(headers, null, 2));
|
|
139
140
|
if (body) {
|
|
140
141
|
console.log("[Body]", JSON.stringify(body, null, 2));
|
|
141
142
|
}
|
|
@@ -152,7 +153,6 @@ async function request(options) {
|
|
|
152
153
|
responseHeaders[key] = value;
|
|
153
154
|
});
|
|
154
155
|
console.log("[Response Status]", response.status);
|
|
155
|
-
console.log("[Response Headers]", JSON.stringify(responseHeaders, null, 2));
|
|
156
156
|
const data = await response.json();
|
|
157
157
|
console.log("[Response Body]", JSON.stringify(data, null, 2));
|
|
158
158
|
if (!response.ok || !data.ok) {
|
|
@@ -238,11 +238,10 @@ var MeetBot = class {
|
|
|
238
238
|
token;
|
|
239
239
|
baseUrl;
|
|
240
240
|
pollingLimit;
|
|
241
|
-
|
|
241
|
+
longPollingTimeout;
|
|
242
242
|
eventHandlers = /* @__PURE__ */ new Map();
|
|
243
243
|
polling = false;
|
|
244
244
|
offset = 0;
|
|
245
|
-
retryCount = 0;
|
|
246
245
|
abortController = null;
|
|
247
246
|
constructor(config) {
|
|
248
247
|
if (config.token) {
|
|
@@ -257,7 +256,7 @@ var MeetBot = class {
|
|
|
257
256
|
}
|
|
258
257
|
this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;
|
|
259
258
|
this.pollingLimit = config.pollingLimit ?? POLLING.DEFAULT_LIMIT;
|
|
260
|
-
this.
|
|
259
|
+
this.longPollingTimeout = config.longPollingTimeout ?? POLLING.DEFAULT_TIMEOUT;
|
|
261
260
|
}
|
|
262
261
|
on(event, handler) {
|
|
263
262
|
if (!this.eventHandlers.has(event)) {
|
|
@@ -293,26 +292,25 @@ var MeetBot = class {
|
|
|
293
292
|
return;
|
|
294
293
|
}
|
|
295
294
|
this.polling = true;
|
|
296
|
-
this.retryCount = 0;
|
|
297
295
|
this.abortController = new AbortController();
|
|
298
296
|
const limit = options?.limit ?? this.pollingLimit;
|
|
299
|
-
const
|
|
300
|
-
|
|
301
|
-
console.log(`\u5F00\u59CB\u8F6E\u8BE2\u6D88\u606F... (\u6761\u6570: ${limit}, \u95F4\u9694: ${interval}ms)`);
|
|
297
|
+
const timeout = options?.timeout ?? this.longPollingTimeout;
|
|
298
|
+
console.log(`\u5F00\u59CB\u957F\u8F6E\u8BE2\u6D88\u606F... (\u6761\u6570: ${limit}, \u8D85\u65F6: ${timeout}s)`);
|
|
302
299
|
this.emit("polling_start", void 0);
|
|
303
300
|
const retryDelay = options?.retryDelay ?? POLLING.DEFAULT_RETRY_DELAY;
|
|
304
301
|
const maxRetries = options?.maxRetries ?? POLLING.DEFAULT_MAX_RETRIES;
|
|
305
302
|
const onOffsetUpdate = options?.onOffsetUpdate;
|
|
303
|
+
let retryCount = 0;
|
|
306
304
|
while (this.polling) {
|
|
307
305
|
try {
|
|
308
306
|
const updates = await getUpdates({
|
|
309
307
|
token: this.token,
|
|
310
308
|
baseUrl: this.baseUrl,
|
|
311
|
-
timeout
|
|
309
|
+
timeout,
|
|
312
310
|
offset: this.offset,
|
|
313
311
|
limit
|
|
314
312
|
});
|
|
315
|
-
|
|
313
|
+
retryCount = 0;
|
|
316
314
|
for (const update of updates) {
|
|
317
315
|
if (update.message) {
|
|
318
316
|
this.emit("message", update.message);
|
|
@@ -320,18 +318,16 @@ var MeetBot = class {
|
|
|
320
318
|
onOffsetUpdate?.(this.offset);
|
|
321
319
|
}
|
|
322
320
|
}
|
|
323
|
-
|
|
324
|
-
await this.sleep(interval);
|
|
325
|
-
}
|
|
321
|
+
await this.sleep(POLLING.SUCCESS_DELAY);
|
|
326
322
|
} catch (error) {
|
|
327
323
|
if (!this.polling) break;
|
|
328
|
-
|
|
324
|
+
retryCount++;
|
|
329
325
|
this.emit("error", error instanceof Error ? error : new Error(String(error)));
|
|
330
|
-
if (
|
|
326
|
+
if (maxRetries > 0 && retryCount >= maxRetries) {
|
|
331
327
|
this.stopPolling();
|
|
332
328
|
break;
|
|
333
329
|
}
|
|
334
|
-
const delay = Math.min(retryDelay * Math.pow(2,
|
|
330
|
+
const delay = Math.min(retryDelay * Math.pow(2, retryCount - 1), POLLING.MAX_RETRY_DELAY);
|
|
335
331
|
await this.sleep(delay);
|
|
336
332
|
}
|
|
337
333
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/error.ts","../src/types/index.ts","../src/constants.ts","../src/http/request.ts","../src/api/index.ts","../src/client.ts","../src/index.ts"],"names":["ApiError","MeetBotError","NetworkError","TimeoutError","ValidationError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ErrorCode } from './api'\n\nexport class MeetBotError extends Error {\n public readonly code: ErrorCode\n\n constructor(message: string, code: ErrorCode) {\n super(message)\n this.name = 'MeetBotError'\n this.code = code\n Error.captureStackTrace?.(this, this.constructor)\n }\n}\n\nexport class ApiError extends MeetBotError {\n public readonly statusCode: number\n public readonly retryAfter?: number\n\n constructor(message: string, statusCode: number, code: ErrorCode, retryAfter?: number) {\n super(message, code)\n this.name = 'ApiError'\n this.statusCode = statusCode\n this.retryAfter = retryAfter\n }\n}\n\nexport class NetworkError extends MeetBotError {\n public readonly cause?: Error\n\n constructor(message: string, cause?: Error) {\n super(message, 'NETWORK_ERROR')\n this.name = 'NetworkError'\n this.cause = cause\n }\n}\n\nexport class TimeoutError extends MeetBotError {\n constructor(message: string) {\n super(message, 'TIMEOUT_ERROR')\n this.name = 'TimeoutError'\n }\n}\n\nexport class ValidationError extends MeetBotError {\n public readonly field: string\n public readonly value: unknown\n\n constructor(message: string, field: string, value: unknown) {\n super(message, 'VALIDATION_ERROR')\n this.name = 'ValidationError'\n this.field = field\n this.value = value\n }\n}\n","export type {\n BotUser,\n BotChat,\n BotFile,\n BotMsg,\n BotUpdate,\n ChatType,\n SessionInfo,\n SessionType,\n MsgContent,\n MsgType,\n ExtraInfo,\n} from './bot'\nexport type { ErrorCode, ApiErrorResponse, ApiResponse } from './api'\nexport type { MeetBotConfig, GetUpdatesOptions, SendMessageOptions, SendMessageResult, PollingOptions } from './client'\n\nexport { MeetBotError, ApiError, NetworkError, TimeoutError, ValidationError } from './error'\n","/**\n * Bot API 默认基础 URL\n */\nexport const DEFAULT_BASE_URL = 'https://staging-meet-api.miyachat.com'\n\n/**\n * 轮询相关常量\n */\nexport const POLLING = {\n /** 每次拉取消息条数上限,默认 100 条 */\n DEFAULT_LIMIT: 100,\n /** 轮询间隔时间(毫秒),默认 10 秒 */\n DEFAULT_INTERVAL: 10 * 1000,\n /** 重试延迟基础时间(毫秒),默认 1000ms */\n DEFAULT_RETRY_DELAY: 1000,\n /** 重试延迟最大时间(毫秒),默认 30000ms */\n MAX_RETRY_DELAY: 30000,\n /** 最大重试次数,默认 3 次 */\n DEFAULT_MAX_RETRIES: 3,\n} as const\n\n/**\n * HTTP 请求相关常量\n */\nexport const HTTP = {\n /** 请求超时时间(毫秒),默认 60000ms */\n DEFAULT_TIMEOUT: 60000,\n /** 长轮询额外超时缓冲时间(毫秒),默认 10000ms */\n POLLING_TIMEOUT_BUFFER: 10000,\n} as const\n\n/**\n * API 接口相关常量\n */\nexport const API = {\n /** getUpdates 默认超时时间(秒),默认 0(立即返回) */\n DEFAULT_TIMEOUT: 0,\n /** getUpdates 默认拉取条数,默认 100 条 */\n DEFAULT_LIMIT: 100,\n} as const\n","import type { ApiResponse, ApiErrorResponse } from '../types'\nimport { ApiError, NetworkError, TimeoutError } from '../types'\nimport { DEFAULT_BASE_URL, HTTP } from '../constants'\n\nexport interface RequestOptions {\n token: string\n baseUrl?: string\n method?: 'GET' | 'POST'\n path: string\n params?: Record<string, string | number | undefined>\n body?: Record<string, unknown>\n timeout?: number\n}\n\nfunction validateToken(token: string): void {\n if (!token || typeof token !== 'string') {\n throw new NetworkError('Token is required', undefined)\n }\n if (!token.includes(':')) {\n throw new NetworkError('Invalid token format. Expected \"bot_id:secret\"', undefined)\n }\n}\n\nfunction extractBotToken(token: string): string {\n const parts = token.split(':')\n return parts.length >= 2 ? parts.slice(1).join(':') : token\n}\n\nfunction buildUrl(baseUrl: string, path: string, params?: Record<string, string | number | undefined>): string {\n const url = new URL(`/im/bot/${path}`, baseUrl || DEFAULT_BASE_URL)\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n }\n }\n return url.toString()\n}\n\nexport async function request<T>(options: RequestOptions): Promise<T> {\n const { token, baseUrl, method = 'GET', path, params, body, timeout = HTTP.DEFAULT_TIMEOUT } = options\n\n validateToken(token)\n\n const url = buildUrl(baseUrl || DEFAULT_BASE_URL, path, method === 'GET' ? params : undefined)\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bot ${extractBotToken(token)}`,\n }\n\n console.log('[Request]', method, url)\n console.log('[Headers]', JSON.stringify(headers, null, 2))\n if (body) {\n console.log('[Body]', JSON.stringify(body, null, 2))\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n })\n clearTimeout(timeoutId)\n\n const responseHeaders: Record<string, string> = {}\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value\n })\n console.log('[Response Status]', response.status)\n console.log('[Response Headers]', JSON.stringify(responseHeaders, null, 2))\n\n const data = (await response.json()) as ApiResponse<T> | ApiErrorResponse\n console.log('[Response Body]', JSON.stringify(data, null, 2))\n\n if (!response.ok || !data.ok) {\n const errorData = data as ApiErrorResponse\n throw new ApiError(\n errorData.description || `HTTP ${response.status}`,\n response.status,\n mapStatusCodeToErrorCode(response.status),\n errorData.retry_after\n )\n }\n\n return (data as ApiResponse<T>).result as T\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof ApiError) {\n throw error\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(`Request timeout after ${timeout}ms`)\n }\n throw new NetworkError(`Network error: ${error.message}`, error)\n }\n\n throw new NetworkError('Unknown network error', undefined)\n }\n}\n\nfunction mapStatusCodeToErrorCode(status: number): import('../types').ErrorCode {\n switch (status) {\n case 401:\n return 'UNAUTHORIZED'\n case 403:\n return 'UNAUTHORIZED'\n case 404:\n return 'CHAT_NOT_FOUND'\n case 429:\n return 'RATE_LIMIT'\n case 500:\n case 502:\n case 503:\n return 'INTERNAL_ERROR'\n default:\n return 'INTERNAL_ERROR'\n }\n}\n","import type { BotUpdate, SendMessageResult, SessionInfo, MsgContent } from '../types'\nimport { request } from '../http/request'\nimport { API, HTTP } from '../constants'\n\nexport interface GetUpdatesParams {\n token: string\n baseUrl?: string\n timeout?: number\n offset?: number\n limit?: number\n}\n\nexport async function getUpdates(params: GetUpdatesParams): Promise<BotUpdate[]> {\n const { token, baseUrl, timeout = API.DEFAULT_TIMEOUT, offset, limit = API.DEFAULT_LIMIT } = params\n\n return request<BotUpdate[]>({\n token,\n baseUrl,\n method: 'POST',\n path: 'getUpdates',\n body: {\n timeout,\n offset,\n limit,\n },\n timeout: (timeout || 0) * 1000 + HTTP.POLLING_TIMEOUT_BUFFER,\n })\n}\n\nexport interface SendMessageParams {\n token: string\n baseUrl?: string\n sessionInfo: SessionInfo\n msgContent: MsgContent\n}\n\nexport async function sendMessage(params: SendMessageParams): Promise<SendMessageResult> {\n const { token, baseUrl, sessionInfo, msgContent } = params\n\n if (!msgContent.content || msgContent.content.trim() === '') {\n const { ValidationError } = await import('../types/error.js')\n throw new ValidationError('Message text cannot be empty', 'content', msgContent.content)\n }\n\n return request<SendMessageResult>({\n token,\n baseUrl,\n method: 'POST',\n path: 'sendMessage',\n body: {\n sessionInfo,\n msgContent,\n },\n })\n}\n","import type { BotUpdate, MeetBotConfig, PollingOptions, SessionInfo, MsgContent, SendMessageResult } from './types'\nimport { getUpdates, sendMessage } from './api'\nimport { MeetBotError } from './types/error'\nimport { DEFAULT_BASE_URL, POLLING } from './constants'\n\ntype EventHandler<T = unknown> = (data: T) => void\n\ninterface Events {\n message: BotUpdate['message']\n error: Error\n polling_start: void\n polling_stop: void\n}\n\nexport class MeetBot {\n private readonly token: string\n private readonly baseUrl: string\n private readonly pollingLimit: number\n private readonly pollingInterval: number\n private readonly eventHandlers: Map<keyof Events, Set<EventHandler>> = new Map()\n private polling = false\n private offset = 0\n private retryCount = 0\n private abortController: AbortController | null = null\n\n constructor(config: MeetBotConfig) {\n if (config.token) {\n if (!config.token.includes(':')) {\n throw new MeetBotError('Invalid token format. Expected \"bot_id:secret\"', 'INVALID_TOKEN')\n }\n this.token = config.token\n } else if (config.botId && config.botToken) {\n this.token = `${config.botId}:${config.botToken}`\n } else {\n throw new MeetBotError('Token or (botId + botToken) is required', 'INVALID_TOKEN')\n }\n\n this.baseUrl = config.baseUrl || DEFAULT_BASE_URL\n this.pollingLimit = config.pollingLimit ?? POLLING.DEFAULT_LIMIT\n this.pollingInterval = config.pollingInterval ?? POLLING.DEFAULT_INTERVAL\n }\n\n on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler)\n return this\n }\n\n off<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n handlers.delete(handler as EventHandler)\n }\n return this\n }\n\n private emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data)\n } catch (e) {\n console.error(`Error in ${event} handler:`, e)\n }\n }\n }\n }\n\n isPolling(): boolean {\n return this.polling\n }\n\n async startPolling(options?: PollingOptions): Promise<void> {\n if (this.polling) {\n return\n }\n\n this.polling = true\n this.retryCount = 0\n this.abortController = new AbortController()\n\n const limit = options?.limit ?? this.pollingLimit\n const interval = options?.interval ?? this.pollingInterval\n const getUpdatesTimeout = options?.getUpdatesTimeout ?? 0\n\n console.log(`开始轮询消息... (条数: ${limit}, 间隔: ${interval}ms)`)\n\n this.emit('polling_start', undefined)\n const retryDelay = options?.retryDelay ?? POLLING.DEFAULT_RETRY_DELAY\n const maxRetries = options?.maxRetries ?? POLLING.DEFAULT_MAX_RETRIES\n const onOffsetUpdate = options?.onOffsetUpdate\n\n while (this.polling) {\n try {\n const updates = await getUpdates({\n token: this.token,\n baseUrl: this.baseUrl,\n timeout: getUpdatesTimeout,\n offset: this.offset,\n limit,\n })\n\n this.retryCount = 0\n\n for (const update of updates) {\n if (update.message) {\n this.emit('message', update.message)\n this.offset = (update.message.seqId || 0) + 1\n onOffsetUpdate?.(this.offset)\n }\n }\n\n if (interval > 0) {\n await this.sleep(interval)\n }\n } catch (error) {\n if (!this.polling) break\n\n this.retryCount++\n this.emit('error', error instanceof Error ? error : new Error(String(error)))\n\n if (this.retryCount >= maxRetries) {\n this.stopPolling()\n break\n }\n\n const delay = Math.min(retryDelay * Math.pow(2, this.retryCount - 1), POLLING.MAX_RETRY_DELAY)\n await this.sleep(delay)\n }\n }\n }\n\n stopPolling(): void {\n this.polling = false\n if (this.abortController) {\n this.abortController.abort()\n this.abortController = null\n }\n this.emit('polling_stop', undefined)\n }\n\n async getUpdates(options?: { timeout?: number; offset?: number; limit?: number }): Promise<BotUpdate[]> {\n return getUpdates({\n token: this.token,\n baseUrl: this.baseUrl,\n ...options,\n })\n }\n\n async sendMessage(sessionInfo: SessionInfo, msgContent: MsgContent): Promise<SendMessageResult> {\n return sendMessage({\n token: this.token,\n baseUrl: this.baseUrl,\n sessionInfo,\n msgContent,\n })\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n}\n","export { MeetBot } from './client'\nexport { getUpdates, sendMessage } from './api'\nexport * from './constants'\nexport type {\n BotUser,\n BotChat,\n BotFile,\n BotMsg,\n BotUpdate,\n ChatType,\n SessionInfo,\n SessionType,\n MsgContent,\n MsgType,\n ExtraInfo,\n MeetBotConfig,\n GetUpdatesOptions,\n SendMessageOptions,\n SendMessageResult,\n PollingOptions,\n ErrorCode,\n ApiErrorResponse,\n ApiResponse,\n} from './types'\nexport { MeetBotError, ApiError, NetworkError, TimeoutError, ValidationError } from './types/error'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/error.ts","../src/types/index.ts","../src/constants.ts","../src/http/request.ts","../src/api/index.ts","../src/client.ts","../src/index.ts"],"names":["ApiError","MeetBotError","NetworkError","TimeoutError","ValidationError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ErrorCode } from './api'\n\nexport class MeetBotError extends Error {\n public readonly code: ErrorCode\n\n constructor(message: string, code: ErrorCode) {\n super(message)\n this.name = 'MeetBotError'\n this.code = code\n Error.captureStackTrace?.(this, this.constructor)\n }\n}\n\nexport class ApiError extends MeetBotError {\n public readonly statusCode: number\n public readonly retryAfter?: number\n\n constructor(message: string, statusCode: number, code: ErrorCode, retryAfter?: number) {\n super(message, code)\n this.name = 'ApiError'\n this.statusCode = statusCode\n this.retryAfter = retryAfter\n }\n}\n\nexport class NetworkError extends MeetBotError {\n public readonly cause?: Error\n\n constructor(message: string, cause?: Error) {\n super(message, 'NETWORK_ERROR')\n this.name = 'NetworkError'\n this.cause = cause\n }\n}\n\nexport class TimeoutError extends MeetBotError {\n constructor(message: string) {\n super(message, 'TIMEOUT_ERROR')\n this.name = 'TimeoutError'\n }\n}\n\nexport class ValidationError extends MeetBotError {\n public readonly field: string\n public readonly value: unknown\n\n constructor(message: string, field: string, value: unknown) {\n super(message, 'VALIDATION_ERROR')\n this.name = 'ValidationError'\n this.field = field\n this.value = value\n }\n}\n","export type {\n BotUser,\n BotChat,\n BotFile,\n BotMsg,\n BotUpdate,\n ChatType,\n SessionInfo,\n SessionType,\n MsgContent,\n MsgType,\n ExtraInfo,\n} from './bot'\nexport type { ErrorCode, ApiErrorResponse, ApiResponse } from './api'\nexport type { MeetBotConfig, GetUpdatesOptions, SendMessageOptions, SendMessageResult, PollingOptions } from './client'\n\nexport { MeetBotError, ApiError, NetworkError, TimeoutError, ValidationError } from './error'\n","/**\n * Bot API 默认基础 URL\n */\nexport const DEFAULT_BASE_URL = 'https://staging-meet-api.miyachat.com'\n\n/**\n * 轮询相关常量\n */\nexport const POLLING = {\n /** 每次拉取消息条数上限,默认 100 条 */\n DEFAULT_LIMIT: 100,\n /** 长轮询超时时间(秒),默认 30 秒 */\n DEFAULT_TIMEOUT: 30,\n /** 成功返回后等待时间(毫秒),默认 1 秒 */\n SUCCESS_DELAY: 1000,\n /** 重试延迟基础时间(毫秒),默认 1000ms */\n DEFAULT_RETRY_DELAY: 1000,\n /** 重试延迟最大时间(毫秒),默认 30000ms */\n MAX_RETRY_DELAY: 30000,\n /** 最大重试次数,默认无限(0 表示不限制) */\n DEFAULT_MAX_RETRIES: 0,\n} as const\n\n/**\n * HTTP 请求相关常量\n */\nexport const HTTP = {\n /** 请求超时时间(毫秒),默认 60000ms */\n DEFAULT_TIMEOUT: 60000,\n /** 长轮询额外超时缓冲时间(毫秒),默认 10000ms */\n POLLING_TIMEOUT_BUFFER: 10000,\n} as const\n\n/**\n * API 接口相关常量\n */\nexport const API = {\n /** getUpdates 默认超时时间(秒),默认 30(long polling) */\n DEFAULT_TIMEOUT: 30,\n /** getUpdates 默认拉取条数,默认 100 条 */\n DEFAULT_LIMIT: 100,\n} as const\n","import type { ApiResponse, ApiErrorResponse } from '../types'\nimport { ApiError, NetworkError, TimeoutError } from '../types'\nimport { DEFAULT_BASE_URL, HTTP } from '../constants'\n\nexport interface RequestOptions {\n token: string\n baseUrl?: string\n method?: 'GET' | 'POST'\n path: string\n params?: Record<string, string | number | undefined>\n body?: Record<string, unknown>\n timeout?: number\n}\n\nfunction validateToken(token: string): void {\n if (!token || typeof token !== 'string') {\n throw new NetworkError('Token is required', undefined)\n }\n if (!token.includes(':')) {\n throw new NetworkError('Invalid token format. Expected \"bot_id:secret\"', undefined)\n }\n}\n\nfunction extractBotToken(token: string): string {\n const parts = token.split(':')\n return parts.length >= 2 ? parts.slice(1).join(':') : token\n}\n\nfunction buildUrl(baseUrl: string, path: string, params?: Record<string, string | number | undefined>): string {\n const url = new URL(`/im/bot/${path}`, baseUrl || DEFAULT_BASE_URL)\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n }\n }\n return url.toString()\n}\n\nexport async function request<T>(options: RequestOptions): Promise<T> {\n const { token, baseUrl, method = 'GET', path, params, body, timeout = HTTP.DEFAULT_TIMEOUT } = options\n\n validateToken(token)\n\n const url = buildUrl(baseUrl || DEFAULT_BASE_URL, path, method === 'GET' ? params : undefined)\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bot ${extractBotToken(token)}`,\n }\n\n console.log('[Request]', method, url)\n // console.log('[Headers]', JSON.stringify(headers, null, 2))\n if (body) {\n console.log('[Body]', JSON.stringify(body, null, 2))\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n })\n clearTimeout(timeoutId)\n\n const responseHeaders: Record<string, string> = {}\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value\n })\n console.log('[Response Status]', response.status)\n // console.log('[Response Headers]', JSON.stringify(responseHeaders, null, 2))\n\n const data = (await response.json()) as ApiResponse<T> | ApiErrorResponse\n console.log('[Response Body]', JSON.stringify(data, null, 2))\n\n if (!response.ok || !data.ok) {\n const errorData = data as ApiErrorResponse\n throw new ApiError(\n errorData.description || `HTTP ${response.status}`,\n response.status,\n mapStatusCodeToErrorCode(response.status),\n errorData.retry_after\n )\n }\n\n return (data as ApiResponse<T>).result as T\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof ApiError) {\n throw error\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(`Request timeout after ${timeout}ms`)\n }\n throw new NetworkError(`Network error: ${error.message}`, error)\n }\n\n throw new NetworkError('Unknown network error', undefined)\n }\n}\n\nfunction mapStatusCodeToErrorCode(status: number): import('../types').ErrorCode {\n switch (status) {\n case 401:\n return 'UNAUTHORIZED'\n case 403:\n return 'UNAUTHORIZED'\n case 404:\n return 'CHAT_NOT_FOUND'\n case 429:\n return 'RATE_LIMIT'\n case 500:\n case 502:\n case 503:\n return 'INTERNAL_ERROR'\n default:\n return 'INTERNAL_ERROR'\n }\n}\n","import type { BotUpdate, SendMessageResult, SessionInfo, MsgContent } from '../types'\nimport { request } from '../http/request'\nimport { API, HTTP } from '../constants'\n\nexport interface GetUpdatesParams {\n token: string\n baseUrl?: string\n timeout?: number\n offset?: number\n limit?: number\n}\n\nexport async function getUpdates(params: GetUpdatesParams): Promise<BotUpdate[]> {\n const { token, baseUrl, timeout = API.DEFAULT_TIMEOUT, offset, limit = API.DEFAULT_LIMIT } = params\n\n return request<BotUpdate[]>({\n token,\n baseUrl,\n method: 'POST',\n path: 'getUpdates',\n body: {\n timeout,\n offset,\n limit,\n },\n timeout: (timeout || 0) * 1000 + HTTP.POLLING_TIMEOUT_BUFFER,\n })\n}\n\nexport interface SendMessageParams {\n token: string\n baseUrl?: string\n sessionInfo: SessionInfo\n msgContent: MsgContent\n}\n\nexport async function sendMessage(params: SendMessageParams): Promise<SendMessageResult> {\n const { token, baseUrl, sessionInfo, msgContent } = params\n\n if (!msgContent.content || msgContent.content.trim() === '') {\n const { ValidationError } = await import('../types/error.js')\n throw new ValidationError('Message text cannot be empty', 'content', msgContent.content)\n }\n\n return request<SendMessageResult>({\n token,\n baseUrl,\n method: 'POST',\n path: 'sendMessage',\n body: {\n sessionInfo,\n msgContent,\n },\n })\n}\n","import type { BotUpdate, MeetBotConfig, PollingOptions, SessionInfo, MsgContent, SendMessageResult } from './types'\nimport { getUpdates, sendMessage } from './api'\nimport { MeetBotError } from './types/error'\nimport { DEFAULT_BASE_URL, POLLING } from './constants'\n\ntype EventHandler<T = unknown> = (data: T) => void\n\ninterface Events {\n message: BotUpdate['message']\n error: Error\n polling_start: void\n polling_stop: void\n}\n\nexport class MeetBot {\n private readonly token: string\n private readonly baseUrl: string\n private readonly pollingLimit: number\n private readonly longPollingTimeout: number\n private readonly eventHandlers: Map<keyof Events, Set<EventHandler>> = new Map()\n private polling = false\n private offset = 0\n private abortController: AbortController | null = null\n\n constructor(config: MeetBotConfig) {\n if (config.token) {\n if (!config.token.includes(':')) {\n throw new MeetBotError('Invalid token format. Expected \"bot_id:secret\"', 'INVALID_TOKEN')\n }\n this.token = config.token\n } else if (config.botId && config.botToken) {\n this.token = `${config.botId}:${config.botToken}`\n } else {\n throw new MeetBotError('Token or (botId + botToken) is required', 'INVALID_TOKEN')\n }\n\n this.baseUrl = config.baseUrl || DEFAULT_BASE_URL\n this.pollingLimit = config.pollingLimit ?? POLLING.DEFAULT_LIMIT\n this.longPollingTimeout = config.longPollingTimeout ?? POLLING.DEFAULT_TIMEOUT\n }\n\n on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler)\n return this\n }\n\n off<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n handlers.delete(handler as EventHandler)\n }\n return this\n }\n\n private emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data)\n } catch (e) {\n console.error(`Error in ${event} handler:`, e)\n }\n }\n }\n }\n\n isPolling(): boolean {\n return this.polling\n }\n\n async startPolling(options?: PollingOptions): Promise<void> {\n if (this.polling) {\n return\n }\n\n this.polling = true\n this.abortController = new AbortController()\n\n const limit = options?.limit ?? this.pollingLimit\n const timeout = options?.timeout ?? this.longPollingTimeout\n\n console.log(`开始长轮询消息... (条数: ${limit}, 超时: ${timeout}s)`)\n\n this.emit('polling_start', undefined)\n const retryDelay = options?.retryDelay ?? POLLING.DEFAULT_RETRY_DELAY\n const maxRetries = options?.maxRetries ?? POLLING.DEFAULT_MAX_RETRIES\n const onOffsetUpdate = options?.onOffsetUpdate\n\n let retryCount = 0\n\n while (this.polling) {\n try {\n const updates = await getUpdates({\n token: this.token,\n baseUrl: this.baseUrl,\n timeout,\n offset: this.offset,\n limit,\n })\n\n retryCount = 0\n\n for (const update of updates) {\n if (update.message) {\n this.emit('message', update.message)\n this.offset = (update.message.seqId || 0) + 1\n onOffsetUpdate?.(this.offset)\n }\n }\n\n await this.sleep(POLLING.SUCCESS_DELAY)\n } catch (error) {\n if (!this.polling) break\n\n retryCount++\n this.emit('error', error instanceof Error ? error : new Error(String(error)))\n\n if (maxRetries > 0 && retryCount >= maxRetries) {\n this.stopPolling()\n break\n }\n\n const delay = Math.min(retryDelay * Math.pow(2, retryCount - 1), POLLING.MAX_RETRY_DELAY)\n await this.sleep(delay)\n }\n }\n }\n\n stopPolling(): void {\n this.polling = false\n if (this.abortController) {\n this.abortController.abort()\n this.abortController = null\n }\n this.emit('polling_stop', undefined)\n }\n\n async getUpdates(options?: { timeout?: number; offset?: number; limit?: number }): Promise<BotUpdate[]> {\n return getUpdates({\n token: this.token,\n baseUrl: this.baseUrl,\n ...options,\n })\n }\n\n async sendMessage(sessionInfo: SessionInfo, msgContent: MsgContent): Promise<SendMessageResult> {\n return sendMessage({\n token: this.token,\n baseUrl: this.baseUrl,\n sessionInfo,\n msgContent,\n })\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n}\n","export { MeetBot } from './client'\nexport { getUpdates, sendMessage } from './api'\nexport * from './constants'\nexport type {\n BotUser,\n BotChat,\n BotFile,\n BotMsg,\n BotUpdate,\n ChatType,\n SessionInfo,\n SessionType,\n MsgContent,\n MsgType,\n ExtraInfo,\n MeetBotConfig,\n GetUpdatesOptions,\n SendMessageOptions,\n SendMessageResult,\n PollingOptions,\n ErrorCode,\n ApiErrorResponse,\n ApiResponse,\n} from './types'\nexport { MeetBotError, ApiError, NetworkError, TimeoutError, ValidationError } from './types/error'\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -68,7 +68,7 @@ interface MeetBotConfig {
|
|
|
68
68
|
botToken?: string;
|
|
69
69
|
baseUrl?: string;
|
|
70
70
|
pollingLimit?: number;
|
|
71
|
-
|
|
71
|
+
longPollingTimeout?: number;
|
|
72
72
|
}
|
|
73
73
|
interface GetUpdatesOptions {
|
|
74
74
|
token: string;
|
|
@@ -89,9 +89,8 @@ interface SendMessageResult {
|
|
|
89
89
|
userProfileMap: Record<number, unknown>;
|
|
90
90
|
}
|
|
91
91
|
interface PollingOptions {
|
|
92
|
-
|
|
92
|
+
timeout?: number;
|
|
93
93
|
limit?: number;
|
|
94
|
-
interval?: number;
|
|
95
94
|
retryDelay?: number;
|
|
96
95
|
maxRetries?: number;
|
|
97
96
|
onOffsetUpdate?: (offset: number) => void;
|
|
@@ -130,11 +129,10 @@ declare class MeetBot {
|
|
|
130
129
|
private readonly token;
|
|
131
130
|
private readonly baseUrl;
|
|
132
131
|
private readonly pollingLimit;
|
|
133
|
-
private readonly
|
|
132
|
+
private readonly longPollingTimeout;
|
|
134
133
|
private readonly eventHandlers;
|
|
135
134
|
private polling;
|
|
136
135
|
private offset;
|
|
137
|
-
private retryCount;
|
|
138
136
|
private abortController;
|
|
139
137
|
constructor(config: MeetBotConfig);
|
|
140
138
|
on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this;
|
|
@@ -171,17 +169,18 @@ declare function sendMessage(params: SendMessageParams): Promise<SendMessageResu
|
|
|
171
169
|
declare const DEFAULT_BASE_URL = "https://staging-meet-api.miyachat.com";
|
|
172
170
|
declare const POLLING: {
|
|
173
171
|
readonly DEFAULT_LIMIT: 100;
|
|
174
|
-
readonly
|
|
172
|
+
readonly DEFAULT_TIMEOUT: 30;
|
|
173
|
+
readonly SUCCESS_DELAY: 1000;
|
|
175
174
|
readonly DEFAULT_RETRY_DELAY: 1000;
|
|
176
175
|
readonly MAX_RETRY_DELAY: 30000;
|
|
177
|
-
readonly DEFAULT_MAX_RETRIES:
|
|
176
|
+
readonly DEFAULT_MAX_RETRIES: 0;
|
|
178
177
|
};
|
|
179
178
|
declare const HTTP: {
|
|
180
179
|
readonly DEFAULT_TIMEOUT: 60000;
|
|
181
180
|
readonly POLLING_TIMEOUT_BUFFER: 10000;
|
|
182
181
|
};
|
|
183
182
|
declare const API: {
|
|
184
|
-
readonly DEFAULT_TIMEOUT:
|
|
183
|
+
readonly DEFAULT_TIMEOUT: 30;
|
|
185
184
|
readonly DEFAULT_LIMIT: 100;
|
|
186
185
|
};
|
|
187
186
|
|
package/dist/index.d.ts
CHANGED
|
@@ -68,7 +68,7 @@ interface MeetBotConfig {
|
|
|
68
68
|
botToken?: string;
|
|
69
69
|
baseUrl?: string;
|
|
70
70
|
pollingLimit?: number;
|
|
71
|
-
|
|
71
|
+
longPollingTimeout?: number;
|
|
72
72
|
}
|
|
73
73
|
interface GetUpdatesOptions {
|
|
74
74
|
token: string;
|
|
@@ -89,9 +89,8 @@ interface SendMessageResult {
|
|
|
89
89
|
userProfileMap: Record<number, unknown>;
|
|
90
90
|
}
|
|
91
91
|
interface PollingOptions {
|
|
92
|
-
|
|
92
|
+
timeout?: number;
|
|
93
93
|
limit?: number;
|
|
94
|
-
interval?: number;
|
|
95
94
|
retryDelay?: number;
|
|
96
95
|
maxRetries?: number;
|
|
97
96
|
onOffsetUpdate?: (offset: number) => void;
|
|
@@ -130,11 +129,10 @@ declare class MeetBot {
|
|
|
130
129
|
private readonly token;
|
|
131
130
|
private readonly baseUrl;
|
|
132
131
|
private readonly pollingLimit;
|
|
133
|
-
private readonly
|
|
132
|
+
private readonly longPollingTimeout;
|
|
134
133
|
private readonly eventHandlers;
|
|
135
134
|
private polling;
|
|
136
135
|
private offset;
|
|
137
|
-
private retryCount;
|
|
138
136
|
private abortController;
|
|
139
137
|
constructor(config: MeetBotConfig);
|
|
140
138
|
on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this;
|
|
@@ -171,17 +169,18 @@ declare function sendMessage(params: SendMessageParams): Promise<SendMessageResu
|
|
|
171
169
|
declare const DEFAULT_BASE_URL = "https://staging-meet-api.miyachat.com";
|
|
172
170
|
declare const POLLING: {
|
|
173
171
|
readonly DEFAULT_LIMIT: 100;
|
|
174
|
-
readonly
|
|
172
|
+
readonly DEFAULT_TIMEOUT: 30;
|
|
173
|
+
readonly SUCCESS_DELAY: 1000;
|
|
175
174
|
readonly DEFAULT_RETRY_DELAY: 1000;
|
|
176
175
|
readonly MAX_RETRY_DELAY: 30000;
|
|
177
|
-
readonly DEFAULT_MAX_RETRIES:
|
|
176
|
+
readonly DEFAULT_MAX_RETRIES: 0;
|
|
178
177
|
};
|
|
179
178
|
declare const HTTP: {
|
|
180
179
|
readonly DEFAULT_TIMEOUT: 60000;
|
|
181
180
|
readonly POLLING_TIMEOUT_BUFFER: 10000;
|
|
182
181
|
};
|
|
183
182
|
declare const API: {
|
|
184
|
-
readonly DEFAULT_TIMEOUT:
|
|
183
|
+
readonly DEFAULT_TIMEOUT: 30;
|
|
185
184
|
readonly DEFAULT_LIMIT: 100;
|
|
186
185
|
};
|
|
187
186
|
|
package/dist/index.js
CHANGED
|
@@ -75,14 +75,16 @@ var DEFAULT_BASE_URL = "https://staging-meet-api.miyachat.com";
|
|
|
75
75
|
var POLLING = {
|
|
76
76
|
/** 每次拉取消息条数上限,默认 100 条 */
|
|
77
77
|
DEFAULT_LIMIT: 100,
|
|
78
|
-
/**
|
|
79
|
-
|
|
78
|
+
/** 长轮询超时时间(秒),默认 30 秒 */
|
|
79
|
+
DEFAULT_TIMEOUT: 30,
|
|
80
|
+
/** 成功返回后等待时间(毫秒),默认 1 秒 */
|
|
81
|
+
SUCCESS_DELAY: 1e3,
|
|
80
82
|
/** 重试延迟基础时间(毫秒),默认 1000ms */
|
|
81
83
|
DEFAULT_RETRY_DELAY: 1e3,
|
|
82
84
|
/** 重试延迟最大时间(毫秒),默认 30000ms */
|
|
83
85
|
MAX_RETRY_DELAY: 3e4,
|
|
84
|
-
/**
|
|
85
|
-
DEFAULT_MAX_RETRIES:
|
|
86
|
+
/** 最大重试次数,默认无限(0 表示不限制) */
|
|
87
|
+
DEFAULT_MAX_RETRIES: 0
|
|
86
88
|
};
|
|
87
89
|
var HTTP = {
|
|
88
90
|
/** 请求超时时间(毫秒),默认 60000ms */
|
|
@@ -91,8 +93,8 @@ var HTTP = {
|
|
|
91
93
|
POLLING_TIMEOUT_BUFFER: 1e4
|
|
92
94
|
};
|
|
93
95
|
var API = {
|
|
94
|
-
/** getUpdates 默认超时时间(秒),默认
|
|
95
|
-
DEFAULT_TIMEOUT:
|
|
96
|
+
/** getUpdates 默认超时时间(秒),默认 30(long polling) */
|
|
97
|
+
DEFAULT_TIMEOUT: 30,
|
|
96
98
|
/** getUpdates 默认拉取条数,默认 100 条 */
|
|
97
99
|
DEFAULT_LIMIT: 100
|
|
98
100
|
};
|
|
@@ -133,7 +135,6 @@ async function request(options) {
|
|
|
133
135
|
Authorization: `Bot ${extractBotToken(token)}`
|
|
134
136
|
};
|
|
135
137
|
console.log("[Request]", method, url);
|
|
136
|
-
console.log("[Headers]", JSON.stringify(headers, null, 2));
|
|
137
138
|
if (body) {
|
|
138
139
|
console.log("[Body]", JSON.stringify(body, null, 2));
|
|
139
140
|
}
|
|
@@ -150,7 +151,6 @@ async function request(options) {
|
|
|
150
151
|
responseHeaders[key] = value;
|
|
151
152
|
});
|
|
152
153
|
console.log("[Response Status]", response.status);
|
|
153
|
-
console.log("[Response Headers]", JSON.stringify(responseHeaders, null, 2));
|
|
154
154
|
const data = await response.json();
|
|
155
155
|
console.log("[Response Body]", JSON.stringify(data, null, 2));
|
|
156
156
|
if (!response.ok || !data.ok) {
|
|
@@ -236,11 +236,10 @@ var MeetBot = class {
|
|
|
236
236
|
token;
|
|
237
237
|
baseUrl;
|
|
238
238
|
pollingLimit;
|
|
239
|
-
|
|
239
|
+
longPollingTimeout;
|
|
240
240
|
eventHandlers = /* @__PURE__ */ new Map();
|
|
241
241
|
polling = false;
|
|
242
242
|
offset = 0;
|
|
243
|
-
retryCount = 0;
|
|
244
243
|
abortController = null;
|
|
245
244
|
constructor(config) {
|
|
246
245
|
if (config.token) {
|
|
@@ -255,7 +254,7 @@ var MeetBot = class {
|
|
|
255
254
|
}
|
|
256
255
|
this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;
|
|
257
256
|
this.pollingLimit = config.pollingLimit ?? POLLING.DEFAULT_LIMIT;
|
|
258
|
-
this.
|
|
257
|
+
this.longPollingTimeout = config.longPollingTimeout ?? POLLING.DEFAULT_TIMEOUT;
|
|
259
258
|
}
|
|
260
259
|
on(event, handler) {
|
|
261
260
|
if (!this.eventHandlers.has(event)) {
|
|
@@ -291,26 +290,25 @@ var MeetBot = class {
|
|
|
291
290
|
return;
|
|
292
291
|
}
|
|
293
292
|
this.polling = true;
|
|
294
|
-
this.retryCount = 0;
|
|
295
293
|
this.abortController = new AbortController();
|
|
296
294
|
const limit = options?.limit ?? this.pollingLimit;
|
|
297
|
-
const
|
|
298
|
-
|
|
299
|
-
console.log(`\u5F00\u59CB\u8F6E\u8BE2\u6D88\u606F... (\u6761\u6570: ${limit}, \u95F4\u9694: ${interval}ms)`);
|
|
295
|
+
const timeout = options?.timeout ?? this.longPollingTimeout;
|
|
296
|
+
console.log(`\u5F00\u59CB\u957F\u8F6E\u8BE2\u6D88\u606F... (\u6761\u6570: ${limit}, \u8D85\u65F6: ${timeout}s)`);
|
|
300
297
|
this.emit("polling_start", void 0);
|
|
301
298
|
const retryDelay = options?.retryDelay ?? POLLING.DEFAULT_RETRY_DELAY;
|
|
302
299
|
const maxRetries = options?.maxRetries ?? POLLING.DEFAULT_MAX_RETRIES;
|
|
303
300
|
const onOffsetUpdate = options?.onOffsetUpdate;
|
|
301
|
+
let retryCount = 0;
|
|
304
302
|
while (this.polling) {
|
|
305
303
|
try {
|
|
306
304
|
const updates = await getUpdates({
|
|
307
305
|
token: this.token,
|
|
308
306
|
baseUrl: this.baseUrl,
|
|
309
|
-
timeout
|
|
307
|
+
timeout,
|
|
310
308
|
offset: this.offset,
|
|
311
309
|
limit
|
|
312
310
|
});
|
|
313
|
-
|
|
311
|
+
retryCount = 0;
|
|
314
312
|
for (const update of updates) {
|
|
315
313
|
if (update.message) {
|
|
316
314
|
this.emit("message", update.message);
|
|
@@ -318,18 +316,16 @@ var MeetBot = class {
|
|
|
318
316
|
onOffsetUpdate?.(this.offset);
|
|
319
317
|
}
|
|
320
318
|
}
|
|
321
|
-
|
|
322
|
-
await this.sleep(interval);
|
|
323
|
-
}
|
|
319
|
+
await this.sleep(POLLING.SUCCESS_DELAY);
|
|
324
320
|
} catch (error) {
|
|
325
321
|
if (!this.polling) break;
|
|
326
|
-
|
|
322
|
+
retryCount++;
|
|
327
323
|
this.emit("error", error instanceof Error ? error : new Error(String(error)));
|
|
328
|
-
if (
|
|
324
|
+
if (maxRetries > 0 && retryCount >= maxRetries) {
|
|
329
325
|
this.stopPolling();
|
|
330
326
|
break;
|
|
331
327
|
}
|
|
332
|
-
const delay = Math.min(retryDelay * Math.pow(2,
|
|
328
|
+
const delay = Math.min(retryDelay * Math.pow(2, retryCount - 1), POLLING.MAX_RETRY_DELAY);
|
|
333
329
|
await this.sleep(delay);
|
|
334
330
|
}
|
|
335
331
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/error.ts","../src/types/index.ts","../src/constants.ts","../src/http/request.ts","../src/api/index.ts","../src/client.ts","../src/index.ts"],"names":["ValidationError"],"mappings":";;;;;;;;;;;;AAAA,IAAA,aAAA,GAAA,EAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,YAAA,CAAA,CAWA,QAAA,CAAA,CAYA,YAAA,CAAA,CAUA,YAAA,CAAA,CAOA;AA1Cb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oBAAA,GAAA;AAEO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,MACtB,IAAA;AAAA,MAEhB,WAAA,CAAY,SAAiB,IAAA,EAAiB;AAC5C,QAAA,KAAA,CAAM,OAAO,CAAA;AACb,QAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,QAAA,KAAA,CAAM,iBAAA,GAAoB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,MAClD;AAAA,KACF;AAEO,IAAM,QAAA,GAAN,cAAuB,YAAA,CAAa;AAAA,MACzB,UAAA;AAAA,MACA,UAAA;AAAA,MAEhB,WAAA,CAAY,OAAA,EAAiB,UAAA,EAAoB,IAAA,EAAiB,UAAA,EAAqB;AACrF,QAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACnB,QAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,QAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,QAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,MACpB;AAAA,KACF;AAEO,IAAM,YAAA,GAAN,cAA2B,YAAA,CAAa;AAAA,MAC7B,KAAA;AAAA,MAEhB,WAAA,CAAY,SAAiB,KAAA,EAAe;AAC1C,QAAA,KAAA,CAAM,SAAS,eAAe,CAAA;AAC9B,QAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,MACf;AAAA,KACF;AAEO,IAAM,YAAA,GAAN,cAA2B,YAAA,CAAa;AAAA,MAC7C,YAAY,OAAA,EAAiB;AAC3B,QAAA,KAAA,CAAM,SAAS,eAAe,CAAA;AAC9B,QAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,MACd;AAAA,KACF;AAEO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAA,MAChC,KAAA;AAAA,MACA,KAAA;AAAA,MAEhB,WAAA,CAAY,OAAA,EAAiB,KAAA,EAAe,KAAA,EAAgB;AAC1D,QAAA,KAAA,CAAM,SAAS,kBAAkB,CAAA;AACjC,QAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,MACf;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpCA,UAAA,EAAA;;;ACbO,IAAM,gBAAA,GAAmB;AAKzB,IAAM,OAAA,GAAU;AAAA;AAAA,EAErB,aAAA,EAAe,GAAA;AAAA;AAAA,EAEf,kBAAkB,EAAA,GAAK,GAAA;AAAA;AAAA,EAEvB,mBAAA,EAAqB,GAAA;AAAA;AAAA,EAErB,eAAA,EAAiB,GAAA;AAAA;AAAA,EAEjB,mBAAA,EAAqB;AACvB;AAKO,IAAM,IAAA,GAAO;AAAA;AAAA,EAElB,eAAA,EAAiB,GAAA;AAAA;AAAA,EAEjB,sBAAA,EAAwB;AAC1B;AAKO,IAAM,GAAA,GAAM;AAAA;AAAA,EAEjB,eAAA,EAAiB,CAAA;AAAA;AAAA,EAEjB,aAAA,EAAe;AACjB;;;ACzBA,SAAS,cAAc,KAAA,EAAqB;AAC1C,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,MAAM,IAAI,YAAA,CAAa,mBAAA,EAAqB,MAAS,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,YAAA,CAAa,gDAAA,EAAkD,MAAS,CAAA;AAAA,EACpF;AACF;AAEA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAC7B,EAAA,OAAO,KAAA,CAAM,UAAU,CAAA,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AACxD;AAEA,SAAS,QAAA,CAAS,OAAA,EAAiB,IAAA,EAAc,MAAA,EAA8D;AAC7G,EAAA,MAAM,MAAM,IAAI,GAAA,CAAI,WAAW,IAAI,CAAA,CAAA,EAAI,OAA2B,CAAA;AAClE,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAI,QAAA,EAAS;AACtB;AAEA,eAAsB,QAAW,OAAA,EAAqC;AACpE,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,MAAA,GAAS,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,GAAU,IAAA,CAAK,eAAA,EAAgB,GAAI,OAAA;AAE/F,EAAA,aAAA,CAAc,KAAK,CAAA;AAEnB,EAAA,MAAM,GAAA,GAAM,SAAS,OAAA,IAAW,gBAAA,EAAkB,MAAM,MAAA,KAAW,KAAA,GAAQ,SAAS,MAAS,CAAA;AAC7F,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AAE9D,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,cAAA,EAAgB,kBAAA;AAAA,IAChB,MAAA,EAAQ,kBAAA;AAAA,IACR,aAAA,EAAe,CAAA,IAAA,EAAO,eAAA,CAAgB,KAAK,CAAC,CAAA;AAAA,GAC9C;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,MAAA,EAAQ,GAAG,CAAA;AACpC,EAAA,OAAA,CAAQ,IAAI,WAAA,EAAa,IAAA,CAAK,UAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AACzD,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAA,CAAQ,IAAI,QAAA,EAAU,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,MACpC,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AACD,IAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,IAAA,MAAM,kBAA0C,EAAC;AACjD,IAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACvC,MAAA,eAAA,CAAgB,GAAG,CAAA,GAAI,KAAA;AAAA,IACzB,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,mBAAA,EAAqB,QAAA,CAAS,MAAM,CAAA;AAChD,IAAA,OAAA,CAAQ,IAAI,oBAAA,EAAsB,IAAA,CAAK,UAAU,eAAA,EAAiB,IAAA,EAAM,CAAC,CAAC,CAAA;AAE1E,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,OAAA,CAAQ,IAAI,iBAAA,EAAmB,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAE5D,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,IAAM,CAAC,KAAK,EAAA,EAAI;AAC5B,MAAA,MAAM,SAAA,GAAY,IAAA;AAClB,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,SAAA,CAAU,WAAA,IAAe,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,QAChD,QAAA,CAAS,MAAA;AAAA,QACT,wBAAA,CAAyB,SAAS,MAAM,CAAA;AAAA,QACxC,SAAA,CAAU;AAAA,OACZ;AAAA,IACF;AAEA,IAAA,OAAQ,IAAA,CAAwB,MAAA;AAAA,EAClC,SAAS,KAAA,EAAO;AACd,IAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,QAAA,MAAM,IAAI,YAAA,CAAa,CAAA,sBAAA,EAAyB,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,MAC7D;AACA,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,eAAA,EAAkB,KAAA,CAAM,OAAO,IAAI,KAAK,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,IAAI,YAAA,CAAa,uBAAA,EAAyB,MAAS,CAAA;AAAA,EAC3D;AACF;AAEA,SAAS,yBAAyB,MAAA,EAA8C;AAC9E,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,GAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,GAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,GAAA;AACH,MAAA,OAAO,gBAAA;AAAA,IACT,KAAK,GAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,GAAA;AAAA,IACL,KAAK,GAAA;AAAA,IACL,KAAK,GAAA;AACH,MAAA,OAAO,gBAAA;AAAA,IACT;AACE,MAAA,OAAO,gBAAA;AAAA;AAEb;;;AClHA,eAAsB,WAAW,MAAA,EAAgD;AAC/E,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,GAAU,GAAA,CAAI,iBAAiB,MAAA,EAAQ,KAAA,GAAQ,GAAA,CAAI,aAAA,EAAc,GAAI,MAAA;AAE7F,EAAA,OAAO,OAAA,CAAqB;AAAA,IAC1B,KAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,YAAA;AAAA,IACN,IAAA,EAAM;AAAA,MACJ,OAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAA,CAAU,OAAA,IAAW,CAAA,IAAK,GAAA,GAAO,IAAA,CAAK;AAAA,GACvC,CAAA;AACH;AASA,eAAsB,YAAY,MAAA,EAAuD;AACvF,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,YAAW,GAAI,MAAA;AAEpD,EAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,WAAW,OAAA,CAAQ,IAAA,OAAW,EAAA,EAAI;AAC3D,IAAA,MAAM,EAAE,eAAA,EAAAA,gBAAAA,EAAgB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,aAAA,CAAA,CAAA;AAClC,IAAA,MAAM,IAAIA,gBAAAA,CAAgB,8BAAA,EAAgC,SAAA,EAAW,WAAW,OAAO,CAAA;AAAA,EACzF;AAEA,EAAA,OAAO,OAAA,CAA2B;AAAA,IAChC,KAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,aAAA;AAAA,IACN,IAAA,EAAM;AAAA,MACJ,WAAA;AAAA,MACA;AAAA;AACF,GACD,CAAA;AACH;;;ACpDA,UAAA,EAAA;AAYO,IAAM,UAAN,MAAc;AAAA,EACF,KAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA,uBAA0D,GAAA,EAAI;AAAA,EACvE,OAAA,GAAU,KAAA;AAAA,EACV,MAAA,GAAS,CAAA;AAAA,EACT,UAAA,GAAa,CAAA;AAAA,EACb,eAAA,GAA0C,IAAA;AAAA,EAElD,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,YAAA,CAAa,gDAAA,EAAkD,eAAe,CAAA;AAAA,MAC1F;AACA,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AAAA,IACtB,CAAA,MAAA,IAAW,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,QAAA,EAAU;AAC1C,MAAA,IAAA,CAAK,QAAQ,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,QAAQ,CAAA,CAAA;AAAA,IACjD,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,YAAA,CAAa,yCAAA,EAA2C,eAAe,CAAA;AAAA,IACnF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,gBAAA;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,OAAA,CAAQ,aAAA;AACnD,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA,CAAO,eAAA,IAAmB,OAAA,CAAQ,gBAAA;AAAA,EAC3D;AAAA,EAEA,EAAA,CAA2B,OAAU,OAAA,EAAwC;AAC3E,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACzC;AACA,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,OAAuB,CAAA;AAC1D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,GAAA,CAA4B,OAAU,OAAA,EAAwC;AAC5E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,OAAO,OAAuB,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,IAAA,CAA6B,OAAU,IAAA,EAAuB;AACpE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,QACd,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,SAAA,EAAY,KAAK,CAAA,SAAA,CAAA,EAAa,CAAC,CAAA;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,MAAM,aAAa,OAAA,EAAyC;AAC1D,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAE3C,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,IAAA,CAAK,YAAA;AACrC,IAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,IAAA,CAAK,eAAA;AAC3C,IAAA,MAAM,iBAAA,GAAoB,SAAS,iBAAA,IAAqB,CAAA;AAExD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uDAAA,EAAkB,KAAK,CAAA,gBAAA,EAAS,QAAQ,CAAA,GAAA,CAAK,CAAA;AAEzD,IAAA,IAAA,CAAK,IAAA,CAAK,iBAAiB,MAAS,CAAA;AACpC,IAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,IAAc,OAAA,CAAQ,mBAAA;AAClD,IAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,IAAc,OAAA,CAAQ,mBAAA;AAClD,IAAA,MAAM,iBAAiB,OAAA,EAAS,cAAA;AAEhC,IAAA,OAAO,KAAK,OAAA,EAAS;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW;AAAA,UAC/B,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA,EAAS,iBAAA;AAAA,UACT,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb;AAAA,SACD,CAAA;AAED,QAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAElB,QAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,UAAA,IAAI,OAAO,OAAA,EAAS;AAClB,YAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AACnC,YAAA,IAAA,CAAK,MAAA,GAAA,CAAU,MAAA,CAAO,OAAA,CAAQ,KAAA,IAAS,CAAA,IAAK,CAAA;AAC5C,YAAA,cAAA,GAAiB,KAAK,MAAM,CAAA;AAAA,UAC9B;AAAA,QACF;AAEA,QAAA,IAAI,WAAW,CAAA,EAAG;AAChB,UAAA,MAAM,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,QAC3B;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEnB,QAAA,IAAA,CAAK,UAAA,EAAA;AACL,QAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAE5E,QAAA,IAAI,IAAA,CAAK,cAAc,UAAA,EAAY;AACjC,UAAA,IAAA,CAAK,WAAA,EAAY;AACjB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,UAAA,GAAa,CAAC,CAAA,EAAG,OAAA,CAAQ,eAAe,CAAA;AAC7F,QAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,MAAS,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,WAAW,OAAA,EAAuF;AACtG,IAAA,OAAO,UAAA,CAAW;AAAA,MAChB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,CAAY,WAAA,EAA0B,UAAA,EAAoD;AAC9F,IAAA,OAAO,WAAA,CAAY;AAAA,MACjB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AACF;;;AC5IA,UAAA,EAAA","file":"index.js","sourcesContent":["import type { ErrorCode } from './api'\n\nexport class MeetBotError extends Error {\n public readonly code: ErrorCode\n\n constructor(message: string, code: ErrorCode) {\n super(message)\n this.name = 'MeetBotError'\n this.code = code\n Error.captureStackTrace?.(this, this.constructor)\n }\n}\n\nexport class ApiError extends MeetBotError {\n public readonly statusCode: number\n public readonly retryAfter?: number\n\n constructor(message: string, statusCode: number, code: ErrorCode, retryAfter?: number) {\n super(message, code)\n this.name = 'ApiError'\n this.statusCode = statusCode\n this.retryAfter = retryAfter\n }\n}\n\nexport class NetworkError extends MeetBotError {\n public readonly cause?: Error\n\n constructor(message: string, cause?: Error) {\n super(message, 'NETWORK_ERROR')\n this.name = 'NetworkError'\n this.cause = cause\n }\n}\n\nexport class TimeoutError extends MeetBotError {\n constructor(message: string) {\n super(message, 'TIMEOUT_ERROR')\n this.name = 'TimeoutError'\n }\n}\n\nexport class ValidationError extends MeetBotError {\n public readonly field: string\n public readonly value: unknown\n\n constructor(message: string, field: string, value: unknown) {\n super(message, 'VALIDATION_ERROR')\n this.name = 'ValidationError'\n this.field = field\n this.value = value\n }\n}\n","export type {\n BotUser,\n BotChat,\n BotFile,\n BotMsg,\n BotUpdate,\n ChatType,\n SessionInfo,\n SessionType,\n MsgContent,\n MsgType,\n ExtraInfo,\n} from './bot'\nexport type { ErrorCode, ApiErrorResponse, ApiResponse } from './api'\nexport type { MeetBotConfig, GetUpdatesOptions, SendMessageOptions, SendMessageResult, PollingOptions } from './client'\n\nexport { MeetBotError, ApiError, NetworkError, TimeoutError, ValidationError } from './error'\n","/**\n * Bot API 默认基础 URL\n */\nexport const DEFAULT_BASE_URL = 'https://staging-meet-api.miyachat.com'\n\n/**\n * 轮询相关常量\n */\nexport const POLLING = {\n /** 每次拉取消息条数上限,默认 100 条 */\n DEFAULT_LIMIT: 100,\n /** 轮询间隔时间(毫秒),默认 10 秒 */\n DEFAULT_INTERVAL: 10 * 1000,\n /** 重试延迟基础时间(毫秒),默认 1000ms */\n DEFAULT_RETRY_DELAY: 1000,\n /** 重试延迟最大时间(毫秒),默认 30000ms */\n MAX_RETRY_DELAY: 30000,\n /** 最大重试次数,默认 3 次 */\n DEFAULT_MAX_RETRIES: 3,\n} as const\n\n/**\n * HTTP 请求相关常量\n */\nexport const HTTP = {\n /** 请求超时时间(毫秒),默认 60000ms */\n DEFAULT_TIMEOUT: 60000,\n /** 长轮询额外超时缓冲时间(毫秒),默认 10000ms */\n POLLING_TIMEOUT_BUFFER: 10000,\n} as const\n\n/**\n * API 接口相关常量\n */\nexport const API = {\n /** getUpdates 默认超时时间(秒),默认 0(立即返回) */\n DEFAULT_TIMEOUT: 0,\n /** getUpdates 默认拉取条数,默认 100 条 */\n DEFAULT_LIMIT: 100,\n} as const\n","import type { ApiResponse, ApiErrorResponse } from '../types'\nimport { ApiError, NetworkError, TimeoutError } from '../types'\nimport { DEFAULT_BASE_URL, HTTP } from '../constants'\n\nexport interface RequestOptions {\n token: string\n baseUrl?: string\n method?: 'GET' | 'POST'\n path: string\n params?: Record<string, string | number | undefined>\n body?: Record<string, unknown>\n timeout?: number\n}\n\nfunction validateToken(token: string): void {\n if (!token || typeof token !== 'string') {\n throw new NetworkError('Token is required', undefined)\n }\n if (!token.includes(':')) {\n throw new NetworkError('Invalid token format. Expected \"bot_id:secret\"', undefined)\n }\n}\n\nfunction extractBotToken(token: string): string {\n const parts = token.split(':')\n return parts.length >= 2 ? parts.slice(1).join(':') : token\n}\n\nfunction buildUrl(baseUrl: string, path: string, params?: Record<string, string | number | undefined>): string {\n const url = new URL(`/im/bot/${path}`, baseUrl || DEFAULT_BASE_URL)\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n }\n }\n return url.toString()\n}\n\nexport async function request<T>(options: RequestOptions): Promise<T> {\n const { token, baseUrl, method = 'GET', path, params, body, timeout = HTTP.DEFAULT_TIMEOUT } = options\n\n validateToken(token)\n\n const url = buildUrl(baseUrl || DEFAULT_BASE_URL, path, method === 'GET' ? params : undefined)\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bot ${extractBotToken(token)}`,\n }\n\n console.log('[Request]', method, url)\n console.log('[Headers]', JSON.stringify(headers, null, 2))\n if (body) {\n console.log('[Body]', JSON.stringify(body, null, 2))\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n })\n clearTimeout(timeoutId)\n\n const responseHeaders: Record<string, string> = {}\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value\n })\n console.log('[Response Status]', response.status)\n console.log('[Response Headers]', JSON.stringify(responseHeaders, null, 2))\n\n const data = (await response.json()) as ApiResponse<T> | ApiErrorResponse\n console.log('[Response Body]', JSON.stringify(data, null, 2))\n\n if (!response.ok || !data.ok) {\n const errorData = data as ApiErrorResponse\n throw new ApiError(\n errorData.description || `HTTP ${response.status}`,\n response.status,\n mapStatusCodeToErrorCode(response.status),\n errorData.retry_after\n )\n }\n\n return (data as ApiResponse<T>).result as T\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof ApiError) {\n throw error\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(`Request timeout after ${timeout}ms`)\n }\n throw new NetworkError(`Network error: ${error.message}`, error)\n }\n\n throw new NetworkError('Unknown network error', undefined)\n }\n}\n\nfunction mapStatusCodeToErrorCode(status: number): import('../types').ErrorCode {\n switch (status) {\n case 401:\n return 'UNAUTHORIZED'\n case 403:\n return 'UNAUTHORIZED'\n case 404:\n return 'CHAT_NOT_FOUND'\n case 429:\n return 'RATE_LIMIT'\n case 500:\n case 502:\n case 503:\n return 'INTERNAL_ERROR'\n default:\n return 'INTERNAL_ERROR'\n }\n}\n","import type { BotUpdate, SendMessageResult, SessionInfo, MsgContent } from '../types'\nimport { request } from '../http/request'\nimport { API, HTTP } from '../constants'\n\nexport interface GetUpdatesParams {\n token: string\n baseUrl?: string\n timeout?: number\n offset?: number\n limit?: number\n}\n\nexport async function getUpdates(params: GetUpdatesParams): Promise<BotUpdate[]> {\n const { token, baseUrl, timeout = API.DEFAULT_TIMEOUT, offset, limit = API.DEFAULT_LIMIT } = params\n\n return request<BotUpdate[]>({\n token,\n baseUrl,\n method: 'POST',\n path: 'getUpdates',\n body: {\n timeout,\n offset,\n limit,\n },\n timeout: (timeout || 0) * 1000 + HTTP.POLLING_TIMEOUT_BUFFER,\n })\n}\n\nexport interface SendMessageParams {\n token: string\n baseUrl?: string\n sessionInfo: SessionInfo\n msgContent: MsgContent\n}\n\nexport async function sendMessage(params: SendMessageParams): Promise<SendMessageResult> {\n const { token, baseUrl, sessionInfo, msgContent } = params\n\n if (!msgContent.content || msgContent.content.trim() === '') {\n const { ValidationError } = await import('../types/error.js')\n throw new ValidationError('Message text cannot be empty', 'content', msgContent.content)\n }\n\n return request<SendMessageResult>({\n token,\n baseUrl,\n method: 'POST',\n path: 'sendMessage',\n body: {\n sessionInfo,\n msgContent,\n },\n })\n}\n","import type { BotUpdate, MeetBotConfig, PollingOptions, SessionInfo, MsgContent, SendMessageResult } from './types'\nimport { getUpdates, sendMessage } from './api'\nimport { MeetBotError } from './types/error'\nimport { DEFAULT_BASE_URL, POLLING } from './constants'\n\ntype EventHandler<T = unknown> = (data: T) => void\n\ninterface Events {\n message: BotUpdate['message']\n error: Error\n polling_start: void\n polling_stop: void\n}\n\nexport class MeetBot {\n private readonly token: string\n private readonly baseUrl: string\n private readonly pollingLimit: number\n private readonly pollingInterval: number\n private readonly eventHandlers: Map<keyof Events, Set<EventHandler>> = new Map()\n private polling = false\n private offset = 0\n private retryCount = 0\n private abortController: AbortController | null = null\n\n constructor(config: MeetBotConfig) {\n if (config.token) {\n if (!config.token.includes(':')) {\n throw new MeetBotError('Invalid token format. Expected \"bot_id:secret\"', 'INVALID_TOKEN')\n }\n this.token = config.token\n } else if (config.botId && config.botToken) {\n this.token = `${config.botId}:${config.botToken}`\n } else {\n throw new MeetBotError('Token or (botId + botToken) is required', 'INVALID_TOKEN')\n }\n\n this.baseUrl = config.baseUrl || DEFAULT_BASE_URL\n this.pollingLimit = config.pollingLimit ?? POLLING.DEFAULT_LIMIT\n this.pollingInterval = config.pollingInterval ?? POLLING.DEFAULT_INTERVAL\n }\n\n on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler)\n return this\n }\n\n off<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n handlers.delete(handler as EventHandler)\n }\n return this\n }\n\n private emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data)\n } catch (e) {\n console.error(`Error in ${event} handler:`, e)\n }\n }\n }\n }\n\n isPolling(): boolean {\n return this.polling\n }\n\n async startPolling(options?: PollingOptions): Promise<void> {\n if (this.polling) {\n return\n }\n\n this.polling = true\n this.retryCount = 0\n this.abortController = new AbortController()\n\n const limit = options?.limit ?? this.pollingLimit\n const interval = options?.interval ?? this.pollingInterval\n const getUpdatesTimeout = options?.getUpdatesTimeout ?? 0\n\n console.log(`开始轮询消息... (条数: ${limit}, 间隔: ${interval}ms)`)\n\n this.emit('polling_start', undefined)\n const retryDelay = options?.retryDelay ?? POLLING.DEFAULT_RETRY_DELAY\n const maxRetries = options?.maxRetries ?? POLLING.DEFAULT_MAX_RETRIES\n const onOffsetUpdate = options?.onOffsetUpdate\n\n while (this.polling) {\n try {\n const updates = await getUpdates({\n token: this.token,\n baseUrl: this.baseUrl,\n timeout: getUpdatesTimeout,\n offset: this.offset,\n limit,\n })\n\n this.retryCount = 0\n\n for (const update of updates) {\n if (update.message) {\n this.emit('message', update.message)\n this.offset = (update.message.seqId || 0) + 1\n onOffsetUpdate?.(this.offset)\n }\n }\n\n if (interval > 0) {\n await this.sleep(interval)\n }\n } catch (error) {\n if (!this.polling) break\n\n this.retryCount++\n this.emit('error', error instanceof Error ? error : new Error(String(error)))\n\n if (this.retryCount >= maxRetries) {\n this.stopPolling()\n break\n }\n\n const delay = Math.min(retryDelay * Math.pow(2, this.retryCount - 1), POLLING.MAX_RETRY_DELAY)\n await this.sleep(delay)\n }\n }\n }\n\n stopPolling(): void {\n this.polling = false\n if (this.abortController) {\n this.abortController.abort()\n this.abortController = null\n }\n this.emit('polling_stop', undefined)\n }\n\n async getUpdates(options?: { timeout?: number; offset?: number; limit?: number }): Promise<BotUpdate[]> {\n return getUpdates({\n token: this.token,\n baseUrl: this.baseUrl,\n ...options,\n })\n }\n\n async sendMessage(sessionInfo: SessionInfo, msgContent: MsgContent): Promise<SendMessageResult> {\n return sendMessage({\n token: this.token,\n baseUrl: this.baseUrl,\n sessionInfo,\n msgContent,\n })\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n}\n","export { MeetBot } from './client'\nexport { getUpdates, sendMessage } from './api'\nexport * from './constants'\nexport type {\n BotUser,\n BotChat,\n BotFile,\n BotMsg,\n BotUpdate,\n ChatType,\n SessionInfo,\n SessionType,\n MsgContent,\n MsgType,\n ExtraInfo,\n MeetBotConfig,\n GetUpdatesOptions,\n SendMessageOptions,\n SendMessageResult,\n PollingOptions,\n ErrorCode,\n ApiErrorResponse,\n ApiResponse,\n} from './types'\nexport { MeetBotError, ApiError, NetworkError, TimeoutError, ValidationError } from './types/error'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/error.ts","../src/types/index.ts","../src/constants.ts","../src/http/request.ts","../src/api/index.ts","../src/client.ts","../src/index.ts"],"names":["ValidationError"],"mappings":"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","file":"index.js","sourcesContent":["import type { ErrorCode } from './api'\n\nexport class MeetBotError extends Error {\n public readonly code: ErrorCode\n\n constructor(message: string, code: ErrorCode) {\n super(message)\n this.name = 'MeetBotError'\n this.code = code\n Error.captureStackTrace?.(this, this.constructor)\n }\n}\n\nexport class ApiError extends MeetBotError {\n public readonly statusCode: number\n public readonly retryAfter?: number\n\n constructor(message: string, statusCode: number, code: ErrorCode, retryAfter?: number) {\n super(message, code)\n this.name = 'ApiError'\n this.statusCode = statusCode\n this.retryAfter = retryAfter\n }\n}\n\nexport class NetworkError extends MeetBotError {\n public readonly cause?: Error\n\n constructor(message: string, cause?: Error) {\n super(message, 'NETWORK_ERROR')\n this.name = 'NetworkError'\n this.cause = cause\n }\n}\n\nexport class TimeoutError extends MeetBotError {\n constructor(message: string) {\n super(message, 'TIMEOUT_ERROR')\n this.name = 'TimeoutError'\n }\n}\n\nexport class ValidationError extends MeetBotError {\n public readonly field: string\n public readonly value: unknown\n\n constructor(message: string, field: string, value: unknown) {\n super(message, 'VALIDATION_ERROR')\n this.name = 'ValidationError'\n this.field = field\n this.value = value\n }\n}\n","export type {\n BotUser,\n BotChat,\n BotFile,\n BotMsg,\n BotUpdate,\n ChatType,\n SessionInfo,\n SessionType,\n MsgContent,\n MsgType,\n ExtraInfo,\n} from './bot'\nexport type { ErrorCode, ApiErrorResponse, ApiResponse } from './api'\nexport type { MeetBotConfig, GetUpdatesOptions, SendMessageOptions, SendMessageResult, PollingOptions } from './client'\n\nexport { MeetBotError, ApiError, NetworkError, TimeoutError, ValidationError } from './error'\n","/**\n * Bot API 默认基础 URL\n */\nexport const DEFAULT_BASE_URL = 'https://staging-meet-api.miyachat.com'\n\n/**\n * 轮询相关常量\n */\nexport const POLLING = {\n /** 每次拉取消息条数上限,默认 100 条 */\n DEFAULT_LIMIT: 100,\n /** 长轮询超时时间(秒),默认 30 秒 */\n DEFAULT_TIMEOUT: 30,\n /** 成功返回后等待时间(毫秒),默认 1 秒 */\n SUCCESS_DELAY: 1000,\n /** 重试延迟基础时间(毫秒),默认 1000ms */\n DEFAULT_RETRY_DELAY: 1000,\n /** 重试延迟最大时间(毫秒),默认 30000ms */\n MAX_RETRY_DELAY: 30000,\n /** 最大重试次数,默认无限(0 表示不限制) */\n DEFAULT_MAX_RETRIES: 0,\n} as const\n\n/**\n * HTTP 请求相关常量\n */\nexport const HTTP = {\n /** 请求超时时间(毫秒),默认 60000ms */\n DEFAULT_TIMEOUT: 60000,\n /** 长轮询额外超时缓冲时间(毫秒),默认 10000ms */\n POLLING_TIMEOUT_BUFFER: 10000,\n} as const\n\n/**\n * API 接口相关常量\n */\nexport const API = {\n /** getUpdates 默认超时时间(秒),默认 30(long polling) */\n DEFAULT_TIMEOUT: 30,\n /** getUpdates 默认拉取条数,默认 100 条 */\n DEFAULT_LIMIT: 100,\n} as const\n","import type { ApiResponse, ApiErrorResponse } from '../types'\nimport { ApiError, NetworkError, TimeoutError } from '../types'\nimport { DEFAULT_BASE_URL, HTTP } from '../constants'\n\nexport interface RequestOptions {\n token: string\n baseUrl?: string\n method?: 'GET' | 'POST'\n path: string\n params?: Record<string, string | number | undefined>\n body?: Record<string, unknown>\n timeout?: number\n}\n\nfunction validateToken(token: string): void {\n if (!token || typeof token !== 'string') {\n throw new NetworkError('Token is required', undefined)\n }\n if (!token.includes(':')) {\n throw new NetworkError('Invalid token format. Expected \"bot_id:secret\"', undefined)\n }\n}\n\nfunction extractBotToken(token: string): string {\n const parts = token.split(':')\n return parts.length >= 2 ? parts.slice(1).join(':') : token\n}\n\nfunction buildUrl(baseUrl: string, path: string, params?: Record<string, string | number | undefined>): string {\n const url = new URL(`/im/bot/${path}`, baseUrl || DEFAULT_BASE_URL)\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n }\n }\n return url.toString()\n}\n\nexport async function request<T>(options: RequestOptions): Promise<T> {\n const { token, baseUrl, method = 'GET', path, params, body, timeout = HTTP.DEFAULT_TIMEOUT } = options\n\n validateToken(token)\n\n const url = buildUrl(baseUrl || DEFAULT_BASE_URL, path, method === 'GET' ? params : undefined)\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bot ${extractBotToken(token)}`,\n }\n\n console.log('[Request]', method, url)\n // console.log('[Headers]', JSON.stringify(headers, null, 2))\n if (body) {\n console.log('[Body]', JSON.stringify(body, null, 2))\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n })\n clearTimeout(timeoutId)\n\n const responseHeaders: Record<string, string> = {}\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value\n })\n console.log('[Response Status]', response.status)\n // console.log('[Response Headers]', JSON.stringify(responseHeaders, null, 2))\n\n const data = (await response.json()) as ApiResponse<T> | ApiErrorResponse\n console.log('[Response Body]', JSON.stringify(data, null, 2))\n\n if (!response.ok || !data.ok) {\n const errorData = data as ApiErrorResponse\n throw new ApiError(\n errorData.description || `HTTP ${response.status}`,\n response.status,\n mapStatusCodeToErrorCode(response.status),\n errorData.retry_after\n )\n }\n\n return (data as ApiResponse<T>).result as T\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof ApiError) {\n throw error\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(`Request timeout after ${timeout}ms`)\n }\n throw new NetworkError(`Network error: ${error.message}`, error)\n }\n\n throw new NetworkError('Unknown network error', undefined)\n }\n}\n\nfunction mapStatusCodeToErrorCode(status: number): import('../types').ErrorCode {\n switch (status) {\n case 401:\n return 'UNAUTHORIZED'\n case 403:\n return 'UNAUTHORIZED'\n case 404:\n return 'CHAT_NOT_FOUND'\n case 429:\n return 'RATE_LIMIT'\n case 500:\n case 502:\n case 503:\n return 'INTERNAL_ERROR'\n default:\n return 'INTERNAL_ERROR'\n }\n}\n","import type { BotUpdate, SendMessageResult, SessionInfo, MsgContent } from '../types'\nimport { request } from '../http/request'\nimport { API, HTTP } from '../constants'\n\nexport interface GetUpdatesParams {\n token: string\n baseUrl?: string\n timeout?: number\n offset?: number\n limit?: number\n}\n\nexport async function getUpdates(params: GetUpdatesParams): Promise<BotUpdate[]> {\n const { token, baseUrl, timeout = API.DEFAULT_TIMEOUT, offset, limit = API.DEFAULT_LIMIT } = params\n\n return request<BotUpdate[]>({\n token,\n baseUrl,\n method: 'POST',\n path: 'getUpdates',\n body: {\n timeout,\n offset,\n limit,\n },\n timeout: (timeout || 0) * 1000 + HTTP.POLLING_TIMEOUT_BUFFER,\n })\n}\n\nexport interface SendMessageParams {\n token: string\n baseUrl?: string\n sessionInfo: SessionInfo\n msgContent: MsgContent\n}\n\nexport async function sendMessage(params: SendMessageParams): Promise<SendMessageResult> {\n const { token, baseUrl, sessionInfo, msgContent } = params\n\n if (!msgContent.content || msgContent.content.trim() === '') {\n const { ValidationError } = await import('../types/error.js')\n throw new ValidationError('Message text cannot be empty', 'content', msgContent.content)\n }\n\n return request<SendMessageResult>({\n token,\n baseUrl,\n method: 'POST',\n path: 'sendMessage',\n body: {\n sessionInfo,\n msgContent,\n },\n })\n}\n","import type { BotUpdate, MeetBotConfig, PollingOptions, SessionInfo, MsgContent, SendMessageResult } from './types'\nimport { getUpdates, sendMessage } from './api'\nimport { MeetBotError } from './types/error'\nimport { DEFAULT_BASE_URL, POLLING } from './constants'\n\ntype EventHandler<T = unknown> = (data: T) => void\n\ninterface Events {\n message: BotUpdate['message']\n error: Error\n polling_start: void\n polling_stop: void\n}\n\nexport class MeetBot {\n private readonly token: string\n private readonly baseUrl: string\n private readonly pollingLimit: number\n private readonly longPollingTimeout: number\n private readonly eventHandlers: Map<keyof Events, Set<EventHandler>> = new Map()\n private polling = false\n private offset = 0\n private abortController: AbortController | null = null\n\n constructor(config: MeetBotConfig) {\n if (config.token) {\n if (!config.token.includes(':')) {\n throw new MeetBotError('Invalid token format. Expected \"bot_id:secret\"', 'INVALID_TOKEN')\n }\n this.token = config.token\n } else if (config.botId && config.botToken) {\n this.token = `${config.botId}:${config.botToken}`\n } else {\n throw new MeetBotError('Token or (botId + botToken) is required', 'INVALID_TOKEN')\n }\n\n this.baseUrl = config.baseUrl || DEFAULT_BASE_URL\n this.pollingLimit = config.pollingLimit ?? POLLING.DEFAULT_LIMIT\n this.longPollingTimeout = config.longPollingTimeout ?? POLLING.DEFAULT_TIMEOUT\n }\n\n on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler)\n return this\n }\n\n off<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n handlers.delete(handler as EventHandler)\n }\n return this\n }\n\n private emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data)\n } catch (e) {\n console.error(`Error in ${event} handler:`, e)\n }\n }\n }\n }\n\n isPolling(): boolean {\n return this.polling\n }\n\n async startPolling(options?: PollingOptions): Promise<void> {\n if (this.polling) {\n return\n }\n\n this.polling = true\n this.abortController = new AbortController()\n\n const limit = options?.limit ?? this.pollingLimit\n const timeout = options?.timeout ?? this.longPollingTimeout\n\n console.log(`开始长轮询消息... (条数: ${limit}, 超时: ${timeout}s)`)\n\n this.emit('polling_start', undefined)\n const retryDelay = options?.retryDelay ?? POLLING.DEFAULT_RETRY_DELAY\n const maxRetries = options?.maxRetries ?? POLLING.DEFAULT_MAX_RETRIES\n const onOffsetUpdate = options?.onOffsetUpdate\n\n let retryCount = 0\n\n while (this.polling) {\n try {\n const updates = await getUpdates({\n token: this.token,\n baseUrl: this.baseUrl,\n timeout,\n offset: this.offset,\n limit,\n })\n\n retryCount = 0\n\n for (const update of updates) {\n if (update.message) {\n this.emit('message', update.message)\n this.offset = (update.message.seqId || 0) + 1\n onOffsetUpdate?.(this.offset)\n }\n }\n\n await this.sleep(POLLING.SUCCESS_DELAY)\n } catch (error) {\n if (!this.polling) break\n\n retryCount++\n this.emit('error', error instanceof Error ? error : new Error(String(error)))\n\n if (maxRetries > 0 && retryCount >= maxRetries) {\n this.stopPolling()\n break\n }\n\n const delay = Math.min(retryDelay * Math.pow(2, retryCount - 1), POLLING.MAX_RETRY_DELAY)\n await this.sleep(delay)\n }\n }\n }\n\n stopPolling(): void {\n this.polling = false\n if (this.abortController) {\n this.abortController.abort()\n this.abortController = null\n }\n this.emit('polling_stop', undefined)\n }\n\n async getUpdates(options?: { timeout?: number; offset?: number; limit?: number }): Promise<BotUpdate[]> {\n return getUpdates({\n token: this.token,\n baseUrl: this.baseUrl,\n ...options,\n })\n }\n\n async sendMessage(sessionInfo: SessionInfo, msgContent: MsgContent): Promise<SendMessageResult> {\n return sendMessage({\n token: this.token,\n baseUrl: this.baseUrl,\n sessionInfo,\n msgContent,\n })\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n}\n","export { MeetBot } from './client'\nexport { getUpdates, sendMessage } from './api'\nexport * from './constants'\nexport type {\n BotUser,\n BotChat,\n BotFile,\n BotMsg,\n BotUpdate,\n ChatType,\n SessionInfo,\n SessionType,\n MsgContent,\n MsgType,\n ExtraInfo,\n MeetBotConfig,\n GetUpdatesOptions,\n SendMessageOptions,\n SendMessageResult,\n PollingOptions,\n ErrorCode,\n ApiErrorResponse,\n ApiResponse,\n} from './types'\nexport { MeetBotError, ApiError, NetworkError, TimeoutError, ValidationError } from './types/error'\n"]}
|