mindoodb 0.0.24 → 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 +662 -4
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +2769 -144
- 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 +1371 -34
- 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,220 @@
|
|
|
1
|
+
import { AclRuleDoc, DefaultAccessPolicyDoc, RuleType, TrustedWitnessDoc } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Time-travel directory state (docs/accesscontrol.md §8).
|
|
4
|
+
*
|
|
5
|
+
* We keep an in-memory, copy-on-write chain of directory snapshots keyed by the
|
|
6
|
+
* **trusted time** of directory changes, so we can answer "what was allowed at
|
|
7
|
+
* time `T`?" quickly — including while materializing a database from scratch.
|
|
8
|
+
*
|
|
9
|
+
* The chain is built incrementally from the directory's change iteration. Each
|
|
10
|
+
* applied directory document yields a NEW node that shares, by pointer, every
|
|
11
|
+
* map that did not change (so memory stays compact), and replaces only the map
|
|
12
|
+
* it touched. Reads at the head answer "now"; reads at an earlier node answer a
|
|
13
|
+
* historic question.
|
|
14
|
+
*
|
|
15
|
+
* Trusted time of an entry follows the version-aware rule (see
|
|
16
|
+
* `core/storeEntryTime.ts` `entryTrustedTime`): it is the entry's `receivedAt`
|
|
17
|
+
* when witnessed; for an un-witnessed entry it is the wall-clock `now` if the
|
|
18
|
+
* entry is versioned (written in the witness era — provisional, "waiting to be
|
|
19
|
+
* pushed") or its stable `createdAt` if it is legacy (pre-witness, already
|
|
20
|
+
* synced and never to be witnessed). This chain consumes the trusted time the
|
|
21
|
+
* changefeed already computed via that rule, so it needs no separate fallback.
|
|
22
|
+
*/
|
|
23
|
+
/** A user's grant as projected into a directory-state node (§6.5, §8). */
|
|
24
|
+
export interface UserGrantSnapshot {
|
|
25
|
+
/** `username_hash` the grant is keyed by (the value written on the doc). */
|
|
26
|
+
usernameHash: string;
|
|
27
|
+
/** All currently-granted signing public keys (array or legacy scalar). */
|
|
28
|
+
signingKeys: string[];
|
|
29
|
+
/** All currently-granted encryption public keys. */
|
|
30
|
+
encryptionKeys: string[];
|
|
31
|
+
/** Signing keys whose device must wipe the local tenant (`wipeRequestedForSigningKeys`). */
|
|
32
|
+
wipeRequestedSigningKeys: string[];
|
|
33
|
+
/** Whether the grant is active (not revoked, has at least one signing key). */
|
|
34
|
+
active: boolean;
|
|
35
|
+
}
|
|
36
|
+
/** A group as projected into a node, mirroring the directory's offline merge (§8.1). */
|
|
37
|
+
export interface GroupSnapshot {
|
|
38
|
+
/** Normalized (lowercase) group name. */
|
|
39
|
+
name: string;
|
|
40
|
+
/** Member hashes (union across same-named docs). */
|
|
41
|
+
memberHashes: string[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A single immutable snapshot of directory state covering every directory entry
|
|
45
|
+
* whose trusted time is `<= trustedTimeUpperBound`. Unchanged collections are
|
|
46
|
+
* shared with {@link prev} by reference.
|
|
47
|
+
*/
|
|
48
|
+
export interface DirectoryStateNode {
|
|
49
|
+
/** Covers all directory entries whose trusted time ≤ this bound. */
|
|
50
|
+
trustedTimeUpperBound: number;
|
|
51
|
+
defaultPolicy: DefaultAccessPolicyDoc | null;
|
|
52
|
+
dbPolicies: Map<string, DefaultAccessPolicyDoc>;
|
|
53
|
+
rulesByType: Map<RuleType, AclRuleDoc[]>;
|
|
54
|
+
groupsByName: Map<string, GroupSnapshot>;
|
|
55
|
+
/** Keyed by `username_hash`. */
|
|
56
|
+
usersByHash: Map<string, UserGrantSnapshot>;
|
|
57
|
+
/** Reverse index: signing public key -> grant. */
|
|
58
|
+
bySigningKey: Map<string, UserGrantSnapshot>;
|
|
59
|
+
/** Trusted witness public keys -> witness doc. */
|
|
60
|
+
trustedWitnessKeys: Map<string, TrustedWitnessDoc>;
|
|
61
|
+
/** Previous node in the chain, or null for the genesis node. */
|
|
62
|
+
prev: DirectoryStateNode | null;
|
|
63
|
+
}
|
|
64
|
+
/** The empty genesis node: access control not yet configured. */
|
|
65
|
+
export declare function createGenesisNode(): DirectoryStateNode;
|
|
66
|
+
/**
|
|
67
|
+
* Walk a chain backwards to find the node that covers trusted time `T` — i.e.
|
|
68
|
+
* the most recent node whose `trustedTimeUpperBound <= T`. Returns the genesis
|
|
69
|
+
* node's predecessor semantics (an all-empty node) if `T` precedes everything.
|
|
70
|
+
*/
|
|
71
|
+
export declare function nodeCovering(head: DirectoryStateNode, T: number): DirectoryStateNode;
|
|
72
|
+
/**
|
|
73
|
+
* A single recorded mutation of the {@link DirectoryStateChainBuilder}, in the
|
|
74
|
+
* trusted-time order it was applied. The ordered list of deltas is the compact,
|
|
75
|
+
* serialization-friendly representation of the whole chain: replaying it through
|
|
76
|
+
* the same `apply*` methods rebuilds an identical chain (including its
|
|
77
|
+
* copy-on-write structural sharing) without any decryption or Automerge replay.
|
|
78
|
+
*
|
|
79
|
+
* Payloads are plain JSON-serializable objects, so the log round-trips through
|
|
80
|
+
* `JSON.stringify`/`parse` (unlike the `Map`-based node fields themselves).
|
|
81
|
+
*/
|
|
82
|
+
export type DirectoryRevisionDelta = {
|
|
83
|
+
op: "defaultPolicy";
|
|
84
|
+
t: number;
|
|
85
|
+
policy: DefaultAccessPolicyDoc;
|
|
86
|
+
} | {
|
|
87
|
+
op: "dbPolicy";
|
|
88
|
+
t: number;
|
|
89
|
+
dbid: string;
|
|
90
|
+
policy: DefaultAccessPolicyDoc;
|
|
91
|
+
} | {
|
|
92
|
+
op: "rule";
|
|
93
|
+
t: number;
|
|
94
|
+
rule: AclRuleDoc;
|
|
95
|
+
} | {
|
|
96
|
+
op: "removeRule";
|
|
97
|
+
t: number;
|
|
98
|
+
ruleId: string;
|
|
99
|
+
ruleType: RuleType;
|
|
100
|
+
} | {
|
|
101
|
+
op: "trustedWitness";
|
|
102
|
+
t: number;
|
|
103
|
+
witness: TrustedWitnessDoc;
|
|
104
|
+
} | {
|
|
105
|
+
op: "removeTrustedWitness";
|
|
106
|
+
t: number;
|
|
107
|
+
witnessPublicKey: string;
|
|
108
|
+
} | {
|
|
109
|
+
op: "grant";
|
|
110
|
+
t: number;
|
|
111
|
+
grant: UserGrantSnapshot;
|
|
112
|
+
} | {
|
|
113
|
+
op: "revokeBySigningKey";
|
|
114
|
+
t: number;
|
|
115
|
+
signingKey: string;
|
|
116
|
+
} | {
|
|
117
|
+
op: "groupDoc";
|
|
118
|
+
t: number;
|
|
119
|
+
docId: string;
|
|
120
|
+
name: string;
|
|
121
|
+
memberHashes: string[];
|
|
122
|
+
} | {
|
|
123
|
+
op: "removeGroupDoc";
|
|
124
|
+
t: number;
|
|
125
|
+
docId: string;
|
|
126
|
+
} | {
|
|
127
|
+
op: "setGroups";
|
|
128
|
+
t: number;
|
|
129
|
+
groups: GroupSnapshot[];
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Incrementally builds a {@link DirectoryStateNode} chain as directory
|
|
133
|
+
* documents are observed in trusted-time (iteration) order.
|
|
134
|
+
*
|
|
135
|
+
* The directory is responsible for decrypting documents and passing already
|
|
136
|
+
* structured inputs (e.g. decoded grant key arrays, merged group member
|
|
137
|
+
* hashes); this builder owns only the copy-on-write chain mechanics so it stays
|
|
138
|
+
* pure and unit-testable.
|
|
139
|
+
*/
|
|
140
|
+
export declare class DirectoryStateChainBuilder {
|
|
141
|
+
private head;
|
|
142
|
+
/**
|
|
143
|
+
* Ordered log of every mutation, used to serialize/rebuild the chain (see
|
|
144
|
+
* {@link exportDeltaLog} / {@link importDeltaLog}).
|
|
145
|
+
*/
|
|
146
|
+
private deltaLog;
|
|
147
|
+
/**
|
|
148
|
+
* Per-group-document member contributions, keyed by group document id, used
|
|
149
|
+
* to recompute the union-by-name {@link GroupSnapshot} map incrementally as
|
|
150
|
+
* individual group documents are revised (§8.1). Not part of the chain nodes;
|
|
151
|
+
* rebuilt deterministically when {@link importDeltaLog} replays the log.
|
|
152
|
+
*/
|
|
153
|
+
private groupContributions;
|
|
154
|
+
/** The current head node ("now"). */
|
|
155
|
+
getHead(): DirectoryStateNode;
|
|
156
|
+
/** The node covering trusted time `T`. */
|
|
157
|
+
getStateAt(T: number): DirectoryStateNode;
|
|
158
|
+
/** Reset to the empty genesis node (used on a full rebuild). */
|
|
159
|
+
reset(): void;
|
|
160
|
+
/**
|
|
161
|
+
* The ordered mutation log. This is the compact on-disk representation of the
|
|
162
|
+
* chain; persist it and rebuild later with {@link importDeltaLog}.
|
|
163
|
+
*/
|
|
164
|
+
exportDeltaLog(): DirectoryRevisionDelta[];
|
|
165
|
+
/**
|
|
166
|
+
* Rebuild the chain by replaying a previously {@link exportDeltaLog}-ed log
|
|
167
|
+
* through the same `apply*` methods. Pure in-memory: no decryption, no
|
|
168
|
+
* Automerge — and it reconstructs the copy-on-write structural sharing.
|
|
169
|
+
*/
|
|
170
|
+
importDeltaLog(deltas: DirectoryRevisionDelta[]): void;
|
|
171
|
+
/**
|
|
172
|
+
* Push a new node derived from the current head, replacing exactly one
|
|
173
|
+
* collection (`mutate` receives a working copy of the head to mutate in
|
|
174
|
+
* place) and sharing the rest by reference. `trustedTime` becomes the node's
|
|
175
|
+
* upper bound; it must be monotonically non-decreasing across calls.
|
|
176
|
+
*/
|
|
177
|
+
private push;
|
|
178
|
+
/** Apply the tenant default policy document. */
|
|
179
|
+
applyDefaultPolicy(policy: DefaultAccessPolicyDoc, trustedTime: number): void;
|
|
180
|
+
/** Apply a per-database policy document. */
|
|
181
|
+
applyDbPolicy(dbid: string, policy: DefaultAccessPolicyDoc, trustedTime: number): void;
|
|
182
|
+
/** Apply an access-control rule document (replaces any rule with the same id). */
|
|
183
|
+
applyRule(rule: AclRuleDoc, trustedTime: number): void;
|
|
184
|
+
/** Remove a rule (e.g. its document was deleted). */
|
|
185
|
+
removeRule(ruleId: string, ruleType: RuleType, trustedTime: number): void;
|
|
186
|
+
/** Apply a trusted-witness document, keyed by its public key. */
|
|
187
|
+
applyTrustedWitness(witness: TrustedWitnessDoc, trustedTime: number): void;
|
|
188
|
+
/** Remove a trusted witness (rotation: drop the old doc). */
|
|
189
|
+
removeTrustedWitness(witnessPublicKey: string, trustedTime: number): void;
|
|
190
|
+
/** Apply (insert or replace) a user grant, keyed by `username_hash`. */
|
|
191
|
+
applyGrant(grant: UserGrantSnapshot, trustedTime: number): void;
|
|
192
|
+
/**
|
|
193
|
+
* Mark a grant revoked by signing key (legacy standalone `revokeaccess`
|
|
194
|
+
* compatibility, §8.1). If the key belongs to a known grant, the grant is
|
|
195
|
+
* deactivated.
|
|
196
|
+
*/
|
|
197
|
+
revokeBySigningKey(signingKey: string, trustedTime: number): void;
|
|
198
|
+
/**
|
|
199
|
+
* Apply (insert or replace) a single group document's contribution, keyed by
|
|
200
|
+
* its document id, at trusted time `T`. Because several documents may share a
|
|
201
|
+
* group name (offline merge, §8.1), the resulting `groupsByName[name]` is the
|
|
202
|
+
* union of member hashes across every contributing document seen so far.
|
|
203
|
+
*/
|
|
204
|
+
applyGroupDoc(docId: string, name: string, memberHashes: string[], trustedTime: number): void;
|
|
205
|
+
/** Drop a group document's contribution (e.g. it was deleted), at time `T`. */
|
|
206
|
+
removeGroupDoc(docId: string, trustedTime: number): void;
|
|
207
|
+
/**
|
|
208
|
+
* Recompute the union-by-name {@link GroupSnapshot} for `name` from the
|
|
209
|
+
* current per-document contributions and push a node at trusted time `T`.
|
|
210
|
+
* Removes the entry when no contributing document remains.
|
|
211
|
+
*/
|
|
212
|
+
private recomputeGroup;
|
|
213
|
+
/**
|
|
214
|
+
* Replace the full set of groups (mirrors the directory's post-merge result).
|
|
215
|
+
* Retained for direct/unit use; the directory feed prefers the per-revision
|
|
216
|
+
* {@link applyGroupDoc} / {@link removeGroupDoc}.
|
|
217
|
+
*/
|
|
218
|
+
setGroups(groups: Map<string, GroupSnapshot>, trustedTime: number): void;
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=DirectoryStateNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DirectoryStateNode.d.ts","sourceRoot":"","sources":["../../../src/core/accesscontrol/DirectoryStateNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DirectoryStateChainBuilder = void 0;
|
|
4
|
+
exports.createGenesisNode = createGenesisNode;
|
|
5
|
+
exports.nodeCovering = nodeCovering;
|
|
6
|
+
/** The empty genesis node: access control not yet configured. */
|
|
7
|
+
function createGenesisNode() {
|
|
8
|
+
return {
|
|
9
|
+
trustedTimeUpperBound: Number.NEGATIVE_INFINITY,
|
|
10
|
+
defaultPolicy: null,
|
|
11
|
+
dbPolicies: new Map(),
|
|
12
|
+
rulesByType: new Map(),
|
|
13
|
+
groupsByName: new Map(),
|
|
14
|
+
usersByHash: new Map(),
|
|
15
|
+
bySigningKey: new Map(),
|
|
16
|
+
trustedWitnessKeys: new Map(),
|
|
17
|
+
prev: null,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Walk a chain backwards to find the node that covers trusted time `T` — i.e.
|
|
22
|
+
* the most recent node whose `trustedTimeUpperBound <= T`. Returns the genesis
|
|
23
|
+
* node's predecessor semantics (an all-empty node) if `T` precedes everything.
|
|
24
|
+
*/
|
|
25
|
+
function nodeCovering(head, T) {
|
|
26
|
+
let node = head;
|
|
27
|
+
while (node && node.trustedTimeUpperBound > T) {
|
|
28
|
+
node = node.prev;
|
|
29
|
+
}
|
|
30
|
+
return node ?? createGenesisNode();
|
|
31
|
+
}
|
|
32
|
+
/** Rebuild a reverse signing-key index from a `usersByHash` map. */
|
|
33
|
+
function buildBySigningKey(usersByHash) {
|
|
34
|
+
const bySigningKey = new Map();
|
|
35
|
+
for (const grant of usersByHash.values()) {
|
|
36
|
+
if (!grant.active)
|
|
37
|
+
continue;
|
|
38
|
+
for (const key of grant.signingKeys) {
|
|
39
|
+
bySigningKey.set(key, grant);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return bySigningKey;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Incrementally builds a {@link DirectoryStateNode} chain as directory
|
|
46
|
+
* documents are observed in trusted-time (iteration) order.
|
|
47
|
+
*
|
|
48
|
+
* The directory is responsible for decrypting documents and passing already
|
|
49
|
+
* structured inputs (e.g. decoded grant key arrays, merged group member
|
|
50
|
+
* hashes); this builder owns only the copy-on-write chain mechanics so it stays
|
|
51
|
+
* pure and unit-testable.
|
|
52
|
+
*/
|
|
53
|
+
class DirectoryStateChainBuilder {
|
|
54
|
+
constructor() {
|
|
55
|
+
this.head = createGenesisNode();
|
|
56
|
+
/**
|
|
57
|
+
* Ordered log of every mutation, used to serialize/rebuild the chain (see
|
|
58
|
+
* {@link exportDeltaLog} / {@link importDeltaLog}).
|
|
59
|
+
*/
|
|
60
|
+
this.deltaLog = [];
|
|
61
|
+
/**
|
|
62
|
+
* Per-group-document member contributions, keyed by group document id, used
|
|
63
|
+
* to recompute the union-by-name {@link GroupSnapshot} map incrementally as
|
|
64
|
+
* individual group documents are revised (§8.1). Not part of the chain nodes;
|
|
65
|
+
* rebuilt deterministically when {@link importDeltaLog} replays the log.
|
|
66
|
+
*/
|
|
67
|
+
this.groupContributions = new Map();
|
|
68
|
+
}
|
|
69
|
+
/** The current head node ("now"). */
|
|
70
|
+
getHead() {
|
|
71
|
+
return this.head;
|
|
72
|
+
}
|
|
73
|
+
/** The node covering trusted time `T`. */
|
|
74
|
+
getStateAt(T) {
|
|
75
|
+
return nodeCovering(this.head, T);
|
|
76
|
+
}
|
|
77
|
+
/** Reset to the empty genesis node (used on a full rebuild). */
|
|
78
|
+
reset() {
|
|
79
|
+
this.head = createGenesisNode();
|
|
80
|
+
this.deltaLog = [];
|
|
81
|
+
this.groupContributions.clear();
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The ordered mutation log. This is the compact on-disk representation of the
|
|
85
|
+
* chain; persist it and rebuild later with {@link importDeltaLog}.
|
|
86
|
+
*/
|
|
87
|
+
exportDeltaLog() {
|
|
88
|
+
return this.deltaLog;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Rebuild the chain by replaying a previously {@link exportDeltaLog}-ed log
|
|
92
|
+
* through the same `apply*` methods. Pure in-memory: no decryption, no
|
|
93
|
+
* Automerge — and it reconstructs the copy-on-write structural sharing.
|
|
94
|
+
*/
|
|
95
|
+
importDeltaLog(deltas) {
|
|
96
|
+
this.reset();
|
|
97
|
+
for (const d of deltas) {
|
|
98
|
+
switch (d.op) {
|
|
99
|
+
case "defaultPolicy":
|
|
100
|
+
this.applyDefaultPolicy(d.policy, d.t);
|
|
101
|
+
break;
|
|
102
|
+
case "dbPolicy":
|
|
103
|
+
this.applyDbPolicy(d.dbid, d.policy, d.t);
|
|
104
|
+
break;
|
|
105
|
+
case "rule":
|
|
106
|
+
this.applyRule(d.rule, d.t);
|
|
107
|
+
break;
|
|
108
|
+
case "removeRule":
|
|
109
|
+
this.removeRule(d.ruleId, d.ruleType, d.t);
|
|
110
|
+
break;
|
|
111
|
+
case "trustedWitness":
|
|
112
|
+
this.applyTrustedWitness(d.witness, d.t);
|
|
113
|
+
break;
|
|
114
|
+
case "removeTrustedWitness":
|
|
115
|
+
this.removeTrustedWitness(d.witnessPublicKey, d.t);
|
|
116
|
+
break;
|
|
117
|
+
case "grant":
|
|
118
|
+
this.applyGrant(d.grant, d.t);
|
|
119
|
+
break;
|
|
120
|
+
case "revokeBySigningKey":
|
|
121
|
+
this.revokeBySigningKey(d.signingKey, d.t);
|
|
122
|
+
break;
|
|
123
|
+
case "groupDoc":
|
|
124
|
+
this.applyGroupDoc(d.docId, d.name, d.memberHashes, d.t);
|
|
125
|
+
break;
|
|
126
|
+
case "removeGroupDoc":
|
|
127
|
+
this.removeGroupDoc(d.docId, d.t);
|
|
128
|
+
break;
|
|
129
|
+
case "setGroups":
|
|
130
|
+
this.setGroups(new Map(d.groups.map((g) => [g.name, g])), d.t);
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Push a new node derived from the current head, replacing exactly one
|
|
137
|
+
* collection (`mutate` receives a working copy of the head to mutate in
|
|
138
|
+
* place) and sharing the rest by reference. `trustedTime` becomes the node's
|
|
139
|
+
* upper bound; it must be monotonically non-decreasing across calls.
|
|
140
|
+
*/
|
|
141
|
+
push(trustedTime, mutate) {
|
|
142
|
+
const bound = Math.max(trustedTime, this.head.trustedTimeUpperBound);
|
|
143
|
+
const next = {
|
|
144
|
+
trustedTimeUpperBound: bound,
|
|
145
|
+
defaultPolicy: this.head.defaultPolicy,
|
|
146
|
+
dbPolicies: this.head.dbPolicies,
|
|
147
|
+
rulesByType: this.head.rulesByType,
|
|
148
|
+
groupsByName: this.head.groupsByName,
|
|
149
|
+
usersByHash: this.head.usersByHash,
|
|
150
|
+
bySigningKey: this.head.bySigningKey,
|
|
151
|
+
trustedWitnessKeys: this.head.trustedWitnessKeys,
|
|
152
|
+
prev: this.head,
|
|
153
|
+
};
|
|
154
|
+
mutate(next);
|
|
155
|
+
this.head = next;
|
|
156
|
+
}
|
|
157
|
+
/** Apply the tenant default policy document. */
|
|
158
|
+
applyDefaultPolicy(policy, trustedTime) {
|
|
159
|
+
this.deltaLog.push({ op: "defaultPolicy", t: trustedTime, policy });
|
|
160
|
+
this.push(trustedTime, (next) => {
|
|
161
|
+
next.defaultPolicy = policy;
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/** Apply a per-database policy document. */
|
|
165
|
+
applyDbPolicy(dbid, policy, trustedTime) {
|
|
166
|
+
this.deltaLog.push({ op: "dbPolicy", t: trustedTime, dbid, policy });
|
|
167
|
+
this.push(trustedTime, (next) => {
|
|
168
|
+
next.dbPolicies = new Map(this.head.dbPolicies);
|
|
169
|
+
next.dbPolicies.set(dbid, policy);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/** Apply an access-control rule document (replaces any rule with the same id). */
|
|
173
|
+
applyRule(rule, trustedTime) {
|
|
174
|
+
this.deltaLog.push({ op: "rule", t: trustedTime, rule });
|
|
175
|
+
this.push(trustedTime, (next) => {
|
|
176
|
+
next.rulesByType = new Map(this.head.rulesByType);
|
|
177
|
+
const existing = next.rulesByType.get(rule.type) ?? [];
|
|
178
|
+
const replaced = existing.filter((r) => r.ruleId !== rule.ruleId);
|
|
179
|
+
replaced.push(rule);
|
|
180
|
+
next.rulesByType.set(rule.type, replaced);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/** Remove a rule (e.g. its document was deleted). */
|
|
184
|
+
removeRule(ruleId, ruleType, trustedTime) {
|
|
185
|
+
this.deltaLog.push({ op: "removeRule", t: trustedTime, ruleId, ruleType });
|
|
186
|
+
this.push(trustedTime, (next) => {
|
|
187
|
+
next.rulesByType = new Map(this.head.rulesByType);
|
|
188
|
+
const existing = next.rulesByType.get(ruleType) ?? [];
|
|
189
|
+
next.rulesByType.set(ruleType, existing.filter((r) => r.ruleId !== ruleId));
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/** Apply a trusted-witness document, keyed by its public key. */
|
|
193
|
+
applyTrustedWitness(witness, trustedTime) {
|
|
194
|
+
this.deltaLog.push({ op: "trustedWitness", t: trustedTime, witness });
|
|
195
|
+
this.push(trustedTime, (next) => {
|
|
196
|
+
next.trustedWitnessKeys = new Map(this.head.trustedWitnessKeys);
|
|
197
|
+
next.trustedWitnessKeys.set(witness.witnessPublicKey, witness);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
/** Remove a trusted witness (rotation: drop the old doc). */
|
|
201
|
+
removeTrustedWitness(witnessPublicKey, trustedTime) {
|
|
202
|
+
this.deltaLog.push({ op: "removeTrustedWitness", t: trustedTime, witnessPublicKey });
|
|
203
|
+
this.push(trustedTime, (next) => {
|
|
204
|
+
next.trustedWitnessKeys = new Map(this.head.trustedWitnessKeys);
|
|
205
|
+
next.trustedWitnessKeys.delete(witnessPublicKey);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
/** Apply (insert or replace) a user grant, keyed by `username_hash`. */
|
|
209
|
+
applyGrant(grant, trustedTime) {
|
|
210
|
+
this.deltaLog.push({ op: "grant", t: trustedTime, grant });
|
|
211
|
+
this.push(trustedTime, (next) => {
|
|
212
|
+
next.usersByHash = new Map(this.head.usersByHash);
|
|
213
|
+
next.usersByHash.set(grant.usernameHash, grant);
|
|
214
|
+
next.bySigningKey = buildBySigningKey(next.usersByHash);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Mark a grant revoked by signing key (legacy standalone `revokeaccess`
|
|
219
|
+
* compatibility, §8.1). If the key belongs to a known grant, the grant is
|
|
220
|
+
* deactivated.
|
|
221
|
+
*/
|
|
222
|
+
revokeBySigningKey(signingKey, trustedTime) {
|
|
223
|
+
const grant = this.head.bySigningKey.get(signingKey);
|
|
224
|
+
if (!grant)
|
|
225
|
+
return;
|
|
226
|
+
this.deltaLog.push({ op: "revokeBySigningKey", t: trustedTime, signingKey });
|
|
227
|
+
this.push(trustedTime, (next) => {
|
|
228
|
+
next.usersByHash = new Map(this.head.usersByHash);
|
|
229
|
+
const deactivated = { ...grant, active: false };
|
|
230
|
+
next.usersByHash.set(deactivated.usernameHash, deactivated);
|
|
231
|
+
next.bySigningKey = buildBySigningKey(next.usersByHash);
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Apply (insert or replace) a single group document's contribution, keyed by
|
|
236
|
+
* its document id, at trusted time `T`. Because several documents may share a
|
|
237
|
+
* group name (offline merge, §8.1), the resulting `groupsByName[name]` is the
|
|
238
|
+
* union of member hashes across every contributing document seen so far.
|
|
239
|
+
*/
|
|
240
|
+
applyGroupDoc(docId, name, memberHashes, trustedTime) {
|
|
241
|
+
this.deltaLog.push({ op: "groupDoc", t: trustedTime, docId, name, memberHashes });
|
|
242
|
+
this.groupContributions.set(docId, { name, memberHashes: [...memberHashes] });
|
|
243
|
+
this.recomputeGroup(name, trustedTime);
|
|
244
|
+
}
|
|
245
|
+
/** Drop a group document's contribution (e.g. it was deleted), at time `T`. */
|
|
246
|
+
removeGroupDoc(docId, trustedTime) {
|
|
247
|
+
const existing = this.groupContributions.get(docId);
|
|
248
|
+
if (!existing)
|
|
249
|
+
return;
|
|
250
|
+
this.deltaLog.push({ op: "removeGroupDoc", t: trustedTime, docId });
|
|
251
|
+
this.groupContributions.delete(docId);
|
|
252
|
+
this.recomputeGroup(existing.name, trustedTime);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Recompute the union-by-name {@link GroupSnapshot} for `name` from the
|
|
256
|
+
* current per-document contributions and push a node at trusted time `T`.
|
|
257
|
+
* Removes the entry when no contributing document remains.
|
|
258
|
+
*/
|
|
259
|
+
recomputeGroup(name, trustedTime) {
|
|
260
|
+
const memberHashes = new Set();
|
|
261
|
+
let hasContribution = false;
|
|
262
|
+
for (const contribution of this.groupContributions.values()) {
|
|
263
|
+
if (contribution.name !== name)
|
|
264
|
+
continue;
|
|
265
|
+
hasContribution = true;
|
|
266
|
+
for (const hash of contribution.memberHashes) {
|
|
267
|
+
memberHashes.add(hash);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
this.push(trustedTime, (next) => {
|
|
271
|
+
next.groupsByName = new Map(this.head.groupsByName);
|
|
272
|
+
if (hasContribution) {
|
|
273
|
+
next.groupsByName.set(name, { name, memberHashes: [...memberHashes] });
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
next.groupsByName.delete(name);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Replace the full set of groups (mirrors the directory's post-merge result).
|
|
282
|
+
* Retained for direct/unit use; the directory feed prefers the per-revision
|
|
283
|
+
* {@link applyGroupDoc} / {@link removeGroupDoc}.
|
|
284
|
+
*/
|
|
285
|
+
setGroups(groups, trustedTime) {
|
|
286
|
+
this.deltaLog.push({
|
|
287
|
+
op: "setGroups",
|
|
288
|
+
t: trustedTime,
|
|
289
|
+
groups: [...groups.values()].map((g) => ({ name: g.name, memberHashes: [...g.memberHashes] })),
|
|
290
|
+
});
|
|
291
|
+
this.push(trustedTime, (next) => {
|
|
292
|
+
next.groupsByName = new Map(groups);
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
exports.DirectoryStateChainBuilder = DirectoryStateChainBuilder;
|
|
297
|
+
//# sourceMappingURL=DirectoryStateNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DirectoryStateNode.js","sourceRoot":"","sources":["../../../src/core/accesscontrol/DirectoryStateNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { RevisionCursor } from "../types";
|
|
2
|
+
import type { LocalCacheStore } from "../cache/LocalCacheStore";
|
|
3
|
+
import type { ICacheable } from "../cache/CacheManager";
|
|
4
|
+
import { DirectoryStateChainBuilder, DirectoryStateNode } from "./DirectoryStateNode";
|
|
5
|
+
/** LocalCacheStore `type` namespace for the persisted time-travel chain. */
|
|
6
|
+
export declare const DIR_TT_CACHE_TYPE = "dir-tt";
|
|
7
|
+
/** Bump when {@link PersistedTimeTravelState} layout changes (forces rebuild). */
|
|
8
|
+
export declare const DIR_TT_CACHE_VERSION = 2;
|
|
9
|
+
/**
|
|
10
|
+
* A directory document revision the chain is built from, keyed by its store
|
|
11
|
+
* entry id. This is the raw projection *input* (not the projected delta), so the
|
|
12
|
+
* chain can be rebuilt deterministically in trusted-time order by re-running the
|
|
13
|
+
* projection — which is what makes out-of-order arrivals and re-stamps correct:
|
|
14
|
+
* a re-emitted revision simply replaces the prior record for the same entry id,
|
|
15
|
+
* and the whole chain is replayed in sorted order.
|
|
16
|
+
*/
|
|
17
|
+
export interface StoredDirectoryRevision {
|
|
18
|
+
/** Store entry id of the change (the upsert key). */
|
|
19
|
+
entryId: string;
|
|
20
|
+
/** Document the revision belongs to. */
|
|
21
|
+
docId: string;
|
|
22
|
+
/** The document's merged data as of this revision's trusted-time frontier. */
|
|
23
|
+
data: Record<string, unknown>;
|
|
24
|
+
/** Whether the document was deleted as of this revision. */
|
|
25
|
+
deleted: boolean;
|
|
26
|
+
/** Trusted time of this revision (orders the chain). */
|
|
27
|
+
trustedTime: number;
|
|
28
|
+
/** True when the trusted time came from a witness `receivedAt`. */
|
|
29
|
+
witnessed: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Projection callback: apply a single stored revision onto the chain builder.
|
|
33
|
+
* Supplied by the directory (which owns group-name normalization and the
|
|
34
|
+
* document-classification rules) so this index stays decoupled from projection.
|
|
35
|
+
*/
|
|
36
|
+
export type ProjectRevisionFn = (builder: DirectoryStateChainBuilder, revision: StoredDirectoryRevision) => void;
|
|
37
|
+
/**
|
|
38
|
+
* Owns the access-control time-travel directory-state chain (docs/accesscontrol.md
|
|
39
|
+
* §8): the {@link DirectoryStateChainBuilder}, its resume cursor in the
|
|
40
|
+
* revision-grain changefeed, and the bookkeeping needed to keep it current and
|
|
41
|
+
* persist it.
|
|
42
|
+
*
|
|
43
|
+
* Revisions are accumulated keyed by store entry id ({@link upsertRevision}) and
|
|
44
|
+
* the chain is (re)built by replaying them through the projection in
|
|
45
|
+
* `(trustedTime, entryId)` order ({@link rebuild}). Keying by entry id makes
|
|
46
|
+
* out-of-order arrivals and witness re-stamps correct without any special-casing
|
|
47
|
+
* in the chain builder: a later, earlier-trusted-time revision (or a re-stamped
|
|
48
|
+
* one) just replaces the prior record and the chain is replayed in sorted order,
|
|
49
|
+
* so every node — head and intermediate — reflects the correct trusted-time
|
|
50
|
+
* frontier. Replaying is pure in-memory (no decryption / Automerge), so it is
|
|
51
|
+
* cheap relative to the (incremental) feed that produces the revisions.
|
|
52
|
+
*/
|
|
53
|
+
export declare class DirectoryTimeTravelIndex implements ICacheable {
|
|
54
|
+
private readonly cachePrefix;
|
|
55
|
+
/** The copy-on-write chain. Rebuilt from {@link revisions} via the projection. */
|
|
56
|
+
readonly builder: DirectoryStateChainBuilder;
|
|
57
|
+
/** Revisions the chain is built from, keyed by store entry id. */
|
|
58
|
+
private revisions;
|
|
59
|
+
/** Resume position in the revision feed; `null` means "scan from genesis". */
|
|
60
|
+
cursor: RevisionCursor | null;
|
|
61
|
+
/**
|
|
62
|
+
* The directory DB's latest `changeSeq` observed at the last build. Persisted
|
|
63
|
+
* and restored so the directory's fast-path gate (see
|
|
64
|
+
* `BaseMindooTenantDirectory.ensureTimeTravelCurrent`) can short-circuit on a
|
|
65
|
+
* cold start when nothing has changed since the chain was flushed.
|
|
66
|
+
*/
|
|
67
|
+
lastChangeSeq: number | null;
|
|
68
|
+
/**
|
|
69
|
+
* Entry ids of folded revisions that are still un-witnessed (their trusted
|
|
70
|
+
* time is the provisional `now`). Exposed via {@link hasUnwitnessed} so the
|
|
71
|
+
* directory knows the head overlay may still move when the entries are
|
|
72
|
+
* witnessed.
|
|
73
|
+
*/
|
|
74
|
+
private unwitnessedIds;
|
|
75
|
+
private dirty;
|
|
76
|
+
constructor(cachePrefix: string);
|
|
77
|
+
/** The head node ("now"). */
|
|
78
|
+
getHead(): DirectoryStateNode;
|
|
79
|
+
/** The node covering trusted time `T`. */
|
|
80
|
+
getStateAt(T: number): DirectoryStateNode;
|
|
81
|
+
/** Reset to an empty chain (full rebuild from genesis). */
|
|
82
|
+
reset(): void;
|
|
83
|
+
/**
|
|
84
|
+
* Record the directory DB's latest `changeSeq` as of this build so it can be
|
|
85
|
+
* persisted alongside the chain and consulted by the cold-start gate.
|
|
86
|
+
*/
|
|
87
|
+
recordChangeSeq(changeSeq: number | null): void;
|
|
88
|
+
/**
|
|
89
|
+
* True while any folded revision is still un-witnessed: its provisional
|
|
90
|
+
* trusted time (`now`) may move when the entry is later witnessed, so consumers
|
|
91
|
+
* should not treat the head as final for those entries.
|
|
92
|
+
*/
|
|
93
|
+
hasUnwitnessed(): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Insert or replace a revision (keyed by entry id) and advance the resume
|
|
96
|
+
* cursor. Replacing an existing entry id is how out-of-order arrivals and
|
|
97
|
+
* witness re-stamps are absorbed; the chain is rebuilt separately via
|
|
98
|
+
* {@link rebuild}. Returns true if the stored set changed.
|
|
99
|
+
*/
|
|
100
|
+
upsertRevision(revision: StoredDirectoryRevision, cursor: RevisionCursor | null): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Rebuild the chain by replaying every stored revision through `project` in
|
|
103
|
+
* `(trustedTime, entryId)` order. Pure in-memory: no decryption, no Automerge.
|
|
104
|
+
*/
|
|
105
|
+
rebuild(project: ProjectRevisionFn): void;
|
|
106
|
+
getCachePrefix(): string;
|
|
107
|
+
hasDirtyState(): boolean;
|
|
108
|
+
clearDirty(): void;
|
|
109
|
+
flushToCache(store: LocalCacheStore): Promise<number>;
|
|
110
|
+
/**
|
|
111
|
+
* Restore the persisted revisions and cursor. Returns false (leaving the index
|
|
112
|
+
* empty) on a cache miss or version mismatch, so the caller does a full
|
|
113
|
+
* rebuild. The caller must invoke {@link rebuild} afterwards to materialize the
|
|
114
|
+
* chain (this index does not own the projection).
|
|
115
|
+
*/
|
|
116
|
+
restoreFromCache(store: LocalCacheStore): Promise<boolean>;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=DirectoryTimeTravelIndex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DirectoryTimeTravelIndex.d.ts","sourceRoot":"","sources":["../../../src/core/accesscontrol/DirectoryTimeTravelIndex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEtF,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACtC,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,4DAA4D;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,SAAS,EAAE,OAAO,CAAC;CACpB;AAoBD;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,OAAO,EAAE,0BAA0B,EACnC,QAAQ,EAAE,uBAAuB,KAC9B,IAAI,CAAC;AAEV;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,wBAAyB,YAAW,UAAU;IA4B7C,OAAO,CAAC,QAAQ,CAAC,WAAW;IA3BxC,kFAAkF;IAClF,QAAQ,CAAC,OAAO,6BAAoC;IAEpD,kEAAkE;IAClE,OAAO,CAAC,SAAS,CAA8C;IAE/D,8EAA8E;IAC9E,MAAM,EAAE,cAAc,GAAG,IAAI,CAAQ;IAErC;;;;;OAKG;IACH,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpC;;;;;OAKG;IACH,OAAO,CAAC,cAAc,CAAqB;IAE3C,OAAO,CAAC,KAAK,CAAS;gBAEO,WAAW,EAAE,MAAM;IAEhD,6BAA6B;IAC7B,OAAO,IAAI,kBAAkB;IAI7B,0CAA0C;IAC1C,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,kBAAkB;IAIzC,2DAA2D;IAC3D,KAAK,IAAI,IAAI;IASb;;;OAGG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAO/C;;;;OAIG;IACH,cAAc,IAAI,OAAO;IAIzB;;;;;OAKG;IACH,cAAc,CAAC,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO;IAoBzF;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAezC,cAAc,IAAI,MAAM;IAIxB,aAAa,IAAI,OAAO;IAIxB,UAAU,IAAI,IAAI;IAIZ,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAY3D;;;;;OAKG;IACG,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;CAkBjE"}
|