@seaverse/data-sdk 0.1.6 → 0.1.8
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 +128 -70
- package/dist/index.cjs +223 -96
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +53 -59
- package/dist/index.js +223 -96
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -47,13 +47,16 @@ npm install @seaverse/data-sdk
|
|
|
47
47
|
|
|
48
48
|
#### 方式 A:函数式 API(推荐 - 零配置)
|
|
49
49
|
|
|
50
|
-
**适合 SeaVerse 平台应用** - SDK 自动从 localStorage 获取配置,无需手动初始化
|
|
50
|
+
**适合 SeaVerse 平台应用** - SDK 自动从 localStorage/环境变量/PostMessage 获取配置,无需手动初始化
|
|
51
51
|
|
|
52
52
|
```typescript
|
|
53
53
|
import { query, create, update, deleteData } from '@seaverse/data-sdk';
|
|
54
54
|
|
|
55
55
|
// 直接使用,无需初始化!
|
|
56
|
-
// SDK
|
|
56
|
+
// SDK 自动从以下来源获取配置(按优先级):
|
|
57
|
+
// - localStorage.app_id 和 localStorage.auth_token
|
|
58
|
+
// - 环境变量 APP_ID 和 API_SERVICE_TOKEN
|
|
59
|
+
// - PostMessage 从父页面获取(iframe 场景)
|
|
57
60
|
|
|
58
61
|
// 查询数据
|
|
59
62
|
const notes = await query({
|
|
@@ -83,11 +86,21 @@ await deleteData('note-id-123');
|
|
|
83
86
|
```typescript
|
|
84
87
|
import { initData, query } from '@seaverse/data-sdk';
|
|
85
88
|
|
|
86
|
-
//
|
|
89
|
+
// 方式1: 完全自动获取(零配置)
|
|
90
|
+
await initData();
|
|
91
|
+
// appId 和 token 都会自动获取
|
|
92
|
+
|
|
93
|
+
// 方式2: 只提供 appId
|
|
94
|
+
await initData({
|
|
95
|
+
appId: 'my-app-123', // 显式提供
|
|
96
|
+
// token 会自动获取
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// 方式3: 完全显式提供
|
|
87
100
|
await initData({
|
|
88
|
-
appId: 'my-app-123',
|
|
89
|
-
token: 'user-jwt-token',
|
|
90
|
-
debug: true,
|
|
101
|
+
appId: 'my-app-123',
|
|
102
|
+
token: 'user-jwt-token',
|
|
103
|
+
debug: true,
|
|
91
104
|
});
|
|
92
105
|
|
|
93
106
|
// 然后直接使用
|
|
@@ -101,20 +114,30 @@ const notes = await query({ table: 'notes' });
|
|
|
101
114
|
```typescript
|
|
102
115
|
import { DataClient } from '@seaverse/data-sdk';
|
|
103
116
|
|
|
104
|
-
// 方式1:
|
|
117
|
+
// 方式1: 使用静态工厂方法(支持自动获取配置)
|
|
118
|
+
const client = await DataClient.create();
|
|
119
|
+
// appId 和 token 都会自动获取
|
|
120
|
+
|
|
121
|
+
// 方式2: 部分配置 + 自动获取
|
|
122
|
+
const client = await DataClient.create({
|
|
123
|
+
appId: 'my-app-123', // 显式提供 appId
|
|
124
|
+
// token 会自动获取
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// 方式3: 显式提供所有配置(传统方式)
|
|
105
128
|
const client = new DataClient({
|
|
106
129
|
appId: 'my-app-123',
|
|
107
130
|
token: 'user-jwt-token',
|
|
108
131
|
});
|
|
109
132
|
|
|
110
|
-
// 方式
|
|
133
|
+
// 方式4: 指定环境
|
|
111
134
|
const client = new DataClient({
|
|
112
135
|
appId: 'my-app-123',
|
|
113
136
|
token: 'user-jwt-token',
|
|
114
137
|
environment: 'production', // 'production' | 'staging' | 'development' | 'local'
|
|
115
138
|
});
|
|
116
139
|
|
|
117
|
-
// 方式
|
|
140
|
+
// 方式5: 完全自定义
|
|
118
141
|
const client = new DataClient({
|
|
119
142
|
appId: 'my-app-123',
|
|
120
143
|
token: 'user-jwt-token',
|
|
@@ -129,8 +152,8 @@ const notes = await client.query({ table: 'notes' });
|
|
|
129
152
|
|
|
130
153
|
| 参数 | 类型 | 必需 | 说明 |
|
|
131
154
|
|-----|------|------|------|
|
|
132
|
-
| `appId` | string | ⬜️ | 应用ID
|
|
133
|
-
| `token` | string | ⬜️ | 用户JWT token
|
|
155
|
+
| `appId` | string | ⬜️ | 应用ID,未提供则自动获取(localStorage/环境变量/PostMessage) |
|
|
156
|
+
| `token` | string | ⬜️ | 用户JWT token,未提供则自动获取(localStorage/环境变量/PostMessage) |
|
|
134
157
|
| `baseURL` | string | ⬜️ | 自定义API地址,优先级最高 |
|
|
135
158
|
| `environment` | Environment | ⬜️ | 环境类型,当未提供baseURL时使用 |
|
|
136
159
|
| `timeout` | number | ⬜️ | 请求超时时间(毫秒),默认10000 |
|
|
@@ -139,20 +162,24 @@ const notes = await client.query({ table: 'notes' });
|
|
|
139
162
|
|
|
140
163
|
### 配置自动获取规则
|
|
141
164
|
|
|
142
|
-
**Token
|
|
165
|
+
**Token 自动获取:**
|
|
143
166
|
SDK 会按照以下优先级自动获取 token(与 seacloud-sdk 保持一致):
|
|
144
|
-
1. 显式传入的 `token`
|
|
167
|
+
1. 显式传入的 `token` 参数(最高优先级)
|
|
145
168
|
2. `localStorage.getItem('auth_token')` - **标准 key,与 seacloud-sdk 一致**
|
|
146
|
-
3. `
|
|
147
|
-
4.
|
|
148
|
-
5. PostMessage 从父窗口获取(iframe 场景)
|
|
169
|
+
3. 环境变量 `process.env.API_SERVICE_TOKEN`
|
|
170
|
+
4. PostMessage 从父窗口获取(iframe 场景,使用 `seaverse:get_token` 协议)
|
|
149
171
|
|
|
150
|
-
|
|
172
|
+
**AppId 自动获取:**
|
|
173
|
+
SDK 会按照以下优先级自动获取 appId:
|
|
174
|
+
1. 显式传入的 `appId` 参数(最高优先级)
|
|
175
|
+
2. `localStorage.getItem('app_id')` - **标准 key**
|
|
176
|
+
3. 环境变量 `process.env.APP_ID`
|
|
177
|
+
4. PostMessage 从父窗口获取(iframe 场景,使用 `seaverse:get_appid` 协议)
|
|
151
178
|
|
|
152
|
-
|
|
153
|
-
`
|
|
154
|
-
-
|
|
155
|
-
-
|
|
179
|
+
> 💡 **最佳实践**:
|
|
180
|
+
> - 使用 `@seaverse/auth-sdk` 进行登录,token 会自动存储到 `localStorage.auth_token`
|
|
181
|
+
> - 将 appId 存储到 `localStorage.app_id`
|
|
182
|
+
> - data-sdk 会自动读取这两个配置,实现零配置使用
|
|
156
183
|
|
|
157
184
|
## API 文档
|
|
158
185
|
|
|
@@ -297,9 +324,7 @@ try {
|
|
|
297
324
|
|
|
298
325
|
### 与 auth-sdk 集成(推荐)
|
|
299
326
|
|
|
300
|
-
data-sdk
|
|
301
|
-
|
|
302
|
-
#### 方式 A:通过 localStorage(浏览器环境)
|
|
327
|
+
data-sdk 通过 localStorage 与 auth-sdk 无缝集成(与 seacloud-sdk 保持一致):
|
|
303
328
|
|
|
304
329
|
```typescript
|
|
305
330
|
import { SeaVerseBackendAPIClient } from '@seaverse/auth-sdk';
|
|
@@ -315,7 +340,7 @@ const loginResult = await authClient.login({
|
|
|
315
340
|
password: 'password',
|
|
316
341
|
});
|
|
317
342
|
|
|
318
|
-
// 2. 存储 token 到 localStorage
|
|
343
|
+
// 2. 存储 token 到 localStorage(标准 key)
|
|
319
344
|
localStorage.setItem('auth_token', loginResult.token);
|
|
320
345
|
|
|
321
346
|
// 3. 初始化 data-sdk(自动从 localStorage 读取 token)
|
|
@@ -328,35 +353,11 @@ await initData({
|
|
|
328
353
|
const notes = await query({ table: 'notes' });
|
|
329
354
|
```
|
|
330
355
|
|
|
331
|
-
#### 方式 B:直接调用 auth-sdk API(服务端/Node.js 环境)
|
|
332
|
-
|
|
333
|
-
```typescript
|
|
334
|
-
import { SeaVerseBackendAPIClient } from '@seaverse/auth-sdk';
|
|
335
|
-
import { initData, query } from '@seaverse/data-sdk';
|
|
336
|
-
|
|
337
|
-
// 1. 创建 auth-sdk client
|
|
338
|
-
const authClient = new SeaVerseBackendAPIClient({
|
|
339
|
-
appId: 'my-app-123',
|
|
340
|
-
environment: 'production',
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
// 2. 🔥 直接传入 authClient,data-sdk 会调用 getApiServiceToken()
|
|
344
|
-
await initData({
|
|
345
|
-
appId: 'my-app-123',
|
|
346
|
-
authClient, // data-sdk 会自动调用 authClient.getApiServiceToken()
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
// 3. 使用 data-sdk
|
|
350
|
-
const notes = await query({ table: 'notes' });
|
|
351
|
-
```
|
|
352
|
-
|
|
353
356
|
**Token 获取优先级:**
|
|
354
357
|
1. 显式传入的 `token` 参数(最高优先级)
|
|
355
|
-
2.
|
|
356
|
-
3. `
|
|
357
|
-
4. `
|
|
358
|
-
5. 环境变量 `process.env.DATA_SDK_TOKEN`
|
|
359
|
-
6. PostMessage 从父窗口获取(iframe 场景)
|
|
358
|
+
2. `localStorage.getItem('auth_token')`
|
|
359
|
+
3. 环境变量 `process.env.API_SERVICE_TOKEN`
|
|
360
|
+
4. PostMessage 从父窗口获取(iframe 场景,使用 `seaverse:get_token` 协议)
|
|
360
361
|
|
|
361
362
|
### 无缝接入场景
|
|
362
363
|
|
|
@@ -397,18 +398,43 @@ function App() {
|
|
|
397
398
|
```typescript
|
|
398
399
|
// 监听来自 iframe 的配置请求
|
|
399
400
|
window.addEventListener('message', (event) => {
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
401
|
+
// 处理 token 请求
|
|
402
|
+
if (event.data.type === 'seaverse:get_token') {
|
|
403
|
+
const token = localStorage.getItem('auth_token');
|
|
404
|
+
|
|
405
|
+
if (token) {
|
|
406
|
+
event.source.postMessage({
|
|
407
|
+
type: 'seaverse:token',
|
|
408
|
+
payload: {
|
|
409
|
+
accessToken: token,
|
|
410
|
+
expiresIn: 3600
|
|
411
|
+
}
|
|
412
|
+
}, '*');
|
|
413
|
+
} else {
|
|
414
|
+
event.source.postMessage({
|
|
415
|
+
type: 'seaverse:error',
|
|
416
|
+
error: 'Token not found'
|
|
417
|
+
}, '*');
|
|
418
|
+
}
|
|
405
419
|
}
|
|
406
420
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
421
|
+
// 处理 appId 请求
|
|
422
|
+
if (event.data.type === 'seaverse:get_appid') {
|
|
423
|
+
const appId = localStorage.getItem('app_id');
|
|
424
|
+
|
|
425
|
+
if (appId) {
|
|
426
|
+
event.source.postMessage({
|
|
427
|
+
type: 'seaverse:appid',
|
|
428
|
+
payload: {
|
|
429
|
+
appId: appId
|
|
430
|
+
}
|
|
431
|
+
}, '*');
|
|
432
|
+
} else {
|
|
433
|
+
event.source.postMessage({
|
|
434
|
+
type: 'seaverse:error',
|
|
435
|
+
error: 'AppId not found'
|
|
436
|
+
}, '*');
|
|
437
|
+
}
|
|
412
438
|
}
|
|
413
439
|
});
|
|
414
440
|
```
|
|
@@ -418,10 +444,18 @@ window.addEventListener('message', (event) => {
|
|
|
418
444
|
```typescript
|
|
419
445
|
import { query } from '@seaverse/data-sdk';
|
|
420
446
|
|
|
421
|
-
// 直接使用,SDK 会自动通过 PostMessage
|
|
447
|
+
// 直接使用,SDK 会自动通过 PostMessage 从父页面获取 appId 和 token
|
|
422
448
|
const notes = await query({ table: 'notes' });
|
|
423
449
|
```
|
|
424
450
|
|
|
451
|
+
**PostMessage 协议说明:**
|
|
452
|
+
|
|
453
|
+
| 协议 | 请求 type | 响应 type | 响应 payload |
|
|
454
|
+
|------|----------|----------|-------------|
|
|
455
|
+
| Token | `seaverse:get_token` | `seaverse:token` | `{ accessToken: string, expiresIn: number }` |
|
|
456
|
+
| AppId | `seaverse:get_appid` | `seaverse:appid` | `{ appId: string }` |
|
|
457
|
+
| 错误 | - | `seaverse:error` | `{ error: string }` |
|
|
458
|
+
|
|
425
459
|
#### 服务端渲染(SSR/SSG)
|
|
426
460
|
|
|
427
461
|
```typescript
|
|
@@ -429,8 +463,8 @@ import { query } from '@seaverse/data-sdk';
|
|
|
429
463
|
|
|
430
464
|
// 通过环境变量提供配置
|
|
431
465
|
// .env 文件:
|
|
432
|
-
//
|
|
433
|
-
//
|
|
466
|
+
// API_SERVICE_TOKEN=your-jwt-token
|
|
467
|
+
// APP_ID=your-app-id
|
|
434
468
|
|
|
435
469
|
export async function getServerSideProps() {
|
|
436
470
|
// SDK 自动从环境变量读取配置
|
|
@@ -579,14 +613,38 @@ psql -h <host> -U postgres -d <database> -f init/init-schema.sql
|
|
|
579
613
|
|
|
580
614
|
## 版本历史
|
|
581
615
|
|
|
616
|
+
### v0.1.8 (2026-01-15)
|
|
617
|
+
|
|
618
|
+
**🎉 AppId 自动获取功能**
|
|
619
|
+
|
|
620
|
+
- ✅ **AppId 自动获取**:支持从 localStorage/环境变量/PostMessage 自动获取 appId
|
|
621
|
+
- ✅ **PostMessage 协议扩展**:新增 `seaverse:get_appid` / `seaverse:appid` 协议
|
|
622
|
+
- ✅ **零配置使用**:`initData()` 和 `DataClient.create()` 现在可以不传任何参数
|
|
623
|
+
- ✅ **优先级统一**:appId 和 token 采用相同的获取优先级
|
|
624
|
+
- ✅ **环境变量支持**:新增 `APP_ID` 环境变量支持
|
|
625
|
+
|
|
626
|
+
**AppId 获取优先级:**
|
|
627
|
+
1. 显式传入的 `appId` 参数
|
|
628
|
+
2. `localStorage.app_id`
|
|
629
|
+
3. 环境变量 `APP_ID`
|
|
630
|
+
4. PostMessage 从父页面获取
|
|
631
|
+
|
|
632
|
+
### v0.1.7 (2026-01-15)
|
|
633
|
+
|
|
634
|
+
**🔧 完全采用 seacloud-sdk 的 Token 获取逻辑**
|
|
635
|
+
|
|
636
|
+
- ✅ **移除 authClient 参数**:简化 API,不再支持直接传入 auth-sdk client
|
|
637
|
+
- ✅ **统一 Token 获取方式**:完全采用 seacloud-sdk 的实现
|
|
638
|
+
- ✅ **PostMessage 协议统一**:使用 `seaverse:get_token` / `seaverse:token` 协议(与 seacloud-sdk 一致)
|
|
639
|
+
- ✅ **环境变量更新**:使用 `API_SERVICE_TOKEN` 而非 `DATA_SDK_TOKEN`
|
|
640
|
+
- ✅ **优先级调整**:token → localStorage.auth_token → env → PostMessage
|
|
641
|
+
|
|
582
642
|
### v0.1.6 (2026-01-14)
|
|
583
643
|
|
|
584
|
-
**🎉 支持直接调用 auth-sdk API
|
|
644
|
+
**🎉 支持直接调用 auth-sdk API**(已在 v0.1.7 移除)
|
|
585
645
|
|
|
586
|
-
-
|
|
587
|
-
- ✅
|
|
588
|
-
- ✅ **灵活的集成方式**:支持 localStorage(浏览器)和 API 调用(服务端)两种方式
|
|
589
|
-
- ✅ **完整示例**:新增 `examples/auth-sdk-integration.ts` 演示各种集成场景
|
|
646
|
+
- ❌ ~~新增 authClient 参数~~(v0.1.7 已移除)
|
|
647
|
+
- ✅ 完整示例:新增 `examples/auth-sdk-integration.ts` 演示各种集成场景
|
|
590
648
|
|
|
591
649
|
### v0.1.5 (2026-01-14)
|
|
592
650
|
|