@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.
- package/client/containerContents/documentDiscovery.js +5 -5
- package/client/containerContents/documentDiscovery.js.map +1 -1
- package/client/containerContents/index.d.ts +7 -7
- package/client/containerContents/index.js +7 -7
- package/client/containerContents/index.js.map +1 -1
- package/client/containerContents/types.d.ts +6 -6
- package/client/containerContents/types.js.map +1 -1
- package/client/deviceFirst/index.js +2 -2
- package/client/deviceFirst/index.js.map +1 -1
- package/package.json +1 -1
- package/stores/container-contents/containerStatePersistence.js +1 -1
- package/stores/container-contents/documentRecovery.js +2 -2
- package/stores/container-contents/documentRecovery.js.map +1 -1
- package/stores/container-contents/documentWork.js.map +1 -1
- package/stores/container-contents/localRefresh.js +2 -2
- package/stores/container-contents/localRefresh.js.map +1 -1
- package/stores/container-contents/operations.js +2 -2
- package/stores/container-contents/operations.js.map +1 -1
- package/stores/container-contents/remoteContainerIngestion.js +1 -1
- package/stores/container-contents/remoteEventSync.js +1 -1
- package/stores/container-contents/remoteHydrationRequest.js +1 -1
- package/stores/container-contents/setContainerIconOperation.js +2 -2
- package/stores/container-contents/setContainerIconOperation.js.map +1 -1
- package/stores/container-contents/shareOperations.js +1 -1
- package/stores/container-contents/startupHydration.js +1 -1
- package/stores/container-contents/syncAgent.d.ts +2 -2
- package/stores/container-contents/syncAgentTypes.d.ts +1 -1
- package/stores/container-contents/syncLaneIteration.js +2 -2
- package/stores/container-contents/syncLaneIteration.js.map +1 -1
- package/stores/container-contents/systemContainerIcon.js +1 -1
- package/stores/container-contents/systemContainerIcon.js.map +1 -1
- package/workflows/container-contents/{documentAttributionRanges.d.ts → attribution/documentAttributionRanges.d.ts} +1 -1
- package/workflows/container-contents/{documentCharacterBlame.js → attribution/documentCharacterBlame.js} +3 -3
- package/workflows/container-contents/attribution/documentCharacterBlame.js.map +1 -0
- package/workflows/container-contents/{documentFieldBlame.js → attribution/documentFieldBlame.js} +4 -4
- package/workflows/container-contents/attribution/documentFieldBlame.js.map +1 -0
- package/workflows/container-contents/container-state/createIntentSync.js +1 -1
- package/workflows/container-contents/container-state/createIntentSync.js.map +1 -1
- package/workflows/container-contents/container-state/moveIntentSync.js +1 -1
- package/workflows/container-contents/container-state/moveIntentSync.js.map +1 -1
- package/workflows/container-contents/container-state/purgeTree.js +2 -2
- package/workflows/container-contents/container-state/purgeTree.js.map +1 -1
- package/workflows/container-contents/container-state/sharePersistence.js +2 -2
- package/workflows/container-contents/container-state/sharePersistence.js.map +1 -1
- package/workflows/container-contents/{containerDocumentListing.js → documentDiscovery/containerDocumentListing.js} +1 -1
- package/workflows/container-contents/{documentDiscoveryApply.js → documentDiscovery/documentDiscoveryApply.js} +3 -3
- package/workflows/container-contents/documentDiscovery/documentDiscoveryApply.js.map +1 -0
- package/workflows/container-contents/{documentDiscoveryCandidates.js.map → documentDiscovery/documentDiscoveryCandidates.js.map} +1 -1
- package/workflows/container-contents/{documentDiscoveryEvidence.js → documentDiscovery/documentDiscoveryEvidence.js} +1 -1
- package/workflows/container-contents/documentDiscovery/documentDiscoveryEvidence.js.map +1 -0
- package/workflows/container-contents/{documentDiscoveryInputs.js → documentDiscovery/documentDiscoveryInputs.js} +2 -2
- package/workflows/container-contents/documentDiscovery/documentDiscoveryInputs.js.map +1 -0
- package/workflows/container-contents/documentDiscovery/documentDiscoveryLanes.js.map +1 -0
- package/workflows/container-contents/{documentDiscoveryTypes.d.ts → documentDiscovery/documentDiscoveryTypes.d.ts} +4 -4
- package/workflows/container-contents/documentDiscovery/documentDiscoveryTypes.js.map +1 -0
- package/workflows/container-contents/{documentDiscovery.d.ts → documentDiscovery/index.d.ts} +1 -1
- package/workflows/container-contents/{documentDiscovery.js → documentDiscovery/index.js} +5 -5
- package/workflows/container-contents/documentDiscovery/index.js.map +1 -0
- package/workflows/container-contents/{availableDocumentLinkIntent.js → documentLinks/availableDocumentLinkIntent.js} +1 -1
- package/workflows/container-contents/documentLinks/availableDocumentLinkIntent.js.map +1 -0
- package/workflows/container-contents/{deferredDocumentLinks.js → documentLinks/deferredDocumentLinks.js} +1 -1
- package/workflows/container-contents/documentLinks/deferredDocumentLinks.js.map +1 -0
- package/workflows/container-contents/{documentLinkIntent.js → documentLinks/documentLinkIntent.js} +4 -4
- package/workflows/container-contents/documentLinks/documentLinkIntent.js.map +1 -0
- package/workflows/container-contents/documentLinks/documentLocalRelink.js.map +1 -0
- package/workflows/container-contents/{documentLinks.d.ts → documentLinks/index.d.ts} +5 -5
- package/workflows/container-contents/{documentLinks.js → documentLinks/index.js} +10 -10
- package/workflows/container-contents/documentLinks/index.js.map +1 -0
- package/workflows/container-contents/documentMove/documentMoveDeniedReplay.js.map +1 -0
- package/workflows/container-contents/{documentMoveFailure.js → documentMove/documentMoveFailure.js} +1 -1
- package/workflows/container-contents/documentMove/documentMoveFailure.js.map +1 -0
- package/workflows/container-contents/{documentMoveIntent.js → documentMove/documentMoveIntent.js} +7 -7
- package/workflows/container-contents/documentMove/documentMoveIntent.js.map +1 -0
- package/workflows/container-contents/{documentMoveIntentErrors.js → documentMove/documentMoveIntentErrors.js} +1 -1
- package/workflows/container-contents/documentMove/documentMoveIntentErrors.js.map +1 -0
- package/workflows/container-contents/{documentMoveIntentSettlement.js → documentMove/documentMoveIntentSettlement.js} +4 -4
- package/workflows/container-contents/documentMove/documentMoveIntentSettlement.js.map +1 -0
- package/workflows/container-contents/{documentMoveIntentSync.js → documentMove/documentMoveIntentSync.js} +7 -7
- package/workflows/container-contents/documentMove/documentMoveIntentSync.js.map +1 -0
- package/workflows/container-contents/{documentMoveVanishedRefresh.js → documentMove/documentMoveVanishedRefresh.js} +3 -3
- package/workflows/container-contents/documentMove/documentMoveVanishedRefresh.js.map +1 -0
- package/workflows/container-contents/{documentHydrationProbe.js → documentPriming/documentHydrationProbe.js} +4 -4
- package/workflows/container-contents/documentPriming/documentHydrationProbe.js.map +1 -0
- package/workflows/container-contents/documentPriming/documentRuntimeTargetSync.js.map +1 -0
- package/workflows/container-contents/{documentPriming.js → documentPriming/index.js} +5 -5
- package/workflows/container-contents/documentPriming/index.js.map +1 -0
- package/workflows/container-contents/{documentStructure.d.ts → documentQueries/documentStructure.d.ts} +1 -1
- package/workflows/container-contents/{documentStructure.js → documentQueries/documentStructure.js} +4 -4
- package/workflows/container-contents/documentQueries/documentStructure.js.map +1 -0
- package/workflows/container-contents/{documentStructureTypes.d.ts → documentQueries/documentStructureTypes.d.ts} +4 -4
- package/workflows/container-contents/documentQueries/documentStructureTypes.js.map +1 -0
- package/workflows/container-contents/{documentSubtreeQueries.js → documentQueries/documentSubtreeQueries.js} +5 -5
- package/workflows/container-contents/documentQueries/documentSubtreeQueries.js.map +1 -0
- package/workflows/container-contents/{documentQueries.d.ts → documentQueries/index.d.ts} +8 -8
- package/workflows/container-contents/{documentQueries.js → documentQueries/index.js} +13 -13
- package/workflows/container-contents/documentQueries/index.js.map +1 -0
- package/workflows/container-contents/{orphanedDocumentSql.js → documentQueries/orphanedDocumentSql.js} +1 -1
- package/workflows/container-contents/documentQueries/orphanedDocumentSql.js.map +1 -0
- package/workflows/container-contents/{pendingDownloads.d.ts → documentQueries/pendingDownloads.d.ts} +1 -1
- package/workflows/container-contents/{pendingDownloads.js → documentQueries/pendingDownloads.js} +3 -3
- package/workflows/container-contents/documentQueries/pendingDownloads.js.map +1 -0
- package/workflows/container-contents/documentQueries/sql.js +1 -1
- package/workflows/container-contents/documentQueries/sql.js.map +1 -1
- package/workflows/container-contents/index.d.ts +13 -13
- package/workflows/container-contents/index.js +11 -11
- package/workflows/container-contents/index.js.map +1 -1
- package/workflows/container-contents/{blobInfo.d.ts → info/blobInfo.d.ts} +1 -1
- package/workflows/container-contents/{blobInfo.js → info/blobInfo.js} +4 -4
- package/workflows/container-contents/info/blobInfo.js.map +1 -0
- package/workflows/container-contents/{blobInfoTypes.d.ts → info/blobInfoTypes.d.ts} +1 -1
- package/workflows/container-contents/info/blobInfoTypes.js.map +1 -0
- package/workflows/container-contents/{containerInfo.d.ts → info/containerInfo.d.ts} +4 -4
- package/workflows/container-contents/{containerInfo.js → info/containerInfo.js} +5 -5
- package/workflows/container-contents/info/containerInfo.js.map +1 -0
- package/workflows/container-contents/{documentInfo.d.ts → info/documentInfo.d.ts} +3 -3
- package/workflows/container-contents/{documentInfo.js → info/documentInfo.js} +11 -11
- package/workflows/container-contents/info/documentInfo.js.map +1 -0
- package/workflows/container-contents/{documentInfoTypes.d.ts → info/documentInfoTypes.d.ts} +3 -3
- package/workflows/container-contents/info/documentInfoTypes.js.map +1 -0
- package/workflows/container-contents/{metadata.d.ts → metadata/index.d.ts} +2 -2
- package/workflows/container-contents/{metadata.js → metadata/index.js} +5 -5
- package/workflows/container-contents/metadata/index.js.map +1 -0
- package/workflows/container-contents/{metadataEvents.d.ts → metadata/metadataEvents.d.ts} +1 -1
- package/workflows/container-contents/{metadataEvents.js → metadata/metadataEvents.js} +1 -1
- package/workflows/container-contents/metadata/metadataEvents.js.map +1 -0
- package/workflows/container-contents/{metadataIncomingUpdateIsolation.js → metadata/metadataIncomingUpdateIsolation.js} +5 -5
- package/workflows/container-contents/metadata/metadataIncomingUpdateIsolation.js.map +1 -0
- package/workflows/container-contents/{metadataMutationPreparation.d.ts → metadata/metadataMutationPreparation.d.ts} +7 -7
- package/workflows/container-contents/{metadataMutationPreparation.js → metadata/metadataMutationPreparation.js} +5 -5
- package/workflows/container-contents/metadata/metadataMutationPreparation.js.map +1 -0
- package/workflows/container-contents/{metadataPersistence.d.ts → metadata/metadataPersistence.d.ts} +2 -2
- package/workflows/container-contents/{metadataPersistence.js → metadata/metadataPersistence.js} +4 -4
- package/workflows/container-contents/metadata/metadataPersistence.js.map +1 -0
- package/workflows/container-contents/{metadataPullContinuationInvalidation.js → metadata/metadataPullContinuationInvalidation.js} +4 -4
- package/workflows/container-contents/metadata/metadataPullContinuationInvalidation.js.map +1 -0
- package/workflows/container-contents/{metadataReadState.d.ts → metadata/metadataReadState.d.ts} +1 -1
- package/workflows/container-contents/metadata/metadataReadState.js.map +1 -0
- package/workflows/container-contents/{metadataRecord.js → metadata/metadataRecord.js} +2 -2
- package/workflows/container-contents/metadata/metadataRecord.js.map +1 -0
- package/workflows/container-contents/{metadataRemoteSync.d.ts → metadata/metadataRemoteSync.d.ts} +5 -5
- package/workflows/container-contents/{metadataRemoteSync.js → metadata/metadataRemoteSync.js} +3 -3
- package/workflows/container-contents/metadata/metadataRemoteSync.js.map +1 -0
- package/workflows/container-contents/{metadataStateInstallation.d.ts → metadata/metadataStateInstallation.d.ts} +1 -1
- package/workflows/container-contents/metadata/metadataStateInstallation.js.map +1 -0
- package/workflows/container-contents/{metadataStateIsolation.js → metadata/metadataStateIsolation.js} +3 -3
- package/workflows/container-contents/metadata/metadataStateIsolation.js.map +1 -0
- package/workflows/container-contents/{metadataSyncErrors.js → metadata/metadataSyncErrors.js} +3 -3
- package/workflows/container-contents/metadata/metadataSyncErrors.js.map +1 -0
- package/workflows/container-contents/{metadataSyncSettlement.d.ts → metadata/metadataSyncSettlement.d.ts} +2 -2
- package/workflows/container-contents/{metadataSyncSettlement.js → metadata/metadataSyncSettlement.js} +3 -3
- package/workflows/container-contents/metadata/metadataSyncSettlement.js.map +1 -0
- package/workflows/container-contents/{metadataTypes.d.ts → metadata/metadataTypes.d.ts} +5 -5
- package/workflows/container-contents/metadata/metadataTypes.js.map +1 -0
- package/workflows/container-contents/pendingWrites/aggregation.js.map +1 -1
- package/workflows/container-contents/pendingWrites/deferredTails.js.map +1 -1
- package/workflows/container-contents/{pendingWrites.d.ts → pendingWrites/index.d.ts} +1 -1
- package/workflows/container-contents/{pendingWrites.js → pendingWrites/index.js} +12 -12
- package/workflows/container-contents/pendingWrites/index.js.map +1 -0
- package/workflows/container-contents/projectionGeneration.js.map +1 -1
- package/workflows/container-contents/projectionView.js +1 -1
- package/workflows/container-contents/projectionView.js.map +1 -1
- package/workflows/container-contents/{folderRecovery.d.ts → recovery/folderRecovery.d.ts} +1 -1
- package/workflows/container-contents/{folderRecovery.js → recovery/folderRecovery.js} +4 -4
- package/workflows/container-contents/recovery/folderRecovery.js.map +1 -0
- package/workflows/container-contents/{staleRootRecovery.js → recovery/staleRootRecovery.js} +1 -1
- package/workflows/container-contents/recovery/staleRootRecovery.js.map +1 -0
- package/workflows/container-contents/remoteHydration/completeHydration.js +1 -1
- package/workflows/container-contents/remoteHydration/completeHydration.js.map +1 -1
- package/workflows/container-contents/remoteHydration/heldContainerRebind.js +1 -1
- package/workflows/container-contents/remoteHydration/heldContainerRebind.js.map +1 -1
- package/workflows/container-contents/{remoteHydration.d.ts → remoteHydration/index.d.ts} +2 -2
- package/workflows/container-contents/{remoteHydration.js → remoteHydration/index.js} +6 -6
- package/workflows/container-contents/remoteHydration/index.js.map +1 -0
- package/workflows/container-contents/{remoteContainerPageHydration.js → remoteHydration/remoteContainerPageHydration.js} +8 -8
- package/workflows/container-contents/remoteHydration/remoteContainerPageHydration.js.map +1 -0
- package/workflows/container-contents/{remoteContainerState.js → remoteHydration/remoteContainerState.js} +11 -11
- package/workflows/container-contents/remoteHydration/remoteContainerState.js.map +1 -0
- package/workflows/container-contents/remoteHydration/types.d.ts +1 -1
- package/workflows/container-contents/{documentPurge.d.ts → tombstones/documentPurge.d.ts} +6 -6
- package/workflows/container-contents/{documentPurge.js → tombstones/documentPurge.js} +6 -6
- package/workflows/container-contents/tombstones/documentPurge.js.map +1 -0
- package/workflows/container-contents/{documentTombstoneEvidence.js → tombstones/documentTombstoneEvidence.js} +9 -9
- package/workflows/container-contents/tombstones/documentTombstoneEvidence.js.map +1 -0
- package/workflows/container-contents/{documentTombstoneGate.js → tombstones/documentTombstoneGate.js} +1 -1
- package/workflows/container-contents/tombstones/documentTombstoneGate.js.map +1 -0
- package/workflows/container-contents/availableDocumentLinkIntent.js.map +0 -1
- package/workflows/container-contents/blobInfo.js.map +0 -1
- package/workflows/container-contents/blobInfoTypes.js.map +0 -1
- package/workflows/container-contents/containerInfo.js.map +0 -1
- package/workflows/container-contents/deferredDocumentLinks.js.map +0 -1
- package/workflows/container-contents/documentCharacterBlame.js.map +0 -1
- package/workflows/container-contents/documentDiscovery.js.map +0 -1
- package/workflows/container-contents/documentDiscoveryApply.js.map +0 -1
- package/workflows/container-contents/documentDiscoveryEvidence.js.map +0 -1
- package/workflows/container-contents/documentDiscoveryInputs.js.map +0 -1
- package/workflows/container-contents/documentDiscoveryLanes.js.map +0 -1
- package/workflows/container-contents/documentDiscoveryTypes.js.map +0 -1
- package/workflows/container-contents/documentFieldBlame.js.map +0 -1
- package/workflows/container-contents/documentHydrationProbe.js.map +0 -1
- package/workflows/container-contents/documentInfo.js.map +0 -1
- package/workflows/container-contents/documentInfoTypes.js.map +0 -1
- package/workflows/container-contents/documentLinkIntent.js.map +0 -1
- package/workflows/container-contents/documentLinks.js.map +0 -1
- package/workflows/container-contents/documentLocalRelink.js.map +0 -1
- package/workflows/container-contents/documentMoveDeniedReplay.js.map +0 -1
- package/workflows/container-contents/documentMoveFailure.js.map +0 -1
- package/workflows/container-contents/documentMoveIntent.js.map +0 -1
- package/workflows/container-contents/documentMoveIntentErrors.js.map +0 -1
- package/workflows/container-contents/documentMoveIntentSettlement.js.map +0 -1
- package/workflows/container-contents/documentMoveIntentSync.js.map +0 -1
- package/workflows/container-contents/documentMoveVanishedRefresh.js.map +0 -1
- package/workflows/container-contents/documentPriming.js.map +0 -1
- package/workflows/container-contents/documentPurge.js.map +0 -1
- package/workflows/container-contents/documentQueries.js.map +0 -1
- package/workflows/container-contents/documentRuntimeTargetSync.js.map +0 -1
- package/workflows/container-contents/documentStructure.js.map +0 -1
- package/workflows/container-contents/documentStructureTypes.js.map +0 -1
- package/workflows/container-contents/documentSubtreeQueries.js.map +0 -1
- package/workflows/container-contents/documentTombstoneEvidence.js.map +0 -1
- package/workflows/container-contents/documentTombstoneGate.js.map +0 -1
- package/workflows/container-contents/folderRecovery.js.map +0 -1
- package/workflows/container-contents/metadata.js.map +0 -1
- package/workflows/container-contents/metadataEvents.js.map +0 -1
- package/workflows/container-contents/metadataIncomingUpdateIsolation.js.map +0 -1
- package/workflows/container-contents/metadataMutationPreparation.js.map +0 -1
- package/workflows/container-contents/metadataPersistence.js.map +0 -1
- package/workflows/container-contents/metadataPullContinuationInvalidation.js.map +0 -1
- package/workflows/container-contents/metadataReadState.js.map +0 -1
- package/workflows/container-contents/metadataRecord.js.map +0 -1
- package/workflows/container-contents/metadataRemoteSync.js.map +0 -1
- package/workflows/container-contents/metadataStateInstallation.js.map +0 -1
- package/workflows/container-contents/metadataStateIsolation.js.map +0 -1
- package/workflows/container-contents/metadataSyncErrors.js.map +0 -1
- package/workflows/container-contents/metadataSyncSettlement.js.map +0 -1
- package/workflows/container-contents/metadataTypes.js.map +0 -1
- package/workflows/container-contents/orphanedDocumentSql.js.map +0 -1
- package/workflows/container-contents/pendingDownloads.js.map +0 -1
- package/workflows/container-contents/pendingWrites.js.map +0 -1
- package/workflows/container-contents/remoteContainerPageHydration.js.map +0 -1
- package/workflows/container-contents/remoteContainerState.js.map +0 -1
- package/workflows/container-contents/remoteHydration.js.map +0 -1
- package/workflows/container-contents/staleRootRecovery.js.map +0 -1
- /package/workflows/container-contents/{documentAttributionRanges.js → attribution/documentAttributionRanges.js} +0 -0
- /package/workflows/container-contents/{documentAttributionRanges.js.map → attribution/documentAttributionRanges.js.map} +0 -0
- /package/workflows/container-contents/{containerDocumentListing.js.map → documentDiscovery/containerDocumentListing.js.map} +0 -0
- /package/workflows/container-contents/{documentDiscoveryCandidates.js → documentDiscovery/documentDiscoveryCandidates.js} +0 -0
- /package/workflows/container-contents/{documentDiscoveryLanes.js → documentDiscovery/documentDiscoveryLanes.js} +0 -0
- /package/workflows/container-contents/{documentDiscoveryTypes.js → documentDiscovery/documentDiscoveryTypes.js} +0 -0
- /package/workflows/container-contents/{documentHeadScope.js → documentDiscovery/documentHeadScope.js} +0 -0
- /package/workflows/container-contents/{documentHeadScope.js.map → documentDiscovery/documentHeadScope.js.map} +0 -0
- /package/workflows/container-contents/{documentLocalRelink.js → documentLinks/documentLocalRelink.js} +0 -0
- /package/workflows/container-contents/{documentMoveDeniedReplay.js → documentMove/documentMoveDeniedReplay.js} +0 -0
- /package/workflows/container-contents/{documentMoveUnlinkIds.js → documentMove/documentMoveUnlinkIds.js} +0 -0
- /package/workflows/container-contents/{documentMoveUnlinkIds.js.map → documentMove/documentMoveUnlinkIds.js.map} +0 -0
- /package/workflows/container-contents/{documentRuntimeTargetSync.js → documentPriming/documentRuntimeTargetSync.js} +0 -0
- /package/workflows/container-contents/{documentStructureTypes.js → documentQueries/documentStructureTypes.js} +0 -0
- /package/workflows/container-contents/{blobInfoRows.js → info/blobInfoRows.js} +0 -0
- /package/workflows/container-contents/{blobInfoRows.js.map → info/blobInfoRows.js.map} +0 -0
- /package/workflows/container-contents/{blobInfoTypes.js → info/blobInfoTypes.js} +0 -0
- /package/workflows/container-contents/{documentInfoTypes.js → info/documentInfoTypes.js} +0 -0
- /package/workflows/container-contents/{metadataReadState.js → metadata/metadataReadState.js} +0 -0
- /package/workflows/container-contents/{metadataStateInstallation.js → metadata/metadataStateInstallation.js} +0 -0
- /package/workflows/container-contents/{metadataSyncFollowup.js → metadata/metadataSyncFollowup.js} +0 -0
- /package/workflows/container-contents/{metadataSyncFollowup.js.map → metadata/metadataSyncFollowup.js.map} +0 -0
- /package/workflows/container-contents/{metadataSyncRegistrations.d.ts → metadata/metadataSyncRegistrations.d.ts} +0 -0
- /package/workflows/container-contents/{metadataSyncRegistrations.js → metadata/metadataSyncRegistrations.js} +0 -0
- /package/workflows/container-contents/{metadataSyncRegistrations.js.map → metadata/metadataSyncRegistrations.js.map} +0 -0
- /package/workflows/container-contents/{metadataTypes.js → metadata/metadataTypes.js} +0 -0
- /package/workflows/container-contents/{pendingWritesTypes.d.ts → pendingWrites/pendingWritesTypes.d.ts} +0 -0
- /package/workflows/container-contents/{pendingWritesTypes.js → pendingWrites/pendingWritesTypes.js} +0 -0
- /package/workflows/container-contents/{pendingWritesTypes.js.map → pendingWrites/pendingWritesTypes.js.map} +0 -0
- /package/workflows/container-contents/{remoteHydrationLog.js → remoteHydration/remoteHydrationLog.js} +0 -0
- /package/workflows/container-contents/{remoteHydrationLog.js.map → remoteHydration/remoteHydrationLog.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localRefresh.js","sourceRoot":"","sources":["localRefresh.ts"],"names":[],"mappings":"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","sourcesContent":["import { encodeVersionVector } from \"@tearleads/loro\";\nimport { errorMessage } from \"../../data/shared/errorMessage\";\nimport type { ContainerContentsPersistence } from \"../../workflows/container-contents/containerPersistence\";\nimport { loadLocalContainerStates } from \"../../workflows/container-contents/localState\";\nimport { installContainerMetadataRecord } from \"../../workflows/container-contents/metadata\";\nimport { currentMetadataPullContinuation } from \"../../workflows/container-contents/metadataPersistence\";\nimport type { ContainerState } from \"../../workflows/container-contents/remoteHydration\";\nimport { reconcileLocalOnlyRootContainers } from \"../../workflows/container-contents/remoteHydration/reconciliation\";\nimport type { ContainerContentsWorkflowRuntime } from \"../../workflows/container-contents/runtime\";\nimport { isDatabaseUnavailableError } from \"../../workflows/container-contents/syncLane\";\nimport {\n captureContainerStateMutationGenerations,\n containerStateMutatedAfter,\n} from \"./containerStateMap\";\nimport { isRemoteBackedContainerState } from \"./remoteBackedContainerState\";\n\ninterface LocalContainerRefreshHost {\n updateSnapshot: () => void;\n}\n\nexport interface LocalContainerRefreshState {\n containersById: Map<string, ContainerState>;\n documentStoresNeedPriming: boolean;\n initialized: boolean;\n lifecycleGeneration: number;\n localContainerRefreshGeneration: number | null;\n localContainerRefreshPromise: Promise<void> | null;\n localContainerRefreshStructuralGeneration: number | null;\n localContainersNeedRefresh: boolean;\n persistence: ContainerContentsPersistence;\n runtime: ContainerContentsWorkflowRuntime;\n structuralGeneration: number;\n}\n\ninterface LocalContainerRefreshBaseline {\n container: ContainerState[\"container\"];\n docVersion: string | null;\n pullContinuation: ReturnType<typeof currentMetadataPullContinuation>;\n record: ContainerState[\"record\"];\n}\n\nfunction readMetadataDocVersion(state: ContainerState): string | null {\n try {\n return encodeVersionVector(state.doc);\n } catch {\n return null;\n }\n}\n\nfunction captureLocalContainerRefreshBaselines(\n states: ReadonlyMap<string, ContainerState>,\n): ReadonlyMap<string, LocalContainerRefreshBaseline> {\n return new Map(\n Array.from(states, ([containerId, state]) => [\n containerId,\n {\n container: state.container,\n docVersion: readMetadataDocVersion(state),\n pullContinuation: currentMetadataPullContinuation(state),\n record: state.record,\n },\n ]),\n );\n}\n\nfunction liveContainerStateChangedAfterRefreshStarted(\n state: ContainerState,\n baseline: LocalContainerRefreshBaseline | undefined,\n): boolean {\n // No baseline means this live state was inserted after the refresh began.\n // The loaded snapshot cannot authoritatively replace a state that did not\n // exist when its query started.\n return (\n baseline === undefined ||\n state.container !== baseline.container ||\n state.record !== baseline.record ||\n currentMetadataPullContinuation(state) !== baseline.pullContinuation ||\n readMetadataDocVersion(state) !== baseline.docVersion\n );\n}\n\nfunction mergeLocalContainerStates(input: {\n containerMutationGenerations: ReadonlyMap<string, number>;\n liveStateBaselines: ReadonlyMap<string, LocalContainerRefreshBaseline>;\n localContainerStates: ReadonlyArray<ContainerState>;\n remoteContainerIdsAtLoadStart: ReadonlySet<string>;\n state: LocalContainerRefreshState;\n}): void {\n for (const localContainerState of input.localContainerStates) {\n const containerId = localContainerState.container.id;\n if (\n containerStateMutatedAfter(\n input.state.containersById,\n containerId,\n input.containerMutationGenerations,\n )\n ) {\n continue;\n }\n const existingState = input.state.containersById.get(containerId);\n if (existingState) {\n if (\n liveContainerStateChangedAfterRefreshStarted(\n existingState,\n input.liveStateBaselines.get(containerId),\n )\n ) {\n continue;\n }\n // The load can start before a remote create and finish after it. Its\n // local-only snapshot must not erase the remote identity that the create\n // persisted in the meantime, or the pending create intent is re-queued.\n if (\n !input.remoteContainerIdsAtLoadStart.has(containerId) &&\n existingState.record.documentId &&\n !localContainerState.record.documentId\n ) {\n continue;\n }\n existingState.container = localContainerState.container;\n existingState.doc = localContainerState.doc;\n installContainerMetadataRecord(existingState, localContainerState.record);\n } else if (!input.liveStateBaselines.has(containerId)) {\n // A baseline without a live entry means the state was removed while the\n // load was pending. Do not resurrect that stale snapshot.\n input.state.containersById.set(containerId, localContainerState);\n }\n }\n}\n\nfunction isRemoteBackedRootState(containerState: ContainerState): boolean {\n return (\n containerState.container.parentId === null &&\n isRemoteBackedContainerState(containerState)\n );\n}\n\nasync function reconcileLocalsLoadedAfterRemoteState(\n state: LocalContainerRefreshState,\n isCurrent: () => boolean,\n): Promise<void> {\n const remoteRootStates = Array.from(state.containersById.values()).filter(\n isRemoteBackedRootState,\n );\n for (const remoteRootState of remoteRootStates) {\n if (!isCurrent()) {\n return;\n }\n await reconcileLocalOnlyRootContainers({\n isCurrent,\n remoteRootState,\n state,\n });\n }\n}\n\n/**\n * Hand the tree-rebuild failure to host diagnostics as a real `Error`: the\n * unguarded metadata import inside `loadLocalContainerStates` lands corrupt\n * persisted state here, which the string-only log line cannot carry. That line\n * is the fallback for a host without `logError`, so there is no second copy.\n */\nfunction reportLocalContainerRefreshFailure(\n util: ContainerContentsWorkflowRuntime[\"util\"],\n error: unknown,\n): void {\n // Losing the database mid-flight is the teardown outcome the re-armed refresh\n // already covers, not a defect.\n if (!util.logError || isDatabaseUnavailableError(error)) return;\n try {\n // Callers run `void refreshLocalContainers()`, so a host logger that throws\n // or rejects must not escape as an unhandled rejection carrying app frames.\n void Promise.resolve(\n util.logError(\n \"Container contents: local container refresh failed\",\n error,\n ),\n ).catch(() => undefined);\n } catch {\n // Hosts may throw synchronously or return a rejected promise.\n }\n}\n\nexport function refreshLocalContainerStates(input: {\n host: LocalContainerRefreshHost;\n state: LocalContainerRefreshState;\n}): Promise<void> {\n const { host, state } = input;\n if (state.localContainerRefreshPromise) {\n const activeRefresh = state.localContainerRefreshPromise;\n if (\n state.localContainerRefreshGeneration === state.lifecycleGeneration &&\n state.localContainerRefreshStructuralGeneration ===\n state.structuralGeneration\n ) {\n return activeRefresh;\n }\n // A stale refresh owns its replacement retry in `finally`, so callers can\n // share that promise without scheduling a second replacement load.\n return activeRefresh;\n }\n\n if (\n !state.localContainersNeedRefresh ||\n !state.initialized ||\n state.runtime.infra.dbStatus !== \"ready\"\n ) {\n return Promise.resolve();\n }\n\n const lifecycleGeneration = state.lifecycleGeneration;\n const structuralGeneration = state.structuralGeneration;\n const isCurrent = () =>\n state.lifecycleGeneration === lifecycleGeneration &&\n state.structuralGeneration === structuralGeneration;\n state.localContainersNeedRefresh = false;\n const liveStateBaselines = captureLocalContainerRefreshBaselines(\n state.containersById,\n );\n const containerMutationGenerations = captureContainerStateMutationGenerations(\n state.containersById,\n );\n const remoteContainerIdsAtLoadStart = new Set<string>();\n for (const containerState of state.containersById.values()) {\n if (containerState.record.documentId) {\n remoteContainerIdsAtLoadStart.add(containerState.container.id);\n }\n }\n state.localContainerRefreshGeneration = lifecycleGeneration;\n state.localContainerRefreshStructuralGeneration = structuralGeneration;\n const refreshPromise = loadLocalContainerStates({\n persistence: state.persistence,\n runtime: state.runtime,\n })\n .then(async (localContainerStates) => {\n if (!isCurrent()) {\n return;\n }\n mergeLocalContainerStates({\n containerMutationGenerations,\n liveStateBaselines,\n localContainerStates,\n remoteContainerIdsAtLoadStart,\n state,\n });\n // Remote hydration can win the startup race and ingest the server root\n // before this local read returns. Re-run root/system convergence after\n // merging so that the late local bootstrap rows cannot reintroduce a\n // stale root and same-slot system children into the live tree.\n await reconcileLocalsLoadedAfterRemoteState(state, isCurrent);\n if (!isCurrent()) {\n return;\n }\n state.documentStoresNeedPriming = true;\n host.updateSnapshot();\n })\n .catch((error: unknown) => {\n if (!isCurrent()) {\n return;\n }\n state.localContainersNeedRefresh = true;\n state.runtime.util.log(\n `Failed to refresh local container states: ${errorMessage(error)}`,\n );\n reportLocalContainerRefreshFailure(state.runtime.util, error);\n })\n .finally(() => {\n const shouldRetryAfterReplacement = !isCurrent();\n if (state.localContainerRefreshPromise === refreshPromise) {\n state.localContainerRefreshPromise = null;\n state.localContainerRefreshGeneration = null;\n state.localContainerRefreshStructuralGeneration = null;\n }\n if (shouldRetryAfterReplacement) {\n state.localContainersNeedRefresh = true;\n return refreshLocalContainerStates(input);\n }\n return undefined;\n });\n state.localContainerRefreshPromise = refreshPromise;\n\n return refreshPromise;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"localRefresh.js","sourceRoot":"","sources":["localRefresh.ts"],"names":[],"mappings":"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","sourcesContent":["import { encodeVersionVector } from \"@tearleads/loro\";\nimport { errorMessage } from \"../../data/shared/errorMessage\";\nimport type { ContainerContentsPersistence } from \"../../workflows/container-contents/containerPersistence\";\nimport { loadLocalContainerStates } from \"../../workflows/container-contents/localState\";\nimport { installContainerMetadataRecord } from \"../../workflows/container-contents/metadata\";\nimport { currentMetadataPullContinuation } from \"../../workflows/container-contents/metadata/metadataPersistence\";\nimport type { ContainerState } from \"../../workflows/container-contents/remoteHydration\";\nimport { reconcileLocalOnlyRootContainers } from \"../../workflows/container-contents/remoteHydration/reconciliation\";\nimport type { ContainerContentsWorkflowRuntime } from \"../../workflows/container-contents/runtime\";\nimport { isDatabaseUnavailableError } from \"../../workflows/container-contents/syncLane\";\nimport {\n captureContainerStateMutationGenerations,\n containerStateMutatedAfter,\n} from \"./containerStateMap\";\nimport { isRemoteBackedContainerState } from \"./remoteBackedContainerState\";\n\ninterface LocalContainerRefreshHost {\n updateSnapshot: () => void;\n}\n\nexport interface LocalContainerRefreshState {\n containersById: Map<string, ContainerState>;\n documentStoresNeedPriming: boolean;\n initialized: boolean;\n lifecycleGeneration: number;\n localContainerRefreshGeneration: number | null;\n localContainerRefreshPromise: Promise<void> | null;\n localContainerRefreshStructuralGeneration: number | null;\n localContainersNeedRefresh: boolean;\n persistence: ContainerContentsPersistence;\n runtime: ContainerContentsWorkflowRuntime;\n structuralGeneration: number;\n}\n\ninterface LocalContainerRefreshBaseline {\n container: ContainerState[\"container\"];\n docVersion: string | null;\n pullContinuation: ReturnType<typeof currentMetadataPullContinuation>;\n record: ContainerState[\"record\"];\n}\n\nfunction readMetadataDocVersion(state: ContainerState): string | null {\n try {\n return encodeVersionVector(state.doc);\n } catch {\n return null;\n }\n}\n\nfunction captureLocalContainerRefreshBaselines(\n states: ReadonlyMap<string, ContainerState>,\n): ReadonlyMap<string, LocalContainerRefreshBaseline> {\n return new Map(\n Array.from(states, ([containerId, state]) => [\n containerId,\n {\n container: state.container,\n docVersion: readMetadataDocVersion(state),\n pullContinuation: currentMetadataPullContinuation(state),\n record: state.record,\n },\n ]),\n );\n}\n\nfunction liveContainerStateChangedAfterRefreshStarted(\n state: ContainerState,\n baseline: LocalContainerRefreshBaseline | undefined,\n): boolean {\n // No baseline means this live state was inserted after the refresh began.\n // The loaded snapshot cannot authoritatively replace a state that did not\n // exist when its query started.\n return (\n baseline === undefined ||\n state.container !== baseline.container ||\n state.record !== baseline.record ||\n currentMetadataPullContinuation(state) !== baseline.pullContinuation ||\n readMetadataDocVersion(state) !== baseline.docVersion\n );\n}\n\nfunction mergeLocalContainerStates(input: {\n containerMutationGenerations: ReadonlyMap<string, number>;\n liveStateBaselines: ReadonlyMap<string, LocalContainerRefreshBaseline>;\n localContainerStates: ReadonlyArray<ContainerState>;\n remoteContainerIdsAtLoadStart: ReadonlySet<string>;\n state: LocalContainerRefreshState;\n}): void {\n for (const localContainerState of input.localContainerStates) {\n const containerId = localContainerState.container.id;\n if (\n containerStateMutatedAfter(\n input.state.containersById,\n containerId,\n input.containerMutationGenerations,\n )\n ) {\n continue;\n }\n const existingState = input.state.containersById.get(containerId);\n if (existingState) {\n if (\n liveContainerStateChangedAfterRefreshStarted(\n existingState,\n input.liveStateBaselines.get(containerId),\n )\n ) {\n continue;\n }\n // The load can start before a remote create and finish after it. Its\n // local-only snapshot must not erase the remote identity that the create\n // persisted in the meantime, or the pending create intent is re-queued.\n if (\n !input.remoteContainerIdsAtLoadStart.has(containerId) &&\n existingState.record.documentId &&\n !localContainerState.record.documentId\n ) {\n continue;\n }\n existingState.container = localContainerState.container;\n existingState.doc = localContainerState.doc;\n installContainerMetadataRecord(existingState, localContainerState.record);\n } else if (!input.liveStateBaselines.has(containerId)) {\n // A baseline without a live entry means the state was removed while the\n // load was pending. Do not resurrect that stale snapshot.\n input.state.containersById.set(containerId, localContainerState);\n }\n }\n}\n\nfunction isRemoteBackedRootState(containerState: ContainerState): boolean {\n return (\n containerState.container.parentId === null &&\n isRemoteBackedContainerState(containerState)\n );\n}\n\nasync function reconcileLocalsLoadedAfterRemoteState(\n state: LocalContainerRefreshState,\n isCurrent: () => boolean,\n): Promise<void> {\n const remoteRootStates = Array.from(state.containersById.values()).filter(\n isRemoteBackedRootState,\n );\n for (const remoteRootState of remoteRootStates) {\n if (!isCurrent()) {\n return;\n }\n await reconcileLocalOnlyRootContainers({\n isCurrent,\n remoteRootState,\n state,\n });\n }\n}\n\n/**\n * Hand the tree-rebuild failure to host diagnostics as a real `Error`: the\n * unguarded metadata import inside `loadLocalContainerStates` lands corrupt\n * persisted state here, which the string-only log line cannot carry. That line\n * is the fallback for a host without `logError`, so there is no second copy.\n */\nfunction reportLocalContainerRefreshFailure(\n util: ContainerContentsWorkflowRuntime[\"util\"],\n error: unknown,\n): void {\n // Losing the database mid-flight is the teardown outcome the re-armed refresh\n // already covers, not a defect.\n if (!util.logError || isDatabaseUnavailableError(error)) return;\n try {\n // Callers run `void refreshLocalContainers()`, so a host logger that throws\n // or rejects must not escape as an unhandled rejection carrying app frames.\n void Promise.resolve(\n util.logError(\n \"Container contents: local container refresh failed\",\n error,\n ),\n ).catch(() => undefined);\n } catch {\n // Hosts may throw synchronously or return a rejected promise.\n }\n}\n\nexport function refreshLocalContainerStates(input: {\n host: LocalContainerRefreshHost;\n state: LocalContainerRefreshState;\n}): Promise<void> {\n const { host, state } = input;\n if (state.localContainerRefreshPromise) {\n const activeRefresh = state.localContainerRefreshPromise;\n if (\n state.localContainerRefreshGeneration === state.lifecycleGeneration &&\n state.localContainerRefreshStructuralGeneration ===\n state.structuralGeneration\n ) {\n return activeRefresh;\n }\n // A stale refresh owns its replacement retry in `finally`, so callers can\n // share that promise without scheduling a second replacement load.\n return activeRefresh;\n }\n\n if (\n !state.localContainersNeedRefresh ||\n !state.initialized ||\n state.runtime.infra.dbStatus !== \"ready\"\n ) {\n return Promise.resolve();\n }\n\n const lifecycleGeneration = state.lifecycleGeneration;\n const structuralGeneration = state.structuralGeneration;\n const isCurrent = () =>\n state.lifecycleGeneration === lifecycleGeneration &&\n state.structuralGeneration === structuralGeneration;\n state.localContainersNeedRefresh = false;\n const liveStateBaselines = captureLocalContainerRefreshBaselines(\n state.containersById,\n );\n const containerMutationGenerations = captureContainerStateMutationGenerations(\n state.containersById,\n );\n const remoteContainerIdsAtLoadStart = new Set<string>();\n for (const containerState of state.containersById.values()) {\n if (containerState.record.documentId) {\n remoteContainerIdsAtLoadStart.add(containerState.container.id);\n }\n }\n state.localContainerRefreshGeneration = lifecycleGeneration;\n state.localContainerRefreshStructuralGeneration = structuralGeneration;\n const refreshPromise = loadLocalContainerStates({\n persistence: state.persistence,\n runtime: state.runtime,\n })\n .then(async (localContainerStates) => {\n if (!isCurrent()) {\n return;\n }\n mergeLocalContainerStates({\n containerMutationGenerations,\n liveStateBaselines,\n localContainerStates,\n remoteContainerIdsAtLoadStart,\n state,\n });\n // Remote hydration can win the startup race and ingest the server root\n // before this local read returns. Re-run root/system convergence after\n // merging so that the late local bootstrap rows cannot reintroduce a\n // stale root and same-slot system children into the live tree.\n await reconcileLocalsLoadedAfterRemoteState(state, isCurrent);\n if (!isCurrent()) {\n return;\n }\n state.documentStoresNeedPriming = true;\n host.updateSnapshot();\n })\n .catch((error: unknown) => {\n if (!isCurrent()) {\n return;\n }\n state.localContainersNeedRefresh = true;\n state.runtime.util.log(\n `Failed to refresh local container states: ${errorMessage(error)}`,\n );\n reportLocalContainerRefreshFailure(state.runtime.util, error);\n })\n .finally(() => {\n const shouldRetryAfterReplacement = !isCurrent();\n if (state.localContainerRefreshPromise === refreshPromise) {\n state.localContainerRefreshPromise = null;\n state.localContainerRefreshGeneration = null;\n state.localContainerRefreshStructuralGeneration = null;\n }\n if (shouldRetryAfterReplacement) {\n state.localContainersNeedRefresh = true;\n return refreshLocalContainerStates(input);\n }\n return undefined;\n });\n state.localContainerRefreshPromise = refreshPromise;\n\n return refreshPromise;\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createChildContainerState } from "../../workflows/container-contents/container-state/createChild.js";
|
|
2
2
|
import { deleteContainerState } from "../../workflows/container-contents/container-state/delete.js";
|
|
3
3
|
import { assertLocalChildPathFits, assertLocalMovePathFits, } from "../../workflows/container-contents/container-state/localPathDepth.js";
|
|
4
|
-
import { installContainerMetadataRecord, renameContainerMetadataStateFromRuntime, } from "../../workflows/container-contents/metadata.js";
|
|
5
|
-
import { createDetachedContainerMetadataState, installDetachedContainerMetadataState, } from "../../workflows/container-contents/metadataStateIsolation.js";
|
|
4
|
+
import { installContainerMetadataRecord, renameContainerMetadataStateFromRuntime, } from "../../workflows/container-contents/metadata/index.js";
|
|
5
|
+
import { createDetachedContainerMetadataState, installDetachedContainerMetadataState, } from "../../workflows/container-contents/metadata/metadataStateIsolation.js";
|
|
6
6
|
import { persistContainerState } from "./containerStatePersistence.js";
|
|
7
7
|
import { updateExistingSystemContainer } from "./existingSystemContainer.js";
|
|
8
8
|
import { getContainerContentsStoreLogLabel } from "./logLabel.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.js","sourceRoot":"","sources":["operations.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContainerSystemSlot } from \"@tearleads/validators/containerSystemSlot\";\nimport { createChildContainerState } from \"../../workflows/container-contents/container-state/createChild\";\nimport { deleteContainerState } from \"../../workflows/container-contents/container-state/delete\";\nimport {\n assertLocalChildPathFits,\n assertLocalMovePathFits,\n} from \"../../workflows/container-contents/container-state/localPathDepth\";\nimport {\n installContainerMetadataRecord,\n renameContainerMetadataStateFromRuntime,\n} from \"../../workflows/container-contents/metadata\";\nimport {\n createDetachedContainerMetadataState,\n installDetachedContainerMetadataState,\n} from \"../../workflows/container-contents/metadataStateIsolation\";\nimport { persistContainerState } from \"./containerStatePersistence\";\nimport { updateExistingSystemContainer } from \"./existingSystemContainer\";\nimport { getContainerContentsStoreLogLabel } from \"./logLabel\";\nimport { removeMissingContainerState } from \"./missingContainerState\";\nimport { ensureOrganizationMetadataSystemContainer } from \"./organizationMetadataSystemContainer\";\nimport {\n invalidateRemoteContainerWrites,\n invalidateRemoteSystemContainerWrite,\n} from \"./remoteWriteGuards\";\nimport { updateContainerContentsSnapshot } from \"./state\";\nimport type {\n ContainerContentsStoreSyncAgent,\n ContainerState,\n} from \"./syncAgent\";\nimport { probeExistingSystemContainer } from \"./systemContainerHydration\";\nimport {\n findRootContainerState,\n findSystemContainerStateForRoot,\n} from \"./systemContainerLookup\";\nimport { finalizeCreatedSystemContainer } from \"./systemContainerPostCreate\";\nimport { hasAdvancedManagedPrincipalReference } from \"./systemContainerPromotion\";\nimport type {\n ContainerContentsStoreState,\n EnsureSystemContainerOptions,\n} from \"./types\";\nimport { isContainerInSubtree, toContainerNode } from \"./utils\";\nimport type { ContainerWriteGuard } from \"./writeGeneration\";\n\nexport async function createChildContainer(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n parentId: string,\n name: string,\n isCurrent: ContainerWriteGuard = () => true,\n) {\n const trimmedName = name.trim();\n if (\n state.runtime.infra.dbStatus !== \"ready\" ||\n !state.snapshot.ready ||\n !trimmedName\n ) {\n return null;\n }\n\n const parentState = state.containersById.get(parentId);\n if (!parentState) {\n return null;\n }\n assertLocalChildPathFits(state.containersById, parentId);\n\n const created = await createChildContainerState({\n createRemote: false,\n name: trimmedName,\n parentState,\n persistence: state.persistence,\n resolveProjectionUserKey: state.resolveProjectionUserKey,\n runtime: state.runtime,\n stillCurrent: isCurrent,\n });\n if (!created || !isCurrent()) return null;\n\n state.containersById.set(\n created.containerState.container.id,\n created.containerState,\n );\n updateContainerContentsSnapshot(state);\n if (created.shouldRequestSync) {\n syncAgent.scheduleSync();\n }\n state.runtime.util.log(\n `${getContainerContentsStoreLogLabel(state)}: created container \"${trimmedName}\"`,\n );\n return toContainerNode(created.containerState);\n}\n\nfunction canEnsureSystemContainer(\n state: ContainerContentsStoreState,\n name: string,\n): boolean {\n return (\n state.runtime.infra.dbStatus === \"ready\" && state.snapshot.ready && !!name\n );\n}\n\nasync function findOrHydrateSystemContainer(input: {\n isCurrent: ContainerWriteGuard;\n state: ContainerContentsStoreState;\n syncAgent: ContainerContentsStoreSyncAgent;\n systemSlot: ContainerSystemSlot;\n}): Promise<ContainerState | null> {\n const { isCurrent, state, syncAgent, systemSlot } = input;\n const existing = findSystemContainerStateForRoot(\n state,\n systemSlot,\n findRootContainerState(state),\n );\n if (\n existing ||\n !state.runtime.auth.isAuthenticated ||\n !state.runtime.state.online\n ) {\n return existing;\n }\n await probeExistingSystemContainer({\n logLabel: getContainerContentsStoreLogLabel(state),\n rootState: findRootContainerState(state),\n state,\n syncAgent,\n systemSlot,\n });\n return isCurrent()\n ? findSystemContainerStateForRoot(\n state,\n systemSlot,\n findRootContainerState(state),\n )\n : null;\n}\n\nfunction canCreateSystemContainer(\n state: ContainerContentsStoreState,\n rootState: ContainerState,\n systemSlot: ContainerSystemSlot,\n options: EnsureSystemContainerOptions,\n): boolean {\n if (\n options.skipAdvancedManagedRoot &&\n hasAdvancedManagedPrincipalReference(rootState)\n ) {\n state.runtime.util.log(\n `${getContainerContentsStoreLogLabel(state)}: skipped background system container \"${systemSlot}\" because the root has advanced managed-principal references`,\n );\n return false;\n }\n\n return true;\n}\n\nexport async function ensureSystemContainer(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n systemSlot: ContainerSystemSlot,\n name: string,\n options: EnsureSystemContainerOptions = {},\n isCurrent: ContainerWriteGuard = () => true,\n) {\n const trimmedName = name.trim();\n if (!canEnsureSystemContainer(state, trimmedName)) {\n return null;\n }\n\n const metadata = await ensureOrganizationMetadataSystemContainer({\n state,\n syncAgent,\n systemSlot,\n options,\n isCurrent,\n });\n if (!isCurrent()) return null;\n if (metadata.handled) return metadata.container;\n\n return ensureChildSystemContainer(\n state,\n syncAgent,\n systemSlot,\n trimmedName,\n options,\n isCurrent,\n );\n}\n\nasync function ensureChildSystemContainer(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n systemSlot: ContainerSystemSlot,\n trimmedName: string,\n options: EnsureSystemContainerOptions,\n isCurrent: ContainerWriteGuard,\n) {\n const allowSynchronousRemoteBootstrap = !options.deferRemoteBootstrap;\n const existing = allowSynchronousRemoteBootstrap\n ? await findOrHydrateSystemContainer({\n isCurrent,\n state,\n syncAgent,\n systemSlot,\n })\n : findSystemContainerStateForRoot(\n state,\n systemSlot,\n findRootContainerState(state),\n );\n if (!isCurrent()) return null;\n if (existing) {\n return updateExistingSystemContainer(\n state,\n syncAgent,\n existing,\n options,\n isCurrent,\n );\n }\n\n const rootState = findRootContainerState(state);\n if (!rootState) {\n return null;\n }\n if (!canCreateSystemContainer(state, rootState, systemSlot, options))\n return null;\n\n if (options.deferRemoteBootstrap) {\n invalidateRemoteSystemContainerWrite(\n state,\n rootState.container.id,\n systemSlot,\n );\n invalidateRemoteContainerWrites(state, [rootState.container.id]);\n }\n const createRemote =\n allowSynchronousRemoteBootstrap &&\n state.runtime.auth.isAuthenticated &&\n Boolean(state.runtime.crypto.encapsulationKeyPair);\n const created = await createChildContainerState({\n systemSlot,\n createRemote,\n icon: options.icon,\n name: trimmedName,\n parentState: rootState,\n persistence: state.persistence,\n queueRemoteSync: !options.deferRemoteSync,\n resolveProjectionUserKey: state.resolveProjectionUserKey,\n runtime: state.runtime,\n stillCurrent: isCurrent,\n });\n if (!created || !isCurrent()) {\n if (createRemote && !isCurrent()) {\n state.containerParentIdsNeedingHydration.add(rootState.container.id);\n syncAgent.scheduleRemoteHydration();\n }\n return null;\n }\n\n const finalized = await finalizeCreatedSystemContainer({\n created,\n logLabel: getContainerContentsStoreLogLabel(state),\n state,\n syncAgent,\n systemSlot,\n isCurrent,\n });\n if (!finalized || !isCurrent()) return null;\n if (finalized.adopted) {\n const updated = await updateExistingSystemContainer(\n state,\n syncAgent,\n finalized.containerState,\n options,\n isCurrent,\n );\n if (!updated) return null;\n }\n return toContainerNode(finalized.containerState);\n}\n\nexport async function deleteContainer(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n containerId: string,\n isCurrent: ContainerWriteGuard = () => true,\n) {\n if (state.runtime.infra.dbStatus !== \"ready\" || !state.snapshot.ready) {\n return null;\n }\n\n const existingState = state.containersById.get(containerId);\n if (\n !existingState ||\n existingState.container.parentId === null ||\n (existingState.container.systemSlot ?? null) !== null ||\n Array.from(state.containersById.values()).some(\n (containerState) => containerState.container.parentId === containerId,\n )\n ) {\n return null;\n }\n\n const isRemoteContainer = Boolean(existingState.record.documentId);\n if (isRemoteContainer) {\n if (!state.runtime.auth.isAuthenticated || !state.runtime.state.online) {\n return null;\n }\n }\n\n const deletedNode = toContainerNode(existingState);\n const deleted = await deleteContainerState({\n containerState: existingState,\n persistence: state.persistence,\n runtime: state.runtime,\n stillCurrent: isCurrent,\n });\n if (deleted === \"remote-failed\") {\n return null;\n }\n if (\n deleted === \"local-conflict\" ||\n deleted === \"remote-deleted\" ||\n !isCurrent()\n ) {\n state.localContainersNeedRefresh = true;\n await syncAgent.refreshLocalContainers();\n // The delete committed before this operation lost its generation. Evict\n // only the exact state it deleted: a concurrent replacement with the same\n // id owns a different object and must survive.\n if (\n deleted === \"deleted\" &&\n state.containersById.get(existingState.container.id) === existingState\n ) {\n state.containersById.delete(existingState.container.id);\n state.documentStoresNeedPriming = true;\n if (state.initialized) {\n updateContainerContentsSnapshot(state);\n }\n }\n if (isRemoteContainer) {\n await syncAgent.requestRemoteHydration({\n followDiscoveredParentLanes: false,\n parentIds: [existingState.container.parentId],\n resetAllLaneWatermarks: true,\n });\n }\n return null;\n }\n\n state.containersById.delete(existingState.container.id);\n // The persistence cascade may have orphaned descendant documents (row 3);\n // re-arm document priming and nudge the lane so their null-scoped passes\n // run now rather than on the next unrelated trigger.\n state.documentStoresNeedPriming = true;\n syncAgent.scheduleSync();\n updateContainerContentsSnapshot(state);\n state.runtime.util.log(\n `${getContainerContentsStoreLogLabel(state)}: deleted container \"${existingState.container.name}\"`,\n );\n return deletedNode;\n}\n\nexport async function renameContainer(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n containerId: string,\n name: string,\n isCurrent: ContainerWriteGuard = () => true,\n) {\n const trimmedName = name.trim();\n if (\n state.runtime.infra.dbStatus !== \"ready\" ||\n !state.snapshot.ready ||\n !trimmedName\n ) {\n return null;\n }\n\n const existingState = state.containersById.get(containerId);\n if (!existingState) {\n return null;\n }\n\n if (existingState.container.name === trimmedName) {\n return toContainerNode(existingState);\n }\n\n const detachedState =\n await createDetachedContainerMetadataState(existingState);\n if (!isCurrent()) return null;\n const renamed = await renameContainerMetadataStateFromRuntime({\n metadataState: detachedState,\n name: trimmedName,\n persistence: state.persistence,\n runtime: state.runtime,\n stillCurrent: isCurrent,\n });\n if (!isCurrent()) return null;\n if (!renamed) {\n removeMissingContainerState(state, existingState);\n return null;\n }\n\n detachedState.container = renamed.container;\n installContainerMetadataRecord(detachedState, renamed.record);\n installDetachedContainerMetadataState(existingState, detachedState);\n updateContainerContentsSnapshot(state);\n syncAgent.scheduleSync();\n state.runtime.util.log(\n `${getContainerContentsStoreLogLabel(state)}: renamed container to \"${trimmedName}\"`,\n );\n return toContainerNode(existingState);\n}\n\nexport async function moveContainer(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n containerId: string,\n parentId: string,\n isCurrent: ContainerWriteGuard = () => true,\n) {\n if (state.runtime.infra.dbStatus !== \"ready\" || !state.snapshot.ready) {\n return null;\n }\n\n const existingState = state.containersById.get(containerId);\n const targetParentState = state.containersById.get(parentId);\n if (\n !existingState ||\n !targetParentState ||\n existingState.container.parentId === null ||\n (existingState.container.systemSlot ?? null) !== null ||\n isContainerInSubtree(state.containersById, parentId, containerId)\n ) {\n return null;\n }\n\n if (existingState.container.parentId === parentId) {\n return toContainerNode(existingState);\n }\n assertLocalMovePathFits(state.containersById, containerId, parentId);\n\n const isRemoteContainer = Boolean(existingState.record.documentId);\n const saveOptions = isRemoteContainer\n ? {\n moveIntent: {\n parentContainerId: parentId,\n previousParentContainerId: existingState.container.parentId,\n },\n }\n : { createIntent: { parentContainerId: parentId } };\n const persisted = await persistContainerState(state, existingState, {\n patch: { parentId },\n saveOptions,\n isCurrent,\n });\n if (persisted.status !== \"persisted\" || !isCurrent()) return null;\n syncAgent.scheduleSync();\n const action = isRemoteContainer\n ? \"queued container move\"\n : \"moved container\";\n state.runtime.util.log(\n `${getContainerContentsStoreLogLabel(state)}: ${action} ${containerId} under ${parentId}`,\n );\n return toContainerNode(existingState);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["operations.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContainerSystemSlot } from \"@tearleads/validators/containerSystemSlot\";\nimport { createChildContainerState } from \"../../workflows/container-contents/container-state/createChild\";\nimport { deleteContainerState } from \"../../workflows/container-contents/container-state/delete\";\nimport {\n assertLocalChildPathFits,\n assertLocalMovePathFits,\n} from \"../../workflows/container-contents/container-state/localPathDepth\";\nimport {\n installContainerMetadataRecord,\n renameContainerMetadataStateFromRuntime,\n} from \"../../workflows/container-contents/metadata\";\nimport {\n createDetachedContainerMetadataState,\n installDetachedContainerMetadataState,\n} from \"../../workflows/container-contents/metadata/metadataStateIsolation\";\nimport { persistContainerState } from \"./containerStatePersistence\";\nimport { updateExistingSystemContainer } from \"./existingSystemContainer\";\nimport { getContainerContentsStoreLogLabel } from \"./logLabel\";\nimport { removeMissingContainerState } from \"./missingContainerState\";\nimport { ensureOrganizationMetadataSystemContainer } from \"./organizationMetadataSystemContainer\";\nimport {\n invalidateRemoteContainerWrites,\n invalidateRemoteSystemContainerWrite,\n} from \"./remoteWriteGuards\";\nimport { updateContainerContentsSnapshot } from \"./state\";\nimport type {\n ContainerContentsStoreSyncAgent,\n ContainerState,\n} from \"./syncAgent\";\nimport { probeExistingSystemContainer } from \"./systemContainerHydration\";\nimport {\n findRootContainerState,\n findSystemContainerStateForRoot,\n} from \"./systemContainerLookup\";\nimport { finalizeCreatedSystemContainer } from \"./systemContainerPostCreate\";\nimport { hasAdvancedManagedPrincipalReference } from \"./systemContainerPromotion\";\nimport type {\n ContainerContentsStoreState,\n EnsureSystemContainerOptions,\n} from \"./types\";\nimport { isContainerInSubtree, toContainerNode } from \"./utils\";\nimport type { ContainerWriteGuard } from \"./writeGeneration\";\n\nexport async function createChildContainer(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n parentId: string,\n name: string,\n isCurrent: ContainerWriteGuard = () => true,\n) {\n const trimmedName = name.trim();\n if (\n state.runtime.infra.dbStatus !== \"ready\" ||\n !state.snapshot.ready ||\n !trimmedName\n ) {\n return null;\n }\n\n const parentState = state.containersById.get(parentId);\n if (!parentState) {\n return null;\n }\n assertLocalChildPathFits(state.containersById, parentId);\n\n const created = await createChildContainerState({\n createRemote: false,\n name: trimmedName,\n parentState,\n persistence: state.persistence,\n resolveProjectionUserKey: state.resolveProjectionUserKey,\n runtime: state.runtime,\n stillCurrent: isCurrent,\n });\n if (!created || !isCurrent()) return null;\n\n state.containersById.set(\n created.containerState.container.id,\n created.containerState,\n );\n updateContainerContentsSnapshot(state);\n if (created.shouldRequestSync) {\n syncAgent.scheduleSync();\n }\n state.runtime.util.log(\n `${getContainerContentsStoreLogLabel(state)}: created container \"${trimmedName}\"`,\n );\n return toContainerNode(created.containerState);\n}\n\nfunction canEnsureSystemContainer(\n state: ContainerContentsStoreState,\n name: string,\n): boolean {\n return (\n state.runtime.infra.dbStatus === \"ready\" && state.snapshot.ready && !!name\n );\n}\n\nasync function findOrHydrateSystemContainer(input: {\n isCurrent: ContainerWriteGuard;\n state: ContainerContentsStoreState;\n syncAgent: ContainerContentsStoreSyncAgent;\n systemSlot: ContainerSystemSlot;\n}): Promise<ContainerState | null> {\n const { isCurrent, state, syncAgent, systemSlot } = input;\n const existing = findSystemContainerStateForRoot(\n state,\n systemSlot,\n findRootContainerState(state),\n );\n if (\n existing ||\n !state.runtime.auth.isAuthenticated ||\n !state.runtime.state.online\n ) {\n return existing;\n }\n await probeExistingSystemContainer({\n logLabel: getContainerContentsStoreLogLabel(state),\n rootState: findRootContainerState(state),\n state,\n syncAgent,\n systemSlot,\n });\n return isCurrent()\n ? findSystemContainerStateForRoot(\n state,\n systemSlot,\n findRootContainerState(state),\n )\n : null;\n}\n\nfunction canCreateSystemContainer(\n state: ContainerContentsStoreState,\n rootState: ContainerState,\n systemSlot: ContainerSystemSlot,\n options: EnsureSystemContainerOptions,\n): boolean {\n if (\n options.skipAdvancedManagedRoot &&\n hasAdvancedManagedPrincipalReference(rootState)\n ) {\n state.runtime.util.log(\n `${getContainerContentsStoreLogLabel(state)}: skipped background system container \"${systemSlot}\" because the root has advanced managed-principal references`,\n );\n return false;\n }\n\n return true;\n}\n\nexport async function ensureSystemContainer(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n systemSlot: ContainerSystemSlot,\n name: string,\n options: EnsureSystemContainerOptions = {},\n isCurrent: ContainerWriteGuard = () => true,\n) {\n const trimmedName = name.trim();\n if (!canEnsureSystemContainer(state, trimmedName)) {\n return null;\n }\n\n const metadata = await ensureOrganizationMetadataSystemContainer({\n state,\n syncAgent,\n systemSlot,\n options,\n isCurrent,\n });\n if (!isCurrent()) return null;\n if (metadata.handled) return metadata.container;\n\n return ensureChildSystemContainer(\n state,\n syncAgent,\n systemSlot,\n trimmedName,\n options,\n isCurrent,\n );\n}\n\nasync function ensureChildSystemContainer(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n systemSlot: ContainerSystemSlot,\n trimmedName: string,\n options: EnsureSystemContainerOptions,\n isCurrent: ContainerWriteGuard,\n) {\n const allowSynchronousRemoteBootstrap = !options.deferRemoteBootstrap;\n const existing = allowSynchronousRemoteBootstrap\n ? await findOrHydrateSystemContainer({\n isCurrent,\n state,\n syncAgent,\n systemSlot,\n })\n : findSystemContainerStateForRoot(\n state,\n systemSlot,\n findRootContainerState(state),\n );\n if (!isCurrent()) return null;\n if (existing) {\n return updateExistingSystemContainer(\n state,\n syncAgent,\n existing,\n options,\n isCurrent,\n );\n }\n\n const rootState = findRootContainerState(state);\n if (!rootState) {\n return null;\n }\n if (!canCreateSystemContainer(state, rootState, systemSlot, options))\n return null;\n\n if (options.deferRemoteBootstrap) {\n invalidateRemoteSystemContainerWrite(\n state,\n rootState.container.id,\n systemSlot,\n );\n invalidateRemoteContainerWrites(state, [rootState.container.id]);\n }\n const createRemote =\n allowSynchronousRemoteBootstrap &&\n state.runtime.auth.isAuthenticated &&\n Boolean(state.runtime.crypto.encapsulationKeyPair);\n const created = await createChildContainerState({\n systemSlot,\n createRemote,\n icon: options.icon,\n name: trimmedName,\n parentState: rootState,\n persistence: state.persistence,\n queueRemoteSync: !options.deferRemoteSync,\n resolveProjectionUserKey: state.resolveProjectionUserKey,\n runtime: state.runtime,\n stillCurrent: isCurrent,\n });\n if (!created || !isCurrent()) {\n if (createRemote && !isCurrent()) {\n state.containerParentIdsNeedingHydration.add(rootState.container.id);\n syncAgent.scheduleRemoteHydration();\n }\n return null;\n }\n\n const finalized = await finalizeCreatedSystemContainer({\n created,\n logLabel: getContainerContentsStoreLogLabel(state),\n state,\n syncAgent,\n systemSlot,\n isCurrent,\n });\n if (!finalized || !isCurrent()) return null;\n if (finalized.adopted) {\n const updated = await updateExistingSystemContainer(\n state,\n syncAgent,\n finalized.containerState,\n options,\n isCurrent,\n );\n if (!updated) return null;\n }\n return toContainerNode(finalized.containerState);\n}\n\nexport async function deleteContainer(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n containerId: string,\n isCurrent: ContainerWriteGuard = () => true,\n) {\n if (state.runtime.infra.dbStatus !== \"ready\" || !state.snapshot.ready) {\n return null;\n }\n\n const existingState = state.containersById.get(containerId);\n if (\n !existingState ||\n existingState.container.parentId === null ||\n (existingState.container.systemSlot ?? null) !== null ||\n Array.from(state.containersById.values()).some(\n (containerState) => containerState.container.parentId === containerId,\n )\n ) {\n return null;\n }\n\n const isRemoteContainer = Boolean(existingState.record.documentId);\n if (isRemoteContainer) {\n if (!state.runtime.auth.isAuthenticated || !state.runtime.state.online) {\n return null;\n }\n }\n\n const deletedNode = toContainerNode(existingState);\n const deleted = await deleteContainerState({\n containerState: existingState,\n persistence: state.persistence,\n runtime: state.runtime,\n stillCurrent: isCurrent,\n });\n if (deleted === \"remote-failed\") {\n return null;\n }\n if (\n deleted === \"local-conflict\" ||\n deleted === \"remote-deleted\" ||\n !isCurrent()\n ) {\n state.localContainersNeedRefresh = true;\n await syncAgent.refreshLocalContainers();\n // The delete committed before this operation lost its generation. Evict\n // only the exact state it deleted: a concurrent replacement with the same\n // id owns a different object and must survive.\n if (\n deleted === \"deleted\" &&\n state.containersById.get(existingState.container.id) === existingState\n ) {\n state.containersById.delete(existingState.container.id);\n state.documentStoresNeedPriming = true;\n if (state.initialized) {\n updateContainerContentsSnapshot(state);\n }\n }\n if (isRemoteContainer) {\n await syncAgent.requestRemoteHydration({\n followDiscoveredParentLanes: false,\n parentIds: [existingState.container.parentId],\n resetAllLaneWatermarks: true,\n });\n }\n return null;\n }\n\n state.containersById.delete(existingState.container.id);\n // The persistence cascade may have orphaned descendant documents (row 3);\n // re-arm document priming and nudge the lane so their null-scoped passes\n // run now rather than on the next unrelated trigger.\n state.documentStoresNeedPriming = true;\n syncAgent.scheduleSync();\n updateContainerContentsSnapshot(state);\n state.runtime.util.log(\n `${getContainerContentsStoreLogLabel(state)}: deleted container \"${existingState.container.name}\"`,\n );\n return deletedNode;\n}\n\nexport async function renameContainer(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n containerId: string,\n name: string,\n isCurrent: ContainerWriteGuard = () => true,\n) {\n const trimmedName = name.trim();\n if (\n state.runtime.infra.dbStatus !== \"ready\" ||\n !state.snapshot.ready ||\n !trimmedName\n ) {\n return null;\n }\n\n const existingState = state.containersById.get(containerId);\n if (!existingState) {\n return null;\n }\n\n if (existingState.container.name === trimmedName) {\n return toContainerNode(existingState);\n }\n\n const detachedState =\n await createDetachedContainerMetadataState(existingState);\n if (!isCurrent()) return null;\n const renamed = await renameContainerMetadataStateFromRuntime({\n metadataState: detachedState,\n name: trimmedName,\n persistence: state.persistence,\n runtime: state.runtime,\n stillCurrent: isCurrent,\n });\n if (!isCurrent()) return null;\n if (!renamed) {\n removeMissingContainerState(state, existingState);\n return null;\n }\n\n detachedState.container = renamed.container;\n installContainerMetadataRecord(detachedState, renamed.record);\n installDetachedContainerMetadataState(existingState, detachedState);\n updateContainerContentsSnapshot(state);\n syncAgent.scheduleSync();\n state.runtime.util.log(\n `${getContainerContentsStoreLogLabel(state)}: renamed container to \"${trimmedName}\"`,\n );\n return toContainerNode(existingState);\n}\n\nexport async function moveContainer(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n containerId: string,\n parentId: string,\n isCurrent: ContainerWriteGuard = () => true,\n) {\n if (state.runtime.infra.dbStatus !== \"ready\" || !state.snapshot.ready) {\n return null;\n }\n\n const existingState = state.containersById.get(containerId);\n const targetParentState = state.containersById.get(parentId);\n if (\n !existingState ||\n !targetParentState ||\n existingState.container.parentId === null ||\n (existingState.container.systemSlot ?? null) !== null ||\n isContainerInSubtree(state.containersById, parentId, containerId)\n ) {\n return null;\n }\n\n if (existingState.container.parentId === parentId) {\n return toContainerNode(existingState);\n }\n assertLocalMovePathFits(state.containersById, containerId, parentId);\n\n const isRemoteContainer = Boolean(existingState.record.documentId);\n const saveOptions = isRemoteContainer\n ? {\n moveIntent: {\n parentContainerId: parentId,\n previousParentContainerId: existingState.container.parentId,\n },\n }\n : { createIntent: { parentContainerId: parentId } };\n const persisted = await persistContainerState(state, existingState, {\n patch: { parentId },\n saveOptions,\n isCurrent,\n });\n if (persisted.status !== \"persisted\" || !isCurrent()) return null;\n syncAgent.scheduleSync();\n const action = isRemoteContainer\n ? \"queued container move\"\n : \"moved container\";\n state.runtime.util.log(\n `${getContainerContentsStoreLogLabel(state)}: ${action} ${containerId} under ${parentId}`,\n );\n return toContainerNode(existingState);\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { errorMessage } from "../../data/shared/errorMessage.js";
|
|
2
|
-
import { createRemoteContainerIngestor, } from "../../workflows/container-contents/remoteHydration.js";
|
|
2
|
+
import { createRemoteContainerIngestor, } from "../../workflows/container-contents/remoteHydration/index.js";
|
|
3
3
|
import { getContainerContentsStoreLogLabel } from "./logLabel.js";
|
|
4
4
|
import { resumeContainerContentsRecoveryHydration } from "./remoteHydrationRequest.js";
|
|
5
5
|
export async function resumeRemoteContainerRecoveryWork(input) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { listContainerParentIdsForEventHydration, listContainerProjectionInvalidationIds, } from "../../workflows/container-contents/containerEvents.js";
|
|
2
|
-
import { listContainerMetadataDocumentUpdateIds } from "../../workflows/container-contents/metadata.js";
|
|
2
|
+
import { listContainerMetadataDocumentUpdateIds } from "../../workflows/container-contents/metadata/index.js";
|
|
3
3
|
import { observeContainerBackgroundHydration } from "./backgroundHydration.js";
|
|
4
4
|
import { bumpMetadataSyncSeq } from "./metadataSyncSignal.js";
|
|
5
5
|
import { invalidateCachedProjections } from "./remoteEventProjectionInvalidation.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createGenerationGuardedHydrationHost, hydrateRemoteContainers, StaleRemoteHydrationError, } from "../../workflows/container-contents/remoteHydration.js";
|
|
1
|
+
import { createGenerationGuardedHydrationHost, hydrateRemoteContainers, StaleRemoteHydrationError, } from "../../workflows/container-contents/remoteHydration/index.js";
|
|
2
2
|
import { isDatabaseUnavailableError } from "../../workflows/container-contents/syncLane.js";
|
|
3
3
|
import { refreshLocalContainerStates, } from "./localRefresh.js";
|
|
4
4
|
function isRequestGenerationCurrent(input) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { installContainerMetadataRecord, setContainerIconMetadataStateFromRuntime, } from "../../workflows/container-contents/metadata.js";
|
|
2
|
-
import { createDetachedContainerMetadataState, installDetachedContainerMetadataState, } from "../../workflows/container-contents/metadataStateIsolation.js";
|
|
1
|
+
import { installContainerMetadataRecord, setContainerIconMetadataStateFromRuntime, } from "../../workflows/container-contents/metadata/index.js";
|
|
2
|
+
import { createDetachedContainerMetadataState, installDetachedContainerMetadataState, } from "../../workflows/container-contents/metadata/metadataStateIsolation.js";
|
|
3
3
|
import { getContainerContentsStoreLogLabel } from "./logLabel.js";
|
|
4
4
|
import { removeMissingContainerState } from "./missingContainerState.js";
|
|
5
5
|
import { updateContainerContentsSnapshot } from "./state.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setContainerIconOperation.js","sourceRoot":"","sources":["setContainerIconOperation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,wCAAwC,GACzC,MAAM,6CAA6C,CAAC;AACrD,OAAO,EACL,oCAAoC,EACpC,qCAAqC,GACtC,MAAM,
|
|
1
|
+
{"version":3,"file":"setContainerIconOperation.js","sourceRoot":"","sources":["setContainerIconOperation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,wCAAwC,GACzC,MAAM,6CAA6C,CAAC;AACrD,OAAO,EACL,oCAAoC,EACpC,qCAAqC,GACtC,MAAM,oEAAoE,CAAC;AAC5E,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,+BAA+B,EAAE,MAAM,SAAS,CAAC;AAG1D,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG1C,+EAA+E;AAC/E,4EAA4E;AAC5E,6EAA6E;AAC7E,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAkC,EAClC,SAA0C,EAC1C,WAAmB,EACnB,IAAmB,EACnB,YAAiC,GAAG,EAAE,CAAC,IAAI;IAE3C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;IAC5C,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,cAAc,EAAE,CAAC;QAC9D,OAAO,eAAe,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,aAAa,GACjB,MAAM,oCAAoC,CAAC,aAAa,CAAC,CAAC;IAC5D,IAAI,CAAC,SAAS,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,OAAO,GAAG,MAAM,wCAAwC,CAAC;QAC7D,IAAI,EAAE,cAAc;QACpB,aAAa,EAAE,aAAa;QAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,YAAY,EAAE,SAAS;KACxB,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,2BAA2B,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAC5C,8BAA8B,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,qCAAqC,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACpE,+BAA+B,CAAC,KAAK,CAAC,CAAC;IACvC,SAAS,CAAC,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CACpB,GAAG,iCAAiC,CAAC,KAAK,CAAC,mBAAmB,WAAW,aAAa,cAAc,IAAI,QAAQ,GAAG,CACpH,CAAC;IACF,OAAO,eAAe,CAAC,aAAa,CAAC,CAAC;AACxC,CAAC","sourcesContent":["import {\n installContainerMetadataRecord,\n setContainerIconMetadataStateFromRuntime,\n} from \"../../workflows/container-contents/metadata\";\nimport {\n createDetachedContainerMetadataState,\n installDetachedContainerMetadataState,\n} from \"../../workflows/container-contents/metadata/metadataStateIsolation\";\nimport { getContainerContentsStoreLogLabel } from \"./logLabel\";\nimport { removeMissingContainerState } from \"./missingContainerState\";\nimport { updateContainerContentsSnapshot } from \"./state\";\nimport type { ContainerContentsStoreSyncAgent } from \"./syncAgent\";\nimport type { ContainerContentsStoreState } from \"./types\";\nimport { toContainerNode } from \"./utils\";\nimport type { ContainerWriteGuard } from \"./writeGeneration\";\n\n// Set the icon shown for a container. Mirrors renameContainer's write path: it\n// writes the icon into the container metadata document (CRDT), enqueues the\n// incremental update, persists, and schedules a sync. A null icon clears the\n// custom icon back to the default folder. No-ops when the icon is unchanged.\nexport async function setContainerIcon(\n state: ContainerContentsStoreState,\n syncAgent: ContainerContentsStoreSyncAgent,\n containerId: string,\n icon: string | null,\n isCurrent: ContainerWriteGuard = () => true,\n) {\n if (state.runtime.infra.dbStatus !== \"ready\" || !state.snapshot.ready) {\n return null;\n }\n\n const existingState = state.containersById.get(containerId);\n if (!existingState) {\n return null;\n }\n\n const normalizedIcon = icon?.trim() || null;\n if ((existingState.container.icon ?? null) === normalizedIcon) {\n return toContainerNode(existingState);\n }\n\n const detachedState =\n await createDetachedContainerMetadataState(existingState);\n if (!isCurrent()) return null;\n const updated = await setContainerIconMetadataStateFromRuntime({\n icon: normalizedIcon,\n metadataState: detachedState,\n persistence: state.persistence,\n runtime: state.runtime,\n stillCurrent: isCurrent,\n });\n if (!isCurrent()) return null;\n if (!updated) {\n removeMissingContainerState(state, existingState);\n return null;\n }\n\n detachedState.container = updated.container;\n installContainerMetadataRecord(detachedState, updated.record);\n installDetachedContainerMetadataState(existingState, detachedState);\n updateContainerContentsSnapshot(state);\n syncAgent.scheduleSync();\n state.runtime.util.log(\n `${getContainerContentsStoreLogLabel(state)}: set container ${containerId} icon to \"${normalizedIcon ?? \"folder\"}\"`,\n );\n return toContainerNode(existingState);\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { runWithSecurityIncidentReporting } from "../../data/keyingProjectionVerification/error.js";
|
|
2
2
|
import { shareContainerState, shareContainerStateWithGroup, } from "../../workflows/container-contents/container-state/share.js";
|
|
3
|
-
import { installContainerMetadataRecord } from "../../workflows/container-contents/metadata.js";
|
|
3
|
+
import { installContainerMetadataRecord } from "../../workflows/container-contents/metadata/index.js";
|
|
4
4
|
import { getContainerContentsStoreLogLabel } from "./logLabel.js";
|
|
5
5
|
import { removeMissingContainerState } from "./missingContainerState.js";
|
|
6
6
|
import { reportContainerShareFailure } from "./reportShareFailure.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createContainerParentSyncLane, loadContainerSyncLaneCheckRecords, } from "../../workflows/container-contents/containerPersistence.js";
|
|
2
|
-
import { hasStartupDocumentSyncWork } from "../../workflows/container-contents/documentPriming.js";
|
|
2
|
+
import { hasStartupDocumentSyncWork } from "../../workflows/container-contents/documentPriming/index.js";
|
|
3
3
|
import { isDatabaseUnavailableError } from "../../workflows/container-contents/syncLane.js";
|
|
4
4
|
const STARTUP_REMOTE_HYDRATION_FRESH_MS = 15 * 60_000;
|
|
5
5
|
function isFreshStartupRemoteHydrationCheck(checkedAt, nowMs) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { RemoteContainerHydrationHost } from "../../workflows/container-contents/remoteHydration.js";
|
|
1
|
+
import type { RemoteContainerHydrationHost } from "../../workflows/container-contents/remoteHydration/index.js";
|
|
2
2
|
import type { ContainerContentsStoreSyncAgent, ContainerContentsStoreSyncState } from "./syncAgentTypes.js";
|
|
3
|
-
export type { ContainerState } from "../../workflows/container-contents/remoteHydration.js";
|
|
3
|
+
export type { ContainerState } from "../../workflows/container-contents/remoteHydration/index.js";
|
|
4
4
|
export type { ContainerContentsStoreRuntime, ContainerContentsStoreSyncAgent, ContainerContentsStoreSyncState, RefreshRootLaneOptions, } from "./syncAgentTypes.js";
|
|
5
5
|
export declare function createContainerContentsStoreSyncAgent(input: {
|
|
6
6
|
host: RemoteContainerHydrationHost;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ContainerContentsPersistence } from "../../workflows/container-contents/containerPersistence.js";
|
|
2
2
|
import type { ContainerContentsProjectionUserKeyResolver } from "../../workflows/container-contents/projectionKeys.js";
|
|
3
|
-
import type { ContainerState, RemoteContainer } from "../../workflows/container-contents/remoteHydration.js";
|
|
3
|
+
import type { ContainerState, RemoteContainer } from "../../workflows/container-contents/remoteHydration/index.js";
|
|
4
4
|
import type { ContainerContentsStoreWorkflowRuntime } from "../../workflows/container-contents/runtime.js";
|
|
5
5
|
import type { ContainerContentsSyncLane } from "../../workflows/container-contents/syncLane.js";
|
|
6
6
|
export type ContainerContentsStoreRuntime = ContainerContentsStoreWorkflowRuntime;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { syncPendingContainerCreateIntents } from "../../workflows/container-contents/container-state/createIntentSync.js";
|
|
2
2
|
import { syncPendingContainerMoveIntents } from "../../workflows/container-contents/container-state/moveIntentSync.js";
|
|
3
|
-
import { syncPendingDocumentMoveIntents, } from "../../workflows/container-contents/documentMoveIntentSync.js";
|
|
4
|
-
import { syncContainerMetadataState } from "../../workflows/container-contents/metadata.js";
|
|
3
|
+
import { syncPendingDocumentMoveIntents, } from "../../workflows/container-contents/documentMove/documentMoveIntentSync.js";
|
|
4
|
+
import { syncContainerMetadataState } from "../../workflows/container-contents/metadata/index.js";
|
|
5
5
|
import { createContainerContentsDocumentsRuntime } from "../../workflows/container-contents/runtime.js";
|
|
6
6
|
import { openDocumentStore, requestDomainDocumentSync } from "../documents/index.js";
|
|
7
7
|
import { relinkDocumentStoreWithCommitSideEffect } from "../documents/documentStore/internalRelink.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncLaneIteration.js","sourceRoot":"","sources":["syncLaneIteration.ts"],"names":[],"mappings":"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","sourcesContent":["import { syncPendingContainerCreateIntents } from \"../../workflows/container-contents/container-state/createIntentSync\";\nimport { syncPendingContainerMoveIntents } from \"../../workflows/container-contents/container-state/moveIntentSync\";\nimport {\n type DocumentMoveIntentSyncHost,\n syncPendingDocumentMoveIntents,\n} from \"../../workflows/container-contents/documentMoveIntentSync\";\nimport { syncContainerMetadataState } from \"../../workflows/container-contents/metadata\";\nimport type {\n ContainerState,\n RemoteContainerHydrationHost,\n} from \"../../workflows/container-contents/remoteHydration\";\nimport { createContainerContentsDocumentsRuntime } from \"../../workflows/container-contents/runtime\";\nimport { openDocumentStore, requestDomainDocumentSync } from \"../documents\";\nimport { relinkDocumentStoreWithCommitSideEffect } from \"../documents/documentStore/internalRelink\";\nimport { DocumentRemoteWorkBusyError } from \"../documents/documentStore/remoteWork\";\nimport { primeStoreDocuments, recoverStoreStaleRoot } from \"./documentRecovery\";\nimport { runContainerDocumentWork } from \"./documentWork\";\nimport {\n bumpMetadataSyncSeq,\n clearMetadataSyncQueueIfUnchanged,\n readMetadataSyncSeq,\n} from \"./metadataSyncSignal\";\nimport { removeMissingSyncedContainerState } from \"./missingSyncedContainerState\";\nimport type {\n ContainerContentsStoreRuntime,\n ContainerContentsStoreSyncState,\n} from \"./syncAgentTypes\";\n\ntype ContainerContentsStorePrimeDocumentRuntime = ReturnType<\n typeof createContainerContentsDocumentsRuntime\n>;\ntype SyncContainerMetadata = typeof syncContainerMetadataState;\n\nfunction requestContainerContentsStoreSync(\n state: ContainerContentsStoreSyncState,\n) {\n state.syncLane?.requestSync();\n}\n\nfunction createRemoteSyncBlocker(runtime: ContainerContentsStoreRuntime) {\n return (organizationId: string) =>\n runtime.util.isRemoteSyncBlocked?.(organizationId) ?? false;\n}\n\nfunction captureStructuralSyncGeneration(\n state: ContainerContentsStoreSyncState,\n runtime: ContainerContentsStoreRuntime,\n) {\n const activeContainerId = runtime.state.containerId;\n const activeOrganizationId = runtime.auth.organizationId;\n const lifecycleGeneration = state.lifecycleGeneration;\n const structuralGeneration = state.structuralGeneration;\n const domainScope = runtime.state.domainScope;\n const execSql = runtime.infra.execSql;\n const resolveProjectionUserKey = state.resolveProjectionUserKey;\n const syncLane = state.syncLane;\n return () =>\n state.lifecycleGeneration === lifecycleGeneration &&\n state.structuralGeneration === structuralGeneration &&\n state.runtime.auth.organizationId === activeOrganizationId &&\n state.runtime.state.containerId === activeContainerId &&\n state.runtime.state.domainScope === domainScope &&\n state.runtime.infra.execSql === execSql &&\n state.resolveProjectionUserKey === resolveProjectionUserKey &&\n state.syncLane === syncLane &&\n !syncLane?.isDisposed?.();\n}\n\nfunction createContainerContentsStoreDocumentMoveHost(\n state: ContainerContentsStoreSyncState,\n isCurrent: () => boolean,\n): DocumentMoveIntentSyncHost<ContainerContentsStorePrimeDocumentRuntime> {\n const runtime = state.runtime;\n const domainScope = runtime.state.domainScope;\n return {\n documentWorkflowRuntime: (containerId) =>\n createContainerContentsDocumentsRuntime(runtime, containerId),\n openDocumentStore: ({ containerId, documentId, localId }) => {\n const store = openDocumentStore(\n domainScope,\n localId,\n createContainerContentsDocumentsRuntime(runtime, containerId),\n documentId,\n );\n return {\n assertCanRotateContentKey: () =>\n store.assertCanRotateContentKey().catch((error: unknown) => {\n if (error instanceof DocumentRemoteWorkBusyError) {\n void error.whenIdle.then(() => {\n if (isCurrent()) requestContainerContentsStoreSync(state);\n });\n }\n throw error;\n }),\n ensureInitialized: () => store.ensureInitialized(),\n relink: ({ commitSideEffect, ...input }) =>\n commitSideEffect\n ? relinkDocumentStoreWithCommitSideEffect(\n store,\n input,\n commitSideEffect,\n )\n : store.relink(input),\n requestSync: () => store.requestSync(),\n updateRuntime: (nextRuntime) => store.updateRuntime(nextRuntime),\n };\n },\n };\n}\n\nfunction syncPendingStoreDocumentMoves(input: {\n isCreatePending: (containerId: string) => boolean;\n isCurrent: () => boolean;\n isRemoteSyncBlocked: (organizationId: string) => boolean;\n state: ContainerContentsStoreSyncState;\n}) {\n return syncPendingDocumentMoveIntents({\n host: createContainerContentsStoreDocumentMoveHost(\n input.state,\n input.isCurrent,\n ),\n isCreatePending: input.isCreatePending,\n isCurrent: input.isCurrent,\n isRemoteSyncBlocked: input.isRemoteSyncBlocked,\n state: input.state,\n });\n}\n\nasync function syncSingleContainerMetadata(input: {\n host: RemoteContainerHydrationHost;\n isCurrent: () => boolean;\n state: ContainerContentsStoreSyncState;\n containerState: ContainerState;\n encapsulationKeyPair: NonNullable<\n ContainerContentsStoreRuntime[\"crypto\"][\"encapsulationKeyPair\"]\n >;\n syncContainerMetadata?: SyncContainerMetadata | undefined;\n}) {\n const { containerState, encapsulationKeyPair, host, isCurrent, state } =\n input;\n const metadataDocumentId = containerState.record.documentId;\n // Snapshot this signal before the GET so a mid-pass event survives clearing.\n const consumedSeqById = new Map<string, number>();\n if (typeof metadataDocumentId === \"string\") {\n consumedSeqById.set(\n metadataDocumentId,\n readMetadataSyncSeq(state.metadataSyncSignalSeqById, metadataDocumentId),\n );\n }\n const synced = await (\n input.syncContainerMetadata ?? syncContainerMetadataState\n )({\n forceReadSync:\n typeof metadataDocumentId === \"string\" &&\n state.metadataDocumentIdsNeedingSync.has(metadataDocumentId),\n locallyAcceptedUpdateIds: state.locallyAcceptedMetadataUpdateIds,\n isCurrent,\n metadataState: containerState,\n onDurableStateNeedsReload: () => {\n const currentDocumentId = state.containersById.get(\n containerState.container.id,\n )?.record.documentId;\n if (typeof currentDocumentId === \"string\") {\n state.metadataDocumentIdsNeedingSync.add(currentDocumentId);\n bumpMetadataSyncSeq(state.metadataSyncSignalSeqById, currentDocumentId);\n }\n requestContainerContentsStoreSync(state);\n },\n persistence: state.persistence,\n resolveProjectionUserKey: state.resolveProjectionUserKey,\n runtime: state.runtime,\n targetSecretKey: encapsulationKeyPair.secretKey,\n });\n if (!isCurrent() || !synced) {\n return;\n }\n if (\"missing\" in synced) {\n removeMissingSyncedContainerState(\n state,\n containerState,\n host.updateSnapshot,\n );\n return;\n }\n\n for (const id of [metadataDocumentId, synced.record.documentId]) {\n if (typeof id === \"string\") {\n clearMetadataSyncQueueIfUnchanged({\n consumedSeqById,\n id,\n needingSync: state.metadataDocumentIdsNeedingSync,\n seqById: state.metadataSyncSignalSeqById,\n });\n }\n }\n // syncContainerMetadataState settles its detached candidate into this live\n // object while preserving any metadata edit that completed or queued during\n // the remote pass. Do not install its returned detached record again here:\n // doing so would overwrite that preserved live edit.\n host.updateSnapshot();\n\n if (synced.shouldRequestFollowupSync) {\n requestContainerContentsStoreSync(state);\n }\n}\n\n/**\n * A folder whose create has not settled can carry a listed identity that\n * adoption has not verified, or has refused. Folder moves, document moves and\n * metadata edits wait for it; child and document creates wait in their own\n * create paths.\n */\nasync function loadPendingCreatePredicate(\n state: ContainerContentsStoreSyncState,\n): Promise<(containerId: string) => boolean> {\n const pending = await state.persistence.listPendingCreateIntents(\n state.runtime.infra.execSql,\n );\n const pendingIds = new Set(pending.map((intent) => intent.containerId));\n return (containerId) => pendingIds.has(containerId);\n}\n\ninterface ContainerContentsStoreSyncIterationInput {\n host: RemoteContainerHydrationHost;\n reconcileRestoredAccess: (isCurrent: () => boolean) => Promise<void>;\n requestRemoteReconciliation: (parentContainerId: string | null) => void;\n state: ContainerContentsStoreSyncState;\n syncContainerMetadata?: SyncContainerMetadata | undefined;\n}\n\nexport async function runContainerContentsStoreSyncIteration(\n input: ContainerContentsStoreSyncIterationInput,\n) {\n const { host, reconcileRestoredAccess, requestRemoteReconciliation, state } =\n input;\n const runtime = state.runtime;\n const encapsulationKeyPair = runtime.crypto.encapsulationKeyPair;\n if (\n runtime.infra.dbStatus !== \"ready\" ||\n !state.snapshot.ready ||\n !runtime.state.online ||\n !runtime.auth.isAuthenticated ||\n !encapsulationKeyPair\n ) {\n return;\n }\n const domainScope = runtime.state.domainScope;\n const isCurrent = captureStructuralSyncGeneration(state, runtime);\n\n await reconcileRestoredAccess(isCurrent);\n if (!isCurrent()) {\n return;\n }\n const isOrganizationBlocked = createRemoteSyncBlocker(runtime);\n\n const createdContainerCount = await syncPendingContainerCreateIntents({\n host,\n isCurrent,\n isRemoteSyncBlocked: isOrganizationBlocked,\n requestRemoteReconciliation,\n state,\n });\n if (!isCurrent()) {\n return;\n }\n if (createdContainerCount > 0) {\n state.documentStoresNeedPriming = true;\n host.updateSnapshot();\n }\n const isCreatePending = await loadPendingCreatePredicate(state);\n if (!isCurrent()) {\n return;\n }\n\n const movedContainerCount = await syncPendingContainerMoveIntents({\n host,\n isCreatePending,\n isCurrent,\n isRemoteSyncBlocked: isOrganizationBlocked,\n requestRemoteReconciliation,\n state,\n });\n if (!isCurrent()) {\n return;\n }\n if (movedContainerCount > 0) {\n state.documentStoresNeedPriming = true;\n host.updateSnapshot();\n requestDomainDocumentSync(domainScope);\n requestContainerContentsStoreSync(state);\n }\n\n for (const containerState of Array.from(state.containersById.values())) {\n if (isCreatePending(containerState.container.id)) continue;\n await syncSingleContainerMetadata({\n containerState,\n encapsulationKeyPair,\n host,\n isCurrent,\n state,\n syncContainerMetadata: input.syncContainerMetadata,\n });\n if (!isCurrent()) {\n return;\n }\n }\n\n // Root adoption notifies session consumers synchronously. Let container\n // metadata converge first so a recovered system container is never exposed\n // under its placeholder name when the active root changes.\n await runContainerDocumentWork({\n isCurrent,\n onContextChanged: () => {\n if (isCurrent()) {\n requestContainerContentsStoreSync(state);\n }\n },\n onDocumentsMoved: () => {\n if (isCurrent()) {\n requestDomainDocumentSync(domainScope);\n requestContainerContentsStoreSync(state);\n }\n },\n primeDocuments: () => primeStoreDocuments(state, isCurrent),\n recoverStaleRoot: () => recoverStoreStaleRoot(state, isCurrent),\n shouldPrimeDocuments: () => state.documentStoresNeedPriming,\n // Document move intents live in the structural phase because they may\n // target containers created locally in the same session, such as Trash.\n // Root recovery rewrites stale endpoints and returns their intents to\n // pending, so replay follows recovery in this same pass.\n syncPendingDocumentMoves: () =>\n syncPendingStoreDocumentMoves({\n isCreatePending,\n isCurrent,\n isRemoteSyncBlocked: isOrganizationBlocked,\n state,\n }),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"syncLaneIteration.js","sourceRoot":"","sources":["syncLaneIteration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,qEAAqE,CAAC;AACxH,OAAO,EAAE,+BAA+B,EAAE,MAAM,mEAAmE,CAAC;AACpH,OAAO,EAEL,8BAA8B,GAC/B,MAAM,wEAAwE,CAAC;AAChF,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AAKzF,OAAO,EAAE,uCAAuC,EAAE,MAAM,4CAA4C,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,uCAAuC,EAAE,MAAM,2CAA2C,CAAC;AACpG,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EACL,mBAAmB,EACnB,iCAAiC,EACjC,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iCAAiC,EAAE,MAAM,+BAA+B,CAAC;AAWlF,SAAS,iCAAiC,CACxC,KAAsC;IAEtC,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAsC;IACrE,OAAO,CAAC,cAAsB,EAAE,EAAE,CAChC,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;AAChE,CAAC;AAED,SAAS,+BAA+B,CACtC,KAAsC,EACtC,OAAsC;IAEtC,MAAM,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;IACpD,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC;IACzD,MAAM,mBAAmB,GAAG,KAAK,CAAC,mBAAmB,CAAC;IACtD,MAAM,oBAAoB,GAAG,KAAK,CAAC,oBAAoB,CAAC;IACxD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;IACtC,MAAM,wBAAwB,GAAG,KAAK,CAAC,wBAAwB,CAAC;IAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,OAAO,GAAG,EAAE,CACV,KAAK,CAAC,mBAAmB,KAAK,mBAAmB;QACjD,KAAK,CAAC,oBAAoB,KAAK,oBAAoB;QACnD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,KAAK,oBAAoB;QAC1D,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,iBAAiB;QACrD,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,WAAW;QAC/C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO;QACvC,KAAK,CAAC,wBAAwB,KAAK,wBAAwB;QAC3D,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,4CAA4C,CACnD,KAAsC,EACtC,SAAwB;IAExB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;IAC9C,OAAO;QACL,uBAAuB,EAAE,CAAC,WAAW,EAAE,EAAE,CACvC,uCAAuC,CAAC,OAAO,EAAE,WAAW,CAAC;QAC/D,iBAAiB,EAAE,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;YAC1D,MAAM,KAAK,GAAG,iBAAiB,CAC7B,WAAW,EACX,OAAO,EACP,uCAAuC,CAAC,OAAO,EAAE,WAAW,CAAC,EAC7D,UAAU,CACX,CAAC;YACF,OAAO;gBACL,yBAAyB,EAAE,GAAG,EAAE,CAC9B,KAAK,CAAC,yBAAyB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;oBACzD,IAAI,KAAK,YAAY,2BAA2B,EAAE,CAAC;wBACjD,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;4BAC5B,IAAI,SAAS,EAAE;gCAAE,iCAAiC,CAAC,KAAK,CAAC,CAAC;wBAC5D,CAAC,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC,CAAC;gBACJ,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE;gBAClD,MAAM,EAAE,CAAC,EAAE,gBAAgB,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CACzC,gBAAgB;oBACd,CAAC,CAAC,uCAAuC,CACrC,KAAK,EACL,KAAK,EACL,gBAAgB,CACjB;oBACH,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;gBACzB,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE;gBACtC,aAAa,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC;aACjE,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B,CAAC,KAKtC;IACC,OAAO,8BAA8B,CAAC;QACpC,IAAI,EAAE,4CAA4C,CAChD,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,SAAS,CAChB;QACD,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,2BAA2B,CAAC,KAS1C;IACC,MAAM,EAAE,cAAc,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GACpE,KAAK,CAAC;IACR,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC;IAC5D,6EAA6E;IAC7E,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,IAAI,OAAO,kBAAkB,KAAK,QAAQ,EAAE,CAAC;QAC3C,eAAe,CAAC,GAAG,CACjB,kBAAkB,EAClB,mBAAmB,CAAC,KAAK,CAAC,yBAAyB,EAAE,kBAAkB,CAAC,CACzE,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CACnB,KAAK,CAAC,qBAAqB,IAAI,0BAA0B,CAC1D,CAAC;QACA,aAAa,EACX,OAAO,kBAAkB,KAAK,QAAQ;YACtC,KAAK,CAAC,8BAA8B,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC9D,wBAAwB,EAAE,KAAK,CAAC,gCAAgC;QAChE,SAAS;QACT,aAAa,EAAE,cAAc;QAC7B,yBAAyB,EAAE,GAAG,EAAE;YAC9B,MAAM,iBAAiB,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAChD,cAAc,CAAC,SAAS,CAAC,EAAE,CAC5B,EAAE,MAAM,CAAC,UAAU,CAAC;YACrB,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;gBAC1C,KAAK,CAAC,8BAA8B,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC5D,mBAAmB,CAAC,KAAK,CAAC,yBAAyB,EAAE,iBAAiB,CAAC,CAAC;YAC1E,CAAC;YACD,iCAAiC,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,wBAAwB,EAAE,KAAK,CAAC,wBAAwB;QACxD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,eAAe,EAAE,oBAAoB,CAAC,SAAS;KAChD,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IACD,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QACxB,iCAAiC,CAC/B,KAAK,EACL,cAAc,EACd,IAAI,CAAC,cAAc,CACpB,CAAC;QACF,OAAO;IACT,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAChE,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC3B,iCAAiC,CAAC;gBAChC,eAAe;gBACf,EAAE;gBACF,WAAW,EAAE,KAAK,CAAC,8BAA8B;gBACjD,OAAO,EAAE,KAAK,CAAC,yBAAyB;aACzC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,2EAA2E;IAC3E,4EAA4E;IAC5E,2EAA2E;IAC3E,qDAAqD;IACrD,IAAI,CAAC,cAAc,EAAE,CAAC;IAEtB,IAAI,MAAM,CAAC,yBAAyB,EAAE,CAAC;QACrC,iCAAiC,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,0BAA0B,CACvC,KAAsC;IAEtC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,wBAAwB,CAC9D,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAC5B,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACtD,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,sCAAsC,CAC1D,KAA+C;IAE/C,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,KAAK,EAAE,GACzE,KAAK,CAAC;IACR,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC;IACjE,IACE,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO;QAClC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK;QACrB,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;QACrB,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe;QAC7B,CAAC,oBAAoB,EACrB,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;IAC9C,MAAM,SAAS,GAAG,+BAA+B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAElE,MAAM,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IACD,MAAM,qBAAqB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAE/D,MAAM,qBAAqB,GAAG,MAAM,iCAAiC,CAAC;QACpE,IAAI;QACJ,SAAS;QACT,mBAAmB,EAAE,qBAAqB;QAC1C,2BAA2B;QAC3B,KAAK;KACN,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IACD,IAAI,qBAAqB,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IACD,MAAM,eAAe,GAAG,MAAM,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAChE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,MAAM,mBAAmB,GAAG,MAAM,+BAA+B,CAAC;QAChE,IAAI;QACJ,eAAe;QACf,SAAS;QACT,mBAAmB,EAAE,qBAAqB;QAC1C,2BAA2B;QAC3B,KAAK;KACN,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IACD,IAAI,mBAAmB,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,yBAAyB,CAAC,WAAW,CAAC,CAAC;QACvC,iCAAiC,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,MAAM,cAAc,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QACvE,IAAI,eAAe,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YAAE,SAAS;QAC3D,MAAM,2BAA2B,CAAC;YAChC,cAAc;YACd,oBAAoB;YACpB,IAAI;YACJ,SAAS;YACT,KAAK;YACL,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;SACnD,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,2EAA2E;IAC3E,2DAA2D;IAC3D,MAAM,wBAAwB,CAAC;QAC7B,SAAS;QACT,gBAAgB,EAAE,GAAG,EAAE;YACrB,IAAI,SAAS,EAAE,EAAE,CAAC;gBAChB,iCAAiC,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,gBAAgB,EAAE,GAAG,EAAE;YACrB,IAAI,SAAS,EAAE,EAAE,CAAC;gBAChB,yBAAyB,CAAC,WAAW,CAAC,CAAC;gBACvC,iCAAiC,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,cAAc,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,SAAS,CAAC;QAC3D,gBAAgB,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,SAAS,CAAC;QAC/D,oBAAoB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,yBAAyB;QAC3D,sEAAsE;QACtE,wEAAwE;QACxE,sEAAsE;QACtE,yDAAyD;QACzD,wBAAwB,EAAE,GAAG,EAAE,CAC7B,6BAA6B,CAAC;YAC5B,eAAe;YACf,SAAS;YACT,mBAAmB,EAAE,qBAAqB;YAC1C,KAAK;SACN,CAAC;KACL,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { syncPendingContainerCreateIntents } from \"../../workflows/container-contents/container-state/createIntentSync\";\nimport { syncPendingContainerMoveIntents } from \"../../workflows/container-contents/container-state/moveIntentSync\";\nimport {\n type DocumentMoveIntentSyncHost,\n syncPendingDocumentMoveIntents,\n} from \"../../workflows/container-contents/documentMove/documentMoveIntentSync\";\nimport { syncContainerMetadataState } from \"../../workflows/container-contents/metadata\";\nimport type {\n ContainerState,\n RemoteContainerHydrationHost,\n} from \"../../workflows/container-contents/remoteHydration\";\nimport { createContainerContentsDocumentsRuntime } from \"../../workflows/container-contents/runtime\";\nimport { openDocumentStore, requestDomainDocumentSync } from \"../documents\";\nimport { relinkDocumentStoreWithCommitSideEffect } from \"../documents/documentStore/internalRelink\";\nimport { DocumentRemoteWorkBusyError } from \"../documents/documentStore/remoteWork\";\nimport { primeStoreDocuments, recoverStoreStaleRoot } from \"./documentRecovery\";\nimport { runContainerDocumentWork } from \"./documentWork\";\nimport {\n bumpMetadataSyncSeq,\n clearMetadataSyncQueueIfUnchanged,\n readMetadataSyncSeq,\n} from \"./metadataSyncSignal\";\nimport { removeMissingSyncedContainerState } from \"./missingSyncedContainerState\";\nimport type {\n ContainerContentsStoreRuntime,\n ContainerContentsStoreSyncState,\n} from \"./syncAgentTypes\";\n\ntype ContainerContentsStorePrimeDocumentRuntime = ReturnType<\n typeof createContainerContentsDocumentsRuntime\n>;\ntype SyncContainerMetadata = typeof syncContainerMetadataState;\n\nfunction requestContainerContentsStoreSync(\n state: ContainerContentsStoreSyncState,\n) {\n state.syncLane?.requestSync();\n}\n\nfunction createRemoteSyncBlocker(runtime: ContainerContentsStoreRuntime) {\n return (organizationId: string) =>\n runtime.util.isRemoteSyncBlocked?.(organizationId) ?? false;\n}\n\nfunction captureStructuralSyncGeneration(\n state: ContainerContentsStoreSyncState,\n runtime: ContainerContentsStoreRuntime,\n) {\n const activeContainerId = runtime.state.containerId;\n const activeOrganizationId = runtime.auth.organizationId;\n const lifecycleGeneration = state.lifecycleGeneration;\n const structuralGeneration = state.structuralGeneration;\n const domainScope = runtime.state.domainScope;\n const execSql = runtime.infra.execSql;\n const resolveProjectionUserKey = state.resolveProjectionUserKey;\n const syncLane = state.syncLane;\n return () =>\n state.lifecycleGeneration === lifecycleGeneration &&\n state.structuralGeneration === structuralGeneration &&\n state.runtime.auth.organizationId === activeOrganizationId &&\n state.runtime.state.containerId === activeContainerId &&\n state.runtime.state.domainScope === domainScope &&\n state.runtime.infra.execSql === execSql &&\n state.resolveProjectionUserKey === resolveProjectionUserKey &&\n state.syncLane === syncLane &&\n !syncLane?.isDisposed?.();\n}\n\nfunction createContainerContentsStoreDocumentMoveHost(\n state: ContainerContentsStoreSyncState,\n isCurrent: () => boolean,\n): DocumentMoveIntentSyncHost<ContainerContentsStorePrimeDocumentRuntime> {\n const runtime = state.runtime;\n const domainScope = runtime.state.domainScope;\n return {\n documentWorkflowRuntime: (containerId) =>\n createContainerContentsDocumentsRuntime(runtime, containerId),\n openDocumentStore: ({ containerId, documentId, localId }) => {\n const store = openDocumentStore(\n domainScope,\n localId,\n createContainerContentsDocumentsRuntime(runtime, containerId),\n documentId,\n );\n return {\n assertCanRotateContentKey: () =>\n store.assertCanRotateContentKey().catch((error: unknown) => {\n if (error instanceof DocumentRemoteWorkBusyError) {\n void error.whenIdle.then(() => {\n if (isCurrent()) requestContainerContentsStoreSync(state);\n });\n }\n throw error;\n }),\n ensureInitialized: () => store.ensureInitialized(),\n relink: ({ commitSideEffect, ...input }) =>\n commitSideEffect\n ? relinkDocumentStoreWithCommitSideEffect(\n store,\n input,\n commitSideEffect,\n )\n : store.relink(input),\n requestSync: () => store.requestSync(),\n updateRuntime: (nextRuntime) => store.updateRuntime(nextRuntime),\n };\n },\n };\n}\n\nfunction syncPendingStoreDocumentMoves(input: {\n isCreatePending: (containerId: string) => boolean;\n isCurrent: () => boolean;\n isRemoteSyncBlocked: (organizationId: string) => boolean;\n state: ContainerContentsStoreSyncState;\n}) {\n return syncPendingDocumentMoveIntents({\n host: createContainerContentsStoreDocumentMoveHost(\n input.state,\n input.isCurrent,\n ),\n isCreatePending: input.isCreatePending,\n isCurrent: input.isCurrent,\n isRemoteSyncBlocked: input.isRemoteSyncBlocked,\n state: input.state,\n });\n}\n\nasync function syncSingleContainerMetadata(input: {\n host: RemoteContainerHydrationHost;\n isCurrent: () => boolean;\n state: ContainerContentsStoreSyncState;\n containerState: ContainerState;\n encapsulationKeyPair: NonNullable<\n ContainerContentsStoreRuntime[\"crypto\"][\"encapsulationKeyPair\"]\n >;\n syncContainerMetadata?: SyncContainerMetadata | undefined;\n}) {\n const { containerState, encapsulationKeyPair, host, isCurrent, state } =\n input;\n const metadataDocumentId = containerState.record.documentId;\n // Snapshot this signal before the GET so a mid-pass event survives clearing.\n const consumedSeqById = new Map<string, number>();\n if (typeof metadataDocumentId === \"string\") {\n consumedSeqById.set(\n metadataDocumentId,\n readMetadataSyncSeq(state.metadataSyncSignalSeqById, metadataDocumentId),\n );\n }\n const synced = await (\n input.syncContainerMetadata ?? syncContainerMetadataState\n )({\n forceReadSync:\n typeof metadataDocumentId === \"string\" &&\n state.metadataDocumentIdsNeedingSync.has(metadataDocumentId),\n locallyAcceptedUpdateIds: state.locallyAcceptedMetadataUpdateIds,\n isCurrent,\n metadataState: containerState,\n onDurableStateNeedsReload: () => {\n const currentDocumentId = state.containersById.get(\n containerState.container.id,\n )?.record.documentId;\n if (typeof currentDocumentId === \"string\") {\n state.metadataDocumentIdsNeedingSync.add(currentDocumentId);\n bumpMetadataSyncSeq(state.metadataSyncSignalSeqById, currentDocumentId);\n }\n requestContainerContentsStoreSync(state);\n },\n persistence: state.persistence,\n resolveProjectionUserKey: state.resolveProjectionUserKey,\n runtime: state.runtime,\n targetSecretKey: encapsulationKeyPair.secretKey,\n });\n if (!isCurrent() || !synced) {\n return;\n }\n if (\"missing\" in synced) {\n removeMissingSyncedContainerState(\n state,\n containerState,\n host.updateSnapshot,\n );\n return;\n }\n\n for (const id of [metadataDocumentId, synced.record.documentId]) {\n if (typeof id === \"string\") {\n clearMetadataSyncQueueIfUnchanged({\n consumedSeqById,\n id,\n needingSync: state.metadataDocumentIdsNeedingSync,\n seqById: state.metadataSyncSignalSeqById,\n });\n }\n }\n // syncContainerMetadataState settles its detached candidate into this live\n // object while preserving any metadata edit that completed or queued during\n // the remote pass. Do not install its returned detached record again here:\n // doing so would overwrite that preserved live edit.\n host.updateSnapshot();\n\n if (synced.shouldRequestFollowupSync) {\n requestContainerContentsStoreSync(state);\n }\n}\n\n/**\n * A folder whose create has not settled can carry a listed identity that\n * adoption has not verified, or has refused. Folder moves, document moves and\n * metadata edits wait for it; child and document creates wait in their own\n * create paths.\n */\nasync function loadPendingCreatePredicate(\n state: ContainerContentsStoreSyncState,\n): Promise<(containerId: string) => boolean> {\n const pending = await state.persistence.listPendingCreateIntents(\n state.runtime.infra.execSql,\n );\n const pendingIds = new Set(pending.map((intent) => intent.containerId));\n return (containerId) => pendingIds.has(containerId);\n}\n\ninterface ContainerContentsStoreSyncIterationInput {\n host: RemoteContainerHydrationHost;\n reconcileRestoredAccess: (isCurrent: () => boolean) => Promise<void>;\n requestRemoteReconciliation: (parentContainerId: string | null) => void;\n state: ContainerContentsStoreSyncState;\n syncContainerMetadata?: SyncContainerMetadata | undefined;\n}\n\nexport async function runContainerContentsStoreSyncIteration(\n input: ContainerContentsStoreSyncIterationInput,\n) {\n const { host, reconcileRestoredAccess, requestRemoteReconciliation, state } =\n input;\n const runtime = state.runtime;\n const encapsulationKeyPair = runtime.crypto.encapsulationKeyPair;\n if (\n runtime.infra.dbStatus !== \"ready\" ||\n !state.snapshot.ready ||\n !runtime.state.online ||\n !runtime.auth.isAuthenticated ||\n !encapsulationKeyPair\n ) {\n return;\n }\n const domainScope = runtime.state.domainScope;\n const isCurrent = captureStructuralSyncGeneration(state, runtime);\n\n await reconcileRestoredAccess(isCurrent);\n if (!isCurrent()) {\n return;\n }\n const isOrganizationBlocked = createRemoteSyncBlocker(runtime);\n\n const createdContainerCount = await syncPendingContainerCreateIntents({\n host,\n isCurrent,\n isRemoteSyncBlocked: isOrganizationBlocked,\n requestRemoteReconciliation,\n state,\n });\n if (!isCurrent()) {\n return;\n }\n if (createdContainerCount > 0) {\n state.documentStoresNeedPriming = true;\n host.updateSnapshot();\n }\n const isCreatePending = await loadPendingCreatePredicate(state);\n if (!isCurrent()) {\n return;\n }\n\n const movedContainerCount = await syncPendingContainerMoveIntents({\n host,\n isCreatePending,\n isCurrent,\n isRemoteSyncBlocked: isOrganizationBlocked,\n requestRemoteReconciliation,\n state,\n });\n if (!isCurrent()) {\n return;\n }\n if (movedContainerCount > 0) {\n state.documentStoresNeedPriming = true;\n host.updateSnapshot();\n requestDomainDocumentSync(domainScope);\n requestContainerContentsStoreSync(state);\n }\n\n for (const containerState of Array.from(state.containersById.values())) {\n if (isCreatePending(containerState.container.id)) continue;\n await syncSingleContainerMetadata({\n containerState,\n encapsulationKeyPair,\n host,\n isCurrent,\n state,\n syncContainerMetadata: input.syncContainerMetadata,\n });\n if (!isCurrent()) {\n return;\n }\n }\n\n // Root adoption notifies session consumers synchronously. Let container\n // metadata converge first so a recovered system container is never exposed\n // under its placeholder name when the active root changes.\n await runContainerDocumentWork({\n isCurrent,\n onContextChanged: () => {\n if (isCurrent()) {\n requestContainerContentsStoreSync(state);\n }\n },\n onDocumentsMoved: () => {\n if (isCurrent()) {\n requestDomainDocumentSync(domainScope);\n requestContainerContentsStoreSync(state);\n }\n },\n primeDocuments: () => primeStoreDocuments(state, isCurrent),\n recoverStaleRoot: () => recoverStoreStaleRoot(state, isCurrent),\n shouldPrimeDocuments: () => state.documentStoresNeedPriming,\n // Document move intents live in the structural phase because they may\n // target containers created locally in the same session, such as Trash.\n // Root recovery rewrites stale endpoints and returns their intents to\n // pending, so replay follows recovery in this same pass.\n syncPendingDocumentMoves: () =>\n syncPendingStoreDocumentMoves({\n isCreatePending,\n isCurrent,\n isRemoteSyncBlocked: isOrganizationBlocked,\n state,\n }),\n });\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { encodeVersionVector, exportUpdatesSince } from "../../internal/loro/index.js";
|
|
2
2
|
import { getDefaultContainerName, readContainerMetadataValue, writeContainerMetadataValue, } from "../../data/containers/containerMetadataDocument.js";
|
|
3
|
-
import { createDetachedContainerMetadataState, installDetachedContainerMetadataState, } from "../../workflows/container-contents/metadataStateIsolation.js";
|
|
3
|
+
import { createDetachedContainerMetadataState, installDetachedContainerMetadataState, } from "../../workflows/container-contents/metadata/metadataStateIsolation.js";
|
|
4
4
|
import { removeMissingContainerState } from "./missingContainerState.js";
|
|
5
5
|
import { updateContainerContentsSnapshot } from "./state.js";
|
|
6
6
|
function normalizeSystemContainerIcon(icon) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"systemContainerIcon.js","sourceRoot":"","sources":["systemContainerIcon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,oCAAoC,EACpC,qCAAqC,GACtC,MAAM,
|
|
1
|
+
{"version":3,"file":"systemContainerIcon.js","sourceRoot":"","sources":["systemContainerIcon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,oCAAoC,EACpC,qCAAqC,GACtC,MAAM,oEAAoE,CAAC;AAE5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,+BAA+B,EAAE,MAAM,SAAS,CAAC;AAc1D,SAAS,4BAA4B,CACnC,IAA+B;IAE/B,OAAO,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,KAO9C;IACC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,4BAA4B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC;IAChE,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,SAAS,EAAE;QAAE,OAAO,KAAK,CAAC;IAC/B,MAAM,oBAAoB,GAAG,MAAM,oCAAoC,CACrE,KAAK,CAAC,cAAc,CACrB,CAAC;IACF,IAAI,CAAC,SAAS,EAAE;QAAE,OAAO,KAAK,CAAC;IAC/B,MAAM,QAAQ,GAAG,0BAA0B,CACzC,oBAAoB,CAAC,GAAG,EACxB,uBAAuB,CAAC,oBAAoB,CAAC,SAAS,CAAC,QAAQ,CAAC,CACjE,CAAC;IACF,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1E,2BAA2B,CAAC,oBAAoB,CAAC,GAAG,EAAE;QACpD,GAAG,QAAQ;QACX,IAAI;KACL,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,kBAAkB,CAC/B,oBAAoB,CAAC,GAAG,EACxB,mBAAmB,CACpB,CAAC;IACF,MAAM,iBAAiB,GAAG,MAAM,KAAK,CAAC,WAAW,CAC/C,oBAAoB,EACpB,IAAI,EACJ,MAAM,CACP,CAAC;IACF,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,2BAA2B,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,iBAAiB,KAAK,WAAW,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,qCAAqC,CACnC,KAAK,CAAC,cAAc,EACpB,oBAAoB,EACpB,EAAE,8BAA8B,EAAE,IAAI,EAAE,CACzC,CAAC;IACF,+BAA+B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC3C,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { encodeVersionVector, exportUpdatesSince } from \"@tearleads/loro\";\nimport {\n getDefaultContainerName,\n readContainerMetadataValue,\n writeContainerMetadataValue,\n} from \"../../data/containers/containerMetadataDocument\";\nimport {\n createDetachedContainerMetadataState,\n installDetachedContainerMetadataState,\n} from \"../../workflows/container-contents/metadata/metadataStateIsolation\";\nimport type { PersistContainerStateResult } from \"../../workflows/container-contents/remoteHydration\";\nimport { removeMissingContainerState } from \"./missingContainerState\";\nimport { updateContainerContentsSnapshot } from \"./state\";\nimport type {\n ContainerContentsStoreSyncAgent,\n ContainerState,\n} from \"./syncAgent\";\nimport type { ContainerContentsStoreState } from \"./types\";\nimport type { ContainerWriteGuard } from \"./writeGeneration\";\n\ntype PersistSystemContainerIcon = (\n containerState: ContainerState,\n icon: string | null,\n update: Uint8Array,\n) => Promise<PersistContainerStateResult[\"status\"]>;\n\nfunction normalizeSystemContainerIcon(\n icon: string | null | undefined,\n): string | null {\n return icon?.trim() || null;\n}\n\nexport async function applySystemContainerIcon(input: {\n readonly containerState: ContainerState;\n readonly icon: string | null | undefined;\n readonly persistIcon: PersistSystemContainerIcon;\n readonly state: ContainerContentsStoreState;\n readonly syncAgent: ContainerContentsStoreSyncAgent;\n readonly isCurrent?: ContainerWriteGuard | undefined;\n}): Promise<boolean> {\n const isCurrent = input.isCurrent ?? (() => true);\n const icon = normalizeSystemContainerIcon(input.icon);\n const currentIcon = input.containerState.container.icon ?? null;\n if (currentIcon === icon) {\n return true;\n }\n\n if (!isCurrent()) return false;\n const persistenceCandidate = await createDetachedContainerMetadataState(\n input.containerState,\n );\n if (!isCurrent()) return false;\n const metadata = readContainerMetadataValue(\n persistenceCandidate.doc,\n getDefaultContainerName(persistenceCandidate.container.parentId),\n );\n const sourceVersionVector = encodeVersionVector(persistenceCandidate.doc);\n writeContainerMetadataValue(persistenceCandidate.doc, {\n ...metadata,\n icon,\n });\n const update = exportUpdatesSince(\n persistenceCandidate.doc,\n sourceVersionVector,\n );\n const persistenceStatus = await input.persistIcon(\n persistenceCandidate,\n icon,\n update,\n );\n if (persistenceStatus === \"missing\") {\n removeMissingContainerState(input.state, input.containerState);\n }\n if (persistenceStatus !== \"persisted\" || !isCurrent()) {\n return false;\n }\n installDetachedContainerMetadataState(\n input.containerState,\n persistenceCandidate,\n { preserveConcurrentMetadataEdit: true },\n );\n updateContainerContentsSnapshot(input.state);\n if (input.containerState.record.documentId) {\n input.syncAgent.scheduleSync();\n }\n return true;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DocumentEditAttributionRangeResponse, ListDocumentEditAttributionRangesResponse } from "
|
|
1
|
+
import type { DocumentEditAttributionRangeResponse, ListDocumentEditAttributionRangesResponse } from "../../../internal/validators/response/index.js";
|
|
2
2
|
export interface DocumentAttributionRangesInput {
|
|
3
3
|
readonly cursor?: string | null | undefined;
|
|
4
4
|
readonly documentId: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { base64ToBytes } from "
|
|
2
|
-
import { listSnapshotCharBlameSource } from "
|
|
3
|
-
import { summarizeDocumentBlame, } from "
|
|
1
|
+
import { base64ToBytes } from "../../../internal/encoding/index.js";
|
|
2
|
+
import { listSnapshotCharBlameSource } from "../../../internal/loro/index.js";
|
|
3
|
+
import { summarizeDocumentBlame, } from "../../../data/documents/editAttribution.js";
|
|
4
4
|
// Op-id extraction is linear (~1.8µs/char — ~90ms for a 50k snapshot, flat per
|
|
5
5
|
// char), so this cap is a soft guard against pathologically large prose, not a
|
|
6
6
|
// quadratic cliff: above it blame surfaces null rather than doing unbounded
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentCharacterBlame.js","sourceRoot":"","sources":["documentCharacterBlame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAGL,sBAAsB,GACvB,MAAM,yCAAyC,CAAC;AAEjD,+EAA+E;AAC/E,+EAA+E;AAC/E,4EAA4E;AAC5E,8CAA8C;AAC9C,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAClC,eAA8B,EAC9B,QAAqD;IAOrD,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,2BAA2B,CACxC,aAAa,CAAC,eAAe,CAAC,EAC9B,yBAAyB,CAC1B,CAAC;QACF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { base64ToBytes } from \"@tearleads/encoding\";\nimport { listSnapshotCharBlameSource } from \"@tearleads/loro\";\nimport type { DocumentEditAttributionResponse } from \"@tearleads/validators/response\";\nimport {\n type DocumentBlameRange,\n type DocumentCharacterBlameSummary,\n summarizeDocumentBlame,\n} from \"../../../data/documents/editAttribution\";\n\n// Op-id extraction is linear (~1.8µs/char — ~90ms for a 50k snapshot, flat per\n// char), so this cap is a soft guard against pathologically large prose, not a\n// quadratic cliff: above it blame surfaces null rather than doing unbounded\n// synchronous work when the Info panel opens.\nconst MAX_BLAME_CHARACTER_COUNT = 50_000;\n\n/**\n * Rebuild the document's per-character op ids from the locally persisted\n * content snapshot and resolve them against the attribution segments — in a\n * single snapshot reconstruction — into both the per-writer blame summary and\n * the coalesced per-writer ranges. Returns null when blame can't be produced:\n * no local snapshot, a snapshot too large to scan cheaply, or an unreadable\n * snapshot — blame is supplementary and must never block (or blank) the rest\n * of the Info panel, mirroring the attribution fetch's degrade-to-null.\n */\nexport function computeDocumentBlame(\n contentSnapshot: string | null,\n segments: DocumentEditAttributionResponse[\"segments\"],\n): {\n /** Per-writer live-character counts (the Contributors-style rollup). */\n characterBlame: DocumentCharacterBlameSummary;\n /** Contiguous per-writer runs of the current prose (the read-only blame view). */\n blameRanges: DocumentBlameRange[];\n} | null {\n if (!contentSnapshot || contentSnapshot.length === 0) {\n return null;\n }\n try {\n const source = listSnapshotCharBlameSource(\n base64ToBytes(contentSnapshot),\n MAX_BLAME_CHARACTER_COUNT,\n );\n if (source === null) {\n return null;\n }\n return summarizeDocumentBlame(source, segments);\n } catch {\n return null;\n }\n}\n"]}
|
package/workflows/container-contents/{documentFieldBlame.js → attribution/documentFieldBlame.js}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { base64ToBytes } from "
|
|
2
|
-
import { listSnapshotFieldEditors } from "
|
|
3
|
-
import { DOCUMENT_FIELDS_MAP_KEY } from "
|
|
4
|
-
import { summarizeFieldBlame, } from "
|
|
1
|
+
import { base64ToBytes } from "../../../internal/encoding/index.js";
|
|
2
|
+
import { listSnapshotFieldEditors } from "../../../internal/loro/index.js";
|
|
3
|
+
import { DOCUMENT_FIELDS_MAP_KEY } from "../../../data/documents/documentKinds.js";
|
|
4
|
+
import { summarizeFieldBlame, } from "../../../data/documents/editAttribution.js";
|
|
5
5
|
/**
|
|
6
6
|
* Per-field "blame" for a structured document: read the peer that last set each
|
|
7
7
|
* field from the locally persisted snapshot and resolve it against the
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentFieldBlame.js","sourceRoot":"","sources":["documentFieldBlame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAEL,mBAAmB,GACpB,MAAM,yCAAyC,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,eAA8B,EAC9B,QAAqD;IAErD,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,wBAAwB,CAC3C,aAAa,CAAC,eAAe,CAAC,EAC9B,uBAAuB,CACxB,CAAC;QACF,OAAO,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { base64ToBytes } from \"@tearleads/encoding\";\nimport { listSnapshotFieldEditors } from \"@tearleads/loro\";\nimport type { DocumentEditAttributionResponse } from \"@tearleads/validators/response\";\nimport { DOCUMENT_FIELDS_MAP_KEY } from \"../../../data/documents/documentKinds\";\nimport {\n type DocumentFieldBlame,\n summarizeFieldBlame,\n} from \"../../../data/documents/editAttribution\";\n\n/**\n * Per-field \"blame\" for a structured document: read the peer that last set each\n * field from the locally persisted snapshot and resolve it against the\n * attribution segments. Reconstructing the small `fields` map is cheap (no\n * per-character sweep), so this runs its own reconstruction independent of the\n * character-blame path. Returns null when it can't be produced — no local\n * snapshot or an unreadable one — mirroring the character-blame degrade-to-null;\n * a note (or any document without fields) yields an empty array, not null.\n */\nexport function computeFieldBlame(\n contentSnapshot: string | null,\n segments: DocumentEditAttributionResponse[\"segments\"],\n): DocumentFieldBlame[] | null {\n if (!contentSnapshot || contentSnapshot.length === 0) {\n return null;\n }\n try {\n const fieldEditors = listSnapshotFieldEditors(\n base64ToBytes(contentSnapshot),\n DOCUMENT_FIELDS_MAP_KEY,\n );\n return summarizeFieldBlame(fieldEditors, segments);\n } catch {\n return null;\n }\n}\n"]}
|
|
@@ -2,7 +2,7 @@ import { ContainerPathTooDeepError } from "../../../data/containers/shared/conta
|
|
|
2
2
|
import { reportAndRethrowKeyingVerificationError } from "../../../data/keyingProjectionVerification/error.js";
|
|
3
3
|
import { ContainerCreateIntentSupersededError } from "../../../data/persistence/container-contents/containerIntentPersistence.js";
|
|
4
4
|
import { errorMessage } from "../../../data/shared/errorMessage.js";
|
|
5
|
-
import { createDetachedContainerMetadataState, installDetachedContainerMetadataState, } from "../metadataStateIsolation.js";
|
|
5
|
+
import { createDetachedContainerMetadataState, installDetachedContainerMetadataState, } from "../metadata/metadataStateIsolation.js";
|
|
6
6
|
import { hasRemoteContainerMetadataState } from "../remoteHydration/reconciliation.js";
|
|
7
7
|
import { syncListedContainerCreate } from "./createAdoption.js";
|
|
8
8
|
import { deferTooDeepCreate, recordRefusedTooDeepCreate, } from "./createIntentDepth.js";
|