@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,93 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ import { unsignedWord as t } from "./fixedWords.js";
3
+ import { freezeSimulationValue as n, simulationOwnData as r } from "./simulationAuthoring.js";
4
+ import { createSimulationOptionsCodec as i } from "./simulationOptionsWire.js";
5
+ import { assertCapturedSimulation as a } from "./simulation.js";
6
+ import { RoomInputCodec as o, RoomStateCodec as s } from "./stateCodec.js";
7
+ import { lockstepJournalIdentity as c } from "./lockstepJournalCodec.js";
8
+ import { createHash as l } from "node:crypto";
9
+ // src/lockstepAdmissionCodec.ts
10
+ function u(t) {
11
+ throw new e({ detail: t });
12
+ }
13
+ var d = (e) => l("sha256").update(JSON.stringify(e)).digest("hex"), f = (e) => n({
14
+ ...e,
15
+ digest: d(e)
16
+ }), p = (e, n, i, a = 67108864) => {
17
+ let o = [
18
+ "version",
19
+ "roomId",
20
+ "tenantId",
21
+ "ownerEpoch",
22
+ "hostId",
23
+ "initial",
24
+ "adoption",
25
+ "digest"
26
+ ], s = r(e, o, o), l = t(s.ownerEpoch), d = c(s.hostId);
27
+ if (s.version !== 1 || s.roomId !== n.roomId || s.tenantId !== n.tenantId || l < 1 || l > n.epoch || i !== void 0 && (d !== i || l !== n.epoch)) return u("Lockstep creation metadata changed scope or current owner");
28
+ let p = [
29
+ "requestId",
30
+ "creatorSubjectId",
31
+ "name",
32
+ "seed",
33
+ "options",
34
+ "stateSchemaHash",
35
+ "inputSchemaHash"
36
+ ], m = r(s.initial, p, p), h = m.options;
37
+ if (typeof h != "string" || h.length > Math.ceil(a * 4 / 3) || !/^[A-Za-z0-9_-]*$/.test(h)) return u("Invalid bounded creation options bytes");
38
+ let g = Buffer.from(h, "base64url");
39
+ if (g.byteLength > a || g.toString("base64url") !== h) return u("Noncanonical creation options bytes");
40
+ let _ = null;
41
+ if (s.adoption !== null) {
42
+ let e = r(s.adoption, ["requestId", "priorEpoch"], ["requestId", "priorEpoch"]), n = t(e.priorEpoch);
43
+ if (n < 1 || n >= l) return u("Invalid immutable creation successor receipt");
44
+ _ = {
45
+ requestId: c(e.requestId),
46
+ priorEpoch: n
47
+ };
48
+ }
49
+ let v = f({
50
+ version: 1,
51
+ roomId: n.roomId,
52
+ tenantId: n.tenantId,
53
+ ownerEpoch: l,
54
+ hostId: d,
55
+ initial: {
56
+ requestId: c(m.requestId),
57
+ creatorSubjectId: c(m.creatorSubjectId),
58
+ name: c(m.name),
59
+ seed: t(m.seed),
60
+ options: h,
61
+ stateSchemaHash: t(m.stateSchemaHash),
62
+ inputSchemaHash: t(m.inputSchemaHash)
63
+ },
64
+ adoption: _
65
+ });
66
+ return s.digest !== v.digest || Buffer.byteLength(JSON.stringify(v), "utf8") > a ? u("Creation metadata digest or byte budget does not match") : v;
67
+ }, m = (e, t) => {
68
+ if (e.initial.creatorSubjectId !== t) return null;
69
+ let { name: n, requestId: r, seed: i, stateSchemaHash: a, inputSchemaHash: o } = e.initial;
70
+ return Object.freeze({
71
+ roomId: e.roomId,
72
+ name: n,
73
+ requestId: r,
74
+ seed: i,
75
+ stateSchemaHash: a,
76
+ inputSchemaHash: o
77
+ });
78
+ }, h = (e, t = 16777216) => {
79
+ a(e);
80
+ let n = i(e), r = new s(e.definition.state, e.stateCodec.limits), c = new o(e.definition.input, e.inputCodec.limits);
81
+ return Object.freeze({
82
+ optionsWire: n,
83
+ stateWire: r,
84
+ inputWire: c,
85
+ captureStored: (e, i, a) => {
86
+ let o = p(e, i, a, t);
87
+ if (o.initial.stateSchemaHash !== r.schemaHash || o.initial.inputSchemaHash !== c.schemaHash) return u("Creation simulation layouts changed");
88
+ let s = Buffer.from(o.initial.options, "base64url"), l = n.decode(s);
89
+ return Buffer.from(n.encode(l)).equals(s) ? o : u("Creation options are not canonical declared LSO");
90
+ }
91
+ });
92
+ };
93
+ export { p as captureRoomLockstepAdmissionEnvelope, h as createRoomLockstepAdmissionCodec, m as roomLockstepCreationProjection, f as sealRoomLockstepAdmission };
@@ -0,0 +1,4 @@
1
+ import { Context as e } from "effect";
2
+ // src/lockstepAdmissionPorts.ts
3
+ var t = class extends e.Service()("@voltro/RoomLockstepAdmissionPort") {};
4
+ export { t as RoomLockstepAdmissionPort };
@@ -0,0 +1,577 @@
1
+ import { BudgetExceeded as e, ProtocolError as t, RoomAuthoringError as n } from "./errors.js";
2
+ import { unsignedWord as r } from "./fixedWords.js";
3
+ import { freezeSimulationValue as i, simulationOwnData as a } from "./simulationAuthoring.js";
4
+ import { captureSimulationBytes as o } from "./simulationBytes.js";
5
+ import { createSimulationOptionsCodec as s } from "./simulationOptionsWire.js";
6
+ import { createSimulationInputHistoryCodec as c } from "./simulationInputHistoryWire.js";
7
+ import { createSimulationRecoveryCodec as l } from "./simulationRecoveryWire.js";
8
+ import { assertCapturedSimulation as u, captureSimulationInputs as d } from "./simulation.js";
9
+ import { RoomInputCodec as f, RoomStateCodec as p } from "./stateCodec.js";
10
+ import { RoomTransportCleanupFailure as m } from "./transportCleanup.js";
11
+ import { captureRoomLockstepWireRoster as h, roomLockstepWireMask as g } from "./lockstepWireRoster.js";
12
+ import { decodeRoomFrame as _, encodeRoomFrame as v } from "./wire.js";
13
+ import { roomCodecs as y } from "./web.js";
14
+ import { captureLockstepClientOptions as b, captureLockstepClientPolicy as x, createLockstepClientSimulation as S } from "./lockstep.js";
15
+ import { Result as C } from "effect";
16
+ // src/lockstepClientSession.ts
17
+ var w = /* @__PURE__ */ new WeakSet(), T = (e) => typeof e == "object" && !!e && w.has(e);
18
+ function E(e) {
19
+ throw new t({ detail: e });
20
+ }
21
+ var D = (e) => e === "left" || e === "kicked" || e === "faulted", O = (e, t) => e.length === t.length && e.every((e, n) => e === t[n]), k = class {
22
+ #e;
23
+ #t;
24
+ #n;
25
+ #r;
26
+ #i = null;
27
+ #a = [];
28
+ #o = null;
29
+ #s;
30
+ #c;
31
+ #l;
32
+ #u;
33
+ #d;
34
+ #f;
35
+ #p;
36
+ #m = [];
37
+ #h = /* @__PURE__ */ new Set();
38
+ #g = [];
39
+ #_ = /* @__PURE__ */ new Set();
40
+ #v = /* @__PURE__ */ new Map();
41
+ #y;
42
+ #b = null;
43
+ #x = null;
44
+ #S = "connecting";
45
+ #C = null;
46
+ #w = !1;
47
+ #T = !1;
48
+ #E = null;
49
+ #D = null;
50
+ #O = 0;
51
+ #k = 0;
52
+ #A = 0;
53
+ #j = 0;
54
+ #M = null;
55
+ #N = /* @__PURE__ */ new Map();
56
+ #P = /* @__PURE__ */ new Map();
57
+ #F = null;
58
+ #I = 0;
59
+ #L = !1;
60
+ #R = !1;
61
+ constructor(e, t, i, o) {
62
+ u(t), this.#t = t, this.#e = e;
63
+ let c = [
64
+ "localPlayerId",
65
+ "initialInputs",
66
+ "inputDelayTicks",
67
+ "rollbackHorizonTicks",
68
+ "maxFutureTicks",
69
+ "maxPlayers",
70
+ "maxRejectionAttempts",
71
+ "inputPrediction"
72
+ ], g = a(o, [
73
+ ...c,
74
+ "roster",
75
+ "redundantInputs",
76
+ "hashEvery",
77
+ "hashHistoryTicks",
78
+ "maxPendingWrites",
79
+ "maxFrameBytes",
80
+ "maxBootstrapTicks"
81
+ ], []), _ = {
82
+ redundantInputs: 4,
83
+ hashEvery: 10,
84
+ hashHistoryTicks: 64,
85
+ maxPendingWrites: 16,
86
+ maxFrameBytes: 65536,
87
+ maxBootstrapTicks: 4096,
88
+ delay: 2,
89
+ horizon: 8
90
+ }, v = { ..._ };
91
+ for (let e of Object.keys(_)) {
92
+ let t = e === "delay" ? "inputDelayTicks" : e === "horizon" ? "rollbackHorizonTicks" : e, r = Object.hasOwn(g, t) ? g[t] : _[e], i = e === "delay" ? 0 : 1, a = e === "maxFrameBytes" || e === "maxBootstrapTicks" ? 65536 : e === "redundantInputs" ? 64 : 4096;
93
+ if (!Number.isInteger(r) || r < i || r > a) throw new n({
94
+ room: "lockstep",
95
+ detail: "Invalid bounded network client limit"
96
+ });
97
+ Object.defineProperty(v, e, {
98
+ value: r,
99
+ enumerable: !0
100
+ });
101
+ }
102
+ let { localPlayerId: b, initialInputs: S, ...C } = Object.fromEntries(c.filter((e) => Object.hasOwn(g, e)).map((e) => [e, g[e]])), T = x(C), O = Object.hasOwn(g, "initialInputs") ? d(t, g.initialInputs, T.maxPlayers) : Object.freeze([]);
103
+ Object.hasOwn(g, "initialInputs") && !O.length && E("Authored initial intentions require a nonempty complete matrix"), this.#l = Object.hasOwn(g, "localPlayerId") ? r(g.localPlayerId) : null, this.#c = Object.hasOwn(g, "roster") ? h(g.roster, T.maxPlayers) : null;
104
+ let k = this.#c?.map((e) => e.playerId);
105
+ k && (this.#l !== null && !k.includes(this.#l) || Object.hasOwn(g, "initialInputs") && (O.length !== k.length || O.some((e) => !k.includes(e.playerId)))) && E("Expected initial intentions/local player must match the complete expected roster"), this.#s = Object.freeze({
106
+ ...T,
107
+ ...Object.hasOwn(g, "initialInputs") ? { initialInputs: O } : {}
108
+ }), this.#n = null, this.#L = T.inputDelayTicks <= 1, this.#r = Object.freeze(v), this.#u = y(i), this.#d = new f(t.definition.input, t.inputCodec.limits);
109
+ let A = new p(t.definition.state, t.stateCodec.limits);
110
+ (this.#u.input.schemaHash !== this.#d.schemaHash || this.#u.state.schemaHash !== A.schemaHash) && E("Network manifest does not match the captured simulation state/input layout"), this.#f = s(t), this.#p = l(t, {
111
+ maxBytes: v.maxFrameBytes,
112
+ maxTicks: T.maxFutureTicks
113
+ }), this.#y = new m(async () => {
114
+ let t = await Promise.allSettled([...this.#h, ...e.closeAsync ? [e.closeAsync(1e3, "Lockstep client closed")] : []]), n = [...this.#g, ...t.flatMap((e) => e.status === "rejected" ? [e.reason] : [])];
115
+ if (n.length) throw AggregateError(n, "Lockstep client cleanup failed");
116
+ }), this.#m.push(e.reliable.onFrame((e) => this.receive(e))), e.unreliable && this.#m.push(e.unreliable.onFrame((e) => this.receive(e, !0)));
117
+ let j = () => {
118
+ D(this.#S) || (this.#S = "left", this.release(), this.notify());
119
+ };
120
+ e.signal.addEventListener("abort", j, { once: !0 }), this.#m.push(() => e.signal.removeEventListener("abort", j)), e.signal.aborted && j(), w.add(this);
121
+ }
122
+ work(e) {
123
+ if (this.#T) return E("Network client cannot reenter simulation or frame mutation");
124
+ this.#T = !0;
125
+ try {
126
+ return e();
127
+ } finally {
128
+ this.#T = !1;
129
+ }
130
+ }
131
+ live() {
132
+ return D(this.#S) || !this.#x ? E("Lockstep client has no current admitted simulation") : this.#x;
133
+ }
134
+ current(e) {
135
+ if (D(this.#S) || this.#x !== e) return E("Client ownership was withdrawn during an author callback");
136
+ }
137
+ notify() {
138
+ this.#b = null;
139
+ for (let e of this.#_) try {
140
+ e();
141
+ } catch {
142
+ this.#O++, this.#b = null;
143
+ }
144
+ }
145
+ subscribe(e) {
146
+ return typeof e == "function" ? (this.#_.add(e), () => {
147
+ this.#_.delete(e);
148
+ }) : E("Invalid client observer");
149
+ }
150
+ onMessage(e, t) {
151
+ let n = this.#u.channels.find((t) => t.name === e);
152
+ if (D(this.#S) || !n || n.direction === "client" || typeof t != "function") return E("Message observation needs a declared server-sendable channel");
153
+ let r = this.#v.get(e) ?? /* @__PURE__ */ new Set();
154
+ return r.add(t), this.#v.set(e, r), () => {
155
+ r.delete(t), !r.size && this.#v.get(e) === r && this.#v.delete(e);
156
+ };
157
+ }
158
+ get status() {
159
+ return this.#S;
160
+ }
161
+ get failure() {
162
+ return this.#C;
163
+ }
164
+ get id() {
165
+ return this.#E;
166
+ }
167
+ get epoch() {
168
+ return this.#D;
169
+ }
170
+ roster() {
171
+ return this.#i === null ? null : this.rosterAt(2 ** 53 - 1);
172
+ }
173
+ rosterAt(e) {
174
+ let t = this.#i ?? [];
175
+ return this.#a.length ? [...t, ...this.#a.filter((t) => t.tick <= e).map((e) => Object.freeze({
176
+ slot: e.slot,
177
+ playerId: e.playerId
178
+ }))].sort((e, t) => e.slot - t.slot) : t;
179
+ }
180
+ get localPlayerId() {
181
+ return this.#n?.localPlayerId ?? null;
182
+ }
183
+ snapshot() {
184
+ return this.#x?.snapshot() ?? null;
185
+ }
186
+ observation() {
187
+ return this.#b ??= Object.freeze({
188
+ status: this.status,
189
+ sessionId: this.id,
190
+ epoch: this.epoch,
191
+ localPlayerId: this.localPlayerId,
192
+ roster: this.roster(),
193
+ snapshot: this.snapshot(),
194
+ metrics: this.metrics()
195
+ });
196
+ }
197
+ metrics() {
198
+ return Object.freeze({
199
+ status: this.#S,
200
+ tick: this.#x?.tick ?? null,
201
+ confirmedThroughTick: this.#x?.confirmedThroughTick ?? null,
202
+ catchUpTicks: this.#x ? Math.max(0, this.#x.confirmedThroughTick - this.#x.tick) : 0,
203
+ pendingWrites: this.#h.size,
204
+ pendingIntent: this.#F !== null,
205
+ retainedLocalInputs: this.#N.size,
206
+ retainedHashClaims: this.#P.size,
207
+ stalls: this.#k,
208
+ resyncs: this.#A,
209
+ hashFlags: this.#j,
210
+ waitingFor: this.#M,
211
+ observerErrors: this.#O,
212
+ rollbackReplays: this.#x?.metrics.rollbackReplays ?? 0,
213
+ rollbackSteps: this.#x?.metrics.rollbackSteps ?? 0
214
+ });
215
+ }
216
+ encode(e) {
217
+ let t = v(e, {
218
+ maxBytes: this.#r.maxFrameBytes,
219
+ maxInputs: 4096
220
+ });
221
+ if (C.isFailure(t)) throw t.failure;
222
+ return t.success;
223
+ }
224
+ write(n, r = !0) {
225
+ if (this.#e.signal.aborted || D(this.#S)) return Promise.reject(new t({ detail: "Lockstep transport is closed" }));
226
+ if (this.#h.size >= this.#r.maxPendingWrites) return Promise.reject(new e({
227
+ budget: "lockstepClientWrites",
228
+ limit: this.#r.maxPendingWrites
229
+ }));
230
+ let i = this.encode(n), a = Promise.resolve().then(() => {
231
+ if (this.#e.signal.aborted || D(this.#S)) return E("Lockstep transport was withdrawn before write");
232
+ if (!r && this.#e.unreliable && i.byteLength <= this.#e.unreliable.maxDatagramBytes) this.#e.unreliable.send(i);
233
+ else return this.#e.reliable.send(i);
234
+ });
235
+ return this.#h.add(a), a.then(() => this.#h.delete(a), () => this.#h.delete(a)), a;
236
+ }
237
+ start(e) {
238
+ return this.work(() => {
239
+ if (this.#w || this.#S !== "connecting") return Promise.reject(new t({ detail: "Lockstep Hello may be sent only once" }));
240
+ let n = {
241
+ kind: "Hello",
242
+ protocolVersion: 1,
243
+ token: o(e, this.#r.maxFrameBytes, "lockstepSeatTokenBytes"),
244
+ schemaHash: this.#u.schemaHash,
245
+ transportCaps: this.#e.unreliable ? 3 : 1
246
+ };
247
+ return this.encode(n), this.#w = !0, this.write(n);
248
+ });
249
+ }
250
+ message(e, t) {
251
+ try {
252
+ return this.work(() => {
253
+ this.live();
254
+ let n = this.#u.channels.findIndex((t) => t.name === e), r = this.#u.channels[n];
255
+ if (!r || r.direction === "server") return E("Channel is not client-sendable");
256
+ let i = r.codec.full(t);
257
+ if (C.isFailure(i)) throw i.failure;
258
+ return this.write({
259
+ kind: "ClientMessage",
260
+ channelId: n,
261
+ payload: i.success
262
+ }, r.reliable);
263
+ });
264
+ } catch (e) {
265
+ return Promise.reject(e);
266
+ }
267
+ }
268
+ receive(e, n = !1) {
269
+ if (!D(this.#S)) try {
270
+ this.work(() => {
271
+ let t = _(e, {
272
+ maxBytes: this.#r.maxFrameBytes,
273
+ maxInputs: 4096
274
+ });
275
+ if (C.isFailure(t)) throw t.failure;
276
+ let r = t.success;
277
+ if (n && r.kind !== "LsInputs" && (r.kind !== "ServerMessage" || this.#u.channels[r.channelId]?.reliable !== !1)) return E("Lockstep control and reliable channels need the actual reliable server lane");
278
+ if (r.kind === "Welcome") {
279
+ if (!this.#w || this.#S !== "connecting" || n || r.tick !== 0 || !r.sessionId || r.epoch < 1) return E("Lockstep bootstrap requires one reliable current initial Welcome");
280
+ this.#E = r.sessionId, this.#D = r.epoch, this.#S = "waitingStart";
281
+ return;
282
+ }
283
+ if (r.kind === "LsStart") {
284
+ if (this.#S !== "waitingStart" || this.#x) return E("Lockstep start requires one reliable current Welcome");
285
+ let e = this.#f.decode(r.options), t = this.#s;
286
+ if (!t) return E("Client initial intent ownership was withdrawn");
287
+ let n = h(r.roster, t.maxPlayers ?? 8);
288
+ if (this.#l !== null && r.localPlayerId !== this.#l || this.#c !== null && (n.length !== this.#c.length || n.some((e, t) => e.slot !== this.#c[t].slot || e.playerId !== this.#c[t].playerId))) return E("Reliable Start does not match the expected host identity");
289
+ let i = r.history ? c(this.#t, {
290
+ maxBytes: this.#r.maxFrameBytes,
291
+ maxTicks: this.#r.maxBootstrapTicks,
292
+ maxPlayers: 64
293
+ }).decode(r.history) : null, a = i?.joins ?? [], o = new Set(a.map((e) => e.playerId)), s = !n.some((e) => e.playerId === r.localPlayerId), l = {
294
+ ...t,
295
+ localPlayerId: r.localPlayerId,
296
+ playerIds: n.filter((e) => !o.has(e.playerId)).map((e) => e.playerId),
297
+ ...s ? { lateJoin: !0 } : {}
298
+ }, u = b(this.#t, l), d = n.map((e) => e.playerId).sort((e, t) => e - t), f = r.snapshot ? this.#p.decode(r.snapshot) : null, p = f ? f.continuation?.at(-1)?.tick ?? f.snapshot.tick : null;
299
+ if (i && f || r.startTick > 0 && !i && !f || i && (i.fromTick !== 0 || i.inputs.length !== r.startTick || i.playerIds.length !== d.length || i.playerIds.some((e, t) => e !== d[t])) || f && (f.snapshot.tick < 1 || p !== r.startTick || f.inputs.length !== d.length || f.inputs.some((e, t) => e.playerId !== d[t]) || (f.continuation?.length ?? 0) > u.maxFutureTicks)) return E("Reliable Start bootstrap must reach its exact frontier with the admitted public roster");
300
+ let m = S(this.#t, r.seed, e, l), _ = [...a].sort((e, t) => e.tick - t.tick).map((e) => {
301
+ let t = n.find((t) => t.playerId === e.playerId);
302
+ return t ? (m.join(e.tick, e.playerId), Object.freeze({
303
+ tick: e.tick,
304
+ slot: t.slot,
305
+ playerId: e.playerId
306
+ })) : E("History join names no Start roster slot");
307
+ });
308
+ if (i && m.installConfirmedHistory(i, {
309
+ maxBytes: this.#r.maxFrameBytes,
310
+ maxTicks: this.#r.maxBootstrapTicks,
311
+ maxPlayers: u.maxPlayers
312
+ }), f && m.installServerSnapshot(f.snapshot, f.inputs, f.continuation), D(this.#S) || this.#s !== t) return E("Client start was withdrawn during author init");
313
+ let v = n.filter((e) => !o.has(e.playerId));
314
+ this.#i = v, this.#a = _, this.#o = g(v), this.#n = u, this.#I = r.startTick, this.#x = m, this.#S = "joined";
315
+ return;
316
+ }
317
+ let a = this.live(), o = this.#i, s = this.#o;
318
+ if (!o || !s) return E("Current simulation needs its reliable host roster");
319
+ switch (r.kind) {
320
+ case "ServerMessage": {
321
+ let e = this.#u.channels[r.channelId];
322
+ if (!e || e.direction === "client") return E("Channel is not server-sendable");
323
+ let t = e.codec.decodeFull(r.payload);
324
+ if (C.isFailure(t)) throw t.failure;
325
+ let n = i(t.success);
326
+ for (let t of this.#v.get(e.name) ?? []) try {
327
+ t(n);
328
+ } catch {
329
+ this.#O++;
330
+ }
331
+ return;
332
+ }
333
+ case "LsJoin": {
334
+ let e = this.rosterAt(2 ** 53 - 1);
335
+ if (r.tick <= a.confirmedThroughTick || e.some((e) => e.slot === r.slot || e.playerId === r.playerId) || this.#a.some((e) => e.tick > r.tick)) return E("Late join must be new, ordered and ahead of the confirmed frontier");
336
+ this.current(a), a.join(r.tick, r.playerId), this.current(a), this.#a.push(Object.freeze({
337
+ tick: r.tick,
338
+ slot: r.slot,
339
+ playerId: r.playerId
340
+ }));
341
+ return;
342
+ }
343
+ case "LsInputs": {
344
+ let e = [];
345
+ for (let t = 0; t < r.matrices.length; t++) {
346
+ let n = r.matrices[t], a = r.firstTick + t, o = this.rosterAt(a), s = g(o);
347
+ if (n.players.hi !== s.hi || n.players.lo !== s.lo || n.inputs.length !== o.length) return E("Server matrix does not name the complete actual roster");
348
+ let c = o.map((e, t) => {
349
+ let r = this.#d.decodeFull(n.inputs[t]);
350
+ if (C.isFailure(r)) throw r.failure;
351
+ return Object.freeze({
352
+ playerId: e.playerId,
353
+ input: i(this.#t.inputCodec.capture(r.success))
354
+ });
355
+ });
356
+ e.push({
357
+ tick: r.firstTick + t,
358
+ inputs: Object.freeze(c)
359
+ });
360
+ }
361
+ this.current(a);
362
+ for (let t of e) a.confirm(t.tick, t.inputs), this.current(a);
363
+ this.#M = null, this.#S = "joined", this.prune();
364
+ return;
365
+ }
366
+ case "LsStall": {
367
+ let e = g(this.rosterAt(2 ** 53 - 1));
368
+ if ((r.waitingFor.hi & ~e.hi) !== 0 || (r.waitingFor.lo & ~e.lo) !== 0) return E("Server stall names unknown roster slots");
369
+ this.#M = Object.freeze({ ...r.waitingFor }), this.#k++, this.#S = "stalled";
370
+ return;
371
+ }
372
+ case "LsDesync": {
373
+ if (!this.#P.has(r.tick)) return E("Server desync must refer to this Session's actual immutable hash claim");
374
+ if (r.action === "end") {
375
+ this.#S = "kicked", this.release(), this.#e.close(1e3, "Lockstep ended");
376
+ return;
377
+ }
378
+ if (r.action === "flag") {
379
+ this.#j++;
380
+ return;
381
+ }
382
+ if (r.snapshot === void 0) return E("Server resync frame lacks its recovery snapshot");
383
+ let e = this.#p.decode(r.snapshot), t = e.snapshot;
384
+ if (t.tick < r.tick) return E("Server resync snapshot precedes its actual incident");
385
+ this.current(a), a.installServerSnapshot(t, e.inputs, e.continuation), this.current(a);
386
+ for (let e of this.#N.keys()) e <= t.tick && this.#N.delete(e);
387
+ this.#F && this.#F.firstTick + this.#F.inputs.length - 1 <= t.tick && (this.#F = null), this.#I = t.tick, this.#L = !0, this.prune(), this.#M = null, this.#A++, this.#S = "joined";
388
+ return;
389
+ }
390
+ case "Kick":
391
+ this.#S = "kicked", this.release(), this.#e.close(1e3, "Lockstep kicked");
392
+ return;
393
+ case "Pong": return;
394
+ default: return E("Unexpected state-sync or client-only frame on lockstep server lane");
395
+ }
396
+ }), this.notify();
397
+ } catch {
398
+ this.#C = new t({ detail: "Lockstep client refused a frame or simulation operation" }), this.#S = "faulted", this.release();
399
+ try {
400
+ this.#e.close(1002, "Lockstep protocol error");
401
+ } catch (e) {
402
+ this.#g.push(e);
403
+ }
404
+ this.notify();
405
+ }
406
+ }
407
+ prune() {
408
+ let e = (this.#x?.tick ?? 0) - this.#r.horizon;
409
+ for (let t of this.#N.keys()) t < e && this.#N.delete(t);
410
+ let t = (this.#x?.tick ?? 0) - this.#r.hashHistoryTicks;
411
+ for (let e of this.#P.keys()) e < t && this.#P.delete(e);
412
+ }
413
+ advance() {
414
+ let e = this.work(() => {
415
+ let e = this.live();
416
+ if (this.#I > 0 && e.tick === this.#I && !this.#L) return E("Sample actual initial intentions at the recovered frontier before advancing further");
417
+ let t = e.advance();
418
+ return this.current(e), this.#S = t._tag === "stalled" ? "stalled" : "joined", this.prune(), t;
419
+ });
420
+ return this.notify(), e;
421
+ }
422
+ sendIntent(e) {
423
+ let t = this.work(() => {
424
+ let t = this.live();
425
+ if (t.tick < this.#I) return E("Consume reliable history before sampling current intentions");
426
+ if (!this.#L) return E("Send the explicit initial intentions before delayed local sampling");
427
+ if (this.#F) return E("Retry the retained intent write before replacing it");
428
+ let n = r(t.tick + Math.max(1, this.#r.delay)), a = i(this.#t.inputCodec.capture(e)), o = this.#d.full(a);
429
+ if (C.isFailure(o)) throw o.failure;
430
+ let s = this.#N.get(n);
431
+ if (s && !O(s, o.success)) return E("Sent local intent is immutable for its target tick");
432
+ let c = this.#r.redundantInputs - 1, l = c === 0 ? [] : [...this.#N.entries()].filter(([e]) => e < n).sort((e, t) => e[0] - t[0]).slice(-c);
433
+ l.push([n, s ?? o.success]);
434
+ let u = l.length - 1;
435
+ for (; u > 0 && l[u - 1][0] + 1 === l[u][0];) u--;
436
+ let d = l.slice(u), f = {
437
+ kind: "LsInput",
438
+ firstTick: d[0][0],
439
+ inputs: Object.freeze(d.map((e) => e[1]))
440
+ };
441
+ return this.encode(f), this.current(t), s || (t.submitLocal(a), this.current(t), this.#N.set(n, o.success)), this.#F = f, f;
442
+ });
443
+ return this.deliverIntent(t);
444
+ }
445
+ deliverIntent(e) {
446
+ if (this.#R) return Promise.reject(new t({ detail: "Lockstep intent delivery cannot overlap its retained write" }));
447
+ this.#R = !0;
448
+ try {
449
+ if (this.#e.unreliable) {
450
+ let t = this.encode(e);
451
+ if (t.length <= this.#e.unreliable.maxDatagramBytes) return this.#e.unreliable.send(t), this.#F === e && (this.#F = null), Promise.resolve();
452
+ }
453
+ let t = this.handOff(e);
454
+ return t.accepted && this.#F === e && (this.#F = null), t.task;
455
+ } catch (e) {
456
+ return Promise.reject(e);
457
+ } finally {
458
+ this.#R = !1, this.notify();
459
+ }
460
+ }
461
+ handOff(n) {
462
+ if (this.#e.signal.aborted || D(this.#S)) return {
463
+ accepted: !1,
464
+ task: Promise.reject(new t({ detail: "Lockstep transport is closed" }))
465
+ };
466
+ if (this.#h.size >= this.#r.maxPendingWrites) return {
467
+ accepted: !1,
468
+ task: Promise.reject(new e({
469
+ budget: "lockstepClientWrites",
470
+ limit: this.#r.maxPendingWrites
471
+ }))
472
+ };
473
+ let r = this.encode(n), i;
474
+ try {
475
+ i = this.#e.reliable.send(r);
476
+ } catch (e) {
477
+ return {
478
+ accepted: !1,
479
+ task: Promise.reject(e)
480
+ };
481
+ }
482
+ let a = () => {
483
+ this.#h.delete(i), this.notify();
484
+ };
485
+ return this.#h.add(i), i.then(a, a), {
486
+ accepted: !0,
487
+ task: i
488
+ };
489
+ }
490
+ sendInitialIntents(e) {
491
+ let t = this.work(() => {
492
+ let t = this.live();
493
+ if (this.#L || t.tick !== this.#I || this.#F || !this.#n) return E("Initial intentions are admitted exactly once at the actual bootstrap frontier");
494
+ let n = this.#r.delay - 1;
495
+ if (n < 1 || n > this.#r.redundantInputs) return E("Initial intent batch exceeds the explicit redundant-input budget");
496
+ let a = this.#n.initialInputs.find((e) => e.playerId === this.#n?.localPlayerId);
497
+ if (e === void 0 && !a) return E("Sample a real local intention when no authored initial matrix exists");
498
+ let o = e === void 0 ? a.input : i(this.#t.inputCodec.capture(e)), s = this.#d.full(o);
499
+ if (C.isFailure(s)) throw s.failure;
500
+ let c = r(t.tick + 1);
501
+ if (c > 4294967295 - n + 1) return E("Bootstrap intention ticks are exhausted");
502
+ let l = {
503
+ kind: "LsInput",
504
+ firstTick: c,
505
+ inputs: Object.freeze(Array.from({ length: n }, () => s.success))
506
+ };
507
+ this.encode(l), this.current(t);
508
+ for (let e = 0; e < n; e++) this.#N.set(c + e, s.success);
509
+ return this.#L = !0, this.#F = l, l;
510
+ });
511
+ return this.deliverIntent(t);
512
+ }
513
+ resendRetainedIntent() {
514
+ let e = this.work(() => {
515
+ let e = this.live();
516
+ if (this.#F) return E("Retry the retained write before resending another intention");
517
+ let t = r(e.tick + Math.max(1, this.#r.delay)), n = this.#N.get(t);
518
+ if (!n) return E("No actual retained local intention exists for this target tick");
519
+ let i = {
520
+ kind: "LsInput",
521
+ firstTick: t,
522
+ inputs: Object.freeze([n])
523
+ };
524
+ return this.encode(i), this.current(e), this.#F = i, i;
525
+ });
526
+ return this.deliverIntent(e);
527
+ }
528
+ retryIntent() {
529
+ this.live();
530
+ let e = this.#F;
531
+ return e ? this.deliverIntent(e) : Promise.reject(new t({ detail: "No retained lockstep intent write" }));
532
+ }
533
+ sendHash(e) {
534
+ let t = this.work(() => {
535
+ let t = this.live();
536
+ if (r(e), e < 1 || e % this.#r.hashEvery !== 0) return E("Hash tick is outside the configured cadence");
537
+ let n = t.confirmedSnapshot(e), i = this.#P.get(e);
538
+ if (i && (i.hi !== n.hash.hi || i.lo !== n.hash.lo)) return E("Client cannot change an immutable sent hash claim");
539
+ let a = Object.freeze({ ...n.hash }), o = {
540
+ kind: "LsHash",
541
+ tick: e,
542
+ hi: a.hi,
543
+ lo: a.lo
544
+ };
545
+ return this.encode(o), this.current(t), this.#P.set(e, a), o;
546
+ });
547
+ return this.write(t);
548
+ }
549
+ release() {
550
+ for (let e of this.#m.splice(0)) try {
551
+ e();
552
+ } catch (e) {
553
+ this.#g.push(e);
554
+ }
555
+ this.#x = null, this.#n = null, this.#s = null, this.#i = null, this.#a = [], this.#o = null, this.#N.clear(), this.#P.clear(), this.#F = null, this.#M = null, this.#v.clear();
556
+ }
557
+ close() {
558
+ this.work(() => {
559
+ if (!D(this.#S)) {
560
+ this.#S = "left", this.release();
561
+ try {
562
+ this.#e.close(1e3, "Lockstep client closed");
563
+ } catch (e) {
564
+ this.#g.push(e);
565
+ }
566
+ }
567
+ }), this.notify(), this.#_.clear();
568
+ }
569
+ closeAsync() {
570
+ return this.close(), this.#y.cleanupAsync();
571
+ }
572
+ async settled() {
573
+ let e = (await Promise.allSettled([...this.#h])).flatMap((e) => e.status === "rejected" ? [e.reason] : []);
574
+ if (e.length) throw AggregateError(e, "Lockstep client writes failed");
575
+ }
576
+ }, A = (e, t, n, r) => new k(e, t, n, r);
577
+ export { k as RoomLockstepClientSession, A as createRoomLockstepClientSession, T as isRoomLockstepClientSession };