@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,92 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ import { ROOM_CHECKPOINTS_TABLE as t } from "./identities.js";
3
+ import { canonicalRoomJson as n } from "./checkpointJson.js";
4
+ import { captureRoomSnapshotBlobReference as r } from "./snapshotBlob.js";
5
+ import { captureRoomSnapshotBlobs as i, captureRoomSnapshotEffectRunner as a } from "./snapshotBlobIndex.js";
6
+ import { readRoomSnapshotSegmentBlobs as o } from "./snapshotSegmentBlobs.js";
7
+ import { and as s, eq as c } from "@voltro/database";
8
+ import { Effect as l } from "effect";
9
+ // src/snapshotBlobCleanup.ts
10
+ function u(t) {
11
+ throw new e({ detail: t });
12
+ }
13
+ var d = (e) => n([e.refId, e.claim]), f = (e, t) => s(c("roomId", e), c("tenantId", t)), p = async (e, n, r) => (await e.query({
14
+ table: t,
15
+ predicate: f(n, r),
16
+ order: [],
17
+ take: 1,
18
+ skip: void 0,
19
+ projection: void 0,
20
+ lock: "update"
21
+ }))[0], m = (e, t, n, i) => {
22
+ if (e.blob == null) return null;
23
+ let a = e.checkpoint;
24
+ return !a || a.roomId !== t || a.tenantId !== n ? u("Snapshot blob journal has unrelated checkpoint identity") : r(e.blob, {
25
+ roomId: t,
26
+ tenantId: n,
27
+ epoch: a.epoch,
28
+ revision: a.revision
29
+ }, i);
30
+ }, h = (e, t, n, i) => {
31
+ let a = e ? m(e, t, n, i) : null, o = new Set(a ? [d(a)] : []), s = (a, s) => {
32
+ if (a == null) return [];
33
+ if (!Array.isArray(a) || a.length > s) return u("Snapshot blob journal exceeds its bounded inventory");
34
+ let c = a;
35
+ for (let e = 0; e < c.length; e++) if (!Object.hasOwn(c, e)) return u("Snapshot blob journal cannot be sparse");
36
+ return c.map((a) => {
37
+ if (!a || typeof a != "object" || Array.isArray(a)) return u("Malformed snapshot blob journal reference");
38
+ let s = a, c = r(s, {
39
+ roomId: t,
40
+ tenantId: n,
41
+ epoch: s.epoch,
42
+ revision: s.revision
43
+ }, i), l = e?.checkpoint;
44
+ return !l || c.epoch > l.epoch || c.revision >= l.revision ? u("Snapshot blob journal reference is not retired history") : o.has(d(c)) ? u("Snapshot blob claim is duplicated or still current") : (o.add(d(c)), c);
45
+ });
46
+ };
47
+ return Object.freeze({
48
+ blobHistory: Object.freeze(s(e?.blobHistory, 16)),
49
+ retiredBlobs: Object.freeze(s(e?.retiredBlobs, 256))
50
+ });
51
+ }, g = (e, t, n, r) => {
52
+ let i = h(e, t.roomId, t.tenantId, r), a = e ? m(e, t.roomId, t.tenantId, r) : null, o = [...i.blobHistory];
53
+ a && (!n || d(a) !== d(n)) && o.push(a), o.sort((e, t) => t.epoch - e.epoch || t.revision - e.revision);
54
+ let s = Math.max(0, (t.snapshot?.keepFulls ?? 3) - 1), c = [...i.retiredBlobs, ...o.slice(s)];
55
+ if (c.length > 256) return u("Snapshot retired-claim journal must drain before another checkpoint");
56
+ let l = new Set(n ? [d(n)] : []);
57
+ for (let e of o.slice(0, s)) l.add(d(e));
58
+ return c.some((e) => l.has(d(e))) ? u("Snapshot retired claim remains referenced") : Object.freeze({
59
+ blobHistory: Object.freeze(o.slice(0, s)),
60
+ retiredBlobs: Object.freeze(c)
61
+ });
62
+ }, _ = (e, t, n, r, i) => h({
63
+ checkpoint: t,
64
+ blob: n,
65
+ blobHistory: e.blobHistory,
66
+ retiredBlobs: [...e.retiredBlobs, ...r]
67
+ }, t.roomId, t.tenantId, i), v = async (e, t, n, r, i) => {
68
+ if (!t.length) return;
69
+ let a = new Set((await o(e, n, r, i)).map(d));
70
+ t.some((e) => a.has(d(e))) && u("Retired snapshot claim remains referenced by a SQL segment");
71
+ }, y = (n, r, o, g, _ = {}) => {
72
+ if (!_ || typeof _ != "object" || Array.isArray(_) || Object.keys(_).some((e) => !["maxBytes", "limit"].includes(e))) return l.fail(new e({ detail: "Invalid scoped snapshot blob cleanup budget" }));
73
+ let y = i(r), b = _.maxBytes ?? 1048576, x = _.limit ?? 16;
74
+ return !y || ![o, g].every((e) => typeof e == "string" && e.trim() && e.length <= 191) || !Number.isSafeInteger(b) || b < 1 || b > 67108864 || !Number.isSafeInteger(x) || x < 1 || x > 256 ? l.fail(new e({ detail: "Invalid scoped snapshot blob cleanup budget" })) : l.flatMap(l.context(), (r) => l.uninterruptible(l.tryPromise({
75
+ try: async () => {
76
+ let e = a(r), i = await n.transactional(async (e) => {
77
+ let t = h(await p(e, o, g), o, g, b).retiredBlobs.slice(0, x);
78
+ return await v(e, t, o, g, b), t;
79
+ }), l = 0;
80
+ for (let r of i) await e(y.release(r, r)), await n.transactional(async (e) => {
81
+ let n = await p(e, o, g);
82
+ if (!n) return;
83
+ let i = h(n, o, g, b), a = m(n, o, g, b);
84
+ if (a && d(a) === d(r) || i.blobHistory.some((e) => d(e) === d(r))) return u("Released snapshot claim was illegally reintroduced into its index");
85
+ await v(e, [r], o, g, b), await e.updateMany(t, { retiredBlobs: i.retiredBlobs.filter((e) => d(e) !== d(r)) }, { where: s(f(o, g), c("id", n.id)) });
86
+ }), l++;
87
+ return l;
88
+ },
89
+ catch: (t) => t instanceof e ? t : new e({ detail: "Snapshot retired-claim cleanup remains unconfirmed" })
90
+ })));
91
+ };
92
+ export { _ as appendRoomSnapshotRetiredClaims, y as cleanupRoomCheckpointBlobs, g as planRoomSnapshotBlobJournal, h as readRoomSnapshotBlobJournal };
@@ -0,0 +1,37 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ import { captureRoomSnapshotBlobReference as t } from "./snapshotBlob.js";
3
+ import { Effect as n, Result as r } from "effect";
4
+ import { createHash as i } from "node:crypto";
5
+ // src/snapshotBlobIndex.ts
6
+ var a = (e) => async (t) => {
7
+ let i = await n.runPromiseWith(e)(n.result(t));
8
+ if (r.isFailure(i)) throw i.failure;
9
+ return i.success;
10
+ }, o = (t) => {
11
+ if (t !== void 0) {
12
+ if (!t || ![
13
+ "write",
14
+ "read",
15
+ "release",
16
+ "recover"
17
+ ].every((e) => typeof Reflect.get(t, e) == "function")) throw new e({ detail: "Snapshot placement requires the complete borrowed blob port" });
18
+ return Object.freeze({
19
+ recover: t.recover.bind(t),
20
+ write: t.write.bind(t),
21
+ read: t.read.bind(t),
22
+ release: t.release.bind(t)
23
+ });
24
+ }
25
+ }, s = async (r, a, o, s, c, l = n.runPromise) => {
26
+ let u = r.checkpoint;
27
+ if (!u || u.snapshot?.mode !== "full" || r.storage != null || !(r.bytes instanceof Uint8Array) || r.bytes.byteLength !== 0 || !c) throw new e({ detail: "Room blob index requires matching full metadata and its bound blob port" });
28
+ let d = t(r.blob, {
29
+ roomId: a,
30
+ tenantId: o,
31
+ epoch: u.epoch,
32
+ revision: u.revision
33
+ }, s), f = await l(c.read(d, d));
34
+ if (!(f instanceof Uint8Array) || f.byteLength !== d.size || i("sha256").update(f).digest("hex") !== d.checksum) throw new e({ detail: "Room snapshot blob index content integrity failed" });
35
+ return Uint8Array.from(f);
36
+ };
37
+ export { o as captureRoomSnapshotBlobs, a as captureRoomSnapshotEffectRunner, s as readRoomSnapshotBlobIndex };
@@ -0,0 +1,79 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ // src/snapshotBudget.ts
3
+ var t = (t = {}) => {
4
+ if (!t || typeof t != "object" || Array.isArray(t) || Object.keys(t).some((e) => !["budgetBytesPerSec", "burstBytes"].includes(e))) throw new e({ detail: "Invalid Room snapshot host byte budget" });
5
+ let n = t.budgetBytesPerSec ?? 2e6, r = t.burstBytes ?? Math.max(n, 1048576);
6
+ if (![n, r].every((e) => Number.isSafeInteger(e) && e > 0 && e <= 2147483647)) throw new e({ detail: "Room snapshot rate and burst must be bounded positive byte budgets" });
7
+ let i = r, a = null, o = null, s = 0, c = 0, l = 0, u = (t, o) => {
8
+ if (!Number.isSafeInteger(t) || t < 1 || !Number.isFinite(o) || o < 0 || a !== null && o < a) throw new e({ detail: "Invalid Room snapshot payload or monotonic budget clock" });
9
+ a !== null && (i = Math.min(r, i + Math.min((o - a) / 1e3, (r - i) / n) * n)), a = o;
10
+ };
11
+ return Object.freeze({
12
+ forced: (e, t) => {
13
+ u(e, t), i -= e, c += e;
14
+ },
15
+ periodic: (t, n, a) => {
16
+ if (typeof t != "string" || !t.trim()) throw new e({ detail: "Snapshot scheduling requires an owned room identity" });
17
+ return u(n, a), o !== null && o !== t || i < Math.min(n, r) ? (o ??= t, s++, !1) : (i -= n, l += n, o = null, !0);
18
+ },
19
+ blocked: (e) => {
20
+ let t = o !== null && o !== e;
21
+ return t && s++, t;
22
+ },
23
+ forget: (e) => {
24
+ o === e && (o = null);
25
+ },
26
+ metrics: () => Object.freeze({
27
+ deferred: s,
28
+ forcedBytes: c,
29
+ periodicBytes: l,
30
+ debtBytes: Math.max(0, -i)
31
+ })
32
+ });
33
+ }, n = (n, r) => {
34
+ if (t(r), typeof n != "function") throw new e({ detail: "Room snapshot budget strategy must be a factory" });
35
+ let i;
36
+ try {
37
+ i = n(Object.freeze({ ...r }));
38
+ } catch {
39
+ throw new e({ detail: "Room snapshot budget strategy admission failed" });
40
+ }
41
+ if (!i || ![
42
+ "forced",
43
+ "periodic",
44
+ "blocked",
45
+ "forget",
46
+ "metrics"
47
+ ].every((e) => typeof i[e] == "function")) throw i instanceof Promise && i.catch(() => void 0), new e({ detail: "Room snapshot budget strategy returned an incomplete synchronous service" });
48
+ let a = i.forced.bind(i), o = i.periodic.bind(i), s = i.blocked.bind(i), c = i.forget.bind(i), l = i.metrics.bind(i), u = (t) => {
49
+ if (t !== void 0) throw t instanceof Promise && t.catch(() => void 0), new e({ detail: "Room snapshot budget operations must complete synchronously" });
50
+ }, d = (t) => {
51
+ if (typeof t == "boolean") return t;
52
+ throw t instanceof Promise && t.catch(() => void 0), new e({ detail: "Room snapshot budget decisions must be synchronous booleans" });
53
+ };
54
+ return Object.freeze({
55
+ forced: (e, t) => u(a(e, t)),
56
+ periodic: (e, t, n) => d(o(e, t, n)),
57
+ blocked: (e) => d(s(e)),
58
+ forget: (e) => u(c(e)),
59
+ metrics: () => {
60
+ let t = l();
61
+ if (t instanceof Promise && t.catch(() => void 0), !t || ![
62
+ "deferred",
63
+ "forcedBytes",
64
+ "periodicBytes",
65
+ "debtBytes"
66
+ ].every((e) => {
67
+ let n = t[e];
68
+ return typeof n == "number" && Number.isFinite(n) && n >= 0;
69
+ })) throw new e({ detail: "Room snapshot budget returned invalid observations" });
70
+ return Object.freeze({
71
+ deferred: t.deferred,
72
+ forcedBytes: t.forcedBytes,
73
+ periodicBytes: t.periodicBytes,
74
+ debtBytes: t.debtBytes
75
+ });
76
+ }
77
+ });
78
+ };
79
+ export { n as captureRoomSnapshotBudget, t as defaultRoomSnapshotBudget };
@@ -0,0 +1,184 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ import { ROOMS_TABLE as t, ROOM_SNAPSHOT_SEGMENTS_TABLE as n } from "./identities.js";
3
+ import { canonicalRoomJson as r } from "./checkpointJson.js";
4
+ import { captureRoomSnapshotBlobReference as i } from "./snapshotBlob.js";
5
+ import { readRoomSnapshotBlobIndex as a } from "./snapshotBlobIndex.js";
6
+ import { captureRoomSnapshotSegmentBlob as o, retireRoomSnapshotSegments as s } from "./snapshotSegmentBlobs.js";
7
+ import { and as c, eq as l, generateId as u } from "@voltro/database";
8
+ import { Effect as d, Result as f } from "effect";
9
+ import { createHash as p } from "node:crypto";
10
+ // src/snapshotChain.ts
11
+ function m(t) {
12
+ throw new e({ detail: t });
13
+ }
14
+ var h = (e) => p("sha256").update(e).digest("hex"), g = (e, t) => p("sha256").update(r(e)).update(t).digest("hex"), _ = (e, t) => c(l("roomId", e), l("tenantId", t)), v = (e) => typeof e == "number" && Number.isSafeInteger(e) && e > 0, y = (e) => typeof e == "string" && /^[a-f0-9]{64}$/.test(e), b = (e) => {
15
+ if (f.isFailure(e)) throw e.failure;
16
+ return e.success;
17
+ }, x = (e) => {
18
+ if (!e || typeof e != "object" || Array.isArray(e)) return m("Malformed Room snapshot chain reference");
19
+ let t = e;
20
+ return Object.keys(t).some((e) => ![
21
+ "version",
22
+ "epoch",
23
+ "revision",
24
+ "fullRevision",
25
+ "fullEvery",
26
+ "keepFulls"
27
+ ].includes(e)) || t.version !== 1 || ![
28
+ t.epoch,
29
+ t.revision,
30
+ t.fullRevision,
31
+ t.fullEvery,
32
+ t.keepFulls
33
+ ].every(v) || t.fullEvery > 128 || t.keepFulls > 16 || t.fullRevision > t.revision || t.revision - t.fullRevision >= t.fullEvery ? m("Invalid bounded Room snapshot chain reference") : Object.freeze({ ...t });
34
+ }, S = async (e, n, r, i, a) => {
35
+ if (typeof a != "function") return m("Room delta snapshot requires the declared room codec resolver");
36
+ let o = (await e.query({
37
+ table: t,
38
+ predicate: c(l("id", n), l("tenantId", r)),
39
+ order: [],
40
+ take: 1,
41
+ skip: void 0,
42
+ projection: ["name"]
43
+ }))[0];
44
+ if (!o || typeof o.name != "string") return m("Room snapshot codec has no matching SQL room declaration");
45
+ let s = a(o.name);
46
+ return !s || s.schemaHash !== i || ![
47
+ "decodeFull",
48
+ "decodeDelta",
49
+ "full",
50
+ "delta"
51
+ ].every((e) => typeof Reflect.get(s, e) == "function") ? m("Room snapshot codec does not match the durable schema") : s;
52
+ }, C = async (e, t, r, i, s, u, f, p = d.runPromise) => {
53
+ if (t.blob != null) return a(t, r, i, s, f, p);
54
+ if (t.storage === void 0 || t.storage === null) return t.checkpoint?.snapshot?.mode === "delta" ? m("Room delta checkpoint has no durable chain reference") : t.bytes instanceof Uint8Array ? Uint8Array.from(t.bytes) : m("Malformed inline Room snapshot bytes");
55
+ let C = x(t.storage), w = t.checkpoint;
56
+ if (!w || w.roomId !== r || w.tenantId !== i || w.epoch !== C.epoch || w.revision !== C.revision || !(t.bytes instanceof Uint8Array) || t.bytes.byteLength !== 0 || w.snapshot?.mode !== "delta" || w.snapshot.fullEvery !== C.fullEvery || w.snapshot.keepFulls !== C.keepFulls) return m("Room snapshot chain does not match its checkpoint");
57
+ let T = await S(e, r, i, w.schemaHash, u), E = await e.query({
58
+ table: n,
59
+ predicate: c(_(r, i), l("epoch", C.epoch), l("fullRevision", C.fullRevision)),
60
+ order: [{
61
+ column: "revision",
62
+ direction: "asc"
63
+ }],
64
+ take: C.fullEvery + 1,
65
+ skip: void 0,
66
+ projection: void 0
67
+ });
68
+ if (E.length !== C.revision - C.fullRevision + 1) return m("Room snapshot chain is incomplete or exceeds its bound");
69
+ let D, O = /* @__PURE__ */ new Uint8Array();
70
+ for (let e = 0; e < E.length; e++) {
71
+ let t = E[e], n = t.segment, a = t.bytes, c = o(t, r, i, s);
72
+ if (c) {
73
+ if (!f) return m("Room snapshot segment needs its actual bound blob port");
74
+ if (a = await p(f.read(c, c)), !(a instanceof Uint8Array) || a.byteLength !== c.size || h(a) !== c.checksum) return m("Room snapshot segment blob content integrity failed");
75
+ a = Uint8Array.from(a);
76
+ }
77
+ if (!n || ![
78
+ n.epoch,
79
+ n.revision,
80
+ n.fullRevision
81
+ ].every(v) || Object.keys(n).some((e) => ![
82
+ "epoch",
83
+ "revision",
84
+ "fullRevision",
85
+ "previousRevision",
86
+ "schemaHash",
87
+ "kind",
88
+ "resultHash"
89
+ ].includes(e)) || n.epoch !== C.epoch || n.revision !== C.fullRevision + e || n.fullRevision !== C.fullRevision || n.previousRevision !== (e === 0 ? null : n.revision - 1) || n.schemaHash !== w.schemaHash || e === 0 && n.kind !== "full" || e !== 0 && !["delta", "same"].includes(n.kind) || !y(n.resultHash) || !(a instanceof Uint8Array) || a.byteLength > s || t.roomId !== r || t.tenantId !== i || t.epoch !== n.epoch || t.revision !== n.revision || t.fullRevision !== n.fullRevision || t.kind !== n.kind || t.digest !== g(n, a)) return m("Room snapshot segment integrity failed");
90
+ if (e === 0) D = b(T.decodeFull(a)), O = Uint8Array.from(a);
91
+ else if (n.kind === "delta") D = b(T.decodeDelta(a, D)), O = Uint8Array.from(b(T.full(D)));
92
+ else if (a.byteLength !== 0) return m("Unchanged Room snapshot segment must have no payload");
93
+ if (O.byteLength > s || h(O) !== n.resultHash) return m("Room snapshot reconstruction integrity failed");
94
+ }
95
+ return O;
96
+ }, w = async (e, t, n, r, i) => {
97
+ let a = t.snapshot;
98
+ if (a?.mode !== "delta") return m("Snapshot segment planning requires the actual delta policy");
99
+ let o = await S(e, t.roomId, t.tenantId, t.schemaHash, i), s = b(o.decodeFull(t.bytes)), c = n?.storage == null ? null : x(n.storage), l = Uint8Array.from(t.bytes), u = "full", d = t.revision;
100
+ if (r && c && t.disposition === "live" && r.epoch === t.epoch && r.schemaHash === t.schemaHash && c.fullEvery === a.fullEvery && c.keepFulls === a.keepFulls && t.revision - c.fullRevision < a.fullEvery) {
101
+ let e = b(o.delta(s, b(o.decodeFull(r.bytes))));
102
+ (e === null || e.byteLength < t.bytes.byteLength) && (u = e === null ? "same" : "delta", l = e === null ? /* @__PURE__ */ new Uint8Array() : Uint8Array.from(e), d = c.fullRevision);
103
+ }
104
+ let f = Object.freeze({
105
+ epoch: t.epoch,
106
+ revision: t.revision,
107
+ fullRevision: d,
108
+ previousRevision: u === "full" ? null : t.revision - 1,
109
+ schemaHash: t.schemaHash,
110
+ kind: u,
111
+ resultHash: h(t.bytes)
112
+ });
113
+ return Object.freeze({
114
+ segment: f,
115
+ payload: l,
116
+ storage: Object.freeze({
117
+ version: 1,
118
+ epoch: t.epoch,
119
+ revision: t.revision,
120
+ fullRevision: d,
121
+ fullEvery: a.fullEvery,
122
+ keepFulls: a.keepFulls
123
+ })
124
+ });
125
+ }, T = async (e, t, a, o, d, f, p, v, y, b = 1048576) => {
126
+ let x = t.snapshot;
127
+ if (x?.mode !== "delta") {
128
+ let n = await s(e, t.roomId, t.tenantId, b);
129
+ return {
130
+ bytes: Uint8Array.from(t.bytes),
131
+ storage: null,
132
+ retiredBlobs: n
133
+ };
134
+ }
135
+ let S = await w(e, t, a, o, d);
136
+ if (v && (r(v.segment) !== r(S.segment) || r(v.storage) !== r(S.storage) || !Buffer.from(v.payload).equals(Buffer.from(S.payload)))) return m("Uploaded Room segment plan no longer matches the fenced SQL baseline");
137
+ let { segment: C, payload: T, storage: E } = S, D = null;
138
+ if (y) {
139
+ if (D = i(y, t, b), !v || T.byteLength <= p || D.size !== T.byteLength || D.checksum !== h(T)) return m("Room segment blob does not match its exact prepared payload");
140
+ } else if (T.byteLength > p) return m("Room snapshot segment exceeds inline placement and needs its actual blob port");
141
+ await e.insert(n, {
142
+ id: u({
143
+ kind: "typeid",
144
+ prefix: "rseg"
145
+ }, n),
146
+ roomId: t.roomId,
147
+ tenantId: t.tenantId,
148
+ epoch: t.epoch,
149
+ revision: t.revision,
150
+ fullRevision: C.fullRevision,
151
+ kind: C.kind,
152
+ segment: C,
153
+ bytes: D ? /* @__PURE__ */ new Uint8Array() : T,
154
+ blob: D,
155
+ digest: g(C, T),
156
+ createdAt: f
157
+ });
158
+ let O = [];
159
+ if (C.kind === "full") {
160
+ for (let n of ["delta", "same"]) O.push(...await s(e, t.roomId, t.tenantId, b, l("kind", n)));
161
+ let r = await e.query({
162
+ table: n,
163
+ predicate: c(_(t.roomId, t.tenantId), l("kind", "full")),
164
+ order: [{
165
+ column: "epoch",
166
+ direction: "desc"
167
+ }, {
168
+ column: "revision",
169
+ direction: "desc"
170
+ }],
171
+ take: 18,
172
+ skip: void 0,
173
+ projection: ["id"]
174
+ });
175
+ if (r.length > 17) return m("Retained Room full history exceeds its bounded inventory");
176
+ for (let n of r.slice(x.keepFulls)) O.push(...await s(e, t.roomId, t.tenantId, b, l("id", n.id)));
177
+ }
178
+ return {
179
+ bytes: /* @__PURE__ */ new Uint8Array(),
180
+ storage: E,
181
+ retiredBlobs: O
182
+ };
183
+ };
184
+ export { C as loadRoomSnapshotPayload, w as prepareRoomSnapshotPayload, x as readRoomSnapshotChainReference, T as writeRoomSnapshotPayload };
@@ -0,0 +1,171 @@
1
+ import { ProtocolError as e } from "./errors.js";
2
+ import { ROOMS_TABLE as t, ROOM_CHECKPOINTS_TABLE as n, ROOM_SNAPSHOT_SEGMENTS_TABLE as r } from "./identities.js";
3
+ import { canonicalRoomJson as i } from "./checkpointJson.js";
4
+ import { captureRoomSnapshotBlobReference as a } from "./snapshotBlob.js";
5
+ import { captureRoomSnapshotBlobs as o, captureRoomSnapshotEffectRunner as s } from "./snapshotBlobIndex.js";
6
+ import { readRoomSnapshotSegmentBlobs as c } from "./snapshotSegmentBlobs.js";
7
+ import { readRoomSnapshotBlobJournal as l } from "./snapshotBlobCleanup.js";
8
+ import { cleanupRoomSnapshotUploads as u, readRoomSnapshotUploadJournal as d } from "./snapshotUploads.js";
9
+ import { and as f, eq as p } from "@voltro/database";
10
+ import { Effect as m } from "effect";
11
+ // src/snapshotErasure.ts
12
+ var h = 418;
13
+ function g(t) {
14
+ throw new e({ detail: t });
15
+ }
16
+ var _ = (e) => typeof e == "string" && e.trim() && e.length <= 191 ? e : g("Invalid scoped snapshot erasure identity"), v = (e) => i([e.refId, e.claim]), y = (e, t) => f(p("roomId", e), p("tenantId", t)), b = (e, t, n, r) => {
17
+ if (e.id !== t || e.tenantId !== n || !Number.isSafeInteger(e.epoch) || Number(e.epoch) < 1) return g("Snapshot erasure journal has unrelated SQL authority");
18
+ let i = e.snapshotErasure;
19
+ if (i == null) return null;
20
+ if (!i || typeof i != "object" || Array.isArray(i)) return g("Malformed snapshot erasure journal");
21
+ let o = i;
22
+ if (Object.keys(o).some((e) => ![
23
+ "version",
24
+ "epoch",
25
+ "requestId",
26
+ "state",
27
+ "references"
28
+ ].includes(e)) || o.version !== 1 || o.epoch !== e.epoch || !["pending", "complete"].includes(o.state) || e.state !== "disposed" || e.clients !== 0 || e.locked !== !0 || e.private !== !0 || !Array.isArray(o.references) || o.references.length > h || o.state === "complete" && o.references.length !== 0) return g("Invalid snapshot erasure journal boundary");
29
+ let s = _(o.requestId), c = Array.from(o.references, (e) => {
30
+ if (!e || typeof e != "object" || Array.isArray(e)) return g("Malformed snapshot erasure claim");
31
+ let i = a(e, {
32
+ roomId: t,
33
+ tenantId: n,
34
+ epoch: e.epoch,
35
+ revision: e.revision
36
+ }, r);
37
+ return i.epoch >= o.epoch ? g("Snapshot erasure cannot release an unfenced owner claim") : i;
38
+ });
39
+ return new Set(c.map(v)).size === c.length ? Object.freeze({
40
+ version: 1,
41
+ epoch: o.epoch,
42
+ requestId: s,
43
+ state: o.state,
44
+ references: Object.freeze(c)
45
+ }) : g("Snapshot erasure claim inventory is duplicated");
46
+ }, x = (h, x, S, C = {}) => {
47
+ let w, T, E;
48
+ try {
49
+ (!S || typeof S != "object" || Array.isArray(S) || Object.keys(S).some((e) => ![
50
+ "roomId",
51
+ "tenantId",
52
+ "epoch",
53
+ "requestId"
54
+ ].includes(e)) || !Number.isSafeInteger(S.epoch) || S.epoch < 2 || !C || typeof C != "object" || Array.isArray(C) || Object.keys(C).some((e) => e !== "maxBytes")) && g("Invalid snapshot erasure admission"), w = Object.freeze({
55
+ roomId: _(S.roomId),
56
+ tenantId: _(S.tenantId),
57
+ epoch: S.epoch,
58
+ requestId: _(S.requestId)
59
+ }), T = C.maxBytes ?? 1048576, (!Number.isSafeInteger(T) || T < 1 || T > 67108864) && g("Invalid snapshot erasure byte budget"), E = o(x);
60
+ } catch (t) {
61
+ return m.fail(t instanceof e ? t : new e({ detail: "Snapshot erasure admission failed" }));
62
+ }
63
+ let D = async (e) => {
64
+ let n = (await e.query({
65
+ table: t,
66
+ predicate: f(p("id", w.roomId), p("tenantId", w.tenantId)),
67
+ order: [],
68
+ take: 1,
69
+ skip: void 0,
70
+ projection: void 0,
71
+ lock: "update"
72
+ }))[0];
73
+ return !n || n.epoch !== w.epoch || n.state !== "disposed" || n.clients !== 0 || n.locked !== !0 || n.private !== !0 ? g("Snapshot erasure requires the exact withdrawn SQL room") : n;
74
+ }, O = (e) => {
75
+ let t = b(e, w.roomId, w.tenantId, T);
76
+ return t && t.requestId !== w.requestId ? g("Snapshot erasure request identity changed") : t;
77
+ };
78
+ return m.flatMap(m.context(), (o) => m.uninterruptible(m.tryPromise({
79
+ try: async () => {
80
+ let e = s(o), m = await h.transactional(async (e) => {
81
+ let o = await D(e), s = O(o), u = d(o, w.roomId, w.tenantId, T);
82
+ if (u.some((e) => e.epoch >= w.epoch)) return g("Snapshot erasure still has an unfenced upload writer");
83
+ if (s) {
84
+ if (s.state === "complete" && u.length) return g("Completed snapshot erasure has reintroduced uploads");
85
+ for (let t of [n, r]) if ((await e.query({
86
+ table: t,
87
+ predicate: y(w.roomId, w.tenantId),
88
+ order: [],
89
+ take: 1,
90
+ skip: void 0,
91
+ projection: ["id"]
92
+ })).length) return g("Snapshot erasure indexes were illegally reintroduced");
93
+ return !E && (s.references.length || u.length) ? g("Pending snapshot erasure lost its actual blob port") : s;
94
+ }
95
+ let m = (await e.query({
96
+ table: n,
97
+ predicate: y(w.roomId, w.tenantId),
98
+ order: [],
99
+ take: 1,
100
+ skip: void 0,
101
+ projection: void 0,
102
+ lock: "update"
103
+ }))[0], h = [];
104
+ if (m) {
105
+ let e = m.checkpoint;
106
+ if (!e || e.roomId !== w.roomId || e.tenantId !== w.tenantId || !Number.isSafeInteger(e.epoch) || Number(e.epoch) < 1 || Number(e.epoch) >= w.epoch || !Number.isSafeInteger(e.revision) || Number(e.revision) < 1) return g("Snapshot erasure has no strictly older checkpoint authority");
107
+ let t = l(m, w.roomId, w.tenantId, T);
108
+ h.push(...t.blobHistory, ...t.retiredBlobs), m.blob != null && h.push(a(m.blob, {
109
+ roomId: w.roomId,
110
+ tenantId: w.tenantId,
111
+ epoch: Number(e.epoch),
112
+ revision: Number(e.revision)
113
+ }, T));
114
+ }
115
+ h.push(...await c(e, w.roomId, w.tenantId, T, w.epoch));
116
+ let _ = /* @__PURE__ */ new Map();
117
+ for (let e of h) {
118
+ if (e.epoch >= w.epoch) return g("Snapshot erasure has an unfenced segment claim");
119
+ let t = _.get(v(e));
120
+ if (t && i(t) !== i(e)) return g("Snapshot erasure claim has conflicting scope");
121
+ _.set(v(e), e);
122
+ }
123
+ if (!E && (_.size || u.length)) return g("Snapshot erasure requires its actual bound blob port");
124
+ let x = {
125
+ version: 1,
126
+ epoch: w.epoch,
127
+ requestId: w.requestId,
128
+ state: "pending",
129
+ references: [..._.values()]
130
+ };
131
+ return b({
132
+ ...o,
133
+ snapshotErasure: x
134
+ }, w.roomId, w.tenantId, T), await e.updateMany(t, { snapshotErasure: x }, { where: f(p("id", w.roomId), p("tenantId", w.tenantId)) }), await e.deleteMany(r, { where: y(w.roomId, w.tenantId) }), await e.deleteMany(n, { where: y(w.roomId, w.tenantId) }), x;
135
+ });
136
+ if (m.state !== "complete") {
137
+ if (!E && m.references.length) return g("Pending snapshot erasure lost its actual blob port");
138
+ for (let n of m.references) await h.transactional(async (e) => O(await D(e))?.references.some((e) => v(e) === v(n))) && (await e(E.release(n, n)), await h.transactional(async (e) => {
139
+ let r = await D(e), i = O(r);
140
+ if (!i || i.state !== "pending") return g("Snapshot erasure lost its durable release receipt");
141
+ await e.updateMany(t, { snapshotErasure: {
142
+ ...i,
143
+ references: i.references.filter((e) => v(e) !== v(n))
144
+ } }, { where: f(p("id", w.roomId), p("tenantId", w.tenantId)) });
145
+ }));
146
+ if ((await h.transactional(async (e) => d(await D(e), w.roomId, w.tenantId, T))).length) {
147
+ if (!E) return g("Pending snapshot uploads require their actual recovery port");
148
+ if ((await e(u(h, E, w.roomId, w.tenantId, T))).pending > 0) return g("Snapshot erasure is waiting for durable upload evidence");
149
+ }
150
+ await h.transactional(async (e) => {
151
+ let i = await D(e), a = O(i);
152
+ if (!a || a.references.length || d(i, w.roomId, w.tenantId, T).length) return g("Snapshot erasure still owns unfinished claim cleanup");
153
+ for (let t of [n, r]) if ((await e.query({
154
+ table: t,
155
+ predicate: y(w.roomId, w.tenantId),
156
+ order: [],
157
+ take: 1,
158
+ skip: void 0,
159
+ projection: ["id"]
160
+ })).length) return g("Snapshot erasure indexes were illegally reintroduced");
161
+ await e.updateMany(t, { snapshotErasure: {
162
+ ...a,
163
+ state: "complete"
164
+ } }, { where: f(p("id", w.roomId), p("tenantId", w.tenantId)) });
165
+ });
166
+ }
167
+ },
168
+ catch: (t) => t instanceof e ? t : new e({ detail: "Snapshot erasure remains unconfirmed" })
169
+ })));
170
+ };
171
+ export { x as eraseRoomSnapshots, b as readRoomSnapshotErasureJournal };
@@ -0,0 +1,104 @@
1
+ import { ROOM_CHECKPOINTS_TABLE as e, ROOM_SNAPSHOT_SEGMENTS_TABLE as t } from "./identities.js";
2
+ import { captureRoomSnapshotBlobReference as n } from "./snapshotBlob.js";
3
+ import { readRoomSnapshotUploadJournal as r } from "./snapshotUploads.js";
4
+ import { readRoomSnapshotErasureJournal as i } from "./snapshotErasure.js";
5
+ import { and as a, eq as o, or as s } from "@voltro/database";
6
+ // src/snapshotInspection.ts
7
+ var c = 67108864, l = 145;
8
+ function u() {
9
+ throw Error("Invalid scoped snapshot observation");
10
+ }
11
+ var d = (e) => {
12
+ let t = e instanceof Date ? e : typeof e == "string" ? new Date(e) : null;
13
+ return t && Number.isFinite(t.getTime()) ? t.toISOString() : u();
14
+ }, f = (e, t, r) => {
15
+ if (!e || typeof e != "object" || Array.isArray(e)) return u();
16
+ let i = e;
17
+ return n(i, {
18
+ roomId: t,
19
+ tenantId: r,
20
+ epoch: i.epoch,
21
+ revision: i.revision
22
+ }, c);
23
+ }, p = (e, t, n, r) => e == null ? [] : !Array.isArray(e) || e.length > t ? u() : Array.from(e, (e) => f(e, n, r)), m = (e) => JSON.stringify([e.refId, e.claim]), h = async (n, h, g) => {
24
+ let _ = new Map(h.map((e) => {
25
+ let t = e.id;
26
+ if (typeof t != "string" || e.tenantId !== g) return u();
27
+ let n = r(e, t, g, c), a = i(e, t, g, c);
28
+ return [t, {
29
+ checkpointUpdatedAt: null,
30
+ currentFullBlobs: 0,
31
+ retainedFullBlobs: 0,
32
+ segmentRows: 0,
33
+ segmentBlobs: 0,
34
+ retiredBlobClaims: 0,
35
+ uploadIntents: n.length,
36
+ uploadsWithReceipt: n.filter((e) => e.reference !== null).length,
37
+ erasurePhase: a?.state ?? "none",
38
+ erasureClaims: a?.references.length ?? 0
39
+ }];
40
+ }));
41
+ if (h.length > 50 || _.size !== h.length) return u();
42
+ if (!h.length) return _;
43
+ let v = a(o("tenantId", g), s(...[..._.keys()].map((e) => o("roomId", e)))), y = await n.query({
44
+ table: e,
45
+ predicate: v,
46
+ order: [],
47
+ take: h.length + 1,
48
+ skip: void 0,
49
+ projection: [
50
+ "roomId",
51
+ "tenantId",
52
+ "updatedAt",
53
+ "blob",
54
+ "blobHistory",
55
+ "retiredBlobs"
56
+ ]
57
+ });
58
+ if (y.length > h.length) return u();
59
+ let b = /* @__PURE__ */ new Set();
60
+ for (let e of y) {
61
+ let t = e.roomId;
62
+ if (typeof t != "string" || e.tenantId !== g || b.has(t)) return u();
63
+ let n = _.get(t);
64
+ if (!n) return u();
65
+ b.add(t);
66
+ let r = e.blob == null ? [] : [f(e.blob, t, g)], i = p(e.blobHistory, 16, t, g), a = p(e.retiredBlobs, 256, t, g), o = [
67
+ ...r,
68
+ ...i,
69
+ ...a
70
+ ];
71
+ if (new Set(o.map(m)).size !== o.length) return u();
72
+ n.checkpointUpdatedAt = d(e.updatedAt), n.currentFullBlobs = r.length, n.retainedFullBlobs = i.length, n.retiredBlobClaims = a.length;
73
+ }
74
+ let x = await n.query({
75
+ table: t,
76
+ predicate: v,
77
+ order: [],
78
+ take: h.length * l + 1,
79
+ skip: void 0,
80
+ projection: [
81
+ "id",
82
+ "roomId",
83
+ "tenantId",
84
+ "epoch",
85
+ "revision",
86
+ "blob"
87
+ ]
88
+ });
89
+ if (x.length > h.length * l) return u();
90
+ let S = /* @__PURE__ */ new Set();
91
+ for (let e of x) {
92
+ let t = e.roomId, n = e.id, r = e.epoch, i = e.revision;
93
+ if (typeof t != "string" || e.tenantId !== g || typeof n != "string" || !n.trim() || n.length > 191 || S.has(n) || !Number.isSafeInteger(r) || Number(r) < 1 || !Number.isSafeInteger(i) || Number(i) < 1) return u();
94
+ let a = _.get(t);
95
+ if (!a || ++a.segmentRows > l) return u();
96
+ if (S.add(n), e.blob != null) {
97
+ let n = f(e.blob, t, g);
98
+ if (n.epoch !== r || n.revision !== i) return u();
99
+ a.segmentBlobs++;
100
+ }
101
+ }
102
+ return _;
103
+ };
104
+ export { h as inspectRoomSnapshots };