@yydb/light-db 0.0.0 → 0.0.10
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,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 存储引擎
|
|
3
|
+
*
|
|
4
|
+
* 只处理数据库语义:记录、WAL、检查点、恢复与事务。
|
|
5
|
+
* 所有平台能力都经 `StorageAdapter`,本层不接触浏览器或 Node 文件 API。
|
|
6
|
+
*/
|
|
7
|
+
import type { StorageAdapterFactory } from '../storage/StorageAdapter';
|
|
8
|
+
import type { LeaseMode } from './lease';
|
|
9
|
+
/** 默认 WAL 阈值:16MB */
|
|
10
|
+
export declare const DEFAULT_WAL_THRESHOLD: number;
|
|
11
|
+
/** 存储引擎选项 */
|
|
12
|
+
export interface StorageEngineOptions {
|
|
13
|
+
/** 页大小,默认 4KB */
|
|
14
|
+
pageSize?: number;
|
|
15
|
+
/** WAL 字节阈值,超过后自动检查点,默认 16MB */
|
|
16
|
+
walThreshold?: number;
|
|
17
|
+
/** 是否自动检查点,默认 true */
|
|
18
|
+
autoCheckpoint?: boolean;
|
|
19
|
+
/** 写租约模式,默认 `web-locks` */
|
|
20
|
+
lease?: LeaseMode;
|
|
21
|
+
}
|
|
22
|
+
/** 事务状态 */
|
|
23
|
+
export type TransactionState = 'idle' | 'active';
|
|
24
|
+
/** 检查点结果 */
|
|
25
|
+
export interface CheckpointResult {
|
|
26
|
+
/** 检查点覆盖到的 LSN */
|
|
27
|
+
lsn: bigint;
|
|
28
|
+
/** 写入字节数 */
|
|
29
|
+
bytesWritten: number;
|
|
30
|
+
/** WAL 截断前的字节数 */
|
|
31
|
+
walBytesReleased: number;
|
|
32
|
+
}
|
|
33
|
+
/** 引擎统计 */
|
|
34
|
+
export interface StorageEngineStats {
|
|
35
|
+
/** 数据库名 */
|
|
36
|
+
name: string;
|
|
37
|
+
/** 当前 LSN */
|
|
38
|
+
lsn: bigint;
|
|
39
|
+
/** 记录数量 */
|
|
40
|
+
recordCount: number;
|
|
41
|
+
/** WAL 当前字节数 */
|
|
42
|
+
walBytes: number;
|
|
43
|
+
/** 页大小 */
|
|
44
|
+
pageSize: number;
|
|
45
|
+
/** 适配器类型 */
|
|
46
|
+
storageKind: string;
|
|
47
|
+
/** 数据是否持久化 */
|
|
48
|
+
persistent: boolean;
|
|
49
|
+
/** 事务状态 */
|
|
50
|
+
transactionState: TransactionState;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 存储引擎
|
|
54
|
+
*/
|
|
55
|
+
export declare class StorageEngine {
|
|
56
|
+
private readonly databaseName;
|
|
57
|
+
private readonly adapter;
|
|
58
|
+
private readonly store;
|
|
59
|
+
private readonly wal;
|
|
60
|
+
private readonly checkpointWriter;
|
|
61
|
+
private readonly broadcaster;
|
|
62
|
+
private readonly lease;
|
|
63
|
+
private readonly options;
|
|
64
|
+
private lastLsn;
|
|
65
|
+
private nextTransactionId;
|
|
66
|
+
private overlay;
|
|
67
|
+
private closed;
|
|
68
|
+
private constructor();
|
|
69
|
+
/**
|
|
70
|
+
* 打开数据库
|
|
71
|
+
* @param name 数据库名
|
|
72
|
+
* @param factory 存储适配器工厂
|
|
73
|
+
* @param options 引擎选项
|
|
74
|
+
*/
|
|
75
|
+
static open(name: string, factory: StorageAdapterFactory, options?: StorageEngineOptions): Promise<StorageEngine>;
|
|
76
|
+
/** 数据库名 */
|
|
77
|
+
get name(): string;
|
|
78
|
+
/** 当前 LSN */
|
|
79
|
+
get lsn(): bigint;
|
|
80
|
+
/** 事务状态 */
|
|
81
|
+
get transactionState(): TransactionState;
|
|
82
|
+
/** 是否已关闭 */
|
|
83
|
+
get isClosed(): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* 读取键
|
|
86
|
+
* @param key 键
|
|
87
|
+
*/
|
|
88
|
+
get(key: string): Promise<Uint8Array | null>;
|
|
89
|
+
/**
|
|
90
|
+
* 写入键
|
|
91
|
+
* @param key 键
|
|
92
|
+
* @param value 值
|
|
93
|
+
*/
|
|
94
|
+
put(key: string, value: Uint8Array): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* 删除键
|
|
97
|
+
* @param key 键
|
|
98
|
+
* @returns 键存在时返回 true
|
|
99
|
+
*/
|
|
100
|
+
delete(key: string): Promise<boolean>;
|
|
101
|
+
/** 开启事务 */
|
|
102
|
+
begin(): void;
|
|
103
|
+
/**
|
|
104
|
+
* 提交事务
|
|
105
|
+
*/
|
|
106
|
+
commit(): Promise<void>;
|
|
107
|
+
/** 回滚事务 */
|
|
108
|
+
rollback(): void;
|
|
109
|
+
/**
|
|
110
|
+
* 执行检查点
|
|
111
|
+
*/
|
|
112
|
+
checkpoint(): Promise<CheckpointResult>;
|
|
113
|
+
/** 广播 schema 变更,供其它标签页失效本地视图 */
|
|
114
|
+
notifySchemaChange(): void;
|
|
115
|
+
/** 统计信息 */
|
|
116
|
+
getStats(): StorageEngineStats;
|
|
117
|
+
/** 关闭引擎 */
|
|
118
|
+
close(): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* 追加 WAL 并应用记录
|
|
121
|
+
* @param mutations 变更
|
|
122
|
+
* @param transactionId 事务号
|
|
123
|
+
*/
|
|
124
|
+
private applyCommitted;
|
|
125
|
+
/**
|
|
126
|
+
* 判断键在当前视图(含事务覆盖层)是否存在
|
|
127
|
+
* @param key 键
|
|
128
|
+
*/
|
|
129
|
+
private existsInView;
|
|
130
|
+
/**
|
|
131
|
+
* 断言引擎未关闭
|
|
132
|
+
* @param operation 操作名
|
|
133
|
+
*/
|
|
134
|
+
private assertOpen;
|
|
135
|
+
/**
|
|
136
|
+
* 断言键合法
|
|
137
|
+
* @param key 键
|
|
138
|
+
* @param operation 操作名
|
|
139
|
+
*/
|
|
140
|
+
private assertKey;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAkB,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAIvF,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,SAAS,CAAC;AAKtD,qBAAqB;AACrB,eAAO,MAAM,qBAAqB,QAAmB,CAAC;AAEtD,aAAa;AACb,MAAM,WAAW,oBAAoB;IACjC,iBAAiB;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,WAAW;AACX,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEjD,YAAY;AACZ,MAAM,WAAW,gBAAgB;IAC7B,kBAAkB;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,WAAW;AACX,MAAM,WAAW,kBAAkB;IAC/B,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW;IACX,gBAAgB,EAAE,gBAAgB,CAAC;CACtC;AAUD;;GAEG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IAExE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,MAAM,CAAU;IAExB,OAAO;IAsBP;;;;;OAKG;WACiB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,aAAa,CAAC;IA0ClI,WAAW;IACX,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,aAAa;IACb,IAAW,GAAG,IAAI,MAAM,CAEvB;IAED,WAAW;IACX,IAAW,gBAAgB,IAAI,gBAAgB,CAE9C;IAED,YAAY;IACZ,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED;;;OAGG;IACU,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAYzD;;;;OAIG;IACU,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/D;;;;OAIG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBlD,WAAW;IACJ,KAAK,IAAI,IAAI;IAUpB;;OAEG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBpC,WAAW;IACJ,QAAQ,IAAI,IAAI;IAQvB;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAepD,gCAAgC;IACzB,kBAAkB,IAAI,IAAI;IAKjC,WAAW;IACJ,QAAQ,IAAI,kBAAkB;IAcrC,WAAW;IACE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBnC;;;;OAIG;YACW,cAAc;IA6B5B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAOpB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAQlB;;;;OAIG;IACH,OAAO,CAAC,SAAS;CAKpB"}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 存储引擎
|
|
3
|
+
*
|
|
4
|
+
* 只处理数据库语义:记录、WAL、检查点、恢复与事务。
|
|
5
|
+
* 所有平台能力都经 `StorageAdapter`,本层不接触浏览器或 Node 文件 API。
|
|
6
|
+
*/
|
|
7
|
+
import { BinaryUtils, DEFAULT_PAGE_SIZE, WalOperation } from '../codec';
|
|
8
|
+
import { LightDbError, LightDbErrorCodes } from '../errors';
|
|
9
|
+
import { DatabaseBroadcaster } from './broadcast';
|
|
10
|
+
import { CheckpointWriter } from './checkpoint';
|
|
11
|
+
import { acquireWriterLease } from './lease';
|
|
12
|
+
import { RecordStore } from './records';
|
|
13
|
+
import { RecoveryManager } from './recovery';
|
|
14
|
+
import { WalLog } from './wal';
|
|
15
|
+
/** 默认 WAL 阈值:16MB */
|
|
16
|
+
export const DEFAULT_WAL_THRESHOLD = 16 * 1024 * 1024;
|
|
17
|
+
/**
|
|
18
|
+
* 存储引擎
|
|
19
|
+
*/
|
|
20
|
+
export class StorageEngine {
|
|
21
|
+
databaseName;
|
|
22
|
+
adapter;
|
|
23
|
+
store;
|
|
24
|
+
wal;
|
|
25
|
+
checkpointWriter;
|
|
26
|
+
broadcaster;
|
|
27
|
+
lease;
|
|
28
|
+
options;
|
|
29
|
+
lastLsn;
|
|
30
|
+
nextTransactionId;
|
|
31
|
+
overlay;
|
|
32
|
+
closed;
|
|
33
|
+
constructor(name, adapter, wal, lease, options, lastLsn) {
|
|
34
|
+
this.databaseName = name;
|
|
35
|
+
this.adapter = adapter;
|
|
36
|
+
this.wal = wal;
|
|
37
|
+
this.store = new RecordStore();
|
|
38
|
+
this.checkpointWriter = new CheckpointWriter(adapter, options.pageSize);
|
|
39
|
+
this.broadcaster = new DatabaseBroadcaster(name);
|
|
40
|
+
this.lease = lease;
|
|
41
|
+
this.options = options;
|
|
42
|
+
this.lastLsn = lastLsn;
|
|
43
|
+
this.nextTransactionId = 1n;
|
|
44
|
+
this.overlay = null;
|
|
45
|
+
this.closed = false;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 打开数据库
|
|
49
|
+
* @param name 数据库名
|
|
50
|
+
* @param factory 存储适配器工厂
|
|
51
|
+
* @param options 引擎选项
|
|
52
|
+
*/
|
|
53
|
+
static async open(name, factory, options = {}) {
|
|
54
|
+
const resolved = {
|
|
55
|
+
pageSize: options.pageSize ?? DEFAULT_PAGE_SIZE,
|
|
56
|
+
walThreshold: options.walThreshold ?? DEFAULT_WAL_THRESHOLD,
|
|
57
|
+
autoCheckpoint: options.autoCheckpoint ?? true,
|
|
58
|
+
};
|
|
59
|
+
if (resolved.pageSize < 512) {
|
|
60
|
+
throw new LightDbError(LightDbErrorCodes.unsupported, 'page size must be at least 512 bytes', {
|
|
61
|
+
operation: 'open',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const lease = await acquireWriterLease(name, options.lease ?? 'web-locks');
|
|
65
|
+
let adapter = null;
|
|
66
|
+
try {
|
|
67
|
+
adapter = await factory.openDatabase(name);
|
|
68
|
+
const wal = new WalLog(adapter);
|
|
69
|
+
await wal.open();
|
|
70
|
+
const recovery = new RecoveryManager(adapter);
|
|
71
|
+
const outcome = await recovery.recover(wal);
|
|
72
|
+
const engine = new StorageEngine(name, adapter, wal, lease, resolved, outcome.lastLsn);
|
|
73
|
+
engine.store.restore(outcome.records);
|
|
74
|
+
return engine;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (adapter) {
|
|
78
|
+
await adapter.close();
|
|
79
|
+
}
|
|
80
|
+
await lease.release();
|
|
81
|
+
if (error instanceof LightDbError) {
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
throw new LightDbError(LightDbErrorCodes.io, `failed to open database "${name}"`, {
|
|
85
|
+
operation: 'open',
|
|
86
|
+
cause: error,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** 数据库名 */
|
|
91
|
+
get name() {
|
|
92
|
+
return this.databaseName;
|
|
93
|
+
}
|
|
94
|
+
/** 当前 LSN */
|
|
95
|
+
get lsn() {
|
|
96
|
+
return this.lastLsn;
|
|
97
|
+
}
|
|
98
|
+
/** 事务状态 */
|
|
99
|
+
get transactionState() {
|
|
100
|
+
return this.overlay ? 'active' : 'idle';
|
|
101
|
+
}
|
|
102
|
+
/** 是否已关闭 */
|
|
103
|
+
get isClosed() {
|
|
104
|
+
return this.closed;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 读取键
|
|
108
|
+
* @param key 键
|
|
109
|
+
*/
|
|
110
|
+
async get(key) {
|
|
111
|
+
this.assertOpen('kvGet');
|
|
112
|
+
this.assertKey(key, 'kvGet');
|
|
113
|
+
if (this.overlay?.has(key)) {
|
|
114
|
+
const pending = this.overlay.get(key);
|
|
115
|
+
return pending.operation === WalOperation.Delete ? null : BinaryUtils.copy(pending.value);
|
|
116
|
+
}
|
|
117
|
+
return this.store.get(key);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 写入键
|
|
121
|
+
* @param key 键
|
|
122
|
+
* @param value 值
|
|
123
|
+
*/
|
|
124
|
+
async put(key, value) {
|
|
125
|
+
this.assertOpen('kvPut');
|
|
126
|
+
this.assertKey(key, 'kvPut');
|
|
127
|
+
if (this.overlay) {
|
|
128
|
+
this.overlay.set(key, { operation: WalOperation.Put, value: BinaryUtils.copy(value) });
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
await this.applyCommitted([{ operation: WalOperation.Put, key, value: BinaryUtils.copy(value) }]);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 删除键
|
|
135
|
+
* @param key 键
|
|
136
|
+
* @returns 键存在时返回 true
|
|
137
|
+
*/
|
|
138
|
+
async delete(key) {
|
|
139
|
+
this.assertOpen('kvDelete');
|
|
140
|
+
this.assertKey(key, 'kvDelete');
|
|
141
|
+
if (this.overlay) {
|
|
142
|
+
const exists = this.existsInView(key);
|
|
143
|
+
this.overlay.set(key, { operation: WalOperation.Delete, value: null });
|
|
144
|
+
return exists;
|
|
145
|
+
}
|
|
146
|
+
if (!this.store.has(key)) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
await this.applyCommitted([{ operation: WalOperation.Delete, key, value: null }]);
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
/** 开启事务 */
|
|
153
|
+
begin() {
|
|
154
|
+
this.assertOpen('begin');
|
|
155
|
+
if (this.overlay) {
|
|
156
|
+
throw new LightDbError(LightDbErrorCodes.unsupported, 'a transaction is already active', {
|
|
157
|
+
operation: 'begin',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
this.overlay = new Map();
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 提交事务
|
|
164
|
+
*/
|
|
165
|
+
async commit() {
|
|
166
|
+
this.assertOpen('commit');
|
|
167
|
+
if (!this.overlay) {
|
|
168
|
+
throw new LightDbError(LightDbErrorCodes.unsupported, 'no active transaction', { operation: 'commit' });
|
|
169
|
+
}
|
|
170
|
+
const pending = this.overlay;
|
|
171
|
+
this.overlay = null;
|
|
172
|
+
if (pending.size === 0) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const transactionId = this.nextTransactionId++;
|
|
176
|
+
const mutations = [];
|
|
177
|
+
for (const [key, mutation] of pending) {
|
|
178
|
+
mutations.push({ operation: mutation.operation, key, value: mutation.value });
|
|
179
|
+
}
|
|
180
|
+
await this.applyCommitted(mutations, transactionId);
|
|
181
|
+
}
|
|
182
|
+
/** 回滚事务 */
|
|
183
|
+
rollback() {
|
|
184
|
+
this.assertOpen('rollback');
|
|
185
|
+
if (!this.overlay) {
|
|
186
|
+
throw new LightDbError(LightDbErrorCodes.unsupported, 'no active transaction', { operation: 'rollback' });
|
|
187
|
+
}
|
|
188
|
+
this.overlay = null;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* 执行检查点
|
|
192
|
+
*/
|
|
193
|
+
async checkpoint() {
|
|
194
|
+
this.assertOpen('checkpoint');
|
|
195
|
+
if (this.overlay) {
|
|
196
|
+
throw new LightDbError(LightDbErrorCodes.unsupported, 'cannot checkpoint during a transaction', {
|
|
197
|
+
operation: 'checkpoint',
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
const walBytesReleased = this.wal.byteSize;
|
|
201
|
+
const bytesWritten = await this.checkpointWriter.write(this.store.snapshot(), this.lastLsn);
|
|
202
|
+
await this.wal.truncate(0);
|
|
203
|
+
return { lsn: this.lastLsn, bytesWritten, walBytesReleased };
|
|
204
|
+
}
|
|
205
|
+
/** 广播 schema 变更,供其它标签页失效本地视图 */
|
|
206
|
+
notifySchemaChange() {
|
|
207
|
+
this.assertOpen('notifySchemaChange');
|
|
208
|
+
this.broadcaster.notify({ type: 'schema', name: this.databaseName });
|
|
209
|
+
}
|
|
210
|
+
/** 统计信息 */
|
|
211
|
+
getStats() {
|
|
212
|
+
this.assertOpen('stats');
|
|
213
|
+
return {
|
|
214
|
+
name: this.databaseName,
|
|
215
|
+
lsn: this.lastLsn,
|
|
216
|
+
recordCount: this.store.size,
|
|
217
|
+
walBytes: this.wal.byteSize,
|
|
218
|
+
pageSize: this.options.pageSize,
|
|
219
|
+
storageKind: this.adapter.kind,
|
|
220
|
+
persistent: this.adapter.persistent,
|
|
221
|
+
transactionState: this.transactionState,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/** 关闭引擎 */
|
|
225
|
+
async close() {
|
|
226
|
+
if (this.closed) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
this.closed = true;
|
|
230
|
+
this.overlay = null;
|
|
231
|
+
this.broadcaster.notify({ type: 'close', name: this.databaseName });
|
|
232
|
+
this.broadcaster.close();
|
|
233
|
+
try {
|
|
234
|
+
await this.wal.close();
|
|
235
|
+
}
|
|
236
|
+
finally {
|
|
237
|
+
try {
|
|
238
|
+
await this.adapter.close();
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
await this.lease.release();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* 追加 WAL 并应用记录
|
|
247
|
+
* @param mutations 变更
|
|
248
|
+
* @param transactionId 事务号
|
|
249
|
+
*/
|
|
250
|
+
async applyCommitted(mutations, transactionId = 0n) {
|
|
251
|
+
const records = mutations.map((mutation) => ({
|
|
252
|
+
lsn: ++this.lastLsn,
|
|
253
|
+
transactionId,
|
|
254
|
+
operation: mutation.operation,
|
|
255
|
+
key: mutation.key,
|
|
256
|
+
value: mutation.value,
|
|
257
|
+
}));
|
|
258
|
+
await this.wal.append(records);
|
|
259
|
+
for (const mutation of mutations) {
|
|
260
|
+
if (mutation.operation === WalOperation.Delete) {
|
|
261
|
+
this.store.delete(mutation.key);
|
|
262
|
+
}
|
|
263
|
+
else if (mutation.value) {
|
|
264
|
+
this.store.put(mutation.key, mutation.value);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
this.broadcaster.notify({ type: 'commit', name: this.databaseName, lsn: this.lastLsn.toString() });
|
|
268
|
+
if (this.options.autoCheckpoint && this.wal.byteSize >= this.options.walThreshold) {
|
|
269
|
+
await this.checkpoint();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* 判断键在当前视图(含事务覆盖层)是否存在
|
|
274
|
+
* @param key 键
|
|
275
|
+
*/
|
|
276
|
+
existsInView(key) {
|
|
277
|
+
if (this.overlay?.has(key)) {
|
|
278
|
+
return this.overlay.get(key).operation === WalOperation.Put;
|
|
279
|
+
}
|
|
280
|
+
return this.store.has(key);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* 断言引擎未关闭
|
|
284
|
+
* @param operation 操作名
|
|
285
|
+
*/
|
|
286
|
+
assertOpen(operation) {
|
|
287
|
+
if (this.closed) {
|
|
288
|
+
throw new LightDbError(LightDbErrorCodes.sessionClosed, `database "${this.databaseName}" is closed`, {
|
|
289
|
+
operation,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* 断言键合法
|
|
295
|
+
* @param key 键
|
|
296
|
+
* @param operation 操作名
|
|
297
|
+
*/
|
|
298
|
+
assertKey(key, operation) {
|
|
299
|
+
if (key.length === 0) {
|
|
300
|
+
throw new LightDbError(LightDbErrorCodes.unsupported, 'key must not be empty', { operation });
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core 层导出
|
|
3
|
+
*
|
|
4
|
+
* 数据库语义、事务、恢复与单写者合同,不依赖具体存储后端。
|
|
5
|
+
*/
|
|
6
|
+
export { RecordStore } from './records';
|
|
7
|
+
export { WalLog } from './wal';
|
|
8
|
+
export { CheckpointWriter } from './checkpoint';
|
|
9
|
+
export { RecoveryManager } from './recovery';
|
|
10
|
+
export type { RecoveryOutcome } from './recovery';
|
|
11
|
+
export { acquireWriterLease } from './lease';
|
|
12
|
+
export type { LeaseMode, WriterLease } from './lease';
|
|
13
|
+
export { DatabaseBroadcaster, listenDatabaseEvents } from './broadcast';
|
|
14
|
+
export type { DatabaseEvent, DatabaseEventType } from './broadcast';
|
|
15
|
+
export { StorageEngine, DEFAULT_WAL_THRESHOLD } from './engine';
|
|
16
|
+
export type { CheckpointResult, StorageEngineOptions, StorageEngineStats, TransactionState } from './engine';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAChE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core 层导出
|
|
3
|
+
*
|
|
4
|
+
* 数据库语义、事务、恢复与单写者合同,不依赖具体存储后端。
|
|
5
|
+
*/
|
|
6
|
+
export { RecordStore } from './records';
|
|
7
|
+
export { WalLog } from './wal';
|
|
8
|
+
export { CheckpointWriter } from './checkpoint';
|
|
9
|
+
export { RecoveryManager } from './recovery';
|
|
10
|
+
export { acquireWriterLease } from './lease';
|
|
11
|
+
export { DatabaseBroadcaster, listenDatabaseEvents } from './broadcast';
|
|
12
|
+
export { StorageEngine, DEFAULT_WAL_THRESHOLD } from './engine';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 单写者租约
|
|
3
|
+
*
|
|
4
|
+
* 浏览器多标签页共享同一份 OPFS 数据,写者必须互斥。
|
|
5
|
+
* 首选 Web Locks,缺失时不静默退化成多写者。
|
|
6
|
+
*/
|
|
7
|
+
/** 写租约 */
|
|
8
|
+
export interface WriterLease {
|
|
9
|
+
/** 释放租约 */
|
|
10
|
+
release(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
/** 租约模式 */
|
|
13
|
+
export type LeaseMode = 'web-locks' | 'none';
|
|
14
|
+
/** Web Locks 结构化类型,避免引入 DOM lib */
|
|
15
|
+
interface LockManagerLike {
|
|
16
|
+
request(name: string, options: {
|
|
17
|
+
mode: 'exclusive';
|
|
18
|
+
ifAvailable: true;
|
|
19
|
+
}, callback: (lock: unknown) => Promise<void>): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 获取写租约
|
|
23
|
+
*
|
|
24
|
+
* @param databaseName 数据库名,用作锁名
|
|
25
|
+
* @param mode `web-locks` 走 Web Locks,`none` 表示调用方自行保证单写者(测试或单上下文)
|
|
26
|
+
* @param locks 可注入的锁实现,`null` 表示显式缺失,省略时读取宿主
|
|
27
|
+
* @returns 写租约
|
|
28
|
+
* @throws LightDbError `yydb.lease.unavailable` 当环境没有 Web Locks 或锁已被占用
|
|
29
|
+
*/
|
|
30
|
+
export declare function acquireWriterLease(databaseName: string, mode: LeaseMode, locks?: LockManagerLike | null): Promise<WriterLease>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=lease.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease.d.ts","sourceRoot":"","sources":["../../src/core/lease.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,UAAU;AACV,MAAM,WAAW,WAAW;IACxB,WAAW;IACX,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,WAAW;AACX,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;AAE7C,mCAAmC;AACnC,UAAU,eAAe;IACrB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,WAAW,EAAE,IAAI,CAAA;KAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvI;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAoEpI"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 单写者租约
|
|
3
|
+
*
|
|
4
|
+
* 浏览器多标签页共享同一份 OPFS 数据,写者必须互斥。
|
|
5
|
+
* 首选 Web Locks,缺失时不静默退化成多写者。
|
|
6
|
+
*/
|
|
7
|
+
import { LightDbError, LightDbErrorCodes } from '../errors';
|
|
8
|
+
/**
|
|
9
|
+
* 获取写租约
|
|
10
|
+
*
|
|
11
|
+
* @param databaseName 数据库名,用作锁名
|
|
12
|
+
* @param mode `web-locks` 走 Web Locks,`none` 表示调用方自行保证单写者(测试或单上下文)
|
|
13
|
+
* @param locks 可注入的锁实现,`null` 表示显式缺失,省略时读取宿主
|
|
14
|
+
* @returns 写租约
|
|
15
|
+
* @throws LightDbError `yydb.lease.unavailable` 当环境没有 Web Locks 或锁已被占用
|
|
16
|
+
*/
|
|
17
|
+
export async function acquireWriterLease(databaseName, mode, locks) {
|
|
18
|
+
if (mode === 'none') {
|
|
19
|
+
return { release: async () => undefined };
|
|
20
|
+
}
|
|
21
|
+
const manager = locks === undefined ? getLockManager() : locks;
|
|
22
|
+
if (!manager) {
|
|
23
|
+
throw new LightDbError(LightDbErrorCodes.leaseUnavailable, 'Web Locks is unavailable, refusing to open a second writer', {
|
|
24
|
+
operation: 'acquireWriteLease',
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
let releaseHold = () => undefined;
|
|
28
|
+
const hold = new Promise((resolve) => {
|
|
29
|
+
releaseHold = resolve;
|
|
30
|
+
});
|
|
31
|
+
let settled = false;
|
|
32
|
+
let released = false;
|
|
33
|
+
let completion = Promise.resolve();
|
|
34
|
+
const acquired = new Promise((resolve, reject) => {
|
|
35
|
+
completion = manager
|
|
36
|
+
.request(`yydb:${databaseName}`, { mode: 'exclusive', ifAvailable: true }, async (lock) => {
|
|
37
|
+
if (!lock) {
|
|
38
|
+
if (!settled) {
|
|
39
|
+
settled = true;
|
|
40
|
+
reject(new LightDbError(LightDbErrorCodes.leaseUnavailable, 'database is opened by another writer', {
|
|
41
|
+
operation: 'acquireWriteLease',
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (!settled) {
|
|
47
|
+
settled = true;
|
|
48
|
+
resolve();
|
|
49
|
+
}
|
|
50
|
+
await hold;
|
|
51
|
+
})
|
|
52
|
+
.catch((error) => {
|
|
53
|
+
if (!settled) {
|
|
54
|
+
settled = true;
|
|
55
|
+
reject(new LightDbError(LightDbErrorCodes.leaseUnavailable, 'failed to acquire the writer lease', {
|
|
56
|
+
operation: 'acquireWriteLease',
|
|
57
|
+
cause: error,
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
await acquired;
|
|
63
|
+
return {
|
|
64
|
+
release: async () => {
|
|
65
|
+
if (released) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
released = true;
|
|
69
|
+
releaseHold();
|
|
70
|
+
await completion.catch(() => undefined);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 取得宿主的 Web Locks 实现
|
|
76
|
+
*/
|
|
77
|
+
function getLockManager() {
|
|
78
|
+
const navigatorLike = globalThis.navigator;
|
|
79
|
+
return navigatorLike?.locks ?? null;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease.js","sourceRoot":"","sources":["../../src/core/lease.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAgB5D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,YAAoB,EAAE,IAAe,EAAE,KAA8B;IAC1G,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,IAAI,YAAY,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,4DAA4D,EAAE;YACrH,SAAS,EAAE,mBAAmB;SACjC,CAAC,CAAC;IACP,CAAC;IAED,IAAI,WAAW,GAAe,GAAG,EAAE,CAAC,SAAS,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACvC,WAAW,GAAG,OAAO,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAElD,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnD,UAAU,GAAG,OAAO;aACf,OAAO,CAAC,QAAQ,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtF,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,OAAO,GAAG,IAAI,CAAC;oBACf,MAAM,CACF,IAAI,YAAY,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,sCAAsC,EAAE;wBACzF,SAAS,EAAE,mBAAmB;qBACjC,CAAC,CACL,CAAC;gBACN,CAAC;gBACD,OAAO;YACX,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;YACd,CAAC;YAED,MAAM,IAAI,CAAC;QACf,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACtB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CACF,IAAI,YAAY,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,oCAAoC,EAAE;oBACvF,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,KAAK;iBACf,CAAC,CACL,CAAC;YACN,CAAC;QACL,CAAC,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,CAAC;IAEf,OAAO;QACH,OAAO,EAAE,KAAK,IAAI,EAAE;YAChB,IAAI,QAAQ,EAAE,CAAC;gBACX,OAAO;YACX,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC;YAChB,WAAW,EAAE,CAAC;YACd,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;KACJ,CAAC;AACN,CAAC;AAED;;GAEG;AACH,SAAS,cAAc;IACnB,MAAM,aAAa,GAAI,UAA0D,CAAC,SAAS,CAAC;IAC5F,OAAO,aAAa,EAAE,KAAK,IAAI,IAAI,CAAC;AACxC,CAAC"}
|