@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
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IndexedDB 存储适配器
|
|
3
|
-
*
|
|
4
|
-
* 兼容后端:宿主没有 OPFS,或需要在同一浏览器配置里复用既有存储时使用。
|
|
5
|
-
* 它只实现 `StorageAdapter` 合同,事务、恢复与检查点语义仍由 `core` 决定,
|
|
6
|
-
* 两套后端不各自实现一套数据库语义。
|
|
7
|
-
*
|
|
8
|
-
* IndexedDB 没有按位置随机写的原生能力,因此句柄在内存中维护整份文件内容,
|
|
9
|
-
* `sync()` 与 `close()` 负责把它写回对象仓库。这牺牲了 OPFS 那样的细粒度
|
|
10
|
-
* 原子性,属于兼容后端的已知取舍。
|
|
11
|
-
*/
|
|
12
|
-
import type { StorageAdapter, StorageAdapterFactory, StorageFile, StorageHandle, StorageOpenMode } from '../StorageAdapter';
|
|
13
|
-
/** IndexedDB 请求的结构化视图 */
|
|
14
|
-
interface IdbRequestLike<T> {
|
|
15
|
-
result: T;
|
|
16
|
-
error: unknown;
|
|
17
|
-
onsuccess: (() => void) | null;
|
|
18
|
-
onerror: (() => void) | null;
|
|
19
|
-
}
|
|
20
|
-
/** 对象仓库的结构化视图 */
|
|
21
|
-
interface IdbObjectStoreLike {
|
|
22
|
-
get(key: string): IdbRequestLike<ArrayBuffer | undefined>;
|
|
23
|
-
put(value: ArrayBuffer, key: string): IdbRequestLike<unknown>;
|
|
24
|
-
delete(key: string): IdbRequestLike<unknown>;
|
|
25
|
-
getAllKeys(): IdbRequestLike<string[]>;
|
|
26
|
-
}
|
|
27
|
-
/** 事务的结构化视图 */
|
|
28
|
-
interface IdbTransactionLike {
|
|
29
|
-
error: unknown;
|
|
30
|
-
oncomplete: (() => void) | null;
|
|
31
|
-
onerror: (() => void) | null;
|
|
32
|
-
onabort: (() => void) | null;
|
|
33
|
-
objectStore(name: string): IdbObjectStoreLike;
|
|
34
|
-
abort(): void;
|
|
35
|
-
}
|
|
36
|
-
/** 数据库的结构化视图 */
|
|
37
|
-
interface IdbDatabaseLike {
|
|
38
|
-
objectStoreNames: {
|
|
39
|
-
contains(name: string): boolean;
|
|
40
|
-
};
|
|
41
|
-
createObjectStore(name: string): IdbObjectStoreLike;
|
|
42
|
-
transaction(name: string, mode?: 'readonly' | 'readwrite'): IdbTransactionLike;
|
|
43
|
-
close(): void;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* 判断当前宿主是否提供 IndexedDB
|
|
47
|
-
*/
|
|
48
|
-
export declare function isIndexedDbAvailable(): boolean;
|
|
49
|
-
/**
|
|
50
|
-
* IndexedDB 适配器工厂
|
|
51
|
-
*/
|
|
52
|
-
export declare class IndexedDbStorageAdapterFactory implements StorageAdapterFactory {
|
|
53
|
-
/** 适配器类型 */
|
|
54
|
-
readonly kind: "indexeddb";
|
|
55
|
-
/** 数据持久化 */
|
|
56
|
-
readonly persistent = true;
|
|
57
|
-
/**
|
|
58
|
-
* 打开数据库适配器
|
|
59
|
-
* @param name 数据库名
|
|
60
|
-
*/
|
|
61
|
-
openDatabase(name: string): Promise<StorageAdapter>;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* IndexedDB 存储适配器
|
|
65
|
-
*/
|
|
66
|
-
export declare class IndexedDbStorageAdapter implements StorageAdapter {
|
|
67
|
-
/** 适配器类型 */
|
|
68
|
-
readonly kind: "indexeddb";
|
|
69
|
-
/** 数据持久化 */
|
|
70
|
-
readonly persistent = true;
|
|
71
|
-
private readonly name;
|
|
72
|
-
private readonly db;
|
|
73
|
-
private closed;
|
|
74
|
-
constructor(name: string, db: IdbDatabaseLike);
|
|
75
|
-
/**
|
|
76
|
-
* 打开逻辑文件
|
|
77
|
-
* @param file 逻辑文件名
|
|
78
|
-
* @param mode 打开模式
|
|
79
|
-
*/
|
|
80
|
-
open(file: StorageFile, mode?: StorageOpenMode): Promise<StorageHandle>;
|
|
81
|
-
/**
|
|
82
|
-
* 判断文件是否存在
|
|
83
|
-
* @param file 逻辑文件名
|
|
84
|
-
*/
|
|
85
|
-
exists(file: StorageFile): Promise<boolean>;
|
|
86
|
-
/**
|
|
87
|
-
* 删除文件,不存在时视为成功
|
|
88
|
-
* @param file 逻辑文件名
|
|
89
|
-
*/
|
|
90
|
-
delete(file: StorageFile): Promise<void>;
|
|
91
|
-
/**
|
|
92
|
-
* 原子重命名:同一事务内写入目标并删除源
|
|
93
|
-
* @param from 源文件
|
|
94
|
-
* @param to 目标文件
|
|
95
|
-
*/
|
|
96
|
-
rename(from: StorageFile, to: StorageFile): Promise<void>;
|
|
97
|
-
/**
|
|
98
|
-
* 列出已存在的文件
|
|
99
|
-
*/
|
|
100
|
-
list(): Promise<StorageFile[]>;
|
|
101
|
-
/** 关闭适配器 */
|
|
102
|
-
close(): Promise<void>;
|
|
103
|
-
/**
|
|
104
|
-
* 写回逻辑文件内容
|
|
105
|
-
* @param file 逻辑文件名
|
|
106
|
-
* @param data 文件内容
|
|
107
|
-
*/
|
|
108
|
-
persist(file: StorageFile, data: Uint8Array): Promise<void>;
|
|
109
|
-
/**
|
|
110
|
-
* 读取逻辑文件内容
|
|
111
|
-
* @param file 逻辑文件名
|
|
112
|
-
* @returns 内容,文件不存在时返回 null
|
|
113
|
-
*/
|
|
114
|
-
private readFile;
|
|
115
|
-
/**
|
|
116
|
-
* 执行只读事务
|
|
117
|
-
* @param operation 操作名
|
|
118
|
-
* @param action 请求构造
|
|
119
|
-
*/
|
|
120
|
-
private readTransaction;
|
|
121
|
-
/**
|
|
122
|
-
* 执行读写事务
|
|
123
|
-
* @param operation 操作名
|
|
124
|
-
* @param action 请求构造
|
|
125
|
-
*/
|
|
126
|
-
private writeTransaction;
|
|
127
|
-
/**
|
|
128
|
-
* 创建事务
|
|
129
|
-
* @param mode 事务模式
|
|
130
|
-
* @param operation 操作名
|
|
131
|
-
*/
|
|
132
|
-
private beginTransaction;
|
|
133
|
-
/**
|
|
134
|
-
* 断言适配器未关闭
|
|
135
|
-
* @param operation 操作名
|
|
136
|
-
*/
|
|
137
|
-
private assertOpen;
|
|
138
|
-
}
|
|
139
|
-
export {};
|
|
140
|
-
//# sourceMappingURL=IndexedDbStorageAdapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IndexedDbStorageAdapter.d.ts","sourceRoot":"","sources":["../../../src/storage/indexeddb/IndexedDbStorageAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,403 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IndexedDB 存储适配器
|
|
3
|
-
*
|
|
4
|
-
* 兼容后端:宿主没有 OPFS,或需要在同一浏览器配置里复用既有存储时使用。
|
|
5
|
-
* 它只实现 `StorageAdapter` 合同,事务、恢复与检查点语义仍由 `core` 决定,
|
|
6
|
-
* 两套后端不各自实现一套数据库语义。
|
|
7
|
-
*
|
|
8
|
-
* IndexedDB 没有按位置随机写的原生能力,因此句柄在内存中维护整份文件内容,
|
|
9
|
-
* `sync()` 与 `close()` 负责把它写回对象仓库。这牺牲了 OPFS 那样的细粒度
|
|
10
|
-
* 原子性,属于兼容后端的已知取舍。
|
|
11
|
-
*/
|
|
12
|
-
import { LightDbError, LightDbErrorCodes } from '../../errors';
|
|
13
|
-
import { STORAGE_FILES } from '../StorageAdapter';
|
|
14
|
-
/** 对象仓库名 */
|
|
15
|
-
const STORE_NAME = 'files';
|
|
16
|
-
/** IndexedDB 数据库版本 */
|
|
17
|
-
const DB_VERSION = 1;
|
|
18
|
-
/** 数据库名前缀,避免与宿主自己的对象仓库冲突 */
|
|
19
|
-
const DATABASE_PREFIX = 'yydb:light:';
|
|
20
|
-
/**
|
|
21
|
-
* 判断当前宿主是否提供 IndexedDB
|
|
22
|
-
*/
|
|
23
|
-
export function isIndexedDbAvailable() {
|
|
24
|
-
const factory = globalThis.indexedDB;
|
|
25
|
-
return typeof factory?.open === 'function';
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* IndexedDB 适配器工厂
|
|
29
|
-
*/
|
|
30
|
-
export class IndexedDbStorageAdapterFactory {
|
|
31
|
-
/** 适配器类型 */
|
|
32
|
-
kind = 'indexeddb';
|
|
33
|
-
/** 数据持久化 */
|
|
34
|
-
persistent = true;
|
|
35
|
-
/**
|
|
36
|
-
* 打开数据库适配器
|
|
37
|
-
* @param name 数据库名
|
|
38
|
-
*/
|
|
39
|
-
async openDatabase(name) {
|
|
40
|
-
const database = await openIdbDatabase(`${DATABASE_PREFIX}${name}`, 'openDatabase');
|
|
41
|
-
return new IndexedDbStorageAdapter(name, database);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* IndexedDB 存储适配器
|
|
46
|
-
*/
|
|
47
|
-
export class IndexedDbStorageAdapter {
|
|
48
|
-
/** 适配器类型 */
|
|
49
|
-
kind = 'indexeddb';
|
|
50
|
-
/** 数据持久化 */
|
|
51
|
-
persistent = true;
|
|
52
|
-
name;
|
|
53
|
-
db;
|
|
54
|
-
closed = false;
|
|
55
|
-
constructor(name, db) {
|
|
56
|
-
this.name = name;
|
|
57
|
-
this.db = db;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* 打开逻辑文件
|
|
61
|
-
* @param file 逻辑文件名
|
|
62
|
-
* @param mode 打开模式
|
|
63
|
-
*/
|
|
64
|
-
async open(file, mode = 'readwrite') {
|
|
65
|
-
this.assertOpen('storageOpen');
|
|
66
|
-
const data = await this.readFile(file);
|
|
67
|
-
if (data === null && mode === 'read') {
|
|
68
|
-
throw new LightDbError(LightDbErrorCodes.io, `storage file "${file}" does not exist in "${this.name}"`, {
|
|
69
|
-
operation: 'storageOpen',
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
return new IndexedDbStorageHandle(this, file, data ?? new Uint8Array(0), mode === 'read');
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* 判断文件是否存在
|
|
76
|
-
* @param file 逻辑文件名
|
|
77
|
-
*/
|
|
78
|
-
async exists(file) {
|
|
79
|
-
this.assertOpen('storageExists');
|
|
80
|
-
return (await this.readFile(file)) !== null;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* 删除文件,不存在时视为成功
|
|
84
|
-
* @param file 逻辑文件名
|
|
85
|
-
*/
|
|
86
|
-
async delete(file) {
|
|
87
|
-
this.assertOpen('storageDelete');
|
|
88
|
-
await this.writeTransaction('storageDelete', (store) => {
|
|
89
|
-
store.delete(file);
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* 原子重命名:同一事务内写入目标并删除源
|
|
94
|
-
* @param from 源文件
|
|
95
|
-
* @param to 目标文件
|
|
96
|
-
*/
|
|
97
|
-
async rename(from, to) {
|
|
98
|
-
this.assertOpen('storageRename');
|
|
99
|
-
const data = await this.readFile(from);
|
|
100
|
-
if (data === null) {
|
|
101
|
-
throw new LightDbError(LightDbErrorCodes.io, `cannot rename missing storage file "${from}"`, {
|
|
102
|
-
operation: 'storageRename',
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
await this.writeTransaction('storageRename', (store) => {
|
|
106
|
-
store.put(toArrayBuffer(data), to);
|
|
107
|
-
store.delete(from);
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* 列出已存在的文件
|
|
112
|
-
*/
|
|
113
|
-
async list() {
|
|
114
|
-
this.assertOpen('storageList');
|
|
115
|
-
const keys = await this.readTransaction('storageList', (store) => requestResult(store.getAllKeys(), 'storageList', `failed to list IndexedDB database "${this.name}"`));
|
|
116
|
-
return STORAGE_FILES.filter((file) => keys.includes(file));
|
|
117
|
-
}
|
|
118
|
-
/** 关闭适配器 */
|
|
119
|
-
async close() {
|
|
120
|
-
if (this.closed) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
this.closed = true;
|
|
124
|
-
try {
|
|
125
|
-
this.db.close();
|
|
126
|
-
}
|
|
127
|
-
catch (error) {
|
|
128
|
-
throw toStorageError(error, 'storageClose', `failed to close IndexedDB database "${this.name}"`);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* 写回逻辑文件内容
|
|
133
|
-
* @param file 逻辑文件名
|
|
134
|
-
* @param data 文件内容
|
|
135
|
-
*/
|
|
136
|
-
async persist(file, data) {
|
|
137
|
-
this.assertOpen('write');
|
|
138
|
-
await this.writeTransaction('write', (store) => {
|
|
139
|
-
store.put(toArrayBuffer(data), file);
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* 读取逻辑文件内容
|
|
144
|
-
* @param file 逻辑文件名
|
|
145
|
-
* @returns 内容,文件不存在时返回 null
|
|
146
|
-
*/
|
|
147
|
-
readFile(file) {
|
|
148
|
-
return this.readTransaction('read', async (store) => {
|
|
149
|
-
const buffer = await requestResult(store.get(file), 'read', `failed to read storage file "${file}"`);
|
|
150
|
-
return buffer === undefined ? null : new Uint8Array(buffer);
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* 执行只读事务
|
|
155
|
-
* @param operation 操作名
|
|
156
|
-
* @param action 请求构造
|
|
157
|
-
*/
|
|
158
|
-
async readTransaction(operation, action) {
|
|
159
|
-
const tx = this.beginTransaction('readonly', operation);
|
|
160
|
-
const done = awaitTransaction(tx, operation, `IndexedDB transaction failed for "${this.name}"`);
|
|
161
|
-
const result = await action(tx.objectStore(STORE_NAME));
|
|
162
|
-
await done;
|
|
163
|
-
return result;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* 执行读写事务
|
|
167
|
-
* @param operation 操作名
|
|
168
|
-
* @param action 请求构造
|
|
169
|
-
*/
|
|
170
|
-
async writeTransaction(operation, action) {
|
|
171
|
-
const tx = this.beginTransaction('readwrite', operation);
|
|
172
|
-
const done = awaitTransaction(tx, operation, `IndexedDB transaction failed for "${this.name}"`);
|
|
173
|
-
try {
|
|
174
|
-
action(tx.objectStore(STORE_NAME));
|
|
175
|
-
}
|
|
176
|
-
catch (error) {
|
|
177
|
-
try {
|
|
178
|
-
tx.abort();
|
|
179
|
-
}
|
|
180
|
-
catch {
|
|
181
|
-
// 事务已经结束,保留原始错误
|
|
182
|
-
}
|
|
183
|
-
await done.catch(() => undefined);
|
|
184
|
-
throw toStorageError(error, operation, `failed to write IndexedDB database "${this.name}"`);
|
|
185
|
-
}
|
|
186
|
-
await done;
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* 创建事务
|
|
190
|
-
* @param mode 事务模式
|
|
191
|
-
* @param operation 操作名
|
|
192
|
-
*/
|
|
193
|
-
beginTransaction(mode, operation) {
|
|
194
|
-
try {
|
|
195
|
-
return this.db.transaction(STORE_NAME, mode);
|
|
196
|
-
}
|
|
197
|
-
catch (error) {
|
|
198
|
-
throw toStorageError(error, operation, `failed to start IndexedDB transaction for "${this.name}"`);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* 断言适配器未关闭
|
|
203
|
-
* @param operation 操作名
|
|
204
|
-
*/
|
|
205
|
-
assertOpen(operation) {
|
|
206
|
-
if (this.closed) {
|
|
207
|
-
throw new LightDbError(LightDbErrorCodes.sessionClosed, `IndexedDB database "${this.name}" is closed`, {
|
|
208
|
-
operation,
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* IndexedDB 文件句柄
|
|
215
|
-
*
|
|
216
|
-
* 内容常驻内存,`sync()` 与 `close()` 写回对象仓库。
|
|
217
|
-
*/
|
|
218
|
-
class IndexedDbStorageHandle {
|
|
219
|
-
adapter;
|
|
220
|
-
file;
|
|
221
|
-
readOnly;
|
|
222
|
-
data;
|
|
223
|
-
dirty = false;
|
|
224
|
-
closed = false;
|
|
225
|
-
constructor(adapter, file, data, readOnly) {
|
|
226
|
-
this.adapter = adapter;
|
|
227
|
-
this.file = file;
|
|
228
|
-
this.data = data;
|
|
229
|
-
this.readOnly = readOnly;
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* 读取指定区间
|
|
233
|
-
* @param position 起始位置
|
|
234
|
-
* @param length 期望长度
|
|
235
|
-
*/
|
|
236
|
-
async read(position, length) {
|
|
237
|
-
this.assertOpen('read');
|
|
238
|
-
if (position >= this.data.length || length <= 0) {
|
|
239
|
-
return new Uint8Array(0);
|
|
240
|
-
}
|
|
241
|
-
return this.data.slice(position, Math.min(position + length, this.data.length));
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* 写入指定位置
|
|
245
|
-
* @param position 起始位置
|
|
246
|
-
* @param data 数据
|
|
247
|
-
*/
|
|
248
|
-
async write(position, data) {
|
|
249
|
-
this.assertOpen('write');
|
|
250
|
-
const required = position + data.length;
|
|
251
|
-
if (this.data.length < required) {
|
|
252
|
-
const next = new Uint8Array(required);
|
|
253
|
-
next.set(this.data, 0);
|
|
254
|
-
this.data = next;
|
|
255
|
-
}
|
|
256
|
-
this.data.set(data, position);
|
|
257
|
-
this.dirty = true;
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* 截断文件
|
|
261
|
-
* @param size 目标大小
|
|
262
|
-
*/
|
|
263
|
-
async truncate(size) {
|
|
264
|
-
this.assertOpen('truncate');
|
|
265
|
-
if (size <= this.data.length) {
|
|
266
|
-
this.data = this.data.slice(0, size);
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
const next = new Uint8Array(size);
|
|
270
|
-
next.set(this.data, 0);
|
|
271
|
-
this.data = next;
|
|
272
|
-
}
|
|
273
|
-
this.dirty = true;
|
|
274
|
-
}
|
|
275
|
-
/** 写回对象仓库 */
|
|
276
|
-
async sync() {
|
|
277
|
-
this.assertOpen('sync');
|
|
278
|
-
if (!this.dirty || this.readOnly) {
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
await this.adapter.persist(this.file, this.data);
|
|
282
|
-
this.dirty = false;
|
|
283
|
-
}
|
|
284
|
-
/** 当前文件大小 */
|
|
285
|
-
async size() {
|
|
286
|
-
this.assertOpen('size');
|
|
287
|
-
return this.data.length;
|
|
288
|
-
}
|
|
289
|
-
/** 关闭句柄 */
|
|
290
|
-
async close() {
|
|
291
|
-
if (this.closed) {
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
await this.sync();
|
|
295
|
-
this.closed = true;
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* 断言句柄未关闭
|
|
299
|
-
* @param operation 操作名
|
|
300
|
-
*/
|
|
301
|
-
assertOpen(operation) {
|
|
302
|
-
if (this.closed) {
|
|
303
|
-
throw new LightDbError(LightDbErrorCodes.sessionClosed, `IndexedDB handle for "${this.file}" is closed`, {
|
|
304
|
-
operation,
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* 打开 IndexedDB 数据库
|
|
311
|
-
* @param name 物理数据库名
|
|
312
|
-
* @param operation 操作名
|
|
313
|
-
*/
|
|
314
|
-
function openIdbDatabase(name, operation) {
|
|
315
|
-
return new Promise((resolve, reject) => {
|
|
316
|
-
const factory = globalThis.indexedDB;
|
|
317
|
-
if (!factory) {
|
|
318
|
-
reject(new LightDbError(LightDbErrorCodes.unsupported, 'IndexedDB is not available in this environment', {
|
|
319
|
-
operation,
|
|
320
|
-
}));
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
let request;
|
|
324
|
-
try {
|
|
325
|
-
request = factory.open(name, DB_VERSION);
|
|
326
|
-
}
|
|
327
|
-
catch (error) {
|
|
328
|
-
reject(toStorageError(error, operation, `failed to open IndexedDB database "${name}"`));
|
|
329
|
-
return;
|
|
330
|
-
}
|
|
331
|
-
request.onupgradeneeded = () => {
|
|
332
|
-
const database = request.result;
|
|
333
|
-
if (!database.objectStoreNames.contains(STORE_NAME)) {
|
|
334
|
-
database.createObjectStore(STORE_NAME);
|
|
335
|
-
}
|
|
336
|
-
};
|
|
337
|
-
request.onsuccess = () => {
|
|
338
|
-
resolve(request.result);
|
|
339
|
-
};
|
|
340
|
-
request.onerror = () => {
|
|
341
|
-
reject(toStorageError(request.error, operation, `failed to open IndexedDB database "${name}"`));
|
|
342
|
-
};
|
|
343
|
-
request.onblocked = () => {
|
|
344
|
-
reject(new LightDbError(LightDbErrorCodes.io, `IndexedDB database "${name}" is blocked by another connection`, {
|
|
345
|
-
operation,
|
|
346
|
-
}));
|
|
347
|
-
};
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* 等待请求完成
|
|
352
|
-
* @param request 请求
|
|
353
|
-
* @param operation 操作名
|
|
354
|
-
* @param message 失败描述
|
|
355
|
-
*/
|
|
356
|
-
function requestResult(request, operation, message) {
|
|
357
|
-
return new Promise((resolve, reject) => {
|
|
358
|
-
request.onsuccess = () => {
|
|
359
|
-
resolve(request.result);
|
|
360
|
-
};
|
|
361
|
-
request.onerror = () => {
|
|
362
|
-
reject(toStorageError(request.error, operation, message));
|
|
363
|
-
};
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* 等待事务提交
|
|
368
|
-
* @param tx 事务
|
|
369
|
-
* @param operation 操作名
|
|
370
|
-
* @param message 失败描述
|
|
371
|
-
*/
|
|
372
|
-
function awaitTransaction(tx, operation, message) {
|
|
373
|
-
return new Promise((resolve, reject) => {
|
|
374
|
-
tx.oncomplete = () => {
|
|
375
|
-
resolve();
|
|
376
|
-
};
|
|
377
|
-
tx.onerror = () => {
|
|
378
|
-
reject(toStorageError(tx.error, operation, message));
|
|
379
|
-
};
|
|
380
|
-
tx.onabort = () => {
|
|
381
|
-
reject(toStorageError(tx.error, operation, message));
|
|
382
|
-
};
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* 复制为独立的 `ArrayBuffer`
|
|
387
|
-
* @param data 数据
|
|
388
|
-
*/
|
|
389
|
-
function toArrayBuffer(data) {
|
|
390
|
-
return data.slice().buffer;
|
|
391
|
-
}
|
|
392
|
-
/**
|
|
393
|
-
* 转换为稳定存储错误
|
|
394
|
-
* @param error 原始错误
|
|
395
|
-
* @param operation 操作名
|
|
396
|
-
* @param message 失败描述
|
|
397
|
-
*/
|
|
398
|
-
function toStorageError(error, operation, message) {
|
|
399
|
-
const name = typeof error === 'object' && error !== null ? error.name : undefined;
|
|
400
|
-
const code = name === 'QuotaExceededError' ? LightDbErrorCodes.quotaExceeded : LightDbErrorCodes.io;
|
|
401
|
-
return new LightDbError(code, message, { operation, cause: error });
|
|
402
|
-
}
|
|
403
|
-
//# sourceMappingURL=IndexedDbStorageAdapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IndexedDbStorageAdapter.js","sourceRoot":"","sources":["../../../src/storage/indexeddb/IndexedDbStorageAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 内存存储适配器
|
|
3
|
-
*
|
|
4
|
-
* 用于测试、无持久化需求的一次性会话,以及适配器合同的参考实现。
|
|
5
|
-
*/
|
|
6
|
-
import type { StorageAdapter, StorageAdapterFactory, StorageFile, StorageHandle, StorageOpenMode } from '../StorageAdapter';
|
|
7
|
-
/** 单个数据库的内存目录 */
|
|
8
|
-
type MemoryDirectory = Map<StorageFile, Uint8Array>;
|
|
9
|
-
/**
|
|
10
|
-
* 内存存储后端
|
|
11
|
-
*
|
|
12
|
-
* 只有共用同一个后端实例才能跨 `openDatabase` 读到上一会话的数据,
|
|
13
|
-
* 测试据此模拟「关闭后重开」。
|
|
14
|
-
*/
|
|
15
|
-
export declare class MemoryStorageBackend implements StorageAdapterFactory {
|
|
16
|
-
/** 适配器类型 */
|
|
17
|
-
readonly kind: "memory";
|
|
18
|
-
/** 会话结束后数据不保留 */
|
|
19
|
-
readonly persistent = false;
|
|
20
|
-
private readonly directories;
|
|
21
|
-
/**
|
|
22
|
-
* 打开数据库适配器
|
|
23
|
-
* @param name 数据库名
|
|
24
|
-
*/
|
|
25
|
-
openDatabase(name: string): Promise<StorageAdapter>;
|
|
26
|
-
/** 清空所有数据库 */
|
|
27
|
-
reset(): void;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* 内存存储适配器
|
|
31
|
-
*/
|
|
32
|
-
export declare class MemoryStorageAdapter implements StorageAdapter {
|
|
33
|
-
/** 适配器类型 */
|
|
34
|
-
readonly kind: "memory";
|
|
35
|
-
/** 会话结束后数据不保留 */
|
|
36
|
-
readonly persistent = false;
|
|
37
|
-
private readonly name;
|
|
38
|
-
private readonly directory;
|
|
39
|
-
private closed;
|
|
40
|
-
constructor(name: string, directory: MemoryDirectory);
|
|
41
|
-
/**
|
|
42
|
-
* 打开逻辑文件
|
|
43
|
-
* @param file 逻辑文件名
|
|
44
|
-
* @param mode 打开模式
|
|
45
|
-
*/
|
|
46
|
-
open(file: StorageFile, mode?: StorageOpenMode): Promise<StorageHandle>;
|
|
47
|
-
/**
|
|
48
|
-
* 判断文件是否存在
|
|
49
|
-
* @param file 逻辑文件名
|
|
50
|
-
*/
|
|
51
|
-
exists(file: StorageFile): Promise<boolean>;
|
|
52
|
-
/**
|
|
53
|
-
* 删除文件
|
|
54
|
-
* @param file 逻辑文件名
|
|
55
|
-
*/
|
|
56
|
-
delete(file: StorageFile): Promise<void>;
|
|
57
|
-
/**
|
|
58
|
-
* 原子重命名
|
|
59
|
-
* @param from 源文件
|
|
60
|
-
* @param to 目标文件
|
|
61
|
-
*/
|
|
62
|
-
rename(from: StorageFile, to: StorageFile): Promise<void>;
|
|
63
|
-
/**
|
|
64
|
-
* 列出已存在的文件
|
|
65
|
-
*/
|
|
66
|
-
list(): Promise<StorageFile[]>;
|
|
67
|
-
/** 关闭适配器 */
|
|
68
|
-
close(): Promise<void>;
|
|
69
|
-
/**
|
|
70
|
-
* 断言适配器未关闭
|
|
71
|
-
* @param operation 操作名
|
|
72
|
-
*/
|
|
73
|
-
private assertOpen;
|
|
74
|
-
}
|
|
75
|
-
export {};
|
|
76
|
-
//# sourceMappingURL=MemoryStorageAdapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryStorageAdapter.d.ts","sourceRoot":"","sources":["../../../src/storage/memory/MemoryStorageAdapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAG5H,iBAAiB;AACjB,KAAK,eAAe,GAAG,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAEpD;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAC9D,YAAY;IACZ,SAAgB,IAAI,WAAqB;IAEzC,iBAAiB;IACjB,SAAgB,UAAU,SAAS;IAEnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2C;IAEvE;;;OAGG;IACU,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAShE,cAAc;IACP,KAAK,IAAI,IAAI;CAGvB;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACvD,YAAY;IACZ,SAAgB,IAAI,WAAqB;IAEzC,iBAAiB;IACjB,SAAgB,UAAU,SAAS;IAEnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,MAAM,CAAkB;gBAEpB,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe;IAKpD;;;;OAIG;IACU,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,eAA6B,GAAG,OAAO,CAAC,aAAa,CAAC;IAiBjG;;;OAGG;IACU,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxD;;;OAGG;IACU,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD;;;;OAIG;IACU,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtE;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAK3C,YAAY;IACC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC;;;OAGG;IACH,OAAO,CAAC,UAAU;CAKrB"}
|