@lovrabet/sdk 1.1.12 → 1.1.13

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.
Files changed (4) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +312 -233
  3. package/dist/index.js +1 -1
  4. package/package.json +2 -1
package/README.md CHANGED
@@ -1,339 +1,418 @@
1
- # Lovrabet Node SDK
1
+ # Lovrabet SDK
2
2
 
3
- 一个现代化的 Lovrabet 数据平台 SDK,支持 TypeScript,提供优雅的 API 设计。
3
+ 强大且灵活的 Lovrabet 数据平台 SDK,支持多种认证模式,适用于 Node.js 和浏览器环境。
4
4
 
5
- ## 特性
5
+ ## 特性
6
6
 
7
- - 🚀 **现代化 API** - 基于 `createClient()` 的简洁设计
8
- - 🔒 **多种鉴权** - 支持用户 token、OpenAPI 等多种认证方式
9
- - 🌍 **环境切换** - 支持生产环境和日常环境
10
- - 📦 **TypeScript** - 完整的类型支持
11
- - 🔧 **配置文件** - 支持配置文件管理
7
+ - 🔐 **三种认证模式** - OpenAPI(服务端)、OpenAPI(浏览器)、WebAPI(Cookie)
8
+ - 🎯 **环境自适应** - 根据运行环境自动选择最佳认证方式
9
+ - 🔑 **Token 生成** - 内置 Token 生成器,支持批量生成
10
+ - 📦 **TypeScript** - 完整的类型定义和智能提示
11
+ - 🚀 **简洁 API** - 基于 `createClient()` 的现代化设计
12
+ - 🌍 **多环境支持** - 轻松切换生产、测试环境
12
13
  - 🔄 **向后兼容** - 保持对旧版 API 的兼容
13
- - ⚡ **动态实体** - 通过 Proxy 实现动态实体访问
14
14
 
15
- ## 快速开始
16
-
17
- ### 安装
15
+ ## 📦 安装
18
16
 
19
17
  ```bash
20
18
  npm install @lovrabet/sdk
19
+ # 或
20
+ bun add @lovrabet/sdk
21
21
  ```
22
22
 
23
- ### 基础用法
23
+ ## 🚀 快速开始
24
24
 
25
- #### 方式 1: 预注册配置(推荐)
25
+ ### 服务端使用(Node.js)
26
26
 
27
27
  ```typescript
28
- import { registerModels, createClient } from "@lovrabet/sdk";
28
+ import { createClient } from "@lovrabet/sdk";
29
29
 
30
- // 1. 注册模型配置
31
- registerModels({
30
+ // 使用 accessKey 认证(推荐)
31
+ const client = createClient({
32
32
  appCode: "your-app-code",
33
+ accessKey: process.env.LOVRABET_ACCESS_KEY,
33
34
  models: {
34
- Requirements: {
35
- tableName: "requirements",
36
- datasetCode: "your-dataset-code",
37
- },
38
- Projects: {
39
- tableName: "projects",
40
- datasetCode: "your-project-dataset-code",
35
+ users: {
36
+ tableName: "users",
37
+ datasetId: "your-dataset-id",
41
38
  },
42
39
  },
43
40
  });
44
41
 
45
- // 2. 创建客户端(无参数!)
46
- const client = createClient();
42
+ // CRUD 操作
43
+ const users = await client.models.users.getList();
44
+ const user = await client.models.users.getOne("user-id");
45
+ const newUser = await client.models.users.create({ name: "John" });
46
+ ```
47
47
 
48
- // 3. 使用模型
49
- const requirements = await client.models.Requirements.getList();
50
- const newReq = await client.models.Requirements.create({
51
- title: "New Requirement",
52
- });
48
+ ### 浏览器端使用
49
+
50
+ #### 方式 1:使用预生成 Token(推荐)
51
+
52
+ **服务端生成 Token:**
53
+
54
+ ```typescript
55
+ // app/api/token/route.ts (Next.js)
56
+ import { generateOpenApiToken } from "@lovrabet/sdk";
57
+
58
+ export async function GET() {
59
+ const result = await generateOpenApiToken({
60
+ appCode: process.env.LOVRABET_APP_CODE!,
61
+ datasetCode: process.env.DATASET_ID!,
62
+ accessKey: process.env.LOVRABET_ACCESS_KEY!,
63
+ });
64
+
65
+ return Response.json(result);
66
+ }
53
67
  ```
