@lovrabet/sdk 1.1.7-beta.0 → 1.1.11-beta.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.
@@ -11,5 +11,5 @@ export declare class AuthManager implements IAuthManager {
11
11
  * Check if we're using cookie-based authentication
12
12
  */
13
13
  isCookieAuth(): boolean;
14
- setToken(token: string): void;
14
+ setToken(token: string, timestamp?: number): void;
15
15
  }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * OpenAPI 认证工具函数
3
+ *
4
+ * 包含认证相关的共享工具函数和常量
5
+ */
6
+ /**
7
+ * 默认的 Secret Access Key
8
+ * @internal
9
+ */
10
+ export declare const DEFAULT_SECRET_KEY = "sk-9Wc0wdYTNdEYXX1nFLcx0zPDU3wVNrSDroByjrgAbU4";
11
+ /**
12
+ * Token 有效期(毫秒)
13
+ */
14
+ export declare const TOKEN_VALIDITY_MS: number;
15
+ /**
16
+ * 生成 HMAC-SHA256 签名
17
+ *
18
+ * @param data 要签名的数据
19
+ * @param key 密钥
20
+ * @returns Base64 编码的签名
21
+ */
22
+ export declare function hmacSha256(data: string, key: string): Promise<string>;
23
+ /**
24
+ * 构建签名字符串
25
+ *
26
+ * @param params 参数对象
27
+ * @returns 按字母顺序排序的查询字符串
28
+ */
29
+ export declare function buildSignatureString(params: Record<string, string>): string;
30
+ /**
31
+ * 生成 OpenAPI Token
32
+ *
33
+ * @param params Token 生成参数
34
+ * @returns 生成的 token 字符串
35
+ */
36
+ export declare function generateToken(params: {
37
+ accessKey: string;
38
+ timestamp: number;
39
+ appCode: string;
40
+ datasetCode: string;
41
+ secretKey?: string;
42
+ }): Promise<string>;
43
+ /**
44
+ * 验证必需的参数
45
+ *
46
+ * @param params 参数对象
47
+ * @param required 必需的参数名列表
48
+ * @throws 当缺少必需参数时抛出错误
49
+ */
50
+ export declare function validateRequiredParams(params: Record<string, any>, required: string[]): void;
51
+ /**
52
+ * 计算 Token 过期时间
53
+ *
54
+ * @param timestamp Token 创建时间戳
55
+ * @returns 过期时间戳
56
+ */
57
+ export declare function calculateExpiresAt(timestamp: number): number;
58
+ /**
59
+ * 检查 Token 是否即将过期
60
+ *
61
+ * @param timestamp Token 的时间戳
62
+ * @param bufferMinutes 提前多少分钟认为过期(默认1分钟)
63
+ * @returns 是否即将过期
64
+ */
65
+ export declare function isTokenExpiring(timestamp: number, bufferMinutes?: number): boolean;
66
+ /**
67
+ * 计算 Token 剩余有效时间
68
+ *
69
+ * @param timestamp Token 的时间戳
70
+ * @returns 剩余有效时间(毫秒),如果已过期返回 0
71
+ */
72
+ export declare function getTokenRemainingTime(timestamp: number): number;
@@ -1,3 +1,4 @@
1
1
  export { AuthManager } from './auth-manager';
2
2
  export { OpenApiAuth } from './openapi-auth';
3
3
  export type { AuthHeaders, OpenApiAuthConfig } from '../types';
4
+ export { generateOpenApiToken, TokenGenerator, isTokenExpiring, getTokenRemainingTime, type GenerateTokenParams, type TokenResult } from './token-generator';
@@ -3,6 +3,4 @@ export declare class OpenApiAuth {
3
3
  private config;
4
4
  constructor(config: OpenApiAuthConfig);
5
5
  getAuthHeaders(appCode: string, datasetCode: string): Promise<AuthHeaders>;
6
- private generateToken;
7
- private hmacSha256;
8
6
  }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * OpenAPI Token 生成工具
