@uptimizr/replay 0.1.2 → 0.2.1

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/AGENTS.md CHANGED
@@ -42,9 +42,23 @@ player.play(); // play / pause / seek(ms) / stop
42
42
 
43
43
  The replay endpoint requires `ENABLE_RAW_SESSION_RETENTION` on the collector.
44
44
 
45
+ ## Scene backdrop
46
+
47
+ `loadSceneBackdrop(scene, source, options?)` from `@uptimizr/replay/babylon` loads an arbitrary
48
+ asset (URL or dropped `File`, e.g. a `.glb`) into the scene as a backdrop, then the normal replay
49
+ path re-drives the session over it. It returns `{ rootNodes, meshes, container, dispose() }`;
50
+ `dispose()` removes everything it added so a hosted viewer can swap one dropped model for the next.
51
+ The default loader **lazily** imports Babylon's glTF `SceneLoader`, keeping the lean replay path
52
+ free of it. The global `replayInScene({ backdropUrl })` reuses the host page's Babylon loader
53
+ (`window.BABYLON.LoadAssetContainerAsync` or an explicit `loadBackdrop`), so the IIFE build never
54
+ bundles a second `SceneLoader`; it warns and replays without a backdrop when no loader is found.
55
+
45
56
  ## Rules for agents
46
57
 
47
58
  - Replay is **read-only** on the data side: a driver must never emit analytics events (ADR 0006).
59
+ - The backdrop loader only **adds scene geometry**; it must not touch the event stream.
60
+ - Keep the glTF `SceneLoader` out of the lean/global paths: the npm default loader imports it
61
+ dynamically, and the global path resolves the host's loader instead of bundling one.
48
62
  - `ReplayPlayer` is driven by a pure `update(elapsedMs)`; seeking backward resets the driver and
49
63
  replays from the start, so playback stays deterministic — preserve this contract.
50
64
  - To support another engine, implement the `ReplayDriver` `{ reset, apply }` interface and pass it
