@voltro/plugin-rooms 0.0.0-stage → 0.88.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.
Files changed (495) hide show
  1. package/CHANGELOG.md +24492 -0
  2. package/LICENSE +61 -0
  3. package/README.md +9204 -2
  4. package/SECURITY.md +56 -0
  5. package/THIRD-PARTY-NOTICES.md +12496 -0
  6. package/dist/actor.js +1473 -0
  7. package/dist/apiBinding.js +677 -0
  8. package/dist/apiRegistryBinding.js +398 -0
  9. package/dist/apiReservations.js +432 -0
  10. package/dist/baselines.js +72 -0
  11. package/dist/bots.d.ts +1485 -0
  12. package/dist/bots.js +562 -0
  13. package/dist/catalog.js +79 -0
  14. package/dist/checkpointJson.js +23 -0
  15. package/dist/checkpointStore.js +385 -0
  16. package/dist/client.js +55 -0
  17. package/dist/clockSync.js +50 -0
  18. package/dist/collision.js +155 -0
  19. package/dist/commandDelivery.js +100 -0
  20. package/dist/commandRecord.js +10 -0
  21. package/dist/commandWithdrawal.js +182 -0
  22. package/dist/connection.js +496 -0
  23. package/dist/controlCarrier.js +374 -0
  24. package/dist/controlRegistry.js +78 -0
  25. package/dist/controlTarget.js +44 -0
  26. package/dist/controlTransport.js +573 -0
  27. package/dist/developmentBinding.js +112 -0
  28. package/dist/directory.js +322 -0
  29. package/dist/directoryProjection.js +116 -0
  30. package/dist/errors.d.ts +125 -0
  31. package/dist/errors.js +52 -0
  32. package/dist/fixed.d.ts +284 -0
  33. package/dist/fixed.js +10 -0
  34. package/dist/fixed32.js +133 -0
  35. package/dist/fixedCollision.js +59 -0
  36. package/dist/fixedCollision32.js +108 -0
  37. package/dist/fixedMath.js +55 -0
  38. package/dist/fixedRaw.js +10 -0
  39. package/dist/fixedSlabs.js +33 -0
  40. package/dist/fixedTrig.js +47 -0
  41. package/dist/fixedTrig32.js +37 -0
  42. package/dist/fixedVectors.js +112 -0
  43. package/dist/fixedVectors32.js +94 -0
  44. package/dist/fixedWide.js +49 -0
  45. package/dist/fixedWords.js +45 -0
  46. package/dist/gateway.js +56 -0
  47. package/dist/geometry-retention-app/rooms.geometryJournalRetention.workflow.server.tsx +4 -0
  48. package/dist/geometry-retention-app/rooms.geometryJournalRetention.workflow.tsx +14 -0
  49. package/dist/geometry-worker/worker.d.mts +2 -0
  50. package/dist/geometry-worker/worker.mjs +50 -0
  51. package/dist/geometry.d.ts +2249 -0
  52. package/dist/geometry.js +40 -0
  53. package/dist/geometryActivation.js +81 -0
  54. package/dist/geometryActorInventory.js +107 -0
  55. package/dist/geometryAdminClient.js +86 -0
  56. package/dist/geometryAdminData.js +31 -0
  57. package/dist/geometryAdminFixtures.js +49 -0
  58. package/dist/geometryAdminPorts.js +4 -0
  59. package/dist/geometryAdminRpc.js +57 -0
  60. package/dist/geometryAdminRpcRoutes.js +48 -0
  61. package/dist/geometryAdminSchemas.js +38 -0
  62. package/dist/geometryAdministration.js +189 -0
  63. package/dist/geometryAdministrationPorts.js +4 -0
  64. package/dist/geometryApiBinding.js +164 -0
  65. package/dist/geometryAppStorage.js +57 -0
  66. package/dist/geometryArtifacts.js +197 -0
  67. package/dist/geometryAssetBundle.js +116 -0
  68. package/dist/geometryAssetClient.js +24 -0
  69. package/dist/geometryAssetData.js +105 -0
  70. package/dist/geometryAssetHttp.js +122 -0
  71. package/dist/geometryAssetPorts.js +4 -0
  72. package/dist/geometryAssetRpc.js +29 -0
  73. package/dist/geometryAssetRpcRoutes.js +39 -0
  74. package/dist/geometryAssetStorageGrant.js +102 -0
  75. package/dist/geometryBoxOverlap.js +109 -0
  76. package/dist/geometryCatalogueDigest.js +110 -0
  77. package/dist/geometryCellCoverage.js +84 -0
  78. package/dist/geometryCellLoader.js +27 -0
  79. package/dist/geometryChannel.js +133 -0
  80. package/dist/geometryChunkHttp.js +53 -0
  81. package/dist/geometryChunkLeases.js +21 -0
  82. package/dist/geometryClient.d.ts +1429 -0
  83. package/dist/geometryClient.js +148 -0
  84. package/dist/geometryClientChunks.js +329 -0
  85. package/dist/geometryClientDelta.js +24 -0
  86. package/dist/geometryClientHttp.js +36 -0
  87. package/dist/geometryClientInterest.js +108 -0
  88. package/dist/geometryClientStatic.js +33 -0
  89. package/dist/geometryCms.d.ts +763 -0
  90. package/dist/geometryCms.js +216 -0
  91. package/dist/geometryCommitCoordinator.js +240 -0
  92. package/dist/geometryCompactionFixture.js +83 -0
  93. package/dist/geometryCompactionStrategies.js +37 -0
  94. package/dist/geometryConnectionClient.js +22 -0
  95. package/dist/geometryDerivationFixtures.js +140 -0
  96. package/dist/geometryDerivationStrategies.js +26 -0
  97. package/dist/geometryDigest.js +12 -0
  98. package/dist/geometryEditChannel.js +69 -0
  99. package/dist/geometryEditIngress.js +262 -0
  100. package/dist/geometryEdits.js +365 -0
  101. package/dist/geometryEnvelope.js +40 -0
  102. package/dist/geometryGridRaycast.js +91 -0
  103. package/dist/geometryGridSweep.js +91 -0
  104. package/dist/geometryHeightfield.js +165 -0
  105. package/dist/geometryHeightfieldRaycast.js +73 -0
  106. package/dist/geometryHeightfieldSweep.js +84 -0
  107. package/dist/geometryHeightfieldVolume.js +44 -0
  108. package/dist/geometryHost.js +321 -0
  109. package/dist/geometryHostDirectory.js +206 -0
  110. package/dist/geometryHostMutations.js +136 -0
  111. package/dist/geometryHostStreams.js +123 -0
  112. package/dist/geometryHttpBody.js +75 -0
  113. package/dist/geometryHttpRoutes.js +111 -0
  114. package/dist/geometryImportGltf.js +299 -0
  115. package/dist/geometryImportLdtk.js +53 -0
  116. package/dist/geometryImportPng.js +143 -0
  117. package/dist/geometryImportPublication.js +66 -0
  118. package/dist/geometryImportTiled.js +38 -0
  119. package/dist/geometryImportTiles.js +135 -0
  120. package/dist/geometryImportVox.js +129 -0
  121. package/dist/geometryImportedSource.js +100 -0
  122. package/dist/geometryInspectEndpoint.js +247 -0
  123. package/dist/geometryInspection.js +91 -0
  124. package/dist/geometryInstall.js +120 -0
  125. package/dist/geometryJournalArchiveData.js +20 -0
  126. package/dist/geometryJournalArchiveIndex.js +329 -0
  127. package/dist/geometryJournalArchiveTable.js +20 -0
  128. package/dist/geometryJournalCompaction.js +99 -0
  129. package/dist/geometryJournalPatch.js +46 -0
  130. package/dist/geometryJournalRetention.js +111 -0
  131. package/dist/geometryJournalRetentionSchemas.js +35 -0
  132. package/dist/geometryJournalRetentionSweep.js +111 -0
  133. package/dist/geometryJournalRetentionWorkflow.js +27 -0
  134. package/dist/geometryJournalRetentionWorkflowData.js +30 -0
  135. package/dist/geometryJournalStorage.js +147 -0
  136. package/dist/geometryLoader.js +117 -0
  137. package/dist/geometryManifest.js +112 -0
  138. package/dist/geometryManifestChannel.js +92 -0
  139. package/dist/geometryManifestClient.js +121 -0
  140. package/dist/geometryManifestData.js +48 -0
  141. package/dist/geometryManifestPorts.js +4 -0
  142. package/dist/geometryManifestPublication.js +108 -0
  143. package/dist/geometryManifestSource.js +67 -0
  144. package/dist/geometryMigrationJournal.js +13 -0
  145. package/dist/geometryMigrationStrategies.js +6 -0
  146. package/dist/geometryMigrations.js +322 -0
  147. package/dist/geometryNativeMetadata.js +51 -0
  148. package/dist/geometryPatch.js +169 -0
  149. package/dist/geometryPersistence.js +448 -0
  150. package/dist/geometryPersistenceCapture.js +68 -0
  151. package/dist/geometryPersistenceData.js +139 -0
  152. package/dist/geometryPersistencePorts.js +4 -0
  153. package/dist/geometryPlayerAdmission.js +33 -0
  154. package/dist/geometryPlayerEditOwner.js +264 -0
  155. package/dist/geometryPlayerEdits.js +48 -0
  156. package/dist/geometryPrepared.js +187 -0
  157. package/dist/geometryPrivacyFence.js +23 -0
  158. package/dist/geometryProceduralPublication.js +90 -0
  159. package/dist/geometryProceduralWorker.js +163 -0
  160. package/dist/geometryPublication.js +109 -0
  161. package/dist/geometryRayAlgebra.js +115 -0
  162. package/dist/geometryReadClient.js +156 -0
  163. package/dist/geometryReadPorts.js +4 -0
  164. package/dist/geometryReadRpc.js +26 -0
  165. package/dist/geometryReadRpcRoutes.js +46 -0
  166. package/dist/geometryReliablePublication.js +81 -0
  167. package/dist/geometryReloadPorts.js +45 -0
  168. package/dist/geometryReloadSource.js +277 -0
  169. package/dist/geometryRenderCache.js +164 -0
  170. package/dist/geometryRenderLod.js +101 -0
  171. package/dist/geometryRollback.js +124 -0
  172. package/dist/geometryRollbackCoordinator.js +202 -0
  173. package/dist/geometryRollbackPorts.js +45 -0
  174. package/dist/geometryRollbackSource.js +208 -0
  175. package/dist/geometryRollbackStore.js +197 -0
  176. package/dist/geometrySchemas.js +26 -0
  177. package/dist/geometryServer.d.ts +2766 -0
  178. package/dist/geometryServer.js +62 -0
  179. package/dist/geometryShapeRaycast.js +110 -0
  180. package/dist/geometryShapeSegments.js +33 -0
  181. package/dist/geometryShapes.js +222 -0
  182. package/dist/geometrySnapshot.js +75 -0
  183. package/dist/geometrySnapshotChannel.js +159 -0
  184. package/dist/geometrySnapshotClient.js +158 -0
  185. package/dist/geometrySnapshotPreparation.js +75 -0
  186. package/dist/geometrySnapshotServer.js +190 -0
  187. package/dist/geometrySqlOwner.js +20 -0
  188. package/dist/geometryStorage.js +126 -0
  189. package/dist/geometryStorageGrant.js +68 -0
  190. package/dist/geometryStorageIdentity.js +8 -0
  191. package/dist/geometryTileArtifact.js +9 -0
  192. package/dist/geometryTileCodec.js +193 -0
  193. package/dist/geometryTileCollision.js +95 -0
  194. package/dist/geometryTileNavigation.js +127 -0
  195. package/dist/geometryTileView.js +34 -0
  196. package/dist/geometryVersionActivation.js +113 -0
  197. package/dist/geometryVersionClient.js +237 -0
  198. package/dist/geometryVersionCompare.js +39 -0
  199. package/dist/geometryVersionMigration.js +105 -0
  200. package/dist/geometryVoxel.js +252 -0
  201. package/dist/geometryWorldEntitySubject.js +31 -0
  202. package/dist/geometryWorldExtent.js +11 -0
  203. package/dist/geometryWorldMetadata.js +37 -0
  204. package/dist/geometryWorldStrategyFixtures.js +126 -0
  205. package/dist/geometryWorldView.js +306 -0
  206. package/dist/host.js +127 -0
  207. package/dist/hostBinding.js +276 -0
  208. package/dist/hostCellObservation.js +113 -0
  209. package/dist/hostClientCapacity.js +89 -0
  210. package/dist/hostCommandScope.js +63 -0
  211. package/dist/hostController.js +3093 -0
  212. package/dist/hostDeployment.js +64 -0
  213. package/dist/hostDrain.js +151 -0
  214. package/dist/hostDrainPorts.js +4 -0
  215. package/dist/hostDriver.js +178 -0
  216. package/dist/hostLane.js +287 -0
  217. package/dist/hostListener.js +78 -0
  218. package/dist/hostListenerBinding.js +18 -0
  219. package/dist/hostLoopObservation.js +89 -0
  220. package/dist/hostMetrics.js +55 -0
  221. package/dist/hostRegistryBinding.js +417 -0
  222. package/dist/hostSelection.js +15 -0
  223. package/dist/hostShutdown.js +46 -0
  224. package/dist/hostTurnObservation.js +52 -0
  225. package/dist/identities.js +3 -0
  226. package/dist/index.d.ts +8632 -0
  227. package/dist/index.js +231 -0
  228. package/dist/inputReceipts.js +62 -0
  229. package/dist/inputRedundancy.js +54 -0
  230. package/dist/inspect.js +237 -0
  231. package/dist/lockstep.d.ts +436 -0
  232. package/dist/lockstep.js +381 -0
  233. package/dist/lockstepAdmission.js +261 -0
  234. package/dist/lockstepAdmissionCodec.js +93 -0
  235. package/dist/lockstepAdmissionPorts.js +4 -0
  236. package/dist/lockstepClientSession.js +577 -0
  237. package/dist/lockstepDefinition.js +147 -0
  238. package/dist/lockstepHostLoop.js +242 -0
  239. package/dist/lockstepInitialAdmission.js +66 -0
  240. package/dist/lockstepInitialStrategyFixtures.js +44 -0
  241. package/dist/lockstepJournal.js +394 -0
  242. package/dist/lockstepJournalCodec.js +253 -0
  243. package/dist/lockstepJournalPorts.js +4 -0
  244. package/dist/lockstepJournalRebuild.js +207 -0
  245. package/dist/lockstepJournalRows.js +56 -0
  246. package/dist/lockstepMembers.js +130 -0
  247. package/dist/lockstepMessages.js +46 -0
  248. package/dist/lockstepOwnedRoom.js +763 -0
  249. package/dist/lockstepPolicies.js +83 -0
  250. package/dist/lockstepReact.js +46 -0
  251. package/dist/lockstepRecoveryTruth.js +120 -0
  252. package/dist/lockstepRosterConfig.js +31 -0
  253. package/dist/lockstepSeed.js +11 -0
  254. package/dist/lockstepSeedFixture.js +19 -0
  255. package/dist/lockstepServer.d.ts +3897 -0
  256. package/dist/lockstepServer.js +324 -0
  257. package/dist/lockstepServerConfig.js +100 -0
  258. package/dist/lockstepServerRoles.js +402 -0
  259. package/dist/lockstepServerStrategyFixtures.js +32 -0
  260. package/dist/lockstepStrategies.js +5 -0
  261. package/dist/lockstepStrategyFixtures.js +136 -0
  262. package/dist/lockstepTerminal.js +89 -0
  263. package/dist/lockstepTerminalPorts.js +4 -0
  264. package/dist/lockstepTransport.js +772 -0
  265. package/dist/lockstepTransportConfig.js +31 -0
  266. package/dist/lockstepWireRoster.js +33 -0
  267. package/dist/matchRoomProvider.js +31 -0
  268. package/dist/matchRooms.js +18 -0
  269. package/dist/membershipObserver.js +46 -0
  270. package/dist/moderation.js +97 -0
  271. package/dist/movementSpecials.js +103 -0
  272. package/dist/ownership.js +16 -0
  273. package/dist/ownershipWithdrawal.js +17 -0
  274. package/dist/pcg32.js +95 -0
  275. package/dist/ports.d.ts +1241 -0
  276. package/dist/ports.js +10 -0
  277. package/dist/quaternion.js +69 -0
  278. package/dist/react.d.ts +406 -0
  279. package/dist/react.js +108 -0
  280. package/dist/reaper-app/rooms.reaper.workflow.server.tsx +5 -0
  281. package/dist/reaper-app/rooms.reaper.workflow.tsx +13 -0
  282. package/dist/reaper.js +242 -0
  283. package/dist/reaperSchemas.js +41 -0
  284. package/dist/reaperWorkflow.js +69 -0
  285. package/dist/recovery.js +188 -0
  286. package/dist/recoverySeats.js +25 -0
  287. package/dist/replay.d.ts +273 -0
  288. package/dist/replay.js +484 -0
  289. package/dist/replayPorts.js +4 -0
  290. package/dist/replayRecording.js +66 -0
  291. package/dist/replaySchema.js +156 -0
  292. package/dist/replayStorage.d.ts +149 -0
  293. package/dist/replayStorage.js +484 -0
  294. package/dist/reservationBatch.js +421 -0
  295. package/dist/reservationSchemas.js +16 -0
  296. package/dist/reservations.js +258 -0
  297. package/dist/reservePort.js +68 -0
  298. package/dist/resolvedOptions.js +3 -0
  299. package/dist/room.d.ts +1006 -0
  300. package/dist/room.js +283 -0
  301. package/dist/roomAccessSweep.js +94 -0
  302. package/dist/roomAppCommandControl.js +58 -0
  303. package/dist/roomAuthoringStrategy.js +16 -0
  304. package/dist/roomErasure.js +197 -0
  305. package/dist/roomPoolRuntimeDefaults.js +23 -0
  306. package/dist/roomPoolSelection.js +18 -0
  307. package/dist/roomPoolTopology.js +211 -0
  308. package/dist/rpc.d.ts +551 -0
  309. package/dist/rpc.js +111 -0
  310. package/dist/rpcClient.js +151 -0
  311. package/dist/rpcRoutes.js +27 -0
  312. package/dist/runtime.js +1122 -0
  313. package/dist/schemaHistory.js +97 -0
  314. package/dist/seatStore.js +150 -0
  315. package/dist/seatStrategyFixtures.js +51 -0
  316. package/dist/seatSubject.js +31 -0
  317. package/dist/seats.js +129 -0
  318. package/dist/serverSession.js +810 -0
  319. package/dist/serverSessionConfig.js +42 -0
  320. package/dist/sessionAdmission.js +52 -0
  321. package/dist/sidecarAdmission.js +102 -0
  322. package/dist/sidecarConfig.js +115 -0
  323. package/dist/sidecarConfigPublication.js +63 -0
  324. package/dist/sidecarHostListener.js +207 -0
  325. package/dist/sidecarIpc.js +204 -0
  326. package/dist/sidecarPeer.js +309 -0
  327. package/dist/sidecarProcessPort.js +27 -0
  328. package/dist/sidecarRuntime.js +167 -0
  329. package/dist/sidecarSelection.js +141 -0
  330. package/dist/sidecarWire.js +177 -0
  331. package/dist/sidecarWrites.js +162 -0
  332. package/dist/simulation.d.ts +391 -0
  333. package/dist/simulation.js +281 -0
  334. package/dist/simulationAuthoring.js +28 -0
  335. package/dist/simulationBytes.js +26 -0
  336. package/dist/simulationConformance.js +304 -0
  337. package/dist/simulationInputHistoryCapture.js +34 -0
  338. package/dist/simulationInputHistoryWire.js +192 -0
  339. package/dist/simulationOptionsWire.js +77 -0
  340. package/dist/simulationRecoveryWire.js +133 -0
  341. package/dist/simulationReplay.js +126 -0
  342. package/dist/simulationSnapshotWire.js +111 -0
  343. package/dist/simulationState.js +177 -0
  344. package/dist/snapshotBlob.js +125 -0
  345. package/dist/snapshotBlobCleanup.js +92 -0
  346. package/dist/snapshotBlobIndex.js +37 -0
  347. package/dist/snapshotBudget.js +79 -0
  348. package/dist/snapshotChain.js +184 -0
  349. package/dist/snapshotErasure.js +171 -0
  350. package/dist/snapshotInspection.js +104 -0
  351. package/dist/snapshotSegmentBlobs.js +57 -0
  352. package/dist/snapshotUploads.js +165 -0
  353. package/dist/socketTransport.js +252 -0
  354. package/dist/spatial.js +103 -0
  355. package/dist/spectatorPolicy.js +25 -0
  356. package/dist/spectatorProducer.js +88 -0
  357. package/dist/startFailureCause.js +3 -0
  358. package/dist/stateCodec.js +657 -0
  359. package/dist/strategies.d.ts +210 -0
  360. package/dist/strategies.js +8 -0
  361. package/dist/strategiesServer.d.ts +286 -0
  362. package/dist/strategiesServer.js +11 -0
  363. package/dist/strategyFixtures.js +181 -0
  364. package/dist/streamFraming.js +121 -0
  365. package/dist/streamTransport.js +265 -0
  366. package/dist/subjectAdmission.js +49 -0
  367. package/dist/subjectPrivacy.js +280 -0
  368. package/dist/subjectPrivacyBinding.js +89 -0
  369. package/dist/systemManifest.js +181 -0
  370. package/dist/tables.js +158 -0
  371. package/dist/testHarness.js +88 -0
  372. package/dist/testing.d.ts +3684 -0
  373. package/dist/testing.js +220 -0
  374. package/dist/testingPorts.js +270 -0
  375. package/dist/testingServer.d.ts +4060 -0
  376. package/dist/testingServer.js +18 -0
  377. package/dist/transform.d.ts +692 -0
  378. package/dist/transform.js +216 -0
  379. package/dist/transform3d.js +117 -0
  380. package/dist/transformCollection.js +23 -0
  381. package/dist/transformCollection3d.js +23 -0
  382. package/dist/transformCollectionCore.js +155 -0
  383. package/dist/transformFrames.js +120 -0
  384. package/dist/transformPrediction3d.js +126 -0
  385. package/dist/transformRules.js +122 -0
  386. package/dist/transformSchemas.js +19 -0
  387. package/dist/transport.js +31 -0
  388. package/dist/transportAuthoring.js +28 -0
  389. package/dist/transportCleanup.js +21 -0
  390. package/dist/transportConformance.js +123 -0
  391. package/dist/transportConnector.js +81 -0
  392. package/dist/transportEndpoints.js +37 -0
  393. package/dist/transportsServer.d.ts +5515 -0
  394. package/dist/transportsServer.js +6 -0
  395. package/dist/viewProjection.js +15 -0
  396. package/dist/web.d.ts +2286 -0
  397. package/dist/web.js +517 -0
  398. package/dist/webTransportClient.js +172 -0
  399. package/dist/wire.d.ts +992 -0
  400. package/dist/wire.js +491 -0
  401. package/dist/withdrawalPort.js +27 -0
  402. package/dist/world.d.ts +1894 -0
  403. package/dist/world.js +332 -0
  404. package/dist/worldActorReceipts.js +47 -0
  405. package/dist/worldActorTransferSnapshot.js +13 -0
  406. package/dist/worldAdmissionPending.js +7 -0
  407. package/dist/worldBoundaryCoordinator.js +147 -0
  408. package/dist/worldCatalog.js +80 -0
  409. package/dist/worldCellAllocation.js +202 -0
  410. package/dist/worldCellDestination.js +67 -0
  411. package/dist/worldCells.js +488 -0
  412. package/dist/worldChange.js +31 -0
  413. package/dist/worldClient.js +663 -0
  414. package/dist/worldClientControl.js +140 -0
  415. package/dist/worldClientPendingInput.js +15 -0
  416. package/dist/worldClientRpc.js +132 -0
  417. package/dist/worldClientRpcRoutes.js +42 -0
  418. package/dist/worldClientSchemas.js +27 -0
  419. package/dist/worldCommands.js +139 -0
  420. package/dist/worldData.js +41 -0
  421. package/dist/worldDefaultBinding.js +376 -0
  422. package/dist/worldDefaultGroupAdmission.js +81 -0
  423. package/dist/worldDefaultGroupAppServices.js +30 -0
  424. package/dist/worldDefaultGroupCompensation.js +108 -0
  425. package/dist/worldDefaultGroupContinuation.js +95 -0
  426. package/dist/worldDefaultGroupControl.js +71 -0
  427. package/dist/worldDefaultGroupMembers.js +84 -0
  428. package/dist/worldDefaultGroups.js +20 -0
  429. package/dist/worldDefaultPending.js +78 -0
  430. package/dist/worldDefaultService.js +244 -0
  431. package/dist/worldEntities.js +2979 -0
  432. package/dist/worldEntityCodec.js +20 -0
  433. package/dist/worldEntityHandoffView.js +153 -0
  434. package/dist/worldGeometry.js +169 -0
  435. package/dist/worldGhostAdmission.js +64 -0
  436. package/dist/worldGhostDestination.js +117 -0
  437. package/dist/worldGhostGateway.js +131 -0
  438. package/dist/worldGhostHandshake.js +107 -0
  439. package/dist/worldGhostHost.js +41 -0
  440. package/dist/worldGhostIngress.js +131 -0
  441. package/dist/worldGhostNeighborhood.js +69 -0
  442. package/dist/worldGhostNeighbors.js +85 -0
  443. package/dist/worldGhostOutbound.js +109 -0
  444. package/dist/worldGhostPublisher.js +215 -0
  445. package/dist/worldGhostReceiver.js +212 -0
  446. package/dist/worldGhostSender.js +145 -0
  447. package/dist/worldGhostSocket.js +77 -0
  448. package/dist/worldGhostWire.js +171 -0
  449. package/dist/worldGroupCommand.js +48 -0
  450. package/dist/worldGroupDeadline.js +114 -0
  451. package/dist/worldGroupPreparation.js +114 -0
  452. package/dist/worldGroupReadyControl.js +127 -0
  453. package/dist/worldGroupSupervisor.js +119 -0
  454. package/dist/worldHandoffMetrics.js +58 -0
  455. package/dist/worldHandoffView.js +99 -0
  456. package/dist/worldHostSource.js +68 -0
  457. package/dist/worldInspectEndpoint.js +249 -0
  458. package/dist/worldInspection.js +108 -0
  459. package/dist/worldInstanceAdmission.js +30 -0
  460. package/dist/worldInstanceAllocation.js +115 -0
  461. package/dist/worldInstanceDestination.js +63 -0
  462. package/dist/worldInstanceExpiry.js +281 -0
  463. package/dist/worldInstanceExpirySupervisor.js +87 -0
  464. package/dist/worldInstanceLifecycle.js +102 -0
  465. package/dist/worldInstanceState.js +51 -0
  466. package/dist/worldInstances.js +477 -0
  467. package/dist/worldJoin.js +55 -0
  468. package/dist/worldLayers.js +150 -0
  469. package/dist/worldLeases.js +77 -0
  470. package/dist/worldManifest.js +24 -0
  471. package/dist/worldMovement.js +62 -0
  472. package/dist/worldPersistence.js +133 -0
  473. package/dist/worldProjection.js +220 -0
  474. package/dist/worldReact.js +109 -0
  475. package/dist/worldRecoveryActor.js +34 -0
  476. package/dist/worldReturnAnchor.js +48 -0
  477. package/dist/worldRoomHooks.js +56 -0
  478. package/dist/worldRoomPool.js +26 -0
  479. package/dist/worldRoomSteps.js +132 -0
  480. package/dist/worldSeatBinding.js +35 -0
  481. package/dist/worldServer.d.ts +6936 -0
  482. package/dist/worldServer.js +48 -0
  483. package/dist/worldSourceSeatPending.js +8 -0
  484. package/dist/worldStrategyFixtures.js +163 -0
  485. package/dist/worldTesting.js +26 -0
  486. package/dist/worldTransitionDefaults.js +197 -0
  487. package/dist/worldTransitionExecutor.js +518 -0
  488. package/dist/worldTransitionGroup.js +112 -0
  489. package/dist/worldTransitionPhysicalSteps.js +39 -0
  490. package/dist/worldTransitionResolver.js +227 -0
  491. package/dist/worldTransitionSeatGroup.js +63 -0
  492. package/dist/worldTransitionSeats.js +259 -0
  493. package/dist/worldTransitionState.js +94 -0
  494. package/dist/worldTransitions.js +100 -0
  495. package/package.json +189 -4
