verso-db 0.1.5 → 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 (94) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +13 -7
  3. package/dist/BinaryHeap.d.ts +11 -1
  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 +30 -4
  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 +59 -0
  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 -64
  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 +57 -4
  20. package/dist/SearchWorker.d.ts.map +1 -1
  21. package/dist/SearchWorker.js +573 -0
  22. package/dist/SearchWorker.js.map +1 -0
  23. package/dist/VectorDB.d.ts.map +1 -1
  24. package/dist/VectorDB.js +246 -0
  25. package/dist/VectorDB.js.map +1 -0
  26. package/dist/WorkerPool.d.ts +32 -2
  27. package/dist/WorkerPool.d.ts.map +1 -1
  28. package/dist/WorkerPool.js +266 -0
  29. package/dist/WorkerPool.js.map +1 -0
  30. package/dist/backends/JsDistanceBackend.d.ts.map +1 -1
  31. package/dist/backends/JsDistanceBackend.js +163 -0
  32. package/dist/backends/JsDistanceBackend.js.map +1 -0
  33. package/dist/encoding/DeltaEncoder.d.ts +2 -2
  34. package/dist/encoding/DeltaEncoder.d.ts.map +1 -1
  35. package/dist/encoding/DeltaEncoder.js +199 -0
  36. package/dist/encoding/DeltaEncoder.js.map +1 -0
  37. package/dist/errors.js +97 -0
  38. package/dist/errors.js.map +1 -0
  39. package/dist/index.d.ts +3 -3
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +61 -42
  42. package/dist/index.js.map +1 -9
  43. package/dist/presets.js +205 -0
  44. package/dist/presets.js.map +1 -0
  45. package/dist/quantization/ScalarQuantizer.d.ts +0 -34
  46. package/dist/quantization/ScalarQuantizer.d.ts.map +1 -1
  47. package/dist/quantization/ScalarQuantizer.js +346 -0
  48. package/dist/quantization/ScalarQuantizer.js.map +1 -0
  49. package/dist/storage/BatchWriter.js +351 -0
  50. package/dist/storage/BatchWriter.js.map +1 -0
  51. package/dist/storage/BunStorageBackend.d.ts +7 -3
  52. package/dist/storage/BunStorageBackend.d.ts.map +1 -1
  53. package/dist/storage/BunStorageBackend.js +182 -0
  54. package/dist/storage/BunStorageBackend.js.map +1 -0
  55. package/dist/storage/MemoryBackend.js +109 -0
  56. package/dist/storage/MemoryBackend.js.map +1 -0
  57. package/dist/storage/OPFSBackend.d.ts.map +1 -1
  58. package/dist/storage/OPFSBackend.js +325 -0
  59. package/dist/storage/OPFSBackend.js.map +1 -0
  60. package/dist/storage/StorageBackend.js +12 -0
  61. package/dist/storage/StorageBackend.js.map +1 -0
  62. package/dist/storage/WriteAheadLog.js +321 -0
  63. package/dist/storage/WriteAheadLog.js.map +1 -0
  64. package/dist/storage/createStorageBackend.d.ts +4 -0
  65. package/dist/storage/createStorageBackend.d.ts.map +1 -1
  66. package/dist/storage/createStorageBackend.js +119 -0
  67. package/dist/storage/createStorageBackend.js.map +1 -0
  68. package/{src/storage/index.ts → dist/storage/index.js} +7 -27
  69. package/dist/storage/index.js.map +1 -0
  70. package/dist/storage/nodeFsRuntime.d.ts +14 -0
  71. package/dist/storage/nodeFsRuntime.d.ts.map +1 -0
  72. package/dist/storage/nodeFsRuntime.js +105 -0
  73. package/dist/storage/nodeFsRuntime.js.map +1 -0
  74. package/package.json +9 -7
  75. package/src/BinaryHeap.ts +0 -136
  76. package/src/Collection.ts +0 -1262
  77. package/src/HNSWIndex.ts +0 -2894
  78. package/src/MaxBinaryHeap.ts +0 -181
  79. package/src/SearchWorker.ts +0 -264
  80. package/src/VectorDB.ts +0 -319
  81. package/src/WorkerPool.ts +0 -222
  82. package/src/backends/JsDistanceBackend.ts +0 -171
  83. package/src/encoding/DeltaEncoder.ts +0 -236
  84. package/src/errors.ts +0 -110
  85. package/src/index.ts +0 -106
  86. package/src/presets.ts +0 -229
  87. package/src/quantization/ScalarQuantizer.ts +0 -487
  88. package/src/storage/BatchWriter.ts +0 -420
  89. package/src/storage/BunStorageBackend.ts +0 -199
  90. package/src/storage/MemoryBackend.ts +0 -122
  91. package/src/storage/OPFSBackend.ts +0 -348
  92. package/src/storage/StorageBackend.ts +0 -74
  93. package/src/storage/WriteAheadLog.ts +0 -379
  94. package/src/storage/createStorageBackend.ts +0 -137
