@aiao/rxdb-adapter-electron 0.0.0-stage → 0.0.26

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.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +293 -2
  3. package/dist/RxDBAdapterElectron.d.ts +35 -0
  4. package/dist/RxDBAdapterElectron.d.ts.map +1 -0
  5. package/dist/electron-adapter.interface.d.ts +23 -0
  6. package/dist/electron-adapter.interface.d.ts.map +1 -0
  7. package/dist/electron-file-host.d.ts +52 -0
  8. package/dist/electron-file-host.d.ts.map +1 -0
  9. package/dist/electron-sqlite-host.d.ts +65 -0
  10. package/dist/electron-sqlite-host.d.ts.map +1 -0
  11. package/dist/host.d.ts +19 -0
  12. package/dist/host.d.ts.map +1 -0
  13. package/dist/host.js +762 -0
  14. package/dist/index.d.ts +22 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +22 -0
  17. package/dist/node-sqlite-engine.d.ts +87 -0
  18. package/dist/node-sqlite-engine.d.ts.map +1 -0
  19. package/dist/pglite/RxDBAdapterElectronPGlite.d.ts +44 -0
  20. package/dist/pglite/RxDBAdapterElectronPGlite.d.ts.map +1 -0
  21. package/dist/pglite/desktop-pglite-client.d.ts +118 -0
  22. package/dist/pglite/desktop-pglite-client.d.ts.map +1 -0
  23. package/dist/pglite/pglite-adapter.interface.d.ts +56 -0
  24. package/dist/pglite/pglite-adapter.interface.d.ts.map +1 -0
  25. package/dist/pglite-host/electron-pglite-host.d.ts +114 -0
  26. package/dist/pglite-host/electron-pglite-host.d.ts.map +1 -0
  27. package/dist/pglite-host.d.ts +17 -0
  28. package/dist/pglite-host.d.ts.map +1 -0
  29. package/dist/pglite-host.js +215 -0
  30. package/dist/pglite.d.ts +20 -0
  31. package/dist/pglite.d.ts.map +1 -0
  32. package/dist/pglite.js +217 -0
  33. package/dist/sqlite-script.d.ts +26 -0
  34. package/dist/sqlite-script.d.ts.map +1 -0
  35. package/package.json +91 -3
  36. package/src/RxDBAdapterElectron.ts +66 -0
  37. package/src/electron-adapter.interface.ts +25 -0
  38. package/src/electron-file-host.ts +758 -0
  39. package/src/electron-sqlite-host.ts +298 -0
  40. package/src/host.ts +63 -0
  41. package/src/index.ts +70 -0
  42. package/src/node-sqlite-engine.ts +612 -0
  43. package/src/pglite/RxDBAdapterElectronPGlite.ts +77 -0
  44. package/src/pglite/desktop-pglite-client.ts +520 -0
  45. package/src/pglite/pglite-adapter.interface.ts +64 -0
  46. package/src/pglite-host/electron-pglite-host.ts +580 -0
  47. package/src/pglite-host.ts +43 -0
  48. package/src/pglite.ts +42 -0
  49. package/src/sqlite-script.ts +134 -0
