# educloud_sdk **Repository Path**: videopai_2/educloudsdk ## Basic Information - **Project Name**: educloud_sdk - **Description**: 教育云 SDK - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-02 - **Last Updated**: 2026-08-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Education Cloud SDK 本仓库内的客户端 SDK monorepo:共享类型、REST 客户端、LiveKit 教室逻辑,以及 **React / Vue** UI 层。 > **本地包**:仅在本仓库(或拷贝同级 `sdk/`)内通过 `file:` 引用,**不**发布到 npm registry,也**不**提供对外发包流程。 **快速上手**:[quickstart.md](./quickstart.md)。完整集成见 [docs/sdk-integration-guide.md](../docs/sdk-integration-guide.md)。版本见 [docs/VERSIONING.md](../docs/VERSIONING.md);变更见 [CHANGELOG.md](CHANGELOG.md)。当前 SDK / Desktop npm 版本:**0.3.22**。 --- ## 最近更新(0.3.22) | 包 | 要点 | |----|------| | **全包** | npm 版本与 Desktop 统一为 **0.3.22**(本地 `file:` 引用,不发布 npm) | | **sdk-core** | 视频分辨率预设、`ensureRemoteTracksSubscribed`、`parseApiError`、录制开录幂等门闩 | | **sdk-livekit** | 教师 Simulcast + Dynacast;`attachClassroomMediaRecovery`、`buildLiveKitConnectOptions`;关摄像头/静音 `replaceTrack` 占位保 SID | | **sdk-api** | `meetings.startRecording` / `stopRecording` / `getRecordingStatus`、`ensureRecordingStarted` | | **sdk-vue / sdk-react** | 双端 parity:`useClassroomMediaRecovery`、`useMeetingRecording`、`useIsMeetingOwner`、`TeacherControls` 录制、`NetworkLossSimulator` 默认折叠(适合左边栏) | 完整变更:[CHANGELOG.md](CHANGELOG.md) · 多码率:[sdk-livekit](packages/sdk-livekit/README.md#room-options--multi-bitrate) --- ## 包一览 | 包 | 包名 | 说明 | |----|------|------| | [sdk-core](packages/sdk-core/) | `@education-cloud/sdk-core` | 共享 TypeScript 类型与工具函数,**零运行时依赖** | | [sdk-api](packages/sdk-api/) | `@education-cloud/sdk-api` | REST API 客户端(`createEduClient`) | | [sdk-livekit](packages/sdk-livekit/) | `@education-cloud/sdk-livekit` | **框架无关** LiveKit 连接、推流、举手、订阅隔离 | | [sdk-react](packages/sdk-react/) | `@education-cloud/sdk-react` | React Hooks + 课堂 UI 组件(`frontend/`) | | [sdk-vue](packages/sdk-vue/) | `@education-cloud/sdk-vue` | Vue 3 composables + Pinia + 课堂 UI 组件(`desktop/`) | ### 依赖关系 ``` sdk-core ↑ sdk-api ──→ sdk-livekit ↑ ┌──────┴──────┐ sdk-react sdk-vue ``` 各包 API 细节见 `packages/*/README.md`。 --- ## 本地构建(必做) 在本目录安装并构建,产出 `packages/*/dist/`: ```bash cd sdk npm install npm run build # 等价于 bash build-all.sh ``` 构建顺序: ``` sdk-core → sdk-api → sdk-livekit → sdk-react → sdk-vue ``` 包间依赖使用 **`file:../sdk-*`**(不访问 npm registry;修复 [#26](http://mail.chinaffmpeg.org:3000/lq/education_cloud/issues/26) 中 `sdk-core@1.0.0` 404)。 产出:`packages/*/dist/index.js` 与 `index.cjs`。 ```bash SDK_VERBOSE=1 bash build-all.sh # 完整 Vite 日志 npm run verify:boundaries # 校验构建边界(仅依赖 sdk/ 内代码) ``` 修改 SDK 源码后必须重新 `npm run build`,同仓库的 `frontend/`、`desktop/` 或其它 `file:` 消费方才会用到新的 `dist/`。 --- ## 在本仓库中引用 `frontend/`、`desktop/` 已通过 `file:../sdk/packages/*` 依赖本目录(见各自 `package.json`)。其它本地项目同样使用 `file:`: ```json { "dependencies": { "@education-cloud/sdk-core": "file:../education_cloud/sdk/packages/sdk-core", "@education-cloud/sdk-api": "file:../education_cloud/sdk/packages/sdk-api", "@education-cloud/sdk-livekit": "file:../education_cloud/sdk/packages/sdk-livekit", "@education-cloud/sdk-react": "file:../education_cloud/sdk/packages/sdk-react", "@education-cloud/sdk-vue": "file:../education_cloud/sdk/packages/sdk-vue" } } ``` 路径按你的目录布局调整;安装前请先完成本目录 `npm run build`。 同步到其它本地客户端仓库(可选;含 sdk / desktop / `docker-compose/` / `k8s-example/`): ```bash ./scripts/sync-desktop-sdk-configs-to-wanwu.sh --dest ~/work/your-client # 仅部署配置: ./scripts/sync-desktop-sdk-configs-to-wanwu.sh --no-sdk --no-desktop # 或:--compose-only / --k8s-only ``` **Peer 依赖**(由应用安装):`axios`(sdk-api)、`livekit-client`(sdk-livekit / UI 包)、以及 React 或 Vue 生态(见各 UI 包 `package.json`)。 --- ## 使用示例 ### REST + LiveKit(任意框架) ```typescript import { createEduClient } from "@education-cloud/sdk-api"; import { LiveKitRoomConnector } from "@education-cloud/sdk-livekit"; const client = createEduClient({ baseUrl: "http://localhost:8000/api", getToken: () => localStorage.getItem("token"), }); const join = await client.meetings.join(meetingId); const connector = new LiveKitRoomConnector(); await connector.connect(join, { isMeetingOwner: true }); ``` ### React(Web / `frontend/`) ```tsx import { useLiveKit, useMediaStream, VideoGrid, TeacherControls } from "@education-cloud/sdk-react"; ``` ### Vue(Desktop / `desktop/`) ```vue ``` `sdk-react` 与 `sdk-vue` 在 hooks / composables 上 **功能对齐**(详见各包 README)。弱网面板:`NetworkLossSimulator`(默认折叠,适合左边栏)。 --- ## 音视频与多码率 | 场景 | 支持情况 | |------|----------| | 教师摄像头 | **Simulcast** 多层 + **Dynacast** + **Adaptive Stream**(`buildRoomOptions(true)`) | | 教师分辨率 | 预设 360p–1080p(`setVideoResolutionPresetId` / `VideoResolutionSelect`) | | 学生推流 | 单路(授权发言时) | | 屏幕共享 | 单码率(`simulcast: false`) | | 订阅端手动选清晰度 | 不支持 | | 码率监控 | `useNetworkStats` + Monitor 组件 | 完整说明:[packages/sdk-livekit/README.md](packages/sdk-livekit/README.md#room-options--multi-bitrate) --- ## 测试 ```bash cd packages/sdk-core && npm test cd packages/sdk-react && npm test ``` --- ## 目录结构 ``` sdk/ ├── build-all.sh ├── package.json npm workspaces ├── scripts/ │ ├── verify-boundaries.sh │ └── lib/client-boundaries.sh └── packages/ ├── sdk-core/ ├── sdk-api/ ├── sdk-livekit/ ├── sdk-react/ └── sdk-vue/ ``` --- ## 构建环境变量 | 变量 | 说明 | |------|------| | `SDK_DIR` | SDK 根目录(默认:本目录) | | `SDK_BUILD_ORDER` | 自定义构建顺序(空格分隔包名) | | `SDK_VITE_BIN` | 指定 vite 可执行文件 | | `SDK_VERBOSE` | `1` 时输出完整 Vite 日志 | --- ## 文档 - [quickstart.md](./quickstart.md) — 构建、`file:` 引用、五分钟接入、常见问题 - [CHANGELOG.md](CHANGELOG.md) — 版本更新记录 - [SDK 集成指南](../docs/sdk-integration-guide.md) — 本地使用与接入 - [桌面客户端](../docs/desktop.md) · [desktop/README.md](../desktop/README.md) - [sdk-core](packages/sdk-core/README.md) · [sdk-api](packages/sdk-api/README.md) · [sdk-livekit](packages/sdk-livekit/README.md) · [sdk-react](packages/sdk-react/README.md) · [sdk-vue](packages/sdk-vue/README.md)