package/README.md CHANGED
@@ -42,6 +42,49 @@ const player = new ReplayPlayer(events, driver, { speed: 1, onComplete: () => {}
42
42
  player.play(); // play / pause / seek(ms) / stop
43
43
  ```
44
44
 
45
+ ### Scene backdrop (load a `.glb` to re-drive over)
46
+
47
+ Replay normally re-drives into your **existing** scene. When you only have the
48
+ captured stream and no scene to host it (e.g. a hosted drag-and-drop viewer),
49
+ load an arbitrary asset as a **backdrop** first, then replay over it. The Babylon
50
+ helper accepts a URL **or** a dropped `File`:
51
+
52
+ ```ts
53
+ import { loadSceneBackdrop } from "@uptimizr/replay/babylon";
54
+
55
+ // from a URL…
56
+ const backdrop = await loadSceneBackdrop(scene, "https://example.com/room.glb");
57
+ // …or from a dropped File:
58
+ // const backdrop = await loadSceneBackdrop(scene, file);
59
+
60
+ console.log(`${backdrop.meshes.length} meshes added`);
61
+
62
+ // later — swap one model for another:
63
+ backdrop.dispose();
64
+ ```
65
+
66
+ `loadSceneBackdrop(scene, source, options?)` returns a handle
67
+ (`{ rootNodes, meshes, container, dispose() }`). Its `dispose()` removes
68
+ everything it added and releases the GPU resources, so the hosted slice can
69
+ replace one dropped model with the next. The default loader lazily imports
70
+ Babylon's glTF `SceneLoader`, so the lean replay path never pulls it in unless a
71
+ backdrop is actually requested; pass `options.load` to supply your own loader, or
72
+ `options.pluginExtension` to force a parser. Loaded actor/subtree nodes re-drive
73
+ exactly like any other scene node (`node_transform`, ADR 0033).
74
+
75
+ With the **global** one-call entry point, pass `backdropUrl` (it reuses the host
76
+ page's Babylon loader so the IIFE never bundles a second `SceneLoader`):
77
+
78
+ ```ts
79
+ await replayInScene({
80
+ scene,
81
+ endpoint: "https://collect.example.com",
82
+ apiKey: "utk_…",
83
+ sessionId: "…",
84
+ backdropUrl: "https://example.com/room.glb",
85
+ });
86
+ ```
87
+
45
88
  ### three.js
46
89
 
47
90
  The three driver lives at `@uptimizr/replay/three`. three has no
@@ -1,6 +1,9 @@
1
1
  import type { Camera, Scene } from "@babylonjs/core";
2
2
  import type { CustomPropValue } from "@uptimizr/schema";
3
3
  import type { ReplayDriver } from "../types.js";
4
+ export { loadSceneBackdrop } from "./babylonBackdrop.js";
5
+ export type { LoadBabylonBackdropOptions } from "./babylonBackdrop.js";
6
+ export type { BackdropAssetContainer, SceneBackdrop } from "./backdrop.js";
4
7
  export interface BabylonReplayDriverOptions {
5
8
  /** Scene to re-drive. */
6
9
  scene: Scene;
@@ -1 +1 @@
1
- {"version":3,"file":"babylon.d.ts","sourceRoot":"","sources":["../../src/drivers/babylon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"babylon.d.ts","sourceRoot":"","sources":["../../src/drivers/babylon.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { Vector3 } from "@babylonjs/core/Maths/math.vector.js";
2
2
  import { Quaternion } from "@babylonjs/core/Maths/math.vector.js";
3
+ export { loadSceneBackdrop } from "./babylonBackdrop.js";
3
4
  /** Resolve a node entry (direct ref or `() => node`) to a live node, or `null`. */
4
5
  function resolveReplayNode(entry) {
5
6
  if (!entry)
@@ -1 +1 @@
1
- {"version":3,"file":"babylon.js","sourceRoot":"","sources":["../../src/drivers/babylon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"babylon.js","sourceRoot":"","sources":["../../src/drivers/babylon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Babylon **scene-backdrop** loader for replay — the npm (`@uptimizr/replay/babylon`)
3
+ * entry point's `loadSceneBackdrop`.
4
+ *
5
+ * Kept in its own module (re-exported from `./babylon`) so the standalone (IIFE)
6
+ * build, which only needs `createBabylonReplayDriver`, tree-shakes this away and
7
+ * never bundles Babylon's `SceneLoader`. The default loader imports
8
+ * `@babylonjs/core` lazily, keeping it an optional peer dependency.
9
+ */
10
+ import type { Scene } from "@babylonjs/core";
11
+ import { type BackdropAssetContainer, type LoadSceneBackdropOptions, type SceneBackdrop } from "./backdrop.js";
12
+ /** Options for {@link loadSceneBackdrop}. */
13
+ export interface LoadBabylonBackdropOptions extends LoadSceneBackdropOptions {
14
+ /**
15
+ * Custom asset loader, e.g. to use `ImportMeshAsync`, a cache, or a CDN-pinned
16
+ * Babylon. Receives the same `source`/`scene` and the resolved `pluginExtension`,
17
+ * and must resolve a Babylon `AssetContainer` (not yet added to the scene).
18
+ * Defaults to Babylon's `LoadAssetContainerAsync`.
19
+ */
20
+ load?: (source: string | File, scene: Scene, pluginExtension: string | undefined) => Promise<BackdropAssetContainer>;
21
+ }
22
+ /**
23
+ * Load an arbitrary asset (e.g. a `.glb`) into `scene` as a replay **backdrop**,
24
+ * then re-drive a captured session over it. `source` is a URL or a `File` (so a
25
+ * drag-and-dropped model works directly).
26
+ *
27
+ * Returns a {@link SceneBackdrop} handle — call `dispose()` to remove the backdrop
28
+ * (e.g. to swap one dropped model for another). Loading only *adds* geometry;
29
+ * replay never emits analytics (ADR 0006).
30
+ *
31
+ * The host app must have a glTF (or relevant) loader registered, e.g.
32
+ * `import "@babylonjs/loaders/glTF";`. `@babylonjs/core` stays an optional peer
33
+ * dependency: the default loader is imported lazily, so this is the only path that
34
+ * pulls in Babylon's `SceneLoader`.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { createBabylonReplayDriver, loadSceneBackdrop } from "@uptimizr/replay/babylon";
39
+ * import "@babylonjs/loaders/glTF";
40
+ *
41
+ * const backdrop = await loadSceneBackdrop(scene, "https://cdn.example.com/room.glb");
42
+ * const driver = createBabylonReplayDriver({ scene, nodes });
43
+ * new ReplayPlayer(events, driver).play();
44
+ * // later: backdrop.dispose();
45
+ * ```
46
+ */
47
+ export declare function loadSceneBackdrop(scene: Scene, source: string | File, options?: LoadBabylonBackdropOptions): Promise<SceneBackdrop>;
48
+ //# sourceMappingURL=babylonBackdrop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"babylonBackdrop.d.ts","sourceRoot":"","sources":["../../src/drivers/babylonBackdrop.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAEvB,6CAA6C;AAC7C,MAAM,WAAW,0BAA2B,SAAQ,wBAAwB;IAC1E;;;;;OAKG;IACH,IAAI,CAAC,EAAE,CACL,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,MAAM,GAAG,SAAS,KAChC,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,aAAa,CAAC,CAGxB"}
@@ -0,0 +1,37 @@
1
+ import { loadSceneBackdropWith, } from "./backdrop.js";
2
+ /**
3
+ * Load an arbitrary asset (e.g. a `.glb`) into `scene` as a replay **backdrop**,
4
+ * then re-drive a captured session over it. `source` is a URL or a `File` (so a
5
+ * drag-and-dropped model works directly).
6
+ *
7
+ * Returns a {@link SceneBackdrop} handle — call `dispose()` to remove the backdrop
8
+ * (e.g. to swap one dropped model for another). Loading only *adds* geometry;
9
+ * replay never emits analytics (ADR 0006).
10
+ *
11
+ * The host app must have a glTF (or relevant) loader registered, e.g.
12
+ * `import "@babylonjs/loaders/glTF";`. `@babylonjs/core` stays an optional peer
13
+ * dependency: the default loader is imported lazily, so this is the only path that
14
+ * pulls in Babylon's `SceneLoader`.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * import { createBabylonReplayDriver, loadSceneBackdrop } from "@uptimizr/replay/babylon";
19
+ * import "@babylonjs/loaders/glTF";
20
+ *
21
+ * const backdrop = await loadSceneBackdrop(scene, "https://cdn.example.com/room.glb");
22
+ * const driver = createBabylonReplayDriver({ scene, nodes });
23
+ * new ReplayPlayer(events, driver).play();
24
+ * // later: backdrop.dispose();
25
+ * ```
26
+ */
27
+ export function loadSceneBackdrop(scene, source, options) {
28
+ const load = options?.load ?? defaultBabylonBackdropLoader;
29
+ return loadSceneBackdropWith((pluginExtension) => load(source, scene, pluginExtension), options);
30
+ }
31
+ /** Lazily import Babylon's unified asset loader so the driver path stays lean. */
32
+ async function defaultBabylonBackdropLoader(source, scene, pluginExtension) {
33
+ const { LoadAssetContainerAsync } = await import("@babylonjs/core/Loading/sceneLoader.js");
34
+ const container = await LoadAssetContainerAsync(source, scene, pluginExtension ? { pluginExtension } : undefined);
35
+ return container;
36
+ }
37
+ //# sourceMappingURL=babylonBackdrop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"babylonBackdrop.js","sourceRoot":"","sources":["../../src/drivers/babylonBackdrop.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,qBAAqB,GAItB,MAAM,eAAe,CAAC;AAiBvB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAY,EACZ,MAAqB,EACrB,OAAoC;IAEpC,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,4BAA4B,CAAC;IAC3D,OAAO,qBAAqB,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC;AACnG,CAAC;AAED,kFAAkF;AAClF,KAAK,UAAU,4BAA4B,CACzC,MAAqB,EACrB,KAAY,EACZ,eAAmC;IAEnC,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,wCAAwC,CAAC,CAAC;IAC3F,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAC7C,MAAM,EACN,KAAK,EACL,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CAClD,CAAC;IACF,OAAO,SAA8C,CAAC;AACxD,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Engine-agnostic **scene-backdrop** core for replay.
3
+ *
4
+ * A replay re-drives a captured session into the host's scene; this loads an
5
+ * arbitrary asset (e.g. a `.glb`) as that scene's backdrop so the recorded camera
6
+ * / pointer / picks and actor (`node_transform`, ADR 0033) transforms can be
7
+ * re-driven over a real model. It only *adds* geometry — replay stays read-only on
8
+ * the data side (ADR 0006).
9
+ *
10
+ * This module deliberately has **no** `@babylonjs/core` import so the standalone
11
+ * (IIFE) build can reuse the host page's loader instead of bundling a second copy
12
+ * of Babylon's glTF `SceneLoader`. The Babylon entry (`./babylon`) supplies a
13
+ * loader that constructs an asset container; the global build resolves one from
14
+ * the host. Both feed {@link loadSceneBackdropWith}.
15
+ */
16
+ /**
17
+ * Structural view of the Babylon `AssetContainer` the backdrop core consumes —
18
+ * just the members it reads/calls, so no Babylon type import is needed.
19
+ */
20
+ export interface BackdropAssetContainer {
21
+ /** All meshes the asset contributed. */
22
+ meshes?: object[];
23
+ /** Top-level nodes (meshes/transform nodes) with no parent in the asset. */
24
+ rootNodes?: object[];
25
+ /** Transform nodes the asset contributed. */
26
+ transformNodes?: object[];
27
+ /** Add everything the container holds to the scene it was loaded against. */
28
+ addAllToScene(): void;
29
+ /** Remove everything the container added back out of the scene. */
30
+ removeAllFromScene?(): void;
31
+ /** Release the GPU resources the container owns. */
32
+ dispose?(): void;
33
+ }
34
+ /**
35
+ * A loaded scene backdrop. Hold onto it to remove the backdrop later (e.g. to swap
36
+ * one dropped model for another) via {@link SceneBackdrop.dispose}.
37
+ */
38
+ export interface SceneBackdrop {
39
+ /** Top-level nodes the backdrop added to the scene. */
40
+ rootNodes: object[];
41
+ /** All meshes the backdrop added to the scene. */
42
+ meshes: object[];
43
+ /** The underlying asset container, for advanced host use. */
44
+ container: BackdropAssetContainer;
45
+ /** Remove every node this backdrop added and release its GPU resources. */
46
+ dispose(): void;
47
+ }
48
+ /** Options shared by the backdrop loaders. */
49
+ export interface LoadSceneBackdropOptions {
50
+ /**
51
+ * Force a loader plugin when the URL/`File` has no recognizable extension
52
+ * (e.g. a `blob:`/`data:` URL from a drag-and-drop). Pass `".glb"`/`".gltf"`.
53
+ */
54
+ pluginExtension?: string;
55
+ }
56
+ /**
57
+ * A loader that resolves an asset (already bound to a target scene) to a
58
+ * {@link BackdropAssetContainer}, without adding it to the scene yet.
59
+ */
60
+ export type BackdropLoader = (pluginExtension: string | undefined) => Promise<BackdropAssetContainer>;
61
+ /**
62
+ * Core backdrop loader: run `load`, add the resulting container to the scene, and
63
+ * return a {@link SceneBackdrop} handle whose `dispose()` removes everything it
64
+ * added and frees the GPU resources. Engine-specific entries wrap this with a
65
+ * concrete loader.
66
+ */
67
+ export declare function loadSceneBackdropWith(load: BackdropLoader, options?: LoadSceneBackdropOptions): Promise<SceneBackdrop>;
68
+ //# sourceMappingURL=backdrop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backdrop.d.ts","sourceRoot":"","sources":["../../src/drivers/backdrop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6EAA6E;IAC7E,aAAa,IAAI,IAAI,CAAC;IACtB,mEAAmE;IACnE,kBAAkB,CAAC,IAAI,IAAI,CAAC;IAC5B,oDAAoD;IACpD,OAAO,CAAC,IAAI,IAAI,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kDAAkD;IAClD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,6DAA6D;IAC7D,SAAS,EAAE,sBAAsB,CAAC;IAClC,2EAA2E;IAC3E,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,8CAA8C;AAC9C,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,eAAe,EAAE,MAAM,GAAG,SAAS,KAChC,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAErC;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,cAAc,EACpB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,aAAa,CAAC,CAexB"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Engine-agnostic **scene-backdrop** core for replay.
3
+ *
4
+ * A replay re-drives a captured session into the host's scene; this loads an
5
+ * arbitrary asset (e.g. a `.glb`) as that scene's backdrop so the recorded camera
6
+ * / pointer / picks and actor (`node_transform`, ADR 0033) transforms can be
7
+ * re-driven over a real model. It only *adds* geometry — replay stays read-only on
8
+ * the data side (ADR 0006).
9
+ *
10
+ * This module deliberately has **no** `@babylonjs/core` import so the standalone
11
+ * (IIFE) build can reuse the host page's loader instead of bundling a second copy
12
+ * of Babylon's glTF `SceneLoader`. The Babylon entry (`./babylon`) supplies a
13
+ * loader that constructs an asset container; the global build resolves one from
14
+ * the host. Both feed {@link loadSceneBackdropWith}.
15
+ */
16
+ /**
17
+ * Core backdrop loader: run `load`, add the resulting container to the scene, and
18
+ * return a {@link SceneBackdrop} handle whose `dispose()` removes everything it
19
+ * added and frees the GPU resources. Engine-specific entries wrap this with a
20
+ * concrete loader.
21
+ */
22
+ export async function loadSceneBackdropWith(load, options) {
23
+ const container = await load(options?.pluginExtension);
24
+ container.addAllToScene();
25
+ let disposed = false;
26
+ return {
27
+ rootNodes: container.rootNodes ?? [],
28
+ meshes: container.meshes ?? [],
29
+ container,
30
+ dispose() {
31
+ if (disposed)
32
+ return;
33
+ disposed = true;
34
+ container.removeAllFromScene?.();
35
+ container.dispose?.();
36
+ },
37
+ };
38
+ }
39
+ //# sourceMappingURL=backdrop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backdrop.js","sourceRoot":"","sources":["../../src/drivers/backdrop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAqDH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAoB,EACpB,OAAkC;IAElC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACvD,SAAS,CAAC,aAAa,EAAE,CAAC;IAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE;QACpC,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,EAAE;QAC9B,SAAS;QACT,OAAO;YACL,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACjC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/global.d.ts CHANGED
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import type { Camera, Scene } from "@babylonjs/core";
13
13
  import { createBabylonReplayDriver, type BabylonReplayDriverOptions } from "./drivers/babylon.js";
14
+ import { type BackdropAssetContainer } from "./drivers/backdrop.js";
14
15
  import { fetchSessionEvents, fetchSessionEventsStream } from "./fetchSession.js";
15
16
  import { ReplayPlayer } from "./player.js";
16
17
  import type { ReplayHandle } from "./types.js";
@@ -26,6 +27,27 @@ export interface ReplayInSceneOptions {
26
27
  sessionId: string;
27
28
  /** Camera to move. Defaults to `scene.activeCamera`. */
28
29
  camera?: Camera;
30
+ /**
31
+ * Optional asset to load into the scene as a **backdrop** (URL or `File`) before
32
+ * replay starts — e.g. a `.glb` to re-drive the recorded session over. The host
33
+ * page's Babylon owns the scene, so this build does **not** bundle a glTF
34
+ * `SceneLoader`; it reuses the page's loader. Provide one via {@link loadBackdrop},
35
+ * or expose Babylon globally (`window.BABYLON` with `LoadAssetContainerAsync`).
36
+ * If no loader can be found, a warning is logged and replay continues without a
37
+ * backdrop.
38
+ */
39
+ backdropUrl?: string | File;
40
+ /**
41
+ * Force a loader plugin when {@link backdropUrl} has no recognizable extension
42
+ * (e.g. a `blob:`/`data:` URL). Pass `".glb"`/`".gltf"`.
43
+ */
44
+ backdropPluginExtension?: string;
45
+ /**
46
+ * Custom backdrop loader. Receives the {@link backdropUrl}, the `scene`, and the
47
+ * resolved plugin extension, and must resolve a Babylon `AssetContainer` (not yet
48
+ * added to the scene). Overrides the `window.BABYLON` auto-detection.
49
+ */
50
+ loadBackdrop?: (source: string | File, scene: Scene, pluginExtension: string | undefined) => Promise<BackdropAssetContainer>;
29
51
  /** Playback speed multiplier. Default 1. */
30
52
  speed?: number;
31
53
  /** Per pointer event, so the host can render a cursor/marker. */
@@ -1 +1 @@
1
- {"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,KAAK,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,mFAAmF;AACnF,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,SAAS,CAAC,EAAE,0BAA0B,CAAC,WAAW,CAAC,CAAC;IACpD,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,0BAA0B,CAAC,mBAAmB,CAAC,CAAC;IACpE,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,0BAA0B,CAAC,UAAU,CAAC,CAAC;IAClD,oFAAoF;IACpF,WAAW,CAAC,EAAE,0BAA0B,CAAC,aAAa,CAAC,CAAC;IACxD,2DAA2D;IAC3D,OAAO,CAAC,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAC;IAChD,qEAAqE;IACrE,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,oFAAoF;IACpF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CAyFxF;AAED,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,YAAY,EAAE,CAAC;AACjG,YAAY,EAAE,0BAA0B,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,KAAK,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAEL,KAAK,sBAAsB,EAE5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,mFAAmF;AACnF,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;;;OAIG;IACH,YAAY,CAAC,EAAE,CACb,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,MAAM,GAAG,SAAS,KAChC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACrC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,SAAS,CAAC,EAAE,0BAA0B,CAAC,WAAW,CAAC,CAAC;IACpD,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,0BAA0B,CAAC,mBAAmB,CAAC,CAAC;IACpE,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,0BAA0B,CAAC,UAAU,CAAC,CAAC;IAClD,oFAAoF;IACpF,WAAW,CAAC,EAAE,0BAA0B,CAAC,aAAa,CAAC,CAAC;IACxD,2DAA2D;IAC3D,OAAO,CAAC,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAC;IAChD,qEAAqE;IACrE,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,oFAAoF;IACpF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiGxF;AAkFD,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,YAAY,EAAE,CAAC;AACjG,YAAY,EAAE,0BAA0B,EAAE,YAAY,EAAE,CAAC"}
package/dist/global.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { createBabylonReplayDriver } from "./drivers/babylon.js";
2
+ import { loadSceneBackdropWith, } from "./drivers/backdrop.js";
2
3
  import { fetchSessionEvents, fetchSessionEventsStream } from "./fetchSession.js";
3
4
  import { ReplayPlayer } from "./player.js";
4
5
  const LOG_PREFIX = "[UptimizrReplay]";
@@ -69,6 +70,13 @@ export async function replayInScene(options) {
69
70
  console.warn(`${LOG_PREFIX} scene has no active camera and none was provided — camera pose ` +
70
71
  `won't be applied. Pass a \`camera\`, or set \`scene.activeCamera\` before replaying.`);
71
72
  }
73
+ // Load an optional backdrop (e.g. a .glb) before playback so the recorded
74
+ // camera/pointer/picks and actor transforms re-drive over a real model. This
75
+ // reuses the host page's Babylon loader — the global build never bundles a glTF
76
+ // SceneLoader of its own.
77
+ if (options.backdropUrl !== undefined) {
78
+ await loadBackdropFromHost(options, log);
79
+ }
72
80
  const driver = createBabylonReplayDriver({
73
81
  scene: options.scene,
74
82
  camera: options.camera,
@@ -91,5 +99,51 @@ export async function replayInScene(options) {
91
99
  player.play();
92
100
  return player;
93
101
  }
102
+ /**
103
+ * Resolve a Babylon asset loader from the host page and load {@link
104
+ * ReplayInSceneOptions.backdropUrl} into the scene. Prefers an explicit
105
+ * `loadBackdrop`, then a global `BABYLON.LoadAssetContainerAsync` (Babylon 7+) or
106
+ * `BABYLON.SceneLoader.LoadAssetContainerAsync` (legacy). Logs a warning and skips
107
+ * (without throwing) when no loader is available — replay still runs.
108
+ */
109
+ async function loadBackdropFromHost(options, log) {
110
+ const source = options.backdropUrl;
111
+ if (source === undefined)
112
+ return undefined;
113
+ const loader = resolveHostBackdropLoader(options);
114
+ if (!loader) {
115
+ console.warn(`${LOG_PREFIX} a backdrop was requested but no Babylon loader was found. ` +
116
+ `Pass \`loadBackdrop\`, or expose Babylon as \`window.BABYLON\` with ` +
117
+ `\`LoadAssetContainerAsync\` (and a glTF loader registered). Replaying without a backdrop.`);
118
+ return undefined;
119
+ }
120
+ const label = typeof source === "string" ? source : (source.name ?? "dropped file");
121
+ log(`loading backdrop "${label}"`);
122
+ try {
123
+ const backdrop = await loadSceneBackdropWith((pluginExtension) => loader(source, options.scene, pluginExtension), { pluginExtension: options.backdropPluginExtension });
124
+ log(`backdrop loaded (${backdrop.meshes.length} meshes)`);
125
+ return backdrop;
126
+ }
127
+ catch (err) {
128
+ console.warn(`${LOG_PREFIX} failed to load backdrop "${label}":`, err);
129
+ return undefined;
130
+ }
131
+ }
132
+ /** Build a `(source, scene, pluginExtension) => Promise<AssetContainer>` loader. */
133
+ function resolveHostBackdropLoader(options) {
134
+ if (options.loadBackdrop)
135
+ return options.loadBackdrop;
136
+ const babylon = globalThis.BABYLON;
137
+ if (babylon?.LoadAssetContainerAsync) {
138
+ const load = babylon.LoadAssetContainerAsync.bind(babylon);
139
+ return (source, scene, pluginExtension) => load(source, scene, pluginExtension ? { pluginExtension } : undefined);
140
+ }
141
+ const legacy = babylon?.SceneLoader?.LoadAssetContainerAsync;
142
+ if (legacy) {
143
+ const load = legacy.bind(babylon.SceneLoader);
144
+ return (source, scene, pluginExtension) => load(source, "", scene, null, pluginExtension);
145
+ }
146
+ return null;
147
+ }
94
148
  export { createBabylonReplayDriver, fetchSessionEvents, fetchSessionEventsStream, ReplayPlayer };
95
149
  //# sourceMappingURL=global.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"global.js","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"global.js","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"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"}