@plasosdk/plaso-electron-sdk 1.2.11 → 1.2.16

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/README.md CHANGED
@@ -82,14 +82,31 @@ PlasoElectronSdk.initLogConfig(logFilePath);
82
82
  #### 1.2.3.4、[创建 课堂/备课 窗口](#5.3、createLiveClassWindow)
83
83
 
84
84
  ```ts
85
+ interface CreateClassPamras {
86
+ classOptions: Object;
87
+ electronWinOptions?: Object;
88
+ onClassWindowReadyFn?: (winId: number) => void
89
+ onClassWindowLeaveFn?: (winId: number) => void
90
+ onClassFinishedFn?: (meetingId: string) => void;
91
+ onSaveBoardFn?: (
92
+ params: {
93
+ fileInfo: FileParams[];
94
+ fileName?: string;
95
+ },
96
+ callback: (result: boolean) => void,
97
+ ) => void;
98
+ onOpenResourceCenterFn?: () => void;
99
+ onGetExtFileNameFn?: (...args: any[]) => Promise<string>;
100
+ }
101
+
85
102
  // 代码示例
86
103
  const PlasoElectronSdk = window.require('@plasosdk/plaso-electron-sdk');
87
- const classObj = {};
104
+ const createClassParams: CreateClassPamras = { classOptions: { query } };
88
105
 
89
106
  //创建实时课堂
90
- PlasoElectronSdk.createLiveClassWindow(classObj);
107
+ PlasoElectronSdk.createLiveClassWindow(createClassParams);
91
108
  // or 创建备课课堂
92
- PlasoElectronSdk.createPrepareClassWindow(classObj);
109
+ PlasoElectronSdk.createPrepareClassWindow(createClassParams);
93
110
  ```
94
111
 
95
112
  # 2、实时课堂入参说明
@@ -111,7 +128,6 @@ PlasoElectronSdk.createPrepareClassWindow(classObj);
111
128
  | enableRTC3A | 否 | boolean | true | 是否启用 3A。<br />false:关闭回音消除、关闭降噪、关闭增益控制 |
112
129
  | supportShowResourceCenter | 否 | boolean | false | true:工具栏显示 资料中心 按钮,但资料中心的逻辑需要用户自己实现 |
113
130
  | supportSaveBoard | 否 | boolean | false | 是否支持保存板书,依赖于资料中心实现保存和插入板书文件 |
114
- | env | 否 | string | 无 | sdk 数据环境参数,支持 dev、test、itest、ftest、www |
115
131
  | enableLiveNewShareRegion | 否 | boolean | false | 是否允许区域共享 |
116
132
  | enableLiveNewShareInTouch | 否 | boolean | false | 是否支持触屏模式下的新桌面共享(左侧新增按钮窗口来切换显示工具栏)<br />建议开启 |
117
133
  | enableLiveNewShare | 否 | boolean | false | 是否支持新桌面共享<br />开启新桌面共享需要开启 electron 透明窗口,且可能触发 electron 本身存在的长时间透传导致的在应用上鼠标失焦问题 |
@@ -124,7 +140,7 @@ PlasoElectronSdk.createPrepareClassWindow(classObj);
124
140
  **query 属性格式示例**:
125
141
 
126
142
  ```
127
- appId=plaso&appType=liveclassSDK&d_dimension=1280x720&dhost=https%3A%2F%2Fdev.plaso.cn%2F&enableHiliter=true&enableNewClassExam=1&enableVideoMark=true&env=dev&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'
143
+ 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
128
144
  ```
129
145
 
130
146
  #### 2.1.1.1、组成 queryParams 对象
@@ -132,6 +148,7 @@ appId=plaso&appType=liveclassSDK&d_dimension=1280x720&dhost=https%3A%2F%2Fdev.pl
132
148
  ```ts
133
149
  interface IQueryParams {
134
150
  appId: string;
151
+ signature: string;
135
152
  validBegin: number;
136
153
  validTime: number;
137
154
  endTime: number;
@@ -168,6 +185,7 @@ interface IQueryParams {
168
185
  | 参数 | 类型 | 说明 |
169
186
  | --- | --- | --- |
170
187
  | appId | string | 在申请接入时,伯索平台给予的 appId |
188
+ | signature | string | 签名字符串,根据queryParams中除去signature参数的其他参数生成,生成示例参考[根据queryParams对象生成签名字符串](#2112根据-queryParams-对象生成签名字符串) |
171
189
  | validBegin | number | 请求课堂**开始生效起始时间**的 Unix Epoch 时间戳,单位秒:(时间戳/1000 再取整) |
172
190
  | validTime | number | 请求的**签名在课堂的有效时间段**(断网重连后会重新校验签名),单位秒,建议: 24 _ 60 _ 60 s |
173
191
  | endTime | number | 请求课堂**结束时间**的 Unix Epoch 时间戳,单位秒:(时间戳/1000 再取整) |
@@ -268,13 +286,6 @@ function genQuery(queryParams) {
268
286
  genQuery(queryParams);
269
287
  ```
