@realsee/vr-signals
Version:
vr 信号器
387 lines (300 loc) • 9.68 kB
Markdown
# 版本兼容性指南
## 概述
本文档说明 `@realsee/vr-signals` 1.x 和 2.x 版本之间的兼容性问题和解决方案。
## 问题描述
当 Remote 端使用 2.0 版本,Client 端使用 1.0 版本时,可能会出现通信异常。
**✅ 最新状态(2.0.0-beta.7+)**:已经内置了兼容性修复,2.0 Remote 默认兼容 1.0 Client。
## 兼容性问题原因(已修复)
### 1. 安全配置差异
2.0 版本引入了安全验证机制,虽然默认配置是兼容的,但某些场景下可能需要显式配置:
```typescript
// 2.0 默认配置(兼容 1.x)
{
strictMode: false, // 禁用严格模式
validateOrigin: false, // 禁用来源验证
validateSignature: false, // 禁用签名验证
}
```
### 2. 消息格式差异
2.0 版本可能对消息格式进行了优化,需要确保向后兼容。
### 3. API 差异
- 1.x 版本:使用 `callAction()` 和 `subscribe.on()`
- 2.x 版本:推荐使用 `send()` 和直接的 `on()`(但仍支持旧 API)
## 已实现的修复
### 修复 1:消息验证宽松模式
2.0.0-beta.7+ 版本中,MessageBridge 在非严格模式下不会拒绝验证失败的消息,只会记录警告日志。这确保了 1.x Client 的消息能够被正确处理。
### 修复 2:默认兼容配置
2.0 版本的默认安全配置已经设置为兼容 1.x:
```typescript
{
strictMode: false, // 禁用严格模式
validateOrigin: false, // 禁用来源验证
validateSignature: false // 禁用签名验证
}
```
### 修复 3:ActionMap 访问兼容
MessageBridge 的 `executeRequest` 方法支持三层回退:
1. 优先使用 `handleActionRequest()` 方法(2.0 的 ActionRegistry)
2. 回退到 `_actionManager`(2.0 的 StandardActionManager)
3. 最后回退到 `_actionMap`(1.0 的方式)
### 修复 4:初始化时序优化
Remote 类在调用 `super()` 后立即初始化 `actionRegistry` 并注册 actionMap,确保握手时所有 actions 已就绪。
## 解决方案
### 方案 1:使用默认配置(推荐)
**从 2.0.0-beta.7 开始,不需要特殊配置!** 默认配置已经兼容 1.x Client:
```typescript
import { RealseeVRSignalsRemote } from '@realsee/vr-signals'
const remote = new RealseeVRSignalsRemote({
logLevel: 'INFO',
actionMap: {
setState(data) {
console.log('State update:', data)
return { success: true }
}
}
})
// 默认配置已经兼容 1.x Client,无需额外配置!
```
### 方案 2:显式使用兼容配置(明确意图)
如果你想明确表示兼容意图,可以显式使用兼容配置:
```typescript
import { RealseeVRSignalsRemote, getV1CompatibilityConfig } from '@realsee/vr-signals'
const remote = new RealseeVRSignalsRemote({
logLevel: 'INFO',
// 显式使用 1.x 兼容配置(实际上与默认配置相同)
security: getV1CompatibilityConfig(),
actionMap: {
setState(data) {
console.log('State update:', data)
return { success: true }
}
}
})
```
### 方案 3:使用自动兼容配置
```typescript
import { RealseeVRSignalsRemote, getAutoCompatibilityConfig } from '@realsee/vr-signals'
const remote = new RealseeVRSignalsRemote({
logLevel: 'INFO',
// 自动检测并配置兼容性
security: getAutoCompatibilityConfig(),
actionMap: {
setState(data) {
console.log('State update:', data)
return { success: true }
}
}
})
```
### 方案 4:手动配置完全兼容模式
```typescript
import { RealseeVRSignalsRemote } from '@realsee/vr-signals'
const remote = new RealseeVRSignalsRemote({
logLevel: 'INFO',
// 手动配置完全兼容 1.x 版本(与默认配置相同)
security: {
strictMode: false,
validateOrigin: false,
validateSignature: false,
allowedOrigins: ['*'],
allowWildcardDomains: true
},
actionMap: {
setState(data) {
console.log('State update:', data)
return { success: true }
}
}
})
```
### 方案 5:2.x Client + 2.x Remote(高安全模式)
如果你的 Client 和 Remote 都是 2.x 版本,可以启用更高的安全配置:
```typescript
import { RealseeVRSignalsRemote, getV2DefaultConfig } from '@realsee/vr-signals'
const remote = new RealseeVRSignalsRemote({
logLevel: 'INFO',
// 使用 2.x 默认配置,启用更多安全特性
security: getV2DefaultConfig('my-secret-key'),
actionMap: {
setState(data) {
console.log('State update:', data)
return { success: true }
}
}
})
```
## 兼容性测试
### 测试场景 1:1.0 Client + 2.0 Remote
```typescript
// 1.0 Client 端代码(保持不变)
const client = new RealseeVRSignalsClient({
vrLink: 'http://localhost:3000/vr-app',
element: iframeElement
})
// 使用 1.x API
client.callAction('setState', { mode: 'editing' })
client.subscribe.on('cameraUpdate', (data) => {
console.log('Camera update:', data)
})
```
```typescript
// 2.0 Remote 端代码(默认配置已兼容)
import { RealseeVRSignalsRemote } from '@realsee/vr-signals'
const remote = new RealseeVRSignalsRemote({
logLevel: 'INFO',
// ⭐ 无需特殊配置,默认已兼容 1.x Client
actionMap: {
setState(data) {
console.log('Received from 1.x client:', data)
return { success: true }
}
}
})
// 或者显式使用兼容配置(可选)
import { getV1CompatibilityConfig } from '@realsee/vr-signals'
const remoteWithExplicitConfig = new RealseeVRSignalsRemote({
logLevel: 'INFO',
security: getV1CompatibilityConfig(),
actionMap: { /* ... */ }
})
```
### 测试场景 2:2.0 Client + 2.0 Remote
```typescript
// 2.0 Client 端代码
const client = new RealseeVRSignalsClient({
vrLink: 'http://localhost:3000/vr-app',
element: iframeElement,
logLevel: 'INFO'
})
// 使用 2.x API
await client.send('setState', { mode: 'panorama' })
client.on('cameraUpdate', (data) => {
console.log('Camera update:', data)
})
```
```typescript
// 2.0 Remote 端代码
const remote = new RealseeVRSignalsRemote({
logLevel: 'INFO',
// 可以使用更严格的安全配置
security: {
strictMode: true,
validateOrigin: true,
validateSignature: false
},
actionMap: {
setState(data) {
console.log('Received from 2.x client:', data)
return { success: true }
}
}
})
```
## 调试方法
### 1. 启用详细日志
```typescript
const remote = new RealseeVRSignalsRemote({
logLevel: 'DEBUG', // 或 'INFO'
security: getV1CompatibilityConfig()
})
```
### 2. 检查消息传递
在浏览器控制台中监听 postMessage 事件:
```javascript
window.addEventListener('message', (event) => {
console.log('Received message:', event.data)
})
```
### 3. 验证安全配置
```typescript
const remote = new RealseeVRSignalsRemote({
logLevel: 'INFO',
security: getV1CompatibilityConfig()
})
// 获取当前配置
const options = remote.getOptions()
console.log('Security config:', options.security)
```
## 常见错误和解决方法
### 错误 1:消息被拒绝
**症状**:控制台显示 "Message rejected" 或类似错误
**原因**:安全验证配置过于严格
**解决方法**:
```typescript
const remote = new RealseeVRSignalsRemote({
security: {
strictMode: false, // 禁用严格模式
validateOrigin: false, // 禁用来源验证
validateSignature: false // 禁用签名验证
}
})
```
### 错误 2:握手失败
**症状**:连接一直处于 "connecting" 状态
**原因**:握手消息格式不兼容或超时
**解决方法**:
```typescript
const remote = new RealseeVRSignalsRemote({
shakehandRetryTimes: 20, // 增加重试次数
handshakeRetryStrategy: {
baseDelay: 500,
maxDelay: 5000,
jitterRange: [0.85, 1.15]
}
})
```
### 错误 3:Action 调用失败
**症状**:调用 action 时返回错误或无响应
**原因**:Action 名称或参数格式不匹配
**解决方法**:
```typescript
const remote = new RealseeVRSignalsRemote({
logLevel: 'DEBUG', // 启用调试日志
actionMap: {
setState(data) {
console.log('Received data:', data)
console.log('Data type:', typeof data)
return { success: true }
}
}
})
```
## 迁移建议
### 从 1.x 迁移到 2.x
1. **渐进式迁移**:先升级 Remote 端,保持兼容配置
2. **测试验证**:确保与现有 1.x Client 正常通信
3. **逐步升级**:逐步升级 Client 端到 2.x
4. **启用安全特性**:所有端都升级后,启用严格安全配置
```typescript
// 阶段 1:Remote 端升级到 2.x(兼容模式)
const remote = new RealseeVRSignalsRemote({
security: getV1CompatibilityConfig() // 兼容 1.x Client
})
// 阶段 2:Client 端逐步升级到 2.x
// 可以混合使用 1.x 和 2.x Client
// 阶段 3:所有端都升级后,启用严格模式
const remote = new RealseeVRSignalsRemote({
security: {
strictMode: true,
validateOrigin: true,
validateSignature: true,
signatureKey: 'your-secret-key'
}
})
```
## 版本兼容性矩阵
| Client 版本 | Remote 版本 | 兼容性 | 配置要求 |
|------------|------------|--------|---------|
| 1.x | 1.x | ✅ 完全兼容 | 默认配置 |
| 1.x | 2.x | ✅ 兼容 | Remote 需使用 `getV1CompatibilityConfig()` |
| 2.x | 1.x | ✅ 兼容 | Client 默认配置即可 |
| 2.x | 2.x | ✅ 完全兼容 | 可使用严格安全配置 |
## 联系支持
如果遇到兼容性问题无法解决,请:
1. 检查本文档的常见错误部分
2. 启用 DEBUG 日志查看详细信息
3. 提供以下信息报告问题:
- Client 版本和 Remote 版本
- 错误信息和日志
- 配置代码
- 复现步骤