@tearleads/client-sdk 0.1.76 → 0.1.78
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/data/{documents/blob/shared → blobs/attachments}/blobEnvelopeStream.js +1 -1
- package/data/{documents/blob/shared → blobs/attachments}/blobEnvelopeStream.js.map +1 -1
- package/data/blobs/attachments/blobRecordCrypto.d.ts +26 -0
- package/data/{documents/blob/shared → blobs/attachments}/blobRecordCrypto.js +2 -2
- package/data/{documents/blob/shared → blobs/attachments}/blobSourceSnapshot.d.ts +1 -1
- package/data/{documents/blob/shared → blobs/attachments}/blobSourceSnapshot.js +2 -2
- package/data/blobs/attachments/blobSourceSnapshot.js.map +1 -0
- package/data/blobs/attachments/chunkedBlobCrypto.d.ts +17 -0
- package/data/{documents/blob/shared → blobs/attachments}/chunkedBlobCrypto.js +3 -3
- package/data/blobs/attachments/chunkedBlobCrypto.js.map +1 -0
- package/data/blobs/attachments/crypto.d.ts +3 -0
- package/data/blobs/attachments/encryptedUploadParts.js.map +1 -0
- package/data/{documents/blob/shared → blobs/attachments}/events.js +3 -3
- package/data/blobs/attachments/events.js.map +1 -0
- package/data/{documents/blob/shared → blobs/attachments}/projection.js +8 -8
- package/data/blobs/attachments/projection.js.map +1 -0
- package/data/{documents/blob/shared → blobs/attachments}/readers.js +3 -3
- package/data/blobs/attachments/readers.js.map +1 -0
- package/data/{documents/blob/shared → blobs/attachments}/responses.js +2 -2
- package/data/blobs/attachments/responses.js.map +1 -0
- package/data/{documents/blob/shared → blobs/attachments}/types.d.ts +8 -8
- package/data/blobs/attachments/types.js.map +1 -0
- package/data/{containers → persistence/container-contents}/containerBinding.js +1 -1
- package/data/persistence/container-contents/containerContentsPersistence.js +2 -2
- package/data/persistence/container-contents/containerContentsPersistence.js.map +1 -1
- package/data/persistence/container-contents/containerContentsPersistenceTypes.d.ts +2 -2
- package/data/persistence/container-contents/containerContentsPersistenceTypes.js.map +1 -1
- package/data/persistence/container-contents/containerDeletionPersistence.js +2 -2
- package/data/persistence/container-contents/containerDeletionPersistence.js.map +1 -1
- package/data/persistence/container-contents/containerHydrationPersistence.js +2 -2
- package/data/persistence/container-contents/containerHydrationPersistence.js.map +1 -1
- package/data/persistence/container-contents/containerMetadataMutationPersistence.js +2 -2
- package/data/persistence/container-contents/containerMetadataMutationPersistence.js.map +1 -1
- package/data/persistence/container-contents/containerMetadataRows.js +1 -1
- package/data/persistence/container-contents/containerMetadataRows.js.map +1 -1
- package/data/persistence/container-contents/containerRebindPersistence.js.map +1 -1
- package/data/persistence/container-contents/containerReconcilePersistence.js +2 -2
- package/data/persistence/container-contents/containerReconcilePersistence.js.map +1 -1
- package/data/persistence/container-contents/containerStructuralRepair.js +1 -1
- package/data/persistence/container-contents/containerStructuralRepair.js.map +1 -1
- package/data/persistence/container-contents/dormantMetadataSweep.js +1 -1
- package/data/persistence/container-contents/dormantMetadataSweep.js.map +1 -1
- package/data/persistence/documents/internal/containerDocumentTombstoneHolds.js +1 -1
- package/data/persistence/documents/internal/containerDocumentTombstoneHolds.js.map +1 -1
- package/data/persistence/documents/internal/containerDocumentTombstones.js +1 -1
- package/data/persistence/documents/internal/containerDocumentTombstones.js.map +1 -1
- package/data/persistence/documents/internal/discoveredDocumentPlacement.js +1 -1
- package/data/persistence/documents/internal/discoveredDocumentPlacement.js.map +1 -1
- package/package.json +1 -1
- package/stores/container-contents/systemContainers/systemContainerIcon.js +1 -1
- package/stores/container-contents/systemContainers/systemContainerIcon.js.map +1 -1
- package/stores/documents/documentStore/attachmentUpload/attachmentSourceUpload.js +1 -2
- package/stores/documents/documentStore/attachmentUpload/attachmentSourceUpload.js.map +1 -1
- package/stores/documents/documentStore/sync/syncAttachments.js.map +1 -1
- package/workflows/blobs/detach.js +2 -2
- package/workflows/blobs/detach.js.map +1 -1
- package/workflows/blobs/hydration/blobChunkDecryption.js +1 -1
- package/workflows/blobs/hydration/blobChunkDecryption.js.map +1 -1
- package/workflows/blobs/hydration/decrypt.d.ts +1 -1
- package/workflows/blobs/hydration/decrypt.js +4 -4
- package/workflows/blobs/hydration/decrypt.js.map +1 -1
- package/workflows/blobs/index.d.ts +3 -1
- package/workflows/blobs/index.js +3 -0
- package/workflows/blobs/index.js.map +1 -1
- package/workflows/blobs/upload/automaticMultipartUpload.js +1 -1
- package/workflows/blobs/upload/automaticMultipartUpload.js.map +1 -1
- package/workflows/blobs/upload/index.d.ts +2 -2
- package/workflows/blobs/upload/index.js +4 -4
- package/workflows/blobs/upload/index.js.map +1 -1
- package/workflows/blobs/upload/multipartFirstParts.js.map +1 -1
- package/workflows/blobs/upload/multipartStageFailures.js.map +1 -1
- package/workflows/blobs/upload/multipartStageResolution.js.map +1 -1
- package/workflows/blobs/upload/multipartUpload.js.map +1 -1
- package/workflows/blobs/verification/attachmentBindingVerification.js.map +1 -1
- package/workflows/blobs/verification/attachmentKeyAuthenticator.js +1 -1
- package/workflows/blobs/verification/attachmentKeyAuthenticator.js.map +1 -1
- package/workflows/blobs/verification/retainedAttachmentVerification.js +1 -1
- package/workflows/blobs/verification/retainedAttachmentVerification.js.map +1 -1
- package/workflows/blobs/verification/writerProjection.js +1 -1
- package/workflows/blobs/verification/writerProjection.js.map +1 -1
- package/workflows/container-contents/container-state/create/createChild.js +1 -1
- package/workflows/container-contents/container-state/create/createChild.js.map +1 -1
- package/workflows/container-contents/container-state/purge/purgeTree.js +1 -1
- package/workflows/container-contents/container-state/purge/purgeTree.js.map +1 -1
- package/workflows/container-contents/container-state/types.js.map +1 -1
- package/workflows/container-contents/containerPersistence.d.ts +3 -3
- package/workflows/container-contents/containerPersistence.js +1 -1
- package/workflows/container-contents/containerPersistence.js.map +1 -1
- package/workflows/container-contents/documentLinks/documentLinkIntent.js +1 -1
- package/workflows/container-contents/documentLinks/documentLinkIntent.js.map +1 -1
- package/workflows/container-contents/documentLinks/index.js +1 -1
- package/workflows/container-contents/documentLinks/index.js.map +1 -1
- package/workflows/container-contents/documentMove/documentMoveIntent.js +1 -1
- package/workflows/container-contents/documentMove/documentMoveIntent.js.map +1 -1
- package/workflows/container-contents/documentMove/documentMoveIntentSettlement.js +2 -2
- package/workflows/container-contents/documentMove/documentMoveIntentSettlement.js.map +1 -1
- package/workflows/container-contents/documentQueries/documentSubtreeQueries.js +1 -1
- package/workflows/container-contents/documentQueries/documentSubtreeQueries.js.map +1 -1
- package/workflows/container-contents/documentQueries/index.js +3 -3
- package/workflows/container-contents/documentQueries/index.js.map +1 -1
- package/workflows/container-contents/documentQueries/pendingDownloads.js +1 -1
- package/workflows/container-contents/documentQueries/pendingDownloads.js.map +1 -1
- package/workflows/container-contents/index.d.ts +1 -1
- package/workflows/container-contents/index.js +1 -1
- package/workflows/container-contents/index.js.map +1 -1
- package/workflows/container-contents/info/blobInfo.js +1 -1
- package/workflows/container-contents/info/blobInfo.js.map +1 -1
- package/workflows/container-contents/info/containerInfo.js +2 -2
- package/workflows/container-contents/info/containerInfo.js.map +1 -1
- package/{data/containers → workflows/container-contents/metadata}/containerMetadataDocument.d.ts +1 -1
- package/{data/containers → workflows/container-contents/metadata}/containerMetadataDocument.js +2 -2
- package/workflows/container-contents/metadata/containerMetadataDocument.js.map +1 -0
- package/workflows/container-contents/metadata/metadataMutationPreparation.js +1 -1
- package/workflows/container-contents/metadata/metadataMutationPreparation.js.map +1 -1
- package/workflows/container-contents/metadata/metadataPersistence.js +1 -1
- package/workflows/container-contents/metadata/metadataPersistence.js.map +1 -1
- package/workflows/container-contents/metadata/metadataRecord.js.map +1 -1
- package/workflows/container-contents/metadata/metadataStateIsolation.js +1 -1
- package/workflows/container-contents/metadata/metadataStateIsolation.js.map +1 -1
- package/workflows/container-contents/metadata/metadataSyncSettlement.js +1 -1
- package/workflows/container-contents/metadata/metadataSyncSettlement.js.map +1 -1
- package/workflows/container-contents/metadata/metadataTypes.d.ts +2 -2
- package/workflows/container-contents/metadata/metadataTypes.js.map +1 -1
- package/workflows/container-contents/recovery/folderRecovery.js +1 -1
- package/workflows/container-contents/recovery/folderRecovery.js.map +1 -1
- package/workflows/container-contents/remoteHydration/destination/replacementBinding.js +1 -1
- package/workflows/container-contents/remoteHydration/destination/replacementBinding.js.map +1 -1
- package/workflows/container-contents/remoteHydration/destination/verifiedDestination.js +1 -1
- package/workflows/container-contents/remoteHydration/destination/verifiedDestination.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/reattachMetadata.js +1 -1
- package/workflows/container-contents/remoteHydration/reattachMetadata.js.map +1 -1
- package/workflows/container-contents/remoteHydration/remoteContainers/insertRemoteContainer.js +2 -2
- package/workflows/container-contents/remoteHydration/remoteContainers/insertRemoteContainer.js.map +1 -1
- package/workflows/container-contents/remoteHydration/remoteContainers/remoteContainerState.js +1 -1
- package/workflows/container-contents/remoteHydration/remoteContainers/remoteContainerState.js.map +1 -1
- package/workflows/container-contents/remoteHydration/types.d.ts +1 -1
- package/workflows/container-contents/remoteHydration/types.js.map +1 -1
- package/workflows/container-contents/storedContainerState.js +1 -1
- package/workflows/container-contents/storedContainerState.js.map +1 -1
- package/workflows/organizations/groupMetadata/groupMetadataAccess.js +1 -1
- package/workflows/organizations/groupMetadata/groupMetadataAccess.js.map +1 -1
- package/workflows/organizations/readModel/localReadModelDetails.js +1 -1
- package/workflows/organizations/readModel/localReadModelDetails.js.map +1 -1
- package/workflows/registration/bootstrapRootContainer.js +1 -1
- package/workflows/registration/bootstrapRootContainer.js.map +1 -1
- package/workflows/registration/provisioningBootstrapBuilders.js +1 -1
- package/workflows/registration/provisioningBootstrapBuilders.js.map +1 -1
- package/workflows/registration/rootMetadataBootstrap.js +1 -1
- package/workflows/registration/rootMetadataBootstrap.js.map +1 -1
- package/workflows/sync/remoteReset.js +1 -1
- package/workflows/sync/remoteReset.js.map +1 -1
- package/data/containers/containerMetadataDocument.js.map +0 -1
- package/data/documents/blob/shared/blobSourceSnapshot.js.map +0 -1
- package/data/documents/blob/shared/chunkedBlobCrypto.js.map +0 -1
- package/data/documents/blob/shared/encryptedUploadParts.js.map +0 -1
- package/data/documents/blob/shared/events.js.map +0 -1
- package/data/documents/blob/shared/projection.js.map +0 -1
- package/data/documents/blob/shared/readers.js.map +0 -1
- package/data/documents/blob/shared/responses.js.map +0 -1
- package/data/documents/blob/shared/types.js.map +0 -1
- /package/data/{documents/blob/shared → blobs/attachments}/blobRecordCrypto.js.map +0 -0
- /package/data/{documents/blob/shared → blobs/attachments}/crypto.js +0 -0
- /package/data/{documents/blob/shared → blobs/attachments}/crypto.js.map +0 -0
- /package/data/{documents/blob/shared → blobs/attachments}/encryptedUploadParts.js +0 -0
- /package/data/{documents/blob/shared → blobs/attachments}/types.js +0 -0
- /package/data/{containers → persistence/container-contents}/containerBinding.d.ts +0 -0
- /package/data/{containers → persistence/container-contents}/containerBinding.js.map +0 -0
- /package/data/persistence/{containers → container-contents}/containerPersistence.d.ts +0 -0
- /package/data/persistence/{containers → container-contents}/containerPersistence.js +0 -0
- /package/data/persistence/{containers → container-contents}/containerPersistence.js.map +0 -0
- /package/data/persistence/{containers → container-contents}/containerSyncWatermarkPersistence.d.ts +0 -0
- /package/data/persistence/{containers → container-contents}/containerSyncWatermarkPersistence.js +0 -0
- /package/data/persistence/{containers → container-contents}/containerSyncWatermarkPersistence.js.map +0 -0
- /package/data/persistence/{containers → container-contents}/documentContainerProjectionPersistence.js +0 -0
- /package/data/persistence/{containers → container-contents}/documentContainerProjectionPersistence.js.map +0 -0
- /package/data/persistence/{containers → container-contents}/documentPlacement.js +0 -0
- /package/data/persistence/{containers → container-contents}/documentPlacement.js.map +0 -0
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { type ContainerMetadataDocument, createInitializedContainerMetadataDocument, getDefaultContainerName, readContainerMetadataValue, writeContainerMetadataValue, } from "../../data/containers/containerMetadataDocument.js";
|
|
2
1
|
export { didRegainSyncPrerequisites, isDatabaseUnavailableError, } from "../../data/sync/syncCoordinator.js";
|
|
3
2
|
export { type DocumentAttributionRangesInput, type DocumentAttributionRangesPage, loadDocumentAttributionRanges, } from "./attribution/documentAttributionRanges.js";
|
|
4
3
|
export { type ContainerSyncWatermarkLane, createContainerContentsSyncLane, createContainerParentSyncLane, defaultContainerContentsPersistence, loadContainerSyncWatermark, saveContainerSyncWatermark, } from "./containerPersistence.js";
|
|
@@ -11,6 +10,7 @@ export { type BlobInfo, type BlobInfoAttachmentKind, type BlobInfoDocumentRefere
|
|
|
11
10
|
export { type ContainerInfo, type ContainerInfoGrant, type ContainerInfoGrantRow, type ContainerInfoPathEntry, type ContainerInfoRemoteMode, type ContainerInfoSecurityDetails, type ContainerShareAccessLevel, loadContainerInfo, } from "./info/containerInfo.js";
|
|
12
11
|
export { type DocumentInfo, type DocumentInfoAttachment, type DocumentInfoAuthorizingContainerPath, type DocumentInfoLocalDetails, type DocumentInfoRemoteAttachmentBinding, type DocumentInfoRemoteDetails, type DocumentInfoRemoteMode, loadDocumentInfo, } from "./info/documentInfo.js";
|
|
13
12
|
export { type ContainerMetadataPatch, hasContainerMetadataDocumentUpdateEvent, persistContainerMetadataStateFromRuntime, renameContainerMetadataStateFromRuntime, syncContainerMetadataState, } from "./metadata/index.js";
|
|
13
|
+
export { type ContainerMetadataDocument, createInitializedContainerMetadataDocument, getDefaultContainerName, readContainerMetadataValue, writeContainerMetadataValue, } from "./metadata/containerMetadataDocument.js";
|
|
14
14
|
export { listPendingWrites, type PendingWriteQueueItem, type PendingWriteQueueItemStatus, type PendingWriteQueueObjectKind, type PendingWriteQueueOperation, type PendingWriteQueueOperationKind, type PendingWriteQueueOperationStatus, } from "./pendingWrites/index.js";
|
|
15
15
|
export { type ContainerContentsProjectionUserKeyResolver, createContainerContentsDocumentProjectionUserKeyResolver, createContainerContentsProjectionUserKeyResolver, didContainerContentsProjectionKeyRuntimeChange, } from "./projectionKeys.js";
|
|
16
16
|
export type { RecoveryFolder } from "./recovery/folderRecovery.js";
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { createInitializedContainerMetadataDocument, getDefaultContainerName, readContainerMetadataValue, writeContainerMetadataValue, } from "../../data/containers/containerMetadataDocument.js";
|
|
2
1
|
export { didRegainSyncPrerequisites, isDatabaseUnavailableError, } from "../../data/sync/syncCoordinator.js";
|
|
3
2
|
export { loadDocumentAttributionRanges, } from "./attribution/documentAttributionRanges.js";
|
|
4
3
|
export { createContainerContentsSyncLane, createContainerParentSyncLane, defaultContainerContentsPersistence, loadContainerSyncWatermark, saveContainerSyncWatermark, } from "./containerPersistence.js";
|
|
@@ -10,6 +9,7 @@ export { listBlobInfo, } from "./info/blobInfo.js";
|
|
|
10
9
|
export { loadContainerInfo, } from "./info/containerInfo.js";
|
|
11
10
|
export { loadDocumentInfo, } from "./info/documentInfo.js";
|
|
12
11
|
export { hasContainerMetadataDocumentUpdateEvent, persistContainerMetadataStateFromRuntime, renameContainerMetadataStateFromRuntime, syncContainerMetadataState, } from "./metadata/index.js";
|
|
12
|
+
export { createInitializedContainerMetadataDocument, getDefaultContainerName, readContainerMetadataValue, writeContainerMetadataValue, } from "./metadata/containerMetadataDocument.js";
|
|
13
13
|
export { listPendingWrites, } from "./pendingWrites/index.js";
|
|
14
14
|
export { createContainerContentsDocumentProjectionUserKeyResolver, createContainerContentsProjectionUserKeyResolver, didContainerContentsProjectionKeyRuntimeChange, } from "./projectionKeys.js";
|
|
15
15
|
export { createContainerContentsDocumentsRuntime, createContainerContentsStoreWorkflowRuntime, createContainerContentsWorkflowRuntime, } from "./runtime.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAGL,6BAA6B,GAC9B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAEL,+BAA+B,EAC/B,6BAA6B,EAC7B,mCAAmC,EACnC,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iCAAiC,EACjC,kCAAkC,EAElC,mCAAmC,GACpC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EASL,yCAAyC,GAC1C,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,0BAA0B,EAG1B,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,GAEnB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EASL,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAQL,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAQL,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,uCAAuC,EACvC,wCAAwC,EACxC,uCAAuC,EACvC,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,0CAA0C,EAC1C,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,iBAAiB,GAOlB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,wDAAwD,EACxD,gDAAgD,EAChD,8CAA8C,GAC/C,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAaL,uCAAuC,EACvC,2CAA2C,EAC3C,sCAAsC,GACvC,MAAM,WAAW,CAAC;AAKnB,OAAO,EACL,sCAAsC,EACtC,sCAAsC,GACvC,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC","sourcesContent":["export {\n didRegainSyncPrerequisites,\n isDatabaseUnavailableError,\n} from \"../../data/sync/syncCoordinator\";\nexport {\n type DocumentAttributionRangesInput,\n type DocumentAttributionRangesPage,\n loadDocumentAttributionRanges,\n} from \"./attribution/documentAttributionRanges\";\nexport {\n type ContainerSyncWatermarkLane,\n createContainerContentsSyncLane,\n createContainerParentSyncLane,\n defaultContainerContentsPersistence,\n loadContainerSyncWatermark,\n saveContainerSyncWatermark,\n} from \"./containerPersistence\";\nexport {\n discoverContainerDocumentsFromApi,\n hasUndiscoveredDocumentUpdateEvent,\n type RefreshAllContainerDocumentsFromApiOptions,\n refreshAllContainerDocumentsFromApi,\n} from \"./documentDiscovery\";\nexport {\n initializeDocumentLinksSchema,\n listDocumentLinkedContainerIds,\n replaceDocumentLinks,\n} from \"./documentLinks\";\nexport {\n type ContainerDocumentLinkInput,\n type ContainerDocumentQueries,\n type ContainerDocumentSidebarRow,\n type ContainerDocumentTombstone,\n type ContainerItemRow,\n type ContainerItemSort,\n type ContainerItemSortDirection,\n type ContainerItemSortKey,\n createContainerDocumentQueriesFromRuntime,\n} from \"./documentQueries\";\nexport {\n activateDocumentLink,\n addDocumentLink,\n canMutateDocumentLink,\n canMutateLocalDocumentLink,\n type DocumentStructuralMutationHost,\n type MergeDocumentSummary,\n moveDocumentLink,\n moveLocalDocumentLink,\n removeDocumentLink,\n type SetLinkedContainerIdsForDocument,\n} from \"./documentQueries/documentStructure\";\nexport type { PendingDownloadQueueItem } from \"./documentQueries/pendingDownloads\";\nexport {\n type BlobInfo,\n type BlobInfoAttachmentKind,\n type BlobInfoDocumentReference,\n type BlobInfoInput,\n type BlobInfoList,\n type BlobInfoSort,\n type BlobInfoSortDirection,\n type BlobInfoSortKey,\n listBlobInfo,\n} from \"./info/blobInfo\";\nexport {\n type ContainerInfo,\n type ContainerInfoGrant,\n type ContainerInfoGrantRow,\n type ContainerInfoPathEntry,\n type ContainerInfoRemoteMode,\n type ContainerInfoSecurityDetails,\n type ContainerShareAccessLevel,\n loadContainerInfo,\n} from \"./info/containerInfo\";\nexport {\n type DocumentInfo,\n type DocumentInfoAttachment,\n type DocumentInfoAuthorizingContainerPath,\n type DocumentInfoLocalDetails,\n type DocumentInfoRemoteAttachmentBinding,\n type DocumentInfoRemoteDetails,\n type DocumentInfoRemoteMode,\n loadDocumentInfo,\n} from \"./info/documentInfo\";\nexport {\n type ContainerMetadataPatch,\n hasContainerMetadataDocumentUpdateEvent,\n persistContainerMetadataStateFromRuntime,\n renameContainerMetadataStateFromRuntime,\n syncContainerMetadataState,\n} from \"./metadata\";\nexport {\n type ContainerMetadataDocument,\n createInitializedContainerMetadataDocument,\n getDefaultContainerName,\n readContainerMetadataValue,\n writeContainerMetadataValue,\n} from \"./metadata/containerMetadataDocument\";\nexport {\n listPendingWrites,\n type PendingWriteQueueItem,\n type PendingWriteQueueItemStatus,\n type PendingWriteQueueObjectKind,\n type PendingWriteQueueOperation,\n type PendingWriteQueueOperationKind,\n type PendingWriteQueueOperationStatus,\n} from \"./pendingWrites\";\nexport {\n type ContainerContentsProjectionUserKeyResolver,\n createContainerContentsDocumentProjectionUserKeyResolver,\n createContainerContentsProjectionUserKeyResolver,\n didContainerContentsProjectionKeyRuntimeChange,\n} from \"./projectionKeys\";\nexport type { RecoveryFolder } from \"./recovery/folderRecovery\";\nexport {\n type ContainerContentsRootAdopter,\n type ContainerContentsRootAdoptionInput,\n type ContainerContentsStoreWorkflowRuntime,\n type ContainerContentsWorkflowRuntime,\n type ContainerContentsWorkflowRuntimeAuth,\n type ContainerContentsWorkflowRuntimeCrypto,\n type ContainerContentsWorkflowRuntimeGroups,\n type ContainerContentsWorkflowRuntimeInfra,\n type ContainerContentsWorkflowRuntimeInput,\n type ContainerContentsWorkflowRuntimeInputGroups,\n type ContainerContentsWorkflowRuntimeState,\n type ContainerContentsWorkflowRuntimeUtil,\n createContainerContentsDocumentsRuntime,\n createContainerContentsStoreWorkflowRuntime,\n createContainerContentsWorkflowRuntime,\n} from \"./runtime\";\nexport type {\n ContainerDocumentObjectSyncState,\n ContainerDocumentObjectSyncStatus,\n} from \"./syncState\";\nexport {\n createContainerDocumentObjectSyncState,\n syncedContainerDocumentObjectSyncState,\n} from \"./syncState\";\nexport {\n type ContainerSystemSlotDefinition,\n deriveContainerSystemSlot,\n} from \"./systemSlot\";\nexport {\n purgeLocalContainerDocument,\n purgeRemoteContainerDocument,\n} from \"./tombstones/documentPurge\";\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { asc, count, countDistinct, desc, eq, gt, inArray, isNull, sql, } from "drizzle-orm";
|
|
2
2
|
import { unionAll } from "drizzle-orm/sqlite-core";
|
|
3
|
-
import { ensureContainerTables } from "../../../data/persistence/
|
|
3
|
+
import { ensureContainerTables } from "../../../data/persistence/container-contents/containerPersistence.js";
|
|
4
4
|
import { sqlDocumentsPersistence } from "../../../data/persistence/documents/documentsPersistence.js";
|
|
5
5
|
import { containers, documentAttachmentBlobProjection, documentPendingAttachments, documentProjection, } from "../../../data/sqlite/schema/index.js";
|
|
6
6
|
import { getClientSQLitePersistenceRuntime, } from "../../../data/sqlite/sqlitePersistenceRuntime.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blobInfo.js","sourceRoot":"","sources":["blobInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n asc,\n count,\n countDistinct,\n desc,\n eq,\n gt,\n inArray,\n isNull,\n sql,\n} from \"drizzle-orm\";\nimport { unionAll } from \"drizzle-orm/sqlite-core\";\nimport { ensureContainerTables } from \"../../../data/persistence/containers/containerPersistence\";\nimport { sqlDocumentsPersistence } from \"../../../data/persistence/documents/documentsPersistence\";\nimport {\n containers,\n documentAttachmentBlobProjection,\n documentPendingAttachments,\n documentProjection,\n} from \"../../../data/sqlite/schema\";\nimport {\n type ClientSQLiteDatabase,\n getClientSQLitePersistenceRuntime,\n} from \"../../../data/sqlite/sqlitePersistenceRuntime\";\nimport type { ExecSql } from \"../../../data/sqlite/sqlSchema\";\nimport {\n attachBlobInfoReferences,\n mapBlobInfoReferenceRow,\n mapBlobInfoRow,\n readRequiredNumber,\n} from \"./blobInfoRows\";\nimport type {\n BlobInfo,\n BlobInfoAttachmentKind,\n BlobInfoDocumentReference,\n BlobInfoInput,\n BlobInfoList,\n BlobInfoSort,\n} from \"./blobInfoTypes\";\n\nexport type {\n BlobInfo,\n BlobInfoAttachmentKind,\n BlobInfoDocumentReference,\n BlobInfoInput,\n BlobInfoList,\n BlobInfoSort,\n BlobInfoSortDirection,\n BlobInfoSortKey,\n} from \"./blobInfoTypes\";\n\nconst DEFAULT_BLOB_INFO_LIMIT = 200;\nconst MAX_BLOB_INFO_LIMIT = 999;\nconst DEFAULT_BLOB_INFO_SORT: BlobInfoSort = {\n direction: \"desc\",\n key: \"updated\",\n};\n\nfunction normalizeBlobInfoWindowValue(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.trunc(value));\n}\n\nfunction normalizeBlobInfoLimit(value: number | undefined): number {\n if (value === undefined) {\n return DEFAULT_BLOB_INFO_LIMIT;\n }\n\n return Math.min(MAX_BLOB_INFO_LIMIT, normalizeBlobInfoWindowValue(value));\n}\n\nfunction normalizeBlobInfoQuery(value: string | undefined): string {\n return value?.trim().toLocaleLowerCase() ?? \"\";\n}\n\nfunction normalizeBlobInfoSort(value: BlobInfoSort | undefined): BlobInfoSort {\n if (!value) {\n return DEFAULT_BLOB_INFO_SORT;\n }\n\n if (\n (value.direction !== \"asc\" && value.direction !== \"desc\") ||\n (value.key !== \"byteLength\" &&\n value.key !== \"mimeType\" &&\n value.key !== \"updated\")\n ) {\n return DEFAULT_BLOB_INFO_SORT;\n }\n\n return value;\n}\n\nfunction createPendingBlobInfoReferencesSelect(db: ClientSQLiteDatabase) {\n return db\n .select({\n attachmentKind: sql<BlobInfoAttachmentKind>`'pending'`.as(\n \"attachment_kind\",\n ),\n blobId: sql<string | null>`NULL`.as(\"blob_id\"),\n blobKey:\n sql<string>`'storage:' || ${documentPendingAttachments.storageKey}`.as(\n \"blob_key\",\n ),\n byteLength: documentPendingAttachments.byteLength,\n changedAtSort: sql<string>`${documentPendingAttachments.createdAt}`.as(\n \"changed_at_sort\",\n ),\n containerId: documentProjection.containerId,\n createdAt: sql<string | null>`${documentPendingAttachments.createdAt}`.as(\n \"created_at\",\n ),\n documentId: documentProjection.documentId,\n documentKind: documentProjection.documentKind,\n documentTitle: documentProjection.title,\n localId: documentPendingAttachments.localId,\n mimeType: documentPendingAttachments.mimeType,\n name: sql<string | null>`${documentPendingAttachments.name}`.as(\"name\"),\n organizationId: sql<string | null>`COALESCE(\n NULLIF(${containers.organizationId}, ''),\n NULLIF(${documentProjection.organizationId}, '')\n )`.as(\"organization_id\"),\n searchText: sql<string>`LOWER(\n COALESCE(${documentPendingAttachments.storageKey}, '')\n || CHAR(0) || COALESCE(${documentPendingAttachments.mimeType}, '')\n || CHAR(0) || COALESCE(${documentPendingAttachments.name}, '')\n || CHAR(0) || COALESCE(${documentPendingAttachments.localId}, '')\n || CHAR(0) || COALESCE(${documentProjection.documentId}, '')\n || CHAR(0) || COALESCE(${documentProjection.title}, '')\n || CHAR(0) || COALESCE(${documentProjection.containerId}, '')\n || CHAR(0) || COALESCE(\n NULLIF(${containers.organizationId}, ''),\n NULLIF(${documentProjection.organizationId}, ''),\n ''\n )\n || CHAR(0) || COALESCE(${documentPendingAttachments.slotId}, '')\n )`.as(\"search_text\"),\n slotId: documentPendingAttachments.slotId,\n storageKey: documentPendingAttachments.storageKey,\n updatedAt: sql<string | null>`NULL`.as(\"updated_at\"),\n })\n .from(documentPendingAttachments)\n .leftJoin(\n documentProjection,\n eq(documentProjection.localId, documentPendingAttachments.localId),\n )\n .leftJoin(containers, eq(containers.id, documentProjection.containerId));\n}\n\n// Detached rows are excluded here rather than at each call site: a slot unlinked\n// from a synced document keeps its row until the detach reaches the server, and\n// it stops being a reference the moment it is unlinked.\nfunction createLocalBlobInfoReferencesSelect(db: ClientSQLiteDatabase) {\n return db\n .select({\n attachmentKind: sql<BlobInfoAttachmentKind>`'local'`.as(\n \"attachment_kind\",\n ),\n blobId: documentAttachmentBlobProjection.blobId,\n blobKey: sql<string>`CASE\n WHEN ${documentAttachmentBlobProjection.blobId} IS NOT NULL\n AND ${documentAttachmentBlobProjection.blobId} <> ''\n THEN 'blob:' || ${documentAttachmentBlobProjection.blobId}\n ELSE 'storage:' || ${documentAttachmentBlobProjection.storageKey}\n END`.as(\"blob_key\"),\n byteLength: documentAttachmentBlobProjection.byteLength,\n changedAtSort:\n sql<string>`${documentAttachmentBlobProjection.updatedAt}`.as(\n \"changed_at_sort\",\n ),\n containerId: documentProjection.containerId,\n createdAt: sql<string | null>`NULL`.as(\"created_at\"),\n documentId: documentProjection.documentId,\n documentKind: documentProjection.documentKind,\n documentTitle: documentProjection.title,\n localId: documentAttachmentBlobProjection.localId,\n mimeType: documentAttachmentBlobProjection.mimeType,\n name: sql<string | null>`NULL`.as(\"name\"),\n organizationId: sql<string | null>`COALESCE(\n NULLIF(${containers.organizationId}, ''),\n NULLIF(${documentProjection.organizationId}, '')\n )`.as(\"organization_id\"),\n searchText: sql<string>`LOWER(\n COALESCE(${documentAttachmentBlobProjection.blobId}, '')\n || CHAR(0) || COALESCE(${documentAttachmentBlobProjection.storageKey}, '')\n || CHAR(0) || COALESCE(${documentAttachmentBlobProjection.mimeType}, '')\n || CHAR(0) || COALESCE(${documentAttachmentBlobProjection.localId}, '')\n || CHAR(0) || COALESCE(${documentProjection.documentId}, '')\n || CHAR(0) || COALESCE(${documentProjection.title}, '')\n || CHAR(0) || COALESCE(${documentProjection.containerId}, '')\n || CHAR(0) || COALESCE(\n NULLIF(${containers.organizationId}, ''),\n NULLIF(${documentProjection.organizationId}, ''),\n ''\n )\n || CHAR(0) || COALESCE(${documentAttachmentBlobProjection.slotId}, '')\n )`.as(\"search_text\"),\n slotId: documentAttachmentBlobProjection.slotId,\n storageKey: documentAttachmentBlobProjection.storageKey,\n updatedAt: sql<\n string | null\n >`${documentAttachmentBlobProjection.updatedAt}`.as(\"updated_at\"),\n })\n .from(documentAttachmentBlobProjection)\n .leftJoin(\n documentProjection,\n eq(documentProjection.localId, documentAttachmentBlobProjection.localId),\n )\n .leftJoin(containers, eq(containers.id, documentProjection.containerId))\n .where(isNull(documentAttachmentBlobProjection.detachedAt));\n}\n\nfunction createBlobInfoReferencesCte(db: ClientSQLiteDatabase) {\n return db\n .$with(\"blob_info_references\")\n .as(\n unionAll(\n createPendingBlobInfoReferencesSelect(db),\n createLocalBlobInfoReferencesSelect(db),\n ),\n );\n}\n\nfunction createGroupedBlobInfoCtes(input: {\n readonly db: ClientSQLiteDatabase;\n readonly query: string;\n}) {\n const blobInfoReferences = createBlobInfoReferencesCte(input.db);\n const groupedBlobInfoSelection = {\n blobId: sql<\n string | null\n >`MIN(NULLIF(${blobInfoReferences.blobId}, ''))`.as(\"blob_id\"),\n blobKey: blobInfoReferences.blobKey,\n byteLength: sql<number>`MAX(${blobInfoReferences.byteLength})`.as(\n \"byte_length\",\n ),\n changedAtSort: sql<string | null>`COALESCE(\n MAX(NULLIF(${blobInfoReferences.updatedAt}, '')),\n MIN(NULLIF(${blobInfoReferences.createdAt}, ''))\n )`.as(\"changed_at_sort\"),\n createdAt: sql<\n string | null\n >`MIN(NULLIF(${blobInfoReferences.createdAt}, ''))`.as(\"created_at\"),\n documentCount: countDistinct(blobInfoReferences.localId).as(\n \"document_count\",\n ),\n mimeType: sql<\n string | null\n >`MIN(NULLIF(${blobInfoReferences.mimeType}, ''))`.as(\"mime_type\"),\n name: sql<string | null>`MIN(NULLIF(${blobInfoReferences.name}, ''))`.as(\n \"name\",\n ),\n organizationId: sql<string | null>`CASE\n WHEN COUNT(NULLIF(${blobInfoReferences.organizationId}, '')) = COUNT(*)\n AND COUNT(DISTINCT NULLIF(${blobInfoReferences.organizationId}, '')) = 1\n THEN MIN(NULLIF(${blobInfoReferences.organizationId}, ''))\n ELSE NULL\n END`.as(\"organization_id\"),\n referenceCount: count().as(\"reference_count\"),\n storageKey: sql<string>`MIN(${blobInfoReferences.storageKey})`.as(\n \"storage_key\",\n ),\n updatedAt: sql<\n string | null\n >`MAX(NULLIF(${blobInfoReferences.updatedAt}, ''))`.as(\"updated_at\"),\n };\n\n if (input.query === \"\") {\n const groupedBlobInfo = input.db.$with(\"grouped_blob_info\").as(\n input.db\n .select(groupedBlobInfoSelection)\n .from(blobInfoReferences)\n .groupBy(({ blobKey }) => blobKey),\n );\n\n return { blobInfoReferences, groupedBlobInfo, matchingBlobKeys: null };\n }\n\n const matchingBlobKeys = input.db.$with(\"matching_blob_keys\").as(\n input.db\n .selectDistinct({\n matchingBlobKey: sql<string>`${blobInfoReferences.blobKey}`.as(\n \"matching_blob_key\",\n ),\n })\n .from(blobInfoReferences)\n .where(\n gt(\n sql<number>`INSTR(${blobInfoReferences.searchText}, ${input.query})`,\n 0,\n ),\n ),\n );\n const groupedBlobInfo = input.db.$with(\"grouped_blob_info\").as(\n input.db\n .select(groupedBlobInfoSelection)\n .from(blobInfoReferences)\n .innerJoin(\n matchingBlobKeys,\n eq(matchingBlobKeys.matchingBlobKey, blobInfoReferences.blobKey),\n )\n .groupBy(({ blobKey }) => blobKey),\n );\n\n return { blobInfoReferences, groupedBlobInfo, matchingBlobKeys };\n}\n\nasync function countBlobInfoRows(input: {\n readonly db: ClientSQLiteDatabase;\n readonly query: string;\n}): Promise<number> {\n const { blobInfoReferences, groupedBlobInfo, matchingBlobKeys } =\n createGroupedBlobInfoCtes(input);\n const rows =\n matchingBlobKeys === null\n ? await input.db\n .with(blobInfoReferences, groupedBlobInfo)\n .select({ totalCount: count().as(\"total_count\") })\n .from(groupedBlobInfo)\n : await input.db\n .with(blobInfoReferences, matchingBlobKeys, groupedBlobInfo)\n .select({ totalCount: count().as(\"total_count\") })\n .from(groupedBlobInfo);\n\n return readRequiredNumber(rows[0]?.totalCount, \"total_count\");\n}\n\nasync function listBlobInfoRows(input: {\n readonly db: ClientSQLiteDatabase;\n readonly limit: number;\n readonly offset: number;\n readonly query: string;\n readonly sort: BlobInfoSort;\n}): Promise<Array<Omit<BlobInfo, \"references\">>> {\n const { blobInfoReferences, groupedBlobInfo, matchingBlobKeys } =\n createGroupedBlobInfoCtes(input);\n const changedAtSortDirection =\n input.sort.direction === \"desc\"\n ? desc(groupedBlobInfo.changedAtSort)\n : asc(groupedBlobInfo.changedAtSort);\n const byteLengthSortDirection =\n input.sort.direction === \"desc\"\n ? desc(groupedBlobInfo.byteLength)\n : asc(groupedBlobInfo.byteLength);\n let orderBy: ReturnType<typeof asc | typeof desc>[];\n if (input.sort.key === \"mimeType\") {\n orderBy = [\n asc(sql`${groupedBlobInfo.mimeType} IS NULL`),\n input.sort.direction === \"desc\"\n ? desc(sql`${groupedBlobInfo.mimeType} COLLATE NOCASE`)\n : asc(sql`${groupedBlobInfo.mimeType} COLLATE NOCASE`),\n desc(groupedBlobInfo.changedAtSort),\n asc(groupedBlobInfo.blobKey),\n ];\n } else if (input.sort.key === \"byteLength\") {\n orderBy = [\n byteLengthSortDirection,\n desc(groupedBlobInfo.changedAtSort),\n asc(groupedBlobInfo.blobKey),\n ];\n } else {\n orderBy = [\n asc(sql`${groupedBlobInfo.changedAtSort} IS NULL`),\n changedAtSortDirection,\n asc(groupedBlobInfo.blobKey),\n ];\n }\n const selection = {\n blobId: groupedBlobInfo.blobId,\n blobKey: groupedBlobInfo.blobKey,\n byteLength: groupedBlobInfo.byteLength,\n createdAt: groupedBlobInfo.createdAt,\n documentCount: groupedBlobInfo.documentCount,\n mimeType: groupedBlobInfo.mimeType,\n name: groupedBlobInfo.name,\n organizationId: groupedBlobInfo.organizationId,\n referenceCount: groupedBlobInfo.referenceCount,\n storageKey: groupedBlobInfo.storageKey,\n updatedAt: groupedBlobInfo.updatedAt,\n };\n const rows =\n matchingBlobKeys === null\n ? await input.db\n .with(blobInfoReferences, groupedBlobInfo)\n .select(selection)\n .from(groupedBlobInfo)\n .orderBy(...orderBy)\n .limit(input.limit)\n .offset(input.offset)\n : await input.db\n .with(blobInfoReferences, matchingBlobKeys, groupedBlobInfo)\n .select(selection)\n .from(groupedBlobInfo)\n .orderBy(...orderBy)\n .limit(input.limit)\n .offset(input.offset);\n\n return rows.map(mapBlobInfoRow);\n}\n\nasync function listBlobInfoReferencesForKeys(input: {\n readonly db: ClientSQLiteDatabase;\n readonly keys: ReadonlyArray<string>;\n}): Promise<BlobInfoDocumentReference[]> {\n if (input.keys.length === 0) {\n return [];\n }\n\n const blobInfoReferences = createBlobInfoReferencesCte(input.db);\n const rows = await input.db\n .with(blobInfoReferences)\n .select({\n attachmentKind: blobInfoReferences.attachmentKind,\n blobId: blobInfoReferences.blobId,\n byteLength: blobInfoReferences.byteLength,\n containerId: blobInfoReferences.containerId,\n createdAt: blobInfoReferences.createdAt,\n documentId: blobInfoReferences.documentId,\n documentKind: blobInfoReferences.documentKind,\n documentTitle: blobInfoReferences.documentTitle,\n localId: blobInfoReferences.localId,\n mimeType: blobInfoReferences.mimeType,\n name: blobInfoReferences.name,\n slotId: blobInfoReferences.slotId,\n storageKey: blobInfoReferences.storageKey,\n updatedAt: blobInfoReferences.updatedAt,\n })\n .from(blobInfoReferences)\n .where(inArray(blobInfoReferences.blobKey, [...input.keys]))\n .orderBy(\n asc(blobInfoReferences.blobKey),\n desc(blobInfoReferences.changedAtSort),\n asc(blobInfoReferences.localId),\n asc(blobInfoReferences.slotId),\n );\n\n return rows.map(mapBlobInfoReferenceRow);\n}\n\nexport async function listBlobInfo(\n input: BlobInfoInput & { readonly execSql?: ExecSql | null | undefined },\n): Promise<BlobInfoList> {\n if (!input.execSql) {\n return { rows: [], totalCount: 0 };\n }\n\n const query = normalizeBlobInfoQuery(input.query);\n const limit = normalizeBlobInfoLimit(input.limit);\n const offset = normalizeBlobInfoWindowValue(input.offset);\n const sort = normalizeBlobInfoSort(input.sort);\n await sqlDocumentsPersistence.ensureSchema(input.execSql);\n await ensureContainerTables(input.execSql);\n const { db } = getClientSQLitePersistenceRuntime(input.execSql);\n\n const totalCount = await countBlobInfoRows({\n db,\n query,\n });\n if (limit === 0 || offset >= totalCount) {\n return { rows: [], totalCount };\n }\n\n const groupedRows = await listBlobInfoRows({\n db,\n limit,\n offset,\n query,\n sort,\n });\n const references = await listBlobInfoReferencesForKeys({\n db,\n keys: groupedRows.map((row) => row.key),\n });\n\n return {\n rows: attachBlobInfoReferences({ references, rows: groupedRows }),\n totalCount,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"blobInfo.js","sourceRoot":"","sources":["blobInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n asc,\n count,\n countDistinct,\n desc,\n eq,\n gt,\n inArray,\n isNull,\n sql,\n} from \"drizzle-orm\";\nimport { unionAll } from \"drizzle-orm/sqlite-core\";\nimport { ensureContainerTables } from \"../../../data/persistence/container-contents/containerPersistence\";\nimport { sqlDocumentsPersistence } from \"../../../data/persistence/documents/documentsPersistence\";\nimport {\n containers,\n documentAttachmentBlobProjection,\n documentPendingAttachments,\n documentProjection,\n} from \"../../../data/sqlite/schema\";\nimport {\n type ClientSQLiteDatabase,\n getClientSQLitePersistenceRuntime,\n} from \"../../../data/sqlite/sqlitePersistenceRuntime\";\nimport type { ExecSql } from \"../../../data/sqlite/sqlSchema\";\nimport {\n attachBlobInfoReferences,\n mapBlobInfoReferenceRow,\n mapBlobInfoRow,\n readRequiredNumber,\n} from \"./blobInfoRows\";\nimport type {\n BlobInfo,\n BlobInfoAttachmentKind,\n BlobInfoDocumentReference,\n BlobInfoInput,\n BlobInfoList,\n BlobInfoSort,\n} from \"./blobInfoTypes\";\n\nexport type {\n BlobInfo,\n BlobInfoAttachmentKind,\n BlobInfoDocumentReference,\n BlobInfoInput,\n BlobInfoList,\n BlobInfoSort,\n BlobInfoSortDirection,\n BlobInfoSortKey,\n} from \"./blobInfoTypes\";\n\nconst DEFAULT_BLOB_INFO_LIMIT = 200;\nconst MAX_BLOB_INFO_LIMIT = 999;\nconst DEFAULT_BLOB_INFO_SORT: BlobInfoSort = {\n direction: \"desc\",\n key: \"updated\",\n};\n\nfunction normalizeBlobInfoWindowValue(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.trunc(value));\n}\n\nfunction normalizeBlobInfoLimit(value: number | undefined): number {\n if (value === undefined) {\n return DEFAULT_BLOB_INFO_LIMIT;\n }\n\n return Math.min(MAX_BLOB_INFO_LIMIT, normalizeBlobInfoWindowValue(value));\n}\n\nfunction normalizeBlobInfoQuery(value: string | undefined): string {\n return value?.trim().toLocaleLowerCase() ?? \"\";\n}\n\nfunction normalizeBlobInfoSort(value: BlobInfoSort | undefined): BlobInfoSort {\n if (!value) {\n return DEFAULT_BLOB_INFO_SORT;\n }\n\n if (\n (value.direction !== \"asc\" && value.direction !== \"desc\") ||\n (value.key !== \"byteLength\" &&\n value.key !== \"mimeType\" &&\n value.key !== \"updated\")\n ) {\n return DEFAULT_BLOB_INFO_SORT;\n }\n\n return value;\n}\n\nfunction createPendingBlobInfoReferencesSelect(db: ClientSQLiteDatabase) {\n return db\n .select({\n attachmentKind: sql<BlobInfoAttachmentKind>`'pending'`.as(\n \"attachment_kind\",\n ),\n blobId: sql<string | null>`NULL`.as(\"blob_id\"),\n blobKey:\n sql<string>`'storage:' || ${documentPendingAttachments.storageKey}`.as(\n \"blob_key\",\n ),\n byteLength: documentPendingAttachments.byteLength,\n changedAtSort: sql<string>`${documentPendingAttachments.createdAt}`.as(\n \"changed_at_sort\",\n ),\n containerId: documentProjection.containerId,\n createdAt: sql<string | null>`${documentPendingAttachments.createdAt}`.as(\n \"created_at\",\n ),\n documentId: documentProjection.documentId,\n documentKind: documentProjection.documentKind,\n documentTitle: documentProjection.title,\n localId: documentPendingAttachments.localId,\n mimeType: documentPendingAttachments.mimeType,\n name: sql<string | null>`${documentPendingAttachments.name}`.as(\"name\"),\n organizationId: sql<string | null>`COALESCE(\n NULLIF(${containers.organizationId}, ''),\n NULLIF(${documentProjection.organizationId}, '')\n )`.as(\"organization_id\"),\n searchText: sql<string>`LOWER(\n COALESCE(${documentPendingAttachments.storageKey}, '')\n || CHAR(0) || COALESCE(${documentPendingAttachments.mimeType}, '')\n || CHAR(0) || COALESCE(${documentPendingAttachments.name}, '')\n || CHAR(0) || COALESCE(${documentPendingAttachments.localId}, '')\n || CHAR(0) || COALESCE(${documentProjection.documentId}, '')\n || CHAR(0) || COALESCE(${documentProjection.title}, '')\n || CHAR(0) || COALESCE(${documentProjection.containerId}, '')\n || CHAR(0) || COALESCE(\n NULLIF(${containers.organizationId}, ''),\n NULLIF(${documentProjection.organizationId}, ''),\n ''\n )\n || CHAR(0) || COALESCE(${documentPendingAttachments.slotId}, '')\n )`.as(\"search_text\"),\n slotId: documentPendingAttachments.slotId,\n storageKey: documentPendingAttachments.storageKey,\n updatedAt: sql<string | null>`NULL`.as(\"updated_at\"),\n })\n .from(documentPendingAttachments)\n .leftJoin(\n documentProjection,\n eq(documentProjection.localId, documentPendingAttachments.localId),\n )\n .leftJoin(containers, eq(containers.id, documentProjection.containerId));\n}\n\n// Detached rows are excluded here rather than at each call site: a slot unlinked\n// from a synced document keeps its row until the detach reaches the server, and\n// it stops being a reference the moment it is unlinked.\nfunction createLocalBlobInfoReferencesSelect(db: ClientSQLiteDatabase) {\n return db\n .select({\n attachmentKind: sql<BlobInfoAttachmentKind>`'local'`.as(\n \"attachment_kind\",\n ),\n blobId: documentAttachmentBlobProjection.blobId,\n blobKey: sql<string>`CASE\n WHEN ${documentAttachmentBlobProjection.blobId} IS NOT NULL\n AND ${documentAttachmentBlobProjection.blobId} <> ''\n THEN 'blob:' || ${documentAttachmentBlobProjection.blobId}\n ELSE 'storage:' || ${documentAttachmentBlobProjection.storageKey}\n END`.as(\"blob_key\"),\n byteLength: documentAttachmentBlobProjection.byteLength,\n changedAtSort:\n sql<string>`${documentAttachmentBlobProjection.updatedAt}`.as(\n \"changed_at_sort\",\n ),\n containerId: documentProjection.containerId,\n createdAt: sql<string | null>`NULL`.as(\"created_at\"),\n documentId: documentProjection.documentId,\n documentKind: documentProjection.documentKind,\n documentTitle: documentProjection.title,\n localId: documentAttachmentBlobProjection.localId,\n mimeType: documentAttachmentBlobProjection.mimeType,\n name: sql<string | null>`NULL`.as(\"name\"),\n organizationId: sql<string | null>`COALESCE(\n NULLIF(${containers.organizationId}, ''),\n NULLIF(${documentProjection.organizationId}, '')\n )`.as(\"organization_id\"),\n searchText: sql<string>`LOWER(\n COALESCE(${documentAttachmentBlobProjection.blobId}, '')\n || CHAR(0) || COALESCE(${documentAttachmentBlobProjection.storageKey}, '')\n || CHAR(0) || COALESCE(${documentAttachmentBlobProjection.mimeType}, '')\n || CHAR(0) || COALESCE(${documentAttachmentBlobProjection.localId}, '')\n || CHAR(0) || COALESCE(${documentProjection.documentId}, '')\n || CHAR(0) || COALESCE(${documentProjection.title}, '')\n || CHAR(0) || COALESCE(${documentProjection.containerId}, '')\n || CHAR(0) || COALESCE(\n NULLIF(${containers.organizationId}, ''),\n NULLIF(${documentProjection.organizationId}, ''),\n ''\n )\n || CHAR(0) || COALESCE(${documentAttachmentBlobProjection.slotId}, '')\n )`.as(\"search_text\"),\n slotId: documentAttachmentBlobProjection.slotId,\n storageKey: documentAttachmentBlobProjection.storageKey,\n updatedAt: sql<\n string | null\n >`${documentAttachmentBlobProjection.updatedAt}`.as(\"updated_at\"),\n })\n .from(documentAttachmentBlobProjection)\n .leftJoin(\n documentProjection,\n eq(documentProjection.localId, documentAttachmentBlobProjection.localId),\n )\n .leftJoin(containers, eq(containers.id, documentProjection.containerId))\n .where(isNull(documentAttachmentBlobProjection.detachedAt));\n}\n\nfunction createBlobInfoReferencesCte(db: ClientSQLiteDatabase) {\n return db\n .$with(\"blob_info_references\")\n .as(\n unionAll(\n createPendingBlobInfoReferencesSelect(db),\n createLocalBlobInfoReferencesSelect(db),\n ),\n );\n}\n\nfunction createGroupedBlobInfoCtes(input: {\n readonly db: ClientSQLiteDatabase;\n readonly query: string;\n}) {\n const blobInfoReferences = createBlobInfoReferencesCte(input.db);\n const groupedBlobInfoSelection = {\n blobId: sql<\n string | null\n >`MIN(NULLIF(${blobInfoReferences.blobId}, ''))`.as(\"blob_id\"),\n blobKey: blobInfoReferences.blobKey,\n byteLength: sql<number>`MAX(${blobInfoReferences.byteLength})`.as(\n \"byte_length\",\n ),\n changedAtSort: sql<string | null>`COALESCE(\n MAX(NULLIF(${blobInfoReferences.updatedAt}, '')),\n MIN(NULLIF(${blobInfoReferences.createdAt}, ''))\n )`.as(\"changed_at_sort\"),\n createdAt: sql<\n string | null\n >`MIN(NULLIF(${blobInfoReferences.createdAt}, ''))`.as(\"created_at\"),\n documentCount: countDistinct(blobInfoReferences.localId).as(\n \"document_count\",\n ),\n mimeType: sql<\n string | null\n >`MIN(NULLIF(${blobInfoReferences.mimeType}, ''))`.as(\"mime_type\"),\n name: sql<string | null>`MIN(NULLIF(${blobInfoReferences.name}, ''))`.as(\n \"name\",\n ),\n organizationId: sql<string | null>`CASE\n WHEN COUNT(NULLIF(${blobInfoReferences.organizationId}, '')) = COUNT(*)\n AND COUNT(DISTINCT NULLIF(${blobInfoReferences.organizationId}, '')) = 1\n THEN MIN(NULLIF(${blobInfoReferences.organizationId}, ''))\n ELSE NULL\n END`.as(\"organization_id\"),\n referenceCount: count().as(\"reference_count\"),\n storageKey: sql<string>`MIN(${blobInfoReferences.storageKey})`.as(\n \"storage_key\",\n ),\n updatedAt: sql<\n string | null\n >`MAX(NULLIF(${blobInfoReferences.updatedAt}, ''))`.as(\"updated_at\"),\n };\n\n if (input.query === \"\") {\n const groupedBlobInfo = input.db.$with(\"grouped_blob_info\").as(\n input.db\n .select(groupedBlobInfoSelection)\n .from(blobInfoReferences)\n .groupBy(({ blobKey }) => blobKey),\n );\n\n return { blobInfoReferences, groupedBlobInfo, matchingBlobKeys: null };\n }\n\n const matchingBlobKeys = input.db.$with(\"matching_blob_keys\").as(\n input.db\n .selectDistinct({\n matchingBlobKey: sql<string>`${blobInfoReferences.blobKey}`.as(\n \"matching_blob_key\",\n ),\n })\n .from(blobInfoReferences)\n .where(\n gt(\n sql<number>`INSTR(${blobInfoReferences.searchText}, ${input.query})`,\n 0,\n ),\n ),\n );\n const groupedBlobInfo = input.db.$with(\"grouped_blob_info\").as(\n input.db\n .select(groupedBlobInfoSelection)\n .from(blobInfoReferences)\n .innerJoin(\n matchingBlobKeys,\n eq(matchingBlobKeys.matchingBlobKey, blobInfoReferences.blobKey),\n )\n .groupBy(({ blobKey }) => blobKey),\n );\n\n return { blobInfoReferences, groupedBlobInfo, matchingBlobKeys };\n}\n\nasync function countBlobInfoRows(input: {\n readonly db: ClientSQLiteDatabase;\n readonly query: string;\n}): Promise<number> {\n const { blobInfoReferences, groupedBlobInfo, matchingBlobKeys } =\n createGroupedBlobInfoCtes(input);\n const rows =\n matchingBlobKeys === null\n ? await input.db\n .with(blobInfoReferences, groupedBlobInfo)\n .select({ totalCount: count().as(\"total_count\") })\n .from(groupedBlobInfo)\n : await input.db\n .with(blobInfoReferences, matchingBlobKeys, groupedBlobInfo)\n .select({ totalCount: count().as(\"total_count\") })\n .from(groupedBlobInfo);\n\n return readRequiredNumber(rows[0]?.totalCount, \"total_count\");\n}\n\nasync function listBlobInfoRows(input: {\n readonly db: ClientSQLiteDatabase;\n readonly limit: number;\n readonly offset: number;\n readonly query: string;\n readonly sort: BlobInfoSort;\n}): Promise<Array<Omit<BlobInfo, \"references\">>> {\n const { blobInfoReferences, groupedBlobInfo, matchingBlobKeys } =\n createGroupedBlobInfoCtes(input);\n const changedAtSortDirection =\n input.sort.direction === \"desc\"\n ? desc(groupedBlobInfo.changedAtSort)\n : asc(groupedBlobInfo.changedAtSort);\n const byteLengthSortDirection =\n input.sort.direction === \"desc\"\n ? desc(groupedBlobInfo.byteLength)\n : asc(groupedBlobInfo.byteLength);\n let orderBy: ReturnType<typeof asc | typeof desc>[];\n if (input.sort.key === \"mimeType\") {\n orderBy = [\n asc(sql`${groupedBlobInfo.mimeType} IS NULL`),\n input.sort.direction === \"desc\"\n ? desc(sql`${groupedBlobInfo.mimeType} COLLATE NOCASE`)\n : asc(sql`${groupedBlobInfo.mimeType} COLLATE NOCASE`),\n desc(groupedBlobInfo.changedAtSort),\n asc(groupedBlobInfo.blobKey),\n ];\n } else if (input.sort.key === \"byteLength\") {\n orderBy = [\n byteLengthSortDirection,\n desc(groupedBlobInfo.changedAtSort),\n asc(groupedBlobInfo.blobKey),\n ];\n } else {\n orderBy = [\n asc(sql`${groupedBlobInfo.changedAtSort} IS NULL`),\n changedAtSortDirection,\n asc(groupedBlobInfo.blobKey),\n ];\n }\n const selection = {\n blobId: groupedBlobInfo.blobId,\n blobKey: groupedBlobInfo.blobKey,\n byteLength: groupedBlobInfo.byteLength,\n createdAt: groupedBlobInfo.createdAt,\n documentCount: groupedBlobInfo.documentCount,\n mimeType: groupedBlobInfo.mimeType,\n name: groupedBlobInfo.name,\n organizationId: groupedBlobInfo.organizationId,\n referenceCount: groupedBlobInfo.referenceCount,\n storageKey: groupedBlobInfo.storageKey,\n updatedAt: groupedBlobInfo.updatedAt,\n };\n const rows =\n matchingBlobKeys === null\n ? await input.db\n .with(blobInfoReferences, groupedBlobInfo)\n .select(selection)\n .from(groupedBlobInfo)\n .orderBy(...orderBy)\n .limit(input.limit)\n .offset(input.offset)\n : await input.db\n .with(blobInfoReferences, matchingBlobKeys, groupedBlobInfo)\n .select(selection)\n .from(groupedBlobInfo)\n .orderBy(...orderBy)\n .limit(input.limit)\n .offset(input.offset);\n\n return rows.map(mapBlobInfoRow);\n}\n\nasync function listBlobInfoReferencesForKeys(input: {\n readonly db: ClientSQLiteDatabase;\n readonly keys: ReadonlyArray<string>;\n}): Promise<BlobInfoDocumentReference[]> {\n if (input.keys.length === 0) {\n return [];\n }\n\n const blobInfoReferences = createBlobInfoReferencesCte(input.db);\n const rows = await input.db\n .with(blobInfoReferences)\n .select({\n attachmentKind: blobInfoReferences.attachmentKind,\n blobId: blobInfoReferences.blobId,\n byteLength: blobInfoReferences.byteLength,\n containerId: blobInfoReferences.containerId,\n createdAt: blobInfoReferences.createdAt,\n documentId: blobInfoReferences.documentId,\n documentKind: blobInfoReferences.documentKind,\n documentTitle: blobInfoReferences.documentTitle,\n localId: blobInfoReferences.localId,\n mimeType: blobInfoReferences.mimeType,\n name: blobInfoReferences.name,\n slotId: blobInfoReferences.slotId,\n storageKey: blobInfoReferences.storageKey,\n updatedAt: blobInfoReferences.updatedAt,\n })\n .from(blobInfoReferences)\n .where(inArray(blobInfoReferences.blobKey, [...input.keys]))\n .orderBy(\n asc(blobInfoReferences.blobKey),\n desc(blobInfoReferences.changedAtSort),\n asc(blobInfoReferences.localId),\n asc(blobInfoReferences.slotId),\n );\n\n return rows.map(mapBlobInfoReferenceRow);\n}\n\nexport async function listBlobInfo(\n input: BlobInfoInput & { readonly execSql?: ExecSql | null | undefined },\n): Promise<BlobInfoList> {\n if (!input.execSql) {\n return { rows: [], totalCount: 0 };\n }\n\n const query = normalizeBlobInfoQuery(input.query);\n const limit = normalizeBlobInfoLimit(input.limit);\n const offset = normalizeBlobInfoWindowValue(input.offset);\n const sort = normalizeBlobInfoSort(input.sort);\n await sqlDocumentsPersistence.ensureSchema(input.execSql);\n await ensureContainerTables(input.execSql);\n const { db } = getClientSQLitePersistenceRuntime(input.execSql);\n\n const totalCount = await countBlobInfoRows({\n db,\n query,\n });\n if (limit === 0 || offset >= totalCount) {\n return { rows: [], totalCount };\n }\n\n const groupedRows = await listBlobInfoRows({\n db,\n limit,\n offset,\n query,\n sort,\n });\n const references = await listBlobInfoReferencesForKeys({\n db,\n keys: groupedRows.map((row) => row.key),\n });\n\n return {\n rows: attachBlobInfoReferences({ references, rows: groupedRows }),\n totalCount,\n };\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { eq } from "drizzle-orm";
|
|
2
2
|
import { getTargetContainerContext, readContainerState, } from "../../../data/containers/shared/projection.js";
|
|
3
|
-
import { ensureContainerTables } from "../../../data/persistence/
|
|
4
|
-
import { containerContentsSyncLane, containerParentSyncLane, containerSyncWatermarkLaneKey, sqlContainerSyncWatermarkPersistence, } from "../../../data/persistence/
|
|
3
|
+
import { ensureContainerTables } from "../../../data/persistence/container-contents/containerPersistence.js";
|
|
4
|
+
import { containerContentsSyncLane, containerParentSyncLane, containerSyncWatermarkLaneKey, sqlContainerSyncWatermarkPersistence, } from "../../../data/persistence/container-contents/containerSyncWatermarkPersistence.js";
|
|
5
5
|
import { containers } from "../../../data/sqlite/schema/index.js";
|
|
6
6
|
import { getClientSQLitePersistenceRuntime } from "../../../data/sqlite/sqlitePersistenceRuntime.js";
|
|
7
7
|
function sortContainerInfoGrants(grants) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerInfo.js","sourceRoot":"","sources":["containerInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ContainerAccessLevel,\n ContainerGrantSubjectType,\n} from \"@tearleads/crypto\";\nimport type { ContainerWriterProjectionResponse } from \"@tearleads/validators/response\";\nimport { eq } from \"drizzle-orm\";\nimport {\n getTargetContainerContext,\n readContainerState,\n} from \"../../../data/containers/shared/projection\";\nimport { ensureContainerTables } from \"../../../data/persistence/containers/containerPersistence\";\nimport {\n type ContainerSyncWatermarkLane,\n containerContentsSyncLane,\n containerParentSyncLane,\n containerSyncWatermarkLaneKey,\n sqlContainerSyncWatermarkPersistence,\n} from \"../../../data/persistence/containers/containerSyncWatermarkPersistence\";\nimport { containers } from \"../../../data/sqlite/schema\";\nimport { getClientSQLitePersistenceRuntime } from \"../../../data/sqlite/sqlitePersistenceRuntime\";\nimport type { ExecSql } from \"../../../data/sqlite/sqlSchema\";\nimport type { OrganizationGroupSummary } from \"../../organizations/readModel\";\n\nexport type ContainerShareAccessLevel = ContainerAccessLevel;\n\nexport interface ContainerInfoGrant {\n accessLevel: ContainerAccessLevel;\n subjectId: string;\n subjectType: ContainerGrantSubjectType;\n}\n\nexport interface ContainerInfoGrantRow extends ContainerInfoGrant {\n inherited: boolean;\n sourceContainerId: string;\n}\n\nexport interface ContainerInfoSyncCursor {\n label: string;\n laneId: string;\n laneKind: string;\n savedAt: string | null;\n watermarkId: string | null;\n watermarkUpdatedAt: string | null;\n}\n\nexport interface ContainerInfoPathEntry {\n containerId: string;\n containerKeyEpoch: number;\n containerKeyEpochId: string;\n directGrantCount: number;\n eventHash: string;\n keyEpochHash: string;\n keyTargetHash: string;\n manifestHash: string;\n manifestHistoryCount: number;\n parentContainerId: string | null;\n parentManifestHash: string | null;\n recipientTargetCount: number;\n referencedPrincipalCount: number;\n wrapCount: number;\n}\n\nexport interface ContainerInfoSecurityDetails {\n currentContainerKeyEpoch: number;\n currentContainerKeyEpochId: string;\n currentManifestHash: string;\n currentManifestHistoryCount: number;\n currentParentContainerKeyEpochId: string | null;\n currentReferencedPrincipalCount: number;\n path: ContainerInfoPathEntry[];\n pathLength: number;\n}\n\nexport interface ContainerInfoRemoteDetails {\n grantRows: ContainerInfoGrantRow[];\n grants: ContainerInfoGrant[];\n groups: OrganizationGroupSummary[];\n security?: ContainerInfoSecurityDetails;\n syncCursors: ContainerInfoSyncCursor[];\n}\n\nexport interface ContainerInfoLocalDetails {\n createdAt: string | null;\n updatedAt: string | null;\n}\n\nexport interface ContainerInfo {\n local: ContainerInfoLocalDetails;\n remoteInfo: ContainerInfoRemoteDetails | null;\n}\n\ninterface ContainerInfoApi {\n getContainerWriterProjection: (\n containerId: string,\n ) => Promise<ContainerWriterProjectionResponse | null>;\n}\n\nexport type ContainerInfoRemoteMode = \"always\" | \"if-synced\" | \"never\";\n\ninterface LocalContainerInfoRecord {\n hasSyncedContainer: boolean;\n localCreatedAt: string | null;\n localUpdatedAt: string | null;\n organizationId: string | null;\n parentId: string | null;\n}\n\nfunction sortContainerInfoGrants<T extends ContainerInfoGrant>(\n grants: readonly T[],\n): T[] {\n return [...grants].sort((left, right) =>\n `${left.subjectType}:${left.subjectId}`.localeCompare(\n `${right.subjectType}:${right.subjectId}`,\n ),\n );\n}\n\nfunction toContainerInfoGrant(grant: ContainerInfoGrant): ContainerInfoGrant {\n return {\n accessLevel: grant.accessLevel,\n subjectId: grant.subjectId,\n subjectType: grant.subjectType,\n };\n}\n\nfunction getContainerInfoGrantRows(\n projection: ContainerWriterProjectionResponse,\n): ContainerInfoGrantRow[] {\n const rows = projection.path.flatMap((bundle) => {\n const state = readContainerState(bundle);\n\n return state.directGrants.map((grant) => ({\n ...toContainerInfoGrant(grant),\n inherited: state.containerId !== projection.containerId,\n sourceContainerId: state.containerId,\n }));\n });\n\n return sortContainerInfoGrants(rows);\n}\n\nfunction getContainerInfoPathEntries(\n projection: ContainerWriterProjectionResponse,\n): ContainerInfoPathEntry[] {\n return projection.path.map((bundle, index) => {\n const state = readContainerState(bundle);\n const kek = projection.containerKeks[index];\n if (!kek) {\n throw new Error(\"Container projection path and KEKs are inconsistent\");\n }\n\n return {\n containerId: state.containerId,\n containerKeyEpoch: kek.containerKeyEpoch,\n containerKeyEpochId: kek.containerKeyEpochId,\n directGrantCount: state.directGrants.length,\n eventHash: state.eventHash,\n keyEpochHash: kek.keyEpochHash,\n keyTargetHash: kek.keyTargetHash,\n manifestHash: bundle.manifestHash,\n manifestHistoryCount: kek.containerManifestHistory.length,\n parentContainerId: state.parentContainerId,\n parentManifestHash: state.parentManifestHash,\n recipientTargetCount: kek.recipientTargets.length,\n referencedPrincipalCount: state.referencedPrincipalHeads.length,\n wrapCount: kek.wraps.length,\n };\n });\n}\n\nfunction getContainerInfoSecurityDetails(\n projection: ContainerWriterProjectionResponse,\n): ContainerInfoSecurityDetails {\n const path = getContainerInfoPathEntries(projection);\n const targetPathEntry = path.at(-1);\n const targetKek = projection.containerKeks.at(-1);\n if (!targetPathEntry || !targetKek) {\n throw new Error(\"Container projection is empty\");\n }\n\n return {\n currentContainerKeyEpoch: targetPathEntry.containerKeyEpoch,\n currentContainerKeyEpochId: targetPathEntry.containerKeyEpochId,\n currentManifestHash: targetPathEntry.manifestHash,\n currentManifestHistoryCount: targetPathEntry.manifestHistoryCount,\n currentParentContainerKeyEpochId: targetKek.parentContainerKeyEpochId,\n currentReferencedPrincipalCount: targetPathEntry.referencedPrincipalCount,\n path,\n pathLength: path.length,\n };\n}\n\ninterface ContainerInfoSyncCursorDefinition {\n label: string;\n lane: ContainerSyncWatermarkLane;\n}\n\nfunction getContainerSyncCursorDefinitions(input: {\n containerId: string;\n parentId: string | null;\n}): ContainerInfoSyncCursorDefinition[] {\n return [\n {\n label: \"Parent Listing\",\n lane: containerParentSyncLane(input.parentId),\n },\n {\n label: \"Child Containers\",\n lane: containerParentSyncLane(input.containerId),\n },\n {\n label: \"Documents\",\n lane: containerContentsSyncLane(input.containerId),\n },\n ];\n}\n\nasync function loadContainerSyncCursors(input: {\n containerId: string;\n execSql: ExecSql | null;\n parentId: string | null;\n}): Promise<ContainerInfoSyncCursor[]> {\n const cursorDefinitions = getContainerSyncCursorDefinitions(input);\n let records: Awaited<\n ReturnType<typeof sqlContainerSyncWatermarkPersistence.loadWatermarkRecords>\n > = [];\n if (input.execSql) {\n await sqlContainerSyncWatermarkPersistence.ensureSchema(input.execSql);\n records = await sqlContainerSyncWatermarkPersistence.loadWatermarkRecords(\n input.execSql,\n cursorDefinitions.map(({ lane }) => lane),\n );\n }\n\n return cursorDefinitions.map((definition, index) => {\n const { laneId, laneKind } = containerSyncWatermarkLaneKey(definition.lane);\n const record = records[index] ?? null;\n\n return {\n label: definition.label,\n laneId,\n laneKind,\n savedAt: record?.updatedAt ?? null,\n watermarkId: record?.watermark.id ?? null,\n watermarkUpdatedAt: record?.watermark.updatedAt ?? null,\n };\n });\n}\n\nasync function loadLocalContainerInfoRecord(input: {\n containerId: string;\n execSql: ExecSql | null;\n parentId: string | null;\n}): Promise<LocalContainerInfoRecord> {\n const fallback: LocalContainerInfoRecord = {\n hasSyncedContainer: false,\n localCreatedAt: null,\n localUpdatedAt: null,\n organizationId: null,\n parentId: input.parentId,\n };\n\n if (!input.execSql) {\n return fallback;\n }\n\n await ensureContainerTables(input.execSql);\n\n const { db } = getClientSQLitePersistenceRuntime(input.execSql);\n const rows = await db\n .select({\n localCreatedAt: containers.localCreatedAt,\n localUpdatedAt: containers.localUpdatedAt,\n metadataDocumentId: containers.metadataDocumentId,\n organizationId: containers.organizationId,\n parentId: containers.parentId,\n })\n .from(containers)\n .where(eq(containers.id, input.containerId))\n .limit(1);\n const row = rows[0];\n\n if (!row) {\n return fallback;\n }\n\n return {\n hasSyncedContainer:\n typeof row.metadataDocumentId === \"string\" &&\n row.metadataDocumentId.length > 0,\n localCreatedAt: row.localCreatedAt,\n localUpdatedAt: row.localUpdatedAt,\n organizationId: row.organizationId,\n parentId: row.parentId,\n };\n}\n\nfunction shouldLoadRemoteContainerInfo(input: {\n localContainerInfo: LocalContainerInfoRecord;\n remoteInfoMode: ContainerInfoRemoteMode;\n}): boolean {\n switch (input.remoteInfoMode) {\n case \"always\":\n return true;\n case \"if-synced\":\n return input.localContainerInfo.hasSyncedContainer;\n case \"never\":\n return false;\n }\n}\n\nexport async function loadContainerInfo(input: {\n apiClient: ContainerInfoApi;\n containerId: string;\n containerProjection?: ContainerWriterProjectionResponse | null | undefined;\n execSql?: ExecSql | null;\n loadOrganizationGroups: () => Promise<\n ReadonlyArray<OrganizationGroupSummary>\n >;\n parentId?: string | null;\n remoteInfoMode?: ContainerInfoRemoteMode | undefined;\n}): Promise<ContainerInfo> {\n const localContainerInfo = await loadLocalContainerInfoRecord({\n containerId: input.containerId,\n execSql: input.execSql ?? null,\n parentId: input.parentId ?? null,\n });\n const local = {\n createdAt: localContainerInfo.localCreatedAt,\n updatedAt: localContainerInfo.localUpdatedAt,\n };\n\n if (\n !shouldLoadRemoteContainerInfo({\n localContainerInfo,\n remoteInfoMode: input.remoteInfoMode ?? \"always\",\n })\n ) {\n return {\n local,\n remoteInfo: null,\n };\n }\n\n const [projection, groups, syncCursors] = await Promise.all([\n input.containerProjection\n ? Promise.resolve(input.containerProjection)\n : input.apiClient.getContainerWriterProjection(input.containerId),\n input.loadOrganizationGroups(),\n loadContainerSyncCursors({\n containerId: input.containerId,\n execSql: input.execSql ?? null,\n parentId: localContainerInfo.parentId,\n }),\n ]);\n\n if (!projection) {\n throw new Error(\"Container info could not be loaded.\");\n }\n\n const target = getTargetContainerContext(projection);\n const state = readContainerState(target.manifest);\n\n return {\n local,\n remoteInfo: {\n grantRows: getContainerInfoGrantRows(projection),\n grants: sortContainerInfoGrants(\n state.directGrants.map(toContainerInfoGrant),\n ),\n groups: [...groups],\n security: getContainerInfoSecurityDetails(projection),\n syncCursors,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"containerInfo.js","sourceRoot":"","sources":["containerInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ContainerAccessLevel,\n ContainerGrantSubjectType,\n} from \"@tearleads/crypto\";\nimport type { ContainerWriterProjectionResponse } from \"@tearleads/validators/response\";\nimport { eq } from \"drizzle-orm\";\nimport {\n getTargetContainerContext,\n readContainerState,\n} from \"../../../data/containers/shared/projection\";\nimport { ensureContainerTables } from \"../../../data/persistence/container-contents/containerPersistence\";\nimport {\n type ContainerSyncWatermarkLane,\n containerContentsSyncLane,\n containerParentSyncLane,\n containerSyncWatermarkLaneKey,\n sqlContainerSyncWatermarkPersistence,\n} from \"../../../data/persistence/container-contents/containerSyncWatermarkPersistence\";\nimport { containers } from \"../../../data/sqlite/schema\";\nimport { getClientSQLitePersistenceRuntime } from \"../../../data/sqlite/sqlitePersistenceRuntime\";\nimport type { ExecSql } from \"../../../data/sqlite/sqlSchema\";\nimport type { OrganizationGroupSummary } from \"../../organizations/readModel\";\n\nexport type ContainerShareAccessLevel = ContainerAccessLevel;\n\nexport interface ContainerInfoGrant {\n accessLevel: ContainerAccessLevel;\n subjectId: string;\n subjectType: ContainerGrantSubjectType;\n}\n\nexport interface ContainerInfoGrantRow extends ContainerInfoGrant {\n inherited: boolean;\n sourceContainerId: string;\n}\n\nexport interface ContainerInfoSyncCursor {\n label: string;\n laneId: string;\n laneKind: string;\n savedAt: string | null;\n watermarkId: string | null;\n watermarkUpdatedAt: string | null;\n}\n\nexport interface ContainerInfoPathEntry {\n containerId: string;\n containerKeyEpoch: number;\n containerKeyEpochId: string;\n directGrantCount: number;\n eventHash: string;\n keyEpochHash: string;\n keyTargetHash: string;\n manifestHash: string;\n manifestHistoryCount: number;\n parentContainerId: string | null;\n parentManifestHash: string | null;\n recipientTargetCount: number;\n referencedPrincipalCount: number;\n wrapCount: number;\n}\n\nexport interface ContainerInfoSecurityDetails {\n currentContainerKeyEpoch: number;\n currentContainerKeyEpochId: string;\n currentManifestHash: string;\n currentManifestHistoryCount: number;\n currentParentContainerKeyEpochId: string | null;\n currentReferencedPrincipalCount: number;\n path: ContainerInfoPathEntry[];\n pathLength: number;\n}\n\nexport interface ContainerInfoRemoteDetails {\n grantRows: ContainerInfoGrantRow[];\n grants: ContainerInfoGrant[];\n groups: OrganizationGroupSummary[];\n security?: ContainerInfoSecurityDetails;\n syncCursors: ContainerInfoSyncCursor[];\n}\n\nexport interface ContainerInfoLocalDetails {\n createdAt: string | null;\n updatedAt: string | null;\n}\n\nexport interface ContainerInfo {\n local: ContainerInfoLocalDetails;\n remoteInfo: ContainerInfoRemoteDetails | null;\n}\n\ninterface ContainerInfoApi {\n getContainerWriterProjection: (\n containerId: string,\n ) => Promise<ContainerWriterProjectionResponse | null>;\n}\n\nexport type ContainerInfoRemoteMode = \"always\" | \"if-synced\" | \"never\";\n\ninterface LocalContainerInfoRecord {\n hasSyncedContainer: boolean;\n localCreatedAt: string | null;\n localUpdatedAt: string | null;\n organizationId: string | null;\n parentId: string | null;\n}\n\nfunction sortContainerInfoGrants<T extends ContainerInfoGrant>(\n grants: readonly T[],\n): T[] {\n return [...grants].sort((left, right) =>\n `${left.subjectType}:${left.subjectId}`.localeCompare(\n `${right.subjectType}:${right.subjectId}`,\n ),\n );\n}\n\nfunction toContainerInfoGrant(grant: ContainerInfoGrant): ContainerInfoGrant {\n return {\n accessLevel: grant.accessLevel,\n subjectId: grant.subjectId,\n subjectType: grant.subjectType,\n };\n}\n\nfunction getContainerInfoGrantRows(\n projection: ContainerWriterProjectionResponse,\n): ContainerInfoGrantRow[] {\n const rows = projection.path.flatMap((bundle) => {\n const state = readContainerState(bundle);\n\n return state.directGrants.map((grant) => ({\n ...toContainerInfoGrant(grant),\n inherited: state.containerId !== projection.containerId,\n sourceContainerId: state.containerId,\n }));\n });\n\n return sortContainerInfoGrants(rows);\n}\n\nfunction getContainerInfoPathEntries(\n projection: ContainerWriterProjectionResponse,\n): ContainerInfoPathEntry[] {\n return projection.path.map((bundle, index) => {\n const state = readContainerState(bundle);\n const kek = projection.containerKeks[index];\n if (!kek) {\n throw new Error(\"Container projection path and KEKs are inconsistent\");\n }\n\n return {\n containerId: state.containerId,\n containerKeyEpoch: kek.containerKeyEpoch,\n containerKeyEpochId: kek.containerKeyEpochId,\n directGrantCount: state.directGrants.length,\n eventHash: state.eventHash,\n keyEpochHash: kek.keyEpochHash,\n keyTargetHash: kek.keyTargetHash,\n manifestHash: bundle.manifestHash,\n manifestHistoryCount: kek.containerManifestHistory.length,\n parentContainerId: state.parentContainerId,\n parentManifestHash: state.parentManifestHash,\n recipientTargetCount: kek.recipientTargets.length,\n referencedPrincipalCount: state.referencedPrincipalHeads.length,\n wrapCount: kek.wraps.length,\n };\n });\n}\n\nfunction getContainerInfoSecurityDetails(\n projection: ContainerWriterProjectionResponse,\n): ContainerInfoSecurityDetails {\n const path = getContainerInfoPathEntries(projection);\n const targetPathEntry = path.at(-1);\n const targetKek = projection.containerKeks.at(-1);\n if (!targetPathEntry || !targetKek) {\n throw new Error(\"Container projection is empty\");\n }\n\n return {\n currentContainerKeyEpoch: targetPathEntry.containerKeyEpoch,\n currentContainerKeyEpochId: targetPathEntry.containerKeyEpochId,\n currentManifestHash: targetPathEntry.manifestHash,\n currentManifestHistoryCount: targetPathEntry.manifestHistoryCount,\n currentParentContainerKeyEpochId: targetKek.parentContainerKeyEpochId,\n currentReferencedPrincipalCount: targetPathEntry.referencedPrincipalCount,\n path,\n pathLength: path.length,\n };\n}\n\ninterface ContainerInfoSyncCursorDefinition {\n label: string;\n lane: ContainerSyncWatermarkLane;\n}\n\nfunction getContainerSyncCursorDefinitions(input: {\n containerId: string;\n parentId: string | null;\n}): ContainerInfoSyncCursorDefinition[] {\n return [\n {\n label: \"Parent Listing\",\n lane: containerParentSyncLane(input.parentId),\n },\n {\n label: \"Child Containers\",\n lane: containerParentSyncLane(input.containerId),\n },\n {\n label: \"Documents\",\n lane: containerContentsSyncLane(input.containerId),\n },\n ];\n}\n\nasync function loadContainerSyncCursors(input: {\n containerId: string;\n execSql: ExecSql | null;\n parentId: string | null;\n}): Promise<ContainerInfoSyncCursor[]> {\n const cursorDefinitions = getContainerSyncCursorDefinitions(input);\n let records: Awaited<\n ReturnType<typeof sqlContainerSyncWatermarkPersistence.loadWatermarkRecords>\n > = [];\n if (input.execSql) {\n await sqlContainerSyncWatermarkPersistence.ensureSchema(input.execSql);\n records = await sqlContainerSyncWatermarkPersistence.loadWatermarkRecords(\n input.execSql,\n cursorDefinitions.map(({ lane }) => lane),\n );\n }\n\n return cursorDefinitions.map((definition, index) => {\n const { laneId, laneKind } = containerSyncWatermarkLaneKey(definition.lane);\n const record = records[index] ?? null;\n\n return {\n label: definition.label,\n laneId,\n laneKind,\n savedAt: record?.updatedAt ?? null,\n watermarkId: record?.watermark.id ?? null,\n watermarkUpdatedAt: record?.watermark.updatedAt ?? null,\n };\n });\n}\n\nasync function loadLocalContainerInfoRecord(input: {\n containerId: string;\n execSql: ExecSql | null;\n parentId: string | null;\n}): Promise<LocalContainerInfoRecord> {\n const fallback: LocalContainerInfoRecord = {\n hasSyncedContainer: false,\n localCreatedAt: null,\n localUpdatedAt: null,\n organizationId: null,\n parentId: input.parentId,\n };\n\n if (!input.execSql) {\n return fallback;\n }\n\n await ensureContainerTables(input.execSql);\n\n const { db } = getClientSQLitePersistenceRuntime(input.execSql);\n const rows = await db\n .select({\n localCreatedAt: containers.localCreatedAt,\n localUpdatedAt: containers.localUpdatedAt,\n metadataDocumentId: containers.metadataDocumentId,\n organizationId: containers.organizationId,\n parentId: containers.parentId,\n })\n .from(containers)\n .where(eq(containers.id, input.containerId))\n .limit(1);\n const row = rows[0];\n\n if (!row) {\n return fallback;\n }\n\n return {\n hasSyncedContainer:\n typeof row.metadataDocumentId === \"string\" &&\n row.metadataDocumentId.length > 0,\n localCreatedAt: row.localCreatedAt,\n localUpdatedAt: row.localUpdatedAt,\n organizationId: row.organizationId,\n parentId: row.parentId,\n };\n}\n\nfunction shouldLoadRemoteContainerInfo(input: {\n localContainerInfo: LocalContainerInfoRecord;\n remoteInfoMode: ContainerInfoRemoteMode;\n}): boolean {\n switch (input.remoteInfoMode) {\n case \"always\":\n return true;\n case \"if-synced\":\n return input.localContainerInfo.hasSyncedContainer;\n case \"never\":\n return false;\n }\n}\n\nexport async function loadContainerInfo(input: {\n apiClient: ContainerInfoApi;\n containerId: string;\n containerProjection?: ContainerWriterProjectionResponse | null | undefined;\n execSql?: ExecSql | null;\n loadOrganizationGroups: () => Promise<\n ReadonlyArray<OrganizationGroupSummary>\n >;\n parentId?: string | null;\n remoteInfoMode?: ContainerInfoRemoteMode | undefined;\n}): Promise<ContainerInfo> {\n const localContainerInfo = await loadLocalContainerInfoRecord({\n containerId: input.containerId,\n execSql: input.execSql ?? null,\n parentId: input.parentId ?? null,\n });\n const local = {\n createdAt: localContainerInfo.localCreatedAt,\n updatedAt: localContainerInfo.localUpdatedAt,\n };\n\n if (\n !shouldLoadRemoteContainerInfo({\n localContainerInfo,\n remoteInfoMode: input.remoteInfoMode ?? \"always\",\n })\n ) {\n return {\n local,\n remoteInfo: null,\n };\n }\n\n const [projection, groups, syncCursors] = await Promise.all([\n input.containerProjection\n ? Promise.resolve(input.containerProjection)\n : input.apiClient.getContainerWriterProjection(input.containerId),\n input.loadOrganizationGroups(),\n loadContainerSyncCursors({\n containerId: input.containerId,\n execSql: input.execSql ?? null,\n parentId: localContainerInfo.parentId,\n }),\n ]);\n\n if (!projection) {\n throw new Error(\"Container info could not be loaded.\");\n }\n\n const target = getTargetContainerContext(projection);\n const state = readContainerState(target.manifest);\n\n return {\n local,\n remoteInfo: {\n grantRows: getContainerInfoGrantRows(projection),\n grants: sortContainerInfoGrants(\n state.directGrants.map(toContainerInfoGrant),\n ),\n groups: [...groups],\n security: getContainerInfoSecurityDetails(projection),\n syncCursors,\n },\n };\n}\n"]}
|
package/{data/containers → workflows/container-contents/metadata}/containerMetadataDocument.js
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createDocument, exportAllUpdates } from "
|
|
2
|
-
import { getScopedPeerSeed } from "
|
|
1
|
+
import { createDocument, exportAllUpdates } from "../../../internal/loro/index.js";
|
|
2
|
+
import { getScopedPeerSeed } from "../../../data/sync/crdtPeerSeed.js";
|
|
3
3
|
export function getDefaultContainerName(parentId) {
|
|
4
4
|
return parentId === null ? "/" : "Untitled";
|
|
5
5
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containerMetadataDocument.js","sourceRoot":"","sources":["containerMetadataDocument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAWpE,MAAM,UAAU,uBAAuB,CAAC,QAAuB;IAC7D,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,YAAoB;IAEpB,2EAA2E;IAC3E,4EAA4E;IAC5E,2EAA2E;IAC3E,wEAAwE;IACxE,OAAO,cAAc,CAAC,MAAM,iBAAiB,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0CAA0C,CAC9D,WAAmB,EACnB,KAA6B;IAK7B,MAAM,GAAG,GAAG,MAAM,+BAA+B,CAAC,WAAW,CAAC,CAAC;IAC/D,2BAA2B,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAExC,OAAO;QACL,GAAG;QACH,aAAa,EAAE,gBAAgB,CAAC,GAAG,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,GAA8B,EAC9B,WAAmB;IAEnB,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAExC,OAAO;QACL,IAAI,EACF,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YACrD,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,IAAI;QACV,IAAI,EACF,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC5D,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,WAAW;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,GAA8B,EAC9B,KAA6B;IAE7B,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEzC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC","sourcesContent":["import { createDocument, exportAllUpdates } from \"@tearleads/loro\";\nimport { getScopedPeerSeed } from \"../../../data/sync/crdtPeerSeed\";\n\ninterface ContainerMetadataValue {\n icon: string | null;\n name: string;\n}\n\nexport type ContainerMetadataDocument = Awaited<\n ReturnType<typeof createDocument>\n>;\n\nexport function getDefaultContainerName(parentId: string | null): string {\n return parentId === null ? \"/\" : \"Untitled\";\n}\n\nexport async function createContainerMetadataDocument(\n _containerId: string,\n): Promise<ContainerMetadataDocument> {\n // A single static scope for all container-metadata docs: they are separate\n // CRDTs, so they can share one device peer, and a per-container scope would\n // hold a distinct device-peer lock (and cache entry) per container for the\n // tab's lifetime, accumulating without bound as containers are browsed.\n return createDocument(await getScopedPeerSeed(\"container-metadata\"));\n}\n\nexport async function createInitializedContainerMetadataDocument(\n containerId: string,\n value: ContainerMetadataValue,\n): Promise<{\n doc: ContainerMetadataDocument;\n initialUpdate: Uint8Array;\n}> {\n const doc = await createContainerMetadataDocument(containerId);\n writeContainerMetadataValue(doc, value);\n\n return {\n doc,\n initialUpdate: exportAllUpdates(doc),\n };\n}\n\nexport function readContainerMetadataValue(\n doc: ContainerMetadataDocument,\n defaultName: string,\n): ContainerMetadataValue {\n const metadata = doc.getMap(\"container\");\n const storedName = metadata.get(\"name\");\n const storedIcon = metadata.get(\"icon\");\n\n return {\n icon:\n typeof storedIcon === \"string\" && storedIcon.length > 0\n ? storedIcon\n : null,\n name:\n typeof storedName === \"string\" && storedName.trim().length > 0\n ? storedName\n : defaultName,\n };\n}\n\nexport function writeContainerMetadataValue(\n doc: ContainerMetadataDocument,\n value: ContainerMetadataValue,\n): void {\n const metadata = doc.getMap(\"container\");\n\n metadata.set(\"name\", value.name);\n\n if (value.icon) {\n metadata.set(\"icon\", value.icon);\n return;\n }\n\n metadata.delete(\"icon\");\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { base64ToBytes } from "../../../internal/encoding/index.js";
|
|
2
2
|
import { encodeVersionVector, exportUpdatesSince, importUpdates, } from "../../../internal/loro/index.js";
|
|
3
|
-
import { getDefaultContainerName, readContainerMetadataValue, writeContainerMetadataValue, } from "../../../data/containers/containerMetadataDocument.js";
|
|
4
3
|
import { documentSyncPullContinuationsEqual } from "../../../data/documents/shared/sync/syncPagination.js";
|
|
5
4
|
import { canWriteEffectiveAccessLevel } from "../../../data/keying/accessLevel.js";
|
|
5
|
+
import { getDefaultContainerName, readContainerMetadataValue, writeContainerMetadataValue, } from "./containerMetadataDocument.js";
|
|
6
6
|
import { metadataSyncSecurityContextMatches, replaceSupersededMetadataIdentity, sameNullableMetadataValue, } from "./metadataSyncSettlement.js";
|
|
7
7
|
export function currentMetadataPullContinuation(metadataState) {
|
|
8
8
|
return Object.hasOwn(metadataState, "pullContinuation")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadataMutationPreparation.js","sourceRoot":"","sources":["metadataMutationPreparation.ts"],"names":[],"mappings":"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","sourcesContent":["import { base64ToBytes } from \"@tearleads/encoding\";\nimport {\n encodeVersionVector,\n exportUpdatesSince,\n importUpdates,\n} from \"@tearleads/loro\";\nimport {\n getDefaultContainerName,\n readContainerMetadataValue,\n writeContainerMetadataValue,\n} from \"../../../data/containers/containerMetadataDocument\";\nimport { documentSyncPullContinuationsEqual } from \"../../../data/documents/shared/sync/syncPagination\";\nimport { canWriteEffectiveAccessLevel } from \"../../../data/keying/accessLevel\";\nimport type { ContainerContentsPersistence } from \"../../../data/persistence/container-contents/containerContentsPersistence\";\nimport type { ExecSql } from \"../../../data/sqlite/sqlSchema\";\nimport type { ContainerDocumentRecord as DocumentRecord } from \"../containerPersistence\";\nimport {\n type ExpectedContainerMetadataSyncState,\n metadataSyncSecurityContextMatches,\n replaceSupersededMetadataIdentity,\n sameNullableMetadataValue,\n} from \"./metadataSyncSettlement\";\nimport type {\n ContainerMetadataPatch,\n ContainerMetadataState,\n} from \"./metadataTypes\";\n\nexport interface PersistContainerMetadataStateInput {\n acceptedPendingUpdateIds?: readonly string[] | undefined;\n clearSyncFailure?: boolean | undefined;\n execSql: ExecSql;\n expectedSyncState?: ExpectedContainerMetadataSyncState | undefined;\n localMetadataPatch?:\n | Partial<Pick<ContainerMetadataPatch, \"icon\" | \"name\">>\n | undefined;\n localUpdate?: Uint8Array | undefined;\n metadataState: ContainerMetadataState;\n createIntentSettlement?: Parameters<\n ContainerContentsPersistence[\"commitMetadataMutation\"]\n >[1][\"createIntentSettlement\"];\n moveIntentSettlement?: Parameters<\n ContainerContentsPersistence[\"commitMetadataMutation\"]\n >[1][\"moveIntentSettlement\"];\n patch?: Partial<ContainerMetadataPatch> | undefined;\n persistence: ContainerContentsPersistence;\n preserveDurableStructureWhenPending?: boolean | undefined;\n saveOptions?:\n | Parameters<ContainerContentsPersistence[\"saveContainer\"]>[3]\n | undefined;\n stillCurrent?: (() => boolean) | undefined;\n}\n\nexport function currentMetadataPullContinuation(\n metadataState: ContainerMetadataState,\n) {\n return Object.hasOwn(metadataState, \"pullContinuation\")\n ? (metadataState.pullContinuation ?? null)\n : (metadataState.record.pullContinuation ?? null);\n}\n\nexport function resolveMetadataSecurityContext(\n metadataState: ContainerMetadataState,\n patch: Partial<ContainerMetadataPatch>,\n) {\n const currentDocumentId = metadataState.record.documentId ?? null;\n const documentId =\n patch.documentId !== undefined ? patch.documentId : currentDocumentId;\n const accessEpoch = patch.accessEpoch ?? metadataState.record.accessEpoch;\n const documentIdChanged = documentId !== currentDocumentId;\n\n return {\n accessEpoch,\n changed:\n documentIdChanged || accessEpoch !== metadataState.record.accessEpoch,\n documentId,\n documentIdChanged,\n };\n}\n\nfunction mergeDurableMetadataCheckpoint(input: {\n durableRecord: DocumentRecord | null;\n metadataState: ContainerMetadataState;\n securityContext: ReturnType<typeof resolveMetadataSecurityContext>;\n}): void {\n const { durableRecord, metadataState, securityContext } = input;\n if (\n !durableRecord?.metadataUpdates ||\n durableRecord.documentId !== metadataState.record.documentId ||\n durableRecord.documentId !== securityContext.documentId ||\n durableRecord.accessEpoch !== metadataState.record.accessEpoch ||\n durableRecord.accessEpoch !== securityContext.accessEpoch\n ) {\n return;\n }\n\n importUpdates(metadataState.doc, [\n base64ToBytes(durableRecord.metadataUpdates),\n ]);\n}\n\nexport async function loadAuthoritativeContainerMetadataState(input: {\n containerId: string;\n execSql: ExecSql;\n persistence: ContainerContentsPersistence;\n}) {\n const stored = await input.persistence.loadContainerMetadataState(\n input.execSql,\n input.containerId,\n );\n return stored?.record\n ? { container: stored.container, record: stored.record }\n : null;\n}\n\nfunction localMetadataWriteAccessWasRevoked(input: {\n authoritativeState: NonNullable<\n Awaited<ReturnType<typeof loadAuthoritativeContainerMetadataState>>\n >;\n mutationInput: PersistContainerMetadataStateInput;\n}): boolean {\n return (\n input.mutationInput.expectedSyncState === undefined &&\n input.mutationInput.localUpdate !== undefined &&\n canWriteEffectiveAccessLevel(\n input.mutationInput.metadataState.container.effectiveAccessLevel,\n ) &&\n !canWriteEffectiveAccessLevel(\n input.authoritativeState.container.effectiveAccessLevel,\n )\n );\n}\n\nasync function prepareRebasedLocalMetadataMutation(input: {\n authoritativeState: NonNullable<\n Awaited<ReturnType<typeof loadAuthoritativeContainerMetadataState>>\n >;\n metadataState: ContainerMetadataState;\n localMetadataPatch:\n | Partial<Pick<ContainerMetadataPatch, \"icon\" | \"name\">>\n | undefined;\n patch: Partial<ContainerMetadataPatch>;\n}) {\n const { authoritativeState, metadataState, patch } = input;\n const replacementVersion = encodeVersionVector(metadataState.doc);\n const replacementMetadata = readContainerMetadataValue(\n metadataState.doc,\n getDefaultContainerName(authoritativeState.container.parentId),\n );\n writeContainerMetadataValue(metadataState.doc, {\n ...replacementMetadata,\n ...input.localMetadataPatch,\n });\n const rebasedMetadataState = {\n ...metadataState,\n container: authoritativeState.container,\n pullContinuation: authoritativeState.record.pullContinuation ?? null,\n record: authoritativeState.record,\n };\n return {\n durableRecord: authoritativeState.record,\n mutationContainer: authoritativeState.container,\n mutationMetadataState: rebasedMetadataState,\n mutationPatch: patch,\n pendingLocalUpdate: exportUpdatesSince(\n metadataState.doc,\n replacementVersion,\n ),\n pullContinuationSuperseded: false,\n securityContext: resolveMetadataSecurityContext(\n rebasedMetadataState,\n patch,\n ),\n securityContextMatches: true,\n };\n}\n\nfunction resolveMetadataSettlementMatch(\n expectedSyncState: ExpectedContainerMetadataSyncState | undefined,\n durableRecord: DocumentRecord | null,\n) {\n if (!expectedSyncState) {\n return {\n contentStateSuperseded: false,\n pullContinuationSuperseded: false,\n securityContextMatches: true,\n };\n }\n const securityContextMatches = metadataSyncSecurityContextMatches(\n durableRecord,\n expectedSyncState.record,\n );\n const progressStateMatches =\n securityContextMatches &&\n sameNullableMetadataValue(\n durableRecord?.lastCommitLsn,\n expectedSyncState.record.lastCommitLsn,\n ) &&\n Boolean(durableRecord?.pullContinuationRecoveryRequired) ===\n Boolean(expectedSyncState.record.pullContinuationRecoveryRequired) &&\n documentSyncPullContinuationsEqual(\n durableRecord?.pullContinuation,\n expectedSyncState.pullContinuation,\n );\n const contentStateMatches =\n progressStateMatches &&\n sameNullableMetadataValue(\n durableRecord?.metadataUpdates,\n expectedSyncState.record.metadataUpdates,\n ) &&\n sameNullableMetadataValue(\n durableRecord?.snapshotEndVersion,\n expectedSyncState.record.snapshotEndVersion,\n );\n return {\n contentStateSuperseded: progressStateMatches && !contentStateMatches,\n pullContinuationSuperseded: !progressStateMatches,\n securityContextMatches,\n };\n}\n\nexport async function prepareContainerMetadataMutation(\n input: PersistContainerMetadataStateInput,\n execSql: ExecSql,\n patch: Partial<ContainerMetadataPatch>,\n) {\n const { metadataState, persistence } = input;\n const authoritativeState = await loadAuthoritativeContainerMetadataState({\n containerId: metadataState.container.id,\n execSql,\n persistence,\n });\n if (!authoritativeState) {\n return {\n authoritativeState: null,\n pullContinuationSuperseded: true,\n securityContextMatches: false,\n };\n }\n if (\n localMetadataWriteAccessWasRevoked({\n authoritativeState,\n mutationInput: input,\n })\n ) {\n await replaceSupersededMetadataIdentity({\n durableRecord: authoritativeState.record,\n metadataState,\n });\n return {\n authoritativeState,\n pullContinuationSuperseded: true,\n securityContextMatches: false,\n };\n }\n const durableRecord = authoritativeState.record;\n const mutationMetadataState = durableRecord\n ? {\n ...metadataState,\n pullContinuation: durableRecord.pullContinuation ?? null,\n record: durableRecord,\n }\n : metadataState;\n const capturedSecurityContextMatches =\n durableRecord !== null &&\n metadataSyncSecurityContextMatches(durableRecord, metadataState.record);\n const {\n contentStateSuperseded,\n pullContinuationSuperseded,\n securityContextMatches,\n } = resolveMetadataSettlementMatch(input.expectedSyncState, durableRecord);\n\n if (\n input.expectedSyncState === undefined &&\n !capturedSecurityContextMatches\n ) {\n await replaceSupersededMetadataIdentity({\n durableRecord: authoritativeState.record,\n metadataState,\n });\n if (input.localUpdate === undefined) {\n return {\n authoritativeState,\n pullContinuationSuperseded: true,\n securityContextMatches: false,\n };\n }\n return prepareRebasedLocalMetadataMutation({\n authoritativeState,\n localMetadataPatch: input.localMetadataPatch,\n metadataState,\n patch,\n });\n }\n const mutationPatch = pullContinuationSuperseded ? {} : patch;\n const securityContext = resolveMetadataSecurityContext(\n mutationMetadataState,\n mutationPatch,\n );\n if (\n securityContextMatches &&\n (input.expectedSyncState === undefined || contentStateSuperseded)\n ) {\n mergeDurableMetadataCheckpoint({\n durableRecord,\n metadataState,\n securityContext,\n });\n }\n return {\n durableRecord,\n mutationContainer: authoritativeState.container,\n mutationMetadataState,\n mutationPatch,\n pendingLocalUpdate: input.localUpdate,\n pullContinuationSuperseded,\n securityContext,\n securityContextMatches,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"metadataMutationPreparation.js","sourceRoot":"","sources":["metadataMutationPreparation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kCAAkC,EAAE,MAAM,oDAAoD,CAAC;AACxG,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAIhF,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEL,kCAAkC,EAClC,iCAAiC,EACjC,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AA+BlC,MAAM,UAAU,+BAA+B,CAC7C,aAAqC;IAErC,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC;QACrD,CAAC,CAAC,CAAC,aAAa,CAAC,gBAAgB,IAAI,IAAI,CAAC;QAC1C,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,aAAqC,EACrC,KAAsC;IAEtC,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC;IAClE,MAAM,UAAU,GACd,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACxE,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC;IAC1E,MAAM,iBAAiB,GAAG,UAAU,KAAK,iBAAiB,CAAC;IAE3D,OAAO;QACL,WAAW;QACX,OAAO,EACL,iBAAiB,IAAI,WAAW,KAAK,aAAa,CAAC,MAAM,CAAC,WAAW;QACvE,UAAU;QACV,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CAAC,KAIvC;IACC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IAChE,IACE,CAAC,aAAa,EAAE,eAAe;QAC/B,aAAa,CAAC,UAAU,KAAK,aAAa,CAAC,MAAM,CAAC,UAAU;QAC5D,aAAa,CAAC,UAAU,KAAK,eAAe,CAAC,UAAU;QACvD,aAAa,CAAC,WAAW,KAAK,aAAa,CAAC,MAAM,CAAC,WAAW;QAC9D,aAAa,CAAC,WAAW,KAAK,eAAe,CAAC,WAAW,EACzD,CAAC;QACD,OAAO;IACT,CAAC;IAED,aAAa,CAAC,aAAa,CAAC,GAAG,EAAE;QAC/B,aAAa,CAAC,aAAa,CAAC,eAAe,CAAC;KAC7C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uCAAuC,CAAC,KAI7D;IACC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,0BAA0B,CAC/D,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,WAAW,CAClB,CAAC;IACF,OAAO,MAAM,EAAE,MAAM;QACnB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QACxD,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,kCAAkC,CAAC,KAK3C;IACC,OAAO,CACL,KAAK,CAAC,aAAa,CAAC,iBAAiB,KAAK,SAAS;QACnD,KAAK,CAAC,aAAa,CAAC,WAAW,KAAK,SAAS;QAC7C,4BAA4B,CAC1B,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,oBAAoB,CACjE;QACD,CAAC,4BAA4B,CAC3B,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,oBAAoB,CACxD,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mCAAmC,CAAC,KASlD;IACC,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAC3D,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,mBAAmB,GAAG,0BAA0B,CACpD,aAAa,CAAC,GAAG,EACjB,uBAAuB,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAC/D,CAAC;IACF,2BAA2B,CAAC,aAAa,CAAC,GAAG,EAAE;QAC7C,GAAG,mBAAmB;QACtB,GAAG,KAAK,CAAC,kBAAkB;KAC5B,CAAC,CAAC;IACH,MAAM,oBAAoB,GAAG;QAC3B,GAAG,aAAa;QAChB,SAAS,EAAE,kBAAkB,CAAC,SAAS;QACvC,gBAAgB,EAAE,kBAAkB,CAAC,MAAM,CAAC,gBAAgB,IAAI,IAAI;QACpE,MAAM,EAAE,kBAAkB,CAAC,MAAM;KAClC,CAAC;IACF,OAAO;QACL,aAAa,EAAE,kBAAkB,CAAC,MAAM;QACxC,iBAAiB,EAAE,kBAAkB,CAAC,SAAS;QAC/C,qBAAqB,EAAE,oBAAoB;QAC3C,aAAa,EAAE,KAAK;QACpB,kBAAkB,EAAE,kBAAkB,CACpC,aAAa,CAAC,GAAG,EACjB,kBAAkB,CACnB;QACD,0BAA0B,EAAE,KAAK;QACjC,eAAe,EAAE,8BAA8B,CAC7C,oBAAoB,EACpB,KAAK,CACN;QACD,sBAAsB,EAAE,IAAI;KAC7B,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CACrC,iBAAiE,EACjE,aAAoC;IAEpC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO;YACL,sBAAsB,EAAE,KAAK;YAC7B,0BAA0B,EAAE,KAAK;YACjC,sBAAsB,EAAE,IAAI;SAC7B,CAAC;IACJ,CAAC;IACD,MAAM,sBAAsB,GAAG,kCAAkC,CAC/D,aAAa,EACb,iBAAiB,CAAC,MAAM,CACzB,CAAC;IACF,MAAM,oBAAoB,GACxB,sBAAsB;QACtB,yBAAyB,CACvB,aAAa,EAAE,aAAa,EAC5B,iBAAiB,CAAC,MAAM,CAAC,aAAa,CACvC;QACD,OAAO,CAAC,aAAa,EAAE,gCAAgC,CAAC;YACtD,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,gCAAgC,CAAC;QACpE,kCAAkC,CAChC,aAAa,EAAE,gBAAgB,EAC/B,iBAAiB,CAAC,gBAAgB,CACnC,CAAC;IACJ,MAAM,mBAAmB,GACvB,oBAAoB;QACpB,yBAAyB,CACvB,aAAa,EAAE,eAAe,EAC9B,iBAAiB,CAAC,MAAM,CAAC,eAAe,CACzC;QACD,yBAAyB,CACvB,aAAa,EAAE,kBAAkB,EACjC,iBAAiB,CAAC,MAAM,CAAC,kBAAkB,CAC5C,CAAC;IACJ,OAAO;QACL,sBAAsB,EAAE,oBAAoB,IAAI,CAAC,mBAAmB;QACpE,0BAA0B,EAAE,CAAC,oBAAoB;QACjD,sBAAsB;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,KAAyC,EACzC,OAAgB,EAChB,KAAsC;IAEtC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,kBAAkB,GAAG,MAAM,uCAAuC,CAAC;QACvE,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE;QACvC,OAAO;QACP,WAAW;KACZ,CAAC,CAAC;IACH,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,OAAO;YACL,kBAAkB,EAAE,IAAI;YACxB,0BAA0B,EAAE,IAAI;YAChC,sBAAsB,EAAE,KAAK;SAC9B,CAAC;IACJ,CAAC;IACD,IACE,kCAAkC,CAAC;QACjC,kBAAkB;QAClB,aAAa,EAAE,KAAK;KACrB,CAAC,EACF,CAAC;QACD,MAAM,iCAAiC,CAAC;YACtC,aAAa,EAAE,kBAAkB,CAAC,MAAM;YACxC,aAAa;SACd,CAAC,CAAC;QACH,OAAO;YACL,kBAAkB;YAClB,0BAA0B,EAAE,IAAI;YAChC,sBAAsB,EAAE,KAAK;SAC9B,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC;IAChD,MAAM,qBAAqB,GAAG,aAAa;QACzC,CAAC,CAAC;YACE,GAAG,aAAa;YAChB,gBAAgB,EAAE,aAAa,CAAC,gBAAgB,IAAI,IAAI;YACxD,MAAM,EAAE,aAAa;SACtB;QACH,CAAC,CAAC,aAAa,CAAC;IAClB,MAAM,8BAA8B,GAClC,aAAa,KAAK,IAAI;QACtB,kCAAkC,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1E,MAAM,EACJ,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,GACvB,GAAG,8BAA8B,CAAC,KAAK,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;IAE3E,IACE,KAAK,CAAC,iBAAiB,KAAK,SAAS;QACrC,CAAC,8BAA8B,EAC/B,CAAC;QACD,MAAM,iCAAiC,CAAC;YACtC,aAAa,EAAE,kBAAkB,CAAC,MAAM;YACxC,aAAa;SACd,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO;gBACL,kBAAkB;gBAClB,0BAA0B,EAAE,IAAI;gBAChC,sBAAsB,EAAE,KAAK;aAC9B,CAAC;QACJ,CAAC;QACD,OAAO,mCAAmC,CAAC;YACzC,kBAAkB;YAClB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC5C,aAAa;YACb,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IACD,MAAM,aAAa,GAAG,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9D,MAAM,eAAe,GAAG,8BAA8B,CACpD,qBAAqB,EACrB,aAAa,CACd,CAAC;IACF,IACE,sBAAsB;QACtB,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS,IAAI,sBAAsB,CAAC,EACjE,CAAC;QACD,8BAA8B,CAAC;YAC7B,aAAa;YACb,aAAa;YACb,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,aAAa;QACb,iBAAiB,EAAE,kBAAkB,CAAC,SAAS;QAC/C,qBAAqB;QACrB,aAAa;QACb,kBAAkB,EAAE,KAAK,CAAC,WAAW;QACrC,0BAA0B;QAC1B,eAAe;QACf,sBAAsB;KACvB,CAAC;AACJ,CAAC","sourcesContent":["import { base64ToBytes } from \"@tearleads/encoding\";\nimport {\n encodeVersionVector,\n exportUpdatesSince,\n importUpdates,\n} from \"@tearleads/loro\";\nimport { documentSyncPullContinuationsEqual } from \"../../../data/documents/shared/sync/syncPagination\";\nimport { canWriteEffectiveAccessLevel } from \"../../../data/keying/accessLevel\";\nimport type { ContainerContentsPersistence } from \"../../../data/persistence/container-contents/containerContentsPersistence\";\nimport type { ExecSql } from \"../../../data/sqlite/sqlSchema\";\nimport type { ContainerDocumentRecord as DocumentRecord } from \"../containerPersistence\";\nimport {\n getDefaultContainerName,\n readContainerMetadataValue,\n writeContainerMetadataValue,\n} from \"./containerMetadataDocument\";\nimport {\n type ExpectedContainerMetadataSyncState,\n metadataSyncSecurityContextMatches,\n replaceSupersededMetadataIdentity,\n sameNullableMetadataValue,\n} from \"./metadataSyncSettlement\";\nimport type {\n ContainerMetadataPatch,\n ContainerMetadataState,\n} from \"./metadataTypes\";\n\nexport interface PersistContainerMetadataStateInput {\n acceptedPendingUpdateIds?: readonly string[] | undefined;\n clearSyncFailure?: boolean | undefined;\n execSql: ExecSql;\n expectedSyncState?: ExpectedContainerMetadataSyncState | undefined;\n localMetadataPatch?:\n | Partial<Pick<ContainerMetadataPatch, \"icon\" | \"name\">>\n | undefined;\n localUpdate?: Uint8Array | undefined;\n metadataState: ContainerMetadataState;\n createIntentSettlement?: Parameters<\n ContainerContentsPersistence[\"commitMetadataMutation\"]\n >[1][\"createIntentSettlement\"];\n moveIntentSettlement?: Parameters<\n ContainerContentsPersistence[\"commitMetadataMutation\"]\n >[1][\"moveIntentSettlement\"];\n patch?: Partial<ContainerMetadataPatch> | undefined;\n persistence: ContainerContentsPersistence;\n preserveDurableStructureWhenPending?: boolean | undefined;\n saveOptions?:\n | Parameters<ContainerContentsPersistence[\"saveContainer\"]>[3]\n | undefined;\n stillCurrent?: (() => boolean) | undefined;\n}\n\nexport function currentMetadataPullContinuation(\n metadataState: ContainerMetadataState,\n) {\n return Object.hasOwn(metadataState, \"pullContinuation\")\n ? (metadataState.pullContinuation ?? null)\n : (metadataState.record.pullContinuation ?? null);\n}\n\nexport function resolveMetadataSecurityContext(\n metadataState: ContainerMetadataState,\n patch: Partial<ContainerMetadataPatch>,\n) {\n const currentDocumentId = metadataState.record.documentId ?? null;\n const documentId =\n patch.documentId !== undefined ? patch.documentId : currentDocumentId;\n const accessEpoch = patch.accessEpoch ?? metadataState.record.accessEpoch;\n const documentIdChanged = documentId !== currentDocumentId;\n\n return {\n accessEpoch,\n changed:\n documentIdChanged || accessEpoch !== metadataState.record.accessEpoch,\n documentId,\n documentIdChanged,\n };\n}\n\nfunction mergeDurableMetadataCheckpoint(input: {\n durableRecord: DocumentRecord | null;\n metadataState: ContainerMetadataState;\n securityContext: ReturnType<typeof resolveMetadataSecurityContext>;\n}): void {\n const { durableRecord, metadataState, securityContext } = input;\n if (\n !durableRecord?.metadataUpdates ||\n durableRecord.documentId !== metadataState.record.documentId ||\n durableRecord.documentId !== securityContext.documentId ||\n durableRecord.accessEpoch !== metadataState.record.accessEpoch ||\n durableRecord.accessEpoch !== securityContext.accessEpoch\n ) {\n return;\n }\n\n importUpdates(metadataState.doc, [\n base64ToBytes(durableRecord.metadataUpdates),\n ]);\n}\n\nexport async function loadAuthoritativeContainerMetadataState(input: {\n containerId: string;\n execSql: ExecSql;\n persistence: ContainerContentsPersistence;\n}) {\n const stored = await input.persistence.loadContainerMetadataState(\n input.execSql,\n input.containerId,\n );\n return stored?.record\n ? { container: stored.container, record: stored.record }\n : null;\n}\n\nfunction localMetadataWriteAccessWasRevoked(input: {\n authoritativeState: NonNullable<\n Awaited<ReturnType<typeof loadAuthoritativeContainerMetadataState>>\n >;\n mutationInput: PersistContainerMetadataStateInput;\n}): boolean {\n return (\n input.mutationInput.expectedSyncState === undefined &&\n input.mutationInput.localUpdate !== undefined &&\n canWriteEffectiveAccessLevel(\n input.mutationInput.metadataState.container.effectiveAccessLevel,\n ) &&\n !canWriteEffectiveAccessLevel(\n input.authoritativeState.container.effectiveAccessLevel,\n )\n );\n}\n\nasync function prepareRebasedLocalMetadataMutation(input: {\n authoritativeState: NonNullable<\n Awaited<ReturnType<typeof loadAuthoritativeContainerMetadataState>>\n >;\n metadataState: ContainerMetadataState;\n localMetadataPatch:\n | Partial<Pick<ContainerMetadataPatch, \"icon\" | \"name\">>\n | undefined;\n patch: Partial<ContainerMetadataPatch>;\n}) {\n const { authoritativeState, metadataState, patch } = input;\n const replacementVersion = encodeVersionVector(metadataState.doc);\n const replacementMetadata = readContainerMetadataValue(\n metadataState.doc,\n getDefaultContainerName(authoritativeState.container.parentId),\n );\n writeContainerMetadataValue(metadataState.doc, {\n ...replacementMetadata,\n ...input.localMetadataPatch,\n });\n const rebasedMetadataState = {\n ...metadataState,\n container: authoritativeState.container,\n pullContinuation: authoritativeState.record.pullContinuation ?? null,\n record: authoritativeState.record,\n };\n return {\n durableRecord: authoritativeState.record,\n mutationContainer: authoritativeState.container,\n mutationMetadataState: rebasedMetadataState,\n mutationPatch: patch,\n pendingLocalUpdate: exportUpdatesSince(\n metadataState.doc,\n replacementVersion,\n ),\n pullContinuationSuperseded: false,\n securityContext: resolveMetadataSecurityContext(\n rebasedMetadataState,\n patch,\n ),\n securityContextMatches: true,\n };\n}\n\nfunction resolveMetadataSettlementMatch(\n expectedSyncState: ExpectedContainerMetadataSyncState | undefined,\n durableRecord: DocumentRecord | null,\n) {\n if (!expectedSyncState) {\n return {\n contentStateSuperseded: false,\n pullContinuationSuperseded: false,\n securityContextMatches: true,\n };\n }\n const securityContextMatches = metadataSyncSecurityContextMatches(\n durableRecord,\n expectedSyncState.record,\n );\n const progressStateMatches =\n securityContextMatches &&\n sameNullableMetadataValue(\n durableRecord?.lastCommitLsn,\n expectedSyncState.record.lastCommitLsn,\n ) &&\n Boolean(durableRecord?.pullContinuationRecoveryRequired) ===\n Boolean(expectedSyncState.record.pullContinuationRecoveryRequired) &&\n documentSyncPullContinuationsEqual(\n durableRecord?.pullContinuation,\n expectedSyncState.pullContinuation,\n );\n const contentStateMatches =\n progressStateMatches &&\n sameNullableMetadataValue(\n durableRecord?.metadataUpdates,\n expectedSyncState.record.metadataUpdates,\n ) &&\n sameNullableMetadataValue(\n durableRecord?.snapshotEndVersion,\n expectedSyncState.record.snapshotEndVersion,\n );\n return {\n contentStateSuperseded: progressStateMatches && !contentStateMatches,\n pullContinuationSuperseded: !progressStateMatches,\n securityContextMatches,\n };\n}\n\nexport async function prepareContainerMetadataMutation(\n input: PersistContainerMetadataStateInput,\n execSql: ExecSql,\n patch: Partial<ContainerMetadataPatch>,\n) {\n const { metadataState, persistence } = input;\n const authoritativeState = await loadAuthoritativeContainerMetadataState({\n containerId: metadataState.container.id,\n execSql,\n persistence,\n });\n if (!authoritativeState) {\n return {\n authoritativeState: null,\n pullContinuationSuperseded: true,\n securityContextMatches: false,\n };\n }\n if (\n localMetadataWriteAccessWasRevoked({\n authoritativeState,\n mutationInput: input,\n })\n ) {\n await replaceSupersededMetadataIdentity({\n durableRecord: authoritativeState.record,\n metadataState,\n });\n return {\n authoritativeState,\n pullContinuationSuperseded: true,\n securityContextMatches: false,\n };\n }\n const durableRecord = authoritativeState.record;\n const mutationMetadataState = durableRecord\n ? {\n ...metadataState,\n pullContinuation: durableRecord.pullContinuation ?? null,\n record: durableRecord,\n }\n : metadataState;\n const capturedSecurityContextMatches =\n durableRecord !== null &&\n metadataSyncSecurityContextMatches(durableRecord, metadataState.record);\n const {\n contentStateSuperseded,\n pullContinuationSuperseded,\n securityContextMatches,\n } = resolveMetadataSettlementMatch(input.expectedSyncState, durableRecord);\n\n if (\n input.expectedSyncState === undefined &&\n !capturedSecurityContextMatches\n ) {\n await replaceSupersededMetadataIdentity({\n durableRecord: authoritativeState.record,\n metadataState,\n });\n if (input.localUpdate === undefined) {\n return {\n authoritativeState,\n pullContinuationSuperseded: true,\n securityContextMatches: false,\n };\n }\n return prepareRebasedLocalMetadataMutation({\n authoritativeState,\n localMetadataPatch: input.localMetadataPatch,\n metadataState,\n patch,\n });\n }\n const mutationPatch = pullContinuationSuperseded ? {} : patch;\n const securityContext = resolveMetadataSecurityContext(\n mutationMetadataState,\n mutationPatch,\n );\n if (\n securityContextMatches &&\n (input.expectedSyncState === undefined || contentStateSuperseded)\n ) {\n mergeDurableMetadataCheckpoint({\n durableRecord,\n metadataState,\n securityContext,\n });\n }\n return {\n durableRecord,\n mutationContainer: authoritativeState.container,\n mutationMetadataState,\n mutationPatch,\n pendingLocalUpdate: input.localUpdate,\n pullContinuationSuperseded,\n securityContext,\n securityContextMatches,\n };\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { encodeVersionVector, exportUpdatesSince } from "../../../internal/loro/index.js";
|
|
2
|
-
import { getDefaultContainerName, readContainerMetadataValue, writeContainerMetadataValue, } from "../../../data/containers/containerMetadataDocument.js";
|
|
3
2
|
import { createPendingUpdateFields } from "../../../data/documents/documentSync.js";
|
|
4
3
|
import { runSerializedSqlMutation, } from "../../../data/sqlite/sqlSchema.js";
|
|
4
|
+
import { getDefaultContainerName, readContainerMetadataValue, writeContainerMetadataValue, } from "./containerMetadataDocument.js";
|
|
5
5
|
import { currentMetadataPullContinuation, loadAuthoritativeContainerMetadataState, prepareContainerMetadataMutation, } from "./metadataMutationPreparation.js";
|
|
6
6
|
import { buildContainerMetadataRecord, resolveContainerSystemSlot, resolveMetadataDocumentId, } from "./metadataRecord.js";
|
|
7
7
|
import { installContainerMetadataRecord } from "./metadataStateInstallation.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadataPersistence.js","sourceRoot":"","sources":["metadataPersistence.ts"],"names":[],"mappings":"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","sourcesContent":["import { encodeVersionVector, exportUpdatesSince } from \"@tearleads/loro\";\nimport {\n getDefaultContainerName,\n readContainerMetadataValue,\n writeContainerMetadataValue,\n} from \"../../../data/containers/containerMetadataDocument\";\nimport { createPendingUpdateFields } from \"../../../data/documents/documentSync\";\nimport type { ContainerContentsPersistence } from \"../../../data/persistence/container-contents/containerContentsPersistence\";\nimport type { ContainerRecord } from \"../../../data/persistence/containers/containerPersistence\";\nimport {\n type ExecSql,\n runSerializedSqlMutation,\n} from \"../../../data/sqlite/sqlSchema\";\nimport type { ContainerDocumentRecord as DocumentRecord } from \"../containerPersistence\";\nimport type { ContainerContentsWorkflowSqlRuntime } from \"../runtime\";\nimport {\n currentMetadataPullContinuation,\n loadAuthoritativeContainerMetadataState,\n type PersistContainerMetadataStateInput,\n prepareContainerMetadataMutation,\n} from \"./metadataMutationPreparation\";\nimport {\n buildContainerMetadataRecord,\n resolveContainerSystemSlot,\n resolveMetadataDocumentId,\n} from \"./metadataRecord\";\nimport { installContainerMetadataRecord } from \"./metadataStateInstallation\";\nimport {\n type ExpectedContainerMetadataSyncState,\n metadataSyncSecurityContextMatches,\n replaceSupersededMetadataIdentity,\n} from \"./metadataSyncSettlement\";\nimport type {\n ContainerMetadataPatch,\n ContainerMetadataState,\n PersistedContainerMetadataState,\n} from \"./metadataTypes\";\n\ntype ContainerMetadataPersistenceRuntime = ContainerContentsWorkflowSqlRuntime;\nconst MAX_METADATA_MUTATION_COMMIT_ATTEMPTS = 8;\ntype SaveContainerOptions = Parameters<\n ContainerContentsPersistence[\"saveContainer\"]\n>[3];\n\nexport { hasCurrentContainerMetadataReadState } from \"./metadataReadState\";\nexport { installContainerMetadataRecord } from \"./metadataStateInstallation\";\nexport { currentMetadataPullContinuation };\n\nfunction invalidateMetadataWriterProjection(\n metadataState: ContainerMetadataState,\n securityContextChanged: boolean,\n): void {\n if (securityContextChanged) {\n metadataState.metadataWriterProjection = null;\n }\n}\ntype PreparedContainerMetadataMutation = Awaited<\n ReturnType<typeof prepareContainerMetadataMutation>\n>;\ntype ApplicableContainerMetadataMutation = Exclude<\n PreparedContainerMetadataMutation,\n { authoritativeState: unknown }\n>;\nasync function settleSupersededMetadataMutation(input: {\n acceptedPendingUpdateIds?: readonly string[] | undefined;\n execSql: ExecSql;\n expectedRecord?: DocumentRecord | undefined;\n metadataState: ContainerMetadataState;\n persistence: ContainerContentsPersistence;\n prepared: PreparedContainerMetadataMutation;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<PersistedContainerMetadataState | null> {\n const { metadataState, persistence, prepared } = input;\n const settledState = input.expectedRecord\n ? await persistence.settleAcceptedMetadataPendingUpdates(input.execSql, {\n containerId: metadataState.container.id,\n expectedRecord: input.expectedRecord,\n pendingUpdateIds: input.acceptedPendingUpdateIds ?? [],\n stillCurrent: input.stillCurrent,\n })\n : undefined;\n if (\"authoritativeState\" in prepared) {\n const authoritativeState = settledState ?? prepared.authoritativeState;\n if (!authoritativeState?.record) return null;\n metadataState.container = authoritativeState.container;\n installContainerMetadataRecord(metadataState, authoritativeState.record);\n return {\n container: authoritativeState.container,\n pullContinuationSuperseded: true,\n record: authoritativeState.record,\n syncIdentitySuperseded: true,\n };\n }\n const authoritativeState =\n settledState ??\n (await loadAuthoritativeContainerMetadataState({\n containerId: metadataState.container.id,\n execSql: input.execSql,\n persistence,\n }));\n if (!authoritativeState?.record) return null;\n // The rejected response may already have mutated the live Loro document.\n // Rebuild from the authoritative durable snapshot instead of merging into\n // that losing document, which would retain non-overlapping rejected fields.\n await replaceSupersededMetadataIdentity({\n durableRecord: authoritativeState.record,\n metadataState,\n });\n metadataState.container = authoritativeState.container;\n installContainerMetadataRecord(metadataState, authoritativeState.record);\n return {\n container: authoritativeState.container,\n pullContinuationSuperseded: true,\n record: authoritativeState.record,\n ...(!prepared.securityContextMatches\n ? { syncIdentitySuperseded: true as const }\n : {}),\n };\n}\nasync function persistPreparedMetadataMutation(input: {\n clearSyncFailure?: boolean | undefined;\n createIntentSettlement?: Parameters<\n ContainerContentsPersistence[\"commitMetadataMutation\"]\n >[1][\"createIntentSettlement\"];\n execSql: ExecSql;\n metadataState: ContainerMetadataState;\n moveIntentSettlement?: Parameters<\n ContainerContentsPersistence[\"commitMetadataMutation\"]\n >[1][\"moveIntentSettlement\"];\n persistence: ContainerContentsPersistence;\n prepared: ApplicableContainerMetadataMutation;\n acceptedPendingUpdateIds?: readonly string[] | undefined;\n preserveDurableStructureWhenPending?: boolean | undefined;\n saveOptions?: SaveContainerOptions;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<\n | PersistedContainerMetadataState\n | {\n conflict: true;\n currentState: Awaited<\n ReturnType<ContainerContentsPersistence[\"loadContainerMetadataState\"]>\n >;\n staleServerState?: true;\n }\n> {\n const { metadataState, persistence, prepared } = input;\n const metadata = readContainerMetadataValue(\n metadataState.doc,\n getDefaultContainerName(prepared.mutationContainer.parentId),\n );\n const nextContainer: ContainerRecord = {\n ...prepared.mutationContainer,\n ...(prepared.mutationPatch.effectiveAccessLevel !== undefined\n ? {\n effectiveAccessLevel: prepared.mutationPatch.effectiveAccessLevel,\n }\n : {}),\n organizationId:\n prepared.mutationPatch.organizationId ??\n prepared.mutationContainer.organizationId,\n parentId:\n prepared.mutationPatch.parentId ?? prepared.mutationContainer.parentId,\n metadataDocumentId: resolveMetadataDocumentId(\n prepared.mutationPatch,\n prepared.mutationContainer,\n ),\n systemSlot: resolveContainerSystemSlot(\n prepared.mutationPatch,\n prepared.mutationContainer,\n ),\n name: prepared.mutationPatch.name ?? metadata.name,\n icon:\n prepared.mutationPatch.icon !== undefined\n ? prepared.mutationPatch.icon\n : metadata.icon,\n };\n const nextRecord = buildContainerMetadataRecord({\n metadataState: prepared.mutationMetadataState,\n patch: prepared.mutationPatch,\n securityContext: prepared.securityContext,\n });\n const pendingUpdate = prepared.pendingLocalUpdate\n ? (createPendingUpdateFields(prepared.pendingLocalUpdate) ?? undefined)\n : undefined;\n const committed = await persistence.commitMetadataMutation(input.execSql, {\n acceptedPendingUpdateIds: input.acceptedPendingUpdateIds ?? [],\n clearSyncFailure: input.clearSyncFailure,\n container: nextContainer,\n createIntentSettlement: input.createIntentSettlement,\n expectedContainer: prepared.mutationContainer,\n expectedRecord: prepared.durableRecord,\n moveIntentSettlement: input.moveIntentSettlement,\n pendingUpdate,\n preserveDurableStructureWhenPending:\n input.preserveDurableStructureWhenPending,\n record: nextRecord,\n saveOptions: input.saveOptions,\n settleAcceptedPendingOnConflict:\n input.acceptedPendingUpdateIds !== undefined,\n stillCurrent: input.stillCurrent,\n });\n if (!committed.committed) {\n return {\n conflict: true,\n currentState: committed.currentState,\n ...(committed.staleServerState\n ? { staleServerState: true as const }\n : {}),\n };\n }\n invalidateMetadataWriterProjection(\n metadataState,\n prepared.securityContext.changed,\n );\n return {\n container: committed.container,\n record: nextRecord,\n ...(committed.createIntentSettled\n ? { createIntentSettled: true as const }\n : {}),\n ...(committed.moveIntentSettled\n ? { moveIntentSettled: true as const }\n : {}),\n };\n}\nasync function adoptMetadataCommitConflict(input: {\n currentState: Awaited<\n ReturnType<ContainerContentsPersistence[\"loadContainerMetadataState\"]>\n >;\n expectedRecord: DocumentRecord;\n expectedSyncState?: ExpectedContainerMetadataSyncState | undefined;\n metadataState: ContainerMetadataState;\n staleServerState?: true | undefined;\n}): Promise<PersistedContainerMetadataState | null | \"retry\"> {\n if (!input.staleServerState && input.expectedSyncState === undefined) {\n return \"retry\";\n }\n if (!input.currentState?.record) return null;\n await replaceSupersededMetadataIdentity({\n durableRecord: input.currentState.record,\n metadataState: input.metadataState,\n });\n input.metadataState.container = input.currentState.container;\n installContainerMetadataRecord(\n input.metadataState,\n input.currentState.record,\n );\n return {\n container: input.currentState.container,\n pullContinuationSuperseded: true,\n record: input.currentState.record,\n ...(input.staleServerState ? { mutationSuperseded: true as const } : {}),\n ...(!metadataSyncSecurityContextMatches(\n input.currentState.record,\n input.expectedSyncState?.record ?? input.expectedRecord,\n )\n ? { syncIdentitySuperseded: true as const }\n : {}),\n };\n}\nasync function persistContainerMetadataState(\n input: PersistContainerMetadataStateInput,\n): Promise<PersistedContainerMetadataState | null> {\n const patch = input.patch ?? {};\n const prepareMutation = prepareContainerMetadataMutation;\n return runSerializedSqlMutation(input.execSql, async (lockedExecSql) => {\n for (\n let attempt = 0;\n attempt < MAX_METADATA_MUTATION_COMMIT_ATTEMPTS;\n attempt += 1\n ) {\n const prepared = await prepareMutation(input, lockedExecSql, patch);\n if (input.stillCurrent?.() === false) return null;\n if (\n \"authoritativeState\" in prepared ||\n prepared.pullContinuationSuperseded\n ) {\n return settleSupersededMetadataMutation({\n acceptedPendingUpdateIds: input.acceptedPendingUpdateIds,\n execSql: lockedExecSql,\n expectedRecord: input.expectedSyncState?.record,\n metadataState: input.metadataState,\n persistence: input.persistence,\n prepared,\n stillCurrent: input.stillCurrent,\n });\n }\n const persisted = await persistPreparedMetadataMutation({\n acceptedPendingUpdateIds: input.acceptedPendingUpdateIds,\n clearSyncFailure: input.clearSyncFailure,\n createIntentSettlement: input.createIntentSettlement,\n execSql: lockedExecSql,\n metadataState: input.metadataState,\n moveIntentSettlement: input.moveIntentSettlement,\n persistence: input.persistence,\n prepared,\n preserveDurableStructureWhenPending:\n input.preserveDurableStructureWhenPending,\n saveOptions: input.saveOptions,\n stillCurrent: input.stillCurrent,\n });\n if (input.stillCurrent?.() === false) return null;\n if (!(\"conflict\" in persisted)) return persisted;\n const conflict = await adoptMetadataCommitConflict({\n currentState: persisted.currentState,\n expectedRecord: prepared.durableRecord,\n expectedSyncState: input.expectedSyncState,\n metadataState: input.metadataState,\n staleServerState: persisted.staleServerState,\n });\n if (conflict !== \"retry\") return conflict;\n }\n throw new Error(\n `Container metadata mutation commit gave up after ${MAX_METADATA_MUTATION_COMMIT_ATTEMPTS} concurrent conflicts`,\n );\n });\n}\ntype PersistContainerMetadataStateRuntimeInput = Omit<\n PersistContainerMetadataStateInput,\n \"execSql\"\n> & {\n onDurableStateNeedsReload?: (() => void) | undefined;\n persistence: ContainerContentsPersistence;\n runtime: ContainerMetadataPersistenceRuntime;\n};\n\nexport function persistContainerMetadataStateFromRuntime(\n input: PersistContainerMetadataStateRuntimeInput & {\n expectedSyncState: ExpectedContainerMetadataSyncState;\n },\n): Promise<PersistedContainerMetadataState | null>;\nexport function persistContainerMetadataStateFromRuntime(\n input: PersistContainerMetadataStateRuntimeInput & {\n expectedSyncState?: undefined;\n },\n): Promise<PersistedContainerMetadataState | null>;\nexport async function persistContainerMetadataStateFromRuntime(\n input: PersistContainerMetadataStateRuntimeInput,\n): Promise<PersistedContainerMetadataState | null> {\n const { onDurableStateNeedsReload, runtime, ...persistenceInput } = input;\n const execSql = runtime.infra.execSql;\n const persisted = await persistContainerMetadataState({\n ...persistenceInput,\n execSql,\n });\n if (input.stillCurrent?.() === false) {\n onDurableStateNeedsReload?.();\n return null;\n }\n return persisted;\n}\n\nasync function writeContainerMetadataPatch(input: {\n execSql: ExecSql;\n metadataState: ContainerMetadataState;\n patch: Partial<Pick<ContainerMetadataPatch, \"icon\" | \"name\">>;\n persistence: ContainerContentsPersistence;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<PersistedContainerMetadataState | null> {\n const { execSql, metadataState, patch, persistence } = input;\n const metadata = readContainerMetadataValue(\n metadataState.doc,\n getDefaultContainerName(metadataState.container.parentId),\n );\n const previousVersion = encodeVersionVector(metadataState.doc);\n writeContainerMetadataValue(metadataState.doc, { ...metadata, ...patch });\n const update = exportUpdatesSince(metadataState.doc, previousVersion);\n\n return persistContainerMetadataState({\n execSql,\n localMetadataPatch: patch,\n localUpdate: update,\n metadataState,\n patch,\n persistence,\n stillCurrent: input.stillCurrent,\n });\n}\n\nexport async function renameContainerMetadataStateFromRuntime(input: {\n metadataState: ContainerMetadataState;\n name: string;\n persistence: ContainerContentsPersistence;\n runtime: ContainerMetadataPersistenceRuntime;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<PersistedContainerMetadataState | null> {\n const trimmedName = input.name.trim();\n if (!trimmedName) {\n return null;\n }\n\n return writeContainerMetadataPatch({\n execSql: input.runtime.infra.execSql,\n metadataState: input.metadataState,\n patch: { name: trimmedName },\n persistence: input.persistence,\n stillCurrent: input.stillCurrent,\n });\n}\n\nexport async function setContainerIconMetadataStateFromRuntime(input: {\n icon: string | null;\n metadataState: ContainerMetadataState;\n persistence: ContainerContentsPersistence;\n runtime: ContainerMetadataPersistenceRuntime;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<PersistedContainerMetadataState | null> {\n return writeContainerMetadataPatch({\n execSql: input.runtime.infra.execSql,\n metadataState: input.metadataState,\n patch: { icon: input.icon?.trim() || null },\n persistence: input.persistence,\n stillCurrent: input.stillCurrent,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"metadataPersistence.js","sourceRoot":"","sources":["metadataPersistence.ts"],"names":[],"mappings":"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","sourcesContent":["import { encodeVersionVector, exportUpdatesSince } from \"@tearleads/loro\";\nimport { createPendingUpdateFields } from \"../../../data/documents/documentSync\";\nimport type { ContainerContentsPersistence } from \"../../../data/persistence/container-contents/containerContentsPersistence\";\nimport type { ContainerRecord } from \"../../../data/persistence/container-contents/containerPersistence\";\nimport {\n type ExecSql,\n runSerializedSqlMutation,\n} from \"../../../data/sqlite/sqlSchema\";\nimport type { ContainerDocumentRecord as DocumentRecord } from \"../containerPersistence\";\nimport type { ContainerContentsWorkflowSqlRuntime } from \"../runtime\";\nimport {\n getDefaultContainerName,\n readContainerMetadataValue,\n writeContainerMetadataValue,\n} from \"./containerMetadataDocument\";\nimport {\n currentMetadataPullContinuation,\n loadAuthoritativeContainerMetadataState,\n type PersistContainerMetadataStateInput,\n prepareContainerMetadataMutation,\n} from \"./metadataMutationPreparation\";\nimport {\n buildContainerMetadataRecord,\n resolveContainerSystemSlot,\n resolveMetadataDocumentId,\n} from \"./metadataRecord\";\nimport { installContainerMetadataRecord } from \"./metadataStateInstallation\";\nimport {\n type ExpectedContainerMetadataSyncState,\n metadataSyncSecurityContextMatches,\n replaceSupersededMetadataIdentity,\n} from \"./metadataSyncSettlement\";\nimport type {\n ContainerMetadataPatch,\n ContainerMetadataState,\n PersistedContainerMetadataState,\n} from \"./metadataTypes\";\n\ntype ContainerMetadataPersistenceRuntime = ContainerContentsWorkflowSqlRuntime;\nconst MAX_METADATA_MUTATION_COMMIT_ATTEMPTS = 8;\ntype SaveContainerOptions = Parameters<\n ContainerContentsPersistence[\"saveContainer\"]\n>[3];\n\nexport { hasCurrentContainerMetadataReadState } from \"./metadataReadState\";\nexport { installContainerMetadataRecord } from \"./metadataStateInstallation\";\nexport { currentMetadataPullContinuation };\n\nfunction invalidateMetadataWriterProjection(\n metadataState: ContainerMetadataState,\n securityContextChanged: boolean,\n): void {\n if (securityContextChanged) {\n metadataState.metadataWriterProjection = null;\n }\n}\ntype PreparedContainerMetadataMutation = Awaited<\n ReturnType<typeof prepareContainerMetadataMutation>\n>;\ntype ApplicableContainerMetadataMutation = Exclude<\n PreparedContainerMetadataMutation,\n { authoritativeState: unknown }\n>;\nasync function settleSupersededMetadataMutation(input: {\n acceptedPendingUpdateIds?: readonly string[] | undefined;\n execSql: ExecSql;\n expectedRecord?: DocumentRecord | undefined;\n metadataState: ContainerMetadataState;\n persistence: ContainerContentsPersistence;\n prepared: PreparedContainerMetadataMutation;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<PersistedContainerMetadataState | null> {\n const { metadataState, persistence, prepared } = input;\n const settledState = input.expectedRecord\n ? await persistence.settleAcceptedMetadataPendingUpdates(input.execSql, {\n containerId: metadataState.container.id,\n expectedRecord: input.expectedRecord,\n pendingUpdateIds: input.acceptedPendingUpdateIds ?? [],\n stillCurrent: input.stillCurrent,\n })\n : undefined;\n if (\"authoritativeState\" in prepared) {\n const authoritativeState = settledState ?? prepared.authoritativeState;\n if (!authoritativeState?.record) return null;\n metadataState.container = authoritativeState.container;\n installContainerMetadataRecord(metadataState, authoritativeState.record);\n return {\n container: authoritativeState.container,\n pullContinuationSuperseded: true,\n record: authoritativeState.record,\n syncIdentitySuperseded: true,\n };\n }\n const authoritativeState =\n settledState ??\n (await loadAuthoritativeContainerMetadataState({\n containerId: metadataState.container.id,\n execSql: input.execSql,\n persistence,\n }));\n if (!authoritativeState?.record) return null;\n // The rejected response may already have mutated the live Loro document.\n // Rebuild from the authoritative durable snapshot instead of merging into\n // that losing document, which would retain non-overlapping rejected fields.\n await replaceSupersededMetadataIdentity({\n durableRecord: authoritativeState.record,\n metadataState,\n });\n metadataState.container = authoritativeState.container;\n installContainerMetadataRecord(metadataState, authoritativeState.record);\n return {\n container: authoritativeState.container,\n pullContinuationSuperseded: true,\n record: authoritativeState.record,\n ...(!prepared.securityContextMatches\n ? { syncIdentitySuperseded: true as const }\n : {}),\n };\n}\nasync function persistPreparedMetadataMutation(input: {\n clearSyncFailure?: boolean | undefined;\n createIntentSettlement?: Parameters<\n ContainerContentsPersistence[\"commitMetadataMutation\"]\n >[1][\"createIntentSettlement\"];\n execSql: ExecSql;\n metadataState: ContainerMetadataState;\n moveIntentSettlement?: Parameters<\n ContainerContentsPersistence[\"commitMetadataMutation\"]\n >[1][\"moveIntentSettlement\"];\n persistence: ContainerContentsPersistence;\n prepared: ApplicableContainerMetadataMutation;\n acceptedPendingUpdateIds?: readonly string[] | undefined;\n preserveDurableStructureWhenPending?: boolean | undefined;\n saveOptions?: SaveContainerOptions;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<\n | PersistedContainerMetadataState\n | {\n conflict: true;\n currentState: Awaited<\n ReturnType<ContainerContentsPersistence[\"loadContainerMetadataState\"]>\n >;\n staleServerState?: true;\n }\n> {\n const { metadataState, persistence, prepared } = input;\n const metadata = readContainerMetadataValue(\n metadataState.doc,\n getDefaultContainerName(prepared.mutationContainer.parentId),\n );\n const nextContainer: ContainerRecord = {\n ...prepared.mutationContainer,\n ...(prepared.mutationPatch.effectiveAccessLevel !== undefined\n ? {\n effectiveAccessLevel: prepared.mutationPatch.effectiveAccessLevel,\n }\n : {}),\n organizationId:\n prepared.mutationPatch.organizationId ??\n prepared.mutationContainer.organizationId,\n parentId:\n prepared.mutationPatch.parentId ?? prepared.mutationContainer.parentId,\n metadataDocumentId: resolveMetadataDocumentId(\n prepared.mutationPatch,\n prepared.mutationContainer,\n ),\n systemSlot: resolveContainerSystemSlot(\n prepared.mutationPatch,\n prepared.mutationContainer,\n ),\n name: prepared.mutationPatch.name ?? metadata.name,\n icon:\n prepared.mutationPatch.icon !== undefined\n ? prepared.mutationPatch.icon\n : metadata.icon,\n };\n const nextRecord = buildContainerMetadataRecord({\n metadataState: prepared.mutationMetadataState,\n patch: prepared.mutationPatch,\n securityContext: prepared.securityContext,\n });\n const pendingUpdate = prepared.pendingLocalUpdate\n ? (createPendingUpdateFields(prepared.pendingLocalUpdate) ?? undefined)\n : undefined;\n const committed = await persistence.commitMetadataMutation(input.execSql, {\n acceptedPendingUpdateIds: input.acceptedPendingUpdateIds ?? [],\n clearSyncFailure: input.clearSyncFailure,\n container: nextContainer,\n createIntentSettlement: input.createIntentSettlement,\n expectedContainer: prepared.mutationContainer,\n expectedRecord: prepared.durableRecord,\n moveIntentSettlement: input.moveIntentSettlement,\n pendingUpdate,\n preserveDurableStructureWhenPending:\n input.preserveDurableStructureWhenPending,\n record: nextRecord,\n saveOptions: input.saveOptions,\n settleAcceptedPendingOnConflict:\n input.acceptedPendingUpdateIds !== undefined,\n stillCurrent: input.stillCurrent,\n });\n if (!committed.committed) {\n return {\n conflict: true,\n currentState: committed.currentState,\n ...(committed.staleServerState\n ? { staleServerState: true as const }\n : {}),\n };\n }\n invalidateMetadataWriterProjection(\n metadataState,\n prepared.securityContext.changed,\n );\n return {\n container: committed.container,\n record: nextRecord,\n ...(committed.createIntentSettled\n ? { createIntentSettled: true as const }\n : {}),\n ...(committed.moveIntentSettled\n ? { moveIntentSettled: true as const }\n : {}),\n };\n}\nasync function adoptMetadataCommitConflict(input: {\n currentState: Awaited<\n ReturnType<ContainerContentsPersistence[\"loadContainerMetadataState\"]>\n >;\n expectedRecord: DocumentRecord;\n expectedSyncState?: ExpectedContainerMetadataSyncState | undefined;\n metadataState: ContainerMetadataState;\n staleServerState?: true | undefined;\n}): Promise<PersistedContainerMetadataState | null | \"retry\"> {\n if (!input.staleServerState && input.expectedSyncState === undefined) {\n return \"retry\";\n }\n if (!input.currentState?.record) return null;\n await replaceSupersededMetadataIdentity({\n durableRecord: input.currentState.record,\n metadataState: input.metadataState,\n });\n input.metadataState.container = input.currentState.container;\n installContainerMetadataRecord(\n input.metadataState,\n input.currentState.record,\n );\n return {\n container: input.currentState.container,\n pullContinuationSuperseded: true,\n record: input.currentState.record,\n ...(input.staleServerState ? { mutationSuperseded: true as const } : {}),\n ...(!metadataSyncSecurityContextMatches(\n input.currentState.record,\n input.expectedSyncState?.record ?? input.expectedRecord,\n )\n ? { syncIdentitySuperseded: true as const }\n : {}),\n };\n}\nasync function persistContainerMetadataState(\n input: PersistContainerMetadataStateInput,\n): Promise<PersistedContainerMetadataState | null> {\n const patch = input.patch ?? {};\n const prepareMutation = prepareContainerMetadataMutation;\n return runSerializedSqlMutation(input.execSql, async (lockedExecSql) => {\n for (\n let attempt = 0;\n attempt < MAX_METADATA_MUTATION_COMMIT_ATTEMPTS;\n attempt += 1\n ) {\n const prepared = await prepareMutation(input, lockedExecSql, patch);\n if (input.stillCurrent?.() === false) return null;\n if (\n \"authoritativeState\" in prepared ||\n prepared.pullContinuationSuperseded\n ) {\n return settleSupersededMetadataMutation({\n acceptedPendingUpdateIds: input.acceptedPendingUpdateIds,\n execSql: lockedExecSql,\n expectedRecord: input.expectedSyncState?.record,\n metadataState: input.metadataState,\n persistence: input.persistence,\n prepared,\n stillCurrent: input.stillCurrent,\n });\n }\n const persisted = await persistPreparedMetadataMutation({\n acceptedPendingUpdateIds: input.acceptedPendingUpdateIds,\n clearSyncFailure: input.clearSyncFailure,\n createIntentSettlement: input.createIntentSettlement,\n execSql: lockedExecSql,\n metadataState: input.metadataState,\n moveIntentSettlement: input.moveIntentSettlement,\n persistence: input.persistence,\n prepared,\n preserveDurableStructureWhenPending:\n input.preserveDurableStructureWhenPending,\n saveOptions: input.saveOptions,\n stillCurrent: input.stillCurrent,\n });\n if (input.stillCurrent?.() === false) return null;\n if (!(\"conflict\" in persisted)) return persisted;\n const conflict = await adoptMetadataCommitConflict({\n currentState: persisted.currentState,\n expectedRecord: prepared.durableRecord,\n expectedSyncState: input.expectedSyncState,\n metadataState: input.metadataState,\n staleServerState: persisted.staleServerState,\n });\n if (conflict !== \"retry\") return conflict;\n }\n throw new Error(\n `Container metadata mutation commit gave up after ${MAX_METADATA_MUTATION_COMMIT_ATTEMPTS} concurrent conflicts`,\n );\n });\n}\ntype PersistContainerMetadataStateRuntimeInput = Omit<\n PersistContainerMetadataStateInput,\n \"execSql\"\n> & {\n onDurableStateNeedsReload?: (() => void) | undefined;\n persistence: ContainerContentsPersistence;\n runtime: ContainerMetadataPersistenceRuntime;\n};\n\nexport function persistContainerMetadataStateFromRuntime(\n input: PersistContainerMetadataStateRuntimeInput & {\n expectedSyncState: ExpectedContainerMetadataSyncState;\n },\n): Promise<PersistedContainerMetadataState | null>;\nexport function persistContainerMetadataStateFromRuntime(\n input: PersistContainerMetadataStateRuntimeInput & {\n expectedSyncState?: undefined;\n },\n): Promise<PersistedContainerMetadataState | null>;\nexport async function persistContainerMetadataStateFromRuntime(\n input: PersistContainerMetadataStateRuntimeInput,\n): Promise<PersistedContainerMetadataState | null> {\n const { onDurableStateNeedsReload, runtime, ...persistenceInput } = input;\n const execSql = runtime.infra.execSql;\n const persisted = await persistContainerMetadataState({\n ...persistenceInput,\n execSql,\n });\n if (input.stillCurrent?.() === false) {\n onDurableStateNeedsReload?.();\n return null;\n }\n return persisted;\n}\n\nasync function writeContainerMetadataPatch(input: {\n execSql: ExecSql;\n metadataState: ContainerMetadataState;\n patch: Partial<Pick<ContainerMetadataPatch, \"icon\" | \"name\">>;\n persistence: ContainerContentsPersistence;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<PersistedContainerMetadataState | null> {\n const { execSql, metadataState, patch, persistence } = input;\n const metadata = readContainerMetadataValue(\n metadataState.doc,\n getDefaultContainerName(metadataState.container.parentId),\n );\n const previousVersion = encodeVersionVector(metadataState.doc);\n writeContainerMetadataValue(metadataState.doc, { ...metadata, ...patch });\n const update = exportUpdatesSince(metadataState.doc, previousVersion);\n\n return persistContainerMetadataState({\n execSql,\n localMetadataPatch: patch,\n localUpdate: update,\n metadataState,\n patch,\n persistence,\n stillCurrent: input.stillCurrent,\n });\n}\n\nexport async function renameContainerMetadataStateFromRuntime(input: {\n metadataState: ContainerMetadataState;\n name: string;\n persistence: ContainerContentsPersistence;\n runtime: ContainerMetadataPersistenceRuntime;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<PersistedContainerMetadataState | null> {\n const trimmedName = input.name.trim();\n if (!trimmedName) {\n return null;\n }\n\n return writeContainerMetadataPatch({\n execSql: input.runtime.infra.execSql,\n metadataState: input.metadataState,\n patch: { name: trimmedName },\n persistence: input.persistence,\n stillCurrent: input.stillCurrent,\n });\n}\n\nexport async function setContainerIconMetadataStateFromRuntime(input: {\n icon: string | null;\n metadataState: ContainerMetadataState;\n persistence: ContainerContentsPersistence;\n runtime: ContainerMetadataPersistenceRuntime;\n stillCurrent?: (() => boolean) | undefined;\n}): Promise<PersistedContainerMetadataState | null> {\n return writeContainerMetadataPatch({\n execSql: input.runtime.infra.execSql,\n metadataState: input.metadataState,\n patch: { icon: input.icon?.trim() || null },\n persistence: input.persistence,\n stillCurrent: input.stillCurrent,\n });\n}\n"]}
|