270
288
 
271
- ## 2.2、课堂结束的回调 onClassFinishedFn
272
-
273
- ```ts
274
- // 课堂结束后的回调,回调参数为 课堂的meetingId
275
- (meetingId: string) => void
276
-
277
- ```
278
289
 
279
290
  # 3、备课课堂入参说明
280
291
 
@@ -289,7 +300,7 @@ genQuery(queryParams);
289
300
  | 参数 | 类型 | 说明 |
290
301
  | --------- | ------ | ------------------------------------------------------------------------------------ |
291
302
  | loginName | String | **唯一标识该用户的 id**,不能为空,相同的 loginName 登录,后面一个会使前面一个登出; |
292
- | username | String | 登录的用户名,在列表中显示用 |
303
+ | userName | String | 登录的用户名,在列表中显示用 |
293
304
  | | | |
294
305
 
295
306
  ### 3.1.2、可选参数
@@ -299,7 +310,6 @@ genQuery(queryParams);
299
310
  | displayAvatarUrl | String | 用户头像地址 |
300
311
  | topic | String | 默认值是中文的 “备课课堂” |
301
312
  | **d_enableObjectEraser** | number | 新板书配置,二进制位存储<br />default: 0;默认关闭对象擦<br />7:手写(对象擦);<br />**注意:该值需要和实时课堂的传值一样** |
302
- | env | String | sdk 数据环境参数,支持:dev、test、itest、ftest、www |
303
313
  | | | |
304
314
 
305
315
  **注意:**
@@ -330,7 +340,15 @@ type onClassWindowReadyFn = (winId: number) => void;
330
340
  type onClassWindowLeaveFn = (winId: number) => void;
331
341
  ```
332
342
 
333
- ## 4.4、参数回调 onSaveBoardFn
343
+ ## 4.4、参数回调 onClassFinishedFn
344
+
345
+ ```ts
346
+ // 课堂结束后的回调,回调参数为 课堂的meetingId
347
+ type onClassFinishedFn = (meetingId: string) => void;
348
+
349
+ ```
350
+
351
+ ## 4.5、参数回调 onSaveBoardFn
334
352
 
335
353
  **注意:**
336
354
 
@@ -359,18 +377,16 @@ type onSaveBoardFn = (
359
377
  ) => void;
360
378
  ```
361
379
 
362
- fileInfo 格式如下:
363
-
364
- ![img](./image/备课1.png)
365
-
366
- ## 4.5、参数回调 onOpenResourceCenterFn
380
+ ## 4.6、参数回调 onOpenResourceCenterFn
367
381
 
368
382
  ```ts
369
383
  // 通知外部用户打开自己的资料中心,资料中心的具体ui和逻辑由外部用户自己实现
384
+ // 推荐:通过onClassWindowReadyFn回调的winId拿到课堂窗口实例,用户的云盘通过一个BrowserWindow
385
+ // 和课堂窗口组成父子窗口,云盘是子窗口,并且云盘窗口打开时保持置顶,这样来保证云盘打开时始终可见并且跟随课堂窗口。
370
386
  type onOpenResourceCenterFn = () => void;
371
387
  ```
372
388
 
373
- ## 4.6、参数回调 onGetExtFileNameFn
389
+ ## 4.7、参数回调 onGetExtFileNameFn
374
390
 