@@ -0,0 +1,22 @@
1
+ /**
2
+ * `@aiao/rxdb-adapter-electron` 的 **renderer 侧**入口。
3
+ *
4
+ * @remarks
5
+ * 本入口只含跨传输层说话所需的东西,**不引用 `node:sqlite`**,因此可以安全地打进
6
+ * 浏览器上下文的 renderer bundle。特权侧(Electron 主进程或它拥有的 worker)请改用
7
+ * `@aiao/rxdb-adapter-electron/host`。
8
+ *
9
+ * 协议、renderer client、存储联合与错误类型的**实现**已下沉到
10
+ * `@aiao/rxdb-adapter-sqlite-core/desktop-host`(US-207 E1),两个桌面运行时共用一份。
11
+ * 本入口原样转出它们:下游按名字 import,实现搬到哪个包不该让用户改行。
12
+ *
13
+ * @module @aiao/rxdb-adapter-electron
14
+ */
15
+ export { ADAPTER_NAME as ELECTRON_ADAPTER_NAME } from './electron-adapter.interface.js';
16
+ export { RxDBAdapterElectron } from './RxDBAdapterElectron.js';
17
+ export { DEFAULT_DATABASE_SUFFIX as DESKTOP_DEFAULT_DATABASE_SUFFIX, type DesktopOptions } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
18
+ export { RxDBAdapterDesktopError, type RxDBAdapterDesktopErrorCode } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
19
+ export { DESKTOP_HOST_TRANSPORT_KEY, DesktopSqliteClient, resolveDesktopHostTransport, type DesktopHostTransport, type DesktopSqliteClientOptions } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
20
+ export { assertDesktopSqliteStorage, assertValidDesktopDatabaseName, isDesktopPgliteDirectoryStorage, isDesktopSqliteFileStorage, type DesktopPgliteDirectoryStorage, type DesktopSqliteFileStorage, type DesktopStorage } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
21
+ export { DESKTOP_HOST_MAX_BINDINGS, DESKTOP_HOST_MAX_BLOB_BYTES, DESKTOP_HOST_MAX_FILE_CHUNK_BYTES, DESKTOP_HOST_MAX_SQL_LENGTH, DESKTOP_HOST_PROTOCOL_VERSION, assertDesktopHostResponse, parseDesktopHostChangeEvent, parseDesktopHostHandshakeResult, parseDesktopHostOpenResult, type DesktopHostChangeEventMessage, type DesktopHostCloseRequest, type DesktopHostExecuteRequest, type DesktopHostFileEntry, type DesktopHostFileLockMode, type DesktopHostFileReadResult, type DesktopHostFileRequest, type DesktopHostFileResponse, type DesktopHostFileStat, type DesktopHostHandshakeRequest, type DesktopHostHandshakeResult, type DesktopHostOpenRequest, type DesktopHostOpenResult, type DesktopHostRequest, type DesktopHostResponse, type DesktopHostVersionRequest } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,IAAI,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EACL,uBAAuB,IAAI,+BAA+B,EAC1D,KAAK,cAAc,EACpB,MAAM,6CAA6C,CAAC;AAErD,OAAO,EAAE,uBAAuB,EAAE,KAAK,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAExH,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,2BAA2B,EAC3B,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAChC,MAAM,6CAA6C,CAAC;AAErD,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,+BAA+B,EAC/B,0BAA0B,EAC1B,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACpB,MAAM,6CAA6C,CAAC;AAErD,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,iCAAiC,EACjC,2BAA2B,EAC3B,6BAA6B,EAC7B,yBAAyB,EACzB,2BAA2B,EAC3B,+BAA+B,EAC/B,0BAA0B,EAC1B,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC/B,MAAM,6CAA6C,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ import { RxDBAdapterSqliteBase as e } from "@aiao/rxdb-adapter-sqlite-core";
2
+ import { DEFAULT_DATABASE_SUFFIX as t, DEFAULT_DATABASE_SUFFIX as n, DESKTOP_HOST_MAX_BINDINGS as r, DESKTOP_HOST_MAX_BLOB_BYTES as i, DESKTOP_HOST_MAX_FILE_CHUNK_BYTES as a, DESKTOP_HOST_MAX_SQL_LENGTH as o, DESKTOP_HOST_PROTOCOL_VERSION as s, DESKTOP_HOST_TRANSPORT_KEY as c, DesktopSqliteClient as l, DesktopSqliteClient as u, RxDBAdapterDesktopError as d, assertDesktopHostResponse as f, assertDesktopSqliteStorage as p, assertValidDesktopDatabaseName as m, assertValidDesktopDatabaseName as h, isDesktopPgliteDirectoryStorage as g, isDesktopSqliteFileStorage as _, parseDesktopHostChangeEvent as v, parseDesktopHostHandshakeResult as y, parseDesktopHostOpenResult as b, resolveDesktopHostTransport as x, resolveDesktopHostTransport as S } from "@aiao/rxdb-adapter-sqlite-core/desktop-host";
3
+ //#region src/electron-adapter.interface.ts
4
+ var C = "sqlite-electron", w = class extends e {
5
+ options;
6
+ #e;
7
+ name = C;
8
+ get databaseName() {
9
+ return this.#e;
10
+ }
11
+ constructor(e, n = {}) {
12
+ super(e, n), this.options = n, this.#e = n.databaseName ?? `${e.config.dbName}${t}`, h(this.#e);
13
+ }
14
+ async createClient() {
15
+ return u.connect(this.options.transport ?? S(), {
16
+ engine: "sqlite",
17
+ databaseName: this.#e
18
+ }, { batchTimeout: this.options.batchTimeout });
19
+ }
20
+ };
21
+ //#endregion
22
+ export { n as DESKTOP_DEFAULT_DATABASE_SUFFIX, r as DESKTOP_HOST_MAX_BINDINGS, i as DESKTOP_HOST_MAX_BLOB_BYTES, a as DESKTOP_HOST_MAX_FILE_CHUNK_BYTES, o as DESKTOP_HOST_MAX_SQL_LENGTH, s as DESKTOP_HOST_PROTOCOL_VERSION, c as DESKTOP_HOST_TRANSPORT_KEY, l as DesktopSqliteClient, C as ELECTRON_ADAPTER_NAME, d as RxDBAdapterDesktopError, w as RxDBAdapterElectron, f as assertDesktopHostResponse, p as assertDesktopSqliteStorage, m as assertValidDesktopDatabaseName, g as isDesktopPgliteDirectoryStorage, _ as isDesktopSqliteFileStorage, v as parseDesktopHostChangeEvent, y as parseDesktopHostHandshakeResult, b as parseDesktopHostOpenResult, x as resolveDesktopHostTransport };
@@ -0,0 +1,87 @@
1
+ import { SqliteChangeEvent, SQLiteCompatibleType, SqliteResult } from '@aiao/rxdb-adapter-sqlite-core';
2
+ /** {@link NodeSqliteEngine.open} 的入参。 */
3
+ export interface NodeSqliteEngineOptions {
4
+ /** 数据库文件的绝对物理路径,由 host 在应用数据目录内解析得出。 */
5
+ readonly filePath: string;
6
+ /** 逻辑数据库名,仅用于变更事件的诊断字段。 */
7
+ readonly dbName: string;
8
+ /**
9
+ * 变更事件回调。
10
+ *
11
+ * @remarks
12
+ * 在产生变更的语句返回**之后**的任务里调用(批处理见 {@link NodeSqliteEngineOptions.batchTimeout}),
13
+ * 唯一的例外是 {@link NodeSqliteEngine.close} 里的收尾 flush。实现方不该抛错——
14
+ * 此刻写入早已落库,没有任何调用方还能对失败做出反应;真抛了也只会被隔离并 log,
15
+ * 既不会中断同批次的其余分组,也不会传播给写入方。
16
+ */
17
+ readonly onChange: (event: SqliteChangeEvent) => void;
18
+ /** SQLite page cache 大小(KB),默认 {@link DEFAULT_CACHE_SIZE_KB}。 */
19
+ readonly cacheSizeKb?: number;
20
+ /**
21
+ * 变更事件的防抖窗口(毫秒),默认 {@link DEFAULT_BATCH_TIMEOUT}。
22
+ *
23
+ * @remarks
24
+ * 与 wasm 后端的同名选项同义:窗口内的连续写入合并成一次派发。0 表示下一个宏任务立即派发。
25
+ */
26
+ readonly batchTimeout?: number;
27
+ }
28
+ /**
29
+ * 单个数据库连接。
30
+ *
31
+ * @remarks
32
+ * 一个会话一个连接,不共享:两个窗口若共用一条连接,它们的 `BEGIN` 块会互相穿插,
33
+ * 事务隔离直接失效。各自持有连接后,跨窗口的并发交给 SQLite 自己的文件锁与写者租约处理。
34
+ */
35
+ export declare class NodeSqliteEngine {
36
+ #private;
37
+ private constructor();
38
+ /**
39
+ * 打开(必要时创建)一个数据库文件。
40
+ *
41
+ * @remarks
42
+ * 打不开就抛错,**绝不**回退到内存库或另一个位置:用户必须能确信数据确实写进了
43
+ * 他指定的那个文件(AC#4)。初始化中途失败时会把已开的句柄关掉,不留悬挂连接。
44
+ *
45
+ * @param options - 引擎配置
46
+ * @returns 已完成初始化、已装好变更通知的引擎
47
+ * @throws {@link RxDBAdapterDesktopError} code 为 `open_failed` / `permission_denied` / `database_corrupted`
48
+ */
49
+ static open(options: NodeSqliteEngineOptions): NodeSqliteEngine;
50
+ /**
51
+ * 执行一条或一组 SQL。
52
+ *
53
+ * @remarks
54
+ * 结果形状与 `executeOo1Helper` 逐字对齐(AC#2):至多一个结果集,且只在语句真的产出列时才有;
55
+ * 只读语句的 `rowsAffected` 恒为 0,不泄漏上一条写语句遗留的计数。
56
+ *
57
+ * 多语句脚本逐条 prepare 执行(切分见 {@link splitSqliteScript}),但**不接受绑定参数**:
58
+ * 参数属于其中某一条语句,静默绑到第一条只会把数据写错位;wasm 后端同样拒绝这个组合。
59
+ *
60
+ * @param sql - 待执行的 SQL
61
+ * @param bindings - 位置绑定参数
62
+ * @returns 与 sqlite 核心一致的执行结果
63
+ * @throws {@link RxDBAdapterDesktopError} 会话已关闭、多语句带参、或 SQL 执行失败时
64
+ */
65
+ execute(sql: string, bindings?: readonly SQLiteCompatibleType[]): SqliteResult;
66
+ /**
67
+ * 报告底层 SQLite 引擎版本。
68
+ *
69
+ * @returns 形如 `3.50.4` 的版本串
70
+ */
71
+ version(): string;
72
+ /**
73
+ * 断开连接并释放文件句柄。
74
+ *
75
+ * @remarks
76
+ * 关闭前回滚尚未提交的事务并做一次 TRUNCATE checkpoint(AC#7):前者避免把半截状态留给下次启动,
77
+ * 后者把 WAL 内容并回主库文件,使调用方随后可以直接重命名/备份这个 `.sqlite3`,
78
+ * 而不必额外搬运 `-wal` / `-shm` 旁文件。
79
+ *
80
+ * 还攒在批次里的变更事件在这里**同步**发掉,与 `Oo1ClientBase.disconnect` 一致:
81
+ * 定时器随连接一起消失,不发就等于把最后一批写入的通知悄悄吞掉。
82
+ *
83
+ * 重复调用是安全的。
84
+ */
85
+ close(): void;
86
+ }
87
+ //# sourceMappingURL=node-sqlite-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-sqlite-engine.d.ts","sourceRoot":"","sources":["../src/node-sqlite-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EASL,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAEzB,KAAK,YAAY,EAClB,MAAM,gCAAgC,CAAC;AAKxC,yCAAyC;AACzC,MAAM,WAAW,uBAAuB;IACtC,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACtD,iEAAiE;IACjE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAyJD;;;;;;GAMG;AACH,qBAAa,gBAAgB;;IAe3B,OAAO;IASP;;;;;;;;;;OAUG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,GAAG,gBAAgB;IA2B/D;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,SAAS,oBAAoB,EAAO,GAAG,YAAY;IAkBlF;;;;OAIG;IACH,OAAO,IAAI,MAAM;IAMjB;;;;;;;;;;;;OAYG;IACH,KAAK,IAAI,IAAI;CAuRd"}
@@ -0,0 +1,44 @@
1
+ import { RxDB } from '@aiao/rxdb';
2
+ import { RxDBAdapterPGlite, IPGliteClient } from '@aiao/rxdb-adapter-pglite';
3
+ import { ADAPTER_NAME, ElectronPGliteOptions } from './pglite-adapter.interface.js';
4
+ /**
5
+ * 把 RxDB 接到 Electron 主进程持有的那个唯一 PGlite 实例上。
6
+ *
7
+ * @remarks
8
+ * 数据落在主进程的应用数据目录里,renderer 只通过一条窄传输层发 `pg.*` 请求,
9
+ * 因此它既拿不到 OPFS 句柄,也拿不到物理路径(AC#5)。
10
+ *
11
+ * 适配器本身没有自己的查询实现:SQL 生成、迁移、变更管线、加密全部复用
12
+ * {@link RxDBAdapterPGlite},只把 {@link RxDBAdapterPGlite.createClient} 这一个接缝
13
+ * 换成了 {@link DesktopPGliteClient}。这是刻意的——桌面与浏览器共用一份行为,
14
+ * 分叉出去的每一行都会变成「只在 Electron 下复现」的 bug。
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * rxdb.registerAdapter(new RxDBAdapterElectronPGlite(rxdb));
19
+ * ```
20
+ */
21
+ export declare class RxDBAdapterElectronPGlite extends RxDBAdapterPGlite {
22
+ #private;
23
+ name: string;
24
+ /** 解析出的逻辑数据目录名,与 host 侧的物理目录一一对应。 */
25
+ get dataDirectoryName(): string;
26
+ /**
27
+ * @param rxdb - 绑定的 RxDB 实例
28
+ * @param options - 传输层、逻辑数据目录名与两个超时窗口
29
+ * @throws {@link RxDBAdapterDesktopError} 逻辑数据目录名越出应用作用域时抛 `invalid_database_name`
30
+ */
31
+ constructor(rxdb: RxDB, options?: ElectronPGliteOptions);
32
+ /**
33
+ * 建出转发到主进程的客户端。
34
+ *
35
+ * @returns 尚未 `init()` 的桌面客户端;基类随后用 `rxdb.config.dbName` 初始化它
36
+ */
37
+ protected createClient(): IPGliteClient;
38
+ }
39
+ declare module '@aiao/rxdb' {
40
+ interface RxDBAdapters {
41
+ [ADAPTER_NAME]: RxDBAdapterElectronPGlite;
42
+ }
43
+ }
44
+ //# sourceMappingURL=RxDBAdapterElectronPGlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RxDBAdapterElectronPGlite.d.ts","sourceRoot":"","sources":["../../src/pglite/RxDBAdapterElectronPGlite.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAMlF,OAAO,EAAE,YAAY,EAAiC,KAAK,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAExH;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,yBAA0B,SAAQ,iBAAiB;;IAGrD,IAAI,EAAE,MAAM,CAAgB;IAErC,qCAAqC;IACrC,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED;;;;OAIG;gBACS,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,qBAA0B;IAU3D;;;;OAIG;cACgB,YAAY,IAAI,aAAa;CAQjD;AAED,OAAO,QAAQ,YAAY,CAAC;IAC1B,UAAU,YAAY;QACpB,CAAC,YAAY,CAAC,EAAE,yBAAyB,CAAC;KAC3C;CACF"}
@@ -0,0 +1,118 @@
1
+ import { IPGliteClient, PGliteClientEvents, PGliteClientOptions } from '@aiao/rxdb-adapter-pglite';
2
+ import { DesktopHostTransport } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
3
+ import { EventDispatcher } from '@aiao/utils';
4
+ import { QueryOptions, Results, Transaction } from '@electric-sql/pglite';
5
+ /** {@link DesktopPGliteClient} 的构造参数。 */
6
+ export interface DesktopPGliteClientOptions {
7
+ /** preload 或 worker 桥接提供的传输层。 */
8
+ readonly transport: DesktopHostTransport;
9
+ /** 应用作用域内的逻辑数据目录名;host 在自己的应用数据目录里解析它。 */
10
+ readonly dataDirectoryName: string;
11
+ /** `pg.begin` 的等待上限(毫秒);省略时由 host 用协议默认值。 */
12
+ readonly beginTimeout?: number;
13
+ /** NOTIFY 批量窗口(毫秒);省略时用 {@link DEFAULT_NOTIFY_BATCH_TIMEOUT_MS}。 */
14
+ readonly batchTimeout?: number;
15
+ }
16
+ /**
17
+ * 通过桌面 host 访问主进程 PGlite 实例的客户端。
18
+ *
19
+ * @remarks
20
+ * 两条串行化链各管一件事:
21
+ * - {@link DesktopPGliteClient.#tail} 是**会话内 FIFO**,保证发出顺序即执行顺序;
22
+ * - {@link DesktopPGliteClient.#lock} 是**本地互斥**,让事务独占整段时间。
23
+ *
24
+ * 后者不是可有可无的谨慎:主进程只有一条 PGlite 连接,一条事务开着时它被挂起的
25
+ * callback 攥着。没有本地互斥的话,第二条事务的 `pg.begin`(或一条自动提交语句)会排在
26
+ * 会话队列里等那条连接,而连接又要等第一条事务把剩下的语句发完——双方互相等,
27
+ * 表现为几秒后一句 `transaction_unavailable`,看上去像 host 有 bug。浏览器路径上
28
+ * PGlite 自己的 mutex 做的正是同一件事,这里只是把它挪到了进程边界的这一侧。
29
+ *
30
+ * @public
31
+ */
32
+ export declare class DesktopPGliteClient extends EventDispatcher<PGliteClientEvents> implements IPGliteClient {
33
+ #private;
34
+ /** 本客户端在 host 上的会话 ID,用于把推送过来的 NOTIFY 对号入座。 */
35
+ get sessionId(): string;
36
+ /** host 解析出的逻辑位置,仅供诊断(AC#5)。 */
37
+ get resolvedLocation(): string;
38
+ /** 尚未分发的 NOTIFY 行事件数量。 */
39
+ get pendingNotificationCount(): number;
40
+ constructor(options: DesktopPGliteClientOptions);
41
+ /**
42
+ * 握手、打开会话并订阅变更推送。
43
+ *
44
+ * @remarks
45
+ * 握手排在 `pg.open` 之前是 AC#11 的全部内容:`pg.open` 会 `mkdir` 出数据目录并在里面
46
+ * 跑 initdb,等 renderer 从 open 应答里读出版本不匹配时,磁盘上已经多了一整棵目录树,
47
+ * 而调用方拿不到 client,也就没有把手去收拾它。
48
+ *
49
+ * @param dbName - RxDB 逻辑库名;只用于变更事件的 `dbName` 字段,不参与落盘位置解析
50
+ * @param options - PGlite 选项;**不得**含 `store` 或 `dataDir`
51
+ * @throws {@link RxDBAdapterDesktopError} 指定了落盘位置、协议版本不匹配或 host 打不开数据目录时
52
+ */
53
+ init(dbName: string, options: PGliteClientOptions): Promise<void>;
54
+ /**
55
+ * 执行一条带参数的语句(扩展查询协议)。
56
+ *
57
+ * @param query - SQL
58
+ * @param params - 位置参数
59
+ * @param options - **必须省略**,见 {@link assertNoQueryOptions}
60
+ * @returns 与浏览器路径同形状的结果
61
+ * @throws {@link RxDBAdapterDesktopError} 会话已关闭、传了 `options`,或 host 报告执行失败时
62
+ */
63
+ query<T>(query: string, params?: unknown[], options?: QueryOptions): Promise<Results<T>>;
64
+ /**
65
+ * 以标签模板执行一条语句,参数自动参数化。
66
+ *
67
+ * @param sqlStrings - 模板字面量片段
68
+ * @param params - 插值;`identifier` / `raw` / 嵌套 `sql` 辅助器按原语义处理
69
+ * @returns 与浏览器路径同形状的结果
70
+ * @throws {@link RxDBAdapterDesktopError} 会话已关闭,或 host 报告执行失败时
71
+ */
72
+ sql<T>(sqlStrings: TemplateStringsArray, ...params: unknown[]): Promise<Results<T>>;
73
+ /**
74
+ * 执行一段多语句脚本(简单查询协议)。
75
+ *
76
+ * @param query - 一条或多条以 `;` 分隔的语句
77
+ * @param options - **必须省略**,见 {@link assertNoQueryOptions}
78
+ * @returns 每条语句一个结果
79
+ * @throws {@link RxDBAdapterDesktopError} 会话已关闭、传了 `options`,或 host 报告执行失败时
80
+ */
81
+ exec(query: string, options?: QueryOptions): Promise<Results[]>;
82
+ /**
83
+ * 在主进程那条唯一连接上开一条真事务。
84
+ *
85
+ * @remarks
86
+ * 回调拿到的 `tx` 是个代理:它的每条语句都带着 host 签发的事务 ID 过去,因此确实落在
87
+ * 同一条 PostgreSQL 事务里,而不是被包装成「看起来像事务」的独立请求(AC#2)。
88
+ * 回调正常返回即 `pg.commit`,抛出即 `pg.rollback`——与 PGlite 自己的语义一致。
89
+ *
90
+ * @param callback - 事务体
91
+ * @returns 回调的返回值
92
+ * @throws 回调抛出的原始异常(事务已回滚),或 {@link RxDBAdapterDesktopError}
93
+ */
94
+ transaction<T>(callback: (tx: Transaction) => Promise<T>): Promise<T>;
95
+ /**
96
+ * 报告 host 侧 PostgreSQL 的版本串。
97
+ *
98
+ * @returns 形如 `PostgreSQL 17.x ...` 的版本串
99
+ */
100
+ version(): Promise<string>;
101
+ /**
102
+ * 断开会话。
103
+ *
104
+ * @remarks
105
+ * 等在途请求与开着的事务跑完再关,因此调用方返回时 host 上确实已经没有本会话的
106
+ * 任何残留。并发调用共享同一个关闭流程。
107
+ */
108
+ disconnect(): Promise<void>;
109
+ /**
110
+ * 不等在途请求,直接让 host 释放本会话。
111
+ *
112
+ * @remarks
113
+ * host 收到 `pg.close` 会把本会话仍开着的事务全部回滚,因此「不等」丢掉的只是那些
114
+ * 未提交的写——这正是 `forceClose` 与 {@link DesktopPGliteClient.disconnect} 的区别。
115
+ */
116
+ forceClose(): Promise<void>;
117
+ }
118
+ //# sourceMappingURL=desktop-pglite-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-pglite-client.d.ts","sourceRoot":"","sources":["../../src/pglite/desktop-pglite-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAML,KAAK,oBAAoB,EAI1B,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAM/E,yCAAyC;AACzC,MAAM,WAAW,0BAA0B;IACzC,iCAAiC;IACjC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,0CAA0C;IAC1C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAuED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,mBAAoB,SAAQ,eAAe,CAAC,kBAAkB,CAAE,YAAW,aAAa;;IAcnG,+CAA+C;IAC/C,IAAI,SAAS,IAAI,MAAM,CAKtB;IAED,gCAAgC;IAChC,IAAI,gBAAgB,IAAI,MAAM,CAK7B;IAED,0BAA0B;IAC1B,IAAI,wBAAwB,IAAI,MAAM,CAErC;gBAEW,OAAO,EAAE,0BAA0B;IAW/C;;;;;;;;;;;OAWG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BvE;;;;;;;;OAQG;IACG,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAM9F;;;;;;;OAOG;IACG,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAMzF;;;;;;;OAOG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAMrE;;;;;;;;;;;OAWG;IACG,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAK3E;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAShC;;;;;;OAMG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC;;;;;;OAMG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CA0MlC"}
@@ -0,0 +1,56 @@
1
+ import { DesktopHostTransport } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
2
+ /**
3
+ * 适配器在 `RxDBAdapters` 注册表中的名字。
4
+ *
5
+ * @remarks
6
+ * 与 `sqlite-electron` 并列,同一个 Electron 运行时上两个适配器可以同时注册
7
+ * (US-207 已为此把 SQLite 侧的名字从 `electron` 改成了 `sqlite-electron`)。
8
+ *
9
+ * 这里**刻意不写** `satisfies DesktopHostAdapterName`:那份登记表是「走 SQLite host
10
+ * 协议的适配器」的清单,PGlite 走的是另一族协议(`pg.*`)。硬套上去会让共享层的
11
+ * 存储联合把 `pglite-electron` 也当成能接受 `DesktopSqliteFileStorage` 的适配器。
12
+ */
13
+ export declare const ADAPTER_NAME: "pglite-electron";
14
+ /**
15
+ * 逻辑数据目录名的默认后缀。
16
+ *
17
+ * @remarks
18
+ * 与 SQLite 侧的 `DEFAULT_DATABASE_SUFFIX` 同构,但后缀不同:PGlite 落盘的是一棵
19
+ * initdb 生成的**目录树**而不是单个文件,用 `.db` 之类的文件后缀命名只会误导运维。
20
+ */
21
+ export declare const DEFAULT_DATA_DIRECTORY_SUFFIX = "-pgdata";
22
+ /** {@link RxDBAdapterElectronPGlite} 的构造选项。 */
23
+ export interface ElectronPGliteOptions {
24
+ /**
25
+ * 传输层;省略时从 `globalThis` 上读取 preload 注入的那一份。
26
+ *
27
+ * @remarks
28
+ * 显式传入主要供测试与非 Electron 宿主使用,见
29
+ * {@link @aiao/rxdb-adapter-sqlite-core/desktop-host#resolveDesktopHostTransport}。
30
+ */
31
+ readonly transport?: DesktopHostTransport;
32
+ /**
33
+ * 应用作用域内的逻辑数据目录名;省略时为 `<dbName>-pgdata`。
34
+ *
35
+ * @remarks
36
+ * 只能是名字,不能是路径:物理根目录由主进程决定,renderer 既拿不到也不需要
37
+ * (AC#5)。含路径分隔符时在构造期就抛 `invalid_database_name`。
38
+ */
39
+ readonly dataDirectoryName?: string;
40
+ /**
41
+ * `pg.begin` 等待主进程那条唯一连接的上限(毫秒)。
42
+ *
43
+ * @remarks
44
+ * 省略时用协议默认值 `DESKTOP_PGLITE_DEFAULT_BEGIN_TIMEOUT_MS`。它约束的是**跨窗口**
45
+ * 的竞争:同一个客户端内部的事务由本地互斥串行化,根本不会互相超时。
46
+ */
47
+ readonly beginTimeout?: number;
48
+ /**
49
+ * NOTIFY 批量窗口(毫秒);省略时用 `DEFAULT_NOTIFY_BATCH_TIMEOUT_MS`。
50
+ *
51
+ * @remarks
52
+ * 与浏览器路径同义、同实现——批量发生在渲染进程,主进程只转发裸 NOTIFY。
53
+ */
54
+ readonly batchTimeout?: number;
55
+ }
56
+ //# sourceMappingURL=pglite-adapter.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pglite-adapter.interface.d.ts","sourceRoot":"","sources":["../../src/pglite/pglite-adapter.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AAExF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAG,iBAA0B,CAAC;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,YAAY,CAAC;AAEvD,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAC;IAC1C;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC"}
@@ -0,0 +1,114 @@
1
+ import { DesktopPgliteNotifyMessage, DesktopPgliteResponse } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
2
+ /**
3
+ * host 代 renderer 订阅的 NOTIFY 频道。
4
+ *
5
+ * @remarks
6
+ * 与 `@aiao/rxdb-adapter-pglite` 里 `PGliteClient` 监听的三张系统表一一对应。
7
+ * PostgreSQL 只把 `LISTEN` 过的频道推给连接,因此这份清单漏一项就等于对应的响应式
8
+ * 查询在桌面下永远不刷新——而浏览器下一切正常,排查时几乎不会怀疑到订阅清单上。
9
+ */
10
+ export declare const DESKTOP_PGLITE_WATCH_CHANNELS: readonly string[];
11
+ /** 一条语句的结果;`ElectronPgliteRuntime` 与 PGlite 的 `Results` 在此结构相容。 */
12
+ export interface ElectronPgliteRuntimeResult {
13
+ readonly rows: Record<string, unknown>[];
14
+ readonly fields: {
15
+ name: string;
16
+ dataTypeID: number;
17
+ }[];
18
+ readonly affectedRows?: number;
19
+ }
20
+ /** 事务句柄;对应 PGlite 的 `Transaction`,只声明 host 真正用到的两个操作。 */
21
+ export interface ElectronPgliteTransaction {
22
+ query(sql: string, params?: unknown[]): Promise<ElectronPgliteRuntimeResult>;
23
+ exec(sql: string): Promise<ElectronPgliteRuntimeResult[]>;
24
+ }
25
+ /**
26
+ * host 需要的 PGlite 能力子集。
27
+ *
28
+ * @remarks
29
+ * 刻意不写成 `PGliteInterface`:宿主应用极可能传进来的不是裸 `PGlite`,而是跑在 worker
30
+ * 里的 `PGliteWorker`——PGlite 的 WASM 在主进程 JS 线程上是**同步**执行的,一条重查询会
31
+ * 把整个窗口的 IPC 一起卡住(故事「冻结带来的三条实现约束」第 3 条)。声明成结构类型后,
32
+ * 两者都能直接传入,而这份清单也顺便说清了 host 只需要这五个操作。
33
+ */
34
+ export interface ElectronPgliteRuntime {
35
+ query(sql: string, params?: unknown[]): Promise<ElectronPgliteRuntimeResult>;
36
+ exec(sql: string): Promise<ElectronPgliteRuntimeResult[]>;
37
+ transaction<T>(callback: (tx: ElectronPgliteTransaction) => Promise<T>): Promise<T>;
38
+ listen(channel: string, callback: (payload: string) => void): Promise<unknown>;
39
+ close(): Promise<void>;
40
+ }
41
+ /** {@link createElectronPgliteHost} 的入参。 */
42
+ export interface ElectronPgliteHostOptions {
43
+ /**
44
+ * 按逻辑数据目录名创建一个 PGlite 运行时。
45
+ *
46
+ * @remarks
47
+ * **必填,没有默认实现**:默认值只能是「在某处建一个 PGlite」,而那个「某处」只有宿主
48
+ * 应用知道(Electron 下通常在 `app.getPath('userData')` 之下)。给一个兜底目录意味着
49
+ * 数据会静默落在谁也没打算用的位置,而症状是「重启后数据没了」。
50
+ *
51
+ * 传进来的名字已过白名单校验,不含任何路径分隔符,因此 `join(root, name)` 不会越出 `root`。
52
+ * 同一个名字在 host 生命周期内只会被调用一次(AC#7)。
53
+ */
54
+ readonly createRuntime: (dataDirectoryName: string) => Promise<ElectronPgliteRuntime>;
55
+ /** 把裸 NOTIFY 送达对应会话的 renderer,例如 `webContents.send`。 */
56
+ readonly postNotify: (message: DesktopPgliteNotifyMessage) => void;
57
+ /**
58
+ * NOTIFY 送达失败时的上报口。
59
+ *
60
+ * @remarks
61
+ * 与 SQLite host 同理:窗口在通知投递途中被销毁是常规竞态,此时写入早已落库,
62
+ * 把送达失败当成写失败回给调用方只会诱发一次重复写入。不传则丢弃。
63
+ */
64
+ readonly onDeliveryError?: (error: unknown) => void;
65
+ }
66
+ /** 桌面 PGlite host 实例。 */
67
+ export interface ElectronPgliteHost {
68
+ /**
69
+ * 处理一条来自 renderer 的请求。
70
+ *
71
+ * @remarks
72
+ * **永不 reject**:失败以 `kind: 'error'` 的应答返回,理由与 SQLite host 一致
73
+ * (`ipcRenderer.invoke` 在 reject 时会把错误压平成字符串,错误码随之丢失)。
74
+ *
75
+ * @param request - 未经校验的请求负载
76
+ * @param ownerId - 发起方的 `webContents.id`;会话与事务都按它归属
77
+ * @returns 协议应答
78
+ */
79
+ handle(request: unknown, ownerId: number): Promise<DesktopPgliteResponse>;
80
+ /** 当前打开的会话数。 */
81
+ readonly openSessionCount: number;
82
+ /** 当前活着的 PGlite 实例数;同一个数据目录上的多个会话只算一个。 */
83
+ readonly openInstanceCount: number;
84
+ /** 当前挂起的事务数;正常静止时应为 0。 */
85
+ readonly openTransactionCount: number;
86
+ /**
87
+ * 回收某个窗口名下的全部会话与事务。
88
+ *
89
+ * @remarks
90
+ * 这是本方案的**前提而非收尾**:挂起的 callback 独占 PGlite 的连接锁,渲染进程崩在
91
+ * 事务中间而没人回收的话,之后任何查询都会永远排队——表征是「数据库不响应」,
92
+ * 与那次崩溃毫无关联线索。调用方必须把它挂到 `render-process-gone` 与 `destroyed`
93
+ * 两个事件上(AC#3)。
94
+ *
95
+ * @param ownerId - 已崩溃或已销毁的 `webContents.id`
96
+ * @returns 本次回滚掉的事务条数
97
+ */
98
+ releaseOwner(ownerId: number): Promise<number>;
99
+ /** 关闭全部会话与实例,通常在应用退出前调用。 */
100
+ closeAll(): Promise<void>;
101
+ }
102
+ /**
103
+ * 创建一个桌面 PGlite host。
104
+ *
105
+ * @remarks
106
+ * 与 SQLite host 相反,同一个数据目录上的多个会话**共享一个** PGlite 实例(AC#7):
107
+ * PGlite 是嵌入式单写者,同一份数据目录被两个实例同时打开会直接损坏它。跨窗口的并发
108
+ * 因此由这一条连接的排队来串行化,而不是交给文件锁。
109
+ *
110
+ * @param options - host 配置
111
+ * @returns host 实例
112
+ */
113
+ export declare function createElectronPgliteHost(options: ElectronPgliteHostOptions): ElectronPgliteHost;
114
+ //# sourceMappingURL=electron-pglite-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electron-pglite-host.d.ts","sourceRoot":"","sources":["../../src/pglite-host/electron-pglite-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAIL,KAAK,0BAA0B,EAG/B,KAAK,qBAAqB,EAC3B,MAAM,6CAA6C,CAAC;AAarD;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAIzD,CAAC;AAEH,mEAAmE;AACnE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,yDAAyD;AACzD,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC7E,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC;CAC3D;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC7E,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC;IAC1D,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,yBAAyB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,4CAA4C;AAC5C,MAAM,WAAW,yBAAyB;IACxC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACtF,wDAAwD;IACxD,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACnE;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrD;AAED,yBAAyB;AACzB,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;;OAUG;IACH,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC1E,gBAAgB;IAChB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,0CAA0C;IAC1C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,0BAA0B;IAC1B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,4BAA4B;IAC5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAqFD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,kBAAkB,CAoV/F"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `@aiao/rxdb-adapter-electron` 的 **PGlite 特权侧**入口。
3
+ *
4
+ * @remarks
5
+ * 与 `@aiao/rxdb-adapter-electron/host` 分开而不是并进去,理由是依赖:那个入口只要
6
+ * `node:sqlite`(Node 内建,装了就有),本入口却要 `@electric-sql/pglite` 这个可选 peer。
7
+ * 合并的话,任何一个只用 SQLite 的宿主应用都会在加载 host 时撞上「找不到
8
+ * `@electric-sql/pglite`」——而它压根没打算用 PGlite。
9
+ *
10
+ * 本入口只能在有 Node 运行时的地方加载(Electron 主进程,或它自己拥有的 worker)。
11
+ * renderer 侧请用 `@aiao/rxdb-adapter-electron/pglite`。
12
+ *
13
+ * @module @aiao/rxdb-adapter-electron/pglite-host
14
+ */
15
+ export { DESKTOP_PGLITE_WATCH_CHANNELS, createElectronPgliteHost, type ElectronPgliteHost, type ElectronPgliteHostOptions, type ElectronPgliteRuntime, type ElectronPgliteRuntimeResult, type ElectronPgliteTransaction } from './pglite-host/electron-pglite-host.js';
16
+ export { DESKTOP_PGLITE_DEFAULT_BEGIN_TIMEOUT_MS, DESKTOP_PGLITE_MAX_BEGIN_TIMEOUT_MS, DESKTOP_PGLITE_PROTOCOL_VERSION, RxDBAdapterDesktopError, assertValidDesktopDatabaseName, isDesktopPgliteRequestKind, parseDesktopPgliteRequest, type DesktopPgliteNotifyMessage, type DesktopPgliteQueryResult, type DesktopPgliteRequest, type DesktopPgliteResponse, type RxDBAdapterDesktopErrorCode } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
17
+ //# sourceMappingURL=pglite-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pglite-host.d.ts","sourceRoot":"","sources":["../src/pglite-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC/B,MAAM,uCAAuC,CAAC;AAI/C,OAAO,EACL,uCAAuC,EACvC,mCAAmC,EACnC,+BAA+B,EAC/B,uBAAuB,EAGvB,8BAA8B,EAC9B,0BAA0B,EAC1B,yBAAyB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EACjC,MAAM,6CAA6C,CAAC"}