## 前言
ws這個文件夾下,主要是起了一個ws的服務。處理上課過程中各個客戶端產生的信令。
[白板server信令處理流程](https://www.processon.com/view/link/5d22f70ee4b0f42d067b3d86)
## 建立連接
- 實例化WebSocket,監聽connnection事件
- 在connection監聽器中,創建一個`user`,監聽每一個連接的message事件。可以認為每個連接都是一個用戶。
- 根據每一個connection攜帶的參數,為`user`分組
## 用戶分組邏輯
客戶端向服務端建立連接是攜帶的參數:
- `identity` 用戶身份
- `userId` 用戶ID
- `lessonId` 課件ID,用于請求PPT信息
- `periodId` 教室ID
- `partId` 用于api請求,ws服務本身不關心
- `hash` 客戶端生成的隨機標識
根據用戶的periodId創建lesson,可以看做一個教室,多個lesson以peridId為key保存在channelMap中,lesson的主要內容為:
- users:保存當前連接的用戶
- lessonId:當前課堂內使用的PPT的Id
- pptRescorder:PPT的管理器
- hashMap:用于保存課堂內產生的所有消息的hash值
### PPTRecorder
如果`partId`、`lessonId`、`periodId`都相同的連接,共享一個PPTRecorder。
初始化時,根據`partId`、`lessonId`、`periodId`生成一個`infoKey`,同時取當前時間`startTime`作為實例初始化時間,將`{key: infoKey, value: startTime}`存入redis,如果key已存在就更新`startTime`。
`PPTRecorder `主要負責記錄上課過程中產生的信令,并且當用戶中途加入課堂是一次性返回已經產生的信令。
關于**保存信令**,在上課過程中,`recorder`通過`startTime`生成`recordKey`,將接收到的信令儲存到redis;上課中途收到`keyframe`類型的消息,將當前記錄的信令全部發送到客戶端;上課結束,將redis中記錄的信令持久化到數據庫。
## 處理信令消息
- ws心跳
- WsMessage
- Cmd & Signal
### Cmd & Signal
這類信息是普通的JSON字符串,其中Cmd用戶控制課程開始結束,Signal則是客戶端發送。
**課程開始**: 創建PPTRecorder實例,記錄開始時間,記錄信令。
**課程結束**: 記錄結束時間,將redis中的信令持久化。
### WsMessage
- `keyframe`: 將當前的信令歷史發送給消息來源客戶端(單播)
- `broadcast`/`media`/`animation`/`extra`/`template`: 將信令儲存到redis中,同時組播類課堂內的其他用戶(不包括自己)
- `startTime`: 將服務器時間發送給消息來源客戶端(單播)
- `syncMedia`: 組播
- 相關資源鏈接
- 米樂星球小程序內調研
- 項目結構說明
- 交互課件說明
- server項目說明
- 項目說明
- 項目啟動
- app.js做的事情
- 獲取互動課件的地址
- 分析互動課件地址的參數
- policy目錄--lesson.js
- 解析ppt--api/lesson.js
- 信令中的key:template
- 信令中的key:media
- kk-talkee-engine.js
- Message
- 課件模板頁的識別過程
- 解析課件模板的源文件
- 場景與模板的對應關系
- 所有場景的基類
- choiceScence為例
- 注意事項
- ws
- online項目的說明
- online消息
- 課件編輯項目
- 資源鏈接
- 基本項目信息
- electron項目結構分析
- ipc
- 模板題組
- 普通題組
- 游戲題組
- 課件導出內容分析
- 課件模板分類明細
- 圖片題
- 視頻題
- 音頻題
- 選擇題
- 判斷題
- 轉盤
- 篩子
- 圖層拖拽
- 動畫題
- 翻拍題
- 語音題
- 201908變更
- 課件制作流程分析
- 菜單配置
- 入口操作
- 定義模板布局與初始化
- 選擇素材
- 導出過程
- egret
- interface
- ad選擇器模板
- ab選擇器模板
- 圖層拖拽模板
- 判斷題模板
- xml
- 轉盤
- events
- components
- 父類組件
- 基本組件
- 判斷題組件
- 龍骨動畫調研
- 基本了解
- 產品原型
- 白板Client項目
- 消息類型
- 白板項目分析
- 入口