54
68
 
55
- #### 方式 2: 直接传配置
69
+ **浏览器使用 Token:**
56
70
 
57
71
  ```typescript
58
72
  import { createClient } from "@lovrabet/sdk";
59
73
 
74
+ // 获取 token
75
+ const { token, timestamp } = await fetch('/api/token').then(r => r.json());
76
+
60
77
  // 创建客户端
61
78
  const client = createClient({
62
79
  appCode: "your-app-code",
63
- env: "online",
64
-
80
+ token: token,
81
+ timestamp: timestamp,
65
82
  models: {
66
- Requirements: {
67
- tableName: "requirements",
68
- datasetCode: "your-dataset-code",
83
+ users: {
84
+ tableName: "users",
85
+ datasetId: "your-dataset-id",
69
86
  },
70
87
  },
71
88
  });
72
89
 
73
- // 使用模型
74
- const requirements = await client.models.Requirements.getList();
75
- const newReq = await client.models.Requirements.create({
76
- title: "New Requirement",
77
- });
90
+ // 使用
91
+ const users = await client.models.users.getList();
78
92
  ```
79
93
 
80
- ### 多环境配置
94
+ #### 方式 2:使用 Cookie(已登录用户)
81
95
 
82
96
  ```typescript
83
- import {
84
- registerModels,
85
- createClient,
86
- CONFIG_NAMES,
87
- ENVIRONMENTS,
88
- } from "@lovrabet/sdk";
97
+ import { createClient } from "@lovrabet/sdk";
89
98
 
90
- // 注册生产环境配置
91
- registerModels(
92
- {
93
- appCode: "app-prod-123",
94
- env: ENVIRONMENTS.ONLINE,
95
- models: {
96
- Requirements: {
97
- tableName: "requirements",
98
- datasetCode: "prod-dataset-code",
99
- },
100
- },
101
- },
102
- CONFIG_NAMES.PROD
103
- );
104
-
105
- // 注册开发环境配置
106
- registerModels(
107
- {
108
- appCode: "app-dev-123",
109
- env: ENVIRONMENTS.DAILY,
110
- models: {
111
- Requirements: {
112
- tableName: "requirements",
113
- datasetCode: "dev-dataset-code",
114
- },
99
+ // 不提供认证信息,自动使用 Cookie
100
+ const client = createClient({
101
+ appCode: "your-app-code",
102
+ models: {
103
+ users: {
104
+ tableName: "users",
105
+ datasetId: "your-dataset-id",
115
106
  },
116
107
  },
117
- CONFIG_NAMES.DEV
118
- );
108
+ });
119
109
 
120
- // 创建不同环境的客户端
121
- const prodClient = createClient(CONFIG_NAMES.PROD);
122
- const devClient = createClient(CONFIG_NAMES.DEV);
110
+ // 请求会自动带上 Cookie
111
+ const users = await client.models.users.getList();
123
112
  ```
124
113
 
125
- ### 配置文件支持
114
+ ## 🔑 Token 管理
126
115
 
127
- 创建 `lovrabet.config.js`:
116
+ ### 生成单个 Token
128
117
 
129
- ```javascript
130
- const { registerModels } = require("@lovrabet/sdk");
118
+ ```typescript
119
+ import { generateOpenApiToken } from "@lovrabet/sdk";
131
120
 
