verso-db 0.1.4 → 0.2.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.
Files changed (110) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +81 -49
  3. package/dist/BinaryHeap.d.ts +16 -5
  4. package/dist/BinaryHeap.d.ts.map +1 -1
  5. package/dist/BinaryHeap.js +138 -0
  6. package/dist/BinaryHeap.js.map +1 -0
  7. package/dist/Collection.d.ts +98 -17
  8. package/dist/Collection.d.ts.map +1 -1
  9. package/dist/Collection.js +1186 -0
  10. package/dist/Collection.js.map +1 -0
  11. package/dist/HNSWIndex.d.ts +170 -15
  12. package/dist/HNSWIndex.d.ts.map +1 -1
  13. package/dist/HNSWIndex.js +2818 -0
  14. package/dist/HNSWIndex.js.map +1 -0
  15. package/dist/MaxBinaryHeap.d.ts +2 -60
  16. package/dist/MaxBinaryHeap.d.ts.map +1 -1
  17. package/dist/MaxBinaryHeap.js +5 -0
  18. package/dist/MaxBinaryHeap.js.map +1 -0
  19. package/dist/SearchWorker.d.ts +104 -0
  20. package/dist/SearchWorker.d.ts.map +1 -0
  21. package/dist/SearchWorker.js +573 -0
  22. package/dist/SearchWorker.js.map +1 -0
  23. package/dist/VectorDB.d.ts +19 -5
  24. package/dist/VectorDB.d.ts.map +1 -1
  25. package/dist/VectorDB.js +246 -0
  26. package/dist/VectorDB.js.map +1 -0
  27. package/dist/WorkerPool.d.ts +92 -0
  28. package/dist/WorkerPool.d.ts.map +1 -0
  29. package/dist/WorkerPool.js +266 -0
  30. package/dist/WorkerPool.js.map +1 -0
  31. package/dist/backends/JsDistanceBackend.d.ts +3 -20
  32. package/dist/backends/JsDistanceBackend.d.ts.map +1 -1
  33. package/dist/backends/JsDistanceBackend.js +163 -0
  34. package/dist/backends/JsDistanceBackend.js.map +1 -0
  35. package/dist/encoding/DeltaEncoder.d.ts +2 -2
  36. package/dist/encoding/DeltaEncoder.d.ts.map +1 -1
  37. package/dist/encoding/DeltaEncoder.js +199 -0
  38. package/dist/encoding/DeltaEncoder.js.map +1 -0
  39. package/dist/errors.js +97 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/index.d.ts +16 -17
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +61 -3419
  44. package/dist/index.js.map +1 -0
  45. package/dist/presets.d.ts +9 -9
  46. package/dist/presets.d.ts.map +1 -1
  47. package/dist/presets.js +205 -0
  48. package/dist/presets.js.map +1 -0
  49. package/dist/quantization/ScalarQuantizer.d.ts +10 -34
  50. package/dist/quantization/ScalarQuantizer.d.ts.map +1 -1
  51. package/dist/quantization/ScalarQuantizer.js +346 -0
  52. package/dist/quantization/ScalarQuantizer.js.map +1 -0
  53. package/dist/storage/BatchWriter.d.ts.map +1 -1
  54. package/dist/storage/BatchWriter.js +351 -0
  55. package/dist/storage/BatchWriter.js.map +1 -0
  56. package/dist/storage/BunStorageBackend.d.ts +12 -5
  57. package/dist/storage/BunStorageBackend.d.ts.map +1 -1
  58. package/dist/storage/BunStorageBackend.js +182 -0
  59. package/dist/storage/BunStorageBackend.js.map +1 -0
  60. package/dist/storage/MemoryBackend.d.ts.map +1 -1
  61. package/dist/storage/MemoryBackend.js +109 -0
  62. package/dist/storage/MemoryBackend.js.map +1 -0
  63. package/dist/storage/OPFSBackend.d.ts +9 -1
  64. package/dist/storage/OPFSBackend.d.ts.map +1 -1
  65. package/dist/storage/OPFSBackend.js +325 -0
  66. package/dist/storage/OPFSBackend.js.map +1 -0
  67. package/dist/storage/StorageBackend.d.ts +1 -1
  68. package/dist/storage/StorageBackend.js +12 -0
  69. package/dist/storage/StorageBackend.js.map +1 -0
  70. package/dist/storage/WriteAheadLog.d.ts +15 -11
  71. package/dist/storage/WriteAheadLog.d.ts.map +1 -1
  72. package/dist/storage/WriteAheadLog.js +321 -0
  73. package/dist/storage/WriteAheadLog.js.map +1 -0
  74. package/dist/storage/createStorageBackend.d.ts +4 -0
  75. package/dist/storage/createStorageBackend.d.ts.map +1 -1
  76. package/dist/storage/createStorageBackend.js +119 -0
  77. package/dist/storage/createStorageBackend.js.map +1 -0
  78. package/dist/storage/index.d.ts +3 -3
  79. package/dist/storage/index.js +33 -0
  80. package/dist/storage/index.js.map +1 -0
  81. package/dist/storage/nodeFsRuntime.d.ts +14 -0
  82. package/dist/storage/nodeFsRuntime.d.ts.map +1 -0
  83. package/dist/storage/nodeFsRuntime.js +105 -0
  84. package/dist/storage/nodeFsRuntime.js.map +1 -0
  85. package/package.json +47 -23
  86. package/dist/Storage.d.ts +0 -54
  87. package/dist/Storage.d.ts.map +0 -1
  88. package/dist/backends/DistanceBackend.d.ts +0 -5
  89. package/dist/backends/DistanceBackend.d.ts.map +0 -1
  90. package/src/BinaryHeap.ts +0 -131
  91. package/src/Collection.ts +0 -695
  92. package/src/HNSWIndex.ts +0 -1839
  93. package/src/MaxBinaryHeap.ts +0 -175
  94. package/src/Storage.ts +0 -435
  95. package/src/VectorDB.ts +0 -109
  96. package/src/backends/DistanceBackend.ts +0 -17
  97. package/src/backends/JsDistanceBackend.ts +0 -227
  98. package/src/encoding/DeltaEncoder.ts +0 -217
  99. package/src/errors.ts +0 -110
  100. package/src/index.ts +0 -138
  101. package/src/presets.ts +0 -229
  102. package/src/quantization/ScalarQuantizer.ts +0 -383
  103. package/src/storage/BatchWriter.ts +0 -336
  104. package/src/storage/BunStorageBackend.ts +0 -161
  105. package/src/storage/MemoryBackend.ts +0 -120
  106. package/src/storage/OPFSBackend.ts +0 -250
  107. package/src/storage/StorageBackend.ts +0 -74
  108. package/src/storage/WriteAheadLog.ts +0 -326
  109. package/src/storage/createStorageBackend.ts +0 -137
  110. package/src/storage/index.ts +0 -53
