@meet-im/meet-bot-jssdk 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +230 -0
- package/dist/index.cjs +378 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +188 -0
- package/dist/index.d.ts +188 -0
- package/dist/index.js +370 -0
- package/dist/index.js.map +1 -0
- package/package.json +63 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 MeetIM
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# @meet/meet-bot-jssdk
|
|
2
|
+
|
|
3
|
+
MeetIM Chatbot JavaScript SDK - 支持 Long Polling 消息获取和消息发送
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @meet/meet-bot-jssdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 快速开始
|
|
12
|
+
|
|
13
|
+
### 类实例风格
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { MeetBot } from '@meet/meet-bot-jssdk'
|
|
17
|
+
|
|
18
|
+
const bot = new MeetBot({
|
|
19
|
+
token: 'bot_id:secret',
|
|
20
|
+
// baseUrl: 'https://staging-meet-api.miyachat.com', // 可选,默认值
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
bot.on('message', (msg) => {
|
|
24
|
+
console.log('收到消息:', msg.content)
|
|
25
|
+
|
|
26
|
+
if (msg.sessionInfo) {
|
|
27
|
+
bot.sendMessage(msg.sessionInfo, { content: `收到: ${msg.content}` })
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
bot.startPolling()
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 函数式风格
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { getUpdates, sendMessage } from '@meet/meet-bot-jssdk'
|
|
38
|
+
|
|
39
|
+
const token = 'bot_id:secret'
|
|
40
|
+
const baseUrl = 'https://staging-meet-api.miyachat.com'
|
|
41
|
+
|
|
42
|
+
const updates = await getUpdates({ token, baseUrl })
|
|
43
|
+
|
|
44
|
+
for (const update of updates) {
|
|
45
|
+
if (update.message?.sessionInfo) {
|
|
46
|
+
console.log('收到消息:', update.message.content)
|
|
47
|
+
|
|
48
|
+
await sendMessage({
|
|
49
|
+
token,
|
|
50
|
+
baseUrl,
|
|
51
|
+
sessionInfo: update.message.sessionInfo,
|
|
52
|
+
msgContent: { content: '收到!' },
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## API 文档
|
|
59
|
+
|
|
60
|
+
### MeetBot 类
|
|
61
|
+
|
|
62
|
+
#### 构造函数
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
new MeetBot(config: MeetBotConfig)
|
|
66
|
+
```
|
|
67
|
+
|
|
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
|
+
| pollingInterval | number | 否 | 轮询间隔(毫秒),默认 10000 |
|
|
76
|
+
|
|
77
|
+
\*token 或 (botId + botToken) 二选一
|
|
78
|
+
|
|
79
|
+
#### 方法
|
|
80
|
+
|
|
81
|
+
| 方法 | 说明 |
|
|
82
|
+
| -------------------------------------- | ------------ |
|
|
83
|
+
| `on(event, handler)` | 监听事件 |
|
|
84
|
+
| `off(event, handler)` | 移除事件监听 |
|
|
85
|
+
| `startPolling(options?)` | 启动长轮询 |
|
|
86
|
+
| `stopPolling()` | 停止轮询 |
|
|
87
|
+
| `isPolling()` | 获取轮询状态 |
|
|
88
|
+
| `getUpdates(options?)` | 手动获取消息 |
|
|
89
|
+
| `sendMessage(sessionInfo, msgContent)` | 发送消息 |
|
|
90
|
+
|
|
91
|
+
#### startPolling options
|
|
92
|
+
|
|
93
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
94
|
+
| ----------------- | ------------------------ | ------ | ------------------------- |
|
|
95
|
+
| getUpdatesTimeout | number | 0 | getUpdates 超时时间(秒) |
|
|
96
|
+
| limit | number | 100 | 每次拉取消息条数 |
|
|
97
|
+
| interval | number | 10000 | 轮询间隔(毫秒) |
|
|
98
|
+
| retryDelay | number | 1000 | 重试延迟基础时间(毫秒) |
|
|
99
|
+
| maxRetries | number | 3 | 最大重试次数 |
|
|
100
|
+
| onOffsetUpdate | (offset: number) => void | - | offset 更新回调 |
|
|
101
|
+
|
|
102
|
+
#### 事件
|
|
103
|
+
|
|
104
|
+
| 事件 | 参数 | 说明 |
|
|
105
|
+
| --------------- | ------------ | ---------- |
|
|
106
|
+
| `message` | `MsgContent` | 收到新消息 |
|
|
107
|
+
| `error` | `Error` | 发生错误 |
|
|
108
|
+
| `polling_start` | `void` | 轮询开始 |
|
|
109
|
+
| `polling_stop` | `void` | 轮询停止 |
|
|
110
|
+
|
|
111
|
+
### 函数式 API
|
|
112
|
+
|
|
113
|
+
#### getUpdates
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
getUpdates(params: GetUpdatesParams): Promise<BotUpdate[]>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
120
|
+
| ------- | ------ | ---- | ------ | ----------------------- |
|
|
121
|
+
| token | string | 是 | - | Bot Token |
|
|
122
|
+
| baseUrl | string | 否 | - | API 地址 |
|
|
123
|
+
| timeout | number | 否 | 0 | Long Polling 超时(秒) |
|
|
124
|
+
| offset | number | 否 | 0 | 从该 seqId 之后获取 |
|
|
125
|
+
| limit | number | 否 | 100 | 最大返回条数 |
|
|
126
|
+
|
|
127
|
+
#### sendMessage
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
sendMessage(params: SendMessageParams): Promise<SendMessageResult>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
134
|
+
| ----------- | ----------- | ---- | --------- |
|
|
135
|
+
| token | string | 是 | Bot Token |
|
|
136
|
+
| baseUrl | string | 否 | API 地址 |
|
|
137
|
+
| sessionInfo | SessionInfo | 是 | 会话信息 |
|
|
138
|
+
| msgContent | MsgContent | 是 | 消息内容 |
|
|
139
|
+
|
|
140
|
+
## 类型定义
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
type SessionType = 1 | 3 // 1: 私聊, 3: 群聊
|
|
144
|
+
|
|
145
|
+
interface SessionInfo {
|
|
146
|
+
firstID: number // 会话第一方 ID
|
|
147
|
+
secondID: number // 会话第二方 ID(私聊为用户ID,群聊为群ID)
|
|
148
|
+
sessionType: SessionType
|
|
149
|
+
companyID?: number
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
type MsgType = 'NORMAL' | 'RECALL' | 'QUOTE'
|
|
153
|
+
|
|
154
|
+
interface ExtraInfo {
|
|
155
|
+
msgType?: MsgType
|
|
156
|
+
[key: string]: unknown
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
interface MsgContent {
|
|
160
|
+
content: string // 消息文本内容
|
|
161
|
+
seqId?: number // 消息序列号
|
|
162
|
+
timestamp?: number // 时间戳(秒)
|
|
163
|
+
fromUid?: number // 发送者 UID
|
|
164
|
+
atIds?: number[] // @用户 ID 列表
|
|
165
|
+
extraInfo?: ExtraInfo // 额外信息
|
|
166
|
+
sessionInfo?: SessionInfo
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
interface BotUpdate {
|
|
170
|
+
message?: MsgContent
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
interface SendMessageResult {
|
|
174
|
+
msgContent: MsgContent
|
|
175
|
+
quoteMsg: unknown
|
|
176
|
+
userProfileMap: Record<number, unknown>
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## 错误处理
|
|
181
|
+
|
|
182
|
+
SDK 提供以下错误类型:
|
|
183
|
+
|
|
184
|
+
| 错误类 | 说明 |
|
|
185
|
+
| ----------------- | -------------- |
|
|
186
|
+
| `MeetBotError` | 基础错误类 |
|
|
187
|
+
| `ApiError` | API 返回的错误 |
|
|
188
|
+
| `NetworkError` | 网络连接错误 |
|
|
189
|
+
| `TimeoutError` | 请求超时错误 |
|
|
190
|
+
| `ValidationError` | 参数验证错误 |
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
import { ApiError, NetworkError } from '@meet/meet-bot-jssdk'
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
await bot.sendMessage(sessionInfo, { content: 'Hello' })
|
|
197
|
+
} catch (error) {
|
|
198
|
+
if (error instanceof ApiError) {
|
|
199
|
+
console.error('API 错误:', error.code, error.statusCode)
|
|
200
|
+
} else if (error instanceof NetworkError) {
|
|
201
|
+
console.error('网络错误:', error.message)
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## 开发
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# 安装依赖
|
|
210
|
+
pnpm install
|
|
211
|
+
|
|
212
|
+
# 构建
|
|
213
|
+
pnpm build
|
|
214
|
+
|
|
215
|
+
# 测试
|
|
216
|
+
pnpm test
|
|
217
|
+
|
|
218
|
+
# 类型检查
|
|
219
|
+
pnpm typecheck
|
|
220
|
+
|
|
221
|
+
# 代码格式化
|
|
222
|
+
pnpm format
|
|
223
|
+
|
|
224
|
+
# 代码检查
|
|
225
|
+
pnpm lint
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## License
|
|
229
|
+
|
|
230
|
+
MIT
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// @meet/meet-bot-jssdk - MeetIM Chatbot JavaScript SDK
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __esm = (fn, res) => function __init() {
|
|
7
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
8
|
+
};
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// src/types/error.ts
|
|
15
|
+
var error_exports = {};
|
|
16
|
+
__export(error_exports, {
|
|
17
|
+
ApiError: () => exports.ApiError,
|
|
18
|
+
MeetBotError: () => exports.MeetBotError,
|
|
19
|
+
NetworkError: () => exports.NetworkError,
|
|
20
|
+
TimeoutError: () => exports.TimeoutError,
|
|
21
|
+
ValidationError: () => exports.ValidationError
|
|
22
|
+
});
|
|
23
|
+
exports.MeetBotError = void 0; exports.ApiError = void 0; exports.NetworkError = void 0; exports.TimeoutError = void 0; exports.ValidationError = void 0;
|
|
24
|
+
var init_error = __esm({
|
|
25
|
+
"src/types/error.ts"() {
|
|
26
|
+
exports.MeetBotError = class extends Error {
|
|
27
|
+
code;
|
|
28
|
+
constructor(message, code) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = "MeetBotError";
|
|
31
|
+
this.code = code;
|
|
32
|
+
Error.captureStackTrace?.(this, this.constructor);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
exports.ApiError = class extends exports.MeetBotError {
|
|
36
|
+
statusCode;
|
|
37
|
+
retryAfter;
|
|
38
|
+
constructor(message, statusCode, code, retryAfter) {
|
|
39
|
+
super(message, code);
|
|
40
|
+
this.name = "ApiError";
|
|
41
|
+
this.statusCode = statusCode;
|
|
42
|
+
this.retryAfter = retryAfter;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
exports.NetworkError = class extends exports.MeetBotError {
|
|
46
|
+
cause;
|
|
47
|
+
constructor(message, cause) {
|
|
48
|
+
super(message, "NETWORK_ERROR");
|
|
49
|
+
this.name = "NetworkError";
|
|
50
|
+
this.cause = cause;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
exports.TimeoutError = class extends exports.MeetBotError {
|
|
54
|
+
constructor(message) {
|
|
55
|
+
super(message, "TIMEOUT_ERROR");
|
|
56
|
+
this.name = "TimeoutError";
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
exports.ValidationError = class extends exports.MeetBotError {
|
|
60
|
+
field;
|
|
61
|
+
value;
|
|
62
|
+
constructor(message, field, value) {
|
|
63
|
+
super(message, "VALIDATION_ERROR");
|
|
64
|
+
this.name = "ValidationError";
|
|
65
|
+
this.field = field;
|
|
66
|
+
this.value = value;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// src/types/index.ts
|
|
73
|
+
init_error();
|
|
74
|
+
|
|
75
|
+
// src/constants.ts
|
|
76
|
+
var DEFAULT_BASE_URL = "https://staging-meet-api.miyachat.com";
|
|
77
|
+
var POLLING = {
|
|
78
|
+
/** 每次拉取消息条数上限,默认 100 条 */
|
|
79
|
+
DEFAULT_LIMIT: 100,
|
|
80
|
+
/** 轮询间隔时间(毫秒),默认 10 秒 */
|
|
81
|
+
DEFAULT_INTERVAL: 10 * 1e3,
|
|
82
|
+
/** 重试延迟基础时间(毫秒),默认 1000ms */
|
|
83
|
+
DEFAULT_RETRY_DELAY: 1e3,
|
|
84
|
+
/** 重试延迟最大时间(毫秒),默认 30000ms */
|
|
85
|
+
MAX_RETRY_DELAY: 3e4,
|
|
86
|
+
/** 最大重试次数,默认 3 次 */
|
|
87
|
+
DEFAULT_MAX_RETRIES: 3
|
|
88
|
+
};
|
|
89
|
+
var HTTP = {
|
|
90
|
+
/** 请求超时时间(毫秒),默认 60000ms */
|
|
91
|
+
DEFAULT_TIMEOUT: 6e4,
|
|
92
|
+
/** 长轮询额外超时缓冲时间(毫秒),默认 10000ms */
|
|
93
|
+
POLLING_TIMEOUT_BUFFER: 1e4
|
|
94
|
+
};
|
|
95
|
+
var API = {
|
|
96
|
+
/** getUpdates 默认超时时间(秒),默认 0(立即返回) */
|
|
97
|
+
DEFAULT_TIMEOUT: 0,
|
|
98
|
+
/** getUpdates 默认拉取条数,默认 100 条 */
|
|
99
|
+
DEFAULT_LIMIT: 100
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// src/http/request.ts
|
|
103
|
+
function validateToken(token) {
|
|
104
|
+
if (!token || typeof token !== "string") {
|
|
105
|
+
throw new exports.NetworkError("Token is required", void 0);
|
|
106
|
+
}
|
|
107
|
+
if (!token.includes(":")) {
|
|
108
|
+
throw new exports.NetworkError('Invalid token format. Expected "bot_id:secret"', void 0);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function extractBotToken(token) {
|
|
112
|
+
const parts = token.split(":");
|
|
113
|
+
return parts.length >= 2 ? parts.slice(1).join(":") : token;
|
|
114
|
+
}
|
|
115
|
+
function buildUrl(baseUrl, path, params) {
|
|
116
|
+
const url = new URL(`/im/bot/${path}`, baseUrl);
|
|
117
|
+
if (params) {
|
|
118
|
+
for (const [key, value] of Object.entries(params)) {
|
|
119
|
+
if (value !== void 0) {
|
|
120
|
+
url.searchParams.append(key, String(value));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return url.toString();
|
|
125
|
+
}
|
|
126
|
+
async function request(options) {
|
|
127
|
+
const { token, baseUrl, method = "GET", path, params, body, timeout = HTTP.DEFAULT_TIMEOUT } = options;
|
|
128
|
+
validateToken(token);
|
|
129
|
+
const url = buildUrl(baseUrl || DEFAULT_BASE_URL, path, method === "GET" ? params : void 0);
|
|
130
|
+
const controller = new AbortController();
|
|
131
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
132
|
+
const headers = {
|
|
133
|
+
"Content-Type": "application/json",
|
|
134
|
+
Accept: "application/json",
|
|
135
|
+
Authorization: `Bot ${extractBotToken(token)}`
|
|
136
|
+
};
|
|
137
|
+
console.log("[Request]", method, url);
|
|
138
|
+
console.log("[Headers]", JSON.stringify(headers, null, 2));
|
|
139
|
+
if (body) {
|
|
140
|
+
console.log("[Body]", JSON.stringify(body, null, 2));
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
const response = await fetch(url, {
|
|
144
|
+
method,
|
|
145
|
+
headers,
|
|
146
|
+
body: body ? JSON.stringify(body) : void 0,
|
|
147
|
+
signal: controller.signal
|
|
148
|
+
});
|
|
149
|
+
clearTimeout(timeoutId);
|
|
150
|
+
const responseHeaders = {};
|
|
151
|
+
response.headers.forEach((value, key) => {
|
|
152
|
+
responseHeaders[key] = value;
|
|
153
|
+
});
|
|
154
|
+
console.log("[Response Status]", response.status);
|
|
155
|
+
console.log("[Response Headers]", JSON.stringify(responseHeaders, null, 2));
|
|
156
|
+
const data = await response.json();
|
|
157
|
+
console.log("[Response Body]", JSON.stringify(data, null, 2));
|
|
158
|
+
if (!response.ok || !data.ok) {
|
|
159
|
+
const errorData = data;
|
|
160
|
+
throw new exports.ApiError(
|
|
161
|
+
errorData.description || `HTTP ${response.status}`,
|
|
162
|
+
response.status,
|
|
163
|
+
mapStatusCodeToErrorCode(response.status),
|
|
164
|
+
errorData.retry_after
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
return data.result;
|
|
168
|
+
} catch (error) {
|
|
169
|
+
clearTimeout(timeoutId);
|
|
170
|
+
if (error instanceof exports.ApiError) {
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
if (error instanceof Error) {
|
|
174
|
+
if (error.name === "AbortError") {
|
|
175
|
+
throw new exports.TimeoutError(`Request timeout after ${timeout}ms`);
|
|
176
|
+
}
|
|
177
|
+
throw new exports.NetworkError(`Network error: ${error.message}`, error);
|
|
178
|
+
}
|
|
179
|
+
throw new exports.NetworkError("Unknown network error", void 0);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function mapStatusCodeToErrorCode(status) {
|
|
183
|
+
switch (status) {
|
|
184
|
+
case 401:
|
|
185
|
+
return "UNAUTHORIZED";
|
|
186
|
+
case 403:
|
|
187
|
+
return "UNAUTHORIZED";
|
|
188
|
+
case 404:
|
|
189
|
+
return "CHAT_NOT_FOUND";
|
|
190
|
+
case 429:
|
|
191
|
+
return "RATE_LIMIT";
|
|
192
|
+
case 500:
|
|
193
|
+
case 502:
|
|
194
|
+
case 503:
|
|
195
|
+
return "INTERNAL_ERROR";
|
|
196
|
+
default:
|
|
197
|
+
return "INTERNAL_ERROR";
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// src/api/index.ts
|
|
202
|
+
async function getUpdates(params) {
|
|
203
|
+
const { token, baseUrl, timeout = API.DEFAULT_TIMEOUT, offset, limit = API.DEFAULT_LIMIT } = params;
|
|
204
|
+
return request({
|
|
205
|
+
token,
|
|
206
|
+
baseUrl,
|
|
207
|
+
method: "POST",
|
|
208
|
+
path: "getUpdates",
|
|
209
|
+
body: {
|
|
210
|
+
timeout,
|
|
211
|
+
offset,
|
|
212
|
+
limit
|
|
213
|
+
},
|
|
214
|
+
timeout: (timeout || 0) * 1e3 + HTTP.POLLING_TIMEOUT_BUFFER
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
async function sendMessage(params) {
|
|
218
|
+
const { token, baseUrl, sessionInfo, msgContent } = params;
|
|
219
|
+
if (!msgContent.content || msgContent.content.trim() === "") {
|
|
220
|
+
const { ValidationError: ValidationError2 } = await Promise.resolve().then(() => (init_error(), error_exports));
|
|
221
|
+
throw new ValidationError2("Message text cannot be empty", "content", msgContent.content);
|
|
222
|
+
}
|
|
223
|
+
return request({
|
|
224
|
+
token,
|
|
225
|
+
baseUrl,
|
|
226
|
+
method: "POST",
|
|
227
|
+
path: "sendMessage",
|
|
228
|
+
body: {
|
|
229
|
+
sessionInfo,
|
|
230
|
+
msgContent
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// src/client.ts
|
|
236
|
+
init_error();
|
|
237
|
+
var MeetBot = class {
|
|
238
|
+
token;
|
|
239
|
+
baseUrl;
|
|
240
|
+
pollingLimit;
|
|
241
|
+
pollingInterval;
|
|
242
|
+
eventHandlers = /* @__PURE__ */ new Map();
|
|
243
|
+
polling = false;
|
|
244
|
+
offset = 0;
|
|
245
|
+
retryCount = 0;
|
|
246
|
+
abortController = null;
|
|
247
|
+
constructor(config) {
|
|
248
|
+
if (config.token) {
|
|
249
|
+
if (!config.token.includes(":")) {
|
|
250
|
+
throw new exports.MeetBotError('Invalid token format. Expected "bot_id:secret"', "INVALID_TOKEN");
|
|
251
|
+
}
|
|
252
|
+
this.token = config.token;
|
|
253
|
+
} else if (config.botId && config.botToken) {
|
|
254
|
+
this.token = `${config.botId}:${config.botToken}`;
|
|
255
|
+
} else {
|
|
256
|
+
throw new exports.MeetBotError("Token or (botId + botToken) is required", "INVALID_TOKEN");
|
|
257
|
+
}
|
|
258
|
+
this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;
|
|
259
|
+
this.pollingLimit = config.pollingLimit ?? POLLING.DEFAULT_LIMIT;
|
|
260
|
+
this.pollingInterval = config.pollingInterval ?? POLLING.DEFAULT_INTERVAL;
|
|
261
|
+
}
|
|
262
|
+
on(event, handler) {
|
|
263
|
+
if (!this.eventHandlers.has(event)) {
|
|
264
|
+
this.eventHandlers.set(event, /* @__PURE__ */ new Set());
|
|
265
|
+
}
|
|
266
|
+
this.eventHandlers.get(event).add(handler);
|
|
267
|
+
return this;
|
|
268
|
+
}
|
|
269
|
+
off(event, handler) {
|
|
270
|
+
const handlers = this.eventHandlers.get(event);
|
|
271
|
+
if (handlers) {
|
|
272
|
+
handlers.delete(handler);
|
|
273
|
+
}
|
|
274
|
+
return this;
|
|
275
|
+
}
|
|
276
|
+
emit(event, data) {
|
|
277
|
+
const handlers = this.eventHandlers.get(event);
|
|
278
|
+
if (handlers) {
|
|
279
|
+
for (const handler of handlers) {
|
|
280
|
+
try {
|
|
281
|
+
handler(data);
|
|
282
|
+
} catch (e) {
|
|
283
|
+
console.error(`Error in ${event} handler:`, e);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
isPolling() {
|
|
289
|
+
return this.polling;
|
|
290
|
+
}
|
|
291
|
+
async startPolling(options) {
|
|
292
|
+
if (this.polling) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
this.polling = true;
|
|
296
|
+
this.retryCount = 0;
|
|
297
|
+
this.abortController = new AbortController();
|
|
298
|
+
const limit = options?.limit ?? this.pollingLimit;
|
|
299
|
+
const interval = options?.interval ?? this.pollingInterval;
|
|
300
|
+
const getUpdatesTimeout = options?.getUpdatesTimeout ?? 0;
|
|
301
|
+
console.log(`\u5F00\u59CB\u8F6E\u8BE2\u6D88\u606F... (\u6761\u6570: ${limit}, \u95F4\u9694: ${interval}ms)`);
|
|
302
|
+
this.emit("polling_start", void 0);
|
|
303
|
+
const retryDelay = options?.retryDelay ?? POLLING.DEFAULT_RETRY_DELAY;
|
|
304
|
+
const maxRetries = options?.maxRetries ?? POLLING.DEFAULT_MAX_RETRIES;
|
|
305
|
+
const onOffsetUpdate = options?.onOffsetUpdate;
|
|
306
|
+
while (this.polling) {
|
|
307
|
+
try {
|
|
308
|
+
const updates = await getUpdates({
|
|
309
|
+
token: this.token,
|
|
310
|
+
baseUrl: this.baseUrl,
|
|
311
|
+
timeout: getUpdatesTimeout,
|
|
312
|
+
offset: this.offset,
|
|
313
|
+
limit
|
|
314
|
+
});
|
|
315
|
+
this.retryCount = 0;
|
|
316
|
+
for (const update of updates) {
|
|
317
|
+
if (update.message) {
|
|
318
|
+
this.emit("message", update.message);
|
|
319
|
+
this.offset = (update.message.seqId || 0) + 1;
|
|
320
|
+
onOffsetUpdate?.(this.offset);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (interval > 0) {
|
|
324
|
+
await this.sleep(interval);
|
|
325
|
+
}
|
|
326
|
+
} catch (error) {
|
|
327
|
+
if (!this.polling) break;
|
|
328
|
+
this.retryCount++;
|
|
329
|
+
this.emit("error", error instanceof Error ? error : new Error(String(error)));
|
|
330
|
+
if (this.retryCount >= maxRetries) {
|
|
331
|
+
this.stopPolling();
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
const delay = Math.min(retryDelay * Math.pow(2, this.retryCount - 1), POLLING.MAX_RETRY_DELAY);
|
|
335
|
+
await this.sleep(delay);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
stopPolling() {
|
|
340
|
+
this.polling = false;
|
|
341
|
+
if (this.abortController) {
|
|
342
|
+
this.abortController.abort();
|
|
343
|
+
this.abortController = null;
|
|
344
|
+
}
|
|
345
|
+
this.emit("polling_stop", void 0);
|
|
346
|
+
}
|
|
347
|
+
async getUpdates(options) {
|
|
348
|
+
return getUpdates({
|
|
349
|
+
token: this.token,
|
|
350
|
+
baseUrl: this.baseUrl,
|
|
351
|
+
...options
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
async sendMessage(sessionInfo, msgContent) {
|
|
355
|
+
return sendMessage({
|
|
356
|
+
token: this.token,
|
|
357
|
+
baseUrl: this.baseUrl,
|
|
358
|
+
sessionInfo,
|
|
359
|
+
msgContent
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
sleep(ms) {
|
|
363
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
// src/index.ts
|
|
368
|
+
init_error();
|
|
369
|
+
|
|
370
|
+
exports.API = API;
|
|
371
|
+
exports.DEFAULT_BASE_URL = DEFAULT_BASE_URL;
|
|
372
|
+
exports.HTTP = HTTP;
|
|
373
|
+
exports.MeetBot = MeetBot;
|
|
374
|
+
exports.POLLING = POLLING;
|
|
375
|
+
exports.getUpdates = getUpdates;
|
|
376
|
+
exports.sendMessage = sendMessage;
|
|
377
|
+
//# sourceMappingURL=index.cjs.map
|
|
378
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +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"]}
|