xitdb 0.13.0 → 0.15.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 (61) hide show
  1. package/README.md +129 -15
  2. package/dist/core-buffered-file.d.ts +2 -2
  3. package/dist/core-buffered-file.js +182 -0
  4. package/dist/core-file.d.ts +1 -1
  5. package/dist/core-file.js +105 -0
  6. package/dist/core-memory.d.ts +1 -1
  7. package/dist/core-memory.js +152 -0
  8. package/dist/core.js +1 -0
  9. package/dist/database.d.ts +174 -49
  10. package/dist/database.js +3047 -0
  11. package/dist/exceptions.d.ts +4 -0
  12. package/dist/exceptions.js +62 -0
  13. package/dist/hasher.js +49 -0
  14. package/dist/index.d.ts +30 -26
  15. package/dist/index.js +35 -3923
  16. package/dist/read-array-list.d.ts +4 -3
  17. package/dist/read-array-list.js +41 -0
  18. package/dist/read-counted-hash-map.d.ts +2 -2
  19. package/dist/read-counted-hash-map.js +19 -0
  20. package/dist/read-counted-hash-set.d.ts +2 -2
  21. package/dist/read-counted-hash-set.js +19 -0
  22. package/dist/read-cursor.d.ts +16 -5
  23. package/dist/read-cursor.js +678 -0
  24. package/dist/read-hash-map.d.ts +4 -4
  25. package/dist/read-hash-map.js +65 -0
  26. package/dist/read-hash-set.d.ts +4 -4
  27. package/dist/read-hash-set.js +47 -0
  28. package/dist/read-linked-array-list.d.ts +4 -3
  29. package/dist/read-linked-array-list.js +41 -0
  30. package/dist/read-sorted-map.d.ts +21 -0
  31. package/dist/read-sorted-map.js +73 -0
  32. package/dist/read-sorted-set.d.ts +19 -0
  33. package/dist/read-sorted-set.js +65 -0
  34. package/dist/slot-pointer.d.ts +1 -1
  35. package/dist/slot-pointer.js +11 -0
  36. package/dist/slot.d.ts +2 -2
  37. package/dist/slot.js +41 -0
  38. package/dist/slotted.d.ts +1 -1
  39. package/dist/slotted.js +1 -0
  40. package/dist/tag.d.ts +3 -1
  41. package/dist/tag.js +25 -0
  42. package/dist/write-array-list.d.ts +4 -4
  43. package/dist/write-array-list.js +42 -0
  44. package/dist/write-counted-hash-map.d.ts +2 -2
  45. package/dist/write-counted-hash-map.js +18 -0
  46. package/dist/write-counted-hash-set.d.ts +2 -2
  47. package/dist/write-counted-hash-set.js +18 -0
  48. package/dist/write-cursor.d.ts +5 -5
  49. package/dist/write-cursor.js +124 -0
  50. package/dist/write-hash-map.d.ts +4 -4
  51. package/dist/write-hash-map.js +90 -0
  52. package/dist/write-hash-set.d.ts +4 -4
  53. package/dist/write-hash-set.js +59 -0
  54. package/dist/write-linked-array-list.d.ts +4 -4
  55. package/dist/write-linked-array-list.js +52 -0
  56. package/dist/write-sorted-map.d.ts +12 -0
  57. package/dist/write-sorted-map.js +37 -0
  58. package/dist/write-sorted-set.d.ts +10 -0
  59. package/dist/write-sorted-set.js +29 -0
  60. package/dist/writeable-data.js +68 -0
  61. package/package.json +6 -6
