@yydb/light-db 0.0.18 → 0.1.2
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/index.d.ts +4 -9
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +3 -6
- package/dist/api/index.js.map +1 -1
- package/dist/api/types.d.ts +71 -42
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js +5 -3
- package/dist/api/types.js.map +1 -1
- package/dist/api/wasm-database.d.ts +134 -27
- package/dist/api/wasm-database.d.ts.map +1 -1
- package/dist/api/wasm-database.js +172 -28
- package/dist/api/wasm-database.js.map +1 -1
- package/dist/index.d.ts +14 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -11
- package/dist/index.js.map +1 -1
- package/dist/shared/micro.d.ts +86 -0
- package/dist/shared/micro.d.ts.map +1 -0
- package/dist/shared/micro.js +194 -0
- package/dist/shared/micro.js.map +1 -0
- package/dist/shared/udf-types.d.ts +31 -0
- package/dist/shared/udf-types.d.ts.map +1 -0
- package/dist/shared/udf-types.js +12 -0
- package/dist/shared/udf-types.js.map +1 -0
- package/package.json +5 -7
- package/readme.md +60 -63
- package/dist/api/database.d.ts +0 -101
- package/dist/api/database.d.ts.map +0 -1
- package/dist/api/database.js +0 -149
- package/dist/api/database.js.map +0 -1
- package/dist/api/schema.d.ts +0 -33
- package/dist/api/schema.d.ts.map +0 -1
- package/dist/api/schema.js +0 -80
- package/dist/api/schema.js.map +0 -1
- package/dist/api/transaction.d.ts +0 -26
- package/dist/api/transaction.d.ts.map +0 -1
- package/dist/api/transaction.js +0 -52
- package/dist/api/transaction.js.map +0 -1
- package/dist/codec/binary.d.ts +0 -196
- package/dist/codec/binary.d.ts.map +0 -1
- package/dist/codec/binary.js +0 -342
- package/dist/codec/binary.js.map +0 -1
- package/dist/codec/checksum.d.ts +0 -21
- package/dist/codec/checksum.d.ts.map +0 -1
- package/dist/codec/checksum.js +0 -46
- package/dist/codec/checksum.js.map +0 -1
- package/dist/codec/index.d.ts +0 -12
- package/dist/codec/index.d.ts.map +0 -1
- package/dist/codec/index.js +0 -10
- package/dist/codec/index.js.map +0 -1
- package/dist/codec/page.d.ts +0 -114
- package/dist/codec/page.d.ts.map +0 -1
- package/dist/codec/page.js +0 -225
- package/dist/codec/page.js.map +0 -1
- package/dist/codec/record.d.ts +0 -62
- package/dist/codec/record.d.ts.map +0 -1
- package/dist/codec/record.js +0 -82
- package/dist/codec/record.js.map +0 -1
- package/dist/core/broadcast.d.ts +0 -39
- package/dist/core/broadcast.d.ts.map +0 -1
- package/dist/core/broadcast.js +0 -54
- package/dist/core/broadcast.js.map +0 -1
- package/dist/core/checkpoint.d.ts +0 -23
- package/dist/core/checkpoint.d.ts.map +0 -1
- package/dist/core/checkpoint.js +0 -49
- package/dist/core/checkpoint.js.map +0 -1
- package/dist/core/engine.d.ts +0 -142
- package/dist/core/engine.d.ts.map +0 -1
- package/dist/core/engine.js +0 -304
- package/dist/core/engine.js.map +0 -1
- package/dist/core/index.d.ts +0 -17
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -13
- package/dist/core/index.js.map +0 -1
- package/dist/core/lease.d.ts +0 -32
- package/dist/core/lease.d.ts.map +0 -1
- package/dist/core/lease.js +0 -81
- package/dist/core/lease.js.map +0 -1
- package/dist/core/records.d.ts +0 -49
- package/dist/core/records.d.ts.map +0 -1
- package/dist/core/records.js +0 -70
- package/dist/core/records.js.map +0 -1
- package/dist/core/recovery.d.ts +0 -43
- package/dist/core/recovery.d.ts.map +0 -1
- package/dist/core/recovery.js +0 -99
- package/dist/core/recovery.js.map +0 -1
- package/dist/core/wal.d.ts +0 -50
- package/dist/core/wal.d.ts.map +0 -1
- package/dist/core/wal.js +0 -114
- package/dist/core/wal.js.map +0 -1
- package/dist/storage/StorageAdapter.d.ts +0 -97
- package/dist/storage/StorageAdapter.d.ts.map +0 -1
- package/dist/storage/StorageAdapter.js +0 -9
- package/dist/storage/StorageAdapter.js.map +0 -1
- package/dist/storage/index.d.ts +0 -11
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -10
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/indexeddb/IndexedDbStorageAdapter.d.ts +0 -140
- package/dist/storage/indexeddb/IndexedDbStorageAdapter.d.ts.map +0 -1
- package/dist/storage/indexeddb/IndexedDbStorageAdapter.js +0 -403
- package/dist/storage/indexeddb/IndexedDbStorageAdapter.js.map +0 -1
- package/dist/storage/memory/MemoryStorageAdapter.d.ts +0 -76
- package/dist/storage/memory/MemoryStorageAdapter.d.ts.map +0 -1
- package/dist/storage/memory/MemoryStorageAdapter.js +0 -212
- package/dist/storage/memory/MemoryStorageAdapter.js.map +0 -1
- package/dist/storage/opfs/OpfsStorageAdapter.d.ts +0 -141
- package/dist/storage/opfs/OpfsStorageAdapter.d.ts.map +0 -1
- package/dist/storage/opfs/OpfsStorageAdapter.js +0 -400
- package/dist/storage/opfs/OpfsStorageAdapter.js.map +0 -1
package/dist/core/engine.d.ts
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/core/engine.js
DELETED
|
@@ -1,304 +0,0 @@
|
|
|
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
|
package/dist/core/engine.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
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
|
package/dist/core/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/core/index.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
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
|
package/dist/core/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/core/lease.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
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
|
package/dist/core/lease.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/core/lease.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
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
|
package/dist/core/lease.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|