132
- const config = {
121
+ const result = await generateOpenApiToken({
122
+ appCode: "your-app-code",
123
+ datasetCode: "your-dataset-id",
124
+ accessKey: process.env.LOVRABET_ACCESS_KEY!,
125
+ });
126
+
127
+ console.log(result.token); // 生成的 token
128
+ console.log(result.timestamp); // 时间戳
129
+ console.log(result.expiresAt); // 过期时间
130
+ ```
131
+
132
+ ### 批量生成 Token
133
+
134
+ ```typescript
135
+ import { TokenGenerator } from "@lovrabet/sdk";
136
+
137
+ const generator = new TokenGenerator(process.env.LOVRABET_ACCESS_KEY!);
138
+
139
+ const tokens = await generator.generateBatch({
140
+ appCode: "your-app-code",
141
+ datasets: [
142
+ { name: "users", code: "dataset-001" },
143
+ { name: "posts", code: "dataset-002" },
144
+ ],
145
+ });
146
+
147
+ // 使用生成的 tokens
148
+ console.log(tokens.users.token);
149
+ console.log(tokens.posts.token);
150
+ ```
151
+
152
+ ### Token 有效期管理
153
+
154
+ ```typescript
155
+ import { isTokenExpiring, getTokenRemainingTime } from "@lovrabet/sdk";
156
+
157
+ // 检查 token 是否即将过期
158
+ if (isTokenExpiring(timestamp)) {
159
+ // 刷新 token
160
+ const newToken = await fetchNewToken();
161
+ client.setToken(newToken.token, newToken.timestamp);
162
+ }
163
+
164
+ // 获取剩余时间
165
+ const remaining = getTokenRemainingTime(timestamp);
166
+ console.log(`Token 剩余 ${remaining / 1000} 秒`);
167
+ ```
168
+
169
+ ## 🔧 高级用法
170
+
171
+ ### 预注册配置
172
+
173
+ ```typescript
174
+ import { registerModels, createClient } from "@lovrabet/sdk";
175
+
176
+ // 注册配置
177
+ registerModels({
133
178
  appCode: "your-app-code",
134
- env: "online",
135
179
  models: {
136
- Requirements: {
137
- tableName: "requirements",
138
- datasetCode: "your-dataset-code",
139
- },
180
+ users: { tableName: "users", datasetId: "ds-001" },
181
+ posts: { tableName: "posts", datasetId: "ds-002" },
140
182
  },
141
- };
183
+ });
142
184
 
143
- // 注册配置
144
- registerModels(config);
185
+ // 创建客户端(无参数)
186
+ const client = createClient();
145
187
 
146
- module.exports = config;
188
+ // 使用
189
+ const users = await client.models.users.getList();
147
190
  ```
148
191
 
149
- 使用配置文件:
192
+ ### 多环境管理
150
193
 
151
194
  ```typescript
152
- // 引入配置文件(自动注册)
153
- require("./lovrabet.config.js");
195
+ import { registerModels, createClient } from "@lovrabet/sdk";
154
196
 
197
+ // 注册不同环境的配置
198
+ registerModels({
199
+ appCode: "prod-app",
200
+ models: { /* ... */ },
201
+ }, "prod");
202
+
203
+ registerModels({
204
+ appCode: "dev-app",
205
+ models: { /* ... */ },
206
+ }, "dev");
207
+
208
+ // 创建不同环境的客户端
209
+ const prodClient = createClient("prod");
210
+ const devClient = createClient("dev");
211
+ ```
212
+
213
+ ### 动态更新 Token
214
+
215
+ ```typescript
155
216
  // 创建客户端
156
- const client = createClient();
217
+ const client = createClient({
218
+ appCode: "your-app-code",
219
+ models: { /* ... */ },
220
+ });
221
+
222
+ // 后续更新 token
223
+ client.setToken(newToken, newTimestamp);
224
+
225
+ // 切换环境
226
+ client.switchEnv("daily");
157
227
  ```
158
228
 
159
- ## API 文档
229
+ ## 📖 API 文档
160
230
 
161
- ### 创建客户端
231
+ ### 主要导出
162
232
 
163
233
  ```typescript