375
391
  ```ts
376
392
  // 通过 insertObject 插入的文件传入 参数 info 时,怎么从info中获取文件的可访问地址的逻辑在用户那,所以需要函数从外部用户获取外部用户传入的文件地址
@@ -522,10 +538,9 @@ const FILE_TYPE = {
522
538
  * @property {string} [url] 文件的可下载地址
523
539
  */
524
540
  /**
525
- * @param {string | number} winId 课堂id
526
541
  * @param {fileDataObj} fileData 文件数据
527
542
  */
528
- type insertObject = (webContentId, fileData) => void;
543
+ type insertObject = (fileData) => void;
529
544
  ```
530
545
 
531
546
  ### 5.5.1、插入备课文件
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@plasosdk/plaso-electron-sdk",
3
- "version": "1.2.11",
4
- "description": "",
3
+ "version": "1.2.16",
4
+ "description": "伯索课堂Electron SDK",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
7
  "start": "electron .",
@@ -9,9 +9,10 @@
9
9
  "download": "node ./scripts/downloadPrebuild.js"
10
10
  },
11
11
  "keywords": [
12
+ "plaso",
13
+ "sdk",
12
14
  "electron",
13
- "windows",
14
- "mac"
15
+ "classroom"
15
16
  ],
16
17
  "dependencies": {
17
18
  "@plasosdk/plasoffmpeg": "^1.1.0",
package/publish.js ADDED
@@ -0,0 +1,312 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Plaso SDK 发布脚本
5
+ *
6
+ * 功能:
7
+ * - 自动升级版本号(major/minor/patch)
8
+ * - 检查登录状态
9
+ * - 发布包
10
+ *
11
+ * 使用方法:
12
+ * - 基本用法: npm run release
13
+ * (无参数时会进入交互模式,询问是否跳过版本升级)
14
+ * - 跳过版本升级(推荐): npm run release-skip
15
+ * - 跳过版本升级(手动传参): npm run release -- --skip-version-upgrade
16
+ * - 跳过版本升级(简写): npm run release -- -s
17
+ *
18
+ * 注意:
19
+ * - 使用跳过版本选项时,会检查当前版本是否已发布,如已发布会提示确认
20
+ * - 如果您手动修改了版本号,建议使用跳过版本升级选项
21
+ * - 此脚本假设您已经手动设置了正确的npm源,不会自动切换源
22
+ */
23
+
24
+ const { execSync } = require('child_process');
25
+ const readline = require('readline');
26
+ const fs = require('fs');
27
+ const path = require('path');
28
+
29
+ // 创建readline接口
30
+ const rl = readline.createInterface({
31
+ input: process.stdin,
32
+ output: process.stdout
33
+ });
34
+
35
+ // 添加跨平台休眠函数
36
+ function sleep(seconds) {
37
+ // 根据操作系统选择合适的休眠方法
38
+ const isWindows = process.platform === 'win32';
39
+
40
+ try {
41
+ if (isWindows) {
42
+ // Windows 使用 timeout 命令
43
+ execSync(`timeout /t ${seconds}`, { stdio: 'ignore' });
44
+ } else {
45
+ // Unix 系统使用 sleep 命令
46
+ execSync(`sleep ${seconds}`, { stdio: 'ignore' });
47
+ }
48
+ } catch (error) {
49
+ // 如果命令执行失败,使用JavaScript的setTimeout作为备选
50
+ console.log(`系统休眠命令失败,使用JavaScript休眠 ${seconds} 秒`);
51
+ const start = Date.now();
52
+ while (Date.now() - start < seconds * 1000) {
53
+ // 空循环等待
54
+ }
55
+ }
56
+ }
57
+
58
+ // 执行命令的函数
59
+ function executeCommand(command) {
60
+ try {
61
+ execSync(command, { stdio: 'inherit' });
62
+ return true;
63
+ } catch (error) {
64
+ // 检查是否是版本已存在的错误
65
+ if (error.message.includes('You cannot publish over the previously published versions')) {
66
+ console.log('\n该版本已经发布过了,无需重复发布');
67
+ return true;
68
+ }
69
+ console.error(`执行命令失败: ${command}`);
70
+ console.error(error.message);
71
+ return false;
72
+ }
73
+ }
74
+
75
+ // 检查npm登录状态
76
+ function checkNpmLoginStatus() {
77
+ try {
78
+ // 直接使用npm命令而不是npx
79
+ const output = execSync('npm whoami', { encoding: 'utf8' });
80
+ const username = output.trim();
81
+ if (username.length > 0) {
82
+ console.log(`当前登录用户: ${username}`);
83
+ return true;
84
+ }
85
+ return false;
86
+ } catch (error) {
87
+ console.log('npm登录状态检查失败,您可能尚未登录');
88
+ return false;
89
+ }
90
+ }
91
+
92
+ // 确保npm登录
93
+ async function ensureNpmLogin() {
94
+ console.log('\n检查npm登录状态...');
95
+
96
+ // 检查登录状态
97
+ const isLoggedIn = checkNpmLoginStatus();
98
+ if (!isLoggedIn) {
99
+ console.log('未登录,开始登录流程...');
100
+
101
+ // 登录命令
102
+ const loginCmd = 'npm login';
103
+ if (!executeCommand(loginCmd)) {
104
+ throw new Error('npm登录失败');
105
+ }
106
+
107
+ // 再次检查登录状态
108
+ if (!checkNpmLoginStatus()) {
109
+ throw new Error('登录失败,请重试');
110
+ }
111
+
112
+ console.log('登录成功!');
113
+ return true;
114
+ } else {
115
+ console.log('已经登录,跳过登录步骤');
116
+ return true;
117
+ }
118
+ }
119
+
120
+ // 提示用户输入
121
+ function prompt(question) {
122
+ return new Promise((resolve) => {
123
+ rl.question(question, (answer) => {
124
+ resolve(answer);
125
+ });
126
+ });
127
+ }
128
+
129
+ // 读取package.json文件
130
+ function readPackageJson() {
131
+ const packagePath = path.join(process.cwd(), 'package.json');
132
+ const packageContent = fs.readFileSync(packagePath, 'utf8');
133
+ return JSON.parse(packageContent);
134
+ }
135
+
136
+ // 写入package.json文件
137
+ function writePackageJson(packageJson) {
138
+ const packagePath = path.join(process.cwd(), 'package.json');
139
+ fs.writeFileSync(packagePath, JSON.stringify(packageJson, null, 2) + '\n');
140
+ }
141
+
142
+ // 升级版本号
143
+ function upgradeVersion(currentVersion, type) {
144
+ const [major, minor, patch] = currentVersion.split('.').map(Number);
145
+
146
+ switch (type) {
147
+ case 'major':
148
+ return `${major + 1}.0.0`;
149
+ case 'minor':
150
+ return `${major}.${minor + 1}.0`;
151
+ case 'patch':
152
+ default:
153
+ return `${major}.${minor}.${patch + 1}`;
154
+ }
155
+ }
156
+
157
+ // 检查版本是否已发布
158
+ async function checkVersionExists(packageName, version) {
159
+ try {
160
+ console.log(`检查版本 ${packageName}@${version} 是否已发布...`);
161
+ const cmd = `npx npm view ${packageName}@${version} version --json`;
162
+
163
+ try {
164
+ execSync(cmd, { stdio: 'ignore' });
165
+ console.log(`版本 ${version} 已存在于npm仓库`);
166
+ return true;
167
+ } catch (e) {
168
+ // 如果命令执行失败,通常意味着版本不存在
169
+ console.log(`版本 ${version} 不存在于npm仓库,可以发布`);
170
+ return false;
171
+ }
172
+ } catch (error) {
173
+ console.error('检查版本失败:', error.message);
174
+ // 发生错误时,默认允许继续(让npm publish时再判断)
175
+ return false;
176
+ }
177
+ }
178
+
179
+ // 解析命令行参数
180
+ function parseArgs() {
181
+ const args = process.argv.slice(2);
182
+ const options = {
183
+ skipVersionUpgrade: false,
184
+ interactive: args.length === 0 // 如果没有传入参数,则启用交互模式
185
+ };
186
+
187
+ for (let i = 0; i < args.length; i++) {
188
+ const arg = args[i];
189
+ if (arg === '--skip-version-upgrade' || arg === '-s') {
190
+ options.skipVersionUpgrade = true;
191
+ }
192
+ }
193
+
194
+ return options;
195
+ }
196
+
197
+ async function main() {
198
+ // 解析命令行参数
199
+ const options = parseArgs();
200
+
201
+ try {
202
+ console.log('开始发布SDK...');
203
+
204
+ // 交互模式:如果没有传入命令行参数,则询问是否要跳过版本升级
205
+ if (options.interactive) {
206
+ const skipVersionAnswer = await prompt('是否跳过版本升级? (y/n): ');
207
+ if (skipVersionAnswer.toLowerCase() === 'y') {
208
+ options.skipVersionUpgrade = true;
209
+ console.log('已选择跳过版本升级');
210
+ }
211
+ }
212
+
213
+ // 0. 升级版本号
214
+ console.log('\n0. 升级版本号...');
215
+ const packageJson = readPackageJson();
216
+ const currentVersion = packageJson.version;
217
+ let newVersion;
218
+
219
+ // 如果命令行参数指定跳过版本升级
220
+ if (options.skipVersionUpgrade) {
221
+ console.log('检测到--skip-version-upgrade参数,跳过版本升级');
222
+ newVersion = currentVersion;
223
+ } else {
224
+ console.log(`当前版本: ${currentVersion}`);
225
+ console.log('请选择版本升级类型:');
226
+ console.log('1. major - 主版本号升级 (不兼容的API变更)');
227
+ console.log('2. minor - 次版本号升级 (向后兼容的功能性新增)');
228
+ console.log('3. patch - 修订号升级 (向后兼容的问题修正)');
229
+ console.log('4. skip - 跳过版本升级,保持当前版本');
230
+
231
+ const versionType = await prompt('请输入选项 (1/2/3/4,默认为3): ');
232
+ let type;
233
+
234
+ switch (versionType.trim()) {
235
+ case '1':
236
+ type = 'major';
237
+ newVersion = upgradeVersion(currentVersion, type);
238
+ break;
239
+ case '2':
240
+ type = 'minor';
241
+ newVersion = upgradeVersion(currentVersion, type);
242
+ break;
243
+ case '4':
244
+ console.log('已选择跳过版本升级');
245
+ newVersion = currentVersion;
246
+ break;
247
+ case '3':
248
+ default:
249
+ type = 'patch';
250
+ newVersion = upgradeVersion(currentVersion, type);
251
+ break;
252
+ }
253
+ }
254
+
255
+ console.log(`版本: ${newVersion}`);
256
+
257
+ // 如果版本没有变化,直接询问是否确认发布
258
+ const confirmMessage = newVersion === currentVersion
259
+ ? `确认发布当前版本 ${currentVersion}? (y/n): `
260
+ : `确认将版本从 ${currentVersion} 升级到 ${newVersion}? (y/n): `;
261
+
262
+ const confirm = await prompt(confirmMessage);
263
+ if (confirm.toLowerCase() !== 'y') {
264
+ console.log('已取消发布');
265
+ return;
266
+ }
267
+
268
+ // 只有当版本变化时才写入package.json
269
+ if (newVersion !== currentVersion) {
270
+ packageJson.version = newVersion;
271
+ writePackageJson(packageJson);
272
+ console.log(`版本已更新为 ${newVersion}`);
273
+ } else {
274
+ console.log(`继续使用当前版本 ${currentVersion}`);
275
+
276
+ // 当用户选择继续使用当前版本时,检查该版本是否已发布
277
+ const versionExists = await checkVersionExists(packageJson.name, currentVersion);
278
+ if (versionExists) {
279
+ console.log(`\n警告: 版本 ${currentVersion} 已经发布,继续操作会失败。`);
280
+ const forceContinue = await prompt('是否仍要继续? (y/n): ');
281
+ if (forceContinue.toLowerCase() !== 'y') {
282
+ console.log('已取消发布');
283
+ return;
284
+ }
285
+ console.log('用户选择强制继续,可能会在发布时报错');
286
+ }
287
+ }
288
+
289
+ // 1. 确保登录
290
+ console.log('\n1. 检查登录状态...');
291
+ if (!await ensureNpmLogin()) {
292
+ throw new Error('登录失败');
293
+ }
294
+
295
+ // 2. 发布包
296
+ console.log('\n2. 开始发布包...');
297
+ const publishCmd = 'npm publish --ignore-scripts';
298
+ if (!executeCommand(publishCmd)) {
299
+ throw new Error('发布包失败');
300
+ }
301
+
302
+ console.log(`\n恭喜!${packageJson.name}@${newVersion} 已成功发布到npm!`);
303
+
304
+ } catch (error) {
305
+ console.error('\n发布失败:', error.message);
306
+ process.exit(1);
307
+ } finally {
308
+ rl.close();
309
+ }
310
+ }
311
+
312
+ main();
Binary file