@netless/slide 1.4.60 → 1.4.61-beta.0
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 +3 -19
- package/lib/FrozenTaskManager.d.ts +6 -3
- package/lib/FrozenTaskManager.js +48 -34
- package/lib/Slide.d.ts +4 -3
- package/lib/Slide.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -5,27 +5,11 @@
|
|
|
5
5
|
## changelog
|
|
6
6
|
|
|
7
7
|
### 1.4.60 (2026-09-21)
|
|
8
|
-
* 新增
|
|
9
|
-
*
|
|
10
|
-
* 修复部分移动浏览器播放前 `duration`、`seekable` 为 0 导致 Howler 提前结束且不触发权限回调的问题
|
|
11
|
-
* 修复视频启动时浏览器底层暂停独立音轨,以及用户点击恢复遇到 Howler pending play 无法重新播放的问题
|
|
12
|
-
|
|
13
|
-
### 1.4.60-alpha.0 (2026-09-20)
|
|
14
|
-
* 修复部分移动浏览器中 HTML5 音频播放请求卡住后,用户点击恢复仍无法重新发起播放的问题
|
|
15
|
-
* 避免将媒体加载或缓冲过程误判为自动播放权限错误,并忽略旧播放请求的迟到事件
|
|
8
|
+
* 新增 PPT 媒体权限回调和点击恢复接口:`onPptMediaPermissionRequest(callback)`、`playPptMedia()`
|
|
9
|
+
* 修复部分移动浏览器中 PPT 音视频无法自动播放或恢复的问题
|
|
16
10
|
|
|
17
11
|
### 1.4.59 (2026-09-18)
|
|
18
|
-
*
|
|
19
|
-
* 完善 Player 原地重置、候选 Player 交换和失败回退,避免快速切页后出现白屏或旧画面
|
|
20
|
-
* 加强纹理缓存隔离、取消任务清理和 context 释放超时保护,降低页面切换对 RTC 与其他 WebGL 内容的影响
|
|
21
|
-
|
|
22
|
-
### 1.4.59-alpha.4 (2026-09-17)
|
|
23
|
-
* 增强 PPT 媒体自动播放恢复:为 Howler/HTML5 音频与视频增加播放确认 watchdog,覆盖浏览器静默失败未触发 `playerror` 的场景
|
|
24
|
-
* 修正 Howler `playerror` 在内部状态已变为 playing 但 DOM 仍 paused 时被误过滤的问题
|
|
25
|
-
|
|
26
|
-
### 1.4.59-alpha.0 (2026-09-11)
|
|
27
|
-
* 新增 `onPptMediaPermissionRequest(callback)` 接口,用于通知当前 PPT 音视频需要用户交互后才能播放
|
|
28
|
-
* 新增 `playPptMedia()` 接口,用于在用户点击事件中恢复当前仍处于播放状态、且本地被浏览器拦截的 PPT 音视频
|
|
12
|
+
* 优化移动端切页时的播放器和 WebGL 资源管理,减少白屏和资源残留
|
|
29
13
|
|
|
30
14
|
### 1.4.58 (2026-09-07)
|
|
31
15
|
* 修复低版本 WebView 中纯色图形显示为黑块的问题
|
|
@@ -2,13 +2,16 @@ export interface FrozenTask {
|
|
|
2
2
|
type: "frozen" | "release";
|
|
3
3
|
status: "running" | "wait";
|
|
4
4
|
fn: () => Promise<void>;
|
|
5
|
+
promise: Promise<void>;
|
|
6
|
+
resolve: () => void;
|
|
7
|
+
reject: (error: unknown) => void;
|
|
5
8
|
}
|
|
6
9
|
export declare class FrozenTaskManager {
|
|
7
10
|
private tasks;
|
|
8
11
|
private isDestroy;
|
|
9
|
-
private
|
|
12
|
+
private runningTask?;
|
|
10
13
|
private schedule;
|
|
11
14
|
private getRunningTask;
|
|
12
|
-
addTask(type: "frozen" | "release", fn: () => Promise<void>): void
|
|
13
|
-
destroy(): void
|
|
15
|
+
addTask(type: "frozen" | "release", fn: () => Promise<void>): Promise<void>;
|
|
16
|
+
destroy(): Promise<void>;
|
|
14
17
|
}
|
package/lib/FrozenTaskManager.js
CHANGED
|
@@ -3,56 +3,70 @@ var FrozenTaskManager = /** @class */ (function () {
|
|
|
3
3
|
var _this = this;
|
|
4
4
|
this.tasks = [];
|
|
5
5
|
this.isDestroy = false;
|
|
6
|
-
this.isScheduling = false;
|
|
7
6
|
this.schedule = function () {
|
|
8
|
-
_this.
|
|
7
|
+
if (_this.runningTask || _this.isDestroy) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
9
10
|
var task = _this.tasks.shift();
|
|
10
|
-
if (task
|
|
11
|
-
|
|
12
|
-
task.fn.apply(null).then(function () {
|
|
13
|
-
if (_this.tasks.length > 0) {
|
|
14
|
-
setTimeout(_this.schedule);
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
_this.isScheduling = false;
|
|
18
|
-
}
|
|
19
|
-
}).catch(function () {
|
|
20
|
-
if (_this.tasks.length > 0) {
|
|
21
|
-
setTimeout(_this.schedule);
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
_this.isScheduling = false;
|
|
25
|
-
}
|
|
26
|
-
});
|
|
11
|
+
if (!task) {
|
|
12
|
+
return;
|
|
27
13
|
}
|
|
14
|
+
task.status = "running";
|
|
15
|
+
_this.runningTask = task;
|
|
16
|
+
void task.fn.apply(null).then(task.resolve, task.reject).finally(function () {
|
|
17
|
+
if (_this.runningTask === task) {
|
|
18
|
+
_this.runningTask = undefined;
|
|
19
|
+
}
|
|
20
|
+
if (!_this.isDestroy && _this.tasks.length > 0) {
|
|
21
|
+
setTimeout(_this.schedule);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
28
24
|
};
|
|
29
25
|
}
|
|
30
26
|
FrozenTaskManager.prototype.getRunningTask = function () {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
return null;
|
|
27
|
+
var _a;
|
|
28
|
+
return (_a = this.runningTask) !== null && _a !== void 0 ? _a : null;
|
|
35
29
|
};
|
|
36
30
|
FrozenTaskManager.prototype.addTask = function (type, fn) {
|
|
31
|
+
if (this.isDestroy) {
|
|
32
|
+
return Promise.resolve();
|
|
33
|
+
}
|
|
34
|
+
var runningTask = this.getRunningTask();
|
|
35
|
+
if (runningTask && type === runningTask.type) {
|
|
36
|
+
return runningTask.promise;
|
|
37
|
+
}
|
|
38
|
+
var queuedTask = this.tasks.find(function (task) { return task.type === type; });
|
|
39
|
+
if (queuedTask) {
|
|
40
|
+
return queuedTask.promise;
|
|
41
|
+
}
|
|
42
|
+
var resolveTask;
|
|
43
|
+
var rejectTask;
|
|
44
|
+
var promise = new Promise(function (resolve, reject) {
|
|
45
|
+
resolveTask = resolve;
|
|
46
|
+
rejectTask = reject;
|
|
47
|
+
});
|
|
48
|
+
// Existing callers are allowed to ignore frozen()/release(). Keep the
|
|
49
|
+
// original promise observable to awaiters without creating an
|
|
50
|
+
// unhandled rejection for legacy fire-and-forget calls.
|
|
51
|
+
promise.catch(function () { return undefined; });
|
|
37
52
|
var task = {
|
|
38
53
|
type: type,
|
|
39
54
|
status: "wait",
|
|
40
55
|
fn: fn,
|
|
56
|
+
promise: promise,
|
|
57
|
+
resolve: resolveTask,
|
|
58
|
+
reject: rejectTask,
|
|
41
59
|
};
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
this.tasks = this.tasks.filter(function (v) { return v.type !== type; });
|
|
48
|
-
this.tasks.push(task);
|
|
49
|
-
if (!this.isScheduling) {
|
|
50
|
-
this.schedule();
|
|
51
|
-
}
|
|
52
|
-
}
|
|
60
|
+
this.tasks.push(task);
|
|
61
|
+
this.schedule();
|
|
62
|
+
return promise;
|
|
53
63
|
};
|
|
54
64
|
FrozenTaskManager.prototype.destroy = function () {
|
|
65
|
+
var _a, _b;
|
|
55
66
|
this.isDestroy = true;
|
|
67
|
+
var pending = this.tasks.splice(0, this.tasks.length);
|
|
68
|
+
pending.forEach(function (task) { return task.resolve(); });
|
|
69
|
+
return (_b = (_a = this.runningTask) === null || _a === void 0 ? void 0 : _a.promise.catch(function () { return undefined; })) !== null && _b !== void 0 ? _b : Promise.resolve();
|
|
56
70
|
};
|
|
57
71
|
return FrozenTaskManager;
|
|
58
72
|
}());
|
package/lib/Slide.d.ts
CHANGED
|
@@ -460,6 +460,7 @@ export declare class Slide extends Slide_base {
|
|
|
460
460
|
private lifecycle;
|
|
461
461
|
private lifecycleGeneration;
|
|
462
462
|
private renderVisibilityTimers;
|
|
463
|
+
private destroyPromise?;
|
|
463
464
|
private isLoading;
|
|
464
465
|
private isReleasing;
|
|
465
466
|
private interactive;
|
|
@@ -718,12 +719,12 @@ export declare class Slide extends Slide_base {
|
|
|
718
719
|
/**
|
|
719
720
|
* Enter freeze state, cache the ppt screen as an image, and release the WebGL context.
|
|
720
721
|
*/
|
|
721
|
-
frozen(callback?: () => void): void
|
|
722
|
+
frozen(callback?: () => void): Promise<void>;
|
|
722
723
|
private _doRelease;
|
|
723
724
|
/**
|
|
724
725
|
* Recover from frozen state.
|
|
725
726
|
*/
|
|
726
|
-
release(callback?: () => void): void
|
|
727
|
+
release(callback?: () => void): Promise<void>;
|
|
727
728
|
private _doDestroy;
|
|
728
729
|
private waitLoadEnd;
|
|
729
730
|
/**
|
|
@@ -735,7 +736,7 @@ export declare class Slide extends Slide_base {
|
|
|
735
736
|
/**
|
|
736
737
|
* Destruction method.
|
|
737
738
|
*/
|
|
738
|
-
destroy(): void
|
|
739
|
+
destroy(): Promise<void>;
|
|
739
740
|
/**
|
|
740
741
|
* Destroy the local cache of the current Slide instance, need to be called before destroy.
|
|
741
742
|
*/
|