@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,78 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ import { RoomHostListenerBindFailure as t } from "./hostLane.js";
3
+ import { registerRoomHostListener as n } from "./hostListenerBinding.js";
4
+ import { roomHostMetricsRoute as r } from "./hostMetrics.js";
5
+ import { Layer as i } from "effect";
6
+ import { awaitServerListening as a, bindBootListener as o, startRpcServer as s } from "@voltro/runtime";
7
+ import { RpcGroup as c } from "effect/rpc";
8
+ // src/hostListener.ts
9
+ var l = (l) => {
10
+ let u = Object.freeze({ ...l }), d = u.startupTimeoutMs ?? 1e4;
11
+ if (u.listener !== void 0 && u.port !== void 0 || u.listener === void 0 && (u.port === void 0 || !Number.isSafeInteger(u.port) || u.port < 0 || u.port > 65535) || !Number.isSafeInteger(d) || d < 1 || d > 2147483647 || typeof u.readiness != "function") throw new e({ detail: "Invalid Room listener configuration" });
12
+ let f, p = u.metricsToken === void 0 ? void 0 : r(u.metricsToken, () => {
13
+ if (!f) throw Error("Room metrics owner is unavailable");
14
+ return f();
15
+ }, u.metricsPreviousToken), m = !1, h = Object.freeze({ bind: async (n, r) => {
16
+ if (m) throw new e({ detail: "A Room listener port owns exactly one bind" });
17
+ m = !0, f = r.observeMetrics;
18
+ let l = null, h = null, g = !1, _ = null, v = [], y = () => {
19
+ if (g) return Promise.resolve();
20
+ if (_) return _;
21
+ let e = (async () => {
22
+ h ? await h.shutdown() : await l?.close();
23
+ for (let e of v) e();
24
+ v.length = 0, g = !0, h = null, l = null, f = void 0;
25
+ })();
26
+ return _ = e, e.then(() => {
27
+ _ = null;
28
+ }, () => {
29
+ _ = null;
30
+ }), e;
31
+ };
32
+ try {
33
+ if (l = u.listener ?? await o({
34
+ port: u.port,
35
+ ...u.host === void 0 ? {} : { host: u.host },
36
+ ...u.health === void 0 ? {} : { health: u.health }
37
+ }), p && !f) throw new e({ detail: "Room metrics require the actual host observation owner" });
38
+ if (typeof r.live != "function") throw new e({ detail: "Room listener requires the actual host progress watchdog" });
39
+ let t = r.live.bind(r);
40
+ v.push(l.addLivenessGate("rooms-host", t)), v.push(l.addReadinessGate("rooms-host", () => r.ready() && t())), l.setDependencyPing(async () => r.ready() && await u.readiness()), u.onBound?.(l.port);
41
+ let m = c.make();
42
+ return h = s({
43
+ group: m,
44
+ handlersLayer: i.empty,
45
+ listener: l,
46
+ webSocketGateways: [n, ...r.worldGhostGateway ? [r.worldGhostGateway] : []],
47
+ ...p === void 0 ? {} : { httpRoutes: [p] },
48
+ ...u.security === void 0 ? {} : { security: u.security }
49
+ }), await a(h.server, d), Object.freeze({
50
+ activate: () => {
51
+ if (g || _ || !l || !r.ready()) throw new e({ detail: "Room listener activation was fenced" });
52
+ l.set({ phase: "ready" });
53
+ },
54
+ stopAdmission: async () => {
55
+ l?.set({
56
+ phase: "error",
57
+ error: "Room host is stopping"
58
+ });
59
+ },
60
+ close: y
61
+ });
62
+ } catch {
63
+ try {
64
+ await y();
65
+ } catch {
66
+ throw new t(y);
67
+ }
68
+ throw new e({ detail: "Room listener could not bind its native gateway" });
69
+ }
70
+ } });
71
+ return n(h, {
72
+ port: u.listener?.port ?? u.port,
73
+ host: u.host,
74
+ metricsToken: u.metricsToken,
75
+ metricsPreviousToken: u.metricsPreviousToken
76
+ }), h;
77
+ };
78
+ export { l as runtimeRoomHostListener };
@@ -0,0 +1,18 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ import { createHash as t } from "node:crypto";
3
+ // src/hostListenerBinding.ts
4
+ var n = /* @__PURE__ */ new WeakMap(), r = (e) => t("sha256").update(e).digest("hex"), i = (e, t) => {
5
+ n.set(e, Object.freeze({
6
+ port: t.port,
7
+ host: t.host,
8
+ ...t.metricsToken === void 0 ? {} : { metricsDigest: r(t.metricsToken) },
9
+ ...t.metricsPreviousToken === void 0 ? {} : { metricsPreviousDigest: r(t.metricsPreviousToken) }
10
+ }));
11
+ }, a = (e, t) => {
12
+ let r = n.get(t);
13
+ r && n.set(e, r);
14
+ }, o = (t, i) => {
15
+ let a = n.get(t);
16
+ if (!a || a.port !== i.port || a.host !== i.host || i.metricsToken !== void 0 && a.metricsDigest !== r(i.metricsToken) || a.metricsPreviousDigest !== (i.metricsPreviousToken === void 0 ? void 0 : r(i.metricsPreviousToken))) throw new e({ detail: "Room host provider did not apply its deployment to an owned runtime listener" });
17
+ };
18
+ export { o as assertRoomHostListenerDeployment, a as inheritRoomHostListener, i as registerRoomHostListener };
@@ -0,0 +1,89 @@
1
+ // src/hostLoopObservation.ts
2
+ var e = () => {
3
+ let e = performance.eventLoopUtilization;
4
+ if (typeof e != "function") throw Error("Event-loop utilization is unavailable");
5
+ return e.call(performance);
6
+ }, t = class {
7
+ now;
8
+ eventLoop;
9
+ buckets = /* @__PURE__ */ new Map();
10
+ last = 0;
11
+ started;
12
+ errors = 0;
13
+ active = !1;
14
+ loopReadings = /* @__PURE__ */ new Map();
15
+ constructor(t = () => performance.now(), n = e) {
16
+ this.now = t, this.eventLoop = n, this.started = this.read() ?? 0, this.sampleEventLoop(this.started);
17
+ }
18
+ sampleEventLoop(e) {
19
+ let t = Math.floor(e / 1e3);
20
+ if (!this.loopReadings.has(t)) {
21
+ try {
22
+ let { idle: e, active: n } = this.eventLoop();
23
+ Number.isFinite(e) && Number.isFinite(n) && e >= 0 && n >= 0 && this.loopReadings.set(t, {
24
+ idle: e,
25
+ active: n
26
+ });
27
+ } catch {}
28
+ for (let e of this.loopReadings.keys()) e < t - 61 && this.loopReadings.delete(e);
29
+ }
30
+ }
31
+ eventLoopShare(e) {
32
+ let t = Math.floor(e / 1e3), n, r;
33
+ for (let e of this.loopReadings.keys()) e <= t && (n === void 0 || e > n) && (n = e), (r === void 0 || e > r) && (r = e);
34
+ if (n === void 0 || r === void 0 || r <= n) return null;
35
+ let i = this.loopReadings.get(n), a = this.loopReadings.get(r), o = a.active - i.active, s = o + a.idle - i.idle;
36
+ return s > 0 && o >= 0 ? Math.min(1, o / s) : null;
37
+ }
38
+ read() {
39
+ try {
40
+ let e = this.now();
41
+ if (!Number.isFinite(e) || e < this.last || e < 0) {
42
+ this.errors++;
43
+ return;
44
+ }
45
+ return this.last = e, e;
46
+ } catch {
47
+ this.errors++;
48
+ return;
49
+ }
50
+ }
51
+ prune(e) {
52
+ let t = Math.floor(e / 1e3) - 60;
53
+ for (let e of this.buckets.keys()) e < t && this.buckets.delete(e);
54
+ }
55
+ measure(e) {
56
+ if (this.active) return e();
57
+ this.active = !0;
58
+ let t = this.read();
59
+ try {
60
+ return e();
61
+ } finally {
62
+ let e = this.read();
63
+ if (this.active = !1, e !== void 0 && (this.prune(e), this.sampleEventLoop(e), t !== void 0 && e > t)) {
64
+ let n = Math.max(t, (Math.floor(e / 1e3) - 60) * 1e3);
65
+ for (; n < e;) {
66
+ let t = Math.floor(n / 1e3), r = Math.min(e, (t + 1) * 1e3);
67
+ this.buckets.set(t, (this.buckets.get(t) ?? 0) + r - n), n = r;
68
+ }
69
+ }
70
+ }
71
+ }
72
+ snapshot() {
73
+ let e = this.read() ?? this.last;
74
+ this.prune(e), this.sampleEventLoop(e);
75
+ let t = Math.floor(e / 1e3) * 1e3, n = Math.max(0, t - 6e4), r = 0;
76
+ for (let [e, i] of this.buckets) e * 1e3 >= n && e * 1e3 < t && (r += i);
77
+ let i = this.errors === 0 && t - this.started >= 6e4 && !this.active;
78
+ return {
79
+ from: n,
80
+ until: t,
81
+ coverage: this.errors > 0 ? "invalid" : i ? "complete" : "warming-up",
82
+ tickSeconds: r / 1e3,
83
+ loopUtilization: i ? r / 6e4 : null,
84
+ eventLoopUtilization: i ? this.eventLoopShare(n) : null,
85
+ clockErrors: this.errors
86
+ };
87
+ }
88
+ };
89
+ export { t as RoomHostLoopObservation };
@@ -0,0 +1,55 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ import { captureWorldHandoffMetrics as t, worldHandoffDurationBuckets as n } from "./worldHandoffMetrics.js";
3
+ import { bearerMatches as r } from "@voltro/protocol/session";
4
+ // src/hostMetrics.ts
5
+ var i = (e) => e.replaceAll("\\", "\\\\").replaceAll("\"", "\\\"").replaceAll("\n", "\\n"), a = (t) => {
6
+ if (typeof t != "string" || t.length < 32 || t.length > 512 || /[^A-Za-z0-9_-]/.test(t)) throw new e({ detail: "Room host metrics require a project-owned base64url credential of 32–512 characters" });
7
+ }, o = (e, o, s) => (a(e), s !== void 0 && a(s), Object.freeze({
8
+ method: "GET",
9
+ path: "/_voltro/rooms/metrics",
10
+ match: "exact",
11
+ handle: async (a) => {
12
+ let c = a.headers.authorization, l = { "Cache-Control": "no-store" };
13
+ if (typeof c != "string" || c.length > 519 || !c.startsWith("Bearer ") || !r("rooms-metrics", c.slice(7), e, s)) return {
14
+ status: 401,
15
+ headers: {
16
+ ...l,
17
+ "WWW-Authenticate": "Bearer"
18
+ }
19
+ };
20
+ try {
21
+ let e = o(), r = `host="${i(e.host)}",region="${i(e.region)}"${e.pool === void 0 ? "" : `,pool="${i(e.pool)}"`}`, a = e.loop.coverage === "complete" && e.loop.loopUtilization !== null && Number.isFinite(e.loop.loopUtilization) && e.loop.loopUtilization >= 0 && e.loop.loopUtilization <= 1, s = [
22
+ "# HELP rooms_host_loop_observation_complete Whether a complete rolling 60 second tick window is available.",
23
+ "# TYPE rooms_host_loop_observation_complete gauge",
24
+ `rooms_host_loop_observation_complete{${r}} ${+!!a}`
25
+ ];
26
+ a && s.push("# HELP rooms_host_loop_utilization Fraction of the rolling 60 second window spent in synchronous host ticks.", "# TYPE rooms_host_loop_utilization gauge", `rooms_host_loop_utilization{${r}} ${e.loop.loopUtilization}`);
27
+ let c = e.loop.eventLoopUtilization;
28
+ a && typeof c == "number" && Number.isFinite(c) && c >= 0 && c <= 1 && s.push("# HELP rooms_host_event_loop_utilization Fraction of the rolling 60 second window the event loop was busy: ticks, networking, encoding and storage callbacks.", "# TYPE rooms_host_event_loop_utilization gauge", `rooms_host_event_loop_utilization{${r}} ${c}`), typeof e.turn?.saturated == "boolean" && s.push("# HELP rooms_host_saturated Host driver exceeded its configured turn cadence within the last 60 seconds, including awaited work.", "# TYPE rooms_host_saturated gauge", `rooms_host_saturated{${r}} ${+!!e.turn.saturated}`);
29
+ let u = (e) => typeof e == "number" && Number.isSafeInteger(e) && e >= 0;
30
+ u(e.rooms) && s.push("# HELP rooms_host_rooms Rooms owned by this host, as its directory heartbeat reports them.", "# TYPE rooms_host_rooms gauge", `rooms_host_rooms{${r}} ${e.rooms}`), u(e.clients) && s.push("# HELP rooms_host_clients Client sessions served by this host, as its directory heartbeat reports them.", "# TYPE rooms_host_clients gauge", `rooms_host_clients{${r}} ${e.clients}`), typeof e.cells == "number" && Number.isSafeInteger(e.cells) && e.cells >= 0 && s.push("# HELP rooms_host_cells Confirmed live SQL World cells held by the local host and epoch, observed less than five seconds ago.", "# TYPE rooms_host_cells gauge", `rooms_host_cells{${r}} ${e.cells}`), typeof e.worldBoundaryClamps == "number" && Number.isSafeInteger(e.worldBoundaryClamps) && e.worldBoundaryClamps >= 0 && s.push("# HELP world_boundary_clamps_total Published source-cell movement corrections observed during this Host process lifetime.", "# TYPE world_boundary_clamps_total counter", `world_boundary_clamps_total{${r}} ${e.worldBoundaryClamps}`);
31
+ let d = t(e.worldHandoffs);
32
+ if (d) {
33
+ s.push("# HELP world_handoffs_total New seamless SQL terminal changes acknowledged during this source lifetime; excludes replay and unacknowledged outcomes.", "# TYPE world_handoffs_total counter", "# HELP world_handoff_duration_ms Time from transition creation to acknowledged seamless terminal SQL change.", "# TYPE world_handoff_duration_ms histogram");
34
+ for (let e of d.results) {
35
+ let t = `${r},result="${e.result}"`;
36
+ s.push(`world_handoffs_total{${t}} ${e.count}`);
37
+ for (let r = 0; r < n.length; r++) s.push(`world_handoff_duration_ms_bucket{${t},le="${n[r]}"} ${e.buckets[r]}`);
38
+ s.push(`world_handoff_duration_ms_bucket{${t},le="+Inf"} ${e.count}`, `world_handoff_duration_ms_sum{${t}} ${e.durationMs}`, `world_handoff_duration_ms_count{${t}} ${e.count}`);
39
+ }
40
+ }
41
+ return {
42
+ status: 200,
43
+ headers: l,
44
+ contentType: "text/plain; version=0.0.4; charset=utf-8",
45
+ body: `${s.join("\n")}\n`
46
+ };
47
+ } catch {
48
+ return {
49
+ status: 503,
50
+ headers: l
51
+ };
52
+ }
53
+ }
54
+ }));
55
+ export { o as roomHostMetricsRoute };
@@ -0,0 +1,417 @@
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
+ // 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
+ export { y as defaultRoomsHostAcquire, b as registryRoomsHostBinder };