@xiboplayer/renderer 0.5.16 → 0.5.18

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/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@xiboplayer/renderer",
3
- "version": "0.5.16",
3
+ "version": "0.5.18",
4
4
  "description": "RendererLite - Fast, efficient XLF layout rendering engine",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
7
+ "types": "./src/index.d.ts",
7
8
  "exports": {
8
9
  ".": "./src/index.js",
9
10
  "./renderer-lite": "./src/renderer-lite.js",
@@ -12,8 +13,8 @@
12
13
  "dependencies": {
13
14
  "nanoevents": "^9.1.0",
14
15
  "pdfjs-dist": "^4.10.38",
15
- "@xiboplayer/cache": "0.5.16",
16
- "@xiboplayer/utils": "0.5.16"
16
+ "@xiboplayer/utils": "0.5.18",
17
+ "@xiboplayer/cache": "0.5.18"
17
18
  },
18
19
  "devDependencies": {
19
20
  "vitest": "^2.0.0",
package/src/index.d.ts ADDED
@@ -0,0 +1,74 @@
1
+ export const VERSION: string;
2
+
3
+ export interface RendererConfig {
4
+ cmsUrl: string;
5
+ hardwareKey: string;
6
+ }
7
+
8
+ export interface RendererOptions {
9
+ getMediaUrl?: (fileId: number) => Promise<string>;
10
+ getWidgetHtml?: (widget: any) => Promise<string | { url: string; fallback?: string }>;
11
+ logLevel?: string;
12
+ }
13
+
14
+ export class LayoutPool {
15
+ layouts: Map<number, any>;
16
+ maxSize: number;
17
+ hotLayoutId: number | null;
18
+ has(layoutId: number): boolean;
19
+ get(layoutId: number): any | undefined;
20
+ add(layoutId: number, entry: any): void;
21
+ clearWarmNotIn(keepIds: Set<number>): number;
22
+ makeHot(layoutId: number): void;
23
+ remove(layoutId: number): void;
24
+ clear(): void;
25
+ }
26
+
27
+ export class RendererLite {
28
+ constructor(config: RendererConfig, container: HTMLElement, options?: RendererOptions);
29
+
30
+ config: RendererConfig;
31
+ container: HTMLElement;
32
+ options: RendererOptions;
33
+ currentLayout: any;
34
+ currentLayoutId: number | null;
35
+ regions: Map<string, any>;
36
+ layoutPool: LayoutPool;
37
+ activeOverlays: Map<number, any>;
38
+ scaleFactor: number;
39
+ offsetX: number;
40
+ offsetY: number;
41
+
42
+ on(event: string, callback: (...args: any[]) => void): () => void;
43
+ emit(event: string, ...args: any[]): void;
44
+
45
+ renderLayout(xlfXml: string, layoutId: number): Promise<void>;
46
+ stopCurrentLayout(): void;
47
+ preloadLayout(xlfXml: string, layoutId: number): Promise<boolean>;
48
+ hasPreloadedLayout(layoutId: number): boolean;
49
+
50
+ renderOverlay(xlfXml: string, layoutId: number, priority?: number): Promise<void>;
51
+ stopOverlay(layoutId: number): void;
52
+ stopAllOverlays(): void;
53
+ getActiveOverlays(): number[];
54
+
55
+ navigateToWidget(targetWidgetId: string): void;
56
+ nextWidget(regionId?: string): void;
57
+ previousWidget(regionId?: string): void;
58
+
59
+ pause(): void;
60
+ resume(): void;
61
+ isPaused(): boolean;
62
+ resumeRegionMedia?(regionId: string): void;
63
+
64
+ parseXlf(xlfXml: string): any;
65
+ parseWidget(mediaEl: Element): any;
66
+
67
+ calculateScale(layout: any): void;
68
+ rescaleRegions(): void;
69
+
70
+ updateLayoutDuration(): void;
71
+ checkLayoutComplete(): void;
72
+
73
+ cleanup(): void;
74
+ }
@@ -1766,6 +1766,9 @@ export class RendererLite {
1766
1766
  return;
1767
1767
  }
1768
1768
 
1769
+ // Don't start next widget if layout has already ended (race with layout timer)
1770
+ if (this.layoutEndEmitted) return;
1771
+
1769
1772
  region.currentIndex = nextIndex;
1770
1773
  playNext();
1771
1774
  }
@@ -2440,6 +2443,10 @@ export class RendererLite {
2440
2443
  * @param {number} layoutId - Layout ID
2441
2444
  * @returns {Promise<boolean>} true if preload succeeded, false on failure
2442
2445
  */
2446
+ hasPreloadedLayout(layoutId) {
2447
+ return this.layoutPool.has(layoutId);
2448
+ }
2449
+
2443
2450
  async preloadLayout(xlfXml, layoutId) {
2444
2451
  // Don't preload if already in pool
2445
2452
  if (this.layoutPool.has(layoutId)) {
@@ -2757,8 +2764,10 @@ export class RendererLite {
2757
2764
  // Wait for widgets to be ready then start layout timer
2758
2765
  this.startLayoutTimerWhenReady(layoutId, preloaded.layout);
2759
2766
 
2760
- // Schedule next preload
2761
- this._scheduleNextLayoutPreload(preloaded.layout);
2767
+ // Schedule next preload (unless updateLayoutDuration already did it)
2768
+ if (!this.preloadTimer) {
2769
+ this._scheduleNextLayoutPreload(preloaded.layout);
2770
+ }
2762
2771
 
2763
2772
  this.log.info(`Swapped to preloaded layout ${layoutId} (instant transition)`);
2764
2773
  }