@aiao/rxdb-adapter-electron 0.0.0-stage → 0.0.28
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/LICENSE +21 -0
- package/README.md +394 -2
- package/dist/RxDBAdapterElectron.d.ts +61 -0
- package/dist/RxDBAdapterElectron.d.ts.map +1 -0
- package/dist/electron-adapter.interface.d.ts +23 -0
- package/dist/electron-adapter.interface.d.ts.map +1 -0
- package/dist/electron-file-host.d.ts +52 -0
- package/dist/electron-file-host.d.ts.map +1 -0
- package/dist/electron-sqlite-host.d.ts +65 -0
- package/dist/electron-sqlite-host.d.ts.map +1 -0
- package/dist/host.d.ts +19 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +768 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/node-sqlite-engine.d.ts +97 -0
- package/dist/node-sqlite-engine.d.ts.map +1 -0
- package/dist/pglite/RxDBAdapterElectronPGlite.d.ts +96 -0
- package/dist/pglite/RxDBAdapterElectronPGlite.d.ts.map +1 -0
- package/dist/pglite/desktop-pglite-client.d.ts +144 -0
- package/dist/pglite/desktop-pglite-client.d.ts.map +1 -0
- package/dist/pglite/desktop-pglite-results.d.ts +14 -0
- package/dist/pglite/desktop-pglite-results.d.ts.map +1 -0
- package/dist/pglite/electron-pglite-backup-error.d.ts +32 -0
- package/dist/pglite/electron-pglite-backup-error.d.ts.map +1 -0
- package/dist/pglite/pglite-adapter.interface.d.ts +68 -0
- package/dist/pglite/pglite-adapter.interface.d.ts.map +1 -0
- package/dist/pglite/restore-electron-pglite-database.d.ts +68 -0
- package/dist/pglite/restore-electron-pglite-database.d.ts.map +1 -0
- package/dist/pglite-host/electron-pglite-host.d.ts +129 -0
- package/dist/pglite-host/electron-pglite-host.d.ts.map +1 -0
- package/dist/pglite-host/pglite-host-data-dir.d.ts +75 -0
- package/dist/pglite-host/pglite-host-data-dir.d.ts.map +1 -0
- package/dist/pglite-host/pglite-host-lock.d.ts +48 -0
- package/dist/pglite-host/pglite-host-lock.d.ts.map +1 -0
- package/dist/pglite-host/pglite-host-restore.d.ts +38 -0
- package/dist/pglite-host/pglite-host-restore.d.ts.map +1 -0
- package/dist/pglite-host/pglite-host-runtime.d.ts +90 -0
- package/dist/pglite-host/pglite-host-runtime.d.ts.map +1 -0
- package/dist/pglite-host.d.ts +17 -0
- package/dist/pglite-host.d.ts.map +1 -0
- package/dist/pglite-host.js +738 -0
- package/dist/pglite.d.ts +22 -0
- package/dist/pglite.d.ts.map +1 -0
- package/dist/pglite.js +493 -0
- package/dist/sqlite-script.d.ts +26 -0
- package/dist/sqlite-script.d.ts.map +1 -0
- package/package.json +94 -3
- package/src/RxDBAdapterElectron.ts +105 -0
- package/src/electron-adapter.interface.ts +25 -0
- package/src/electron-file-host.ts +758 -0
- package/src/electron-sqlite-host.ts +301 -0
- package/src/host.ts +64 -0
- package/src/index.ts +71 -0
- package/src/node-sqlite-engine.ts +631 -0
- package/src/pglite/RxDBAdapterElectronPGlite.ts +152 -0
- package/src/pglite/desktop-pglite-client.ts +614 -0
- package/src/pglite/desktop-pglite-results.ts +24 -0
- package/src/pglite/electron-pglite-backup-error.ts +128 -0
- package/src/pglite/pglite-adapter.interface.ts +78 -0
- package/src/pglite/restore-electron-pglite-database.ts +429 -0
- package/src/pglite-host/electron-pglite-host.ts +829 -0
- package/src/pglite-host/pglite-host-data-dir.ts +224 -0
- package/src/pglite-host/pglite-host-lock.ts +154 -0
- package/src/pglite-host/pglite-host-restore.ts +460 -0
- package/src/pglite-host/pglite-host-runtime.ts +166 -0
- package/src/pglite-host.ts +50 -0
- package/src/pglite.ts +51 -0
- package/src/sqlite-script.ts +134 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Electron PGlite 适配器(renderer 侧)。
|
|
3
|
+
*
|
|
4
|
+
* @module pglite/RxDBAdapterElectronPGlite
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { RxDB, RxDBBackupOptions, RxDBBackupResult } from '@aiao/rxdb';
|
|
8
|
+
import { RxDBAdapterPGlite, type IPGliteClient } from '@aiao/rxdb-adapter-pglite';
|
|
9
|
+
import {
|
|
10
|
+
assertDesktopPgliteResponse,
|
|
11
|
+
assertValidDesktopDatabaseName,
|
|
12
|
+
parseDesktopPgliteEngineResult,
|
|
13
|
+
resolveDesktopHostTransport,
|
|
14
|
+
type DesktopHostTransport
|
|
15
|
+
} from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
|
|
16
|
+
import { DesktopPGliteClient } from './desktop-pglite-client.js';
|
|
17
|
+
import { toElectronPGliteBackupError } from './electron-pglite-backup-error.js';
|
|
18
|
+
import { ADAPTER_NAME, resolveDataDirectoryName, type ElectronPGliteOptions } from './pglite-adapter.interface.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 把 RxDB 接到 Electron 主进程持有的那个唯一 PGlite 实例上。
|
|
22
|
+
*
|
|
23
|
+
* @remarks
|
|
24
|
+
* 数据落在主进程的应用数据目录里,renderer 只通过一条窄传输层发 `pg.*` 请求,
|
|
25
|
+
* 因此它既拿不到 OPFS 句柄,也拿不到物理路径(AC#5)。
|
|
26
|
+
*
|
|
27
|
+
* 适配器本身没有自己的查询实现:SQL 生成、迁移、变更管线、加密全部复用
|
|
28
|
+
* {@link RxDBAdapterPGlite},只把 {@link RxDBAdapterPGlite.createClient} 这一个接缝
|
|
29
|
+
* 换成了 {@link DesktopPGliteClient}。这是刻意的——桌面与浏览器共用一份行为,
|
|
30
|
+
* 分叉出去的每一行都会变成「只在 Electron 下复现」的 bug。
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* rxdb.registerAdapter(new RxDBAdapterElectronPGlite(rxdb));
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export class RxDBAdapterElectronPGlite extends RxDBAdapterPGlite {
|
|
38
|
+
readonly #dataDirectoryName: string;
|
|
39
|
+
readonly #options: ElectronPGliteOptions;
|
|
40
|
+
override name: string = ADAPTER_NAME;
|
|
41
|
+
|
|
42
|
+
/** 解析出的逻辑数据目录名,与 host 侧的物理目录一一对应。 */
|
|
43
|
+
get dataDirectoryName(): string {
|
|
44
|
+
return this.#dataDirectoryName;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @param rxdb - 绑定的 RxDB 实例
|
|
49
|
+
* @param options - 传输层、逻辑数据目录名与两个超时窗口
|
|
50
|
+
* @throws {@link RxDBAdapterDesktopError} 逻辑数据目录名越出应用作用域时抛 `invalid_database_name`
|
|
51
|
+
*/
|
|
52
|
+
constructor(rxdb: RxDB, options: ElectronPGliteOptions = {}) {
|
|
53
|
+
// 落盘位置归主进程,renderer 一侧的 PGlite 选项全部为空——把 dbName 之外的东西
|
|
54
|
+
// 传下去只会让 `RxDBAdapterPGlite` 以为自己还管着存储。
|
|
55
|
+
super(rxdb, {});
|
|
56
|
+
this.#options = options;
|
|
57
|
+
this.#dataDirectoryName = resolveDataDirectoryName(rxdb.config.dbName, options);
|
|
58
|
+
// 在构造期就校验:名字非法时根本没有能打开的目录,等发出 IPC 才报错只会让原因离现场更远。
|
|
59
|
+
assertValidDesktopDatabaseName(this.#dataDirectoryName);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 把 host 上的整个数据目录写成一份可恢复的归档(US-217)。
|
|
64
|
+
*
|
|
65
|
+
* @remarks
|
|
66
|
+
* 快照由 host 取:它在本会话那条唯一的连接上挂起一个空事务并 `CHECKPOINT`,写出期间别的窗口、
|
|
67
|
+
* 别的会话都改不动文件,归档因此对应一个已提交事务边界,快照边界前 WAL 里已提交的数据也都
|
|
68
|
+
* 已落进数据文件。数据块按 renderer 的读取节奏逐块过 IPC,host 不预读,内存占用与库大小无关。
|
|
69
|
+
*
|
|
70
|
+
* 与浏览器端的差异:
|
|
71
|
+
* - 等连接空闲的上限是构造参数里的 `beginTimeout`,不是 `options.lockTimeoutMs`(后者只管本
|
|
72
|
+
* adapter 内部队列的排队)。另一个窗口长期占着事务时报 `lock_timeout`。
|
|
73
|
+
* - manifest 的元数据(引擎版本、系统表版本)在快照开始之前读取,这两次读取与普通语句一样排在
|
|
74
|
+
* 别的窗口的事务后面。
|
|
75
|
+
* - 主进程创建 host 时没有传 `backup` 选项(未接入 US-217)时报 `unsupported_combination`,
|
|
76
|
+
* 此时不获取输出流的 writer,也不 abort 它。
|
|
77
|
+
*
|
|
78
|
+
* 任何失败都归一成 {@link RxDBBackupError}:桌面错误码按
|
|
79
|
+
* {@link toElectronPGliteBackupError} 的映射表转换,host 不可达等其余失败报 `io_error`,
|
|
80
|
+
* 原始错误留在 `cause` 上。
|
|
81
|
+
*
|
|
82
|
+
* @param sink - 输出流;成功时被 close,快照开始后的失败会 abort 它
|
|
83
|
+
* @param options - 取消信号与排队时限
|
|
84
|
+
* @returns 结束标记(条目数、字节数、SHA-256)、manifest 与范围;输出流 close 已完成
|
|
85
|
+
* @throws RxDBBackupError `unsupported_combination` / `lock_timeout` / `aborted` / `invalid_state` /
|
|
86
|
+
* `io_error` / `storage_full`
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```typescript
|
|
90
|
+
* // sink 由宿主应用提供:沙箱里的 renderer 没有 node:fs,常见做法是 preload 暴露一条
|
|
91
|
+
* // 只能写进应用备份目录的 WritableStream
|
|
92
|
+
* const result = await adapter.backup(sink);
|
|
93
|
+
* console.log(result.sha256);
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
override async backup(sink: WritableStream<Uint8Array>, options: RxDBBackupOptions = {}): Promise<RxDBBackupResult> {
|
|
97
|
+
try {
|
|
98
|
+
return await super.backup(sink, options);
|
|
99
|
+
} catch (error) {
|
|
100
|
+
throw toElectronPGliteBackupError(error, this.#dataDirectoryName, 'backup');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* 建出转发到主进程的客户端。
|
|
106
|
+
*
|
|
107
|
+
* @returns 尚未 `init()` 的桌面客户端;基类随后用 `rxdb.config.dbName` 初始化它
|
|
108
|
+
*/
|
|
109
|
+
protected override createClient(): IPGliteClient {
|
|
110
|
+
return new DesktopPGliteClient({
|
|
111
|
+
transport: this.#transport(),
|
|
112
|
+
dataDirectoryName: this.#dataDirectoryName,
|
|
113
|
+
...(this.#options.beginTimeout === undefined ? {} : { beginTimeout: this.#options.beginTimeout }),
|
|
114
|
+
...(this.#options.batchTimeout === undefined ? {} : { batchTimeout: this.#options.batchTimeout })
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* 备份 manifest 记录的存储后端:host 上的一棵数据目录。
|
|
120
|
+
*
|
|
121
|
+
* @returns 固定为 `directory`
|
|
122
|
+
*/
|
|
123
|
+
protected override backupStorage(): string {
|
|
124
|
+
return 'directory';
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 备份 manifest 记录的扩展名:host 运行时实际加载的那一组(已去重、排序)。
|
|
129
|
+
*
|
|
130
|
+
* @remarks
|
|
131
|
+
* renderer 侧的 PGlite 选项全部为空,只有 host 知道每个实例装了哪些扩展;恢复时目标 host 必须
|
|
132
|
+
* 全部提供。host 未启用备份时 `pg.engine` 报 `unsupported_operation`,于是在排队、取 writer 之前
|
|
133
|
+
* 就拒绝。
|
|
134
|
+
*
|
|
135
|
+
* @returns 扩展名
|
|
136
|
+
*/
|
|
137
|
+
protected override async backupExtensions(): Promise<readonly string[]> {
|
|
138
|
+
const response = assertDesktopPgliteResponse('pg.engine', await this.#transport().request({ kind: 'pg.engine' }));
|
|
139
|
+
return parseDesktopPgliteEngineResult(response.result).extensions;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** 构造参数里的传输层,缺省时取 preload 暴露的那条。 */
|
|
143
|
+
#transport(): DesktopHostTransport {
|
|
144
|
+
return this.#options.transport ?? resolveDesktopHostTransport();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
declare module '@aiao/rxdb' {
|
|
149
|
+
interface RxDBAdapters {
|
|
150
|
+
[ADAPTER_NAME]: RxDBAdapterElectronPGlite;
|
|
151
|
+
}
|
|
152
|
+
}
|