@@ -0,0 +1,152 @@
1
+ export class CoreMemory {
2
+ memory;
3
+ constructor() {
4
+ this.memory = new RandomAccessMemory();
5
+ }
6
+ reader() {
7
+ return this.memory;
8
+ }
9
+ writer() {
10
+ return this.memory;
11
+ }
12
+ length() {
13
+ return this.memory.size();
14
+ }
15
+ seek(pos) {
16
+ this.memory.seek(pos);
17
+ }
18
+ position() {
19
+ return this.memory.getPosition();
20
+ }
21
+ setLength(len) {
22
+ this.memory.setLength(len);
23
+ }
24
+ flush() {
25
+ // no-op for in-memory
26
+ }
27
+ sync() {
28
+ // no-op for in-memory
29
+ }
30
+ }
31
+ class RandomAccessMemory {
32
+ buffer;
33
+ _position = 0;
34
+ _count = 0;
35
+ constructor(initialSize = 1024) {
36
+ this.buffer = new Uint8Array(initialSize);
37
+ }
38
+ ensureCapacity(minCapacity) {
39
+ if (minCapacity > this.buffer.length) {
40
+ let newCapacity = this.buffer.length * 2;
41
+ if (newCapacity < minCapacity) {
42
+ newCapacity = minCapacity;
43
+ }
44
+ const newBuffer = new Uint8Array(newCapacity);
45
+ newBuffer.set(this.buffer.subarray(0, this._count));
46
+ this.buffer = newBuffer;
47
+ }
48
+ }
49
+ size() {
50
+ return this._count;
51
+ }
52
+ seek(pos) {
53
+ if (pos > this._count) {
54
+ this._position = this._count;
55
+ }
56
+ else {
57
+ this._position = pos;
58
+ }
59
+ }
60
+ getPosition() {
61
+ return this._position;
62
+ }
63
+ setLength(len) {
64
+ if (len === 0) {
65
+ this.reset();
66
+ }
67
+ else {
68
+ if (len > this._count)
69
+ throw new Error('Cannot extend length');
70
+ this._count = len;
71
+ if (this._position > len) {
72
+ this._position = len;
73
+ }
74
+ }
75
+ }
76
+ reset() {
77
+ this._count = 0;
78
+ this._position = 0;
79
+ }
80
+ toByteArray() {
81
+ return this.buffer.slice(0, this._count);
82
+ }
83
+ // DataWriter interface
84
+ write(data) {
85
+ const pos = this._position;
86
+ if (pos < this._count) {
87
+ const bytesBeforeEnd = Math.min(data.length, this._count - pos);
88
+ for (let i = 0; i < bytesBeforeEnd; i++) {
89
+ this.buffer[pos + i] = data[i];
90
+ }
91
+ if (bytesBeforeEnd < data.length) {
92
+ const bytesAfterEnd = data.length - bytesBeforeEnd;
93
+ this.ensureCapacity(this._count + bytesAfterEnd);
94
+ this.buffer.set(data.subarray(bytesBeforeEnd), this._count);
95
+ this._count += bytesAfterEnd;
96
+ }
97
+ }
98
+ else {
99
+ this.ensureCapacity(this._count + data.length);
100
+ this.buffer.set(data, this._count);
101
+ this._count += data.length;
102
+ }
103
+ this._position = pos + data.length;
104
+ }
105
+ writeByte(v) {
106
+ this.write(new Uint8Array([v & 0xff]));
107
+ }
108
+ writeShort(v) {
109
+ const buffer = new ArrayBuffer(2);
110
+ const view = new DataView(buffer);
111
+ view.setInt16(0, v, false); // big-endian
112
+ this.write(new Uint8Array(buffer));
113
+ }
114
+ writeLong(v) {
115
+ const buffer = new ArrayBuffer(8);
116
+ const view = new DataView(buffer);
117
+ view.setBigInt64(0, BigInt(v), false);
118
+ this.write(new Uint8Array(buffer));
119
+ }
120
+ // DataReader interface
121
+ readFully(b) {
122
+ const pos = this._position;
123
+ if (pos + b.length > this._count) {
124
+ throw new Error('End of stream');
125
+ }
126
+ b.set(this.buffer.subarray(pos, pos + b.length));
127
+ this._position = pos + b.length;
128
+ }
129
+ readByte() {
130
+ const bytes = new Uint8Array(1);
131
+ this.readFully(bytes);
132
+ return bytes[0];
133
+ }
134
+ readShort() {
135
+ const bytes = new Uint8Array(2);
136
+ this.readFully(bytes);
137
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
138
+ return view.getInt16(0, false); // big-endian
139
+ }
140
+ readInt() {
141
+ const bytes = new Uint8Array(4);
142
+ this.readFully(bytes);
143
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
144
+ return view.getInt32(0, false); // big-endian
145
+ }
146
+ readLong() {
147
+ const bytes = new Uint8Array(8);
148
+ this.readFully(bytes);
149
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
150
+ return Number(view.getBigInt64(0, false));
151
+ }
152
+ }
package/dist/core.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -1,19 +1,24 @@
1
- import type { Core } from './core';
2
- import { Hasher } from './hasher';
3
- import { Tag } from './tag';
4
- import { Slot } from './slot';
5
- import { SlotPointer } from './slot-pointer';
6
- import { type WriteableData } from './writeable-data';
7
- import { WriteCursor } from './write-cursor';
1
+ import type { Core } from './core.js';
2
+ import { Hasher } from './hasher.js';
3
+ import { Tag } from './tag.js';
4
+ import { Slot } from './slot.js';
5
+ import { SlotPointer } from './slot-pointer.js';
6
+ import { type WriteableData } from './writeable-data.js';
7
+ import { WriteCursor } from './write-cursor.js';
8
8
  export declare const VERSION = 0;
