@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 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 自动从 localStorage.auth_token 和 localStorage.app_id 获取配置
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', // 可选,未提供则从 localStorage 读取
89
- token: 'user-jwt-token', // 可选,未提供则从 localStorage 读取
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: SeaVerse 平台应用(自动检测环境)
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
- // 方式2: 指定环境
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
- // 方式3: 完全自定义
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,未提供则从 localStorage/环境变量获取 |
133
- | `token` | string | ⬜️ | 用户JWT token,未提供则从 localStorage/环境变量获取 |
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. `localStorage.getItem('token')` - auth-sdk 备选 key
147
- 4. 环境变量 `process.env.DATA_SDK_TOKEN`
148
- 5. PostMessage 从父窗口获取(iframe 场景)
169
+ 3. 环境变量 `process.env.API_SERVICE_TOKEN`
170
+ 4. PostMessage 从父窗口获取(iframe 场景,使用 `seaverse:get_token` 协议)
149
171
 
150
- > 💡 **最佳实践**:使用 `@seaverse/auth-sdk` 进行登录,token 会自动存储到 `localStorage.auth_token`,data-sdk 会自动读取。
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
- **AppId 必须明确提供:**
153
- `appId` 必须由用户在初始化时明确提供,不会自动获取:
154
- - 通过 `initData({ appId: 'xxx' })` 提供
155
- - 或通过 `new DataClient({ appId: 'xxx' })` 提供
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 提供两种方式与 auth-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(与 seacloud-sdk 保持一致)
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. 传入的 `authClient`(调用 `getApiServiceToken()`)
356
- 3. `localStorage.getItem('auth_token')`
357
- 4. `localStorage.getItem('token')`
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
- if (event.data.type === 'DATA_SDK_TOKEN_REQUEST') {
401
- event.source.postMessage({
402
- type: 'DATA_SDK_TOKEN_RESPONSE',
403
- token: localStorage.getItem('auth_token'),
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
- if (event.data.type === 'DATA_SDK_APP_ID_REQUEST') {
408
- event.source.postMessage({
409
- type: 'DATA_SDK_APP_ID_RESPONSE',
410
- appId: localStorage.getItem('app_id'),
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
- // DATA_SDK_TOKEN=your-jwt-token
433
- // DATA_SDK_APP_ID=your-app-id
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
- - **新增 authClient 参数**:`initData({ authClient })` 直接调用 `authClient.getApiServiceToken()`
587
- - ✅ **适合服务端场景**:Node.js/Lambda 函数可直接通过 auth-sdk 获取 token
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