@@ -0,0 +1,573 @@
1
+ import { BudgetExceeded as e, NotRoomMember as t, ProtocolError as n, RoomAuthoringError as r, RoomForbidden as i, RoomFull as a, RoomGone as o, RoomLocked as s, SeatExpired as c } from "./errors.js";
2
+ import { createSimulationOptionsCodec as l } from "./simulationOptionsWire.js";
3
+ import { captureRoomSeatAttributes as u } from "./room.js";
4
+ import { geometryPersistenceId as d } from "./geometryPersistenceData.js";
5
+ import { captureRoomGeometryReloadRequest as f, captureRoomGeometryRollbackRequest as p } from "./geometryAdminData.js";
6
+ import { ReserveRoomInput as m } from "./rpc.js";
7
+ import { canonicalRoomJson as h } from "./checkpointJson.js";
8
+ import { captureRoomSessionAdmissionEvidence as ee } from "./sessionAdmission.js";
9
+ import { RoomCatalog as g } from "./catalog.js";
10
+ import { captureRoomHostWithdrawalInput as _ } from "./ownershipWithdrawal.js";
11
+ import { controllerRoomHostControlService as v } from "./reservePort.js";
12
+ import { RoomControlTargetSchema as te, RoomControlWorldAdmissionSchema as ne, decodeRoomControlReservation as y, decodeRoomControlToken as re, encodeRoomControlReservation as b, encodeRoomControlToken as x, makeRoomControlCarrier as S, roomControlIdentity as C, sameRoomControlIdentity as w, sameRoomControlTarget as ie } from "./controlCarrier.js";
13
+ import { RoomsHostBindFailure as T } from "./hostBinding.js";
14
+ import { controllerRoomHostWithdrawalService as E } from "./withdrawalPort.js";
15
+ import { ROOM_APP_COMMAND_TARGET as D } from "./roomAppCommandControl.js";
16
+ import { controllerWorldRoomSteps as O, hostWorldRoomStepHandler as k } from "./worldRoomSteps.js";
17
+ import { runWorldTransitionForward as A } from "./worldDefaultService.js";
18
+ import { Subject as j } from "@voltro/protocol";
19
+ import { Effect as M, Result as ae, Schema as N } from "effect";
20
+ import { createHash as P, randomUUID as F } from "node:crypto";
21
+ // src/controlTransport.ts
22
+ var I = () => new n({ detail: "Room control outcome is unconfirmed; do not repeat or select another host" }), L = "Room control transport is unavailable", R = () => new n({ detail: L }), z = (e, t) => {
23
+ if (!Number.isSafeInteger(e) || e < 1 || e > t) throw new n({ detail: "Invalid Room control resource budget" });
24
+ return e;
25
+ }, B = (l) => l instanceof a ? new a({ roomId: l.roomId }) : l instanceof s ? new s({ roomId: l.roomId }) : l instanceof o ? new o({ roomId: l.roomId }) : l instanceof i ? new i({ roomId: l.roomId }) : l instanceof c ? new c({ sessionId: l.sessionId }) : l instanceof t ? new t({ sessionId: l.sessionId }) : l instanceof e ? new e({
26
+ budget: "roomHostControl",
27
+ limit: l.limit
28
+ }) : l instanceof r ? new r({
29
+ room: l.room,
30
+ detail: "Room authoring refused control"
31
+ }) : l instanceof n && l.detail === L ? R() : I(), oe = (e) => M.uninterruptible(M.tryPromise({
32
+ try: e,
33
+ catch: B
34
+ })), V = (e, t, n) => {
35
+ try {
36
+ let r = Object.getOwnPropertyDescriptor(t, "catalog");
37
+ if (r && (!r.enumerable || !("value" in r)) || !r && "catalog" in t) throw R();
38
+ let i = r?.value === void 0 ? void 0 : new g(r.value.inventory(), { previousHistory: r.value.history }), a = {
39
+ ...t,
40
+ ...i === void 0 ? {} : { catalog: i },
41
+ projectControlSecrets: structuredClone(t.projectControlSecrets)
42
+ };
43
+ return n(Object.freeze({
44
+ publish: e.publish.bind(e),
45
+ subscribe: e.subscribe.bind(e),
46
+ onTransportEvent: e.onTransportEvent.bind(e),
47
+ close: e.close
48
+ }), a);
49
+ } catch {
50
+ return M.fail(R());
51
+ }
52
+ }, H = (e, t, r) => V(e, r, (e, r) => M.uninterruptible(M.gen(function* () {
53
+ let a = yield* M.context(), o = async (e) => {
54
+ let t = await M.runPromiseWith(a)(M.result(e));
55
+ if (ae.isFailure(t)) throw t.failure;
56
+ return t.success;
57
+ }, s = yield* M.try({
58
+ try: () => S(r),
59
+ catch: () => R()
60
+ }), c = t.host.membership;
61
+ if (!c || typeof r.resolveSubject != "function" || typeof r.onUnavailable != "function") return yield* M.fail(R());
62
+ let u = yield* M.try({
63
+ try: () => N.decodeUnknownSync(te)({
64
+ hostId: t.host.id,
65
+ ...c
66
+ }),
67
+ catch: () => R()
68
+ }), d = z(r.maxReceipts ?? 4096, 65536), m = z(r.maxInFlight ?? 128, d), h = r.resolveSubject, g = r.onUnavailable, _ = v(t), ne = t.adopt.bind(t), y = r.worldSteps?.leases, x = y === void 0 ? void 0 : (e, n) => k(t, y(e.tenantId))(e, n), C = r.worldSteps === void 0 ? void 0 : O(t).capture, D = E(t), F = t.reloadGeometry.bind(t), I = t.rollbackGeometry.bind(t), L = t.kickSubject.bind(t), oe = t.closeSessions.bind(t), V = e.publish.bind(e), H = e.subscribe.bind(e), U = e.onTransportEvent.bind(e), W = !1, G = !1, K = null, q = null, J = /* @__PURE__ */ new Set(), Y = /* @__PURE__ */ new Map(), X = () => {
69
+ W = !0;
70
+ }, Z = () => {
71
+ X();
72
+ try {
73
+ g();
74
+ } catch {}
75
+ }, se = async (e) => {
76
+ try {
77
+ let a = e.body;
78
+ if (a.operation === "adopt") return await ne(a.roomId, a.tenantId, a.priorEpoch), {
79
+ ok: !0,
80
+ value: null
81
+ };
82
+ if (a.operation === "withdraw") return await o(D.withdraw(u.hostId, a.input)), {
83
+ ok: !0,
84
+ value: null
85
+ };
86
+ if (a.operation === "kick") return {
87
+ ok: !0,
88
+ value: await L(a.roomId, a.tenantId, a.subjectId, a.reason)
89
+ };
90
+ if (a.operation === "close") return {
91
+ ok: !0,
92
+ value: await oe(a.roomId, a.tenantId, a.reason)
93
+ };
94
+ if (a.operation === "worldStep") {
95
+ if (!x) throw new n({ detail: "This Host runs no World steps" });
96
+ return await o(x(structuredClone(a.step), structuredClone(a.authority))), {
97
+ ok: !0,
98
+ value: null
99
+ };
100
+ }
101
+ if (a.operation === "worldTransition") {
102
+ let e = r.worldSteps?.executor;
103
+ if (!e) throw new n({ detail: "This Host runs no World transitions" });
104
+ let i = structuredClone(a.forward), s = await o(t.directory.observeOwnership(i.origin.roomId, i.origin.tenantId));
105
+ if (!s || s.hostId !== t.host.id || s.state !== "live") throw new n({ detail: "World source Room belongs to another live Host" });
106
+ return await o(A(e(i.origin.tenantId), i)), {
107
+ ok: !0,
108
+ value: null
109
+ };
110
+ }
111
+ if (a.operation === "appCommand") throw new n({ detail: "Room Hosts run no app commands" });
112
+ if (a.operation === "worldCapture") {
113
+ if (!C) throw new n({ detail: "This Host runs no World steps" });
114
+ let e = await o(C(structuredClone(a.capture)));
115
+ return {
116
+ ok: !0,
117
+ value: { captured: {
118
+ entity: e.entity,
119
+ data: e.data
120
+ } }
121
+ };
122
+ }
123
+ let s = N.decodeUnknownSync(j)(await o(h(structuredClone(a.identity))));
124
+ if (!w(a.identity, s)) throw new i({ roomId: "" });
125
+ switch (a.operation) {
126
+ case "reserve": {
127
+ let e = a.input;
128
+ if (e.mode === "joinById") {
129
+ if (a.lockstepOptionsWire !== void 0) throw new n({ detail: "Seat lookup cannot carry Lockstep creation options" });
130
+ } else {
131
+ let r = t.catalog.get(e.room);
132
+ if (r.mode === "lockstep") {
133
+ if (!a.lockstepOptionsWire || e.options !== null) throw new n({ detail: "Declared Lockstep control requires its one canonical LSO options blob" });
134
+ let t = l(r.simulation), i = a.lockstepOptionsWire;
135
+ if (Buffer.byteLength(i, "base64url") > t.maxBytes) throw new n({ detail: "Lockstep control options exceed actual declared bytes" });
136
+ let o = Uint8Array.from(Buffer.from(i, "base64url"));
137
+ if (Buffer.from(o).toString("base64url") !== i) throw new n({ detail: "Lockstep control options are not canonical base64url" });
138
+ e = {
139
+ ...e,
140
+ options: t.decode(o)
141
+ };
142
+ } else if (a.lockstepOptionsWire !== void 0) throw new n({ detail: "State-sync control cannot carry Lockstep options" });
143
+ }
144
+ return {
145
+ ok: !0,
146
+ value: b(await o(_.reserve(u.hostId, e, s, a.attributes)))
147
+ };
148
+ }
149
+ case "geometryReload": return await F(a.roomId, f(a.input), s), {
150
+ ok: !0,
151
+ value: null
152
+ };
153
+ case "geometryRollback": return await I(a.roomId, p(a.input), s), {
154
+ ok: !0,
155
+ value: null
156
+ };
157
+ case "worldAdmission": {
158
+ if (!x || s.type !== "user" || !s.tenantId || !s.id) throw R();
159
+ let { roomId: e, sessionId: n, epoch: r } = a.lookup, i = ee(t.runtime.readSessionAdmission(e, n));
160
+ if (i.roomId !== e || i.sessionId !== n || i.epoch !== r || i.tenantId !== s.tenantId || i.subjectId !== s.id) throw R();
161
+ return {
162
+ ok: !0,
163
+ value: { admission: i }
164
+ };
165
+ }
166
+ case "worldPrepareRoom": {
167
+ if (!x) throw new n({ detail: "This Host runs no World steps" });
168
+ let { room: e, creationKey: r, generation: i, worldCell: o, worldInstance: c } = structuredClone(a.prepare), l = await t.prepareWorldRoom(e, {}, s, r, o, i, c);
169
+ return {
170
+ ok: !0,
171
+ value: { prepared: {
172
+ roomId: l.id,
173
+ hostId: l.hostId,
174
+ epoch: l.epoch
175
+ } }
176
+ };
177
+ }
178
+ case "matchPrepareRoom": {
179
+ let { room: e, options: n, requestId: r } = structuredClone(a.prepare), i = await t.prepareMatchRoom(e, n, s, r);
180
+ return {
181
+ ok: !0,
182
+ value: { prepared: {
183
+ roomId: i.id,
184
+ hostId: i.hostId,
185
+ epoch: i.epoch
186
+ } }
187
+ };
188
+ }
189
+ case "resume": return {
190
+ ok: !0,
191
+ value: b(await o(_.resume(u.hostId, a.sessionId, s, a.attributes)))
192
+ };
193
+ case "leave": return {
194
+ ok: !0,
195
+ value: await o(_.leave(u.hostId, a.sessionId, re(a.token), s))
196
+ };
197
+ }
198
+ } catch (e) {
199
+ return {
200
+ ok: !1,
201
+ error: B(e)
202
+ };
203
+ }
204
+ }, Q = (e) => {
205
+ let t = Promise.resolve().then(e).catch(Z);
206
+ J.add(t), t.then(() => {
207
+ J.delete(t);
208
+ });
209
+ }, $ = yield* H(s.requestChannel(u), (e) => {
210
+ if (W || G) return;
211
+ let t, n;
212
+ try {
213
+ if (t = s.readRequest(e), !ie(t.target, u)) return;
214
+ n = s.now();
215
+ } catch {
216
+ return;
217
+ }
218
+ for (let [e, t] of Y) !t.running && t.expiresAt <= n && Y.delete(e);
219
+ let r = P("sha256").update(e).digest("hex"), i = Y.get(t.requestId);
220
+ if (i) {
221
+ if (i.digest !== r || i.running || !i.reply || J.size >= m) return;
222
+ let e = i.reply;
223
+ Q(() => o(V(s.replyChannel(t.clientId), e)));
224
+ return;
225
+ }
226
+ if (J.size >= m || Y.size >= d) return;
227
+ let a = {
228
+ digest: r,
229
+ expiresAt: t.expiresAt,
230
+ reply: null,
231
+ running: !0
232
+ };
233
+ Y.set(t.requestId, a), Q(async () => {
234
+ try {
235
+ let e = await se(t);
236
+ if (s.now() >= t.expiresAt) return;
237
+ let { purpose: n, body: r, ...i } = t;
238
+ a.reply = s.signReply({
239
+ purpose: "voltro.rooms.control.reply.v3",
240
+ ...i,
241
+ operation: r.operation,
242
+ result: e
243
+ }), await o(V(s.replyChannel(t.clientId), a.reply));
244
+ } finally {
245
+ a.running = !1;
246
+ }
247
+ });
248
+ }).pipe(M.mapError(() => R()));
249
+ try {
250
+ q = U((e) => {
251
+ e.kind === "disconnected" && Z();
252
+ });
253
+ } catch {
254
+ Z();
255
+ let e = async () => {
256
+ await Promise.all([...J]), await o($);
257
+ };
258
+ return yield* M.tryPromise({
259
+ try: e,
260
+ catch: () => new T(e)
261
+ }), yield* M.fail(R());
262
+ }
263
+ let ce = !1;
264
+ return Object.freeze({
265
+ fence: X,
266
+ close: () => {
267
+ if (X(), G) return Promise.resolve();
268
+ if (K) return K;
269
+ let e = (async () => {
270
+ await Promise.all([...J]), ce ||= (await o($), !0), q?.(), q = null, Y.clear(), G = !0;
271
+ })();
272
+ return K = e, e.then(() => {
273
+ K = null;
274
+ }, () => {
275
+ K = null;
276
+ }), e;
277
+ }
278
+ });
279
+ }))), U = (t, r) => V(t, r, (t, r) => M.uninterruptible(M.gen(function* () {
280
+ let i = yield* M.context(), a = async (e) => {
281
+ let t = await M.runPromiseWith(i)(M.result(e));
282
+ if (ae.isFailure(t)) throw t.failure;
283
+ return t.success;
284
+ }, o = yield* M.try({
285
+ try: () => S(r),
286
+ catch: () => R()
287
+ });
288
+ if (typeof r.resolveTarget != "function") return yield* M.fail(R());
289
+ let s = r.resolveTarget, c = z(r.maxPending ?? 128, 65536), g = F(), v = t.publish.bind(t), re = t.subscribe.bind(t), b = t.onTransportEvent.bind(t), w = !1, E = !1, O = null, k = null, A = /* @__PURE__ */ new Set(), j = /* @__PURE__ */ new Map(), P = yield* re(o.replyChannel(g), (e) => {
290
+ let t;
291
+ try {
292
+ t = o.readReply(e);
293
+ } catch {
294
+ return;
295
+ }
296
+ let n = j.get(t.requestId), r = n?.request;
297
+ n && r && t.clientId === g && t.operation === r.body.operation && ie(t.target, r.target) && t.issuedAt === r.issuedAt && t.expiresAt === r.expiresAt && n.settle({ reply: t });
298
+ }).pipe(M.mapError(() => R()));
299
+ try {
300
+ k = b((e) => {
301
+ if (e.kind === "disconnected") for (let e of j.values()) e.settle({ error: I() });
302
+ });
303
+ } catch {
304
+ w = !0;
305
+ let e = () => a(P);
306
+ return yield* M.tryPromise({
307
+ try: e,
308
+ catch: () => new T(e)
309
+ }), yield* M.fail(R());
310
+ }
311
+ let L = !1, V = (t, n, r) => {
312
+ let i;
313
+ try {
314
+ i = JSON.parse(h(n));
315
+ } catch (e) {
316
+ return M.fail(B(e));
317
+ }
318
+ return oe(() => {
319
+ if (w || E) throw R();
320
+ if (A.size >= c) throw new e({
321
+ budget: "roomControlRequests",
322
+ limit: c
323
+ });
324
+ let n = Promise.resolve().then(async () => {
325
+ let e = r ?? N.decodeUnknownSync(te)(await a(s(t)));
326
+ if (e.hostId !== t) throw R();
327
+ let n = o.now(), c = F(), l = {
328
+ purpose: "voltro.rooms.control.request.v3",
329
+ mount: o.mount,
330
+ requestId: c,
331
+ clientId: g,
332
+ target: e,
333
+ issuedAt: n,
334
+ expiresAt: n + o.maxRequestMs,
335
+ body: i
336
+ }, u = o.signRequest(l), d = () => void 0, f = new Promise((e) => {
337
+ d = e;
338
+ });
339
+ j.set(c, {
340
+ request: l,
341
+ settle: d
342
+ });
343
+ let p = setTimeout(() => d({ error: I() }), o.maxRequestMs);
344
+ try {
345
+ try {
346
+ await a(v(o.requestChannel(e), u));
347
+ } catch {
348
+ d({ error: I() });
349
+ }
350
+ let t = await f;
351
+ if ("error" in t) throw t.error;
352
+ if (!t.reply.result.ok) throw t.reply.result.error;
353
+ return t.reply;
354
+ } finally {
355
+ clearTimeout(p), j.delete(c);
356
+ }
357
+ });
358
+ return A.add(n), n.then(() => {
359
+ A.delete(n);
360
+ }, () => {
361
+ A.delete(n);
362
+ }), n;
363
+ });
364
+ }, H = (e, t) => {
365
+ try {
366
+ return V(e, t());
367
+ } catch (e) {
368
+ return M.fail(B(e));
369
+ }
370
+ }, U = Object.freeze({
371
+ reserve: (e, t, n, i) => H(e, () => {
372
+ let e = N.decodeUnknownSync(m)(structuredClone(t)), a = C(n), o = e.mode === "joinById" ? void 0 : r.catalog?.get(e.room), s = i === void 0 ? {} : { attributes: u(e.mode === "joinById" ? e.roomId : e.room, i) };
373
+ if (e.mode !== "joinById" && o?.mode === "lockstep") {
374
+ let t = Buffer.from(l(o.simulation).encode(e.options)).toString("base64url");
375
+ return {
376
+ operation: "reserve",
377
+ identity: a,
378
+ input: {
379
+ ...e,
380
+ options: null
381
+ },
382
+ lockstepOptionsWire: t,
383
+ ...s
384
+ };
385
+ }
386
+ return {
387
+ operation: "reserve",
388
+ input: e,
389
+ identity: a,
390
+ ...s
391
+ };
392
+ }).pipe(M.flatMap((e) => M.try({
393
+ try: () => {
394
+ if (!e.result.ok || e.result.value === null || !("token" in e.result.value)) throw I();
395
+ return y(e.result.value);
396
+ },
397
+ catch: B
398
+ }))),
399
+ resume: (e, t, n, r) => H(e, () => ({
400
+ operation: "resume",
401
+ sessionId: t,
402
+ identity: C(n),
403
+ ...r === void 0 ? {} : { attributes: u(t, r) }
404
+ })).pipe(M.flatMap((e) => M.try({
405
+ try: () => {
406
+ if (!e.result.ok || e.result.value === null || !("token" in e.result.value)) throw I();
407
+ return y(e.result.value);
408
+ },
409
+ catch: B
410
+ }))),
411
+ leave: (e, t, n, r) => H(e, () => ({
412
+ operation: "leave",
413
+ sessionId: t,
414
+ token: x(n),
415
+ identity: C(r)
416
+ })).pipe(M.flatMap((e) => e.result.ok && e.result.value !== null && "ok" in e.result.value && e.result.value.ok === !0 ? M.succeed({ ok: !0 }) : M.fail(I())))
417
+ }), W = Object.freeze({ adopt: (e, t, n, r) => V(e, {
418
+ operation: "adopt",
419
+ roomId: t,
420
+ tenantId: n,
421
+ priorEpoch: r
422
+ }).pipe(M.flatMap((e) => e.result.ok && e.result.value === null ? M.void : M.fail(I())), M.mapError(() => I())) }), G = Object.freeze({ withdraw: (e, t) => {
423
+ try {
424
+ let n = _(t);
425
+ return V(e, {
426
+ operation: "withdraw",
427
+ input: n
428
+ }).pipe(M.flatMap((e) => e.result.ok && e.result.value === null ? M.void : M.fail(I())), M.mapError(() => I()));
429
+ } catch {
430
+ return M.fail(new n({ detail: "Invalid room ownership withdrawal" }));
431
+ }
432
+ } }), K = (e) => e.result.ok && e.result.value === null ? M.void : M.fail(I()), q = Object.freeze({
433
+ reload: (e, t, n, r) => H(e, () => ({
434
+ operation: "geometryReload",
435
+ roomId: d(t),
436
+ input: f(n),
437
+ identity: C(r)
438
+ })).pipe(M.flatMap(K)),
439
+ rollback: (e, t, n, r) => H(e, () => ({
440
+ operation: "geometryRollback",
441
+ roomId: d(t),
442
+ input: p(n),
443
+ identity: C(r)
444
+ })).pipe(M.flatMap(K))
445
+ }), J = (e) => M.try({
446
+ try: () => {
447
+ if (!e.result.ok || e.result.value === null || !("kicked" in e.result.value)) throw I();
448
+ return { kicked: e.result.value.kicked };
449
+ },
450
+ catch: B
451
+ }), Y = Object.freeze({
452
+ kick: (e, t) => H(e, () => ({
453
+ operation: "kick",
454
+ roomId: t.roomId,
455
+ tenantId: t.tenantId,
456
+ subjectId: t.subjectId,
457
+ reason: t.reason
458
+ })).pipe(M.flatMap(J)),
459
+ close: (e, t) => H(e, () => ({
460
+ operation: "close",
461
+ roomId: t.roomId,
462
+ tenantId: t.tenantId,
463
+ reason: t.reason
464
+ })).pipe(M.flatMap(J))
465
+ }), X = Object.freeze({ prepareRoom: (e, t, n) => H(e, () => ({
466
+ operation: "matchPrepareRoom",
467
+ prepare: t,
468
+ identity: C(n)
469
+ })).pipe(M.flatMap((e) => M.try({
470
+ try: () => {
471
+ if (!e.result.ok || e.result.value === null || !("prepared" in e.result.value)) throw I();
472
+ return e.result.value.prepared;
473
+ },
474
+ catch: B
475
+ }))) }), Z = (e, t, n) => {
476
+ let r = N.decodeUnknownSync(ne)(JSON.parse(h(t)), { onExcessProperty: "error" }), i = C(n);
477
+ if (i.type !== "user" || !i.id || !i.tenantId) throw R();
478
+ return (t) => V(e, {
479
+ operation: "worldAdmission",
480
+ identity: i,
481
+ lookup: r
482
+ }, t).pipe(M.flatMap((e) => M.try({
483
+ try: () => {
484
+ if (!e.result.ok || e.result.value === null || !("admission" in e.result.value)) throw I();
485
+ let t = ee(e.result.value.admission);
486
+ if (t.roomId !== r.roomId || t.sessionId !== r.sessionId || t.epoch !== r.epoch || t.subjectId !== i.id || t.tenantId !== i.tenantId) throw I();
487
+ return {
488
+ reply: e,
489
+ evidence: t
490
+ };
491
+ },
492
+ catch: B
493
+ })));
494
+ }, se = Object.freeze({
495
+ admission: (e, t, n) => {
496
+ try {
497
+ return Z(e, t, n)().pipe(M.map((e) => e.evidence));
498
+ } catch (e) {
499
+ return M.fail(B(e));
500
+ }
501
+ },
502
+ bindAdmission: (e, t, n) => {
503
+ try {
504
+ let r = Z(e, t, n);
505
+ return r().pipe(M.map((e) => {
506
+ let t = Object.freeze({ ...e.reply.target });
507
+ return Object.freeze({ read: () => r(t).pipe(M.map((e) => e.evidence)) });
508
+ }));
509
+ } catch (e) {
510
+ return M.fail(B(e));
511
+ }
512
+ },
513
+ prepareRoom: (e, t, n) => H(e, () => ({
514
+ operation: "worldPrepareRoom",
515
+ prepare: t,
516
+ identity: C(n)
517
+ })).pipe(M.flatMap((e) => M.try({
518
+ try: () => {
519
+ if (!e.result.ok || e.result.value === null || !("prepared" in e.result.value)) throw I();
520
+ return e.result.value.prepared;
521
+ },
522
+ catch: B
523
+ }))),
524
+ step: (e, t, n) => V(e, {
525
+ operation: "worldStep",
526
+ step: t,
527
+ authority: n
528
+ }).pipe(M.flatMap(K)),
529
+ transition: (e, t) => V(e, {
530
+ operation: "worldTransition",
531
+ forward: t
532
+ }).pipe(M.flatMap(K)),
533
+ capture: (e, t) => V(e, {
534
+ operation: "worldCapture",
535
+ capture: t
536
+ }).pipe(M.flatMap((e) => M.try({
537
+ try: () => {
538
+ if (!e.result.ok || e.result.value === null || !("captured" in e.result.value)) throw I();
539
+ return e.result.value.captured;
540
+ },
541
+ catch: B
542
+ })))
543
+ }), Q = Object.freeze({ deliver: (e) => V(D, {
544
+ operation: "appCommand",
545
+ delivery: e
546
+ }).pipe(M.flatMap(K)) }), $ = () => {
547
+ w = !0;
548
+ };
549
+ return Object.freeze({
550
+ control: U,
551
+ adoption: W,
552
+ withdrawal: G,
553
+ geometry: q,
554
+ kick: Y,
555
+ world: se,
556
+ match: X,
557
+ commands: Q,
558
+ fence: $,
559
+ close: () => {
560
+ if ($(), E) return Promise.resolve();
561
+ if (O) return O;
562
+ let e = (async () => {
563
+ await Promise.allSettled([...A]), L ||= (await a(P), !0), k?.(), k = null, E = !0;
564
+ })();
565
+ return O = e, e.then(() => {
566
+ O = null;
567
+ }, () => {
568
+ O = null;
569
+ }), e;
570
+ }
571
+ });
572
+ })));
573
+ export { U as openRoomControlClient, H as openRoomControlServer };
@@ -0,0 +1,112 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ import { applicationRoomCommands as t } from "./commandDelivery.js";
3
+ import { RoomsHostOwner as n } from "./hostBinding.js";
4
+ import { registryRoomsApiBinder as r } from "./apiRegistryBinding.js";
5
+ import { registryRoomsHostBinder as i } from "./hostRegistryBinding.js";
6
+ import { roomControlSubjectResolver as a, roomSeatSubjectResolver as o } from "./seatSubject.js";
7
+ import { Subject as s } from "@voltro/protocol";
8
+ import { Effect as c, Schema as l } from "effect";
9
+ import { randomBytes as u, randomUUID as d } from "node:crypto";
10
+ // src/developmentBinding.ts
11
+ var f = (t) => t.subjectId === null || t.subjectType !== void 0 && t.subjectType !== "user" ? c.fail(new e({ detail: "Development seats admit signed-in players only" })) : c.try({
12
+ try: () => l.decodeUnknownSync(s)({
13
+ type: "user",
14
+ id: t.subjectId,
15
+ tenantId: t.tenantId,
16
+ ...t.subjectKind === "guest" ? { kind: "guest" } : {}
17
+ }),
18
+ catch: () => new e({ detail: "Development seat Subject is malformed" })
19
+ }), p = (s) => async (c, l) => {
20
+ let p = process.env.NODE_ENV;
21
+ if (p !== "development" && p !== "test") throw new e({ detail: "developmentRoomsBinding runs only in development; production uses the registry binders" });
22
+ let m = l.host?.connectionRegistry, h = l.host?.membership, g = l.host?.runEffect;
23
+ if (!m || !h?.list || !("receive" in h) || typeof h.receive != "function" || !g || !l.catalog) throw new e({ detail: "Development Rooms need the app registry, membership and catalog" });
24
+ let _ = () => ({ current: {
25
+ kid: "dev-" + d().slice(0, 8),
26
+ secret: u(32).toString("base64url")
27
+ } }), v = _(), y = _(), b = Object.freeze({
28
+ instanceId: "rooms-dev-" + d(),
29
+ startedAt: Date.now()
30
+ }), x = h.receive.bind(h), S = () => x({
31
+ ...b,
32
+ meta: { role: "rooms-host" }
33
+ }), C = s.listenHost ?? "127.0.0.1", w = s.publicAddress ?? "ws://" + (C === "0.0.0.0" ? "localhost" : C) + ":" + s.port + "/_voltro/rooms", T = s.auth === void 0 ? {} : {
34
+ authority: s.auth,
35
+ getStore: () => c
36
+ }, E = a(T), D = s.auth === void 0 ? f : o(T), O = s.world, k = Object.getOwnPropertyDescriptor(O ?? {}, "groups"), A = k !== void 0 && "value" in k && k.value !== void 0, j = r({
37
+ region: "local",
38
+ controlConnection: s.connection,
39
+ projectControlSecrets: v,
40
+ seatSecrets: y,
41
+ epochNow: Date.now,
42
+ observerNow: Date.now,
43
+ heartbeatEveryMs: 1e3,
44
+ heartbeatTtlMs: 1e4,
45
+ graceMs: 5e3,
46
+ bindPrivacy: s.bindPrivacy,
47
+ ...s.commands === void 0 || !A ? {} : { commands: s.commands },
48
+ ...O === void 0 ? {} : { world: O },
49
+ ...s.admission === void 0 ? {} : { admission: s.admission },
50
+ ...s.seatAttributes === void 0 ? {} : { seatAttributes: s.seatAttributes }
51
+ });
52
+ if (A && (l.worldState !== "transitions" || !l.worldClientControls || typeof l.host?.runWithAppServices != "function")) throw new e({ detail: "Default World groups require transition state, player controls and the app-service runner" });
53
+ let M = new n(l.pluginName, i({
54
+ topology: "single-node",
55
+ controlConnection: s.connection,
56
+ hotConnection: s.connection,
57
+ projectControlSecrets: v,
58
+ graceMs: 5e3,
59
+ acquire: async () => ({
60
+ store: c,
61
+ registry: m,
62
+ runEffect: g,
63
+ membership: { list: h.list.bind(h) },
64
+ instance: b,
65
+ resolveSeatSubject: D,
66
+ resolveControlSubject: E,
67
+ ...s.commands === void 0 || A ? {} : { application: t(s.commands) },
68
+ readiness: async () => !0,
69
+ release: async () => {}
70
+ }),
71
+ host: {
72
+ address: w,
73
+ region: "local",
74
+ capacity: s.capacity ?? 32,
75
+ clock: { now: () => performance.now() },
76
+ epochNow: Date.now,
77
+ secrets: y,
78
+ heartbeatEveryMs: 1e3,
79
+ heartbeatTtlMs: 1e4,
80
+ seatTtlMs: 3e4,
81
+ measuredCpu: () => 0
82
+ },
83
+ driver: {
84
+ cadenceMs: 50,
85
+ onFailure: () => {}
86
+ },
87
+ listener: {
88
+ host: C,
89
+ port: s.port
90
+ }
91
+ }), { worldState: l.worldState });
92
+ S();
93
+ let N = setInterval(S, 1e3);
94
+ N.unref?.();
95
+ try {
96
+ await M.start(process.cwd(), l.catalog, l.worlds, {}, l.pools);
97
+ let e = await j(c, l);
98
+ return {
99
+ ...e,
100
+ release: async () => {
101
+ try {
102
+ await e.release();
103
+ } finally {
104
+ clearInterval(N), await M.close();
105
+ }
106
+ }
107
+ };
108
+ } catch (e) {
109
+ throw clearInterval(N), await M.close().catch(() => void 0), e;
110
+ }
111
+ };
112
+ export { p as developmentRoomsBinding, f as trustedRoomSeatSubject };