164
- import { createClient, ClientConfig } from '@lovrabet/sdk';
165
-
166
- const config: ClientConfig = {
167
- // 必需
168
- appCode: string;
169
-
170
- // 可选
171
- serverUrl?: string; // 自定义服务器地址
172
- env?: 'online' | 'daily'; // 环境,默认 'online'
173
-
174
- // 鉴权方式(选择其一或组合使用)
175
- token?: string; // 用户 token
176
- accessKey?: string; // OpenAPI access key
177
- secretKey?: string; // OpenAPI secret key
178
- requiresAuth?: boolean; // 是否必须鉴权
179
-
180
- // 模型配置
181
- models?: Record<string, {
182
- tableName: string;
183
- datasetCode: string;
184
- }>;
185
-
186
- // 其他选项
187
- options?: {
188
- timeout?: number; // 请求超时时间
189
- retryCount?: number; // 重试次数
190
- onError?: (error: any) => void; // 错误回调
191
- onRedirectToLogin?: () => void; // 登录重定向回调
192
- };
193
- };
234
+ import {
235
+ // 客户端
236
+ createClient,
237
+
238
+ // Token 生成
239
+ generateOpenApiToken,
240
+ TokenGenerator,
241
+ isTokenExpiring,
242
+ getTokenRemainingTime,
243
+
244
+ // 配置管理
245
+ registerModels,
246
+ getRegisteredModels,
247
+ getRegisteredConfigNames,
248
+ unregisterModels,
249
+ clearAllRegistrations,
250
+
251
+ // 环境配置
252
+ getApiEndpoint,
253
+ getAvailableEnvironments,
254
+
255
+ // 错误处理
256
+ LovrabetError,
257
+
258
+ // TypeScript 类型
259
+ type ClientConfig,
260
+ type TokenResult,
261
+ type ListResponse,
262
+ type ListParams,
263
+ } from "@lovrabet/sdk";
194
264
  ```
195
265
 
196
- ### 模型操作
266
+ ### 客户端配置
267
+
268
+ ```typescript
269
+ interface ClientConfig {
270
+ appCode?: string; // 应用代码
271
+ accessKey?: string; // OpenAPI 密钥(服务端)
272
+ secretKey?: string; // 密钥(可选)
273
+ token?: string; // 预生成 token(浏览器)
274
+ timestamp?: number; // token 时间戳
275
+ env?: 'online' | 'daily'; // 环境
276
+ models?: ModelsConfig; // 模型配置
277
+ }
278
+ ```
197
279
 
198
- 每个模型支持标准的 CRUD 操作:
280
+ ### CRUD 操作
199
281
 
200
282
  ```typescript
201
283
  // 查询列表
