@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,108 @@
|
|
|
1
|
+
import { ProtocolError as e } from "./errors.js";
|
|
2
|
+
import { captureWorldData as t } from "./worldData.js";
|
|
3
|
+
import { assertRoomSeatSecrets as n } from "./seats.js";
|
|
4
|
+
import { worldActorCanonicalJson as r } from "./worldActorReceipts.js";
|
|
5
|
+
import { worldGhostWireLayout as i } from "./worldGhostWire.js";
|
|
6
|
+
import { RoomControlTargetSchema as a } from "./controlCarrier.js";
|
|
7
|
+
import { Schema as o } from "effect";
|
|
8
|
+
import { randomUUID as s } from "node:crypto";
|
|
9
|
+
import { signSession as c, verifySessionKeyed as l } from "@voltro/protocol/session";
|
|
10
|
+
//#region src/worldGhostHandshake.ts
|
|
11
|
+
var u = o.NonEmptyString.pipe(o.check(o.isMaxLength(191))), d = o.Int.pipe(o.check(o.isGreaterThan(0))), f = o.Struct({
|
|
12
|
+
source: a,
|
|
13
|
+
target: a,
|
|
14
|
+
tenantId: u,
|
|
15
|
+
roomId: u,
|
|
16
|
+
epoch: d,
|
|
17
|
+
schemaHash: o.Int.pipe(o.check(o.isGreaterThanOrEqualTo(0)))
|
|
18
|
+
}), p = o.Struct({
|
|
19
|
+
...f.fields,
|
|
20
|
+
purpose: o.Literals(["voltro.rooms.ghost.hello.v1", "voltro.rooms.ghost.welcome.v1"]),
|
|
21
|
+
layout: o.Literal(i),
|
|
22
|
+
mount: u,
|
|
23
|
+
nonce: o.String.pipe(o.check(o.isPattern(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/))),
|
|
24
|
+
issuedAt: o.Int.pipe(o.check(o.isGreaterThanOrEqualTo(0))),
|
|
25
|
+
expiresAt: o.Int.pipe(o.check(o.isGreaterThanOrEqualTo(0)))
|
|
26
|
+
});
|
|
27
|
+
function m() {
|
|
28
|
+
throw new e({ detail: "World ghost process handshake refused" });
|
|
29
|
+
}
|
|
30
|
+
var h = (e) => {
|
|
31
|
+
let a = [
|
|
32
|
+
"projectControlSecrets",
|
|
33
|
+
"mount",
|
|
34
|
+
"epochNow",
|
|
35
|
+
"maxRequestMs",
|
|
36
|
+
"maxSignedBytes"
|
|
37
|
+
];
|
|
38
|
+
if (!e || Object.getPrototypeOf(e) !== Object.prototype || Reflect.ownKeys(e).length !== a.length || a.some((t) => {
|
|
39
|
+
let n = Object.getOwnPropertyDescriptor(e, t);
|
|
40
|
+
return !n?.enumerable || !("value" in n);
|
|
41
|
+
}) || typeof e.epochNow != "function") return m();
|
|
42
|
+
let d = t(e.projectControlSecrets, 16384), h = o.decodeUnknownSync(u)(e.mount), g = e.epochNow.bind(e), _ = e.maxRequestMs, v = e.maxSignedBytes;
|
|
43
|
+
if (n(d), !Number.isSafeInteger(_) || _ < 1 || _ > 6e4 || !Number.isSafeInteger(v) || v < 1024 || v > 65536) return m();
|
|
44
|
+
let y = () => {
|
|
45
|
+
let e = g();
|
|
46
|
+
return Number.isSafeInteger(e) && e >= 0 && e <= 2 ** 53 - 1 - _ ? e : m();
|
|
47
|
+
}, b = (e) => {
|
|
48
|
+
let n = o.decodeUnknownSync(p)(t(e, v), { onExcessProperty: "error" }), r = y();
|
|
49
|
+
return !Number.isSafeInteger(n.epoch) || n.epoch > 2147483647 || n.schemaHash > 4294967295 || ![
|
|
50
|
+
n.source.startedAt,
|
|
51
|
+
n.target.startedAt,
|
|
52
|
+
n.issuedAt,
|
|
53
|
+
n.expiresAt
|
|
54
|
+
].every(Number.isSafeInteger) || n.mount !== h || n.issuedAt > r || n.expiresAt <= r || n.expiresAt <= n.issuedAt || n.expiresAt - n.issuedAt > _ ? m() : t(n, v);
|
|
55
|
+
}, x = (e) => {
|
|
56
|
+
let t = b(e), n = y(), i = c({
|
|
57
|
+
type: "serviceAccount",
|
|
58
|
+
id: t.nonce,
|
|
59
|
+
tenantId: h,
|
|
60
|
+
auditActorId: null,
|
|
61
|
+
metadata: JSON.parse(r(t))
|
|
62
|
+
}, d.current, {
|
|
63
|
+
now: () => n,
|
|
64
|
+
ttlSeconds: Math.ceil((t.expiresAt - Math.floor(n / 1e3) * 1e3) / 1e3)
|
|
65
|
+
});
|
|
66
|
+
return Buffer.byteLength(i) > v ? m() : i;
|
|
67
|
+
}, S = (e, t) => {
|
|
68
|
+
if (typeof e != "string" || !e || Buffer.byteLength(e) > v) return m();
|
|
69
|
+
let n = l(e, d, { now: y });
|
|
70
|
+
if (!n || n.subject.type !== "serviceAccount" || n.subject.tenantId !== h) return m();
|
|
71
|
+
let r = b(n.subject.metadata);
|
|
72
|
+
return r.purpose !== t || n.subject.id !== r.nonce ? m() : r;
|
|
73
|
+
};
|
|
74
|
+
return Object.freeze({
|
|
75
|
+
hello: (e) => {
|
|
76
|
+
let n = o.decodeUnknownSync(f)(t(e, v), { onExcessProperty: "error" }), r = y(), a = b({
|
|
77
|
+
...n,
|
|
78
|
+
purpose: "voltro.rooms.ghost.hello.v1",
|
|
79
|
+
layout: i,
|
|
80
|
+
mount: h,
|
|
81
|
+
nonce: s(),
|
|
82
|
+
issuedAt: r,
|
|
83
|
+
expiresAt: r + _
|
|
84
|
+
});
|
|
85
|
+
return Object.freeze({
|
|
86
|
+
hello: a,
|
|
87
|
+
token: x(a)
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
readHello: (e) => S(e, "voltro.rooms.ghost.hello.v1"),
|
|
91
|
+
welcome: (e) => {
|
|
92
|
+
let t = b(e);
|
|
93
|
+
return t.purpose === "voltro.rooms.ghost.hello.v1" ? x({
|
|
94
|
+
...t,
|
|
95
|
+
purpose: "voltro.rooms.ghost.welcome.v1"
|
|
96
|
+
}) : m();
|
|
97
|
+
},
|
|
98
|
+
readWelcome: (e, t) => {
|
|
99
|
+
let n = b(t), i = S(e, "voltro.rooms.ghost.welcome.v1");
|
|
100
|
+
return n.purpose !== "voltro.rooms.ghost.hello.v1" || r({
|
|
101
|
+
...i,
|
|
102
|
+
purpose: n.purpose
|
|
103
|
+
}) !== r(n) ? m() : i;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
//#endregion
|
|
108
|
+
export { h as makeWorldGhostHandshake };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ProtocolError as e } from "./errors.js";
|
|
2
|
+
import { captureWorldData as t } from "./worldData.js";
|
|
3
|
+
import { makeWorldGhostReceiver as n } from "./worldGhostReceiver.js";
|
|
4
|
+
import { Effect as r } from "effect";
|
|
5
|
+
//#region src/worldGhostHost.ts
|
|
6
|
+
var i = (i, a) => {
|
|
7
|
+
let o = [
|
|
8
|
+
"tenantId",
|
|
9
|
+
"target",
|
|
10
|
+
"maxEntities",
|
|
11
|
+
"maxFrameBytes",
|
|
12
|
+
"maxRetainedBytes",
|
|
13
|
+
"ttlMs",
|
|
14
|
+
"now",
|
|
15
|
+
"authorizePeer"
|
|
16
|
+
];
|
|
17
|
+
if (!a || Object.getPrototypeOf(a) !== Object.prototype || Reflect.ownKeys(a).length !== o.length || o.some((e) => {
|
|
18
|
+
let t = Object.getOwnPropertyDescriptor(a, e);
|
|
19
|
+
return !t?.enumerable || !("value" in t);
|
|
20
|
+
}) || typeof a.authorizePeer != "function" || typeof a.now != "function") throw new e({ detail: "Host ghost receiver requires own acquired capabilities" });
|
|
21
|
+
let s = t(a.target, 4096), c = a.tenantId, l = a.maxFrameBytes, u = a.authorizePeer.bind(a), d = (t) => r.tryPromise({
|
|
22
|
+
try: t,
|
|
23
|
+
catch: () => new e({ detail: "Actual Host ghost operation remains incomplete" })
|
|
24
|
+
}), f = n({
|
|
25
|
+
tenantId: c,
|
|
26
|
+
roomId: s.roomId,
|
|
27
|
+
hostId: i.host.id,
|
|
28
|
+
epoch: s.epoch,
|
|
29
|
+
maxEntities: a.maxEntities,
|
|
30
|
+
maxFrameBytes: l,
|
|
31
|
+
maxRetainedBytes: a.maxRetainedBytes,
|
|
32
|
+
ttlMs: a.ttlMs,
|
|
33
|
+
now: a.now.bind(a),
|
|
34
|
+
authorizePeer: u,
|
|
35
|
+
admit: (e, t) => d(() => i.admitWorldNeighborGhost(s.roomId, c, s.epoch, s, e, t, l, u)),
|
|
36
|
+
apply: (e, t, n) => d(() => i.applyWorldNeighborGhost(s.roomId, c, s.epoch, s, e, t, l, u, n)),
|
|
37
|
+
remove: (e, t) => d(() => i.removeWorldNeighborGhost(s.roomId, c, s.epoch, e, t, l))
|
|
38
|
+
});
|
|
39
|
+
return i.ownWorldGhostReceiver(s.roomId, c, s.epoch, f, a.ttlMs);
|
|
40
|
+
};
|
|
41
|
+
//#endregion
|
|
42
|
+
export { i as makeRoomWorldGhostReceiver };
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { ProtocolError as e } from "./errors.js";
|
|
2
|
+
import { captureRoomTransportDataMethod as t } from "./transportAuthoring.js";
|
|
3
|
+
import { worldActorCanonicalJson as n } from "./worldActorReceipts.js";
|
|
4
|
+
import { captureWorldGhostWithdrawal as r } from "./worldGhostReceiver.js";
|
|
5
|
+
import { makeWorldGhostWireCodec as i } from "./worldGhostWire.js";
|
|
6
|
+
import { Effect as a } from "effect";
|
|
7
|
+
import { createHash as o } from "node:crypto";
|
|
8
|
+
//#region src/worldGhostIngress.ts
|
|
9
|
+
var s = () => new e({ detail: "World ghost ingress remains incomplete" }), c = (e, c) => {
|
|
10
|
+
let l = [
|
|
11
|
+
"state",
|
|
12
|
+
"maxEntities",
|
|
13
|
+
"maxRetainedBytes",
|
|
14
|
+
"maxFrameBytes",
|
|
15
|
+
"maxHeaderBytes",
|
|
16
|
+
"maxSnapshotBytes",
|
|
17
|
+
"receive"
|
|
18
|
+
];
|
|
19
|
+
if (!c || Object.getPrototypeOf(c) !== Object.prototype || Reflect.ownKeys(c).some((e) => typeof e != "string" || ![...l, "withdraw"].includes(e)) || l.some((e) => {
|
|
20
|
+
let t = Object.getOwnPropertyDescriptor(c, e);
|
|
21
|
+
return !t?.enumerable || !("value" in t);
|
|
22
|
+
}) || typeof c.receive != "function" || e.name !== "ws" || e.signal.aborted || !Number.isSafeInteger(c.maxEntities) || c.maxEntities < 1 || c.maxEntities > 4096 || !Number.isSafeInteger(c.maxRetainedBytes) || c.maxRetainedBytes < 1 || c.maxRetainedBytes > 67108864) throw s();
|
|
23
|
+
let u = Object.getOwnPropertyDescriptor(c, "withdraw");
|
|
24
|
+
if (u && (!("value" in u) || typeof u.value != "function") || !u && "withdraw" in c) throw s();
|
|
25
|
+
let d = u ? c.withdraw.bind(c) : void 0, f = c.maxEntities, p = c.maxRetainedBytes, m = c.maxFrameBytes, h = c.receive.bind(c), g = i(c.state, {
|
|
26
|
+
maxFrameBytes: m,
|
|
27
|
+
maxHeaderBytes: c.maxHeaderBytes,
|
|
28
|
+
maxSnapshotBytes: c.maxSnapshotBytes
|
|
29
|
+
}), _ = t(e.reliable, "onFrame", "Ghost ingress requires actual WS listener"), v = t(e.reliable, "send", "Ghost ingress requires actual bounded WS writer"), y = t(e, "close", "Ghost ingress requires actual WS withdrawal"), b = /* @__PURE__ */ new Map(), x = 0, S, C, w, T = !1, E, D = !1, O, k = async (e, t) => {
|
|
30
|
+
let n = new TextEncoder().encode(JSON.stringify({
|
|
31
|
+
entityId: t.frame.capture.entityId,
|
|
32
|
+
sequence: t.frame.sequence,
|
|
33
|
+
digest: t.digest
|
|
34
|
+
}));
|
|
35
|
+
if (n.length > 1024) throw s();
|
|
36
|
+
let r = new Uint8Array(n.length + 1);
|
|
37
|
+
r[0] = e, r.set(n, 1), D = !0, await v(r);
|
|
38
|
+
}, A = async (e) => {
|
|
39
|
+
let t = e.subarray(1), i = e[0] === 4 ? r(JSON.parse(new TextDecoder("utf-8", { fatal: !0 }).decode(t))) : void 0, c = i ?? g.inspect(t), l = o("sha256").update(t).digest("hex"), u = b.get(c.entityId), m;
|
|
40
|
+
if (u && u.frame.sequence === c.sequence) {
|
|
41
|
+
if (u.digest !== l || !!u.withdrawal != !!i) throw s();
|
|
42
|
+
m = u;
|
|
43
|
+
} else {
|
|
44
|
+
if (u && (!u.applied || u.frame.sequence >= c.sequence) || !u && b.size >= f || i && (!d || !u || u.withdrawal || i.baseSequence !== u.frame.sequence || i.sourceRoomId !== u.frame.capture.source.roomId || i.sourceEpoch !== u.frame.capture.source.epoch)) throw s();
|
|
45
|
+
let e = i ? {
|
|
46
|
+
...u.frame,
|
|
47
|
+
sequence: i.sequence
|
|
48
|
+
} : g.decode(t, u?.withdrawal ? void 0 : u?.frame), r = new TextEncoder().encode(n(e)).length;
|
|
49
|
+
if (x - (u?.bytes ?? 0) + r > p) throw s();
|
|
50
|
+
m = {
|
|
51
|
+
frame: e,
|
|
52
|
+
digest: l,
|
|
53
|
+
bytes: r,
|
|
54
|
+
...i ? { withdrawal: i } : {},
|
|
55
|
+
applied: !1
|
|
56
|
+
}, b.set(c.entityId, m), x += r - (u?.bytes ?? 0);
|
|
57
|
+
}
|
|
58
|
+
if (!m.applied) try {
|
|
59
|
+
let e = m.withdrawal ? d(m.withdrawal) : h(m.frame);
|
|
60
|
+
if (!a.isEffect(e)) throw s();
|
|
61
|
+
let t = await a.runPromise(e);
|
|
62
|
+
if (t !== "applied" && t !== "duplicate") throw s();
|
|
63
|
+
m.applied = !0;
|
|
64
|
+
} catch {
|
|
65
|
+
T || await k(3, m);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
T || await k(2, m);
|
|
69
|
+
}, j = (e) => {
|
|
70
|
+
E ??= e, T = !0, O = void 0;
|
|
71
|
+
try {
|
|
72
|
+
y(1008, "World ghost channel refused");
|
|
73
|
+
} catch (e) {
|
|
74
|
+
E = e;
|
|
75
|
+
}
|
|
76
|
+
}, M = () => {
|
|
77
|
+
T = !0, O = void 0;
|
|
78
|
+
}, N = () => {
|
|
79
|
+
if (T = !0, O = void 0, w) return w;
|
|
80
|
+
let t = (async () => {
|
|
81
|
+
S && await S.catch(() => void 0), C &&= (C(), void 0), e.signal.removeEventListener("abort", M), b.clear(), x = 0;
|
|
82
|
+
})();
|
|
83
|
+
return w = t, t.catch(() => {
|
|
84
|
+
w === t && (w = void 0);
|
|
85
|
+
}), t;
|
|
86
|
+
}, P = (e) => {
|
|
87
|
+
D = !1;
|
|
88
|
+
let t = Promise.resolve().then(() => A(e));
|
|
89
|
+
S = t, t.then(() => {
|
|
90
|
+
S === t && (S = void 0);
|
|
91
|
+
let e = O;
|
|
92
|
+
O = void 0, e && !T && P(e);
|
|
93
|
+
}, (e) => {
|
|
94
|
+
S === t && (S = void 0), j(e);
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
e.signal.addEventListener("abort", M, { once: !0 });
|
|
98
|
+
try {
|
|
99
|
+
let t = _((e) => {
|
|
100
|
+
if (!T) {
|
|
101
|
+
if (!(e instanceof Uint8Array) || e.length < 2 || e.length > m + 1 || e[0] !== 1 && e[0] !== 4 || e[0] === 4 && e.length > 1025) j(s());
|
|
102
|
+
else if (S) {
|
|
103
|
+
if (!D || O) {
|
|
104
|
+
j(s());
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
O = Uint8Array.from(e);
|
|
108
|
+
} else P(Uint8Array.from(e));
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
if (typeof t != "function") throw s();
|
|
112
|
+
C = t, e.signal.aborted && M();
|
|
113
|
+
} catch (t) {
|
|
114
|
+
throw j(t), e.signal.removeEventListener("abort", M), t;
|
|
115
|
+
}
|
|
116
|
+
return Object.freeze({
|
|
117
|
+
close: N,
|
|
118
|
+
settled: async () => {
|
|
119
|
+
for (; S;) await S;
|
|
120
|
+
if (E !== void 0) throw E;
|
|
121
|
+
},
|
|
122
|
+
snapshot: () => Object.freeze({
|
|
123
|
+
retained: b.size,
|
|
124
|
+
retainedBytes: x,
|
|
125
|
+
busy: S !== void 0,
|
|
126
|
+
queuedBytes: O?.byteLength ?? 0,
|
|
127
|
+
fenced: T
|
|
128
|
+
})
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
//#endregion
|
|
132
|
+
export { c as bindWorldGhostIngress };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { BudgetExceeded as e, ProtocolError as t } from "./errors.js";
|
|
2
|
+
import { captureWorldData as n } from "./worldData.js";
|
|
3
|
+
import { worldBoundsShareEdge as r } from "./worldTransitions.js";
|
|
4
|
+
import { captureWorldCatalog as i, worldCellAt as a } from "./world.js";
|
|
5
|
+
//#region src/worldGhostNeighborhood.ts
|
|
6
|
+
var o = (o) => {
|
|
7
|
+
let s = () => {
|
|
8
|
+
throw new t({ detail: "World ghost neighborhood requires bounded declared coordinates" });
|
|
9
|
+
}, c = [
|
|
10
|
+
"world",
|
|
11
|
+
"maxZoneChecks",
|
|
12
|
+
"maxCandidateCells"
|
|
13
|
+
];
|
|
14
|
+
(!o || Object.getPrototypeOf(o) !== Object.prototype || Reflect.ownKeys(o).length !== c.length || c.some((e) => {
|
|
15
|
+
let t = Object.getOwnPropertyDescriptor(o, e);
|
|
16
|
+
return !t?.enumerable || !("value" in t);
|
|
17
|
+
})) && s();
|
|
18
|
+
let l = i([o.world])[0], u = o.maxZoneChecks, d = o.maxCandidateCells;
|
|
19
|
+
if ((!Number.isSafeInteger(u) || u < 1 || u > 65536 || !Number.isSafeInteger(d) || d < 1 || d > 65536) && s(), l.zones.length > u) throw new e({
|
|
20
|
+
budget: "worldGhostZones",
|
|
21
|
+
limit: u
|
|
22
|
+
});
|
|
23
|
+
return (t) => {
|
|
24
|
+
let i = n(t, 4096);
|
|
25
|
+
if (Object.keys(i).sort().join(",") !== "at,layer,zone" || !Number.isSafeInteger(i.layer) || i.layer < 1) return s();
|
|
26
|
+
let o = a(l, {
|
|
27
|
+
zone: i.zone,
|
|
28
|
+
at: i.at
|
|
29
|
+
}), c = l.zones.find((e) => e.id === o.zone);
|
|
30
|
+
if (i.layer > 1 && !c.layering) return s();
|
|
31
|
+
let u = l.handoff.ghostUnits, f = [], p = 0;
|
|
32
|
+
for (let t of l.zones) {
|
|
33
|
+
if (t.id !== o.zone && !c.neighbors.includes(t.id) || i.layer > 1 && !t.layering) continue;
|
|
34
|
+
let n = Math.max(t.bounds[0][0], o.bounds[0][0], i.at[0] - u), r = Math.min(t.bounds[1][0], o.bounds[1][0], i.at[0] + u), a = Math.max(t.bounds[0][1], o.bounds[0][1], i.at[1] - u), s = Math.min(t.bounds[1][1], o.bounds[1][1], i.at[1] + u);
|
|
35
|
+
if (n > r || a > s) continue;
|
|
36
|
+
let l = t.cells?.size ?? Math.max(t.bounds[1][0] - t.bounds[0][0], t.bounds[1][1] - t.bounds[0][1]), m = Math.ceil((t.bounds[1][0] - t.bounds[0][0]) / l), h = Math.ceil((t.bounds[1][1] - t.bounds[0][1]) / l), g = Math.max(0, Math.floor((n - t.bounds[0][0]) / l) - 1), _ = Math.min(m - 1, Math.floor((r - t.bounds[0][0]) / l)), v = Math.max(0, Math.floor((a - t.bounds[0][1]) / l) - 1), y = Math.min(h - 1, Math.floor((s - t.bounds[0][1]) / l)), b = (_ - g + 1) * (y - v + 1);
|
|
37
|
+
if (!Number.isSafeInteger(b) || b > d - p) throw new e({
|
|
38
|
+
budget: "worldGhostCandidateCells",
|
|
39
|
+
limit: d
|
|
40
|
+
});
|
|
41
|
+
p += b, f.push({
|
|
42
|
+
zone: t,
|
|
43
|
+
size: l,
|
|
44
|
+
firstX: g,
|
|
45
|
+
lastX: _,
|
|
46
|
+
firstY: v,
|
|
47
|
+
lastY: y
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
let m = [];
|
|
51
|
+
for (let e of f) for (let t = e.firstX; t <= e.lastX; t++) for (let n = e.firstY; n <= e.lastY; n++) {
|
|
52
|
+
let c = a(l, {
|
|
53
|
+
zone: e.zone.id,
|
|
54
|
+
at: [e.zone.bounds[0][0] + t * e.size, e.zone.bounds[0][1] + n * e.size]
|
|
55
|
+
});
|
|
56
|
+
if (c.column !== t || c.row !== n) return s();
|
|
57
|
+
if (c.id === o.id || !r(o.bounds, c.bounds)) continue;
|
|
58
|
+
let d = Math.max(c.bounds[0][0] - i.at[0], 0, i.at[0] - c.bounds[1][0]), f = Math.max(c.bounds[0][1] - i.at[1], 0, i.at[1] - c.bounds[1][1]), p = Math.hypot(d, f);
|
|
59
|
+
!Number.isFinite(p) || p > u || m.push(Object.freeze({
|
|
60
|
+
cell: c,
|
|
61
|
+
layer: i.layer,
|
|
62
|
+
distance: p,
|
|
63
|
+
prepare: p <= l.handoff.marginUnits
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
return m.sort((e, t) => (e.cell.zone < t.cell.zone ? -1 : +(e.cell.zone > t.cell.zone)) || e.cell.row - t.cell.row || e.cell.column - t.cell.column), Object.freeze(m);
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
//#endregion
|
|
70
|
+
export { o as makeWorldGhostNeighborhood };
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { ProtocolError as e } from "./errors.js";
|
|
2
|
+
import { captureWorldData as t } from "./worldData.js";
|
|
3
|
+
import { makeWorldGhostNeighborhood as n } from "./worldGhostNeighborhood.js";
|
|
4
|
+
import { captureWorldCatalog as r, worldCellAt as i } from "./world.js";
|
|
5
|
+
import { dataStoreWorldCells as a } from "./worldCells.js";
|
|
6
|
+
import { Effect as o } from "effect";
|
|
7
|
+
//#region src/worldGhostNeighbors.ts
|
|
8
|
+
var s = (s, c) => {
|
|
9
|
+
let l = () => {
|
|
10
|
+
throw new e({ detail: "Ghost neighbor observation lost declared source ownership" });
|
|
11
|
+
}, u = [
|
|
12
|
+
"tenantId",
|
|
13
|
+
"world",
|
|
14
|
+
"epochNow",
|
|
15
|
+
"maxZoneChecks",
|
|
16
|
+
"maxCandidateCells",
|
|
17
|
+
"maxObservationBytes",
|
|
18
|
+
"authorize"
|
|
19
|
+
];
|
|
20
|
+
(!c || Object.getPrototypeOf(c) !== Object.prototype || Reflect.ownKeys(c).length !== u.length || u.some((e) => {
|
|
21
|
+
let t = Object.getOwnPropertyDescriptor(c, e);
|
|
22
|
+
return !t?.enumerable || !("value" in t);
|
|
23
|
+
})) && l();
|
|
24
|
+
let d = r([c.world])[0], f = c.tenantId, p = c.maxObservationBytes;
|
|
25
|
+
(typeof f != "string" || !/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,190}$/.test(f) || typeof c.epochNow != "function" || typeof c.authorize != "function" || !Number.isSafeInteger(p) || p < 1 || p > 16777216) && l();
|
|
26
|
+
let m = n({
|
|
27
|
+
world: d,
|
|
28
|
+
maxZoneChecks: c.maxZoneChecks,
|
|
29
|
+
maxCandidateCells: c.maxCandidateCells
|
|
30
|
+
}), h = c.authorize.bind(c), g = c.epochNow.bind(c);
|
|
31
|
+
return Object.freeze({ observe: (n) => o.suspend(() => {
|
|
32
|
+
let e = t(n, 4096);
|
|
33
|
+
if (Object.keys(e).sort().join(",") !== "at,epoch,hostId,layer,roomId,tenantId,worldId,zoneId" || e.tenantId !== f || e.worldId !== d.name || typeof e.hostId != "string" || !e.hostId || typeof e.roomId != "string" || !e.roomId || !Number.isSafeInteger(e.epoch) || e.epoch < 1) return l();
|
|
34
|
+
let r = m({
|
|
35
|
+
zone: e.zoneId,
|
|
36
|
+
at: e.at,
|
|
37
|
+
layer: e.layer
|
|
38
|
+
}), c = i(d, {
|
|
39
|
+
zone: e.zoneId,
|
|
40
|
+
at: e.at
|
|
41
|
+
}), u = {
|
|
42
|
+
tenantId: f,
|
|
43
|
+
worldId: d.name,
|
|
44
|
+
zoneId: e.zoneId,
|
|
45
|
+
cellId: c.id,
|
|
46
|
+
layer: e.layer
|
|
47
|
+
}, _ = (t) => o.suspend(() => {
|
|
48
|
+
let n = h(Object.freeze({
|
|
49
|
+
source: e,
|
|
50
|
+
target: t
|
|
51
|
+
}));
|
|
52
|
+
return o.isEffect(n) ? n : l();
|
|
53
|
+
}), v = a(s, {
|
|
54
|
+
worlds: [d],
|
|
55
|
+
epochNow: g,
|
|
56
|
+
maxListedCells: 1,
|
|
57
|
+
authorize: () => o.void
|
|
58
|
+
}), y = () => _(null).pipe(o.flatMap(() => v.observe(u)), o.map((t) => !t || t.state !== "live" || t.hostId !== e.hostId || t.roomId !== e.roomId || t.epoch !== e.epoch ? l() : t));
|
|
59
|
+
return o.gen(function* () {
|
|
60
|
+
let e = yield* y(), n = [];
|
|
61
|
+
for (let t of r) {
|
|
62
|
+
let r = Object.freeze({
|
|
63
|
+
tenantId: f,
|
|
64
|
+
worldId: d.name,
|
|
65
|
+
zoneId: t.cell.zone,
|
|
66
|
+
cellId: t.cell.id,
|
|
67
|
+
layer: t.layer
|
|
68
|
+
});
|
|
69
|
+
yield* _(r);
|
|
70
|
+
let i = yield* v.inspect(r);
|
|
71
|
+
if (i?.roomId === e.roomId) return l();
|
|
72
|
+
n.push(Object.freeze({
|
|
73
|
+
...t,
|
|
74
|
+
placement: i
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
let i = yield* y();
|
|
78
|
+
return i.id !== e.id || i.revision !== e.revision ? l() : t({
|
|
79
|
+
source: i,
|
|
80
|
+
neighbors: n
|
|
81
|
+
}, p);
|
|
82
|
+
});
|
|
83
|
+
}).pipe(o.catchCause(() => o.fail(new e({ detail: "Ghost neighbor observation remains incomplete" })))) });
|
|
84
|
+
};
|
|
85
|
+
//#endregion
|
|
86
|
+
export { s as dataStoreWorldGhostNeighbors };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { ProtocolError as e } from "./errors.js";
|
|
2
|
+
import { simulationOwnData as t } from "./simulationAuthoring.js";
|
|
3
|
+
import { captureWorldData as n } from "./worldData.js";
|
|
4
|
+
import { captureRoomTransportClock as r, captureRoomTransportDataMethod as i } from "./transportAuthoring.js";
|
|
5
|
+
import { RoomTransportCleanupFailure as a } from "./transportCleanup.js";
|
|
6
|
+
//#region src/worldGhostOutbound.ts
|
|
7
|
+
var o = (e) => {
|
|
8
|
+
let a = [
|
|
9
|
+
"carrier",
|
|
10
|
+
"sender",
|
|
11
|
+
"socket",
|
|
12
|
+
"path",
|
|
13
|
+
"handshakeTimeoutMs",
|
|
14
|
+
"maxSignedBytes",
|
|
15
|
+
"authorize"
|
|
16
|
+
];
|
|
17
|
+
t(e, a, a);
|
|
18
|
+
let o = t(e.socket, [
|
|
19
|
+
"factory",
|
|
20
|
+
"clock",
|
|
21
|
+
"connectTimeoutMs",
|
|
22
|
+
"drainPollMs",
|
|
23
|
+
"maxFrameBytes",
|
|
24
|
+
"maxPendingBytes",
|
|
25
|
+
"maxPendingFrames",
|
|
26
|
+
"highWaterBytes",
|
|
27
|
+
"maxListeners"
|
|
28
|
+
], []), s = e.carrier;
|
|
29
|
+
return Object.freeze({
|
|
30
|
+
path: e.path,
|
|
31
|
+
handshakeTimeoutMs: e.handshakeTimeoutMs,
|
|
32
|
+
maxSignedBytes: e.maxSignedBytes,
|
|
33
|
+
sender: n(e.sender, 1024),
|
|
34
|
+
socket: Object.freeze({
|
|
35
|
+
...o,
|
|
36
|
+
...o.clock ? { clock: r(o.clock) } : {},
|
|
37
|
+
...o.factory ? { factory: i(o, "factory", "Ghost socket requires captured factory") } : {}
|
|
38
|
+
}),
|
|
39
|
+
carrier: Object.freeze({
|
|
40
|
+
hello: i(s, "hello", "Ghost sender requires signed Hello"),
|
|
41
|
+
readHello: i(s, "readHello", "Ghost sender requires Hello verification"),
|
|
42
|
+
welcome: i(s, "welcome", "Ghost sender requires Welcome signing"),
|
|
43
|
+
readWelcome: i(s, "readWelcome", "Ghost sender requires Welcome verification")
|
|
44
|
+
}),
|
|
45
|
+
authorize: i(e, "authorize", "Ghost destination requires current policy")
|
|
46
|
+
});
|
|
47
|
+
}, s = (t) => {
|
|
48
|
+
let r = t.current.bind(t), i = t.validate.bind(t), o = t.acquire.bind(t), s = t.release.bind(t), c = t.maxSnapshotBytes, l = new AbortController(), u = "opening", d, f, p, m, h = () => new e({ detail: "Source World ghost channel no longer has current ownership" }), g, _ = () => {
|
|
49
|
+
if (u === "closed") return Promise.resolve();
|
|
50
|
+
if (u = "closing", l.abort(), p) return p;
|
|
51
|
+
let e = Promise.resolve().then(async () => {
|
|
52
|
+
await g.catch(() => void 0);
|
|
53
|
+
let e = [];
|
|
54
|
+
try {
|
|
55
|
+
await d?.close();
|
|
56
|
+
} catch (t) {
|
|
57
|
+
e.push(t);
|
|
58
|
+
}
|
|
59
|
+
if (m && await m.catch(() => void 0), f instanceof a) try {
|
|
60
|
+
await f.cleanupAsync(), f = void 0;
|
|
61
|
+
} catch (t) {
|
|
62
|
+
e.push(t);
|
|
63
|
+
}
|
|
64
|
+
if (e.length) throw AggregateError(e, "Source ghost channel cleanup remains incomplete");
|
|
65
|
+
s(), u = "closed";
|
|
66
|
+
});
|
|
67
|
+
return p = e, e.catch(() => {
|
|
68
|
+
p === e && (p = void 0);
|
|
69
|
+
}), e;
|
|
70
|
+
};
|
|
71
|
+
return g = Promise.resolve().then(async () => {
|
|
72
|
+
try {
|
|
73
|
+
if (l.signal.aborted || (await r(), l.signal.aborted) || (d = await o(l.signal), await r(), l.signal.aborted)) throw h();
|
|
74
|
+
u = "ready";
|
|
75
|
+
let e = (e) => {
|
|
76
|
+
if (u !== "ready" || m) return Promise.reject(h());
|
|
77
|
+
let t = Promise.resolve().then(async () => {
|
|
78
|
+
if (await r(), u !== "ready" || (await e(), await r(), u !== "ready")) throw h();
|
|
79
|
+
});
|
|
80
|
+
return m = t, t.then(() => {
|
|
81
|
+
m === t && (m = void 0);
|
|
82
|
+
}, () => {
|
|
83
|
+
m === t && (m = void 0);
|
|
84
|
+
}), t;
|
|
85
|
+
};
|
|
86
|
+
return Object.freeze({
|
|
87
|
+
close: _,
|
|
88
|
+
snapshot: d.snapshot,
|
|
89
|
+
withdraw: (t, n) => e(() => d.withdraw(t, n)),
|
|
90
|
+
send: (t) => {
|
|
91
|
+
let r;
|
|
92
|
+
try {
|
|
93
|
+
r = n(t, c), i(r);
|
|
94
|
+
} catch (e) {
|
|
95
|
+
return Promise.reject(e);
|
|
96
|
+
}
|
|
97
|
+
return e(() => d.send(r));
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
} catch (e) {
|
|
101
|
+
throw f = e, u !== "closing" && (u = "failed"), e;
|
|
102
|
+
}
|
|
103
|
+
}), g.catch(() => void 0), Object.freeze({
|
|
104
|
+
ready: g,
|
|
105
|
+
close: _,
|
|
106
|
+
status: () => u
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
//#endregion
|
|
110
|
+
export { o as captureRoomWorldGhostOutboundOptions, s as ownWorldGhostOutbound };
|