@tearleads/client-sdk 0.1.64 → 0.1.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (622) hide show
  1. package/client/organizations/organizationAccessRestoration.js +1 -1
  2. package/data/containers/shared/mutationAcknowledgement.js +1 -1
  3. package/data/containers/shared/mutationAcknowledgement.js.map +1 -1
  4. package/data/documents/blob/shared/projection.js +3 -3
  5. package/data/documents/blob/shared/projection.js.map +1 -1
  6. package/data/documents/shared/{containerKekCurrency.d.ts → containerKek/containerKekCurrency.d.ts} +1 -1
  7. package/data/documents/shared/{containerKekEntryVerification.js → containerKek/containerKekEntryVerification.js} +1 -1
  8. package/data/documents/shared/{containerKekLogFetch.d.ts → containerKek/containerKekLogFetch.d.ts} +1 -1
  9. package/data/documents/shared/{containerKekLogFetch.js → containerKek/containerKekLogFetch.js} +1 -1
  10. package/data/documents/shared/{containerKekPath.js → containerKek/containerKekPath.js} +3 -3
  11. package/data/documents/shared/containerKek/containerKekPath.js.map +1 -0
  12. package/data/documents/shared/{containerKekPathHistory.d.ts → containerKek/containerKekPathHistory.d.ts} +3 -3
  13. package/data/documents/shared/{containerKekPathHistory.js → containerKek/containerKekPathHistory.js} +4 -4
  14. package/data/documents/shared/containerKek/containerKekPathHistory.js.map +1 -0
  15. package/data/documents/shared/{containerKekPathVerification.d.ts → containerKek/containerKekPathVerification.d.ts} +5 -5
  16. package/data/documents/shared/{containerKekPathVerification.js → containerKek/containerKekPathVerification.js} +2 -2
  17. package/data/documents/shared/containerKek/containerKekPathVerification.js.map +1 -0
  18. package/data/documents/shared/{containerKekWrapping.js → containerKek/containerKekWrapping.js} +3 -3
  19. package/data/documents/shared/containerKek/containerKekWrapping.js.map +1 -0
  20. package/data/documents/shared/{keyringLogWalk.d.ts → containerKek/keyringLogWalk.d.ts} +2 -2
  21. package/data/documents/shared/{keyringLogWalk.js → containerKek/keyringLogWalk.js} +1 -1
  22. package/data/documents/shared/{keyringRebuild.d.ts → containerKek/keyringRebuild.d.ts} +3 -3
  23. package/data/documents/shared/{keyringRebuild.js → containerKek/keyringRebuild.js} +3 -3
  24. package/data/documents/shared/containerKek/keyringRebuild.js.map +1 -0
  25. package/data/documents/shared/crypto.js +2 -2
  26. package/data/documents/shared/crypto.js.map +1 -1
  27. package/data/documents/shared/events.js +1 -1
  28. package/data/documents/shared/{projection.d.ts → projection/index.d.ts} +7 -7
  29. package/data/documents/shared/{projection.js → projection/index.js} +9 -9
  30. package/data/documents/shared/projection/index.js.map +1 -0
  31. package/data/documents/shared/{projectionContentKeys.d.ts → projection/projectionContentKeys.d.ts} +6 -6
  32. package/data/documents/shared/{projectionContentKeys.js → projection/projectionContentKeys.js} +9 -9
  33. package/data/documents/shared/projection/projectionContentKeys.js.map +1 -0
  34. package/data/documents/shared/{projectionTargets.d.ts → projection/projectionTargets.d.ts} +4 -4
  35. package/data/documents/shared/{projectionTargets.js → projection/projectionTargets.js} +3 -3
  36. package/data/documents/shared/projection/projectionTargets.js.map +1 -0
  37. package/data/documents/shared/responses.d.ts +1 -1
  38. package/data/documents/shared/responses.js +1 -1
  39. package/data/documents/shared/responses.js.map +1 -1
  40. package/data/documents/shared/{documentSyncUpdateDecryption.js → sync/documentSyncUpdateDecryption.js} +10 -10
  41. package/data/documents/shared/sync/documentSyncUpdateDecryption.js.map +1 -0
  42. package/data/documents/shared/{documentSyncUpdateIsolation.d.ts → sync/documentSyncUpdateIsolation.d.ts} +3 -3
  43. package/data/documents/shared/{documentSyncUpdateIsolation.js → sync/documentSyncUpdateIsolation.js} +1 -1
  44. package/data/documents/shared/sync/documentSyncUpdateIsolation.js.map +1 -0
  45. package/data/documents/shared/{mutationAcknowledgement.js → sync/mutationAcknowledgement.js} +1 -1
  46. package/data/documents/shared/sync/mutationAcknowledgement.js.map +1 -0
  47. package/data/documents/shared/{pullContinuation.js → sync/pullContinuation.js} +1 -1
  48. package/data/documents/shared/{syncPagination.d.ts → sync/syncPagination.d.ts} +2 -2
  49. package/data/documents/shared/{syncPagination.js → sync/syncPagination.js} +1 -1
  50. package/data/documents/shared/sync/syncPagination.js.map +1 -0
  51. package/data/documents/shared/{syncResponseAuthorization.js → sync/syncResponseAuthorization.js} +3 -3
  52. package/data/documents/shared/sync/syncResponseAuthorization.js.map +1 -0
  53. package/data/documents/shared/{syncResponses.d.ts → sync/syncResponses.d.ts} +2 -2
  54. package/data/documents/shared/{syncResponses.js → sync/syncResponses.js} +6 -6
  55. package/data/documents/shared/sync/syncResponses.js.map +1 -0
  56. package/data/documents/shared/{syncSubmitFailure.d.ts → sync/syncSubmitFailure.d.ts} +1 -1
  57. package/data/documents/shared/types.d.ts +3 -3
  58. package/data/documents/shared/types.js.map +1 -1
  59. package/data/keyingProjectionVerification/checkpoints/accessManifestCheckpointEnforcement.js +1 -1
  60. package/data/keyingProjectionVerification/checkpoints/accessManifestCheckpointEnforcement.js.map +1 -1
  61. package/data/keyingProjectionVerification/checkpoints/checkpointContext.d.ts +1 -1
  62. package/data/keyingProjectionVerification/checkpoints/checkpointContext.js +1 -1
  63. package/data/keyingProjectionVerification/checkpoints/checkpointContext.js.map +1 -1
  64. package/data/keyingProjectionVerification/checkpoints/manifestCheckpointVerification.js +1 -1
  65. package/data/keyingProjectionVerification/checkpoints/manifestCheckpointVerification.js.map +1 -1
  66. package/data/keyingProjectionVerification/documentPurge/documentPurgeCheckpointCurrency.js +4 -4
  67. package/data/keyingProjectionVerification/documentPurge/documentPurgeCheckpointCurrency.js.map +1 -1
  68. package/data/keyingProjectionVerification/documentPurge/documentPurgeCheckpointEnforcement.js +1 -1
  69. package/data/keyingProjectionVerification/documentPurge/documentPurgeCheckpointEnforcement.js.map +1 -1
  70. package/data/keyingProjectionVerification/documentPurge/documentPurgePolicyCheckpoints.js +1 -1
  71. package/data/keyingProjectionVerification/documentPurge/documentPurgePolicyCheckpoints.js.map +1 -1
  72. package/data/keyingProjectionVerification/documentPurge/documentPurgePolicyCurrency.js +1 -1
  73. package/data/keyingProjectionVerification/documentPurge/documentPurgePolicyCurrency.js.map +1 -1
  74. package/data/keyingProjectionVerification/principalPolicy/principalPolicyCache.js +3 -3
  75. package/data/keyingProjectionVerification/principalPolicy/principalPolicyCache.js.map +1 -1
  76. package/data/keyingProjectionVerification/principalPolicy/principalPolicyVerification.js +4 -4
  77. package/data/keyingProjectionVerification/principalPolicy/principalPolicyVerification.js.map +1 -1
  78. package/data/keyingProjectionVerification/principalPolicy/resolvedPrincipalPolicy.js +2 -2
  79. package/data/keyingProjectionVerification/principalPolicy/resolvedPrincipalPolicy.js.map +1 -1
  80. package/data/persistence/container-contents/containerContentsPersistence.js +3 -3
  81. package/data/persistence/container-contents/containerContentsPersistence.js.map +1 -1
  82. package/data/persistence/container-contents/containerContentsPersistenceTypes.d.ts +2 -2
  83. package/data/persistence/container-contents/containerContentsPersistenceTypes.js.map +1 -1
  84. package/data/persistence/container-contents/containerCreateIntentSettlement.js +1 -1
  85. package/data/persistence/container-contents/containerDeletionPersistence.js +2 -2
  86. package/data/persistence/container-contents/containerDocumentReassignment.js +2 -2
  87. package/data/persistence/container-contents/containerDocumentReassignment.js.map +1 -1
  88. package/data/persistence/container-contents/containerHydrationPersistence.js +3 -3
  89. package/data/persistence/container-contents/containerHydrationPersistence.js.map +1 -1
  90. package/data/persistence/container-contents/containerIntentPersistence.js +1 -1
  91. package/data/persistence/container-contents/containerMetadataMutationPersistence.js +5 -5
  92. package/data/persistence/container-contents/containerMetadataMutationPersistence.js.map +1 -1
  93. package/data/persistence/container-contents/containerMetadataPullContinuationPersistence.js +1 -1
  94. package/data/persistence/container-contents/containerMetadataRows.js +3 -3
  95. package/data/persistence/container-contents/containerMetadataRows.js.map +1 -1
  96. package/data/persistence/container-contents/containerMoveAbandonPersistence.js +1 -1
  97. package/data/persistence/container-contents/containerMoveIntentRows.js +1 -1
  98. package/data/persistence/container-contents/containerPendingUpdatePersistence.js +3 -3
  99. package/data/persistence/container-contents/containerPendingUpdatePersistence.js.map +1 -1
  100. package/data/persistence/container-contents/containerRebindPersistence.js +1 -1
  101. package/data/persistence/container-contents/containerReconcilePersistence.js +2 -2
  102. package/data/persistence/container-contents/containerRecoveryPersistence.js +1 -1
  103. package/data/persistence/container-contents/containerRemovalWork.js +3 -3
  104. package/data/persistence/container-contents/containerRemovalWork.js.map +1 -1
  105. package/data/persistence/container-contents/containerStructuralRepair.js +1 -1
  106. package/data/persistence/container-contents/documentLinkRemovalRepair.js +2 -2
  107. package/data/persistence/container-contents/documentLinkRemovalRepair.js.map +1 -1
  108. package/data/persistence/container-contents/documentMoveIntentPersistence.js +2 -2
  109. package/data/persistence/container-contents/documentMoveIntentPersistence.js.map +1 -1
  110. package/data/persistence/container-contents/documentPlacementIntentEnqueue.js +2 -2
  111. package/data/persistence/container-contents/documentPlacementIntentEnqueue.js.map +1 -1
  112. package/data/persistence/container-contents/documentPurgePlacement.js +1 -1
  113. package/data/persistence/container-contents/dormantContainerMetadata.js +1 -1
  114. package/data/persistence/container-contents/dormantMetadataSweep.js +1 -1
  115. package/data/persistence/container-contents/pendingContainerCreate.js +1 -1
  116. package/data/persistence/container-contents/supersededContainerBindings.js +1 -1
  117. package/data/persistence/containers/containerPersistence.js +1 -1
  118. package/data/persistence/containers/containerSyncWatermarkPersistence.js +1 -1
  119. package/data/persistence/containers/documentContainerProjectionPersistence.js +1 -1
  120. package/data/persistence/containers/documentPlacement.js +1 -1
  121. package/data/persistence/documents/containerDocumentTombstoneHoldsPersistence.js +1 -1
  122. package/data/persistence/documents/documentDiscoveryEvidencePersistence.js +3 -3
  123. package/data/persistence/documents/documentDiscoveryEvidencePersistence.js.map +1 -1
  124. package/data/persistence/documents/documentDiscoveryReset.js +1 -1
  125. package/data/persistence/documents/documentDiscoveryReset.js.map +1 -1
  126. package/data/persistence/documents/documentsPersistence.js +3 -3
  127. package/data/persistence/documents/documentsPersistence.js.map +1 -1
  128. package/data/persistence/documents/internal/attachmentStagingPersistence.js +1 -1
  129. package/data/persistence/documents/internal/containerDocumentTombstoneHolds.js +1 -1
  130. package/data/persistence/documents/internal/containerDocumentTombstones.js +1 -1
  131. package/data/persistence/documents/internal/createDocumentWithHistoryCheckpoint.js +2 -2
  132. package/data/persistence/documents/internal/createDocumentWithHistoryCheckpoint.js.map +1 -1
  133. package/data/persistence/documents/internal/discardDocument.js +3 -3
  134. package/data/persistence/documents/internal/discardDocument.js.map +1 -1
  135. package/data/persistence/documents/internal/documentDeletionPersistence.js +4 -4
  136. package/data/persistence/documents/internal/documentDeletionPersistence.js.map +1 -1
  137. package/data/persistence/documents/internal/documentMutationPersistence.js +5 -5
  138. package/data/persistence/documents/internal/documentMutationPersistence.js.map +1 -1
  139. package/data/persistence/documents/internal/documentProjectionRows.js +1 -1
  140. package/data/persistence/documents/internal/documentPullContinuationPersistence.js +1 -1
  141. package/data/persistence/documents/internal/documentRows.js +2 -2
  142. package/data/persistence/documents/internal/documentRows.js.map +1 -1
  143. package/data/persistence/documents/internal/documentSummaryQueries.js +1 -1
  144. package/data/persistence/documents/internal/ensureDocumentsSchema.js +2 -2
  145. package/data/persistence/documents/internal/hydratedAttachmentPersistence.js +1 -1
  146. package/data/persistence/documents/internal/orphanSideRows.js +2 -2
  147. package/data/persistence/documents/internal/orphanSideRows.js.map +1 -1
  148. package/data/persistence/documents/internal/pendingCreateAdoption.js +1 -1
  149. package/data/persistence/documents/internal/rowQueryPersistence.js +2 -2
  150. package/data/persistence/documents/internal/syncQueuePersistence.js +3 -3
  151. package/data/persistence/documents/internal/syncQueuePersistence.js.map +1 -1
  152. package/data/persistence/documents/types.d.ts +3 -3
  153. package/data/persistence/documents/types.js.map +1 -1
  154. package/data/persistence/{documentPurgeCheckpointPersistence.d.ts → keyingCheckpoints/documentPurgeCheckpointPersistence.d.ts} +2 -2
  155. package/data/persistence/{documentPurgeCheckpointPersistence.js → keyingCheckpoints/documentPurgeCheckpointPersistence.js} +4 -4
  156. package/data/persistence/keyingCheckpoints/documentPurgeCheckpointPersistence.js.map +1 -0
  157. package/data/persistence/{keyingCheckpointAdvancePersistence.js → keyingCheckpoints/keyingCheckpointAdvancePersistence.js} +9 -9
  158. package/data/persistence/keyingCheckpoints/keyingCheckpointAdvancePersistence.js.map +1 -0
  159. package/data/persistence/{keyingCheckpointEvidence.js → keyingCheckpoints/keyingCheckpointEvidence.js} +1 -1
  160. package/data/persistence/{keyingCheckpointPersistence.js → keyingCheckpoints/keyingCheckpointPersistence.js} +5 -5
  161. package/data/persistence/keyingCheckpoints/keyingCheckpointPersistence.js.map +1 -0
  162. package/data/persistence/{locallyAcknowledgedCheckpointPersistence.d.ts → keyingCheckpoints/locallyAcknowledgedCheckpointPersistence.d.ts} +4 -4
  163. package/data/persistence/{locallyAcknowledgedCheckpointPersistence.js → keyingCheckpoints/locallyAcknowledgedCheckpointPersistence.js} +7 -7
  164. package/data/persistence/keyingCheckpoints/locallyAcknowledgedCheckpointPersistence.js.map +1 -0
  165. package/data/persistence/{organizationReplacementCheckpointPersistence.js → keyingCheckpoints/organizationReplacementCheckpointPersistence.js} +6 -6
  166. package/data/persistence/keyingCheckpoints/organizationReplacementCheckpointPersistence.js.map +1 -0
  167. package/data/persistence/{principalAuthorizationCheckpoints.js → keyingCheckpoints/principalAuthorizationCheckpoints.js} +1 -1
  168. package/data/persistence/keyingCheckpoints/principalAuthorizationCheckpoints.js.map +1 -0
  169. package/data/persistence/organizationFounderPersistence.js +2 -2
  170. package/data/persistence/organizationFounderPersistence.js.map +1 -1
  171. package/data/persistence/organizations/organizationAccessRevocationPersistence.js +3 -3
  172. package/data/persistence/organizations/organizationAccessRevocationPersistence.js.map +1 -1
  173. package/data/persistence/organizations/organizationDataUsagePersistence.js +2 -2
  174. package/data/persistence/organizations/organizationDataUsagePersistence.js.map +1 -1
  175. package/data/persistence/organizations/organizationGroupNamePersistence.js +2 -2
  176. package/data/persistence/organizations/organizationGroupNamePersistence.js.map +1 -1
  177. package/data/persistence/organizations/organizationPresentationDenialPersistence.js +2 -2
  178. package/data/persistence/organizations/organizationPresentationDenialPersistence.js.map +1 -1
  179. package/data/persistence/organizations/organizationProfileDocumentPointers.js +2 -2
  180. package/data/persistence/organizations/organizationProfileDocumentPointers.js.map +1 -1
  181. package/data/persistence/organizations/organizationProvisioningAttemptPersistence.js +1 -1
  182. package/data/persistence/organizations/organizationProvisioningAttemptPersistence.js.map +1 -1
  183. package/data/persistence/organizations/organizationReadModelGrantPersistence.js +1 -1
  184. package/data/persistence/organizations/organizationReadModelGrantPersistence.js.map +1 -1
  185. package/data/persistence/organizations/organizationReadModelMemberLoad.js +1 -1
  186. package/data/persistence/organizations/organizationReadModelMemberLoad.js.map +1 -1
  187. package/data/persistence/organizations/organizationReadModelMembershipPersistence.js +1 -1
  188. package/data/persistence/organizations/organizationReadModelMembershipPersistence.js.map +1 -1
  189. package/data/persistence/organizations/organizationReadModelPersistence.js +3 -3
  190. package/data/persistence/organizations/organizationReadModelPersistence.js.map +1 -1
  191. package/data/persistence/organizations/organizationReadModelProjection.js +1 -1
  192. package/data/persistence/organizations/organizationReadModelProjection.js.map +1 -1
  193. package/data/persistence/organizations/organizationReadModelPurge.js +3 -3
  194. package/data/persistence/organizations/organizationReadModelPurge.js.map +1 -1
  195. package/data/persistence/principalCurrentAcknowledgementPersistence.d.ts +3 -3
  196. package/data/persistence/principalCurrentAcknowledgementPersistence.js +10 -10
  197. package/data/persistence/principalCurrentAcknowledgementPersistence.js.map +1 -1
  198. package/data/persistence/{principalHistoryEvidencePersistence.d.ts → principalHistory/principalHistoryEvidencePersistence.d.ts} +4 -4
  199. package/data/persistence/{principalHistoryEvidencePersistence.js → principalHistory/principalHistoryEvidencePersistence.js} +7 -7
  200. package/data/persistence/principalHistory/principalHistoryEvidencePersistence.js.map +1 -0
  201. package/data/persistence/{principalHistoryIncompleteRetention.js → principalHistory/principalHistoryIncompleteRetention.js} +1 -1
  202. package/data/persistence/principalHistory/principalHistoryIncompleteRetention.js.map +1 -0
  203. package/data/persistence/{principalHistoryNodeRetention.js → principalHistory/principalHistoryNodeRetention.js} +4 -4
  204. package/data/persistence/principalHistory/principalHistoryNodeRetention.js.map +1 -0
  205. package/data/persistence/{principalHistoryPrefixPersistence.d.ts → principalHistory/principalHistoryPrefixPersistence.d.ts} +2 -2
  206. package/data/persistence/{principalHistoryPrefixPersistence.js → principalHistory/principalHistoryPrefixPersistence.js} +6 -6
  207. package/data/persistence/principalHistory/principalHistoryPrefixPersistence.js.map +1 -0
  208. package/data/persistence/{principalHistoryRootOwnership.js → principalHistory/principalHistoryRootOwnership.js} +1 -1
  209. package/data/persistence/principalHistory/principalHistoryRootOwnership.js.map +1 -0
  210. package/data/persistence/{principalHistoryStagePersistence.d.ts → principalHistory/principalHistoryStagePersistence.d.ts} +2 -2
  211. package/data/persistence/{principalHistoryStagePersistence.js → principalHistory/principalHistoryStagePersistence.js} +6 -6
  212. package/data/persistence/principalHistory/principalHistoryStagePersistence.js.map +1 -0
  213. package/data/persistence/{principalHistoryStageRetention.js → principalHistory/principalHistoryStageRetention.js} +2 -2
  214. package/data/persistence/principalHistory/principalHistoryStageRetention.js.map +1 -0
  215. package/data/persistence/{principalHistoryUnpublishedRetention.js → principalHistory/principalHistoryUnpublishedRetention.js} +3 -3
  216. package/data/persistence/principalHistory/principalHistoryUnpublishedRetention.js.map +1 -0
  217. package/data/persistence/{principalGrantRetirementPersistence.d.ts → principalKeys/principalGrantRetirementPersistence.d.ts} +2 -2
  218. package/data/persistence/{principalGrantRetirementPersistence.js → principalKeys/principalGrantRetirementPersistence.js} +2 -2
  219. package/data/persistence/principalKeys/principalGrantRetirementPersistence.js.map +1 -0
  220. package/data/persistence/{principalKeyEnvelopeArchivePersistence.js → principalKeys/principalKeyEnvelopeArchivePersistence.js} +3 -3
  221. package/data/persistence/principalKeys/principalKeyEnvelopeArchivePersistence.js.map +1 -0
  222. package/data/persistence/{principalKeyEnvelopeCandidates.js → principalKeys/principalKeyEnvelopeCandidates.js} +9 -9
  223. package/data/persistence/principalKeys/principalKeyEnvelopeCandidates.js.map +1 -0
  224. package/data/persistence/principalMutationJournalPersistence.d.ts +1 -1
  225. package/data/persistence/principalMutationJournalPersistence.js +1 -1
  226. package/data/persistence/principalMutationJournalPersistence.js.map +1 -1
  227. package/data/persistence/{principalPolicyBundleIntegrity.js → principalPolicy/principalPolicyBundleIntegrity.js} +3 -3
  228. package/data/persistence/principalPolicy/principalPolicyBundleIntegrity.js.map +1 -0
  229. package/data/persistence/{principalPolicyCheckpointSelection.js → principalPolicy/principalPolicyCheckpointSelection.js} +2 -2
  230. package/data/persistence/principalPolicy/principalPolicyCheckpointSelection.js.map +1 -0
  231. package/data/persistence/{principalPolicyOrganizationPersistence.js → principalPolicy/principalPolicyOrganizationPersistence.js} +2 -2
  232. package/data/persistence/principalPolicy/principalPolicyOrganizationPersistence.js.map +1 -0
  233. package/data/persistence/{principalPolicyPersistence.js → principalPolicy/principalPolicyPersistence.js} +5 -5
  234. package/data/persistence/principalPolicy/principalPolicyPersistence.js.map +1 -0
  235. package/data/persistence/{principalPolicyReferenceCheckpoint.js → principalPolicy/principalPolicyReferenceCheckpoint.js} +3 -3
  236. package/data/persistence/principalPolicy/principalPolicyReferenceCheckpoint.js.map +1 -0
  237. package/data/persistence/{principalPolicyReferenceIndexPersistence.js → principalPolicy/principalPolicyReferenceIndexPersistence.js} +4 -4
  238. package/data/persistence/principalPolicy/principalPolicyReferenceIndexPersistence.js.map +1 -0
  239. package/data/persistence/{principalPolicyReferencePersistence.js → principalPolicy/principalPolicyReferencePersistence.js} +5 -5
  240. package/data/persistence/principalPolicy/principalPolicyReferencePersistence.js.map +1 -0
  241. package/data/persistence/{verifiedPrincipalPolicyBundle.js → principalPolicy/verifiedPrincipalPolicyBundle.js} +2 -2
  242. package/data/persistence/principalPolicy/verifiedPrincipalPolicyBundle.js.map +1 -0
  243. package/data/persistence/{verifiedPrincipalPolicyCurrent.js → principalPolicy/verifiedPrincipalPolicyCurrent.js} +2 -2
  244. package/data/persistence/principalPolicy/verifiedPrincipalPolicyCurrent.js.map +1 -0
  245. package/data/persistence/{verifiedPrincipalPolicyRetentionPersistence.js → principalPolicy/verifiedPrincipalPolicyRetentionPersistence.js} +1 -1
  246. package/data/persistence/principalPolicy/verifiedPrincipalPolicyRetentionPersistence.js.map +1 -0
  247. package/data/persistence/securityIncidentPersistence.js +1 -1
  248. package/data/persistence/securityIncidentPersistence.js.map +1 -1
  249. package/data/persistence/trustedUserIdentityPinPersistence.js +1 -1
  250. package/data/persistence/verifiedManifestBundlePersistence.d.ts +1 -1
  251. package/data/persistence/verifiedManifestBundlePersistence.js +4 -4
  252. package/data/persistence/verifiedManifestBundlePersistence.js.map +1 -1
  253. package/data/principals/organizationGroupRoles.js +2 -2
  254. package/data/principals/organizationGroupRoles.js.map +1 -1
  255. package/data/principals/principalHistoryPrefixProtection.js.map +1 -1
  256. package/data/principals/principalHistoryStageProtection.js.map +1 -1
  257. package/data/principals/principalPolicyCrypto.js +1 -1
  258. package/data/principals/principalPolicyCrypto.js.map +1 -1
  259. package/data/sqlite/{documentHistoryPersistence.d.ts → documentPersistence/documentHistoryPersistence.d.ts} +1 -1
  260. package/data/sqlite/{documentHistoryPersistence.js → documentPersistence/documentHistoryPersistence.js} +5 -5
  261. package/data/sqlite/documentPersistence/documentHistoryPersistence.js.map +1 -0
  262. package/data/sqlite/{documentOrphanBlobReclaims.js → documentPersistence/documentOrphanBlobReclaims.js} +1 -1
  263. package/data/sqlite/documentPersistence/documentOrphanBlobReclaims.js.map +1 -0
  264. package/data/sqlite/{documentPendingUpdatePersistence.d.ts → documentPersistence/documentPendingUpdatePersistence.d.ts} +2 -2
  265. package/data/sqlite/{documentPendingUpdatePersistence.js → documentPersistence/documentPendingUpdatePersistence.js} +2 -2
  266. package/data/sqlite/documentPersistence/documentPendingUpdatePersistence.js.map +1 -0
  267. package/data/sqlite/{documentPersistenceTypes.d.ts → documentPersistence/documentPersistenceTypes.d.ts} +2 -2
  268. package/data/sqlite/documentPersistence/documentPersistenceTypes.js.map +1 -0
  269. package/data/sqlite/{documentRecordPersistence.d.ts → documentPersistence/documentRecordPersistence.d.ts} +1 -1
  270. package/data/sqlite/{documentRecordPersistence.js → documentPersistence/documentRecordPersistence.js} +4 -4
  271. package/data/sqlite/documentPersistence/documentRecordPersistence.js.map +1 -0
  272. package/data/sqlite/{documentSyncFailurePersistence.d.ts → documentPersistence/documentSyncFailurePersistence.d.ts} +2 -2
  273. package/data/sqlite/{documentSyncFailurePersistence.js → documentPersistence/documentSyncFailurePersistence.js} +3 -3
  274. package/data/sqlite/documentPersistence/documentSyncFailurePersistence.js.map +1 -0
  275. package/data/sqlite/{documentPersistence.d.ts → documentPersistence/index.d.ts} +2 -2
  276. package/data/sqlite/{documentPersistence.js → documentPersistence/index.js} +5 -5
  277. package/data/sqlite/documentPersistence/index.js.map +1 -0
  278. package/data/sqlite/{containerSchema.d.ts → schema/containerSchema.d.ts} +1 -1
  279. package/data/sqlite/{containerSchema.js → schema/containerSchema.js} +1 -1
  280. package/data/sqlite/schema/containerSchema.js.map +1 -0
  281. package/data/sqlite/{schema.d.ts → schema/index.d.ts} +1 -1
  282. package/data/sqlite/{schema.js → schema/index.js} +3 -3
  283. package/data/sqlite/schema/index.js.map +1 -0
  284. package/data/sqlite/{organizationDataUsageSchema.js → schema/organizationDataUsageSchema.js} +1 -1
  285. package/data/sqlite/schema/organizationDataUsageSchema.js.map +1 -0
  286. package/data/sqlite/{organizationProvisioningAttemptSchema.js → schema/organizationProvisioningAttemptSchema.js} +1 -1
  287. package/data/sqlite/schema/organizationProvisioningAttemptSchema.js.map +1 -0
  288. package/data/sqlite/{organizationReadModelTableRegistry.d.ts → schema/organizationReadModelTableRegistry.d.ts} +1 -1
  289. package/data/sqlite/{organizationReadModelTableRegistry.js → schema/organizationReadModelTableRegistry.js} +1 -1
  290. package/data/sqlite/schema/organizationReadModelTableRegistry.js.map +1 -0
  291. package/data/sqlite/{principalHistoryEvidenceSchema.d.ts → schema/principalHistoryEvidenceSchema.d.ts} +1 -1
  292. package/data/sqlite/{principalHistoryEvidenceSchema.js → schema/principalHistoryEvidenceSchema.js} +2 -2
  293. package/data/sqlite/schema/principalHistoryEvidenceSchema.js.map +1 -0
  294. package/data/sqlite/{principalHistoryNodeRetentionSchema.js → schema/principalHistoryNodeRetentionSchema.js} +1 -1
  295. package/data/sqlite/schema/principalHistoryNodeRetentionSchema.js.map +1 -0
  296. package/data/sqlite/{principalHistoryRetentionSchema.js → schema/principalHistoryRetentionSchema.js} +1 -1
  297. package/data/sqlite/{principalHistoryRetentionSchema.js.map → schema/principalHistoryRetentionSchema.js.map} +1 -1
  298. package/data/sqlite/{principalHistoryStageSchema.d.ts → schema/principalHistoryStageSchema.d.ts} +1 -1
  299. package/data/sqlite/{principalHistoryStageSchema.js → schema/principalHistoryStageSchema.js} +2 -2
  300. package/data/sqlite/schema/principalHistoryStageSchema.js.map +1 -0
  301. package/data/sqlite/{principalMutationJournalSchema.d.ts → schema/principalMutationJournalSchema.d.ts} +1 -1
  302. package/data/sqlite/{principalMutationJournalSchema.js → schema/principalMutationJournalSchema.js} +1 -1
  303. package/data/sqlite/{principalMutationJournalSchema.js.map → schema/principalMutationJournalSchema.js.map} +1 -1
  304. package/data/sqlite/{principalPolicySchema.js → schema/principalPolicySchema.js} +1 -1
  305. package/data/sqlite/schema/principalPolicySchema.js.map +1 -0
  306. package/data/sqlite/{securityIncidentSchema.d.ts → schema/securityIncidentSchema.d.ts} +1 -1
  307. package/data/sqlite/{securityIncidentSchema.js → schema/securityIncidentSchema.js} +1 -1
  308. package/data/sqlite/schema/securityIncidentSchema.js.map +1 -0
  309. package/data/sqlite/{verifiedManifestBundleSchema.d.ts → schema/verifiedManifestBundleSchema.d.ts} +1 -1
  310. package/data/sqlite/{verifiedManifestBundleSchema.js → schema/verifiedManifestBundleSchema.js} +1 -1
  311. package/data/sqlite/schema/verifiedManifestBundleSchema.js.map +1 -0
  312. package/data/sqlite/sqlitePersistenceRuntime.d.ts +1 -1
  313. package/data/sqlite/sqlitePersistenceRuntime.js +1 -1
  314. package/package.json +1 -1
  315. package/sqlite/index.d.ts +1 -1
  316. package/sqlite/index.js +1 -1
  317. package/stores/documents/documentStore/history/historyRebuild.js +1 -1
  318. package/stores/documents/documentStore/history/historyRebuild.js.map +1 -1
  319. package/stores/documents/documentStore/state.js.map +1 -1
  320. package/stores/documents/documentStore/sync/syncFinalize.js +1 -1
  321. package/stores/documents/documentStore/sync/syncFinalize.js.map +1 -1
  322. package/stores/documents/documentStore/sync/syncUpdateImport.js +1 -1
  323. package/stores/documents/documentStore/sync/syncUpdateImport.js.map +1 -1
  324. package/workflows/blobs/detach.js +1 -1
  325. package/workflows/blobs/hydration/decrypt.js +1 -1
  326. package/workflows/blobs/upload/index.js +1 -1
  327. package/workflows/blobs/verification/retainedAttachmentVerification.js +1 -1
  328. package/workflows/blobs/verification/writerProjection.js +1 -1
  329. package/workflows/container-contents/container-state/create/createWithMetadata.js +2 -2
  330. package/workflows/container-contents/container-state/create/createWithMetadata.js.map +1 -1
  331. package/workflows/container-contents/container-state/share/index.js +1 -1
  332. package/workflows/container-contents/documentLinks/index.js +1 -1
  333. package/workflows/container-contents/documentMove/documentMoveVanishedRefresh.js +1 -1
  334. package/workflows/container-contents/documentPriming/documentHydrationProbe.js +1 -1
  335. package/workflows/container-contents/documentPriming/index.js +1 -1
  336. package/workflows/container-contents/documentQueries/index.js +1 -1
  337. package/workflows/container-contents/documentQueries/sql.js +1 -1
  338. package/workflows/container-contents/info/blobInfo.js +1 -1
  339. package/workflows/container-contents/info/containerInfo.js +1 -1
  340. package/workflows/container-contents/info/documentInfo.js +1 -1
  341. package/workflows/container-contents/metadata/index.js +1 -1
  342. package/workflows/container-contents/metadata/index.js.map +1 -1
  343. package/workflows/container-contents/metadata/metadataEvents.d.ts +1 -1
  344. package/workflows/container-contents/metadata/metadataIncomingUpdateIsolation.js +2 -2
  345. package/workflows/container-contents/metadata/metadataIncomingUpdateIsolation.js.map +1 -1
  346. package/workflows/container-contents/metadata/metadataMutationPreparation.js +1 -1
  347. package/workflows/container-contents/metadata/metadataMutationPreparation.js.map +1 -1
  348. package/workflows/container-contents/metadata/metadataPullContinuationInvalidation.js +1 -1
  349. package/workflows/container-contents/metadata/metadataPullContinuationInvalidation.js.map +1 -1
  350. package/workflows/container-contents/metadata/metadataRemoteSync.d.ts +1 -1
  351. package/workflows/container-contents/metadata/metadataSyncErrors.js +1 -1
  352. package/workflows/container-contents/metadata/metadataSyncErrors.js.map +1 -1
  353. package/workflows/container-contents/metadata/metadataSyncSettlement.d.ts +1 -1
  354. package/workflows/container-contents/metadata/metadataSyncSettlement.js.map +1 -1
  355. package/workflows/container-contents/metadata/metadataTypes.d.ts +1 -1
  356. package/workflows/container-contents/metadata/metadataTypes.js.map +1 -1
  357. package/workflows/container-contents/pendingWrites/index.js +2 -2
  358. package/workflows/container-contents/pendingWrites/sources.js +1 -1
  359. package/workflows/container-contents/remoteHydration/destination/replacementBinding.js +1 -1
  360. package/workflows/container-contents/remoteHydration/destination/replacementBinding.js.map +1 -1
  361. package/workflows/container-contents/remoteHydration/reattachMetadata.js.map +1 -1
  362. package/workflows/container-contents/tombstones/documentTombstoneEvidence.js +2 -2
  363. package/workflows/container-contents/tombstones/documentTombstoneEvidence.js.map +1 -1
  364. package/workflows/containers/child/create/index.js +2 -2
  365. package/workflows/containers/child/create/index.js.map +1 -1
  366. package/workflows/containers/child/move/index.js +1 -1
  367. package/workflows/containers/child/move/moveRotation.js +1 -1
  368. package/workflows/containers/child/move/moveRotation.js.map +1 -1
  369. package/workflows/containers/child/move/moveWraps.js +1 -1
  370. package/workflows/containers/child/move/moveWraps.js.map +1 -1
  371. package/workflows/containers/child/recite.js +2 -2
  372. package/workflows/containers/child/recite.js.map +1 -1
  373. package/workflows/containers/child/rotation/rotationContext.js +3 -3
  374. package/workflows/containers/child/rotation/rotationContext.js.map +1 -1
  375. package/workflows/containers/child/share/currentSharePrincipalPolicy.js +1 -1
  376. package/workflows/containers/child/share/currentSharePrincipalPolicy.js.map +1 -1
  377. package/workflows/containers/child/share/index.js +1 -1
  378. package/workflows/containers/child/share/index.js.map +1 -1
  379. package/workflows/containers/child/share/shareAncestorRepair.js +2 -2
  380. package/workflows/containers/child/share/shareAncestorRepair.js.map +1 -1
  381. package/workflows/containers/child/share/shareMaterialization.js +1 -1
  382. package/workflows/containers/child/share/sharePrincipalPolicy.js +5 -5
  383. package/workflows/containers/child/share/sharePrincipalPolicy.js.map +1 -1
  384. package/workflows/containers/index.d.ts +3 -3
  385. package/workflows/containers/index.js +2 -2
  386. package/workflows/containers/index.js.map +1 -1
  387. package/workflows/containers/writeRefusal.js +1 -1
  388. package/workflows/containers/writeRefusal.js.map +1 -1
  389. package/workflows/documents/create/createAdoption.js +1 -1
  390. package/workflows/documents/create/createResponse.js +2 -2
  391. package/workflows/documents/create/createResponse.js.map +1 -1
  392. package/workflows/documents/create/index.js +1 -1
  393. package/workflows/documents/documentMutationCommit.d.ts +1 -1
  394. package/workflows/documents/documentMutationPreparation.d.ts +1 -1
  395. package/workflows/documents/documentMutationPreparation.js +1 -1
  396. package/workflows/documents/documentMutationPreparation.js.map +1 -1
  397. package/workflows/documents/index.d.ts +5 -5
  398. package/workflows/documents/index.js +5 -5
  399. package/workflows/documents/index.js.map +1 -1
  400. package/workflows/documents/linkSet/index.js +2 -2
  401. package/workflows/documents/linkSet/index.js.map +1 -1
  402. package/workflows/documents/linkSet/linkSetAuthority.js +1 -1
  403. package/workflows/documents/linkSet/linkSetBlobRewraps.js +1 -1
  404. package/workflows/documents/linkSet/linkSetProjectionSeed.js +1 -1
  405. package/workflows/documents/linkSet/linkSetRemote.js +1 -1
  406. package/workflows/documents/linkSet/linkSetRemote.js.map +1 -1
  407. package/workflows/documents/purge/index.js +1 -1
  408. package/workflows/documents/sync/index.js +2 -2
  409. package/workflows/documents/sync/index.js.map +1 -1
  410. package/workflows/documents/sync/initialSync.js +1 -1
  411. package/workflows/documents/sync/readOnlyProjectionFailure.js +1 -1
  412. package/workflows/documents/sync/readOnlyProjectionFailure.js.map +1 -1
  413. package/workflows/documents/sync/readOnlySync.d.ts +3 -3
  414. package/workflows/documents/sync/readOnlySync.js +1 -1
  415. package/workflows/documents/sync/readOnlySync.js.map +1 -1
  416. package/workflows/documents/sync/reportDocumentSyncQuarantine.js.map +1 -1
  417. package/workflows/documents/sync/syncAttemptPlanning.js +2 -2
  418. package/workflows/documents/sync/syncAttemptPlanning.js.map +1 -1
  419. package/workflows/documents/sync/syncAttemptState.d.ts +2 -2
  420. package/workflows/documents/sync/syncAttemptState.js.map +1 -1
  421. package/workflows/documents/sync/syncResponseResult.js +2 -2
  422. package/workflows/documents/sync/syncResponseResult.js.map +1 -1
  423. package/workflows/documents/syncFailures/index.js +1 -1
  424. package/workflows/documents/syncFailures/index.js.map +1 -1
  425. package/workflows/documents/syncFailures/syncAbandon.js.map +1 -1
  426. package/workflows/documents/syncFailures/syncFailureClassification.js +1 -1
  427. package/workflows/documents/syncFailures/syncFailureClassification.js.map +1 -1
  428. package/workflows/documents/syncPlan/syncContentKeys.d.ts +1 -1
  429. package/workflows/documents/syncPlan/syncContentKeys.js +3 -3
  430. package/workflows/documents/syncPlan/syncContentKeys.js.map +1 -1
  431. package/workflows/documents/syncPlan/syncPlanMaterial.js +2 -2
  432. package/workflows/documents/syncPlan/syncPlanMaterial.js.map +1 -1
  433. package/workflows/documents/syncRekeys/syncAutomaticContainerRekeys.js +2 -2
  434. package/workflows/documents/syncRekeys/syncAutomaticContainerRekeys.js.map +1 -1
  435. package/workflows/documents/syncRekeys/syncContainerRekeyPreparation.js +1 -1
  436. package/workflows/documents/syncRekeys/syncRecoveryRekey.d.ts +1 -1
  437. package/workflows/documents/syncRekeys/syncRecoveryRekey.js +1 -1
  438. package/workflows/organizations/currentOrganizationAuthority.js +2 -2
  439. package/workflows/organizations/currentOrganizationAuthority.js.map +1 -1
  440. package/workflows/organizations/groupMetadata/groupMetadataAccess.js +1 -1
  441. package/workflows/organizations/groupMetadata/groupMetadataAccess.js.map +1 -1
  442. package/workflows/organizations/groupMetadata/groupMetadataContainerAuthority.js +1 -1
  443. package/workflows/organizations/groupMetadata/groupMetadataContainerAuthority.js.map +1 -1
  444. package/workflows/organizations/groupNames/currentOrganizationGroupNames.js +1 -1
  445. package/workflows/organizations/groupNames/currentOrganizationGroupNames.js.map +1 -1
  446. package/workflows/organizations/groupNames/groupNameUniqueness.js +3 -3
  447. package/workflows/organizations/groupNames/groupNameUniqueness.js.map +1 -1
  448. package/workflows/organizations/groupNames/organizationGroupNamePolicies.js +2 -2
  449. package/workflows/organizations/groupNames/organizationGroupNamePolicies.js.map +1 -1
  450. package/workflows/organizations/groupPolicy/currentGroupPolicyMutationContext.js +1 -1
  451. package/workflows/organizations/groupPolicy/currentGroupPolicyMutationContext.js.map +1 -1
  452. package/workflows/organizations/groupPolicy/groupPolicyMutationContext.js +2 -2
  453. package/workflows/organizations/groupPolicy/groupPolicyMutationContext.js.map +1 -1
  454. package/workflows/organizations/groupPolicy/groupPolicyMutationEvidence.js +1 -1
  455. package/workflows/organizations/groupPolicy/groupPolicyMutationEvidence.js.map +1 -1
  456. package/workflows/organizations/groupPolicy/groupPolicyVerification.js +1 -1
  457. package/workflows/organizations/groupPolicy/groupPolicyVerification.js.map +1 -1
  458. package/workflows/organizations/groups/createCurrentOrganizationGroup.js +1 -1
  459. package/workflows/organizations/groups/createCurrentOrganizationGroup.js.map +1 -1
  460. package/workflows/organizations/groups/deleteOrganizationGroup.js +1 -1
  461. package/workflows/organizations/groups/deleteOrganizationGroup.js.map +1 -1
  462. package/workflows/organizations/groups/organizationGroupDirectory.js +1 -1
  463. package/workflows/organizations/groups/organizationGroupDirectory.js.map +1 -1
  464. package/workflows/organizations/principalMutations/runtimeCurrentOrganizationMutation.js +1 -1
  465. package/workflows/organizations/principalMutations/runtimeCurrentOrganizationMutation.js.map +1 -1
  466. package/workflows/organizations/provisioning/organizationReplacementVerification.js +1 -1
  467. package/workflows/organizations/provisioning/organizationReplacementVerification.js.map +1 -1
  468. package/workflows/organizations/readModel/listLocalOrganizations.js +1 -1
  469. package/workflows/organizations/readModel/localReadModelDetails.js +1 -1
  470. package/workflows/organizations/readModel/localReadModelDetails.js.map +1 -1
  471. package/workflows/principals/acknowledgements/acknowledgedPrincipalCurrents.js +1 -1
  472. package/workflows/principals/acknowledgements/acknowledgedPrincipalCurrents.js.map +1 -1
  473. package/workflows/principals/acknowledgements/acknowledgedPrincipalPredecessor.d.ts +1 -1
  474. package/workflows/principals/acknowledgements/acknowledgedPrincipalPredecessor.js +1 -1
  475. package/workflows/principals/acknowledgements/acknowledgedPrincipalPredecessor.js.map +1 -1
  476. package/workflows/principals/acknowledgements/initialPrincipalCurrentPublication.js +1 -1
  477. package/workflows/principals/acknowledgements/initialPrincipalCurrentPublication.js.map +1 -1
  478. package/workflows/principals/acknowledgements/reconcileAcknowledgedPrincipalCurrent.js +2 -2
  479. package/workflows/principals/acknowledgements/reconcileAcknowledgedPrincipalCurrent.js.map +1 -1
  480. package/workflows/principals/externalAdminPolicy.js +2 -2
  481. package/workflows/principals/externalAdminPolicy.js.map +1 -1
  482. package/workflows/principals/historyRecovery/loadRecoveredPrincipalHistoryPage.js +2 -2
  483. package/workflows/principals/historyRecovery/loadRecoveredPrincipalHistoryPage.js.map +1 -1
  484. package/workflows/principals/historyRecovery/principalHistoryRecoveryPrefix.js +1 -1
  485. package/workflows/principals/historyRecovery/principalHistoryRecoveryPrefix.js.map +1 -1
  486. package/workflows/principals/historyRecovery/principalHistoryRecoveryReferences.js +1 -1
  487. package/workflows/principals/historyRecovery/principalHistoryRecoveryReferences.js.map +1 -1
  488. package/workflows/principals/historyRecovery/principalHistoryRecoveryStage.js +1 -1
  489. package/workflows/principals/historyRecovery/principalHistoryRecoveryStage.js.map +1 -1
  490. package/workflows/principals/historyRecovery/recoverPrincipalPolicyHistory.js +3 -3
  491. package/workflows/principals/historyRecovery/recoverPrincipalPolicyHistory.js.map +1 -1
  492. package/workflows/principals/policyCache/index.js +3 -3
  493. package/workflows/principals/policyCache/index.js.map +1 -1
  494. package/workflows/principals/policyCache/principalPolicyCacheAdvance.js +1 -1
  495. package/workflows/principals/policyCache/principalPolicyCacheAdvance.js.map +1 -1
  496. package/workflows/principals/policyCache/principalPolicyOrganizationScope.js +3 -3
  497. package/workflows/principals/policyCache/principalPolicyOrganizationScope.js.map +1 -1
  498. package/workflows/principals/publicHistory/publicPrincipalHistoryAuthority.js.map +1 -1
  499. package/workflows/principals/publicHistory/publicPrincipalHistoryPage.js +2 -2
  500. package/workflows/principals/publicHistory/publicPrincipalHistoryPage.js.map +1 -1
  501. package/workflows/principals/publicHistory/publicPrincipalHistoryProgress.js +3 -3
  502. package/workflows/principals/publicHistory/publicPrincipalHistoryProgress.js.map +1 -1
  503. package/workflows/principals/publicHistory/publicPrincipalHistoryTypes.d.ts +2 -2
  504. package/workflows/principals/publicHistory/publicPrincipalHistoryTypes.js.map +1 -1
  505. package/workflows/principals/publicHistory/publicProjectionPrincipal.js +1 -1
  506. package/workflows/principals/publicHistory/publicProjectionPrincipal.js.map +1 -1
  507. package/workflows/principals/publicHistory/recoverPublicPrincipalHistory.js +1 -1
  508. package/workflows/principals/publicHistory/recoverPublicPrincipalHistory.js.map +1 -1
  509. package/workflows/principals/publicHistory/selectPublicPrincipalHistory.js +1 -1
  510. package/workflows/principals/publicHistory/selectPublicPrincipalHistory.js.map +1 -1
  511. package/workflows/principals/recoveryOperation/principalRecoveryDirectory.js +1 -1
  512. package/workflows/principals/recoveryOperation/principalRecoveryDirectory.js.map +1 -1
  513. package/workflows/principals/recoveryOperation/principalRecoveryMemoValidity.js +1 -1
  514. package/workflows/principals/recoveryOperation/principalRecoveryMemoValidity.js.map +1 -1
  515. package/workflows/registration/persistRegistrationBootstrap.d.ts +2 -2
  516. package/workflows/registration/persistRegistrationBootstrap.js +2 -2
  517. package/workflows/registration/persistRegistrationBootstrap.js.map +1 -1
  518. package/workflows/registration/provisioningAcknowledgement.js +1 -1
  519. package/workflows/registration/provisioningAcknowledgement.js.map +1 -1
  520. package/workflows/registration/registrationPrincipalPolicyPersistence.js +1 -1
  521. package/workflows/registration/registrationPrincipalPolicyPersistence.js.map +1 -1
  522. package/workflows/sync/remoteReset.js +7 -7
  523. package/workflows/sync/remoteReset.js.map +1 -1
  524. package/workflows/sync/remoteResetAttachments.js +1 -1
  525. package/workflows/sync/remoteResetCursorScope.js +1 -1
  526. package/workflows/sync/remoteResetPlans.js +1 -1
  527. package/workflows/sync/remoteResetPrincipalScope.js +5 -5
  528. package/workflows/sync/remoteResetPrincipalScope.js.map +1 -1
  529. package/workflows/sync/remoteResetScope.js +1 -1
  530. package/data/documents/shared/containerKekPath.js.map +0 -1
  531. package/data/documents/shared/containerKekPathHistory.js.map +0 -1
  532. package/data/documents/shared/containerKekPathVerification.js.map +0 -1
  533. package/data/documents/shared/containerKekWrapping.js.map +0 -1
  534. package/data/documents/shared/documentSyncUpdateDecryption.js.map +0 -1
  535. package/data/documents/shared/documentSyncUpdateIsolation.js.map +0 -1
  536. package/data/documents/shared/keyringRebuild.js.map +0 -1
  537. package/data/documents/shared/mutationAcknowledgement.js.map +0 -1
  538. package/data/documents/shared/projection.js.map +0 -1
  539. package/data/documents/shared/projectionContentKeys.js.map +0 -1
  540. package/data/documents/shared/projectionTargets.js.map +0 -1
  541. package/data/documents/shared/syncPagination.js.map +0 -1
  542. package/data/documents/shared/syncResponseAuthorization.js.map +0 -1
  543. package/data/documents/shared/syncResponses.js.map +0 -1
  544. package/data/persistence/documentPurgeCheckpointPersistence.js.map +0 -1
  545. package/data/persistence/keyingCheckpointAdvancePersistence.js.map +0 -1
  546. package/data/persistence/keyingCheckpointPersistence.js.map +0 -1
  547. package/data/persistence/locallyAcknowledgedCheckpointPersistence.js.map +0 -1
  548. package/data/persistence/organizationReplacementCheckpointPersistence.js.map +0 -1
  549. package/data/persistence/principalAuthorizationCheckpoints.js.map +0 -1
  550. package/data/persistence/principalGrantRetirementPersistence.js.map +0 -1
  551. package/data/persistence/principalHistoryEvidencePersistence.js.map +0 -1
  552. package/data/persistence/principalHistoryIncompleteRetention.js.map +0 -1
  553. package/data/persistence/principalHistoryNodeRetention.js.map +0 -1
  554. package/data/persistence/principalHistoryPrefixPersistence.js.map +0 -1
  555. package/data/persistence/principalHistoryRootOwnership.js.map +0 -1
  556. package/data/persistence/principalHistoryStagePersistence.js.map +0 -1
  557. package/data/persistence/principalHistoryStageRetention.js.map +0 -1
  558. package/data/persistence/principalHistoryUnpublishedRetention.js.map +0 -1
  559. package/data/persistence/principalKeyEnvelopeArchivePersistence.js.map +0 -1
  560. package/data/persistence/principalKeyEnvelopeCandidates.js.map +0 -1
  561. package/data/persistence/principalPolicyBundleIntegrity.js.map +0 -1
  562. package/data/persistence/principalPolicyCheckpointSelection.js.map +0 -1
  563. package/data/persistence/principalPolicyOrganizationPersistence.js.map +0 -1
  564. package/data/persistence/principalPolicyPersistence.js.map +0 -1
  565. package/data/persistence/principalPolicyReferenceCheckpoint.js.map +0 -1
  566. package/data/persistence/principalPolicyReferenceIndexPersistence.js.map +0 -1
  567. package/data/persistence/principalPolicyReferencePersistence.js.map +0 -1
  568. package/data/persistence/verifiedPrincipalPolicyBundle.js.map +0 -1
  569. package/data/persistence/verifiedPrincipalPolicyCurrent.js.map +0 -1
  570. package/data/persistence/verifiedPrincipalPolicyRetentionPersistence.js.map +0 -1
  571. package/data/sqlite/containerSchema.js.map +0 -1
  572. package/data/sqlite/documentHistoryPersistence.js.map +0 -1
  573. package/data/sqlite/documentOrphanBlobReclaims.js.map +0 -1
  574. package/data/sqlite/documentPendingUpdatePersistence.js.map +0 -1
  575. package/data/sqlite/documentPersistence.js.map +0 -1
  576. package/data/sqlite/documentPersistenceTypes.js.map +0 -1
  577. package/data/sqlite/documentRecordPersistence.js.map +0 -1
  578. package/data/sqlite/documentSyncFailurePersistence.js.map +0 -1
  579. package/data/sqlite/organizationDataUsageSchema.js.map +0 -1
  580. package/data/sqlite/organizationProvisioningAttemptSchema.js.map +0 -1
  581. package/data/sqlite/organizationReadModelTableRegistry.js.map +0 -1
  582. package/data/sqlite/principalHistoryEvidenceSchema.js.map +0 -1
  583. package/data/sqlite/principalHistoryNodeRetentionSchema.js.map +0 -1
  584. package/data/sqlite/principalHistoryStageSchema.js.map +0 -1
  585. package/data/sqlite/principalPolicySchema.js.map +0 -1
  586. package/data/sqlite/schema.js.map +0 -1
  587. package/data/sqlite/securityIncidentSchema.js.map +0 -1
  588. package/data/sqlite/verifiedManifestBundleSchema.js.map +0 -1
  589. /package/data/documents/shared/{containerKekCurrency.js → containerKek/containerKekCurrency.js} +0 -0
  590. /package/data/documents/shared/{containerKekCurrency.js.map → containerKek/containerKekCurrency.js.map} +0 -0
  591. /package/data/documents/shared/{containerKekEntryVerification.js.map → containerKek/containerKekEntryVerification.js.map} +0 -0
  592. /package/data/documents/shared/{containerKekLogFetch.js.map → containerKek/containerKekLogFetch.js.map} +0 -0
  593. /package/data/documents/shared/{containerKekPath.d.ts → containerKek/containerKekPath.d.ts} +0 -0
  594. /package/data/documents/shared/{keyringLogWalk.js.map → containerKek/keyringLogWalk.js.map} +0 -0
  595. /package/data/documents/shared/{pullContinuation.d.ts → sync/pullContinuation.d.ts} +0 -0
  596. /package/data/documents/shared/{pullContinuation.js.map → sync/pullContinuation.js.map} +0 -0
  597. /package/data/documents/shared/{syncSubmitFailure.js → sync/syncSubmitFailure.js} +0 -0
  598. /package/data/documents/shared/{syncSubmitFailure.js.map → sync/syncSubmitFailure.js.map} +0 -0
  599. /package/data/persistence/{keyingCheckpointEvidence.js.map → keyingCheckpoints/keyingCheckpointEvidence.js.map} +0 -0
  600. /package/data/persistence/{storedPrincipalPolicyBundle.js → principalPolicy/storedPrincipalPolicyBundle.js} +0 -0
  601. /package/data/persistence/{storedPrincipalPolicyBundle.js.map → principalPolicy/storedPrincipalPolicyBundle.js.map} +0 -0
  602. /package/data/sqlite/{documentPersistenceTypes.js → documentPersistence/documentPersistenceTypes.js} +0 -0
  603. /package/data/sqlite/{containerDocumentTombstoneHoldSchema.d.ts → schema/containerDocumentTombstoneHoldSchema.d.ts} +0 -0
  604. /package/data/sqlite/{containerDocumentTombstoneHoldSchema.js → schema/containerDocumentTombstoneHoldSchema.js} +0 -0
  605. /package/data/sqlite/{containerDocumentTombstoneHoldSchema.js.map → schema/containerDocumentTombstoneHoldSchema.js.map} +0 -0
  606. /package/data/sqlite/{documentAttachmentSchema.d.ts → schema/documentAttachmentSchema.d.ts} +0 -0
  607. /package/data/sqlite/{documentAttachmentSchema.js → schema/documentAttachmentSchema.js} +0 -0
  608. /package/data/sqlite/{documentAttachmentSchema.js.map → schema/documentAttachmentSchema.js.map} +0 -0
  609. /package/data/sqlite/{documentDiscoveryEvidenceSchema.js → schema/documentDiscoveryEvidenceSchema.js} +0 -0
  610. /package/data/sqlite/{documentDiscoveryEvidenceSchema.js.map → schema/documentDiscoveryEvidenceSchema.js.map} +0 -0
  611. /package/data/sqlite/{documentPlacementIntentSchema.js → schema/documentPlacementIntentSchema.js} +0 -0
  612. /package/data/sqlite/{documentPlacementIntentSchema.js.map → schema/documentPlacementIntentSchema.js.map} +0 -0
  613. /package/data/sqlite/{localIntentSchema.d.ts → schema/localIntentSchema.d.ts} +0 -0
  614. /package/data/sqlite/{localIntentSchema.js → schema/localIntentSchema.js} +0 -0
  615. /package/data/sqlite/{localIntentSchema.js.map → schema/localIntentSchema.js.map} +0 -0
  616. /package/data/sqlite/{organizationFounderSchema.js → schema/organizationFounderSchema.js} +0 -0
  617. /package/data/sqlite/{organizationFounderSchema.js.map → schema/organizationFounderSchema.js.map} +0 -0
  618. /package/data/sqlite/{organizationReadModelSchema.js → schema/organizationReadModelSchema.js} +0 -0
  619. /package/data/sqlite/{organizationReadModelSchema.js.map → schema/organizationReadModelSchema.js.map} +0 -0
  620. /package/data/sqlite/{principalGrantRetirementSchema.js → schema/principalGrantRetirementSchema.js} +0 -0
  621. /package/data/sqlite/{principalGrantRetirementSchema.js.map → schema/principalGrantRetirementSchema.js.map} +0 -0
  622. /package/data/sqlite/{principalPolicySchema.d.ts → schema/principalPolicySchema.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sourceRoot":"","sources":["crypto.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CONTENT_RECORD_ENCRYPTION_SUITE,\n computeContentRecordNonceDomainHash,\n computeDocumentContentRecordCiphertextHash,\n computeDocumentContentRecordMetadataHash,\n computeDocumentContentRecordPlaintextHash,\n createAesGcmIv,\n serializeKeyingCanonicalJson,\n} from \"@tearleads/crypto\";\nimport { base64ToBytes, bytesToBase64 } from \"@tearleads/encoding\";\nimport type { DocumentSyncResponse } from \"@tearleads/validators/response\";\nimport type { PendingUpdateRecord } from \"../../sqlite/documentPersistence\";\nimport { contentRecordAdditionalDataBytes } from \"./contentRecordAdditionalData\";\nimport {\n deriveDocumentContentRecordKey,\n deriveDocumentPlaintextHashKey,\n importContentKeyMaterial,\n} from \"./contentRecordKeys\";\nimport { decryptDocumentSyncUpdate } from \"./documentSyncUpdateDecryption\";\nimport {\n isDocumentSyncUpdateIsolationError,\n isolateDocumentSyncBatchError,\n isolateDocumentSyncUpdateError,\n} from \"./documentSyncUpdateIsolation\";\nimport { asWebCryptoBytes, readWriteHeader } from \"./readers\";\nimport {\n type DecryptedDocumentSyncUpdate,\n DOCUMENT_ENCRYPTED_LORO_UPDATE_FORMAT,\n type DocumentEncryptedPendingUpdate,\n} from \"./types\";\n\nexport async function encryptDocumentPendingUpdate(input: {\n contentKeyMaterial: CryptoKey;\n contentKeyEpoch: number;\n documentId: string;\n organizationId: string;\n update: PendingUpdateRecord;\n}): Promise<DocumentEncryptedPendingUpdate> {\n const plaintext = base64ToBytes(input.update.updateData);\n const contentRecordId = input.update.id;\n const nonceDomainHash = await computeContentRecordNonceDomainHash({\n version: 1,\n organizationId: input.organizationId,\n objectKind: \"document\",\n objectId: input.documentId,\n contentKeyEpoch: input.contentKeyEpoch,\n encryptionSuite: CONTENT_RECORD_ENCRYPTION_SUITE,\n contentRecordId,\n });\n const plaintextHashKey = await deriveDocumentPlaintextHashKey({\n contentKeyMaterial: input.contentKeyMaterial,\n contentKeyEpoch: input.contentKeyEpoch,\n contentRecordId,\n documentId: input.documentId,\n organizationId: input.organizationId,\n });\n const plaintextHash = await computeDocumentContentRecordPlaintextHash(\n plaintext,\n plaintextHashKey,\n );\n const metadataHash = await computeDocumentContentRecordMetadataHash({\n ...(input.update.sourceVersionVector\n ? {\n checkpointKind: \"rotate_baseline\" as const,\n checkpointPayloadKind: \"full_history_snapshot\" as const,\n sourceVersionVector: input.update.sourceVersionVector,\n }\n : {}),\n documentId: input.documentId,\n partialEndVersionVector: input.update.partialEndVersionVector,\n partialStartVersionVector: input.update.partialStartVersionVector,\n plaintextHash,\n updateId: input.update.id,\n });\n const recordKey = await deriveDocumentContentRecordKey({\n contentKeyMaterial: input.contentKeyMaterial,\n contentKeyEpoch: input.contentKeyEpoch,\n contentRecordId,\n documentId: input.documentId,\n organizationId: input.organizationId,\n usage: \"encrypt\",\n });\n const iv = createAesGcmIv();\n const ciphertext = new Uint8Array(\n await crypto.subtle.encrypt(\n {\n name: \"AES-GCM\",\n iv,\n additionalData: contentRecordAdditionalDataBytes({\n contentKeyEpoch: input.contentKeyEpoch,\n contentRecordId,\n documentId: input.documentId,\n metadataHash,\n nonceDomainHash,\n organizationId: input.organizationId,\n }),\n },\n recordKey,\n asWebCryptoBytes(plaintext),\n ),\n );\n const encryptedData = serializeKeyingCanonicalJson({\n format: DOCUMENT_ENCRYPTED_LORO_UPDATE_FORMAT,\n version: 1,\n encryptionSuite: CONTENT_RECORD_ENCRYPTION_SUITE,\n contentKeyEpoch: input.contentKeyEpoch,\n contentRecordId,\n nonceDomainHash,\n metadataHash,\n iv: bytesToBase64(iv),\n ciphertext: bytesToBase64(ciphertext),\n });\n\n return {\n contentRecordId,\n encryptedData,\n metadataHash,\n plaintextHash,\n ciphertextHash:\n await computeDocumentContentRecordCiphertextHash(encryptedData),\n };\n}\n\nexport async function decryptDocumentSyncUpdates(input: {\n contentKey: Uint8Array;\n contentKeyEpoch: number;\n documentId: string;\n organizationId: string;\n updates: readonly DocumentSyncResponse[\"updates\"][number][];\n}): Promise<DecryptedDocumentSyncUpdate[]> {\n return decryptDocumentSyncUpdatesByEpoch({\n contentKeysByEpoch: new Map([[input.contentKeyEpoch, input.contentKey]]),\n documentId: input.documentId,\n organizationId: input.organizationId,\n updates: input.updates,\n });\n}\n\nexport async function decryptDocumentSyncUpdatesByEpoch(input: {\n contentKeysByEpoch: ReadonlyMap<number, Uint8Array>;\n documentId: string;\n organizationId: string;\n updates: readonly DocumentSyncResponse[\"updates\"][number][];\n}): Promise<DecryptedDocumentSyncUpdate[]> {\n if (input.updates.length === 0) {\n return [];\n }\n const contentKeyMaterialByEpoch = new Map<number, Promise<CryptoKey>>();\n const contentKeyMaterialForEpoch = (contentKeyEpoch: number) => {\n const existing = contentKeyMaterialByEpoch.get(contentKeyEpoch);\n if (existing) {\n return existing;\n }\n\n const contentKey = input.contentKeysByEpoch.get(contentKeyEpoch);\n if (!contentKey) {\n throw new Error(\"Document content key missing for sync update epoch\");\n }\n const imported = importContentKeyMaterial(contentKey);\n contentKeyMaterialByEpoch.set(contentKeyEpoch, imported);\n return imported;\n };\n\n const inspections = await Promise.allSettled(\n input.updates.map(async (update) => {\n let contentKeyEpoch: number;\n try {\n contentKeyEpoch = readWriteHeader(\n update.writeHeader,\n \"Document sync response write header\",\n ).contentKeyEpoch;\n } catch (error) {\n throw isolateDocumentSyncUpdateError({\n cause: error,\n responseUpdate: update,\n stage: \"write_header\",\n updateId: update.id,\n });\n }\n\n let contentKeyMaterial: CryptoKey;\n try {\n contentKeyMaterial = await contentKeyMaterialForEpoch(contentKeyEpoch);\n } catch (error) {\n throw isolateDocumentSyncUpdateError({\n cause: error,\n responseUpdate: update,\n stage: \"content_key\",\n updateId: update.id,\n });\n }\n\n return decryptDocumentSyncUpdate({\n contentKeyMaterial,\n contentKeyEpoch,\n documentId: input.documentId,\n organizationId: input.organizationId,\n update,\n });\n }),\n );\n const failures = inspections.flatMap((inspection, index) =>\n inspection.status === \"rejected\"\n ? [{ index, reason: inspection.reason }]\n : [],\n );\n const firstFailure = failures[0];\n if (failures.length === 1 && firstFailure) {\n throw firstFailure.reason;\n }\n if (failures.length > 1 && firstFailure) {\n const stage =\n isDocumentSyncUpdateIsolationError(firstFailure.reason) &&\n failures.every(\n ({ reason }) =>\n isDocumentSyncUpdateIsolationError(reason) &&\n reason.stage === firstFailure.reason.stage,\n )\n ? firstFailure.reason.stage\n : \"decrypt\";\n throw isolateDocumentSyncBatchError({\n // The per-update errors carry authenticated writer attribution. Once\n // more than one update fails, retaining those errors beneath an\n // anonymous batch boundary would disclose the very attribution the\n // boundary intentionally withholds.\n cause: new Error(\n \"Multiple document sync updates failed decryption inspection\",\n ),\n stage,\n updateIds: failures.map(\n ({ index }) => input.updates[index]?.id ?? \"unknown\",\n ),\n });\n }\n return inspections.map((inspection) => {\n if (inspection.status === \"rejected\") {\n throw inspection.reason;\n }\n return inspection.value;\n });\n}\n"]}
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["crypto.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CONTENT_RECORD_ENCRYPTION_SUITE,\n computeContentRecordNonceDomainHash,\n computeDocumentContentRecordCiphertextHash,\n computeDocumentContentRecordMetadataHash,\n computeDocumentContentRecordPlaintextHash,\n createAesGcmIv,\n serializeKeyingCanonicalJson,\n} from \"@tearleads/crypto\";\nimport { base64ToBytes, bytesToBase64 } from \"@tearleads/encoding\";\nimport type { DocumentSyncResponse } from \"@tearleads/validators/response\";\nimport type { PendingUpdateRecord } from \"../../sqlite/documentPersistence\";\nimport { contentRecordAdditionalDataBytes } from \"./contentRecordAdditionalData\";\nimport {\n deriveDocumentContentRecordKey,\n deriveDocumentPlaintextHashKey,\n importContentKeyMaterial,\n} from \"./contentRecordKeys\";\nimport { asWebCryptoBytes, readWriteHeader } from \"./readers\";\nimport { decryptDocumentSyncUpdate } from \"./sync/documentSyncUpdateDecryption\";\nimport {\n isDocumentSyncUpdateIsolationError,\n isolateDocumentSyncBatchError,\n isolateDocumentSyncUpdateError,\n} from \"./sync/documentSyncUpdateIsolation\";\nimport {\n type DecryptedDocumentSyncUpdate,\n DOCUMENT_ENCRYPTED_LORO_UPDATE_FORMAT,\n type DocumentEncryptedPendingUpdate,\n} from \"./types\";\n\nexport async function encryptDocumentPendingUpdate(input: {\n contentKeyMaterial: CryptoKey;\n contentKeyEpoch: number;\n documentId: string;\n organizationId: string;\n update: PendingUpdateRecord;\n}): Promise<DocumentEncryptedPendingUpdate> {\n const plaintext = base64ToBytes(input.update.updateData);\n const contentRecordId = input.update.id;\n const nonceDomainHash = await computeContentRecordNonceDomainHash({\n version: 1,\n organizationId: input.organizationId,\n objectKind: \"document\",\n objectId: input.documentId,\n contentKeyEpoch: input.contentKeyEpoch,\n encryptionSuite: CONTENT_RECORD_ENCRYPTION_SUITE,\n contentRecordId,\n });\n const plaintextHashKey = await deriveDocumentPlaintextHashKey({\n contentKeyMaterial: input.contentKeyMaterial,\n contentKeyEpoch: input.contentKeyEpoch,\n contentRecordId,\n documentId: input.documentId,\n organizationId: input.organizationId,\n });\n const plaintextHash = await computeDocumentContentRecordPlaintextHash(\n plaintext,\n plaintextHashKey,\n );\n const metadataHash = await computeDocumentContentRecordMetadataHash({\n ...(input.update.sourceVersionVector\n ? {\n checkpointKind: \"rotate_baseline\" as const,\n checkpointPayloadKind: \"full_history_snapshot\" as const,\n sourceVersionVector: input.update.sourceVersionVector,\n }\n : {}),\n documentId: input.documentId,\n partialEndVersionVector: input.update.partialEndVersionVector,\n partialStartVersionVector: input.update.partialStartVersionVector,\n plaintextHash,\n updateId: input.update.id,\n });\n const recordKey = await deriveDocumentContentRecordKey({\n contentKeyMaterial: input.contentKeyMaterial,\n contentKeyEpoch: input.contentKeyEpoch,\n contentRecordId,\n documentId: input.documentId,\n organizationId: input.organizationId,\n usage: \"encrypt\",\n });\n const iv = createAesGcmIv();\n const ciphertext = new Uint8Array(\n await crypto.subtle.encrypt(\n {\n name: \"AES-GCM\",\n iv,\n additionalData: contentRecordAdditionalDataBytes({\n contentKeyEpoch: input.contentKeyEpoch,\n contentRecordId,\n documentId: input.documentId,\n metadataHash,\n nonceDomainHash,\n organizationId: input.organizationId,\n }),\n },\n recordKey,\n asWebCryptoBytes(plaintext),\n ),\n );\n const encryptedData = serializeKeyingCanonicalJson({\n format: DOCUMENT_ENCRYPTED_LORO_UPDATE_FORMAT,\n version: 1,\n encryptionSuite: CONTENT_RECORD_ENCRYPTION_SUITE,\n contentKeyEpoch: input.contentKeyEpoch,\n contentRecordId,\n nonceDomainHash,\n metadataHash,\n iv: bytesToBase64(iv),\n ciphertext: bytesToBase64(ciphertext),\n });\n\n return {\n contentRecordId,\n encryptedData,\n metadataHash,\n plaintextHash,\n ciphertextHash:\n await computeDocumentContentRecordCiphertextHash(encryptedData),\n };\n}\n\nexport async function decryptDocumentSyncUpdates(input: {\n contentKey: Uint8Array;\n contentKeyEpoch: number;\n documentId: string;\n organizationId: string;\n updates: readonly DocumentSyncResponse[\"updates\"][number][];\n}): Promise<DecryptedDocumentSyncUpdate[]> {\n return decryptDocumentSyncUpdatesByEpoch({\n contentKeysByEpoch: new Map([[input.contentKeyEpoch, input.contentKey]]),\n documentId: input.documentId,\n organizationId: input.organizationId,\n updates: input.updates,\n });\n}\n\nexport async function decryptDocumentSyncUpdatesByEpoch(input: {\n contentKeysByEpoch: ReadonlyMap<number, Uint8Array>;\n documentId: string;\n organizationId: string;\n updates: readonly DocumentSyncResponse[\"updates\"][number][];\n}): Promise<DecryptedDocumentSyncUpdate[]> {\n if (input.updates.length === 0) {\n return [];\n }\n const contentKeyMaterialByEpoch = new Map<number, Promise<CryptoKey>>();\n const contentKeyMaterialForEpoch = (contentKeyEpoch: number) => {\n const existing = contentKeyMaterialByEpoch.get(contentKeyEpoch);\n if (existing) {\n return existing;\n }\n\n const contentKey = input.contentKeysByEpoch.get(contentKeyEpoch);\n if (!contentKey) {\n throw new Error(\"Document content key missing for sync update epoch\");\n }\n const imported = importContentKeyMaterial(contentKey);\n contentKeyMaterialByEpoch.set(contentKeyEpoch, imported);\n return imported;\n };\n\n const inspections = await Promise.allSettled(\n input.updates.map(async (update) => {\n let contentKeyEpoch: number;\n try {\n contentKeyEpoch = readWriteHeader(\n update.writeHeader,\n \"Document sync response write header\",\n ).contentKeyEpoch;\n } catch (error) {\n throw isolateDocumentSyncUpdateError({\n cause: error,\n responseUpdate: update,\n stage: \"write_header\",\n updateId: update.id,\n });\n }\n\n let contentKeyMaterial: CryptoKey;\n try {\n contentKeyMaterial = await contentKeyMaterialForEpoch(contentKeyEpoch);\n } catch (error) {\n throw isolateDocumentSyncUpdateError({\n cause: error,\n responseUpdate: update,\n stage: \"content_key\",\n updateId: update.id,\n });\n }\n\n return decryptDocumentSyncUpdate({\n contentKeyMaterial,\n contentKeyEpoch,\n documentId: input.documentId,\n organizationId: input.organizationId,\n update,\n });\n }),\n );\n const failures = inspections.flatMap((inspection, index) =>\n inspection.status === \"rejected\"\n ? [{ index, reason: inspection.reason }]\n : [],\n );\n const firstFailure = failures[0];\n if (failures.length === 1 && firstFailure) {\n throw firstFailure.reason;\n }\n if (failures.length > 1 && firstFailure) {\n const stage =\n isDocumentSyncUpdateIsolationError(firstFailure.reason) &&\n failures.every(\n ({ reason }) =>\n isDocumentSyncUpdateIsolationError(reason) &&\n reason.stage === firstFailure.reason.stage,\n )\n ? firstFailure.reason.stage\n : \"decrypt\";\n throw isolateDocumentSyncBatchError({\n // The per-update errors carry authenticated writer attribution. Once\n // more than one update fails, retaining those errors beneath an\n // anonymous batch boundary would disclose the very attribution the\n // boundary intentionally withholds.\n cause: new Error(\n \"Multiple document sync updates failed decryption inspection\",\n ),\n stage,\n updateIds: failures.map(\n ({ index }) => input.updates[index]?.id ?? \"unknown\",\n ),\n });\n }\n return inspections.map((inspection) => {\n if (inspection.status === \"rejected\") {\n throw inspection.reason;\n }\n return inspection.value;\n });\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { computeAccessEventBodyHash, computeAccessEventHash, computeAccessManifestHash, computeDocumentContentKeyTargetHash, deriveDocumentLinkSetManifest, signAccessEvent, } from "../../../internal/crypto/index.js";
2
2
  import { readCanonicalJson, readCanonicalRecord, } from "../../keying/canonicalJson.js";
3
- import { authorizingContainerPathRefsForLinkSet, containerPathRefs, deriveDocumentCreateTargets, mergeTargetEnvelopes, } from "./projection.js";
3
+ import { authorizingContainerPathRefsForLinkSet, containerPathRefs, deriveDocumentCreateTargets, mergeTargetEnvelopes, } from "./projection/index.js";
4
4
  import { sortDocumentTargets, uniqueSortedStrings } from "./readers.js";
5
5
  export async function buildDocumentCreatePlan({ author, containerProjection, contentKeyEpoch = 1, documentId = crypto.randomUUID(), eventId = crypto.randomUUID(), signedAt = new Date().toISOString(), targetEnvelopes, }) {
6
6
  // The document belongs to its container's organization, not the author's. A
@@ -1,12 +1,12 @@
1
- import type { DocumentContentKeyTarget, VerifiedContainerAccessManifest } from "../../../internal/crypto/index.js";
2
- import type { DocumentWriterProjectionResponse } from "../../../internal/validators/response/index.js";
3
- import { type DocumentWriterProjectionAuthorization, type PrincipalPolicyCache } from "../../keyingProjectionVerification/index.js";
4
- import type { ExecSql } from "../../sqlite/sqlSchema.js";
5
- export { unwrapContainerKekPath } from "./containerKekPath.js";
6
- export { ContainerKekHistoryUnavailableError } from "./containerKekPathHistory.js";
1
+ import type { DocumentContentKeyTarget, VerifiedContainerAccessManifest } from "../../../../internal/crypto/index.js";
2
+ import type { DocumentWriterProjectionResponse } from "../../../../internal/validators/response/index.js";
3
+ import { type DocumentWriterProjectionAuthorization, type PrincipalPolicyCache } from "../../../keyingProjectionVerification/index.js";
4
+ import type { ExecSql } from "../../../sqlite/sqlSchema.js";
5
+ export { unwrapContainerKekPath } from "../containerKek/containerKekPath.js";
6
+ export { ContainerKekHistoryUnavailableError } from "../containerKek/containerKekPathHistory.js";
7
7
  export { buildRotatedDocumentContentKeyBundle, collectContainerKeksForDocumentSync, DocumentContentKeyUnavailableError, DocumentHistoryUnavailableError, unwrapDocumentContentKeyFromBundle, unwrapDocumentContentKeyFromWriterProjection, unwrapDocumentContentKeyTarget, wrapDocumentContentKeyForCreate, } from "./projectionContentKeys.js";
8
8
  export { authorizingContainerPathRefs, authorizingContainerPathRefsForLinkSet, containerPathRefs, currentDocumentTargets, deriveDocumentCreateTargets, deriveDocumentTargetFromProjection, mergeTargetEnvelopes, readLinkedContainerIdsFromDocumentManifest, verifiedDocumentWrapTargets, } from "./projectionTargets.js";
9
- import type { ProjectionVerificationOptions } from "./types.js";
9
+ import type { ProjectionVerificationOptions } from "../types.js";
10
10
  declare function assertDocumentWriterProjectionConsistentInternal(writerProjection: DocumentWriterProjectionResponse, input: ProjectionVerificationOptions & {
11
11
  /**
12
12
  * Accept a projection whose content-key bundle is marked stale (wrapped
@@ -1,14 +1,14 @@
1
- import { computeDocumentContentKeyTargetHash } from "../../../internal/crypto/index.js";
2
- import { verifyDocumentWriterProjectionAuthorization, } from "../../keyingProjectionVerification/index.js";
3
- import { throwKeyingVerificationShapeFailure } from "../../keyingProjectionVerification/error.js";
4
- import { errorMessage } from "../../shared/errorMessage.js";
1
+ import { computeDocumentContentKeyTargetHash } from "../../../../internal/crypto/index.js";
2
+ import { verifyDocumentWriterProjectionAuthorization, } from "../../../keyingProjectionVerification/index.js";
3
+ import { throwKeyingVerificationShapeFailure } from "../../../keyingProjectionVerification/error.js";
4
+ import { errorMessage } from "../../../shared/errorMessage.js";
5
+ import { assertDocumentManifestBundleConsistent, normalizeDocumentKekTargetResponse, sortDocumentTargets, targetEnvelopeReference, targetKey, uniqueSortedStrings, } from "../readers.js";
5
6
  import { currentDocumentTargets, deriveDocumentTargetFromProjection, readLinkedContainerIdsFromDocumentManifest, } from "./projectionTargets.js";
6
- import { assertDocumentManifestBundleConsistent, normalizeDocumentKekTargetResponse, sortDocumentTargets, targetEnvelopeReference, targetKey, uniqueSortedStrings, } from "./readers.js";
7
- export { unwrapContainerKekPath } from "./containerKekPath.js";
8
- export { ContainerKekHistoryUnavailableError } from "./containerKekPathHistory.js";
7
+ export { unwrapContainerKekPath } from "../containerKek/containerKekPath.js";
8
+ export { ContainerKekHistoryUnavailableError } from "../containerKek/containerKekPathHistory.js";
9
9
  export { buildRotatedDocumentContentKeyBundle, collectContainerKeksForDocumentSync, DocumentContentKeyUnavailableError, DocumentHistoryUnavailableError, unwrapDocumentContentKeyFromBundle, unwrapDocumentContentKeyFromWriterProjection, unwrapDocumentContentKeyTarget, wrapDocumentContentKeyForCreate, } from "./projectionContentKeys.js";
10
10
  export { authorizingContainerPathRefs, authorizingContainerPathRefsForLinkSet, containerPathRefs, currentDocumentTargets, deriveDocumentCreateTargets, deriveDocumentTargetFromProjection, mergeTargetEnvelopes, readLinkedContainerIdsFromDocumentManifest, verifiedDocumentWrapTargets, } from "./projectionTargets.js";
11
- import { resolveProjectionVerifier } from "./types.js";
11
+ import { resolveProjectionVerifier } from "../types.js";
12
12
  function assertSortedStringsEqual(left, right, message) {
13
13
  if (left.length !== right.length ||
14
14
  left.some((value, index) => value !== right[index])) {
@@ -129,4 +129,4 @@ export async function assertDocumentWriterProjectionConsistent(...input) {
129
129
  throwKeyingVerificationShapeFailure(error);
130
130
  }
131
131
  }
132
- //# sourceMappingURL=projection.js.map
132
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n DocumentContentKeyTarget,\n VerifiedContainerAccessManifest,\n} from \"@tearleads/crypto\";\nimport { computeDocumentContentKeyTargetHash } from \"@tearleads/crypto\";\nimport type { DocumentWriterProjectionResponse } from \"@tearleads/validators/response\";\nimport {\n type DocumentWriterProjectionAuthorization,\n type PrincipalPolicyCache,\n verifyDocumentWriterProjectionAuthorization,\n} from \"../../../keyingProjectionVerification\";\nimport { throwKeyingVerificationShapeFailure } from \"../../../keyingProjectionVerification/error\";\nimport { errorMessage } from \"../../../shared/errorMessage\";\nimport type { ExecSql } from \"../../../sqlite/sqlSchema\";\nimport {\n assertDocumentManifestBundleConsistent,\n normalizeDocumentKekTargetResponse,\n sortDocumentTargets,\n targetEnvelopeReference,\n targetKey,\n uniqueSortedStrings,\n} from \"../readers\";\nimport {\n currentDocumentTargets,\n deriveDocumentTargetFromProjection,\n readLinkedContainerIdsFromDocumentManifest,\n} from \"./projectionTargets\";\n\nexport { unwrapContainerKekPath } from \"../containerKek/containerKekPath\";\nexport { ContainerKekHistoryUnavailableError } from \"../containerKek/containerKekPathHistory\";\nexport {\n buildRotatedDocumentContentKeyBundle,\n collectContainerKeksForDocumentSync,\n DocumentContentKeyUnavailableError,\n DocumentHistoryUnavailableError,\n unwrapDocumentContentKeyFromBundle,\n unwrapDocumentContentKeyFromWriterProjection,\n unwrapDocumentContentKeyTarget,\n wrapDocumentContentKeyForCreate,\n} from \"./projectionContentKeys\";\nexport {\n authorizingContainerPathRefs,\n authorizingContainerPathRefsForLinkSet,\n containerPathRefs,\n currentDocumentTargets,\n deriveDocumentCreateTargets,\n deriveDocumentTargetFromProjection,\n mergeTargetEnvelopes,\n readLinkedContainerIdsFromDocumentManifest,\n verifiedDocumentWrapTargets,\n} from \"./projectionTargets\";\n\nimport type { ProjectionVerificationOptions } from \"../types\";\nimport { resolveProjectionVerifier } from \"../types\";\n\nfunction assertSortedStringsEqual(\n left: readonly string[],\n right: readonly string[],\n message: string,\n): void {\n if (\n left.length !== right.length ||\n left.some((value, index) => value !== right[index])\n ) {\n throw new Error(message);\n }\n}\n\nfunction assertAuthorizingContainerPathsMatchDocumentTargets(input: {\n targets: readonly DocumentContentKeyTarget[];\n writerProjection: DocumentWriterProjectionResponse;\n}): void {\n if (input.writerProjection.authorizingContainerPaths.length === 0) {\n throw new Error(\"Document writer projection authorization paths missing\");\n }\n\n const targetKeys = new Set(input.targets.map(targetKey));\n for (const [\n index,\n projection,\n ] of input.writerProjection.authorizingContainerPaths.entries()) {\n let projectionTarget: DocumentContentKeyTarget;\n try {\n projectionTarget = deriveDocumentTargetFromProjection(projection);\n } catch (error) {\n throw new Error(\n `Document writer projection authorization path[${index}] is invalid: ${errorMessage(error)}`,\n );\n }\n\n if (targetKeys.has(targetKey(projectionTarget))) {\n continue;\n }\n\n // Bind server-supplied KEK paths to committed document targets before\n // using any unwrapped path KEK for document content-key material.\n throw new Error(\n `Document writer projection authorization path[${index}] is not a document target`,\n );\n }\n}\n\nfunction assertDocumentTargetsCoverLinkedContainers(\n targets: readonly DocumentContentKeyTarget[],\n writerProjection: DocumentWriterProjectionResponse,\n): void {\n // One target per linked container: a second epoch for the same container\n // would let a re-wrap land on a KEK a revoked member still holds.\n if (\n new Set(targets.map((target) => target.containerId)).size !== targets.length\n ) {\n throw new Error(\n \"Document writer projection targets name a linked container more than once\",\n );\n }\n assertSortedStringsEqual(\n uniqueSortedStrings(targets.map((target) => target.containerId)),\n readLinkedContainerIdsFromDocumentManifest(writerProjection),\n \"Document writer projection targets do not match linked containers\",\n );\n assertSortedStringsEqual(\n uniqueSortedStrings(\n writerProjection.documentKekTargets.linkedContainerManifestHashes,\n ),\n uniqueSortedStrings(targets.map((target) => target.containerManifestHash)),\n \"Document writer projection target manifest summary mismatch\",\n );\n assertSortedStringsEqual(\n uniqueSortedStrings(\n writerProjection.documentKekTargets.linkedContainerKeyEpochIds,\n ),\n uniqueSortedStrings(targets.map((target) => target.containerKeyEpochId)),\n \"Document writer projection target KEK summary mismatch\",\n );\n}\n\nasync function assertProjectionContentKeyBundleConsistent(\n writerProjection: DocumentWriterProjectionResponse,\n staleContentKeyBundle: boolean,\n): Promise<void> {\n const { manifestHash } = writerProjection.documentManifest;\n if (writerProjection.contentKeyBundle.linkSetManifestHash !== manifestHash) {\n // A stale bundle may lag the link-set head, but it must still descend\n // from this document's manifest chain.\n if (\n !staleContentKeyBundle ||\n !writerProjection.documentManifestHistory.some(\n (bundle) =>\n bundle.manifestHash ===\n writerProjection.contentKeyBundle.linkSetManifestHash,\n )\n ) {\n throw new Error(\"Document writer projection link manifest mismatch\");\n }\n }\n\n if (!staleContentKeyBundle) {\n if (\n writerProjection.documentKekTargets.documentKeyTargetHash !==\n writerProjection.contentKeyBundle.targetHash\n ) {\n throw new Error(\"Document writer projection target hash mismatch\");\n }\n return;\n }\n\n // The stale bundle cannot match the current targets; pin it to its own\n // canonical hash instead so a tampered envelope set still fails closed.\n const staleBundleTargetHash = await computeDocumentContentKeyTargetHash(\n sortDocumentTargets(\n writerProjection.contentKeyBundle.targets.map(targetEnvelopeReference),\n ),\n );\n if (staleBundleTargetHash !== writerProjection.contentKeyBundle.targetHash) {\n throw new Error(\n \"Document writer projection stale bundle target hash is not canonical\",\n );\n }\n}\n\nasync function assertDocumentWriterProjectionConsistentInternal(\n writerProjection: DocumentWriterProjectionResponse,\n input: ProjectionVerificationOptions & {\n /**\n * Accept a projection whose content-key bundle is marked stale (wrapped\n * to superseded KEK targets after e.g. a revoke rotation). Document sync\n * opts in to heal the bundle. Attachment reads opt in because their DEK\n * is independent and opens through verified retained container KEKs.\n */\n allowStaleContentKeyBundle?: boolean | undefined;\n execSql?: ExecSql | undefined;\n persistVerificationCheckpoints?: boolean | undefined;\n onVerifiedAuthorization?:\n | ((authorization: DocumentWriterProjectionAuthorization) => void)\n | undefined;\n principalPolicyCache?: PrincipalPolicyCache | undefined;\n stillCurrent?: (() => boolean) | undefined;\n verifiedByHash?: Map<string, VerifiedContainerAccessManifest> | undefined;\n },\n): Promise<DocumentContentKeyTarget[]> {\n const resolveProjectionUserKey = resolveProjectionVerifier(\n input,\n \"Document writer projection\",\n );\n if (\n input.trustedLocalProjection !== true &&\n resolveProjectionUserKey !== null\n ) {\n const authorization = await verifyDocumentWriterProjectionAuthorization({\n execSql: input.execSql,\n persistVerificationCheckpoints: input.persistVerificationCheckpoints,\n principalPolicyCache: input.principalPolicyCache,\n projection: writerProjection,\n resolveUserKey: resolveProjectionUserKey,\n stillCurrent: input.stillCurrent,\n verifiedByHash: input.verifiedByHash,\n warmReferencedPrincipalPolicies: input.warmReferencedPrincipalPolicies,\n });\n input.onVerifiedAuthorization?.(authorization);\n }\n\n const staleContentKeyBundle = writerProjection.contentKeyBundleStale === true;\n if (staleContentKeyBundle && input.allowStaleContentKeyBundle !== true) {\n throw new Error(\"Document writer projection content-key bundle is stale\");\n }\n\n const manifestIdentity = await assertDocumentManifestBundleConsistent({\n bundle: writerProjection.documentManifest,\n label: \"Document writer projection manifest\",\n });\n const { documentId } = manifestIdentity;\n if (\n writerProjection.documentId !== documentId ||\n writerProjection.documentKekTargets.documentId !== documentId ||\n writerProjection.contentKeyBundle.documentId !== documentId\n ) {\n throw new Error(\"Document writer projection document id mismatch\");\n }\n if (\n writerProjection.documentKekTargets.linkSetManifestHash !==\n writerProjection.documentManifest.manifestHash\n ) {\n throw new Error(\"Document writer projection link manifest mismatch\");\n }\n await assertProjectionContentKeyBundleConsistent(\n writerProjection,\n staleContentKeyBundle,\n );\n\n const targets = staleContentKeyBundle\n ? normalizeDocumentKekTargetResponse(writerProjection.documentKekTargets)\n : currentDocumentTargets(writerProjection);\n const canonicalTargetHash =\n await computeDocumentContentKeyTargetHash(targets);\n if (\n canonicalTargetHash !==\n writerProjection.documentKekTargets.documentKeyTargetHash\n ) {\n throw new Error(\"Document writer projection target hash is not canonical\");\n }\n\n assertDocumentTargetsCoverLinkedContainers(targets, writerProjection);\n assertAuthorizingContainerPathsMatchDocumentTargets({\n targets,\n writerProjection,\n });\n\n return targets;\n}\n\nexport async function assertDocumentWriterProjectionConsistent(\n ...input: Parameters<typeof assertDocumentWriterProjectionConsistentInternal>\n): ReturnType<typeof assertDocumentWriterProjectionConsistentInternal> {\n try {\n return await assertDocumentWriterProjectionConsistentInternal(...input);\n } catch (error) {\n throwKeyingVerificationShapeFailure(error);\n }\n}\n"]}
@@ -1,9 +1,9 @@
1
- import { type ContentKeyEnvelopeKind, type VerifiedContainerAccessManifest } from "../../../internal/crypto/index.js";
2
- import type { DocumentContentKeyTargetEnvelope } from "../../../internal/validators/request/index.js";
3
- import type { ContainerWriterProjectionResponse, DocumentContentKeyBundleResponse, DocumentWriterProjectionResponse } from "../../../internal/validators/response/index.js";
4
- import type { PrincipalPolicyCache } from "../../keyingProjectionVerification/index.js";
5
- import type { ExecSql } from "../../sqlite/sqlSchema.js";
6
- import type { ProjectionVerificationOptions } from "./types.js";
1
+ import { type ContentKeyEnvelopeKind, type VerifiedContainerAccessManifest } from "../../../../internal/crypto/index.js";
2
+ import type { DocumentContentKeyTargetEnvelope } from "../../../../internal/validators/request/index.js";
3
+ import type { ContainerWriterProjectionResponse, DocumentContentKeyBundleResponse, DocumentWriterProjectionResponse } from "../../../../internal/validators/response/index.js";
4
+ import type { PrincipalPolicyCache } from "../../../keyingProjectionVerification/index.js";
5
+ import type { ExecSql } from "../../../sqlite/sqlSchema.js";
6
+ import type { ProjectionVerificationOptions } from "../types.js";
7
7
  export declare function wrapDocumentContentKeyForCreate(input: {
8
8
  contentKey: Uint8Array;
9
9
  contentKeyEpoch: number;
@@ -1,13 +1,13 @@
1
- import { ContentKeyEnvelopeError, computeDocumentContentKeyTargetHash, DOCUMENT_CONTENT_KEY_WRAP_SUITE, decodeContentKeyEnvelope, unwrapContentKey, wrapContentKey, } from "../../../internal/crypto/index.js";
2
- import { bytesToBase64 } from "../../../internal/encoding/index.js";
3
- import { documentContainerProjections } from "../../keyingProjectionVerification/document/documentContainerProjections.js";
4
- import { throwKeyingVerificationErrorWithContext } from "../../keyingProjectionVerification/error.js";
5
- import { assertContainerKekPathCurrent, assertDocumentKekPathsCurrent, } from "./containerKekCurrency.js";
6
- import { unwrapContainerKekPath, unwrapContainerKekPathWithHistoryFailures, } from "./containerKekPath.js";
7
- import { ContainerKekHistoryUnavailableError } from "./containerKekPathHistory.js";
1
+ import { ContentKeyEnvelopeError, computeDocumentContentKeyTargetHash, DOCUMENT_CONTENT_KEY_WRAP_SUITE, decodeContentKeyEnvelope, unwrapContentKey, wrapContentKey, } from "../../../../internal/crypto/index.js";
2
+ import { bytesToBase64 } from "../../../../internal/encoding/index.js";
3
+ import { documentContainerProjections } from "../../../keyingProjectionVerification/document/documentContainerProjections.js";
4
+ import { throwKeyingVerificationErrorWithContext } from "../../../keyingProjectionVerification/error.js";
5
+ import { assertContainerKekPathCurrent, assertDocumentKekPathsCurrent, } from "../containerKek/containerKekCurrency.js";
6
+ import { unwrapContainerKekPath, unwrapContainerKekPathWithHistoryFailures, } from "../containerKek/containerKekPath.js";
7
+ import { ContainerKekHistoryUnavailableError } from "../containerKek/containerKekPathHistory.js";
8
+ import { assertEqualBytes, describeDocumentTargetKek, normalizeDocumentKekTargetResponse, sortDocumentTargets, targetEnvelopeReference, } from "../readers.js";
9
+ import { projectionVerificationOptions } from "../types.js";
8
10
  import { deriveDocumentCreateTargets, describeProjectionTargetKek, readLinkedContainerIdsFromDocumentManifest, verifiedDocumentWrapTargets, } from "./projectionTargets.js";
9
- import { assertEqualBytes, describeDocumentTargetKek, normalizeDocumentKekTargetResponse, sortDocumentTargets, targetEnvelopeReference, } from "./readers.js";
10
- import { projectionVerificationOptions } from "./types.js";
11
11
  function getOnlyDocumentCreateTarget(projection) {
12
12
  const target = deriveDocumentCreateTargets(projection)[0];
13
13
  if (!target) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectionContentKeys.js","sourceRoot":"","sources":["projectionContentKeys.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ContentKeyEnvelopeError,\n type ContentKeyEnvelopeKind,\n computeDocumentContentKeyTargetHash,\n DOCUMENT_CONTENT_KEY_WRAP_SUITE,\n decodeContentKeyEnvelope,\n unwrapContentKey,\n type VerifiedContainerAccessManifest,\n wrapContentKey,\n} from \"@tearleads/crypto\";\nimport { bytesToBase64 } from \"@tearleads/encoding\";\nimport type { DocumentContentKeyTargetEnvelope } from \"@tearleads/validators/request\";\nimport type {\n ContainerWriterProjectionResponse,\n DocumentContentKeyBundleResponse,\n DocumentWriterProjectionResponse,\n} from \"@tearleads/validators/response\";\nimport type { PrincipalPolicyCache } from \"../../../keyingProjectionVerification\";\nimport { documentContainerProjections } from \"../../../keyingProjectionVerification/document/documentContainerProjections\";\nimport { throwKeyingVerificationErrorWithContext } from \"../../../keyingProjectionVerification/error\";\nimport type { ExecSql } from \"../../../sqlite/sqlSchema\";\nimport {\n assertContainerKekPathCurrent,\n assertDocumentKekPathsCurrent,\n} from \"../containerKek/containerKekCurrency\";\nimport {\n unwrapContainerKekPath,\n unwrapContainerKekPathWithHistoryFailures,\n} from \"../containerKek/containerKekPath\";\nimport { ContainerKekHistoryUnavailableError } from \"../containerKek/containerKekPathHistory\";\nimport {\n assertEqualBytes,\n describeDocumentTargetKek,\n normalizeDocumentKekTargetResponse,\n sortDocumentTargets,\n targetEnvelopeReference,\n} from \"../readers\";\nimport type { ProjectionVerificationOptions } from \"../types\";\nimport { projectionVerificationOptions } from \"../types\";\nimport {\n deriveDocumentCreateTargets,\n describeProjectionTargetKek,\n readLinkedContainerIdsFromDocumentManifest,\n verifiedDocumentWrapTargets,\n} from \"./projectionTargets\";\n\nfunction getOnlyDocumentCreateTarget(\n projection: ContainerWriterProjectionResponse,\n) {\n const target = deriveDocumentCreateTargets(projection)[0];\n if (!target) {\n throw new Error(\"Document create target is unavailable\");\n }\n return target;\n}\n\nexport async function wrapDocumentContentKeyForCreate(\n input: {\n contentKey: Uint8Array;\n contentKeyEpoch: number;\n documentId: string;\n execSql?: ExecSql | undefined;\n knownContainerKeks?: ReadonlyMap<string, Uint8Array> | undefined;\n persistVerificationCheckpoints?: boolean | undefined;\n projection: ContainerWriterProjectionResponse;\n secretKey: Uint8Array;\n } & ProjectionVerificationOptions,\n): Promise<DocumentContentKeyTargetEnvelope[]> {\n assertContainerKekPathCurrent(input.projection.containerKeks);\n const keksByEpochId = await unwrapContainerKekPath({\n execSql: input.execSql,\n knownContainerKeks: input.knownContainerKeks,\n persistVerificationCheckpoints: input.persistVerificationCheckpoints,\n projection: input.projection,\n secretKey: input.secretKey,\n ...projectionVerificationOptions(input),\n });\n const target = getOnlyDocumentCreateTarget(input.projection);\n const targetKek = keksByEpochId.get(target.containerKeyEpochId);\n if (!targetKek) {\n throw new Error(\"Document create target KEK could not be unwrapped\");\n }\n\n const wrapped = await wrapContentKey(input.contentKey, targetKek, {\n kind: \"Document\",\n objectId: input.documentId,\n contentKeyEpoch: input.contentKeyEpoch,\n containerId: target.containerId,\n containerKeyEpochId: target.containerKeyEpochId,\n });\n\n return [\n {\n ...target,\n wrappedKey: bytesToBase64(wrapped.ciphertext),\n wrappingMetadata: {\n suite: DOCUMENT_CONTENT_KEY_WRAP_SUITE,\n iv: bytesToBase64(wrapped.iv),\n },\n },\n ];\n}\n\nexport async function unwrapContentKeyTargetForKind(input: {\n containerKek: Uint8Array;\n /** The content-key epoch of the bundle the envelope was served in. */\n contentKeyEpoch: number;\n /** Wraps a decode or decrypt failure with this message. */\n decryptErrorMessage?: string | undefined;\n envelope: {\n containerId: string;\n containerKeyEpochId: string;\n wrappedKey: string;\n wrappingMetadata?: unknown;\n };\n kind: ContentKeyEnvelopeKind;\n /** The document or blob the caller is reading, never read from the bundle. */\n objectId: string;\n}): Promise<Uint8Array> {\n // Reading, not submitting: the suite still binds the envelope to its object\n // kind, but an unrecognized extra metadata key is ignored rather than making\n // an otherwise decryptable envelope permanently unreadable. The AEAD tag is\n // what authenticates the recovered key, bound to the object, content-key\n // epoch and target it was sealed for. The KEK stays out of the decoder.\n try {\n return await unwrapContentKey(\n decodeContentKeyEnvelope({\n envelope: input.envelope,\n kind: input.kind,\n origin: \"stored\",\n }),\n input.containerKek,\n {\n kind: input.kind,\n objectId: input.objectId,\n contentKeyEpoch: input.contentKeyEpoch,\n containerId: input.envelope.containerId,\n containerKeyEpochId: input.envelope.containerKeyEpochId,\n },\n );\n } catch (error) {\n if (!input.decryptErrorMessage) throw error;\n // Keep the structural diagnostic; the wrapper only adds which target it\n // was, which the decoder cannot know.\n const detail =\n error instanceof ContentKeyEnvelopeError ? `: ${error.message}` : \"\";\n throw new Error(`${input.decryptErrorMessage}${detail}`, { cause: error });\n }\n}\n\nexport async function unwrapDocumentContentKeyTarget(input: {\n containerKek: Uint8Array;\n contentKeyEpoch: number;\n documentId: string;\n envelope: DocumentContentKeyTargetEnvelope;\n}): Promise<Uint8Array> {\n return unwrapContentKeyTargetForKind({\n containerKek: input.containerKek,\n contentKeyEpoch: input.contentKeyEpoch,\n decryptErrorMessage: `Document content-key target for container ${input.envelope.containerId} at epoch ${input.envelope.containerKeyEpochId} could not be unwrapped`,\n envelope: input.envelope,\n kind: \"Document\",\n objectId: input.documentId,\n });\n}\n\ninterface CollectedContainerKeks {\n readonly keksByEpochId: ReadonlyMap<string, Uint8Array>;\n readonly predecessorFailuresByEpochId: ReadonlyMap<string, Error>;\n readonly unattributedPredecessorFailuresByContainerId: ReadonlyMap<\n string,\n Error\n >;\n}\n\nexport class DocumentHistoryUnavailableError extends Error {\n constructor(readonly historyCause: unknown) {\n super(\n historyCause instanceof Error\n ? historyCause.message\n : \"Document history key is unavailable\",\n );\n this.name = \"DocumentHistoryUnavailableError\";\n }\n}\n\n/** No verified target or predecessor path can supply this content key. */\nexport class DocumentContentKeyUnavailableError extends Error {\n constructor() {\n super(\"Document content key could not be unwrapped\");\n this.name = \"DocumentContentKeyUnavailableError\";\n }\n}\n\nfunction preferredPredecessorFailure(\n failures: readonly Error[],\n): Error | undefined {\n return (\n failures.find(\n (failure) => !(failure instanceof ContainerKekHistoryUnavailableError),\n ) ?? failures[0]\n );\n}\n\nfunction recordPreferredPredecessorFailure(\n failures: Map<string, Error>,\n key: string,\n failure: Error,\n): void {\n const existing = failures.get(key);\n const preferred = preferredPredecessorFailure(\n existing ? [existing, failure] : [failure],\n );\n if (preferred) failures.set(key, preferred);\n}\n\nexport async function collectContainerKeksForDocumentSync(\n input: {\n execSql?: ExecSql | undefined;\n persistVerificationCheckpoints?: boolean | undefined;\n principalPolicyCache?: PrincipalPolicyCache | undefined;\n secretKey: Uint8Array;\n verifiedByHash?: Map<string, VerifiedContainerAccessManifest> | undefined;\n writerProjection: DocumentWriterProjectionResponse;\n } & ProjectionVerificationOptions,\n): Promise<CollectedContainerKeks> {\n const keksByEpochId = new Map<string, Uint8Array>();\n const predecessorFailuresByEpochId = new Map<string, Error>();\n const unattributedPredecessorFailuresByContainerId = new Map<string, Error>();\n\n for (const projection of documentContainerProjections(\n input.writerProjection,\n )) {\n let projectionKeks: Awaited<\n ReturnType<typeof unwrapContainerKekPathWithHistoryFailures>\n >;\n try {\n projectionKeks = await unwrapContainerKekPathWithHistoryFailures({\n execSql: input.execSql,\n knownContainerKeks: keksByEpochId,\n persistVerificationCheckpoints: input.persistVerificationCheckpoints,\n principalPolicyCache: input.principalPolicyCache,\n projection,\n secretKey: input.secretKey,\n verifiedByHash: input.verifiedByHash,\n ...projectionVerificationOptions(input),\n });\n } catch (error) {\n throwKeyingVerificationErrorWithContext(\n error,\n `Document authorizing container KEK path could not be unwrapped for ${describeProjectionTargetKek(projection)}`,\n );\n }\n for (const [\n containerKeyEpochId,\n failure,\n ] of projectionKeks.predecessorFailuresByEpochId) {\n recordPreferredPredecessorFailure(\n predecessorFailuresByEpochId,\n containerKeyEpochId,\n failure,\n );\n }\n for (const [\n containerId,\n failure,\n ] of projectionKeks.unattributedPredecessorFailuresByContainerId) {\n recordPreferredPredecessorFailure(\n unattributedPredecessorFailuresByContainerId,\n containerId,\n failure,\n );\n }\n for (const [\n containerKeyEpochId,\n keyMaterial,\n ] of projectionKeks.keksByEpochId) {\n const existing = keksByEpochId.get(containerKeyEpochId);\n if (existing) {\n assertEqualBytes(\n existing,\n keyMaterial,\n \"Document writer projection contains conflicting container KEKs\",\n );\n continue;\n }\n keksByEpochId.set(containerKeyEpochId, keyMaterial);\n }\n }\n\n return {\n keksByEpochId,\n predecessorFailuresByEpochId,\n unattributedPredecessorFailuresByContainerId,\n };\n}\n\nexport async function unwrapDocumentContentKeyFromBundle(\n bundle: DocumentContentKeyBundleResponse,\n /** The document being read; its wraps must be sealed to it. */\n documentId: string,\n containerKeksByEpochId: ReadonlyMap<string, Uint8Array>,\n predecessorFailuresByEpochId: ReadonlyMap<string, Error> = new Map(),\n unattributedPredecessorFailuresByContainerId: ReadonlyMap<\n string,\n Error\n > = new Map(),\n): Promise<Uint8Array> {\n const canonicalTargetHash = await computeDocumentContentKeyTargetHash(\n sortDocumentTargets(bundle.targets.map(targetEnvelopeReference)),\n );\n if (canonicalTargetHash !== bundle.targetHash) {\n throw new Error(\"Document content-key bundle target hash is not canonical\");\n }\n if (bundle.documentId !== documentId) {\n throw new Error(\"Document content-key bundle names another document\");\n }\n let contentKey: Uint8Array | null = null;\n const predecessorFailures: Error[] = [];\n\n for (const envelope of bundle.targets) {\n const containerKek = containerKeksByEpochId.get(\n envelope.containerKeyEpochId,\n );\n if (!containerKek) {\n const predecessorFailure =\n predecessorFailuresByEpochId.get(envelope.containerKeyEpochId) ??\n unattributedPredecessorFailuresByContainerId.get(envelope.containerId);\n if (predecessorFailure) predecessorFailures.push(predecessorFailure);\n continue;\n }\n const unwrapped = await unwrapDocumentContentKeyTarget({\n containerKek,\n contentKeyEpoch: bundle.contentKeyEpoch,\n documentId,\n envelope,\n });\n if (contentKey) {\n assertEqualBytes(\n contentKey,\n unwrapped,\n \"Document content-key targets unwrap to conflicting keys\",\n );\n continue;\n }\n contentKey = unwrapped;\n }\n\n if (!contentKey) {\n const predecessorFailure = preferredPredecessorFailure(predecessorFailures);\n if (predecessorFailure !== undefined) {\n throw new DocumentHistoryUnavailableError(predecessorFailure);\n }\n throw new DocumentContentKeyUnavailableError();\n }\n if (contentKey.byteLength !== 32) {\n throw new Error(\"Document content key must be 32 bytes\");\n }\n\n return contentKey;\n}\n\nexport async function unwrapDocumentContentKeyFromWriterProjection(\n input: {\n execSql?: ExecSql | undefined;\n principalPolicyCache?: PrincipalPolicyCache | undefined;\n secretKey: Uint8Array;\n verifiedByHash?: Map<string, VerifiedContainerAccessManifest> | undefined;\n writerProjection: DocumentWriterProjectionResponse;\n } & ProjectionVerificationOptions,\n): Promise<Uint8Array> {\n const collectedKeks = await collectContainerKeksForDocumentSync(input);\n\n return unwrapDocumentContentKeyFromBundle(\n input.writerProjection.contentKeyBundle,\n input.writerProjection.documentId,\n collectedKeks.keksByEpochId,\n collectedKeks.predecessorFailuresByEpochId,\n collectedKeks.unattributedPredecessorFailuresByContainerId,\n );\n}\n\n/**\n * Builds the healing bundle for a stale content-key bundle: wraps a FRESH\n * content key to the projection's CURRENT KEK targets at the next\n * content-key epoch. A current reader can recover the stale bundle through\n * the container predecessor chain; the fresh key is still required so a\n * holder revoked by the container rotation cannot decrypt future updates.\n * Recovery re-encrypts a full-history snapshot under that fresh key.\n *\n * Like every content-key rotation (unlink included), this requires the KEK\n * of EVERY linked-container target: all envelopes in a bundle must wrap the\n * same key, so an inaccessible target's envelope can neither be carried\n * forward (it wraps the old key) nor fabricated. A writer authorized through\n * only a subset of a multi-container link set fails here with a named target\n * and leaves the heal to a member who spans all of them.\n */\nexport async function buildRotatedDocumentContentKeyBundle(input: {\n containerKeksByEpochId: ReadonlyMap<string, Uint8Array>;\n contentKey: Uint8Array;\n writerProjection: DocumentWriterProjectionResponse;\n}): Promise<DocumentContentKeyBundleResponse> {\n assertDocumentKekPathsCurrent(input.writerProjection);\n const { contentKeyBundle, documentKekTargets } = input.writerProjection;\n // The server list names the linked containers; each envelope's epoch comes\n // from the verified authorizing-path leaf for that container.\n const targets = verifiedDocumentWrapTargets({\n linkedContainerIds: readLinkedContainerIdsFromDocumentManifest(\n input.writerProjection,\n ),\n serverTargets: normalizeDocumentKekTargetResponse(documentKekTargets),\n writerProjection: input.writerProjection,\n });\n const envelopes: DocumentContentKeyBundleResponse[\"targets\"] = [];\n const contentKeyEpoch = contentKeyBundle.contentKeyEpoch + 1;\n\n for (const target of targets) {\n const containerKek = input.containerKeksByEpochId.get(\n target.containerKeyEpochId,\n );\n if (!containerKek) {\n throw new Error(\n `Document content-key re-wrap KEK is unavailable for ${describeDocumentTargetKek(target)}`,\n );\n }\n const wrapped = await wrapContentKey(input.contentKey, containerKek, {\n kind: \"Document\",\n objectId: contentKeyBundle.documentId,\n contentKeyEpoch,\n containerId: target.containerId,\n containerKeyEpochId: target.containerKeyEpochId,\n });\n envelopes.push({\n ...target,\n wrappedKey: bytesToBase64(wrapped.ciphertext),\n wrappingMetadata: {\n suite: DOCUMENT_CONTENT_KEY_WRAP_SUITE,\n iv: bytesToBase64(wrapped.iv),\n },\n });\n }\n\n return {\n contentKeyEpoch,\n documentId: contentKeyBundle.documentId,\n linkSetManifestHash: documentKekTargets.linkSetManifestHash,\n targetHash: documentKekTargets.documentKeyTargetHash,\n targets: envelopes,\n };\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { type DocumentContentKeyTarget } from "../../../internal/crypto/index.js";
2
- import type { ContainerManifestRef, DocumentContentKeyTargetEnvelope } from "../../../internal/validators/request/index.js";
3
- import type { ContainerKeyingPathResponse, DocumentWriterProjectionResponse } from "../../../internal/validators/response/index.js";
4
- import type { DocumentLinkSetMutationOperation } from "./types.js";
1
+ import { type DocumentContentKeyTarget } from "../../../../internal/crypto/index.js";
2
+ import type { ContainerManifestRef, DocumentContentKeyTargetEnvelope } from "../../../../internal/validators/request/index.js";
3
+ import type { ContainerKeyingPathResponse, DocumentWriterProjectionResponse } from "../../../../internal/validators/response/index.js";
4
+ import type { DocumentLinkSetMutationOperation } from "../types.js";
5
5
  export declare function deriveDocumentCreateTargets(projection: ContainerKeyingPathResponse): DocumentContentKeyTarget[];
6
6
  export declare function mergeTargetEnvelopes(targets: readonly DocumentContentKeyTarget[], envelopes: readonly DocumentContentKeyTargetEnvelope[]): DocumentContentKeyTargetEnvelope[];
7
7
  export declare function describeProjectionTargetKek(projection: ContainerKeyingPathResponse): string;
@@ -1,6 +1,6 @@
1
- import { KeyingVerificationError, } from "../../../internal/crypto/index.js";
2
- import { isPlainObject as isPlainRecord } from "../../../internal/validators/isPlainObject.js";
3
- import { describeDocumentTargetKek, normalizeDocumentKekTargetResponse, readManifestContainerId, serializeCanonical, sortDocumentTargets, targetEnvelopeReference, targetKey, uniqueSortedStrings, } from "./readers.js";
1
+ import { KeyingVerificationError, } from "../../../../internal/crypto/index.js";
2
+ import { isPlainObject as isPlainRecord } from "../../../../internal/validators/isPlainObject.js";
3
+ import { describeDocumentTargetKek, normalizeDocumentKekTargetResponse, readManifestContainerId, serializeCanonical, sortDocumentTargets, targetEnvelopeReference, targetKey, uniqueSortedStrings, } from "../readers.js";
4
4
  export function deriveDocumentCreateTargets(projection) {
5
5
  const targetIndex = projection.path.length - 1;
6
6
  const targetManifest = projection.path[targetIndex];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectionTargets.js","sourceRoot":"","sources":["projectionTargets.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type DocumentContentKeyTarget,\n KeyingVerificationError,\n} from \"@tearleads/crypto\";\nimport { isPlainObject as isPlainRecord } from \"@tearleads/validators/isPlainObject\";\nimport type {\n ContainerManifestRef,\n DocumentContentKeyTargetEnvelope,\n} from \"@tearleads/validators/request\";\nimport type {\n ContainerKeyingPathResponse,\n DocumentWriterProjectionResponse,\n} from \"@tearleads/validators/response\";\nimport {\n describeDocumentTargetKek,\n normalizeDocumentKekTargetResponse,\n readManifestContainerId,\n serializeCanonical,\n sortDocumentTargets,\n targetEnvelopeReference,\n targetKey,\n uniqueSortedStrings,\n} from \"../readers\";\nimport type { DocumentLinkSetMutationOperation } from \"../types\";\n\nexport function deriveDocumentCreateTargets(\n projection: ContainerKeyingPathResponse,\n): DocumentContentKeyTarget[] {\n const targetIndex = projection.path.length - 1;\n const targetManifest = projection.path[targetIndex];\n if (!targetManifest) {\n throw new Error(\"Container writer projection path is empty\");\n }\n\n if (readManifestContainerId(targetManifest) !== projection.containerId) {\n throw new Error(\"Container writer projection target path is inconsistent\");\n }\n\n const targetKek = projection.containerKeks[targetIndex];\n if (!targetKek) {\n throw new Error(\"Container writer projection target KEK is unavailable\");\n }\n if (targetKek.containerId !== projection.containerId) {\n throw new Error(\"Container writer projection target KEK is inconsistent\");\n }\n if (targetKek.accessManifestHash !== targetManifest.manifestHash) {\n throw new Error(\"Container writer projection target KEK is stale\");\n }\n\n return [\n {\n containerId: targetKek.containerId,\n containerManifestHash: targetKek.accessManifestHash,\n containerKeyEpochId: targetKek.containerKeyEpochId,\n containerKeyEpoch: targetKek.containerKeyEpoch,\n },\n ];\n}\n\nexport function mergeTargetEnvelopes(\n targets: readonly DocumentContentKeyTarget[],\n envelopes: readonly DocumentContentKeyTargetEnvelope[],\n): DocumentContentKeyTargetEnvelope[] {\n const expectedByKey = new Map(\n targets.map((target) => [targetKey(target), target]),\n );\n const envelopeByKey = new Map<string, DocumentContentKeyTargetEnvelope>();\n\n for (const envelope of envelopes) {\n const key = targetKey(envelope);\n if (!expectedByKey.has(key)) {\n throw new Error(\"Document content-key target envelope is unexpected\");\n }\n if (envelopeByKey.has(key)) {\n throw new Error(\"Document content-key target envelope is duplicated\");\n }\n if (envelope.wrappedKey.length === 0) {\n throw new Error(\"Document content-key target envelope is empty\");\n }\n if (!isPlainRecord(envelope.wrappingMetadata)) {\n throw new Error(\n \"Document content-key target wrapping metadata must be an object\",\n );\n }\n envelopeByKey.set(key, envelope);\n }\n\n return sortDocumentTargets(targets).map((target) => {\n const envelope = envelopeByKey.get(targetKey(target));\n if (!envelope) {\n throw new Error(\"Document content-key target envelope is missing\");\n }\n return envelope;\n });\n}\n\nfunction projectionLeafContainerId(\n projection: ContainerKeyingPathResponse,\n): string | null {\n const leafBundle = projection.path.at(-1);\n return leafBundle ? readManifestContainerId(leafBundle) : null;\n}\n\nexport function describeProjectionTargetKek(\n projection: ContainerKeyingPathResponse,\n): string {\n const targetKek = projection.containerKeks.at(-1);\n const containerId =\n projectionLeafContainerId(projection) ??\n targetKek?.containerId ??\n projection.containerId;\n return targetKek\n ? `container ${containerId} epoch ${targetKek.containerKeyEpochId}`\n : `container ${containerId}`;\n}\n\nexport function deriveDocumentTargetFromProjection(\n projection: ContainerKeyingPathResponse,\n): DocumentContentKeyTarget {\n const target = deriveDocumentCreateTargets(projection)[0];\n if (!target) {\n throw new Error(\"Document target projection is unavailable\");\n }\n return target;\n}\n\nexport function readLinkedContainerIdsFromDocumentManifest(\n writerProjection: DocumentWriterProjectionResponse,\n): string[] {\n const state = writerProjection.documentManifest.state;\n const linkedContainerIds = isPlainRecord(state)\n ? Reflect.get(state, \"linkedContainerIds\")\n : undefined;\n if (\n !Array.isArray(linkedContainerIds) ||\n linkedContainerIds.some(\n (containerId) =>\n typeof containerId !== \"string\" || containerId.length === 0,\n )\n ) {\n throw new Error(\"Document link-set state is invalid\");\n }\n\n return uniqueSortedStrings(linkedContainerIds);\n}\n\n/**\n * The targets a content-key (re)wrap may address. The server's KEK target list\n * only says which linked containers the bundle must cover; the epoch each\n * envelope lands on comes from that container's verified authorizing-path\n * leaf, never from the server row. A listed epoch that is not the linked\n * container's verified current head — a predecessor a revoked member still\n * holds, or another container's epoch — therefore fails before any wrap, as\n * does a container listed twice. A linked container with no authorizing path\n * is an availability gap, not tampering: its KEK is simply unavailable here.\n */\nexport function verifiedDocumentWrapTargets(input: {\n linkedContainerIds: readonly string[];\n serverTargets: readonly DocumentContentKeyTarget[];\n writerProjection: DocumentWriterProjectionResponse;\n}): DocumentContentKeyTarget[] {\n const verifiedByKey = new Map<string, DocumentContentKeyTarget>();\n const verifiedContainerIds = new Set<string>();\n for (const projection of input.writerProjection.authorizingContainerPaths) {\n const target = deriveDocumentTargetFromProjection(projection);\n verifiedByKey.set(targetKey(target), target);\n verifiedContainerIds.add(target.containerId);\n }\n\n const containerIds = input.serverTargets.map((target) => target.containerId);\n if (new Set(containerIds).size !== containerIds.length) {\n throw new KeyingVerificationError(\n \"duplicate_entry\",\n \"Document content-key targets name a linked container more than once\",\n );\n }\n const linkedContainerIds = uniqueSortedStrings(input.linkedContainerIds);\n const sortedContainerIds = uniqueSortedStrings(containerIds);\n if (\n sortedContainerIds.length !== linkedContainerIds.length ||\n sortedContainerIds.some((id, index) => id !== linkedContainerIds[index])\n ) {\n throw new KeyingVerificationError(\n \"object_mismatch\",\n \"Document content-key targets do not match the linked containers\",\n );\n }\n\n return sortDocumentTargets(\n input.serverTargets.map((target) => {\n const verified = verifiedByKey.get(targetKey(target));\n if (verified) {\n return verified;\n }\n if (!verifiedContainerIds.has(target.containerId)) {\n throw new Error(\n `Document content-key re-wrap KEK is unavailable for ${describeDocumentTargetKek(target)}`,\n );\n }\n throw new KeyingVerificationError(\n \"object_mismatch\",\n `Document content-key target is not the verified head of ${describeDocumentTargetKek(target)}`,\n );\n }),\n );\n}\n\nexport function currentDocumentTargets(\n writerProjection: DocumentWriterProjectionResponse,\n): DocumentContentKeyTarget[] {\n const targets = normalizeDocumentKekTargetResponse(\n writerProjection.documentKekTargets,\n );\n const bundleTargets = sortDocumentTargets(\n writerProjection.contentKeyBundle.targets.map(targetEnvelopeReference),\n );\n\n if (\n serializeCanonical(targets, \"KEK targets\") !==\n serializeCanonical(bundleTargets, \"content-key targets\")\n ) {\n throw new Error(\"Document link-set content-key targets mismatch\");\n }\n\n return targets;\n}\n\n/**\n * Reduce a single container path (root→leaf chain) to {containerId,\n * manifestHash} references. The server already stores each manifest and resolves\n * it from its own store, so a write echoes only the hashes instead of\n * re-embedding the full signed bundles it received in the writer projection.\n */\nexport function containerPathRefs(\n path: ContainerKeyingPathResponse[\"path\"],\n): ContainerManifestRef[] {\n return path.map((bundle) => {\n const containerId = readManifestContainerId(bundle);\n if (!containerId) {\n throw new Error(\"Container path manifest is missing a container id\");\n }\n return { containerId, manifestHash: bundle.manifestHash };\n });\n}\n\nexport function authorizingContainerPathRefs(\n writerProjection: DocumentWriterProjectionResponse,\n): ContainerManifestRef[][] {\n return writerProjection.authorizingContainerPaths.map((projection) =>\n containerPathRefs(projection.path),\n );\n}\n\nexport function authorizingContainerPathRefsForLinkSet(input: {\n operation: DocumentLinkSetMutationOperation;\n targetContainerId: string;\n writerProjection: DocumentWriterProjectionResponse;\n}): ContainerManifestRef[][] {\n const paths = input.writerProjection.authorizingContainerPaths.filter(\n (projection) =>\n input.operation === \"link\" ||\n projectionLeafContainerId(projection) !== input.targetContainerId,\n );\n if (paths.length === 0) {\n throw new Error(\"Document link-set authorizing paths are missing\");\n }\n\n return paths.map((projection) => containerPathRefs(projection.path));\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { DocumentCreateResponse, DocumentLinkSetMutationResponse, DocumentWriterProjectionResponse } from "../../../internal/validators/response/index.js";
2
2
  import type { DocumentCreatePlan, DocumentLinkSetMutationPlan, PersistedDocumentCreateState } from "./types.js";
3
- export { DocumentSyncResponseUpdateContentKeyError, isRetryableDocumentSyncConflict, isUpstreamDeletedDocumentSyncFailure, persistedDocumentSyncStateFromResponse, submitDocumentSync, } from "./syncResponses.js";
3
+ export { DocumentSyncResponseUpdateContentKeyError, isRetryableDocumentSyncConflict, isUpstreamDeletedDocumentSyncFailure, persistedDocumentSyncStateFromResponse, submitDocumentSync, } from "./sync/syncResponses.js";
4
4
  export declare function assertDocumentCreateResponseMatchesPlan(plan: DocumentCreatePlan, response: DocumentCreateResponse): void;
5
5
  export declare function persistedDocumentCreateStateFromResponse(plan: DocumentCreatePlan, response: DocumentCreateResponse): PersistedDocumentCreateState;
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { isPlainObject as isPlainRecord } from "../../../internal/validators/isPlainObject.js";
2
2
  import { readRecordString, serializeCanonical, serializedPersistedDocumentState, } from "./readers.js";
3
- export { DocumentSyncResponseUpdateContentKeyError, isRetryableDocumentSyncConflict, isUpstreamDeletedDocumentSyncFailure, persistedDocumentSyncStateFromResponse, submitDocumentSync, } from "./syncResponses.js";
3
+ export { DocumentSyncResponseUpdateContentKeyError, isRetryableDocumentSyncConflict, isUpstreamDeletedDocumentSyncFailure, persistedDocumentSyncStateFromResponse, submitDocumentSync, } from "./sync/syncResponses.js";
4
4
  function assertDocumentMutationManifestMatchesPlan(input) {
5
5
  const { label, plan, response } = input;
6
6
  if (response.id !== plan.documentId) {
@@ -1 +1 @@
1
- {"version":3,"file":"responses.js","sourceRoot":"","sources":["responses.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPlainObject as isPlainRecord } from \"@tearleads/validators/isPlainObject\";\nimport type {\n DocumentCreateResponse,\n DocumentLinkSetMutationResponse,\n DocumentWriterProjectionResponse,\n} from \"@tearleads/validators/response\";\nimport {\n readRecordString,\n serializeCanonical,\n serializedPersistedDocumentState,\n} from \"./readers\";\nimport type {\n DocumentCreatePlan,\n DocumentLinkSetMutationPlan,\n PersistedDocumentCreateState,\n} from \"./types\";\n\nexport {\n DocumentSyncResponseUpdateContentKeyError,\n isRetryableDocumentSyncConflict,\n isUpstreamDeletedDocumentSyncFailure,\n persistedDocumentSyncStateFromResponse,\n submitDocumentSync,\n} from \"./syncResponses\";\n\ntype DocumentMutationPlan = Pick<\n DocumentCreatePlan,\n | \"documentId\"\n | \"event\"\n | \"eventHash\"\n | \"manifest\"\n | \"manifestHash\"\n | \"state\"\n | \"targetHash\"\n | \"targets\"\n> & {\n // Link and unlink bodies are both serialized canonically, so the shared\n // matcher does not care which event body shape the plan carries.\n body: unknown;\n};\n\nfunction assertDocumentMutationManifestMatchesPlan(input: {\n label: string;\n plan: DocumentMutationPlan;\n probeStateDocumentId: boolean;\n response: DocumentCreateResponse | DocumentLinkSetMutationResponse;\n}): void {\n const { label, plan, response } = input;\n if (response.id !== plan.documentId) {\n throw new Error(`${label} id mismatch`);\n }\n if (response.accessManifest.manifestHash !== plan.manifestHash) {\n throw new Error(`${label} manifest hash mismatch`);\n }\n if (\n serializeCanonical(response.accessManifest.manifest, \"manifest\") !==\n serializeCanonical(plan.manifest, \"manifest\")\n ) {\n throw new Error(`${label} manifest mismatch`);\n }\n\n const responseEvent = response.accessManifest.event;\n if (!isPlainRecord(responseEvent)) {\n throw new Error(`${label} event bundle is invalid`);\n }\n if (\n readRecordString(responseEvent, \"eventHash\", \"event bundle\") !==\n plan.eventHash\n ) {\n throw new Error(`${label} event hash mismatch`);\n }\n if (\n serializeCanonical(Reflect.get(responseEvent, \"event\"), \"event\") !==\n serializeCanonical(plan.event, \"event\")\n ) {\n throw new Error(`${label} event mismatch`);\n }\n if (\n serializeCanonical(Reflect.get(responseEvent, \"body\"), \"event body\") !==\n serializeCanonical(plan.body, \"event body\")\n ) {\n throw new Error(`${label} event body mismatch`);\n }\n\n const responseState = response.accessManifest.state;\n if (input.probeStateDocumentId) {\n if (!isPlainRecord(responseState)) {\n throw new Error(`${label} state is invalid`);\n }\n if (\n readRecordString(responseState, \"documentId\", \"document state\") !==\n plan.documentId\n ) {\n throw new Error(`${label} document id mismatch`);\n }\n }\n if (\n serializeCanonical(responseState, \"state\") !==\n serializeCanonical(plan.state, \"state\")\n ) {\n throw new Error(`${label} state mismatch`);\n }\n}\n\nfunction assertDocumentMutationKeyBundlesMatchPlan(input: {\n expectedContentKeyEpoch: number;\n expectedContentKeyTargets: unknown;\n label: string;\n plan: DocumentMutationPlan;\n response: DocumentCreateResponse | DocumentLinkSetMutationResponse;\n}): void {\n const { label, plan, response } = input;\n if (response.contentKeyBundle.documentId !== plan.documentId) {\n throw new Error(`${label} content-key document mismatch`);\n }\n if (\n response.contentKeyBundle.contentKeyEpoch !== input.expectedContentKeyEpoch\n ) {\n throw new Error(`${label} content-key epoch mismatch`);\n }\n if (response.contentKeyBundle.linkSetManifestHash !== plan.manifestHash) {\n throw new Error(`${label} link manifest mismatch`);\n }\n if (response.contentKeyBundle.targetHash !== plan.targetHash) {\n throw new Error(`${label} target hash mismatch`);\n }\n if (\n serializeCanonical(\n response.contentKeyBundle.targets,\n \"content-key targets\",\n ) !==\n serializeCanonical(input.expectedContentKeyTargets, \"content-key targets\")\n ) {\n throw new Error(`${label} content-key targets mismatch`);\n }\n if (response.documentKekTargets.documentId !== plan.documentId) {\n throw new Error(`${label} target document mismatch`);\n }\n if (response.documentKekTargets.linkSetManifestHash !== plan.manifestHash) {\n throw new Error(`${label} target manifest mismatch`);\n }\n if (response.documentKekTargets.documentKeyTargetHash !== plan.targetHash) {\n throw new Error(`${label} document target hash mismatch`);\n }\n if (\n serializeCanonical(response.documentKekTargets.targets, \"KEK targets\") !==\n serializeCanonical(plan.targets, \"KEK targets\")\n ) {\n throw new Error(`${label} KEK targets mismatch`);\n }\n}\n\nfunction assertDocumentMutationResponseMatchesPlan(input: {\n expectedContentKeyEpoch: number;\n expectedContentKeyTargets: unknown;\n label: string;\n plan: DocumentMutationPlan;\n probeStateDocumentId: boolean;\n response: DocumentCreateResponse | DocumentLinkSetMutationResponse;\n}): void {\n assertDocumentMutationManifestMatchesPlan(input);\n assertDocumentMutationKeyBundlesMatchPlan(input);\n}\n\nexport function assertDocumentCreateResponseMatchesPlan(\n plan: DocumentCreatePlan,\n response: DocumentCreateResponse,\n): void {\n assertDocumentMutationResponseMatchesPlan({\n expectedContentKeyEpoch: plan.request.contentKeyBundle.contentKeyEpoch,\n expectedContentKeyTargets: plan.request.contentKeyBundle.targets,\n label: \"Document create response\",\n plan,\n probeStateDocumentId: true,\n response,\n });\n}\n\nexport function persistedDocumentCreateStateFromResponse(\n plan: DocumentCreatePlan,\n response: DocumentCreateResponse,\n): PersistedDocumentCreateState {\n assertDocumentCreateResponseMatchesPlan(plan, response);\n\n return serializedPersistedDocumentState({\n contentKeyBundle: response.contentKeyBundle,\n documentId: response.id,\n documentKekTargets: response.documentKekTargets,\n documentManifestBundle: response.accessManifest,\n });\n}\n\n/**\n * Builds the persisted create-state from a fetched writer projection, for the\n * idempotent-create adopt path where the original create response (which\n * `persistedDocumentCreateStateFromResponse` consumes) was lost. The projection\n * carries the same committed manifest, content-key bundle and KEK targets — the\n * caller must verify it with `assertDocumentWriterProjectionConsistent` first.\n */\nexport function persistedDocumentCreateStateFromWriterProjection(\n writerProjection: DocumentWriterProjectionResponse,\n): PersistedDocumentCreateState {\n return serializedPersistedDocumentState({\n contentKeyBundle: writerProjection.contentKeyBundle,\n documentId: writerProjection.documentId,\n documentKekTargets: writerProjection.documentKekTargets,\n documentManifestBundle: writerProjection.documentManifest,\n });\n}\n\nexport function persistedDocumentLinkSetMutationStateFromResponse(\n plan: DocumentLinkSetMutationPlan,\n response: DocumentLinkSetMutationResponse,\n): PersistedDocumentCreateState {\n assertDocumentMutationResponseMatchesPlan({\n expectedContentKeyEpoch: plan.contentKeyEpoch,\n expectedContentKeyTargets: plan.request.contentKeyBundle.targets,\n label: \"Document link-set response\",\n plan,\n probeStateDocumentId: false,\n response,\n });\n\n return serializedPersistedDocumentState({\n contentKeyBundle: response.contentKeyBundle,\n documentId: response.id,\n documentKekTargets: response.documentKekTargets,\n documentManifestBundle: response.accessManifest,\n });\n}\n"]}
1
+ {"version":3,"file":"responses.js","sourceRoot":"","sources":["responses.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPlainObject as isPlainRecord } from \"@tearleads/validators/isPlainObject\";\nimport type {\n DocumentCreateResponse,\n DocumentLinkSetMutationResponse,\n DocumentWriterProjectionResponse,\n} from \"@tearleads/validators/response\";\nimport {\n readRecordString,\n serializeCanonical,\n serializedPersistedDocumentState,\n} from \"./readers\";\nimport type {\n DocumentCreatePlan,\n DocumentLinkSetMutationPlan,\n PersistedDocumentCreateState,\n} from \"./types\";\n\nexport {\n DocumentSyncResponseUpdateContentKeyError,\n isRetryableDocumentSyncConflict,\n isUpstreamDeletedDocumentSyncFailure,\n persistedDocumentSyncStateFromResponse,\n submitDocumentSync,\n} from \"./sync/syncResponses\";\n\ntype DocumentMutationPlan = Pick<\n DocumentCreatePlan,\n | \"documentId\"\n | \"event\"\n | \"eventHash\"\n | \"manifest\"\n | \"manifestHash\"\n | \"state\"\n | \"targetHash\"\n | \"targets\"\n> & {\n // Link and unlink bodies are both serialized canonically, so the shared\n // matcher does not care which event body shape the plan carries.\n body: unknown;\n};\n\nfunction assertDocumentMutationManifestMatchesPlan(input: {\n label: string;\n plan: DocumentMutationPlan;\n probeStateDocumentId: boolean;\n response: DocumentCreateResponse | DocumentLinkSetMutationResponse;\n}): void {\n const { label, plan, response } = input;\n if (response.id !== plan.documentId) {\n throw new Error(`${label} id mismatch`);\n }\n if (response.accessManifest.manifestHash !== plan.manifestHash) {\n throw new Error(`${label} manifest hash mismatch`);\n }\n if (\n serializeCanonical(response.accessManifest.manifest, \"manifest\") !==\n serializeCanonical(plan.manifest, \"manifest\")\n ) {\n throw new Error(`${label} manifest mismatch`);\n }\n\n const responseEvent = response.accessManifest.event;\n if (!isPlainRecord(responseEvent)) {\n throw new Error(`${label} event bundle is invalid`);\n }\n if (\n readRecordString(responseEvent, \"eventHash\", \"event bundle\") !==\n plan.eventHash\n ) {\n throw new Error(`${label} event hash mismatch`);\n }\n if (\n serializeCanonical(Reflect.get(responseEvent, \"event\"), \"event\") !==\n serializeCanonical(plan.event, \"event\")\n ) {\n throw new Error(`${label} event mismatch`);\n }\n if (\n serializeCanonical(Reflect.get(responseEvent, \"body\"), \"event body\") !==\n serializeCanonical(plan.body, \"event body\")\n ) {\n throw new Error(`${label} event body mismatch`);\n }\n\n const responseState = response.accessManifest.state;\n if (input.probeStateDocumentId) {\n if (!isPlainRecord(responseState)) {\n throw new Error(`${label} state is invalid`);\n }\n if (\n readRecordString(responseState, \"documentId\", \"document state\") !==\n plan.documentId\n ) {\n throw new Error(`${label} document id mismatch`);\n }\n }\n if (\n serializeCanonical(responseState, \"state\") !==\n serializeCanonical(plan.state, \"state\")\n ) {\n throw new Error(`${label} state mismatch`);\n }\n}\n\nfunction assertDocumentMutationKeyBundlesMatchPlan(input: {\n expectedContentKeyEpoch: number;\n expectedContentKeyTargets: unknown;\n label: string;\n plan: DocumentMutationPlan;\n response: DocumentCreateResponse | DocumentLinkSetMutationResponse;\n}): void {\n const { label, plan, response } = input;\n if (response.contentKeyBundle.documentId !== plan.documentId) {\n throw new Error(`${label} content-key document mismatch`);\n }\n if (\n response.contentKeyBundle.contentKeyEpoch !== input.expectedContentKeyEpoch\n ) {\n throw new Error(`${label} content-key epoch mismatch`);\n }\n if (response.contentKeyBundle.linkSetManifestHash !== plan.manifestHash) {\n throw new Error(`${label} link manifest mismatch`);\n }\n if (response.contentKeyBundle.targetHash !== plan.targetHash) {\n throw new Error(`${label} target hash mismatch`);\n }\n if (\n serializeCanonical(\n response.contentKeyBundle.targets,\n \"content-key targets\",\n ) !==\n serializeCanonical(input.expectedContentKeyTargets, \"content-key targets\")\n ) {\n throw new Error(`${label} content-key targets mismatch`);\n }\n if (response.documentKekTargets.documentId !== plan.documentId) {\n throw new Error(`${label} target document mismatch`);\n }\n if (response.documentKekTargets.linkSetManifestHash !== plan.manifestHash) {\n throw new Error(`${label} target manifest mismatch`);\n }\n if (response.documentKekTargets.documentKeyTargetHash !== plan.targetHash) {\n throw new Error(`${label} document target hash mismatch`);\n }\n if (\n serializeCanonical(response.documentKekTargets.targets, \"KEK targets\") !==\n serializeCanonical(plan.targets, \"KEK targets\")\n ) {\n throw new Error(`${label} KEK targets mismatch`);\n }\n}\n\nfunction assertDocumentMutationResponseMatchesPlan(input: {\n expectedContentKeyEpoch: number;\n expectedContentKeyTargets: unknown;\n label: string;\n plan: DocumentMutationPlan;\n probeStateDocumentId: boolean;\n response: DocumentCreateResponse | DocumentLinkSetMutationResponse;\n}): void {\n assertDocumentMutationManifestMatchesPlan(input);\n assertDocumentMutationKeyBundlesMatchPlan(input);\n}\n\nexport function assertDocumentCreateResponseMatchesPlan(\n plan: DocumentCreatePlan,\n response: DocumentCreateResponse,\n): void {\n assertDocumentMutationResponseMatchesPlan({\n expectedContentKeyEpoch: plan.request.contentKeyBundle.contentKeyEpoch,\n expectedContentKeyTargets: plan.request.contentKeyBundle.targets,\n label: \"Document create response\",\n plan,\n probeStateDocumentId: true,\n response,\n });\n}\n\nexport function persistedDocumentCreateStateFromResponse(\n plan: DocumentCreatePlan,\n response: DocumentCreateResponse,\n): PersistedDocumentCreateState {\n assertDocumentCreateResponseMatchesPlan(plan, response);\n\n return serializedPersistedDocumentState({\n contentKeyBundle: response.contentKeyBundle,\n documentId: response.id,\n documentKekTargets: response.documentKekTargets,\n documentManifestBundle: response.accessManifest,\n });\n}\n\n/**\n * Builds the persisted create-state from a fetched writer projection, for the\n * idempotent-create adopt path where the original create response (which\n * `persistedDocumentCreateStateFromResponse` consumes) was lost. The projection\n * carries the same committed manifest, content-key bundle and KEK targets — the\n * caller must verify it with `assertDocumentWriterProjectionConsistent` first.\n */\nexport function persistedDocumentCreateStateFromWriterProjection(\n writerProjection: DocumentWriterProjectionResponse,\n): PersistedDocumentCreateState {\n return serializedPersistedDocumentState({\n contentKeyBundle: writerProjection.contentKeyBundle,\n documentId: writerProjection.documentId,\n documentKekTargets: writerProjection.documentKekTargets,\n documentManifestBundle: writerProjection.documentManifest,\n });\n}\n\nexport function persistedDocumentLinkSetMutationStateFromResponse(\n plan: DocumentLinkSetMutationPlan,\n response: DocumentLinkSetMutationResponse,\n): PersistedDocumentCreateState {\n assertDocumentMutationResponseMatchesPlan({\n expectedContentKeyEpoch: plan.contentKeyEpoch,\n expectedContentKeyTargets: plan.request.contentKeyBundle.targets,\n label: \"Document link-set response\",\n plan,\n probeStateDocumentId: false,\n response,\n });\n\n return serializedPersistedDocumentState({\n contentKeyBundle: response.contentKeyBundle,\n documentId: response.id,\n documentKekTargets: response.documentKekTargets,\n documentManifestBundle: response.accessManifest,\n });\n}\n"]}
@@ -1,14 +1,14 @@
1
- import { assertAesGcmIv, CONTENT_RECORD_ENCRYPTION_SUITE, computeContentRecordNonceDomainHash, computeDocumentContentRecordCiphertextHash, computeDocumentContentRecordMetadataHash, } from "../../../internal/crypto/index.js";
2
- import { base64ToBytes } from "../../../internal/encoding/index.js";
3
- import { versionVectorsEqual } from "../../../internal/loro/index.js";
4
- import { isPlainObject as isPlainRecord } from "../../../internal/validators/isPlainObject.js";
5
- import { contentRecordAdditionalDataBytes } from "./contentRecordAdditionalData.js";
6
- import { deriveDocumentContentRecordKey, deriveDocumentPlaintextHashKey, } from "./contentRecordKeys.js";
1
+ import { assertAesGcmIv, CONTENT_RECORD_ENCRYPTION_SUITE, computeContentRecordNonceDomainHash, computeDocumentContentRecordCiphertextHash, computeDocumentContentRecordMetadataHash, } from "../../../../internal/crypto/index.js";
2
+ import { base64ToBytes } from "../../../../internal/encoding/index.js";
3
+ import { versionVectorsEqual } from "../../../../internal/loro/index.js";
4
+ import { isPlainObject as isPlainRecord } from "../../../../internal/validators/isPlainObject.js";
5
+ import { contentRecordAdditionalDataBytes } from "../contentRecordAdditionalData.js";
6
+ import { deriveDocumentContentRecordKey, deriveDocumentPlaintextHashKey, } from "../contentRecordKeys.js";
7
+ import { assertDecryptedDocumentUpdateMetadata } from "../documentUpdateIntegrity.js";
8
+ import { assertDocumentUpdatePlaintextHash } from "../plaintextHash.js";
9
+ import { assertOnlyRecordKeys, asWebCryptoBytes, readRecordPositiveInteger, readRecordString, readWriteHeader, } from "../readers.js";
10
+ import { DOCUMENT_ENCRYPTED_LORO_UPDATE_FORMAT, DOCUMENT_ENCRYPTED_UPDATE_KEYS, } from "../types.js";
7
11
  import { isolateDocumentSyncUpdateError } from "./documentSyncUpdateIsolation.js";
8
- import { assertDecryptedDocumentUpdateMetadata } from "./documentUpdateIntegrity.js";
9
- import { assertDocumentUpdatePlaintextHash } from "./plaintextHash.js";
10
- import { assertOnlyRecordKeys, asWebCryptoBytes, readRecordPositiveInteger, readRecordString, readWriteHeader, } from "./readers.js";
11
- import { DOCUMENT_ENCRYPTED_LORO_UPDATE_FORMAT, DOCUMENT_ENCRYPTED_UPDATE_KEYS, } from "./types.js";
12
12
  function parseDocumentEncryptedUpdate(encryptedData) {
13
13
  let value;
14
14
  try {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentSyncUpdateDecryption.js","sourceRoot":"","sources":["documentSyncUpdateDecryption.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n assertAesGcmIv,\n CONTENT_RECORD_ENCRYPTION_SUITE,\n computeContentRecordNonceDomainHash,\n computeDocumentContentRecordCiphertextHash,\n computeDocumentContentRecordMetadataHash,\n} from \"@tearleads/crypto\";\nimport { base64ToBytes } from \"@tearleads/encoding\";\nimport { versionVectorsEqual } from \"@tearleads/loro\";\nimport { isPlainObject as isPlainRecord } from \"@tearleads/validators/isPlainObject\";\nimport type { DocumentSyncResponse } from \"@tearleads/validators/response\";\nimport { contentRecordAdditionalDataBytes } from \"../contentRecordAdditionalData\";\nimport {\n deriveDocumentContentRecordKey,\n deriveDocumentPlaintextHashKey,\n} from \"../contentRecordKeys\";\nimport { assertDecryptedDocumentUpdateMetadata } from \"../documentUpdateIntegrity\";\nimport { assertDocumentUpdatePlaintextHash } from \"../plaintextHash\";\nimport {\n assertOnlyRecordKeys,\n asWebCryptoBytes,\n readRecordPositiveInteger,\n readRecordString,\n readWriteHeader,\n} from \"../readers\";\nimport {\n type DecryptedDocumentSyncUpdate,\n DOCUMENT_ENCRYPTED_LORO_UPDATE_FORMAT,\n DOCUMENT_ENCRYPTED_UPDATE_KEYS,\n type ParsedDocumentEncryptedUpdate,\n} from \"../types\";\nimport { isolateDocumentSyncUpdateError } from \"./documentSyncUpdateIsolation\";\n\ntype SyncResponseUpdate = DocumentSyncResponse[\"updates\"][number];\n\nfunction parseDocumentEncryptedUpdate(\n encryptedData: string,\n): ParsedDocumentEncryptedUpdate {\n let value: unknown;\n try {\n value = JSON.parse(encryptedData);\n } catch {\n throw new Error(\"Document encrypted update is invalid JSON\");\n }\n if (!isPlainRecord(value)) {\n throw new Error(\"Document encrypted update must be an object\");\n }\n assertOnlyRecordKeys(\n value,\n DOCUMENT_ENCRYPTED_UPDATE_KEYS,\n \"Document encrypted update\",\n );\n if (\n readRecordString(value, \"format\", \"Document encrypted update\") !==\n DOCUMENT_ENCRYPTED_LORO_UPDATE_FORMAT\n ) {\n throw new Error(\"Document encrypted update format is invalid\");\n }\n const version = readRecordPositiveInteger(\n value,\n \"version\",\n \"Document encrypted update\",\n );\n if (version !== 1) {\n throw new Error(\n `Document encrypted update version ${version} is invalid; expected 1`,\n );\n }\n if (\n readRecordString(value, \"encryptionSuite\", \"Document encrypted update\") !==\n CONTENT_RECORD_ENCRYPTION_SUITE\n ) {\n throw new Error(\"Document encrypted update suite is invalid\");\n }\n\n const iv = base64ToBytes(\n readRecordString(value, \"iv\", \"Document encrypted update\"),\n );\n assertAesGcmIv(iv, \"Document encrypted update IV is invalid\");\n return {\n ciphertext: base64ToBytes(\n readRecordString(value, \"ciphertext\", \"Document encrypted update\"),\n ),\n contentKeyEpoch: readRecordPositiveInteger(\n value,\n \"contentKeyEpoch\",\n \"Document encrypted update\",\n ),\n contentRecordId: readRecordString(\n value,\n \"contentRecordId\",\n \"Document encrypted update\",\n ),\n metadataHash: readRecordString(\n value,\n \"metadataHash\",\n \"Document encrypted update\",\n ),\n nonceDomainHash: readRecordString(\n value,\n \"nonceDomainHash\",\n \"Document encrypted update\",\n ),\n iv,\n };\n}\n\nasync function assertDocumentEncryptedUpdateMatchesHeader(input: {\n contentKeyEpoch: number;\n documentId: string;\n encrypted: ParsedDocumentEncryptedUpdate;\n encryptedData: string;\n organizationId: string;\n update: SyncResponseUpdate;\n}): Promise<void> {\n const { encrypted, update } = input;\n const hasCheckpointMetadata =\n update.checkpointKind !== undefined ||\n update.checkpointPayloadKind !== undefined ||\n update.sourceVersionVector !== undefined;\n if (\n hasCheckpointMetadata &&\n (update.checkpointKind !== \"rotate_baseline\" ||\n update.checkpointPayloadKind !== \"full_history_snapshot\" ||\n !update.sourceVersionVector ||\n !versionVectorsEqual(\n update.sourceVersionVector,\n update.partialEndVersionVector,\n ))\n ) {\n throw new Error(\"Document rotation checkpoint metadata mismatch\");\n }\n if (encrypted.contentKeyEpoch !== input.contentKeyEpoch) {\n throw new Error(\"Document encrypted update content-key epoch mismatch\");\n }\n if (update.documentId !== input.documentId) {\n throw new Error(\"Document encrypted update document id mismatch\");\n }\n if (\n encrypted.contentRecordId !==\n readRecordString(update.writeHeader, \"contentRecordId\", \"write header\")\n ) {\n throw new Error(\"Document encrypted update content record mismatch\");\n }\n\n const metadataHash = await computeDocumentContentRecordMetadataHash({\n ...(update.checkpointKind === undefined\n ? {}\n : { checkpointKind: update.checkpointKind }),\n ...(update.checkpointPayloadKind === undefined\n ? {}\n : { checkpointPayloadKind: update.checkpointPayloadKind }),\n documentId: input.documentId,\n partialEndVersionVector: update.partialEndVersionVector,\n partialStartVersionVector: update.partialStartVersionVector,\n plaintextHash: update.plaintextHash,\n ...(update.sourceVersionVector === undefined\n ? {}\n : { sourceVersionVector: update.sourceVersionVector }),\n updateId: update.id,\n });\n if (\n encrypted.metadataHash !== metadataHash ||\n encrypted.metadataHash !==\n readRecordString(update.writeHeader, \"metadataHash\", \"write header\")\n ) {\n throw new Error(\"Document encrypted update metadata hash mismatch\");\n }\n\n const nonceDomainHash = await computeContentRecordNonceDomainHash({\n version: 1,\n organizationId: input.organizationId,\n objectKind: \"document\",\n objectId: input.documentId,\n contentKeyEpoch: input.contentKeyEpoch,\n encryptionSuite: CONTENT_RECORD_ENCRYPTION_SUITE,\n contentRecordId: encrypted.contentRecordId,\n });\n if (\n encrypted.nonceDomainHash !== nonceDomainHash ||\n encrypted.nonceDomainHash !==\n readRecordString(update.writeHeader, \"nonceDomainHash\", \"write header\")\n ) {\n throw new Error(\"Document encrypted update nonce domain mismatch\");\n }\n const ciphertextHash = await computeDocumentContentRecordCiphertextHash(\n input.encryptedData,\n );\n if (\n ciphertextHash !==\n readRecordString(update.writeHeader, \"ciphertextHash\", \"write header\")\n ) {\n throw new Error(\"Document encrypted update ciphertext hash mismatch\");\n }\n}\n\nasync function verifiedEncryptedSyncUpdate(input: {\n contentKeyEpoch: number;\n documentId: string;\n organizationId: string;\n update: SyncResponseUpdate;\n}): Promise<ParsedDocumentEncryptedUpdate> {\n try {\n const encrypted = parseDocumentEncryptedUpdate(input.update.encryptedData);\n await assertDocumentEncryptedUpdateMatchesHeader({\n encrypted,\n encryptedData: input.update.encryptedData,\n ...input,\n });\n return encrypted;\n } catch (error) {\n throw isolateDocumentSyncUpdateError({\n cause: error,\n responseUpdate: input.update,\n stage: \"encrypted_record\",\n updateId: input.update.id,\n });\n }\n}\n\n/** Verifies the encrypted record's structure and every binding to its header. */\nexport async function assertDocumentSyncUpdateEncryptedRecord(\n update: SyncResponseUpdate,\n): Promise<void> {\n let contentKeyEpoch: number;\n let documentId: string;\n let organizationId: string;\n try {\n const header = readWriteHeader(\n update.writeHeader,\n \"Document sync response write header\",\n );\n if (header.objectKind !== \"document\") {\n throw new Error(\"Document sync response write header kind mismatch\");\n }\n contentKeyEpoch = header.contentKeyEpoch;\n documentId = header.objectId;\n organizationId = header.organizationId;\n } catch (error) {\n throw isolateDocumentSyncUpdateError({\n cause: error,\n responseUpdate: update,\n stage: \"write_header\",\n updateId: update.id,\n });\n }\n await verifiedEncryptedSyncUpdate({\n contentKeyEpoch,\n documentId,\n organizationId,\n update,\n });\n}\n\nasync function decryptPayload(input: {\n contentKeyEpoch: number;\n contentKeyMaterial: CryptoKey;\n documentId: string;\n encrypted: ParsedDocumentEncryptedUpdate;\n organizationId: string;\n update: SyncResponseUpdate;\n}): Promise<{ plaintextHashKey: CryptoKey; updateData: Uint8Array }> {\n try {\n const keyInput = {\n contentKeyMaterial: input.contentKeyMaterial,\n contentKeyEpoch: input.contentKeyEpoch,\n contentRecordId: input.encrypted.contentRecordId,\n documentId: input.documentId,\n organizationId: input.organizationId,\n };\n const [recordKey, plaintextHashKey] = await Promise.all([\n deriveDocumentContentRecordKey({ ...keyInput, usage: \"decrypt\" }),\n deriveDocumentPlaintextHashKey(keyInput),\n ]);\n const updateData = new Uint8Array(\n await crypto.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv: asWebCryptoBytes(input.encrypted.iv),\n additionalData: contentRecordAdditionalDataBytes({\n contentKeyEpoch: input.contentKeyEpoch,\n contentRecordId: input.encrypted.contentRecordId,\n documentId: input.documentId,\n metadataHash: input.encrypted.metadataHash,\n nonceDomainHash: input.encrypted.nonceDomainHash,\n organizationId: input.organizationId,\n }),\n },\n recordKey,\n asWebCryptoBytes(input.encrypted.ciphertext),\n ),\n );\n return { plaintextHashKey, updateData };\n } catch (error) {\n throw isolateDocumentSyncUpdateError({\n cause: error,\n responseUpdate: input.update,\n stage: \"decrypt\",\n updateId: input.update.id,\n });\n }\n}\n\nexport async function decryptDocumentSyncUpdate(input: {\n contentKeyEpoch: number;\n contentKeyMaterial: CryptoKey;\n documentId: string;\n organizationId: string;\n update: SyncResponseUpdate;\n}): Promise<DecryptedDocumentSyncUpdate> {\n const encrypted = await verifiedEncryptedSyncUpdate(input);\n const { plaintextHashKey, updateData } = await decryptPayload({\n ...input,\n encrypted,\n });\n try {\n await assertDocumentUpdatePlaintextHash(\n updateData,\n input.update.plaintextHash,\n plaintextHashKey,\n );\n } catch (error) {\n throw isolateDocumentSyncUpdateError({\n cause: error,\n responseUpdate: input.update,\n stage: \"plaintext_integrity\",\n updateId: input.update.id,\n });\n }\n try {\n assertDecryptedDocumentUpdateMetadata(updateData, input.update);\n } catch (error) {\n throw isolateDocumentSyncUpdateError({\n cause: error,\n responseUpdate: input.update,\n stage: \"loro_metadata\",\n updateId: input.update.id,\n });\n }\n return {\n ...(input.update.checkpointKind === undefined\n ? {}\n : { checkpointKind: input.update.checkpointKind }),\n ...(input.update.checkpointPayloadKind === undefined\n ? {}\n : { checkpointPayloadKind: input.update.checkpointPayloadKind }),\n id: input.update.id,\n partialEndVersionVector: input.update.partialEndVersionVector,\n partialStartVersionVector: input.update.partialStartVersionVector,\n ...(input.update.sourceVersionVector === undefined\n ? {}\n : { sourceVersionVector: input.update.sourceVersionVector }),\n updateData,\n };\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { createDocument } from "../../../internal/loro/index.js";
2
- import type { DocumentSyncResponse } from "../../../internal/validators/response/index.js";
3
- import type { DecryptedDocumentSyncUpdate, SyncRemoteDocumentResult } from "./types.js";
1
+ import { createDocument } from "../../../../internal/loro/index.js";
2
+ import type { DocumentSyncResponse } from "../../../../internal/validators/response/index.js";
3
+ import type { DecryptedDocumentSyncUpdate, SyncRemoteDocumentResult } from "../types.js";
4
4
  type DocumentSyncUpdateIsolationStage = "content_key" | "decrypt" | "encrypted_record" | "loro_import" | "loro_metadata" | "plaintext_integrity" | "write_header";
5
5
  type SyncResponseUpdate = DocumentSyncResponse["updates"][number];
6
6
  type SyncDocument = Awaited<ReturnType<typeof createDocument>>;
@@ -1,4 +1,4 @@
1
- import { createDocument, exportFullHistorySnapshot, importSnapshot, importUpdates, LoroImportUnresolvedDependenciesError, updateMatchesDocumentHistory, } from "../../../internal/loro/index.js";
1
+ import { createDocument, exportFullHistorySnapshot, importSnapshot, importUpdates, LoroImportUnresolvedDependenciesError, updateMatchesDocumentHistory, } from "../../../../internal/loro/index.js";
2
2
  const MAX_EXACT_ISOLATION_CANDIDATES = 8;
3
3
  const MAX_EXACT_ISOLATION_RETRY_BYTES = 8 * 1024 * 1024;
4
4
  function errorMessage(error) {