vectra 0.12.2 → 0.14.0
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/LICENSE +1 -1
- package/README.md +92 -100
- package/bin/vectra.js +3 -0
- package/lib/BrowserWebFetcher.d.ts +75 -0
- package/lib/BrowserWebFetcher.d.ts.map +1 -0
- package/lib/BrowserWebFetcher.js +290 -0
- package/lib/BrowserWebFetcher.js.map +1 -0
- package/lib/FileFetcher.d.ts +5 -0
- package/lib/FileFetcher.d.ts.map +1 -0
- package/lib/FileFetcher.js +89 -0
- package/lib/FileFetcher.js.map +1 -0
- package/lib/FileFetcher.spec.d.ts +2 -0
- package/lib/FileFetcher.spec.d.ts.map +1 -0
- package/lib/FileFetcher.spec.js +244 -0
- package/lib/FileFetcher.spec.js.map +1 -0
- package/lib/FolderWatcher.d.ts +91 -0
- package/lib/FolderWatcher.d.ts.map +1 -0
- package/lib/FolderWatcher.js +304 -0
- package/lib/FolderWatcher.js.map +1 -0
- package/lib/FolderWatcher.spec.d.ts +2 -0
- package/lib/FolderWatcher.spec.d.ts.map +1 -0
- package/lib/FolderWatcher.spec.js +308 -0
- package/lib/FolderWatcher.spec.js.map +1 -0
- package/lib/GPT3Tokenizer.d.ts +9 -0
- package/lib/GPT3Tokenizer.spec.d.ts +2 -0
- package/lib/GPT3Tokenizer.spec.d.ts.map +1 -0
- package/lib/GPT3Tokenizer.spec.js +45 -0
- package/lib/GPT3Tokenizer.spec.js.map +1 -0
- package/lib/ItemSelector.d.ts +41 -0
- package/lib/ItemSelector.d.ts.map +1 -0
- package/lib/ItemSelector.js +179 -0
- package/lib/ItemSelector.js.map +1 -0
- package/lib/ItemSelector.spec.d.ts +2 -0
- package/lib/ItemSelector.spec.d.ts.map +1 -0
- package/lib/ItemSelector.spec.js +204 -0
- package/lib/ItemSelector.spec.js.map +1 -0
- package/lib/LocalDocument.d.ts +54 -0
- package/lib/LocalDocument.d.ts.map +1 -1
- package/lib/LocalDocument.js +116 -0
- package/lib/LocalDocument.js.map +1 -0
- package/lib/LocalDocument.spec.d.ts +2 -0
- package/lib/LocalDocument.spec.d.ts.map +1 -0
- package/lib/LocalDocument.spec.js +214 -0
- package/lib/LocalDocument.spec.js.map +1 -0
- package/lib/LocalDocumentIndex.d.ts +152 -0
- package/lib/LocalDocumentIndex.d.ts.map +1 -1
- package/lib/LocalDocumentIndex.js +420 -0
- package/lib/LocalDocumentIndex.js.map +1 -0
- package/lib/LocalDocumentIndex.spec.d.ts +2 -0
- package/lib/LocalDocumentIndex.spec.d.ts.map +1 -0
- package/lib/LocalDocumentIndex.spec.js +494 -0
- package/lib/LocalDocumentIndex.spec.js.map +1 -0
- package/lib/LocalDocumentResult.d.ts +66 -0
- package/lib/LocalDocumentResult.d.ts.map +1 -1
- package/lib/LocalDocumentResult.js +376 -0
- package/lib/LocalDocumentResult.js.map +1 -0
- package/lib/LocalDocumentResult.spec.d.ts +2 -0
- package/lib/LocalDocumentResult.spec.d.ts.map +1 -0
- package/lib/LocalDocumentResult.spec.js +373 -0
- package/lib/LocalDocumentResult.spec.js.map +1 -0
- package/lib/LocalEmbeddings.d.ts +59 -0
- package/lib/LocalEmbeddings.d.ts.map +1 -0
- package/lib/LocalEmbeddings.js +101 -0
- package/lib/LocalEmbeddings.js.map +1 -0
- package/lib/LocalEmbeddings.spec.d.ts +2 -0
- package/lib/LocalEmbeddings.spec.d.ts.map +1 -0
- package/lib/LocalEmbeddings.spec.js +155 -0
- package/lib/LocalEmbeddings.spec.js.map +1 -0
- package/lib/LocalIndex.d.ts +159 -0
- package/lib/LocalIndex.d.ts.map +1 -1
- package/lib/LocalIndex.js +519 -0
- package/lib/LocalIndex.js.map +1 -0
- package/lib/LocalIndex.spec.d.ts +2 -0
- package/lib/LocalIndex.spec.js +611 -9
- package/lib/LocalIndex.spec.js.map +1 -1
- package/lib/OpenAIEmbeddings.d.ts +124 -0
- package/lib/OpenAIEmbeddings.d.ts.map +1 -0
- package/lib/OpenAIEmbeddings.js +166 -0
- package/lib/OpenAIEmbeddings.js.map +1 -0
- package/lib/OpenAIEmbeddings.spec.d.ts +2 -0
- package/lib/OpenAIEmbeddings.spec.d.ts.map +1 -0
- package/lib/OpenAIEmbeddings.spec.js +298 -0
- package/lib/OpenAIEmbeddings.spec.js.map +1 -0
- package/lib/TextSplitter.d.ts +21 -0
- package/lib/TextSplitter.d.ts.map +1 -1
- package/lib/TextSplitter.js +500 -0
- package/lib/TextSplitter.js.map +1 -0
- package/lib/TextSplitter.spec.d.ts +2 -0
- package/lib/TextSplitter.spec.d.ts.map +1 -0
- package/lib/TextSplitter.spec.js +337 -0
- package/lib/TextSplitter.spec.js.map +1 -0
- package/lib/TransformersEmbeddings.d.ts +121 -0
- package/lib/TransformersEmbeddings.d.ts.map +1 -0
- package/lib/TransformersEmbeddings.js +176 -0
- package/lib/TransformersEmbeddings.js.map +1 -0
- package/lib/TransformersEmbeddings.spec.d.ts +2 -0
- package/lib/TransformersEmbeddings.spec.d.ts.map +1 -0
- package/lib/TransformersEmbeddings.spec.js +198 -0
- package/lib/TransformersEmbeddings.spec.js.map +1 -0
- package/lib/TransformersTokenizer.d.ts +33 -0
- package/lib/TransformersTokenizer.d.ts.map +1 -0
- package/lib/TransformersTokenizer.js +44 -0
- package/lib/TransformersTokenizer.js.map +1 -0
- package/lib/TransformersTokenizer.spec.d.ts +2 -0
- package/lib/TransformersTokenizer.spec.d.ts.map +1 -0
- package/lib/TransformersTokenizer.spec.js +112 -0
- package/lib/TransformersTokenizer.spec.js.map +1 -0
- package/lib/WebFetcher.d.ts +14 -0
- package/lib/WebFetcher.d.ts.map +1 -0
- package/lib/WebFetcher.js +238 -0
- package/lib/WebFetcher.js.map +1 -0
- package/lib/WebFetcher.spec.d.ts +2 -0
- package/lib/WebFetcher.spec.d.ts.map +1 -0
- package/lib/WebFetcher.spec.js +263 -0
- package/lib/WebFetcher.spec.js.map +1 -0
- package/lib/browser.d.ts +30 -0
- package/lib/browser.d.ts.map +1 -0
- package/lib/browser.js +52 -0
- package/lib/browser.js.map +1 -0
- package/lib/codecs/IndexCodec.d.ts +37 -0
- package/lib/codecs/IndexCodec.d.ts.map +1 -0
- package/lib/codecs/IndexCodec.js +3 -0
- package/lib/codecs/IndexCodec.js.map +1 -0
- package/lib/codecs/JsonCodec.d.ts +19 -0
- package/lib/codecs/JsonCodec.d.ts.map +1 -0
- package/lib/codecs/JsonCodec.js +35 -0
- package/lib/codecs/JsonCodec.js.map +1 -0
- package/lib/codecs/JsonCodec.spec.d.ts +2 -0
- package/lib/codecs/JsonCodec.spec.d.ts.map +1 -0
- package/lib/codecs/JsonCodec.spec.js +66 -0
- package/lib/codecs/JsonCodec.spec.js.map +1 -0
- package/lib/codecs/LocalIndex.protobuf.spec.d.ts +2 -0
- package/lib/codecs/LocalIndex.protobuf.spec.d.ts.map +1 -0
- package/lib/codecs/LocalIndex.protobuf.spec.js +108 -0
- package/lib/codecs/LocalIndex.protobuf.spec.js.map +1 -0
- package/lib/codecs/ProtobufCodec.d.ts +20 -0
- package/lib/codecs/ProtobufCodec.d.ts.map +1 -0
- package/lib/codecs/ProtobufCodec.js +225 -0
- package/lib/codecs/ProtobufCodec.js.map +1 -0
- package/lib/codecs/ProtobufCodec.spec.d.ts +2 -0
- package/lib/codecs/ProtobufCodec.spec.d.ts.map +1 -0
- package/lib/codecs/ProtobufCodec.spec.js +155 -0
- package/lib/codecs/ProtobufCodec.spec.js.map +1 -0
- package/lib/codecs/index.d.ts +5 -0
- package/lib/codecs/index.d.ts.map +1 -0
- package/lib/codecs/index.js +21 -0
- package/lib/codecs/index.js.map +1 -0
- package/lib/codecs/migrateIndex.d.ts +24 -0
- package/lib/codecs/migrateIndex.d.ts.map +1 -0
- package/lib/codecs/migrateIndex.js +119 -0
- package/lib/codecs/migrateIndex.js.map +1 -0
- package/lib/codecs/migrateIndex.spec.d.ts +2 -0
- package/lib/codecs/migrateIndex.spec.d.ts.map +1 -0
- package/lib/codecs/migrateIndex.spec.js +151 -0
- package/lib/codecs/migrateIndex.spec.js.map +1 -0
- package/lib/codecs/schemas/index.proto +34 -0
- package/lib/index.d.ts +20 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +36 -0
- package/lib/index.js.map +1 -0
- package/lib/internals/Colorize.d.ts +14 -0
- package/lib/internals/Colorize.d.ts.map +1 -0
- package/lib/internals/Colorize.js +69 -0
- package/lib/internals/Colorize.js.map +1 -0
- package/lib/internals/index.d.ts +3 -0
- package/lib/internals/index.d.ts.map +1 -0
- package/lib/internals/index.js +19 -0
- package/lib/internals/index.js.map +1 -0
- package/lib/internals/types.d.ts +43 -0
- package/lib/internals/types.d.ts.map +1 -0
- package/lib/internals/types.js +3 -0
- package/lib/internals/types.js.map +1 -0
- package/lib/server/IndexManager.d.ts +78 -0
- package/lib/server/IndexManager.d.ts.map +1 -0
- package/lib/server/IndexManager.js +259 -0
- package/lib/server/IndexManager.js.map +1 -0
- package/lib/server/VectraServer.d.ts +40 -0
- package/lib/server/VectraServer.d.ts.map +1 -0
- package/lib/server/VectraServer.js +151 -0
- package/lib/server/VectraServer.js.map +1 -0
- package/lib/server/VectraServer.spec.d.ts +2 -0
- package/lib/server/VectraServer.spec.d.ts.map +1 -0
- package/lib/server/VectraServer.spec.js +322 -0
- package/lib/server/VectraServer.spec.js.map +1 -0
- package/lib/server/handlers/documentHandlers.d.ts +15 -0
- package/lib/server/handlers/documentHandlers.d.ts.map +1 -0
- package/lib/server/handlers/documentHandlers.js +95 -0
- package/lib/server/handlers/documentHandlers.js.map +1 -0
- package/lib/server/handlers/helpers.d.ts +23 -0
- package/lib/server/handlers/helpers.d.ts.map +1 -0
- package/lib/server/handlers/helpers.js +138 -0
- package/lib/server/handlers/helpers.js.map +1 -0
- package/lib/server/handlers/index.d.ts +8 -0
- package/lib/server/handlers/index.d.ts.map +1 -0
- package/lib/server/handlers/index.js +22 -0
- package/lib/server/handlers/index.js.map +1 -0
- package/lib/server/handlers/indexHandlers.d.ts +14 -0
- package/lib/server/handlers/indexHandlers.d.ts.map +1 -0
- package/lib/server/handlers/indexHandlers.js +85 -0
- package/lib/server/handlers/indexHandlers.js.map +1 -0
- package/lib/server/handlers/itemHandlers.d.ts +34 -0
- package/lib/server/handlers/itemHandlers.d.ts.map +1 -0
- package/lib/server/handlers/itemHandlers.js +166 -0
- package/lib/server/handlers/itemHandlers.js.map +1 -0
- package/lib/server/handlers/lifecycleHandlers.d.ts +11 -0
- package/lib/server/handlers/lifecycleHandlers.d.ts.map +1 -0
- package/lib/server/handlers/lifecycleHandlers.js +31 -0
- package/lib/server/handlers/lifecycleHandlers.js.map +1 -0
- package/lib/server/handlers/queryHandlers.d.ts +27 -0
- package/lib/server/handlers/queryHandlers.d.ts.map +1 -0
- package/lib/server/handlers/queryHandlers.js +135 -0
- package/lib/server/handlers/queryHandlers.js.map +1 -0
- package/lib/server/handlers/statsHandlers.d.ts +17 -0
- package/lib/server/handlers/statsHandlers.d.ts.map +1 -0
- package/lib/server/handlers/statsHandlers.js +81 -0
- package/lib/server/handlers/statsHandlers.js.map +1 -0
- package/lib/server/index.d.ts +4 -0
- package/lib/server/index.d.ts.map +1 -0
- package/lib/server/index.js +23 -0
- package/lib/server/index.js.map +1 -0
- package/lib/storage/FileStorage.d.ts +92 -0
- package/lib/storage/FileStorage.d.ts.map +1 -0
- package/lib/storage/FileStorage.js +3 -0
- package/lib/storage/FileStorage.js.map +1 -0
- package/lib/storage/FileStorageUtilities.d.ts +36 -0
- package/lib/storage/FileStorageUtilities.d.ts.map +1 -0
- package/lib/storage/FileStorageUtilities.js +91 -0
- package/lib/storage/FileStorageUtilities.js.map +1 -0
- package/lib/storage/FileStorageUtilities.spec.d.ts +2 -0
- package/lib/storage/FileStorageUtilities.spec.d.ts.map +1 -0
- package/lib/storage/FileStorageUtilities.spec.js +98 -0
- package/lib/storage/FileStorageUtilities.spec.js.map +1 -0
- package/lib/storage/FileType.d.ts +29 -0
- package/lib/storage/FileType.d.ts.map +1 -0
- package/lib/storage/FileType.js +38 -0
- package/lib/storage/FileType.js.map +1 -0
- package/lib/storage/IndexedDBStorage.d.ts +47 -0
- package/lib/storage/IndexedDBStorage.d.ts.map +1 -0
- package/lib/storage/IndexedDBStorage.js +347 -0
- package/lib/storage/IndexedDBStorage.js.map +1 -0
- package/lib/storage/LocalFileStorage.browser.d.ts +19 -0
- package/lib/storage/LocalFileStorage.browser.d.ts.map +1 -0
- package/lib/storage/LocalFileStorage.browser.js +43 -0
- package/lib/storage/LocalFileStorage.browser.js.map +1 -0
- package/lib/storage/LocalFileStorage.d.ts +23 -0
- package/lib/storage/LocalFileStorage.d.ts.map +1 -0
- package/lib/storage/LocalFileStorage.js +152 -0
- package/lib/storage/LocalFileStorage.js.map +1 -0
- package/lib/storage/LocalFileStorage.spec.d.ts +2 -0
- package/lib/storage/LocalFileStorage.spec.d.ts.map +1 -0
- package/lib/storage/LocalFileStorage.spec.js +249 -0
- package/lib/storage/LocalFileStorage.spec.js.map +1 -0
- package/lib/storage/VirtualFileStorage.d.ts +18 -0
- package/lib/storage/VirtualFileStorage.d.ts.map +1 -0
- package/lib/storage/VirtualFileStorage.js +178 -0
- package/lib/storage/VirtualFileStorage.js.map +1 -0
- package/lib/storage/VirtualFileStorage.spec.d.ts +2 -0
- package/lib/storage/VirtualFileStorage.spec.d.ts.map +1 -0
- package/lib/storage/VirtualFileStorage.spec.js +302 -0
- package/lib/storage/VirtualFileStorage.spec.js.map +1 -0
- package/lib/storage/index.d.ts +6 -0
- package/lib/storage/index.d.ts.map +1 -0
- package/lib/storage/index.js +22 -0
- package/lib/storage/index.js.map +1 -0
- package/lib/templates/templates/csharp/README.md +48 -0
- package/lib/templates/templates/csharp/VectraClient.cs +234 -0
- package/lib/templates/templates/go/README.md +71 -0
- package/lib/templates/templates/go/vectra_client.go +322 -0
- package/lib/templates/templates/java/README.md +81 -0
- package/lib/templates/templates/java/VectraClient.java +232 -0
- package/lib/templates/templates/python/README.md +37 -0
- package/lib/templates/templates/python/vectra_client.py +279 -0
- package/lib/templates/templates/rust/Cargo.toml +14 -0
- package/lib/templates/templates/rust/README.md +39 -0
- package/lib/templates/templates/rust/build.rs +4 -0
- package/lib/templates/templates/rust/lib.rs +284 -0
- package/lib/templates/templates/typescript/README.md +96 -0
- package/lib/templates/templates/typescript/VectraClient.ts +374 -0
- package/lib/templates/typescript/VectraClient.d.ts +114 -0
- package/lib/templates/typescript/VectraClient.d.ts.map +1 -0
- package/lib/templates/typescript/VectraClient.js +328 -0
- package/lib/templates/typescript/VectraClient.js.map +1 -0
- package/lib/types.d.ts +153 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/lib/utils/index.d.ts +2 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +18 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/pathUtils.d.ts +40 -0
- package/lib/utils/pathUtils.d.ts.map +1 -0
- package/lib/utils/pathUtils.js +98 -0
- package/lib/utils/pathUtils.js.map +1 -0
- package/lib/vectra-cli.d.ts +2 -0
- package/lib/vectra-cli.d.ts.map +1 -1
- package/lib/vectra-cli.generate.spec.d.ts +2 -0
- package/lib/vectra-cli.generate.spec.d.ts.map +1 -0
- package/lib/vectra-cli.generate.spec.js +112 -0
- package/lib/vectra-cli.generate.spec.js.map +1 -0
- package/lib/vectra-cli.js +760 -0
- package/lib/vectra-cli.js.map +1 -0
- package/lib/vectra-cli.spec.d.ts +1 -0
- package/lib/vectra-cli.spec.d.ts.map +1 -0
- package/lib/vectra-cli.spec.js +2 -0
- package/lib/vectra-cli.spec.js.map +1 -0
- package/package.json +91 -16
- package/proto/vectra_service.proto +276 -0
- package/src/BrowserWebFetcher.ts +345 -0
- package/src/FileFetcher.spec.ts +234 -0
- package/src/FileFetcher.ts +37 -25
- package/src/FolderWatcher.spec.ts +288 -0
- package/src/FolderWatcher.ts +304 -0
- package/src/GPT3Tokenizer.spec.ts +50 -0
- package/src/ItemSelector.spec.ts +252 -0
- package/src/ItemSelector.ts +163 -150
- package/src/LocalDocument.spec.ts +211 -0
- package/src/LocalDocument.ts +88 -94
- package/src/LocalDocumentIndex.spec.ts +481 -0
- package/src/LocalDocumentIndex.ts +39 -40
- package/src/LocalDocumentResult.spec.ts +373 -0
- package/src/LocalDocumentResult.ts +489 -319
- package/src/LocalEmbeddings.spec.ts +138 -0
- package/src/LocalEmbeddings.ts +120 -0
- package/src/LocalIndex.spec.ts +808 -66
- package/src/LocalIndex.ts +479 -429
- package/src/OpenAIEmbeddings.spec.ts +354 -0
- package/src/OpenAIEmbeddings.ts +26 -27
- package/src/TextSplitter.spec.ts +342 -0
- package/src/TextSplitter.ts +517 -532
- package/src/TransformersEmbeddings.spec.ts +188 -0
- package/src/TransformersEmbeddings.ts +232 -0
- package/src/TransformersTokenizer.spec.ts +143 -0
- package/src/TransformersTokenizer.ts +45 -0
- package/src/WebFetcher.spec.ts +288 -0
- package/src/WebFetcher.ts +184 -186
- package/src/browser.ts +69 -0
- package/src/codecs/IndexCodec.ts +40 -0
- package/src/codecs/JsonCodec.spec.ts +70 -0
- package/src/codecs/JsonCodec.ts +37 -0
- package/src/codecs/LocalIndex.protobuf.spec.ts +115 -0
- package/src/codecs/ProtobufCodec.spec.ts +166 -0
- package/src/codecs/ProtobufCodec.ts +193 -0
- package/src/codecs/index.ts +4 -0
- package/src/codecs/migrateIndex.spec.ts +176 -0
- package/src/codecs/migrateIndex.ts +125 -0
- package/src/codecs/schemas/index.proto +34 -0
- package/src/index.ts +9 -1
- package/src/internals/Colorize.ts +19 -16
- package/src/server/IndexManager.ts +243 -0
- package/src/server/VectraServer.spec.ts +303 -0
- package/src/server/VectraServer.ts +156 -0
- package/src/server/handlers/documentHandlers.ts +59 -0
- package/src/server/handlers/helpers.ts +93 -0
- package/src/server/handlers/index.ts +7 -0
- package/src/server/handlers/indexHandlers.ts +44 -0
- package/src/server/handlers/itemHandlers.ts +140 -0
- package/src/server/handlers/lifecycleHandlers.ts +26 -0
- package/src/server/handlers/queryHandlers.ts +96 -0
- package/src/server/handlers/statsHandlers.ts +38 -0
- package/src/server/index.ts +3 -0
- package/src/storage/FileStorage.ts +105 -0
- package/src/storage/FileStorageUtilities.spec.ts +106 -0
- package/src/storage/FileStorageUtilities.ts +77 -0
- package/src/storage/FileType.ts +61 -0
- package/src/storage/IndexedDBStorage.ts +365 -0
- package/src/storage/LocalFileStorage.browser.ts +52 -0
- package/src/storage/LocalFileStorage.spec.ts +292 -0
- package/src/storage/LocalFileStorage.ts +98 -0
- package/src/storage/VirtualFileStorage.spec.ts +307 -0
- package/src/storage/VirtualFileStorage.ts +169 -0
- package/src/storage/index.ts +5 -0
- package/src/templates/csharp/README.md +48 -0
- package/src/templates/csharp/VectraClient.cs +234 -0
- package/src/templates/go/README.md +71 -0
- package/src/templates/go/vectra_client.go +322 -0
- package/src/templates/java/README.md +81 -0
- package/src/templates/java/VectraClient.java +232 -0
- package/src/templates/python/README.md +37 -0
- package/src/templates/python/vectra_client.py +279 -0
- package/src/templates/rust/Cargo.toml +14 -0
- package/src/templates/rust/README.md +39 -0
- package/src/templates/rust/build.rs +4 -0
- package/src/templates/rust/lib.rs +284 -0
- package/src/templates/typescript/README.md +96 -0
- package/src/templates/typescript/VectraClient.ts +374 -0
- package/src/types.ts +131 -123
- package/src/utils/index.ts +1 -0
- package/src/utils/pathUtils.ts +106 -0
- package/src/vectra-cli.generate.spec.ts +72 -0
- package/src/vectra-cli.spec.ts +0 -0
- package/src/vectra-cli.ts +687 -246
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { Buffer } from 'buffer';
|
|
2
|
+
import { FileDetails, FileStorage, ListFilesFilter } from "./FileStorage";
|
|
3
|
+
import { FileStorageUtilities } from "./FileStorageUtilities";
|
|
4
|
+
import { pathUtils } from "../utils/pathUtils";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Browser-compatible FileStorage implementation using IndexedDB.
|
|
8
|
+
* @remarks
|
|
9
|
+
* This storage backend works in browsers and Electron renderer processes.
|
|
10
|
+
* Data persists across page reloads and browser sessions.
|
|
11
|
+
*/
|
|
12
|
+
export class IndexedDBStorage implements FileStorage {
|
|
13
|
+
private readonly _dbName: string;
|
|
14
|
+
private _db: IDBDatabase | undefined;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Creates a new `IndexedDBStorage` instance.
|
|
18
|
+
* @param dbName Name of the IndexedDB database. Defaults to 'vectra-db'.
|
|
19
|
+
*/
|
|
20
|
+
constructor(dbName: string = 'vectra-db') {
|
|
21
|
+
this._dbName = dbName;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Opens or creates the IndexedDB database.
|
|
26
|
+
*/
|
|
27
|
+
private async getDB(): Promise<IDBDatabase> {
|
|
28
|
+
if (this._db) {
|
|
29
|
+
return this._db;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const request = indexedDB.open(this._dbName, 1);
|
|
34
|
+
|
|
35
|
+
request.onerror = () => reject(new Error(`Failed to open IndexedDB: ${request.error?.message}`));
|
|
36
|
+
|
|
37
|
+
request.onsuccess = () => {
|
|
38
|
+
this._db = request.result;
|
|
39
|
+
resolve(this._db);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
request.onupgradeneeded = (event) => {
|
|
43
|
+
const db = (event.target as IDBOpenDBRequest).result;
|
|
44
|
+
|
|
45
|
+
// Store for files: { path, content, createdAt, updatedAt }
|
|
46
|
+
if (!db.objectStoreNames.contains('files')) {
|
|
47
|
+
const fileStore = db.createObjectStore('files', { keyPath: 'path' });
|
|
48
|
+
fileStore.createIndex('parentPath', 'parentPath', { unique: false });
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Store for folders: { path, createdAt }
|
|
52
|
+
if (!db.objectStoreNames.contains('folders')) {
|
|
53
|
+
const folderStore = db.createObjectStore('folders', { keyPath: 'path' });
|
|
54
|
+
folderStore.createIndex('parentPath', 'parentPath', { unique: false });
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Normalizes a path for consistent storage.
|
|
62
|
+
*/
|
|
63
|
+
private normalizePath(filePath: string): string {
|
|
64
|
+
// Normalize and ensure forward slashes
|
|
65
|
+
let normalized = pathUtils.normalize(filePath);
|
|
66
|
+
// Remove trailing slash unless it's the root
|
|
67
|
+
if (normalized.length > 1 && normalized.endsWith('/')) {
|
|
68
|
+
normalized = normalized.slice(0, -1);
|
|
69
|
+
}
|
|
70
|
+
return normalized;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Gets the parent path of a given path.
|
|
75
|
+
*/
|
|
76
|
+
private getParentPath(filePath: string): string {
|
|
77
|
+
const normalized = this.normalizePath(filePath);
|
|
78
|
+
const parent = pathUtils.dirname(normalized);
|
|
79
|
+
return parent === normalized ? '' : parent;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async createFile(filePath: string, content: Buffer | string): Promise<void> {
|
|
83
|
+
const db = await this.getDB();
|
|
84
|
+
const normalizedPath = this.normalizePath(filePath);
|
|
85
|
+
|
|
86
|
+
// Convert content to ArrayBuffer for storage
|
|
87
|
+
let arrayBuffer: ArrayBuffer;
|
|
88
|
+
if (typeof content === 'string') {
|
|
89
|
+
arrayBuffer = new TextEncoder().encode(content).buffer;
|
|
90
|
+
} else {
|
|
91
|
+
arrayBuffer = content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength) as ArrayBuffer;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
const tx = db.transaction('files', 'readwrite');
|
|
96
|
+
const store = tx.objectStore('files');
|
|
97
|
+
|
|
98
|
+
const record = {
|
|
99
|
+
path: normalizedPath,
|
|
100
|
+
parentPath: this.getParentPath(normalizedPath),
|
|
101
|
+
content: arrayBuffer,
|
|
102
|
+
createdAt: Date.now(),
|
|
103
|
+
updatedAt: Date.now()
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const request = store.add(record);
|
|
107
|
+
request.onsuccess = () => resolve();
|
|
108
|
+
request.onerror = () => reject(new Error(`File already exists: ${filePath}`));
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async createFolder(folderPath: string): Promise<void> {
|
|
113
|
+
const db = await this.getDB();
|
|
114
|
+
const normalizedPath = this.normalizePath(folderPath);
|
|
115
|
+
|
|
116
|
+
// Create all parent folders recursively
|
|
117
|
+
const parts = normalizedPath.split('/').filter(Boolean);
|
|
118
|
+
let currentPath = '';
|
|
119
|
+
|
|
120
|
+
const tx = db.transaction('folders', 'readwrite');
|
|
121
|
+
const store = tx.objectStore('folders');
|
|
122
|
+
|
|
123
|
+
for (const part of parts) {
|
|
124
|
+
const parentPath = currentPath;
|
|
125
|
+
currentPath = currentPath ? `${currentPath}/${part}` : part;
|
|
126
|
+
|
|
127
|
+
// Use put to create or update (idempotent)
|
|
128
|
+
store.put({
|
|
129
|
+
path: currentPath,
|
|
130
|
+
parentPath: parentPath,
|
|
131
|
+
createdAt: Date.now()
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return new Promise((resolve, reject) => {
|
|
136
|
+
tx.oncomplete = () => resolve();
|
|
137
|
+
tx.onerror = () => reject(new Error(`Failed to create folder: ${folderPath}`));
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async deleteFile(filePath: string): Promise<void> {
|
|
142
|
+
const db = await this.getDB();
|
|
143
|
+
const normalizedPath = this.normalizePath(filePath);
|
|
144
|
+
|
|
145
|
+
return new Promise((resolve, reject) => {
|
|
146
|
+
const tx = db.transaction('files', 'readwrite');
|
|
147
|
+
const store = tx.objectStore('files');
|
|
148
|
+
const request = store.delete(normalizedPath);
|
|
149
|
+
request.onsuccess = () => resolve();
|
|
150
|
+
request.onerror = () => reject(new Error(`Failed to delete file: ${filePath}`));
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async deleteFolder(folderPath: string): Promise<void> {
|
|
155
|
+
const db = await this.getDB();
|
|
156
|
+
const normalizedPath = this.normalizePath(folderPath);
|
|
157
|
+
const prefix = normalizedPath + '/';
|
|
158
|
+
|
|
159
|
+
return new Promise((resolve, reject) => {
|
|
160
|
+
const tx = db.transaction(['files', 'folders'], 'readwrite');
|
|
161
|
+
const fileStore = tx.objectStore('files');
|
|
162
|
+
const folderStore = tx.objectStore('folders');
|
|
163
|
+
|
|
164
|
+
// Delete all files with matching prefix
|
|
165
|
+
const filesCursor = fileStore.openCursor();
|
|
166
|
+
filesCursor.onsuccess = (event) => {
|
|
167
|
+
const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;
|
|
168
|
+
if (cursor) {
|
|
169
|
+
if (cursor.value.path === normalizedPath || cursor.value.path.startsWith(prefix)) {
|
|
170
|
+
cursor.delete();
|
|
171
|
+
}
|
|
172
|
+
cursor.continue();
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
// Delete all folders with matching prefix
|
|
177
|
+
const foldersCursor = folderStore.openCursor();
|
|
178
|
+
foldersCursor.onsuccess = (event) => {
|
|
179
|
+
const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;
|
|
180
|
+
if (cursor) {
|
|
181
|
+
if (cursor.value.path === normalizedPath || cursor.value.path.startsWith(prefix)) {
|
|
182
|
+
cursor.delete();
|
|
183
|
+
}
|
|
184
|
+
cursor.continue();
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
tx.oncomplete = () => resolve();
|
|
189
|
+
tx.onerror = () => reject(new Error(`Failed to delete folder: ${folderPath}`));
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
async getDetails(fileOrFolderPath: string): Promise<FileDetails> {
|
|
194
|
+
const db = await this.getDB();
|
|
195
|
+
const normalizedPath = this.normalizePath(fileOrFolderPath);
|
|
196
|
+
|
|
197
|
+
// Try to find as file first
|
|
198
|
+
const file = await new Promise<any>((resolve) => {
|
|
199
|
+
const tx = db.transaction('files', 'readonly');
|
|
200
|
+
const store = tx.objectStore('files');
|
|
201
|
+
const request = store.get(normalizedPath);
|
|
202
|
+
request.onsuccess = () => resolve(request.result);
|
|
203
|
+
request.onerror = () => resolve(undefined);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
if (file) {
|
|
207
|
+
return {
|
|
208
|
+
name: pathUtils.basename(normalizedPath),
|
|
209
|
+
path: normalizedPath,
|
|
210
|
+
isFolder: false,
|
|
211
|
+
fileType: FileStorageUtilities.getFileType(normalizedPath)
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Try to find as folder
|
|
216
|
+
const folder = await new Promise<any>((resolve) => {
|
|
217
|
+
const tx = db.transaction('folders', 'readonly');
|
|
218
|
+
const store = tx.objectStore('folders');
|
|
219
|
+
const request = store.get(normalizedPath);
|
|
220
|
+
request.onsuccess = () => resolve(request.result);
|
|
221
|
+
request.onerror = () => resolve(undefined);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
if (folder) {
|
|
225
|
+
return {
|
|
226
|
+
name: pathUtils.basename(normalizedPath),
|
|
227
|
+
path: normalizedPath,
|
|
228
|
+
isFolder: true
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
throw new Error(`Path not found: ${fileOrFolderPath}`);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
async listFiles(folderPath: string, filter?: ListFilesFilter): Promise<FileDetails[]> {
|
|
236
|
+
const db = await this.getDB();
|
|
237
|
+
const normalizedPath = this.normalizePath(folderPath);
|
|
238
|
+
const results: FileDetails[] = [];
|
|
239
|
+
|
|
240
|
+
// Get files in folder
|
|
241
|
+
if (filter !== 'folders') {
|
|
242
|
+
const files = await new Promise<any[]>((resolve) => {
|
|
243
|
+
const tx = db.transaction('files', 'readonly');
|
|
244
|
+
const store = tx.objectStore('files');
|
|
245
|
+
const index = store.index('parentPath');
|
|
246
|
+
const request = index.getAll(normalizedPath);
|
|
247
|
+
request.onsuccess = () => resolve(request.result || []);
|
|
248
|
+
request.onerror = () => resolve([]);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
for (const file of files) {
|
|
252
|
+
results.push({
|
|
253
|
+
name: pathUtils.basename(file.path),
|
|
254
|
+
path: file.path,
|
|
255
|
+
isFolder: false,
|
|
256
|
+
fileType: FileStorageUtilities.getFileType(file.path)
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Get subfolders
|
|
262
|
+
if (filter !== 'files') {
|
|
263
|
+
const folders = await new Promise<any[]>((resolve) => {
|
|
264
|
+
const tx = db.transaction('folders', 'readonly');
|
|
265
|
+
const store = tx.objectStore('folders');
|
|
266
|
+
const index = store.index('parentPath');
|
|
267
|
+
const request = index.getAll(normalizedPath);
|
|
268
|
+
request.onsuccess = () => resolve(request.result || []);
|
|
269
|
+
request.onerror = () => resolve([]);
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
for (const folder of folders) {
|
|
273
|
+
results.push({
|
|
274
|
+
name: pathUtils.basename(folder.path),
|
|
275
|
+
path: folder.path,
|
|
276
|
+
isFolder: true
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return results;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
async pathExists(fileOrFolderPath: string): Promise<boolean> {
|
|
285
|
+
try {
|
|
286
|
+
await this.getDetails(fileOrFolderPath);
|
|
287
|
+
return true;
|
|
288
|
+
} catch {
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
async readFile(filePath: string): Promise<Buffer> {
|
|
294
|
+
const db = await this.getDB();
|
|
295
|
+
const normalizedPath = this.normalizePath(filePath);
|
|
296
|
+
|
|
297
|
+
const file = await new Promise<any>((resolve, reject) => {
|
|
298
|
+
const tx = db.transaction('files', 'readonly');
|
|
299
|
+
const store = tx.objectStore('files');
|
|
300
|
+
const request = store.get(normalizedPath);
|
|
301
|
+
request.onsuccess = () => resolve(request.result);
|
|
302
|
+
request.onerror = () => reject(new Error(`Failed to read file: ${filePath}`));
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
if (!file) {
|
|
306
|
+
throw new Error(`File not found: ${filePath}`);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Convert ArrayBuffer back to Buffer
|
|
310
|
+
return Buffer.from(file.content);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
async upsertFile(filePath: string, content: Buffer | string): Promise<void> {
|
|
314
|
+
const db = await this.getDB();
|
|
315
|
+
const normalizedPath = this.normalizePath(filePath);
|
|
316
|
+
|
|
317
|
+
// Convert content to ArrayBuffer for storage
|
|
318
|
+
let arrayBuffer: ArrayBuffer;
|
|
319
|
+
if (typeof content === 'string') {
|
|
320
|
+
arrayBuffer = new TextEncoder().encode(content).buffer;
|
|
321
|
+
} else {
|
|
322
|
+
arrayBuffer = content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength) as ArrayBuffer;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
return new Promise((resolve, reject) => {
|
|
326
|
+
const tx = db.transaction('files', 'readwrite');
|
|
327
|
+
const store = tx.objectStore('files');
|
|
328
|
+
|
|
329
|
+
const record = {
|
|
330
|
+
path: normalizedPath,
|
|
331
|
+
parentPath: this.getParentPath(normalizedPath),
|
|
332
|
+
content: arrayBuffer,
|
|
333
|
+
createdAt: Date.now(),
|
|
334
|
+
updatedAt: Date.now()
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
const request = store.put(record);
|
|
338
|
+
request.onsuccess = () => resolve();
|
|
339
|
+
request.onerror = () => reject(new Error(`Failed to write file: ${filePath}`));
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Closes the database connection.
|
|
345
|
+
*/
|
|
346
|
+
close(): void {
|
|
347
|
+
if (this._db) {
|
|
348
|
+
this._db.close();
|
|
349
|
+
this._db = undefined;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Deletes the entire database.
|
|
355
|
+
*/
|
|
356
|
+
async destroy(): Promise<void> {
|
|
357
|
+
this.close();
|
|
358
|
+
|
|
359
|
+
return new Promise((resolve, reject) => {
|
|
360
|
+
const request = indexedDB.deleteDatabase(this._dbName);
|
|
361
|
+
request.onsuccess = () => resolve();
|
|
362
|
+
request.onerror = () => reject(new Error(`Failed to delete database: ${this._dbName}`));
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser stub for LocalFileStorage.
|
|
3
|
+
* This module throws an error if LocalFileStorage is used in a browser environment.
|
|
4
|
+
* Use IndexedDBStorage or VirtualFileStorage instead.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { FileStorage, FileDetails, ListFilesFilter } from "./FileStorage";
|
|
8
|
+
|
|
9
|
+
export class LocalFileStorage implements FileStorage {
|
|
10
|
+
constructor() {
|
|
11
|
+
throw new Error(
|
|
12
|
+
'LocalFileStorage is not supported in browser environments. ' +
|
|
13
|
+
'Use IndexedDBStorage or VirtualFileStorage instead.'
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
createFile(): Promise<void> {
|
|
18
|
+
throw new Error('LocalFileStorage is not supported in browser environments.');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
createFolder(): Promise<void> {
|
|
22
|
+
throw new Error('LocalFileStorage is not supported in browser environments.');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
deleteFile(): Promise<void> {
|
|
26
|
+
throw new Error('LocalFileStorage is not supported in browser environments.');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
deleteFolder(): Promise<void> {
|
|
30
|
+
throw new Error('LocalFileStorage is not supported in browser environments.');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
getDetails(): Promise<FileDetails> {
|
|
34
|
+
throw new Error('LocalFileStorage is not supported in browser environments.');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
listFiles(): Promise<FileDetails[]> {
|
|
38
|
+
throw new Error('LocalFileStorage is not supported in browser environments.');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
pathExists(): Promise<boolean> {
|
|
42
|
+
throw new Error('LocalFileStorage is not supported in browser environments.');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
readFile(): Promise<Buffer> {
|
|
46
|
+
throw new Error('LocalFileStorage is not supported in browser environments.');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
upsertFile(): Promise<void> {
|
|
50
|
+
throw new Error('LocalFileStorage is not supported in browser environments.');
|
|
51
|
+
}
|
|
52
|
+
}
|