@voltro/plugin-rooms 0.0.0-stage → 0.87.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 +24329 -0
- package/LICENSE +61 -0
- package/README.md +9204 -2
- package/SECURITY.md +56 -0
- package/THIRD-PARTY-NOTICES.md +11322 -0
- package/dist/actor.js +1474 -0
- package/dist/apiBinding.js +678 -0
- package/dist/apiRegistryBinding.js +399 -0
- package/dist/apiReservations.js +433 -0
- package/dist/baselines.js +73 -0
- package/dist/bots.d.ts +1485 -0
- package/dist/bots.js +563 -0
- package/dist/catalog.js +80 -0
- package/dist/checkpointJson.js +24 -0
- package/dist/checkpointStore.js +386 -0
- package/dist/client.js +56 -0
- package/dist/clockSync.js +51 -0
- package/dist/collision.js +156 -0
- package/dist/commandDelivery.js +101 -0
- package/dist/commandRecord.js +11 -0
- package/dist/commandWithdrawal.js +183 -0
- package/dist/connection.js +497 -0
- package/dist/controlCarrier.js +375 -0
- package/dist/controlRegistry.js +79 -0
- package/dist/controlTarget.js +45 -0
- package/dist/controlTransport.js +574 -0
- package/dist/developmentBinding.js +113 -0
- package/dist/directory.js +323 -0
- package/dist/directoryProjection.js +117 -0
- package/dist/errors.d.ts +125 -0
- package/dist/errors.js +53 -0
- package/dist/fixed.d.ts +284 -0
- package/dist/fixed.js +10 -0
- package/dist/fixed32.js +134 -0
- package/dist/fixedCollision.js +60 -0
- package/dist/fixedCollision32.js +109 -0
- package/dist/fixedMath.js +56 -0
- package/dist/fixedRaw.js +11 -0
- package/dist/fixedSlabs.js +34 -0
- package/dist/fixedTrig.js +48 -0
- package/dist/fixedTrig32.js +38 -0
- package/dist/fixedVectors.js +113 -0
- package/dist/fixedVectors32.js +95 -0
- package/dist/fixedWide.js +50 -0
- package/dist/fixedWords.js +46 -0
- package/dist/gateway.js +57 -0
- package/dist/geometry-retention-app/rooms.geometryJournalRetention.workflow.server.tsx +4 -0
- package/dist/geometry-retention-app/rooms.geometryJournalRetention.workflow.tsx +14 -0
- package/dist/geometry-worker/worker.d.mts +2 -0
- package/dist/geometry-worker/worker.mjs +50 -0
- package/dist/geometry.d.ts +2249 -0
- package/dist/geometry.js +40 -0
- package/dist/geometryActivation.js +82 -0
- package/dist/geometryActorInventory.js +108 -0
- package/dist/geometryAdminClient.js +87 -0
- package/dist/geometryAdminData.js +32 -0
- package/dist/geometryAdminFixtures.js +50 -0
- package/dist/geometryAdminPorts.js +5 -0
- package/dist/geometryAdminRpc.js +58 -0
- package/dist/geometryAdminRpcRoutes.js +49 -0
- package/dist/geometryAdminSchemas.js +39 -0
- package/dist/geometryAdministration.js +190 -0
- package/dist/geometryAdministrationPorts.js +5 -0
- package/dist/geometryApiBinding.js +165 -0
- package/dist/geometryAppStorage.js +58 -0
- package/dist/geometryArtifacts.js +198 -0
- package/dist/geometryAssetBundle.js +117 -0
- package/dist/geometryAssetClient.js +25 -0
- package/dist/geometryAssetData.js +106 -0
- package/dist/geometryAssetHttp.js +123 -0
- package/dist/geometryAssetPorts.js +5 -0
- package/dist/geometryAssetRpc.js +30 -0
- package/dist/geometryAssetRpcRoutes.js +40 -0
- package/dist/geometryAssetStorageGrant.js +103 -0
- package/dist/geometryBoxOverlap.js +110 -0
- package/dist/geometryCatalogueDigest.js +111 -0
- package/dist/geometryCellCoverage.js +85 -0
- package/dist/geometryCellLoader.js +28 -0
- package/dist/geometryChannel.js +134 -0
- package/dist/geometryChunkHttp.js +54 -0
- package/dist/geometryChunkLeases.js +22 -0
- package/dist/geometryClient.d.ts +1429 -0
- package/dist/geometryClient.js +149 -0
- package/dist/geometryClientChunks.js +330 -0
- package/dist/geometryClientDelta.js +25 -0
- package/dist/geometryClientHttp.js +37 -0
- package/dist/geometryClientInterest.js +109 -0
- package/dist/geometryClientStatic.js +34 -0
- package/dist/geometryCms.d.ts +763 -0
- package/dist/geometryCms.js +217 -0
- package/dist/geometryCommitCoordinator.js +241 -0
- package/dist/geometryCompactionFixture.js +84 -0
- package/dist/geometryCompactionStrategies.js +38 -0
- package/dist/geometryConnectionClient.js +23 -0
- package/dist/geometryDerivationFixtures.js +141 -0
- package/dist/geometryDerivationStrategies.js +27 -0
- package/dist/geometryDigest.js +13 -0
- package/dist/geometryEditChannel.js +70 -0
- package/dist/geometryEditIngress.js +263 -0
- package/dist/geometryEdits.js +366 -0
- package/dist/geometryEnvelope.js +41 -0
- package/dist/geometryGridRaycast.js +92 -0
- package/dist/geometryGridSweep.js +92 -0
- package/dist/geometryHeightfield.js +166 -0
- package/dist/geometryHeightfieldRaycast.js +74 -0
- package/dist/geometryHeightfieldSweep.js +85 -0
- package/dist/geometryHeightfieldVolume.js +45 -0
- package/dist/geometryHost.js +322 -0
- package/dist/geometryHostDirectory.js +207 -0
- package/dist/geometryHostMutations.js +137 -0
- package/dist/geometryHostStreams.js +124 -0
- package/dist/geometryHttpBody.js +76 -0
- package/dist/geometryHttpRoutes.js +112 -0
- package/dist/geometryImportGltf.js +300 -0
- package/dist/geometryImportLdtk.js +54 -0
- package/dist/geometryImportPng.js +144 -0
- package/dist/geometryImportPublication.js +67 -0
- package/dist/geometryImportTiled.js +39 -0
- package/dist/geometryImportTiles.js +136 -0
- package/dist/geometryImportVox.js +130 -0
- package/dist/geometryImportedSource.js +101 -0
- package/dist/geometryInspectEndpoint.js +248 -0
- package/dist/geometryInspection.js +92 -0
- package/dist/geometryInstall.js +121 -0
- package/dist/geometryJournalArchiveData.js +21 -0
- package/dist/geometryJournalArchiveIndex.js +330 -0
- package/dist/geometryJournalArchiveTable.js +21 -0
- package/dist/geometryJournalCompaction.js +100 -0
- package/dist/geometryJournalPatch.js +47 -0
- package/dist/geometryJournalRetention.js +112 -0
- package/dist/geometryJournalRetentionSchemas.js +36 -0
- package/dist/geometryJournalRetentionSweep.js +112 -0
- package/dist/geometryJournalRetentionWorkflow.js +28 -0
- package/dist/geometryJournalRetentionWorkflowData.js +31 -0
- package/dist/geometryJournalStorage.js +148 -0
- package/dist/geometryLoader.js +118 -0
- package/dist/geometryManifest.js +113 -0
- package/dist/geometryManifestChannel.js +93 -0
- package/dist/geometryManifestClient.js +122 -0
- package/dist/geometryManifestData.js +49 -0
- package/dist/geometryManifestPorts.js +5 -0
- package/dist/geometryManifestPublication.js +109 -0
- package/dist/geometryManifestSource.js +68 -0
- package/dist/geometryMigrationJournal.js +14 -0
- package/dist/geometryMigrationStrategies.js +7 -0
- package/dist/geometryMigrations.js +323 -0
- package/dist/geometryNativeMetadata.js +52 -0
- package/dist/geometryPatch.js +170 -0
- package/dist/geometryPersistence.js +449 -0
- package/dist/geometryPersistenceCapture.js +69 -0
- package/dist/geometryPersistenceData.js +140 -0
- package/dist/geometryPersistencePorts.js +5 -0
- package/dist/geometryPlayerAdmission.js +34 -0
- package/dist/geometryPlayerEditOwner.js +265 -0
- package/dist/geometryPlayerEdits.js +49 -0
- package/dist/geometryPrepared.js +188 -0
- package/dist/geometryPrivacyFence.js +24 -0
- package/dist/geometryProceduralPublication.js +91 -0
- package/dist/geometryProceduralWorker.js +164 -0
- package/dist/geometryPublication.js +110 -0
- package/dist/geometryRayAlgebra.js +116 -0
- package/dist/geometryReadClient.js +157 -0
- package/dist/geometryReadPorts.js +5 -0
- package/dist/geometryReadRpc.js +27 -0
- package/dist/geometryReadRpcRoutes.js +47 -0
- package/dist/geometryReliablePublication.js +82 -0
- package/dist/geometryReloadPorts.js +46 -0
- package/dist/geometryReloadSource.js +278 -0
- package/dist/geometryRenderCache.js +165 -0
- package/dist/geometryRenderLod.js +102 -0
- package/dist/geometryRollback.js +125 -0
- package/dist/geometryRollbackCoordinator.js +203 -0
- package/dist/geometryRollbackPorts.js +46 -0
- package/dist/geometryRollbackSource.js +209 -0
- package/dist/geometryRollbackStore.js +198 -0
- package/dist/geometrySchemas.js +27 -0
- package/dist/geometryServer.d.ts +2766 -0
- package/dist/geometryServer.js +62 -0
- package/dist/geometryShapeRaycast.js +111 -0
- package/dist/geometryShapeSegments.js +34 -0
- package/dist/geometryShapes.js +223 -0
- package/dist/geometrySnapshot.js +76 -0
- package/dist/geometrySnapshotChannel.js +160 -0
- package/dist/geometrySnapshotClient.js +159 -0
- package/dist/geometrySnapshotPreparation.js +76 -0
- package/dist/geometrySnapshotServer.js +191 -0
- package/dist/geometrySqlOwner.js +21 -0
- package/dist/geometryStorage.js +127 -0
- package/dist/geometryStorageGrant.js +69 -0
- package/dist/geometryStorageIdentity.js +9 -0
- package/dist/geometryTileArtifact.js +10 -0
- package/dist/geometryTileCodec.js +194 -0
- package/dist/geometryTileCollision.js +96 -0
- package/dist/geometryTileNavigation.js +128 -0
- package/dist/geometryTileView.js +35 -0
- package/dist/geometryVersionActivation.js +114 -0
- package/dist/geometryVersionClient.js +238 -0
- package/dist/geometryVersionCompare.js +40 -0
- package/dist/geometryVersionMigration.js +106 -0
- package/dist/geometryVoxel.js +253 -0
- package/dist/geometryWorldEntitySubject.js +32 -0
- package/dist/geometryWorldExtent.js +12 -0
- package/dist/geometryWorldMetadata.js +38 -0
- package/dist/geometryWorldStrategyFixtures.js +127 -0
- package/dist/geometryWorldView.js +307 -0
- package/dist/host.js +128 -0
- package/dist/hostBinding.js +277 -0
- package/dist/hostCellObservation.js +114 -0
- package/dist/hostClientCapacity.js +90 -0
- package/dist/hostCommandScope.js +64 -0
- package/dist/hostController.js +3094 -0
- package/dist/hostDeployment.js +65 -0
- package/dist/hostDrain.js +152 -0
- package/dist/hostDrainPorts.js +5 -0
- package/dist/hostDriver.js +179 -0
- package/dist/hostLane.js +288 -0
- package/dist/hostListener.js +79 -0
- package/dist/hostListenerBinding.js +19 -0
- package/dist/hostLoopObservation.js +90 -0
- package/dist/hostMetrics.js +56 -0
- package/dist/hostRegistryBinding.js +418 -0
- package/dist/hostSelection.js +16 -0
- package/dist/hostShutdown.js +47 -0
- package/dist/hostTurnObservation.js +53 -0
- package/dist/identities.js +4 -0
- package/dist/index.d.ts +8632 -0
- package/dist/index.js +232 -0
- package/dist/inputReceipts.js +63 -0
- package/dist/inputRedundancy.js +55 -0
- package/dist/inspect.js +238 -0
- package/dist/lockstep.d.ts +436 -0
- package/dist/lockstep.js +382 -0
- package/dist/lockstepAdmission.js +262 -0
- package/dist/lockstepAdmissionCodec.js +94 -0
- package/dist/lockstepAdmissionPorts.js +5 -0
- package/dist/lockstepClientSession.js +578 -0
- package/dist/lockstepDefinition.js +148 -0
- package/dist/lockstepHostLoop.js +243 -0
- package/dist/lockstepInitialAdmission.js +67 -0
- package/dist/lockstepInitialStrategyFixtures.js +45 -0
- package/dist/lockstepJournal.js +395 -0
- package/dist/lockstepJournalCodec.js +254 -0
- package/dist/lockstepJournalPorts.js +5 -0
- package/dist/lockstepJournalRebuild.js +208 -0
- package/dist/lockstepJournalRows.js +57 -0
- package/dist/lockstepMembers.js +131 -0
- package/dist/lockstepMessages.js +47 -0
- package/dist/lockstepOwnedRoom.js +764 -0
- package/dist/lockstepPolicies.js +84 -0
- package/dist/lockstepReact.js +47 -0
- package/dist/lockstepRecoveryTruth.js +121 -0
- package/dist/lockstepRosterConfig.js +32 -0
- package/dist/lockstepSeed.js +12 -0
- package/dist/lockstepSeedFixture.js +20 -0
- package/dist/lockstepServer.d.ts +3897 -0
- package/dist/lockstepServer.js +325 -0
- package/dist/lockstepServerConfig.js +101 -0
- package/dist/lockstepServerRoles.js +403 -0
- package/dist/lockstepServerStrategyFixtures.js +33 -0
- package/dist/lockstepStrategies.js +6 -0
- package/dist/lockstepStrategyFixtures.js +137 -0
- package/dist/lockstepTerminal.js +90 -0
- package/dist/lockstepTerminalPorts.js +5 -0
- package/dist/lockstepTransport.js +773 -0
- package/dist/lockstepTransportConfig.js +32 -0
- package/dist/lockstepWireRoster.js +34 -0
- package/dist/matchRoomProvider.js +32 -0
- package/dist/matchRooms.js +19 -0
- package/dist/membershipObserver.js +47 -0
- package/dist/moderation.js +98 -0
- package/dist/movementSpecials.js +104 -0
- package/dist/ownership.js +17 -0
- package/dist/ownershipWithdrawal.js +18 -0
- package/dist/pcg32.js +96 -0
- package/dist/ports.d.ts +1241 -0
- package/dist/ports.js +11 -0
- package/dist/quaternion.js +70 -0
- package/dist/react.d.ts +406 -0
- package/dist/react.js +109 -0
- package/dist/reaper-app/rooms.reaper.workflow.server.tsx +5 -0
- package/dist/reaper-app/rooms.reaper.workflow.tsx +13 -0
- package/dist/reaper.js +243 -0
- package/dist/reaperSchemas.js +42 -0
- package/dist/reaperWorkflow.js +70 -0
- package/dist/recovery.js +189 -0
- package/dist/recoverySeats.js +26 -0
- package/dist/replay.d.ts +273 -0
- package/dist/replay.js +485 -0
- package/dist/replayPorts.js +5 -0
- package/dist/replayRecording.js +67 -0
- package/dist/replaySchema.js +157 -0
- package/dist/replayStorage.d.ts +149 -0
- package/dist/replayStorage.js +485 -0
- package/dist/reservationBatch.js +422 -0
- package/dist/reservationSchemas.js +17 -0
- package/dist/reservations.js +259 -0
- package/dist/reservePort.js +69 -0
- package/dist/resolvedOptions.js +4 -0
- package/dist/room.d.ts +1006 -0
- package/dist/room.js +284 -0
- package/dist/roomAccessSweep.js +95 -0
- package/dist/roomAppCommandControl.js +59 -0
- package/dist/roomAuthoringStrategy.js +17 -0
- package/dist/roomErasure.js +198 -0
- package/dist/roomPoolRuntimeDefaults.js +24 -0
- package/dist/roomPoolSelection.js +19 -0
- package/dist/roomPoolTopology.js +212 -0
- package/dist/rpc.d.ts +551 -0
- package/dist/rpc.js +112 -0
- package/dist/rpcClient.js +152 -0
- package/dist/rpcRoutes.js +28 -0
- package/dist/runtime.js +1123 -0
- package/dist/schemaHistory.js +98 -0
- package/dist/seatStore.js +151 -0
- package/dist/seatStrategyFixtures.js +52 -0
- package/dist/seatSubject.js +32 -0
- package/dist/seats.js +130 -0
- package/dist/serverSession.js +811 -0
- package/dist/serverSessionConfig.js +43 -0
- package/dist/sessionAdmission.js +53 -0
- package/dist/sidecarAdmission.js +103 -0
- package/dist/sidecarConfig.js +116 -0
- package/dist/sidecarConfigPublication.js +64 -0
- package/dist/sidecarHostListener.js +208 -0
- package/dist/sidecarIpc.js +205 -0
- package/dist/sidecarPeer.js +310 -0
- package/dist/sidecarProcessPort.js +28 -0
- package/dist/sidecarRuntime.js +168 -0
- package/dist/sidecarSelection.js +142 -0
- package/dist/sidecarWire.js +178 -0
- package/dist/sidecarWrites.js +163 -0
- package/dist/simulation.d.ts +391 -0
- package/dist/simulation.js +282 -0
- package/dist/simulationAuthoring.js +29 -0
- package/dist/simulationBytes.js +27 -0
- package/dist/simulationConformance.js +305 -0
- package/dist/simulationInputHistoryCapture.js +35 -0
- package/dist/simulationInputHistoryWire.js +193 -0
- package/dist/simulationOptionsWire.js +78 -0
- package/dist/simulationRecoveryWire.js +134 -0
- package/dist/simulationReplay.js +127 -0
- package/dist/simulationSnapshotWire.js +112 -0
- package/dist/simulationState.js +178 -0
- package/dist/snapshotBlob.js +126 -0
- package/dist/snapshotBlobCleanup.js +93 -0
- package/dist/snapshotBlobIndex.js +38 -0
- package/dist/snapshotBudget.js +80 -0
- package/dist/snapshotChain.js +185 -0
- package/dist/snapshotErasure.js +172 -0
- package/dist/snapshotInspection.js +105 -0
- package/dist/snapshotSegmentBlobs.js +58 -0
- package/dist/snapshotUploads.js +166 -0
- package/dist/socketTransport.js +253 -0
- package/dist/spatial.js +104 -0
- package/dist/spectatorPolicy.js +26 -0
- package/dist/spectatorProducer.js +89 -0
- package/dist/startFailureCause.js +4 -0
- package/dist/stateCodec.js +658 -0
- package/dist/strategies.d.ts +210 -0
- package/dist/strategies.js +8 -0
- package/dist/strategiesServer.d.ts +286 -0
- package/dist/strategiesServer.js +11 -0
- package/dist/strategyFixtures.js +182 -0
- package/dist/streamFraming.js +122 -0
- package/dist/streamTransport.js +266 -0
- package/dist/subjectAdmission.js +50 -0
- package/dist/subjectPrivacy.js +281 -0
- package/dist/subjectPrivacyBinding.js +90 -0
- package/dist/systemManifest.js +182 -0
- package/dist/tables.js +159 -0
- package/dist/testHarness.js +89 -0
- package/dist/testing.d.ts +3684 -0
- package/dist/testing.js +221 -0
- package/dist/testingPorts.js +271 -0
- package/dist/testingServer.d.ts +4060 -0
- package/dist/testingServer.js +18 -0
- package/dist/transform.d.ts +692 -0
- package/dist/transform.js +217 -0
- package/dist/transform3d.js +118 -0
- package/dist/transformCollection.js +24 -0
- package/dist/transformCollection3d.js +24 -0
- package/dist/transformCollectionCore.js +156 -0
- package/dist/transformFrames.js +121 -0
- package/dist/transformPrediction3d.js +127 -0
- package/dist/transformRules.js +123 -0
- package/dist/transformSchemas.js +20 -0
- package/dist/transport.js +32 -0
- package/dist/transportAuthoring.js +29 -0
- package/dist/transportCleanup.js +22 -0
- package/dist/transportConformance.js +124 -0
- package/dist/transportConnector.js +82 -0
- package/dist/transportEndpoints.js +38 -0
- package/dist/transportsServer.d.ts +5515 -0
- package/dist/transportsServer.js +6 -0
- package/dist/viewProjection.js +16 -0
- package/dist/web.d.ts +2286 -0
- package/dist/web.js +518 -0
- package/dist/webTransportClient.js +173 -0
- package/dist/wire.d.ts +992 -0
- package/dist/wire.js +492 -0
- package/dist/withdrawalPort.js +28 -0
- package/dist/world.d.ts +1894 -0
- package/dist/world.js +333 -0
- package/dist/worldActorReceipts.js +48 -0
- package/dist/worldActorTransferSnapshot.js +14 -0
- package/dist/worldAdmissionPending.js +8 -0
- package/dist/worldBoundaryCoordinator.js +148 -0
- package/dist/worldCatalog.js +81 -0
- package/dist/worldCellAllocation.js +203 -0
- package/dist/worldCellDestination.js +68 -0
- package/dist/worldCells.js +489 -0
- package/dist/worldChange.js +32 -0
- package/dist/worldClient.js +664 -0
- package/dist/worldClientControl.js +141 -0
- package/dist/worldClientPendingInput.js +16 -0
- package/dist/worldClientRpc.js +133 -0
- package/dist/worldClientRpcRoutes.js +43 -0
- package/dist/worldClientSchemas.js +28 -0
- package/dist/worldCommands.js +140 -0
- package/dist/worldData.js +42 -0
- package/dist/worldDefaultBinding.js +377 -0
- package/dist/worldDefaultGroupAdmission.js +82 -0
- package/dist/worldDefaultGroupAppServices.js +31 -0
- package/dist/worldDefaultGroupCompensation.js +109 -0
- package/dist/worldDefaultGroupContinuation.js +96 -0
- package/dist/worldDefaultGroupControl.js +72 -0
- package/dist/worldDefaultGroupMembers.js +85 -0
- package/dist/worldDefaultGroups.js +21 -0
- package/dist/worldDefaultPending.js +79 -0
- package/dist/worldDefaultService.js +245 -0
- package/dist/worldEntities.js +2980 -0
- package/dist/worldEntityCodec.js +21 -0
- package/dist/worldEntityHandoffView.js +154 -0
- package/dist/worldGeometry.js +170 -0
- package/dist/worldGhostAdmission.js +65 -0
- package/dist/worldGhostDestination.js +118 -0
- package/dist/worldGhostGateway.js +132 -0
- package/dist/worldGhostHandshake.js +108 -0
- package/dist/worldGhostHost.js +42 -0
- package/dist/worldGhostIngress.js +132 -0
- package/dist/worldGhostNeighborhood.js +70 -0
- package/dist/worldGhostNeighbors.js +86 -0
- package/dist/worldGhostOutbound.js +110 -0
- package/dist/worldGhostPublisher.js +216 -0
- package/dist/worldGhostReceiver.js +213 -0
- package/dist/worldGhostSender.js +146 -0
- package/dist/worldGhostSocket.js +78 -0
- package/dist/worldGhostWire.js +172 -0
- package/dist/worldGroupCommand.js +49 -0
- package/dist/worldGroupDeadline.js +115 -0
- package/dist/worldGroupPreparation.js +115 -0
- package/dist/worldGroupReadyControl.js +128 -0
- package/dist/worldGroupSupervisor.js +120 -0
- package/dist/worldHandoffMetrics.js +59 -0
- package/dist/worldHandoffView.js +100 -0
- package/dist/worldHostSource.js +69 -0
- package/dist/worldInspectEndpoint.js +250 -0
- package/dist/worldInspection.js +109 -0
- package/dist/worldInstanceAdmission.js +31 -0
- package/dist/worldInstanceAllocation.js +116 -0
- package/dist/worldInstanceDestination.js +64 -0
- package/dist/worldInstanceExpiry.js +282 -0
- package/dist/worldInstanceExpirySupervisor.js +88 -0
- package/dist/worldInstanceLifecycle.js +103 -0
- package/dist/worldInstanceState.js +52 -0
- package/dist/worldInstances.js +478 -0
- package/dist/worldJoin.js +56 -0
- package/dist/worldLayers.js +151 -0
- package/dist/worldLeases.js +78 -0
- package/dist/worldManifest.js +25 -0
- package/dist/worldMovement.js +63 -0
- package/dist/worldPersistence.js +134 -0
- package/dist/worldProjection.js +221 -0
- package/dist/worldReact.js +110 -0
- package/dist/worldRecoveryActor.js +35 -0
- package/dist/worldReturnAnchor.js +49 -0
- package/dist/worldRoomHooks.js +57 -0
- package/dist/worldRoomPool.js +27 -0
- package/dist/worldRoomSteps.js +133 -0
- package/dist/worldSeatBinding.js +36 -0
- package/dist/worldServer.d.ts +6936 -0
- package/dist/worldServer.js +48 -0
- package/dist/worldSourceSeatPending.js +9 -0
- package/dist/worldStrategyFixtures.js +164 -0
- package/dist/worldTesting.js +27 -0
- package/dist/worldTransitionDefaults.js +198 -0
- package/dist/worldTransitionExecutor.js +519 -0
- package/dist/worldTransitionGroup.js +113 -0
- package/dist/worldTransitionPhysicalSteps.js +40 -0
- package/dist/worldTransitionResolver.js +228 -0
- package/dist/worldTransitionSeatGroup.js +64 -0
- package/dist/worldTransitionSeats.js +260 -0
- package/dist/worldTransitionState.js +95 -0
- package/dist/worldTransitions.js +101 -0
- package/package.json +189 -4
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { RoomAuthoringError as e } from "./errors.js";
|
|
2
|
+
import { RoomFieldId as t, RoomInterpolation as n, RoomPrecision as r, RoomQuantization as i, RoomTransform as a, dequantize as o, fieldId as s, interpolate as c, precision as l, quantizationStep as u, quantize as d, quantized as f } from "./room.js";
|
|
3
|
+
import { captureTransformRules as p, captureTransformRules2D as m, validateTransformRules2D as h } from "./transformRules.js";
|
|
4
|
+
import { decodeQuaternionSmallestThree as g, encodeQuaternionSmallestThree as _, quaternionByteLength as v } from "./quaternion.js";
|
|
5
|
+
import { SpatialGrid2D as y, SpatialInterest2D as b, spatialGrid as x } from "./spatial.js";
|
|
6
|
+
import { collide as S, collisionWorld as C, tileCollisionWorld2D as w } from "./collision.js";
|
|
7
|
+
import { Transform2D as T, Transform3D as E } from "./transformSchemas.js";
|
|
8
|
+
import { AttachedTransform2D as D, BallisticProjectile2D as O, attachTransform2D as k, detachTransform2D as A, resolveAttachedTransforms2D as j, sampleBallisticProjectile2D as M, setTransformOwner2D as N } from "./movementSpecials.js";
|
|
9
|
+
import { TransformHistory3D as P, interpolateTransform3D as F } from "./transform3d.js";
|
|
10
|
+
import { TransformRenderPrediction3D as I } from "./transformPrediction3d.js";
|
|
11
|
+
import { RoomTransformCollection2D as L } from "./transformCollection.js";
|
|
12
|
+
import { RoomTransformCollection3D as R } from "./transformCollection3d.js";
|
|
13
|
+
import { RoomAnimationFrameLoop as z, RoomTransformFrameLoop2D as B, RoomTransformFrameLoop3D as V, browserRoomAnimationFrames as H } from "./transformFrames.js";
|
|
14
|
+
//#region src/transform.ts
|
|
15
|
+
function U(t) {
|
|
16
|
+
throw new e({
|
|
17
|
+
room: "transform",
|
|
18
|
+
detail: t
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
var W = (e, t) => Number.isFinite(e) ? e : U(`${t} must be finite`), G = (e, t) => W(e, t) > 0 ? e : U(`${t} must be positive`), K = (e) => {
|
|
22
|
+
let t = p(e);
|
|
23
|
+
return (e) => e.annotate({ [a]: t });
|
|
24
|
+
}, q = (e) => {
|
|
25
|
+
for (let t of [
|
|
26
|
+
e.x,
|
|
27
|
+
e.y,
|
|
28
|
+
e.rot,
|
|
29
|
+
e.vx ?? 0,
|
|
30
|
+
e.vy ?? 0
|
|
31
|
+
]) W(t, "transform component");
|
|
32
|
+
}, J = (e) => (e % 360 + 360) % 360, Y = (e, t) => (J(t) - J(e) + 540) % 360 - 180, X = (e, t, n, r) => {
|
|
33
|
+
h(r), q(e), G(n, "dt"), W(t.dx, "dx"), W(t.dy, "dy");
|
|
34
|
+
let i = Math.hypot(t.dx, t.dy), a = Math.max(1, i), o = t.dx / a * r.maxSpeed, s = t.dy / a * r.maxSpeed, c = Math.hypot(e.vx ?? 0, e.vy ?? 0), l = c > r.maxSpeed ? r.maxSpeed / c : 1, u = (e.vx ?? 0) * l, d = (e.vy ?? 0) * l, f = o - u, p = s - d, m = Math.hypot(f, p), g = m === 0 ? 0 : Math.min(1, r.maxAccel * n / m), _ = u + f * g, v = d + p * g, y = e.x + _ * n, b = e.y + v * n, x = Math.max(r.bounds.min[0], Math.min(r.bounds.max[0], y)), S = Math.max(r.bounds.min[1], Math.min(r.bounds.max[1], b));
|
|
35
|
+
return x !== y && (_ = 0), S !== b && (v = 0), {
|
|
36
|
+
x,
|
|
37
|
+
y: S,
|
|
38
|
+
rot: J(e.rot),
|
|
39
|
+
vx: _,
|
|
40
|
+
vy: v
|
|
41
|
+
};
|
|
42
|
+
}, Z = (e, t, n, r, i, a = !0) => {
|
|
43
|
+
q(e), q(t), W(n, "fraction"), G(r, "durationSeconds"), (![
|
|
44
|
+
"linear",
|
|
45
|
+
"hermite",
|
|
46
|
+
"none"
|
|
47
|
+
].includes(i) || typeof a != "boolean") && U("Invalid interpolation mode or velocity policy");
|
|
48
|
+
let o = Math.max(0, Math.min(1, n));
|
|
49
|
+
if (i === "none") return { ...o < 1 ? e : t };
|
|
50
|
+
let s = (e, t, n, a) => {
|
|
51
|
+
if (i === "linear") return e + (t - e) * o;
|
|
52
|
+
let s = o * o, c = s * o;
|
|
53
|
+
return (2 * c - 3 * s + 1) * e + (c - 2 * s + o) * n * r + (-2 * c + 3 * s) * t + (c - s) * a * r;
|
|
54
|
+
}, c = a ? (t.x - e.x) / r : 0, l = a ? (t.y - e.y) / r : 0;
|
|
55
|
+
return {
|
|
56
|
+
x: s(e.x, t.x, e.vx ?? c, t.vx ?? c),
|
|
57
|
+
y: s(e.y, t.y, e.vy ?? l, t.vy ?? l),
|
|
58
|
+
rot: J(e.rot + Y(e.rot, t.rot) * o),
|
|
59
|
+
vx: (e.vx ?? c) + ((t.vx ?? c) - (e.vx ?? c)) * o,
|
|
60
|
+
vy: (e.vy ?? l) + ((t.vy ?? l) - (e.vy ?? l)) * o
|
|
61
|
+
};
|
|
62
|
+
}, Q = class e {
|
|
63
|
+
capacity;
|
|
64
|
+
snapshots = [];
|
|
65
|
+
rules;
|
|
66
|
+
constructor(e, t) {
|
|
67
|
+
this.capacity = e, (!Number.isSafeInteger(e) || e < 2 || e > 16384) && U("History capacity must be between two and its admitted maximum"), this.rules = m(t);
|
|
68
|
+
}
|
|
69
|
+
copy() {
|
|
70
|
+
let t = new e(this.capacity, this.rules);
|
|
71
|
+
for (let e of this.snapshots) t.push(e);
|
|
72
|
+
return t;
|
|
73
|
+
}
|
|
74
|
+
push(e) {
|
|
75
|
+
if ((!Number.isSafeInteger(e.tick) || e.tick < 0 || W(e.timeMs, "timeMs") < 0) && U("Invalid snapshot time or tick"), q(e.transform), typeof e.teleport != "boolean" && U("Snapshot teleport must be an explicit boolean"), this.snapshots.some((t) => t.tick === e.tick)) return !1;
|
|
76
|
+
let t = this.snapshots[0];
|
|
77
|
+
if (this.snapshots.length === this.capacity && t && e.tick < t.tick) return !1;
|
|
78
|
+
let n = this.rules.velocity === "derive" || this.rules.velocity === "none" ? {
|
|
79
|
+
x: e.transform.x,
|
|
80
|
+
y: e.transform.y,
|
|
81
|
+
rot: e.transform.rot
|
|
82
|
+
} : { ...e.transform }, r = [...this.snapshots, {
|
|
83
|
+
...e,
|
|
84
|
+
transform: n
|
|
85
|
+
}].sort((e, t) => e.tick - t.tick);
|
|
86
|
+
for (let e = 1; e < r.length; e++) {
|
|
87
|
+
let t = r[e - 1], n = r[e];
|
|
88
|
+
t && n && n.timeMs <= t.timeMs && U("Snapshot times must increase with their ticks");
|
|
89
|
+
}
|
|
90
|
+
return this.snapshots.splice(0, this.snapshots.length, ...r.slice(-this.capacity)), !0;
|
|
91
|
+
}
|
|
92
|
+
at(e) {
|
|
93
|
+
W(e, "timeMs");
|
|
94
|
+
let t = this.snapshots[0], n = this.snapshots[this.snapshots.length - 1];
|
|
95
|
+
if (!t || !n) return null;
|
|
96
|
+
if (e <= t.timeMs) return {
|
|
97
|
+
...t.transform,
|
|
98
|
+
stale: e < t.timeMs
|
|
99
|
+
};
|
|
100
|
+
for (let t = 1; t < this.snapshots.length; t++) {
|
|
101
|
+
let n = this.snapshots[t - 1], r = this.snapshots[t];
|
|
102
|
+
if (!(!n || !r || e > r.timeMs)) return r.teleport || Math.hypot(r.transform.x - n.transform.x, r.transform.y - n.transform.y) > this.rules.teleportThreshold ? {
|
|
103
|
+
...e < r.timeMs ? n.transform : r.transform,
|
|
104
|
+
stale: !1
|
|
105
|
+
} : {
|
|
106
|
+
...Z(n.transform, r.transform, (e - n.timeMs) / (r.timeMs - n.timeMs), (r.timeMs - n.timeMs) / 1e3, this.rules.interpolation, this.rules.velocity !== "none"),
|
|
107
|
+
stale: !1
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
let r = e - n.timeMs, i = Math.min(this.rules.extrapolateMs, r) / 1e3, a = this.snapshots[this.snapshots.length - 2], o = a ? (n.timeMs - a.timeMs) / 1e3 : 0, s = n.transform.vx ?? (this.rules.velocity !== "none" && a && o > 0 ? (n.transform.x - a.transform.x) / o : 0), c = n.transform.vy ?? (this.rules.velocity !== "none" && a && o > 0 ? (n.transform.y - a.transform.y) / o : 0);
|
|
111
|
+
return {
|
|
112
|
+
...n.transform,
|
|
113
|
+
x: n.transform.x + s * i,
|
|
114
|
+
y: n.transform.y + c * i,
|
|
115
|
+
vx: s,
|
|
116
|
+
vy: c,
|
|
117
|
+
stale: r > this.rules.extrapolateMs
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}, $ = class {
|
|
121
|
+
step;
|
|
122
|
+
capacity;
|
|
123
|
+
pending = [];
|
|
124
|
+
predicted;
|
|
125
|
+
lastSeq = -1;
|
|
126
|
+
lastAck = -1;
|
|
127
|
+
rules;
|
|
128
|
+
constructor(e, t, n, r) {
|
|
129
|
+
this.step = n, this.capacity = r, q(e), (!Number.isSafeInteger(r) || r < 1 || r > 16384) && U("Prediction capacity must be positive and bounded");
|
|
130
|
+
try {
|
|
131
|
+
this.rules = structuredClone(t);
|
|
132
|
+
} catch {
|
|
133
|
+
U("Prediction rules must be detached data");
|
|
134
|
+
}
|
|
135
|
+
this.predicted = { ...e };
|
|
136
|
+
}
|
|
137
|
+
send(e, t, n) {
|
|
138
|
+
(!Number.isSafeInteger(e) || e <= this.lastSeq) && U("Prediction sequences must increase"), G(n, "dt"), this.pending.length >= this.capacity && U("Prediction input history is full");
|
|
139
|
+
let r = structuredClone(t), i = this.step({ ...this.predicted }, structuredClone(r), n, structuredClone(this.rules));
|
|
140
|
+
return q(i), this.pending.push({
|
|
141
|
+
seq: e,
|
|
142
|
+
input: r,
|
|
143
|
+
dt: n
|
|
144
|
+
}), this.lastSeq = e, this.predicted = { ...i }, this.state();
|
|
145
|
+
}
|
|
146
|
+
reconcile(e, t) {
|
|
147
|
+
if ((!Number.isSafeInteger(e) || e < 0 || e > this.lastSeq) && U("Input acknowledgement is outside submitted history"), e < this.lastAck) return this.state();
|
|
148
|
+
q(t);
|
|
149
|
+
let n = this.pending.filter((t) => t.seq > e), r = { ...t };
|
|
150
|
+
for (let e of n) r = this.step(r, structuredClone(e.input), e.dt, structuredClone(this.rules)), q(r);
|
|
151
|
+
return this.pending.splice(0, this.pending.length, ...n), this.lastAck = e, this.predicted = { ...r }, this.state();
|
|
152
|
+
}
|
|
153
|
+
state() {
|
|
154
|
+
return { ...this.predicted };
|
|
155
|
+
}
|
|
156
|
+
queued() {
|
|
157
|
+
return this.pending.length;
|
|
158
|
+
}
|
|
159
|
+
}, ee = class {
|
|
160
|
+
prediction;
|
|
161
|
+
now;
|
|
162
|
+
threshold;
|
|
163
|
+
blendMs;
|
|
164
|
+
lastTime;
|
|
165
|
+
lastAck = -1;
|
|
166
|
+
correctionAt = 0;
|
|
167
|
+
offset = {
|
|
168
|
+
x: 0,
|
|
169
|
+
y: 0,
|
|
170
|
+
rot: 0
|
|
171
|
+
};
|
|
172
|
+
constructor(e, t, n, r) {
|
|
173
|
+
this.threshold = G(r.teleportThreshold, "teleportThreshold"), this.blendMs = W(r.correctionBlendMs ?? 80, "correctionBlendMs"), this.blendMs < 0 && U("correctionBlendMs must be nonnegative"), (!r.clock || typeof r.clock.now != "function") && U("A render clock is required"), this.now = r.clock.now.bind(r.clock), this.lastTime = W(this.now(), "render clock"), this.lastTime < 0 && U("Render clock must be nonnegative"), this.prediction = new $(e, t, n, r.capacity);
|
|
174
|
+
}
|
|
175
|
+
time() {
|
|
176
|
+
let e = W(this.now(), "render clock");
|
|
177
|
+
return e < this.lastTime && U("Render clock must not move backwards"), this.lastTime = e, e;
|
|
178
|
+
}
|
|
179
|
+
at(e) {
|
|
180
|
+
let t = this.prediction.state(), n = this.blendMs === 0 ? 0 : Math.max(0, 1 - (e - this.correctionAt) / this.blendMs), r = {
|
|
181
|
+
...t,
|
|
182
|
+
x: t.x + this.offset.x * n,
|
|
183
|
+
y: t.y + this.offset.y * n,
|
|
184
|
+
rot: J(J(t.rot) + this.offset.rot * n)
|
|
185
|
+
};
|
|
186
|
+
return q(r), r;
|
|
187
|
+
}
|
|
188
|
+
send(e, t, n) {
|
|
189
|
+
return this.time(), this.prediction.send(e, t, n);
|
|
190
|
+
}
|
|
191
|
+
reconcile(e, t, n = !1) {
|
|
192
|
+
typeof n != "boolean" && U("Teleport must be an explicit boolean");
|
|
193
|
+
let r = this.time(), i = this.at(r), a = this.prediction.state(), o = this.prediction.reconcile(e, t);
|
|
194
|
+
if (e < this.lastAck || (this.lastAck = e, a.x === o.x && a.y === o.y && J(a.rot) === J(o.rot) && a.vx === o.vx && a.vy === o.vy && !n)) return o;
|
|
195
|
+
let s = {
|
|
196
|
+
x: i.x - o.x,
|
|
197
|
+
y: i.y - o.y,
|
|
198
|
+
rot: Y(o.rot, i.rot)
|
|
199
|
+
}, c = Math.hypot(a.x - o.x, a.y - o.y);
|
|
200
|
+
return this.offset = n || c > this.threshold || this.blendMs === 0 || !Number.isFinite(s.x) || !Number.isFinite(s.y) ? {
|
|
201
|
+
x: 0,
|
|
202
|
+
y: 0,
|
|
203
|
+
rot: 0
|
|
204
|
+
} : s, this.correctionAt = r, o;
|
|
205
|
+
}
|
|
206
|
+
state() {
|
|
207
|
+
return this.prediction.state();
|
|
208
|
+
}
|
|
209
|
+
render() {
|
|
210
|
+
return this.at(this.time());
|
|
211
|
+
}
|
|
212
|
+
queued() {
|
|
213
|
+
return this.prediction.queued();
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
//#endregion
|
|
217
|
+
export { D as AttachedTransform2D, O as BallisticProjectile2D, z as RoomAnimationFrameLoop, t as RoomFieldId, n as RoomInterpolation, r as RoomPrecision, i as RoomQuantization, a as RoomTransform, L as RoomTransformCollection2D, R as RoomTransformCollection3D, B as RoomTransformFrameLoop2D, V as RoomTransformFrameLoop3D, y as SpatialGrid2D, b as SpatialInterest2D, T as Transform2D, E as Transform3D, Q as TransformHistory2D, P as TransformHistory3D, $ as TransformPrediction2D, ee as TransformRenderPrediction2D, I as TransformRenderPrediction3D, k as attachTransform2D, H as browserRoomAnimationFrames, S as collide, C as collisionWorld, g as decodeQuaternionSmallestThree, o as dequantize, A as detachTransform2D, _ as encodeQuaternionSmallestThree, s as fieldId, c as interpolate, Z as interpolateTransform2D, F as interpolateTransform3D, l as precision, u as quantizationStep, d as quantize, f as quantized, v as quaternionByteLength, j as resolveAttachedTransforms2D, M as sampleBallisticProjectile2D, N as setTransformOwner2D, x as spatialGrid, X as stepTransform2D, w as tileCollisionWorld2D, K as transform };
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { RoomAuthoringError as e } from "./errors.js";
|
|
2
|
+
import { captureTransformRules3D as t } from "./transformRules.js";
|
|
3
|
+
//#region src/transform3d.ts
|
|
4
|
+
function n(t) {
|
|
5
|
+
throw new e({
|
|
6
|
+
room: "transform3d",
|
|
7
|
+
detail: t
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
var r = (e) => Number.isFinite(e) ? e : n("Transform components and times must be finite"), i = (e) => {
|
|
11
|
+
let { x: t, y: i, z: a, qx: o, qy: s, qz: c, qw: l } = e;
|
|
12
|
+
for (let e of [
|
|
13
|
+
t,
|
|
14
|
+
i,
|
|
15
|
+
a,
|
|
16
|
+
o,
|
|
17
|
+
s,
|
|
18
|
+
c,
|
|
19
|
+
l
|
|
20
|
+
]) r(e);
|
|
21
|
+
let u = Math.max(Math.abs(o), Math.abs(s), Math.abs(c), Math.abs(l));
|
|
22
|
+
u === 0 && n("A zero quaternion has no rotation");
|
|
23
|
+
let d = Math.hypot(o / u, s / u, c / u, l / u);
|
|
24
|
+
return {
|
|
25
|
+
x: t,
|
|
26
|
+
y: i,
|
|
27
|
+
z: a,
|
|
28
|
+
qx: o / u / d,
|
|
29
|
+
qy: s / u / d,
|
|
30
|
+
qz: c / u / d,
|
|
31
|
+
qw: l / u / d
|
|
32
|
+
};
|
|
33
|
+
}, a = (e, t, a, o, s, c, l) => {
|
|
34
|
+
let u = i(e), d = i(t), f = Math.max(0, Math.min(1, r(a)));
|
|
35
|
+
(r(o) <= 0 || ![
|
|
36
|
+
"linear",
|
|
37
|
+
"hermite",
|
|
38
|
+
"none"
|
|
39
|
+
].includes(s)) && n("Interpolation requires positive duration and a declared mode");
|
|
40
|
+
for (let e of [c, l]) if (e !== void 0) for (let t of [
|
|
41
|
+
e.x,
|
|
42
|
+
e.y,
|
|
43
|
+
e.z
|
|
44
|
+
]) r(t);
|
|
45
|
+
if (s === "none") return f < 1 ? u : d;
|
|
46
|
+
let p = (e) => {
|
|
47
|
+
if (s === "linear") return u[e] + (d[e] - u[e]) * f;
|
|
48
|
+
let t = (d[e] - u[e]) / o, n = c?.[e] ?? t, r = l?.[e] ?? t, i = f * f, a = i * f;
|
|
49
|
+
return (2 * a - 3 * i + 1) * u[e] + (a - 2 * i + f) * n * o + (-2 * a + 3 * i) * d[e] + (a - i) * r * o;
|
|
50
|
+
}, m = u.qx * d.qx + u.qy * d.qy + u.qz * d.qz + u.qw * d.qw, h = m < 0 ? -1 : 1;
|
|
51
|
+
m = Math.min(1, Math.max(0, m * h));
|
|
52
|
+
let g = Math.acos(m), _ = Math.sin(g), v = m > .9995, y = v ? 1 - f : Math.sin((1 - f) * g) / _, b = v ? f : Math.sin(f * g) / _;
|
|
53
|
+
return i({
|
|
54
|
+
x: p("x"),
|
|
55
|
+
y: p("y"),
|
|
56
|
+
z: p("z"),
|
|
57
|
+
qx: u.qx * y + d.qx * h * b,
|
|
58
|
+
qy: u.qy * y + d.qy * h * b,
|
|
59
|
+
qz: u.qz * y + d.qz * h * b,
|
|
60
|
+
qw: u.qw * y + d.qw * h * b
|
|
61
|
+
});
|
|
62
|
+
}, o = class e {
|
|
63
|
+
capacity;
|
|
64
|
+
snapshots = [];
|
|
65
|
+
rules;
|
|
66
|
+
constructor(e, r) {
|
|
67
|
+
this.capacity = e, (!Number.isSafeInteger(e) || e < 2 || e > 16384) && n("History capacity must be between two and its admitted maximum"), this.rules = t(r);
|
|
68
|
+
}
|
|
69
|
+
copy() {
|
|
70
|
+
let t = new e(this.capacity, this.rules);
|
|
71
|
+
for (let e of this.snapshots) t.snapshots.push({
|
|
72
|
+
...e,
|
|
73
|
+
transform: { ...e.transform }
|
|
74
|
+
});
|
|
75
|
+
return t;
|
|
76
|
+
}
|
|
77
|
+
push(e) {
|
|
78
|
+
(!Number.isSafeInteger(e.tick) || e.tick < 0 || r(e.timeMs) < 0 || typeof e.teleport != "boolean") && n("Snapshot identity and teleport must be explicit");
|
|
79
|
+
let t = i(e.transform);
|
|
80
|
+
if (this.snapshots.some((t) => t.tick === e.tick) || this.snapshots.length === this.capacity && e.tick < this.snapshots[0].tick) return !1;
|
|
81
|
+
let a = this.snapshots.findIndex((t) => t.tick > e.tick), o = a < 0 ? this.snapshots.length : a, s = this.snapshots[o - 1], c = this.snapshots[o];
|
|
82
|
+
return (s && e.timeMs <= s.timeMs || c && e.timeMs >= c.timeMs) && n("Snapshot times must increase with ticks"), this.snapshots.splice(o, 0, {
|
|
83
|
+
tick: e.tick,
|
|
84
|
+
timeMs: e.timeMs,
|
|
85
|
+
teleport: e.teleport,
|
|
86
|
+
transform: t
|
|
87
|
+
}), this.snapshots.length > this.capacity && this.snapshots.shift(), !0;
|
|
88
|
+
}
|
|
89
|
+
at(e) {
|
|
90
|
+
r(e);
|
|
91
|
+
let t = this.snapshots[0], n = this.snapshots.at(-1);
|
|
92
|
+
if (!t || !n) return null;
|
|
93
|
+
if (e <= t.timeMs) return {
|
|
94
|
+
...t.transform,
|
|
95
|
+
stale: e < t.timeMs
|
|
96
|
+
};
|
|
97
|
+
for (let t = 1; t < this.snapshots.length; t++) {
|
|
98
|
+
let n = this.snapshots[t - 1], r = this.snapshots[t];
|
|
99
|
+
if (!(e > r.timeMs)) return r.teleport || Math.hypot(r.transform.x - n.transform.x, r.transform.y - n.transform.y, r.transform.z - n.transform.z) > this.rules.teleportThreshold ? {
|
|
100
|
+
...e < r.timeMs ? n.transform : r.transform,
|
|
101
|
+
stale: !1
|
|
102
|
+
} : {
|
|
103
|
+
...a(n.transform, r.transform, (e - n.timeMs) / (r.timeMs - n.timeMs), (r.timeMs - n.timeMs) / 1e3, this.rules.interpolation),
|
|
104
|
+
stale: !1
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
let i = this.snapshots.at(-2), o = i ? (n.timeMs - i.timeMs) / 1e3 : 0, s = e - n.timeMs, c = Math.min(this.rules.extrapolateMs, s) / 1e3, l = (e) => r(n.transform[e] + (i && o > 0 ? (n.transform[e] - i.transform[e]) / o : 0) * c);
|
|
108
|
+
return {
|
|
109
|
+
...n.transform,
|
|
110
|
+
x: l("x"),
|
|
111
|
+
y: l("y"),
|
|
112
|
+
z: l("z"),
|
|
113
|
+
stale: s > this.rules.extrapolateMs
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
//#endregion
|
|
118
|
+
export { o as TransformHistory3D, a as interpolateTransform3D, i as normalizeTransform3D };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { captureTransformRules2D as e } from "./transformRules.js";
|
|
2
|
+
import { RoomTransformCollectionCore as t } from "./transformCollectionCore.js";
|
|
3
|
+
import { TransformHistory2D as n } from "./transform.js";
|
|
4
|
+
//#region src/transformCollection.ts
|
|
5
|
+
var r = (e) => ({
|
|
6
|
+
copy: () => r(e.copy()),
|
|
7
|
+
push: (t) => e.push(t),
|
|
8
|
+
at: (t) => {
|
|
9
|
+
let n = e.at(t);
|
|
10
|
+
if (n === null) return null;
|
|
11
|
+
let { stale: r, ...i } = n;
|
|
12
|
+
return {
|
|
13
|
+
transform: i,
|
|
14
|
+
stale: r
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}), i = class extends t {
|
|
18
|
+
constructor(t, i) {
|
|
19
|
+
let a = e(i.rules);
|
|
20
|
+
super(t, i, (e) => r(new n(e, a)));
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { i as RoomTransformCollection2D };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { captureTransformRules3D as e } from "./transformRules.js";
|
|
2
|
+
import { TransformHistory3D as t } from "./transform3d.js";
|
|
3
|
+
import { RoomTransformCollectionCore as n } from "./transformCollectionCore.js";
|
|
4
|
+
//#region src/transformCollection3d.ts
|
|
5
|
+
var r = (e) => ({
|
|
6
|
+
copy: () => r(e.copy()),
|
|
7
|
+
push: (t) => e.push(t),
|
|
8
|
+
at: (t) => {
|
|
9
|
+
let n = e.at(t);
|
|
10
|
+
if (n === null) return null;
|
|
11
|
+
let { stale: r, ...i } = n;
|
|
12
|
+
return {
|
|
13
|
+
transform: i,
|
|
14
|
+
stale: r
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}), i = class extends n {
|
|
18
|
+
constructor(n, i) {
|
|
19
|
+
let a = e(i.rules);
|
|
20
|
+
super(n, i, (e) => r(new t(e, a)));
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { i as RoomTransformCollection3D };
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { BudgetExceeded as e, RoomAuthoringError as t } from "./errors.js";
|
|
2
|
+
//#region src/transformCollectionCore.ts
|
|
3
|
+
function n(e) {
|
|
4
|
+
throw new t({
|
|
5
|
+
room: "transform-collection",
|
|
6
|
+
detail: e
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
var r = (e, t) => Number.isFinite(e) ? e : n(`${t} must be finite`), i = (e) => typeof e == "string" && e.trim() && e.length <= 191 ? e : n("Transform identity must be nonempty and bounded"), a = (e, t, r) => Number.isSafeInteger(e) && e >= t && e <= r ? e : n("Transform collection capacity must fit its admitted bound"), o = class {
|
|
10
|
+
entries = /* @__PURE__ */ new Map();
|
|
11
|
+
epoch = -1;
|
|
12
|
+
tick = -1;
|
|
13
|
+
previous = null;
|
|
14
|
+
jitter = [];
|
|
15
|
+
currentError = null;
|
|
16
|
+
closing = !1;
|
|
17
|
+
closed = !1;
|
|
18
|
+
closeTask = null;
|
|
19
|
+
read;
|
|
20
|
+
serverTime;
|
|
21
|
+
release;
|
|
22
|
+
select;
|
|
23
|
+
timeAtTick;
|
|
24
|
+
makeHistory;
|
|
25
|
+
capacity;
|
|
26
|
+
maxEntities;
|
|
27
|
+
minDelay;
|
|
28
|
+
maxDelay;
|
|
29
|
+
interval;
|
|
30
|
+
maxLossIntervals;
|
|
31
|
+
loss;
|
|
32
|
+
jitterWindow;
|
|
33
|
+
jitterMultiplier;
|
|
34
|
+
constructor(t, i, o) {
|
|
35
|
+
this.makeHistory = o, this.capacity = a(i.capacity, 2, 16384), this.maxEntities = a(i.maxEntities, 1, 16384);
|
|
36
|
+
let s = a(i.maxRetainedSnapshots, 2, 1048576);
|
|
37
|
+
if (this.capacity * this.maxEntities > s) throw new e({
|
|
38
|
+
budget: "transformSnapshots",
|
|
39
|
+
limit: s
|
|
40
|
+
});
|
|
41
|
+
let c = r(i.sendIntervalMs, "sendIntervalMs");
|
|
42
|
+
c <= 0 && n("sendIntervalMs must be positive"), this.minDelay = r(i.minDelayMs ?? c * 2, "minDelayMs"), this.maxDelay = r(i.maxDelayMs ?? Math.max(1e3, this.minDelay), "maxDelayMs"), this.jitterWindow = a(i.jitterWindow ?? 32, 2, 256), this.jitterMultiplier = r(i.jitterMultiplier ?? 2, "jitterMultiplier"), this.interval = c, this.maxLossIntervals = a(i.maxLossIntervals ?? 2, 0, 16), this.loss = () => {
|
|
43
|
+
let e = t.lossRate;
|
|
44
|
+
return typeof e == "number" && e >= 0 && e <= 1 ? e : 0;
|
|
45
|
+
}, (this.minDelay < 0 || this.maxDelay < this.minDelay || this.jitterMultiplier < 0) && n("Render delay budgets must be ordered and nonnegative"), (typeof i.select != "function" || typeof i.timeAtTick != "function" || typeof t.deliveredSnapshot != "function" || typeof t.serverNow != "function" || typeof t.subscribe != "function") && n("Transform projection, server timeline and subscribed source are required"), this.select = i.select, this.timeAtTick = i.timeAtTick, this.read = t.deliveredSnapshot.bind(t), this.serverTime = t.serverNow.bind(t);
|
|
46
|
+
let l = t.subscribe.bind(t);
|
|
47
|
+
this.observe(), this.release = l(() => this.observe()), typeof this.release != "function" && n("Transform source must return its subscription release");
|
|
48
|
+
}
|
|
49
|
+
reset() {
|
|
50
|
+
this.entries.clear(), this.epoch = -1, this.tick = -1, this.previous = null, this.jitter = [];
|
|
51
|
+
}
|
|
52
|
+
observe() {
|
|
53
|
+
if (!this.closing) try {
|
|
54
|
+
let t = this.read();
|
|
55
|
+
if (t === null) {
|
|
56
|
+
this.reset(), this.currentError = null;
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if ((!Number.isSafeInteger(t.epoch) || t.epoch < 0 || !Number.isSafeInteger(t.tick) || t.tick < 0 || r(t.receivedAt, "receivedAt") < 0) && n("Delivered epoch, tick or observation is invalid"), t.epoch < this.epoch) return;
|
|
60
|
+
if (t.epoch !== this.epoch) this.reset(), this.epoch = t.epoch;
|
|
61
|
+
else if (t.tick <= this.tick) return;
|
|
62
|
+
let a = r(this.timeAtTick(t.epoch, t.tick), "server snapshot time");
|
|
63
|
+
(a < 0 || this.previous && (a <= this.previous.timeMs || t.receivedAt < this.previous.receivedAt)) && n("Server snapshot timeline must increase and local observation must not regress");
|
|
64
|
+
let o = this.select(structuredClone(t.state));
|
|
65
|
+
if (Array.isArray(o) || n("Transform projection must return a dense entity array"), o.length > this.maxEntities) throw new e({
|
|
66
|
+
budget: "transformEntities",
|
|
67
|
+
limit: this.maxEntities
|
|
68
|
+
});
|
|
69
|
+
let s = /* @__PURE__ */ new Map();
|
|
70
|
+
for (let e = 0; e < o.length; e++) {
|
|
71
|
+
let r = o[e];
|
|
72
|
+
(!Object.hasOwn(o, e) || !r || typeof r != "object") && n("Transform projection cannot contain holes");
|
|
73
|
+
let c = i(r.id);
|
|
74
|
+
s.has(c) && n("Transform projection identities must be unique");
|
|
75
|
+
let l = r.teleport ?? !1;
|
|
76
|
+
typeof l != "boolean" && n("Server teleport must be an explicit boolean");
|
|
77
|
+
let u = this.entries.get(c), d = u?.history.copy() ?? this.makeHistory(this.capacity);
|
|
78
|
+
d.push({
|
|
79
|
+
tick: t.tick,
|
|
80
|
+
timeMs: a,
|
|
81
|
+
transform: r.transform,
|
|
82
|
+
teleport: l
|
|
83
|
+
});
|
|
84
|
+
let f = {
|
|
85
|
+
tick: t.tick,
|
|
86
|
+
timeMs: a,
|
|
87
|
+
...r.data === void 0 ? {} : { data: structuredClone(r.data) }
|
|
88
|
+
};
|
|
89
|
+
s.set(c, {
|
|
90
|
+
history: d,
|
|
91
|
+
samples: [...u?.samples ?? [], f].slice(-this.capacity)
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
let c = this.previous ? [...this.jitter, Math.abs(t.receivedAt - this.previous.receivedAt - (a - this.previous.timeMs))].slice(-this.jitterWindow) : [];
|
|
95
|
+
this.entries = s, this.epoch = t.epoch, this.tick = t.tick, this.previous = {
|
|
96
|
+
timeMs: a,
|
|
97
|
+
receivedAt: t.receivedAt
|
|
98
|
+
}, this.jitter = c, this.currentError = null;
|
|
99
|
+
} catch (e) {
|
|
100
|
+
this.currentError = e;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
get error() {
|
|
104
|
+
return this.currentError;
|
|
105
|
+
}
|
|
106
|
+
delayMs() {
|
|
107
|
+
let e = [...this.jitter].sort((e, t) => e - t), t = e[Math.max(0, Math.ceil(e.length * .95) - 1)] ?? 0, n = Math.min(this.maxLossIntervals, Math.round(this.loss() * 10));
|
|
108
|
+
return Math.min(this.maxDelay, this.minDelay + t * this.jitterMultiplier + n * this.interval);
|
|
109
|
+
}
|
|
110
|
+
ids() {
|
|
111
|
+
return this.closing ? [] : [...this.entries.keys()].sort();
|
|
112
|
+
}
|
|
113
|
+
renderTime() {
|
|
114
|
+
if (this.closing) return null;
|
|
115
|
+
let e = this.serverTime();
|
|
116
|
+
return e === null ? null : r(e, "server render clock") - this.delayMs();
|
|
117
|
+
}
|
|
118
|
+
at(e, t) {
|
|
119
|
+
if (i(e), this.closing) return null;
|
|
120
|
+
let n = this.entries.get(e);
|
|
121
|
+
if (!n) return null;
|
|
122
|
+
let a = t === void 0 ? this.renderTime() : t;
|
|
123
|
+
if (a === null) return null;
|
|
124
|
+
let o = r(a, "render time"), s = n.history.at(o), c = n.samples[0];
|
|
125
|
+
for (let e of n.samples) {
|
|
126
|
+
if (e.timeMs > o) break;
|
|
127
|
+
c = e;
|
|
128
|
+
}
|
|
129
|
+
if (!s || !c) return null;
|
|
130
|
+
let { stale: l, transform: u } = s;
|
|
131
|
+
return {
|
|
132
|
+
epoch: this.epoch,
|
|
133
|
+
tick: c.tick,
|
|
134
|
+
transform: u,
|
|
135
|
+
stale: l,
|
|
136
|
+
...c.data === void 0 ? {} : { data: structuredClone(c.data) }
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
close() {
|
|
140
|
+
if (this.closed) return Promise.resolve();
|
|
141
|
+
if (this.closeTask) return this.closeTask;
|
|
142
|
+
this.closing = !0;
|
|
143
|
+
let e = Promise.resolve().then(() => this.release()).then(() => {
|
|
144
|
+
this.reset(), this.closed = !0;
|
|
145
|
+
}, (e) => {
|
|
146
|
+
throw this.currentError = e, e;
|
|
147
|
+
});
|
|
148
|
+
return this.closeTask = e, e.then(() => {
|
|
149
|
+
this.closeTask = null;
|
|
150
|
+
}, () => {
|
|
151
|
+
this.closeTask = null;
|
|
152
|
+
}), e;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
//#endregion
|
|
156
|
+
export { o as RoomTransformCollectionCore };
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { RoomAuthoringError as e } from "./errors.js";
|
|
2
|
+
//#region src/transformFrames.ts
|
|
3
|
+
function t(t) {
|
|
4
|
+
throw new e({
|
|
5
|
+
room: "transform-frames",
|
|
6
|
+
detail: t
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
var n = () => {
|
|
10
|
+
let e = globalThis;
|
|
11
|
+
return typeof e.requestAnimationFrame != "function" || typeof e.cancelAnimationFrame != "function" ? t("Native animation frames are unavailable in this runtime") : Object.freeze({
|
|
12
|
+
request: e.requestAnimationFrame.bind(globalThis),
|
|
13
|
+
cancel: e.cancelAnimationFrame.bind(globalThis)
|
|
14
|
+
});
|
|
15
|
+
}, r = class {
|
|
16
|
+
request;
|
|
17
|
+
cancel;
|
|
18
|
+
onFrame;
|
|
19
|
+
ticket = null;
|
|
20
|
+
callbackTask = null;
|
|
21
|
+
closingTask = null;
|
|
22
|
+
running = !1;
|
|
23
|
+
closing = !1;
|
|
24
|
+
closed = !1;
|
|
25
|
+
currentError = null;
|
|
26
|
+
constructor(e, r = n()) {
|
|
27
|
+
(typeof r.request != "function" || typeof r.cancel != "function" || typeof e != "function") && t("A frame callback and animation-frame port are required"), this.request = r.request.bind(r), this.cancel = r.cancel.bind(r), this.onFrame = e;
|
|
28
|
+
}
|
|
29
|
+
get error() {
|
|
30
|
+
return this.currentError;
|
|
31
|
+
}
|
|
32
|
+
get status() {
|
|
33
|
+
return this.closed ? "closed" : this.closing ? "closing" : this.currentError === null ? this.running ? "running" : "idle" : "failed";
|
|
34
|
+
}
|
|
35
|
+
start() {
|
|
36
|
+
if (this.closing && t("A closing frame loop cannot restart"), this.currentError !== null) throw this.currentError;
|
|
37
|
+
this.running || (this.running = !0, this.schedule());
|
|
38
|
+
}
|
|
39
|
+
schedule() {
|
|
40
|
+
if (!this.running || this.closing) return;
|
|
41
|
+
let n = !1, r = { id: null };
|
|
42
|
+
this.ticket = r;
|
|
43
|
+
try {
|
|
44
|
+
let i = this.request((i) => {
|
|
45
|
+
if (!n) {
|
|
46
|
+
this.currentError = new e({
|
|
47
|
+
room: "transform-frames",
|
|
48
|
+
detail: "Animation-frame port called synchronously"
|
|
49
|
+
}), this.running = !1;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (this.ticket !== r || (this.ticket = null, !this.running || this.closing)) return;
|
|
53
|
+
let a = Promise.resolve().then(async () => {
|
|
54
|
+
(!Number.isFinite(i) || i < 0) && t("Local frame observation must be finite and nonnegative"), await this.onFrame(i);
|
|
55
|
+
}).then(() => {
|
|
56
|
+
this.callbackTask === a && (this.callbackTask = null);
|
|
57
|
+
try {
|
|
58
|
+
this.schedule();
|
|
59
|
+
} catch (e) {
|
|
60
|
+
this.currentError = e, this.running = !1;
|
|
61
|
+
}
|
|
62
|
+
}, (e) => {
|
|
63
|
+
this.currentError = e, this.running = !1, this.callbackTask === a && (this.callbackTask = null);
|
|
64
|
+
});
|
|
65
|
+
this.callbackTask = a;
|
|
66
|
+
});
|
|
67
|
+
if (n = !0, (!Number.isSafeInteger(i) || i < 0) && t("Animation-frame identifier must be a nonnegative safe integer"), r.id = i, this.currentError !== null) {
|
|
68
|
+
let e = this.currentError;
|
|
69
|
+
try {
|
|
70
|
+
this.cancel(i);
|
|
71
|
+
} catch (t) {
|
|
72
|
+
throw AggregateError([e, t], "Frame admission and cleanup failed");
|
|
73
|
+
}
|
|
74
|
+
throw this.ticket = null, e;
|
|
75
|
+
}
|
|
76
|
+
} catch (e) {
|
|
77
|
+
throw this.running = !1, this.currentError = e, r.id === null && (this.ticket = null), e;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
close() {
|
|
81
|
+
if (this.closed) return Promise.resolve();
|
|
82
|
+
if (this.closingTask) return this.closingTask;
|
|
83
|
+
this.closing = !0, this.running = !1;
|
|
84
|
+
let e = Promise.resolve().then(async () => {
|
|
85
|
+
let e = this.ticket;
|
|
86
|
+
e !== null && e.id !== null && (this.cancel(e.id), this.ticket === e && (this.ticket = null)), await this.callbackTask, this.closed = !0;
|
|
87
|
+
});
|
|
88
|
+
return this.closingTask = e, e.then(() => {
|
|
89
|
+
this.closingTask = null;
|
|
90
|
+
}, (e) => {
|
|
91
|
+
this.currentError ??= e, this.closingTask = null;
|
|
92
|
+
}), e;
|
|
93
|
+
}
|
|
94
|
+
}, i = (e, n) => {
|
|
95
|
+
(typeof e.ids != "function" || typeof e.renderTime != "function" || typeof e.at != "function" || typeof n != "function") && t("A transform view and frame callback are required");
|
|
96
|
+
let r = e.ids.bind(e), i = e.renderTime.bind(e), a = e.at.bind(e);
|
|
97
|
+
return async (e) => {
|
|
98
|
+
let o = i();
|
|
99
|
+
o !== null && !Number.isFinite(o) && t("Server render time must be finite"), await n({
|
|
100
|
+
localTimeMs: e,
|
|
101
|
+
serverTimeMs: o,
|
|
102
|
+
entities: o === null ? [] : r().flatMap((e) => {
|
|
103
|
+
let t = a(e, o);
|
|
104
|
+
return t === null ? [] : [{
|
|
105
|
+
id: e,
|
|
106
|
+
sample: structuredClone(t)
|
|
107
|
+
}];
|
|
108
|
+
})
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
}, a = class extends r {
|
|
112
|
+
constructor(e, t, r = n()) {
|
|
113
|
+
super(i(e, t), r);
|
|
114
|
+
}
|
|
115
|
+
}, o = class extends r {
|
|
116
|
+
constructor(e, t, r = n()) {
|
|
117
|
+
super(i(e, t), r);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
//#endregion
|
|
121
|
+
export { r as RoomAnimationFrameLoop, a as RoomTransformFrameLoop2D, o as RoomTransformFrameLoop3D, n as browserRoomAnimationFrames };
|