@@ -1,6 +1,6 @@
1
1
  import { Collection } from './Collection';
2
+ import type { DistanceMetric } from './HNSWIndex';
2
3
  import type { StorageBackend } from './storage/StorageBackend';
3
- export type DistanceMetric = 'cosine' | 'euclidean' | 'dot_product';
4
4
  export interface VectorDBConfig {
5
5
  /**
6
6
  * Path for storing collections on disk. Default: './vectordb_data'
@@ -9,7 +9,7 @@ export interface VectorDBConfig {
9
9
  storagePath?: string;
10
10
  /**
11
11
  * Custom storage backend for platform-specific storage (e.g., OPFS for browsers).
12
- * If not provided, defaults to BunStorageBackend with storagePath.
12
+ * If not provided, backend is auto-selected for the current runtime.
13
13
  */
14
14
  storageBackend?: StorageBackend;
15
15
  }
@@ -21,24 +21,38 @@ export interface CollectionConfig {
21
21
  }
22
22
  export declare class VectorDB {
23
23
  private collections;
24
- private storagePath;
25
24
  private storageBackend;
26
25
  private initialized;
26
+ private initPromise;
27
+ private createCollectionLocks;
27
28
  constructor(config?: VectorDBConfig);
29
+ private createDefaultStorageBackend;
28
30
  /**
29
31
  * Get the storage backend used by this VectorDB instance.
30
32
  * Useful for custom storage operations or debugging.
31
33
  */
32
34
  getStorageBackend(): StorageBackend;
33
35
  /**
34
- * Initialize the VectorDB - creates storage directory if needed.
36
+ * Initialize the VectorDB - creates storage directory and loads existing collections.
35
37
  * Called automatically on first operation if not called explicitly.
38
+ * Safe to call concurrently — only runs initialization once.
36
39
  */
37
40
  init(): Promise<void>;
41
+ private doInit;
42
+ /**
43
+ * Load collection metadata from the manifest file and restore collections.
44
+ */
45
+ private loadManifest;
46
+ /**
47
+ * Save collection metadata to the manifest file.
48
+ */
49
+ private saveManifest;
50
+ private withCollectionCreateLock;
38
51
  createCollection(name: string, config: CollectionConfig): Promise<Collection>;
39
- getCollection(name: string): Collection | undefined;
52
+ getCollection(name: string): Promise<Collection | undefined>;
40
53
  listCollections(): Promise<string[]>;
41
54
  deleteCollection(name: string): Promise<void>;
55
+ private validateCollectionName;
42
56
  close(): Promise<void>;
43
57
  }
