@tearleads/client-sdk 0.1.61 → 0.1.62

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 (273) hide show
  1. package/client/containerContents/documentDiscovery.js +5 -5
  2. package/client/containerContents/documentDiscovery.js.map +1 -1
  3. package/client/containerContents/index.d.ts +7 -7
  4. package/client/containerContents/index.js +7 -7
  5. package/client/containerContents/index.js.map +1 -1
  6. package/client/containerContents/types.d.ts +6 -6
  7. package/client/containerContents/types.js.map +1 -1
  8. package/client/deviceFirst/index.js +2 -2
  9. package/client/deviceFirst/index.js.map +1 -1
  10. package/package.json +1 -1
  11. package/stores/container-contents/containerStatePersistence.js +1 -1
  12. package/stores/container-contents/documentRecovery.js +2 -2
  13. package/stores/container-contents/documentRecovery.js.map +1 -1
  14. package/stores/container-contents/documentWork.js.map +1 -1
  15. package/stores/container-contents/localRefresh.js +2 -2
  16. package/stores/container-contents/localRefresh.js.map +1 -1
  17. package/stores/container-contents/operations.js +2 -2
  18. package/stores/container-contents/operations.js.map +1 -1
  19. package/stores/container-contents/remoteContainerIngestion.js +1 -1
  20. package/stores/container-contents/remoteEventSync.js +1 -1
  21. package/stores/container-contents/remoteHydrationRequest.js +1 -1
  22. package/stores/container-contents/setContainerIconOperation.js +2 -2
  23. package/stores/container-contents/setContainerIconOperation.js.map +1 -1
  24. package/stores/container-contents/shareOperations.js +1 -1
  25. package/stores/container-contents/startupHydration.js +1 -1
  26. package/stores/container-contents/syncAgent.d.ts +2 -2
  27. package/stores/container-contents/syncAgentTypes.d.ts +1 -1
  28. package/stores/container-contents/syncLaneIteration.js +2 -2
  29. package/stores/container-contents/syncLaneIteration.js.map +1 -1
  30. package/stores/container-contents/systemContainerIcon.js +1 -1
  31. package/stores/container-contents/systemContainerIcon.js.map +1 -1
  32. package/workflows/container-contents/{documentAttributionRanges.d.ts → attribution/documentAttributionRanges.d.ts} +1 -1
  33. package/workflows/container-contents/{documentCharacterBlame.js → attribution/documentCharacterBlame.js} +3 -3
  34. package/workflows/container-contents/attribution/documentCharacterBlame.js.map +1 -0
  35. package/workflows/container-contents/{documentFieldBlame.js → attribution/documentFieldBlame.js} +4 -4
  36. package/workflows/container-contents/attribution/documentFieldBlame.js.map +1 -0
  37. package/workflows/container-contents/container-state/createIntentSync.js +1 -1
  38. package/workflows/container-contents/container-state/createIntentSync.js.map +1 -1
  39. package/workflows/container-contents/container-state/moveIntentSync.js +1 -1
  40. package/workflows/container-contents/container-state/moveIntentSync.js.map +1 -1
  41. package/workflows/container-contents/container-state/purgeTree.js +2 -2
  42. package/workflows/container-contents/container-state/purgeTree.js.map +1 -1
  43. package/workflows/container-contents/container-state/sharePersistence.js +2 -2
  44. package/workflows/container-contents/container-state/sharePersistence.js.map +1 -1
  45. package/workflows/container-contents/{containerDocumentListing.js → documentDiscovery/containerDocumentListing.js} +1 -1
  46. package/workflows/container-contents/{documentDiscoveryApply.js → documentDiscovery/documentDiscoveryApply.js} +3 -3
  47. package/workflows/container-contents/documentDiscovery/documentDiscoveryApply.js.map +1 -0
  48. package/workflows/container-contents/{documentDiscoveryCandidates.js.map → documentDiscovery/documentDiscoveryCandidates.js.map} +1 -1
  49. package/workflows/container-contents/{documentDiscoveryEvidence.js → documentDiscovery/documentDiscoveryEvidence.js} +1 -1
  50. package/workflows/container-contents/documentDiscovery/documentDiscoveryEvidence.js.map +1 -0
  51. package/workflows/container-contents/{documentDiscoveryInputs.js → documentDiscovery/documentDiscoveryInputs.js} +2 -2
  52. package/workflows/container-contents/documentDiscovery/documentDiscoveryInputs.js.map +1 -0
  53. package/workflows/container-contents/documentDiscovery/documentDiscoveryLanes.js.map +1 -0
  54. package/workflows/container-contents/{documentDiscoveryTypes.d.ts → documentDiscovery/documentDiscoveryTypes.d.ts} +4 -4
  55. package/workflows/container-contents/documentDiscovery/documentDiscoveryTypes.js.map +1 -0
  56. package/workflows/container-contents/{documentDiscovery.d.ts → documentDiscovery/index.d.ts} +1 -1
  57. package/workflows/container-contents/{documentDiscovery.js → documentDiscovery/index.js} +5 -5
  58. package/workflows/container-contents/documentDiscovery/index.js.map +1 -0
  59. package/workflows/container-contents/{availableDocumentLinkIntent.js → documentLinks/availableDocumentLinkIntent.js} +1 -1
  60. package/workflows/container-contents/documentLinks/availableDocumentLinkIntent.js.map +1 -0
  61. package/workflows/container-contents/{deferredDocumentLinks.js → documentLinks/deferredDocumentLinks.js} +1 -1
  62. package/workflows/container-contents/documentLinks/deferredDocumentLinks.js.map +1 -0
  63. package/workflows/container-contents/{documentLinkIntent.js → documentLinks/documentLinkIntent.js} +4 -4
  64. package/workflows/container-contents/documentLinks/documentLinkIntent.js.map +1 -0
  65. package/workflows/container-contents/documentLinks/documentLocalRelink.js.map +1 -0
  66. package/workflows/container-contents/{documentLinks.d.ts → documentLinks/index.d.ts} +5 -5
  67. package/workflows/container-contents/{documentLinks.js → documentLinks/index.js} +10 -10
  68. package/workflows/container-contents/documentLinks/index.js.map +1 -0
  69. package/workflows/container-contents/documentMove/documentMoveDeniedReplay.js.map +1 -0
  70. package/workflows/container-contents/{documentMoveFailure.js → documentMove/documentMoveFailure.js} +1 -1
  71. package/workflows/container-contents/documentMove/documentMoveFailure.js.map +1 -0
  72. package/workflows/container-contents/{documentMoveIntent.js → documentMove/documentMoveIntent.js} +7 -7
  73. package/workflows/container-contents/documentMove/documentMoveIntent.js.map +1 -0
  74. package/workflows/container-contents/{documentMoveIntentErrors.js → documentMove/documentMoveIntentErrors.js} +1 -1
  75. package/workflows/container-contents/documentMove/documentMoveIntentErrors.js.map +1 -0
  76. package/workflows/container-contents/{documentMoveIntentSettlement.js → documentMove/documentMoveIntentSettlement.js} +4 -4
  77. package/workflows/container-contents/documentMove/documentMoveIntentSettlement.js.map +1 -0
  78. package/workflows/container-contents/{documentMoveIntentSync.js → documentMove/documentMoveIntentSync.js} +7 -7
  79. package/workflows/container-contents/documentMove/documentMoveIntentSync.js.map +1 -0
  80. package/workflows/container-contents/{documentMoveVanishedRefresh.js → documentMove/documentMoveVanishedRefresh.js} +3 -3
  81. package/workflows/container-contents/documentMove/documentMoveVanishedRefresh.js.map +1 -0
  82. package/workflows/container-contents/{documentHydrationProbe.js → documentPriming/documentHydrationProbe.js} +4 -4
  83. package/workflows/container-contents/documentPriming/documentHydrationProbe.js.map +1 -0
  84. package/workflows/container-contents/documentPriming/documentRuntimeTargetSync.js.map +1 -0
  85. package/workflows/container-contents/{documentPriming.js → documentPriming/index.js} +5 -5
  86. package/workflows/container-contents/documentPriming/index.js.map +1 -0
  87. package/workflows/container-contents/{documentStructure.d.ts → documentQueries/documentStructure.d.ts} +1 -1
  88. package/workflows/container-contents/{documentStructure.js → documentQueries/documentStructure.js} +4 -4
  89. package/workflows/container-contents/documentQueries/documentStructure.js.map +1 -0
  90. package/workflows/container-contents/{documentStructureTypes.d.ts → documentQueries/documentStructureTypes.d.ts} +4 -4
  91. package/workflows/container-contents/documentQueries/documentStructureTypes.js.map +1 -0
  92. package/workflows/container-contents/{documentSubtreeQueries.js → documentQueries/documentSubtreeQueries.js} +5 -5
  93. package/workflows/container-contents/documentQueries/documentSubtreeQueries.js.map +1 -0
  94. package/workflows/container-contents/{documentQueries.d.ts → documentQueries/index.d.ts} +8 -8
  95. package/workflows/container-contents/{documentQueries.js → documentQueries/index.js} +13 -13
  96. package/workflows/container-contents/documentQueries/index.js.map +1 -0
  97. package/workflows/container-contents/{orphanedDocumentSql.js → documentQueries/orphanedDocumentSql.js} +1 -1
  98. package/workflows/container-contents/documentQueries/orphanedDocumentSql.js.map +1 -0
  99. package/workflows/container-contents/{pendingDownloads.d.ts → documentQueries/pendingDownloads.d.ts} +1 -1
  100. package/workflows/container-contents/{pendingDownloads.js → documentQueries/pendingDownloads.js} +3 -3
  101. package/workflows/container-contents/documentQueries/pendingDownloads.js.map +1 -0
  102. package/workflows/container-contents/documentQueries/sql.js +1 -1
  103. package/workflows/container-contents/documentQueries/sql.js.map +1 -1
  104. package/workflows/container-contents/index.d.ts +13 -13
  105. package/workflows/container-contents/index.js +11 -11
  106. package/workflows/container-contents/index.js.map +1 -1
  107. package/workflows/container-contents/{blobInfo.d.ts → info/blobInfo.d.ts} +1 -1
  108. package/workflows/container-contents/{blobInfo.js → info/blobInfo.js} +4 -4
  109. package/workflows/container-contents/info/blobInfo.js.map +1 -0
  110. package/workflows/container-contents/{blobInfoTypes.d.ts → info/blobInfoTypes.d.ts} +1 -1
  111. package/workflows/container-contents/info/blobInfoTypes.js.map +1 -0
  112. package/workflows/container-contents/{containerInfo.d.ts → info/containerInfo.d.ts} +4 -4
  113. package/workflows/container-contents/{containerInfo.js → info/containerInfo.js} +5 -5
  114. package/workflows/container-contents/info/containerInfo.js.map +1 -0
  115. package/workflows/container-contents/{documentInfo.d.ts → info/documentInfo.d.ts} +3 -3
  116. package/workflows/container-contents/{documentInfo.js → info/documentInfo.js} +11 -11
  117. package/workflows/container-contents/info/documentInfo.js.map +1 -0
  118. package/workflows/container-contents/{documentInfoTypes.d.ts → info/documentInfoTypes.d.ts} +3 -3
  119. package/workflows/container-contents/info/documentInfoTypes.js.map +1 -0
  120. package/workflows/container-contents/{metadata.d.ts → metadata/index.d.ts} +2 -2
  121. package/workflows/container-contents/{metadata.js → metadata/index.js} +5 -5
  122. package/workflows/container-contents/metadata/index.js.map +1 -0
  123. package/workflows/container-contents/{metadataEvents.d.ts → metadata/metadataEvents.d.ts} +1 -1
  124. package/workflows/container-contents/{metadataEvents.js → metadata/metadataEvents.js} +1 -1
  125. package/workflows/container-contents/metadata/metadataEvents.js.map +1 -0
  126. package/workflows/container-contents/{metadataIncomingUpdateIsolation.js → metadata/metadataIncomingUpdateIsolation.js} +5 -5
  127. package/workflows/container-contents/metadata/metadataIncomingUpdateIsolation.js.map +1 -0
  128. package/workflows/container-contents/{metadataMutationPreparation.d.ts → metadata/metadataMutationPreparation.d.ts} +7 -7
  129. package/workflows/container-contents/{metadataMutationPreparation.js → metadata/metadataMutationPreparation.js} +5 -5
  130. package/workflows/container-contents/metadata/metadataMutationPreparation.js.map +1 -0
  131. package/workflows/container-contents/{metadataPersistence.d.ts → metadata/metadataPersistence.d.ts} +2 -2
  132. package/workflows/container-contents/{metadataPersistence.js → metadata/metadataPersistence.js} +4 -4
  133. package/workflows/container-contents/metadata/metadataPersistence.js.map +1 -0
  134. package/workflows/container-contents/{metadataPullContinuationInvalidation.js → metadata/metadataPullContinuationInvalidation.js} +4 -4
  135. package/workflows/container-contents/metadata/metadataPullContinuationInvalidation.js.map +1 -0
  136. package/workflows/container-contents/{metadataReadState.d.ts → metadata/metadataReadState.d.ts} +1 -1
  137. package/workflows/container-contents/metadata/metadataReadState.js.map +1 -0
  138. package/workflows/container-contents/{metadataRecord.js → metadata/metadataRecord.js} +2 -2
  139. package/workflows/container-contents/metadata/metadataRecord.js.map +1 -0
  140. package/workflows/container-contents/{metadataRemoteSync.d.ts → metadata/metadataRemoteSync.d.ts} +5 -5
  141. package/workflows/container-contents/{metadataRemoteSync.js → metadata/metadataRemoteSync.js} +3 -3
  142. package/workflows/container-contents/metadata/metadataRemoteSync.js.map +1 -0
  143. package/workflows/container-contents/{metadataStateInstallation.d.ts → metadata/metadataStateInstallation.d.ts} +1 -1
  144. package/workflows/container-contents/metadata/metadataStateInstallation.js.map +1 -0
  145. package/workflows/container-contents/{metadataStateIsolation.js → metadata/metadataStateIsolation.js} +3 -3
  146. package/workflows/container-contents/metadata/metadataStateIsolation.js.map +1 -0
  147. package/workflows/container-contents/{metadataSyncErrors.js → metadata/metadataSyncErrors.js} +3 -3
  148. package/workflows/container-contents/metadata/metadataSyncErrors.js.map +1 -0
  149. package/workflows/container-contents/{metadataSyncSettlement.d.ts → metadata/metadataSyncSettlement.d.ts} +2 -2
  150. package/workflows/container-contents/{metadataSyncSettlement.js → metadata/metadataSyncSettlement.js} +3 -3
  151. package/workflows/container-contents/metadata/metadataSyncSettlement.js.map +1 -0
  152. package/workflows/container-contents/{metadataTypes.d.ts → metadata/metadataTypes.d.ts} +5 -5
  153. package/workflows/container-contents/metadata/metadataTypes.js.map +1 -0
  154. package/workflows/container-contents/pendingWrites/aggregation.js.map +1 -1
  155. package/workflows/container-contents/pendingWrites/deferredTails.js.map +1 -1
  156. package/workflows/container-contents/{pendingWrites.d.ts → pendingWrites/index.d.ts} +1 -1
  157. package/workflows/container-contents/{pendingWrites.js → pendingWrites/index.js} +12 -12
  158. package/workflows/container-contents/pendingWrites/index.js.map +1 -0
  159. package/workflows/container-contents/projectionGeneration.js.map +1 -1
  160. package/workflows/container-contents/projectionView.js +1 -1
  161. package/workflows/container-contents/projectionView.js.map +1 -1
  162. package/workflows/container-contents/{folderRecovery.d.ts → recovery/folderRecovery.d.ts} +1 -1
  163. package/workflows/container-contents/{folderRecovery.js → recovery/folderRecovery.js} +4 -4
  164. package/workflows/container-contents/recovery/folderRecovery.js.map +1 -0
  165. package/workflows/container-contents/{staleRootRecovery.js → recovery/staleRootRecovery.js} +1 -1
  166. package/workflows/container-contents/recovery/staleRootRecovery.js.map +1 -0
  167. package/workflows/container-contents/remoteHydration/completeHydration.js +1 -1
  168. package/workflows/container-contents/remoteHydration/completeHydration.js.map +1 -1
  169. package/workflows/container-contents/remoteHydration/heldContainerRebind.js +1 -1
  170. package/workflows/container-contents/remoteHydration/heldContainerRebind.js.map +1 -1
  171. package/workflows/container-contents/{remoteHydration.d.ts → remoteHydration/index.d.ts} +2 -2
  172. package/workflows/container-contents/{remoteHydration.js → remoteHydration/index.js} +6 -6
  173. package/workflows/container-contents/remoteHydration/index.js.map +1 -0
  174. package/workflows/container-contents/{remoteContainerPageHydration.js → remoteHydration/remoteContainerPageHydration.js} +8 -8
  175. package/workflows/container-contents/remoteHydration/remoteContainerPageHydration.js.map +1 -0
  176. package/workflows/container-contents/{remoteContainerState.js → remoteHydration/remoteContainerState.js} +11 -11
  177. package/workflows/container-contents/remoteHydration/remoteContainerState.js.map +1 -0
  178. package/workflows/container-contents/remoteHydration/types.d.ts +1 -1
  179. package/workflows/container-contents/{documentPurge.d.ts → tombstones/documentPurge.d.ts} +6 -6
  180. package/workflows/container-contents/{documentPurge.js → tombstones/documentPurge.js} +6 -6
  181. package/workflows/container-contents/tombstones/documentPurge.js.map +1 -0
  182. package/workflows/container-contents/{documentTombstoneEvidence.js → tombstones/documentTombstoneEvidence.js} +9 -9
  183. package/workflows/container-contents/tombstones/documentTombstoneEvidence.js.map +1 -0
  184. package/workflows/container-contents/{documentTombstoneGate.js → tombstones/documentTombstoneGate.js} +1 -1
  185. package/workflows/container-contents/tombstones/documentTombstoneGate.js.map +1 -0
  186. package/workflows/container-contents/availableDocumentLinkIntent.js.map +0 -1
  187. package/workflows/container-contents/blobInfo.js.map +0 -1
  188. package/workflows/container-contents/blobInfoTypes.js.map +0 -1
  189. package/workflows/container-contents/containerInfo.js.map +0 -1
  190. package/workflows/container-contents/deferredDocumentLinks.js.map +0 -1
  191. package/workflows/container-contents/documentCharacterBlame.js.map +0 -1
  192. package/workflows/container-contents/documentDiscovery.js.map +0 -1
  193. package/workflows/container-contents/documentDiscoveryApply.js.map +0 -1
  194. package/workflows/container-contents/documentDiscoveryEvidence.js.map +0 -1
  195. package/workflows/container-contents/documentDiscoveryInputs.js.map +0 -1
  196. package/workflows/container-contents/documentDiscoveryLanes.js.map +0 -1
  197. package/workflows/container-contents/documentDiscoveryTypes.js.map +0 -1
  198. package/workflows/container-contents/documentFieldBlame.js.map +0 -1
  199. package/workflows/container-contents/documentHydrationProbe.js.map +0 -1
  200. package/workflows/container-contents/documentInfo.js.map +0 -1
  201. package/workflows/container-contents/documentInfoTypes.js.map +0 -1
  202. package/workflows/container-contents/documentLinkIntent.js.map +0 -1
  203. package/workflows/container-contents/documentLinks.js.map +0 -1
  204. package/workflows/container-contents/documentLocalRelink.js.map +0 -1
  205. package/workflows/container-contents/documentMoveDeniedReplay.js.map +0 -1
  206. package/workflows/container-contents/documentMoveFailure.js.map +0 -1
  207. package/workflows/container-contents/documentMoveIntent.js.map +0 -1
  208. package/workflows/container-contents/documentMoveIntentErrors.js.map +0 -1
  209. package/workflows/container-contents/documentMoveIntentSettlement.js.map +0 -1
  210. package/workflows/container-contents/documentMoveIntentSync.js.map +0 -1
  211. package/workflows/container-contents/documentMoveVanishedRefresh.js.map +0 -1
  212. package/workflows/container-contents/documentPriming.js.map +0 -1
  213. package/workflows/container-contents/documentPurge.js.map +0 -1
  214. package/workflows/container-contents/documentQueries.js.map +0 -1
  215. package/workflows/container-contents/documentRuntimeTargetSync.js.map +0 -1
  216. package/workflows/container-contents/documentStructure.js.map +0 -1
  217. package/workflows/container-contents/documentStructureTypes.js.map +0 -1
  218. package/workflows/container-contents/documentSubtreeQueries.js.map +0 -1
  219. package/workflows/container-contents/documentTombstoneEvidence.js.map +0 -1
  220. package/workflows/container-contents/documentTombstoneGate.js.map +0 -1
  221. package/workflows/container-contents/folderRecovery.js.map +0 -1
  222. package/workflows/container-contents/metadata.js.map +0 -1
  223. package/workflows/container-contents/metadataEvents.js.map +0 -1
  224. package/workflows/container-contents/metadataIncomingUpdateIsolation.js.map +0 -1
  225. package/workflows/container-contents/metadataMutationPreparation.js.map +0 -1
  226. package/workflows/container-contents/metadataPersistence.js.map +0 -1
  227. package/workflows/container-contents/metadataPullContinuationInvalidation.js.map +0 -1
  228. package/workflows/container-contents/metadataReadState.js.map +0 -1
  229. package/workflows/container-contents/metadataRecord.js.map +0 -1
  230. package/workflows/container-contents/metadataRemoteSync.js.map +0 -1
  231. package/workflows/container-contents/metadataStateInstallation.js.map +0 -1
  232. package/workflows/container-contents/metadataStateIsolation.js.map +0 -1
  233. package/workflows/container-contents/metadataSyncErrors.js.map +0 -1
  234. package/workflows/container-contents/metadataSyncSettlement.js.map +0 -1
  235. package/workflows/container-contents/metadataTypes.js.map +0 -1
  236. package/workflows/container-contents/orphanedDocumentSql.js.map +0 -1
  237. package/workflows/container-contents/pendingDownloads.js.map +0 -1
  238. package/workflows/container-contents/pendingWrites.js.map +0 -1
  239. package/workflows/container-contents/remoteContainerPageHydration.js.map +0 -1
  240. package/workflows/container-contents/remoteContainerState.js.map +0 -1
  241. package/workflows/container-contents/remoteHydration.js.map +0 -1
  242. package/workflows/container-contents/staleRootRecovery.js.map +0 -1
  243. /package/workflows/container-contents/{documentAttributionRanges.js → attribution/documentAttributionRanges.js} +0 -0
  244. /package/workflows/container-contents/{documentAttributionRanges.js.map → attribution/documentAttributionRanges.js.map} +0 -0
  245. /package/workflows/container-contents/{containerDocumentListing.js.map → documentDiscovery/containerDocumentListing.js.map} +0 -0
  246. /package/workflows/container-contents/{documentDiscoveryCandidates.js → documentDiscovery/documentDiscoveryCandidates.js} +0 -0
  247. /package/workflows/container-contents/{documentDiscoveryLanes.js → documentDiscovery/documentDiscoveryLanes.js} +0 -0
  248. /package/workflows/container-contents/{documentDiscoveryTypes.js → documentDiscovery/documentDiscoveryTypes.js} +0 -0
  249. /package/workflows/container-contents/{documentHeadScope.js → documentDiscovery/documentHeadScope.js} +0 -0
  250. /package/workflows/container-contents/{documentHeadScope.js.map → documentDiscovery/documentHeadScope.js.map} +0 -0
  251. /package/workflows/container-contents/{documentLocalRelink.js → documentLinks/documentLocalRelink.js} +0 -0
  252. /package/workflows/container-contents/{documentMoveDeniedReplay.js → documentMove/documentMoveDeniedReplay.js} +0 -0
  253. /package/workflows/container-contents/{documentMoveUnlinkIds.js → documentMove/documentMoveUnlinkIds.js} +0 -0
  254. /package/workflows/container-contents/{documentMoveUnlinkIds.js.map → documentMove/documentMoveUnlinkIds.js.map} +0 -0
  255. /package/workflows/container-contents/{documentRuntimeTargetSync.js → documentPriming/documentRuntimeTargetSync.js} +0 -0
  256. /package/workflows/container-contents/{documentStructureTypes.js → documentQueries/documentStructureTypes.js} +0 -0
  257. /package/workflows/container-contents/{blobInfoRows.js → info/blobInfoRows.js} +0 -0
  258. /package/workflows/container-contents/{blobInfoRows.js.map → info/blobInfoRows.js.map} +0 -0
  259. /package/workflows/container-contents/{blobInfoTypes.js → info/blobInfoTypes.js} +0 -0
  260. /package/workflows/container-contents/{documentInfoTypes.js → info/documentInfoTypes.js} +0 -0
  261. /package/workflows/container-contents/{metadataReadState.js → metadata/metadataReadState.js} +0 -0
  262. /package/workflows/container-contents/{metadataStateInstallation.js → metadata/metadataStateInstallation.js} +0 -0
  263. /package/workflows/container-contents/{metadataSyncFollowup.js → metadata/metadataSyncFollowup.js} +0 -0
  264. /package/workflows/container-contents/{metadataSyncFollowup.js.map → metadata/metadataSyncFollowup.js.map} +0 -0
  265. /package/workflows/container-contents/{metadataSyncRegistrations.d.ts → metadata/metadataSyncRegistrations.d.ts} +0 -0
  266. /package/workflows/container-contents/{metadataSyncRegistrations.js → metadata/metadataSyncRegistrations.js} +0 -0
  267. /package/workflows/container-contents/{metadataSyncRegistrations.js.map → metadata/metadataSyncRegistrations.js.map} +0 -0
  268. /package/workflows/container-contents/{metadataTypes.js → metadata/metadataTypes.js} +0 -0
  269. /package/workflows/container-contents/{pendingWritesTypes.d.ts → pendingWrites/pendingWritesTypes.d.ts} +0 -0
  270. /package/workflows/container-contents/{pendingWritesTypes.js → pendingWrites/pendingWritesTypes.js} +0 -0
  271. /package/workflows/container-contents/{pendingWritesTypes.js.map → pendingWrites/pendingWritesTypes.js.map} +0 -0
  272. /package/workflows/container-contents/{remoteHydrationLog.js → remoteHydration/remoteHydrationLog.js} +0 -0
  273. /package/workflows/container-contents/{remoteHydrationLog.js.map → remoteHydration/remoteHydrationLog.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataMutationPreparation.js","sourceRoot":"","sources":["metadataMutationPreparation.ts"],"names":[],"mappings":"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","sourcesContent":["import { base64ToBytes } from \"@tearleads/encoding\";\nimport {\n encodeVersionVector,\n exportUpdatesSince,\n importUpdates,\n} from \"@tearleads/loro\";\nimport {\n getDefaultContainerName,\n readContainerMetadataValue,\n writeContainerMetadataValue,\n} from \"../../data/containers/containerMetadataDocument\";\nimport { documentSyncPullContinuationsEqual } from \"../../data/documents/shared/syncPagination\";\nimport { canWriteEffectiveAccessLevel } from \"../../data/keying/accessLevel\";\nimport type { ContainerContentsPersistence } from \"../../data/persistence/container-contents/containerContentsPersistence\";\nimport type { ExecSql } from \"../../data/sqlite/sqlSchema\";\nimport type { ContainerDocumentRecord as DocumentRecord } from \"./containerPersistence\";\nimport {\n type ExpectedContainerMetadataSyncState,\n metadataSyncSecurityContextMatches,\n replaceSupersededMetadataIdentity,\n sameNullableMetadataValue,\n} from \"./metadataSyncSettlement\";\nimport type {\n ContainerMetadataPatch,\n ContainerMetadataState,\n} from \"./metadataTypes\";\n\nexport interface PersistContainerMetadataStateInput {\n acceptedPendingUpdateIds?: readonly string[] | undefined;\n clearSyncFailure?: boolean | undefined;\n execSql: ExecSql;\n expectedSyncState?: ExpectedContainerMetadataSyncState | undefined;\n localMetadataPatch?:\n | Partial<Pick<ContainerMetadataPatch, \"icon\" | \"name\">>\n | undefined;\n localUpdate?: Uint8Array | undefined;\n metadataState: ContainerMetadataState;\n createIntentSettlement?: Parameters<\n ContainerContentsPersistence[\"commitMetadataMutation\"]\n >[1][\"createIntentSettlement\"];\n moveIntentSettlement?: Parameters<\n ContainerContentsPersistence[\"commitMetadataMutation\"]\n >[1][\"moveIntentSettlement\"];\n patch?: Partial<ContainerMetadataPatch> | undefined;\n persistence: ContainerContentsPersistence;\n preserveDurableStructureWhenPending?: boolean | undefined;\n saveOptions?:\n | Parameters<ContainerContentsPersistence[\"saveContainer\"]>[3]\n | undefined;\n stillCurrent?: (() => boolean) | undefined;\n}\n\nexport function currentMetadataPullContinuation(\n metadataState: ContainerMetadataState,\n) {\n return Object.hasOwn(metadataState, \"pullContinuation\")\n ? (metadataState.pullContinuation ?? null)\n : (metadataState.record.pullContinuation ?? null);\n}\n\nexport function resolveMetadataSecurityContext(\n metadataState: ContainerMetadataState,\n patch: Partial<ContainerMetadataPatch>,\n) {\n const currentDocumentId = metadataState.record.documentId ?? null;\n const documentId =\n patch.documentId !== undefined ? patch.documentId : currentDocumentId;\n const accessEpoch = patch.accessEpoch ?? metadataState.record.accessEpoch;\n const documentIdChanged = documentId !== currentDocumentId;\n\n return {\n accessEpoch,\n changed:\n documentIdChanged || accessEpoch !== metadataState.record.accessEpoch,\n documentId,\n documentIdChanged,\n };\n}\n\nfunction mergeDurableMetadataCheckpoint(input: {\n durableRecord: DocumentRecord | null;\n metadataState: ContainerMetadataState;\n securityContext: ReturnType<typeof resolveMetadataSecurityContext>;\n}): void {\n const { durableRecord, metadataState, securityContext } = input;\n if (\n !durableRecord?.metadataUpdates ||\n durableRecord.documentId !== metadataState.record.documentId ||\n durableRecord.documentId !== securityContext.documentId ||\n durableRecord.accessEpoch !== metadataState.record.accessEpoch ||\n durableRecord.accessEpoch !== securityContext.accessEpoch\n ) {\n return;\n }\n\n importUpdates(metadataState.doc, [\n base64ToBytes(durableRecord.metadataUpdates),\n ]);\n}\n\nexport async function loadAuthoritativeContainerMetadataState(input: {\n containerId: string;\n execSql: ExecSql;\n persistence: ContainerContentsPersistence;\n}) {\n const stored = await input.persistence.loadContainerMetadataState(\n input.execSql,\n input.containerId,\n );\n return stored?.record\n ? { container: stored.container, record: stored.record }\n : null;\n}\n\nfunction localMetadataWriteAccessWasRevoked(input: {\n authoritativeState: NonNullable<\n Awaited<ReturnType<typeof loadAuthoritativeContainerMetadataState>>\n >;\n mutationInput: PersistContainerMetadataStateInput;\n}): boolean {\n return (\n input.mutationInput.expectedSyncState === undefined &&\n input.mutationInput.localUpdate !== undefined &&\n canWriteEffectiveAccessLevel(\n input.mutationInput.metadataState.container.effectiveAccessLevel,\n ) &&\n !canWriteEffectiveAccessLevel(\n input.authoritativeState.container.effectiveAccessLevel,\n )\n );\n}\n\nasync function prepareRebasedLocalMetadataMutation(input: {\n authoritativeState: NonNullable<\n Awaited<ReturnType<typeof loadAuthoritativeContainerMetadataState>>\n >;\n metadataState: ContainerMetadataState;\n localMetadataPatch:\n | Partial<Pick<ContainerMetadataPatch, \"icon\" | \"name\">>\n | undefined;\n patch: Partial<ContainerMetadataPatch>;\n}) {\n const { authoritativeState, metadataState, patch } = input;\n const replacementVersion = encodeVersionVector(metadataState.doc);\n const replacementMetadata = readContainerMetadataValue(\n metadataState.doc,\n getDefaultContainerName(authoritativeState.container.parentId),\n );\n writeContainerMetadataValue(metadataState.doc, {\n ...replacementMetadata,\n ...input.localMetadataPatch,\n });\n const rebasedMetadataState = {\n ...metadataState,\n container: authoritativeState.container,\n pullContinuation: authoritativeState.record.pullContinuation ?? null,\n record: authoritativeState.record,\n };\n return {\n durableRecord: authoritativeState.record,\n mutationContainer: authoritativeState.container,\n mutationMetadataState: rebasedMetadataState,\n mutationPatch: patch,\n pendingLocalUpdate: exportUpdatesSince(\n metadataState.doc,\n replacementVersion,\n ),\n pullContinuationSuperseded: false,\n securityContext: resolveMetadataSecurityContext(\n rebasedMetadataState,\n patch,\n ),\n securityContextMatches: true,\n };\n}\n\nfunction resolveMetadataSettlementMatch(\n expectedSyncState: ExpectedContainerMetadataSyncState | undefined,\n durableRecord: DocumentRecord | null,\n) {\n if (!expectedSyncState) {\n return {\n contentStateSuperseded: false,\n pullContinuationSuperseded: false,\n securityContextMatches: true,\n };\n }\n const securityContextMatches = metadataSyncSecurityContextMatches(\n durableRecord,\n expectedSyncState.record,\n );\n const progressStateMatches =\n securityContextMatches &&\n sameNullableMetadataValue(\n durableRecord?.lastCommitLsn,\n expectedSyncState.record.lastCommitLsn,\n ) &&\n Boolean(durableRecord?.pullContinuationRecoveryRequired) ===\n Boolean(expectedSyncState.record.pullContinuationRecoveryRequired) &&\n documentSyncPullContinuationsEqual(\n durableRecord?.pullContinuation,\n expectedSyncState.pullContinuation,\n );\n const contentStateMatches =\n progressStateMatches &&\n sameNullableMetadataValue(\n durableRecord?.metadataUpdates,\n expectedSyncState.record.metadataUpdates,\n ) &&\n sameNullableMetadataValue(\n durableRecord?.snapshotEndVersion,\n expectedSyncState.record.snapshotEndVersion,\n );\n return {\n contentStateSuperseded: progressStateMatches && !contentStateMatches,\n pullContinuationSuperseded: !progressStateMatches,\n securityContextMatches,\n };\n}\n\nexport async function prepareContainerMetadataMutation(\n input: PersistContainerMetadataStateInput,\n execSql: ExecSql,\n patch: Partial<ContainerMetadataPatch>,\n) {\n const { metadataState, persistence } = input;\n const authoritativeState = await loadAuthoritativeContainerMetadataState({\n containerId: metadataState.container.id,\n execSql,\n persistence,\n });\n if (!authoritativeState) {\n return {\n authoritativeState: null,\n pullContinuationSuperseded: true,\n securityContextMatches: false,\n };\n }\n if (\n localMetadataWriteAccessWasRevoked({\n authoritativeState,\n mutationInput: input,\n })\n ) {\n await replaceSupersededMetadataIdentity({\n durableRecord: authoritativeState.record,\n metadataState,\n });\n return {\n authoritativeState,\n pullContinuationSuperseded: true,\n securityContextMatches: false,\n };\n }\n const durableRecord = authoritativeState.record;\n const mutationMetadataState = durableRecord\n ? {\n ...metadataState,\n pullContinuation: durableRecord.pullContinuation ?? null,\n record: durableRecord,\n }\n : metadataState;\n const capturedSecurityContextMatches =\n durableRecord !== null &&\n metadataSyncSecurityContextMatches(durableRecord, metadataState.record);\n const {\n contentStateSuperseded,\n pullContinuationSuperseded,\n securityContextMatches,\n } = resolveMetadataSettlementMatch(input.expectedSyncState, durableRecord);\n\n if (\n input.expectedSyncState === undefined &&\n !capturedSecurityContextMatches\n ) {\n await replaceSupersededMetadataIdentity({\n durableRecord: authoritativeState.record,\n metadataState,\n });\n if (input.localUpdate === undefined) {\n return {\n authoritativeState,\n pullContinuationSuperseded: true,\n securityContextMatches: false,\n };\n }\n return prepareRebasedLocalMetadataMutation({\n authoritativeState,\n localMetadataPatch: input.localMetadataPatch,\n metadataState,\n patch,\n });\n }\n const mutationPatch = pullContinuationSuperseded ? {} : patch;\n const securityContext = resolveMetadataSecurityContext(\n mutationMetadataState,\n mutationPatch,\n );\n if (\n securityContextMatches &&\n (input.expectedSyncState === undefined || contentStateSuperseded)\n ) {\n mergeDurableMetadataCheckpoint({\n durableRecord,\n metadataState,\n securityContext,\n });\n }\n return {\n durableRecord,\n mutationContainer: authoritativeState.container,\n mutationMetadataState,\n mutationPatch,\n pendingLocalUpdate: input.localUpdate,\n pullContinuationSuperseded,\n securityContext,\n securityContextMatches,\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataPersistence.js","sourceRoot":"","sources":["metadataPersistence.ts"],"names":[],"mappings":"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","sourcesContent":["import { encodeVersionVector, exportUpdatesSince } from \"@tearleads/loro\";\nimport {\n getDefaultContainerName,\n readContainerMetadataValue,\n writeContainerMetadataValue,\n} from \"../../data/containers/containerMetadataDocument\";\nimport { createPendingUpdateFields } from \"../../data/documents/documentSync\";\nimport type { ContainerContentsPersistence } from \"../../data/persistence/container-contents/containerContentsPersistence\";\nimport type { ContainerRecord } from \"../../data/persistence/containers/containerPersistence\";\nimport {\n type ExecSql,\n runSerializedSqlMutation,\n} from \"../../data/sqlite/sqlSchema\";\nimport type { ContainerDocumentRecord as DocumentRecord } from \"./containerPersistence\";\nimport {\n currentMetadataPullContinuation,\n loadAuthoritativeContainerMetadataState,\n type PersistContainerMetadataStateInput,\n prepareContainerMetadataMutation,\n} from \"./metadataMutationPreparation\";\nimport {\n buildContainerMetadataRecord,\n resolveContainerSystemSlot,\n resolveMetadataDocumentId,\n} from \"./metadataRecord\";\nimport { installContainerMetadataRecord } from \"./metadataStateInstallation\";\nimport {\n type ExpectedContainerMetadataSyncState,\n metadataSyncSecurityContextMatches,\n replaceSupersededMetadataIdentity,\n} from \"./metadataSyncSettlement\";\nimport type {\n ContainerMetadataPatch,\n ContainerMetadataState,\n PersistedContainerMetadataState,\n} from \"./metadataTypes\";\nimport type { ContainerContentsWorkflowSqlRuntime } from \"./runtime\";\n\ntype ContainerMetadataPersistenceRuntime = ContainerContentsWorkflowSqlRuntime;\nconst MAX_METADATA_MUTATION_COMMIT_ATTEMPTS = 8;\ntype SaveContainerOptions = Parameters<\n ContainerContentsPersistence[\"saveContainer\"]\n>[3];\n\nexport { hasCurrentContainerMetadataReadState } from \"./metadataReadState\";\nexport { installContainerMetadataRecord } from \"./metadataStateInstallation\";\nexport { currentMetadataPullContinuation };\n\nfunction invalidateMetadataWriterProjection(\n metadataState: ContainerMetadataState,\n securityContextChanged: boolean,\n): void {\n if (securityContextChanged) {\n metadataState.metadataWriterProjection = null;\n }\n}\ntype PreparedContainerMetadataMutation = Awaited<\n ReturnType<typeof prepareContainerMetadataMutation>\n>;\ntype ApplicableContainerMetadataMutation = Exclude<\n PreparedContainerMetadataMutation,\n { authoritativeState: unknown }\n>;\nasync function settleSupersededMetadataMutation(input: {\n acceptedPendingUpdateIds?: readonly string[] | undefined;\n execSql: ExecSql;\n expectedRecord?: DocumentRecord | undefined;\n metadataState: ContainerMetadataState;\n persistence: ContainerContentsPersistence;\n prepared: PreparedContainerMetadataMutation;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<PersistedContainerMetadataState | null> {\n const { metadataState, persistence, prepared } = input;\n const settledState = input.expectedRecord\n ? await persistence.settleAcceptedMetadataPendingUpdates(input.execSql, {\n containerId: metadataState.container.id,\n expectedRecord: input.expectedRecord,\n pendingUpdateIds: input.acceptedPendingUpdateIds ?? [],\n stillCurrent: input.stillCurrent,\n })\n : undefined;\n if (\"authoritativeState\" in prepared) {\n const authoritativeState = settledState ?? prepared.authoritativeState;\n if (!authoritativeState?.record) return null;\n metadataState.container = authoritativeState.container;\n installContainerMetadataRecord(metadataState, authoritativeState.record);\n return {\n container: authoritativeState.container,\n pullContinuationSuperseded: true,\n record: authoritativeState.record,\n syncIdentitySuperseded: true,\n };\n }\n const authoritativeState =\n settledState ??\n (await loadAuthoritativeContainerMetadataState({\n containerId: metadataState.container.id,\n execSql: input.execSql,\n persistence,\n }));\n if (!authoritativeState?.record) return null;\n // The rejected response may already have mutated the live Loro document.\n // Rebuild from the authoritative durable snapshot instead of merging into\n // that losing document, which would retain non-overlapping rejected fields.\n await replaceSupersededMetadataIdentity({\n durableRecord: authoritativeState.record,\n metadataState,\n });\n metadataState.container = authoritativeState.container;\n installContainerMetadataRecord(metadataState, authoritativeState.record);\n return {\n container: authoritativeState.container,\n pullContinuationSuperseded: true,\n record: authoritativeState.record,\n ...(!prepared.securityContextMatches\n ? { syncIdentitySuperseded: true as const }\n : {}),\n };\n}\nasync function persistPreparedMetadataMutation(input: {\n clearSyncFailure?: boolean | undefined;\n createIntentSettlement?: Parameters<\n ContainerContentsPersistence[\"commitMetadataMutation\"]\n >[1][\"createIntentSettlement\"];\n execSql: ExecSql;\n metadataState: ContainerMetadataState;\n moveIntentSettlement?: Parameters<\n ContainerContentsPersistence[\"commitMetadataMutation\"]\n >[1][\"moveIntentSettlement\"];\n persistence: ContainerContentsPersistence;\n prepared: ApplicableContainerMetadataMutation;\n acceptedPendingUpdateIds?: readonly string[] | undefined;\n preserveDurableStructureWhenPending?: boolean | undefined;\n saveOptions?: SaveContainerOptions;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<\n | PersistedContainerMetadataState\n | {\n conflict: true;\n currentState: Awaited<\n ReturnType<ContainerContentsPersistence[\"loadContainerMetadataState\"]>\n >;\n staleServerState?: true;\n }\n> {\n const { metadataState, persistence, prepared } = input;\n const metadata = readContainerMetadataValue(\n metadataState.doc,\n getDefaultContainerName(prepared.mutationContainer.parentId),\n );\n const nextContainer: ContainerRecord = {\n ...prepared.mutationContainer,\n ...(prepared.mutationPatch.effectiveAccessLevel !== undefined\n ? {\n effectiveAccessLevel: prepared.mutationPatch.effectiveAccessLevel,\n }\n : {}),\n organizationId:\n prepared.mutationPatch.organizationId ??\n prepared.mutationContainer.organizationId,\n parentId:\n prepared.mutationPatch.parentId ?? prepared.mutationContainer.parentId,\n metadataDocumentId: resolveMetadataDocumentId(\n prepared.mutationPatch,\n prepared.mutationContainer,\n ),\n systemSlot: resolveContainerSystemSlot(\n prepared.mutationPatch,\n prepared.mutationContainer,\n ),\n name: prepared.mutationPatch.name ?? metadata.name,\n icon:\n prepared.mutationPatch.icon !== undefined\n ? prepared.mutationPatch.icon\n : metadata.icon,\n };\n const nextRecord = buildContainerMetadataRecord({\n metadataState: prepared.mutationMetadataState,\n patch: prepared.mutationPatch,\n securityContext: prepared.securityContext,\n });\n const pendingUpdate = prepared.pendingLocalUpdate\n ? (createPendingUpdateFields(prepared.pendingLocalUpdate) ?? undefined)\n : undefined;\n const committed = await persistence.commitMetadataMutation(input.execSql, {\n acceptedPendingUpdateIds: input.acceptedPendingUpdateIds ?? [],\n clearSyncFailure: input.clearSyncFailure,\n container: nextContainer,\n createIntentSettlement: input.createIntentSettlement,\n expectedContainer: prepared.mutationContainer,\n expectedRecord: prepared.durableRecord,\n moveIntentSettlement: input.moveIntentSettlement,\n pendingUpdate,\n preserveDurableStructureWhenPending:\n input.preserveDurableStructureWhenPending,\n record: nextRecord,\n saveOptions: input.saveOptions,\n settleAcceptedPendingOnConflict:\n input.acceptedPendingUpdateIds !== undefined,\n stillCurrent: input.stillCurrent,\n });\n if (!committed.committed) {\n return {\n conflict: true,\n currentState: committed.currentState,\n ...(committed.staleServerState\n ? { staleServerState: true as const }\n : {}),\n };\n }\n invalidateMetadataWriterProjection(\n metadataState,\n prepared.securityContext.changed,\n );\n return {\n container: committed.container,\n record: nextRecord,\n ...(committed.createIntentSettled\n ? { createIntentSettled: true as const }\n : {}),\n ...(committed.moveIntentSettled\n ? { moveIntentSettled: true as const }\n : {}),\n };\n}\nasync function adoptMetadataCommitConflict(input: {\n currentState: Awaited<\n ReturnType<ContainerContentsPersistence[\"loadContainerMetadataState\"]>\n >;\n expectedRecord: DocumentRecord;\n expectedSyncState?: ExpectedContainerMetadataSyncState | undefined;\n metadataState: ContainerMetadataState;\n staleServerState?: true | undefined;\n}): Promise<PersistedContainerMetadataState | null | \"retry\"> {\n if (!input.staleServerState && input.expectedSyncState === undefined) {\n return \"retry\";\n }\n if (!input.currentState?.record) return null;\n await replaceSupersededMetadataIdentity({\n durableRecord: input.currentState.record,\n metadataState: input.metadataState,\n });\n input.metadataState.container = input.currentState.container;\n installContainerMetadataRecord(\n input.metadataState,\n input.currentState.record,\n );\n return {\n container: input.currentState.container,\n pullContinuationSuperseded: true,\n record: input.currentState.record,\n ...(input.staleServerState ? { mutationSuperseded: true as const } : {}),\n ...(!metadataSyncSecurityContextMatches(\n input.currentState.record,\n input.expectedSyncState?.record ?? input.expectedRecord,\n )\n ? { syncIdentitySuperseded: true as const }\n : {}),\n };\n}\nasync function persistContainerMetadataState(\n input: PersistContainerMetadataStateInput,\n): Promise<PersistedContainerMetadataState | null> {\n const patch = input.patch ?? {};\n const prepareMutation = prepareContainerMetadataMutation;\n return runSerializedSqlMutation(input.execSql, async (lockedExecSql) => {\n for (\n let attempt = 0;\n attempt < MAX_METADATA_MUTATION_COMMIT_ATTEMPTS;\n attempt += 1\n ) {\n const prepared = await prepareMutation(input, lockedExecSql, patch);\n if (input.stillCurrent?.() === false) return null;\n if (\n \"authoritativeState\" in prepared ||\n prepared.pullContinuationSuperseded\n ) {\n return settleSupersededMetadataMutation({\n acceptedPendingUpdateIds: input.acceptedPendingUpdateIds,\n execSql: lockedExecSql,\n expectedRecord: input.expectedSyncState?.record,\n metadataState: input.metadataState,\n persistence: input.persistence,\n prepared,\n stillCurrent: input.stillCurrent,\n });\n }\n const persisted = await persistPreparedMetadataMutation({\n acceptedPendingUpdateIds: input.acceptedPendingUpdateIds,\n clearSyncFailure: input.clearSyncFailure,\n createIntentSettlement: input.createIntentSettlement,\n execSql: lockedExecSql,\n metadataState: input.metadataState,\n moveIntentSettlement: input.moveIntentSettlement,\n persistence: input.persistence,\n prepared,\n preserveDurableStructureWhenPending:\n input.preserveDurableStructureWhenPending,\n saveOptions: input.saveOptions,\n stillCurrent: input.stillCurrent,\n });\n if (input.stillCurrent?.() === false) return null;\n if (!(\"conflict\" in persisted)) return persisted;\n const conflict = await adoptMetadataCommitConflict({\n currentState: persisted.currentState,\n expectedRecord: prepared.durableRecord,\n expectedSyncState: input.expectedSyncState,\n metadataState: input.metadataState,\n staleServerState: persisted.staleServerState,\n });\n if (conflict !== \"retry\") return conflict;\n }\n throw new Error(\n `Container metadata mutation commit gave up after ${MAX_METADATA_MUTATION_COMMIT_ATTEMPTS} concurrent conflicts`,\n );\n });\n}\ntype PersistContainerMetadataStateRuntimeInput = Omit<\n PersistContainerMetadataStateInput,\n \"execSql\"\n> & {\n onDurableStateNeedsReload?: (() => void) | undefined;\n persistence: ContainerContentsPersistence;\n runtime: ContainerMetadataPersistenceRuntime;\n};\n\nexport function persistContainerMetadataStateFromRuntime(\n input: PersistContainerMetadataStateRuntimeInput & {\n expectedSyncState: ExpectedContainerMetadataSyncState;\n },\n): Promise<PersistedContainerMetadataState | null>;\nexport function persistContainerMetadataStateFromRuntime(\n input: PersistContainerMetadataStateRuntimeInput & {\n expectedSyncState?: undefined;\n },\n): Promise<PersistedContainerMetadataState | null>;\nexport async function persistContainerMetadataStateFromRuntime(\n input: PersistContainerMetadataStateRuntimeInput,\n): Promise<PersistedContainerMetadataState | null> {\n const { onDurableStateNeedsReload, runtime, ...persistenceInput } = input;\n const execSql = runtime.infra.execSql;\n const persisted = await persistContainerMetadataState({\n ...persistenceInput,\n execSql,\n });\n if (input.stillCurrent?.() === false) {\n onDurableStateNeedsReload?.();\n return null;\n }\n return persisted;\n}\n\nasync function writeContainerMetadataPatch(input: {\n execSql: ExecSql;\n metadataState: ContainerMetadataState;\n patch: Partial<Pick<ContainerMetadataPatch, \"icon\" | \"name\">>;\n persistence: ContainerContentsPersistence;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<PersistedContainerMetadataState | null> {\n const { execSql, metadataState, patch, persistence } = input;\n const metadata = readContainerMetadataValue(\n metadataState.doc,\n getDefaultContainerName(metadataState.container.parentId),\n );\n const previousVersion = encodeVersionVector(metadataState.doc);\n writeContainerMetadataValue(metadataState.doc, { ...metadata, ...patch });\n const update = exportUpdatesSince(metadataState.doc, previousVersion);\n\n return persistContainerMetadataState({\n execSql,\n localMetadataPatch: patch,\n localUpdate: update,\n metadataState,\n patch,\n persistence,\n stillCurrent: input.stillCurrent,\n });\n}\n\nexport async function renameContainerMetadataStateFromRuntime(input: {\n metadataState: ContainerMetadataState;\n name: string;\n persistence: ContainerContentsPersistence;\n runtime: ContainerMetadataPersistenceRuntime;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<PersistedContainerMetadataState | null> {\n const trimmedName = input.name.trim();\n if (!trimmedName) {\n return null;\n }\n\n return writeContainerMetadataPatch({\n execSql: input.runtime.infra.execSql,\n metadataState: input.metadataState,\n patch: { name: trimmedName },\n persistence: input.persistence,\n stillCurrent: input.stillCurrent,\n });\n}\n\nexport async function setContainerIconMetadataStateFromRuntime(input: {\n icon: string | null;\n metadataState: ContainerMetadataState;\n persistence: ContainerContentsPersistence;\n runtime: ContainerMetadataPersistenceRuntime;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<PersistedContainerMetadataState | null> {\n return writeContainerMetadataPatch({\n execSql: input.runtime.infra.execSql,\n metadataState: input.metadataState,\n patch: { icon: input.icon?.trim() || null },\n persistence: input.persistence,\n stillCurrent: input.stillCurrent,\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataPullContinuationInvalidation.js","sourceRoot":"","sources":["metadataPullContinuationInvalidation.ts"],"names":[],"mappings":"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","sourcesContent":["import { base64ToBytes } from \"@tearleads/encoding\";\nimport { importUpdates } from \"@tearleads/loro\";\nimport {\n type DocumentSyncPullContinuation,\n documentSyncPullContinuationsEqual,\n} from \"../../data/documents/shared/syncPagination\";\nimport type { ContainerContentsPersistence } from \"../../data/persistence/container-contents/containerContentsPersistence\";\nimport { runSerializedSqlMutation } from \"../../data/sqlite/sqlSchema\";\nimport { currentMetadataPullContinuation } from \"./metadataPersistence\";\nimport type { ContainerMetadataState } from \"./metadataTypes\";\nimport type { ContainerContentsWorkflowSqlRuntime } from \"./runtime\";\n\nfunction metadataInvalidationStateMatches(input: {\n accessEpoch: number;\n continuation: DocumentSyncPullContinuation;\n documentId: string;\n durableRecord: NonNullable<\n Awaited<\n ReturnType<ContainerContentsPersistence[\"loadContainerMetadataRecord\"]>\n >\n >;\n metadataState: ContainerMetadataState;\n}): boolean {\n const {\n accessEpoch,\n continuation,\n documentId,\n durableRecord,\n metadataState,\n } = input;\n return (\n metadataState.record.documentId === documentId &&\n metadataState.record.accessEpoch === accessEpoch &&\n durableRecord.documentId === documentId &&\n durableRecord.accessEpoch === accessEpoch &&\n (durableRecord.accessStateHash ?? null) ===\n (metadataState.record.accessStateHash ?? null) &&\n (durableRecord.contentKeyBundle ?? null) ===\n (metadataState.record.contentKeyBundle ?? null) &&\n (durableRecord.documentKekTargets ?? null) ===\n (metadataState.record.documentKekTargets ?? null) &&\n (durableRecord.documentManifestBundle ?? null) ===\n (metadataState.record.documentManifestBundle ?? null) &&\n documentSyncPullContinuationsEqual(\n currentMetadataPullContinuation(metadataState),\n continuation,\n )\n );\n}\n\nexport async function invalidateContainerMetadataPullContinuation(input: {\n continuation: DocumentSyncPullContinuation;\n isCurrent?: (() => boolean) | undefined;\n metadataState: ContainerMetadataState;\n persistence: ContainerContentsPersistence;\n runtime: ContainerContentsWorkflowSqlRuntime;\n}): Promise<void> {\n const { continuation, metadataState, runtime } = input;\n if (input.isCurrent?.() === false) return;\n const { accessEpoch, documentId } = metadataState.record;\n if (!documentId) return;\n\n await runSerializedSqlMutation(\n runtime.infra.execSql,\n async (lockedExecSql) => {\n if (input.isCurrent?.() === false) return;\n const durableRecord =\n await input.persistence.invalidateMetadataPullContinuation(\n lockedExecSql,\n {\n accessEpoch,\n accessStateHash: metadataState.record.accessStateHash ?? null,\n continuation,\n containerId: metadataState.container.id,\n contentKeyBundle: metadataState.record.contentKeyBundle ?? null,\n documentId,\n documentKekTargets: metadataState.record.documentKekTargets ?? null,\n documentManifestBundle:\n metadataState.record.documentManifestBundle ?? null,\n lastCommitLsn: metadataState.record.lastCommitLsn ?? null,\n stillCurrent: input.isCurrent,\n },\n );\n if (\n input.isCurrent?.() === false ||\n !durableRecord ||\n !metadataInvalidationStateMatches({\n accessEpoch,\n continuation,\n documentId,\n durableRecord,\n metadataState,\n })\n ) {\n return;\n }\n if (durableRecord.metadataUpdates) {\n importUpdates(metadataState.doc, [\n base64ToBytes(durableRecord.metadataUpdates),\n ]);\n }\n const {\n pullContinuation: _stalePullContinuation,\n pullContinuationRecoveryRequired: _staleRecoveryMarker,\n ...liveRecord\n } = metadataState.record;\n metadataState.record = { ...liveRecord, ...durableRecord };\n metadataState.pullContinuation = durableRecord.pullContinuation ?? null;\n },\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataReadState.js","sourceRoot":"","sources":["metadataReadState.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oCAAoC,CAClD,MAMC;IAED,OAAO,CACL,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ;QACxC,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QAC/B,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ;QAC3C,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;QAClC,OAAO,MAAM,CAAC,kBAAkB,KAAK,QAAQ;QAC7C,MAAM,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;QACpC,OAAO,MAAM,CAAC,sBAAsB,KAAK,QAAQ;QACjD,MAAM,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,CACzC,CAAC;AACJ,CAAC","sourcesContent":["import type { ContainerDocumentRecord as DocumentRecord } from \"./containerPersistence\";\n\nexport function hasCurrentContainerMetadataReadState(\n record: Pick<\n DocumentRecord,\n | \"contentKeyBundle\"\n | \"documentKekTargets\"\n | \"documentManifestBundle\"\n | \"lastCommitLsn\"\n >,\n): boolean {\n return (\n typeof record.lastCommitLsn === \"string\" &&\n record.lastCommitLsn.length > 0 &&\n typeof record.contentKeyBundle === \"string\" &&\n record.contentKeyBundle.length > 0 &&\n typeof record.documentKekTargets === \"string\" &&\n record.documentKekTargets.length > 0 &&\n typeof record.documentManifestBundle === \"string\" &&\n record.documentManifestBundle.length > 0\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataRecord.js","sourceRoot":"","sources":["metadataRecord.ts"],"names":[],"mappings":"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","sourcesContent":["import { bytesToBase64 } from \"@tearleads/encoding\";\nimport { exportAllUpdates } from \"@tearleads/loro\";\nimport type { ContainerRecord } from \"../../data/persistence/containers/containerPersistence\";\nimport type { ContainerDocumentRecord as DocumentRecord } from \"./containerPersistence\";\nimport {\n currentMetadataPullContinuation,\n type resolveMetadataSecurityContext,\n} from \"./metadataMutationPreparation\";\nimport type {\n ContainerMetadataPatch,\n ContainerMetadataState,\n} from \"./metadataTypes\";\n\ntype NullableContainerMetadataDocumentField =\n | \"accessStateHash\"\n | \"lastCommitLsn\"\n | \"contentKeyBundle\"\n | \"documentKekTargets\"\n | \"documentManifestBundle\";\n\nexport function resolveContainerSystemSlot(\n patch: Partial<ContainerMetadataPatch>,\n container: ContainerRecord,\n): NonNullable<ContainerRecord[\"systemSlot\"]> | null {\n return patch.systemSlot ?? container.systemSlot ?? null;\n}\n\nexport function resolveMetadataDocumentId(\n patch: Partial<ContainerMetadataPatch>,\n container: ContainerRecord,\n): ContainerRecord[\"metadataDocumentId\"] {\n return (\n patch.metadataDocumentId ?? patch.documentId ?? container.metadataDocumentId\n );\n}\n\nfunction resolveNullableContainerMetadataDocumentField(\n patch: Partial<ContainerMetadataPatch>,\n key: NullableContainerMetadataDocumentField,\n currentValue: string | null | undefined,\n resetWhenUnpatched = false,\n): string | null {\n if (Object.hasOwn(patch, key)) return patch[key] ?? null;\n return resetWhenUnpatched ? null : (currentValue ?? null);\n}\n\nfunction resolveMetadataPullState(\n metadataState: ContainerMetadataState,\n patch: Partial<ContainerMetadataPatch>,\n securityContextChanged: boolean,\n): Pick<\n DocumentRecord,\n \"pullContinuation\" | \"pullContinuationRecoveryRequired\"\n> {\n if (Object.hasOwn(patch, \"pullContinuation\")) {\n return { pullContinuation: patch.pullContinuation ?? null };\n }\n if (securityContextChanged) return { pullContinuation: null };\n if (metadataState.record.pullContinuationRecoveryRequired) {\n return { pullContinuationRecoveryRequired: true };\n }\n return { pullContinuation: currentMetadataPullContinuation(metadataState) };\n}\n\nexport function buildContainerMetadataRecord(input: {\n metadataState: ContainerMetadataState;\n patch: Partial<ContainerMetadataPatch>;\n securityContext: ReturnType<typeof resolveMetadataSecurityContext>;\n}): DocumentRecord {\n const { metadataState, patch, securityContext } = input;\n return {\n id: metadataState.container.id,\n documentId: securityContext.documentId,\n metadataUpdates:\n patch.metadataUpdates ??\n bytesToBase64(exportAllUpdates(metadataState.doc)),\n snapshotEndVersion: \"\",\n accessEpoch: securityContext.accessEpoch,\n accessStateHash: resolveNullableContainerMetadataDocumentField(\n patch,\n \"accessStateHash\",\n metadataState.record.accessStateHash,\n securityContext.changed,\n ),\n lastCommitLsn: resolveNullableContainerMetadataDocumentField(\n patch,\n \"lastCommitLsn\",\n metadataState.record.lastCommitLsn,\n securityContext.documentIdChanged,\n ),\n contentKeyBundle: resolveNullableContainerMetadataDocumentField(\n patch,\n \"contentKeyBundle\",\n metadataState.record.contentKeyBundle,\n securityContext.changed,\n ),\n documentKekTargets: resolveNullableContainerMetadataDocumentField(\n patch,\n \"documentKekTargets\",\n metadataState.record.documentKekTargets,\n securityContext.changed,\n ),\n documentManifestBundle: resolveNullableContainerMetadataDocumentField(\n patch,\n \"documentManifestBundle\",\n metadataState.record.documentManifestBundle,\n securityContext.changed,\n ),\n ...resolveMetadataPullState(metadataState, patch, securityContext.changed),\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataRemoteSync.js","sourceRoot":"","sources":["metadataRemoteSync.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DocumentWriterProjectionResponse } from \"@tearleads/validators/response\";\nimport type { ProjectionUserKeyResolver } from \"../../data/keyingProjectionVerification\";\nimport { CONTAINER_METADATA_APP_KIND } from \"../../data/persistence/container-contents/containerContentsPersistence\";\nimport type { PendingUpdateRecord } from \"../../data/sqlite/documentPersistence\";\nimport {\n createDocumentWriterPublicKeyResolver,\n describeDocumentSyncSubmitFailure,\n type RekeyPendingUpdate,\n resolveDocumentCreateAuthor,\n syncRemoteDocument,\n} from \"../documents\";\nimport { createRuntimePrincipalPolicyWarmer } from \"../principals/runtimePolicyWarmer\";\nimport {\n metadataIncomingUpdateIsolation,\n recordCurrentMetadataSyncFailure,\n} from \"./metadataIncomingUpdateIsolation\";\nimport { deferRecoverableMetadataSyncError } from \"./metadataSyncErrors\";\nimport type { ContainerMetadataState } from \"./metadataTypes\";\nimport type { ContainerContentsWorkflowRuntime } from \"./runtime\";\n\ntype ContainerMetadataSyncApi = Parameters<\n typeof syncRemoteDocument\n>[0][\"apiClient\"] &\n Pick<\n ContainerContentsWorkflowRuntime[\"apiClient\"],\n \"getPrincipalPolicyPages\" | \"getProjectionPolicyHistoryPages\"\n >;\n\nexport interface ContainerMetadataSyncRuntime\n extends Pick<\n ContainerContentsWorkflowRuntime,\n | \"auth\"\n | \"crypto\"\n | \"infra\"\n | \"resolveTrustedUserIdentity\"\n | \"state\"\n | \"util\"\n > {\n apiClient: ContainerMetadataSyncApi;\n}\n\ntype ContainerMetadataSyncResult = NonNullable<\n Awaited<ReturnType<typeof syncRemoteDocument>>\n>;\n\nexport interface ContainerMetadataSyncAttempt {\n consumedPullContinuation: ContainerMetadataState[\"pullContinuation\"];\n outgoingUpdateCount: number;\n requestRecord: ContainerMetadataState[\"record\"];\n synced: ContainerMetadataSyncResult;\n}\n\ninterface SyncRemoteContainerMetadataInput {\n buildRotationSnapshot?: (() => Promise<Uint8Array | null>) | undefined;\n containerId: string;\n currentDocument: ContainerMetadataState[\"doc\"];\n documentId: string | null;\n isCurrent: () => boolean;\n lastCommitLsn?: string | null | undefined;\n localVersionVector: string | null;\n onOutgoingUpdatesMaterialized?:\n | ((updateIds: readonly string[]) => void)\n | undefined;\n onPullContinuationInvalidated?: Parameters<\n typeof syncRemoteDocument\n >[0][\"onPullContinuationInvalidated\"];\n pendingUpdates: readonly PendingUpdateRecord[];\n persistedState: ContainerMetadataState[\"record\"];\n pullContinuation?: ContainerMetadataState[\"pullContinuation\"];\n rekeyPendingUpdate: RekeyPendingUpdate;\n resolveProjectionUserKey: ProjectionUserKeyResolver;\n runtime: ContainerMetadataSyncRuntime;\n targetSecretKey: Uint8Array;\n writerProjection?: DocumentWriterProjectionResponse | undefined;\n}\n\nfunction createContainerMetadataSyncAttempt(input: {\n outgoingUpdateCount: number;\n requestedPullContinuation: ContainerMetadataState[\"pullContinuation\"];\n requestRecord: ContainerMetadataState[\"record\"];\n synced: ContainerMetadataSyncResult;\n}): ContainerMetadataSyncAttempt {\n return {\n consumedPullContinuation:\n input.synced.plan.request.pullCursor === undefined\n ? null\n : (input.requestedPullContinuation ?? null),\n outgoingUpdateCount: input.outgoingUpdateCount,\n requestRecord: input.requestRecord,\n synced: input.synced,\n };\n}\n\nexport async function syncRemoteContainerMetadata(\n input: SyncRemoteContainerMetadataInput,\n): Promise<ContainerMetadataSyncAttempt | null> {\n const { documentId, isCurrent, runtime } = input;\n if (!documentId) return null;\n const author = resolveDocumentCreateAuthor(runtime);\n if (!author) {\n runtime.util.log(\n \"Container contents: skipped metadata sync because the writer context is unavailable.\",\n );\n return null;\n }\n const execSql = runtime.infra.execSql;\n const metadataScope = {\n appKind: CONTAINER_METADATA_APP_KIND,\n localId: input.containerId,\n };\n const synced = await syncRemoteDocument({\n apiClient: runtime.apiClient,\n author,\n buildRotationSnapshot: input.buildRotationSnapshot,\n documentId,\n execSql,\n isRemoteSyncBlocked: runtime.util.isRemoteSyncBlocked,\n localVersionVector: input.localVersionVector,\n minLsn: input.lastCommitLsn ?? undefined,\n ...metadataIncomingUpdateIsolation({\n currentDocument: input.currentDocument,\n execSql,\n isCurrent,\n logError: runtime.util.logError,\n metadataScope,\n }),\n onOutgoingUpdatesMaterialized: input.onOutgoingUpdatesMaterialized,\n onPullContinuationInvalidated: input.onPullContinuationInvalidated,\n onSyncTrace: (line) => runtime.util.log(`Container contents: ${line}`),\n onTerminalSubmitFailure: async (failure) => {\n await recordCurrentMetadataSyncFailure({\n execSql,\n failure: {\n attemptedAt: new Date().toISOString(),\n message: describeDocumentSyncSubmitFailure(failure),\n status: failure.status,\n },\n isCurrent,\n metadataScope,\n });\n },\n pendingUpdates: input.pendingUpdates,\n persistedState: input.persistedState,\n pullContinuation: input.pullContinuation ?? undefined,\n rekeyPendingUpdate: (rekeyExecSql, updateId) =>\n isCurrent()\n ? input.rekeyPendingUpdate(rekeyExecSql, updateId)\n : Promise.resolve(null),\n resolveProjectionUserKey: input.resolveProjectionUserKey,\n resolveWriterPublicKey: createDocumentWriterPublicKeyResolver({\n logPrefix: \"Container contents\",\n runtime,\n writerKeyLabel: \"metadata writer key\",\n }),\n stillCurrent: isCurrent,\n targetSecretKey: input.targetSecretKey,\n warmReferencedPrincipalPolicies:\n createRuntimePrincipalPolicyWarmer(runtime),\n writerProjection: input.writerProjection,\n }).catch((error: unknown) =>\n deferRecoverableMetadataSyncError({\n containerId: input.containerId,\n error,\n runtime,\n }),\n );\n if (!synced) return null;\n return createContainerMetadataSyncAttempt({\n outgoingUpdateCount: input.pendingUpdates.length,\n requestedPullContinuation: input.pullContinuation,\n requestRecord: input.persistedState,\n synced,\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataStateInstallation.js","sourceRoot":"","sources":["metadataStateInstallation.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,8BAA8B,CAC5C,aAAqC,EACrC,MAA+B;IAE/B,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC;IAC9B,aAAa,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC;AACnE,CAAC","sourcesContent":["import type { ContainerDocumentRecord } from \"./containerPersistence\";\nimport type { ContainerMetadataState } from \"./metadataTypes\";\n\nexport function installContainerMetadataRecord(\n metadataState: ContainerMetadataState,\n record: ContainerDocumentRecord,\n): void {\n metadataState.record = record;\n metadataState.pullContinuation = record.pullContinuation ?? null;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataStateIsolation.js","sourceRoot":"","sources":["metadataStateIsolation.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n encodeVersionVector,\n exportAllUpdates,\n exportFullHistorySnapshot,\n importSnapshot,\n importUpdates,\n satisfiesVersionVector,\n} from \"@tearleads/loro\";\nimport {\n createContainerMetadataDocument,\n getDefaultContainerName,\n readContainerMetadataValue,\n} from \"../../data/containers/containerMetadataDocument\";\nimport { metadataSyncSecurityContextMatches } from \"./metadataSyncSettlement\";\nimport type { ContainerMetadataState } from \"./metadataTypes\";\nimport { projectionGeneration } from \"./projectionGeneration\";\n\nexport interface DetachedContainerMetadataState extends ContainerMetadataState {\n readonly detachedSource: {\n readonly metadataVersion: string;\n /** The live state's `writerProjectionGeneration` when it was detached. */\n readonly writerProjectionGeneration: number;\n };\n}\n\ninterface DetachedContainerMetadataInstallOptions {\n readonly candidateRecord?: ContainerMetadataState[\"record\"];\n readonly preserveConcurrentMetadataEdit?: boolean;\n}\n\nfunction mergeConcurrentMetadataRecord(\n liveRecord: ContainerMetadataState[\"record\"],\n candidateRecord: ContainerMetadataState[\"record\"],\n): ContainerMetadataState[\"record\"] {\n if (metadataSyncSecurityContextMatches(liveRecord, candidateRecord)) {\n return liveRecord;\n }\n\n // The live document owns the concurrent CRDT frontier, but the candidate\n // owns the newly committed remote identity. Carry only the fields that\n // describe the live CRDT history across that identity boundary.\n return {\n ...candidateRecord,\n metadataUpdates: liveRecord.metadataUpdates,\n snapshotEndVersion: liveRecord.snapshotEndVersion,\n ...(liveRecord.pendingBaseVersion === undefined\n ? {}\n : { pendingBaseVersion: liveRecord.pendingBaseVersion }),\n };\n}\n\n/**\n * Gives an asynchronous sync pass its own mutable metadata projection. Durable\n * settlement can then repair or replace the candidate without changing the\n * live store until the caller has rechecked its lifecycle generation.\n */\nexport async function createDetachedContainerMetadataState(\n metadataState: ContainerMetadataState,\n options: {\n /**\n * The live generation captured when the surrounding operation began, for\n * callers that awaited (a request, a policy warm-up) before detaching.\n */\n readonly writerProjectionGeneration?: number | undefined;\n } = {},\n): Promise<DetachedContainerMetadataState> {\n const doc = await createContainerMetadataDocument(metadataState.container.id);\n importSnapshot(doc, exportFullHistorySnapshot(metadataState.doc));\n return {\n ...metadataState,\n container: { ...metadataState.container },\n detachedSource: {\n metadataVersion: encodeVersionVector(metadataState.doc),\n writerProjectionGeneration:\n options.writerProjectionGeneration ??\n projectionGeneration(metadataState),\n },\n doc,\n record: { ...metadataState.record },\n };\n}\n\nexport function installDetachedContainerMetadataState(\n target: ContainerMetadataState,\n candidate: DetachedContainerMetadataState,\n options: DetachedContainerMetadataInstallOptions = {},\n): void {\n const candidateRecord = options.candidateRecord ?? candidate.record;\n const liveMetadataVersion = encodeVersionVector(target.doc);\n const candidateMetadataVersion = encodeVersionVector(candidate.doc);\n const liveRecord = target.record;\n const livePullContinuation = target.pullContinuation;\n const preserveConcurrentLiveMetadata =\n options.preserveConcurrentMetadataEdit === true &&\n liveMetadataVersion !== candidate.detachedSource.metadataVersion &&\n !satisfiesVersionVector(candidateMetadataVersion, liveMetadataVersion);\n const installedRecord = preserveConcurrentLiveMetadata\n ? mergeConcurrentMetadataRecord(liveRecord, candidateRecord)\n : candidateRecord;\n\n if (preserveConcurrentLiveMetadata) {\n importUpdates(target.doc, [exportAllUpdates(candidate.doc)]);\n const metadata = readContainerMetadataValue(\n target.doc,\n getDefaultContainerName(candidate.container.parentId),\n );\n target.container = {\n ...candidate.container,\n icon: metadata.icon,\n name: metadata.name,\n };\n } else {\n target.container = candidate.container;\n target.doc = candidate.doc;\n }\n // A hint invalidated the live projections while this candidate was out;\n // its copy may cite a pre-hint manifest, so the live slot stays as the hint\n // left it and the next metadata write fetches a fresh projection.\n if (\n projectionGeneration(target) ===\n candidate.detachedSource.writerProjectionGeneration\n )\n target.metadataWriterProjection = candidate.metadataWriterProjection;\n target.pullContinuation = preserveConcurrentLiveMetadata\n ? metadataSyncSecurityContextMatches(liveRecord, candidateRecord)\n ? livePullContinuation\n : (candidateRecord.pullContinuation ?? null)\n : (candidateRecord.pullContinuation ?? null);\n target.record = installedRecord;\n target.rekeyOnlyPassCount = candidate.rekeyOnlyPassCount;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataSyncErrors.js","sourceRoot":"","sources":["metadataSyncErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kCAAkC,EAAE,MAAM,yDAAyD,CAAC;AAC7G,OAAO,EACL,yBAAyB,EACzB,yCAAyC,GAC1C,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,qEAAqE,CAAC;AAGtH,SAAS,0CAA0C,CAAC,KAAc;IAChE,4EAA4E;IAC5E,2EAA2E;IAC3E,IAAI,yBAAyB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5D,OAAO,CACL,OAAO,CAAC,UAAU,CAChB,gEAAgE,CACjE;QACD,OAAO,CAAC,UAAU,CAAC,6CAA6C,CAAC;QACjE,OAAO,CAAC,UAAU,CAAC,sCAAsC,CAAC;QAC1D,OAAO,CAAC,UAAU,CAAC,iDAAiD,CAAC;QACrE,OAAO,CAAC,UAAU,CAAC,gCAAgC,CAAC;QACpD,OAAO,KAAK,oCAAoC;QAChD,OAAO,KAAK,4CAA4C,CACzD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iCAAiC,CAAC,KAUvD;IACC,IAAI,kCAAkC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,yCAAyC,CAC7C,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,EACzC;YACE,QAAQ,EAAE,KAAK,CAAC,WAAW;YAC3B,UAAU,EAAE,WAAW;YACvB,SAAS,EAAE,yBAAyB;YACpC,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc;SAClD,CACF,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CACpB,iEAAiE,KAAK,CAAC,WAAW,kEAAkE,CACrJ,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,0CAA0C,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CACpB,kDAAkD,KAAK,CAAC,WAAW,6CAA6C,CACjH,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAC7E,6EAA6E;IAC7E,IAAI,+BAA+B,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CACpB,kDAAkD,KAAK,CAAC,WAAW,2DAA2D,CAC/H,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,CAAC,KAAK,CAAC;AACpB,CAAC","sourcesContent":["import { isDocumentSyncUpdateIsolationError } from \"../../data/documents/shared/documentSyncUpdateIsolation\";\nimport {\n isKeyingVerificationError,\n reportKeyingVerificationErrorInCauseChain,\n} from \"../../data/keyingProjectionVerification/error\";\nimport { isPrincipalPolicyNotCachedError } from \"../../data/keyingProjectionVerification/principalPolicyVerification\";\nimport type { SecurityIncidentReporter } from \"../../data/shared/securityIncidents\";\n\nfunction isStaleContainerMetadataSecurityStateError(error: unknown): boolean {\n // Signed-state verification failures are terminal integrity incidents, even\n // when their diagnostic message resembles an ordinary stale-key condition.\n if (isKeyingVerificationError(error)) return false;\n const message = error instanceof Error ? error.message : \"\";\n\n return (\n message.startsWith(\n \"Document authorizing container KEK path could not be unwrapped\",\n ) ||\n message.startsWith(\"Document content key could not be unwrapped\") ||\n message.startsWith(\"Document content-key bundle is stale\") ||\n message.startsWith(\"Document content-key re-wrap KEK is unavailable\") ||\n message.startsWith(\"Document stale-bundle recovery\") ||\n message === \"Document sync target hash mismatch\" ||\n message === \"Document sync content-key targets mismatch\"\n );\n}\n\nexport async function deferRecoverableMetadataSyncError(input: {\n containerId: string;\n error: unknown;\n runtime: {\n auth: { organizationId: string | null };\n util: {\n log: (message: string) => void;\n reportSecurityIncident: SecurityIncidentReporter;\n };\n };\n}): Promise<null> {\n if (isDocumentSyncUpdateIsolationError(input.error)) {\n await reportKeyingVerificationErrorInCauseChain(\n input.error,\n input.runtime.util.reportSecurityIncident,\n {\n objectId: input.containerId,\n objectKind: \"container\",\n operation: \"container.metadata.sync\",\n organizationId: input.runtime.auth.organizationId,\n },\n );\n input.runtime.util.log(\n `Container contents: quarantined incoming metadata updates for ${input.containerId}; deferred this container without blocking later metadata syncs.`,\n );\n return null;\n }\n\n if (isStaleContainerMetadataSecurityStateError(input.error)) {\n input.runtime.util.log(\n `Container contents: deferred metadata sync for ${input.containerId} because its content-key targets are stale.`,\n );\n return null;\n }\n\n // A cold principal-policy cache is transient: warming already ran and failed\n // within this attempt. Keep the needing-sync state set for the next trigger.\n if (isPrincipalPolicyNotCachedError(input.error)) {\n input.runtime.util.log(\n `Container contents: deferred metadata sync for ${input.containerId} because a referenced principal policy is not cached yet.`,\n );\n return null;\n }\n\n throw input.error;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataSyncSettlement.js","sourceRoot":"","sources":["metadataSyncSettlement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,+BAA+B,EAAE,MAAM,iDAAiD,CAAC;AAUlG,MAAM,UAAU,yBAAyB,CACvC,IAA+B,EAC/B,KAAgC;IAEhC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,OAA8B,EAC9B,QAAwB;IAExB,OAAO,CACL,OAAO,KAAK,IAAI;QAChB,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE;QAC1B,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU;QAC1C,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,WAAW;QAC5C,yBAAyB,CACvB,OAAO,CAAC,eAAe,EACvB,QAAQ,CAAC,eAAe,CACzB;QACD,yBAAyB,CACvB,OAAO,CAAC,gBAAgB,EACxB,QAAQ,CAAC,gBAAgB,CAC1B;QACD,yBAAyB,CACvB,OAAO,CAAC,kBAAkB,EAC1B,QAAQ,CAAC,kBAAkB,CAC5B;QACD,yBAAyB,CACvB,OAAO,CAAC,sBAAsB,EAC9B,QAAQ,CAAC,sBAAsB,CAChC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iCAAiC,CAAC,KAGvD;IACC,MAAM,cAAc,GAAG,MAAM,+BAA+B,CAC1D,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CACjC,CAAC;IACF,IAAI,KAAK,CAAC,aAAa,EAAE,eAAe,EAAE,CAAC;QACzC,aAAa,CAAC,cAAc,EAAE;YAC5B,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,GAAG,GAAG,cAAc,CAAC;IACzC,KAAK,CAAC,aAAa,CAAC,wBAAwB,GAAG,IAAI,CAAC;AACtD,CAAC","sourcesContent":["import { base64ToBytes } from \"@tearleads/encoding\";\nimport { importUpdates } from \"@tearleads/loro\";\nimport { createContainerMetadataDocument } from \"../../data/containers/containerMetadataDocument\";\nimport type { DocumentSyncPullContinuation } from \"../../data/documents/shared/syncPagination\";\nimport type { ContainerDocumentRecord as DocumentRecord } from \"./containerPersistence\";\nimport type { ContainerMetadataState } from \"./metadataTypes\";\n\nexport interface ExpectedContainerMetadataSyncState {\n pullContinuation: DocumentSyncPullContinuation | null;\n record: DocumentRecord;\n}\n\nexport function sameNullableMetadataValue(\n left: string | null | undefined,\n right: string | null | undefined,\n): boolean {\n return (left ?? null) === (right ?? null);\n}\n\nexport function metadataSyncSecurityContextMatches(\n current: DocumentRecord | null,\n expected: DocumentRecord,\n): boolean {\n return (\n current !== null &&\n current.id === expected.id &&\n current.documentId === expected.documentId &&\n current.accessEpoch === expected.accessEpoch &&\n sameNullableMetadataValue(\n current.accessStateHash,\n expected.accessStateHash,\n ) &&\n sameNullableMetadataValue(\n current.contentKeyBundle,\n expected.contentKeyBundle,\n ) &&\n sameNullableMetadataValue(\n current.documentKekTargets,\n expected.documentKekTargets,\n ) &&\n sameNullableMetadataValue(\n current.documentManifestBundle,\n expected.documentManifestBundle,\n )\n );\n}\n\nexport async function replaceSupersededMetadataIdentity(input: {\n durableRecord: DocumentRecord | null;\n metadataState: ContainerMetadataState;\n}): Promise<void> {\n const replacementDoc = await createContainerMetadataDocument(\n input.metadataState.container.id,\n );\n if (input.durableRecord?.metadataUpdates) {\n importUpdates(replacementDoc, [\n base64ToBytes(input.durableRecord.metadataUpdates),\n ]);\n }\n input.metadataState.doc = replacementDoc;\n input.metadataState.metadataWriterProjection = null;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataTypes.js","sourceRoot":"","sources":["metadataTypes.ts"],"names":[],"mappings":"","sourcesContent":["import type { DocumentWriterProjectionResponse } from \"@tearleads/validators/response\";\nimport type { ContainerMetadataDocument } from \"../../data/containers/containerMetadataDocument\";\nimport type { DocumentSyncPullContinuation } from \"../../data/documents/shared/syncPagination\";\nimport type { ContainerMetadataRecord } from \"../../data/persistence/container-contents/containerContentsPersistence\";\nimport type { ContainerRecord } from \"../../data/persistence/containers/containerPersistence\";\n\nexport interface ContainerMetadataState {\n container: ContainerRecord;\n doc: ContainerMetadataDocument;\n metadataWriterProjection?:\n | DocumentWriterProjectionResponse\n | null\n | undefined;\n /** See `ContainerState.writerProjectionGeneration`; shared by both caches. */\n writerProjectionGeneration?: number | undefined;\n /** Durable continuation mirrored from the metadata document record. */\n pullContinuation?: DocumentSyncPullContinuation | null | undefined;\n record: ContainerMetadataRecord;\n /**\n * Consecutive completed sync passes that re-keyed conflicted pending updates\n * without settling anything; bounds the rekey-driven follow-up sync. See\n * shouldReArmAfterOutgoingSettlement.\n */\n rekeyOnlyPassCount?: number | undefined;\n}\n\nexport interface ContainerMetadataPatch {\n accessEpoch: number;\n accessStateHash: string | null;\n effectiveAccessLevel: ContainerRecord[\"effectiveAccessLevel\"];\n documentId: string | null;\n icon: string | null;\n lastCommitLsn: string | null;\n metadataDocumentId: string | null;\n systemSlot: ContainerRecord[\"systemSlot\"];\n metadataUpdates: string;\n name: string;\n organizationId: string;\n parentId: string | null;\n pullContinuation: DocumentSyncPullContinuation | null;\n contentKeyBundle: string | null;\n documentKekTargets: string | null;\n documentManifestBundle: string | null;\n}\n\nexport interface PersistedContainerMetadataState {\n container: ContainerRecord;\n createIntentSettled?: true;\n moveIntentSettled?: true;\n mutationSuperseded?: true;\n pullContinuationSuperseded?: true;\n record: ContainerMetadataRecord;\n syncIdentitySuperseded?: true;\n}\n\nexport interface SyncedContainerMetadataState\n extends PersistedContainerMetadataState {\n shouldRequestFollowupSync: boolean;\n}\n\nexport interface MissingContainerMetadataState {\n missing: true;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"orphanedDocumentSql.js","sourceRoot":"","sources":["orphanedDocumentSql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AAErF,MAAM,UAAU,2BAA2B,CAAC,KAG3C;IACC,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IACjD,OAAO;;QAED,eAAe;;;2CAGoB,aAAa;4CACZ,eAAe;;;;;QAKnD,eAAe;WACZ,eAAe;WACf,eAAe;;UAEhB,eAAe,0BAA0B,6BAA6B,CAAC,GAAG,CAC9E,GAAG,EAAE,CAAC,GAAG,CACV,CAAC,IAAI,CAAC,IAAI,CAAC;;QAER,aAAa;;;;mCAIc,aAAa;;;;;;;;;GAS7C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,qBAAgD;IAEhD,OAAO,CAAC,qBAAqB,IAAI,EAAE,EAAE,GAAG,6BAA6B,CAAC,CAAC;AACzE,CAAC","sourcesContent":["import { HIDDEN_DOCUMENT_SUMMARY_KINDS } from \"../../data/documents/documentSummary\";\n\nexport function getOrphanedDocumentWhereSql(input: {\n documentIdSql: string;\n projectionAlias: string;\n}): string {\n const { documentIdSql, projectionAlias } = input;\n return `\n (\n ${projectionAlias}.container_id IS NULL\n OR EXISTS (\n SELECT 1 FROM container_document_tombstone_holds primary_hold\n WHERE primary_hold.document_id = ${documentIdSql}\n AND primary_hold.container_id = ${projectionAlias}.container_id\n AND primary_hold.hidden = 1\n )\n )\n AND (\n ${projectionAlias}.organization_id = ?\n OR ${projectionAlias}.organization_id IS NULL\n OR ${projectionAlias}.organization_id = ''\n )\n AND ${projectionAlias}.document_kind NOT IN (${HIDDEN_DOCUMENT_SUMMARY_KINDS.map(\n () => \"?\",\n ).join(\", \")})\n AND (\n ${documentIdSql} IS NULL\n OR NOT EXISTS (\n SELECT 1\n FROM document_container_projection link\n WHERE link.document_id = ${documentIdSql}\n AND NOT EXISTS (\n SELECT 1 FROM container_document_tombstone_holds link_hold\n WHERE link_hold.document_id = link.document_id\n AND link_hold.container_id = link.container_id\n AND link_hold.hidden = 1\n )\n )\n )\n `;\n}\n\nexport function getOrphanedDocumentQueryBind(\n currentOrganizationId: string | null | undefined,\n): ReadonlyArray<string> {\n return [currentOrganizationId ?? \"\", ...HIDDEN_DOCUMENT_SUMMARY_KINDS];\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pendingDownloads.js","sourceRoot":"","sources":["pendingDownloads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wDAAwD,CAAC;AAC/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,uDAAuD,CAAC;AAEhG,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAYzE,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAgB;IAEhB,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,uBAAuB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;;kBAEX,uBAAuB,CAAC,QAAQ,CAAC;;;kBAGjC,uBAAuB,CAAC,QAAQ,CAAC;;;;;;;;;aAStC,uBAAuB,CAAC,QAAQ,CAAC;;;;GAI3C,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,MAAM,EACJ,QAAQ,EAAE,OAAO,EACjB,WAAW,EAAE,UAAU,EACvB,QAAQ,EAAE,OAAO,EACjB,KAAK,EACL,MAAM,EACN,UAAU,EAAE,SAAS,GACtB,GAAG,GAAG,CAAC;QACR,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,UAAU,KAAK,QAAQ;YAC/D,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,GAA6B;YACrC,OAAO;YACP,UAAU;YACV,UAAU,EAAE,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;YAC9D,KAAK,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YAC/C,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc;YACzD,SAAS,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;SAC5D,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { ensureContainerTables } from \"../../data/persistence/containers/containerPersistence\";\nimport { sqlDocumentsPersistence } from \"../../data/persistence/documents/documentsPersistence\";\nimport type { ExecSql } from \"../../data/sqlite/sqlSchema\";\nimport { emptyContentFrontierSql } from \"./documentQueries/hydrationSql\";\n\nexport interface PendingDownloadQueueItem {\n localId: string;\n documentId: string;\n objectKind: \"document\" | \"container\";\n /** Null until content supplies a reliable title and type. */\n title: string | null;\n reason: \"initial\" | \"continuation\";\n lastError: string | null;\n}\n\n/** Durable, already-discovered content pulls, including folder metadata. */\nexport async function listPendingDownloads(\n execSql: ExecSql,\n): Promise<ReadonlyArray<PendingDownloadQueueItem>> {\n await ensureContainerTables(execSql);\n await sqlDocumentsPersistence.ensureSchema(execSql);\n const rows = await execSql(`\n SELECT stored.local_id, stored.document_id, stored.app_kind,\n CASE WHEN ${emptyContentFrontierSql(\"stored\")} THEN NULL\n WHEN stored.app_kind = 'documents' THEN d.title\n ELSE folder.display_name END AS title,\n CASE WHEN ${emptyContentFrontierSql(\"stored\")} THEN 'initial'\n ELSE 'continuation' END AS reason,\n stored.sync_failure_message AS last_error\n FROM documents stored\n LEFT JOIN document_projection d ON stored.app_kind = 'documents'\n AND d.local_id = stored.local_id\n LEFT JOIN containers folder ON stored.app_kind = 'container-metadata'\n AND folder.id = stored.local_id\n WHERE stored.document_id IS NOT NULL\n AND (${emptyContentFrontierSql(\"stored\")} OR stored.pull_continuation IS NOT NULL)\n AND ((stored.app_kind = 'documents' AND d.local_id IS NOT NULL)\n OR (stored.app_kind = 'container-metadata' AND folder.id IS NOT NULL))\n ORDER BY stored.updated_at, stored.app_kind, stored.local_id\n `);\n return rows.flatMap((row) => {\n const {\n local_id: localId,\n document_id: documentId,\n app_kind: appKind,\n title,\n reason,\n last_error: lastError,\n } = row;\n if (typeof localId !== \"string\" || typeof documentId !== \"string\")\n return [];\n const item: PendingDownloadQueueItem = {\n localId,\n documentId,\n objectKind: appKind === \"documents\" ? \"document\" : \"container\",\n title: typeof title === \"string\" ? title : null,\n reason: reason === \"initial\" ? \"initial\" : \"continuation\",\n lastError: typeof lastError === \"string\" ? lastError : null,\n };\n return [item];\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pendingWrites.js","sourceRoot":"","sources":["pendingWrites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,wEAAwE,CAAC;AACrH,OAAO,EAAE,gCAAgC,EAAE,MAAM,yEAAyE,CAAC;AAC3H,OAAO,EAAE,uBAAuB,EAAE,MAAM,uDAAuD,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qDAAqD,CAAC;AACzF,OAAO,EACL,wBAAwB,EACxB,qCAAqC,GACtC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,6BAA6B,EAC7B,cAAc,EACd,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,mCAAmC,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EACL,wBAAwB,EACxB,kCAAkC,GACnC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,mCAAmC,EAAE,MAAM,yBAAyB,CAAC;AAY9E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAgB;IAEhB,MAAM,mCAAmC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,uBAAuB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,gCAAgC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAE7D,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9C,mCAAmC,CAAC,OAAO,CAAC;QAC5C,kCAAkC,CAAC,OAAO,CAAC;KAC5C,CAAC,CAAC;IACH,OAAO,2BAA2B,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAgB,EAChB,KAKC;IAED,MAAM,OAAO,GACX,KAAK,CAAC,UAAU,KAAK,WAAW;QAC9B,CAAC,CAAC,2BAA2B;QAC7B,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS;YAChB,CAAC,KAAK,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,wEAAwE;QACxE,uEAAuE;QACvE,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAClD,MAAM,qCAAqC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5D,IAAI,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACnC,yEAAyE;QACzE,sEAAsE;QACtE,uBAAuB;QACvB,MAAM,gCAAgC,CAAC,sBAAsB,CAAC,OAAO,EAAE;YACrE,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;IACL,CAAC;IACD,yEAAyE;IACzE,0EAA0E;IAC1E,sEAAsE;IACtE,wEAAwE;IACxE,yEAAyE;IACzE,IAAI,MAAM,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,kBAAkB,CAC/B,OAAgB,EAChB,KAA2C;IAE3C,MAAM,eAAe,CAAC,OAAO,EAAE;QAC7B,GAAG,cAAc;QACjB,GAAG,6BAA6B;KACjC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB;;;;;;;;;;;;gCAY4B,kBAAkB,CAAC,iBAAiB;;;;;;;;;aASvD,EACT;QACE,KAAK,CAAC,OAAO;QACb,KAAK,CAAC,OAAO;QACb,KAAK,CAAC,OAAO;QACb,KAAK,CAAC,OAAO;QACb,KAAK,CAAC,OAAO;QACb,KAAK,CAAC,OAAO;KACd,CACF,CAAC;IACF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,sEAAsE;IACtE,kEAAkE;IAClE,iCAAiC;IACjC,OAAO,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC","sourcesContent":["import { CONTAINER_METADATA_APP_KIND } from \"../../data/persistence/container-contents/containerContentsPersistence\";\nimport { sqlDocumentMoveIntentPersistence } from \"../../data/persistence/container-contents/documentMoveIntentPersistence\";\nimport { sqlDocumentsPersistence } from \"../../data/persistence/documents/documentsPersistence\";\nimport { DOCUMENTS_APP_KIND } from \"../../data/persistence/documents/internal/constants\";\nimport {\n clearDocumentSyncFailure,\n resetDocumentPendingUpdateRekeyBudget,\n} from \"../../data/sqlite/documentPersistence\";\nimport {\n documentPlacementIntentTables,\n documentTables,\n LOCAL_INTENT_LANES,\n} from \"../../data/sqlite/schema\";\nimport type { ExecSql } from \"../../data/sqlite/sqlSchema\";\nimport { ensureSqlTables } from \"../../data/sqlite/sqlSchema\";\nimport { defaultContainerContentsPersistence } from \"./containerPersistence\";\nimport { groupPendingWriteCandidates } from \"./pendingWrites/aggregation\";\nimport {\n hasDeferredTailScopeWork,\n listDeferredPendingWriteCandidates,\n} from \"./pendingWrites/deferredTails\";\nimport { listPersistedPendingWriteCandidates } from \"./pendingWrites/sources\";\nimport type { PendingWriteQueueItem } from \"./pendingWritesTypes\";\n\nexport type {\n PendingWriteQueueItem,\n PendingWriteQueueItemStatus,\n PendingWriteQueueObjectKind,\n PendingWriteQueueOperation,\n PendingWriteQueueOperationKind,\n PendingWriteQueueOperationStatus,\n} from \"./pendingWritesTypes\";\n\n/**\n * List identity-wide local state that still requires a remote write. The\n * returned diagnostic contains only navigation/display metadata and aggregate\n * counts; serialized updates, local storage keys, and upload crypto stay below\n * the workflow boundary.\n */\nexport async function listPendingWrites(\n execSql: ExecSql,\n): Promise<ReadonlyArray<PendingWriteQueueItem>> {\n await defaultContainerContentsPersistence.ensureSchema(execSql);\n await sqlDocumentsPersistence.ensureSchema(execSql);\n await sqlDocumentMoveIntentPersistence.ensureSchema(execSql);\n\n const [persisted, deferred] = await Promise.all([\n listPersistedPendingWriteCandidates(execSql),\n listDeferredPendingWriteCandidates(execSql),\n ]);\n return groupPendingWriteCandidates([...persisted, ...deferred]);\n}\n\n/**\n * Explicit manual retry for one write-queue item: reset the durable re-key\n * budget for the item's ACTUAL pending-update scope (container metadata and\n * unknown document namespaces re-key through the same recovery path as\n * ordinary documents) and clear the recorded terminal failure — the next\n * pass re-records both if they still hold. The cap protects against a\n * server driving a network-speed re-key loop; a deliberate user retry is\n * the rate-limited signal that conditions have changed (e.g. an outage that\n * burned the budget has healed). The caller re-arms the sync lanes.\n */\nexport async function resetPendingWriteRetryState(\n execSql: ExecSql,\n input: {\n localId: string;\n /** The item's `namespace` — the unrecognized documents.app_kind, if any. */\n namespace: string | null;\n objectKind: PendingWriteQueueItem[\"objectKind\"];\n },\n): Promise<void> {\n const appKind =\n input.objectKind === \"container\"\n ? CONTAINER_METADATA_APP_KIND\n : (input.namespace ??\n (input.objectKind === \"document\" ? DOCUMENTS_APP_KIND : null));\n if (appKind === null) {\n // An unknown object kind with no namespace: there is no scope to reset,\n // and guessing one could clear an unrelated scope sharing the localId.\n return;\n }\n const scope = { appKind, localId: input.localId };\n await resetDocumentPendingUpdateRekeyBudget(execSql, scope);\n if (appKind === DOCUMENTS_APP_KIND) {\n // A deliberate retry is the rate-limited signal that conditions changed:\n // a parked permission-denied move (row 7) replays once, like row 11's\n // re-key budget reset.\n await sqlDocumentMoveIntentPersistence.resetDeniedMoveIntents(execSql, {\n localId: input.localId,\n });\n }\n // Clearing the failure row is part of the re-key budget reset (edge-case\n // row 11) and only makes sense alongside queued work. A failure-only item\n // (a refused revalidation, row 13) has no queued work: its row is the\n // priming ticket that re-drives the store, so it must survive the retry\n // and clear on the next clean pass instead of vanishing with no request.\n if (await hasQueuedScopeWork(execSql, scope)) {\n await clearDocumentSyncFailure(execSql, scope);\n }\n}\n\n/**\n * Whether ANY durable outbound work exists for the scope — CRDT updates,\n * staged attachment uploads, move intents, a never-created local document, or\n * a deferred write whose only durable content is the history tail ahead of\n * its covered frontier. Mirrors the queue's own document candidate sources,\n * so \"failure-only\" here agrees with the item the panel rendered.\n */\nasync function hasQueuedScopeWork(\n execSql: ExecSql,\n scope: { appKind: string; localId: string },\n): Promise<boolean> {\n await ensureSqlTables(execSql, [\n ...documentTables,\n ...documentPlacementIntentTables,\n ]);\n const rows = await execSql(\n `SELECT 1 AS present\n WHERE EXISTS (\n SELECT 1 FROM document_history_updates pending\n WHERE pending.app_kind = ? AND pending.local_id = ?\n AND pending.update_id IS NOT NULL\n )\n OR EXISTS (\n SELECT 1 FROM document_pending_attachments attachment\n WHERE attachment.local_id = ?\n )\n OR EXISTS (\n SELECT 1 FROM local_intents intent\n WHERE intent.lane = '${LOCAL_INTENT_LANES.documentPlacement}'\n AND intent.local_id = ?\n AND intent.intent_type IN ('document.move', 'document.link')\n )\n OR EXISTS (\n SELECT 1 FROM documents stored\n WHERE stored.app_kind = ? AND stored.local_id = ?\n AND stored.document_id IS NULL\n )\n LIMIT 1`,\n [\n scope.appKind,\n scope.localId,\n scope.localId,\n scope.localId,\n scope.appKind,\n scope.localId,\n ],\n );\n if (rows.length > 0) {\n return true;\n }\n // The queue's deferred-update source has no queued rows to probe: the\n // write lives in the durable history tail, detectable only by the\n // version-vector coverage check.\n return hasDeferredTailScopeWork(execSql, scope);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"remoteContainerPageHydration.js","sourceRoot":"","sources":["remoteContainerPageHydration.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRuntimePrincipalPolicyWarmer } from \"../principals/runtimePolicyWarmer\";\nimport {\n listRemoteContainerIdsWithPendingMetadataUpdates,\n listRemoteContainerIdsWithPendingStructuralIntents,\n upsertIsolatedRemoteContainerState,\n} from \"./remoteContainerState\";\nimport { containerStateMatchesFingerprint } from \"./remoteHydration/containerStateFingerprint\";\nimport { prefetchDestinationProjections } from \"./remoteHydration/destinationPrefetch\";\nimport { cachedDestinationRole } from \"./remoteHydration/destinationRoleCache\";\nimport { markContainerParentLaneFetched } from \"./remoteHydration/laneFetchMarkers\";\nimport { fetchContainerParentLaneBatch } from \"./remoteHydration/parentLaneFetch\";\nimport { cacheRemoteContainerPrincipalPolicies } from \"./remoteHydration/principalPolicyCache\";\nimport {\n applyContainerTombstones,\n getApplicableRemoteContainerItems,\n} from \"./remoteHydration/tombstoneApplication\";\nimport type {\n ContainerChildIndex,\n ContainerParentHydrationLane,\n ExpectedContainerState,\n FetchedContainerParentLanePage,\n ListedRemoteContainerPageItem,\n QueueContainerParentLane,\n RemoteContainerHydrationHost,\n RemoteContainerHydrationState,\n} from \"./remoteHydration/types\";\n\nconst CONTAINER_PARENT_HYDRATION_CONCURRENCY = 4;\n\ninterface HydrationProgress {\n changedCount: number;\n complete: boolean;\n shouldStop: boolean;\n}\nasync function applyRemoteContainerPage(input: {\n childIdsByParentId: ContainerChildIndex;\n expectedContainerStates: ReadonlyMap<string, ExpectedContainerState>;\n expectedHydrationTombstones: FetchedContainerParentLanePage[\"expectedHydrationTombstones\"];\n host: RemoteContainerHydrationHost;\n isCurrent?: (() => boolean) | undefined;\n items: ReadonlyArray<ListedRemoteContainerPageItem>;\n queueParentLane: QueueContainerParentLane;\n seenContainerIds: Set<string>;\n state: RemoteContainerHydrationState;\n}): Promise<{ changedCount: number; completed: boolean }> {\n const {\n childIdsByParentId,\n expectedContainerStates,\n expectedHydrationTombstones,\n host,\n items,\n queueParentLane,\n seenContainerIds,\n state,\n } = input;\n let hydratedCount = 0;\n let pageCompleted = true;\n await cacheRemoteContainerPrincipalPolicies({\n cacheReferencedPrincipalPolicies: createRuntimePrincipalPolicyWarmer(\n state.runtime,\n ),\n remoteContainers: items,\n stillCurrent: input.isCurrent,\n });\n if (input.isCurrent?.() === false) {\n return { changedCount: 0, completed: false };\n }\n const [\n containerIdsWithPendingMetadataUpdates,\n containerIdsWithPendingStructuralIntents,\n ] = await Promise.all([\n listRemoteContainerIdsWithPendingMetadataUpdates({\n remoteContainers: items,\n state,\n }),\n listRemoteContainerIdsWithPendingStructuralIntents({\n remoteContainers: items,\n state,\n }),\n ]);\n if (input.isCurrent?.() === false) {\n return { changedCount: 0, completed: false };\n }\n const prefetchedProjections = await prefetchDestinationProjections({\n containerIds: items.flatMap((item) =>\n seenContainerIds.has(item.id) ||\n state.containersById.has(item.id) ||\n expectedHydrationTombstones.get(item.id) ||\n cachedDestinationRole(state.runtime.infra.execSql, item)\n ? []\n : [item.id],\n ),\n isCurrent: input.isCurrent,\n runtime: state.runtime,\n });\n for (const container of items) {\n if (input.isCurrent?.() === false) {\n return { changedCount: hydratedCount, completed: false };\n }\n if (!seenContainerIds.has(container.id)) {\n if (\n !containerStateMatchesFingerprint({\n currentState: state.containersById.get(container.id),\n expectedFingerprint: expectedContainerStates.get(container.id)\n ?.fingerprint,\n })\n ) {\n pageCompleted = false;\n continue;\n }\n const upserted = await upsertIsolatedRemoteContainerState({\n childIdsByParentId,\n containerIdsWithPendingMetadataUpdates,\n containerIdsWithPendingStructuralIntents,\n host,\n isCurrent: input.isCurrent,\n expectedHydrationTombstone:\n expectedHydrationTombstones.get(container.id) ?? null,\n prefetchedProjection: prefetchedProjections.get(container.id),\n remoteContainer: container,\n state,\n });\n if (!upserted) {\n pageCompleted = false;\n continue;\n }\n seenContainerIds.add(container.id);\n hydratedCount += 1;\n if (input.isCurrent?.() === false) {\n return { changedCount: hydratedCount, completed: false };\n }\n }\n queueParentLane(container.id);\n }\n\n return { changedCount: hydratedCount, completed: pageCompleted };\n}\n\nexport function canHydrateRemoteContainers(\n state: RemoteContainerHydrationState,\n): boolean {\n return (\n state.runtime.auth.isAuthenticated &&\n state.runtime.state.online &&\n state.runtime.infra.dbStatus === \"ready\"\n );\n}\n\nasync function applyContainerParentLanePage(input: {\n childIdsByParentId: ContainerChildIndex;\n fetchedPage: FetchedContainerParentLanePage;\n host: RemoteContainerHydrationHost;\n isCurrent?: (() => boolean) | undefined;\n queueContinuationLane: (lane: ContainerParentHydrationLane) => void;\n queueParentLane: QueueContainerParentLane;\n seenContainerIds: Set<string>;\n state: RemoteContainerHydrationState;\n}): Promise<HydrationProgress> {\n const {\n childIdsByParentId,\n fetchedPage,\n host,\n queueContinuationLane,\n queueParentLane,\n seenContainerIds,\n state,\n } = input;\n const {\n expectedContainerStates,\n expectedHydrationTombstones,\n lane,\n response,\n syncLane,\n } = fetchedPage;\n let changedCount = 0;\n if (input.isCurrent?.() === false) {\n return { changedCount, complete: false, shouldStop: true };\n }\n\n const remoteContainerItems = getApplicableRemoteContainerItems(response);\n const tombstoneResult = await applyContainerTombstones({\n childIdsByParentId,\n expectedContainerStates,\n isCurrent: input.isCurrent,\n remoteContainerItems,\n response,\n state,\n });\n if (!tombstoneResult.current) {\n return { changedCount, complete: false, shouldStop: true };\n }\n changedCount += tombstoneResult.changedCount;\n if (input.isCurrent?.() === false) {\n return { changedCount, complete: false, shouldStop: true };\n }\n if (tombstoneResult.changedCount > 0) {\n // A live tombstone cascade may have orphaned documents (row 3); re-arm\n // document priming so their null-scoped passes run now rather than on\n // the next startup.\n host.requestDocumentPriming?.();\n }\n\n const appliedPage = await applyRemoteContainerPage({\n childIdsByParentId,\n expectedContainerStates,\n expectedHydrationTombstones,\n host,\n isCurrent: input.isCurrent,\n items: remoteContainerItems,\n queueParentLane,\n seenContainerIds,\n state,\n });\n changedCount += appliedPage.changedCount;\n if (!tombstoneResult.completed || !appliedPage.completed) {\n // Keep this page retryable without discarding independent lanes, including\n // children of roots first discovered here. Otherwise the root becomes known\n // but its children are never fetched by subsequent root-only refreshes.\n return { changedCount, complete: false, shouldStop: false };\n }\n if (input.isCurrent?.() === false) {\n return { changedCount, complete: false, shouldStop: true };\n }\n\n const didMarkFetched = await markContainerParentLaneFetched({\n isCurrent: input.isCurrent,\n response,\n state,\n syncLane,\n });\n if (!didMarkFetched) {\n return { changedCount, complete: false, shouldStop: true };\n }\n\n if (!response.hasMore) {\n return { changedCount, complete: true, shouldStop: false };\n }\n if (!response.nextWatermark) {\n return { changedCount, complete: false, shouldStop: true };\n }\n\n queueContinuationLane({\n parentId: lane.parentId,\n watermark: response.nextWatermark,\n });\n return { changedCount, complete: true, shouldStop: false };\n}\n\nfunction takeContainerParentLaneBatch(input: {\n lanes: ContainerParentHydrationLane[];\n state: RemoteContainerHydrationState;\n}): ContainerParentHydrationLane[] {\n const { lanes, state } = input;\n const batch: ContainerParentHydrationLane[] = [];\n\n while (\n lanes.length > 0 &&\n batch.length < CONTAINER_PARENT_HYDRATION_CONCURRENCY\n ) {\n const lane = lanes.shift();\n if (\n lane &&\n (lane.parentId === null || state.containersById.has(lane.parentId))\n ) {\n batch.push(lane);\n }\n }\n\n return batch;\n}\n\nasync function applyContainerParentLaneBatch(input: {\n childIdsByParentId: ContainerChildIndex;\n fetchedPages: ReadonlyArray<FetchedContainerParentLanePage>;\n host: RemoteContainerHydrationHost;\n isCurrent?: (() => boolean) | undefined;\n lanes: ContainerParentHydrationLane[];\n queueParentLane: QueueContainerParentLane;\n seenContainerIds: Set<string>;\n state: RemoteContainerHydrationState;\n}): Promise<HydrationProgress> {\n const {\n childIdsByParentId,\n fetchedPages,\n host,\n lanes,\n queueParentLane,\n seenContainerIds,\n state,\n } = input;\n let changedCount = 0;\n let complete = true;\n\n for (const fetchedPage of fetchedPages) {\n if (!canHydrateRemoteContainers(state) || input.isCurrent?.() === false) {\n return { changedCount, complete: false, shouldStop: true };\n }\n if (\n fetchedPage.lane.parentId !== null &&\n !state.containersById.has(fetchedPage.lane.parentId)\n ) {\n continue;\n }\n\n const result = await applyContainerParentLanePage({\n childIdsByParentId,\n fetchedPage,\n host,\n isCurrent: input.isCurrent,\n queueContinuationLane: (lane) => lanes.push(lane),\n queueParentLane,\n seenContainerIds,\n state,\n });\n changedCount += result.changedCount;\n complete &&= result.complete;\n\n if (result.shouldStop) {\n return { changedCount, complete: false, shouldStop: true };\n }\n }\n\n return { changedCount, complete, shouldStop: false };\n}\n\nexport async function hydrateContainerParentLanes(input: {\n childIdsByParentId: ContainerChildIndex;\n host: RemoteContainerHydrationHost;\n isCurrent?: (() => boolean) | undefined;\n lanes: ContainerParentHydrationLane[];\n queueParentLane: QueueContainerParentLane;\n seenContainerIds: Set<string>;\n state: RemoteContainerHydrationState;\n}): Promise<HydrationProgress> {\n const {\n childIdsByParentId,\n host,\n lanes,\n queueParentLane,\n seenContainerIds,\n state,\n } = input;\n let changedCount = 0;\n let complete = true;\n\n while (lanes.length > 0) {\n if (!canHydrateRemoteContainers(state) || input.isCurrent?.() === false) {\n return { changedCount, complete: false, shouldStop: true };\n }\n\n const batch = takeContainerParentLaneBatch({ lanes, state });\n if (batch.length === 0) {\n continue;\n }\n\n const fetchedPages = await fetchContainerParentLaneBatch({\n batch,\n isCurrent: input.isCurrent,\n state,\n });\n if (!fetchedPages) {\n return { changedCount, complete: false, shouldStop: true };\n }\n if (input.isCurrent?.() === false) {\n return { changedCount, complete: false, shouldStop: true };\n }\n\n const result = await applyContainerParentLaneBatch({\n childIdsByParentId,\n fetchedPages,\n host,\n isCurrent: input.isCurrent,\n lanes,\n queueParentLane,\n seenContainerIds,\n state,\n });\n changedCount += result.changedCount;\n complete &&= result.complete;\n\n if (result.shouldStop) {\n return { changedCount, complete: false, shouldStop: true };\n }\n }\n\n return { changedCount, complete, shouldStop: false };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"remoteContainerState.js","sourceRoot":"","sources":["remoteContainerState.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccessManifestCheckpoint } from \"@tearleads/crypto\";\nimport {\n heldContainerBinding,\n listingRepeatsHeldOrdinaryBinding,\n} from \"../../data/containers/containerBinding\";\nimport {\n isKeyingVerificationError,\n runWithSecurityIncidentReporting,\n} from \"../../data/keyingProjectionVerification/error\";\nimport { isProjectionVerificationCancelledError } from \"../../data/keyingProjectionVerification/types\";\nimport type { ContainerHydrationTombstone } from \"./containerPersistence\";\nimport { installContainerMetadataRecord } from \"./metadataPersistence\";\nimport { projectionGeneration } from \"./projectionGeneration\";\nimport {\n moveIndexedContainerChild,\n removeIndexedContainerChild,\n} from \"./remoteHydration/childIndex\";\nimport type { PrefetchedDestinationProjection } from \"./remoteHydration/destinationPrefetch\";\nimport { rebindReHomedContainer } from \"./remoteHydration/heldContainerRebind\";\nimport { insertRemoteContainerState } from \"./remoteHydration/insertRemoteContainer\";\nimport {\n reconcileLocalOnlyRootContainers,\n reconcileLocalOnlySystemContainers,\n} from \"./remoteHydration/reconciliation\";\nimport {\n applyRemoteContainerTimestamps,\n remoteContainerHydrationSaveOptions,\n resolveRemoteContainerHydrationLocalUpdatedAt,\n} from \"./remoteHydration/remoteContainerTimestamps\";\nimport type {\n ContainerChildIndex,\n ContainerState,\n RemoteContainer,\n RemoteContainerHydrationHost,\n RemoteContainerHydrationState,\n} from \"./remoteHydration/types\";\nimport { verifyRemoteContainerDestination } from \"./remoteHydration/verifiedDestination\";\n\n// Container ids (restricted to the inbound page) that carry an unsynced local\n// create or move intent. Such a container's parent and local-edit timestamp are\n// owned by its structural-intent lane until that lane reconciles, so inbound\n// hydration must not revert parentId to the server value nor collapse\n// localUpdatedAt — doing so silently undoes a queued move and falsely reads\n// \"synced\". Move intents are read via listUnsyncedMoveIntents so a blocked\n// move — one whose destination parent has not synced yet, the common boot-time\n// case — is protected too. Pending *metadata*\n// updates are handled separately (listRemoteContainerIdsWithPendingMetadataUpdates);\n// structural intents live in the local outbox's container lanes, which that\n// query does not cover.\nexport async function listRemoteContainerIdsWithPendingStructuralIntents(input: {\n remoteContainers: ReadonlyArray<RemoteContainer>;\n state: RemoteContainerHydrationState;\n}): Promise<Set<string>> {\n if (input.remoteContainers.length === 0) {\n return new Set();\n }\n const remoteContainerIds = new Set(\n input.remoteContainers.map((remoteContainer) => remoteContainer.id),\n );\n\n const execSql = input.state.runtime.infra.execSql;\n const [pendingCreateIntents, unsyncedMoveIntents] = await Promise.all([\n input.state.persistence.listPendingCreateIntents(execSql),\n input.state.persistence.listUnsyncedMoveIntents(execSql),\n ]);\n const containerIdsWithPendingStructuralIntents = new Set<string>();\n for (const intent of pendingCreateIntents) {\n if (remoteContainerIds.has(intent.containerId)) {\n containerIdsWithPendingStructuralIntents.add(intent.containerId);\n }\n }\n for (const intent of unsyncedMoveIntents) {\n if (remoteContainerIds.has(intent.containerId)) {\n containerIdsWithPendingStructuralIntents.add(intent.containerId);\n }\n }\n return containerIdsWithPendingStructuralIntents;\n}\n\nexport async function listRemoteContainerIdsWithPendingMetadataUpdates(input: {\n remoteContainers: ReadonlyArray<RemoteContainer>;\n state: RemoteContainerHydrationState;\n}): Promise<Set<string>> {\n const containerIds = input.remoteContainers.flatMap((remoteContainer) => {\n const previousLocalUpdatedAt = input.state.containersById.get(\n remoteContainer.id,\n )?.container.localUpdatedAt;\n\n return previousLocalUpdatedAt &&\n previousLocalUpdatedAt.localeCompare(remoteContainer.updatedAt) > 0\n ? [remoteContainer.id]\n : [];\n });\n if (containerIds.length === 0) {\n return new Set();\n }\n\n const execSql = input.state.runtime.infra.execSql;\n return new Set(\n await input.state.persistence.listContainerIdsWithPendingUpdates(\n execSql,\n containerIds,\n ),\n );\n}\n\nfunction removeMissingHydratedContainer(input: {\n childIdsByParentId?: ContainerChildIndex | undefined;\n existingState: ContainerState;\n host: RemoteContainerHydrationHost;\n previousParentId: string | null;\n remoteContainer: RemoteContainer;\n state: RemoteContainerHydrationState;\n}): void {\n const { existingState, remoteContainer, state } = input;\n if (state.containersById.get(remoteContainer.id) !== existingState) {\n return;\n }\n\n state.containersById.delete(remoteContainer.id);\n if (input.childIdsByParentId) {\n removeIndexedContainerChild(\n input.childIdsByParentId,\n remoteContainer.id,\n input.previousParentId,\n );\n input.childIdsByParentId.delete(remoteContainer.id);\n }\n input.host.updateSnapshot();\n}\n\nfunction createUpdatedRemoteContainerState(\n existingState: ContainerState,\n remoteContainer: RemoteContainer,\n): ContainerState {\n return {\n ...existingState,\n container: applyRemoteContainerTimestamps(\n existingState.container,\n remoteContainer,\n ),\n containerWriterProjection: null,\n metadataReferencedPrincipals: remoteContainer.metadataReferencedPrincipals,\n };\n}\n\nfunction installUpdatedRemoteContainerState(\n existingState: ContainerState,\n nextState: ContainerState,\n host: RemoteContainerHydrationHost,\n): void {\n const wasLocalOnly = existingState.container.serverCreatedAt == null;\n existingState.container = nextState.container;\n existingState.containerWriterProjection = nextState.containerWriterProjection;\n existingState.metadataReferencedPrincipals =\n nextState.metadataReferencedPrincipals;\n // The snapshot copied the live generation when it was taken; a hint that\n // landed during the persist leaves the live metadata projection dropped.\n if (projectionGeneration(existingState) === projectionGeneration(nextState))\n existingState.metadataWriterProjection = nextState.metadataWriterProjection;\n installContainerMetadataRecord(existingState, nextState.record);\n // A document pass may have deferred while this root was awaiting proof.\n // The first durable remote acknowledgement makes its pending creates runnable.\n if (wasLocalOnly && existingState.container.serverCreatedAt != null)\n host.requestDocumentPriming?.();\n}\n\nasync function updateExistingRemoteContainerState(input: {\n childIdsByParentId?: ContainerChildIndex | undefined;\n containerIdsWithPendingMetadataUpdates: ReadonlySet<string>;\n containerIdsWithPendingStructuralIntents: ReadonlySet<string>;\n host: RemoteContainerHydrationHost;\n isCurrent?: (() => boolean) | undefined;\n existingState: ContainerState;\n remoteContainer: RemoteContainer;\n state: RemoteContainerHydrationState;\n}): Promise<ContainerState | null> {\n const { childIdsByParentId, existingState, host, remoteContainer, state } =\n input;\n const previousParentId = existingState.container.parentId;\n const previousLocalUpdatedAt = existingState.container.localUpdatedAt;\n // A queued, not-yet-synced local move/create owns this container's parent\n // until its intent lane reconciles. Omit the remote parent when the page scan\n // saw one; persistence also rechecks the intent transactionally so a move\n // created after that scan wins. Both paths preserve the durable local clock.\n const hasPendingStructuralIntent =\n input.containerIdsWithPendingStructuralIntents.has(remoteContainer.id);\n const nextParentId = hasPendingStructuralIntent\n ? undefined\n : remoteContainer.parentId;\n const localUpdatedAt = resolveRemoteContainerHydrationLocalUpdatedAt({\n containerIdsWithPendingMetadataUpdates:\n input.containerIdsWithPendingMetadataUpdates,\n hasPendingStructuralIntent,\n previousLocalUpdatedAt,\n remoteContainer,\n });\n const nextState = createUpdatedRemoteContainerState(\n existingState,\n remoteContainer,\n );\n const persistenceResult = await host.persistContainerState(\n nextState,\n {\n accessEpoch: remoteContainer.metadataAccessEpoch,\n accessStateHash: remoteContainer.metadataAccessStateHash,\n documentId: remoteContainer.metadataDocumentId,\n effectiveAccessLevel: remoteContainer.effectiveAccessLevel,\n metadataDocumentId: remoteContainer.metadataDocumentId,\n systemSlot: remoteContainer.systemSlot ?? null,\n organizationId: remoteContainer.organizationId,\n ...(nextParentId !== undefined ? { parentId: nextParentId } : {}),\n },\n false,\n remoteContainerHydrationSaveOptions({\n localUpdatedAt,\n remoteContainer,\n }),\n {\n preserveDurableStructureWhenPending: true,\n },\n );\n if (persistenceResult.status === \"missing\") {\n // Hydration persists a detached candidate so an in-flight response cannot\n // mutate mapped state before its guards settle. Retire the exact state this\n // hydration read because store-level reference cleanup cannot see the clone.\n removeMissingHydratedContainer({\n childIdsByParentId,\n existingState,\n host,\n previousParentId,\n remoteContainer,\n state,\n });\n return null;\n }\n if (persistenceResult.status !== \"persisted\") return null;\n const { record: nextRecord } = persistenceResult;\n installContainerMetadataRecord(nextState, nextRecord);\n if (input.isCurrent?.() === false) {\n return existingState;\n }\n nextState.container = {\n ...nextState.container,\n metadataDocumentId: remoteContainer.metadataDocumentId,\n organizationId: remoteContainer.organizationId,\n parentId: nextState.container.parentId,\n };\n\n installUpdatedRemoteContainerState(existingState, nextState, host);\n moveIndexedContainerChild(\n childIdsByParentId,\n remoteContainer.id,\n previousParentId,\n existingState.container.parentId,\n );\n await reconcileLocalOnlyRootContainers({\n childIdsByParentId,\n isCurrent: input.isCurrent,\n remoteRootState: existingState,\n requestDocumentPriming: host.requestDocumentPriming,\n state,\n });\n return existingState;\n}\n\ninterface UpsertRemoteContainerStateInput {\n childIdsByParentId?: ContainerChildIndex | undefined;\n containerIdsWithPendingMetadataUpdates: ReadonlySet<string>;\n containerIdsWithPendingStructuralIntents: ReadonlySet<string>;\n host: RemoteContainerHydrationHost;\n expectedHydrationTombstone?: ContainerHydrationTombstone | null | undefined;\n isCurrent?: (() => boolean) | undefined;\n prefetchedProjection?: PrefetchedDestinationProjection | undefined;\n remoteContainer: RemoteContainer;\n state: RemoteContainerHydrationState;\n}\n\nexport async function upsertRemoteContainerState(\n input: UpsertRemoteContainerStateInput,\n): Promise<ContainerState | null> {\n let expectedPlacementCheckpoint: AccessManifestCheckpoint | undefined;\n const heldState = input.state.containersById.get(input.remoteContainer.id);\n const heldBinding = heldState\n ? heldContainerBinding(heldState)\n : await input.state.persistence.loadHeldContainerBinding(\n input.state.runtime.infra.execSql,\n input.remoteContainer.id,\n );\n const listed = input.remoteContainer;\n // A folder re-homed away from the listed organization never returns there,\n // whatever binding (possibly none, after a reset) the device holds now.\n const supersededListing =\n !listingRepeatsHeldOrdinaryBinding(heldBinding, listed) &&\n (await input.state.persistence.isSupersededContainerBinding(\n input.state.runtime.infra.execSql,\n { containerId: listed.id, organizationId: listed.organizationId },\n ));\n if (input.isCurrent?.() === false) return null;\n const verified = await verifyRemoteContainerDestination({\n ...input,\n heldBinding,\n supersededListing,\n refresh: !!input.expectedHydrationTombstone,\n onVerifiedCheckpoint: (checkpoint) => {\n expectedPlacementCheckpoint = checkpoint;\n },\n });\n if (!verified || input.isCurrent?.() === false) return null;\n input = { ...input, remoteContainer: verified };\n const existingState = input.state.containersById.get(\n input.remoteContainer.id,\n );\n const remoteState = await runWithSecurityIncidentReporting(\n input.state.runtime.util.reportSecurityIncident,\n {\n objectId: verified.id,\n objectKind: \"container\",\n operation: \"container.binding.persist\",\n organizationId: verified.organizationId,\n },\n async () =>\n (await rebindReHomedContainer({\n existingState,\n heldBinding,\n isCurrent: input.isCurrent,\n state: input.state,\n verified,\n }))\n ? persistVerifiedRemoteContainer({\n ...input,\n existingState,\n expectedPlacementCheckpoint,\n })\n : null,\n );\n if (!remoteState) {\n return null;\n }\n await reconcileLocalOnlySystemContainers({\n childIdsByParentId: input.childIdsByParentId,\n isCurrent: input.isCurrent,\n requestDocumentPriming: input.host.requestDocumentPriming,\n remoteSystemState: remoteState,\n state: input.state,\n });\n return remoteState;\n}\n\n/**\n * Upsert one listed folder, isolating a rejected proof or binding. The refusal\n * was already reported; returning no state leaves the item unapplied without\n * blocking independent folders.\n */\nexport async function upsertIsolatedRemoteContainerState(\n input: UpsertRemoteContainerStateInput,\n): Promise<ContainerState | null> {\n try {\n return await upsertRemoteContainerState(input);\n } catch (error) {\n if (\n !isKeyingVerificationError(error) &&\n !isProjectionVerificationCancelledError(error)\n )\n throw error;\n return null;\n }\n}\n\nfunction persistVerifiedRemoteContainer(\n input: UpsertRemoteContainerStateInput & {\n existingState: ContainerState | undefined;\n expectedPlacementCheckpoint: AccessManifestCheckpoint | undefined;\n },\n): Promise<ContainerState | null> {\n const { existingState, expectedPlacementCheckpoint } = input;\n return existingState\n ? updateExistingRemoteContainerState({\n childIdsByParentId: input.childIdsByParentId,\n containerIdsWithPendingMetadataUpdates:\n input.containerIdsWithPendingMetadataUpdates,\n containerIdsWithPendingStructuralIntents:\n input.containerIdsWithPendingStructuralIntents,\n existingState,\n host: input.host,\n isCurrent: input.isCurrent,\n remoteContainer: input.remoteContainer,\n state: input.state,\n })\n : insertRemoteContainerState({\n childIdsByParentId: input.childIdsByParentId,\n host: input.host,\n expectedHydrationTombstone: input.expectedHydrationTombstone ?? null,\n expectedPlacementCheckpoint,\n isCurrent: input.isCurrent,\n remoteContainer: input.remoteContainer,\n state: input.state,\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"remoteHydration.js","sourceRoot":"","sources":["remoteHydration.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRuntimePrincipalPolicyWarmer } from \"../principals/runtimePolicyWarmer\";\nimport {\n canHydrateRemoteContainers,\n hydrateContainerParentLanes,\n} from \"./remoteContainerPageHydration\";\nimport {\n listRemoteContainerIdsWithPendingMetadataUpdates,\n listRemoteContainerIdsWithPendingStructuralIntents,\n upsertIsolatedRemoteContainerState,\n} from \"./remoteContainerState\";\nimport { createContainerChildIndex } from \"./remoteHydration/childIndex\";\nimport { finishRemoteHydration } from \"./remoteHydration/completeHydration\";\nimport { createContainerParentHydrationQueue } from \"./remoteHydration/parentLaneQueue\";\nimport { cacheRemoteContainerPrincipalPolicies } from \"./remoteHydration/principalPolicyCache\";\nimport type {\n QueueContainerParentLane,\n RemoteContainer,\n RemoteContainerHydrationHost,\n RemoteContainerHydrationState,\n RemoteContainerIngestQueue,\n} from \"./remoteHydration/types\";\n\nexport type {\n ContainerState,\n PersistContainerStateResult,\n RemoteContainer,\n RemoteContainerHydrationHost,\n} from \"./remoteHydration/types\";\n\nexport class StaleRemoteHydrationError extends Error {}\n\nexport function createGenerationGuardedHydrationHost(input: {\n host: RemoteContainerHydrationHost;\n isCurrent: () => boolean;\n}): RemoteContainerHydrationHost {\n const assertCurrent = () => {\n if (!input.isCurrent()) {\n throw new StaleRemoteHydrationError();\n }\n };\n\n return {\n persistContainerState: async (\n containerState,\n patch,\n updateView,\n saveOptions,\n mutationOptions,\n ) => {\n const callerIsCurrent = mutationOptions?.isCurrent;\n const isCurrent = callerIsCurrent\n ? () => input.isCurrent() && callerIsCurrent()\n : input.isCurrent;\n assertCurrent();\n const record = await input.host.persistContainerState(\n containerState,\n patch,\n updateView,\n saveOptions,\n { ...mutationOptions, isCurrent },\n );\n assertCurrent();\n return record;\n },\n ...(input.host.requestDocumentPriming\n ? {\n requestDocumentPriming: () => {\n if (input.isCurrent()) {\n input.host.requestDocumentPriming?.();\n }\n },\n }\n : {}),\n updateSnapshot: () => {\n if (input.isCurrent()) {\n input.host.updateSnapshot();\n }\n },\n };\n}\n\ninterface RemoteContainerIngestGeneration {\n readonly lifecycle: number | undefined;\n readonly structural: number | undefined;\n}\ntype RemoteContainerIngestGenerationMap = Map<\n string,\n RemoteContainerIngestGeneration\n>;\n\nfunction remoteContainerIngestGeneration(\n state: RemoteContainerHydrationState,\n): RemoteContainerIngestGeneration {\n return {\n lifecycle: state.lifecycleGeneration,\n structural: state.structuralGeneration,\n };\n}\n\nfunction remoteContainerIngestGenerationsMatch(\n left: RemoteContainerIngestGeneration | undefined,\n right: RemoteContainerIngestGeneration,\n): boolean {\n return (\n left !== undefined &&\n left.lifecycle === right.lifecycle &&\n left.structural === right.structural\n );\n}\n\nfunction isCurrentQueuedRemoteContainer(\n generation: RemoteContainerIngestGeneration,\n generationByContainerId: RemoteContainerIngestGenerationMap,\n queue: RemoteContainerIngestQueue,\n remoteContainer: RemoteContainer,\n): boolean {\n return (\n queue.get(remoteContainer.id) === remoteContainer &&\n remoteContainerIngestGenerationsMatch(\n generationByContainerId.get(remoteContainer.id),\n generation,\n )\n );\n}\n\nasync function upsertQueuedRemoteContainer(input: {\n containerIdsWithPendingMetadataUpdates: ReadonlySet<string>;\n containerIdsWithPendingStructuralIntents: ReadonlySet<string>;\n generation: RemoteContainerIngestGeneration;\n generationByContainerId: RemoteContainerIngestGenerationMap;\n host: RemoteContainerHydrationHost;\n isCurrent: () => boolean;\n queue: RemoteContainerIngestQueue;\n queuedRemoteContainer: RemoteContainer;\n state: RemoteContainerHydrationState;\n}): Promise<boolean> {\n const {\n containerIdsWithPendingMetadataUpdates,\n containerIdsWithPendingStructuralIntents,\n generation,\n generationByContainerId,\n host,\n queue,\n queuedRemoteContainer,\n state,\n } = input;\n if (\n !input.isCurrent() ||\n !isCurrentQueuedRemoteContainer(\n generation,\n generationByContainerId,\n queue,\n queuedRemoteContainer,\n )\n ) {\n return false;\n }\n\n const tombstones = await state.persistence.loadContainerHydrationTombstones(\n state.runtime.infra.execSql,\n );\n // A refused folder is reported and acknowledged; the batch continues.\n const upserted = await upsertIsolatedRemoteContainerState({\n expectedHydrationTombstone:\n tombstones.find((row) => row.containerId === queuedRemoteContainer.id) ??\n null,\n containerIdsWithPendingMetadataUpdates,\n containerIdsWithPendingStructuralIntents,\n host,\n isCurrent: input.isCurrent,\n remoteContainer: queuedRemoteContainer,\n state,\n });\n if (!upserted) {\n return false;\n }\n return true;\n}\n\nfunction acknowledgeRemoteContainerIngestBatch(input: {\n generation: RemoteContainerIngestGeneration;\n generationByContainerId: RemoteContainerIngestGenerationMap;\n isCurrent: () => boolean;\n queue: RemoteContainerIngestQueue;\n queuedRemoteContainers: ReadonlyArray<RemoteContainer>;\n}): void {\n if (!input.isCurrent()) {\n return;\n }\n for (const queuedRemoteContainer of input.queuedRemoteContainers) {\n if (\n isCurrentQueuedRemoteContainer(\n input.generation,\n input.generationByContainerId,\n input.queue,\n queuedRemoteContainer,\n )\n ) {\n input.queue.delete(queuedRemoteContainer.id);\n input.generationByContainerId.delete(queuedRemoteContainer.id);\n }\n }\n}\n\nasync function drainRemoteContainerIngestQueue(input: {\n generation: RemoteContainerIngestGeneration;\n generationByContainerId: RemoteContainerIngestGenerationMap;\n host: RemoteContainerHydrationHost;\n isCurrent: () => boolean;\n queue: RemoteContainerIngestQueue;\n state: RemoteContainerHydrationState;\n}) {\n const { generation, generationByContainerId, host, queue, state } = input;\n let shouldUpdateSnapshot = false;\n\n try {\n while (input.isCurrent()) {\n const queuedRemoteContainers = Array.from(queue.values()).filter(\n (remoteContainer) =>\n remoteContainerIngestGenerationsMatch(\n generationByContainerId.get(remoteContainer.id),\n generation,\n ),\n );\n if (queuedRemoteContainers.length === 0) {\n return;\n }\n await cacheRemoteContainerPrincipalPolicies({\n cacheReferencedPrincipalPolicies: createRuntimePrincipalPolicyWarmer(\n state.runtime,\n ),\n remoteContainers: queuedRemoteContainers,\n stillCurrent: input.isCurrent,\n });\n if (!input.isCurrent()) {\n return;\n }\n const [\n containerIdsWithPendingMetadataUpdates,\n containerIdsWithPendingStructuralIntents,\n ] = await Promise.all([\n listRemoteContainerIdsWithPendingMetadataUpdates({\n remoteContainers: queuedRemoteContainers,\n state,\n }),\n listRemoteContainerIdsWithPendingStructuralIntents({\n remoteContainers: queuedRemoteContainers,\n state,\n }),\n ]);\n if (!input.isCurrent()) {\n return;\n }\n\n for (const queuedRemoteContainer of queuedRemoteContainers) {\n shouldUpdateSnapshot =\n (await upsertQueuedRemoteContainer({\n containerIdsWithPendingMetadataUpdates,\n containerIdsWithPendingStructuralIntents,\n generation,\n generationByContainerId,\n host,\n isCurrent: input.isCurrent,\n queue,\n queuedRemoteContainer,\n state,\n })) || shouldUpdateSnapshot;\n }\n acknowledgeRemoteContainerIngestBatch({\n generation,\n generationByContainerId,\n isCurrent: input.isCurrent,\n queue,\n queuedRemoteContainers,\n });\n\n if (shouldUpdateSnapshot) {\n host.updateSnapshot();\n shouldUpdateSnapshot = false;\n }\n }\n } catch (error) {\n if (shouldUpdateSnapshot) {\n host.updateSnapshot();\n }\n throw error;\n }\n}\n\nfunction isRemoteContainerIngestGenerationCurrent(\n state: RemoteContainerHydrationState,\n generation: RemoteContainerIngestGeneration,\n): boolean {\n return remoteContainerIngestGenerationsMatch(\n remoteContainerIngestGeneration(state),\n generation,\n );\n}\n\nfunction settleStaleRemoteContainerIngestGeneration(input: {\n generation: RemoteContainerIngestGeneration;\n generationByContainerId: RemoteContainerIngestGenerationMap;\n queue: RemoteContainerIngestQueue;\n state: RemoteContainerHydrationState;\n}): void {\n const currentGeneration = remoteContainerIngestGeneration(input.state);\n const shouldReplay =\n currentGeneration.lifecycle !== input.generation.lifecycle &&\n currentGeneration.structural === input.generation.structural;\n for (const [containerId, generation] of input.generationByContainerId) {\n if (!remoteContainerIngestGenerationsMatch(generation, input.generation)) {\n continue;\n }\n if (shouldReplay) {\n input.generationByContainerId.set(containerId, currentGeneration);\n } else {\n input.generationByContainerId.delete(containerId);\n input.queue.delete(containerId);\n }\n }\n}\n\ninterface RemoteContainerIngestor {\n (remoteContainer: RemoteContainer): Promise<void>;\n hasPending: () => boolean;\n resume: () => Promise<void>;\n}\n\nexport function createRemoteContainerIngestor(input: {\n getSerializationBarrier?: (() => Promise<void> | null) | undefined;\n host: RemoteContainerHydrationHost;\n state: RemoteContainerHydrationState;\n}): RemoteContainerIngestor {\n const { host, state } = input;\n const pendingRemoteContainersById: RemoteContainerIngestQueue = new Map();\n const generationByContainerId: RemoteContainerIngestGenerationMap = new Map();\n let ingestRemoteContainersPromise: Promise<void> | null = null;\n\n const runNextGeneration = (): Promise<void> => {\n if (ingestRemoteContainersPromise) {\n return ingestRemoteContainersPromise.then(\n runNextGeneration,\n runNextGeneration,\n );\n }\n if (\n state.runtime.infra.dbStatus !== undefined &&\n state.runtime.infra.dbStatus !== \"ready\"\n ) {\n return Promise.resolve();\n }\n const serializationBarrier = input.getSerializationBarrier?.();\n if (serializationBarrier) {\n return serializationBarrier.then(runNextGeneration);\n }\n const nextContainerId = pendingRemoteContainersById.keys().next().value;\n if (typeof nextContainerId !== \"string\") {\n return Promise.resolve();\n }\n const generation = generationByContainerId.get(nextContainerId);\n if (!generation) {\n pendingRemoteContainersById.delete(nextContainerId);\n return runNextGeneration();\n }\n const isCurrent = () =>\n isRemoteContainerIngestGenerationCurrent(state, generation);\n const guardedHost = createGenerationGuardedHydrationHost({\n host,\n isCurrent,\n });\n const nextPromise = Promise.resolve()\n .then(() =>\n drainRemoteContainerIngestQueue({\n generation,\n generationByContainerId,\n host: guardedHost,\n isCurrent,\n queue: pendingRemoteContainersById,\n state,\n }),\n )\n .then(() => {\n if (!isCurrent()) {\n settleStaleRemoteContainerIngestGeneration({\n generation,\n generationByContainerId,\n queue: pendingRemoteContainersById,\n state,\n });\n }\n })\n .catch((error: unknown) => {\n if (!isCurrent() || error instanceof StaleRemoteHydrationError) {\n settleStaleRemoteContainerIngestGeneration({\n generation,\n generationByContainerId,\n queue: pendingRemoteContainersById,\n state,\n });\n return;\n }\n throw error;\n })\n .finally(() => {\n if (ingestRemoteContainersPromise === nextPromise) {\n ingestRemoteContainersPromise = null;\n }\n });\n ingestRemoteContainersPromise = nextPromise;\n return nextPromise.then(() =>\n pendingRemoteContainersById.size > 0 ? runNextGeneration() : undefined,\n );\n };\n\n const ingestRemoteContainer = (remoteContainer: RemoteContainer) => {\n pendingRemoteContainersById.set(remoteContainer.id, remoteContainer);\n generationByContainerId.set(\n remoteContainer.id,\n remoteContainerIngestGeneration(state),\n );\n return runNextGeneration();\n };\n ingestRemoteContainer.hasPending = () => pendingRemoteContainersById.size > 0;\n ingestRemoteContainer.resume = runNextGeneration;\n return ingestRemoteContainer;\n}\n\nexport async function hydrateRemoteContainers(input: {\n followDiscoveredParentLanes?: boolean | undefined;\n host: RemoteContainerHydrationHost;\n isCurrent?: (() => boolean) | undefined;\n onFullyHydrated?: (() => Promise<void> | void) | undefined;\n parentIds?: ReadonlyArray<string | null> | undefined;\n resetAllLaneWatermarks?: boolean | undefined;\n resetRootLaneWatermark?: boolean | undefined;\n state: RemoteContainerHydrationState;\n}): Promise<number> {\n const { host, state } = input;\n if (!canHydrateRemoteContainers(state) || input.isCurrent?.() === false) {\n return 0;\n }\n\n const seenContainerIds = new Set<string>();\n const containerIdsBeforeHydration = new Set(state.containersById.keys());\n const childIdsByParentId = createContainerChildIndex(state.containersById);\n const { lanes, queueParentLane } = createContainerParentHydrationQueue({\n containerIds: state.containersById.keys(),\n parentIds: input.parentIds,\n resetAllLaneWatermarks: input.resetAllLaneWatermarks,\n resetRootLaneWatermark: input.resetRootLaneWatermark,\n });\n // Follow child lanes during an explicit recursive crawl or for containers first\n // discovered in this pass. The latter lets a newly authorized root populate its\n // descendants immediately, while routine ticks keep known subtrees cache-first.\n const queueDiscoveredParentLane: QueueContainerParentLane = (containerId) => {\n if (\n input.followDiscoveredParentLanes ||\n (containerId !== null && !containerIdsBeforeHydration.has(containerId))\n ) {\n queueParentLane(containerId);\n }\n };\n const result = await hydrateContainerParentLanes({\n childIdsByParentId,\n host,\n isCurrent: input.isCurrent,\n lanes,\n queueParentLane: queueDiscoveredParentLane,\n seenContainerIds,\n state,\n });\n const { changedCount } = result;\n await finishRemoteHydration({\n changedCount,\n complete:\n result.complete &&\n canHydrateRemoteContainers(state) &&\n input.isCurrent?.() !== false,\n containerIdsBeforeHydration,\n host,\n isCurrent: input.isCurrent,\n onFullyHydrated: input.onFullyHydrated,\n seenContainerIds,\n state,\n });\n return changedCount;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"staleRootRecovery.js","sourceRoot":"","sources":["staleRootRecovery.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContainerContentsPersistence } from \"./containerPersistence\";\nimport type { ContainerState } from \"./remoteHydration\";\nimport { hasRemoteContainerMetadataState } from \"./remoteHydration/reconciliation\";\nimport type {\n ContainerContentsRootAdopter,\n ContainerContentsWorkflowRuntime,\n} from \"./runtime\";\n\nexport type StaleRootRecoveryStatus =\n | \"already-adopted\"\n | \"ambiguous\"\n | \"context-changed\"\n | \"not-needed\"\n | \"reassigned\"\n | \"unsupported\";\n\ninterface StaleRootRecoveryResult {\n readonly candidateCount: number;\n readonly reassigned: boolean;\n readonly status: StaleRootRecoveryStatus;\n}\n\ninterface StaleRootRecoveryState {\n readonly containersById: ReadonlyMap<string, ContainerState>;\n readonly persistence: Pick<\n ContainerContentsPersistence,\n \"containerExists\" | \"reassignContainerDocuments\"\n >;\n readonly rootLaneHydrated: boolean;\n readonly runtime: {\n readonly adoptRootContainer?: ContainerContentsRootAdopter | undefined;\n readonly auth: Pick<\n ContainerContentsWorkflowRuntime[\"auth\"],\n | \"defaultOrganizationId\"\n | \"isAuthenticated\"\n | \"organizationId\"\n | \"userId\"\n | \"rootContainerId\"\n >;\n readonly infra: Pick<ContainerContentsWorkflowRuntime[\"infra\"], \"execSql\">;\n readonly state: Pick<\n ContainerContentsWorkflowRuntime[\"state\"],\n \"containerId\" | \"domainScope\"\n >;\n };\n}\n\nfunction hasSameRecoveryContext(\n state: StaleRootRecoveryState,\n input: {\n domainScope: ContainerContentsWorkflowRuntime[\"state\"][\"domainScope\"];\n defaultOrganizationId: string;\n organizationId: string;\n staleContainerId: string;\n rootContainerId: string | null | undefined;\n userId: string;\n },\n): boolean {\n return (\n state.runtime.auth.isAuthenticated &&\n state.runtime.auth.defaultOrganizationId === input.defaultOrganizationId &&\n state.runtime.auth.organizationId === input.organizationId &&\n state.runtime.auth.userId === input.userId &&\n state.runtime.auth.rootContainerId === input.rootContainerId &&\n state.runtime.state.containerId === input.staleContainerId &&\n state.runtime.state.domainScope === input.domainScope\n );\n}\n\nfunction listAuthoritativeRootCandidates(\n state: StaleRootRecoveryState,\n organizationId: string,\n): ContainerState[] {\n return Array.from(state.containersById.values()).filter(\n (containerState) =>\n containerState.container.id === state.runtime.auth.rootContainerId &&\n containerState.container.parentId === null &&\n containerState.container.organizationId === organizationId &&\n (containerState.container.systemSlot ?? null) === null &&\n containerState.container.effectiveAccessLevel === \"admin\" &&\n hasRemoteContainerMetadataState(containerState),\n );\n}\n\n/**\n * Repairs the root identity left by a cold-cache login.\n *\n * Root reconciliation can delete the device-first local root without updating\n * the session's default container. Documents created afterward are projected\n * beneath that deleted id, so startup priming detects their writes but cannot\n * route them. Recovery is intentionally narrow: the stale id must be absent\n * from both the loaded topology and durable storage, and the active\n * organization must contain the session-acknowledged root after the root lane\n * has hydrated and verified its signed destination role. This recovery path only repairs document\n * references; structural container descendants remain owned by normal root\n * reconciliation. Durable reassignment deliberately precedes live session\n * adoption so consumers never observe the new root before its documents move.\n * If the live-session guard rejects that adoption, the idempotent reassignment\n * remains applied and the sync lane is re-armed to retry under the next runtime\n * snapshot.\n */\nexport async function recoverStaleSessionRoot(\n state: StaleRootRecoveryState,\n isCurrent: () => boolean = () => true,\n): Promise<StaleRootRecoveryResult> {\n const staleContainerId = state.runtime.state.containerId;\n const domainScope = state.runtime.state.domainScope;\n const defaultOrganizationId = state.runtime.auth.defaultOrganizationId;\n const organizationId = state.runtime.auth.organizationId;\n const userId = state.runtime.auth.userId;\n if (\n !isCurrent() ||\n !state.runtime.auth.isAuthenticated ||\n !staleContainerId ||\n !defaultOrganizationId ||\n !organizationId ||\n !userId ||\n organizationId !== defaultOrganizationId ||\n !state.rootLaneHydrated ||\n state.containersById.has(staleContainerId)\n ) {\n return { candidateCount: 0, reassigned: false, status: \"not-needed\" };\n }\n const recoveryContext = {\n domainScope,\n defaultOrganizationId,\n organizationId,\n staleContainerId,\n userId,\n rootContainerId: state.runtime.auth.rootContainerId,\n };\n\n const storedContainerExists = await state.persistence.containerExists(\n state.runtime.infra.execSql,\n staleContainerId,\n );\n if (storedContainerExists) {\n return { candidateCount: 0, reassigned: false, status: \"not-needed\" };\n }\n if (!isCurrent() || !hasSameRecoveryContext(state, recoveryContext)) {\n return { candidateCount: 0, reassigned: false, status: \"context-changed\" };\n }\n if (state.containersById.has(staleContainerId)) {\n return { candidateCount: 0, reassigned: false, status: \"not-needed\" };\n }\n\n const candidates = listAuthoritativeRootCandidates(\n state,\n defaultOrganizationId,\n );\n const [remoteRootState] = candidates;\n if (!remoteRootState || candidates.length > 1) {\n return {\n candidateCount: candidates.length,\n reassigned: false,\n status: \"ambiguous\",\n };\n }\n if (!state.runtime.adoptRootContainer) {\n return { candidateCount: 1, reassigned: false, status: \"unsupported\" };\n }\n if (!isCurrent() || !hasSameRecoveryContext(state, recoveryContext)) {\n return { candidateCount: 0, reassigned: false, status: \"context-changed\" };\n }\n\n await state.persistence.reassignContainerDocuments(\n state.runtime.infra.execSql,\n {\n fromContainerId: staleContainerId,\n stillCurrent: isCurrent,\n toContainerId: remoteRootState.container.id,\n },\n );\n if (!isCurrent() || !hasSameRecoveryContext(state, recoveryContext)) {\n return { candidateCount: 1, reassigned: false, status: \"context-changed\" };\n }\n const adoptionResult = state.runtime.adoptRootContainer({\n domainScope,\n expectedContainerId: staleContainerId,\n nextContainerId: remoteRootState.container.id,\n organizationId,\n userId,\n });\n\n return {\n candidateCount: 1,\n reassigned: true,\n status:\n adoptionResult === \"already-adopted\"\n ? \"already-adopted\"\n : adoptionResult\n ? \"reassigned\"\n : \"context-changed\",\n };\n}\n"]}