@yydb/light-db 0.0.0 → 0.0.11
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/dist/api/database.d.ts +48 -0
- package/dist/api/database.d.ts.map +1 -0
- package/dist/api/database.js +120 -0
- package/dist/api/database.js.map +1 -0
- package/dist/api/index.d.ts +7 -22
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +5 -52
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +33 -0
- package/dist/api/schema.d.ts.map +1 -0
- package/dist/api/schema.js +80 -0
- package/dist/api/schema.js.map +1 -0
- package/dist/api/transaction.d.ts +26 -0
- package/dist/api/transaction.d.ts.map +1 -0
- package/dist/api/transaction.js +52 -0
- package/dist/api/transaction.js.map +1 -0
- package/dist/api/types.d.ts +55 -148
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js +6 -5
- package/dist/api/types.js.map +1 -1
- package/dist/codec/binary.d.ts +196 -0
- package/dist/codec/binary.d.ts.map +1 -0
- package/dist/codec/binary.js +342 -0
- package/dist/codec/binary.js.map +1 -0
- package/dist/codec/checksum.d.ts +21 -0
- package/dist/codec/checksum.d.ts.map +1 -0
- package/dist/codec/checksum.js +46 -0
- package/dist/codec/checksum.js.map +1 -0
- package/dist/codec/index.d.ts +12 -0
- package/dist/codec/index.d.ts.map +1 -0
- package/dist/codec/index.js +10 -0
- package/dist/codec/index.js.map +1 -0
- package/dist/codec/page.d.ts +114 -0
- package/dist/codec/page.d.ts.map +1 -0
- package/dist/codec/page.js +225 -0
- package/dist/codec/page.js.map +1 -0
- package/dist/codec/record.d.ts +62 -0
- package/dist/codec/record.d.ts.map +1 -0
- package/dist/codec/record.js +82 -0
- package/dist/codec/record.js.map +1 -0
- package/dist/core/broadcast.d.ts +39 -0
- package/dist/core/broadcast.d.ts.map +1 -0
- package/dist/core/broadcast.js +54 -0
- package/dist/core/broadcast.js.map +1 -0
- package/dist/core/checkpoint.d.ts +23 -0
- package/dist/core/checkpoint.d.ts.map +1 -0
- package/dist/core/checkpoint.js +49 -0
- package/dist/core/checkpoint.js.map +1 -0
- package/dist/core/engine.d.ts +142 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +304 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lease.d.ts +32 -0
- package/dist/core/lease.d.ts.map +1 -0
- package/dist/core/lease.js +81 -0
- package/dist/core/lease.js.map +1 -0
- package/dist/core/records.d.ts +49 -0
- package/dist/core/records.d.ts.map +1 -0
- package/dist/core/records.js +70 -0
- package/dist/core/records.js.map +1 -0
- package/dist/core/recovery.d.ts +43 -0
- package/dist/core/recovery.d.ts.map +1 -0
- package/dist/core/recovery.js +99 -0
- package/dist/core/recovery.js.map +1 -0
- package/dist/core/wal.d.ts +50 -0
- package/dist/core/wal.d.ts.map +1 -0
- package/dist/core/wal.js +114 -0
- package/dist/core/wal.js.map +1 -0
- package/dist/errors/index.d.ts +44 -66
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +43 -128
- package/dist/errors/index.js.map +1 -1
- package/dist/index.d.ts +14 -215
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -724
- package/dist/index.js.map +1 -1
- package/dist/storage/StorageAdapter.d.ts +97 -0
- package/dist/storage/StorageAdapter.d.ts.map +1 -0
- package/dist/storage/StorageAdapter.js +9 -0
- package/dist/storage/StorageAdapter.js.map +1 -0
- package/dist/storage/index.d.ts +9 -8
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +8 -151
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/indexeddb/IndexedDbStorageAdapter.d.ts +140 -0
- package/dist/storage/indexeddb/IndexedDbStorageAdapter.d.ts.map +1 -0
- package/dist/storage/indexeddb/IndexedDbStorageAdapter.js +403 -0
- package/dist/storage/indexeddb/IndexedDbStorageAdapter.js.map +1 -0
- package/dist/storage/memory/MemoryStorageAdapter.d.ts +76 -0
- package/dist/storage/memory/MemoryStorageAdapter.d.ts.map +1 -0
- package/dist/storage/memory/MemoryStorageAdapter.js +212 -0
- package/dist/storage/memory/MemoryStorageAdapter.js.map +1 -0
- package/dist/storage/opfs/OpfsStorageAdapter.d.ts +141 -0
- package/dist/storage/opfs/OpfsStorageAdapter.d.ts.map +1 -0
- package/dist/storage/opfs/OpfsStorageAdapter.js +400 -0
- package/dist/storage/opfs/OpfsStorageAdapter.js.map +1 -0
- package/package.json +48 -36
- package/readme.md +80 -94
- package/dist/api/LightDB.d.ts +0 -194
- package/dist/api/LightDB.d.ts.map +0 -1
- package/dist/api/LightDB.js +0 -299
- package/dist/api/LightDB.js.map +0 -1
- package/dist/api/Transaction.d.ts +0 -100
- package/dist/api/Transaction.d.ts.map +0 -1
- package/dist/api/Transaction.js +0 -263
- package/dist/api/Transaction.js.map +0 -1
- package/dist/collection/Collection.d.ts +0 -235
- package/dist/collection/Collection.d.ts.map +0 -1
- package/dist/collection/Collection.js +0 -671
- package/dist/collection/Collection.js.map +0 -1
- package/dist/collection/QueryBuilder.d.ts +0 -225
- package/dist/collection/QueryBuilder.d.ts.map +0 -1
- package/dist/collection/QueryBuilder.js +0 -475
- package/dist/collection/QueryBuilder.js.map +0 -1
- package/dist/collection/QueryParser.d.ts +0 -117
- package/dist/collection/QueryParser.d.ts.map +0 -1
- package/dist/collection/QueryParser.js +0 -438
- package/dist/collection/QueryParser.js.map +0 -1
- package/dist/collection/index.d.ts +0 -42
- package/dist/collection/index.d.ts.map +0 -1
- package/dist/collection/index.js +0 -41
- package/dist/collection/index.js.map +0 -1
- package/dist/collection/types.d.ts +0 -365
- package/dist/collection/types.d.ts.map +0 -1
- package/dist/collection/types.js +0 -7
- package/dist/collection/types.js.map +0 -1
- package/dist/constants/index.d.ts +0 -51
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js +0 -68
- package/dist/constants/index.js.map +0 -1
- package/dist/indexes/BPlusTree.d.ts +0 -181
- package/dist/indexes/BPlusTree.d.ts.map +0 -1
- package/dist/indexes/BPlusTree.js +0 -528
- package/dist/indexes/BPlusTree.js.map +0 -1
- package/dist/indexes/IndexManager.d.ts +0 -236
- package/dist/indexes/IndexManager.d.ts.map +0 -1
- package/dist/indexes/IndexManager.js +0 -502
- package/dist/indexes/IndexManager.js.map +0 -1
- package/dist/indexes/PrimaryIndex.d.ts +0 -240
- package/dist/indexes/PrimaryIndex.d.ts.map +0 -1
- package/dist/indexes/PrimaryIndex.js +0 -354
- package/dist/indexes/PrimaryIndex.js.map +0 -1
- package/dist/indexes/SecondaryIndex.d.ts +0 -204
- package/dist/indexes/SecondaryIndex.d.ts.map +0 -1
- package/dist/indexes/SecondaryIndex.js +0 -480
- package/dist/indexes/SecondaryIndex.js.map +0 -1
- package/dist/indexes/errors.d.ts +0 -66
- package/dist/indexes/errors.d.ts.map +0 -1
- package/dist/indexes/errors.js +0 -117
- package/dist/indexes/errors.js.map +0 -1
- package/dist/indexes/index.d.ts +0 -52
- package/dist/indexes/index.d.ts.map +0 -1
- package/dist/indexes/index.js +0 -131
- package/dist/indexes/index.js.map +0 -1
- package/dist/indexes/types.d.ts +0 -246
- package/dist/indexes/types.d.ts.map +0 -1
- package/dist/indexes/types.js +0 -30
- package/dist/indexes/types.js.map +0 -1
- package/dist/performance/BatchWALWriter.d.ts +0 -185
- package/dist/performance/BatchWALWriter.d.ts.map +0 -1
- package/dist/performance/BatchWALWriter.js +0 -490
- package/dist/performance/BatchWALWriter.js.map +0 -1
- package/dist/performance/ColumnarStorage.d.ts +0 -138
- package/dist/performance/ColumnarStorage.d.ts.map +0 -1
- package/dist/performance/ColumnarStorage.js +0 -875
- package/dist/performance/ColumnarStorage.js.map +0 -1
- package/dist/performance/LazyQuery.d.ts +0 -307
- package/dist/performance/LazyQuery.d.ts.map +0 -1
- package/dist/performance/LazyQuery.js +0 -588
- package/dist/performance/LazyQuery.js.map +0 -1
- package/dist/performance/OptimizedBuffer.d.ts +0 -375
- package/dist/performance/OptimizedBuffer.d.ts.map +0 -1
- package/dist/performance/OptimizedBuffer.js +0 -730
- package/dist/performance/OptimizedBuffer.js.map +0 -1
- package/dist/performance/RWLock.d.ts +0 -260
- package/dist/performance/RWLock.d.ts.map +0 -1
- package/dist/performance/RWLock.js +0 -570
- package/dist/performance/RWLock.js.map +0 -1
- package/dist/performance/index.d.ts +0 -41
- package/dist/performance/index.d.ts.map +0 -1
- package/dist/performance/index.js +0 -162
- package/dist/performance/index.js.map +0 -1
- package/dist/performance/types.d.ts +0 -247
- package/dist/performance/types.d.ts.map +0 -1
- package/dist/performance/types.js +0 -26
- package/dist/performance/types.js.map +0 -1
- package/dist/storage/Checkpoint.d.ts +0 -128
- package/dist/storage/Checkpoint.d.ts.map +0 -1
- package/dist/storage/Checkpoint.js +0 -251
- package/dist/storage/Checkpoint.js.map +0 -1
- package/dist/storage/LightFile.d.ts +0 -227
- package/dist/storage/LightFile.d.ts.map +0 -1
- package/dist/storage/LightFile.js +0 -526
- package/dist/storage/LightFile.js.map +0 -1
- package/dist/storage/Recovery.d.ts +0 -172
- package/dist/storage/Recovery.d.ts.map +0 -1
- package/dist/storage/Recovery.js +0 -399
- package/dist/storage/Recovery.js.map +0 -1
- package/dist/storage/SHMFile.d.ts +0 -243
- package/dist/storage/SHMFile.d.ts.map +0 -1
- package/dist/storage/SHMFile.js +0 -436
- package/dist/storage/SHMFile.js.map +0 -1
- package/dist/storage/StorageEngine.d.ts +0 -146
- package/dist/storage/StorageEngine.d.ts.map +0 -1
- package/dist/storage/StorageEngine.js +0 -353
- package/dist/storage/StorageEngine.js.map +0 -1
- package/dist/storage/WALFile.d.ts +0 -248
- package/dist/storage/WALFile.d.ts.map +0 -1
- package/dist/storage/WALFile.js +0 -597
- package/dist/storage/WALFile.js.map +0 -1
- package/dist/types/index.d.ts +0 -220
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -7
- package/dist/types/index.js.map +0 -1
- package/dist/utils/binary.d.ts +0 -271
- package/dist/utils/binary.d.ts.map +0 -1
- package/dist/utils/binary.js +0 -454
- package/dist/utils/binary.js.map +0 -1
- package/dist/utils/file.d.ts +0 -166
- package/dist/utils/file.d.ts.map +0 -1
- package/dist/utils/file.js +0 -346
- package/dist/utils/file.js.map +0 -1
- package/dist/utils/index.d.ts +0 -6
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -39
- package/dist/utils/index.js.map +0 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 记录存储
|
|
3
|
+
*
|
|
4
|
+
* 数据库在内存中的键值视图。值在写入与读取时都做一次复制,
|
|
5
|
+
* 避免调用方持有内部字节数组造成校验和与快照不一致。
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 内存记录存储
|
|
9
|
+
*/
|
|
10
|
+
export declare class RecordStore {
|
|
11
|
+
private records;
|
|
12
|
+
/**
|
|
13
|
+
* 读取值
|
|
14
|
+
* @param key 键
|
|
15
|
+
*/
|
|
16
|
+
get(key: string): Uint8Array | null;
|
|
17
|
+
/**
|
|
18
|
+
* 是否存在键
|
|
19
|
+
* @param key 键
|
|
20
|
+
*/
|
|
21
|
+
has(key: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* 写入值
|
|
24
|
+
* @param key 键
|
|
25
|
+
* @param value 值
|
|
26
|
+
*/
|
|
27
|
+
put(key: string, value: Uint8Array): void;
|
|
28
|
+
/**
|
|
29
|
+
* 删除键
|
|
30
|
+
* @param key 键
|
|
31
|
+
*/
|
|
32
|
+
delete(key: string): boolean;
|
|
33
|
+
/** 记录数量 */
|
|
34
|
+
get size(): number;
|
|
35
|
+
/**
|
|
36
|
+
* 快照当前记录
|
|
37
|
+
*
|
|
38
|
+
* 返回只读视图,供检查点打包使用。
|
|
39
|
+
*/
|
|
40
|
+
snapshot(): ReadonlyMap<string, Uint8Array>;
|
|
41
|
+
/**
|
|
42
|
+
* 用恢复结果替换全部记录
|
|
43
|
+
* @param records 记录映射
|
|
44
|
+
*/
|
|
45
|
+
restore(records: ReadonlyMap<string, Uint8Array>): void;
|
|
46
|
+
/** 清空所有记录 */
|
|
47
|
+
clear(): void;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=records.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/core/records.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,OAAO,CAAsC;IAErD;;;OAGG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAK1C;;;OAGG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC;;;;OAIG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAIhD;;;OAGG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAInC,WAAW;IACX,IAAW,IAAI,IAAI,MAAM,CAExB;IAED;;;;OAIG;IACI,QAAQ,IAAI,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC;IAIlD;;;OAGG;IACI,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,IAAI;IAO9D,aAAa;IACN,KAAK,IAAI,IAAI;CAGvB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 记录存储
|
|
3
|
+
*
|
|
4
|
+
* 数据库在内存中的键值视图。值在写入与读取时都做一次复制,
|
|
5
|
+
* 避免调用方持有内部字节数组造成校验和与快照不一致。
|
|
6
|
+
*/
|
|
7
|
+
import { BinaryUtils } from '../codec';
|
|
8
|
+
/**
|
|
9
|
+
* 内存记录存储
|
|
10
|
+
*/
|
|
11
|
+
export class RecordStore {
|
|
12
|
+
records = new Map();
|
|
13
|
+
/**
|
|
14
|
+
* 读取值
|
|
15
|
+
* @param key 键
|
|
16
|
+
*/
|
|
17
|
+
get(key) {
|
|
18
|
+
const value = this.records.get(key);
|
|
19
|
+
return value ? BinaryUtils.copy(value) : null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 是否存在键
|
|
23
|
+
* @param key 键
|
|
24
|
+
*/
|
|
25
|
+
has(key) {
|
|
26
|
+
return this.records.has(key);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 写入值
|
|
30
|
+
* @param key 键
|
|
31
|
+
* @param value 值
|
|
32
|
+
*/
|
|
33
|
+
put(key, value) {
|
|
34
|
+
this.records.set(key, BinaryUtils.copy(value));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 删除键
|
|
38
|
+
* @param key 键
|
|
39
|
+
*/
|
|
40
|
+
delete(key) {
|
|
41
|
+
return this.records.delete(key);
|
|
42
|
+
}
|
|
43
|
+
/** 记录数量 */
|
|
44
|
+
get size() {
|
|
45
|
+
return this.records.size;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 快照当前记录
|
|
49
|
+
*
|
|
50
|
+
* 返回只读视图,供检查点打包使用。
|
|
51
|
+
*/
|
|
52
|
+
snapshot() {
|
|
53
|
+
return this.records;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 用恢复结果替换全部记录
|
|
57
|
+
* @param records 记录映射
|
|
58
|
+
*/
|
|
59
|
+
restore(records) {
|
|
60
|
+
this.records = new Map();
|
|
61
|
+
for (const [key, value] of records) {
|
|
62
|
+
this.records.set(key, BinaryUtils.copy(value));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** 清空所有记录 */
|
|
66
|
+
clear() {
|
|
67
|
+
this.records.clear();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=records.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/core/records.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;GAEG;AACH,MAAM,OAAO,WAAW;IACZ,OAAO,GAA4B,IAAI,GAAG,EAAE,CAAC;IAErD;;;OAGG;IACI,GAAG,CAAC,GAAW;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,CAAC;IAED;;;OAGG;IACI,GAAG,CAAC,GAAW;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACI,GAAG,CAAC,GAAW,EAAE,KAAiB;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,GAAW;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,WAAW;IACX,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACI,QAAQ;QACX,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,OAAO,CAAC,OAAwC;QACnD,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IAED,aAAa;IACN,KAAK;QACR,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACJ"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 崩溃恢复
|
|
3
|
+
*
|
|
4
|
+
* 读取最近一次快照,再按 WAL 顺序重放快照之后的记录。
|
|
5
|
+
*/
|
|
6
|
+
import type { StorageAdapter } from '../storage/StorageAdapter';
|
|
7
|
+
import type { WalLog } from './wal';
|
|
8
|
+
/** 恢复结果 */
|
|
9
|
+
export interface RecoveryOutcome {
|
|
10
|
+
/** 恢复后的记录 */
|
|
11
|
+
records: Map<string, Uint8Array>;
|
|
12
|
+
/** 已覆盖到的最大 LSN */
|
|
13
|
+
lastLsn: bigint;
|
|
14
|
+
/** 载入的页数量 */
|
|
15
|
+
pagesLoaded: number;
|
|
16
|
+
/** 重放的 WAL 记录数量 */
|
|
17
|
+
recordsReplayed: number;
|
|
18
|
+
/** 丢弃的不完整 WAL 尾字节数 */
|
|
19
|
+
discardedTailBytes: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 恢复管理器
|
|
23
|
+
*/
|
|
24
|
+
export declare class RecoveryManager {
|
|
25
|
+
private readonly adapter;
|
|
26
|
+
constructor(adapter: StorageAdapter);
|
|
27
|
+
/**
|
|
28
|
+
* 执行恢复
|
|
29
|
+
* @param wal 已打开的 WAL
|
|
30
|
+
*/
|
|
31
|
+
recover(wal: WalLog): Promise<RecoveryOutcome>;
|
|
32
|
+
/**
|
|
33
|
+
* 读取快照,不存在时返回空记录
|
|
34
|
+
*/
|
|
35
|
+
private loadSnapshot;
|
|
36
|
+
/**
|
|
37
|
+
* 应用一条 WAL 记录
|
|
38
|
+
* @param records 记录映射
|
|
39
|
+
* @param record WAL 记录
|
|
40
|
+
*/
|
|
41
|
+
private apply;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/core/recovery.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEpC,WAAW;AACX,MAAM,WAAW,eAAe;IAC5B,aAAa;IACb,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjC,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;gBAE7B,OAAO,EAAE,cAAc;IAInC;;;OAGG;IACU,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA6B3D;;OAEG;YACW,YAAY;IAoC1B;;;;OAIG;IACH,OAAO,CAAC,KAAK;CAchB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 崩溃恢复
|
|
3
|
+
*
|
|
4
|
+
* 读取最近一次快照,再按 WAL 顺序重放快照之后的记录。
|
|
5
|
+
*/
|
|
6
|
+
import { ChecksumMismatchError, decodeSnapshot, SnapshotFormatError } from '../codec';
|
|
7
|
+
import { WalOperation } from '../codec';
|
|
8
|
+
import { LightDbError, LightDbErrorCodes } from '../errors';
|
|
9
|
+
/**
|
|
10
|
+
* 恢复管理器
|
|
11
|
+
*/
|
|
12
|
+
export class RecoveryManager {
|
|
13
|
+
adapter;
|
|
14
|
+
constructor(adapter) {
|
|
15
|
+
this.adapter = adapter;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 执行恢复
|
|
19
|
+
* @param wal 已打开的 WAL
|
|
20
|
+
*/
|
|
21
|
+
async recover(wal) {
|
|
22
|
+
const snapshot = await this.loadSnapshot();
|
|
23
|
+
const { records: walRecords, validBytes, fileSize } = await wal.readAll();
|
|
24
|
+
if (validBytes < fileSize) {
|
|
25
|
+
await wal.truncate(validBytes);
|
|
26
|
+
}
|
|
27
|
+
let recordsReplayed = 0;
|
|
28
|
+
let lastLsn = snapshot.lastSnapshotLsn;
|
|
29
|
+
for (const record of walRecords) {
|
|
30
|
+
if (record.lsn <= snapshot.lastSnapshotLsn) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
this.apply(snapshot.records, record);
|
|
34
|
+
lastLsn = record.lsn > lastLsn ? record.lsn : lastLsn;
|
|
35
|
+
recordsReplayed++;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
records: snapshot.records,
|
|
39
|
+
lastLsn,
|
|
40
|
+
pagesLoaded: snapshot.pagesLoaded,
|
|
41
|
+
recordsReplayed,
|
|
42
|
+
discardedTailBytes: fileSize - validBytes,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 读取快照,不存在时返回空记录
|
|
47
|
+
*/
|
|
48
|
+
async loadSnapshot() {
|
|
49
|
+
if (!(await this.adapter.exists('main'))) {
|
|
50
|
+
return { records: new Map(), lastSnapshotLsn: 0n, pagesLoaded: 0 };
|
|
51
|
+
}
|
|
52
|
+
const handle = await this.adapter.open('main', 'read');
|
|
53
|
+
let data;
|
|
54
|
+
try {
|
|
55
|
+
const size = await handle.size();
|
|
56
|
+
data = await handle.read(0, size);
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
await handle.close();
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const snapshot = decodeSnapshot(data);
|
|
63
|
+
return {
|
|
64
|
+
records: snapshot.records,
|
|
65
|
+
lastSnapshotLsn: snapshot.header.lastSnapshotLsn,
|
|
66
|
+
pagesLoaded: snapshot.pageCount,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error instanceof SnapshotFormatError || error instanceof ChecksumMismatchError) {
|
|
71
|
+
throw new LightDbError(LightDbErrorCodes.corrupt, 'database snapshot is corrupt', {
|
|
72
|
+
operation: 'recover',
|
|
73
|
+
cause: error,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 应用一条 WAL 记录
|
|
81
|
+
* @param records 记录映射
|
|
82
|
+
* @param record WAL 记录
|
|
83
|
+
*/
|
|
84
|
+
apply(records, record) {
|
|
85
|
+
switch (record.operation) {
|
|
86
|
+
case WalOperation.Put:
|
|
87
|
+
if (record.value) {
|
|
88
|
+
records.set(record.key, record.value);
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
case WalOperation.Delete:
|
|
92
|
+
records.delete(record.key);
|
|
93
|
+
break;
|
|
94
|
+
case WalOperation.Checkpoint:
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/core/recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WAL 日志
|
|
3
|
+
*
|
|
4
|
+
* 只通过 `StorageAdapter` 访问平台,记录格式由 `codec/record` 决定。
|
|
5
|
+
*/
|
|
6
|
+
import type { WalRecord } from '../codec';
|
|
7
|
+
import type { StorageAdapter } from '../storage/StorageAdapter';
|
|
8
|
+
/**
|
|
9
|
+
* 预写日志
|
|
10
|
+
*/
|
|
11
|
+
export declare class WalLog {
|
|
12
|
+
private readonly adapter;
|
|
13
|
+
private handle;
|
|
14
|
+
private offset;
|
|
15
|
+
constructor(adapter: StorageAdapter);
|
|
16
|
+
/** 当前日志字节数 */
|
|
17
|
+
get byteSize(): number;
|
|
18
|
+
/**
|
|
19
|
+
* 打开日志,定位到末尾
|
|
20
|
+
*/
|
|
21
|
+
open(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* 追加记录并等待落盘
|
|
24
|
+
* @param records 记录
|
|
25
|
+
*/
|
|
26
|
+
append(records: readonly WalRecord[]): Promise<number>;
|
|
27
|
+
/**
|
|
28
|
+
* 读取全部完整记录
|
|
29
|
+
*
|
|
30
|
+
* 末尾不完整的记录(写入过程中断)会被丢弃,`validBytes` 指向最后一个完整记录之后。
|
|
31
|
+
*/
|
|
32
|
+
readAll(): Promise<{
|
|
33
|
+
records: WalRecord[];
|
|
34
|
+
validBytes: number;
|
|
35
|
+
fileSize: number;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* 截断日志
|
|
39
|
+
* @param size 目标字节数,默认 0
|
|
40
|
+
*/
|
|
41
|
+
truncate(size?: number): Promise<void>;
|
|
42
|
+
/** 关闭日志 */
|
|
43
|
+
close(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* 获取已打开的句柄
|
|
46
|
+
* @param operation 操作名
|
|
47
|
+
*/
|
|
48
|
+
private requireHandle;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=wal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wal.d.ts","sourceRoot":"","sources":["../../src/core/wal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,2BAA2B,CAAC;AAE/E;;GAEG;AACH,qBAAa,MAAM;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,MAAM,CAAa;gBAEf,OAAO,EAAE,cAAc;IAInC,cAAc;IACd,IAAW,QAAQ,IAAI,MAAM,CAE5B;IAED;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC;;;OAGG;IACU,MAAM,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBnE;;;;OAIG;IACU,OAAO,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAiC/F;;;OAGG;IACU,QAAQ,CAAC,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtD,WAAW;IACE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOnC;;;OAGG;IACH,OAAO,CAAC,aAAa;CAMxB"}
|
package/dist/core/wal.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WAL 日志
|
|
3
|
+
*
|
|
4
|
+
* 只通过 `StorageAdapter` 访问平台,记录格式由 `codec/record` 决定。
|
|
5
|
+
*/
|
|
6
|
+
import { ChecksumMismatchError, decodeWalRecord, encodeWalRecord } from '../codec';
|
|
7
|
+
import { LightDbError, LightDbErrorCodes } from '../errors';
|
|
8
|
+
/**
|
|
9
|
+
* 预写日志
|
|
10
|
+
*/
|
|
11
|
+
export class WalLog {
|
|
12
|
+
adapter;
|
|
13
|
+
handle = null;
|
|
14
|
+
offset = 0;
|
|
15
|
+
constructor(adapter) {
|
|
16
|
+
this.adapter = adapter;
|
|
17
|
+
}
|
|
18
|
+
/** 当前日志字节数 */
|
|
19
|
+
get byteSize() {
|
|
20
|
+
return this.offset;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 打开日志,定位到末尾
|
|
24
|
+
*/
|
|
25
|
+
async open() {
|
|
26
|
+
this.handle = await this.adapter.open('wal', 'readwrite');
|
|
27
|
+
this.offset = await this.handle.size();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 追加记录并等待落盘
|
|
31
|
+
* @param records 记录
|
|
32
|
+
*/
|
|
33
|
+
async append(records) {
|
|
34
|
+
if (records.length === 0) {
|
|
35
|
+
return 0;
|
|
36
|
+
}
|
|
37
|
+
const handle = this.requireHandle('walAppend');
|
|
38
|
+
const encoded = records.map((record) => encodeWalRecord(record));
|
|
39
|
+
const total = encoded.reduce((sum, part) => sum + part.length, 0);
|
|
40
|
+
const buffer = new Uint8Array(total);
|
|
41
|
+
let position = 0;
|
|
42
|
+
for (const part of encoded) {
|
|
43
|
+
buffer.set(part, position);
|
|
44
|
+
position += part.length;
|
|
45
|
+
}
|
|
46
|
+
await handle.write(this.offset, buffer);
|
|
47
|
+
await handle.sync();
|
|
48
|
+
this.offset += total;
|
|
49
|
+
return total;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 读取全部完整记录
|
|
53
|
+
*
|
|
54
|
+
* 末尾不完整的记录(写入过程中断)会被丢弃,`validBytes` 指向最后一个完整记录之后。
|
|
55
|
+
*/
|
|
56
|
+
async readAll() {
|
|
57
|
+
const handle = this.requireHandle('walRead');
|
|
58
|
+
const size = await handle.size();
|
|
59
|
+
if (size === 0) {
|
|
60
|
+
return { records: [], validBytes: 0, fileSize: 0 };
|
|
61
|
+
}
|
|
62
|
+
const data = await handle.read(0, size);
|
|
63
|
+
const records = [];
|
|
64
|
+
let offset = 0;
|
|
65
|
+
while (offset < data.length) {
|
|
66
|
+
try {
|
|
67
|
+
const decoded = decodeWalRecord(data, offset);
|
|
68
|
+
if (decoded.status === 'incomplete') {
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
records.push(decoded.record);
|
|
72
|
+
offset += decoded.bytesRead;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error instanceof ChecksumMismatchError) {
|
|
76
|
+
throw new LightDbError(LightDbErrorCodes.corrupt, `WAL record is corrupt at offset ${offset}`, {
|
|
77
|
+
operation: 'walRead',
|
|
78
|
+
cause: error,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return { records, validBytes: offset, fileSize: size };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 截断日志
|
|
88
|
+
* @param size 目标字节数,默认 0
|
|
89
|
+
*/
|
|
90
|
+
async truncate(size = 0) {
|
|
91
|
+
const handle = this.requireHandle('walTruncate');
|
|
92
|
+
await handle.truncate(size);
|
|
93
|
+
await handle.sync();
|
|
94
|
+
this.offset = size;
|
|
95
|
+
}
|
|
96
|
+
/** 关闭日志 */
|
|
97
|
+
async close() {
|
|
98
|
+
if (this.handle) {
|
|
99
|
+
await this.handle.close();
|
|
100
|
+
this.handle = null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 获取已打开的句柄
|
|
105
|
+
* @param operation 操作名
|
|
106
|
+
*/
|
|
107
|
+
requireHandle(operation) {
|
|
108
|
+
if (!this.handle) {
|
|
109
|
+
throw new LightDbError(LightDbErrorCodes.sessionClosed, 'WAL is not open', { operation });
|
|
110
|
+
}
|
|
111
|
+
return this.handle;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=wal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wal.js","sourceRoot":"","sources":["../../src/core/wal.ts"],"names":[],"mappings":"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"}
|
package/dist/errors/index.d.ts
CHANGED
|
@@ -1,69 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*/
|
|
8
|
-
export declare
|
|
9
|
-
/**
|
|
2
|
+
* 稳定错误模型
|
|
3
|
+
*
|
|
4
|
+
* 与 `@yydb/yydb` / `@yydb/yydb-client` 共用同一组错误码:宿主只按 `code` 分支,
|
|
5
|
+
* `message` 只用于显示。
|
|
6
|
+
*/
|
|
7
|
+
/** 浏览器产品对外的稳定错误码 */
|
|
8
|
+
export declare const LightDbErrorCodes: {
|
|
9
|
+
/** I/O 失败 */
|
|
10
|
+
readonly io: "yydb.io";
|
|
11
|
+
/** 持久化数据损坏 */
|
|
12
|
+
readonly corrupt: "yydb.corrupt";
|
|
13
|
+
/** Schema 文档与已持久化内容冲突 */
|
|
14
|
+
readonly schemaConflict: "yydb.schema.conflict";
|
|
15
|
+
/** Schema 文档不合法 */
|
|
16
|
+
readonly schemaInvalid: "yydb.schema.invalid";
|
|
17
|
+
/** 宿主不支持该能力 */
|
|
18
|
+
readonly unsupported: "yydb.unsupported";
|
|
19
|
+
/** 会话或数据库已关闭 */
|
|
20
|
+
readonly sessionClosed: "yydb.session.closed";
|
|
21
|
+
/** 单写者租约不可用(例如缺少 Web Locks) */
|
|
22
|
+
readonly leaseUnavailable: "yydb.lease.unavailable";
|
|
23
|
+
/** 存储配额不足 */
|
|
24
|
+
readonly quotaExceeded: "yydb.quota.exceeded";
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* 数据库错误选项
|
|
28
|
+
*/
|
|
29
|
+
export interface LightDbErrorOptions {
|
|
30
|
+
/** 失败的操作(`schemaGet`、`kvPut` 等) */
|
|
31
|
+
operation?: string;
|
|
32
|
+
/** 底层失败 */
|
|
33
|
+
cause?: unknown;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 携带稳定错误码的数据库错误
|
|
37
|
+
*/
|
|
38
|
+
export declare class LightDbError extends Error {
|
|
39
|
+
/** 稳定错误码 */
|
|
10
40
|
readonly code: string;
|
|
11
|
-
/**
|
|
12
|
-
readonly
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
* 文件操作错误
|
|
17
|
-
*/
|
|
18
|
-
export declare class FileOperationError extends StorageError {
|
|
19
|
-
constructor(message: string, filePath: string, operation: string);
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* 文件格式错误
|
|
23
|
-
*/
|
|
24
|
-
export declare class FileFormatError extends StorageError {
|
|
25
|
-
constructor(message: string, filePath: string, expected?: string, actual?: unknown);
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* 校验和错误
|
|
29
|
-
*/
|
|
30
|
-
export declare class ChecksumError extends StorageError {
|
|
31
|
-
constructor(message: string, expected: number, actual: number, position?: number);
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* WAL 错误
|
|
35
|
-
*/
|
|
36
|
-
export declare class WalError extends StorageError {
|
|
37
|
-
constructor(message: string, lsn?: bigint, offset?: number);
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* 恢复错误
|
|
41
|
-
*/
|
|
42
|
-
export declare class RecoveryError extends StorageError {
|
|
43
|
-
constructor(message: string, phase: string, details?: unknown);
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* 检查点错误
|
|
47
|
-
*/
|
|
48
|
-
export declare class CheckpointError extends StorageError {
|
|
49
|
-
constructor(message: string, lsn?: bigint);
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* 页面错误
|
|
53
|
-
*/
|
|
54
|
-
export declare class PageError extends StorageError {
|
|
55
|
-
constructor(message: string, pageId: number, details?: unknown);
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* 序列化错误
|
|
59
|
-
*/
|
|
60
|
-
export declare class SerializationError extends StorageError {
|
|
61
|
-
constructor(message: string, data?: unknown);
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* 配置错误
|
|
65
|
-
*/
|
|
66
|
-
export declare class ConfigurationError extends StorageError {
|
|
67
|
-
constructor(message: string, option?: string, value?: unknown);
|
|
41
|
+
/** 失败的操作 */
|
|
42
|
+
readonly operation: string;
|
|
43
|
+
/** 是否可以用相同参数重试 */
|
|
44
|
+
readonly retryable: boolean;
|
|
45
|
+
constructor(code: string, message: string, options?: LightDbErrorOptions);
|
|
68
46
|
}
|
|
69
|
-
//# sourceMappingURL=index.d.ts.map
|
|
47
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAoB;AACpB,eAAO,MAAM,iBAAiB;IAC1B,aAAa;;IAEb,cAAc;;IAEd,yBAAyB;;IAEzB,mBAAmB;;IAEnB,eAAe;;IAEf,gBAAgB;;IAEhB,+BAA+B;;IAE/B,aAAa;;CAEP,CAAC;AAKX;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACnC,YAAY;IACZ,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,YAAY;IACZ,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC,kBAAkB;IAClB,SAAgB,SAAS,EAAE,OAAO,CAAC;gBAEvB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB;CAQ/E"}
|