44
58
  //# sourceMappingURL=VectorDB.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VectorDB.d.ts","sourceRoot":"","sources":["../src/VectorDB.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAkB;gBAEzB,MAAM,CAAC,EAAE,cAAc;IAOnC;;;OAGG;IACH,iBAAiB,IAAI,cAAc;IAInC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAmBnF,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI7C,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIpC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
1
+ {"version":3,"file":"VectorDB.d.ts","sourceRoot":"","sources":["../src/VectorDB.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAO/D,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAaD,qBAAa,QAAQ;IACnB,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,qBAAqB,CAAyC;gBAE1D,MAAM,CAAC,EAAE,cAAc;IASnC,OAAO,CAAC,2BAA2B;IAcnC;;;OAGG;IACH,iBAAiB,IAAI,cAAc;IAInC;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAab,MAAM;IAUpB;;OAEG;YACW,YAAY;IAqD1B;;OAEG;YACW,YAAY;YAgBZ,wBAAwB;IAmBhC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAyB7E,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAK5D,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKpC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBnD,OAAO,CAAC,sBAAsB;IA+BxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAiC7B"}
@@ -0,0 +1,246 @@
1
+ import { Collection } from './Collection.js';
2
+ import { BunStorageBackend } from './storage/BunStorageBackend.js';
3
+ import { MemoryBackend } from './storage/MemoryBackend.js';
4
+ import { OPFSBackend } from './storage/OPFSBackend.js';
5
+ import { detectEnvironment } from './storage/createStorageBackend.js';
6
+ import { CollectionExistsError, CollectionNotFoundError, VectorDBError } from './errors.js';
7
+ const MANIFEST_KEY = 'manifest.json';
8
+ const VALID_METRICS = new Set(['cosine', 'euclidean', 'dot_product']);
9
+ export class VectorDB {
10
+ collections;
11
+ storageBackend;
12
+ initialized = false;
13
+ initPromise = null;
14
+ createCollectionLocks = new Map();
15
+ constructor(config) {
16
+ this.collections = new Map();
17
+ if (config?.storageBackend) {
18
+ this.storageBackend = config.storageBackend;
19
+ }
20
+ else {
21
+ this.storageBackend = this.createDefaultStorageBackend(config?.storagePath);
22
+ }
23
+ }
24
+ createDefaultStorageBackend(storagePath) {
25
+ const env = detectEnvironment();
26
+ if (env === 'bun' || env === 'node') {
27
+ return new BunStorageBackend(storagePath || './vectordb_data');
28
+ }
29
+ if (env === 'browser' && OPFSBackend.isAvailable()) {
30
+ return new OPFSBackend();
31
+ }
32
+ return new MemoryBackend();
33
+ }
34
+ /**
35
+ * Get the storage backend used by this VectorDB instance.
36
+ * Useful for custom storage operations or debugging.
37
+ */
38
+ getStorageBackend() {
39
+ return this.storageBackend;
40
+ }
41
+ /**
42
+ * Initialize the VectorDB - creates storage directory and loads existing collections.
43
+ * Called automatically on first operation if not called explicitly.
44
+ * Safe to call concurrently — only runs initialization once.
45
+ */
46
+ async init() {
47
+ if (this.initialized)
48
+ return;
49
+ if (!this.initPromise) {
50
+ this.initPromise = this.doInit().catch((err) => {
51
+ // Allow retry after transient initialization failures.
52
+ this.initPromise = null;
53
+ this.initialized = false;
54
+ throw err;
55
+ });
56
+ }
57
+ return this.initPromise;
58
+ }
59
+ async doInit() {
60
+ // Use storage backend to create root directory
61
+ await this.storageBackend.mkdir('');
62
+ // Load existing collections from manifest
63
+ await this.loadManifest();
64
+ this.initialized = true;
65
+ }
66
+ /**
67
+ * Load collection metadata from the manifest file and restore collections.
68
+ */
69
+ async loadManifest() {
70
+ const data = await this.storageBackend.read(MANIFEST_KEY);
71
+ if (!data)
72
+ return;
73
+ let manifest;
74
+ try {
75
+ const text = new TextDecoder().decode(data);
76
+ manifest = JSON.parse(text);
77
+ }
78
+ catch {
79
+ // Corrupt manifest JSON — continue with empty collections
80
+ return;
81
+ }
82
+ for (const [name, entry] of Object.entries(manifest)) {
83
+ // Skip collections already loaded
84
+ if (this.collections.has(name))
85
+ continue;
86
+ try {
87
+ this.validateCollectionName(name);
88
+ }
89
+ catch {
90
+ console.warn(`Skipping collection '${name}' with invalid name in manifest`);
91
+ continue;
92
+ }
93
+ // Validate manifest entry types to catch corrupted manifests early
94
+ if (typeof entry.dimension !== 'number' || entry.dimension <= 0 || !Number.isInteger(entry.dimension) ||
95
+ typeof entry.metric !== 'string' || !VALID_METRICS.has(entry.metric) ||
96
+ typeof entry.M !== 'number' || entry.M <= 0 || !Number.isInteger(entry.M) ||
97
+ typeof entry.efConstruction !== 'number' || entry.efConstruction <= 0 || !Number.isInteger(entry.efConstruction)) {
98
+ console.warn(`Skipping collection '${name}' with invalid manifest entry`);
99
+ continue;
100
+ }
101
+ const config = {
102
+ dimension: entry.dimension,
103
+ metric: entry.metric,
104
+ M: entry.M,
105
+ efConstruction: entry.efConstruction,
106
+ };
107
+ try {
108
+ const collection = new Collection(name, config, this.storageBackend, { autoPersist: true });
109
+ await collection.init();
110
+ this.collections.set(name, collection);
111
+ }
112
+ catch (e) {
113
+ // Per-collection init failure — skip this collection but continue loading others
114
+ console.warn(`Failed to load collection '${name}':`, e);
115
+ }
116
+ }
117
+ }
118
+ /**
119
+ * Save collection metadata to the manifest file.
120
+ */
121
+ async saveManifest() {
122
+ const manifest = {};
123
+ for (const [name, collection] of this.collections) {
124
+ manifest[name] = {
125
+ dimension: collection.getDimension(),
126
+ metric: collection.getMetric(),
127
+ M: collection.getM(),
128
+ efConstruction: collection.getEfConstruction(),
129
+ };
130
+ }
131
+ const data = new TextEncoder().encode(JSON.stringify(manifest));
132
+ await this.storageBackend.write(MANIFEST_KEY, data);
133
+ }
134
+ async withCollectionCreateLock(name, fn) {
135
+ const previous = this.createCollectionLocks.get(name) ?? Promise.resolve();
136
+ let release;
137
+ const lock = new Promise((resolve) => {
138
+ release = resolve;
139
+ });
140
+ this.createCollectionLocks.set(name, lock);
141
+ await previous;
142
+ try {
143
+ return await fn();
144
+ }
145
+ finally {
146
+ release();
147
+ if (this.createCollectionLocks.get(name) === lock) {
148
+ this.createCollectionLocks.delete(name);
149
+ }
150
+ }
151
+ }
152
+ async createCollection(name, config) {
153
+ this.validateCollectionName(name);
154
+ // Ensure VectorDB is initialized
155
+ await this.init();
156
+ return this.withCollectionCreateLock(name, async () => {
157
+ if (this.collections.has(name)) {
158
+ throw new CollectionExistsError(name);
159
+ }
160
+ // Create collection directory using storage backend
161
+ await this.storageBackend.mkdir(name);
162
+ const collection = new Collection(name, config, this.storageBackend, { autoPersist: true });
163
+ await collection.init();
164
+ this.collections.set(name, collection);
165
+ // Persist manifest
166
+ await this.saveManifest();
167
+ return collection;
168
+ });
169
+ }
170
+ async getCollection(name) {
171
+ await this.init();
172
+ return this.collections.get(name);
173
+ }
174
+ async listCollections() {
175
+ await this.init();
176
+ return [...this.collections.keys()];
177
+ }
178
+ async deleteCollection(name) {
179
+ await this.init();
180
+ const collection = this.collections.get(name);
181
+ if (!collection) {
182
+ throw new CollectionNotFoundError(name);
183
+ }
184
+ // Destroy without saving — we're deleting the collection
185
+ await collection.destroy(false);
186
+ this.collections.delete(name);
187
+ // Remove all files under the collection prefix, including versioned snapshots.
188
+ const keys = await this.storageBackend.list(name);
189
+ for (const key of keys) {
190
+ await this.storageBackend.delete(key).catch(() => { });
191
+ }
192
+ // Update manifest
193
+ await this.saveManifest();
194
+ }
195
+ validateCollectionName(name) {
196
+ if (!name || name.trim().length === 0) {
197
+ throw new VectorDBError('Collection name must be a non-empty string', 'VALIDATION_ERROR');
198
+ }
199
+ if (name.length > 255) {
200
+ throw new VectorDBError(`Collection name must be 255 characters or fewer, got ${name.length}`, 'VALIDATION_ERROR');
201
+ }
202
+ if (/[\/\\.\x00]/.test(name)) {
203
+ throw new VectorDBError(`Collection name '${name}' contains invalid characters (/, \\, ., or null)`, 'VALIDATION_ERROR');
204
+ }
205
+ // Reject control characters (U+0001–U+001F, U+007F)
206
+ // eslint-disable-next-line no-control-regex
207
+ if (/[\x01-\x1f\x7f]/.test(name)) {
208
+ throw new VectorDBError('Collection name contains control characters', 'VALIDATION_ERROR');
209
+ }
210
+ // Reject leading/trailing whitespace (checked after control chars since
211
+ // tab/etc. are control chars and should get the more specific message)
212
+ if (name !== name.trim()) {
213
+ throw new VectorDBError('Collection name must not have leading or trailing whitespace', 'VALIDATION_ERROR');
214
+ }
215
+ }
216
+ async close() {
217
+ // Close all collections — continue on individual failures so remaining
218
+ // collections still get saved and cleanup always completes.
219
+ const errors = [];
220
+ for (const collection of this.collections.values()) {
221
+ try {
222
+ await collection.destroy();
223
+ }
224
+ catch (e) {
225
+ errors.push(e instanceof Error ? e : new Error(String(e)));
226
+ }
227
+ }
228
+ // Persist the manifest so collection metadata survives re-open
229
+ if (this.initialized) {
230
+ try {
231
+ await this.saveManifest();
232
+ }
233
+ catch (e) {
234
+ errors.push(e instanceof Error ? e : new Error(String(e)));
235
+ }
236
+ }
237
+ this.collections.clear();
238
+ this.createCollectionLocks.clear();
239
+ this.initialized = false;
240
+ this.initPromise = null;
241
+ if (errors.length > 0) {
242
+ throw new VectorDBError(`Failed to close ${errors.length} collection(s): ${errors.map(e => e.message).join('; ')}`, 'STORAGE_ERROR');
243
+ }
244
+ }
245
+ }
246
+ //# sourceMappingURL=VectorDB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorDB.js","sourceRoot":"","sources":["../src/VectorDB.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Worker pool for parallel query processing.
3
+ * Dispatches queries to workers via round-robin for concurrent execution.
4
+ * Falls back to sequential processing when workers are unavailable.
5
+ */
6
+ import { HNSWIndex } from './HNSWIndex';
7
+ export declare class WorkerPool {
8
+ private numWorkers?;
9
+ private workers;
10
+ private nextQueryId;
11
+ private roundRobinIndex;
12
+ private initialized;
13
+ private fallbackIndex;
14
+ /**
15
+ * Create a worker pool for parallel HNSW search.
16
+ *
17
+ * @param numWorkers Number of workers (default: available hardware concurrency or 4)
18
+ */
19
+ constructor(numWorkers?: number | undefined);
20
+ /**
21
+ * Initialize workers with shared index data.
22
+ * When the index uses SharedArrayBuffer, workers receive zero-copy
23
+ * views into the same vector memory. Otherwise, data is copied.
24
+ *
25
+ * @param index The HNSW index to distribute to workers
26
+ */
27
+ init(index: HNSWIndex): Promise<void>;
28
+ /**
29
+ * Search for k nearest neighbors using worker pool.
30
+ * Dispatches to next available worker via round-robin.
31
+ *
32
+ * @param query Query vector
33
+ * @param k Number of results
34
+ * @param efSearch Search effort parameter
35
+ * @returns Array of {id, distance} results
36
+ */
37
+ search(query: Float32Array, k: number, efSearch?: number): Promise<Array<{
38
+ id: number;
39
+ distance: number;
40
+ }>>;
41
+ /**
42
+ * Quantized search using worker pool.
43
+ * Workers perform int8 candidate scan + float32 rescore.
44
+ *
45
+ * @param query Query vector
46
+ * @param k Number of results
47
+ * @param candidateMultiplier Multiplier for rescore candidates
48
+ * @param efSearch Search effort parameter
49
+ * @returns Array of {id, distance} results
50
+ */
51
+ searchQuantized(query: Float32Array, k: number, candidateMultiplier?: number, efSearch?: number): Promise<Array<{
52
+ id: number;
53
+ distance: number;
54
+ }>>;
55
+ /**
56
+ * Batch search: dispatch multiple queries in parallel across workers.
57
+ *
58
+ * @param queries Array of query vectors
59
+ * @param k Number of results per query
60
+ * @param efSearch Search effort parameter
61
+ * @returns Array of results, one per query
62
+ */
63
+ searchBatch(queries: Float32Array[], k: number, efSearch?: number): Promise<Array<Array<{
64
+ id: number;
65
+ distance: number;
66
+ }>>>;
67
+ /**
68
+ * Batch quantized search across workers.
69
+ */
70
+ searchBatchQuantized(queries: Float32Array[], k: number, candidateMultiplier?: number, efSearch?: number): Promise<Array<Array<{
71
+ id: number;
72
+ distance: number;
73
+ }>>>;
74
+ /**
75
+ * Send incremental graph updates to all workers.
76
+ * Workers update their neighbor lists without full re-initialization.
77
+ * New vectors are already visible via SharedArrayBuffer.
78
+ */
79
+ broadcastGraphUpdate(newNodes: Array<{
80
+ id: number;
81
+ neighbors: number[][];
82
+ }>, entryPointId?: number, maxLevel?: number): void;
83
+ /**
84
+ * Terminate all workers and clean up.
85
+ */
86
+ destroy(): void;
87
+ /**
88
+ * Get the number of active workers.
89
+ */
90
+ get workerCount(): number;
91
+ }
92
+ //# sourceMappingURL=WorkerPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerPool.d.ts","sourceRoot":"","sources":["../src/WorkerPool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAUxC,qBAAa,UAAU;IAYT,OAAO,CAAC,UAAU,CAAC;IAX/B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAA0B;IAE/C;;;;OAIG;gBACiB,UAAU,CAAC,EAAE,MAAM,YAAA;IAQvC;;;;;;OAMG;IACG,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAmG3C;;;;;;;;OAQG;IACG,MAAM,CACV,KAAK,EAAE,YAAY,EACnB,CAAC,EAAE,MAAM,EACT,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IA4BnD;;;;;;;;;OASG;IACG,eAAe,CACnB,KAAK,EAAE,YAAY,EACnB,CAAC,EAAE,MAAM,EACT,mBAAmB,GAAE,MAAU,EAC/B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IA8BnD;;;;;;;OAOG;IACG,WAAW,CACf,OAAO,EAAE,YAAY,EAAE,EACvB,CAAC,EAAE,MAAM,EACT,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAc1D;;OAEG;IACG,oBAAoB,CACxB,OAAO,EAAE,YAAY,EAAE,EACvB,CAAC,EAAE,MAAM,EACT,mBAAmB,GAAE,MAAU,EAC/B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAa1D;;;;OAIG;IACH,oBAAoB,CAClB,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAA;KAAE,CAAC,EACtD,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI;IAgBP;;OAEG;IACH,OAAO,IAAI,IAAI;IAcf;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;CACF"}