@volter/editor-game 0.5.65
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/LICENSE +661 -0
- package/NOTICE +23 -0
- package/contributions/asset-budget-asset.menu.ts +26 -0
- package/contributions/asset-budget.action.ts +18 -0
- package/contributions/asset-budget.document.tsx +21 -0
- package/contributions/asset-budget.menu.ts +22 -0
- package/contributions/audio-unlock.service.ts +17 -0
- package/contributions/audio.utility.tsx +15 -0
- package/contributions/autoplay.service.ts +48 -0
- package/contributions/bridge.command.ts +172 -0
- package/contributions/build-profiles.document.tsx +21 -0
- package/contributions/build-progress.status.tsx +45 -0
- package/contributions/build.action.ts +26 -0
- package/contributions/build.command.ts +27 -0
- package/contributions/build.header.tsx +37 -0
- package/contributions/build.menu.ts +31 -0
- package/contributions/build.service.ts +31 -0
- package/contributions/connection.status.tsx +43 -0
- package/contributions/coverage.service.ts +118 -0
- package/contributions/edit-mode-audio.service.ts +23 -0
- package/contributions/edit-mode-networking.service.ts +30 -0
- package/contributions/game-document.service.ts +25 -0
- package/contributions/game-eval.command.ts +210 -0
- package/contributions/game.layout.ts +19 -0
- package/contributions/gameplay.command.ts +255 -0
- package/contributions/generation.service.ts +96 -0
- package/contributions/generations.status.tsx +53 -0
- package/contributions/ingest.service.ts +80 -0
- package/contributions/instances.command.ts +75 -0
- package/contributions/navmesh.menu.ts +39 -0
- package/contributions/navmesh.service.ts +19 -0
- package/contributions/network.utility.tsx +17 -0
- package/contributions/play.command.ts +355 -0
- package/contributions/profiler.action.ts +16 -0
- package/contributions/profiler.menu.ts +22 -0
- package/contributions/profiler.utility.tsx +17 -0
- package/contributions/react/component-board.service.ts +21 -0
- package/contributions/react/design-time-mount.service.ts +60 -0
- package/contributions/react/pasteboard.action.ts +41 -0
- package/contributions/react/react-inspector.service.ts +85 -0
- package/contributions/react/story-documents.service.ts +44 -0
- package/contributions/scene-document.service.ts +32 -0
- package/contributions/state-watch.action.ts +17 -0
- package/contributions/state-watch.menu.ts +23 -0
- package/contributions/state-watch.utility.tsx +20 -0
- package/contributions/team-playtest.service.ts +124 -0
- package/contributions/three/camera-runtime.inspector.tsx +34 -0
- package/contributions/three/component-board.service.ts +24 -0
- package/contributions/three/component-verbs.command.ts +110 -0
- package/contributions/three/component-verbs.service.ts +92 -0
- package/contributions/three/constraints.inspector.tsx +34 -0
- package/contributions/three/model-asset-sections.service.ts +26 -0
- package/contributions/three/reflection-probe-capture.inspector.tsx +32 -0
- package/contributions/three/story-documents.service.ts +31 -0
- package/contributions/three/three-authoring.service.ts +66 -0
- package/contributions/transport.header.tsx +19 -0
- package/contributions/xstate-behavior.action.ts +42 -0
- package/contributions/xstate-behavior.document.tsx +73 -0
- package/contributions/xstate-behavior.inspector.tsx +28 -0
- package/contributions/xstate-behavior.menu.ts +23 -0
- package/package.json +144 -0
- package/src/asset-budget/AssetBudgetPanel.tsx +1172 -0
- package/src/asset-budget/asset-budget-model.ts +799 -0
- package/src/asset-budget/basis-encoder.ts +165 -0
- package/src/asset-budget/gltf-io.ts +154 -0
- package/src/asset-budget/gltf-optimize.ts +384 -0
- package/src/asset-budget/image-dims.ts +78 -0
- package/src/asset-budget/optimize-apply.ts +221 -0
- package/src/audio/AudioDebuggerPanel.tsx +457 -0
- package/src/audio/audio-debugger-model.ts +87 -0
- package/src/bridge/call.ts +60 -0
- package/src/bridge/dispatch.ts +459 -0
- package/src/bridge/live-frames.ts +25 -0
- package/src/bridge/screenshot.ts +316 -0
- package/src/build/BuildProfilesPanel.tsx +476 -0
- package/src/build/build-session.ts +247 -0
- package/src/build/format-bytes.ts +14 -0
- package/src/command-results.ts +36 -0
- package/src/coverage/live-authoring-surface.ts +30 -0
- package/src/coverage/live-project-verbs.ts +162 -0
- package/src/coverage/native-system-coverage.ts +143 -0
- package/src/coverage/root-coverage.ts +79 -0
- package/src/coverage/session-coverage.ts +193 -0
- package/src/design-system-stories/ApplicationChrome.stories.tsx +100 -0
- package/src/design-system-stories/InspectorNarrowBodies.stories.tsx +406 -0
- package/src/edit-mode/edit-mode-audio.ts +56 -0
- package/src/edit-mode/edit-mode-networking.ts +112 -0
- package/src/game-document/DevicePresetPicker.tsx +84 -0
- package/src/game-document/GameCaptureFrameButton.tsx +45 -0
- package/src/game-document/GameDocument.tsx +215 -0
- package/src/game-document/GamePanel.tsx +662 -0
- package/src/game-document/InstanceInspectorPicker.tsx +183 -0
- package/src/game-document/crowd-debug.ts +183 -0
- package/src/game-document/device-preview.ts +336 -0
- package/src/game-document/game-view-store.ts +107 -0
- package/src/game-document/physics-debug.ts +187 -0
- package/src/generation/GenerationActivity.tsx +421 -0
- package/src/generation/GenerationGallery.css +231 -0
- package/src/generation/generation-documents.tsx +338 -0
- package/src/generation/generation-jobs.ts +128 -0
- package/src/generation/generation-presentation.ts +257 -0
- package/src/host/adapter-reach.ts +445 -0
- package/src/host/adapter-runtime-bindings.ts +303 -0
- package/src/host/after-paint.ts +112 -0
- package/src/host/api/configurations.ts +66 -0
- package/src/host/authoring/babylon-authoring-adapter.ts +703 -0
- package/src/host/authoring/canvas-runtime-recognition.ts +50 -0
- package/src/host/authoring/contract-hierarchy-authoring.ts +144 -0
- package/src/host/authoring/contract-scenes-stories.ts +204 -0
- package/src/host/authoring/creation-site-related.ts +55 -0
- package/src/host/authoring/ephemeral-persistence.ts +29 -0
- package/src/host/authoring/gesture-persist.ts +84 -0
- package/src/host/authoring/ingest-data-writer.ts +232 -0
- package/src/host/authoring/ingest-source-persistence.ts +826 -0
- package/src/host/authoring/mount-isolated-pixi-screen.ts +250 -0
- package/src/host/authoring/mounted-authoring.ts +41 -0
- package/src/host/authoring/owned-pixi-ticker-listeners.ts +96 -0
- package/src/host/authoring/phaser-live-authoring-adapter.ts +265 -0
- package/src/host/authoring/pixi-authoring-adapter.ts +1554 -0
- package/src/host/authoring/pixi-creation-site-write-target.ts +60 -0
- package/src/host/authoring/pixi-isolation-assets.ts +25 -0
- package/src/host/authoring/pixi-live-write-target.ts +979 -0
- package/src/host/authoring/pixi-source-identity.ts +141 -0
- package/src/host/authoring/pixi-still-presentation.ts +71 -0
- package/src/host/authoring/pixi-structure-history.ts +237 -0
- package/src/host/authoring/pixi-transform-channels.ts +205 -0
- package/src/host/authoring/selection-remount-handoff.ts +23 -0
- package/src/host/authoring/source-persistence-backend.ts +373 -0
- package/src/host/authoring/source-refresh-revisions.ts +81 -0
- package/src/host/authoring/struct-write-pipe.ts +143 -0
- package/src/host/auto-frame-window.ts +89 -0
- package/src/host/binding-resolver.ts +393 -0
- package/src/host/browser-transpile.ts +631 -0
- package/src/host/canvas-entry-runtime.ts +95 -0
- package/src/host/components/CameraAuthoringOverlay.tsx +216 -0
- package/src/host/components/HeaderTelemetry.tsx +341 -0
- package/src/host/components/PixiIsolationSceneContent.tsx +280 -0
- package/src/host/components/ResolutionPicker.tsx +89 -0
- package/src/host/components/ThreeIsolationSceneContent.tsx +180 -0
- package/src/host/components/frame-debugger-model.ts +579 -0
- package/src/host/components/header-telemetry-model.ts +74 -0
- package/src/host/components/scene-document.tsx +447 -0
- package/src/host/components/utility-view-state.ts +87 -0
- package/src/host/components/world-root-stage-binding.tsx +133 -0
- package/src/host/components/world-root-stage.ts +1046 -0
- package/src/host/coverage/authoring-read-probe.ts +583 -0
- package/src/host/coverage/capability-coverage.ts +1587 -0
- package/src/host/coverage/coverage-accounting.ts +261 -0
- package/src/host/coverage/game-contract-seam-evidence.ts +82 -0
- package/src/host/coverage/project-verb-coverage.ts +148 -0
- package/src/host/coverage/system-adapter-coverage.ts +373 -0
- package/src/host/design-system-stories/StoryLayout.tsx +104 -0
- package/src/host/design-system-stories/fixtures/authoring.ts +247 -0
- package/src/host/design-system-stories/fixtures/editor-runtime.tsx +115 -0
- package/src/host/document-preview-three.ts +110 -0
- package/src/host/entry-adjudication.ts +89 -0
- package/src/host/game-location-guard.ts +150 -0
- package/src/host/game-module-access.ts +196 -0
- package/src/host/game-realm-page.ts +358 -0
- package/src/host/game-realm-reclaim.ts +55 -0
- package/src/host/game-realm-storage.ts +104 -0
- package/src/host/gameplay-export.ts +288 -0
- package/src/host/gameplay-recording.ts +717 -0
- package/src/host/gated-globals.ts +1511 -0
- package/src/host/history/json-history-resource.ts +254 -0
- package/src/host/ingest/registry.ts +261 -0
- package/src/host/instance-extract-actions.ts +120 -0
- package/src/host/instance-fork-actions.ts +120 -0
- package/src/host/play-control-hook.ts +26 -0
- package/src/host/playwright-shim.ts +479 -0
- package/src/host/projection/dom.ts +295 -0
- package/src/host/projection/pixi.ts +288 -0
- package/src/host/r3f-entry-runtime.ts +77 -0
- package/src/host/react-mount-runtime.ts +162 -0
- package/src/host/realm-services.ts +148 -0
- package/src/host/recording-preview.ts +106 -0
- package/src/host/roots/module-root.ts +203 -0
- package/src/host/roots/react-root.ts +181 -0
- package/src/host/same-realm-loop-gate.ts +544 -0
- package/src/host/scene-view-drawability.ts +69 -0
- package/src/host/sdk/tools.ts +31 -0
- package/src/host/served-bundle-runtime-modules.ts +331 -0
- package/src/host/server-log-bridge.ts +60 -0
- package/src/host/staged-projects.ts +24 -0
- package/src/host/stories/mounted-story-viewport-source.ts +64 -0
- package/src/host/stories/story-arg-descriptors.ts +50 -0
- package/src/host/stories/story-media-presence.ts +152 -0
- package/src/host/surface-content.ts +87 -0
- package/src/host/take-named-export.ts +23 -0
- package/src/host/three-ingest-runtime.ts +76 -0
- package/src/host/types-fastnoise-lite.d.ts +7 -0
- package/src/host/types-mikktspace.d.ts +20 -0
- package/src/host/types-troika-three-text.d.ts +7 -0
- package/src/host/use-active-performance-source.ts +53 -0
- package/src/host/viewport-pose-memory.ts +48 -0
- package/src/host/viewport-root-presentation.ts +40 -0
- package/src/ingest/active-ingest.ts +251 -0
- package/src/ingest/active-scene-navigation.ts +43 -0
- package/src/ingest/authoring/ingest-dom-surface-authoring.ts +191 -0
- package/src/ingest/authoring/ingest-root-adapter.ts +897 -0
- package/src/ingest/capture-wait-report.ts +122 -0
- package/src/ingest/deferred-ingest-play.ts +216 -0
- package/src/ingest/deferred-ingest-session.ts +23 -0
- package/src/ingest/discovery-public-ingest.ts +242 -0
- package/src/ingest/dom-stub-mark.ts +7 -0
- package/src/ingest/entry-load.ts +56 -0
- package/src/ingest/game-contract-realm.ts +34 -0
- package/src/ingest/game-pointer-lock.ts +89 -0
- package/src/ingest/held-scene-repaint.ts +73 -0
- package/src/ingest/host-surface-box.ts +174 -0
- package/src/ingest/ingest-boot-viewport.ts +54 -0
- package/src/ingest/ingest-canvas-scene-document.tsx +177 -0
- package/src/ingest/ingest-canvas-scene.ts +50 -0
- package/src/ingest/ingest-evidence-hook.ts +131 -0
- package/src/ingest/ingest-frame-snapshot.ts +183 -0
- package/src/ingest/ingest-play-commands.ts +134 -0
- package/src/ingest/ingest-play-control.ts +299 -0
- package/src/ingest/ingest-render-debug.ts +320 -0
- package/src/ingest/ingest-siblings.ts +487 -0
- package/src/ingest/ingest-status.ts +62 -0
- package/src/ingest/live-ingest-facet.ts +46 -0
- package/src/ingest/module-mode.ts +229 -0
- package/src/ingest/mount-canvas-ingest-root.ts +899 -0
- package/src/ingest/mount-coverage.ts +296 -0
- package/src/ingest/mount-dom-ingest-root.ts +282 -0
- package/src/ingest/mount-ingest-root.ts +744 -0
- package/src/ingest/mount-three-ingest-root.ts +366 -0
- package/src/ingest/resolve-canvas.ts +47 -0
- package/src/ingest/resolve-three.ts +123 -0
- package/src/ingest/served-bundle.ts +109 -0
- package/src/ingest/served-html-boot.ts +292 -0
- package/src/ingest/surface-canvas.ts +84 -0
- package/src/ingest/surface-dom.ts +84 -0
- package/src/ingest/surface-three.ts +128 -0
- package/src/ingest/types.ts +76 -0
- package/src/ingest/unmount-ingest-root.ts +224 -0
- package/src/navmesh/navmesh-actions.ts +27 -0
- package/src/navmesh/navmesh-handler.ts +237 -0
- package/src/navmesh/navmesh-workflow-store.ts +78 -0
- package/src/network/NetworkInspectorPanel.tsx +644 -0
- package/src/network/network-inspector-model.ts +225 -0
- package/src/play/play-boot-stall.ts +118 -0
- package/src/play/play-log-events.ts +26 -0
- package/src/play/play-mode.ts +2553 -0
- package/src/play/play-recording.ts +335 -0
- package/src/play/react-play-live-authoring.ts +165 -0
- package/src/play-bar/PlayBar.tsx +488 -0
- package/src/play-bar/PlayerCountPicker.tsx +100 -0
- package/src/profiler/FrameDebuggerPanel.tsx +458 -0
- package/src/profiler/PerformancePanel.tsx +1068 -0
- package/src/profiler/ProfilerPanel.tsx +53 -0
- package/src/profiler/frame-debugger-store.ts +97 -0
- package/src/profiler/main-thread-busy.ts +90 -0
- package/src/react/design-time-react-mount.ts +782 -0
- package/src/react/dom-authoring-adapter.ts +764 -0
- package/src/react/pasteboard-materialize.ts +154 -0
- package/src/react/react-inspector-section.tsx +2496 -0
- package/src/react/react-world-authoring-adapter.ts +3795 -0
- package/src/react/story-documents/story-args-section.ts +19 -0
- package/src/react/story-documents/story-documents.tsx +1380 -0
- package/src/react/story-paint-bounds.ts +94 -0
- package/src/react/ui-board-document.tsx +101 -0
- package/src/react/ui-board-title.ts +9 -0
- package/src/react/ui-component-board.ts +72 -0
- package/src/services/audio-pose-guard.ts +81 -0
- package/src/services/game-audio-unlock.ts +48 -0
- package/src/state-watch/StateWatchPanel.tsx +535 -0
- package/src/three/authoring/camera-runtime-inspector-section.tsx +135 -0
- package/src/three/authoring/constraint-inspector-section.tsx +189 -0
- package/src/three/authoring/design-time-renderer.ts +189 -0
- package/src/three/authoring/model-asset-inspector-section.css +41 -0
- package/src/three/authoring/model-asset-inspector-section.tsx +869 -0
- package/src/three/authoring/oid-source-persistence.ts +557 -0
- package/src/three/authoring/r3f-design-session.ts +1174 -0
- package/src/three/authoring/r3f-source-authoring-adapter.ts +5949 -0
- package/src/three/authoring/reflection-probe-inspector-section.tsx +76 -0
- package/src/three/authoring/spatial-audio-handles.ts +215 -0
- package/src/three/authoring/spatial-collider-handles.ts +229 -0
- package/src/three/authoring/spatial-joint-handles.ts +114 -0
- package/src/three/authoring/spatial-light-handles.ts +178 -0
- package/src/three/authoring/spatial-lod-handles.ts +93 -0
- package/src/three/authoring/spatial-particle-handles.ts +368 -0
- package/src/three/authoring/three-authoring-adapter.ts +1953 -0
- package/src/three/authoring/three-scene-identity.ts +19 -0
- package/src/three/authoring/three-spatial-handles.ts +161 -0
- package/src/three/authoring/typed-three-inspector.ts +528 -0
- package/src/three/component-verbs/extract-menu.ts +71 -0
- package/src/three/component-verbs/fork-menu.ts +78 -0
- package/src/three/component-verbs/internals-menu.ts +91 -0
- package/src/three/story-documents/three-story-documents.tsx +607 -0
- package/src/three/three-board/ThreeBoardDocument.tsx +888 -0
- package/src/three/three-board/board-framing.ts +412 -0
- package/src/three/three-board/board-layout.ts +401 -0
- package/src/three/three-board/board-scene.ts +901 -0
- package/src/three/three-board/three-component-board.ts +62 -0
- package/src/xstate/XStateBehaviorSection.tsx +130 -0
- package/src/xstate/XStateMachineInspector.tsx +566 -0
- package/src/xstate/character-animation-machine.fixture.ts +74 -0
- package/src/xstate/live-behaviors.ts +106 -0
- package/src/xstate/use-live-actor-state.ts +44 -0
- package/src/xstate/xstate-graph.ts +235 -0
- package/src/xstate/xstate-layout.ts +76 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two DOM-surface identities — `dom` (first-party React UI) and
|
|
3
|
+
* `ingest-react` (a vendored React game reached through a host shim).
|
|
4
|
+
*
|
|
5
|
+
* They mount through the SAME react host stack: the same realm entry load, the
|
|
6
|
+
* same default-export-component validation, the same `<WorldProvider>` wrap,
|
|
7
|
+
* the same `createRoot(...).render(...)` body. Only the identity label
|
|
8
|
+
* differs, so a failure is attributed to the right one. "One stacking model,
|
|
9
|
+
* no special case": the automatic `<WorldProvider>` wrap is context-only and
|
|
10
|
+
* harmless to a foreign tree.
|
|
11
|
+
*
|
|
12
|
+
* An ingest-react world's `entry` is NOT a first-party component — it is a
|
|
13
|
+
* HOST-SHIM module living beside the ingested game's manifest, importing the
|
|
14
|
+
* vendored game's own `App`/store and default-exporting the composed
|
|
15
|
+
* component. Neither resolver has any knowledge of the vendored game's own
|
|
16
|
+
* standalone entry point (its raw `ReactDOM.render` call): only the manifest's
|
|
17
|
+
* declared `entry` is ever imported, so that entry point is never reached.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type { MountedReactGame, ReactRootAdapter } from '@volter/game-runtime/runtime/create-runtime';
|
|
21
|
+
import type { Game } from '@volter/game-runtime/runtime/game';
|
|
22
|
+
import type { GameDomHostContext } from '@volter/game-runtime/runtime/host-context';
|
|
23
|
+
import type { ResolvedAdapterRoot } from '@volter/editor-project/manifest/load';
|
|
24
|
+
import type { ComponentType } from 'react';
|
|
25
|
+
import { resolveWorldProviderForProject } from '../react-mount-runtime';
|
|
26
|
+
import type { RealmServices } from '../realm-services';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The shape a react world's `entry` module must satisfy: default-export a
|
|
30
|
+
* React component. Validated loudly at import time — a project whose entry
|
|
31
|
+
* exports the wrong shape gets a named error naming the world and the export
|
|
32
|
+
* it actually found, not a cryptic "X is not a function" deep inside
|
|
33
|
+
* `createRoot`/`render`.
|
|
34
|
+
*/
|
|
35
|
+
function loadReactEntryComponent(
|
|
36
|
+
world: ResolvedAdapterRoot,
|
|
37
|
+
mod: { default?: unknown },
|
|
38
|
+
identityLabel: 'dom' | 'ingest-react',
|
|
39
|
+
): ComponentType {
|
|
40
|
+
if (typeof mod.default !== 'function') {
|
|
41
|
+
throw new Error(
|
|
42
|
+
`resolveRootBinding: world "${world.id}" (${identityLabel}) entry module does not ` +
|
|
43
|
+
`default-export a component — got ${typeof mod.default}. A react world's \`entry\` must ` +
|
|
44
|
+
'default-export a React component.',
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
return mod.default as ComponentType;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* `DomHostContext.game` is a typed, guaranteed field on the native multi-root
|
|
52
|
+
* mount path. The loud check here stays for the one host that legitimately
|
|
53
|
+
* carries none — a `dom` sibling mounted BESIDE an ingest root
|
|
54
|
+
* (`ingest-siblings.ts`) has no native `Game`, and that host renders the entry
|
|
55
|
+
* component BARE rather than fabricating an empty Game into `<WorldProvider>`.
|
|
56
|
+
* A hand-rolled host that skipped the engine's mount path must fail loudly
|
|
57
|
+
* here, never lie an `undefined` Game into the provider.
|
|
58
|
+
*/
|
|
59
|
+
function requireHostGame(world: ResolvedAdapterRoot, host: GameDomHostContext, label: string): Game {
|
|
60
|
+
const game = host.game;
|
|
61
|
+
if (!game) {
|
|
62
|
+
throw new Error(
|
|
63
|
+
`resolveRootBinding: world "${world.id}" (${label}) mount() received a DomHostContext ` +
|
|
64
|
+
'with no `game` — WorldProvider needs a live Game at mount time and this host did not ' +
|
|
65
|
+
'carry one.',
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
return game;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* The shared entry-loading step, exported so a composite's `dom` SIBLING mount
|
|
73
|
+
* (`ingest-siblings.ts`) reuses the EXACT SAME `entry`-required check and
|
|
74
|
+
* component-shape validation without duplicating any of it. The sibling then
|
|
75
|
+
* renders the returned component bare; {@link resolveDomAdapter} below wraps
|
|
76
|
+
* it in `<WorldProvider>`.
|
|
77
|
+
*/
|
|
78
|
+
export async function resolveReactAdapterRootComponent(
|
|
79
|
+
world: ResolvedAdapterRoot,
|
|
80
|
+
realm: RealmServices,
|
|
81
|
+
onEntryModule?: (module: Record<string, unknown>) => void,
|
|
82
|
+
): Promise<ComponentType> {
|
|
83
|
+
if (world.entry === undefined) {
|
|
84
|
+
// Unreachable in practice: `load.ts`'s entry rules require `entry` for
|
|
85
|
+
// every built-in adapter world at manifest-load time. Still loud.
|
|
86
|
+
throw new Error(
|
|
87
|
+
`resolveRootBinding: world "${world.id}" is a dom root with no \`entry\` — this should ` +
|
|
88
|
+
'have been rejected by manifest validation.',
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
const mod = await realm.loadEntryModule(world.entry, world.id, 'dom');
|
|
92
|
+
onEntryModule?.(mod);
|
|
93
|
+
return loadReactEntryComponent(world, mod, 'dom');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Build the `mount` half both identities share. */
|
|
97
|
+
function reactMount(
|
|
98
|
+
world: ResolvedAdapterRoot,
|
|
99
|
+
label: 'dom' | 'ingest-react',
|
|
100
|
+
Entry: ComponentType,
|
|
101
|
+
WorldProvider: ComponentType<{ game: Game; children?: unknown }>,
|
|
102
|
+
realm: RealmServices,
|
|
103
|
+
/** Commit the initial DOM synchronously. The play authoring adapter is
|
|
104
|
+
* installed immediately after `mount()` resolves, so a first-party root
|
|
105
|
+
* flushes to give its first hierarchy snapshot the OID tree instead of an
|
|
106
|
+
* empty container. */
|
|
107
|
+
flushInitialRender: boolean,
|
|
108
|
+
): ReactRootAdapter {
|
|
109
|
+
return {
|
|
110
|
+
id: world.id,
|
|
111
|
+
async mount(host: GameDomHostContext): Promise<MountedReactGame> {
|
|
112
|
+
const game = requireHostGame(world, host, label);
|
|
113
|
+
// The runtime comes from the realm — the PROJECT's own react under the
|
|
114
|
+
// packaged runtime, the editor's static imports otherwise — so this
|
|
115
|
+
// mount always shares ONE react instance with the entry component's own
|
|
116
|
+
// hooks.
|
|
117
|
+
const runtime = await realm.reactDomRuntime();
|
|
118
|
+
const root = runtime.createRoot(host.container);
|
|
119
|
+
const render = () => {
|
|
120
|
+
root.render(
|
|
121
|
+
runtime.createElement(WorldProvider, { game, children: runtime.createElement(Entry) }),
|
|
122
|
+
);
|
|
123
|
+
};
|
|
124
|
+
if (flushInitialRender) runtime.flushSync(render);
|
|
125
|
+
else render();
|
|
126
|
+
return {
|
|
127
|
+
kind: 'dom',
|
|
128
|
+
container: host.container,
|
|
129
|
+
drivesOwnLoop: false,
|
|
130
|
+
dispose(): void {
|
|
131
|
+
root.unmount();
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** A first-party `dom` root. */
|
|
139
|
+
export async function resolveDomAdapter(
|
|
140
|
+
world: ResolvedAdapterRoot,
|
|
141
|
+
realm: RealmServices,
|
|
142
|
+
onEntryModule?: ((module: Record<string, unknown>) => void) | undefined,
|
|
143
|
+
): Promise<ReactRootAdapter> {
|
|
144
|
+
const Entry = await resolveReactAdapterRootComponent(world, realm, onEntryModule);
|
|
145
|
+
const WorldProvider = await resolveWorldProviderForProject();
|
|
146
|
+
return reactMount(world, 'dom', Entry, WorldProvider, realm, true);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* An `ingest-react` root. `entry` is REQUIRED — there is no scene-or-entry
|
|
151
|
+
* choice: an ingest-react world IS its host shim.
|
|
152
|
+
*
|
|
153
|
+
* There is no `writeBackend` for an ingest-react world and this function
|
|
154
|
+
* returns `{ id, mount }` only. Play mode enforces the write boundary
|
|
155
|
+
* explicitly, by installing a read-only boundary authoring adapter whenever
|
|
156
|
+
* the declaration identity is `ingest-react`; universal hierarchy membership
|
|
157
|
+
* does not imply write authority over vendored source.
|
|
158
|
+
*/
|
|
159
|
+
export async function resolveIngestReactAdapter(
|
|
160
|
+
world: ResolvedAdapterRoot,
|
|
161
|
+
realm: RealmServices,
|
|
162
|
+
): Promise<{ readonly adapter: ReactRootAdapter; readonly module: Record<string, unknown> }> {
|
|
163
|
+
const { adapter } = world;
|
|
164
|
+
if (adapter.type !== 'ingest') {
|
|
165
|
+
throw new Error(`resolveRootBinding: world "${world.id}" is not an { ingest } world.`);
|
|
166
|
+
}
|
|
167
|
+
if (world.entry === undefined) {
|
|
168
|
+
throw new Error(
|
|
169
|
+
`resolveRootBinding: world "${world.id}" (ingest-react) has no \`entry\` — an ingested ` +
|
|
170
|
+
"react world's `entry` MUST point at a host-shim module that imports the vendored " +
|
|
171
|
+
"game's own component and default-exports it.",
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
const mod = await realm.loadEntryModule(world.entry, world.id, 'dom');
|
|
175
|
+
const Entry = loadReactEntryComponent(world, mod, 'ingest-react');
|
|
176
|
+
const WorldProvider = await resolveWorldProviderForProject();
|
|
177
|
+
return {
|
|
178
|
+
adapter: reactMount(world, 'ingest-react', Entry, WorldProvider, realm, false),
|
|
179
|
+
module: mod,
|
|
180
|
+
};
|
|
181
|
+
}
|