@webspatial/core-sdk 1.6.1 → 2.0.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/CHANGELOG.md +84 -0
- package/README.md +10 -0
- package/dist/JSBCommand.d.ts +398 -0
- package/dist/JSBCommand.js +668 -0
- package/dist/JSBCommand.js.map +1 -0
- package/dist/Spatial.d.ts +63 -0
- package/dist/Spatial.js +60 -0
- package/dist/Spatial.js.map +1 -0
- package/dist/SpatialObject.d.ts +19 -0
- package/dist/SpatialObject.js +44 -0
- package/dist/SpatialObject.js.map +1 -0
- package/dist/SpatialScene.d.ts +51 -0
- package/dist/SpatialScene.js +74 -0
- package/dist/SpatialScene.js.map +1 -0
- package/dist/SpatialSession.d.ts +143 -0
- package/dist/SpatialSession.js +173 -0
- package/dist/SpatialSession.js.map +1 -0
- package/dist/SpatialWebEvent.d.ts +8 -0
- package/dist/SpatialWebEvent.js +18 -0
- package/dist/SpatialWebEvent.js.map +1 -0
- package/dist/SpatialWebEventCreator.d.ts +11 -0
- package/dist/SpatialWebEventCreator.js +11 -0
- package/dist/SpatialWebEventCreator.js.map +1 -0
- package/dist/Spatialized2DElement.d.ts +42 -0
- package/dist/Spatialized2DElement.js +47 -0
- package/dist/Spatialized2DElement.js.map +1 -0
- package/dist/SpatializedDynamic3DElement.d.ts +7 -0
- package/dist/SpatializedDynamic3DElement.js +43 -0
- package/dist/SpatializedDynamic3DElement.js.map +1 -0
- package/dist/SpatializedElement.d.ts +7 -0
- package/dist/SpatializedElement.js +206 -0
- package/dist/SpatializedElement.js.map +1 -0
- package/dist/SpatializedElementCreator.d.ts +15 -0
- package/dist/SpatializedElementCreator.js +47 -0
- package/dist/SpatializedElementCreator.js.map +1 -0
- package/dist/SpatializedStatic3DElement.d.ts +195 -0
- package/dist/SpatializedStatic3DElement.js +327 -0
- package/dist/SpatializedStatic3DElement.js.map +1 -0
- package/dist/WebMsgCommand.d.ts +7 -0
- package/dist/WebMsgCommand.js +23 -0
- package/dist/WebMsgCommand.js.map +1 -0
- package/dist/index.d.ts +35 -1101
- package/dist/index.js +21 -3393
- package/dist/index.js.map +1 -1
- package/dist/install-polyfills.d.ts +2 -0
- package/dist/install-polyfills.js +13 -0
- package/dist/install-polyfills.js.map +1 -0
- package/dist/isSSREnv.d.ts +3 -0
- package/dist/isSSREnv.js +6 -0
- package/dist/isSSREnv.js.map +1 -0
- package/dist/motion/AnimationObject.d.ts +7 -0
- package/dist/motion/AnimationObject.js +140 -0
- package/dist/motion/AnimationObject.js.map +1 -0
- package/dist/motion/compute/index.d.ts +10 -0
- package/dist/motion/compute/index.js +19 -0
- package/dist/motion/compute/index.js.map +1 -0
- package/dist/motion/compute/motionPropertyValues.d.ts +19 -0
- package/dist/motion/compute/motionPropertyValues.js +50 -0
- package/dist/motion/compute/motionPropertyValues.js.map +1 -0
- package/dist/motion/compute/normalize.d.ts +31 -0
- package/dist/motion/compute/normalize.js +201 -0
- package/dist/motion/compute/normalize.js.map +1 -0
- package/dist/motion/compute/validate.d.ts +22 -0
- package/dist/motion/compute/validate.js +103 -0
- package/dist/motion/compute/validate.js.map +1 -0
- package/dist/motion/index.d.ts +8 -0
- package/dist/motion/index.js +6 -0
- package/dist/motion/index.js.map +1 -0
- package/dist/motion/native/serializeMotionTimeline.d.ts +12 -0
- package/dist/motion/native/serializeMotionTimeline.js +21 -0
- package/dist/motion/native/serializeMotionTimeline.js.map +1 -0
- package/dist/physicalMetrics-W5uZ5xKb.d.ts +48 -0
- package/dist/physicalMetrics.d.ts +1 -0
- package/dist/physicalMetrics.js +58 -0
- package/dist/physicalMetrics.js.map +1 -0
- package/dist/platform-adapter/CommandResultUtils.d.ts +12 -0
- package/dist/platform-adapter/CommandResultUtils.js +21 -0
- package/dist/platform-adapter/CommandResultUtils.js.map +1 -0
- package/dist/platform-adapter/createPlatformSync.d.ts +16 -0
- package/dist/platform-adapter/createPlatformSync.js +30 -0
- package/dist/platform-adapter/createPlatformSync.js.map +1 -0
- package/dist/platform-adapter/index.d.ts +12 -0
- package/dist/platform-adapter/index.js +10 -0
- package/dist/platform-adapter/index.js.map +1 -0
- package/dist/platform-adapter/interface.d.ts +7 -0
- package/dist/platform-adapter/interface.js +1 -0
- package/dist/platform-adapter/interface.js.map +1 -0
- package/dist/platform-adapter/pico-os/PicoOSPlatform.d.ts +25 -0
- package/dist/platform-adapter/pico-os/PicoOSPlatform.js +168 -0
- package/dist/platform-adapter/pico-os/PicoOSPlatform.js.map +1 -0
- package/dist/platform-adapter/puppeteer/PuppeteerPlatform.d.ts +66 -0
- package/dist/platform-adapter/puppeteer/PuppeteerPlatform.js +372 -0
- package/dist/platform-adapter/puppeteer/PuppeteerPlatform.js.map +1 -0
- package/dist/platform-adapter/spatialRequestMetadata.d.ts +6 -0
- package/dist/platform-adapter/spatialRequestMetadata.js +39 -0
- package/dist/platform-adapter/spatialRequestMetadata.js.map +1 -0
- package/dist/platform-adapter/spatialSceneQuery.d.ts +12 -0
- package/dist/platform-adapter/spatialSceneQuery.js +12 -0
- package/dist/platform-adapter/spatialSceneQuery.js.map +1 -0
- package/dist/platform-adapter/vision-os/VisionOSPlatform.d.ts +19 -0
- package/dist/platform-adapter/vision-os/VisionOSPlatform.js +77 -0
- package/dist/platform-adapter/vision-os/VisionOSPlatform.js.map +1 -0
- package/dist/platform-runtime.d.ts +12 -0
- package/dist/platform-runtime.js +14 -0
- package/dist/platform-runtime.js.map +1 -0
- package/dist/reality/Attachment.d.ts +19 -0
- package/dist/reality/Attachment.js +39 -0
- package/dist/reality/Attachment.js.map +1 -0
- package/dist/reality/component/ModelComponent.d.ts +14 -0
- package/dist/reality/component/ModelComponent.js +11 -0
- package/dist/reality/component/ModelComponent.js.map +1 -0
- package/dist/reality/component/SpatialComponent.d.ts +8 -0
- package/dist/reality/component/SpatialComponent.js +19 -0
- package/dist/reality/component/SpatialComponent.js.map +1 -0
- package/dist/reality/component/index.d.ts +8 -0
- package/dist/reality/component/index.js +3 -0
- package/dist/reality/component/index.js.map +1 -0
- package/dist/reality/entity/SpatialEntity.d.ts +7 -0
- package/dist/reality/entity/SpatialEntity.js +291 -0
- package/dist/reality/entity/SpatialEntity.js.map +1 -0
- package/dist/reality/entity/SpatialModelEntity.d.ts +17 -0
- package/dist/reality/entity/SpatialModelEntity.js +17 -0
- package/dist/reality/entity/SpatialModelEntity.js.map +1 -0
- package/dist/reality/entity/index.d.ts +8 -0
- package/dist/reality/entity/index.js +3 -0
- package/dist/reality/entity/index.js.map +1 -0
- package/dist/reality/geometry/SpatialBoxGeometry.d.ts +16 -0
- package/dist/reality/geometry/SpatialBoxGeometry.js +13 -0
- package/dist/reality/geometry/SpatialBoxGeometry.js.map +1 -0
- package/dist/reality/geometry/SpatialConeGeometry.d.ts +16 -0
- package/dist/reality/geometry/SpatialConeGeometry.js +13 -0
- package/dist/reality/geometry/SpatialConeGeometry.js.map +1 -0
- package/dist/reality/geometry/SpatialCylinderGeometry.d.ts +16 -0
- package/dist/reality/geometry/SpatialCylinderGeometry.js +13 -0
- package/dist/reality/geometry/SpatialCylinderGeometry.js.map +1 -0
- package/dist/reality/geometry/SpatialGeometry.d.ts +7 -0
- package/dist/reality/geometry/SpatialGeometry.js +13 -0
- package/dist/reality/geometry/SpatialGeometry.js.map +1 -0
- package/dist/reality/geometry/SpatialPlaneGeometry.d.ts +16 -0
- package/dist/reality/geometry/SpatialPlaneGeometry.js +13 -0
- package/dist/reality/geometry/SpatialPlaneGeometry.js.map +1 -0
- package/dist/reality/geometry/SpatialSphereGeometry.d.ts +16 -0
- package/dist/reality/geometry/SpatialSphereGeometry.js +13 -0
- package/dist/reality/geometry/SpatialSphereGeometry.js.map +1 -0
- package/dist/reality/geometry/index.d.ts +12 -0
- package/dist/reality/geometry/index.js +7 -0
- package/dist/reality/geometry/index.js.map +1 -0
- package/dist/reality/index.d.ts +18 -0
- package/dist/reality/index.js +7 -0
- package/dist/reality/index.js.map +1 -0
- package/dist/reality/material/SpatialMaterial.d.ts +7 -0
- package/dist/reality/material/SpatialMaterial.js +13 -0
- package/dist/reality/material/SpatialMaterial.js.map +1 -0
- package/dist/reality/material/SpatialUnlitMaterial.d.ts +16 -0
- package/dist/reality/material/SpatialUnlitMaterial.js +16 -0
- package/dist/reality/material/SpatialUnlitMaterial.js.map +1 -0
- package/dist/reality/material/index.d.ts +8 -0
- package/dist/reality/material/index.js +3 -0
- package/dist/reality/material/index.js.map +1 -0
- package/dist/reality/realityCreator.d.ts +22 -0
- package/dist/reality/realityCreator.js +89 -0
- package/dist/reality/realityCreator.js.map +1 -0
- package/dist/reality/resource/SpatialModelAsset.d.ts +15 -0
- package/dist/reality/resource/SpatialModelAsset.js +12 -0
- package/dist/reality/resource/SpatialModelAsset.js.map +1 -0
- package/dist/reality/resource/SpatialTextureResource.d.ts +16 -0
- package/dist/reality/resource/SpatialTextureResource.js +16 -0
- package/dist/reality/resource/SpatialTextureResource.js.map +1 -0
- package/dist/reality/resource/index.d.ts +9 -0
- package/dist/reality/resource/index.js +3 -0
- package/dist/reality/resource/index.js.map +1 -0
- package/dist/runtime/WebSpatialRuntimeError.d.ts +10 -0
- package/dist/runtime/WebSpatialRuntimeError.js +14 -0
- package/dist/runtime/WebSpatialRuntimeError.js.map +1 -0
- package/dist/runtime/capability-data.d.ts +12 -0
- package/dist/runtime/capability-data.js +134 -0
- package/dist/runtime/capability-data.js.map +1 -0
- package/dist/runtime/index.d.ts +8 -0
- package/dist/runtime/index.js +27 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/jsbAdapterPlatform.d.ts +9 -0
- package/dist/runtime/jsbAdapterPlatform.js +38 -0
- package/dist/runtime/jsbAdapterPlatform.js.map +1 -0
- package/dist/runtime/keys.d.ts +34 -0
- package/dist/runtime/keys.js +122 -0
- package/dist/runtime/keys.js.map +1 -0
- package/dist/runtime/semver.d.ts +8 -0
- package/dist/runtime/semver.js +32 -0
- package/dist/runtime/semver.js.map +1 -0
- package/dist/runtime/supports.d.ts +22 -0
- package/dist/runtime/supports.js +78 -0
- package/dist/runtime/supports.js.map +1 -0
- package/dist/runtime/types.d.ts +12 -0
- package/dist/runtime/types.js +1 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/userAgent.d.ts +20 -0
- package/dist/runtime/userAgent.js +41 -0
- package/dist/runtime/userAgent.js.map +1 -0
- package/dist/scene-polyfill.d.ts +18 -0
- package/dist/scene-polyfill.js +480 -0
- package/dist/scene-polyfill.js.map +1 -0
- package/dist/spatial-host.d.ts +13 -0
- package/dist/spatial-host.js +18 -0
- package/dist/spatial-host.js.map +1 -0
- package/dist/spatial-window-polyfill.d.ts +3 -0
- package/dist/spatial-window-polyfill.js +155 -0
- package/dist/spatial-window-polyfill.js.map +1 -0
- package/dist/spatializedElementMotion-_0XWPQCE.d.ts +1009 -0
- package/dist/types/animation.d.ts +7 -0
- package/dist/types/animation.js +1 -0
- package/dist/types/animation.js.map +1 -0
- package/dist/types/global.d.ts +38 -0
- package/dist/types/global.js +1 -0
- package/dist/types/global.js.map +1 -0
- package/dist/types/internal.d.ts +7 -0
- package/dist/types/internal.js +12 -0
- package/dist/types/internal.js.map +1 -0
- package/dist/types/motion/index.d.ts +7 -0
- package/dist/types/motion/index.js +3 -0
- package/dist/types/motion/index.js.map +1 -0
- package/dist/types/motion/spatializedElementMotion.d.ts +7 -0
- package/dist/types/motion/spatializedElementMotion.js +1 -0
- package/dist/types/motion/spatializedElementMotion.js.map +1 -0
- package/dist/types/motion/spatializedMotion.d.ts +7 -0
- package/dist/types/motion/spatializedMotion.js +16 -0
- package/dist/types/motion/spatializedMotion.js.map +1 -0
- package/dist/types/motion/spatializedPlayback.d.ts +11 -0
- package/dist/types/motion/spatializedPlayback.js +1 -0
- package/dist/types/motion/spatializedPlayback.js.map +1 -0
- package/dist/types/motion/spatializedVisual.d.ts +35 -0
- package/dist/types/motion/spatializedVisual.js +1 -0
- package/dist/types/motion/spatializedVisual.js.map +1 -0
- package/dist/types/types.d.ts +7 -0
- package/dist/types/types.js +117 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils.d.ts +44 -0
- package/dist/utils.js +86 -0
- package/dist/utils.js.map +1 -0
- package/package.json +20 -4
- package/src/JSBCommand.ts +148 -91
- package/src/Spatial.ts +0 -21
- package/src/SpatialObject.ts +10 -0
- package/src/SpatialScene.ts +1 -5
- package/src/SpatialSession.ts +17 -3
- package/src/Spatialized2DElement.ts +5 -0
- package/src/SpatializedDynamic3DElement.ts +5 -1
- package/src/SpatializedElement.ts +29 -0
- package/src/SpatializedElementCreator.ts +6 -4
- package/src/SpatializedStatic3DElement.test.ts +99 -0
- package/src/SpatializedStatic3DElement.ts +141 -4
- package/src/WebMsgCommand.ts +50 -0
- package/src/coverage-boost.test.ts +258 -316
- package/src/index.ts +28 -12
- package/src/install-polyfills.ts +38 -0
- package/src/jsbcommand.coverage.test.ts +42 -48
- package/src/motion/AnimationObject.test.ts +421 -0
- package/src/motion/AnimationObject.ts +208 -0
- package/src/motion/compute/index.ts +10 -0
- package/src/motion/compute/motionPropertyValues.test.ts +55 -0
- package/src/motion/compute/motionPropertyValues.ts +70 -0
- package/src/motion/compute/normalize.test.ts +99 -0
- package/src/motion/compute/normalize.ts +289 -0
- package/src/motion/compute/validate.test.ts +229 -0
- package/src/motion/compute/validate.ts +156 -0
- package/src/motion/index.ts +2 -0
- package/src/motion/native/serializeMotionTimeline.test.ts +61 -0
- package/src/motion/native/serializeMotionTimeline.ts +27 -0
- package/src/platform-adapter/CommandResultUtils.ts +2 -2
- package/src/platform-adapter/createPlatformSync.ts +36 -0
- package/src/platform-adapter/index.ts +5 -51
- package/src/platform-adapter/interface.ts +35 -23
- package/src/platform-adapter/pico-os/PicoOSPlatform.ts +156 -59
- package/src/platform-adapter/puppeteer/PuppeteerPlatform.ts +37 -11
- package/src/platform-adapter/spatialRequestMetadata.test.ts +175 -0
- package/src/platform-adapter/spatialRequestMetadata.ts +48 -0
- package/src/platform-adapter/spatialSceneQuery.ts +17 -0
- package/src/platform-adapter/vision-os/VisionOSPlatform.ts +60 -24
- package/src/platform-runtime.ts +13 -0
- package/src/reality/Attachment.ts +2 -2
- package/src/reality/entity/SpatialEntity.ts +127 -2
- package/src/reality/realityCreator.ts +15 -1
- package/src/reality/resource/SpatialTextureResource.ts +16 -0
- package/src/reality/resource/index.ts +1 -0
- package/src/runtime/WebSpatialRuntimeError.ts +16 -0
- package/src/runtime/capability-data.ts +213 -0
- package/src/runtime/contract-review.test.ts +44 -0
- package/src/runtime/index.ts +17 -0
- package/src/runtime/jsbAdapterPlatform.test.ts +36 -0
- package/src/runtime/jsbAdapterPlatform.ts +51 -0
- package/src/runtime/keys.ts +140 -0
- package/src/runtime/semver.ts +33 -0
- package/src/runtime/supports.test.ts +346 -0
- package/src/runtime/supports.ts +112 -0
- package/src/runtime/types.ts +11 -0
- package/src/runtime/useAnimation.capability.test.ts +275 -0
- package/src/runtime/userAgent.ts +64 -0
- package/src/scene-polyfill.manifest.test.ts +312 -9
- package/src/scene-polyfill.request-metadata.test.ts +39 -0
- package/src/scene-polyfill.test.ts +33 -94
- package/src/scene-polyfill.ts +125 -92
- package/src/spatial-host.ts +25 -0
- package/src/spatial-window-polyfill.ts +18 -2
- package/src/transform-roundtrip.test.ts +90 -0
- package/src/types/animation.ts +224 -0
- package/src/types/{global.d.ts → global.ts} +10 -12
- package/src/types/motion/index.ts +10 -0
- package/src/types/motion/spatializedElementMotion.ts +49 -0
- package/src/types/motion/spatializedMotion.ts +147 -0
- package/src/types/motion/spatializedPlayback.ts +17 -0
- package/src/types/motion/spatializedVisual.ts +24 -0
- package/src/types/types.ts +12 -0
- package/src/utils.ts +54 -0
- package/tsup.config.ts +61 -36
- package/vitest.config.ts +5 -1
- package/dist/iife/index.d.ts +0 -1101
- package/dist/iife/index.global.js +0 -75
- package/dist/iife/index.global.js.map +0 -1
- package/src/platform-adapter/android/AndroidPlatform.ts +0 -133
- package/src/platform-adapter/ssr/SSRPlatform.ts +0 -43
- /package/src/{ssr-polyfill.ts → isSSREnv.ts} +0 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
function parseShellToken(ua) {
|
|
2
|
+
const ws = /\bWSAppShell\/([\w.-]+)/i.exec(ua);
|
|
3
|
+
if (ws?.[1]) return { version: ws[1], source: "wsapp" };
|
|
4
|
+
const pico = /\bPicoWebApp\/([\w.-]+)/i.exec(ua);
|
|
5
|
+
if (pico?.[1]) return { version: pico[1], source: "picoapp" };
|
|
6
|
+
return { version: null, source: null };
|
|
7
|
+
}
|
|
8
|
+
function inferPicoOs(ua) {
|
|
9
|
+
return /\bPicoWebApp\//i.test(ua) || /\bPicoBrowser\b/i.test(ua);
|
|
10
|
+
}
|
|
11
|
+
function inferVisionOsFromUa(ua) {
|
|
12
|
+
return /Mac OS X/i.test(ua);
|
|
13
|
+
}
|
|
14
|
+
function computeRuntimeFromUserAgent(userAgent) {
|
|
15
|
+
if (userAgent === void 0 || userAgent === "") {
|
|
16
|
+
return { type: null, shellVersion: null };
|
|
17
|
+
}
|
|
18
|
+
if (userAgent.includes("Puppeteer")) {
|
|
19
|
+
const { version: version2 } = parseShellToken(userAgent);
|
|
20
|
+
return { type: "puppeteer", shellVersion: version2 };
|
|
21
|
+
}
|
|
22
|
+
const { version, source } = parseShellToken(userAgent);
|
|
23
|
+
if (!version) {
|
|
24
|
+
return { type: null, shellVersion: null };
|
|
25
|
+
}
|
|
26
|
+
if (source === "picoapp" || inferPicoOs(userAgent)) {
|
|
27
|
+
return { type: "picoos", shellVersion: version };
|
|
28
|
+
}
|
|
29
|
+
if (source === "wsapp") {
|
|
30
|
+
if (inferVisionOsFromUa(userAgent)) {
|
|
31
|
+
return { type: "visionos", shellVersion: version };
|
|
32
|
+
}
|
|
33
|
+
return { type: null, shellVersion: version };
|
|
34
|
+
}
|
|
35
|
+
return { type: null, shellVersion: version };
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
computeRuntimeFromUserAgent,
|
|
39
|
+
parseShellToken
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=userAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/userAgent.ts"],"sourcesContent":["import type { WebSpatialRuntimeSnapshot } from './types'\n\n/**\n * Parse shell token from UA:\n * - packaged/hybrid runtimes use `WSAppShell/<version>`\n * - browser-mode runtime on Pico OS uses `PicoWebApp/<version>`\n *\n * Keep `WSAppShell` precedence when both appear in one UA.\n */\nexport function parseShellToken(ua: string): {\n version: string | null\n source: 'wsapp' | 'picoapp' | null\n} {\n const ws = /\\bWSAppShell\\/([\\w.-]+)/i.exec(ua)\n if (ws?.[1]) return { version: ws[1], source: 'wsapp' }\n const pico = /\\bPicoWebApp\\/([\\w.-]+)/i.exec(ua)\n if (pico?.[1]) return { version: pico[1], source: 'picoapp' }\n return { version: null, source: null }\n}\n\n/** Pico runtime: require explicit Pico tokens (do not treat generic `like Quest` VR UAs as picoos). */\nfunction inferPicoOs(ua: string): boolean {\n return /\\bPicoWebApp\\//i.test(ua) || /\\bPicoBrowser\\b/i.test(ua)\n}\n\n/** visionOS-class WebView UAs include a Mac OS X platform token; `WSAppShell` alone is not enough. */\nfunction inferVisionOsFromUa(ua: string): boolean {\n return /Mac OS X/i.test(ua)\n}\n\n/**\n * Resolve internal runtime snapshot from `navigator.userAgent`.\n * SSR / no navigator → `{ type: null, shellVersion: null }` (no throw).\n */\nexport function computeRuntimeFromUserAgent(\n userAgent: string | undefined,\n): WebSpatialRuntimeSnapshot {\n if (userAgent === undefined || userAgent === '') {\n return { type: null, shellVersion: null }\n }\n // Must run before the shell-token gate: Puppeteer UAs may omit WSAppShell/PicoWebApp.\n if (userAgent.includes('Puppeteer')) {\n const { version } = parseShellToken(userAgent)\n return { type: 'puppeteer', shellVersion: version }\n }\n\n const { version, source } = parseShellToken(userAgent)\n if (!version) {\n return { type: null, shellVersion: null }\n }\n\n if (source === 'picoapp' || inferPicoOs(userAgent)) {\n return { type: 'picoos', shellVersion: version }\n }\n\n if (source === 'wsapp') {\n if (inferVisionOsFromUa(userAgent)) {\n return { type: 'visionos', shellVersion: version }\n }\n return { type: null, shellVersion: version }\n }\n\n return { type: null, shellVersion: version }\n}\n"],"mappings":"AASO,SAAS,gBAAgB,IAG9B;AACA,QAAM,KAAK,2BAA2B,KAAK,EAAE;AAC7C,MAAI,KAAK,CAAC,EAAG,QAAO,EAAE,SAAS,GAAG,CAAC,GAAG,QAAQ,QAAQ;AACtD,QAAM,OAAO,2BAA2B,KAAK,EAAE;AAC/C,MAAI,OAAO,CAAC,EAAG,QAAO,EAAE,SAAS,KAAK,CAAC,GAAG,QAAQ,UAAU;AAC5D,SAAO,EAAE,SAAS,MAAM,QAAQ,KAAK;AACvC;AAGA,SAAS,YAAY,IAAqB;AACxC,SAAO,kBAAkB,KAAK,EAAE,KAAK,mBAAmB,KAAK,EAAE;AACjE;AAGA,SAAS,oBAAoB,IAAqB;AAChD,SAAO,YAAY,KAAK,EAAE;AAC5B;AAMO,SAAS,4BACd,WAC2B;AAC3B,MAAI,cAAc,UAAa,cAAc,IAAI;AAC/C,WAAO,EAAE,MAAM,MAAM,cAAc,KAAK;AAAA,EAC1C;AAEA,MAAI,UAAU,SAAS,WAAW,GAAG;AACnC,UAAM,EAAE,SAAAA,SAAQ,IAAI,gBAAgB,SAAS;AAC7C,WAAO,EAAE,MAAM,aAAa,cAAcA,SAAQ;AAAA,EACpD;AAEA,QAAM,EAAE,SAAS,OAAO,IAAI,gBAAgB,SAAS;AACrD,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,MAAM,MAAM,cAAc,KAAK;AAAA,EAC1C;AAEA,MAAI,WAAW,aAAa,YAAY,SAAS,GAAG;AAClD,WAAO,EAAE,MAAM,UAAU,cAAc,QAAQ;AAAA,EACjD;AAEA,MAAI,WAAW,SAAS;AACtB,QAAI,oBAAoB,SAAS,GAAG;AAClC,aAAO,EAAE,MAAM,YAAY,cAAc,QAAQ;AAAA,IACnD;AACA,WAAO,EAAE,MAAM,MAAM,cAAc,QAAQ;AAAA,EAC7C;AAEA,SAAO,EAAE,MAAM,MAAM,cAAc,QAAQ;AAC7C;","names":["version"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { a4 as SpatialSceneCreationOptions, a7 as SpatialSceneType, aQ as SpatialSceneCreationOptionsInternal } from './spatializedElementMotion-_0XWPQCE.js';
|
|
2
|
+
import './types/motion/spatializedVisual.js';
|
|
3
|
+
import './types/motion/spatializedPlayback.js';
|
|
4
|
+
import './types/global.js';
|
|
5
|
+
import './physicalMetrics-W5uZ5xKb.js';
|
|
6
|
+
import './SpatialObject.js';
|
|
7
|
+
import './reality/component/SpatialComponent.js';
|
|
8
|
+
|
|
9
|
+
declare function formatSceneConfig(config: SpatialSceneCreationOptions, sceneType: SpatialSceneType): [SpatialSceneCreationOptions, string[]];
|
|
10
|
+
declare function initScene(name: string, callback: (pre: SpatialSceneCreationOptions) => SpatialSceneCreationOptions, options?: {
|
|
11
|
+
type: SpatialSceneType;
|
|
12
|
+
}): void;
|
|
13
|
+
declare function __getSceneConfigSnapshotForTest(name: string): SpatialSceneCreationOptionsInternal | undefined;
|
|
14
|
+
declare function hijackWindowOpen(window: WindowProxy): void;
|
|
15
|
+
declare function hijackWindowATag(openedWindow: WindowProxy): void;
|
|
16
|
+
declare function injectSceneHook(): void;
|
|
17
|
+
|
|
18
|
+
export { __getSceneConfigSnapshotForTest, formatSceneConfig, hijackWindowATag, hijackWindowOpen, initScene, injectSceneHook };
|
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import { FocusScene } from "./JSBCommand";
|
|
2
|
+
import { openSpatialSceneSync } from "./spatial-host";
|
|
3
|
+
import {
|
|
4
|
+
isValidSceneUnit,
|
|
5
|
+
isValidSpatialSceneType,
|
|
6
|
+
isValidWorldScalingType,
|
|
7
|
+
isValidWorldAlignmentType,
|
|
8
|
+
isValidBaseplateVisibilityType
|
|
9
|
+
} from "./types/types";
|
|
10
|
+
import { deepCloneJSON } from "./utils";
|
|
11
|
+
import { pointToPhysical, physicalToPoint } from "./physicalMetrics";
|
|
12
|
+
const defaultSceneConfig = {
|
|
13
|
+
defaultSize: {
|
|
14
|
+
width: 1280,
|
|
15
|
+
height: 720
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const defaultSceneConfigVolume = {
|
|
19
|
+
defaultSize: {
|
|
20
|
+
width: "0.94m",
|
|
21
|
+
height: "0.94m",
|
|
22
|
+
depth: "0.94m"
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
let xr_window_defaults = {
|
|
26
|
+
...defaultSceneConfig
|
|
27
|
+
};
|
|
28
|
+
let xr_volume_defaults = {
|
|
29
|
+
...defaultSceneConfigVolume
|
|
30
|
+
};
|
|
31
|
+
const INTERNAL_SCHEMA_PREFIX = "webspatial://";
|
|
32
|
+
function deepMergePlain(base, over) {
|
|
33
|
+
if (!over) return { ...base || {} };
|
|
34
|
+
const out = { ...base || {} };
|
|
35
|
+
for (const k of Object.keys(over)) {
|
|
36
|
+
const bv = out[k];
|
|
37
|
+
const ov = over[k];
|
|
38
|
+
if (ov && typeof ov === "object" && !Array.isArray(ov) && bv && typeof bv === "object" && !Array.isArray(bv)) {
|
|
39
|
+
out[k] = deepMergePlain(bv, ov);
|
|
40
|
+
} else {
|
|
41
|
+
out[k] = ov;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
function preferSnake(src, snakeKey, camelKey) {
|
|
47
|
+
if (!src) return void 0;
|
|
48
|
+
if (src[snakeKey] !== void 0) return src[snakeKey];
|
|
49
|
+
if (src[camelKey] !== void 0) return src[camelKey];
|
|
50
|
+
return void 0;
|
|
51
|
+
}
|
|
52
|
+
function normalizeResizability(src) {
|
|
53
|
+
if (!src || typeof src !== "object" || Array.isArray(src)) return void 0;
|
|
54
|
+
const out = {};
|
|
55
|
+
const minWidth = preferSnake(src, "min_width", "minWidth");
|
|
56
|
+
if (minWidth !== void 0) out.minWidth = minWidth;
|
|
57
|
+
const minHeight = preferSnake(src, "min_height", "minHeight");
|
|
58
|
+
if (minHeight !== void 0) out.minHeight = minHeight;
|
|
59
|
+
const maxWidth = preferSnake(src, "max_width", "maxWidth");
|
|
60
|
+
if (maxWidth !== void 0) out.maxWidth = maxWidth;
|
|
61
|
+
const maxHeight = preferSnake(src, "max_height", "maxHeight");
|
|
62
|
+
if (maxHeight !== void 0) out.maxHeight = maxHeight;
|
|
63
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
64
|
+
}
|
|
65
|
+
function normalizeXRDefaultsToSceneOptions(src) {
|
|
66
|
+
const input = src || {};
|
|
67
|
+
const out = {};
|
|
68
|
+
const ds = preferSnake(input, "default_size", "defaultSize");
|
|
69
|
+
if (ds !== void 0) out.defaultSize = ds;
|
|
70
|
+
const res = input.resizability;
|
|
71
|
+
const normalizedRes = normalizeResizability(res);
|
|
72
|
+
if (normalizedRes) out.resizability = normalizedRes;
|
|
73
|
+
const worldScaling = preferSnake(input, "world_scaling", "worldScaling");
|
|
74
|
+
if (worldScaling !== void 0) out.worldScaling = worldScaling;
|
|
75
|
+
const worldAlignment = preferSnake(
|
|
76
|
+
input,
|
|
77
|
+
"world_alignment",
|
|
78
|
+
"worldAlignment"
|
|
79
|
+
);
|
|
80
|
+
if (worldAlignment !== void 0) out.worldAlignment = worldAlignment;
|
|
81
|
+
const baseplateVisibility = preferSnake(
|
|
82
|
+
input,
|
|
83
|
+
"baseplate_visibility",
|
|
84
|
+
"baseplateVisibility"
|
|
85
|
+
);
|
|
86
|
+
if (baseplateVisibility !== void 0)
|
|
87
|
+
out.baseplateVisibility = baseplateVisibility;
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
class SceneManager {
|
|
91
|
+
originalOpen;
|
|
92
|
+
static instance;
|
|
93
|
+
static getInstance() {
|
|
94
|
+
if (!SceneManager.instance) {
|
|
95
|
+
SceneManager.instance = new SceneManager();
|
|
96
|
+
}
|
|
97
|
+
return SceneManager.instance;
|
|
98
|
+
}
|
|
99
|
+
init(window2) {
|
|
100
|
+
void this.setupManifest();
|
|
101
|
+
this.originalOpen = window2.open.bind(window2);
|
|
102
|
+
window2.open = this.open;
|
|
103
|
+
}
|
|
104
|
+
// Stores the latest formatted config used by the platform (per scene name).
|
|
105
|
+
// This object contains normalized values and is safe for internal consumption.
|
|
106
|
+
configMap = {};
|
|
107
|
+
// Stores the raw callback return value (per scene name) to feed into the next initScene call as `pre`.
|
|
108
|
+
// We keep this unformatted so developers receive exactly what they last returned.
|
|
109
|
+
callbackReturnMap = {};
|
|
110
|
+
getConfig(name) {
|
|
111
|
+
if (name === void 0 || !this.configMap[name]) return void 0;
|
|
112
|
+
return this.configMap[name];
|
|
113
|
+
}
|
|
114
|
+
// Ensure URL is absolute; only convert when a relative path is provided
|
|
115
|
+
// - Keep external and special schemes untouched (http, https, data, blob, about, file, mailto, etc.)
|
|
116
|
+
// - Handle protocol-relative URLs (//example.com/path)
|
|
117
|
+
// - Resolve relative paths against document.baseURI (respects <base href>)
|
|
118
|
+
ensureAbsoluteUrl(raw) {
|
|
119
|
+
if (!raw) return raw;
|
|
120
|
+
if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(raw)) {
|
|
121
|
+
return raw;
|
|
122
|
+
}
|
|
123
|
+
if (raw.startsWith("//")) {
|
|
124
|
+
return `${window.location.protocol}${raw}`;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
return new URL(raw, document.baseURI).toString();
|
|
128
|
+
} catch {
|
|
129
|
+
return raw;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async setupManifest() {
|
|
133
|
+
const manifest = await this.getPWAManifest();
|
|
134
|
+
try {
|
|
135
|
+
const xr = manifest?.xr_spatial_scene;
|
|
136
|
+
if (!xr || typeof xr !== "object") return;
|
|
137
|
+
const { overrides, ...topLevel } = xr;
|
|
138
|
+
const normalizedTopLevel = normalizeXRDefaultsToSceneOptions(
|
|
139
|
+
topLevel
|
|
140
|
+
);
|
|
141
|
+
const overrideObj = overrides;
|
|
142
|
+
const windowOverrideSrc = preferSnake(
|
|
143
|
+
overrideObj,
|
|
144
|
+
"window_scene",
|
|
145
|
+
"windowScene"
|
|
146
|
+
);
|
|
147
|
+
const volumeOverrideSrc = preferSnake(
|
|
148
|
+
overrideObj,
|
|
149
|
+
"volume_scene",
|
|
150
|
+
"volumeScene"
|
|
151
|
+
);
|
|
152
|
+
const normalizedWindowOverride = windowOverrideSrc ? normalizeXRDefaultsToSceneOptions(windowOverrideSrc) : void 0;
|
|
153
|
+
const normalizedVolumeOverride = volumeOverrideSrc ? normalizeXRDefaultsToSceneOptions(volumeOverrideSrc) : void 0;
|
|
154
|
+
const windowNext = deepMergePlain(
|
|
155
|
+
normalizedTopLevel,
|
|
156
|
+
normalizedWindowOverride
|
|
157
|
+
);
|
|
158
|
+
const volumeNext = deepMergePlain(
|
|
159
|
+
normalizedTopLevel,
|
|
160
|
+
normalizedVolumeOverride
|
|
161
|
+
);
|
|
162
|
+
if (windowNext && Object.keys(windowNext).length > 0) {
|
|
163
|
+
xr_window_defaults = windowNext;
|
|
164
|
+
}
|
|
165
|
+
if (volumeNext && Object.keys(volumeNext).length > 0) {
|
|
166
|
+
xr_volume_defaults = volumeNext;
|
|
167
|
+
}
|
|
168
|
+
} catch (error) {
|
|
169
|
+
console.warn(
|
|
170
|
+
"SceneManager.setupManifest failed; using built-in defaults.",
|
|
171
|
+
error?.message || error
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
open = (url, target, features) => {
|
|
176
|
+
if (url?.startsWith(INTERNAL_SCHEMA_PREFIX)) {
|
|
177
|
+
if (url.includes("createSpatialized2DElement") || url.includes("createAttachment")) {
|
|
178
|
+
const token = (
|
|
179
|
+
//@ts-ignore
|
|
180
|
+
(window.webSpatial || window.__webspatialShell__)?.genToken?.()
|
|
181
|
+
);
|
|
182
|
+
if (token) {
|
|
183
|
+
const command = url.includes("createAttachment") ? "createAttachment" : "createSpatialized2DElement";
|
|
184
|
+
const host = window.location.host;
|
|
185
|
+
const protocol = window.location.protocol;
|
|
186
|
+
const finalURL = `${protocol}//${host}/${token}/?command=${command}`;
|
|
187
|
+
const sourceParams = new URL(url).searchParams;
|
|
188
|
+
const final = new URL(finalURL);
|
|
189
|
+
for (const key of ["rid", "wsepoch"]) {
|
|
190
|
+
const value = sourceParams.get(key);
|
|
191
|
+
if (value) final.searchParams.set(key, value);
|
|
192
|
+
}
|
|
193
|
+
return this.originalOpen(final.toString(), target, features);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return this.originalOpen(url, target, features);
|
|
197
|
+
}
|
|
198
|
+
url = this.ensureAbsoluteUrl(url);
|
|
199
|
+
if (target === "_self" || target === "_parent" || target === "_top") {
|
|
200
|
+
const newWindow = this.originalOpen(url, target, features);
|
|
201
|
+
return newWindow;
|
|
202
|
+
}
|
|
203
|
+
let cfg = target ? this.getConfig(target) : void 0;
|
|
204
|
+
if (cfg === void 0) {
|
|
205
|
+
const preFormatted = deepCloneJSON(getSceneDefaultConfig("window"));
|
|
206
|
+
const [ans] = formatSceneConfig(preFormatted, "window");
|
|
207
|
+
cfg = { ...ans, type: "window" };
|
|
208
|
+
}
|
|
209
|
+
const result = openSpatialSceneSync(
|
|
210
|
+
url,
|
|
211
|
+
cfg,
|
|
212
|
+
target,
|
|
213
|
+
features
|
|
214
|
+
);
|
|
215
|
+
const id = result.data?.id;
|
|
216
|
+
if (id) {
|
|
217
|
+
let focusCmd = new FocusScene(id);
|
|
218
|
+
focusCmd.execute();
|
|
219
|
+
}
|
|
220
|
+
return result.data?.windowProxy;
|
|
221
|
+
};
|
|
222
|
+
initScene(name, callback, options) {
|
|
223
|
+
const sceneType = options?.type ?? "window";
|
|
224
|
+
const defaultConfigRaw = getSceneDefaultConfig(sceneType);
|
|
225
|
+
const previousOrDefault = this.callbackReturnMap[name] ?? (() => {
|
|
226
|
+
const cloned = deepCloneJSON(defaultConfigRaw);
|
|
227
|
+
return cloned;
|
|
228
|
+
})();
|
|
229
|
+
const rawReturnVal = callback(previousOrDefault);
|
|
230
|
+
const sanitizedReturnVal = sanitizeSceneOptionsUnits(
|
|
231
|
+
deepCloneJSON(rawReturnVal)
|
|
232
|
+
);
|
|
233
|
+
const clonedForFormat = deepCloneJSON(sanitizedReturnVal);
|
|
234
|
+
const baseDefaults = deepCloneJSON(getSceneDefaultConfig(sceneType));
|
|
235
|
+
const mergedForFormat = deepMergePlain(baseDefaults, clonedForFormat);
|
|
236
|
+
const [formattedConfig, errors] = formatSceneConfig(
|
|
237
|
+
mergedForFormat,
|
|
238
|
+
sceneType
|
|
239
|
+
);
|
|
240
|
+
if (errors.length > 0) {
|
|
241
|
+
console.warn(`initScene ${name} with errors: ${errors.join(", ")}`);
|
|
242
|
+
}
|
|
243
|
+
this.callbackReturnMap[name] = sanitizedReturnVal;
|
|
244
|
+
this.configMap[name] = {
|
|
245
|
+
...formattedConfig,
|
|
246
|
+
type: sceneType
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Resolve and load a PWA manifest as JSON:
|
|
251
|
+
* 1) Determine href:
|
|
252
|
+
* - Prefer explicit manifestUrl if provided;
|
|
253
|
+
* - Fallback to <link rel="manifest">, preferring the raw attribute over computed href.
|
|
254
|
+
* 2) Normalize href to absolute using ensureAbsoluteUrl (respects <base href>).
|
|
255
|
+
* 3) Handle data URLs inline:
|
|
256
|
+
* - data:...;base64,... → atob then JSON.parse
|
|
257
|
+
* - data:...,... → decodeURIComponent then JSON.parse
|
|
258
|
+
* 4) Fetch with credentials same-origin first; if that fails (e.g., CORS), attempt unauthenticated fetch.
|
|
259
|
+
* 5) Parse as JSON; if response body is text, parse the text as JSON.
|
|
260
|
+
*/
|
|
261
|
+
async getPWAManifest(manifestUrl) {
|
|
262
|
+
let href = manifestUrl;
|
|
263
|
+
if (!href) {
|
|
264
|
+
const el = document.querySelector(
|
|
265
|
+
'link[rel="manifest"]'
|
|
266
|
+
);
|
|
267
|
+
href = el?.getAttribute("href") || el?.href;
|
|
268
|
+
}
|
|
269
|
+
if (!href) return;
|
|
270
|
+
href = this.ensureAbsoluteUrl(href);
|
|
271
|
+
if (!href) return;
|
|
272
|
+
if (href.startsWith("data:")) {
|
|
273
|
+
try {
|
|
274
|
+
const comma = href.indexOf(",");
|
|
275
|
+
if (comma < 0) return;
|
|
276
|
+
const meta = href.slice(5, comma);
|
|
277
|
+
const data = href.slice(comma + 1);
|
|
278
|
+
const isBase64 = /;base64/i.test(meta);
|
|
279
|
+
const decoded = isBase64 ? atob(data) : decodeURIComponent(data);
|
|
280
|
+
return JSON.parse(decoded);
|
|
281
|
+
} catch {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
const res = await fetch(href, { credentials: "same-origin" });
|
|
287
|
+
if (!res.ok) throw new Error(String(res.status));
|
|
288
|
+
try {
|
|
289
|
+
return await res.json();
|
|
290
|
+
} catch {
|
|
291
|
+
const t = await res.text();
|
|
292
|
+
return JSON.parse(t);
|
|
293
|
+
}
|
|
294
|
+
} catch {
|
|
295
|
+
try {
|
|
296
|
+
const res = await fetch(href);
|
|
297
|
+
if (!res.ok) return;
|
|
298
|
+
try {
|
|
299
|
+
return await res.json();
|
|
300
|
+
} catch {
|
|
301
|
+
const t = await res.text();
|
|
302
|
+
return JSON.parse(t);
|
|
303
|
+
}
|
|
304
|
+
} catch {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function sanitizeSceneOptionsUnits(val) {
|
|
311
|
+
if (val?.defaultSize) {
|
|
312
|
+
const keys = ["width", "height", "depth"];
|
|
313
|
+
for (const k of keys) {
|
|
314
|
+
if (k in val.defaultSize && !isValidSceneUnit(val.defaultSize[k])) {
|
|
315
|
+
delete val.defaultSize[k];
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (val?.resizability) {
|
|
320
|
+
const keys = ["minWidth", "minHeight", "maxWidth", "maxHeight"];
|
|
321
|
+
for (const k of keys) {
|
|
322
|
+
if (k in val.resizability && !isValidSceneUnit(val.resizability[k])) {
|
|
323
|
+
delete val.resizability[k];
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return val;
|
|
328
|
+
}
|
|
329
|
+
function pxToMeter(px) {
|
|
330
|
+
return pointToPhysical(px);
|
|
331
|
+
}
|
|
332
|
+
function meterToPx(meter) {
|
|
333
|
+
return physicalToPoint(meter);
|
|
334
|
+
}
|
|
335
|
+
function formatToNumber(str, targetUnit, defaultUnit) {
|
|
336
|
+
if (typeof str === "number") {
|
|
337
|
+
if (defaultUnit === "px" && targetUnit === "px" || defaultUnit === "m" && targetUnit === "m") {
|
|
338
|
+
return str;
|
|
339
|
+
}
|
|
340
|
+
if (defaultUnit === "px" && targetUnit === "m") {
|
|
341
|
+
return pxToMeter(str);
|
|
342
|
+
} else if (defaultUnit === "m" && targetUnit === "px") {
|
|
343
|
+
return meterToPx(str);
|
|
344
|
+
}
|
|
345
|
+
return str;
|
|
346
|
+
}
|
|
347
|
+
if (targetUnit === "m") {
|
|
348
|
+
if (str.endsWith("m")) {
|
|
349
|
+
return Number(str.slice(0, -1));
|
|
350
|
+
} else if (str.endsWith("px")) {
|
|
351
|
+
return pxToMeter(Number(str.slice(0, -2)));
|
|
352
|
+
} else {
|
|
353
|
+
throw new Error("formatToNumber: invalid str");
|
|
354
|
+
}
|
|
355
|
+
} else if (targetUnit === "px") {
|
|
356
|
+
if (str.endsWith("px")) {
|
|
357
|
+
return Number(str.slice(0, -2));
|
|
358
|
+
} else if (str.endsWith("m")) {
|
|
359
|
+
return meterToPx(Number(str.slice(0, -1)));
|
|
360
|
+
} else {
|
|
361
|
+
throw new Error("formatToNumber: invalid str");
|
|
362
|
+
}
|
|
363
|
+
} else {
|
|
364
|
+
throw new Error("formatToNumber: invalid targetUnit");
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
function formatSceneConfig(config, sceneType) {
|
|
368
|
+
const errors = [];
|
|
369
|
+
const isWindow = sceneType === "window";
|
|
370
|
+
if (!isValidSpatialSceneType(sceneType)) {
|
|
371
|
+
errors.push(`sceneType`);
|
|
372
|
+
}
|
|
373
|
+
if (config.defaultSize) {
|
|
374
|
+
const iterKeys = ["width", "height", "depth"];
|
|
375
|
+
for (let k of iterKeys) {
|
|
376
|
+
if (!(k in config.defaultSize)) continue;
|
|
377
|
+
if (isValidSceneUnit(config.defaultSize[k])) {
|
|
378
|
+
;
|
|
379
|
+
config.defaultSize[k] = formatToNumber(
|
|
380
|
+
config.defaultSize[k],
|
|
381
|
+
isWindow ? "px" : "m",
|
|
382
|
+
"px"
|
|
383
|
+
);
|
|
384
|
+
} else {
|
|
385
|
+
delete config.defaultSize[k];
|
|
386
|
+
errors.push(`defaultSize.${k}`);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
if (config.resizability) {
|
|
391
|
+
const iterKeys = ["minWidth", "minHeight", "maxWidth", "maxHeight"];
|
|
392
|
+
for (let k of iterKeys) {
|
|
393
|
+
if (!(k in config.resizability)) continue;
|
|
394
|
+
if (isValidSceneUnit(config.resizability[k])) {
|
|
395
|
+
;
|
|
396
|
+
config.resizability[k] = formatToNumber(
|
|
397
|
+
config.resizability[k],
|
|
398
|
+
"px",
|
|
399
|
+
"px"
|
|
400
|
+
);
|
|
401
|
+
} else {
|
|
402
|
+
delete config.resizability[k];
|
|
403
|
+
errors.push(`resizability.${k}`);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
if (config.worldScaling) {
|
|
408
|
+
if (!isValidWorldScalingType(config.worldScaling)) {
|
|
409
|
+
config.worldScaling = "automatic";
|
|
410
|
+
errors.push("worldScaling");
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
if (config.worldAlignment) {
|
|
414
|
+
if (!isValidWorldAlignmentType(config.worldAlignment)) {
|
|
415
|
+
config.worldAlignment = "automatic";
|
|
416
|
+
errors.push("worldAlignment");
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
if (config.baseplateVisibility) {
|
|
420
|
+
if (!isValidBaseplateVisibilityType(config.baseplateVisibility)) {
|
|
421
|
+
config.baseplateVisibility = "automatic";
|
|
422
|
+
errors.push("baseplateVisibility");
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
return [config, errors];
|
|
426
|
+
}
|
|
427
|
+
function initScene(name, callback, options) {
|
|
428
|
+
return SceneManager.getInstance().initScene(name, callback, options);
|
|
429
|
+
}
|
|
430
|
+
function __getSceneConfigSnapshotForTest(name) {
|
|
431
|
+
const mgr = SceneManager.getInstance();
|
|
432
|
+
return mgr?.configMap?.[name];
|
|
433
|
+
}
|
|
434
|
+
function hijackWindowOpen(window2) {
|
|
435
|
+
SceneManager.getInstance().init(window2);
|
|
436
|
+
}
|
|
437
|
+
function hijackWindowATag(openedWindow) {
|
|
438
|
+
openedWindow.document.onclick = function(e) {
|
|
439
|
+
let element = e.target;
|
|
440
|
+
while (element) {
|
|
441
|
+
if (element.tagName == "A") {
|
|
442
|
+
if (handleATag(e, element)) {
|
|
443
|
+
return false;
|
|
444
|
+
}
|
|
445
|
+
return true;
|
|
446
|
+
}
|
|
447
|
+
if (element.parentElement) {
|
|
448
|
+
element = element.parentElement;
|
|
449
|
+
} else {
|
|
450
|
+
break;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
function handleATag(event, link) {
|
|
456
|
+
if (event.defaultPrevented) return false;
|
|
457
|
+
const target = link.target;
|
|
458
|
+
const url = link.href;
|
|
459
|
+
if (target && target !== "_self") {
|
|
460
|
+
event.preventDefault();
|
|
461
|
+
window.open(url, target);
|
|
462
|
+
return true;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
function getSceneDefaultConfig(sceneType) {
|
|
466
|
+
return sceneType === "window" ? xr_window_defaults || defaultSceneConfig : xr_volume_defaults || defaultSceneConfigVolume;
|
|
467
|
+
}
|
|
468
|
+
function injectSceneHook() {
|
|
469
|
+
hijackWindowOpen(window);
|
|
470
|
+
hijackWindowATag(window);
|
|
471
|
+
}
|
|
472
|
+
export {
|
|
473
|
+
__getSceneConfigSnapshotForTest,
|
|
474
|
+
formatSceneConfig,
|
|
475
|
+
hijackWindowATag,
|
|
476
|
+
hijackWindowOpen,
|
|
477
|
+
initScene,
|
|
478
|
+
injectSceneHook
|
|
479
|
+
};
|
|
480
|
+
//# sourceMappingURL=scene-polyfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scene-polyfill.ts"],"sourcesContent":["import { FocusScene } from './JSBCommand'\nimport { openSpatialSceneSync } from './spatial-host'\nimport {\n SpatialSceneCreationOptions,\n SpatialSceneType,\n isValidSceneUnit,\n isValidSpatialSceneType,\n isValidWorldScalingType,\n isValidWorldAlignmentType,\n isValidBaseplateVisibilityType,\n PWAManifest,\n XRSpatialSceneConfig,\n XRSpatialSceneDefaults,\n} from './types/types'\nimport { SpatialSceneCreationOptionsInternal } from './types/internal'\nimport { deepCloneJSON } from './utils'\nimport { pointToPhysical, physicalToPoint } from './physicalMetrics'\n\nconst defaultSceneConfig: SpatialSceneCreationOptions = {\n defaultSize: {\n width: 1280,\n height: 720,\n },\n}\n\nconst defaultSceneConfigVolume: SpatialSceneCreationOptions = {\n defaultSize: {\n width: '0.94m',\n height: '0.94m',\n depth: '0.94m',\n },\n}\n\nlet xr_window_defaults: SpatialSceneCreationOptions = {\n ...defaultSceneConfig,\n}\nlet xr_volume_defaults: SpatialSceneCreationOptions = {\n ...defaultSceneConfigVolume,\n}\n\nconst INTERNAL_SCHEMA_PREFIX = 'webspatial://'\n\n/**\n * Deep-merge two plain object trees (no arrays, no special classes).\n * - Creates a shallow clone of base, then recursively merges properties from over.\n * - When both sides at a key are plain objects, merges recursively; otherwise, replaces with over.\n * - Ignores arrays (treated as replace).\n * Intended for small configuration objects like manifest overrides.\n */\nfunction deepMergePlain<\n T extends Record<string, any>,\n U extends Record<string, any> | undefined,\n>(base: T, over: U): T & (U extends undefined ? {} : U) {\n if (!over) return { ...(base || {}) } as any\n const out: any = { ...(base || {}) }\n for (const k of Object.keys(over)) {\n const bv = out[k]\n const ov = (over as any)[k]\n if (\n ov &&\n typeof ov === 'object' &&\n !Array.isArray(ov) &&\n bv &&\n typeof bv === 'object' &&\n !Array.isArray(bv)\n ) {\n out[k] = deepMergePlain(bv, ov)\n } else {\n out[k] = ov\n }\n }\n return out\n}\n\n/**\n * Pick a value from a manifest-like object where both snake_case and camelCase may exist.\n *\n * Rule: if both keys exist on the same object, snake_case wins.\n */\nfunction preferSnake<T>(\n src: Record<string, any> | undefined,\n snakeKey: string,\n camelKey: string,\n): T | undefined {\n if (!src) return undefined\n if (src[snakeKey] !== undefined) return src[snakeKey] as T\n if (src[camelKey] !== undefined) return src[camelKey] as T\n return undefined\n}\n\n/**\n * Normalize resizability keys from manifest input into the runtime camelCase shape.\n *\n * Accepts both:\n * - camelCase: minWidth/minHeight/maxWidth/maxHeight\n * - snake_case: min_width/min_height/max_width/max_height\n *\n * Rule: if both exist on the same object, snake_case wins.\n */\nfunction normalizeResizability(\n src: Record<string, any> | undefined,\n): SpatialSceneCreationOptions['resizability'] | undefined {\n if (!src || typeof src !== 'object' || Array.isArray(src)) return undefined\n const out: any = {}\n const minWidth = preferSnake<any>(src, 'min_width', 'minWidth')\n if (minWidth !== undefined) out.minWidth = minWidth\n const minHeight = preferSnake<any>(src, 'min_height', 'minHeight')\n if (minHeight !== undefined) out.minHeight = minHeight\n const maxWidth = preferSnake<any>(src, 'max_width', 'maxWidth')\n if (maxWidth !== undefined) out.maxWidth = maxWidth\n const maxHeight = preferSnake<any>(src, 'max_height', 'maxHeight')\n if (maxHeight !== undefined) out.maxHeight = maxHeight\n return Object.keys(out).length > 0 ? out : undefined\n}\n\n/**\n * Normalize XRSpatialSceneDefaults (manifest shape) into SpatialSceneCreationOptions (runtime shape).\n *\n * - Remaps supported snake_case aliases into camelCase keys.\n * - Keeps output camelCase-only (snake_case keys are treated as input aliases).\n * - Units are not formatted here; downstream formatting is handled by formatSceneConfig.\n *\n * Rule: if both snake_case and camelCase are present on the same object, snake_case wins.\n */\nfunction normalizeXRDefaultsToSceneOptions(\n src: XRSpatialSceneDefaults | Record<string, any>,\n): SpatialSceneCreationOptions {\n const input: any = src || {}\n const out: any = {}\n\n const ds = preferSnake<any>(input, 'default_size', 'defaultSize')\n if (ds !== undefined) out.defaultSize = ds\n\n const res = input.resizability\n const normalizedRes = normalizeResizability(res)\n if (normalizedRes) out.resizability = normalizedRes\n\n const worldScaling = preferSnake<any>(input, 'world_scaling', 'worldScaling')\n if (worldScaling !== undefined) out.worldScaling = worldScaling\n\n const worldAlignment = preferSnake<any>(\n input,\n 'world_alignment',\n 'worldAlignment',\n )\n if (worldAlignment !== undefined) out.worldAlignment = worldAlignment\n\n const baseplateVisibility = preferSnake<any>(\n input,\n 'baseplate_visibility',\n 'baseplateVisibility',\n )\n if (baseplateVisibility !== undefined)\n out.baseplateVisibility = baseplateVisibility\n\n return out\n}\n\nclass SceneManager {\n private originalOpen: any\n private static instance: SceneManager\n static getInstance() {\n if (!SceneManager.instance) {\n SceneManager.instance = new SceneManager()\n }\n return SceneManager.instance\n }\n\n init(window: WindowProxy) {\n // Load manifest defaults in the background; scene creation reads the\n // resolved xr_window_defaults / xr_volume_defaults once available.\n void this.setupManifest()\n this.originalOpen = window.open.bind(window)\n ;(window as any).open = this.open\n }\n\n // Stores the latest formatted config used by the platform (per scene name).\n // This object contains normalized values and is safe for internal consumption.\n private configMap: Record<string, SpatialSceneCreationOptionsInternal> = {}\n // Stores the raw callback return value (per scene name) to feed into the next initScene call as `pre`.\n // We keep this unformatted so developers receive exactly what they last returned.\n private callbackReturnMap: Record<string, SpatialSceneCreationOptions> = {}\n private getConfig(name?: string) {\n if (name === undefined || !this.configMap[name]) return undefined\n return this.configMap[name]\n }\n\n // Ensure URL is absolute; only convert when a relative path is provided\n // - Keep external and special schemes untouched (http, https, data, blob, about, file, mailto, etc.)\n // - Handle protocol-relative URLs (//example.com/path)\n // - Resolve relative paths against document.baseURI (respects <base href>)\n private ensureAbsoluteUrl(raw?: string): string | undefined {\n if (!raw) return raw\n // Already has a scheme (includes internal webspatial:// which is handled earlier)\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(raw)) {\n return raw\n }\n // Protocol-relative URL\n if (raw.startsWith('//')) {\n return `${window.location.protocol}${raw}`\n }\n // Resolve against base URI\n try {\n return new URL(raw, document.baseURI).toString()\n } catch {\n // Fallback: leave unchanged\n return raw\n }\n }\n\n private async setupManifest() {\n const manifest = await this.getPWAManifest()\n try {\n const xr = manifest?.xr_spatial_scene\n if (!xr || typeof xr !== 'object') return\n const { overrides, ...topLevel } = xr as XRSpatialSceneConfig\n\n // Normalize top-level defaults and per-type overrides separately, then deep-merge.\n // - Ensures overrides keep higher priority than top-level defaults.\n // - Ensures snake_case vs camelCase resolution is applied within the same object only.\n // - This affects only manifest-resolved defaults; initScene callback chaining remains unchanged\n // because callbackReturnMap stores the raw callback return values.\n const normalizedTopLevel = normalizeXRDefaultsToSceneOptions(\n topLevel as any,\n )\n const overrideObj: any = overrides as any\n const windowOverrideSrc = preferSnake<any>(\n overrideObj,\n 'window_scene',\n 'windowScene',\n )\n const volumeOverrideSrc = preferSnake<any>(\n overrideObj,\n 'volume_scene',\n 'volumeScene',\n )\n const normalizedWindowOverride = windowOverrideSrc\n ? normalizeXRDefaultsToSceneOptions(windowOverrideSrc)\n : undefined\n const normalizedVolumeOverride = volumeOverrideSrc\n ? normalizeXRDefaultsToSceneOptions(volumeOverrideSrc)\n : undefined\n\n const windowNext = deepMergePlain(\n normalizedTopLevel,\n normalizedWindowOverride,\n )\n const volumeNext = deepMergePlain(\n normalizedTopLevel,\n normalizedVolumeOverride,\n )\n if (windowNext && Object.keys(windowNext).length > 0) {\n xr_window_defaults = windowNext\n }\n if (volumeNext && Object.keys(volumeNext).length > 0) {\n xr_volume_defaults = volumeNext\n }\n } catch (error: any) {\n console.warn(\n 'SceneManager.setupManifest failed; using built-in defaults.',\n error?.message || error,\n )\n }\n }\n\n private open = (url?: string, target?: string, features?: string) => {\n // bypass internal\n if (url?.startsWith(INTERNAL_SCHEMA_PREFIX)) {\n if (\n url.includes('createSpatialized2DElement') ||\n url.includes('createAttachment')\n ) {\n const token = //@ts-ignore\n (window.webSpatial || window.__webspatialShell__)?.genToken?.()\n if (token) {\n const command = url.includes('createAttachment')\n ? 'createAttachment'\n : 'createSpatialized2DElement'\n const host = window.location.host\n const protocol = window.location.protocol\n const finalURL = `${protocol}//${host}/${token}/?command=${command}`\n const sourceParams = new URL(url).searchParams\n const final = new URL(finalURL)\n for (const key of ['rid', 'wsepoch']) {\n const value = sourceParams.get(key)\n if (value) final.searchParams.set(key, value)\n }\n return this.originalOpen(final.toString(), target, features)\n }\n }\n return this.originalOpen(url, target, features)\n }\n\n // Normalize only relative URLs to absolute for platform handling\n url = this.ensureAbsoluteUrl(url)\n\n // if target is special\n if (target === '_self' || target === '_parent' || target === '_top') {\n const newWindow = this.originalOpen(url, target, features)\n return newWindow\n }\n\n let cfg = target ? this.getConfig(target) : undefined\n\n if (cfg === undefined) {\n // if no config, use default window config\n const preFormatted = deepCloneJSON(getSceneDefaultConfig('window'))\n\n const [ans] = formatSceneConfig(preFormatted, 'window')\n cfg = { ...ans, type: 'window' }\n }\n\n const result = openSpatialSceneSync(\n url!,\n cfg as SpatialSceneCreationOptionsInternal,\n target,\n features,\n )\n\n const id = result.data?.id\n\n if (id) {\n // send JSB to focus\n let focusCmd = new FocusScene(id)\n focusCmd.execute()\n }\n\n return result.data?.windowProxy\n }\n initScene(\n name: string,\n callback: (pre: SpatialSceneCreationOptions) => SpatialSceneCreationOptions,\n options?: { type: SpatialSceneType },\n ) {\n const sceneType = options?.type ?? 'window'\n const defaultConfigRaw = getSceneDefaultConfig(sceneType)\n const previousOrDefault =\n this.callbackReturnMap[name] ??\n ((): SpatialSceneCreationOptions => {\n // Clone default config to avoid mutating shared defaults during formatting.\n const cloned = deepCloneJSON(defaultConfigRaw)\n return cloned\n })()\n const rawReturnVal = callback(previousOrDefault)\n const sanitizedReturnVal = sanitizeSceneOptionsUnits(\n deepCloneJSON(rawReturnVal),\n )\n const clonedForFormat = deepCloneJSON(sanitizedReturnVal)\n // Merge normalized user return with scene-type defaults before final formatting.\n // This ensures missing fields fall back to the appropriate xr_window_defaults / xr_volume_defaults.\n const baseDefaults = deepCloneJSON(getSceneDefaultConfig(sceneType))\n const mergedForFormat = deepMergePlain(baseDefaults, clonedForFormat)\n\n const [formattedConfig, errors] = formatSceneConfig(\n mergedForFormat,\n sceneType,\n )\n\n if (errors.length > 0) {\n console.warn(`initScene ${name} with errors: ${errors.join(', ')}`)\n }\n this.callbackReturnMap[name] = sanitizedReturnVal\n this.configMap[name] = {\n ...formattedConfig,\n type: sceneType,\n }\n }\n /**\n * Resolve and load a PWA manifest as JSON:\n * 1) Determine href:\n * - Prefer explicit manifestUrl if provided;\n * - Fallback to <link rel=\"manifest\">, preferring the raw attribute over computed href.\n * 2) Normalize href to absolute using ensureAbsoluteUrl (respects <base href>).\n * 3) Handle data URLs inline:\n * - data:...;base64,... → atob then JSON.parse\n * - data:...,... → decodeURIComponent then JSON.parse\n * 4) Fetch with credentials same-origin first; if that fails (e.g., CORS), attempt unauthenticated fetch.\n * 5) Parse as JSON; if response body is text, parse the text as JSON.\n */\n async getPWAManifest(manifestUrl?: string): Promise<PWAManifest | undefined> {\n let href: string | undefined = manifestUrl\n if (!href) {\n const el = document.querySelector(\n 'link[rel=\"manifest\"]',\n ) as HTMLLinkElement | null\n href = el?.getAttribute('href') || el?.href\n }\n if (!href) return\n href = this.ensureAbsoluteUrl(href)\n if (!href) return\n if (href.startsWith('data:')) {\n // Inline data URL manifest: data:[<mediatype>][;base64],<data>\n try {\n const comma = href.indexOf(',')\n if (comma < 0) return\n const meta = href.slice(5, comma)\n const data = href.slice(comma + 1)\n const isBase64 = /;base64/i.test(meta)\n const decoded = isBase64 ? atob(data) : decodeURIComponent(data)\n return JSON.parse(decoded)\n } catch {\n return\n }\n }\n try {\n // Same-origin fetch with credentials first.\n const res = await fetch(href, { credentials: 'same-origin' })\n if (!res.ok) throw new Error(String(res.status))\n try {\n return await res.json()\n } catch {\n const t = await res.text()\n return JSON.parse(t)\n }\n } catch {\n try {\n // Fallback: unauthenticated fetch (may help when same-origin credentials fail due to CORS).\n const res = await fetch(href)\n if (!res.ok) return\n try {\n return await res.json()\n } catch {\n const t = await res.text()\n return JSON.parse(t)\n }\n } catch {\n return\n }\n }\n }\n}\n\nfunction sanitizeSceneOptionsUnits(\n val: SpatialSceneCreationOptions,\n): SpatialSceneCreationOptions {\n if (val?.defaultSize) {\n const keys = ['width', 'height', 'depth'] as const\n for (const k of keys) {\n if (\n k in (val.defaultSize as any) &&\n !isValidSceneUnit((val.defaultSize as any)[k])\n ) {\n delete (val.defaultSize as any)[k]\n }\n }\n }\n if (val?.resizability) {\n const keys = ['minWidth', 'minHeight', 'maxWidth', 'maxHeight'] as const\n for (const k of keys) {\n if (\n k in (val.resizability as any) &&\n !isValidSceneUnit((val.resizability as any)[k])\n ) {\n delete (val.resizability as any)[k]\n }\n }\n }\n return val\n}\n\nfunction pxToMeter(px: number): number {\n return pointToPhysical(px)\n}\n\nfunction meterToPx(meter: number): number {\n return physicalToPoint(meter)\n}\n\nfunction formatToNumber(\n str: string | number,\n targetUnit: 'px' | 'm',\n defaultUnit: 'px' | 'm',\n): number {\n if (typeof str === 'number') {\n if (\n (defaultUnit === 'px' && targetUnit === 'px') ||\n (defaultUnit === 'm' && targetUnit === 'm')\n ) {\n return str\n }\n // unit not match target\n if (defaultUnit === 'px' && targetUnit === 'm') {\n return pxToMeter(str)\n } else if (defaultUnit === 'm' && targetUnit === 'px') {\n return meterToPx(str)\n }\n // fallback\n return str\n }\n if (targetUnit === 'm') {\n if (str.endsWith('m')) {\n // 1m\n return Number(str.slice(0, -1))\n } else if (str.endsWith('px')) {\n // 100px\n return pxToMeter(Number(str.slice(0, -2)))\n } else {\n throw new Error('formatToNumber: invalid str')\n }\n } else if (targetUnit === 'px') {\n if (str.endsWith('px')) {\n // 100px\n return Number(str.slice(0, -2))\n } else if (str.endsWith('m')) {\n // 1m\n return meterToPx(Number(str.slice(0, -1)))\n } else {\n throw new Error('formatToNumber: invalid str')\n }\n } else {\n throw new Error('formatToNumber: invalid targetUnit')\n }\n}\n\nexport function formatSceneConfig(\n config: SpatialSceneCreationOptions,\n sceneType: SpatialSceneType,\n): [SpatialSceneCreationOptions, string[]] {\n // defaultSize and resizability's width/height/depth can be 100 or \"100px\" or \"1m\"\n // expect:\n // resizability should format into px\n // defaultSize should format into px if window\n // defaultSize should format into m if volume\n\n const errors: string[] = []\n\n const isWindow = sceneType === 'window'\n if (!isValidSpatialSceneType(sceneType)) {\n errors.push(`sceneType`)\n }\n\n // format defaultSize\n if (config.defaultSize) {\n const iterKeys = ['width', 'height', 'depth']\n for (let k of iterKeys) {\n if (!(k in config.defaultSize)) continue\n if (isValidSceneUnit((config.defaultSize as any)[k])) {\n ;(config.defaultSize as any)[k] = formatToNumber(\n (config.defaultSize as any)[k],\n isWindow ? 'px' : 'm',\n 'px',\n )\n } else {\n // delete invalid unit\n delete (config.defaultSize as any)[k]\n errors.push(`defaultSize.${k}`)\n }\n }\n }\n\n // format resizability\n if (config.resizability) {\n const iterKeys = ['minWidth', 'minHeight', 'maxWidth', 'maxHeight']\n for (let k of iterKeys) {\n if (!(k in config.resizability)) continue\n if (isValidSceneUnit((config.resizability as any)[k])) {\n ;(config.resizability as any)[k] = formatToNumber(\n (config.resizability as any)[k],\n 'px',\n 'px',\n )\n } else {\n // delete invalid unit\n delete (config.resizability as any)[k]\n errors.push(`resizability.${k}`)\n }\n }\n }\n\n // check value\n if (config.worldScaling) {\n if (!isValidWorldScalingType(config.worldScaling)) {\n config.worldScaling = 'automatic'\n errors.push('worldScaling')\n }\n }\n\n if (config.worldAlignment) {\n if (!isValidWorldAlignmentType(config.worldAlignment)) {\n config.worldAlignment = 'automatic'\n errors.push('worldAlignment')\n }\n }\n\n if (config.baseplateVisibility) {\n if (!isValidBaseplateVisibilityType(config.baseplateVisibility)) {\n config.baseplateVisibility = 'automatic'\n errors.push('baseplateVisibility')\n }\n }\n\n return [config, errors]\n}\n\nexport function initScene(\n name: string,\n callback: (pre: SpatialSceneCreationOptions) => SpatialSceneCreationOptions,\n options?: { type: SpatialSceneType },\n) {\n return SceneManager.getInstance().initScene(name, callback, options)\n}\n\nexport function __getSceneConfigSnapshotForTest(\n name: string,\n): SpatialSceneCreationOptionsInternal | undefined {\n const mgr = SceneManager.getInstance() as any\n return mgr?.configMap?.[name]\n}\n\nexport function hijackWindowOpen(window: WindowProxy) {\n SceneManager.getInstance().init(window)\n}\n\nexport function hijackWindowATag(openedWindow: WindowProxy) {\n openedWindow!.document.onclick = function (e) {\n let element = e.target as HTMLElement | null\n\n // Look for <a> element in the clicked elements parents and if found override navigation behavior if needed\n while (element) {\n if (element.tagName == 'A') {\n // When using libraries like react route's <Link> it sets an onclick event, when this happens we should do nothing and let that occur\n\n // if onClick is set for the element, the raw onclick will be noop() trapped so the onclick check is no longer trustable\n // we handle all the scenarios\n\n if (handleATag(e, element as HTMLAnchorElement)) {\n return false // prevent default action and stop event propagation\n }\n\n return true\n }\n if (element.parentElement) {\n element = element.parentElement\n } else {\n break\n }\n }\n }\n}\n\nfunction handleATag(event: MouseEvent, link: HTMLAnchorElement) {\n // Respect clicks that have already been cancelled (e.g. by app/router handlers).\n if (event.defaultPrevented) return false\n // Use the anchor found during bubbling so nested clicks like <a><img /></a> are handled correctly.\n const target = link.target\n const url = link.href\n\n if (target && target !== '_self') {\n event.preventDefault()\n window.open(url, target)\n return true\n }\n}\n\nfunction getSceneDefaultConfig(sceneType: SpatialSceneType) {\n return sceneType === 'window'\n ? xr_window_defaults || defaultSceneConfig\n : xr_volume_defaults || defaultSceneConfigVolume\n}\n\nexport function injectSceneHook() {\n hijackWindowOpen(window)\n hijackWindowATag(window)\n}\n"],"mappings":"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","names":["window"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { h as AttachmentEntityOptions, aZ as WebSpatialProtocolResult, aQ as SpatialSceneCreationOptionsInternal } from './spatializedElementMotion-_0XWPQCE.js';
|
|
2
|
+
import './types/motion/spatializedVisual.js';
|
|
3
|
+
import './types/motion/spatializedPlayback.js';
|
|
4
|
+
import './types/global.js';
|
|
5
|
+
import './physicalMetrics-W5uZ5xKb.js';
|
|
6
|
+
import './SpatialObject.js';
|
|
7
|
+
import './reality/component/SpatialComponent.js';
|
|
8
|
+
|
|
9
|
+
declare function createNativeSpatialDiv(): Promise<WebSpatialProtocolResult>;
|
|
10
|
+
declare function createNativeAttachment(options: AttachmentEntityOptions): Promise<WebSpatialProtocolResult>;
|
|
11
|
+
declare function openSpatialSceneSync(url: string, config: SpatialSceneCreationOptionsInternal | undefined, target?: string, features?: string): WebSpatialProtocolResult;
|
|
12
|
+
|
|
13
|
+
export { createNativeAttachment, createNativeSpatialDiv, openSpatialSceneSync };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { getPlatform, getPlatformSync } from "./platform-runtime";
|
|
2
|
+
async function createNativeSpatialDiv() {
|
|
3
|
+
const platform = await getPlatform();
|
|
4
|
+
return platform.createNativeSpatialDiv();
|
|
5
|
+
}
|
|
6
|
+
async function createNativeAttachment(options) {
|
|
7
|
+
const platform = await getPlatform();
|
|
8
|
+
return platform.createNativeAttachment(options);
|
|
9
|
+
}
|
|
10
|
+
function openSpatialSceneSync(url, config, target, features) {
|
|
11
|
+
return getPlatformSync().openSpatialSceneSync(url, config, target, features);
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
createNativeAttachment,
|
|
15
|
+
createNativeSpatialDiv,
|
|
16
|
+
openSpatialSceneSync
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=spatial-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/spatial-host.ts"],"sourcesContent":["import type { WebSpatialProtocolResult } from './platform-adapter/interface'\nimport { getPlatform, getPlatformSync } from './platform-runtime'\nimport type { SpatialSceneCreationOptionsInternal } from './types/internal'\nimport type { AttachmentEntityOptions } from './types/types'\n\nexport async function createNativeSpatialDiv(): Promise<WebSpatialProtocolResult> {\n const platform = await getPlatform()\n return platform.createNativeSpatialDiv()\n}\n\nexport async function createNativeAttachment(\n options: AttachmentEntityOptions,\n): Promise<WebSpatialProtocolResult> {\n const platform = await getPlatform()\n return platform.createNativeAttachment(options)\n}\n\nexport function openSpatialSceneSync(\n url: string,\n config: SpatialSceneCreationOptionsInternal | undefined,\n target?: string,\n features?: string,\n): WebSpatialProtocolResult {\n return getPlatformSync().openSpatialSceneSync(url, config, target, features)\n}\n"],"mappings":"AACA,SAAS,aAAa,uBAAuB;AAI7C,eAAsB,yBAA4D;AAChF,QAAM,WAAW,MAAM,YAAY;AACnC,SAAO,SAAS,uBAAuB;AACzC;AAEA,eAAsB,uBACpB,SACmC;AACnC,QAAM,WAAW,MAAM,YAAY;AACnC,SAAO,SAAS,uBAAuB,OAAO;AAChD;AAEO,SAAS,qBACd,KACA,QACA,QACA,UAC0B;AAC1B,SAAO,gBAAgB,EAAE,qBAAqB,KAAK,QAAQ,QAAQ,QAAQ;AAC7E;","names":[]}
|