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,548 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DocumentFullTextIndex = void 0;
|
|
4
|
+
const types_1 = require("../summary/types");
|
|
5
|
+
const types_2 = require("./types");
|
|
6
|
+
const extractFulltextText_1 = require("./extractFulltextText");
|
|
7
|
+
const SearchEngineAdapter_1 = require("./SearchEngineAdapter");
|
|
8
|
+
/**
|
|
9
|
+
* Attachments above this size are skipped during text extraction: they
|
|
10
|
+
* would have to be fully materialized in memory, and extractable text
|
|
11
|
+
* that large exceeds any sensible per-field cap anyway.
|
|
12
|
+
*/
|
|
13
|
+
const MAX_ATTACHMENT_EXTRACT_BYTES = 16 * 1024 * 1024;
|
|
14
|
+
/**
|
|
15
|
+
* The document full-text index: a changefeed-maintained, encrypted-at-rest
|
|
16
|
+
* search index over extracted document text (see docs/fulltext-search.md).
|
|
17
|
+
*
|
|
18
|
+
* Sits next to the {@link DocumentSummaryStore} as a second derived index:
|
|
19
|
+
* same changefeed pipeline (cursor, resumable backfill, config
|
|
20
|
+
* fingerprint), same encrypted persistence through the tenant's
|
|
21
|
+
* {@link LocalCacheStore}, same `dbsetup` reconciliation (field
|
|
22
|
+
* `fulltextSetup`). Unlike the summary it is OPT-IN (`enabled: true`);
|
|
23
|
+
* text is extracted from the materialized documents the changefeed yields
|
|
24
|
+
* anyway — including long-text and rich-text fields that must stay out of
|
|
25
|
+
* the RAM-resident summary buffer.
|
|
26
|
+
*
|
|
27
|
+
* E2EE note: the index is built client-side from decrypted content, so
|
|
28
|
+
* devices whose KeyBag lacks certain decryption keys index (and find)
|
|
29
|
+
* fewer documents. Purge paths remove entries immediately so plaintext
|
|
30
|
+
* tokens never outlive key revocation.
|
|
31
|
+
*/
|
|
32
|
+
class DocumentFullTextIndex {
|
|
33
|
+
constructor(db, config, options) {
|
|
34
|
+
/** Whether the setup document was already consulted (once per instance). */
|
|
35
|
+
this.setupDocSeeded = false;
|
|
36
|
+
this.cursor = null;
|
|
37
|
+
// --- persistence state ---
|
|
38
|
+
this.cacheManager = null;
|
|
39
|
+
this.cachePrefix = null;
|
|
40
|
+
this.engineDirty = false;
|
|
41
|
+
this.metaDirty = false;
|
|
42
|
+
this.restorePromise = null;
|
|
43
|
+
this.restored = false;
|
|
44
|
+
// --- backfill state (config changed while the index already has content) ---
|
|
45
|
+
this.needsBackfill = false;
|
|
46
|
+
this.backfillCursor = null;
|
|
47
|
+
// --- single-flight update ---
|
|
48
|
+
this.updatePromise = null;
|
|
49
|
+
this.db = db;
|
|
50
|
+
this.hasExplicitConfig = config !== undefined;
|
|
51
|
+
this.config = (0, types_2.resolveFulltextConfig)(config);
|
|
52
|
+
this.configFingerprint = (0, types_2.computeFulltextConfigFingerprint)(this.config);
|
|
53
|
+
this.getAttachmentExtractors = options?.getAttachmentExtractors ?? (() => []);
|
|
54
|
+
this.engine = this.createEngine();
|
|
55
|
+
}
|
|
56
|
+
createEngine() {
|
|
57
|
+
return new SearchEngineAdapter_1.MiniSearchAdapter(this.config.language, this.config.include);
|
|
58
|
+
}
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// Configuration
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
getConfig() {
|
|
63
|
+
return this.config;
|
|
64
|
+
}
|
|
65
|
+
getConfigFingerprint() {
|
|
66
|
+
return this.configFingerprint;
|
|
67
|
+
}
|
|
68
|
+
isEnabled() {
|
|
69
|
+
return this.config.enabled;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Replace the full-text configuration. When the fingerprint changes,
|
|
73
|
+
* the engine is recreated (tokenizer/language and field extraction may
|
|
74
|
+
* differ) and a resumable backfill re-indexes all documents on the next
|
|
75
|
+
* `update()` run. Until the backfill finishes the index reports
|
|
76
|
+
* `"rebuilding"` and serves the (growing) partial result.
|
|
77
|
+
*
|
|
78
|
+
* Calling this marks the configuration as explicit: the index stops
|
|
79
|
+
* following the {@link DB_SETUP_DOC_ID} document.
|
|
80
|
+
*/
|
|
81
|
+
setConfig(config) {
|
|
82
|
+
this.hasExplicitConfig = true;
|
|
83
|
+
this.applyConfig(config);
|
|
84
|
+
}
|
|
85
|
+
/** Shared config-swap logic for explicit and setup-document paths. */
|
|
86
|
+
applyConfig(config) {
|
|
87
|
+
const resolved = (0, types_2.resolveFulltextConfig)(config);
|
|
88
|
+
const fingerprint = (0, types_2.computeFulltextConfigFingerprint)(resolved);
|
|
89
|
+
if (fingerprint === this.configFingerprint) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const hadContent = this.engine.getDocumentCount() > 0 || this.cursor !== null;
|
|
93
|
+
this.config = resolved;
|
|
94
|
+
this.configFingerprint = fingerprint;
|
|
95
|
+
// Unlike the summary the engine state is tokenizer-dependent, so a
|
|
96
|
+
// config change always starts over with a fresh engine.
|
|
97
|
+
this.engine = this.createEngine();
|
|
98
|
+
this.engineDirty = true;
|
|
99
|
+
if (hadContent && this.config.enabled) {
|
|
100
|
+
this.scheduleBackfill();
|
|
101
|
+
}
|
|
102
|
+
this.metaDirty = true;
|
|
103
|
+
this.cacheManager?.markDirty();
|
|
104
|
+
}
|
|
105
|
+
scheduleBackfill() {
|
|
106
|
+
this.needsBackfill = true;
|
|
107
|
+
this.backfillCursor = null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Adopt the configuration from the synced {@link DB_SETUP_DOC_ID}
|
|
111
|
+
* document (its `fulltextSetup` field) unless an explicit configuration
|
|
112
|
+
* was provided in code. Runs once per instance, BEFORE the persisted
|
|
113
|
+
* state is restored, so the fingerprint comparison on restore already
|
|
114
|
+
* sees the setup-document configuration.
|
|
115
|
+
*/
|
|
116
|
+
async seedConfigFromSetupDoc() {
|
|
117
|
+
if (this.setupDocSeeded || this.hasExplicitConfig) {
|
|
118
|
+
this.setupDocSeeded = true;
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.setupDocSeeded = true;
|
|
122
|
+
await this.reloadConfigFromSetupDoc();
|
|
123
|
+
}
|
|
124
|
+
/** Fresh read of the setup document (no-op with an explicit config). */
|
|
125
|
+
async reloadConfigFromSetupDoc() {
|
|
126
|
+
if (this.hasExplicitConfig) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const doc = await this.db.getDocument(types_1.DB_SETUP_DOC_ID);
|
|
131
|
+
const config = (0, types_2.sanitizeFulltextConfig)(doc.getData()[types_2.FULLTEXT_SETUP_FIELD]);
|
|
132
|
+
this.applyConfig(config);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// No setup document (or not readable) → keep the current config.
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Make sure the effective configuration is settled: consults the
|
|
140
|
+
* {@link DB_SETUP_DOC_ID} document once (unless the config was provided
|
|
141
|
+
* in code) and returns the resolved configuration.
|
|
142
|
+
*/
|
|
143
|
+
async ensureConfigLoaded() {
|
|
144
|
+
await this.seedConfigFromSetupDoc();
|
|
145
|
+
return this.config;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* `"full"` when the index reflects the current configuration,
|
|
149
|
+
* `"rebuilding"` while a configuration-change backfill is in progress.
|
|
150
|
+
*/
|
|
151
|
+
getCoverage() {
|
|
152
|
+
return this.needsBackfill ? "rebuilding" : "full";
|
|
153
|
+
}
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
// Reads
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
getSize() {
|
|
158
|
+
return this.engine.getDocumentCount();
|
|
159
|
+
}
|
|
160
|
+
getCursor() {
|
|
161
|
+
return this.cursor;
|
|
162
|
+
}
|
|
163
|
+
/** Index field names currently known (document paths + `_attachments`). */
|
|
164
|
+
getFieldNames() {
|
|
165
|
+
return this.engine.getFieldNames();
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Full-text search. Brings the index up to date first (same catch-up
|
|
169
|
+
* semantics as queries against the summary buffer), then returns
|
|
170
|
+
* matching documents best-score-first.
|
|
171
|
+
*
|
|
172
|
+
* @throws Error when full-text indexing is not enabled for this
|
|
173
|
+
* database (neither via `fulltextSetup` nor an explicit config).
|
|
174
|
+
*/
|
|
175
|
+
async search(query, options) {
|
|
176
|
+
await this.update(options);
|
|
177
|
+
if (!this.config.enabled) {
|
|
178
|
+
throw new Error(`Full-text search is not enabled for this database. ` +
|
|
179
|
+
`Enable it via setFulltextSetup({ enabled: true }) or pass an explicit config to getFullTextIndex().`);
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
hits: this.engine.search(query, options),
|
|
183
|
+
coverage: this.getCoverage(),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Search without a catch-up run — evaluates against the current index
|
|
188
|
+
* state. Used by the query engine, which coordinates update passes
|
|
189
|
+
* itself.
|
|
190
|
+
*/
|
|
191
|
+
searchSync(query, options) {
|
|
192
|
+
return {
|
|
193
|
+
hits: this.engine.search(query, options),
|
|
194
|
+
coverage: this.getCoverage(),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
// Incremental update
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
/**
|
|
201
|
+
* Bring the index up to date with the changefeed. Restores persisted
|
|
202
|
+
* state on first use, then consumes `iterateChangesSince` from the
|
|
203
|
+
* saved cursor and finally works down a pending configuration backfill.
|
|
204
|
+
* While the configuration has `enabled: false` this is a cheap no-op
|
|
205
|
+
* (one setup-document read to detect a later enable).
|
|
206
|
+
*
|
|
207
|
+
* Accepts the same batching/progress/cancellation options as summary
|
|
208
|
+
* updates; an interrupted run resumes from the saved cursors. Calls are
|
|
209
|
+
* single-flight: concurrent callers share one run.
|
|
210
|
+
*/
|
|
211
|
+
async update(options) {
|
|
212
|
+
if (this.updatePromise) {
|
|
213
|
+
return this.updatePromise;
|
|
214
|
+
}
|
|
215
|
+
this.updatePromise = this.runUpdate(options).finally(() => {
|
|
216
|
+
this.updatePromise = null;
|
|
217
|
+
});
|
|
218
|
+
return this.updatePromise;
|
|
219
|
+
}
|
|
220
|
+
async runUpdate(options) {
|
|
221
|
+
await this.seedConfigFromSetupDoc();
|
|
222
|
+
if (!this.config.enabled) {
|
|
223
|
+
// Disabled: don't touch the changefeed (that would materialize
|
|
224
|
+
// documents for nothing). Re-check the setup document so an enable
|
|
225
|
+
// arriving via sync is picked up by the next update call.
|
|
226
|
+
await this.reloadConfigFromSetupDoc();
|
|
227
|
+
if (!this.config.enabled) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
await this.ensureRestored();
|
|
232
|
+
const applyBatchSize = options?.applyBatchSize ?? 100;
|
|
233
|
+
const onProgress = options?.onProgress;
|
|
234
|
+
const signal = options?.signal;
|
|
235
|
+
const countAfter = (cursor) => this.db.countChangesSince?.(cursor) ?? 0;
|
|
236
|
+
const total = onProgress
|
|
237
|
+
? countAfter(this.cursor) + (this.needsBackfill ? countAfter(this.backfillCursor) : 0)
|
|
238
|
+
: 0;
|
|
239
|
+
let processed = 0;
|
|
240
|
+
let processedInBatch = 0;
|
|
241
|
+
// Returns true when the run should stop after the current batch.
|
|
242
|
+
const stopRequested = () => {
|
|
243
|
+
const callbackStop = onProgress?.({ processed, total, origin: "fulltext" }) === false;
|
|
244
|
+
return callbackStop || signal?.aborted === true;
|
|
245
|
+
};
|
|
246
|
+
if (signal?.aborted) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
// Pass 1: incremental changefeed consumption from the main cursor.
|
|
250
|
+
for await (const { doc, cursor } of this.db.iterateChangesSince(this.cursor)) {
|
|
251
|
+
await this.applyDocument(doc.getId(), doc);
|
|
252
|
+
this.cursor = cursor;
|
|
253
|
+
processed++;
|
|
254
|
+
processedInBatch++;
|
|
255
|
+
if (processedInBatch >= applyBatchSize) {
|
|
256
|
+
processedInBatch = 0;
|
|
257
|
+
this.cacheManager?.markDirty();
|
|
258
|
+
if (stopRequested()) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (!this.config.enabled) {
|
|
263
|
+
// A dbsetup change in the feed disabled the index: stop consuming.
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Pass 2: configuration backfill (re-index everything with the new
|
|
268
|
+
// config/engine). The feed yields each document's latest state once,
|
|
269
|
+
// so plain re-adds converge; docs changing mid-backfill are
|
|
270
|
+
// re-processed by the next pass 1 anyway.
|
|
271
|
+
if (this.needsBackfill) {
|
|
272
|
+
for await (const { doc, cursor } of this.db.iterateChangesSince(this.backfillCursor)) {
|
|
273
|
+
await this.applyDocument(doc.getId(), doc);
|
|
274
|
+
this.backfillCursor = cursor;
|
|
275
|
+
processed++;
|
|
276
|
+
processedInBatch++;
|
|
277
|
+
if (processedInBatch >= applyBatchSize) {
|
|
278
|
+
processedInBatch = 0;
|
|
279
|
+
this.cacheManager?.markDirty();
|
|
280
|
+
if (stopRequested()) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (!this.config.enabled) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
this.needsBackfill = false;
|
|
289
|
+
this.backfillCursor = null;
|
|
290
|
+
this.metaDirty = true;
|
|
291
|
+
}
|
|
292
|
+
this.cacheManager?.markDirty();
|
|
293
|
+
if (onProgress) {
|
|
294
|
+
onProgress({ processed, total, origin: "fulltext" });
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
async applyDocument(docId, doc) {
|
|
298
|
+
if (docId === types_1.DB_SETUP_DOC_ID) {
|
|
299
|
+
// The setup document configures the index instead of appearing in
|
|
300
|
+
// it. Config changes (also arriving via sync) recreate the engine
|
|
301
|
+
// and schedule a backfill; a deleted setup document falls back to
|
|
302
|
+
// the default (disabled) config.
|
|
303
|
+
if (!this.hasExplicitConfig) {
|
|
304
|
+
const config = doc.isDeleted()
|
|
305
|
+
? undefined
|
|
306
|
+
: (0, types_2.sanitizeFulltextConfig)(doc.getData()[types_2.FULLTEXT_SETUP_FIELD]);
|
|
307
|
+
this.applyConfig(config);
|
|
308
|
+
}
|
|
309
|
+
if (this.engine.has(docId)) {
|
|
310
|
+
this.engine.remove(docId);
|
|
311
|
+
this.markEngineDirty();
|
|
312
|
+
}
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
if (doc.isDeleted()) {
|
|
316
|
+
if (this.engine.has(docId)) {
|
|
317
|
+
this.engine.remove(docId);
|
|
318
|
+
this.markEngineDirty();
|
|
319
|
+
}
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
const fields = (0, extractFulltextText_1.extractFulltextFields)(doc.getData(), this.config);
|
|
323
|
+
const attachmentText = await this.collectAttachmentText(doc);
|
|
324
|
+
if (attachmentText !== null) {
|
|
325
|
+
fields[types_2.FULLTEXT_ATTACHMENT_FIELD] = attachmentText;
|
|
326
|
+
}
|
|
327
|
+
if (Object.keys(fields).length === 0) {
|
|
328
|
+
if (this.engine.has(docId)) {
|
|
329
|
+
this.engine.remove(docId);
|
|
330
|
+
this.markEngineDirty();
|
|
331
|
+
}
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
this.engine.add(docId, fields);
|
|
335
|
+
this.markEngineDirty();
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Collect the searchable text of a document's attachments into the
|
|
339
|
+
* synthetic {@link FULLTEXT_ATTACHMENT_FIELD} (capped at
|
|
340
|
+
* `maxFieldBytes` like every other index field). Two sources feed it:
|
|
341
|
+
*
|
|
342
|
+
* 1. **Persisted extraction results** (`extractedText` on the
|
|
343
|
+
* attachment entry, written via
|
|
344
|
+
* `MindooDoc.setAttachmentExtractedText()`, e.g. by Haven's OCR
|
|
345
|
+
* service). These are always indexed — the text is already there,
|
|
346
|
+
* costs nothing, and is obviously meant to be searchable.
|
|
347
|
+
* 2. **Registered extractors** (cheap formats: plain text, PDF text
|
|
348
|
+
* layer, Office) — only when `config.attachments` is enabled, and
|
|
349
|
+
* only for attachments without a persisted result (a persisted
|
|
350
|
+
* "failed"/"skipped" marker also suppresses the extractor run).
|
|
351
|
+
*
|
|
352
|
+
* Extraction failures skip the attachment — a broken PDF must never
|
|
353
|
+
* stall the changefeed pipeline.
|
|
354
|
+
*/
|
|
355
|
+
async collectAttachmentText(doc) {
|
|
356
|
+
if (typeof doc.getAttachments !== "function") {
|
|
357
|
+
return null;
|
|
358
|
+
}
|
|
359
|
+
const attachments = doc.getAttachments();
|
|
360
|
+
if (attachments.length === 0) {
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
const extractors = this.config.attachments ? this.getAttachmentExtractors() : [];
|
|
364
|
+
const parts = [];
|
|
365
|
+
let budget = this.config.maxFieldBytes;
|
|
366
|
+
for (const attachment of attachments) {
|
|
367
|
+
if (budget <= 0) {
|
|
368
|
+
break;
|
|
369
|
+
}
|
|
370
|
+
// Source 1: persisted extraction result at the attachment entry.
|
|
371
|
+
if (typeof attachment.extractedText === "string") {
|
|
372
|
+
const persisted = attachment.extractedText;
|
|
373
|
+
if (persisted.trim().length > 0) {
|
|
374
|
+
const clipped = persisted.length > budget ? persisted.slice(0, budget) : persisted;
|
|
375
|
+
parts.push(clipped);
|
|
376
|
+
budget -= clipped.length;
|
|
377
|
+
}
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
if (attachment.extractionStatus !== undefined) {
|
|
381
|
+
// "failed"/"skipped" marker without text: deliberate outcome —
|
|
382
|
+
// don't burn extractor time on it.
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
// Source 2: registered extractors (config.attachments only).
|
|
386
|
+
if (extractors.length === 0) {
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
if (attachment.size > MAX_ATTACHMENT_EXTRACT_BYTES) {
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
const extractor = extractors.find((candidate) => candidate.supports(attachment.mimeType ?? "", attachment.fileName ?? ""));
|
|
393
|
+
if (!extractor) {
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
try {
|
|
397
|
+
const bytes = await doc.getAttachment(attachment.attachmentId);
|
|
398
|
+
const text = await extractor.extract(bytes, {
|
|
399
|
+
mimeType: attachment.mimeType ?? "",
|
|
400
|
+
fileName: attachment.fileName ?? "",
|
|
401
|
+
});
|
|
402
|
+
if (text && text.trim().length > 0) {
|
|
403
|
+
const clipped = text.length > budget ? text.slice(0, budget) : text;
|
|
404
|
+
parts.push(clipped);
|
|
405
|
+
budget -= clipped.length;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
// Skip unreadable/unsupported attachments; document fields are
|
|
410
|
+
// still indexed.
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return parts.length > 0 ? parts.join(" ") : null;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Drop a document's index entry immediately (called from the DB's purge
|
|
417
|
+
* paths so extracted plaintext tokens never outlive key
|
|
418
|
+
* revocation/purges; the changefeed tombstone would remove it anyway,
|
|
419
|
+
* but only on the next update run).
|
|
420
|
+
*/
|
|
421
|
+
removeDocument(docId) {
|
|
422
|
+
if (this.engine.has(docId)) {
|
|
423
|
+
this.engine.remove(docId);
|
|
424
|
+
this.markEngineDirty();
|
|
425
|
+
this.cacheManager?.markDirty();
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
/** Drop all indexed content and cursors (e.g. after the underlying store was cleared). */
|
|
429
|
+
reset() {
|
|
430
|
+
this.engine.clear();
|
|
431
|
+
this.cursor = null;
|
|
432
|
+
this.needsBackfill = false;
|
|
433
|
+
this.backfillCursor = null;
|
|
434
|
+
this.engineDirty = true;
|
|
435
|
+
this.metaDirty = true;
|
|
436
|
+
this.cacheManager?.markDirty();
|
|
437
|
+
}
|
|
438
|
+
// ---------------------------------------------------------------------------
|
|
439
|
+
// Persistence (ICacheable)
|
|
440
|
+
// ---------------------------------------------------------------------------
|
|
441
|
+
/**
|
|
442
|
+
* Attach cache persistence. `cachePrefix` scopes all records of this
|
|
443
|
+
* index (recommended: `<dbCachePrefix>/fulltext`). Registers with the
|
|
444
|
+
* CacheManager for periodic flushing; the persisted state is restored
|
|
445
|
+
* lazily on the first `update()` call.
|
|
446
|
+
*/
|
|
447
|
+
attachCache(cacheManager, cachePrefix) {
|
|
448
|
+
this.cacheManager = cacheManager;
|
|
449
|
+
this.cachePrefix = cachePrefix;
|
|
450
|
+
cacheManager.register(this);
|
|
451
|
+
}
|
|
452
|
+
getCachePrefix() {
|
|
453
|
+
return this.cachePrefix ?? "fulltext";
|
|
454
|
+
}
|
|
455
|
+
hasDirtyState() {
|
|
456
|
+
return this.engineDirty || this.metaDirty;
|
|
457
|
+
}
|
|
458
|
+
clearDirty() {
|
|
459
|
+
this.engineDirty = false;
|
|
460
|
+
this.metaDirty = false;
|
|
461
|
+
}
|
|
462
|
+
markEngineDirty() {
|
|
463
|
+
this.engineDirty = true;
|
|
464
|
+
this.metaDirty = true;
|
|
465
|
+
}
|
|
466
|
+
async flushToCache(store, _options) {
|
|
467
|
+
const prefix = this.getCachePrefix();
|
|
468
|
+
let written = 0;
|
|
469
|
+
if (this.engineDirty) {
|
|
470
|
+
await store.put("fulltext", `${prefix}/engine`, this.engine.serialize());
|
|
471
|
+
written++;
|
|
472
|
+
}
|
|
473
|
+
const meta = {
|
|
474
|
+
cursor: this.cursor,
|
|
475
|
+
configFingerprint: this.configFingerprint,
|
|
476
|
+
needsBackfill: this.needsBackfill,
|
|
477
|
+
backfillCursor: this.backfillCursor,
|
|
478
|
+
};
|
|
479
|
+
await store.put("fulltext", `${prefix}/meta`, new TextEncoder().encode(JSON.stringify(meta)));
|
|
480
|
+
written++;
|
|
481
|
+
return written;
|
|
482
|
+
}
|
|
483
|
+
async ensureRestored() {
|
|
484
|
+
if (this.restored || !this.cacheManager) {
|
|
485
|
+
this.restored = true;
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
if (!this.restorePromise) {
|
|
489
|
+
this.restorePromise = this.restoreFromCache().finally(() => {
|
|
490
|
+
this.restored = true;
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
return this.restorePromise;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Restore persisted state. Unlike the summary, index content is only
|
|
497
|
+
* usable when the config fingerprint matches exactly (tokenization is
|
|
498
|
+
* config-dependent); a mismatch or unreadable blob starts empty and
|
|
499
|
+
* schedules a full backfill instead.
|
|
500
|
+
*/
|
|
501
|
+
async restoreFromCache() {
|
|
502
|
+
const store = this.cacheManager?.getStore();
|
|
503
|
+
if (!store) {
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
const prefix = this.getCachePrefix();
|
|
507
|
+
let meta;
|
|
508
|
+
try {
|
|
509
|
+
const metaBytes = await store.get("fulltext", `${prefix}/meta`);
|
|
510
|
+
if (!metaBytes) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
meta = JSON.parse(new TextDecoder().decode(metaBytes));
|
|
514
|
+
}
|
|
515
|
+
catch {
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
if (meta.configFingerprint !== this.configFingerprint) {
|
|
519
|
+
// Index was built with a different configuration/engine version:
|
|
520
|
+
// start empty, re-index everything in the background.
|
|
521
|
+
this.scheduleBackfill();
|
|
522
|
+
this.metaDirty = true;
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
try {
|
|
526
|
+
const engineBytes = await store.get("fulltext", `${prefix}/engine`);
|
|
527
|
+
if (engineBytes) {
|
|
528
|
+
this.engine.load(engineBytes);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
catch {
|
|
532
|
+
// A corrupt blob only loses the cached index; rebuild from the feed.
|
|
533
|
+
this.engine = this.createEngine();
|
|
534
|
+
this.cursor = null;
|
|
535
|
+
this.scheduleBackfill();
|
|
536
|
+
this.metaDirty = true;
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
539
|
+
this.cursor = meta.cursor ?? null;
|
|
540
|
+
if (meta.needsBackfill) {
|
|
541
|
+
// Resume an interrupted backfill where it left off.
|
|
542
|
+
this.needsBackfill = true;
|
|
543
|
+
this.backfillCursor = meta.backfillCursor ?? null;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
exports.DocumentFullTextIndex = DocumentFullTextIndex;
|
|
548
|
+
//# sourceMappingURL=DocumentFullTextIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocumentFullTextIndex.js","sourceRoot":"","sources":["../../../../src/core/indexing/fulltext/DocumentFullTextIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { FulltextSearchHit, FulltextSearchOptions } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Narrow interface between the {@link DocumentFullTextIndex} and the
|
|
4
|
+
* underlying search engine. Everything engine-specific (MiniSearch today;
|
|
5
|
+
* Orama, vector search, ... later) stays behind this seam — including the
|
|
6
|
+
* serialization format, so an engine swap is just a format-version bump
|
|
7
|
+
* that triggers a rebuild.
|
|
8
|
+
*/
|
|
9
|
+
export interface SearchEngineAdapter {
|
|
10
|
+
/** Add or replace the indexed text fields of a document. */
|
|
11
|
+
add(docId: string, fields: Record<string, string>): void;
|
|
12
|
+
/** Remove a document from the index (no-op when absent). */
|
|
13
|
+
remove(docId: string): void;
|
|
14
|
+
has(docId: string): boolean;
|
|
15
|
+
search(query: string, options?: FulltextSearchOptions): FulltextSearchHit[];
|
|
16
|
+
getDocumentCount(): number;
|
|
17
|
+
/** All field names the index currently knows. */
|
|
18
|
+
getFieldNames(): string[];
|
|
19
|
+
/** Serialize the full engine state (loadable via {@link load}). */
|
|
20
|
+
serialize(): Uint8Array;
|
|
21
|
+
/**
|
|
22
|
+
* Restore state produced by {@link serialize}. Throws when the payload
|
|
23
|
+
* is unreadable or from an incompatible format version — callers treat
|
|
24
|
+
* that as "start empty and rebuild".
|
|
25
|
+
*/
|
|
26
|
+
load(bytes: Uint8Array): void;
|
|
27
|
+
/** Drop all indexed documents. */
|
|
28
|
+
clear(): void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build the tokenizer for a language: `Intl.Segmenter` word segmentation
|
|
32
|
+
* where available (correct for CJK and other scripts without word
|
|
33
|
+
* spaces), otherwise a Unicode letters/digits fallback (e.g. React
|
|
34
|
+
* Native/Hermes without `Intl.Segmenter`).
|
|
35
|
+
*/
|
|
36
|
+
export declare function createTokenizer(language: string): (text: string) => string[];
|
|
37
|
+
/**
|
|
38
|
+
* MiniSearch-backed {@link SearchEngineAdapter}.
|
|
39
|
+
*
|
|
40
|
+
* MiniSearch requires the indexed field list at construction time, but
|
|
41
|
+
* mindoodb documents are schemaless (auto mode indexes whatever string
|
|
42
|
+
* fields documents have). The adapter therefore keeps the extracted
|
|
43
|
+
* source texts per document and transparently rebuilds the MiniSearch
|
|
44
|
+
* instance when a previously unseen field name appears — rare in
|
|
45
|
+
* practice, since real databases converge on a stable field set quickly.
|
|
46
|
+
* The kept source texts also make the serialized state self-contained.
|
|
47
|
+
*/
|
|
48
|
+
export declare class MiniSearchAdapter implements SearchEngineAdapter {
|
|
49
|
+
private readonly language;
|
|
50
|
+
private readonly tokenize;
|
|
51
|
+
private fieldNames;
|
|
52
|
+
private docs;
|
|
53
|
+
private engine;
|
|
54
|
+
constructor(language: string, initialFields?: string[]);
|
|
55
|
+
private engineOptions;
|
|
56
|
+
private createEngine;
|
|
57
|
+
/** Rebuild the MiniSearch instance over a grown field list. */
|
|
58
|
+
private rebuildWithFields;
|
|
59
|
+
add(docId: string, fields: Record<string, string>): void;
|
|
60
|
+
remove(docId: string): void;
|
|
61
|
+
has(docId: string): boolean;
|
|
62
|
+
search(query: string, options?: FulltextSearchOptions): FulltextSearchHit[];
|
|
63
|
+
getDocumentCount(): number;
|
|
64
|
+
getFieldNames(): string[];
|
|
65
|
+
serialize(): Uint8Array;
|
|
66
|
+
load(bytes: Uint8Array): void;
|
|
67
|
+
clear(): void;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=SearchEngineAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchEngineAdapter.d.ts","sourceRoot":"","sources":["../../../../src/core/indexing/fulltext/SearchEngineAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAGxE;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACzD,4DAA4D;IAC5D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,iBAAiB,EAAE,CAAC;IAC5E,gBAAgB,IAAI,MAAM,CAAC;IAC3B,iDAAiD;IACjD,aAAa,IAAI,MAAM,EAAE,CAAC;IAC1B,mEAAmE;IACnE,SAAS,IAAI,UAAU,CAAC;IACxB;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,kCAAkC;IAClC,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAkC5E;AAqBD;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,YAAW,mBAAmB;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,UAAU,CAAW;IAC7B,OAAO,CAAC,IAAI,CAAkD;IAC9D,OAAO,CAAC,MAAM,CAA6B;gBAE/B,QAAQ,EAAE,MAAM,EAAE,aAAa,GAAE,MAAM,EAAO;IAO1D,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,YAAY;IAIpB,+DAA+D;IAC/D,OAAO,CAAC,iBAAiB;IAQzB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAuBxD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ3B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,iBAAiB,EAAE;IA0B3E,gBAAgB,IAAI,MAAM;IAI1B,aAAa,IAAI,MAAM,EAAE;IAIzB,SAAS,IAAI,UAAU;IAWvB,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAoB7B,KAAK,IAAI,IAAI;CAId"}
|