9
9
  export declare const MAGIC_NUMBER: Uint8Array<ArrayBuffer>;
10
10
  export declare const BIT_COUNT = 4;
11
11
  export declare const SLOT_COUNT: number;
12
12
  export declare const MASK: bigint;
13
13
  export declare const INDEX_BLOCK_SIZE: number;
14
- export declare const LINKED_ARRAY_LIST_SLOT_LENGTH: number;
15
- export declare const LINKED_ARRAY_LIST_INDEX_BLOCK_SIZE: number;
16
14
  export declare const MAX_BRANCH_LENGTH = 16;
15
+ export declare const BTREE_SLOT_COUNT: number;
16
+ export declare const BTREE_SPLIT_COUNT: number;
17
+ export declare const BTREE_NODE_HEADER_SIZE = 2;
18
+ export declare const BTREE_LEAF_BLOCK_SIZE: number;
19
+ export declare const BTREE_BRANCH_BLOCK_SIZE: number;
20
+ export declare const SORTED_LEAF_BLOCK_SIZE: number;
21
+ export declare const SORTED_BRANCH_BLOCK_SIZE: number;
17
22
  export declare enum WriteMode {
18
23
  READ_ONLY = 0,
19
24
  READ_WRITE = 1
@@ -48,15 +53,13 @@ export declare class TopLevelArrayListHeader {
48
53
  constructor(fileSize: number, parent: ArrayListHeader);
49
54
  toBytes(): Uint8Array;
50
55
  }
51
- export declare class LinkedArrayListHeader {
52
- shift: number;
53
- ptr: number;
56
+ export declare class BTreeHeader {
57
+ rootPtr: number;
54
58
  size: number;
55
- static readonly LENGTH = 17;
56
- constructor(shift: number, ptr: number, size: number);
59
+ static readonly LENGTH = 16;
60
+ constructor(rootPtr: number, size: number);
57
61
  toBytes(): Uint8Array;
58
- static fromBytes(bytes: Uint8Array): LinkedArrayListHeader;
59
- withPtr(ptr: number): LinkedArrayListHeader;
62
+ static fromBytes(bytes: Uint8Array): BTreeHeader;
60
63
  }
61
64
  export declare class KeyValuePair {
62
65
  valueSlot: Slot;
@@ -67,28 +70,89 @@ export declare class KeyValuePair {
67
70
  toBytes(): Uint8Array;
68
71
  static fromBytes(bytes: Uint8Array, hashSize: number): KeyValuePair;
69
72
  }
70
- export declare class LinkedArrayListSlot {
71
- size: number;
73
+ export declare enum BTreeNodeKind {
74
+ LEAF = 0,
75
+ BRANCH = 1
76
+ }
77
+ export declare class BTreeNode {
78
+ kind: BTreeNodeKind;
79
+ num: number;
80
+ values: Slot[];
81
+ children: Slot[];
82
+ counts: number[];
83
+ constructor(kind: BTreeNodeKind, num: number);
84
+ subtreeCount(): number;
85
+ }
86
+ export declare class BTreeNodeRef {
87
+ nodePtr: number;
88
+ count: number;
89
+ constructor(nodePtr: number, count: number);
90
+ }
91
+ export declare class BTreeInsertResult {
92
+ nodePtr: number;
93
+ count: number;
94
+ valuePosition: number;
95
+ split: BTreeNodeRef | null;
96
+ constructor(nodePtr: number, count: number, valuePosition: number, split: BTreeNodeRef | null);
97
+ }
98
+ export declare class BTreeWriteSlot {
99
+ nodePtr: number;
100
+ valuePosition: number;
72
101
  slot: Slot;
73
- static readonly LENGTH: number;
74
- constructor(size: number, slot: Slot);
75
- withSize(size: number): LinkedArrayListSlot;
76
- toBytes(): Uint8Array;
77
- static fromBytes(bytes: Uint8Array): LinkedArrayListSlot;
78
- }
79
- export declare class LinkedArrayListSlotPointer {
80
- slotPtr: SlotPointer;
81
- leafCount: number;
82
- constructor(slotPtr: SlotPointer, leafCount: number);
83
- withSlotPointer(slotPtr: SlotPointer): LinkedArrayListSlotPointer;
102
+ constructor(nodePtr: number, valuePosition: number, slot: Slot);
103
+ }
104
+ export declare class BTreeJoinResult {
105
+ nodePtr: number;
106
+ count: number;
107
+ split: BTreeNodeRef | null;
108
+ constructor(nodePtr: number, count: number, split: BTreeNodeRef | null);
109
+ }
110
+ export declare class BTreeSplitResult {
111
+ left: number;
112
+ right: number;
113
+ constructor(left: number, right: number);
114
+ }
115
+ export declare class SortedNode {
116
+ kind: BTreeNodeKind;
117
+ num: number;
118
+ entries: Slot[];
119
+ children: Slot[];
120
+ separators: Slot[];
121
+ counts: number[];
122
+ constructor(kind: BTreeNodeKind, num: number);
123
+ subtreeCount(): number;
124
+ }
125
+ export declare class SortedSplit {
126
+ nodePtr: number;
127
+ count: number;
128
+ separator: Slot;
129
+ constructor(nodePtr: number, count: number, separator: Slot);
130
+ }
131
+ export declare class SortedInsertResult {
132
+ nodePtr: number;
133
+ count: number;
134
+ valuePosition: number;
135
+ added: boolean;
136
+ split: SortedSplit | null;
137
+ constructor(nodePtr: number, count: number, valuePosition: number, added: boolean, split: SortedSplit | null);
138
+ }
139
+ export declare class SortedRemoveResult {
140
+ nodePtr: number;
141
+ found: boolean;
142
+ constructor(nodePtr: number, found: boolean);
143
+ }
144
+ export declare class SortedSlot {
145
+ slot: Slot;
146
+ position: number;
147
+ constructor(slot: Slot, position: number);
84
148
  }
85
- export declare class LinkedArrayListBlockInfo {
86
- block: LinkedArrayListSlot[];
87
- i: number;
88
- parentSlot: LinkedArrayListSlot;
89
- constructor(block: LinkedArrayListSlot[], i: number, parentSlot: LinkedArrayListSlot);
149
+ export declare class SortedEntry {
150
+ kvSlot: Slot;
151
+ keySlot: Slot;
152
+ valuePosition: number;
153
+ constructor(kvSlot: Slot, keySlot: Slot, valuePosition: number);
90
154
  }
91
- export type PathPart = ArrayListInit | ArrayListGet | ArrayListAppend | ArrayListSlice | LinkedArrayListInit | LinkedArrayListGet | LinkedArrayListAppend | LinkedArrayListSlice | LinkedArrayListConcat | LinkedArrayListInsert | LinkedArrayListRemove | HashMapInit | HashMapGet | HashMapRemove | WriteData | Context;
155
+ export type PathPart = ArrayListInit | ArrayListGet | ArrayListAppend | ArrayListSlice | LinkedArrayListInit | LinkedArrayListGet | LinkedArrayListAppend | LinkedArrayListSlice | LinkedArrayListConcat | LinkedArrayListInsert | LinkedArrayListRemove | HashMapInit | HashMapGet | HashMapRemove | SortedMapInit | SortedMapGet | SortedMapGetIndex | SortedMapRemove | WriteData | Context;
92
156
  export interface PathPartBase {
93
157
  readSlotPointer(db: Database, isTopLevel: boolean, writeMode: WriteMode, path: PathPart[], pathI: number, slotPtr: SlotPointer): SlotPointer;
94
158
  }
@@ -108,6 +172,22 @@ export declare class HashMapGetValue {
108
172
  readonly kind = "value";
109
173
  constructor(hash: Uint8Array);
110
174
  }
175
+ export type SortedMapGetTarget = SortedMapGetKVPair | SortedMapGetKey | SortedMapGetValue;
176
+ export declare class SortedMapGetKVPair {
177
+ key: Uint8Array;
178
+ readonly kind = "kv_pair";
179
+ constructor(key: Uint8Array);
180
+ }
181
+ export declare class SortedMapGetKey {
182
+ key: Uint8Array;
183
+ readonly kind = "key";
184
+ constructor(key: Uint8Array);
185
+ }
186
+ export declare class SortedMapGetValue {
187
+ key: Uint8Array;
188
+ readonly kind = "value";
189
+ constructor(key: Uint8Array);
190
+ }
111
191
  export type ContextFunction = (cursor: any) => void;
112
192
  export declare class ArrayListInit implements PathPartBase {
113
193
  readonly kind = "ArrayListInit";
@@ -187,6 +267,30 @@ export declare class HashMapRemove implements PathPartBase {
187
267
  constructor(hash: Uint8Array);
188
268
  readSlotPointer(db: Database, isTopLevel: boolean, writeMode: WriteMode, path: PathPart[], pathI: number, slotPtr: SlotPointer): SlotPointer;
189
269
  }
270
+ export declare class SortedMapInit implements PathPartBase {
271
+ set: boolean;
272
+ readonly kind = "SortedMapInit";
273
+ constructor(set?: boolean);
274
+ readSlotPointer(db: Database, isTopLevel: boolean, writeMode: WriteMode, path: PathPart[], pathI: number, slotPtr: SlotPointer): SlotPointer;
275
+ }
276
+ export declare class SortedMapGet implements PathPartBase {
277
+ target: SortedMapGetTarget;
278
+ readonly kind = "SortedMapGet";
279
+ constructor(target: SortedMapGetTarget);
280
+ readSlotPointer(db: Database, isTopLevel: boolean, writeMode: WriteMode, path: PathPart[], pathI: number, slotPtr: SlotPointer): SlotPointer;
281
+ }
282
+ export declare class SortedMapGetIndex implements PathPartBase {
283
+ index: number;
284
+ readonly kind = "SortedMapGetIndex";
285
+ constructor(index: number);
286
+ readSlotPointer(db: Database, isTopLevel: boolean, writeMode: WriteMode, path: PathPart[], pathI: number, slotPtr: SlotPointer): SlotPointer;
287
+ }
288
+ export declare class SortedMapRemove implements PathPartBase {
289
+ key: Uint8Array;
290
+ readonly kind = "SortedMapRemove";
291
+ constructor(key: Uint8Array);
292
+ readSlotPointer(db: Database, isTopLevel: boolean, writeMode: WriteMode, path: PathPart[], pathI: number, slotPtr: SlotPointer): SlotPointer;
293
+ }
190
294
  export declare class WriteData implements PathPartBase {
191
295
  data: WriteableData | null;
192
296
  readonly kind = "WriteData";
@@ -209,11 +313,6 @@ declare class ArrayListAppendResult {
209
313
  slotPtr: SlotPointer;
210
314
  constructor(header: ArrayListHeader, slotPtr: SlotPointer);
211
315
  }
212
- declare class LinkedArrayListAppendResult {
213
- header: LinkedArrayListHeader;
214
- slotPtr: LinkedArrayListSlotPointer;
215
- constructor(header: LinkedArrayListHeader, slotPtr: LinkedArrayListSlotPointer);
216
- }
217
316
  export declare class Database {
218
317
  core: Core;
219
318
  hasher: Hasher;
@@ -232,14 +331,40 @@ export declare class Database {
232
331
  readArrayListSlotAppend(header: ArrayListHeader, writeMode: WriteMode, isTopLevel: boolean): ArrayListAppendResult;
233
332
  readArrayListSlot(indexPos: number, key: number, shift: number, writeMode: WriteMode, isTopLevel: boolean): SlotPointer;
234
333
  readArrayListSlice(header: ArrayListHeader, size: number): ArrayListHeader;
235
- readLinkedArrayListSlotAppend(header: LinkedArrayListHeader, writeMode: WriteMode, isTopLevel: boolean): LinkedArrayListAppendResult;
236
- private static blockLeafCount;
237
- private static slotLeafCount;
238
- private static keyAndIndexForLinkedArrayList;
239
- readLinkedArrayListSlot(indexPos: number, key: number, shift: number, writeMode: WriteMode, isTopLevel: boolean): LinkedArrayListSlotPointer;
240
- readLinkedArrayListBlocks(indexPos: number, key: number, shift: number, blocks: LinkedArrayListBlockInfo[]): void;
241
- private populateArray;
242
- readLinkedArrayListSlice(header: LinkedArrayListHeader, offset: number, size: number): LinkedArrayListHeader;
243
- readLinkedArrayListConcat(headerA: LinkedArrayListHeader, headerB: LinkedArrayListHeader): LinkedArrayListHeader;
334
+ readBTreeNode(ptr: number): BTreeNode;
335
+ writeBTreeNodeAt(node: BTreeNode, ptr: number): void;
336
+ writeBTreeNode(node: BTreeNode): number;
337
+ btreeReusable(ptr: number): boolean;
338
+ btreeWriteNode(node: BTreeNode, oldPtr: number): number;
339
+ btreeNewRoot(): number;
340
+ readBTreeSlot(rootPtr: number, rank: number): SlotPointer;
341
+ btreeInsert(nodePtr: number, rank: number): BTreeInsertResult;
342
+ btreeGrowRoot(result: BTreeInsertResult): number;
343
+ btreeGetForWrite(nodePtr: number, rank: number): BTreeWriteSlot;
344
+ btreeHeight(rootPtr: number): number;
345
+ btreeMakeRoot(result: BTreeJoinResult): number;
346
+ btreeAssembleLeaf(vals: Slot[], total: number): BTreeJoinResult;
347
+ btreeAssembleBranch(children: Slot[], counts: number[], total: number): BTreeJoinResult;
348
+ btreeMergeNodes(a: BTreeNode, b: BTreeNode): BTreeJoinResult;
349
+ btreeJoinRight(aPtr: number, ha: number, bPtr: number, hb: number): BTreeJoinResult;
350
+ btreeJoinLeft(aPtr: number, ha: number, bPtr: number, hb: number): BTreeJoinResult;
351
+ btreeJoin(rootA: number, rootB: number): number;
352
+ btreeSubtree(children: Slot[], counts: number[], start: number, len: number): number;
353
+ btreeSplit(rootPtr: number, rank: number): BTreeSplitResult;
354
+ readSortedNode(ptr: number): SortedNode;
355
+ writeSortedNodeAt(node: SortedNode, ptr: number): void;
356
+ writeSortedNode(node: SortedNode): number;
357
+ sortedWriteNode(node: SortedNode, oldPtr: number): number;
358
+ readKvPair(kvSlot: Slot): KeyValuePair;
359
+ compareKey(keySlot: Slot, target: Uint8Array): number;
360
+ sortedGet(rootPtr: number, key: Uint8Array): SortedSlot | null;
361
+ sortedGetByIndex(rootPtr: number, rank: number): SortedSlot;
362
+ sortedRank(rootPtr: number, key: Uint8Array): number;
363
+ writeKey(key: Uint8Array): Slot;
364
+ sortedNewEntry(key: Uint8Array): SortedEntry;
365
+ sortedPut(nodePtr: number, key: Uint8Array): SortedInsertResult;
366
+ sortedRemove(nodePtr: number, key: Uint8Array): SortedRemoveResult;
367
+ sortedGrowRoot(result: SortedInsertResult): number;
368
+ sortedTargetSlot(kvPos: number, target: SortedMapGetTarget): SlotPointer;
244
369
  }
245
370
  export {};