@meet-im/meet-bot-jssdk 0.0.7 → 1.0.0
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 +182 -44
- package/dist/index.cjs +95 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +42 -5
- package/dist/index.d.ts +42 -5
- package/dist/index.js +92 -17
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -122,6 +122,11 @@ var CHUNK_RULES = [
|
|
|
122
122
|
{ maxSize: Infinity, chunks: 50 }
|
|
123
123
|
// > 100MB: 50 片
|
|
124
124
|
];
|
|
125
|
+
var SESSION_TYPE = {
|
|
126
|
+
PRIVATE: 1,
|
|
127
|
+
GROUP: 3,
|
|
128
|
+
CHANNEL: 4
|
|
129
|
+
};
|
|
125
130
|
function getChunkNum(size) {
|
|
126
131
|
for (const rule of CHUNK_RULES) {
|
|
127
132
|
if (size < rule.maxSize) {
|
|
@@ -130,6 +135,31 @@ function getChunkNum(size) {
|
|
|
130
135
|
}
|
|
131
136
|
return 50;
|
|
132
137
|
}
|
|
138
|
+
function getConvID(firstID, secondID, sessionType, companyID = 1) {
|
|
139
|
+
let convID;
|
|
140
|
+
if (sessionType === SESSION_TYPE.PRIVATE) {
|
|
141
|
+
const min = Math.min(firstID, secondID);
|
|
142
|
+
const max = Math.max(firstID, secondID);
|
|
143
|
+
convID = `${min}:${max}`;
|
|
144
|
+
if (companyID > 1) {
|
|
145
|
+
convID += `:${companyID}`;
|
|
146
|
+
}
|
|
147
|
+
} else if (sessionType === SESSION_TYPE.GROUP) {
|
|
148
|
+
convID = `${firstID}+${secondID}`;
|
|
149
|
+
if (companyID > 1) {
|
|
150
|
+
convID += `+${companyID}`;
|
|
151
|
+
}
|
|
152
|
+
} else {
|
|
153
|
+
convID = `${firstID}_${secondID}`;
|
|
154
|
+
if (companyID > 1) {
|
|
155
|
+
convID += `_${companyID}`;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return convID;
|
|
159
|
+
}
|
|
160
|
+
function getQuoteMsgKey(convID, seqID) {
|
|
161
|
+
return `${convID}:${seqID}`;
|
|
162
|
+
}
|
|
133
163
|
|
|
134
164
|
// src/utils/logger.ts
|
|
135
165
|
var Logger = class {
|
|
@@ -331,9 +361,8 @@ async function getAccessURL(params) {
|
|
|
331
361
|
sessionType: queryParams.sessionType,
|
|
332
362
|
seqId: queryParams.seqId,
|
|
333
363
|
fileId: queryParams.fileId,
|
|
364
|
+
companyId: queryParams.companyId,
|
|
334
365
|
"x-oss-process": queryParams["x-oss-process"],
|
|
335
|
-
origin: queryParams.origin,
|
|
336
|
-
bestDomain: queryParams.bestDomain,
|
|
337
366
|
printResult: queryParams.printResult ?? "1"
|
|
338
367
|
}
|
|
339
368
|
});
|
|
@@ -528,6 +557,20 @@ async function getUpdates(params) {
|
|
|
528
557
|
timeout: (timeout || 0) * 1e3 + HTTP.POLLING_TIMEOUT_BUFFER
|
|
529
558
|
});
|
|
530
559
|
}
|
|
560
|
+
async function getUpdatesV2(params) {
|
|
561
|
+
const { token, baseUrl, timeout = API.DEFAULT_TIMEOUT, limit = API.DEFAULT_LIMIT } = params;
|
|
562
|
+
return request({
|
|
563
|
+
token,
|
|
564
|
+
baseUrl,
|
|
565
|
+
method: "POST",
|
|
566
|
+
path: "getUpdatesV2",
|
|
567
|
+
body: {
|
|
568
|
+
timeout,
|
|
569
|
+
limit
|
|
570
|
+
},
|
|
571
|
+
timeout: (timeout || 0) * 1e3 + HTTP.POLLING_TIMEOUT_BUFFER
|
|
572
|
+
});
|
|
573
|
+
}
|
|
531
574
|
async function sendMessage(params) {
|
|
532
575
|
const { token, baseUrl, sessionInfo, msgContent } = params;
|
|
533
576
|
const hasContent = msgContent.content && msgContent.content.trim() !== "";
|
|
@@ -555,6 +598,7 @@ var MeetBot = class {
|
|
|
555
598
|
baseUrl;
|
|
556
599
|
pollingLimit;
|
|
557
600
|
longPollingTimeout;
|
|
601
|
+
useV2;
|
|
558
602
|
eventHandlers = /* @__PURE__ */ new Map();
|
|
559
603
|
polling = false;
|
|
560
604
|
offset = 0;
|
|
@@ -573,6 +617,7 @@ var MeetBot = class {
|
|
|
573
617
|
this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;
|
|
574
618
|
this.pollingLimit = config.pollingLimit ?? POLLING.DEFAULT_LIMIT;
|
|
575
619
|
this.longPollingTimeout = config.longPollingTimeout ?? POLLING.DEFAULT_TIMEOUT;
|
|
620
|
+
this.useV2 = config.useV2 ?? false;
|
|
576
621
|
logger.setLevel(config.logLevel ?? "silent");
|
|
577
622
|
}
|
|
578
623
|
on(event, handler) {
|
|
@@ -612,7 +657,7 @@ var MeetBot = class {
|
|
|
612
657
|
this.abortController = new AbortController();
|
|
613
658
|
const limit = options?.limit ?? this.pollingLimit;
|
|
614
659
|
const timeout = options?.timeout ?? this.longPollingTimeout;
|
|
615
|
-
logger.info(`\u5F00\u59CB\u957F\u8F6E\u8BE2\u6D88\u606F... (\u6761\u6570: ${limit}, \u8D85\u65F6: ${timeout}s)`);
|
|
660
|
+
logger.info(`\u5F00\u59CB\u957F\u8F6E\u8BE2\u6D88\u606F... (\u6761\u6570: ${limit}, \u8D85\u65F6: ${timeout}s, V2: ${this.useV2})`);
|
|
616
661
|
this.emit("polling_start", void 0);
|
|
617
662
|
const retryDelay = options?.retryDelay ?? POLLING.DEFAULT_RETRY_DELAY;
|
|
618
663
|
const maxRetries = options?.maxRetries ?? POLLING.DEFAULT_MAX_RETRIES;
|
|
@@ -620,20 +665,35 @@ var MeetBot = class {
|
|
|
620
665
|
let retryCount = 0;
|
|
621
666
|
while (this.polling) {
|
|
622
667
|
try {
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
this.
|
|
634
|
-
this.offset = (update.message.seqId || 0) + 1;
|
|
668
|
+
if (this.useV2) {
|
|
669
|
+
const result = await getUpdatesV2({
|
|
670
|
+
token: this.token,
|
|
671
|
+
baseUrl: this.baseUrl,
|
|
672
|
+
timeout,
|
|
673
|
+
limit
|
|
674
|
+
});
|
|
675
|
+
retryCount = 0;
|
|
676
|
+
for (const msgUpdate of result.msgs) {
|
|
677
|
+
this.emit("message", { message: msgUpdate.message, quoteMsgMap: result.quoteMsgMap });
|
|
678
|
+
this.offset = (msgUpdate.message.seqId || 0) + 1;
|
|
635
679
|
onOffsetUpdate?.(this.offset);
|
|
636
680
|
}
|
|
681
|
+
} else {
|
|
682
|
+
const updates = await getUpdates({
|
|
683
|
+
token: this.token,
|
|
684
|
+
baseUrl: this.baseUrl,
|
|
685
|
+
timeout,
|
|
686
|
+
offset: this.offset,
|
|
687
|
+
limit
|
|
688
|
+
});
|
|
689
|
+
retryCount = 0;
|
|
690
|
+
for (const update of updates) {
|
|
691
|
+
if (update.message) {
|
|
692
|
+
this.emit("message", { message: update.message, quoteMsgMap: {} });
|
|
693
|
+
this.offset = (update.message.seqId || 0) + 1;
|
|
694
|
+
onOffsetUpdate?.(this.offset);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
637
697
|
}
|
|
638
698
|
await this.sleep(POLLING.SUCCESS_DELAY);
|
|
639
699
|
} catch (error) {
|
|
@@ -664,6 +724,13 @@ var MeetBot = class {
|
|
|
664
724
|
...options
|
|
665
725
|
});
|
|
666
726
|
}
|
|
727
|
+
async getUpdatesV2(options) {
|
|
728
|
+
return getUpdatesV2({
|
|
729
|
+
token: this.token,
|
|
730
|
+
baseUrl: this.baseUrl,
|
|
731
|
+
...options
|
|
732
|
+
});
|
|
733
|
+
}
|
|
667
734
|
async sendMessage(sessionInfo, msgContent) {
|
|
668
735
|
return sendMessage({
|
|
669
736
|
token: this.token,
|
|
@@ -706,10 +773,18 @@ var MeetBot = class {
|
|
|
706
773
|
* 获取文件下载地址
|
|
707
774
|
*/
|
|
708
775
|
async getAccessURL(params) {
|
|
776
|
+
const apiParams = "sessionInfo" in params ? {
|
|
777
|
+
firstId: params.sessionInfo.firstID,
|
|
778
|
+
secondId: params.sessionInfo.secondID,
|
|
779
|
+
sessionType: params.sessionInfo.sessionType,
|
|
780
|
+
seqId: params.seqId,
|
|
781
|
+
fileId: params.fileId,
|
|
782
|
+
printResult: params.printResult
|
|
783
|
+
} : params;
|
|
709
784
|
return getAccessURL({
|
|
710
785
|
token: this.token,
|
|
711
786
|
baseUrl: this.baseUrl,
|
|
712
|
-
...
|
|
787
|
+
...apiParams
|
|
713
788
|
});
|
|
714
789
|
}
|
|
715
790
|
/**
|
|
@@ -732,6 +807,6 @@ var MeetBot = class {
|
|
|
732
807
|
// src/index.ts
|
|
733
808
|
init_error();
|
|
734
809
|
|
|
735
|
-
export { API, ApiError, CHUNK_RULES, DEFAULT_BASE_URL, HTTP, MeetBot, MeetBotError, NetworkError, POLLING, TimeoutError, UPLOAD, ValidationError, completeMultipartUpload, computeMD5, getAccessURL, getChunkNum, getMultiPartUploadURL, getUpdates, getUploadURL, sendMediaMessage, sendMessage, uploadFile };
|
|
810
|
+
export { API, ApiError, CHUNK_RULES, DEFAULT_BASE_URL, HTTP, MeetBot, MeetBotError, NetworkError, POLLING, SESSION_TYPE, TimeoutError, UPLOAD, ValidationError, completeMultipartUpload, computeMD5, getAccessURL, getChunkNum, getConvID, getMultiPartUploadURL, getQuoteMsgKey, getUpdates, getUpdatesV2, getUploadURL, sendMediaMessage, sendMessage, uploadFile };
|
|
736
811
|
//# sourceMappingURL=index.js.map
|
|
737
812
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/error.ts","../src/types/index.ts","../src/constants.ts","../src/utils/logger.ts","../src/http/request.ts","../src/api/file.ts","../src/api/upload.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 AttachmentInfo,\n} from './bot'\nexport type { ErrorCode, ApiErrorResponse, ApiResponse } from './api'\nexport type {\n MeetBotConfig,\n GetUpdatesOptions,\n SendMessageOptions,\n SendMessageResult,\n PollingOptions,\n LogLevel,\n} from './client'\nexport type {\n GetUploadURLParams,\n UploadURLResult,\n GetMultiPartUploadURLParams,\n MultiPartUploadURLResult,\n UploadPart,\n CompleteMultipartUploadParams,\n CompleteMultipartUploadResult,\n GetAccessURLParams,\n AccessURLResult,\n UploadProgress,\n UploadFileOptions,\n UploadFileResult,\n SendMediaOptions,\n ReceivedAttachmentInfo,\n} from './file'\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 /** 上传超时时间(毫秒),默认 1 小时 */\n UPLOAD_TIMEOUT: 3600 * 1000,\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\n/**\n * 文件上传相关常量\n */\nexport const UPLOAD = {\n /** 分片上传阈值,>= 5MB 使用分片上传 */\n MULTIPART_THRESHOLD: 5 * 1024 * 1024,\n /** 分片上传最大重试次数 */\n MAX_RETRY_COUNT: 3,\n /** 分片上传重试间隔(毫秒) */\n RETRY_DELAY: 1000,\n /** 最大并发上传数 */\n MAX_CONCURRENCY: 4,\n} as const\n\n/**\n * 分片规则\n */\nexport const CHUNK_RULES = [\n { maxSize: 1 * 1024 * 1024, chunks: 1 }, // < 1MB: 1 片\n { maxSize: 20 * 1024 * 1024, chunks: 5 }, // 1-20MB: 5 片\n { maxSize: 100 * 1024 * 1024, chunks: 20 }, // 20-100MB: 20 片\n { maxSize: Infinity, chunks: 50 }, // > 100MB: 50 片\n] as const\n\n/**\n * 根据文件大小计算分片数量\n */\nexport function getChunkNum(size: number): number {\n for (const rule of CHUNK_RULES) {\n if (size < rule.maxSize) {\n return rule.chunks\n }\n }\n return 50\n}\n","export type LogLevel = 'silent' | 'info'\n\nexport class Logger {\n private level: LogLevel = 'silent'\n\n setLevel(level: LogLevel): void {\n this.level = level\n }\n\n getLevel(): LogLevel {\n return this.level\n }\n\n info(...args: unknown[]): void {\n if (this.level === 'info') {\n console.log('[meetBotSDK]', ...args)\n }\n }\n\n error(...args: unknown[]): void {\n if (this.level === 'info') {\n console.error('[meetBotSDK]', ...args)\n }\n }\n}\n\nexport const logger = new Logger()\n","import type { ApiResponse, ApiErrorResponse } from '../types'\nimport { ApiError, NetworkError, TimeoutError } from '../types'\nimport { DEFAULT_BASE_URL, HTTP } from '../constants'\nimport { logger } from '../utils/logger'\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 logger.info('[Request]', method, url)\n if (body) {\n logger.info('[Body]', JSON.stringify(body))\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 logger.info('[Response Status]', response.status)\n\n const contentType = response.headers.get('content-type') || ''\n const responseText = await response.text()\n\n if (!contentType.includes('application/json')) {\n logger.error('[Response] Non-JSON response:', responseText.substring(0, 500))\n throw new NetworkError(`Server returned non-JSON response (status ${response.status})`, undefined)\n }\n\n let data: ApiResponse<T> | ApiErrorResponse\n try {\n data = JSON.parse(responseText) as ApiResponse<T> | ApiErrorResponse\n } catch {\n logger.error('[Response] Failed to parse JSON:', responseText.substring(0, 500))\n throw new NetworkError('Failed to parse server response', undefined)\n }\n logger.info('[Response Body]', JSON.stringify(data))\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 { request } from '../http/request'\nimport { HTTP } from '../constants'\nimport type {\n GetUploadURLParams,\n UploadURLResult,\n GetMultiPartUploadURLParams,\n MultiPartUploadURLResult,\n CompleteMultipartUploadParams,\n CompleteMultipartUploadResult,\n GetAccessURLParams,\n AccessURLResult,\n} from '../types/file'\n\nexport interface GetUploadURLApiParams extends GetUploadURLParams {\n token: string\n baseUrl?: string\n}\n\nexport async function getUploadURL(params: GetUploadURLApiParams): Promise<UploadURLResult> {\n const { token, baseUrl, ...body } = params\n return request<UploadURLResult>({\n token,\n baseUrl,\n method: 'POST',\n path: 'getUploadURL',\n body: {\n originFileName: body.originFileName,\n contentType: body.contentType,\n md5: body.md5,\n size: body.size,\n fullImage: body.fullImage,\n videoLength: body.videoLength,\n bestDomain: body.bestDomain,\n uploadId: body.uploadId,\n chunkNum: body.chunkNum,\n },\n timeout: HTTP.UPLOAD_TIMEOUT,\n })\n}\n\nexport interface GetMultiPartUploadURLApiParams extends GetMultiPartUploadURLParams {\n token: string\n baseUrl?: string\n}\n\nexport async function getMultiPartUploadURL(\n params: GetMultiPartUploadURLApiParams\n): Promise<MultiPartUploadURLResult> {\n const { token, baseUrl, ...body } = params\n return request<MultiPartUploadURLResult>({\n token,\n baseUrl,\n method: 'POST',\n path: 'getMultiPartUploadURL',\n body: {\n originFileName: body.originFileName,\n contentType: body.contentType,\n md5: body.md5,\n size: body.size,\n fullImage: body.fullImage,\n videoLength: body.videoLength,\n bestDomain: body.bestDomain,\n },\n timeout: HTTP.UPLOAD_TIMEOUT,\n })\n}\n\nexport interface CompleteMultipartUploadApiParams extends CompleteMultipartUploadParams {\n token: string\n baseUrl?: string\n}\n\nexport async function completeMultipartUpload(\n params: CompleteMultipartUploadApiParams\n): Promise<CompleteMultipartUploadResult> {\n const { token, baseUrl, ...body } = params\n return request<CompleteMultipartUploadResult>({\n token,\n baseUrl,\n method: 'POST',\n path: 'completeMultipartUpload',\n body: {\n originFileName: body.originFileName,\n md5: body.md5,\n UploadParts: body.UploadParts,\n },\n timeout: HTTP.UPLOAD_TIMEOUT,\n })\n}\n\nexport interface GetAccessURLApiParams extends GetAccessURLParams {\n token: string\n baseUrl?: string\n}\n\nexport async function getAccessURL(params: GetAccessURLApiParams): Promise<AccessURLResult> {\n const { token, baseUrl, ...queryParams } = params\n return request<AccessURLResult>({\n token,\n baseUrl,\n method: 'GET',\n path: 'getAccessURL',\n params: {\n firstId: queryParams.firstId,\n secondId: queryParams.secondId,\n sessionType: queryParams.sessionType,\n seqId: queryParams.seqId,\n fileId: queryParams.fileId,\n 'x-oss-process': queryParams['x-oss-process'],\n origin: queryParams.origin,\n bestDomain: queryParams.bestDomain,\n printResult: queryParams.printResult ?? '1',\n },\n })\n}","/**\n * TODO: 浏览器兼容性改造\n * - MD5 计算: 使用 Web Crypto API (`crypto.subtle.digest('MD5', buffer)`) 或第三方库\n * - 文件输入: 支持 Blob/File/ArrayBuffer,内部转换为 Uint8Array\n * - Buffer 类型: 检测环境,Node.js 使用 Buffer,浏览器使用 Uint8Array\n */\nimport crypto from 'node:crypto'\nimport type {\n UploadFileOptions,\n UploadFileResult,\n UploadProgress,\n SendMediaOptions,\n SendMessageResult,\n SessionInfo,\n} from '../types'\nimport { getUploadURL, getMultiPartUploadURL, completeMultipartUpload, sendMessage } from './index'\nimport { UPLOAD, getChunkNum } from '../constants'\nimport { logger } from '../utils/logger'\n\n/**\n * 计算文件 MD5\n * @param buffer 文件 Buffer\n * @returns MD5 字符串\n */\nexport async function computeMD5(buffer: Buffer): Promise<string> {\n return crypto.createHash('md5').update(buffer).digest('hex')\n}\n\n/**\n * 上传文件到 OSS\n */\nasync function uploadToOSS(\n signedUrl: string,\n buffer: Buffer,\n contentType: string,\n callback: string,\n onProgress?: (progress: UploadProgress) => void\n): Promise<{ id: number; path: string; size: number }> {\n const startTime = Date.now()\n const total = buffer.length\n\n const response = await fetch(signedUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': contentType,\n 'X-Oss-Callback': callback,\n },\n body: buffer,\n })\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => '')\n logger.error(`OSS upload failed: ${response.status} ${response.statusText}`)\n logger.error(`OSS error body: ${errorBody}`)\n throw new Error(`OSS upload failed: ${response.status} - ${errorBody}`)\n }\n\n const responseText = await response.text()\n logger.info(`[uploadToOSS] OSS response status: ${response.status}`)\n logger.info(`[uploadToOSS] OSS response: ${responseText}`)\n\n let result: { id: number; path: string; size: number }\n\n try {\n const parsed = JSON.parse(responseText)\n result = {\n id: parsed.id || parsed.ID || 0,\n path: parsed.path || '',\n size: parsed.size || 0,\n }\n } catch {\n const idMatch = responseText.match(/<id>(\\d+)<\\/id>/i)\n const pathMatch = responseText.match(/<path>([^<]*)<\\/path>/i)\n const sizeMatch = responseText.match(/<size>(\\d+)<\\/size>/i)\n\n result = {\n id: idMatch?.[1] ? parseInt(idMatch[1], 10) : 0,\n path: pathMatch?.[1] || '',\n size: sizeMatch?.[1] ? parseInt(sizeMatch[1], 10) : 0,\n }\n }\n\n if (onProgress) {\n const seconds = Math.round((Date.now() - startTime) / 1000) || 1\n const speedPerSecond = formatSpeed(total / seconds)\n onProgress({\n percent: '100%',\n loaded: total,\n total,\n speedPerSecond,\n percentRate: 1,\n })\n }\n\n return result\n}\n\n/**\n * 格式化速度\n */\nfunction formatSpeed(bytesPerSecond: number): string {\n if (bytesPerSecond < 1024) {\n return `${bytesPerSecond.toFixed(0)}B/s`\n } else if (bytesPerSecond < 1024 * 1024) {\n return `${(bytesPerSecond / 1024).toFixed(2)}KB/s`\n } else {\n return `${(bytesPerSecond / 1024 / 1024).toFixed(2)}MB/s`\n }\n}\n\n/**\n * 上传单个文件(自动选择单文件或分片上传)\n */\nexport async function uploadFile(\n token: string,\n buffer: Buffer,\n options: UploadFileOptions,\n baseUrl?: string\n): Promise<UploadFileResult> {\n const { fileName, contentType, onProgress } = options\n const size = buffer.length\n const md5 = await computeMD5(buffer)\n\n logger.info(`[uploadFile] Starting upload: ${fileName}, size: ${size}, md5: ${md5}`)\n\n if (size < UPLOAD.MULTIPART_THRESHOLD) {\n return uploadSingleFile(token, buffer, fileName, contentType, md5, baseUrl, onProgress)\n } else {\n return uploadMultipartFile(token, buffer, fileName, contentType, md5, baseUrl, onProgress)\n }\n}\n\n/**\n * 单文件上传\n */\nasync function uploadSingleFile(\n token: string,\n buffer: Buffer,\n fileName: string,\n contentType: string,\n md5: string,\n baseUrl?: string,\n onProgress?: (progress: UploadProgress) => void\n): Promise<UploadFileResult> {\n const result = await getUploadURL({\n token,\n baseUrl,\n originFileName: fileName,\n contentType,\n md5,\n size: buffer.length,\n })\n\n if (result.id > 0 && !result.signedUrl) {\n logger.info(`[uploadFile] Instant upload (MD5 match): ${result.id}`)\n return { fileID: result.id, path: result.path, size: result.size }\n }\n\n const ossResult = await uploadToOSS(result.signedUrl, buffer, contentType, result.callback || '', onProgress)\n\n return { fileID: ossResult.id, path: ossResult.path, size: ossResult.size }\n}\n\n/**\n * 分片上传\n */\nasync function uploadMultipartFile(\n token: string,\n buffer: Buffer,\n fileName: string,\n contentType: string,\n md5: string,\n baseUrl?: string,\n onProgress?: (progress: UploadProgress) => void\n): Promise<UploadFileResult> {\n const size = buffer.length\n const chunkNum = getChunkNum(size)\n\n logger.info(`[uploadMultipartFile] Starting multipart upload: ${chunkNum} chunks`)\n\n const result = await getMultiPartUploadURL({\n token,\n baseUrl,\n originFileName: fileName,\n contentType,\n md5,\n size,\n })\n\n if (result.ID && result.ID > 0) {\n logger.info(`[uploadMultipartFile] Instant upload (MD5 match): ${result.ID}`)\n return { fileID: result.ID, path: result.path!, size: result.size }\n }\n\n const uploadParts: { partNumber: number; eTag: string }[] = []\n const chunkSize = Math.ceil(size / chunkNum)\n const startTime = Date.now()\n let totalUploaded = 0\n\n for (let i = 1; i <= chunkNum; i++) {\n const start = (i - 1) * chunkSize\n const end = Math.min(start + chunkSize, size)\n const chunk = buffer.subarray(start, end)\n const signedUrl = result.mapSignURLs[String(i)]\n\n if (!signedUrl) {\n throw new Error(`Missing signed URL for chunk ${i}`)\n }\n\n const resp = await fetch(signedUrl, {\n method: 'PUT',\n headers: { 'Content-Type': contentType },\n body: chunk,\n })\n\n if (!resp.ok) {\n throw new Error(`Chunk ${i} upload failed: ${resp.status}`)\n }\n\n const eTag = resp.headers.get('ETag') || ''\n uploadParts.push({ partNumber: i, eTag: JSON.parse(eTag) })\n\n totalUploaded += chunk.length\n\n if (onProgress) {\n const seconds = Math.round((Date.now() - startTime) / 1000) || 1\n const speedPerSecond = formatSpeed(totalUploaded / seconds)\n onProgress({\n percent: `${Math.round((totalUploaded / size) * 100)}%`,\n loaded: totalUploaded,\n total: size,\n speedPerSecond,\n percentRate: totalUploaded / size,\n })\n }\n }\n\n const complete = await completeMultipartUpload({\n token,\n baseUrl,\n originFileName: fileName,\n md5,\n UploadParts: uploadParts,\n })\n\n logger.info(`[uploadMultipartFile] Upload complete: ${complete.ID}`)\n\n return { fileID: complete.ID, path: complete.path, size }\n}\n\n/**\n * 发送媒体消息(上传并发送)\n */\nexport async function sendMediaMessage(\n token: string,\n sessionInfo: SessionInfo,\n options: SendMediaOptions,\n baseUrl?: string\n): Promise<SendMessageResult> {\n const { buffer, fileName, contentType, content, onProgress } = options\n\n const { fileID, path } = await uploadFile(token, buffer, { fileName, contentType, onProgress }, baseUrl)\n\n logger.info(`[sendMediaMessage] fileID=${fileID}, path=${path}`)\n\n return sendMessage({\n token,\n baseUrl,\n sessionInfo,\n msgContent: {\n content: content || '',\n extraInfo: {\n attechmentInfo: {\n fileID: String(fileID),\n fileName,\n filePath: path,\n fileSize: buffer.length,\n mimeType: contentType,\n },\n },\n },\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 const hasContent = msgContent.content && msgContent.content.trim() !== ''\n const hasAttachment =\n msgContent.extraInfo?.attechmentInfo || (msgContent.extraInfo?.attechmentInfos && msgContent.extraInfo.attechmentInfos.length > 0)\n\n if (!hasContent && !hasAttachment) {\n const { ValidationError } = await import('../types/error.js')\n throw new ValidationError('Message content or attachment is required', 'msgContent', msgContent)\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\nexport {\n getUploadURL,\n getMultiPartUploadURL,\n completeMultipartUpload,\n getAccessURL,\n} from './file'\n\nexport type {\n GetUploadURLApiParams,\n GetMultiPartUploadURLApiParams,\n CompleteMultipartUploadApiParams,\n GetAccessURLApiParams,\n} from './file'\n\nexport { uploadFile, sendMediaMessage, computeMD5 } from './upload'\n","import type {\n BotUpdate,\n MeetBotConfig,\n PollingOptions,\n SessionInfo,\n MsgContent,\n SendMessageResult,\n GetUploadURLParams,\n UploadURLResult,\n GetMultiPartUploadURLParams,\n MultiPartUploadURLResult,\n CompleteMultipartUploadParams,\n CompleteMultipartUploadResult,\n GetAccessURLParams,\n AccessURLResult,\n UploadFileOptions,\n UploadFileResult,\n SendMediaOptions,\n} from './types'\nimport {\n getUpdates,\n sendMessage,\n getUploadURL,\n getMultiPartUploadURL,\n completeMultipartUpload,\n getAccessURL,\n uploadFile,\n sendMediaMessage,\n} from './api'\nimport { MeetBotError } from './types/error'\nimport { DEFAULT_BASE_URL, POLLING } from './constants'\nimport { logger } from './utils/logger'\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 logger.setLevel(config.logLevel ?? 'silent')\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 logger.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 logger.info(`开始长轮询消息... (条数: ${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 /**\n * 获取单文件上传签名地址\n */\n async getUploadURL(params: Omit<GetUploadURLParams, 'fileType'>): Promise<UploadURLResult> {\n return getUploadURL({\n token: this.token,\n baseUrl: this.baseUrl,\n ...params,\n })\n }\n\n /**\n * 获取分片上传签名地址\n */\n async getMultiPartUploadURL(params: Omit<GetMultiPartUploadURLParams, 'fileType'>): Promise<MultiPartUploadURLResult> {\n return getMultiPartUploadURL({\n token: this.token,\n baseUrl: this.baseUrl,\n ...params,\n })\n }\n\n /**\n * 完成分片上传\n */\n async completeMultipartUpload(params: CompleteMultipartUploadParams): Promise<CompleteMultipartUploadResult> {\n return completeMultipartUpload({\n token: this.token,\n baseUrl: this.baseUrl,\n ...params,\n })\n }\n\n /**\n * 获取文件下载地址\n */\n async getAccessURL(params: GetAccessURLParams): Promise<AccessURLResult> {\n return getAccessURL({\n token: this.token,\n baseUrl: this.baseUrl,\n ...params,\n })\n }\n\n /**\n * 上传文件(自动选择单文件或分片上传)\n */\n async uploadFile(buffer: Buffer, options: UploadFileOptions): Promise<UploadFileResult> {\n return uploadFile(this.token, buffer, options, this.baseUrl)\n }\n\n /**\n * 发送媒体消息(上传并发送)\n */\n async sendMedia(sessionInfo: SessionInfo, options: SendMediaOptions): Promise<SendMessageResult> {\n return sendMediaMessage(this.token, sessionInfo, options, this.baseUrl)\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 {\n getUpdates,\n sendMessage,\n getUploadURL,\n getMultiPartUploadURL,\n completeMultipartUpload,\n getAccessURL,\n uploadFile,\n sendMediaMessage,\n computeMD5,\n} 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 AttachmentInfo,\n MeetBotConfig,\n GetUpdatesOptions,\n SendMessageOptions,\n SendMessageResult,\n PollingOptions,\n ErrorCode,\n ApiErrorResponse,\n ApiResponse,\n LogLevel,\n GetUploadURLParams,\n UploadURLResult,\n GetMultiPartUploadURLParams,\n MultiPartUploadURLResult,\n UploadPart,\n CompleteMultipartUploadParams,\n CompleteMultipartUploadResult,\n GetAccessURLParams,\n AccessURLResult,\n UploadProgress,\n UploadFileOptions,\n UploadFileResult,\n SendMediaOptions,\n ReceivedAttachmentInfo,\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/utils/logger.ts","../src/http/request.ts","../src/api/file.ts","../src/api/upload.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 BotMsgUpdate,\n QuoteMsgMap,\n GetUpdatesV2Result,\n ChatType,\n SessionInfo,\n SessionType,\n MsgContent,\n MsgType,\n ExtraInfo,\n AttachmentInfo,\n} from './bot'\nexport type { ErrorCode, ApiErrorResponse, ApiResponse } from './api'\nexport type {\n MeetBotConfig,\n GetUpdatesOptions,\n SendMessageOptions,\n SendMessageResult,\n PollingOptions,\n LogLevel,\n} from './client'\nexport type {\n GetUploadURLParams,\n UploadURLResult,\n GetMultiPartUploadURLParams,\n MultiPartUploadURLResult,\n UploadPart,\n CompleteMultipartUploadParams,\n CompleteMultipartUploadResult,\n GetAccessURLParams,\n GetAccessURLBySessionParams,\n AccessURLResult,\n UploadProgress,\n UploadFileOptions,\n UploadFileResult,\n SendMediaOptions,\n ReceivedAttachmentInfo,\n} from './file'\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 /** 上传超时时间(毫秒),默认 1 小时 */\n UPLOAD_TIMEOUT: 3600 * 1000,\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\n/**\n * 文件上传相关常量\n */\nexport const UPLOAD = {\n /** 分片上传阈值,>= 5MB 使用分片上传 */\n MULTIPART_THRESHOLD: 5 * 1024 * 1024,\n /** 分片上传最大重试次数 */\n MAX_RETRY_COUNT: 3,\n /** 分片上传重试间隔(毫秒) */\n RETRY_DELAY: 1000,\n /** 最大并发上传数 */\n MAX_CONCURRENCY: 4,\n} as const\n\n/**\n * 分片规则\n */\nexport const CHUNK_RULES = [\n { maxSize: 1 * 1024 * 1024, chunks: 1 }, // < 1MB: 1 片\n { maxSize: 20 * 1024 * 1024, chunks: 5 }, // 1-20MB: 5 片\n { maxSize: 100 * 1024 * 1024, chunks: 20 }, // 20-100MB: 20 片\n { maxSize: Infinity, chunks: 50 }, // > 100MB: 50 片\n] as const\n\n/**\n * 会话类型\n */\nexport const SESSION_TYPE = {\n PRIVATE: 1,\n GROUP: 3,\n CHANNEL: 4,\n} as const\n\n/**\n * 根据文件大小计算分片数量\n */\nexport function getChunkNum(size: number): number {\n for (const rule of CHUNK_RULES) {\n if (size < rule.maxSize) {\n return rule.chunks\n }\n }\n return 50\n}\n\n/**\n * 生成会话 ID(convID)\n * @param firstID 会话第一方 ID\n * @param secondID 会话第二方 ID\n * @param sessionType 会话类型:1=私聊,3=群聊,4=频道\n * @param companyID 公司 ID(可选,默认 1)\n */\nexport function getConvID(firstID: number, secondID: number, sessionType: number, companyID: number = 1): string {\n let convID: string\n\n if (sessionType === SESSION_TYPE.PRIVATE) {\n const min = Math.min(firstID, secondID)\n const max = Math.max(firstID, secondID)\n convID = `${min}:${max}`\n if (companyID > 1) {\n convID += `:${companyID}`\n }\n } else if (sessionType === SESSION_TYPE.GROUP) {\n convID = `${firstID}+${secondID}`\n if (companyID > 1) {\n convID += `+${companyID}`\n }\n } else {\n convID = `${firstID}_${secondID}`\n if (companyID > 1) {\n convID += `_${companyID}`\n }\n }\n\n return convID\n}\n\n/**\n * 生成引用消息的 key\n * @param convID 会话 ID\n * @param seqID 消息序列 ID\n */\nexport function getQuoteMsgKey(convID: string, seqID: number): string {\n return `${convID}:${seqID}`\n}\n","export type LogLevel = 'silent' | 'info'\n\nexport class Logger {\n private level: LogLevel = 'silent'\n\n setLevel(level: LogLevel): void {\n this.level = level\n }\n\n getLevel(): LogLevel {\n return this.level\n }\n\n info(...args: unknown[]): void {\n if (this.level === 'info') {\n console.log('[meetBotSDK]', ...args)\n }\n }\n\n error(...args: unknown[]): void {\n if (this.level === 'info') {\n console.error('[meetBotSDK]', ...args)\n }\n }\n}\n\nexport const logger = new Logger()\n","import type { ApiResponse, ApiErrorResponse } from '../types'\nimport { ApiError, NetworkError, TimeoutError } from '../types'\nimport { DEFAULT_BASE_URL, HTTP } from '../constants'\nimport { logger } from '../utils/logger'\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 logger.info('[Request]', method, url)\n if (body) {\n logger.info('[Body]', JSON.stringify(body))\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 logger.info('[Response Status]', response.status)\n\n const contentType = response.headers.get('content-type') || ''\n const responseText = await response.text()\n\n if (!contentType.includes('application/json')) {\n logger.error('[Response] Non-JSON response:', responseText.substring(0, 500))\n throw new NetworkError(`Server returned non-JSON response (status ${response.status})`, undefined)\n }\n\n let data: ApiResponse<T> | ApiErrorResponse\n try {\n data = JSON.parse(responseText) as ApiResponse<T> | ApiErrorResponse\n } catch {\n logger.error('[Response] Failed to parse JSON:', responseText.substring(0, 500))\n throw new NetworkError('Failed to parse server response', undefined)\n }\n logger.info('[Response Body]', JSON.stringify(data))\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 { request } from '../http/request'\nimport { HTTP } from '../constants'\nimport type {\n GetUploadURLParams,\n UploadURLResult,\n GetMultiPartUploadURLParams,\n MultiPartUploadURLResult,\n CompleteMultipartUploadParams,\n CompleteMultipartUploadResult,\n GetAccessURLParams,\n AccessURLResult,\n} from '../types/file'\n\nexport interface GetUploadURLApiParams extends GetUploadURLParams {\n token: string\n baseUrl?: string\n}\n\nexport async function getUploadURL(params: GetUploadURLApiParams): Promise<UploadURLResult> {\n const { token, baseUrl, ...body } = params\n return request<UploadURLResult>({\n token,\n baseUrl,\n method: 'POST',\n path: 'getUploadURL',\n body: {\n originFileName: body.originFileName,\n contentType: body.contentType,\n md5: body.md5,\n size: body.size,\n fullImage: body.fullImage,\n videoLength: body.videoLength,\n bestDomain: body.bestDomain,\n uploadId: body.uploadId,\n chunkNum: body.chunkNum,\n },\n timeout: HTTP.UPLOAD_TIMEOUT,\n })\n}\n\nexport interface GetMultiPartUploadURLApiParams extends GetMultiPartUploadURLParams {\n token: string\n baseUrl?: string\n}\n\nexport async function getMultiPartUploadURL(params: GetMultiPartUploadURLApiParams): Promise<MultiPartUploadURLResult> {\n const { token, baseUrl, ...body } = params\n return request<MultiPartUploadURLResult>({\n token,\n baseUrl,\n method: 'POST',\n path: 'getMultiPartUploadURL',\n body: {\n originFileName: body.originFileName,\n contentType: body.contentType,\n md5: body.md5,\n size: body.size,\n fullImage: body.fullImage,\n videoLength: body.videoLength,\n bestDomain: body.bestDomain,\n },\n timeout: HTTP.UPLOAD_TIMEOUT,\n })\n}\n\nexport interface CompleteMultipartUploadApiParams extends CompleteMultipartUploadParams {\n token: string\n baseUrl?: string\n}\n\nexport async function completeMultipartUpload(\n params: CompleteMultipartUploadApiParams\n): Promise<CompleteMultipartUploadResult> {\n const { token, baseUrl, ...body } = params\n return request<CompleteMultipartUploadResult>({\n token,\n baseUrl,\n method: 'POST',\n path: 'completeMultipartUpload',\n body: {\n originFileName: body.originFileName,\n md5: body.md5,\n UploadParts: body.UploadParts,\n },\n timeout: HTTP.UPLOAD_TIMEOUT,\n })\n}\n\nexport interface GetAccessURLApiParams extends GetAccessURLParams {\n token: string\n baseUrl?: string\n}\n\nexport async function getAccessURL(params: GetAccessURLApiParams): Promise<AccessURLResult> {\n const { token, baseUrl, ...queryParams } = params\n return request<AccessURLResult>({\n token,\n baseUrl,\n method: 'GET',\n path: 'getAccessURL',\n params: {\n firstId: queryParams.firstId,\n secondId: queryParams.secondId,\n sessionType: queryParams.sessionType,\n seqId: queryParams.seqId,\n fileId: queryParams.fileId,\n companyId: queryParams.companyId,\n 'x-oss-process': queryParams['x-oss-process'],\n printResult: queryParams.printResult ?? '1',\n },\n })\n}\n","/**\n * TODO: 浏览器兼容性改造\n * - MD5 计算: 使用 Web Crypto API (`crypto.subtle.digest('MD5', buffer)`) 或第三方库\n * - 文件输入: 支持 Blob/File/ArrayBuffer,内部转换为 Uint8Array\n * - Buffer 类型: 检测环境,Node.js 使用 Buffer,浏览器使用 Uint8Array\n */\nimport crypto from 'node:crypto'\nimport type {\n UploadFileOptions,\n UploadFileResult,\n UploadProgress,\n SendMediaOptions,\n SendMessageResult,\n SessionInfo,\n} from '../types'\nimport { getUploadURL, getMultiPartUploadURL, completeMultipartUpload, sendMessage } from './index'\nimport { UPLOAD, getChunkNum } from '../constants'\nimport { logger } from '../utils/logger'\n\n/**\n * 计算文件 MD5\n * @param buffer 文件 Buffer\n * @returns MD5 字符串\n */\nexport async function computeMD5(buffer: Buffer): Promise<string> {\n return crypto.createHash('md5').update(buffer).digest('hex')\n}\n\n/**\n * 上传文件到 OSS\n */\nasync function uploadToOSS(\n signedUrl: string,\n buffer: Buffer,\n contentType: string,\n callback: string,\n onProgress?: (progress: UploadProgress) => void\n): Promise<{ id: number; path: string; size: number }> {\n const startTime = Date.now()\n const total = buffer.length\n\n const response = await fetch(signedUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': contentType,\n 'X-Oss-Callback': callback,\n },\n body: buffer,\n })\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => '')\n logger.error(`OSS upload failed: ${response.status} ${response.statusText}`)\n logger.error(`OSS error body: ${errorBody}`)\n throw new Error(`OSS upload failed: ${response.status} - ${errorBody}`)\n }\n\n const responseText = await response.text()\n logger.info(`[uploadToOSS] OSS response status: ${response.status}`)\n logger.info(`[uploadToOSS] OSS response: ${responseText}`)\n\n let result: { id: number; path: string; size: number }\n\n try {\n const parsed = JSON.parse(responseText)\n result = {\n id: parsed.id || parsed.ID || 0,\n path: parsed.path || '',\n size: parsed.size || 0,\n }\n } catch {\n const idMatch = responseText.match(/<id>(\\d+)<\\/id>/i)\n const pathMatch = responseText.match(/<path>([^<]*)<\\/path>/i)\n const sizeMatch = responseText.match(/<size>(\\d+)<\\/size>/i)\n\n result = {\n id: idMatch?.[1] ? parseInt(idMatch[1], 10) : 0,\n path: pathMatch?.[1] || '',\n size: sizeMatch?.[1] ? parseInt(sizeMatch[1], 10) : 0,\n }\n }\n\n if (onProgress) {\n const seconds = Math.round((Date.now() - startTime) / 1000) || 1\n const speedPerSecond = formatSpeed(total / seconds)\n onProgress({\n percent: '100%',\n loaded: total,\n total,\n speedPerSecond,\n percentRate: 1,\n })\n }\n\n return result\n}\n\n/**\n * 格式化速度\n */\nfunction formatSpeed(bytesPerSecond: number): string {\n if (bytesPerSecond < 1024) {\n return `${bytesPerSecond.toFixed(0)}B/s`\n } else if (bytesPerSecond < 1024 * 1024) {\n return `${(bytesPerSecond / 1024).toFixed(2)}KB/s`\n } else {\n return `${(bytesPerSecond / 1024 / 1024).toFixed(2)}MB/s`\n }\n}\n\n/**\n * 上传单个文件(自动选择单文件或分片上传)\n */\nexport async function uploadFile(\n token: string,\n buffer: Buffer,\n options: UploadFileOptions,\n baseUrl?: string\n): Promise<UploadFileResult> {\n const { fileName, contentType, onProgress } = options\n const size = buffer.length\n const md5 = await computeMD5(buffer)\n\n logger.info(`[uploadFile] Starting upload: ${fileName}, size: ${size}, md5: ${md5}`)\n\n if (size < UPLOAD.MULTIPART_THRESHOLD) {\n return uploadSingleFile(token, buffer, fileName, contentType, md5, baseUrl, onProgress)\n } else {\n return uploadMultipartFile(token, buffer, fileName, contentType, md5, baseUrl, onProgress)\n }\n}\n\n/**\n * 单文件上传\n */\nasync function uploadSingleFile(\n token: string,\n buffer: Buffer,\n fileName: string,\n contentType: string,\n md5: string,\n baseUrl?: string,\n onProgress?: (progress: UploadProgress) => void\n): Promise<UploadFileResult> {\n const result = await getUploadURL({\n token,\n baseUrl,\n originFileName: fileName,\n contentType,\n md5,\n size: buffer.length,\n })\n\n if (result.id > 0 && !result.signedUrl) {\n logger.info(`[uploadFile] Instant upload (MD5 match): ${result.id}`)\n return { fileID: result.id, path: result.path, size: result.size }\n }\n\n const ossResult = await uploadToOSS(result.signedUrl, buffer, contentType, result.callback || '', onProgress)\n\n return { fileID: ossResult.id, path: ossResult.path, size: ossResult.size }\n}\n\n/**\n * 分片上传\n */\nasync function uploadMultipartFile(\n token: string,\n buffer: Buffer,\n fileName: string,\n contentType: string,\n md5: string,\n baseUrl?: string,\n onProgress?: (progress: UploadProgress) => void\n): Promise<UploadFileResult> {\n const size = buffer.length\n const chunkNum = getChunkNum(size)\n\n logger.info(`[uploadMultipartFile] Starting multipart upload: ${chunkNum} chunks`)\n\n const result = await getMultiPartUploadURL({\n token,\n baseUrl,\n originFileName: fileName,\n contentType,\n md5,\n size,\n })\n\n if (result.ID && result.ID > 0) {\n logger.info(`[uploadMultipartFile] Instant upload (MD5 match): ${result.ID}`)\n return { fileID: result.ID, path: result.path!, size: result.size }\n }\n\n const uploadParts: { partNumber: number; eTag: string }[] = []\n const chunkSize = Math.ceil(size / chunkNum)\n const startTime = Date.now()\n let totalUploaded = 0\n\n for (let i = 1; i <= chunkNum; i++) {\n const start = (i - 1) * chunkSize\n const end = Math.min(start + chunkSize, size)\n const chunk = buffer.subarray(start, end)\n const signedUrl = result.mapSignURLs[String(i)]\n\n if (!signedUrl) {\n throw new Error(`Missing signed URL for chunk ${i}`)\n }\n\n const resp = await fetch(signedUrl, {\n method: 'PUT',\n headers: { 'Content-Type': contentType },\n body: chunk,\n })\n\n if (!resp.ok) {\n throw new Error(`Chunk ${i} upload failed: ${resp.status}`)\n }\n\n const eTag = resp.headers.get('ETag') || ''\n uploadParts.push({ partNumber: i, eTag: JSON.parse(eTag) })\n\n totalUploaded += chunk.length\n\n if (onProgress) {\n const seconds = Math.round((Date.now() - startTime) / 1000) || 1\n const speedPerSecond = formatSpeed(totalUploaded / seconds)\n onProgress({\n percent: `${Math.round((totalUploaded / size) * 100)}%`,\n loaded: totalUploaded,\n total: size,\n speedPerSecond,\n percentRate: totalUploaded / size,\n })\n }\n }\n\n const complete = await completeMultipartUpload({\n token,\n baseUrl,\n originFileName: fileName,\n md5,\n UploadParts: uploadParts,\n })\n\n logger.info(`[uploadMultipartFile] Upload complete: ${complete.ID}`)\n\n return { fileID: complete.ID, path: complete.path, size }\n}\n\n/**\n * 发送媒体消息(上传并发送)\n */\nexport async function sendMediaMessage(\n token: string,\n sessionInfo: SessionInfo,\n options: SendMediaOptions,\n baseUrl?: string\n): Promise<SendMessageResult> {\n const { buffer, fileName, contentType, content, onProgress } = options\n\n const { fileID, path } = await uploadFile(token, buffer, { fileName, contentType, onProgress }, baseUrl)\n\n logger.info(`[sendMediaMessage] fileID=${fileID}, path=${path}`)\n\n return sendMessage({\n token,\n baseUrl,\n sessionInfo,\n msgContent: {\n content: content || '',\n extraInfo: {\n attechmentInfo: {\n fileID: String(fileID),\n fileName,\n filePath: path,\n fileSize: buffer.length,\n mimeType: contentType,\n },\n },\n },\n })\n}\n","import type { BotUpdate, GetUpdatesV2Result, 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 GetUpdatesV2Params {\n token: string\n baseUrl?: string\n timeout?: number\n limit?: number\n}\n\nexport async function getUpdatesV2(params: GetUpdatesV2Params): Promise<GetUpdatesV2Result> {\n const { token, baseUrl, timeout = API.DEFAULT_TIMEOUT, limit = API.DEFAULT_LIMIT } = params\n\n return request<GetUpdatesV2Result>({\n token,\n baseUrl,\n method: 'POST',\n path: 'getUpdatesV2',\n body: {\n timeout,\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 const hasContent = msgContent.content && msgContent.content.trim() !== ''\n const hasAttachment =\n msgContent.extraInfo?.attechmentInfo ||\n (msgContent.extraInfo?.attechmentInfos && msgContent.extraInfo.attechmentInfos.length > 0)\n\n if (!hasContent && !hasAttachment) {\n const { ValidationError } = await import('../types/error.js')\n throw new ValidationError('Message content or attachment is required', 'msgContent', msgContent)\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\nexport { getUploadURL, getMultiPartUploadURL, completeMultipartUpload, getAccessURL } from './file'\n\nexport type {\n GetUploadURLApiParams,\n GetMultiPartUploadURLApiParams,\n CompleteMultipartUploadApiParams,\n GetAccessURLApiParams,\n} from './file'\n\nexport { uploadFile, sendMediaMessage, computeMD5 } from './upload'\n","import type {\n BotUpdate,\n GetUpdatesV2Result,\n MeetBotConfig,\n PollingOptions,\n SessionInfo,\n MsgContent,\n SendMessageResult,\n GetUploadURLParams,\n UploadURLResult,\n GetMultiPartUploadURLParams,\n MultiPartUploadURLResult,\n CompleteMultipartUploadParams,\n CompleteMultipartUploadResult,\n GetAccessURLParams,\n GetAccessURLBySessionParams,\n AccessURLResult,\n UploadFileOptions,\n UploadFileResult,\n SendMediaOptions,\n QuoteMsgMap,\n} from './types'\nimport {\n getUpdates,\n getUpdatesV2,\n sendMessage,\n getUploadURL,\n getMultiPartUploadURL,\n completeMultipartUpload,\n getAccessURL,\n uploadFile,\n sendMediaMessage,\n} from './api'\nimport { MeetBotError } from './types/error'\nimport { DEFAULT_BASE_URL, POLLING } from './constants'\nimport { logger } from './utils/logger'\n\ntype EventHandler<T = unknown> = (data: T) => void\n\ninterface Events {\n message: { message: MsgContent; quoteMsgMap: QuoteMsgMap }\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 useV2: boolean\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 this.useV2 = config.useV2 ?? false\n logger.setLevel(config.logLevel ?? 'silent')\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 logger.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 logger.info(`开始长轮询消息... (条数: ${limit}, 超时: ${timeout}s, V2: ${this.useV2})`)\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 if (this.useV2) {\n const result = await getUpdatesV2({\n token: this.token,\n baseUrl: this.baseUrl,\n timeout,\n limit,\n })\n\n retryCount = 0\n\n for (const msgUpdate of result.msgs) {\n this.emit('message', { message: msgUpdate.message, quoteMsgMap: result.quoteMsgMap })\n this.offset = (msgUpdate.message.seqId || 0) + 1\n onOffsetUpdate?.(this.offset)\n }\n } else {\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', { message: update.message, quoteMsgMap: {} })\n this.offset = (update.message.seqId || 0) + 1\n onOffsetUpdate?.(this.offset)\n }\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 getUpdatesV2(options?: { timeout?: number; limit?: number }): Promise<GetUpdatesV2Result> {\n return getUpdatesV2({\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 /**\n * 获取单文件上传签名地址\n */\n async getUploadURL(params: Omit<GetUploadURLParams, 'fileType'>): Promise<UploadURLResult> {\n return getUploadURL({\n token: this.token,\n baseUrl: this.baseUrl,\n ...params,\n })\n }\n\n /**\n * 获取分片上传签名地址\n */\n async getMultiPartUploadURL(\n params: Omit<GetMultiPartUploadURLParams, 'fileType'>\n ): Promise<MultiPartUploadURLResult> {\n return getMultiPartUploadURL({\n token: this.token,\n baseUrl: this.baseUrl,\n ...params,\n })\n }\n\n /**\n * 完成分片上传\n */\n async completeMultipartUpload(params: CompleteMultipartUploadParams): Promise<CompleteMultipartUploadResult> {\n return completeMultipartUpload({\n token: this.token,\n baseUrl: this.baseUrl,\n ...params,\n })\n }\n\n /**\n * 获取文件下载地址\n */\n async getAccessURL(params: GetAccessURLParams | GetAccessURLBySessionParams): Promise<AccessURLResult> {\n const apiParams: GetAccessURLParams =\n 'sessionInfo' in params\n ? {\n firstId: params.sessionInfo.firstID,\n secondId: params.sessionInfo.secondID,\n sessionType: params.sessionInfo.sessionType,\n seqId: params.seqId,\n fileId: params.fileId,\n printResult: params.printResult,\n }\n : params\n\n return getAccessURL({\n token: this.token,\n baseUrl: this.baseUrl,\n ...apiParams,\n })\n }\n\n /**\n * 上传文件(自动选择单文件或分片上传)\n */\n async uploadFile(buffer: Buffer, options: UploadFileOptions): Promise<UploadFileResult> {\n return uploadFile(this.token, buffer, options, this.baseUrl)\n }\n\n /**\n * 发送媒体消息(上传并发送)\n */\n async sendMedia(sessionInfo: SessionInfo, options: SendMediaOptions): Promise<SendMessageResult> {\n return sendMediaMessage(this.token, sessionInfo, options, this.baseUrl)\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 {\n getUpdates,\n getUpdatesV2,\n sendMessage,\n getUploadURL,\n getMultiPartUploadURL,\n completeMultipartUpload,\n getAccessURL,\n uploadFile,\n sendMediaMessage,\n computeMD5,\n} from './api'\nexport * from './constants'\nexport type {\n BotUser,\n BotChat,\n BotFile,\n BotMsg,\n BotUpdate,\n BotMsgUpdate,\n QuoteMsgMap,\n GetUpdatesV2Result,\n ChatType,\n SessionInfo,\n SessionType,\n MsgContent,\n MsgType,\n ExtraInfo,\n AttachmentInfo,\n MeetBotConfig,\n GetUpdatesOptions,\n SendMessageOptions,\n SendMessageResult,\n PollingOptions,\n ErrorCode,\n ApiErrorResponse,\n ApiResponse,\n LogLevel,\n GetUploadURLParams,\n UploadURLResult,\n GetMultiPartUploadURLParams,\n MultiPartUploadURLResult,\n UploadPart,\n CompleteMultipartUploadParams,\n CompleteMultipartUploadResult,\n GetAccessURLParams,\n GetAccessURLBySessionParams,\n AccessURLResult,\n UploadProgress,\n UploadFileOptions,\n UploadFileResult,\n SendMediaOptions,\n ReceivedAttachmentInfo,\n} from './types'\nexport { MeetBotError, ApiError, NetworkError, TimeoutError, ValidationError } from './types/error'\n"]}
|