3
+ *
4
+ * 为 Node.js 服务端提供 token 生成功能,用于:
5
+ * 1. 后端生成 token 和 timestamp 配对
6
+ * 2. 返回给前端使用,避免前端存储 accessKey
7
+ * 3. 保证 token 和 timestamp 的正确配对
8
+ */
9
+ import { isTokenExpiring as isTokenExpiringInternal, getTokenRemainingTime as getTokenRemainingTimeInternal } from './auth-utils';
10
+ /**
11
+ * Token 生成参数
12
+ */
13
+ export interface GenerateTokenParams {
14
+ /** 应用代码 */
15
+ appCode: string;
16
+ /** 数据集代码 */
17
+ datasetCode: string;
18
+ /** API 访问密钥 */
19
+ accessKey: string;
20
+ /** API 密钥(可选,有默认值) */
21
+ secretKey?: string;
22
+ /** 自定义时间戳(可选,默认为当前时间) */
23
+ timestamp?: number;
24
+ }
25
+ /**
26
+ * Token 生成结果
27
+ */
28
+ export interface TokenResult {
29
+ /** 生成的 token */
30
+ token: string;
31
+ /** 配对的时间戳 */
32
+ timestamp: number;
33
+ /** Token 过期时间(10分钟后) */
34
+ expiresAt: number;
35
+ }
36
+ /**
37
+ * 生成 OpenAPI 认证 Token
38
+ *
39
+ * @description
40
+ * 用于后端生成 token 和 timestamp 配对,返回给前端使用。
41
+ * Token 有效期为 10 分钟,由服务端验证。
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * // Node.js 后端代码
46
+ * import { generateOpenApiToken } from '@lovrabet/sdk';
47
+ *
48
+ * // 生成 token
49
+ * const result = await generateOpenApiToken({
50
+ * appCode: 'app-123',
51
+ * datasetCode: 'dataset-456',
52
+ * accessKey: process.env.ACCESS_KEY,
53
+ * secretKey: process.env.SECRET_KEY // 可选
54
+ * });
55
+ *
56
+ * // 返回给前端
57
+ * res.json({
58
+ * token: result.token,
59
+ * timestamp: result.timestamp,
60
+ * expiresAt: result.expiresAt
61
+ * });
62
+ * ```
63
+ *
64
+ * @param params Token 生成参数
65
+ * @returns Token 和配对的 timestamp
66
+ */
67
+ export declare function generateOpenApiToken(params: GenerateTokenParams): Promise<TokenResult>;
68
+ /**
69
+ * Token 生成器类(可选的面向对象接口)
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * const generator = new TokenGenerator({
74
+ * accessKey: 'ak-xxx',
75
+ * secretKey: 'sk-xxx'
76
+ * });
77
+ *
78
+ * const result = await generator.generate({
79
+ * appCode: 'app-123',
80
+ * datasetCode: 'dataset-456'
81
+ * });
82
+ * ```
83
+ */
84
+ export declare class TokenGenerator {
85
+ private accessKey;
86
+ private secretKey;
87
+ constructor(config: {
88
+ accessKey: string;
89
+ secretKey?: string;
90
+ });
91
+ /**
92
+ * 生成 Token
93
+ */
94
+ generate(params: {
95
+ appCode: string;
96
+ datasetCode: string;
97
+ timestamp?: number;
98
+ }): Promise<TokenResult>;
99
+ /**
100
+ * 批量生成 Token(为多个数据集生成 token)
101
+ */
102
+ generateBatch(params: {
103
+ appCode: string;
104
+ datasetCodes: string[];
105
+ timestamp?: number;
106
+ }): Promise<Map<string, TokenResult>>;
107
+ }
108
+ /**
109
+ * 验证 Token 是否即将过期
110
+ * @description 重新导出共享工具函数
111
+ */
112
+ export declare const isTokenExpiring: typeof isTokenExpiringInternal;
113
+ /**
114
+ * 计算 Token 剩余有效时间
115
+ * @description 重新导出共享工具函数
116
+ */
117
+ export declare const getTokenRemainingTime: typeof getTokenRemainingTimeInternal;
@@ -29,8 +29,11 @@ export declare class LovrabetClient implements ILovrabetClient {
29
29
  * 1. 用户登录后可能需要更新 token
30
30
  * 2. token 可能会过期需要刷新
31
31
  * 3. 支持动态认证切换(比如用户切换账号)
32
+ *
33
+ * @param token - 认证 token
34
+ * @param timestamp - 与 token 配对的时间戳(OpenAPI 模式必需)
32
35
  */
33
- setToken(token: string): void;
36
+ setToken(token: string, timestamp?: number): void;
34
37
  /**
35
38
  * 获取当前配置的副本
36
39
  * 为什么返回副本而不是原始对象:
@@ -98,6 +98,8 @@ export interface ClientConfig {
98
98
  env?: Environment;
99
99
  /** 用户 Token,用于 Bearer 认证 */
100
100
  token?: string;
101
+ /** 与 token 配对的时间戳(OpenAPI 模式必需) */
102
+ timestamp?: number;
101
103
  /** API 访问密钥,用于签名认证 */
102
104
  accessKey?: string;
103
105
  /** API 密钥,用于签名认证 */
@@ -259,7 +261,7 @@ export interface AuthHeaders {
259
261
  * OpenAPI 密钥认证配置
260
262
  * @description 用于签名认证方式,支持两种模式:
261
263
  * 1. Server 端:传入 accessKey,内部生成 token
262
- * 2. Client 端:直接传入预计算的 token
264
+ * 2. Client 端:直接传入预计算的 token 和对应的 timestamp
263
265
  */
264
266
  export interface OpenApiAuthConfig {
265
267
  /** API 访问密钥(Server 端使用) */
@@ -268,6 +270,8 @@ export interface OpenApiAuthConfig {
268
270
  secretKey?: string;
269
271
  /** 预计算的 token(Client 端使用,避免在浏览器暴露 accessKey) */
270
272
  token?: string;
273
+ /** 与 token 配对的时间戳(Client 端使用,必须与 token 一起使用) */
274
+ timestamp?: number;
271
275
  }
272
276
  /**
273
277
  * 认证管理器接口
@@ -300,8 +304,9 @@ export interface AuthManager {
300
304
  /**
301
305
  * 设置用户 Token
302
306
  * @param token 用户认证 Token
307
+ * @param timestamp 与 token 配对的时间戳(OpenAPI 模式必需)
303
308
  */
304
- setToken(token: string): void;
309
+ setToken(token: string, timestamp?: number): void;
305
310
  /**
306
311
  * 检查是否使用 Cookie 认证
307
312
  * @description 当没有 Token 和 API 密钥时,会降级到 Cookie 认证
@@ -347,9 +352,10 @@ export interface LovrabetClient {
347
352
  /**
348
353
  * 设置用户认证 Token
349
354
  * @param token 用户认证 Token
355
+ * @param timestamp 与 token 配对的时间戳(OpenAPI 模式必需)
350
356
  * @description 设置后所有 API 请求将使用此 Token 进行认证
351
357
  */
352
- setToken(token: string): void;
358
+ setToken(token: string, timestamp?: number): void;
353
359
  /**
354
360
  * 获取客户端配置
355
361
  * @returns 当前客户端的完整配置信息
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 浏览器环境检测工具
3
+ */
4
+ /**
5
+ * 检测是否在浏览器环境中运行
6
+ * @returns {boolean} 如果在浏览器环境中返回 true,否则返回 false
7
+ */
8
+ export declare function isBrowser(): boolean;
9
+ /**
10
+ * 在浏览器环境中使用 accessKey 时显示安全警告
11
+ * @param message - 自定义警告消息(可选)
12
+ */
13
+ export declare function warnBrowserAccessKey(message?: string): void;
@@ -0,0 +1,2 @@
1
+ export { LovrabetError, createErrorHandler } from "./errors";
2
+ export { isBrowser, warnBrowserAccessKey } from './browser-detection';
@@ -0,0 +1,17 @@
1
+ /**
2
+ * SDK 版本信息
3
+ * 此文件由构建脚本自动生成,请勿手动修改
4
+ * @generated
5
+ */
6
+ /** SDK 版本号 */
7
+ export declare const VERSION = "1.1.10";
8
+ /** SDK 包名 */
9
+ export declare const PACKAGE_NAME = "@lovrabet/sdk";
10
+ /** 获取完整的版本信息 */
11
+ export declare function getVersionInfo(): {
12
+ version: string;
13
+ package: string;
14
+ userAgent: string;
15
+ };
16
+ /** 默认导出版本号 */
17
+ export default VERSION;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lovrabet/sdk",
3
- "version": "1.1.7-beta.0",
3
+ "version": "1.1.11-beta.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -26,18 +26,22 @@
26
26
  "test:watch": "vitest watch",
27
27
  "types": "npx tsc --emitDeclarationOnly --declaration --outDir dist index.ts",
28
28
  "beta-release": "bun run build && sh scripts/update-beta-version.sh && git push && git push origin --tag && bun publish",
29
- "release": "bun run build && bun pm version patch && git push && git push origin --tag && bun publish"
29
+ "release": "bun run build && bun pm version patch && git push && git push origin --tag && bun publish",
30
+ "version:generate": "node scripts/generate-version.js",
31
+ "prebuild": "npm run version:generate",
32
+ "prebuild:dev": "npm run version:generate"
30
33
  },
31
34
  "files": [
32
35
  "dist"
33
36
  ],
34
37
  "devDependencies": {
35
38
  "@types/bun": "latest",
36
- "javascript-obfuscator": "^4.1.1",
37
- "chokidar-cli": "^3.0.0",
38
- "vitest": "^2.1.8",
39
+ "@vitest/coverage-v8": "^2.1.9",
39
40
  "@vitest/ui": "^2.1.8",
40
- "c8": "^10.1.2"
41
+ "c8": "^10.1.2",
42
+ "chokidar-cli": "^3.0.0",
43
+ "javascript-obfuscator": "^4.1.1",
44
+ "vitest": "^2.1.8"
41
45
  },
42
46
  "peerDependencies": {
43
47
  "typescript": "^5"