@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.
Files changed (495) hide show
  1. package/CHANGELOG.md +24329 -0
  2. package/LICENSE +61 -0
  3. package/README.md +9204 -2
  4. package/SECURITY.md +56 -0
  5. package/THIRD-PARTY-NOTICES.md +11322 -0
  6. package/dist/actor.js +1474 -0
  7. package/dist/apiBinding.js +678 -0
  8. package/dist/apiRegistryBinding.js +399 -0
  9. package/dist/apiReservations.js +433 -0
  10. package/dist/baselines.js +73 -0
  11. package/dist/bots.d.ts +1485 -0
  12. package/dist/bots.js +563 -0
  13. package/dist/catalog.js +80 -0
  14. package/dist/checkpointJson.js +24 -0
  15. package/dist/checkpointStore.js +386 -0
  16. package/dist/client.js +56 -0
  17. package/dist/clockSync.js +51 -0
  18. package/dist/collision.js +156 -0
  19. package/dist/commandDelivery.js +101 -0
  20. package/dist/commandRecord.js +11 -0
  21. package/dist/commandWithdrawal.js +183 -0
  22. package/dist/connection.js +497 -0
  23. package/dist/controlCarrier.js +375 -0
  24. package/dist/controlRegistry.js +79 -0
  25. package/dist/controlTarget.js +45 -0
  26. package/dist/controlTransport.js +574 -0
  27. package/dist/developmentBinding.js +113 -0
  28. package/dist/directory.js +323 -0
  29. package/dist/directoryProjection.js +117 -0
  30. package/dist/errors.d.ts +125 -0
  31. package/dist/errors.js +53 -0
  32. package/dist/fixed.d.ts +284 -0
  33. package/dist/fixed.js +10 -0
  34. package/dist/fixed32.js +134 -0
  35. package/dist/fixedCollision.js +60 -0
  36. package/dist/fixedCollision32.js +109 -0
  37. package/dist/fixedMath.js +56 -0
  38. package/dist/fixedRaw.js +11 -0
  39. package/dist/fixedSlabs.js +34 -0
  40. package/dist/fixedTrig.js +48 -0
  41. package/dist/fixedTrig32.js +38 -0
  42. package/dist/fixedVectors.js +113 -0
  43. package/dist/fixedVectors32.js +95 -0
  44. package/dist/fixedWide.js +50 -0
  45. package/dist/fixedWords.js +46 -0
  46. package/dist/gateway.js +57 -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 +82 -0
  54. package/dist/geometryActorInventory.js +108 -0
  55. package/dist/geometryAdminClient.js +87 -0
  56. package/dist/geometryAdminData.js +32 -0
  57. package/dist/geometryAdminFixtures.js +50 -0
  58. package/dist/geometryAdminPorts.js +5 -0
  59. package/dist/geometryAdminRpc.js +58 -0
  60. package/dist/geometryAdminRpcRoutes.js +49 -0
  61. package/dist/geometryAdminSchemas.js +39 -0
  62. package/dist/geometryAdministration.js +190 -0
  63. package/dist/geometryAdministrationPorts.js +5 -0
  64. package/dist/geometryApiBinding.js +165 -0
  65. package/dist/geometryAppStorage.js +58 -0
  66. package/dist/geometryArtifacts.js +198 -0
  67. package/dist/geometryAssetBundle.js +117 -0
  68. package/dist/geometryAssetClient.js +25 -0
  69. package/dist/geometryAssetData.js +106 -0
  70. package/dist/geometryAssetHttp.js +123 -0
  71. package/dist/geometryAssetPorts.js +5 -0
  72. package/dist/geometryAssetRpc.js +30 -0
  73. package/dist/geometryAssetRpcRoutes.js +40 -0
  74. package/dist/geometryAssetStorageGrant.js +103 -0
  75. package/dist/geometryBoxOverlap.js +110 -0
  76. package/dist/geometryCatalogueDigest.js +111 -0
  77. package/dist/geometryCellCoverage.js +85 -0
  78. package/dist/geometryCellLoader.js +28 -0
  79. package/dist/geometryChannel.js +134 -0
  80. package/dist/geometryChunkHttp.js +54 -0
  81. package/dist/geometryChunkLeases.js +22 -0
  82. package/dist/geometryClient.d.ts +1429 -0
  83. package/dist/geometryClient.js +149 -0
  84. package/dist/geometryClientChunks.js +330 -0
  85. package/dist/geometryClientDelta.js +25 -0
  86. package/dist/geometryClientHttp.js +37 -0
  87. package/dist/geometryClientInterest.js +109 -0
  88. package/dist/geometryClientStatic.js +34 -0
  89. package/dist/geometryCms.d.ts +763 -0
  90. package/dist/geometryCms.js +217 -0
  91. package/dist/geometryCommitCoordinator.js +241 -0
  92. package/dist/geometryCompactionFixture.js +84 -0
  93. package/dist/geometryCompactionStrategies.js +38 -0
  94. package/dist/geometryConnectionClient.js +23 -0
  95. package/dist/geometryDerivationFixtures.js +141 -0
  96. package/dist/geometryDerivationStrategies.js +27 -0
  97. package/dist/geometryDigest.js +13 -0
  98. package/dist/geometryEditChannel.js +70 -0
  99. package/dist/geometryEditIngress.js +263 -0
  100. package/dist/geometryEdits.js +366 -0
  101. package/dist/geometryEnvelope.js +41 -0
  102. package/dist/geometryGridRaycast.js +92 -0
  103. package/dist/geometryGridSweep.js +92 -0
  104. package/dist/geometryHeightfield.js +166 -0
  105. package/dist/geometryHeightfieldRaycast.js +74 -0
  106. package/dist/geometryHeightfieldSweep.js +85 -0
  107. package/dist/geometryHeightfieldVolume.js +45 -0
  108. package/dist/geometryHost.js +322 -0
  109. package/dist/geometryHostDirectory.js +207 -0
  110. package/dist/geometryHostMutations.js +137 -0
  111. package/dist/geometryHostStreams.js +124 -0
  112. package/dist/geometryHttpBody.js +76 -0
  113. package/dist/geometryHttpRoutes.js +112 -0
  114. package/dist/geometryImportGltf.js +300 -0
  115. package/dist/geometryImportLdtk.js +54 -0
  116. package/dist/geometryImportPng.js +144 -0
  117. package/dist/geometryImportPublication.js +67 -0
  118. package/dist/geometryImportTiled.js +39 -0
  119. package/dist/geometryImportTiles.js +136 -0
  120. package/dist/geometryImportVox.js +130 -0
  121. package/dist/geometryImportedSource.js +101 -0
  122. package/dist/geometryInspectEndpoint.js +248 -0
  123. package/dist/geometryInspection.js +92 -0
  124. package/dist/geometryInstall.js +121 -0
  125. package/dist/geometryJournalArchiveData.js +21 -0
  126. package/dist/geometryJournalArchiveIndex.js +330 -0
  127. package/dist/geometryJournalArchiveTable.js +21 -0
  128. package/dist/geometryJournalCompaction.js +100 -0
  129. package/dist/geometryJournalPatch.js +47 -0
  130. package/dist/geometryJournalRetention.js +112 -0
  131. package/dist/geometryJournalRetentionSchemas.js +36 -0
  132. package/dist/geometryJournalRetentionSweep.js +112 -0
  133. package/dist/geometryJournalRetentionWorkflow.js +28 -0
  134. package/dist/geometryJournalRetentionWorkflowData.js +31 -0
  135. package/dist/geometryJournalStorage.js +148 -0
  136. package/dist/geometryLoader.js +118 -0
  137. package/dist/geometryManifest.js +113 -0
  138. package/dist/geometryManifestChannel.js +93 -0
  139. package/dist/geometryManifestClient.js +122 -0
  140. package/dist/geometryManifestData.js +49 -0
  141. package/dist/geometryManifestPorts.js +5 -0
  142. package/dist/geometryManifestPublication.js +109 -0
  143. package/dist/geometryManifestSource.js +68 -0
  144. package/dist/geometryMigrationJournal.js +14 -0
  145. package/dist/geometryMigrationStrategies.js +7 -0
  146. package/dist/geometryMigrations.js +323 -0
  147. package/dist/geometryNativeMetadata.js +52 -0
  148. package/dist/geometryPatch.js +170 -0
  149. package/dist/geometryPersistence.js +449 -0
  150. package/dist/geometryPersistenceCapture.js +69 -0
  151. package/dist/geometryPersistenceData.js +140 -0
  152. package/dist/geometryPersistencePorts.js +5 -0
  153. package/dist/geometryPlayerAdmission.js +34 -0
  154. package/dist/geometryPlayerEditOwner.js +265 -0
  155. package/dist/geometryPlayerEdits.js +49 -0
  156. package/dist/geometryPrepared.js +188 -0
  157. package/dist/geometryPrivacyFence.js +24 -0
  158. package/dist/geometryProceduralPublication.js +91 -0
  159. package/dist/geometryProceduralWorker.js +164 -0
  160. package/dist/geometryPublication.js +110 -0
  161. package/dist/geometryRayAlgebra.js +116 -0
  162. package/dist/geometryReadClient.js +157 -0
  163. package/dist/geometryReadPorts.js +5 -0
  164. package/dist/geometryReadRpc.js +27 -0
  165. package/dist/geometryReadRpcRoutes.js +47 -0
  166. package/dist/geometryReliablePublication.js +82 -0
  167. package/dist/geometryReloadPorts.js +46 -0
  168. package/dist/geometryReloadSource.js +278 -0
  169. package/dist/geometryRenderCache.js +165 -0
  170. package/dist/geometryRenderLod.js +102 -0
  171. package/dist/geometryRollback.js +125 -0
  172. package/dist/geometryRollbackCoordinator.js +203 -0
  173. package/dist/geometryRollbackPorts.js +46 -0
  174. package/dist/geometryRollbackSource.js +209 -0
  175. package/dist/geometryRollbackStore.js +198 -0
  176. package/dist/geometrySchemas.js +27 -0
  177. package/dist/geometryServer.d.ts +2766 -0
  178. package/dist/geometryServer.js +62 -0
  179. package/dist/geometryShapeRaycast.js +111 -0
  180. package/dist/geometryShapeSegments.js +34 -0
  181. package/dist/geometryShapes.js +223 -0
  182. package/dist/geometrySnapshot.js +76 -0
  183. package/dist/geometrySnapshotChannel.js +160 -0
  184. package/dist/geometrySnapshotClient.js +159 -0
  185. package/dist/geometrySnapshotPreparation.js +76 -0
  186. package/dist/geometrySnapshotServer.js +191 -0
  187. package/dist/geometrySqlOwner.js +21 -0
  188. package/dist/geometryStorage.js +127 -0
  189. package/dist/geometryStorageGrant.js +69 -0
  190. package/dist/geometryStorageIdentity.js +9 -0
  191. package/dist/geometryTileArtifact.js +10 -0
  192. package/dist/geometryTileCodec.js +194 -0
  193. package/dist/geometryTileCollision.js +96 -0
  194. package/dist/geometryTileNavigation.js +128 -0
  195. package/dist/geometryTileView.js +35 -0
  196. package/dist/geometryVersionActivation.js +114 -0
  197. package/dist/geometryVersionClient.js +238 -0
  198. package/dist/geometryVersionCompare.js +40 -0
  199. package/dist/geometryVersionMigration.js +106 -0
  200. package/dist/geometryVoxel.js +253 -0
  201. package/dist/geometryWorldEntitySubject.js +32 -0
  202. package/dist/geometryWorldExtent.js +12 -0
  203. package/dist/geometryWorldMetadata.js +38 -0
  204. package/dist/geometryWorldStrategyFixtures.js +127 -0
  205. package/dist/geometryWorldView.js +307 -0
  206. package/dist/host.js +128 -0
  207. package/dist/hostBinding.js +277 -0
  208. package/dist/hostCellObservation.js +114 -0
  209. package/dist/hostClientCapacity.js +90 -0
  210. package/dist/hostCommandScope.js +64 -0
  211. package/dist/hostController.js +3094 -0
  212. package/dist/hostDeployment.js +65 -0
  213. package/dist/hostDrain.js +152 -0
  214. package/dist/hostDrainPorts.js +5 -0
  215. package/dist/hostDriver.js +179 -0
  216. package/dist/hostLane.js +288 -0
  217. package/dist/hostListener.js +79 -0
  218. package/dist/hostListenerBinding.js +19 -0
  219. package/dist/hostLoopObservation.js +90 -0
  220. package/dist/hostMetrics.js +56 -0
  221. package/dist/hostRegistryBinding.js +418 -0
  222. package/dist/hostSelection.js +16 -0
  223. package/dist/hostShutdown.js +47 -0
  224. package/dist/hostTurnObservation.js +53 -0
  225. package/dist/identities.js +4 -0
  226. package/dist/index.d.ts +8632 -0
  227. package/dist/index.js +232 -0
  228. package/dist/inputReceipts.js +63 -0
  229. package/dist/inputRedundancy.js +55 -0
  230. package/dist/inspect.js +238 -0
  231. package/dist/lockstep.d.ts +436 -0
  232. package/dist/lockstep.js +382 -0
  233. package/dist/lockstepAdmission.js +262 -0
  234. package/dist/lockstepAdmissionCodec.js +94 -0
  235. package/dist/lockstepAdmissionPorts.js +5 -0
  236. package/dist/lockstepClientSession.js +578 -0
  237. package/dist/lockstepDefinition.js +148 -0
  238. package/dist/lockstepHostLoop.js +243 -0
  239. package/dist/lockstepInitialAdmission.js +67 -0
  240. package/dist/lockstepInitialStrategyFixtures.js +45 -0
  241. package/dist/lockstepJournal.js +395 -0
  242. package/dist/lockstepJournalCodec.js +254 -0
  243. package/dist/lockstepJournalPorts.js +5 -0
  244. package/dist/lockstepJournalRebuild.js +208 -0
  245. package/dist/lockstepJournalRows.js +57 -0
  246. package/dist/lockstepMembers.js +131 -0
  247. package/dist/lockstepMessages.js +47 -0
  248. package/dist/lockstepOwnedRoom.js +764 -0
  249. package/dist/lockstepPolicies.js +84 -0
  250. package/dist/lockstepReact.js +47 -0
  251. package/dist/lockstepRecoveryTruth.js +121 -0
  252. package/dist/lockstepRosterConfig.js +32 -0
  253. package/dist/lockstepSeed.js +12 -0
  254. package/dist/lockstepSeedFixture.js +20 -0
  255. package/dist/lockstepServer.d.ts +3897 -0
  256. package/dist/lockstepServer.js +325 -0
  257. package/dist/lockstepServerConfig.js +101 -0
  258. package/dist/lockstepServerRoles.js +403 -0
  259. package/dist/lockstepServerStrategyFixtures.js +33 -0
  260. package/dist/lockstepStrategies.js +6 -0
  261. package/dist/lockstepStrategyFixtures.js +137 -0
  262. package/dist/lockstepTerminal.js +90 -0
  263. package/dist/lockstepTerminalPorts.js +5 -0
  264. package/dist/lockstepTransport.js +773 -0
  265. package/dist/lockstepTransportConfig.js +32 -0
  266. package/dist/lockstepWireRoster.js +34 -0
  267. package/dist/matchRoomProvider.js +32 -0
  268. package/dist/matchRooms.js +19 -0
  269. package/dist/membershipObserver.js +47 -0
  270. package/dist/moderation.js +98 -0
  271. package/dist/movementSpecials.js +104 -0
  272. package/dist/ownership.js +17 -0
  273. package/dist/ownershipWithdrawal.js +18 -0
  274. package/dist/pcg32.js +96 -0
  275. package/dist/ports.d.ts +1241 -0
  276. package/dist/ports.js +11 -0
  277. package/dist/quaternion.js +70 -0
  278. package/dist/react.d.ts +406 -0
  279. package/dist/react.js +109 -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 +243 -0
  283. package/dist/reaperSchemas.js +42 -0
  284. package/dist/reaperWorkflow.js +70 -0
  285. package/dist/recovery.js +189 -0
  286. package/dist/recoverySeats.js +26 -0
  287. package/dist/replay.d.ts +273 -0
  288. package/dist/replay.js +485 -0
  289. package/dist/replayPorts.js +5 -0
  290. package/dist/replayRecording.js +67 -0
  291. package/dist/replaySchema.js +157 -0
  292. package/dist/replayStorage.d.ts +149 -0
  293. package/dist/replayStorage.js +485 -0
  294. package/dist/reservationBatch.js +422 -0
  295. package/dist/reservationSchemas.js +17 -0
  296. package/dist/reservations.js +259 -0
  297. package/dist/reservePort.js +69 -0
  298. package/dist/resolvedOptions.js +4 -0
  299. package/dist/room.d.ts +1006 -0
  300. package/dist/room.js +284 -0
  301. package/dist/roomAccessSweep.js +95 -0
  302. package/dist/roomAppCommandControl.js +59 -0
  303. package/dist/roomAuthoringStrategy.js +17 -0
  304. package/dist/roomErasure.js +198 -0
  305. package/dist/roomPoolRuntimeDefaults.js +24 -0
  306. package/dist/roomPoolSelection.js +19 -0
  307. package/dist/roomPoolTopology.js +212 -0
  308. package/dist/rpc.d.ts +551 -0
  309. package/dist/rpc.js +112 -0
  310. package/dist/rpcClient.js +152 -0
  311. package/dist/rpcRoutes.js +28 -0
  312. package/dist/runtime.js +1123 -0
  313. package/dist/schemaHistory.js +98 -0
  314. package/dist/seatStore.js +151 -0
  315. package/dist/seatStrategyFixtures.js +52 -0
  316. package/dist/seatSubject.js +32 -0
  317. package/dist/seats.js +130 -0
  318. package/dist/serverSession.js +811 -0
  319. package/dist/serverSessionConfig.js +43 -0
  320. package/dist/sessionAdmission.js +53 -0
  321. package/dist/sidecarAdmission.js +103 -0
  322. package/dist/sidecarConfig.js +116 -0
  323. package/dist/sidecarConfigPublication.js +64 -0
  324. package/dist/sidecarHostListener.js +208 -0
  325. package/dist/sidecarIpc.js +205 -0
  326. package/dist/sidecarPeer.js +310 -0
  327. package/dist/sidecarProcessPort.js +28 -0
  328. package/dist/sidecarRuntime.js +168 -0
  329. package/dist/sidecarSelection.js +142 -0
  330. package/dist/sidecarWire.js +178 -0
  331. package/dist/sidecarWrites.js +163 -0
  332. package/dist/simulation.d.ts +391 -0
  333. package/dist/simulation.js +282 -0
  334. package/dist/simulationAuthoring.js +29 -0
  335. package/dist/simulationBytes.js +27 -0
  336. package/dist/simulationConformance.js +305 -0
  337. package/dist/simulationInputHistoryCapture.js +35 -0
  338. package/dist/simulationInputHistoryWire.js +193 -0
  339. package/dist/simulationOptionsWire.js +78 -0
  340. package/dist/simulationRecoveryWire.js +134 -0
  341. package/dist/simulationReplay.js +127 -0
  342. package/dist/simulationSnapshotWire.js +112 -0
  343. package/dist/simulationState.js +178 -0
  344. package/dist/snapshotBlob.js +126 -0
  345. package/dist/snapshotBlobCleanup.js +93 -0
  346. package/dist/snapshotBlobIndex.js +38 -0
  347. package/dist/snapshotBudget.js +80 -0
  348. package/dist/snapshotChain.js +185 -0
  349. package/dist/snapshotErasure.js +172 -0
  350. package/dist/snapshotInspection.js +105 -0
  351. package/dist/snapshotSegmentBlobs.js +58 -0
  352. package/dist/snapshotUploads.js +166 -0
  353. package/dist/socketTransport.js +253 -0
  354. package/dist/spatial.js +104 -0
  355. package/dist/spectatorPolicy.js +26 -0
  356. package/dist/spectatorProducer.js +89 -0
  357. package/dist/startFailureCause.js +4 -0
  358. package/dist/stateCodec.js +658 -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 +182 -0
  364. package/dist/streamFraming.js +122 -0
  365. package/dist/streamTransport.js +266 -0
  366. package/dist/subjectAdmission.js +50 -0
  367. package/dist/subjectPrivacy.js +281 -0
  368. package/dist/subjectPrivacyBinding.js +90 -0
  369. package/dist/systemManifest.js +182 -0
  370. package/dist/tables.js +159 -0
  371. package/dist/testHarness.js +89 -0
  372. package/dist/testing.d.ts +3684 -0
  373. package/dist/testing.js +221 -0
  374. package/dist/testingPorts.js +271 -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 +217 -0
  379. package/dist/transform3d.js +118 -0
  380. package/dist/transformCollection.js +24 -0
  381. package/dist/transformCollection3d.js +24 -0
  382. package/dist/transformCollectionCore.js +156 -0
  383. package/dist/transformFrames.js +121 -0
  384. package/dist/transformPrediction3d.js +127 -0
  385. package/dist/transformRules.js +123 -0
  386. package/dist/transformSchemas.js +20 -0
  387. package/dist/transport.js +32 -0
  388. package/dist/transportAuthoring.js +29 -0
  389. package/dist/transportCleanup.js +22 -0
  390. package/dist/transportConformance.js +124 -0
  391. package/dist/transportConnector.js +82 -0
  392. package/dist/transportEndpoints.js +38 -0
  393. package/dist/transportsServer.d.ts +5515 -0
  394. package/dist/transportsServer.js +6 -0
  395. package/dist/viewProjection.js +16 -0
  396. package/dist/web.d.ts +2286 -0
  397. package/dist/web.js +518 -0
  398. package/dist/webTransportClient.js +173 -0
  399. package/dist/wire.d.ts +992 -0
  400. package/dist/wire.js +492 -0
  401. package/dist/withdrawalPort.js +28 -0
  402. package/dist/world.d.ts +1894 -0
  403. package/dist/world.js +333 -0
  404. package/dist/worldActorReceipts.js +48 -0
  405. package/dist/worldActorTransferSnapshot.js +14 -0
  406. package/dist/worldAdmissionPending.js +8 -0
  407. package/dist/worldBoundaryCoordinator.js +148 -0
  408. package/dist/worldCatalog.js +81 -0
  409. package/dist/worldCellAllocation.js +203 -0
  410. package/dist/worldCellDestination.js +68 -0
  411. package/dist/worldCells.js +489 -0
  412. package/dist/worldChange.js +32 -0
  413. package/dist/worldClient.js +664 -0
  414. package/dist/worldClientControl.js +141 -0
  415. package/dist/worldClientPendingInput.js +16 -0
  416. package/dist/worldClientRpc.js +133 -0
  417. package/dist/worldClientRpcRoutes.js +43 -0
  418. package/dist/worldClientSchemas.js +28 -0
  419. package/dist/worldCommands.js +140 -0
  420. package/dist/worldData.js +42 -0
  421. package/dist/worldDefaultBinding.js +377 -0
  422. package/dist/worldDefaultGroupAdmission.js +82 -0
  423. package/dist/worldDefaultGroupAppServices.js +31 -0
  424. package/dist/worldDefaultGroupCompensation.js +109 -0
  425. package/dist/worldDefaultGroupContinuation.js +96 -0
  426. package/dist/worldDefaultGroupControl.js +72 -0
  427. package/dist/worldDefaultGroupMembers.js +85 -0
  428. package/dist/worldDefaultGroups.js +21 -0
  429. package/dist/worldDefaultPending.js +79 -0
  430. package/dist/worldDefaultService.js +245 -0
  431. package/dist/worldEntities.js +2980 -0
  432. package/dist/worldEntityCodec.js +21 -0
  433. package/dist/worldEntityHandoffView.js +154 -0
  434. package/dist/worldGeometry.js +170 -0
  435. package/dist/worldGhostAdmission.js +65 -0
  436. package/dist/worldGhostDestination.js +118 -0
  437. package/dist/worldGhostGateway.js +132 -0
  438. package/dist/worldGhostHandshake.js +108 -0
  439. package/dist/worldGhostHost.js +42 -0
  440. package/dist/worldGhostIngress.js +132 -0
  441. package/dist/worldGhostNeighborhood.js +70 -0
  442. package/dist/worldGhostNeighbors.js +86 -0
  443. package/dist/worldGhostOutbound.js +110 -0
  444. package/dist/worldGhostPublisher.js +216 -0
  445. package/dist/worldGhostReceiver.js +213 -0
  446. package/dist/worldGhostSender.js +146 -0
  447. package/dist/worldGhostSocket.js +78 -0
  448. package/dist/worldGhostWire.js +172 -0
  449. package/dist/worldGroupCommand.js +49 -0
  450. package/dist/worldGroupDeadline.js +115 -0
  451. package/dist/worldGroupPreparation.js +115 -0
  452. package/dist/worldGroupReadyControl.js +128 -0
  453. package/dist/worldGroupSupervisor.js +120 -0
  454. package/dist/worldHandoffMetrics.js +59 -0
  455. package/dist/worldHandoffView.js +100 -0
  456. package/dist/worldHostSource.js +69 -0
  457. package/dist/worldInspectEndpoint.js +250 -0
  458. package/dist/worldInspection.js +109 -0
  459. package/dist/worldInstanceAdmission.js +31 -0
  460. package/dist/worldInstanceAllocation.js +116 -0
  461. package/dist/worldInstanceDestination.js +64 -0
  462. package/dist/worldInstanceExpiry.js +282 -0
  463. package/dist/worldInstanceExpirySupervisor.js +88 -0
  464. package/dist/worldInstanceLifecycle.js +103 -0
  465. package/dist/worldInstanceState.js +52 -0
  466. package/dist/worldInstances.js +478 -0
  467. package/dist/worldJoin.js +56 -0
  468. package/dist/worldLayers.js +151 -0
  469. package/dist/worldLeases.js +78 -0
  470. package/dist/worldManifest.js +25 -0
  471. package/dist/worldMovement.js +63 -0
  472. package/dist/worldPersistence.js +134 -0
  473. package/dist/worldProjection.js +221 -0
  474. package/dist/worldReact.js +110 -0
  475. package/dist/worldRecoveryActor.js +35 -0
  476. package/dist/worldReturnAnchor.js +49 -0
  477. package/dist/worldRoomHooks.js +57 -0
  478. package/dist/worldRoomPool.js +27 -0
  479. package/dist/worldRoomSteps.js +133 -0
  480. package/dist/worldSeatBinding.js +36 -0
  481. package/dist/worldServer.d.ts +6936 -0
  482. package/dist/worldServer.js +48 -0
  483. package/dist/worldSourceSeatPending.js +9 -0
  484. package/dist/worldStrategyFixtures.js +164 -0
  485. package/dist/worldTesting.js +27 -0
  486. package/dist/worldTransitionDefaults.js +198 -0
  487. package/dist/worldTransitionExecutor.js +519 -0
  488. package/dist/worldTransitionGroup.js +113 -0
  489. package/dist/worldTransitionPhysicalSteps.js +40 -0
  490. package/dist/worldTransitionResolver.js +228 -0
  491. package/dist/worldTransitionSeatGroup.js +64 -0
  492. package/dist/worldTransitionSeats.js +260 -0
  493. package/dist/worldTransitionState.js +95 -0
  494. package/dist/worldTransitions.js +101 -0
  495. package/package.json +189 -4
