mindoodb 0.0.23 → 0.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README-server.md +9 -1
- package/README.md +5 -3
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +24 -5
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.d.ts +14 -2
- package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.js +124 -27
- package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +159 -4
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +334 -25
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts +9 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts.map +1 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js +77 -5
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js.map +1 -1
- package/dist/browser/index.mjs +103 -0
- package/dist/core/BaseMindooDB.d.ts +697 -4
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +3273 -180
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +192 -1
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +633 -88
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts +770 -10
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +2715 -292
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/BaseMindooTenantFactory.d.ts +2 -0
- package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantFactory.js +20 -0
- package/dist/core/BaseMindooTenantFactory.js.map +1 -1
- package/dist/core/accesscontrol/AccessDeniedError.d.ts +22 -0
- package/dist/core/accesscontrol/AccessDeniedError.d.ts.map +1 -0
- package/dist/core/accesscontrol/AccessDeniedError.js +28 -0
- package/dist/core/accesscontrol/AccessDeniedError.js.map +1 -0
- package/dist/core/accesscontrol/DirectoryStateNode.d.ts +220 -0
- package/dist/core/accesscontrol/DirectoryStateNode.d.ts.map +1 -0
- package/dist/core/accesscontrol/DirectoryStateNode.js +297 -0
- package/dist/core/accesscontrol/DirectoryStateNode.js.map +1 -0
- package/dist/core/accesscontrol/DirectoryTimeTravelIndex.d.ts +118 -0
- package/dist/core/accesscontrol/DirectoryTimeTravelIndex.d.ts.map +1 -0
- package/dist/core/accesscontrol/DirectoryTimeTravelIndex.js +173 -0
- package/dist/core/accesscontrol/DirectoryTimeTravelIndex.js.map +1 -0
- package/dist/core/accesscontrol/directoryProjection.d.ts +26 -0
- package/dist/core/accesscontrol/directoryProjection.d.ts.map +1 -0
- package/dist/core/accesscontrol/directoryProjection.js +174 -0
- package/dist/core/accesscontrol/directoryProjection.js.map +1 -0
- package/dist/core/accesscontrol/evaluate.d.ts +77 -0
- package/dist/core/accesscontrol/evaluate.d.ts.map +1 -0
- package/dist/core/accesscontrol/evaluate.js +206 -0
- package/dist/core/accesscontrol/evaluate.js.map +1 -0
- package/dist/core/accesscontrol/grantKeys.d.ts +113 -0
- package/dist/core/accesscontrol/grantKeys.d.ts.map +1 -0
- package/dist/core/accesscontrol/grantKeys.js +302 -0
- package/dist/core/accesscontrol/grantKeys.js.map +1 -0
- package/dist/core/accesscontrol/keyBagReconciler.d.ts +22 -0
- package/dist/core/accesscontrol/keyBagReconciler.d.ts.map +1 -0
- package/dist/core/accesscontrol/keyBagReconciler.js +3 -0
- package/dist/core/accesscontrol/keyBagReconciler.js.map +1 -0
- package/dist/core/accesscontrol/materializationGuard.d.ts +89 -0
- package/dist/core/accesscontrol/materializationGuard.d.ts.map +1 -0
- package/dist/core/accesscontrol/materializationGuard.js +69 -0
- package/dist/core/accesscontrol/materializationGuard.js.map +1 -0
- package/dist/core/accesscontrol/quarantine.d.ts +65 -0
- package/dist/core/accesscontrol/quarantine.d.ts.map +1 -0
- package/dist/core/accesscontrol/quarantine.js +79 -0
- package/dist/core/accesscontrol/quarantine.js.map +1 -0
- package/dist/core/accesscontrol/receiptValidation.d.ts +113 -0
- package/dist/core/accesscontrol/receiptValidation.d.ts.map +1 -0
- package/dist/core/accesscontrol/receiptValidation.js +142 -0
- package/dist/core/accesscontrol/receiptValidation.js.map +1 -0
- package/dist/core/accesscontrol/timestamp/Ed25519WitnessProvider.d.ts +31 -0
- package/dist/core/accesscontrol/timestamp/Ed25519WitnessProvider.d.ts.map +1 -0
- package/dist/core/accesscontrol/timestamp/Ed25519WitnessProvider.js +66 -0
- package/dist/core/accesscontrol/timestamp/Ed25519WitnessProvider.js.map +1 -0
- package/dist/core/accesscontrol/timestamp/TimestampProvider.d.ts +79 -0
- package/dist/core/accesscontrol/timestamp/TimestampProvider.d.ts.map +1 -0
- package/dist/core/accesscontrol/timestamp/TimestampProvider.js +22 -0
- package/dist/core/accesscontrol/timestamp/TimestampProvider.js.map +1 -0
- package/dist/core/accesscontrol/types.d.ts +825 -0
- package/dist/core/accesscontrol/types.d.ts.map +1 -0
- package/dist/core/accesscontrol/types.js +534 -0
- package/dist/core/accesscontrol/types.js.map +1 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts +9 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js +54 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts +38 -2
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.js +199 -26
- package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -1
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts +17 -3
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.d.ts +58 -4
- package/dist/core/appendonlystores/network/types.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.js +4 -0
- package/dist/core/appendonlystores/network/types.js.map +1 -1
- package/dist/core/appendonlystores/scanUtils.d.ts +27 -0
- package/dist/core/appendonlystores/scanUtils.d.ts.map +1 -0
- package/dist/core/appendonlystores/scanUtils.js +87 -0
- package/dist/core/appendonlystores/scanUtils.js.map +1 -0
- package/dist/core/appendonlystores/types.d.ts +23 -2
- package/dist/core/appendonlystores/types.d.ts.map +1 -1
- package/dist/core/cache/CacheManager.d.ts +13 -3
- package/dist/core/cache/CacheManager.d.ts.map +1 -1
- package/dist/core/cache/CacheManager.js +7 -4
- package/dist/core/cache/CacheManager.js.map +1 -1
- package/dist/core/crypto/EntrySignature.d.ts +137 -0
- package/dist/core/crypto/EntrySignature.d.ts.map +1 -0
- package/dist/core/crypto/EntrySignature.js +210 -0
- package/dist/core/crypto/EntrySignature.js.map +1 -0
- package/dist/core/crypto/MindooDocSigner.d.ts.map +1 -1
- package/dist/core/crypto/MindooDocSigner.js +6 -2
- package/dist/core/crypto/MindooDocSigner.js.map +1 -1
- package/dist/core/crypto/WitnessReceipt.d.ts +137 -0
- package/dist/core/crypto/WitnessReceipt.d.ts.map +1 -0
- package/dist/core/crypto/WitnessReceipt.js +182 -0
- package/dist/core/crypto/WitnessReceipt.js.map +1 -0
- package/dist/core/crypto/encryptedFields.d.ts +27 -0
- package/dist/core/crypto/encryptedFields.d.ts.map +1 -0
- package/dist/core/crypto/encryptedFields.js +58 -0
- package/dist/core/crypto/encryptedFields.js.map +1 -0
- package/dist/core/crypto/pbkdf2Iterations.d.ts +12 -0
- package/dist/core/crypto/pbkdf2Iterations.d.ts.map +1 -1
- package/dist/core/crypto/pbkdf2Iterations.js +23 -0
- package/dist/core/crypto/pbkdf2Iterations.js.map +1 -1
- package/dist/core/crypto/privateKeyEncryption.d.ts.map +1 -1
- package/dist/core/crypto/privateKeyEncryption.js +3 -1
- package/dist/core/crypto/privateKeyEncryption.js.map +1 -1
- package/dist/core/databaseIdValidation.d.ts +1 -1
- package/dist/core/databaseIdValidation.d.ts.map +1 -1
- package/dist/core/databaseIdValidation.js +4 -4
- package/dist/core/databaseIdValidation.js.map +1 -1
- package/dist/core/errors.d.ts +26 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +42 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/expressions/builder.d.ts +102 -0
- package/dist/core/expressions/builder.d.ts.map +1 -0
- package/dist/core/expressions/builder.js +249 -0
- package/dist/core/expressions/builder.js.map +1 -0
- package/dist/core/expressions/evaluateExpression.d.ts +78 -0
- package/dist/core/expressions/evaluateExpression.d.ts.map +1 -0
- package/dist/core/expressions/evaluateExpression.js +386 -0
- package/dist/core/expressions/evaluateExpression.js.map +1 -0
- package/dist/core/expressions/formulaSource.d.ts +24 -0
- package/dist/core/expressions/formulaSource.d.ts.map +1 -0
- package/dist/core/expressions/formulaSource.js +765 -0
- package/dist/core/expressions/formulaSource.js.map +1 -0
- package/dist/core/expressions/index.d.ts +8 -0
- package/dist/core/expressions/index.d.ts.map +1 -0
- package/dist/core/expressions/index.js +46 -0
- package/dist/core/expressions/index.js.map +1 -0
- package/dist/core/expressions/metadata.d.ts +23 -0
- package/dist/core/expressions/metadata.d.ts.map +1 -0
- package/dist/core/expressions/metadata.js +191 -0
- package/dist/core/expressions/metadata.js.map +1 -0
- package/dist/core/expressions/types.d.ts +164 -0
- package/dist/core/expressions/types.d.ts.map +1 -0
- package/dist/core/expressions/types.js +3 -0
- package/dist/core/expressions/types.js.map +1 -0
- package/dist/core/extraction/types.d.ts +47 -0
- package/dist/core/extraction/types.d.ts.map +1 -0
- package/dist/core/extraction/types.js +42 -0
- package/dist/core/extraction/types.js.map +1 -0
- package/dist/core/index.d.ts +13 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +113 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/indexing/createViewDataProvider.d.ts +84 -0
- package/dist/core/indexing/createViewDataProvider.d.ts.map +1 -0
- package/dist/core/indexing/createViewDataProvider.js +139 -0
- package/dist/core/indexing/createViewDataProvider.js.map +1 -0
- package/dist/core/indexing/fulltext/DocumentFullTextIndex.d.ts +180 -0
- package/dist/core/indexing/fulltext/DocumentFullTextIndex.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/DocumentFullTextIndex.js +548 -0
- package/dist/core/indexing/fulltext/DocumentFullTextIndex.js.map +1 -0
- package/dist/core/indexing/fulltext/SearchEngineAdapter.d.ts +69 -0
- package/dist/core/indexing/fulltext/SearchEngineAdapter.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/SearchEngineAdapter.js +183 -0
- package/dist/core/indexing/fulltext/SearchEngineAdapter.js.map +1 -0
- package/dist/core/indexing/fulltext/extractFulltextText.d.ts +34 -0
- package/dist/core/indexing/fulltext/extractFulltextText.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/extractFulltextText.js +129 -0
- package/dist/core/indexing/fulltext/extractFulltextText.js.map +1 -0
- package/dist/core/indexing/fulltext/index.d.ts +5 -0
- package/dist/core/indexing/fulltext/index.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/index.js +20 -0
- package/dist/core/indexing/fulltext/index.js.map +1 -0
- package/dist/core/indexing/fulltext/types.d.ts +168 -0
- package/dist/core/indexing/fulltext/types.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/types.js +89 -0
- package/dist/core/indexing/fulltext/types.js.map +1 -0
- package/dist/core/indexing/summary/DocumentSummaryStore.d.ts +137 -0
- package/dist/core/indexing/summary/DocumentSummaryStore.d.ts.map +1 -0
- package/dist/core/indexing/summary/DocumentSummaryStore.js +438 -0
- package/dist/core/indexing/summary/DocumentSummaryStore.js.map +1 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.d.ts +72 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.d.ts.map +1 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.js +221 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.js.map +1 -0
- package/dist/core/indexing/summary/extractSummaryFields.d.ts +75 -0
- package/dist/core/indexing/summary/extractSummaryFields.d.ts.map +1 -0
- package/dist/core/indexing/summary/extractSummaryFields.js +266 -0
- package/dist/core/indexing/summary/extractSummaryFields.js.map +1 -0
- package/dist/core/indexing/summary/index.d.ts +5 -0
- package/dist/core/indexing/summary/index.d.ts.map +1 -0
- package/dist/core/indexing/summary/index.js +23 -0
- package/dist/core/indexing/summary/index.js.map +1 -0
- package/dist/core/indexing/summary/types.d.ts +119 -0
- package/dist/core/indexing/summary/types.d.ts.map +1 -0
- package/dist/core/indexing/summary/types.js +81 -0
- package/dist/core/indexing/summary/types.js.map +1 -0
- package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.d.ts +47 -1
- package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts +24 -8
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js +96 -41
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js.map +1 -1
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.d.ts +2 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.js +8 -3
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualView.d.ts +111 -5
- package/dist/core/indexing/virtualviews/VirtualView.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualView.js +266 -75
- package/dist/core/indexing/virtualviews/VirtualView.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewColumn.d.ts +12 -0
- package/dist/core/indexing/virtualviews/VirtualViewColumn.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewColumn.js +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewColumn.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts +12 -0
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js +66 -5
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewFactory.d.ts +50 -6
- package/dist/core/indexing/virtualviews/VirtualViewFactory.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewFactory.js +54 -12
- package/dist/core/indexing/virtualviews/VirtualViewFactory.js.map +1 -1
- package/dist/core/indexing/virtualviews/index.d.ts +3 -3
- package/dist/core/indexing/virtualviews/index.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/index.js.map +1 -1
- package/dist/core/indexing/virtualviews/types.d.ts +6 -0
- package/dist/core/indexing/virtualviews/types.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/types.js +11 -3
- package/dist/core/indexing/virtualviews/types.js.map +1 -1
- package/dist/core/keys/KeyBag.d.ts +25 -0
- package/dist/core/keys/KeyBag.d.ts.map +1 -1
- package/dist/core/keys/KeyBag.js +37 -1
- package/dist/core/keys/KeyBag.js.map +1 -1
- package/dist/core/query/executeQuery.d.ts +18 -0
- package/dist/core/query/executeQuery.d.ts.map +1 -0
- package/dist/core/query/executeQuery.js +313 -0
- package/dist/core/query/executeQuery.js.map +1 -0
- package/dist/core/query/index.d.ts +5 -0
- package/dist/core/query/index.d.ts.map +1 -0
- package/dist/core/query/index.js +14 -0
- package/dist/core/query/index.js.map +1 -0
- package/dist/core/query/queryLive.d.ts +27 -0
- package/dist/core/query/queryLive.d.ts.map +1 -0
- package/dist/core/query/queryLive.js +104 -0
- package/dist/core/query/queryLive.js.map +1 -0
- package/dist/core/query/queryView.d.ts +156 -0
- package/dist/core/query/queryView.d.ts.map +1 -0
- package/dist/core/query/queryView.js +266 -0
- package/dist/core/query/queryView.js.map +1 -0
- package/dist/core/query/types.d.ts +121 -0
- package/dist/core/query/types.d.ts.map +1 -0
- package/dist/core/query/types.js +18 -0
- package/dist/core/query/types.js.map +1 -0
- package/dist/core/storeEntryTime.d.ts +57 -0
- package/dist/core/storeEntryTime.d.ts.map +1 -0
- package/dist/core/storeEntryTime.js +72 -0
- package/dist/core/storeEntryTime.js.map +1 -0
- package/dist/core/types.d.ts +1509 -39
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +13 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/uri/MindooURI.d.ts +53 -1
- package/dist/core/uri/MindooURI.d.ts.map +1 -1
- package/dist/core/uri/MindooURI.js +135 -0
- package/dist/core/uri/MindooURI.js.map +1 -1
- package/dist/core/utils/urlSafety.d.ts +46 -0
- package/dist/core/utils/urlSafety.d.ts.map +1 -0
- package/dist/core/utils/urlSafety.js +144 -0
- package/dist/core/utils/urlSafety.js.map +1 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +14 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +95 -4
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -1
- package/dist/node/server/CapabilityMatcher.d.ts +10 -0
- package/dist/node/server/CapabilityMatcher.d.ts.map +1 -1
- package/dist/node/server/CapabilityMatcher.js +14 -2
- package/dist/node/server/CapabilityMatcher.js.map +1 -1
- package/dist/node/server/MindooDBServer.d.ts.map +1 -1
- package/dist/node/server/MindooDBServer.js +117 -8
- package/dist/node/server/MindooDBServer.js.map +1 -1
- package/dist/node/server/PurgedDocRegistry.d.ts +32 -0
- package/dist/node/server/PurgedDocRegistry.d.ts.map +1 -0
- package/dist/node/server/PurgedDocRegistry.js +94 -0
- package/dist/node/server/PurgedDocRegistry.js.map +1 -0
- package/dist/node/server/ServerSync.d.ts.map +1 -1
- package/dist/node/server/ServerSync.js +5 -2
- package/dist/node/server/ServerSync.js.map +1 -1
- package/dist/node/server/SystemAdminAuth.d.ts +10 -0
- package/dist/node/server/SystemAdminAuth.d.ts.map +1 -1
- package/dist/node/server/SystemAdminAuth.js +25 -0
- package/dist/node/server/SystemAdminAuth.js.map +1 -1
- package/dist/node/server/TenantManager.d.ts +95 -1
- package/dist/node/server/TenantManager.d.ts.map +1 -1
- package/dist/node/server/TenantManager.js +382 -15
- package/dist/node/server/TenantManager.js.map +1 -1
- package/dist/node/server/config.d.ts.map +1 -1
- package/dist/node/server/config.js +5 -1
- package/dist/node/server/config.js.map +1 -1
- package/dist/node/server/types.d.ts +29 -3
- package/dist/node/server/types.d.ts.map +1 -1
- package/dist/node/server/types.js +12 -0
- package/dist/node/server/types.js.map +1 -1
- package/dist/node/server/validation.d.ts +6 -0
- package/dist/node/server/validation.d.ts.map +1 -1
- package/dist/node/server/validation.js +7 -1
- package/dist/node/server/validation.js.map +1 -1
- package/package.json +4 -3
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.d.ts +0 -8
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.d.ts.map +0 -1
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.js +0 -16
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.js.map +0 -1
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +0 -68
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +0 -1
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.js +0 -659
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.js.map +0 -1
- package/dist/node/attachments/writeAttachmentToFile.d.ts +0 -15
- package/dist/node/attachments/writeAttachmentToFile.d.ts.map +0 -1
- package/dist/node/attachments/writeAttachmentToFile.js +0 -73
- package/dist/node/attachments/writeAttachmentToFile.js.map +0 -1
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DirectoryTimeTravelIndex = exports.DIR_TT_CACHE_VERSION = exports.DIR_TT_CACHE_TYPE = void 0;
|
|
4
|
+
const DirectoryStateNode_1 = require("./DirectoryStateNode");
|
|
5
|
+
/** LocalCacheStore `type` namespace for the persisted time-travel chain. */
|
|
6
|
+
exports.DIR_TT_CACHE_TYPE = "dir-tt";
|
|
7
|
+
/** Bump when {@link PersistedTimeTravelState} layout changes (forces rebuild). */
|
|
8
|
+
exports.DIR_TT_CACHE_VERSION = 2;
|
|
9
|
+
/**
|
|
10
|
+
* Owns the access-control time-travel directory-state chain (docs/accesscontrol.md
|
|
11
|
+
* §8): the {@link DirectoryStateChainBuilder}, its resume cursor in the
|
|
12
|
+
* revision-grain changefeed, and the bookkeeping needed to keep it current and
|
|
13
|
+
* persist it.
|
|
14
|
+
*
|
|
15
|
+
* Revisions are accumulated keyed by store entry id ({@link upsertRevision}) and
|
|
16
|
+
* the chain is (re)built by replaying them through the projection in
|
|
17
|
+
* `(trustedTime, entryId)` order ({@link rebuild}). Keying by entry id makes
|
|
18
|
+
* out-of-order arrivals and witness re-stamps correct without any special-casing
|
|
19
|
+
* in the chain builder: a later, earlier-trusted-time revision (or a re-stamped
|
|
20
|
+
* one) just replaces the prior record and the chain is replayed in sorted order,
|
|
21
|
+
* so every node — head and intermediate — reflects the correct trusted-time
|
|
22
|
+
* frontier. Replaying is pure in-memory (no decryption / Automerge), so it is
|
|
23
|
+
* cheap relative to the (incremental) feed that produces the revisions.
|
|
24
|
+
*/
|
|
25
|
+
class DirectoryTimeTravelIndex {
|
|
26
|
+
constructor(cachePrefix) {
|
|
27
|
+
this.cachePrefix = cachePrefix;
|
|
28
|
+
/** The copy-on-write chain. Rebuilt from {@link revisions} via the projection. */
|
|
29
|
+
this.builder = new DirectoryStateNode_1.DirectoryStateChainBuilder();
|
|
30
|
+
/** Revisions the chain is built from, keyed by store entry id. */
|
|
31
|
+
this.revisions = new Map();
|
|
32
|
+
/** Resume position in the revision feed; `null` means "scan from genesis". */
|
|
33
|
+
this.cursor = null;
|
|
34
|
+
/**
|
|
35
|
+
* The directory DB's latest `changeSeq` observed at the last build. Persisted
|
|
36
|
+
* and restored so the directory's fast-path gate (see
|
|
37
|
+
* `BaseMindooTenantDirectory.ensureTimeTravelCurrent`) can short-circuit on a
|
|
38
|
+
* cold start when nothing has changed since the chain was flushed.
|
|
39
|
+
*/
|
|
40
|
+
this.lastChangeSeq = null;
|
|
41
|
+
/**
|
|
42
|
+
* Entry ids of folded revisions that are still un-witnessed (their trusted
|
|
43
|
+
* time is the provisional `now`). Exposed via {@link hasUnwitnessed} so the
|
|
44
|
+
* directory knows the head overlay may still move when the entries are
|
|
45
|
+
* witnessed.
|
|
46
|
+
*/
|
|
47
|
+
this.unwitnessedIds = new Set();
|
|
48
|
+
this.dirty = false;
|
|
49
|
+
}
|
|
50
|
+
/** The head node ("now"). */
|
|
51
|
+
getHead() {
|
|
52
|
+
return this.builder.getHead();
|
|
53
|
+
}
|
|
54
|
+
/** The node covering trusted time `T`. */
|
|
55
|
+
getStateAt(T) {
|
|
56
|
+
return this.builder.getStateAt(T);
|
|
57
|
+
}
|
|
58
|
+
/** Reset to an empty chain (full rebuild from genesis). */
|
|
59
|
+
reset() {
|
|
60
|
+
this.builder.reset();
|
|
61
|
+
this.revisions.clear();
|
|
62
|
+
this.cursor = null;
|
|
63
|
+
this.lastChangeSeq = null;
|
|
64
|
+
this.unwitnessedIds.clear();
|
|
65
|
+
this.dirty = true;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Record the directory DB's latest `changeSeq` as of this build so it can be
|
|
69
|
+
* persisted alongside the chain and consulted by the cold-start gate.
|
|
70
|
+
*/
|
|
71
|
+
recordChangeSeq(changeSeq) {
|
|
72
|
+
if (this.lastChangeSeq !== changeSeq) {
|
|
73
|
+
this.lastChangeSeq = changeSeq;
|
|
74
|
+
this.dirty = true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* True while any folded revision is still un-witnessed: its provisional
|
|
79
|
+
* trusted time (`now`) may move when the entry is later witnessed, so consumers
|
|
80
|
+
* should not treat the head as final for those entries.
|
|
81
|
+
*/
|
|
82
|
+
hasUnwitnessed() {
|
|
83
|
+
return this.unwitnessedIds.size > 0;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Insert or replace a revision (keyed by entry id) and advance the resume
|
|
87
|
+
* cursor. Replacing an existing entry id is how out-of-order arrivals and
|
|
88
|
+
* witness re-stamps are absorbed; the chain is rebuilt separately via
|
|
89
|
+
* {@link rebuild}. Returns true if the stored set changed.
|
|
90
|
+
*/
|
|
91
|
+
upsertRevision(revision, cursor) {
|
|
92
|
+
this.cursor = cursor;
|
|
93
|
+
if (revision.witnessed) {
|
|
94
|
+
this.unwitnessedIds.delete(revision.entryId);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
this.unwitnessedIds.add(revision.entryId);
|
|
98
|
+
}
|
|
99
|
+
const prev = this.revisions.get(revision.entryId);
|
|
100
|
+
const changed = !prev ||
|
|
101
|
+
prev.trustedTime !== revision.trustedTime ||
|
|
102
|
+
prev.deleted !== revision.deleted ||
|
|
103
|
+
prev.witnessed !== revision.witnessed ||
|
|
104
|
+
prev.docId !== revision.docId ||
|
|
105
|
+
JSON.stringify(prev.data) !== JSON.stringify(revision.data);
|
|
106
|
+
this.revisions.set(revision.entryId, revision);
|
|
107
|
+
this.dirty = true;
|
|
108
|
+
return changed;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Rebuild the chain by replaying every stored revision through `project` in
|
|
112
|
+
* `(trustedTime, entryId)` order. Pure in-memory: no decryption, no Automerge.
|
|
113
|
+
*/
|
|
114
|
+
rebuild(project) {
|
|
115
|
+
const sorted = [...this.revisions.values()].sort((a, b) => a.trustedTime !== b.trustedTime
|
|
116
|
+
? a.trustedTime - b.trustedTime
|
|
117
|
+
: a.entryId.localeCompare(b.entryId));
|
|
118
|
+
this.builder.reset();
|
|
119
|
+
for (const revision of sorted) {
|
|
120
|
+
project(this.builder, revision);
|
|
121
|
+
}
|
|
122
|
+
this.dirty = true;
|
|
123
|
+
}
|
|
124
|
+
// ---- ICacheable -------------------------------------------------------
|
|
125
|
+
getCachePrefix() {
|
|
126
|
+
return this.cachePrefix;
|
|
127
|
+
}
|
|
128
|
+
hasDirtyState() {
|
|
129
|
+
return this.dirty;
|
|
130
|
+
}
|
|
131
|
+
clearDirty() {
|
|
132
|
+
this.dirty = false;
|
|
133
|
+
}
|
|
134
|
+
async flushToCache(store) {
|
|
135
|
+
const state = {
|
|
136
|
+
version: exports.DIR_TT_CACHE_VERSION,
|
|
137
|
+
cursor: this.cursor,
|
|
138
|
+
unwitnessedIds: [...this.unwitnessedIds],
|
|
139
|
+
revisions: [...this.revisions.values()],
|
|
140
|
+
lastChangeSeq: this.lastChangeSeq,
|
|
141
|
+
};
|
|
142
|
+
await store.put(exports.DIR_TT_CACHE_TYPE, this.cachePrefix, new TextEncoder().encode(JSON.stringify(state)));
|
|
143
|
+
return 1;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Restore the persisted revisions and cursor. Returns false (leaving the index
|
|
147
|
+
* empty) on a cache miss or version mismatch, so the caller does a full
|
|
148
|
+
* rebuild. The caller must invoke {@link rebuild} afterwards to materialize the
|
|
149
|
+
* chain (this index does not own the projection).
|
|
150
|
+
*/
|
|
151
|
+
async restoreFromCache(store) {
|
|
152
|
+
const bytes = await store.get(exports.DIR_TT_CACHE_TYPE, this.cachePrefix);
|
|
153
|
+
if (!bytes)
|
|
154
|
+
return false;
|
|
155
|
+
let state;
|
|
156
|
+
try {
|
|
157
|
+
state = JSON.parse(new TextDecoder().decode(bytes));
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
if (state.version !== exports.DIR_TT_CACHE_VERSION)
|
|
163
|
+
return false;
|
|
164
|
+
this.revisions = new Map((state.revisions ?? []).map((r) => [r.entryId, r]));
|
|
165
|
+
this.cursor = state.cursor ?? null;
|
|
166
|
+
this.lastChangeSeq = state.lastChangeSeq ?? null;
|
|
167
|
+
this.unwitnessedIds = new Set(state.unwitnessedIds ?? []);
|
|
168
|
+
this.dirty = false;
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.DirectoryTimeTravelIndex = DirectoryTimeTravelIndex;
|
|
173
|
+
//# sourceMappingURL=DirectoryTimeTravelIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DirectoryTimeTravelIndex.js","sourceRoot":"","sources":["../../../src/core/accesscontrol/DirectoryTimeTravelIndex.ts"],"names":[],"mappings":";;;AAGA,6DAAsF;AAEtF,4EAA4E;AAC/D,QAAA,iBAAiB,GAAG,QAAQ,CAAC;AAE1C,kFAAkF;AACrE,QAAA,oBAAoB,GAAG,CAAC,CAAC;AAqDtC;;;;;;;;;;;;;;;GAeG;AACH,MAAa,wBAAwB;IA4BnC,YAA6B,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QA3BhD,kFAAkF;QACzE,YAAO,GAAG,IAAI,+CAA0B,EAAE,CAAC;QAEpD,kEAAkE;QAC1D,cAAS,GAAG,IAAI,GAAG,EAAmC,CAAC;QAE/D,8EAA8E;QAC9E,WAAM,GAA0B,IAAI,CAAC;QAErC;;;;;WAKG;QACH,kBAAa,GAAkB,IAAI,CAAC;QAEpC;;;;;WAKG;QACK,mBAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QAEnC,UAAK,GAAG,KAAK,CAAC;IAE6B,CAAC;IAEpD,6BAA6B;IAC7B,OAAO;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,0CAA0C;IAC1C,UAAU,CAAC,CAAS;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,2DAA2D;IAC3D,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,SAAwB;QACtC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,QAAiC,EAAE,MAA6B;QAC7E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,OAAO,GACX,CAAC,IAAI;YACL,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,WAAW;YACzC,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;YACjC,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS;YACrC,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK;YAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,OAA0B;QAChC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACxD,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;YAC7B,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;YAC/B,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CACvC,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,0EAA0E;IAE1E,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAsB;QACvC,MAAM,KAAK,GAA6B;YACtC,OAAO,EAAE,4BAAoB;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;YACxC,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACvC,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC;QACF,MAAM,KAAK,CAAC,GAAG,CAAC,yBAAiB,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtG,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CAAC,KAAsB;QAC3C,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,yBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,IAAI,KAA+B,CAAC;QACpC,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAA6B,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,4BAAoB;YAAE,OAAO,KAAK,CAAC;QAEzD,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC;QACjD,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAnKD,4DAmKC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AclRuleDoc, DefaultAccessPolicyDoc, RuleType } from "./types";
|
|
2
|
+
import { DirectoryStateChainBuilder } from "./DirectoryStateNode";
|
|
3
|
+
/** Parse a policy document's fields into a {@link DefaultAccessPolicyDoc}. */
|
|
4
|
+
export declare function parsePolicyDoc(data: Record<string, unknown>): DefaultAccessPolicyDoc;
|
|
5
|
+
/** Parse a rule document's fields into an {@link AclRuleDoc}. */
|
|
6
|
+
export declare function parseRuleDoc(data: Record<string, unknown>, ruleType: RuleType): AclRuleDoc;
|
|
7
|
+
/** A single directory document revision to project onto the time-travel chain. */
|
|
8
|
+
export interface DirectoryRevisionInput {
|
|
9
|
+
docId: string;
|
|
10
|
+
data: Record<string, unknown>;
|
|
11
|
+
deleted: boolean;
|
|
12
|
+
trustedTime: number;
|
|
13
|
+
/** Normalizes a raw group name (e.g. lowercase) for keying group snapshots. */
|
|
14
|
+
normalizeGroupName: (name: string) => string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Classify a single directory document revision and feed it into the
|
|
18
|
+
* time-travel {@link DirectoryStateChainBuilder} at the revision's trusted time
|
|
19
|
+
* (docs/accesscontrol.md §6, §8).
|
|
20
|
+
*
|
|
21
|
+
* This is the revision-grain projection: it is called once per persisted change
|
|
22
|
+
* (not once per merged document), so every intermediate policy/grant/group
|
|
23
|
+
* state becomes its own chain node.
|
|
24
|
+
*/
|
|
25
|
+
export declare function projectDirectoryRevision(builder: DirectoryStateChainBuilder, input: DirectoryRevisionInput): void;
|
|
26
|
+
//# sourceMappingURL=directoryProjection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directoryProjection.d.ts","sourceRoot":"","sources":["../../../src/core/accesscontrol/directoryProjection.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,UAAU,EACV,sBAAsB,EAEtB,QAAQ,EAIT,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,0BAA0B,EAE3B,MAAM,sBAAsB,CAAC;AAI9B,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,sBAAsB,CA+BpF;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAmB1F;AAED,kFAAkF;AAClF,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,0BAA0B,EACnC,KAAK,EAAE,sBAAsB,GAC5B,IAAI,CAyCN"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parsePolicyDoc = parsePolicyDoc;
|
|
4
|
+
exports.parseRuleDoc = parseRuleDoc;
|
|
5
|
+
exports.projectDirectoryRevision = projectDirectoryRevision;
|
|
6
|
+
const grantKeys_1 = require("./grantKeys");
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
const ACL_DB_POLICY_PREFIX = "acl_dbpolicy_";
|
|
9
|
+
/** Parse a policy document's fields into a {@link DefaultAccessPolicyDoc}. */
|
|
10
|
+
function parsePolicyDoc(data) {
|
|
11
|
+
const bool = (v) => (typeof v === "boolean" ? v : undefined);
|
|
12
|
+
// An array of strings, or undefined when absent/malformed (treated as
|
|
13
|
+
// unconstrained). Non-string members are dropped defensively.
|
|
14
|
+
const stringArray = (v) => Array.isArray(v) ? v.filter((s) => typeof s === "string") : undefined;
|
|
15
|
+
return {
|
|
16
|
+
form: types_1.ACCESS_CONTROL_FORM,
|
|
17
|
+
type: "defaultpolicy",
|
|
18
|
+
disableAllAccessChecksAndPolicies: bool(data.disableAllAccessChecksAndPolicies),
|
|
19
|
+
denyDocCreate: bool(data.denyDocCreate),
|
|
20
|
+
denyDocChange: bool(data.denyDocChange),
|
|
21
|
+
denyDocDelete: bool(data.denyDocDelete),
|
|
22
|
+
denyDocUndelete: bool(data.denyDocUndelete),
|
|
23
|
+
denyDocSnapshot: bool(data.denyDocSnapshot),
|
|
24
|
+
denyDocRead: bool(data.denyDocRead),
|
|
25
|
+
defaultCreateKeyId: typeof data.defaultCreateKeyId === "string" ? data.defaultCreateKeyId : undefined,
|
|
26
|
+
databaseCreationPolicy: data.databaseCreationPolicy === "directory-restricted"
|
|
27
|
+
? "directory-restricted"
|
|
28
|
+
: data.databaseCreationPolicy === "open"
|
|
29
|
+
? "open"
|
|
30
|
+
: undefined,
|
|
31
|
+
allowedDbIds: stringArray(data.allowedDbIds),
|
|
32
|
+
requireMetadataSignatureSince: typeof data.requireMetadataSignatureSince === "number" &&
|
|
33
|
+
Number.isFinite(data.requireMetadataSignatureSince)
|
|
34
|
+
? data.requireMetadataSignatureSince
|
|
35
|
+
: undefined,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Parse a rule document's fields into an {@link AclRuleDoc}. */
|
|
39
|
+
function parseRuleDoc(data, ruleType) {
|
|
40
|
+
const usersHashes = Array.isArray(data.users_hashes)
|
|
41
|
+
? data.users_hashes.filter((h) => typeof h === "string")
|
|
42
|
+
: [];
|
|
43
|
+
const withfields = Array.isArray(data.withfields)
|
|
44
|
+
? data.withfields.filter((c) => !!c && typeof c === "object" && typeof c.key === "string")
|
|
45
|
+
: undefined;
|
|
46
|
+
return {
|
|
47
|
+
form: types_1.ACCESS_CONTROL_FORM,
|
|
48
|
+
type: ruleType,
|
|
49
|
+
ruleId: data.ruleId,
|
|
50
|
+
description: typeof data.description === "string" ? data.description : undefined,
|
|
51
|
+
dbid: typeof data.dbid === "string" ? data.dbid : "*",
|
|
52
|
+
withfields,
|
|
53
|
+
users_hashes: usersHashes,
|
|
54
|
+
users_encrypted: typeof data.users_encrypted === "string" ? data.users_encrypted : "",
|
|
55
|
+
action: data.action === "deny" ? "deny" : "allow",
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Classify a single directory document revision and feed it into the
|
|
60
|
+
* time-travel {@link DirectoryStateChainBuilder} at the revision's trusted time
|
|
61
|
+
* (docs/accesscontrol.md §6, §8).
|
|
62
|
+
*
|
|
63
|
+
* This is the revision-grain projection: it is called once per persisted change
|
|
64
|
+
* (not once per merged document), so every intermediate policy/grant/group
|
|
65
|
+
* state becomes its own chain node.
|
|
66
|
+
*/
|
|
67
|
+
function projectDirectoryRevision(builder, input) {
|
|
68
|
+
const { docId, data, deleted, trustedTime } = input;
|
|
69
|
+
// Grant documents (`useroperation`/`grantaccess`). Revocation is expressed by
|
|
70
|
+
// removing keys from the grant in place (§6.5), so applyGrant with an empty
|
|
71
|
+
// key array deactivates the user.
|
|
72
|
+
if (data.form === "useroperation" && data.type === "grantaccess") {
|
|
73
|
+
if (typeof data.username_hash === "string") {
|
|
74
|
+
const signingKeys = (0, grantKeys_1.extractSigningPublicKeys)(data);
|
|
75
|
+
const grant = {
|
|
76
|
+
usernameHash: data.username_hash,
|
|
77
|
+
signingKeys,
|
|
78
|
+
encryptionKeys: (0, grantKeys_1.extractEncryptionPublicKeys)(data),
|
|
79
|
+
wipeRequestedSigningKeys: (0, grantKeys_1.extractWipeRequestedSigningKeys)(data),
|
|
80
|
+
active: signingKeys.length > 0,
|
|
81
|
+
};
|
|
82
|
+
builder.applyGrant(grant, trustedTime);
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Access-control documents (policies, rules, trusted witnesses), §6.
|
|
87
|
+
if (data.form === types_1.ACCESS_CONTROL_FORM) {
|
|
88
|
+
projectAccessControlDoc(builder, docId, data, deleted, trustedTime);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Group documents (§8.1): each document's members contribute to the
|
|
92
|
+
// union-by-name group snapshot, keyed by the document id so revisions and
|
|
93
|
+
// deletions are tracked per document.
|
|
94
|
+
if (data.form === "group" && data.type === "group" && typeof data.groupName === "string") {
|
|
95
|
+
const name = input.normalizeGroupName(data.groupName);
|
|
96
|
+
if (deleted) {
|
|
97
|
+
builder.removeGroupDoc(docId, trustedTime);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const memberHashes = Array.isArray(data.members_hashes)
|
|
101
|
+
? data.members_hashes.filter((h) => typeof h === "string")
|
|
102
|
+
: [];
|
|
103
|
+
builder.applyGroupDoc(docId, name, memberHashes, trustedTime);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Project an `accesscontrol` document onto the chain. Deletions remove. */
|
|
108
|
+
function projectAccessControlDoc(builder, docId, data, deleted, trustedTime) {
|
|
109
|
+
// Default tenant policy / per-database policy share the same shape and are
|
|
110
|
+
// distinguished by their fixed document id (§6.1, §6.2).
|
|
111
|
+
if (data.type === "defaultpolicy") {
|
|
112
|
+
if (deleted)
|
|
113
|
+
return;
|
|
114
|
+
const policy = parsePolicyDoc(data);
|
|
115
|
+
if (docId === types_1.ACL_DEFAULT_POLICY_DOC_ID) {
|
|
116
|
+
builder.applyDefaultPolicy(policy, trustedTime);
|
|
117
|
+
}
|
|
118
|
+
else if (docId.startsWith(ACL_DB_POLICY_PREFIX)) {
|
|
119
|
+
const dbid = (0, types_1.decodeAclIdComponent)(docId.slice(ACL_DB_POLICY_PREFIX.length));
|
|
120
|
+
builder.applyDbPolicy(dbid, policy, trustedTime);
|
|
121
|
+
}
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Key-distribution documents carry no directory-state projection (they are
|
|
125
|
+
// read directly by recipient clients during reconcile); skip them here.
|
|
126
|
+
if (data.type === "keydistribution") {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
// App-distribution documents likewise carry no directory-state projection
|
|
130
|
+
// (recipient Haven clients read them directly during the post-sync reconcile);
|
|
131
|
+
// skip them here.
|
|
132
|
+
if (data.type === "appdistribution") {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// Sync-setup-policy documents likewise carry no directory-state projection
|
|
136
|
+
// (recipient Haven clients read them directly during the post-sync Sync-page
|
|
137
|
+
// reconcile); skip them here.
|
|
138
|
+
if (data.type === "syncsetuppolicy") {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Document-history purge requests carry no directory-state projection (clients
|
|
142
|
+
// and the sync server read them directly during the post-sync purge reconcile);
|
|
143
|
+
// skip them here.
|
|
144
|
+
if (data.type === "dochistorypurge") {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Trusted witness (§6.4).
|
|
148
|
+
if (data.type === "trustedwitness" && typeof data.witnessPublicKey === "string") {
|
|
149
|
+
if (deleted) {
|
|
150
|
+
builder.removeTrustedWitness(data.witnessPublicKey, trustedTime);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
const witness = {
|
|
154
|
+
form: types_1.ACCESS_CONTROL_FORM,
|
|
155
|
+
type: "trustedwitness",
|
|
156
|
+
witnessPublicKey: data.witnessPublicKey,
|
|
157
|
+
serverUrl: typeof data.serverUrl === "string" ? data.serverUrl : undefined,
|
|
158
|
+
};
|
|
159
|
+
builder.applyTrustedWitness(witness, trustedTime);
|
|
160
|
+
}
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Access-control rule (§6.3).
|
|
164
|
+
if (types_1.RULE_TYPES.includes(data.type) && typeof data.ruleId === "string") {
|
|
165
|
+
const ruleType = data.type;
|
|
166
|
+
if (deleted) {
|
|
167
|
+
builder.removeRule(data.ruleId, ruleType, trustedTime);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
builder.applyRule(parseRuleDoc(data, ruleType), trustedTime);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=directoryProjection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directoryProjection.js","sourceRoot":"","sources":["../../../src/core/accesscontrol/directoryProjection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { AccessDecision, PSEUDO_TOKEN_ADMIN, PSEUDO_TOKEN_AUTHOR, RuleType, WithFieldWhen } from "./types";
|
|
2
|
+
import { DirectoryStateNode } from "./DirectoryStateNode";
|
|
3
|
+
/**
|
|
4
|
+
* The pure access-control evaluation engine (docs/accesscontrol.md §7).
|
|
5
|
+
*
|
|
6
|
+
* `evaluateAccess` is a **pure, deterministic function** of its inputs: the
|
|
7
|
+
* operation, the acting user's identity set, the directory-state node covering
|
|
8
|
+
* the entry's trusted time, and the before/after document states. This purity
|
|
9
|
+
* is what makes "quarantine on receipt" compatible with eventual consistency —
|
|
10
|
+
* every honest replica that has synced to the same point computes the identical
|
|
11
|
+
* verdict (§10). There is deliberately no wall-clock input.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* The acting user's resolved identity, used for rule matching and placeholder
|
|
15
|
+
* resolution (§7 step 3). The caller (directory) resolves these from grants,
|
|
16
|
+
* groups, and the username-hash scheme; the engine only consumes them.
|
|
17
|
+
*/
|
|
18
|
+
export interface IdentitySet {
|
|
19
|
+
/** Canonical username, for `${user.username}`. */
|
|
20
|
+
username: string;
|
|
21
|
+
/** Canonical + wildcard variants + groups, for `${user.usernames}`. */
|
|
22
|
+
usernames: string[];
|
|
23
|
+
/** Group names the user belongs to (incl. nested), for `${user.groups}`. */
|
|
24
|
+
groups: string[];
|
|
25
|
+
/**
|
|
26
|
+
* All hashes/tokens the user's identity matches against `users_hashes`:
|
|
27
|
+
* the username hash (v1 + v2), every group hash (incl. nested), and the
|
|
28
|
+
* applicable pseudo-tokens — always `$everyone`; `$admin` if the user is the
|
|
29
|
+
* tenant admin; `$author` if the user authored the document being modified.
|
|
30
|
+
*/
|
|
31
|
+
hashes: Set<string>;
|
|
32
|
+
}
|
|
33
|
+
/** Inputs to {@link evaluateAccess}. */
|
|
34
|
+
export interface EvaluateAccessInput {
|
|
35
|
+
/** The operation being attempted. */
|
|
36
|
+
op: RuleType;
|
|
37
|
+
/** Target database id. */
|
|
38
|
+
dbid: string;
|
|
39
|
+
/** The acting user's identity set. */
|
|
40
|
+
identity: IdentitySet;
|
|
41
|
+
/** Directory-state node covering the entry's trusted time (§8). */
|
|
42
|
+
node: DirectoryStateNode;
|
|
43
|
+
/**
|
|
44
|
+
* The document as it currently exists, before the candidate change
|
|
45
|
+
* (the "before" state). Required to evaluate `when: "before"` clauses.
|
|
46
|
+
*/
|
|
47
|
+
beforeDoc?: Record<string, unknown> | null;
|
|
48
|
+
/**
|
|
49
|
+
* The document with the candidate change applied (the "after" state).
|
|
50
|
+
* Required to evaluate `when: "after"` clauses, including all `doc_create`
|
|
51
|
+
* clauses. The caller computes this (e.g. via `Automerge.clone()` + apply).
|
|
52
|
+
*/
|
|
53
|
+
afterDoc?: Record<string, unknown> | null;
|
|
54
|
+
/**
|
|
55
|
+
* When true, the evaluator runs in **server/Tier 1 mode**: it cannot read
|
|
56
|
+
* encrypted document content, so it ignores Tier 2 rules (those with
|
|
57
|
+
* `withfields`) for the purpose of *denying*, and treats an entry as
|
|
58
|
+
* Tier 1-allowed whenever the only thing that could deny/allow it is a Tier 2
|
|
59
|
+
* rule — leaving that check to clients (§7, §10).
|
|
60
|
+
*/
|
|
61
|
+
isServer?: boolean;
|
|
62
|
+
}
|
|
63
|
+
/** The default `when` for a clause, given the operation (§6.3). */
|
|
64
|
+
export declare function defaultWhenForOp(op: RuleType): WithFieldWhen;
|
|
65
|
+
/**
|
|
66
|
+
* Evaluate access for an operation (§7). The result is fully determined by the
|
|
67
|
+
* inputs; see {@link EvaluateAccessInput}.
|
|
68
|
+
*/
|
|
69
|
+
export declare function evaluateAccess(input: EvaluateAccessInput): AccessDecision;
|
|
70
|
+
/**
|
|
71
|
+
* Convenience: the set of reserved pseudo-tokens an identity always/optionally
|
|
72
|
+
* carries. `$everyone` is always present for registered users; `$admin` and
|
|
73
|
+
* `$author` are added by the caller when applicable.
|
|
74
|
+
*/
|
|
75
|
+
export declare const ALWAYS_PRESENT_PSEUDO_TOKENS: readonly string[];
|
|
76
|
+
export { PSEUDO_TOKEN_ADMIN, PSEUDO_TOKEN_AUTHOR };
|
|
77
|
+
//# sourceMappingURL=evaluate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../../src/core/accesscontrol/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAGd,kBAAkB,EAClB,mBAAmB,EAGnB,QAAQ,EAER,aAAa,EAGd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;;;;OAKG;IACH,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACrB;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,EAAE,EAAE,QAAQ,CAAC;IACb,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,QAAQ,EAAE,WAAW,CAAC;IACtB,mEAAmE;IACnE,IAAI,EAAE,kBAAkB,CAAC;IACzB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1C;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,aAAa,CAE5D;AAUD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,CAuFzE;AA8GD;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,EAAE,SAAS,MAAM,EAA4B,CAAC;AACvF,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC"}
|