202
- await client.models.ModelName.getList({
203
- currentPage?: number;
204
- pageSize?: number;
205
- [key: string]: any;
284
+ const response = await client.models.users.getList({
285
+ currentPage: 1,
286
+ pageSize: 20,
287
+ // 其他查询参数
206
288
  });
207
289
 
208
- // 获取单条
209
- await client.models.ModelName.getOne(id: string | number);
290
+ // 获取单条记录
291
+ const user = await client.models.users.getOne("user-id");
210
292
 
211
293
  // 创建
212
- await client.models.ModelName.create(data: Record<string, any>);
294
+ const newUser = await client.models.users.create({
295
+ name: "John Doe",
296
+ email: "john@example.com",
297
+ });
213
298
 
214
299
  // 更新
215
- await client.models.ModelName.update(id: string | number, data: Record<string, any>);
300
+ const updated = await client.models.users.update("user-id", {
301
+ name: "Jane Doe",
302
+ });
216
303
 
217
304
  // 删除
218
- await client.models.ModelName.delete(id: string | number);
305
+ await client.models.users.delete("user-id");
306
+ ```
307
+
308
+ ## 🛡️ 安全最佳实践
219
309
 
220
- // 批量创建
221
- await client.models.ModelName.bulkCreate(data: Record<string, any>[]);
310
+ ### ❌ 错误做法
311
+
312
+ ```typescript
313
+ // 绝不要在客户端代码中硬编码 accessKey
314
+ const client = createClient({
315
+ accessKey: "sk_live_xxx", // 危险!会暴露密钥
316
+ });
222
317
  ```
223
318
 
224
- ### 客户端方法
319
+ ### ✅ 正确做法
320
+
321
+ **服务端:**
225
322
 
226
323
  ```typescript
227
- // 设置新 token
228
- client.setToken(token: string);
324
+ // 使用环境变量存储敏感信息
325
+ const client = createClient({
326
+ accessKey: process.env.LOVRABET_ACCESS_KEY,
327
+ });
328
+ ```
229
329
 
230
- // 获取配置
231
- client.getConfig(): ClientConfig;
330
+ **客户端:**
232
331
 
233
- // 测试连接
234
- await client.testConnection(): Promise<boolean>;
332
+ ```typescript
333
+ // 使用服务端生成的 token
334
+ const { token } = await fetch('/api/token').then(r => r.json());
335
+ const client = createClient({ token });
336
+ ```
235
337
 
236
- // 设置环境
237
- client.setEnvironment(env: 'online' | 'daily');
338
+ ## 🎯 选择正确的认证模式
238
339
 
239
- // 获取当前环境
240
- client.getEnvironment(): 'online' | 'daily';
340
+ | 环境 | 认证方式 | 使用场景 |
341
+ |------|---------|---------|
342
+ | **Node.js 服务端** | `accessKey` | SSR、API 路由、后端服务 |
343
+ | **浏览器(未登录)** | `token` | 公开数据访问、匿名用户 |
344
+ | **浏览器(已登录)** | Cookie | 已认证用户、私有数据 |
241
345
 
242
- // 获取所有可用模型
243
- client.getAvailableModels(): string[];
346
+ ## 📚 文档
244
347
 
245
- // 动态获取模型
246
- client.getModel(modelName: string): ModelInstance;
247
- ```
348
+ - **[文档中心](./docs/README.md)** - 完整的文档导航
349
+ - **[OpenAPI 完整指南](./docs/openapi-guide.md)** - OpenAPI 实现原理和使用案例 ⭐
350
+ - [使用指南](./docs/usage-guide.md) - 详细的使用文档和示例
351
+ - [API 参考](./docs/api-reference.md) - 完整的 API 文档
352
+ - [架构分析](./docs/architecture-analysis.md) - SDK 内部架构说明
248
353
 
249
- ## 错误处理
354
+ ## 📝 What's New
250
355
 
251
- ```typescript
252
- import { createClient, LovrabetError } from "@lovrabet/sdk";
253
-
254
- try {
255
- const data = await client.models.Requirements.getList();
256
- } catch (error) {
257
- if (error instanceof LovrabetError) {
258
- console.log("Status:", error.status);
259
- console.log("Code:", error.code);
260
- console.log("Message:", error.message);
261
- console.log("Data:", error.data);
262
-
263
- // 根据错误类型处理
264
- if (error.status === 401) {
265
- console.log("需要重新登录");
266
- // 跳转到登录页
267
- } else if (error.status === 403) {
268
- console.log("权限不足");
269
- }
270
- }
271
- }
356
+ ### v1.1.11 (2025-10-09)
272
357
 
273
- // 使用全局错误处理
274
- const client = createClient({
275
- // ... 其他配置
276
- options: {
277
- onError: (error) => {
278
- console.error("Lovrabet SDK Error:", error.message);
279
- // 全局错误处理逻辑
280
- },
281
- onRedirectToLogin: () => {
282
- console.log("跳转到登录页");
283
- // window.location.href = '/login';
284
- },
285
- },
286
- });
287
- ```
358
+ **新增功能 (New Features):**
288
359
 
289
- ## 文档
360
+ - ✨ **后端 Token 生成器** - 新增 `generateOpenApiToken()` 函数,支持服务端生成 Token
361
+ ```typescript
362
+ import { generateOpenApiToken } from "@lovrabet/sdk";
290
363
 
291
- - [使用指南](./docs/usage-guide.md) - 详细的使用文档和最佳实践
292
- - [架构设计](./docs/new-sdk-design.md) - SDK 的架构设计说明
293
- - [迁移指南](./docs/usage-guide.md#迁移指南) - 从旧版本迁移的指南
364
+ const { token, timestamp } = await generateOpenApiToken({
365
+ appCode: "your-app",
366
+ datasetCode: "ds-001",
367
+ accessKey: process.env.ACCESS_KEY,
368
+ });
369
+ ```
294
370
 
295
- ## 快速参考
371
+ ---
296
372
 
297
- ### 常用常量
373
+ ### v1.1.8 (2025-09-30)
298
374
 
299
- ```typescript
300
- import {
301
- ENVIRONMENTS, // 环境常量
302
- CONFIG_NAMES, // 配置名称常量
303
- DEFAULTS, // 默认值常量
304
- } from "@lovrabet/sdk";
375
+ **新增功能 (New Features):**
305
376
 
306
- // 环境常量
307
- ENVIRONMENTS.ONLINE; // 'online'
308
- ENVIRONMENTS.DAILY; // 'daily'
377
+ - 🛡️ **浏览器安全警告** - 新增浏览器环境 accessKey 使用安全警告机制
378
+ - 在浏览器中使用 accessKey 会触发明确的错误提示
379
+ - 引导开发者使用正确的 Token 认证方式
309
380
 
310
- // 配置名称常量
311
- CONFIG_NAMES.DEFAULT; // 'default'
312
- CONFIG_NAMES.PROD; // 'prod'
313
- CONFIG_NAMES.DEV; // 'dev'
381
+ **改进 (Improvements):**
314
382
 
315
- // 默认值
316
- DEFAULTS.TIMEOUT; // 10000
317
- DEFAULTS.RETRY_COUNT; // 3
318
- ```
383
+ - 📚 **文档优化** - 修正浏览器安全警告中的文档链接地址
319
384
 
320
- ### 工具函数
385
+ ---
321
386
 
322
- ```typescript
323
- import {
324
- getRegisteredConfigNames, // 获取所有已注册的配置名称
325
- getRegisteredModels, // 获取指定配置的模型信息
326
- } from "@lovrabet/sdk";
327
387
 
328
- // 查看所有已注册的配置
329
- const configNames = getRegisteredConfigNames();
330
- console.log("已注册的配置:", configNames);
388
+ ### v1.1.5 (2025-09-27)
331
389
 
332
- // 获取特定配置的详细信息
333
- const config = getRegisteredModels("default");
334
- console.log("默认配置:", config);
335
- ```
390
+ **重大变更 (Breaking Changes):**
391
+
392
+ - 🔴 **统一认证架构** - 重构认证系统,实现 OpenAPI 双模式支持(AccessKey + Token)
393
+
394
+ **新增功能 (New Features):**
395
+
396
+ - ✨ **OpenAPI 双模式** - 支持服务端 AccessKey 和浏览器 Token 两种认证方式
397
+ - 🔑 **Token 管理工具** - 新增 Token 生命周期管理相关工具函数
398
+
399
+ ---
400
+
401
+
402
+ ## 🤝 反馈
403
+
404
+ 如遇到问题或有功能建议,欢迎提交 Issue!
405
+
406
+ ## 📄 许可证
407
+
408
+ **专有软件(Proprietary)** - 详见 [LICENSE](./LICENSE) 文件
336
409
 
337
- ## 支持
410
+ SDK 为 Lovrabet 开放平台的专有组件:
411
+ - ✅ **允许使用** - 可以安装并在项目中集成本 SDK
412
+ - ✅ **应用分发** - 可以分发包含本 SDK 的应用程序
413
+ - ✅ **商业使用** - 可用于个人和商业项目
414
+ - ❌ **不得修改** - 不得修改、反编译或逆向工程
415
+ - ❌ **不得单独分发** - 不得单独复制或分发本 SDK
416
+ - ❌ **源代码不公开** - 本 SDK 为闭源软件
338
417
 
339
- 如有问题或建议,请提交 Issue。
418
+ 如需商业授权或有疑问,请访问 [lovrabet.com](https://www.lovrabet.com)