@netless/slide 0.3.8 → 0.4.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 CHANGED
@@ -358,6 +358,63 @@ clearSlideCache(): void;
358
358
  static clearLocalCache(): void;
359
359
  ```
360
360
 
361
+ ### 资源代理
362
+
363
+ **注意: `@netless/slide@0.4.0` 版本才开始支持。**
364
+
365
+ 从 `@netless/slide@0.4.0` 开始, 你可以在创建 Slide 对象时提供一个 loaderDelegate 对象, 从而代理 Slide 内部所有远程资源, 进而可以实现
366
+ 资源重定向, 资源鉴权等需求.
367
+
368
+ loaderDelegate 属性需符合 `ILoaderDelegate` 接口, 需要注意对于媒体资源, 并不能直接返回资源内容, 只能同步的返回重定向后的资源地址.
369
+
370
+ ```typescript
371
+ export interface ILoaderDelegate {
372
+ /**
373
+ * 加载 json 资源, 需返回 json 文本
374
+ * @param url 原始资源地址
375
+ */
376
+ loadJson(url: string): Promise<string>;
377
+ /**
378
+ * 加载图片资源, 需返回 Blob 对象
379
+ * @param url 原始资源地址
380
+ */
381
+ loadImage(url: string): Promise<Blob>;
382
+ /**
383
+ * 媒体文件重定向, mp3 和 mp4 资源会调用这个代理函数, 需返回重定向后的 url
384
+ * @param url 原始资源地址
385
+ */
386
+ redirectMedia(url: string): string;
387
+ }
388
+ ```
389
+
390
+ 一个什么也不干的 loaderDelegate 如下所示, 但是你可以对传入的 url 进行加工:
391
+
392
+ ```typescript
393
+ import { Slide, ILoaderDelegate } from "@netless/slide"
394
+
395
+ const delegate: ILoaderDelegate = {
396
+ loadJson(url: string): Promise<string> {
397
+ return fetch(url).then(res => {
398
+ return res.text();
399
+ });
400
+ },
401
+ loadImage(url: string): Promise<Blob> {
402
+ return fetch(url).then(res => {
403
+ return res.blob();
404
+ });
405
+ },
406
+ redirectMedia(url: string): string {
407
+ return url;
408
+ }
409
+ }
410
+
411
+ const slide = new Slide({
412
+ /// ... 其他初始化配置
413
+ loaderDelegate: delegate,
414
+ })
415
+ ```
416
+
417
+
361
418
  ## [示例及具体文档参考](https://github.com/netless-io/netless-slide-demo)
362
419
 
363
420
  ## changelog
@@ -495,3 +552,11 @@ static clearLocalCache(): void;
495
552
 
496
553
  #### 0.3.8
497
554
  * subtask 错误添加子任务类型输出,方便定位 bug
555
+
556
+ #### 0.3.9
557
+ * 新增 resourceTimeout 配置
558
+ * 修复资源加载引起的错误无法跳转下一页的问题
559
+
560
+ #### 0.3.10
561
+ * 新增本地日志下载功能
562
+ * 修复加载状态不一致导致无法下一步的问题
@@ -17,4 +17,5 @@ export declare class RenderingTaskManager {
17
17
  private replaceIdleTask;
18
18
  addTask(fn: () => Promise<void>, slideIndex: number, id: string): void;
19
19
  hasStartTask(): boolean;
20
+ destroy(): void;
20
21
  }
@@ -131,6 +131,9 @@ var RenderingTaskManager = /** @class */ (function () {
131
131
  RenderingTaskManager.prototype.hasStartTask = function () {
132
132
  return this.tasks.some(function (t) { return t.state === "start"; });
133
133
  };
134
+ RenderingTaskManager.prototype.destroy = function () {
135
+ this.eventHub.removeAllListeners();
136
+ };
134
137
  return RenderingTaskManager;
135
138
  }());
136
139
  export { RenderingTaskManager };
package/lib/Slide.d.ts CHANGED
@@ -1,4 +1,6 @@
1
+ import { SlideError, ILoaderDelegate } from "@netless/ppt-player";
1
2
  export { ErrorType } from "@netless/ppt-player";
3
+ export type { ILoaderDelegate } from "@netless/ppt-player";
2
4
  export interface RtcAudio {
3
5
  /**
4
6
  * 开始播放音频.
@@ -153,6 +155,14 @@ export interface ISlideConfig {
153
155
  * 默认为 true
154
156
  */
155
157
  useLocalCache?: boolean;
158
+ /**
159
+ * 资源加载超时时间, 默认 15 秒
160
+ */
161
+ resourceTimeout?: number;
162
+ /**
163
+ * 远程资源代理, 详细使用参考 README
164
+ */
165
+ loaderDelegate?: ILoaderDelegate;
156
166
  }
157
167
  interface MediaState {
158
168
  type: "pause" | "play";
@@ -235,11 +245,11 @@ export interface SlideEventEmitter {
235
245
  emit(event: typeof SLIDE_EVENTS.syncReceive, args: SyncEvent): boolean;
236
246
  on(event: typeof SLIDE_EVENTS.syncReceive, listener: (event: SyncEvent) => void): this;
237
247
  emit(event: typeof SLIDE_EVENTS.renderError, args: {
238
- error: Error;
248
+ error: SlideError;
239
249
  index: number;
240
250
  }): boolean;
241
251
  on(event: typeof SLIDE_EVENTS.renderError, listener: (args: {
242
- error: Error;
252
+ error: SlideError;
243
253
  index: number;
244
254
  }) => void): this;
245
255
  emit(event: typeof SLIDE_EVENTS.animateStart): boolean;
@@ -257,6 +267,10 @@ export interface SlideEventEmitter {
257
267
  }
258
268
  declare const Slide_base: new () => SlideEventEmitter;
259
269
  export declare class Slide extends Slide_base {
270
+ static logStore: LocalForage;
271
+ static _tempLog: string;
272
+ static _tempLogIndex: number;
273
+ static flushLog(): Promise<void>;
260
274
  private iosResetCache;
261
275
  private iosNewPlayer?;
262
276
  private needClearCacheImage;
@@ -264,6 +278,7 @@ export declare class Slide extends Slide_base {
264
278
  private __slideState;
265
279
  private userInputTime;
266
280
  private isSyncingSlideState;
281
+ private randomId;
267
282
  private resize;
268
283
  private isAnimating;
269
284
  private renderingTaskManager;
@@ -299,6 +314,7 @@ export declare class Slide extends Slide_base {
299
314
  private _receiveIncrId;
300
315
  private get dispatchIncrId();
301
316
  constructor(config: ISlideConfig);
317
+ static handleLogDownload: () => Promise<void>;
302
318
  private initPlayer;
303
319
  private userInputHandle;
304
320
  private handleViewClick;
@@ -408,7 +424,13 @@ export declare class Slide extends Slide_base {
408
424
  renderSlide(index: number, isForward?: boolean): void;
409
425
  private needCreateNewPlayer;
410
426
  private poseRenderSlide;
411
- private doRenderSlide;
427
+ /**
428
+ * 直接渲染 index 指定的页码, 不论当前是 sync 还是 interactive 模式.
429
+ * 即调用此方法不会触发 syncDispatch 事件
430
+ * @param index 要渲染的页码
431
+ * @param isForward 是否向前翻页, 影响切页动画时正放还是倒放
432
+ */
433
+ doRenderSlide(index: number, isForward?: boolean): Promise<void>;
412
434
  /**
413
435
  * 执行下一个主序列动画
414
436
  */