package/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ # [0.2.0](https://github.com/briansunter/verso/compare/v0.1.5...v0.2.0) (2026-03-15)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * comprehensive codebase audit - fix bugs, improve error handling, remove dead code ([3a95681](https://github.com/briansunter/verso/commit/3a95681365477b0a000a78beeebf95a6269bd90c))
7
+
8
+
9
+ ### Features
10
+
11
+ * gracefully skip browser smoke test when Playwright unavailable in CI ([55bf0fd](https://github.com/briansunter/verso/commit/55bf0fd238b15263860fdd2c914910efd565323d))
12
+ * worker parallelism with SharedArrayBuffer, quantized search, and parallel build ([ccdf9b3](https://github.com/briansunter/verso/commit/ccdf9b32d6bd0f0840a1799b6866e006a62fcbd3))
13
+
1
14
  ## [0.1.5](https://github.com/briansunter/verso/compare/v0.1.4...v0.1.5) (2026-02-28)
2
15
 
3
16
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Verso
2
2
 
3
- High-performance vector search with HNSW indexing for Bun and Browser.
3
+ High-performance vector search with HNSW indexing for Bun, Node.js, and Browser.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/verso-db.svg)](https://www.npmjs.com/package/verso-db)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
@@ -18,7 +18,7 @@ High-performance vector search with HNSW indexing for Bun and Browser.
18
18
  - **HNSW Algorithm** - Hierarchical Navigable Small World for fast approximate nearest neighbor search
19
19
  - **Multiple Distance Metrics** - Cosine similarity, Euclidean, dot product
20
20
  - **Int8 Quantization** - 4x memory reduction with minimal recall loss
21
- - **Multi-Platform** - Bun (file system) and Browser (OPFS)
21
+ - **Multi-Platform** - Bun/Node.js (file system) and Browser (OPFS)
22
22
  - **Parameter Presets** - Pre-tuned configurations for different use cases
23
23
  - **Batch Queries** - Efficient batch processing for throughput
24
24
  - **Metadata Filtering** - MongoDB-style query operators
@@ -29,7 +29,7 @@ High-performance vector search with HNSW indexing for Bun and Browser.
29
29
  # Bun
30
30
  bun add verso-db
31
31
 
32
- # npm
32
+ # npm / Node.js
33
33
  npm install verso-db
34
34
  ```
35
35
 
@@ -77,6 +77,9 @@ const results = await collection.query({
77
77
  console.log(results.ids); // ['doc1', 'doc2', 'doc3']
78
78
  console.log(results.distances); // [0.01, 0.05, 0.12]
79
79
  console.log(results.metadata); // [{ title: 'Document 1', ... }, ...]
80
+
81
+ // Optional: release resources explicitly
82
+ await db.close();
80
83
  ```
81
84
 
82
85
  ## API Reference
@@ -140,16 +143,19 @@ const batchResults = await collection.queryBatch([
140
143
  { queryVector: vec2, k: 5, filter: { type: 'article' } }
141
144
  ]);
142
145
 
143
- // Delete a single vector (synchronous, returns boolean)
144
- collection.delete('id1');
146
+ // Delete a single vector
147
+ await collection.delete('id1');
145
148
 
146
149
  // Delete multiple vectors
147
- collection.deleteBatch(['id1', 'id2']);
150
+ await collection.deleteBatch(['id1', 'id2']);
148
151
 
149
152
  // Check existence
150
153
  collection.has('id1'); // true if active (not deleted)
151
154
  collection.count(); // number of active vectors
152
155
 
156
+ // Flush pending writes when using Collection directly
157
+ await collection.flush();
158
+
153
159
  // Compact — permanently remove deleted vectors and reclaim space
154
160
  await collection.compact();
155
161
  ```
@@ -220,7 +226,7 @@ Verso automatically selects the appropriate storage backend:
220
226
 
221
227
  | Environment | Backend | Storage |
222
228
  |-------------|---------|---------|
223
- | Bun | `BunStorageBackend` | File system |
229
+ | Bun / Node.js | `BunStorageBackend` | File system |
224
230
  | Browser | `OPFSBackend` | Origin Private File System |
225
231
  | Fallback | `MemoryBackend` | In-memory (no persistence) |
226
232
 
@@ -3,7 +3,8 @@ export declare class BinaryHeap {
3
3
  private dists;
4
4
  private _size;
5
5
  private capacity;
6
- constructor(capacity: number);
6
+ private readonly isMaxHeap;
7
+ constructor(capacity: number, isMaxHeap?: boolean);
7
8
  /**
8
9
  * Push an element onto the heap.
9
10
  * Auto-grows when at capacity to avoid silently dropping elements.
@@ -23,4 +24,13 @@ export declare class BinaryHeap {
23
24
  private heapifyUp;
24
25
  private heapifyDown;
25
26
  }
27
+ /**
28
+ * MaxBinaryHeap - A max-heap for HNSW result tracking.
29
+ *
30
+ * Keeps the FURTHEST element at the top, allowing O(log n) eviction
31
+ * of the worst result when a better one is found.
32
+ */
33
+ export declare class MaxBinaryHeap extends BinaryHeap {
34
+ constructor(capacity: number);
35
+ }
26
36
  //# sourceMappingURL=BinaryHeap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BinaryHeap.d.ts","sourceRoot":"","sources":["../src/BinaryHeap.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU;IACrB,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAO5B;;;OAGG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAWpC;;OAEG;IACH,OAAO,CAAC,IAAI;IAWZ,GAAG,IAAI,MAAM;IAab,IAAI,IAAI,MAAM;IAId,SAAS,IAAI,MAAM;IAInB,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,IAAI;IAIb,OAAO,IAAI,OAAO;IAIlB,WAAW,IAAI,MAAM;IAIrB,OAAO,CAAC,SAAS;IAuBjB,OAAO,CAAC,WAAW;CAiCpB"}
1
+ {"version":3,"file":"BinaryHeap.d.ts","sourceRoot":"","sources":["../src/BinaryHeap.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU;IACrB,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;gBAExB,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe;IAQxD;;;OAGG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAWpC;;OAEG;IACH,OAAO,CAAC,IAAI;IAWZ,GAAG,IAAI,MAAM;IAab,IAAI,IAAI,MAAM;IAId,SAAS,IAAI,MAAM;IAKnB,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,IAAI;IAIb,OAAO,IAAI,OAAO;IAIlB,WAAW,IAAI,MAAM;IAIrB,OAAO,CAAC,SAAS;IAwBjB,OAAO,CAAC,WAAW;CAkCpB;AAED;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,UAAU;gBAC/B,QAAQ,EAAE,MAAM;CAG7B"}
@@ -0,0 +1,138 @@
1
+ export class BinaryHeap {
2
+ ids;
3
+ dists;
4
+ _size;
5
+ capacity;
6
+ isMaxHeap;
7
+ constructor(capacity, isMaxHeap = false) {
8
+ this.capacity = capacity;
9
+ this.isMaxHeap = isMaxHeap;
10
+ this.ids = new Uint32Array(capacity);
11
+ this.dists = new Float32Array(capacity);
12
+ this._size = 0;
13
+ }
14
+ /**
15
+ * Push an element onto the heap.
16
+ * Auto-grows when at capacity to avoid silently dropping elements.
17
+ */
18
+ push(id, dist) {
19
+ if (this._size >= this.capacity) {
20
+ this.grow();
21
+ }
22
+ this.ids[this._size] = id;
23
+ this.dists[this._size] = dist;
24
+ this._size++;
25
+ this.heapifyUp(this._size - 1);
26
+ }
27
+ /**
28
+ * Double the heap capacity when full.
29
+ */
30
+ grow() {
31
+ const newCapacity = Math.max(this.capacity * 2, 16);
32
+ const newIds = new Uint32Array(newCapacity);
33
+ const newDists = new Float32Array(newCapacity);
34
+ newIds.set(this.ids);
35
+ newDists.set(this.dists);
36
+ this.ids = newIds;
37
+ this.dists = newDists;
38
+ this.capacity = newCapacity;
39
+ }
40
+ pop() {
41
+ if (this._size === 0)
42
+ return -1;
43
+ const result = this.ids[0];
44
+ this._size--;
45
+ if (this._size > 0) {
46
+ this.ids[0] = this.ids[this._size];
47
+ this.dists[0] = this.dists[this._size];
48
+ this.heapifyDown(0);
49
+ }
50
+ return result;
51
+ }
52
+ peek() {
53
+ return this._size > 0 ? this.ids[0] : -1;
54
+ }
55
+ peekValue() {
56
+ if (this._size > 0)
57
+ return this.dists[0];
58
+ return this.isMaxHeap ? -Infinity : Infinity;
59
+ }
60
+ size() {
61
+ return this._size;
62
+ }
63
+ clear() {
64
+ this._size = 0;
65
+ }
66
+ isEmpty() {
67
+ return this._size === 0;
68
+ }
69
+ getCapacity() {
70
+ return this.capacity;
71
+ }
72
+ heapifyUp(index) {
73
+ // Cache array references to avoid repeated property lookups
74
+ const ids = this.ids;
75
+ const dists = this.dists;
76
+ const isMax = this.isMaxHeap;
77
+ while (index > 0) {
78
+ // Use bitwise shift for faster integer division
79
+ const parentIndex = (index - 1) >> 1;
80
+ if (isMax ? dists[parentIndex] >= dists[index] : dists[parentIndex] <= dists[index])
81
+ break;
82
+ // Inline swap for performance
83
+ const tmpId = ids[index];
84
+ ids[index] = ids[parentIndex];
85
+ ids[parentIndex] = tmpId;
86
+ const tmpDist = dists[index];
87
+ dists[index] = dists[parentIndex];
88
+ dists[parentIndex] = tmpDist;
89
+ index = parentIndex;
90
+ }
91
+ }
92
+ heapifyDown(index) {
93
+ // Cache array references to avoid repeated property lookups
94
+ const ids = this.ids;
95
+ const dists = this.dists;
96
+ const size = this._size;
97
+ const isMax = this.isMaxHeap;
98
+ while (true) {
99
+ const leftChild = (index << 1) + 1; // 2 * index + 1
100
+ const rightChild = leftChild + 1; // 2 * index + 2
101
+ let best = index;
102
+ if (isMax) {
103
+ if (leftChild < size && dists[leftChild] > dists[best])
104
+ best = leftChild;
105
+ if (rightChild < size && dists[rightChild] > dists[best])
106
+ best = rightChild;
107
+ }
108
+ else {
109
+ if (leftChild < size && dists[leftChild] < dists[best])
110
+ best = leftChild;
111
+ if (rightChild < size && dists[rightChild] < dists[best])
112
+ best = rightChild;
113
+ }
114
+ if (best === index)
115
+ break;
116
+ // Inline swap for performance
117
+ const tmpId = ids[index];
118
+ ids[index] = ids[best];
119
+ ids[best] = tmpId;
120
+ const tmpDist = dists[index];
121
+ dists[index] = dists[best];
122
+ dists[best] = tmpDist;
123
+ index = best;
124
+ }
125
+ }
126
+ }
127
+ /**
128
+ * MaxBinaryHeap - A max-heap for HNSW result tracking.
129
+ *
130
+ * Keeps the FURTHEST element at the top, allowing O(log n) eviction
131
+ * of the worst result when a better one is found.
132
+ */
133
+ export class MaxBinaryHeap extends BinaryHeap {
134
+ constructor(capacity) {
135
+ super(capacity, true);
136
+ }
137
+ }
138
+ //# sourceMappingURL=BinaryHeap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BinaryHeap.js","sourceRoot":"","sources":["../src/BinaryHeap.ts"],"names":[],"mappings":"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"}
@@ -63,6 +63,13 @@ export interface QueryResult {
63
63
  distances: number[];
64
64
  metadata: Array<Record<string, any>>;
65
65
  }
66
+ export interface CollectionOptions {
67
+ /**
68
+ * Persist mutating operations automatically after they complete.
69
+ * VectorDB-managed collections enable this by default.
70
+ */
71
+ autoPersist?: boolean;
72
+ }
66
73
  export declare class Collection {
67
74
  private static readonly MAX_INTERNAL_ID;
68
75
  private name;
@@ -85,13 +92,27 @@ export declare class Collection {
85
92
  private deletedIds;
86
93
  private nextNumericId;
87
94
  private activeCount;
95
+ private readonly autoPersist;
96
+ private dirty;
97
+ private mutationLock;
88
98
  constructor(name: string, config: {
89
99
  dimension: number;
90
100
  metric?: DistanceMetric;
91
101
  M?: number;
92
102
  efConstruction?: number;
93
- }, storage: StorageBackend);
103
+ }, storage: StorageBackend, options?: CollectionOptions);
94
104
  init(): Promise<void>;
105
+ private withMutationLock;
106
+ flush(): Promise<void>;
107
+ private captureMutationSnapshot;
108
+ private restoreMutationSnapshot;
109
+ /**
110
+ * Wrap a mutation in snapshot-capture + auto-persist.
111
+ * The mutation fn should set `this.dirty = true` when it mutates state.
112
+ * If autoPersist is on and dirty was set, saves after fn completes.
113
+ * On error, restores from snapshot.
114
+ */
115
+ private withAutoSave;
95
116
  private reserveNumericIds;
96
117
  private setActiveStorageKeys;
97
118
  private isValidStorageState;
@@ -126,6 +147,7 @@ export declare class Collection {
126
147
  * For new IDs, behaves identically to add().
127
148
  */
128
149
  upsert(config: AddConfig): Promise<void>;
150
+ private addInternal;
129
151
  /** Returns the vector dimension for this collection. */
130
152
  getDimension(): number;
131
153
  /** Returns the distance metric for this collection. */
@@ -156,14 +178,15 @@ export declare class Collection {
156
178
  * @param id The string ID of the vector to delete
157
179
  * @returns true if the vector was deleted, false if it didn't exist or was already deleted
158
180
  */
159
- delete(id: string): boolean;
181
+ private deleteInternal;
182
+ delete(id: string): Promise<boolean>;
160
183
  /**
161
184
  * Mark multiple vectors as deleted (tombstone deletion).
162
185
  *
163
186
  * @param ids Array of string IDs to delete
164
187
  * @returns Number of vectors that were successfully deleted
165
188
  */
166
- deleteBatch(ids: string[]): number;
189
+ deleteBatch(ids: string[]): Promise<number>;
167
190
  /**
168
191
  * Check if a vector exists and is not deleted.
169
192
  */
@@ -177,8 +200,9 @@ export declare class Collection {
177
200
  * Remaps all internal IDs so that graph neighbors are stored
178
201
  * contiguously in memory, improving search cache hit rates.
179
202
  */
180
- reorderIndex(): void;
203
+ reorderIndex(): Promise<void>;
181
204
  saveToDisk(): Promise<void>;
205
+ private saveToDiskUnlocked;
182
206
  private executeQuery;
183
207
  private searchCandidates;
184
208
  private filterAndDeduplicateResults;
@@ -189,8 +213,10 @@ export declare class Collection {
189
213
  private matchesFilter;
190
214
  private validateFilterOperators;
191
215
  private validateAddInput;
216
+ private validateMetadataValue;
192
217
  private parseMetadataLine;
193
218
  private isPlainObject;
219
+ private isFilterObject;
194
220
  private isOperatorObject;
195
221
  private deepEqual;
196
222
  private matchesInOperator;
@@ -1 +1 @@
1
- {"version":3,"file":"Collection.d.ts","sourceRoot":"","sources":["../src/Collection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Collection.d.ts","sourceRoot":"","sources":["../src/Collection.ts"],"names":[],"mappings":"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"}