@plasosdk/plaso-electron-sdk 1.3.4 → 1.3.6

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/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
1
  ## [1.3.4](https://www.npmjs.com/package/@plasosdk/plaso-electron-sdk/v/1.3.4)(2025-08-18)
2
2
 
3
3
  ### 1. 修改了插入云盘文件相关的文档说明
4
+
5
+ ## [1.3.5](https://www.npmjs.com/package/@plasosdk/plaso-electron-sdk/v/1.3.5)(2025-08-21)
6
+
7
+ ### 1. 移除了未使用的rtmpplayer和plasoffmpeg依赖
8
+
9
+ ## [1.3.6](https://www.npmjs.com/package/@plasosdk/plaso-electron-sdk/v/1.3.6)(2025-08-29)
10
+
11
+ ### 1. 音视频课堂增加常驻的禁麦提示
12
+
13
+ ### 2. 优化本地麦克风音量波纹显示
package/README.md CHANGED
@@ -1,23 +1,24 @@
1
- # 支持的平台与 Electron 版本
1
+ # Plaso SDK for Electron
2
2
 
3
- - MacOS 支持 x64、arm64架构
4
- - Windows 支持 x86、x64架构
3
+ ## 🖥 环境支持
5
4
 
6
- **<font color=red>Electron 版本要求: 14.0.0~22.3.27</font>**
5
+ - 🌈 支持 MacOS x86-64 和 arm64
6
+ - ⚙️ 支持 Windows ia32 和 x64
7
+ - [Electron](https://www.electronjs.org/): 14.0.0~22.3.27
7
8
 
8
- # 1、接入步骤
9
-
10
- ## 1.1、安装
9
+ | MacOS | Windows | Electron |
10
+ | --- | --- | --- |
11
+ | x86 \| arm64 | ia32 \| x64 | 14.0.0~22.3.27
11
12
 
12
- **<font color=red>注意: 不同平台依赖包不互通</font>**
13
+ ## 安装
13
14
 
14
- **第一步:安装 @electron/remote**
15
+ **安装 @electron/remote**
15
16
 
16
17
  ```shell
17
18
  npm install @electron/remote --global-style --legacy-peer-deps
18
19
  ```
19
20
 
20
- **第二步:安装 plaso-electron-sdk**
21
+ **安装 plaso-electron-sdk**
21
22
 
22
23
  ```shell
23
24
  npm install @plasosdk/plaso-electron-sdk --global-style
@@ -57,38 +58,34 @@ MacOS打包完毕后,建议安装打好的包后自行验证上述的操作时
57
58
  - 上课测试截图功能是否正常,截图正常说明授权正确。
58
59
  - 上课测试桌面共享功能,使用屏幕共享,并在浏览器里面播放一段视频,结束课堂后检查回放中能否听到桌面共享那一段播放的视频的声音,能听到说明授权正确。
59
60
 
60
- ## 1.2、使用
61
+ ## 使用
61
62
 
62
- ### 1.2.1、在主进程中使用
63
+ ### 在主进程中使用
63
64
 
64
65
  需要在主进程加载 `@plasosdk/plaso-electron-sdk` 依赖包
65
66
 
66
67
  ```ts
67
- require('@plasosdk/plaso-electron-sdk');
68
-
69
68
  // electron 版本>=14.0.0 时:需要在主进程里 初始化、启动 remote
70
- const electronVersion = process.versions['electron'];
71
- if (electronVersion && versionComp(electronVersion, '14.0.0') >= 0) {
72
- const electronStore = require('@electron/remote/main');
73
- electronStore.initialize();
74
- // mainWindow: 主进程打开的渲染进程窗口
75
- electronStore.enable(mainWindow.webContents);
76
- }
77
-
78
- // 通过 initRemoteMain方法 传入 remoteMain
79
69
  const remoteMain = require('@electron/remote/main');
70
+ remoteMain.initialize();
71
+ remoteMain.enable(mainWindow.webContents); // mainWindow: 主进程通过loadURL加载的那个渲染进程窗口
72
+
73
+ // plaso-electron-sdk中依赖@electron/remote,需要通过 initRemoteMain方法 传入 remoteMain
80
74
  const { initRemoteMain } = require('@plasosdk/plaso-electron-sdk');
81
75
  initRemoteMain(remoteMain);
82
76
  ```
83
77
 
84
- ### 1.2.2、在渲染进程中使用
78
+ ### 在渲染进程中使用
85
79
 
86
80
  <a id="open-sdk-window-params"></a>
87
81
 
88
82
  **打开实时课堂/备课课堂方法入参类型定义**
89
83
  ```ts
90
- interface CreateClassPamras {
91
- classOptions: Object;
84
+ interface CreateClassWindowPamras {
85
+ /**
86
+ * 属性说明详见下方classOptions,打开实时课堂时为ILiveClassOptions,备课课堂为IPrepareClassOptions
87
+ */
88
+ classOptions: ILiveClassOptions | IPrepareClassOptions;
92
89
  electronWinOptions?: Electron.BrowserWindowConstructorOptions;
93
90
  onClassWindowReadyFn?: (winId: number) => void
94
91
  onClassWindowLeaveFn?: (winId: number) => void
@@ -105,242 +102,220 @@ interface CreateClassPamras {
105
102
  }
106
103
  ```
107
104
 
108
- #### 1.2.3.1、打开实时课堂
109
-
110
- ```ts
111
- // 代码示例
112
- const PlasoElectronSdk = window.require('@plasosdk/plaso-electron-sdk');
113
- const createLiveClassParams: CreateClassPamras = { classOptions: { query } };
114
- PlasoElectronSdk.createLiveClassWindow(createLiveClassParams);
115
- ```
116
-
117
- 入参详见[实时课堂参数说明](#live-class-params)
105
+ #### 打开实时课堂
118
106
 
119
- #### 1.2.3.2、打开备课课堂
107
+ SDK打开一个新的`BrowserWindow`来加载实时课堂UI界面,示例代码如下:
120
108
 
121
109
  ```ts
122
- // 代码示例
123
110
  const PlasoElectronSdk = window.require('@plasosdk/plaso-electron-sdk');
124
- const createPrepareClassParams: CreateClassPamras = { classOptions: { loginName: 'hello', userName: 'world' } };
125
- PlasoElectronSdk.createPrepareClassWindow(createClassParams);
111
+ const createLiveClassWindowParams: CreateClassWindowPamras = { classOptions: { query } };
112
+ PlasoElectronSdk.createLiveClassWindow(createLiveClassWindowParams);
126
113
  ```
127
114
 
128
- 入参详见[备课课堂入参说明](#prepare-class-params)
129
-
115
+ ##### createLiveClassWindow参数说明
130
116
 
131
- <a id="live-class-params"></a>
132
- # 2、实时课堂入参说明
117
+ ###### classOptions
133
118
 
134
- ## 2.1、参数 classOptions
119
+ ```ts
120
+ interface ILiveClassOptions {
121
+ /** 进入课堂必须的签名字符串 */
122
+ query: string;
123
+ /** 当前进入课堂用户的头像,取值为https全地址 */
124
+ displayAvatarUrl?: string;
125
+ /** 课堂中的成员,会在成员列表中呈现 */
126
+ classMembers?: UserInfo[];
127
+ /** 是否启用降噪 */
128
+ enableENC?: boolean;
129
+ /** 是否启用3A */
130
+ enableRTC3A?: boolean;
131
+ /** 是否启用新桌面共享 */
132
+ enableLiveNewShare?: boolean;
133
+ /** 是否启用触屏设备上的新桌面共享 */
134
+ enableLiveNewShareInTouch?: boolean;
135
+ /** 是否启用部分屏幕区域共享 */
136
+ enableLiveNewShareRegion?: boolean;
137
+ /** 是否启用签到 */
138
+ enableLiveSign?: boolean;
139
+ /** 是否启用资料中心(云盘) */
140
+ supportShowResourceCenter?: boolean;
141
+ /** 是否支持保存板书 */
142
+ supportSaveBoard?: boolean;
143
+ /** 是否启用摄像头常驻 */
144
+ residentCamera?: boolean;
145
+ }
135
146
 
136
- ```
137
- 类型:Object
147
+ interface UserInfo {
148
+ /** 用户名,唯一标识 */
149
+ loginName: string;
150
+ /** 用户昵称 */
151
+ name: string;
152
+ /** 用户角色 */
153
+ upimeRole: 'speaker' | 'assistant' | 'listener';
154
+ /** 用户头像 */
155
+ displayAvatarUrl?: string;
156
+ }
138
157
  ```
139
158
 
140
- ### 2.1.1、属性列表
141
-
142
- | 参数 | 是否必传 | 类型 | 默认值 | 说明 |
143
- | --- | --- | --- | --- | --- |
144
- | query | | string | | 进课堂必传字段,具体拼接逻辑见下文[query 属性说明](#query) |
145
- | displayAvatarUrl | 否 | string | | 用户头像地址 |
146
- | classMembers | 否 | object[] | | 1、课对应的班级用户信息<br />2、初始化课堂参与人<br /><br />3、最多支持 2000 人,需要支持更多学生需要联系伯索平台进行额外申请<br />{<br /><br />/** 唯一标识该用户的 id \*/<br />loginName: string,<br /><br />/** 用户显示的姓名 _/<br />name: string,<br />/\*\* 用户角色,"speaker","assistant","listener","superlistener" 之一 _/<br />upimeRole: string,<br />/** 用户的 id,和云学堂业务强相关,sdk 用户非必要 \*/<br />unique_id: number \| string<br />/** 用户头像图片的 url,非必要 \*/<br />displayAvatarUrl: string,<br />} |
147
- | enableENC | 否 | boolean | true | 是否启用降噪 |
148
- | enableRTC3A | 否 | boolean | true | 是否启用 3A。<br />false:关闭回音消除、关闭降噪、关闭增益控制 |
149
- | supportShowResourceCenter | 否 | boolean | false | true:工具栏显示 资料中心 按钮,但资料中心的逻辑需要用户自己实现 |
150
- | supportSaveBoard | 否 | boolean | false | 是否支持保存板书,依赖于资料中心实现保存和插入板书文件 |
151
- | enableLiveNewShareRegion | 否 | boolean | false | 是否允许区域共享 |
152
- | enableLiveNewShareInTouch | 否 | boolean | false | 是否支持触屏模式下的新桌面共享(左侧新增按钮窗口来切换显示工具栏)<br />建议开启 |
153
- | enableLiveNewShare | 否 | boolean | false | 是否支持新桌面共享<br />开启新桌面共享需要开启 electron 透明窗口,且可能触发 electron 本身存在的长时间透传导致的在应用上鼠标失焦问题 |
154
- | enableLiveSign | 否 | boolean | false | 是否支持签到 |
155
- | residentCamera | 否 | boolean | false | 常驻摄像头:只对学生或游客生效 |
156
- | | | | | |
159
+ | <span style="white-space: nowrap;">参数名称</span> | <span style="white-space: nowrap;">是否必填</span> | <span style="white-space: nowrap;">类型</span> | <span style="white-space: nowrap;">参数描述</span> |
160
+ | --- | --- | --- | --- |
161
+ | query | | string | 带签名的字符串,具体拼接逻辑见下文[query属性说明](#query) |
162
+ | displayAvatarUrl | | string | 用户头像地址。不传默认使用用户昵称作为头像。 |
163
+ | classMembers | | UserInfo[] | 成员列表中显示的人员,最多支持 2000 人。**人员超过2000人需要联系伯索平台进行额外申请**。 |
164
+ | enableRTC3A | 否 | boolean | 是否启用3A:回音消除、噪声抑制、自动增益控制。默认启用。 |
165
+ | enableENC | 否 | boolean | 是否启用降噪控制,开启后设置界面可以设置`基础降噪`或`增强降噪`。默认启用。 |
166
+ | enableLiveNewShare | 否 | boolean | 是否启用新桌面共享。启用后共享`屏幕`/`部分屏幕区域`时会对课堂窗口做透明化处理,需要选中工具栏上的`交互模式`工具来交互桌面应用,可能会触发`Electron`长时间透传鼠标事件导致的透传异常问题,谨慎使用。默认不启用。 |
167
+ | enableLiveNewShareInTouch | 否 | boolean | 是否在触屏设备上启用新桌面共享,启用后通过切换`演示模式`和`互动模式`来交互桌面应用和课堂中的工具。默认不启用。 |
168
+ | enableLiveNewShareRegion | 否 | boolean | 是否启用`部分屏幕区域`共享。 |
169
+ | enableLiveSign | 否 | boolean | 是否启用签到,启用后工具箱中显示`签到`按钮。默认不启用。 |
170
+ | supportShowResourceCenter | 否 | boolean | 是否启用`资料中心(云盘)`,启用后在工具栏显示`资料中心(云盘)`按钮,此按钮需要配合`onOpenResourceCenterFn`回调一起使用。默认不启用。 |
171
+ | supportSaveBoard | 否 | boolean | 是否启用保存板书,启用后工具箱中显示`保存当页板书`按钮,需要配合云盘使用。默认不启用。 |
172
+ | residentCamera | 否 | boolean | 是否启用常驻摄像头:只对学生或游客生效。启用后学生进入课堂后摄像头常驻开启,没有开启摄像头权限时也会开启。默认不启用。 |
157
173
 
158
174
  <a id="query"></a>
159
- ### 2.1.1、query 属性
175
+ **query属性说明**
160
176
 
161
- **query 属性格式示例**:
177
+ query本质上是根据`IQueryParams`对象中的字段生成带签名的字符串,query示例如下:
162
178
 
179
+ ```ts
180
+ const query = 'appId=plaso&appType=liveclassSDK&d_dimension=1280x720&enableNewClassExam=1&loginName=t_1&mediaType=video&meetingId=test_1742442362&meetingType=public&signature=A226198904A392579B98987FB4CD5478AB3F5587&userName=%E8%80%81%E5%B8%881&userType=speaker&validBegin=1742442364&validTime=99999'
163
181
  ```
164
- appId=plaso&appType=liveclassSDK&d_dimension=1280x720&dhost=https%3A%2F%2Fdev.plaso.cn%2F&enableHiliter=true&enableNewClassExam=1&enableVideoMark=true&loginName=t_1&mediaType=video&meetingId=test_1742442362&meetingType=public&signature=A226198904A392579B98987FB4CD5478AB3F5587&upimeTeacherTool=1151&userName=%E8%80%81%E5%B8%881&userType=speaker&validBegin=1742442364&validTime=99999&vendorType=2&videoStream=2
165
- ```
166
-
167
- #### 2.1.1.1、组成 queryParams 对象
168
182
 
169
183
  ```ts
170
184
  interface IQueryParams {
171
185
  appId: string;
172
- signature: string;
173
186
  validBegin: number;
174
187
  validTime: number;
175
- endTime: number;
176
- appType: string;
177
- userType: string;
178
- meetingType: string;
179
188
  mediaType: string;
189
+ meetingType: string;
180
190
  meetingId: string;
191
+ userType: string;
181
192
  loginName: string;
182
193
  userName: string;
183
194
  d_dimension: string;
184
- vendorType: number;
185
- videoStream: number;
186
- enableNewClassExam: number;
187
- d_enableReRecording: number;
188
195
 
189
196
  topic?: string;
197
+ endTime?: number;
190
198
  onlineMode?: number;
191
- d_enableOMO?: number;
192
199
  d_delayEndTimes?: number;
193
200
  d_delayEnd?: number;
194
- d_restrictAssistantPerm?: number;
195
201
  d_enableAvatarFreeScale?: number;
196
202
  d_enableObjectEraser?: number;
197
203
  d_vote?: number;
198
204
  d_sharpness?: number;
199
205
  isNewMT?: number;
200
- d_enableDualCamera?: number;
206
+ enableNewClassExam?: number;
207
+ d_enableReRecording?: number;
201
208
  }
202
209
  ```
203
210
 
204
- ##### 2.1.1.1.1、必传参数表格说明
205
-
206
- | 参数 | 类型 | 说明 |
207
- | --- | --- | --- |
208
- | appId | string | 在申请接入时,伯索平台给予的 appId |
209
- | signature | string | 签名字符串,根据queryParams中除去signature参数的其他参数生成,生成示例参考[根据queryParams对象生成签名字符串](#generate-signature) |
210
- | validBegin | number | 请求课堂**开始生效起始时间**的 Unix Epoch 时间戳,单位秒:(时间戳/1000 再取整) |
211
- | validTime | number | 请求的**签名在课堂的有效时间段**(断网重连后会重新校验签名),单位秒,建议: 24 _ 60 _ 60 s |
212
- | endTime | number | 请求课堂**结束时间**的 Unix Epoch 时间戳,单位秒:(时间戳/1000 再取整) |
213
- | appType | string | 应用类型,必填,目前为固定值:liveclassSDK |
214
- | userType | string | 用户类型,目前有三个值可选: speaker,assistant,listener; <br />speaker:主讲,有控制其他 listener 是否可写可说话的权限;<br />assistant:助教,也有控制权限<br />listener:学生 |
215
- | meetingType | string | 课堂类型,传入值:private。 当选择 private 类型时,每一个进入课堂者,必须提供 loginName,这是唯一标识该用户的 id,相同的 loginName 登录,后进入者会使前一个强制登出 |
216
- | mediaType | string | 媒体类型:audio, video<br />audio: 语音实时课堂<br />video:有头像权限的课堂,含语音权限 |
217
- | meetingId | string | 课堂 ID,唯一标识该课堂;使用 ASSIIC 字符,不得包含/,,空格等;长度在 40 字节以内的字符串 |
218
- | loginName | string | **唯一标识该用户的 id**,不能为空,相同的 loginName 登录,后面一个会使前面一个登出; |
219
- | d_dimension | string | 1280x720 定义界面尺寸为 16:9 界面 |
220
- | userName | string | 登录的用户名,在列表中显示用 |
221
- | vendorType | number | rtc 类型 <br />2:agora |
222
- | videoStream | number | 课堂类型,与 mediaType 需要对应上<br />2:视频课堂<br />1:语音课堂 |
223
- | enableNewClassExam | number | 新版随堂测选择题:1;<br />新版随堂测填空题:2;<br />新版随堂测选择+填空:3,建议:3 |
224
- | d_enableReRecording | number | 主讲、助教都可以重新录制课堂:3 |
225
- | | | |
226
- | | | |
227
-
228
- ##### 2.1.1.1.2、可选参数表格说明
229
-
230
- | 参数 | 类型 | 默认值 | 建议值 | 说明 |
231
- | :-: | :-: | :-: | :-: | :-- |
232
- | topic | string | 无 | 非空 | 显示该课堂的名称 |
233
- | onlineMode | number | 6 | 无 | 上台学生数,1:最大上台 1 个学生,6:最大上台 6 个学生,12:最大上台 12 个学生。默认:6 |
234
- | d_enableOMO | number | 0 | 无 | 是否开启站播模式,1:开启;0:关闭 |
235
- | d_delayEndTimes | number | 0 | 无 | 单节课最大延迟下课次数:1、2、3、4 |
236
- | d_delayEnd | number | 0 | 无 | 单次延时时间,单位秒:5*60、10 * 60、15*60、20 * 60、30\*60 |
237
- | d_restrictAssistantPerm | number | 0 | 无 | 是否开启了:大班课限制助教权限<br />1:开启<br />0:关闭 |
238
- | d_enableAvatarFreeScale | number | 0 | 无 | 开启头像任意比例缩放<br />0:关闭 1:开启,默认关闭 (非录制课堂、非无头像录制模式下,裁剪掉的老师/助教头像也会被录到回放中) |
239
- | d_enableObjectEraser | number | 0 | 无 | 新板书配置,二进制位存储<br />default: 0;默认关闭对象擦<br />7:手写(对象擦);<br /> |
240
- | d_vote | number | 0 | 1 | 0:未开放投票;1:开放投票 |
241
- | d_sharpness | number | 10 | 无 | 头像推流清晰度、桌面共享清晰度<br />**仅 onlineMode 为 1 时生效**:<br />10:标清 20:高清 21: 高清流畅 30:超清 31: 超清流畅 |
242
- | isNewMT | number | 0 | 1 | 是否支持 移动授课模式;<br />建议传 1 |
243
- | d_enableDualCamera | number | 0 | 无 | 是否开启双摄,1:开启,0: 关闭 |
244
- | recordType | number | 无 | 无 | 配置 recordAvartor 设置录制对象,参数说明参考[附录 9.1](#record-type) |
245
- | recordAvator | string | '' | 无 | 传入老师/助教的`loginName`表示录制对应人的头像 |
246
- | recordScreen | string | '' | 无 | 传入'screen'表示录制屏幕(当前仅支持录制老师屏幕)|
247
- | | | | | |
248
-
249
- <a id="generate-signature"></a>
250
- #### 2.1.1.2、根据 queryParams 对象生成签名字符串
251
-
252
- (1)**用户把 queryParams 作为参数传给自己的接口,接口返回值必须返回签名字符串:signature**
253
-
254
- (2)获取 signature 后需要把 signature 加到 queryParams 中作为一个参数
211
+ | <span style="white-space: nowrap;">字段名称</span> | <span style="white-space: nowrap;">是否必填</span> | <span style="white-space: nowrap;">类型</span> | <span style="white-space: nowrap;">字段描述</span> |
212
+ | --- | --- | --- |--- |
213
+ | appId | | string | 在申请接入时,伯索平台给予的 appId |
214
+ | validBegin | | number | 签名query生效的起始时间,Unix Epoch 时间戳,单位为秒 |
215
+ | validTime | | number | 签名query的有效期,从`validBegin`开始计算,单位为秒 |
216
+ | mediaType | | string | 媒体类型,取值:<ul><li>audio: 音频课堂</li><li>video: 视频课堂</li></ul>
217
+ | meetingType | | string | 课堂类型,固定值为`public` |
218
+ | meetingId | | string | 课堂ID,唯一标识该课堂;使用ASSIIC字符,不得包含/,\,空格等;长度在40字节以内的字符串。 |
219
+ | userType | | string | 用户角色类型,取值:<ul><li>speaker: 课堂的主讲者,有控制其他listener是否可板书/发言的权限。课堂中只能有一个主讲</li><li>assistant:助教,辅助主讲授课的角色,在课堂中的权限与主讲基本一致。课堂中可以有多个助教</li><li>listener:听众,可以理解为学生</li></ul> |
220
+ | loginName | 是 | string | 唯一标识该用户的id,不能为空,相同的loginName进入课堂时,后面进入的会使前面进入的登出 |
221
+ | userName | | string | 用户昵称,头像缺省时会显示 |
222
+ | d_dimension | | string | 固定值为`1280x720`,定义界面尺寸为16:9界面 |
223
+ | topic | | string | 课堂名称,在标题栏上显示 |
224
+ | endTime | | number | 课堂结束时间,格式为 Unix Epoch 时间戳,单位为秒 |
225
+ | onlineMode | | number | 当mediaType为`video`时生效,表示最大能开启的`listener`的摄像头的个数,取值:<ul><li>1</li><li>6</li><li>12</li></ul>默认值为6 |
226
+ | d_delayEndTimes | | number | 单节课最大延时下课次数,取值:<ul><li>1</li><li>2</li><li>3</li><li>4</li></ul>默认没有延时 |
227
+ | d_delayEnd | | number | 单次延时时间,单位为秒,取值:<ul><li>5 * 60</li><li>10 * 60</li><li>20 * 60</li><li>30 * 60</li></ul>默认20分钟 |
228
+ | d_enableAvatarFreeScale | | number | 是否开启头像任意比例缩放,仅上课中各端同步,录制头像时历史课堂不支持课堂调整的任意比例,取值:<ul><li>0:关闭</li><li>1:开启</li></ul>默认关闭 |
229
+ | d_enableObjectEraser | 否 | number | 是否启用新版板书,新版板书的橡皮擦支持对象擦除,传入大于0的值启用新版板书。取值:<ul><li>0: 不启用,橡皮功能为点擦</li><li>1: 支持对象擦除手写</li><li>3: 支持对象擦除手写+文本</li><li>5: 支持对象擦除手写+图形</li><li>7: 支持对象擦除手写+文本+图形</li></ul>默认不启用 |
230
+ | d_vote | 否 | number | 是否启用投票工具。取值:<ul><li>0:关闭</li><li>1:开启</li></ul>默认关闭 |
231
+ | d_sharpness | 否 | number | 当mediaType为`video`时生效,表示摄像头画面的清晰度。取值:<ul><li>10: 360p</li><li>20: 720p</li><li>30: 1080p</li></ul>默认值为10 |
232
+ | isNewMT || number | 是否支持移动授课模式,建议传1 |
233
+ | recordAvator || string | 传入老师或助教的`loginName`表示录制对应人的头像,传入`recordScreen`时SDK会忽略此参数 |
234
+ | recordScreen | 否 | string | 传入`screen`表示录制屏幕(当前仅支持录制老师屏幕)|
235
+ | enableNewClassExam | 否 | number | 是否启用新版随堂测,取值:<ul><li>0: 不启用</li><li>1: 启用选择题</li><li>2: 启用填空题</li><li>3: 启用选择题+填空题</li></ul>默认不启用,建议传3 |
236
+ | d_enableReRecording | 否 | number | 是否允许老师/助教重新录制,取值:<ul><li>0: 不允许老师和助教重新录制</li><li>1: 仅允许老师重新录制</li><li>2: 仅允许助教重新录制</li><li>3: 允许老师和助教重新录制</li></ul>默认值为3 |
237
+
238
+ **根据 queryParams 对象生成签名字符串**
239
+ > 注意:为了安全和各端签名统一,建议将签名的计算放在服务端,前端通过接口获取带签名的query
240
+
241
+ 将queryParams传入签名函数生成签名,签名示例参考:[签名示例](https://open.plaso.cn/doc-6285173?nav=01HEQ5Y5RXKMCPBPF6S8T3VK56)
242
+
243
+ 获取`signature`后将`signature`加到`queryParams`中作为一个字段。
255
244
 
256
245
  ```ts
257
246
  queryParams.signature = signature;
258
247
  ```
259
248
 
260
- (3)**服务端接口生成 signature 规则**如下:
261
-
262
- https://open.plaso.cn/doc-6285173?nav=01HEQ5Y5RXKMCPBPF6S8T3VK56
263
-
264
- **signKey**:机构申请接入时,伯索平台给予的 key
249
+ 获取完整的`queryParams`后,遍历`queryParams`生成`query`字符串,每个字段的值用`encodeURIComponent`编码。完整流程示例如下:
265
250
 
266
251
  ```ts
267
- /*!----------演示签名代码------------- */
268
-
269
- // 业务参数,根据接口文档中定义,自行生成填写
270
- const queryParams = { name: 'test' };
271
-
272
- //平台分配给机构的key
273
- const signKey = 'a_secret';
274
-
275
- // 业务参数和签名验证混合后排序
276
- const afterSortParam = Object.keys(queryParams).sort();
277
-
278
- const res = [];
279
- for (let key of afterSortParam) {
280
- res.push(`${key}=${queryParams[key]}`);
252
+ function genSignature(params) {
253
+ return 'xxx';
281
254
  }
282
255
 
283
- // 排序后连接成字符串
284
- const content = res.join('&');
285
-
286
- const crypto = require('crypto');
287
-
288
- // 使用分配的signKey来加密生成签名串signature
289
- const signature = crypto.createHmac('sha1', signKey).update(content).digest('hex').toUpperCase();
290
- ```
291
-
292
- #### 2.1.1.3、生成 query 字符串
293
-
294
- (1)获取 完整的 queryParams 后,遍历对象生成 query 字符串
295
-
296
- 每个参数值用 encodeURIComponent 编码
297
-
298
- ```ts
299
- // 代码示例:其中 queryParams 对象包含signature
300
- function genQuery(queryParams) {
301
- const keys = Object.keys(queryParams).sort();
256
+ function genQuery(params) {
257
+ const keys = Object.keys(params).sort();
302
258
  const res = [];
303
- for (let key of keys) {
304
- res.push(key + '=' + encodeURIComponent(queryParams[key]));
259
+ for (const key of keys) {
260
+ res.push(key + '=' + encodeURIComponent(params[key]));
305
261
  }
306
262
  return res.join('&');
307
263
  }
308
- genQuery(queryParams);
309
- ```
310
264
 
311
- <a id="prepare-class-params"></a>
312
- # 3、备课课堂入参说明
265
+ const queryParams = {
266
+ appId: 'xxx';
267
+ validBegin: 175645206;
268
+ validTime: 3600;
269
+ mediaType: 'video';
270
+ meetingType: 'public';
271
+ meetingId: 1234;
272
+ userType: 'speaker';
273
+ loginName: 'hello';
274
+ userName: 'world';
275
+ d_dimension: '1280x720';
276
+ };
313
277
 
314
- ## 3.1、参数 classOptions
278
+ const signature = genSignature(queryParams);
279
+ queryParams.signature = signature;
315
280
 
316
- ```
317
- 类型:Object
281
+ const query = genQuery(queryParams);
318
282
  ```
319
283
 
320
- ### 3.1.1、必传参数
284
+ #### 打开备课课堂
321
285
 
322
- | 参数 | 类型 | 说明 |
323
- | --------- | ------ | ------------------------------------------------------------------------------------ |
324
- | loginName | String | **唯一标识该用户的 id**,不能为空,相同的 loginName 登录,后面一个会使前面一个登出; |
325
- | userName | String | 登录的用户名,在列表中显示用 |
326
- | | | |
286
+ SDK打开一个新的`BrowserWindow`来加载备课课堂UI界面,示例代码如下:
327
287
 
328
- ### 3.1.2、可选参数
288
+ ```ts
289
+ const PlasoElectronSdk = window.require('@plasosdk/plaso-electron-sdk');
290
+ const createPrepareClassWindowParams: CreateClassWindowPamras = { classOptions: { loginName: 'hello', userName: 'world' } };
291
+ PlasoElectronSdk.createPrepareClassWindow(createPrepareClassWindowParams);
292
+ ```
329
293
 
330
- | 参数 | 类型 | 说明 |
331
- | --- | --- | --- |
332
- | displayAvatarUrl | String | 用户头像地址 |
333
- | topic | String | 默认值是中文的 “备课课堂” |
334
- | **d_enableObjectEraser** | number | 新板书配置,二进制位存储<br />default: 0;默认关闭对象擦<br />7:手写(对象擦);<br />**注意:该值需要和实时课堂的传值一样** |
335
- | | | |
294
+ ##### createPrepareClassWindow参数说明
336
295
 
337
- **注意:**
296
+ ###### classOptions
338
297
 
339
- 1、备课课堂直接通过任务栏关闭不会清空本地记录的板书内容,下次进入后会 板书交互会和上次进入的板书 配置一致(即使 d_enableObjectEraser 参数 值变动了)
298
+ ```ts
299
+ interface IPrepareClassOptions {
300
+ loginName: string;
301
+ userName: string;
302
+
303
+ displayAvatarUrl?: string;
304
+ topic?: string;
305
+ d_enableObjectEraser?: number;
306
+ }
307
+ ```
308
+
309
+ | <span style="white-space: nowrap;">参数名称</span> | <span style="white-space: nowrap;">是否必填</span> | <span style="white-space: nowrap;">类型</span> | <span style="white-space: nowrap;">参数描述</span> |
310
+ | --- | --- | --- | --- |
311
+ | loginName | 是 | string | 唯一标识该用户的id,不能为空,相同的loginName进入课堂时,后面进入的会使前面进入的登出 |
312
+ | userName | 是 | string | 用户昵称,头像缺省时会显示 |
313
+ | displayAvatarUrl | 否 | string | 用户头像地址。不传默认使用用户昵称作为头像。 |
314
+ | d_enableObjectEraser | 否 | number | 是否启用新版板书,新版板书的橡皮擦支持对象擦除,传入大于0的值启用新版板书。取值:<ul><li>0: 不启用,橡皮功能为点擦</li><li>1: 支持对象擦除手写</li><li>3: 支持对象擦除手写+文本</li><li>5: 支持对象擦除手写+图形</li><li>7: 支持对象擦除手写+文本+图形</li></ul>默认不启用 |
340
315
 
341
- # 4、打开实时课堂/备课课堂通用参数说明
316
+ #### 打开实时课堂/备课课堂通用参数说明
342
317
 
343
- ## 4.1、参数 electronWinOptions
318
+ ##### electronWinOptions
344
319
 
345
320
  > **即将弃用**: 不推荐传入,SDK内部默认设置了一些窗口参数,为了保证最佳体验,不要传入此参数。
346
321
 
@@ -350,29 +325,28 @@ Electron的窗口参数,详情参考 [Electron官方文档](https://www.electr
350
325
  type electronWinOptions = Electron.BrowserWindowConstructiorOptions;
351
326
  ```
352
327
 
353
- ## 4.2、参数回调 onClassWindowReadyFn
328
+ ##### onClassWindowReadyFn
354
329
 
355
330
  ```ts
356
331
  // 课堂窗口打开渲染成功后的回调,回调参数为 窗口id
357
332
  type onClassWindowReadyFn = (winId: number) => void;
358
333
  ```
359
334
 
360
- ## 4.3、参数回调 onClassWindowLeaveFn
335
+ ##### onClassWindowLeaveFn
361
336
 
362
337
  ```ts
363
338
  // 课堂窗口关闭后的回调,回调参数为 窗口id
364
339
  type onClassWindowLeaveFn = (winId: number) => void;
365
340
  ```
366
341
 
367
- ## 4.4、参数回调 onClassFinishedFn
342
+ ##### onClassFinishedFn
368
343
 
369
344
  ```ts
370
345
  // 课堂结束后的回调,回调参数为 课堂的meetingId
371
346
  type onClassFinishedFn = (meetingId: string) => void;
372
-
373
347
  ```
374
348
 
375
- ## 4.5、参数回调 onSaveBoardFn
349
+ ##### onSaveBoardFn
376
350
 
377
351
  **注意:**
378
352
 
@@ -401,7 +375,7 @@ type onSaveBoardFn = (
401
375
  ) => void;
402
376
  ```
403
377
 
404
- ## 4.6、参数回调 onOpenResourceCenterFn
378
+ ##### onOpenResourceCenterFn
405
379
 
406
380
  ```ts
407
381
  // 通知外部用户打开自己的资料中心,资料中心的具体ui和逻辑由外部用户自己实现
@@ -410,7 +384,7 @@ type onSaveBoardFn = (
410
384
  type onOpenResourceCenterFn = () => void;
411
385
  ```
412
386
 
413
- ## 4.7、参数回调 onGetExtFileNameFn
387
+ ##### onGetExtFileNameFn
414
388
 
415
389
  ```ts
416
390
  // 通过 insertObject 插入的文件传入 参数 info 时,怎么从info中获取文件的可访问地址的逻辑在用户那,所以需要函数从外部用户获取外部用户传入的文件地址
@@ -419,9 +393,9 @@ type onOpenResourceCenterFn = () => void;
419
393
  type onGetExtFileNameFn = (...args: any[]) => Promise<string>;
420
394
  ```
421
395
 
422
- # 5、API参考
396
+ #### API参考
423
397
 
424
- ## 5.1、PlasoElectronSdk.initLogConfig
398
+ ##### PlasoElectronSdk.initLogConfig
425
399
 
426
400
  **初始化课堂窗口日志位置**,窗口崩溃时会在同级目录下生成 reports 文件夹存储 dump,**在 调用 createLiveClassWindow 前设置**
427
401
 
@@ -443,7 +417,7 @@ const logFilePath = 'C:/Users/userName/Desktop/electronDemo/electron12.0.18_x32/
443
417
  PlasoElectronSdk.initLogConfig(logFilePath);
444
418
  ```
445
419
 
446
- ## 5.2、PlasoElectronSdk.getVersion
420
+ ##### PlasoElectronSdk.getVersion
447
421
 
448
422
  返回包的版本,格式:x.x.x
449
423
 
@@ -451,26 +425,26 @@ PlasoElectronSdk.initLogConfig(logFilePath);
451
425
  type getVersion = () => string;
452
426
  ```
453
427
 
454
- ## 5.3、PlasoElectronSdk.createLiveClassWindow
428
+ ##### PlasoElectronSdk.createLiveClassWindow
455
429
 
456
430
  **创建实时课堂窗口**
457
431
 
458
432
  ```ts
459
- function createLiveClassWindow(params: CreateClassPamras): void;
433
+ function createLiveClassWindow(params: CreateClassWindowPamras): void;
460
434
  ```
461
435
  参数详见[打开实时课堂/备课课堂方法入参类型定义](#open-sdk-window-params)
462
436
 
463
- ## 5.4、PlasoElectronSdk.createPrepareClassWindow
437
+ ##### PlasoElectronSdk.createPrepareClassWindow
464
438
 
465
439
  **创建备课课堂窗口**
466
440
  ```ts
467
- function createLiveClassWindow(params: CreateClassPamras): void;
441
+ function createLiveClassWindow(params: CreateClassWindowPamras): void;
468
442
  ```
469
443
  参数详见[打开实时课堂/备课课堂方法入参类型定义](#open-sdk-window-params)
470
444
 
471
445
  <a id="insert-object"></a>
472
446
 
473
- ## 5.5、PlasoElectronSdk.insertObject
447
+ ##### PlasoElectronSdk.insertObject
474
448
 
475
449
  用户从自己的资料中心往**实时课堂/备课课堂**插入文件
476
450
 
@@ -532,7 +506,7 @@ const PlasoElectronSdk = window.require('@plasosdk/plaso-electron-sdk');
532
506
  PlasoElectronSdk.insertObject(fileData);
533
507
  ```
534
508
 
535
- ### 5.5.1、插入备课文件
509
+ ###### 插入备课文件
536
510
 
537
511
  1、 插入 备课文件 的格式如下,其中 fileLocationPath 为 插入的备课文件资源的地址前缀,比如要本地插入一个备课文件(info.pb),其完整地址为 C:\Users\xxx\AppData\Roaming\plaso_sdk\prepareLessonsTemp\draft.swap\info.pb,则此时 fileLocationPath = C:\Users\xxx\AppData\Roaming\plaso_sdk\prepareLessonsTemp\draft.swap
538
512
 
@@ -549,7 +523,7 @@ const fileDataWithInfo = {
549
523
 
550
524
  1、**保存备课文件时,需要把 info.pb 和其他的图片文件放在同一个目录下,这样才可以通过一个 目录地址获取 备课的所有资源**
551
525
 
552
- ### 5.5.2、插入图片
526
+ ###### 插入图片
553
527
 
554
528
  ```ts
555
529
  // 图片可以通过url或info插入,当插入gif时,title需要带上.gif后缀
@@ -567,7 +541,7 @@ const fileDataWithInfo = {
567
541
  };
568
542
  ```
569
543
 
570
- ### 5.5.3、插入PPT
544
+ ###### 插入PPT
571
545
 
572
546
  ```ts
573
547
  // PPT仅支持url插入
@@ -579,7 +553,7 @@ const fileDataWithUrl = {
579
553
  };
580
554
  ```
581
555
 
582
- ### 5.5.4、插入音视频
556
+ ###### 插入音视频
583
557
 
584
558
  ```ts
585
559
  // 音视频可以通过url或info插入
@@ -598,7 +572,7 @@ const fileDataWithInfo = {
598
572
  }
599
573
  ```
600
574
 
601
- ### 5.5.5、插入PDF
575
+ ###### 插入PDF
602
576
  ```ts
603
577
  // PDF可以通过url或info插入
604
578
 
@@ -616,7 +590,7 @@ const fileDataWithInfo = {
616
590
  ```
617
591
 
618
592
 
619
- ### 5.5.6、插入WORD/EXCEL/DOC/XLS
593
+ ###### 插入WORD/EXCEL/DOC/XLS
620
594
 
621
595
  ```ts
622
596
  // WORD/EXCEL/DOC/XLS仅支持url插入
@@ -628,7 +602,7 @@ const fileDataWithUrl = {
628
602
  }
629
603
  ```
630
604
 
631
- # 6、资料中心
605
+ ## 资料中心
632
606
 
633
607
  step1、进课堂时,对象 **classOptions.supportShowResourceCenter** 需要是 true
634
608
 
@@ -638,45 +612,16 @@ step3、选择文件后,通过 **PlasoElectronSdk.insertObject** 方法插入
638
612
 
639
613
  step4、insertObject 方法 入参 有 info 时,此时 会触发进课堂时传入的回调函数 **onGetExtFileNameFn** 来获取文件的全地址
640
614
 
641
- # 7、播放历史课堂
615
+ ## 播放历史课堂
642
616
 
643
617
  1、参考文档: **[播放器SDK-Web播放器](https://open.plaso.cn/doc-6285192)**
644
618
 
645
619
  2、当课堂中insertObject使用了`info`属性时,SDK内部需要外部传入`getExtFileName`,因此历史课堂需要使用jssdk的接入方式, 详见:**[Web播放器-jssdk接入](https://open.plaso.cn/doc-6285192#jssdk%E6%8E%A5%E5%85%A5)**
646
620
 
647
- # 8、注意点
621
+ ## 注意点
648
622
 
649
623
  (1)用户的课堂外主窗口销毁时需要销毁课堂窗口
650
624
 
651
- (2electron 版本>=14.0.0 时:需要在主进程里 启动 remote
652
-
653
- ```ts
654
- try {
655
- const electronRemote = require('@electron/remote/main');
656
- electronRemote.initialize();
657
- // mainWindow为app启动的渲染进程窗口
658
- electronRemote.enable(mainWindow.webContents);
659
- } catch (error) {
660
- console.error(
661
- 'Module not found',
662
- 'Please run `npm install @electron/remote` to enable remote module and update electron version to 22.0.0 or higher',
663
- );
664
- }
665
- ```
666
-
667
- (3)**基于 此包封装新包时**:注意 @electron/remote 这个包的位置需要 和新包处于同级目录,需要把 和该包同级的@electron/remote 移到新包的同级目录处
668
-
669
- (4)确保 仅最后的 node_moudles 的顶层有 @electron/remote
670
-
671
- # 9、附录参数说明
672
-
673
- <a id="record-type"></a>
674
- ## 9.1、RecordType
625
+ (2)**基于 此包封装新包时**:注意 @electron/remote 这个包的位置需要 和新包处于同级目录,需要把 和该包同级的@electron/remote 移到新包的同级目录处
675
626
 
676
- | 值 | 说明 |
677
- | --- | ------------------------------- |
678
- | 1 | 无头像录制(仅录制板书) |
679
- | 2 | 录老师头像(录制老师头像+板书) |
680
- | 3 | 录助教头像(录制助教头像+板书) |
681
- | 4 | 录制课堂(录制整个屏幕和头像) |
682
- | 5 | 仅录老师头像 |
627
+ (3)确保 仅最后的 node_moudles 的顶层有 @electron/remote
package/js/main.js CHANGED
@@ -1,10 +1,12 @@
1
1
  const isElectron = !!process.versions['electron'];
2
2
  if (isElectron) {
3
- try {
3
+ try {
4
4
  require('@plasosdk/winproxy');
5
5
  require('@plasosdk/screenshot');
6
- require('@plasosdk/rtmpplayer');
7
-
6
+ } catch (error) {
7
+ console.error(error);
8
+ }
9
+ try {
8
10
  const { RENDER_TO_MAIN_MESG_TYPE } = require('./macro');
9
11
 
10
12
  const { app, ipcMain, crashReporter } = require('electron');
package/js/render.js CHANGED
@@ -108,7 +108,7 @@ function createClassWindow(classWindowProps) {
108
108
  rhost = `https://${env}.plaso.cn/static/yxtelectronsdk/`;
109
109
  dhost = `https://${env}.plaso.cn/`;
110
110
  } else {
111
- rhost = `https://wwwr.plaso.cn/static/sdk/styleupime/${classOptions.version ?? '1.58.104'}/`;
111
+ rhost = `https://wwwr.plaso.cn/static/sdk/styleupime/${classOptions.version ?? '1.58.307'}/`;
112
112
  dhost = 'https://www.plaso.cn/';
113
113
  }
114
114
 
@@ -143,6 +143,10 @@ function createClassWindow(classWindowProps) {
143
143
  fullScreenable,
144
144
  };
145
145
 
146
+ if (classOptionsObj.userType === 'monitor') {
147
+ classOptionsObj.monitor = true;
148
+ }
149
+
146
150
  /**----------------------------------------------------electron 窗口相关设置-----------------------------------*/
147
151
 
148
152
  const bounds = win.getBounds();
@@ -322,7 +326,6 @@ function createLiveClassWindow(liveClassWindowProps) {
322
326
  classOptions: {
323
327
  ...liveClassWindowProps.classOptions,
324
328
  appType: 'liveclassSDK',
325
- meetingType: 'private',
326
329
  classType: LESSON_TYPE.LIVECLASS,
327
330
  },
328
331
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasosdk/plaso-electron-sdk",
3
- "version": "1.3.4",
3
+ "version": "1.3.6",
4
4
  "description": "伯索课堂Electron SDK",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -15,7 +15,6 @@
15
15
  "classroom"
16
16
  ],
17
17
  "dependencies": {
18
- "@plasosdk/plasoffmpeg": "^1.1.0",
19
18
  "@plasosdk/screenshot": "^1.3.4",
20
19
  "@plasosdk/winproxy": "^1.1.5",
21
20
  "adm-zip": "^0.5.16",