@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.
Files changed (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +394 -2
  3. package/dist/RxDBAdapterElectron.d.ts +61 -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 +768 -0
  14. package/dist/index.d.ts +22 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +36 -0
  17. package/dist/node-sqlite-engine.d.ts +97 -0
  18. package/dist/node-sqlite-engine.d.ts.map +1 -0
  19. package/dist/pglite/RxDBAdapterElectronPGlite.d.ts +96 -0
  20. package/dist/pglite/RxDBAdapterElectronPGlite.d.ts.map +1 -0
  21. package/dist/pglite/desktop-pglite-client.d.ts +144 -0
  22. package/dist/pglite/desktop-pglite-client.d.ts.map +1 -0
  23. package/dist/pglite/desktop-pglite-results.d.ts +14 -0
  24. package/dist/pglite/desktop-pglite-results.d.ts.map +1 -0
  25. package/dist/pglite/electron-pglite-backup-error.d.ts +32 -0
  26. package/dist/pglite/electron-pglite-backup-error.d.ts.map +1 -0
  27. package/dist/pglite/pglite-adapter.interface.d.ts +68 -0
  28. package/dist/pglite/pglite-adapter.interface.d.ts.map +1 -0
  29. package/dist/pglite/restore-electron-pglite-database.d.ts +68 -0
  30. package/dist/pglite/restore-electron-pglite-database.d.ts.map +1 -0
  31. package/dist/pglite-host/electron-pglite-host.d.ts +129 -0
  32. package/dist/pglite-host/electron-pglite-host.d.ts.map +1 -0
  33. package/dist/pglite-host/pglite-host-data-dir.d.ts +75 -0
  34. package/dist/pglite-host/pglite-host-data-dir.d.ts.map +1 -0
  35. package/dist/pglite-host/pglite-host-lock.d.ts +48 -0
  36. package/dist/pglite-host/pglite-host-lock.d.ts.map +1 -0
  37. package/dist/pglite-host/pglite-host-restore.d.ts +38 -0
  38. package/dist/pglite-host/pglite-host-restore.d.ts.map +1 -0
  39. package/dist/pglite-host/pglite-host-runtime.d.ts +90 -0
  40. package/dist/pglite-host/pglite-host-runtime.d.ts.map +1 -0
  41. package/dist/pglite-host.d.ts +17 -0
  42. package/dist/pglite-host.d.ts.map +1 -0
  43. package/dist/pglite-host.js +738 -0
  44. package/dist/pglite.d.ts +22 -0
  45. package/dist/pglite.d.ts.map +1 -0
  46. package/dist/pglite.js +493 -0
  47. package/dist/sqlite-script.d.ts +26 -0
  48. package/dist/sqlite-script.d.ts.map +1 -0
  49. package/package.json +94 -3
  50. package/src/RxDBAdapterElectron.ts +105 -0
  51. package/src/electron-adapter.interface.ts +25 -0
  52. package/src/electron-file-host.ts +758 -0
  53. package/src/electron-sqlite-host.ts +301 -0
  54. package/src/host.ts +64 -0
  55. package/src/index.ts +71 -0
  56. package/src/node-sqlite-engine.ts +631 -0
  57. package/src/pglite/RxDBAdapterElectronPGlite.ts +152 -0
  58. package/src/pglite/desktop-pglite-client.ts +614 -0
  59. package/src/pglite/desktop-pglite-results.ts +24 -0
  60. package/src/pglite/electron-pglite-backup-error.ts +128 -0
  61. package/src/pglite/pglite-adapter.interface.ts +78 -0
  62. package/src/pglite/restore-electron-pglite-database.ts +429 -0
  63. package/src/pglite-host/electron-pglite-host.ts +829 -0
  64. package/src/pglite-host/pglite-host-data-dir.ts +224 -0
  65. package/src/pglite-host/pglite-host-lock.ts +154 -0
  66. package/src/pglite-host/pglite-host-restore.ts +460 -0
  67. package/src/pglite-host/pglite-host-runtime.ts +166 -0
  68. package/src/pglite-host.ts +50 -0
  69. package/src/pglite.ts +51 -0
  70. package/src/sqlite-script.ts +134 -0
@@ -0,0 +1,301 @@
1
+ /**
2
+ * 桌面 SQLite host:把 renderer 送来的协议请求派发到本地 `node:sqlite` 连接。
3
+ *
4
+ * @remarks
5
+ * 本模块运行在**特权侧**(Electron 主进程或它拥有的 worker),是唯一接触文件系统的地方。
6
+ * 所有入参先过 {@link parseDesktopHostRequest} 的信任边界,再落到引擎。
7
+ *
8
+ * @module desktop-sqlite-host
9
+ */
10
+
11
+ import type { SqliteChangeEvent } from '@aiao/rxdb-adapter-sqlite-core';
12
+ import {
13
+ DESKTOP_HOST_PROTOCOL_VERSION,
14
+ RxDBAdapterDesktopError,
15
+ parseDesktopHostRequest,
16
+ type DesktopHostChangeEventMessage,
17
+ type DesktopHostRequest,
18
+ type DesktopHostResponse
19
+ } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
20
+ import { randomUUID } from 'node:crypto';
21
+ import { NodeSqliteEngine } from './node-sqlite-engine.js';
22
+ import { splitSqliteScript } from './sqlite-script.js';
23
+
24
+ /**
25
+ * 逻辑位置的 scheme。
26
+ *
27
+ * @remarks
28
+ * `open` 回给 renderer 的 `resolvedLocation` 用它拼装,只表达「应用作用域内的某个库」,
29
+ * 不含物理根目录(AC#3)。
30
+ */
31
+ const LOGICAL_LOCATION_SCHEME = 'desktop-sqlite://app-scope';
32
+
33
+ /**
34
+ * 普通事务的起始 SQL。
35
+ *
36
+ * @remarks
37
+ * 用 `IMMEDIATE` 而非 `Oo1ClientBase` 的裸 `BEGIN`:同一个文件上有多个窗口的连接,
38
+ * 而 `BEGIN` 是延迟取锁的——写锁要等到事务里第一条写语句才拿,撞锁于是发生在**事务中途**。
39
+ * 那时已经读过一份快照,SQLite 要求整个事务回滚重来,重试语义远比在起点重试复杂。
40
+ * `IMMEDIATE` 把取锁挪到起点,撞锁时事务根本还没开,重试就是无副作用地再发一次
41
+ * (见 {@link createElectronSqliteHost} 的 busy 重试)。
42
+ * wa-sqlite 的多连接模式出于同样的理由用 `BEGIN IMMEDIATE`。
43
+ */
44
+ const BEGIN_TRANSACTION_SQL = 'BEGIN IMMEDIATE;';
45
+
46
+ /** 系统 schema 迁移使用的最强锁,与 `Oo1ClientBase` 保持一致。 */
47
+ const BEGIN_SYSTEM_MIGRATION_TRANSACTION_SQL = 'BEGIN EXCLUSIVE;';
48
+
49
+ /**
50
+ * 撞锁后放弃前的总等待时长(毫秒)。
51
+ *
52
+ * @remarks
53
+ * 要盖住「另一个窗口正在跑一次系统 schema 迁移」这段最长的持锁时间——迁移在
54
+ * `BEGIN EXCLUSIVE` 里完成,实测秒级,5 秒留了一个量级的余量。再长就不像是对方在正常干活,
55
+ * 此时把 `database_busy` 报给调用方,比继续无声等待更有用。
56
+ */
57
+ const DEFAULT_BUSY_RETRY_BUDGET_MS = 5_000;
58
+
59
+ /** 首次重试前的等待(毫秒)。取小值是因为绝大多数锁冲突在一两个事件循环周期内就消失。 */
60
+ const BUSY_RETRY_INITIAL_DELAY_MS = 1;
61
+
62
+ /** 退避的上限(毫秒),避免长时间持锁时把重试拉成几秒一次。 */
63
+ const BUSY_RETRY_MAX_DELAY_MS = 100;
64
+
65
+ const delay = (ms: number): Promise<void> =>
66
+ new Promise(resolve => {
67
+ setTimeout(resolve, ms);
68
+ });
69
+
70
+ /** {@link createElectronSqliteHost} 的入参。 */
71
+ export interface ElectronSqliteHostOptions {
72
+ /**
73
+ * 把逻辑数据库名解析成物理绝对路径。
74
+ *
75
+ * @remarks
76
+ * 由宿主应用提供,因为只有它知道自己的数据目录(Electron 下通常是
77
+ * `app.getPath('userData')`)。传进来的名字已经过白名单校验,不含任何路径分隔符,
78
+ * 因此 `join(root, databaseName)` 不可能越出 `root`。
79
+ */
80
+ readonly resolveDatabasePath: (databaseName: string) => string;
81
+ /** 把变更事件送达对应会话的 renderer,例如 `webContents.send`。 */
82
+ readonly postChange: (message: DesktopHostChangeEventMessage) => void;
83
+ /**
84
+ * 变更事件送达失败时的上报口。
85
+ *
86
+ * @remarks
87
+ * 窗口在写入途中被销毁是常规竞态,此时写入已经落库;若把送达失败当成写失败回给调用方,
88
+ * 它会重试一次已经成功的写入,产生重复数据。所以送达是 best-effort,失败只上报不影响写结果。
89
+ * 不传则丢弃——但那意味着这类竞态在日志里完全无痕,建议显式接上。
90
+ */
91
+ readonly onDeliveryError?: (error: unknown) => void;
92
+ /** SQLite page cache 大小(KB)。 */
93
+ readonly cacheSizeKb?: number;
94
+ /**
95
+ * 开事务时撞上另一个连接的锁后,重试多久才放弃(毫秒),默认
96
+ * {@link DEFAULT_BUSY_RETRY_BUDGET_MS}。
97
+ *
98
+ * @remarks
99
+ * 主要留给测试收窄等待;生产上调它意味着你对「对方最长持锁多久」有更准的判断。
100
+ */
101
+ readonly busyRetryBudgetMs?: number;
102
+ }
103
+
104
+ /** 桌面 SQLite host 实例。 */
105
+ export interface ElectronSqliteHost {
106
+ /**
107
+ * 处理一条来自 renderer 的请求。
108
+ *
109
+ * @remarks
110
+ * **永不 reject**:失败以 `kind: 'error'` 的应答返回。Electron 的 `ipcRenderer.invoke`
111
+ * 在 reject 时会把错误压平成字符串,自定义错误码随之丢失。
112
+ *
113
+ * @param request - 未经校验的请求负载
114
+ * @returns 协议应答
115
+ */
116
+ handle(request: unknown): Promise<DesktopHostResponse>;
117
+ /** 当前打开的会话数,用于诊断与关停检查。 */
118
+ readonly openSessionCount: number;
119
+ /** 关闭全部会话,通常在应用退出前调用。 */
120
+ closeAll(): void;
121
+ }
122
+
123
+ /**
124
+ * 判断一次失败是否值得重试。
125
+ *
126
+ * @remarks
127
+ * 只认「脚本的**第一条**语句是开事务」这一种形状。适配器发的是
128
+ * `BEGIN IMMEDIATE;` 加一条 `PRAGMA`,而 PRAGMA 不取锁——因此这类脚本报 busy 只可能来自
129
+ * 打头的 BEGIN,此时事务根本没开起来,整段重发是无副作用的。其余形状一律不重试:
130
+ * 事务中途撞锁意味着这个事务的快照已经作废,只有调用方知道该怎么重来。
131
+ */
132
+ const isRetriableBusy = (error: unknown, sql: string): boolean => {
133
+ if (!(error instanceof RxDBAdapterDesktopError) || error.code !== 'database_busy') return false;
134
+ const [first] = splitSqliteScript(sql);
135
+ return first === BEGIN_TRANSACTION_SQL || first === BEGIN_SYSTEM_MIGRATION_TRANSACTION_SQL;
136
+ };
137
+
138
+ const toErrorResponse = (error: unknown): DesktopHostResponse => {
139
+ if (error instanceof RxDBAdapterDesktopError) {
140
+ return { kind: 'error', code: error.code, message: error.detail };
141
+ }
142
+ return {
143
+ kind: 'error',
144
+ code: 'host_internal_error',
145
+ message: error instanceof Error ? error.message : String(error)
146
+ };
147
+ };
148
+
149
+ /**
150
+ * 创建一个桌面 SQLite host。
151
+ *
152
+ * @remarks
153
+ * 每个 `open` 请求得到**独立的** `DatabaseSync` 连接,而不是共享一条:
154
+ * 多个窗口共用连接时它们的 `BEGIN` 块会互相穿插,事务隔离直接失效。
155
+ * 各持连接后,跨窗口并发交由 SQLite 自己的文件锁处理(AC#5)。
156
+ *
157
+ * @param options - host 配置
158
+ * @returns host 实例
159
+ */
160
+ export function createElectronSqliteHost(options: ElectronSqliteHostOptions): ElectronSqliteHost {
161
+ const sessions = new Map<string, NodeSqliteEngine>();
162
+
163
+ const deliver = (sessionId: string, event: SqliteChangeEvent): void => {
164
+ try {
165
+ options.postChange({ kind: 'change', sessionId, event });
166
+ } catch (error) {
167
+ options.onDeliveryError?.(error);
168
+ }
169
+ };
170
+
171
+ const requireSession = (sessionId: string): NodeSqliteEngine => {
172
+ const engine = sessions.get(sessionId);
173
+ if (!engine) {
174
+ throw new RxDBAdapterDesktopError('session_closed', `session ${sessionId} is not open on this host`);
175
+ }
176
+ return engine;
177
+ };
178
+
179
+ const resolvePath = (databaseName: string): string => {
180
+ try {
181
+ return options.resolveDatabasePath(databaseName);
182
+ } catch (error) {
183
+ throw new RxDBAdapterDesktopError('open_failed', `the application could not resolve a path for ${databaseName}`, {
184
+ cause: error
185
+ });
186
+ }
187
+ };
188
+
189
+ const open = (request: Extract<DesktopHostRequest, { kind: 'open' }>): DesktopHostResponse => {
190
+ const { databaseName } = request.storage;
191
+ const sessionId = randomUUID();
192
+ const engine = NodeSqliteEngine.open({
193
+ filePath: resolvePath(databaseName),
194
+ dbName: databaseName,
195
+ onChange: event => deliver(sessionId, event),
196
+ cacheSizeKb: options.cacheSizeKb,
197
+ batchTimeout: request.batchTimeout
198
+ });
199
+ sessions.set(sessionId, engine);
200
+ return {
201
+ kind: 'open',
202
+ result: {
203
+ sessionId,
204
+ resolvedLocation: `${LOGICAL_LOCATION_SCHEME}/${databaseName}`,
205
+ protocolVersion: DESKTOP_HOST_PROTOCOL_VERSION,
206
+ beginTransactionSql: BEGIN_TRANSACTION_SQL,
207
+ beginSystemMigrationTransactionSql: BEGIN_SYSTEM_MIGRATION_TRANSACTION_SQL
208
+ }
209
+ };
210
+ };
211
+
212
+ const close = (sessionId: string): DesktopHostResponse => {
213
+ const engine = requireSession(sessionId);
214
+ sessions.delete(sessionId);
215
+ engine.close();
216
+ return { kind: 'close' };
217
+ };
218
+
219
+ /**
220
+ * 执行一条语句;开事务的那两条在撞锁时退避重试。
221
+ *
222
+ * @remarks
223
+ * 只重试 {@link BEGIN_TRANSACTION_SQL} 与 {@link BEGIN_SYSTEM_MIGRATION_TRANSACTION_SQL}:
224
+ * 这两条要么拿到锁、要么什么都没做,重发一次没有副作用。事务内部的语句撞锁则不同——
225
+ * 那意味着这个事务的快照已经不能再用,只有调用方知道该怎么重来,host 替它决定只会掩盖问题。
226
+ *
227
+ * 等待走 `setTimeout` 而不是 `PRAGMA busy_timeout`:所有窗口的连接共享主进程这一条线程,
228
+ * 同步自旋会把持锁方的 `COMMIT` 续体一起卡死(见 `NodeSqliteEngine` 的 `#initialize`)。
229
+ */
230
+ const execute = async (request: Extract<DesktopHostRequest, { kind: 'execute' }>): Promise<DesktopHostResponse> => {
231
+ const engine = requireSession(request.sessionId);
232
+ let deadline: number | undefined;
233
+ let wait = BUSY_RETRY_INITIAL_DELAY_MS;
234
+ for (;;) {
235
+ try {
236
+ return { kind: 'execute', result: engine.execute(request.sql, request.bindings) };
237
+ } catch (error) {
238
+ if (!isRetriableBusy(error, request.sql)) throw error;
239
+ deadline ??= performance.now() + (options.busyRetryBudgetMs ?? DEFAULT_BUSY_RETRY_BUDGET_MS);
240
+ if (performance.now() + wait > deadline) throw error;
241
+ await delay(wait);
242
+ wait = Math.min(wait * 2, BUSY_RETRY_MAX_DELAY_MS);
243
+ }
244
+ }
245
+ };
246
+
247
+ /**
248
+ * 按种类派发一条已通过协议校验的请求。
249
+ *
250
+ * @remarks
251
+ * 穷尽 `switch` 而不是「若干 `if` + 落空走 `execute`」:后者把「未知种类」这件事
252
+ * 交给了调用约定去保证(今天成立,因为 {@link parseDesktopHostRequest} 先跑)。
253
+ * 一旦协议加了新种类而这里忘记补分支,落空写法会把它当 `execute` 跑,
254
+ * 读一个不存在的 `request.sql` —— 变成运行期的怪异失败而不是编译期的红。
255
+ * `_exhaustive: never` 让这种遗漏在 `tsc` 阶段就挡住。
256
+ */
257
+ const dispatch = (request: DesktopHostRequest): DesktopHostResponse | Promise<DesktopHostResponse> => {
258
+ switch (request.kind) {
259
+ // 握手排在最前,且不碰会话表、不碰 `resolveDatabasePath`:它的全部意义就是让 renderer
260
+ // 在 `open` 建库之前把版本对上,一旦这里有了任何副作用,那半条 AC 就不成立了。
261
+ case 'handshake':
262
+ return { kind: 'handshake', result: { protocolVersion: DESKTOP_HOST_PROTOCOL_VERSION } };
263
+ case 'open':
264
+ return open(request);
265
+ case 'close':
266
+ return close(request.sessionId);
267
+ case 'version':
268
+ return { kind: 'version', result: requireSession(request.sessionId).version() };
269
+ case 'mute':
270
+ requireSession(request.sessionId).setChangeEventsMuted(request.muted);
271
+ return { kind: 'mute' };
272
+ case 'execute':
273
+ return execute(request);
274
+ default: {
275
+ const _exhaustive: never = request;
276
+ // 走到这里说明校验层放进了一个本模块不认识的种类,按协议违规回给调用方。
277
+ throw new RxDBAdapterDesktopError(
278
+ 'protocol_violation',
279
+ `unsupported request kind: ${String((_exhaustive as { kind?: unknown }).kind)}`
280
+ );
281
+ }
282
+ }
283
+ };
284
+
285
+ return {
286
+ handle: async (request: unknown): Promise<DesktopHostResponse> => {
287
+ try {
288
+ return await dispatch(parseDesktopHostRequest(request));
289
+ } catch (error) {
290
+ return toErrorResponse(error);
291
+ }
292
+ },
293
+ get openSessionCount(): number {
294
+ return sessions.size;
295
+ },
296
+ closeAll: (): void => {
297
+ for (const engine of sessions.values()) engine.close();
298
+ sessions.clear();
299
+ }
300
+ };
301
+ }
package/src/host.ts ADDED
@@ -0,0 +1,64 @@
1
+ /**
2
+ * `@aiao/rxdb-adapter-electron` 的**特权侧**入口。
3
+ *
4
+ * @remarks
5
+ * 本入口引用 `node:sqlite`,只能在有 Node 运行时的地方加载——Electron 主进程,
6
+ * 或它自己拥有的 `worker_threads` worker。**不要**把它打进 renderer bundle:
7
+ * 那等于把文件系统能力还给了渲染进程,AC#3 的隔离随之作废。
8
+ *
9
+ * renderer 侧请用 `@aiao/rxdb-adapter-electron`。
10
+ *
11
+ * @module @aiao/rxdb-adapter-electron/host
12
+ */
13
+
14
+ export {
15
+ createElectronSqliteHost,
16
+ type ElectronSqliteHost,
17
+ type ElectronSqliteHostOptions
18
+ } from './electron-sqlite-host.js';
19
+
20
+ export { createElectronFileHost, type ElectronFileHost, type ElectronFileHostOptions } from './electron-file-host.js';
21
+
22
+ export { NodeSqliteEngine, type NodeSqliteEngineOptions } from './node-sqlite-engine.js';
23
+
24
+ // 协议、存储联合与错误类型已下沉到 `@aiao/rxdb-adapter-sqlite-core/desktop-host`(US-207 E1)。
25
+ // 本入口继续原样转出它们:宿主作者只装一个包就该拿全写 host 需要的东西,
26
+ // 让他们再去引一个共享层包等于把拆包的成本转嫁出去。
27
+ export { RxDBAdapterDesktopError, type RxDBAdapterDesktopErrorCode } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
28
+
29
+ export {
30
+ assertDesktopSqliteStorage,
31
+ assertValidDesktopDatabaseName,
32
+ isDesktopPgliteDirectoryStorage,
33
+ isDesktopSqliteFileStorage,
34
+ type DesktopPgliteDirectoryStorage,
35
+ type DesktopSqliteFileStorage,
36
+ type DesktopStorage
37
+ } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
38
+
39
+ export {
40
+ DESKTOP_HOST_MAX_BINDINGS,
41
+ DESKTOP_HOST_MAX_BLOB_BYTES,
42
+ DESKTOP_HOST_MAX_FILE_CHUNK_BYTES,
43
+ DESKTOP_HOST_MAX_SQL_LENGTH,
44
+ DESKTOP_HOST_PROTOCOL_VERSION,
45
+ isDesktopHostFileRequestKind,
46
+ parseDesktopHostFileRequest,
47
+ parseDesktopHostRequest,
48
+ type DesktopHostChangeEventMessage,
49
+ type DesktopHostCloseRequest,
50
+ type DesktopHostExecuteRequest,
51
+ type DesktopHostFileEntry,
52
+ type DesktopHostFileReadResult,
53
+ type DesktopHostFileRequest,
54
+ type DesktopHostFileResponse,
55
+ type DesktopHostFileStat,
56
+ type DesktopHostHandshakeRequest,
57
+ type DesktopHostHandshakeResult,
58
+ type DesktopHostMuteRequest,
59
+ type DesktopHostOpenRequest,
60
+ type DesktopHostOpenResult,
61
+ type DesktopHostRequest,
62
+ type DesktopHostResponse,
63
+ type DesktopHostVersionRequest
64
+ } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
package/src/index.ts ADDED
@@ -0,0 +1,71 @@
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
+
16
+ export { ADAPTER_NAME as ELECTRON_ADAPTER_NAME } from './electron-adapter.interface.js';
17
+ export { RxDBAdapterElectron } from './RxDBAdapterElectron.js';
18
+
19
+ export {
20
+ DEFAULT_DATABASE_SUFFIX as DESKTOP_DEFAULT_DATABASE_SUFFIX,
21
+ type DesktopOptions
22
+ } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
23
+
24
+ export { RxDBAdapterDesktopError, type RxDBAdapterDesktopErrorCode } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
25
+
26
+ export {
27
+ DESKTOP_HOST_TRANSPORT_KEY,
28
+ DesktopSqliteClient,
29
+ resolveDesktopHostTransport,
30
+ type DesktopHostTransport,
31
+ type DesktopSqliteClientOptions
32
+ } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
33
+
34
+ export {
35
+ assertDesktopSqliteStorage,
36
+ assertValidDesktopDatabaseName,
37
+ isDesktopPgliteDirectoryStorage,
38
+ isDesktopSqliteFileStorage,
39
+ type DesktopPgliteDirectoryStorage,
40
+ type DesktopSqliteFileStorage,
41
+ type DesktopStorage
42
+ } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';
43
+
44
+ export {
45
+ DESKTOP_HOST_MAX_BINDINGS,
46
+ DESKTOP_HOST_MAX_BLOB_BYTES,
47
+ DESKTOP_HOST_MAX_FILE_CHUNK_BYTES,
48
+ DESKTOP_HOST_MAX_SQL_LENGTH,
49
+ DESKTOP_HOST_PROTOCOL_VERSION,
50
+ assertDesktopHostResponse,
51
+ parseDesktopHostChangeEvent,
52
+ parseDesktopHostHandshakeResult,
53
+ parseDesktopHostOpenResult,
54
+ type DesktopHostChangeEventMessage,
55
+ type DesktopHostCloseRequest,
56
+ type DesktopHostExecuteRequest,
57
+ type DesktopHostFileEntry,
58
+ type DesktopHostFileLockMode,
59
+ type DesktopHostFileReadResult,
60
+ type DesktopHostFileRequest,
61
+ type DesktopHostFileResponse,
62
+ type DesktopHostFileStat,
63
+ type DesktopHostHandshakeRequest,
64
+ type DesktopHostHandshakeResult,
65
+ type DesktopHostMuteRequest,
66
+ type DesktopHostOpenRequest,
67
+ type DesktopHostOpenResult,
68
+ type DesktopHostRequest,
69
+ type DesktopHostResponse,
70
+ type DesktopHostVersionRequest
71
+ } from '@aiao/rxdb-adapter-sqlite-core/desktop-host';