StreamSight 是一个基于 TypeScript 的用户行为录制与回放系统,采用 Monorepo 架构,支持高效的事件采集、压缩存储和安全回放。
- Node.js >= 18.0.0
- pnpm >= 8.0.0
# 方式一:使用安装脚本(推荐)
./scripts/setup.sh
# 方式二:手动安装
pnpm install
pnpm build- 启动后端服务
# 文件存储模式(默认,写入 packages/backend-api/data)
pnpm backend:file
# PostgreSQL 存储模式(写入数据库,不落本地文件)
pnpm backend:sql- 启动演示应用
pnpm demo
# 或者
pnpm --filter @streamsight/demo-app dev- 启动回放平台
pnpm replay
# 或者
pnpm --filter @streamsight/replay-platform dev- 一键启动所有服务
pnpm e2e- 打开演示应用:http://localhost:5173
- 在页面上进行各种操作(点击、输入、滚动等)
- 点击"停止录制"按钮
- 打开回放平台:http://localhost:3000
- 查看录制的会话并播放
- 在浏览器中打开
apps/test-simple.html - 点击"开始录制"
- 进行各种操作(输入、点击等)
- 查看浏览器控制台的日志输出
- 后端会接收并存储录制数据
✅ 已完成功能:
- Monorepo 项目结构搭建
- 核心 SDK(rrweb 录制、批次处理、网络重试与离线队列)
- ZSTD / GZIP 压缩链路(含 Web Worker 与
@bokuweb/zstd-wasm) - 后端 API 服务(支持本地文件和 PostgreSQL 存储)
- Demo 应用内置会话列表与回放播放器(
apps/demo-app/src/replay-viewer.ts) - Replay Platform 支持批次回放与整会话聚合回放
- GitHub Pages 部署脚本与 Service Worker 本地 IndexedDB 模式
- 简单测试页面验证(
apps/test-simple.html) 🔧 验证建议:
- 使用
apps/test-simple.html验证基础录制与上传 - 运行
pnpm --filter streamsight type-check验证 SDK 类型 - 运行
pnpm --filter @streamsight/replay-platform type-check验证回放平台类型
streamsight/
├── apps/
│ ├── replay-platform/ # Next.js 回放查看器
│ ├── demo-app/ # 演示应用
│ └── test-simple.html # 简单录制验证页
├── packages/
│ ├── streamsight-sdk/ # 核心 SDK (npm 包名: streamsight)
│ ├── core-utils/ # 共享工具 (streamsight-core-utils)
│ └── backend-api/ # 后端 API (@streamsight/backend-api)
import { init, start, stop } from 'streamsight'
// 初始化
const recorder = init({
appId: 'my-app',
apiEndpoint: 'http://localhost:3001',
userId: 'user-123',
})
// 开始录制
await start()
// 停止录制
stop()import { init } from 'streamsight'
const recorder = init({
appId: 'my-app',
apiEndpoint: 'http://localhost:3001',
userId: 'user-123',
// 批次配置
batchSize: 80, // 每批事件数量
batchTimeout: 30000, // 批次超时时间(毫秒)
// 脱敏配置
privacy: {
maskSelectors: ['.ss-mask', '.sensitive'],
blockSelectors: ['.ss-block', '.private'],
maskAllInputs: false,
maskPasswords: true,
},
// 压缩配置
compression: {
type: 'zstd', // 'gzip' | 'zstd',SDK 默认 zstd
level: 6,
},
// 网络配置
network: {
retryCount: 3,
retryDelay: 1000,
},
})SDK 支持多种脱敏策略:
-
CSS 类名脱敏
<!-- 文本遮盖 --> <span class="ss-mask">敏感信息</span> <!-- 元素阻止 --> <div class="ss-block">私密内容</div>
-
自动模式识别
- 信用卡号:
4111-1111-1111-1111 - 邮箱地址:
[email protected] - 手机号码:
13812345678 - 身份证号:
110101199001011234
- 信用卡号:
-
表单输入脱敏
<!-- 密码输入默认遮盖 --> <input type="password" /> <!-- 自定义遮盖 --> <input class="ss-mask" type="text" />
// 初始化 SDK
init(config: StreamsightConfig): StreamsightRecorder
// 开始录制
start(): Promise<void>
// 停止录制
stop(): void
// 刷新当前批次
flush(): Promise<void>
// 设置用户信息
setUser(userId: string, meta?: Record<string, unknown>): void
// 添加遮盖选择器
addMaskSelector(selector: string): void
// 添加阻止选择器
addIgnoreSelector(selector: string): void默认使用本地文件存储,数据保存在 packages/backend-api/data/ 目录:
# 使用默认配置
pnpm backend:file- 准备 PostgreSQL 数据库
CREATE DATABASE streamsight;
CREATE USER streamsight WITH PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE streamsight TO streamsight;- 配置环境变量(手动切换存储模式)
# 编辑 packages/backend-api/.env
STORAGE_MODE=pgsql
PGSQL_HOST=localhost
PGSQL_PORT=55432
PGSQL_USER=streamsight
PGSQL_PASSWORD=your_password
PGSQL_DATABASE=streamsight- 启动服务(SQL 模式)
pnpm backend:sql- 可选:Docker 一键启动本地 PostgreSQL
pnpm db:up
# 如端口冲突可改宿主机端口(示例 55433)
STREAMSIGHT_PG_PORT=55433 pnpm db:up
# 停止并清理容器
pnpm db:down数据库表会自动创建,包括:
replay_metadata: 回放元数据replay_data: 回放二进制数据
- SDK 默认使用
zstd(@bokuweb/zstd-wasm),可在配置中切换到gzip - 回放端支持按照元数据中的
compression字段自动选择解压方式 - GitHub Pages 模式下的 demo 采用
gzip,以适配 Service Worker 的内置解压路径
| 压缩方案 | 压缩率 | 压缩速度 | 解压速度 | 浏览器支持 |
|---|---|---|---|---|
| gzip | 中等 | 快 | 快 | 优秀 |
| zstd | 优秀 | 很快 | 很快 | 需要 WASM |
- 默认遮盖密码输入
- 支持自定义遮盖规则
- 自动识别敏感信息模式
- 支持元素级别的阻止采集
- 移除所有
<script>标签的可执行内容 - 阻止回放时的真实页面跳转
- 使用 iframe sandbox 隔离回放环境
- 支持用户级别的访问控制
- 会话级别的数据隔离
- API 密钥认证(生产环境)
- 用户同意:在开始录制前获得用户明确同意
- 数据保留:设置合理的数据保留期限
- 访问审计:记录所有回放访问日志
- 数据加密:生产环境使用 HTTPS 和数据库加密
- 隐私政策:更新隐私政策说明数据收集用途
# 构建所有包
pnpm build
# 构建特定包
pnpm --filter streamsight build# 运行所有测试
pnpm test
# 运行特定包测试
pnpm --filter streamsight test# 运行 ESLint
pnpm lint
# 类型检查
pnpm type-check# 发布到 npm
pnpm publish-packages./deploy.sh该脚本会依次构建 core-utils、streamsight、demo-app,并将 apps/demo-app/dist 推送到 gh-pages 分支。
- ✅ 基于 rrweb 的 DOM 快照与增量事件
- ✅ MutationObserver 监听 DOM 变化
- ✅ 事件批次处理(默认 80 条/批)
- ✅ Web Worker 压缩处理(含 zstd/gzip)
- ✅ 脱敏规则支持(
.ss-mask/.ss-block) - ✅ 相对 URL 转绝对 URL
- ✅ 脚本内容清理
- ✅ 表单输入值处理
- ✅ 网络重试与离线队列
- ✅ iframe sandbox 安全回放
- ✅ PostgreSQL / 本地文件双存储后端
- ✅ 会话聚合回放(多批次合并播放)
- ✅ 响应式页面(Demo 与 Replay Platform)
- ⏳ Canvas 录制支持
- ⏳ 实时流式传输
- ⏳ 高级权限控制
- ⏳ 回放性能优化
- Fork 项目
- 创建特性分支:
git checkout -b feature/amazing-feature - 提交更改:
git commit -m 'Add amazing feature' - 推送分支:
git push origin feature/amazing-feature - 提交 Pull Request
MIT License - 详见 LICENSE 文件
注意:这是一个 MVP 版本,主要用于概念验证和快速原型开发。生产环境使用前请进行充分的安全评估和性能测试。