@@ -0,0 +1,418 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ import { simulationOwnData as t } from "./simulationAuthoring.js";
3
+ import { RoomStateCodec as n } from "./stateCodec.js";
4
+ import { roomHostTransportEndpoints as r } from "./transportEndpoints.js";
5
+ import { captureRoomSnapshotBlobs as i } from "./snapshotBlobIndex.js";
6
+ import { dataStoreRoomErasure as a } from "./roomErasure.js";
7
+ import { assertRoomSeatSecrets as o, resolveRoomSeatTokenStrategies as s } from "./seats.js";
8
+ import { captureAdmittedRoomPoolTopology as c, captureRoomPoolCatalog as l, roomPoolHostedNames as u, roomPoolPublicAddress as ee } from "./roomPoolTopology.js";
9
+ import { roomCheckpointsTable as te, roomCommandsTable as ne, roomHostsTable as re, roomLockstepTicksTable as ie, roomSeatsTable as ae, roomSnapshotSegmentsTable as oe, roomSubjectPrivacyTable as se, roomsTable as ce } from "./tables.js";
10
+ import { captureRoomWorldEntitySource as le } from "./worldHostSource.js";
11
+ import { captureRoomHostGeometryBinding as ue } from "./geometryHost.js";
12
+ import { dataStoreRoomDirectory as de } from "./directory.js";
13
+ import { captureRoomHostDriverOptions as fe } from "./hostDriver.js";
14
+ import { runtimeRoomHostListener as d } from "./hostListener.js";
15
+ import { makeRoomControlCarrier as f } from "./controlCarrier.js";
16
+ import { captureRoomHostShutdownPolicy as p } from "./hostShutdown.js";
17
+ import { captureRoomHostDeployment as m } from "./hostDeployment.js";
18
+ import { RoomsHostBindFailure as h } from "./hostBinding.js";
19
+ import { routedRoomHostWithdrawalService as pe } from "./withdrawalPort.js";
20
+ import { forwardedRoomAppCommands as me, roomAppCommandTarget as he } from "./roomAppCommandControl.js";
21
+ import { openRegistryRoomControlClient as ge, openRegistryRoomControlServer as _e } from "./controlRegistry.js";
22
+ import { directoryRoomControlTargetResolver as ve } from "./controlTarget.js";
23
+ import { dataStoreRoomRecovery as ye } from "./recovery.js";
24
+ import { WORLD_DEFAULT_MAX_BYTES as be, defaultHostWorld as xe } from "./worldDefaultBinding.js";
25
+ import { applicationRoomExternalWorkWithdrawal as Se } from "./commandWithdrawal.js";
26
+ import { Effect as g, Option as Ce } from "effect";
27
+ import { ConnectionRegistry as we } from "@voltro/kv/connection";
28
+ import { HotStore as Te, layerRoutedHotRedis as Ee } from "@voltro/kv/hot";
29
+ //#region src/hostRegistryBinding.ts
30
+ function _(t) {
31
+ throw new e({ detail: t });
32
+ }
33
+ var v = (e, t) => Number.isSafeInteger(e) && e > 0 && e <= t ? e : _("Invalid registry Rooms host budget"), y = (t) => typeof t.appDependencies == "function" ? t.appDependencies() : Promise.reject(new e({ detail: "Default Rooms host dependencies need the voltro rooms host runner; pass acquire for a custom process" })), b = (b) => {
34
+ if (!b || b.acquire !== void 0 && typeof b.acquire != "function" || !["single-node", "multi-node"].includes(b.topology) || !/^(redis|nats):[A-Za-z][A-Za-z0-9_-]*$/.test(b.controlConnection) || !/^redis:[A-Za-z][A-Za-z0-9_-]*$/.test(b.hotConnection) || !b.host || typeof b.host.clock?.now != "function" || typeof b.host.epochNow != "function" || typeof b.host.measuredCpu != "function" || typeof b.host.address != "string" || !b.host.address.trim() || typeof b.host.region != "string" || !b.host.region.trim() || !b.listener || typeof b.listener != "object" || Array.isArray(b.listener)) return _("Registry Rooms host requires explicit topology, app acquisition, routing and clocks");
35
+ if (Object.keys(b.host).some((e) => ![
36
+ "pools",
37
+ "pool",
38
+ "clientCapacity",
39
+ "address",
40
+ "webTransportAddress",
41
+ "webTransportCertificateHash",
42
+ "region",
43
+ "capacity",
44
+ "clock",
45
+ "epochNow",
46
+ "secrets",
47
+ "heartbeatTtlMs",
48
+ "heartbeatEveryMs",
49
+ "seatTtlMs",
50
+ "maxQueuedOperations",
51
+ "lockstepTransport",
52
+ "snapshotBudget",
53
+ "snapshotBlobs",
54
+ "maxInlineBytes",
55
+ "spectatorGroups",
56
+ "replayRecordings",
57
+ "measuredCpu",
58
+ "strategies"
59
+ ].includes(e)) || Object.keys(b.listener).some((e) => ![
60
+ "port",
61
+ "host",
62
+ "health",
63
+ "security",
64
+ "startupTimeoutMs",
65
+ "onBound",
66
+ "metricsToken",
67
+ "metricsPreviousToken"
68
+ ].includes(e))) return _("Registry Rooms host dependencies and listener admission belong to the acquired owner");
69
+ o(b.host.secrets), o(b.projectControlSecrets);
70
+ let x = Object.getOwnPropertyDescriptor(b.host, "webTransportAddress"), S = Object.getOwnPropertyDescriptor(b.host, "webTransportCertificateHash");
71
+ if (x && (!("value" in x) || !x.enumerable) || !x && "webTransportAddress" in b.host || S && (!("value" in S) || !S.enumerable) || !S && "webTransportCertificateHash" in b.host) return _("Registry Rooms host native endpoint requires own routing data");
72
+ let C = r(b.host.address, x?.value, S?.value);
73
+ if (b.host.spectatorGroups !== void 0 && typeof b.host.spectatorGroups != "function") return _("Invalid spectator view-group resolver");
74
+ if (b.host.replayRecordings !== void 0 && typeof b.host.replayRecordings != "function") return _("Invalid replay recording resolver");
75
+ for (let e of [
76
+ "pools",
77
+ "pool",
78
+ "clientCapacity"
79
+ ]) {
80
+ let t = Object.getOwnPropertyDescriptor(b.host, e);
81
+ if (t && (!t.enumerable || !("value" in t)) || !t && e in b.host) return _("Registry host pool selection requires own data");
82
+ }
83
+ let w = b.host.pools === void 0 ? void 0 : c(b.host.pools), T = w === void 0 ? void 0 : b.host.pool ?? w.default, E = T === void 0 ? void 0 : w.pools[T];
84
+ if (w ? !E || !E.regions.includes(b.host.region) : b.host.pool !== void 0 || b.host.clientCapacity !== void 0) return _("Registry host pool or region is not admitted");
85
+ let D = E?.hot ?? b.hotConnection;
86
+ if (!/^redis:[A-Za-z][A-Za-z0-9_-]*$/.test(D)) return _("Registry host pools require a named Redis Hot Store connection");
87
+ if ("continueWorldGroups" in b.driver) return _("Registry World continuation must come from the acquired owner");
88
+ let De = b.acquire ?? y, O = b.topology, k = b.controlConnection, A = b.hotConnection, j = structuredClone(b.projectControlSecrets), M = structuredClone(b.host.secrets), N = b.host.epochNow, Oe = Object.freeze({ now: b.host.clock.now.bind(b.host.clock) }), ke = fe(b.driver), Ae = v(b.maxCheckpointBytes ?? 1048576, 67108864), P = v(b.maxRequestMs ?? 5e3, 6e4), je = v(b.maxReceipts ?? 4096, 65536), Me = v(b.maxInFlight ?? 128, je), Ne = v(b.graceMs, 2 ** 53 - 1), Pe = p({
89
+ graceMs: Ne,
90
+ maxCheckpointBytes: Ae,
91
+ ...b.drainMs === void 0 ? {} : { drainMs: b.drainMs }
92
+ }), F = s(b.host.strategies?.seatToken), I = i(b.host.snapshotBlobs), L = Object.freeze({
93
+ ...b.host,
94
+ pools: w,
95
+ pool: T,
96
+ address: C.ws,
97
+ webTransportAddress: C.wt,
98
+ webTransportCertificateHash: C.wtCertificateHash,
99
+ secrets: M,
100
+ epochNow: N,
101
+ clock: Oe,
102
+ measuredCpu: b.host.measuredCpu,
103
+ snapshotBudget: b.host.snapshotBudget === void 0 ? void 0 : Object.freeze({ ...b.host.snapshotBudget }),
104
+ snapshotBlobs: I,
105
+ strategies: Object.freeze({
106
+ ...b.host.strategies,
107
+ seatToken: F
108
+ })
109
+ }), R = Object.freeze({
110
+ ...b.listener,
111
+ security: b.listener.security === void 0 ? void 0 : structuredClone(b.listener.security)
112
+ }), Fe = b.gateway === void 0 ? void 0 : Object.freeze({
113
+ ...b.gateway,
114
+ limits: b.gateway.limits === void 0 ? void 0 : Object.freeze({ ...b.gateway.limits })
115
+ });
116
+ for (let e of [
117
+ L.capacity,
118
+ L.heartbeatEveryMs,
119
+ L.heartbeatTtlMs,
120
+ L.seatTtlMs,
121
+ L.maxQueuedOperations ?? 128
122
+ ]) v(e, 2 ** 53 - 1);
123
+ if (L.heartbeatEveryMs >= L.heartbeatTtlMs) return _("Room host heartbeat cadence must precede its routing TTL");
124
+ d({
125
+ ...R,
126
+ readiness: async () => !1
127
+ });
128
+ let z = [j.current, ...j.previous ? [j.previous] : []], B = [M.current, ...M.previous ? [M.previous] : []];
129
+ return z.some((e) => B.some((t) => e.secret === t.secret)) ? _("Room control and seat signing keys must be independent") : async (r) => {
130
+ if (r.signal.aborted) return _("Registry Rooms host acquisition was cancelled");
131
+ if (r.pools !== void 0 && w !== void 0 && r.pools !== w) return _("Room pools must have one app-owned declaration");
132
+ let i = r.pools === void 0 ? w : l(r.pools, r.catalog.inventory().map((e) => e.descriptor.name)), o = r.selection?.pool ?? L.pool ?? i?.default, s = r.selection?.region ?? L.region, c = o === void 0 ? void 0 : i?.pools[o];
133
+ if (i ? !c || !c.regions.includes(s) : o !== void 0) return _("Registry host process pool or region is not admitted");
134
+ let p = m(process.env, o, s), v = p === void 0 ? R : Object.freeze({
135
+ ...R,
136
+ port: p.port,
137
+ host: p.host,
138
+ ...p.metricsToken === void 0 ? {} : { metricsToken: p.metricsToken },
139
+ ...p.metricsPreviousToken === void 0 ? {} : { metricsPreviousToken: p.metricsPreviousToken }
140
+ });
141
+ d({
142
+ ...v,
143
+ readiness: async () => !1
144
+ });
145
+ let y = c?.hot ?? A;
146
+ if (!/^redis:[A-Za-z][A-Za-z0-9_-]*$/.test(y)) return _("Registry host pools require a named Redis Hot Store connection");
147
+ let b = y, x = Object.freeze({
148
+ ...L,
149
+ pools: i,
150
+ pool: o,
151
+ region: s,
152
+ capacity: c?.capacity?.rooms ?? L.capacity,
153
+ clientCapacity: c?.capacity?.clients ?? L.clientCapacity
154
+ });
155
+ i && l(i, r.catalog.inventory().map((e) => e.descriptor.name));
156
+ let S = new Set(u(i, o, r.catalog.inventory().map((e) => e.descriptor.name))), C = Object.freeze(r.worlds.filter((e) => [...e.zones, ...e.instances].some((e) => S.has(e.room)))), T = Object.freeze({
157
+ ...r,
158
+ hostedRooms: Object.freeze(r.catalog.inventory().filter((e) => S.has(e.descriptor.name))),
159
+ hostedWorlds: C
160
+ });
161
+ f({
162
+ mount: r.pluginName,
163
+ projectControlSecrets: j,
164
+ epochNow: N,
165
+ maxRequestMs: P
166
+ });
167
+ let E;
168
+ try {
169
+ E = await De(T);
170
+ } catch (e) {
171
+ if (e instanceof h) throw e;
172
+ return _("Registry Rooms host app acquisition did not complete");
173
+ }
174
+ if (typeof E?.release != "function") return _("Registry Rooms host app acquisition must retain cleanup");
175
+ let D = E.release.bind(E), F = !1, z = null, B = () => {
176
+ if (F) return Promise.resolve();
177
+ if (z) return z;
178
+ let e = Promise.resolve().then(D).then(() => {
179
+ F = !0;
180
+ });
181
+ return z = e, e.then(() => {
182
+ z = null;
183
+ }, () => {
184
+ z = null;
185
+ }), e;
186
+ };
187
+ try {
188
+ let l = E.store, u = E.registry, f = Object.freeze({ ...E.instance }), m = E.runEffect;
189
+ if (!l || typeof l.query != "function" || typeof l.transactional != "function" || !u || typeof u.validate != "function" || typeof u.config != "function" || typeof u.probe != "function" || typeof u.pubsub != "function" || typeof m != "function" || typeof E.membership?.list != "function" || typeof E.resolveSeatSubject != "function" || typeof E.resolveControlSubject != "function" || E.application !== void 0 && typeof E.application.deliver != "function" || typeof E.readiness != "function" || typeof f.instanceId != "string" || !f.instanceId.trim() || f.instanceId.length > 191 || !Number.isSafeInteger(f.startedAt) || f.startedAt < 0) return _("Registry Rooms host app dependencies are incomplete");
190
+ let h = ee(i, o, s, f.instanceId, x.address);
191
+ if (p?.publicAddress !== void 0 && c?.publicAddress !== void 0 && p.publicAddress !== h) return _("Deployment public routing conflicts with the app pool address");
192
+ let y = p?.publicAddress ?? h, S = Object.freeze({ list: E.membership.list.bind(E.membership) }), w = E.resolveSeatSubject, D = E.resolveControlSubject, De = E.readiness, A, F = E.application, L = Object.freeze(F ? { deliver: F.deliver.bind(F) } : me({ deliver: (t) => A ? A.commands.deliver(t) : g.fail(new e({ detail: "Room app commands wait for the control client" })) })), R = Object.getOwnPropertyDescriptor(E, "erasure");
193
+ if (R && !("value" in R) || !R && "erasure" in E) return _("Registry Rooms erasure requires an own actual capability");
194
+ let z = R?.value === void 0 ? void 0 : t(R.value, ["erase"], ["erase"]);
195
+ if (z && typeof z.erase != "function") return _("Registry Rooms erasure capability is incomplete");
196
+ let Ie = z ? Object.freeze({ erase: z.erase.bind(R?.value) }) : void 0, V = Object.getOwnPropertyDescriptor(E, "lockstepPorts");
197
+ if (V && !("value" in V) || !V && "lockstepPorts" in E) return _("Registry Lockstep factories require own configuration");
198
+ let Le = V?.value === void 0 ? {} : t(V.value, [
199
+ "lockstepAdmission",
200
+ "lockstepJournal",
201
+ "lockstepTerminal"
202
+ ], []);
203
+ if (Object.values(Le).some((e) => typeof e != "function")) return _("Registry Lockstep replacement factory is incomplete");
204
+ let H = Object.getOwnPropertyDescriptor(E, "worldEntities");
205
+ if (H && !("value" in H) || !H && "worldEntities" in E) return _("Registry World recovery requires an own capability");
206
+ let Re = H?.value, U = Re === void 0 ? void 0 : le(Re), W = Object.getOwnPropertyDescriptor(E, "resolveWorldPlayer");
207
+ if (W && (!("value" in W) || typeof W.value != "function") || !W && "resolveWorldPlayer" in E) return _("Registry World player selection requires an own acquired callback");
208
+ let ze = W === void 0 ? void 0 : W.value.bind(E);
209
+ if (ze && !U?.admitActorPlayer) return _("Registry World player selection requires actual entity admission");
210
+ let G = Object.getOwnPropertyDescriptor(E, "worldGroups");
211
+ if (G && !("value" in G) || !G && "worldGroups" in E) return _("Registry World supervision requires an own acquired capability");
212
+ let K = G === void 0 ? void 0 : t(G.value, ["runDue"], ["runDue"]);
213
+ if (K && typeof K.runDue != "function") return _("Registry World supervision requires actual bounded continuation");
214
+ let Be = K ? K.runDue.bind(G.value) : void 0, q = Object.getOwnPropertyDescriptor(E, "worldInstanceExpiry");
215
+ if (q && !("value" in q) || !q && "worldInstanceExpiry" in E) return _("Registry instance expiry requires an own acquired capability");
216
+ let J = q === void 0 ? void 0 : t(q.value, ["runDue"], ["runDue"]);
217
+ if (J && (typeof J.runDue != "function" || !U || !C.some((e) => e.instances.length))) return _("Registry instance expiry requires actual entity authority and instance declarations");
218
+ let Ve = J ? J.runDue.bind(q.value) : void 0, He = Be || Ve ? fe({
219
+ ...ke,
220
+ continueWorldGroups: async () => {
221
+ let t = [];
222
+ if (Be) try {
223
+ let t = Be();
224
+ if (!g.isEffect(t)) throw new e({ detail: "World supervision requires an actual Effect" });
225
+ await m(t);
226
+ } catch (e) {
227
+ t.push(e);
228
+ }
229
+ if (Ve) try {
230
+ let t = Ve();
231
+ if (!g.isEffect(t)) throw new e({ detail: "Instance expiry supervision requires an actual Effect" });
232
+ let n = await m(t);
233
+ if (n.deferred.length || n.blocked) throw new e({ detail: "Instance expiry has deferred or explicitly blocked work" });
234
+ } catch (e) {
235
+ t.push(e);
236
+ }
237
+ if (t.length) throw AggregateError(t, "World group/instance continuations remain incomplete");
238
+ }
239
+ }) : ke, Y = Object.getOwnPropertyDescriptor(E, "geometry");
240
+ if (Y && !("value" in Y) || !Y && "geometry" in E) return _("Registry geometry requires an own actual Host capability");
241
+ let X = ue(Y?.value);
242
+ if (C.some((e) => e.geometry) && !X) return _("Configured World geometry requires actual complete Host preparation");
243
+ if (X && (X.worlds.length !== C.length || X.worlds.some((e, t) => e !== C[t]))) return _("Registry geometry must bind the exact admitted World catalogue");
244
+ let Z = () => {
245
+ if (r.signal.aborted) return _("Registry Rooms host acquisition was cancelled");
246
+ };
247
+ Z();
248
+ for (let e of [b, k]) {
249
+ let t = await m(u.validate(e));
250
+ if (Z(), t.reference !== e || t.tenantScoped) return _("Registry Rooms host needs shared declared connections");
251
+ }
252
+ let Ue = await m(u.config(b));
253
+ if (Z(), O === "multi-node" && Ue.driver === "memory") return _("Multi-node Rooms host requires Redis; memory hot data cannot boot");
254
+ let We = await m(Te.pipe(g.provide(Ee({
255
+ consumer: r.pluginName,
256
+ connection: b
257
+ })), g.provideService(we, u)));
258
+ if (Z(), We.capabilities.atomicMulti !== !0 || O === "multi-node" && We.capabilities.crossNode !== !0) return _("Room host HotStore capabilities do not satisfy its topology");
259
+ await m(u.probe(b)), Z(), k !== b && (await m(u.probe(k)), Z());
260
+ for (let e of [
261
+ re,
262
+ ce,
263
+ ae,
264
+ te,
265
+ ne,
266
+ oe,
267
+ se,
268
+ ie
269
+ ]) await l.query({
270
+ table: e.tableName,
271
+ predicate: void 0,
272
+ order: [],
273
+ take: 1,
274
+ skip: void 0,
275
+ projection: ["id"]
276
+ }), Z();
277
+ let Ge = ye(l, {
278
+ pools: i,
279
+ membership: S,
280
+ observerNow: Oe.now,
281
+ epochNow: N,
282
+ heartbeatEveryMs: x.heartbeatEveryMs,
283
+ hostHeartbeatTtlMs: x.heartbeatTtlMs,
284
+ graceMs: Ne,
285
+ maxCheckpointBytes: Ae,
286
+ snapshotCodec: (e) => new n(r.catalog.get(e).state),
287
+ ...I === void 0 ? {} : { snapshotBlobs: I }
288
+ }), Ke, Q, qe = T.hostedRooms.some((e) => e.descriptor.mode === "lockstep"), Je = pe({
289
+ local: () => Ke,
290
+ peers: () => Q?.withdrawal
291
+ }), Ye = Ie ?? (qe ? a(l, {
292
+ epochNow: N,
293
+ owner: Je,
294
+ external: Se(l, {
295
+ run: {},
296
+ publish: {}
297
+ }),
298
+ invalidateDirectory: () => g.void,
299
+ ...I === void 0 ? {} : { snapshotBlobs: I }
300
+ }) : void 0), Xe = de(l, {
301
+ pools: i,
302
+ epochNow: N,
303
+ heartbeatTtlMs: x.heartbeatTtlMs
304
+ }), $ = C.length && Re === void 0 && r.worldState === "transitions" ? xe({
305
+ store: l,
306
+ worlds: C,
307
+ catalog: r.catalog,
308
+ controller: () => Ke,
309
+ peers: () => Q?.world,
310
+ ownership: Xe.observeOwnership.bind(Xe),
311
+ hot: We,
312
+ resolveSubject: D,
313
+ epochNow: N,
314
+ signing: {
315
+ secrets: M,
316
+ seatTtlMs: x.seatTtlMs,
317
+ graceMs: Ne,
318
+ hostHeartbeatTtlMs: x.heartbeatTtlMs
319
+ }
320
+ }) : void 0, Ze = $ === void 0 ? {} : {
321
+ worldEntities: le($.worldEntities),
322
+ resolveWorldPlayer: $.resolveWorldPlayer,
323
+ worldSnapshotMaxBytes: be,
324
+ worldGhostMaxConnections: 64
325
+ }, Qe = qe && Ie === void 0 && O === "multi-node" || $ !== void 0, $e = F === void 0, et = !1;
326
+ return Object.freeze({
327
+ store: l,
328
+ shutdown: Pe,
329
+ options: Object.freeze({
330
+ host: Object.freeze({
331
+ ...x,
332
+ worlds: C,
333
+ address: y,
334
+ membership: f,
335
+ resolveSubject: w,
336
+ application: L,
337
+ ...U ? { worldEntities: U } : {},
338
+ ...ze ? { resolveWorldPlayer: ze } : {},
339
+ ...Ze,
340
+ ...X ? { geometry: X } : {},
341
+ ports: Object.freeze({
342
+ recovery: Ge,
343
+ ...Le,
344
+ ...Ye === void 0 ? {} : { erasure: Ye }
345
+ })
346
+ }),
347
+ driver: He,
348
+ listener: d({
349
+ ...v,
350
+ readiness: De
351
+ }),
352
+ ...Fe === void 0 ? {} : { gateway: Fe }
353
+ }),
354
+ openControl: async (t, n) => {
355
+ if (n !== r || et || t.status !== "binding" || t.controller.store !== l || t.controller.host.membership?.instanceId !== f.instanceId || t.controller.host.membership.startedAt !== f.startedAt) return _("Registry Rooms control requires its exact suspended owner");
356
+ Z(), et = !0, Ke = t.controller;
357
+ let a = await m(_e(u, t.controller, {
358
+ connection: k,
359
+ mount: r.pluginName,
360
+ projectControlSecrets: j,
361
+ epochNow: N,
362
+ maxRequestMs: P,
363
+ maxReceipts: je,
364
+ maxInFlight: Me,
365
+ resolveSubject: D,
366
+ onUnavailable: () => t.driver.options.onFailure(new e({ detail: "Room host control transport is unavailable" })),
367
+ ...$ === void 0 ? {} : { worldSteps: $.worldSteps }
368
+ }));
369
+ if (!Qe && !$e) return a;
370
+ let o;
371
+ try {
372
+ let t = de(l, {
373
+ pools: i,
374
+ epochNow: N,
375
+ heartbeatTtlMs: x.heartbeatTtlMs
376
+ }), n = ve(t, S, s, i === void 0 ? void 0 : {
377
+ store: l,
378
+ pools: i
379
+ });
380
+ o = await m(ge(u, {
381
+ connection: k,
382
+ mount: r.pluginName,
383
+ projectControlSecrets: j,
384
+ epochNow: N,
385
+ maxRequestMs: P,
386
+ catalog: r.catalog,
387
+ resolveTarget: (t) => t === "app-commands" ? Ce.match(he(S.list()), {
388
+ onNone: () => g.fail(new e({ detail: "No API instance runs Room app commands" })),
389
+ onSome: g.succeed
390
+ }) : n(t)
391
+ }));
392
+ } catch (e) {
393
+ throw a.fence(), await a.close(), e;
394
+ }
395
+ return Qe && (Q = o), $e && (A = o), Object.freeze({
396
+ fence: () => {
397
+ o.fence(), a.fence();
398
+ },
399
+ close: async () => {
400
+ let e = (await Promise.allSettled([o.close(), a.close()])).flatMap((e) => e.status === "rejected" ? [e.reason] : []);
401
+ if (e.length) throw AggregateError(e, "Room host control did not close");
402
+ }
403
+ });
404
+ },
405
+ release: B
406
+ });
407
+ } catch {
408
+ try {
409
+ await B();
410
+ } catch {
411
+ throw new h(B);
412
+ }
413
+ throw new e({ detail: "Registry Rooms host preflight did not complete" });
414
+ }
415
+ };
416
+ };
417
+ //#endregion
418
+ export { y as defaultRoomsHostAcquire, b as registryRoomsHostBinder };
@@ -0,0 +1,16 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ //#region src/hostSelection.ts
3
+ var t = (e, t) => [...e].filter((e) => e.ready && e.region === t && e.rooms < e.capacity).sort((e, t) => e.rooms / e.capacity - t.rooms / t.capacity || e.cpu - t.cpu || (e.id < t.id ? -1 : +(e.id > t.id)))[0] ?? null, n = (n, r, i = t) => {
4
+ let a;
5
+ try {
6
+ a = i(structuredClone(n), r);
7
+ } catch {
8
+ throw new e({ detail: "Room host selection strategy failed" });
9
+ }
10
+ if (a === null) return null;
11
+ let o = n.find((e) => e.id === a?.id && e.ready && e.region === r && e.rooms < e.capacity);
12
+ if (!o) throw new e({ detail: "Room host strategy selected an ineligible host" });
13
+ return o;
14
+ };
15
+ //#endregion
16
+ export { t as leastLoadedRoomHostInRegion, n as resolveRoomHostSelection };
@@ -0,0 +1,47 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ import { simulationOwnData as t } from "./simulationAuthoring.js";
3
+ import { captureRoomHostDrainPolicy as n } from "./hostDrain.js";
4
+ import { performance as r } from "node:perf_hooks";
5
+ //#region src/hostShutdown.ts
6
+ var i = (r) => {
7
+ let i = t(r, [
8
+ "graceMs",
9
+ "maxCheckpointBytes",
10
+ "drainMs"
11
+ ], ["graceMs"]), a = i.drainMs ?? 15e3;
12
+ if (typeof a != "number" || !Number.isSafeInteger(a) || a < 1 || a > 2147483647) throw new e({ detail: "Room host drainMs must be a positive timer-sized integer" });
13
+ let o = n({
14
+ graceMs: i.graceMs,
15
+ ...i.maxCheckpointBytes === void 0 ? {} : { maxCheckpointBytes: i.maxCheckpointBytes }
16
+ });
17
+ return Object.freeze({
18
+ ...o,
19
+ drainMs: a
20
+ });
21
+ }, a = class extends Error {
22
+ retryCleanup;
23
+ name = "RoomsHostDrainDeadline";
24
+ constructor(e) {
25
+ super("Room host drain deadline elapsed; accepted writes and resources remain owned until cleanup completes"), this.retryCleanup = e;
26
+ }
27
+ }, o = async (e, t, n) => {
28
+ let i = () => new a(n);
29
+ for (;;) {
30
+ if (r.now() >= t) throw i();
31
+ let n;
32
+ try {
33
+ let a = new Promise((e, a) => {
34
+ n = setTimeout(() => a(i()), Math.max(1, t - r.now()));
35
+ });
36
+ await Promise.race([e(), a]);
37
+ return;
38
+ } catch (e) {
39
+ if (e instanceof a || r.now() >= t) throw i();
40
+ } finally {
41
+ n !== void 0 && clearTimeout(n);
42
+ }
43
+ await new Promise((e) => setTimeout(e, Math.min(100, Math.max(1, t - r.now()))));
44
+ }
45
+ };
46
+ //#endregion
47
+ export { a as RoomsHostDrainDeadline, i as captureRoomHostShutdownPolicy, o as superviseRoomHostDrain };
@@ -0,0 +1,53 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ import { performance as t } from "node:perf_hooks";
3
+ //#region src/hostTurnObservation.ts
4
+ var n = class {
5
+ budgetMs;
6
+ now;
7
+ lastClock = 0;
8
+ invalid = !1;
9
+ active = null;
10
+ completed = null;
11
+ duration = null;
12
+ progress = null;
13
+ saturatedUntil = 0;
14
+ constructor(n, r = () => t.now()) {
15
+ if (this.budgetMs = n, this.now = r, !Number.isFinite(n) || n <= 0) throw new e({ detail: "Host turn observation requires a positive budget" });
16
+ }
17
+ read() {
18
+ try {
19
+ let e = this.now();
20
+ return !Number.isFinite(e) || e < this.lastClock || e < 0 ? (this.invalid = !0, null) : (this.lastClock = e, e);
21
+ } catch {
22
+ return this.invalid = !0, null;
23
+ }
24
+ }
25
+ begin() {
26
+ this.active === null ? this.active = this.read() : this.invalid = !0;
27
+ }
28
+ arm() {
29
+ this.progress = this.read();
30
+ }
31
+ live() {
32
+ let e = this.read();
33
+ return e !== null && !this.invalid && this.progress !== null && e - this.progress <= 5e3;
34
+ }
35
+ finish(e = !0) {
36
+ let t = this.read(), n = this.active;
37
+ this.active = null, t !== null && n !== null && (this.duration = t - n, this.completed = t, e && (this.progress = t), this.duration > this.budgetMs && (this.saturatedUntil = t + 6e4));
38
+ }
39
+ snapshot() {
40
+ let e = this.read();
41
+ if (e === null || this.invalid) return {
42
+ lastTurnMs: null,
43
+ saturated: null
44
+ };
45
+ let t = this.active !== null && e - this.active > this.budgetMs || e < this.saturatedUntil ? !0 : this.completed !== null && e - this.completed <= 5e3 ? !1 : null;
46
+ return {
47
+ lastTurnMs: this.duration,
48
+ saturated: t
49
+ };
50
+ }
51
+ };
52
+ //#endregion
53
+ export { n as RoomHostTurnObservation };
@@ -0,0 +1,4 @@
1
+ //#region src/identities.ts
2
+ var e = "_voltro_room_seats", t = "_voltro_rooms", n = "_voltro_room_hosts", r = "_voltro_room_snapshots", i = "_voltro_room_outbox", a = "_voltro_room_snapshot_segments", o = "_voltro_room_subject_privacy", s = "_voltro_world_transitions", c = "_voltro_room_creations", l = "_voltro_room_lockstep_ticks";
3
+ //#endregion
4
+ export { t as ROOMS_TABLE, r as ROOM_CHECKPOINTS_TABLE, i as ROOM_COMMANDS_TABLE, c as ROOM_CREATIONS_TABLE, n as ROOM_HOSTS_TABLE, l as ROOM_LOCKSTEP_TICKS_TABLE, e as ROOM_SEATS_TABLE, a as ROOM_SNAPSHOT_SEGMENTS_TABLE, o as ROOM_SUBJECT_PRIVACY_TABLE, s as WORLD_TRANSITIONS_TABLE };