@syncular/dialect-electron-sqlite 0.0.1
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/index.d.ts +142 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +380 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
- package/src/index.test.ts +424 -0
- package/src/index.ts +626 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/dialect-electron-sqlite - Electron IPC SQLite dialect for sync
|
|
3
|
+
*
|
|
4
|
+
* Provides a Kysely SQLite dialect for Electron renderer processes that
|
|
5
|
+
* execute SQL through an IPC bridge exposed by preload.
|
|
6
|
+
*
|
|
7
|
+
* This keeps database access in the Electron main process while preserving a
|
|
8
|
+
* standard Kysely API in renderer code.
|
|
9
|
+
*/
|
|
10
|
+
import { SerializePlugin } from '@syncular/core';
|
|
11
|
+
import type { DatabaseIntrospector, Dialect, DialectAdapter, Driver, QueryCompiler } from 'kysely';
|
|
12
|
+
import { Kysely } from 'kysely';
|
|
13
|
+
export type ElectronSqliteInteger = bigint | number | string;
|
|
14
|
+
export interface ElectronSqliteExecuteRequest {
|
|
15
|
+
sql: string;
|
|
16
|
+
parameters: readonly unknown[];
|
|
17
|
+
}
|
|
18
|
+
export interface ElectronSqliteExecuteResponse<Row = Record<string, unknown>> {
|
|
19
|
+
rows: Row[];
|
|
20
|
+
numAffectedRows?: ElectronSqliteInteger;
|
|
21
|
+
insertId?: ElectronSqliteInteger | null;
|
|
22
|
+
}
|
|
23
|
+
export type ElectronSqliteOpenResult = undefined | {
|
|
24
|
+
open?: boolean;
|
|
25
|
+
path?: string;
|
|
26
|
+
version?: string | null;
|
|
27
|
+
[key: string]: boolean | number | string | null | undefined;
|
|
28
|
+
};
|
|
29
|
+
export interface ElectronSqliteBridge {
|
|
30
|
+
open?(): Promise<ElectronSqliteOpenResult> | ElectronSqliteOpenResult;
|
|
31
|
+
execute<Row = Record<string, unknown>>(request: ElectronSqliteExecuteRequest): Promise<ElectronSqliteExecuteResponse<Row>> | ElectronSqliteExecuteResponse<Row>;
|
|
32
|
+
close?(): Promise<void> | void;
|
|
33
|
+
}
|
|
34
|
+
export type ElectronSqliteOptions = ElectronSqliteBridge;
|
|
35
|
+
export interface ElectronSqliteWindowLike {
|
|
36
|
+
electronAPI?: Record<string, ElectronSqliteBridge | undefined>;
|
|
37
|
+
}
|
|
38
|
+
export interface ElectronSqliteWindowOptions {
|
|
39
|
+
bridgeKey?: string;
|
|
40
|
+
window?: ElectronSqliteWindowLike;
|
|
41
|
+
}
|
|
42
|
+
export interface ElectronIpcRendererLike {
|
|
43
|
+
invoke<TResult>(channel: string, ...args: readonly unknown[]): Promise<TResult>;
|
|
44
|
+
}
|
|
45
|
+
export interface ElectronSqliteBridgeFromIpcOptions {
|
|
46
|
+
ipcRenderer: ElectronIpcRendererLike;
|
|
47
|
+
executeChannel?: string;
|
|
48
|
+
openChannel?: string;
|
|
49
|
+
closeChannel?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface ElectronSqliteBridgeFromDialectOptions {
|
|
52
|
+
dialect: Dialect;
|
|
53
|
+
openResult?: Exclude<ElectronSqliteOpenResult, undefined>;
|
|
54
|
+
}
|
|
55
|
+
export type ElectronIpcMainEventLike = object;
|
|
56
|
+
export interface ElectronIpcMainLike {
|
|
57
|
+
handle<TArgs extends readonly unknown[], TResult>(channel: string, listener: (event: ElectronIpcMainEventLike, ...args: TArgs) => TResult | Promise<TResult>): void;
|
|
58
|
+
}
|
|
59
|
+
export interface ElectronAppLike {
|
|
60
|
+
on(event: 'will-quit', listener: () => void): void;
|
|
61
|
+
}
|
|
62
|
+
export interface ElectronSqliteIpcChannels {
|
|
63
|
+
open: string;
|
|
64
|
+
execute: string;
|
|
65
|
+
close: string;
|
|
66
|
+
}
|
|
67
|
+
export interface RegisterElectronSqliteIpcOptions {
|
|
68
|
+
ipcMain: ElectronIpcMainLike;
|
|
69
|
+
bridge: ElectronSqliteBridge;
|
|
70
|
+
channels?: Partial<ElectronSqliteIpcChannels>;
|
|
71
|
+
autoOpen?: boolean;
|
|
72
|
+
app?: ElectronAppLike;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create a Kysely instance with Electron IPC SQLite dialect and SerializePlugin.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* const db = createElectronSqliteDb<MyDb>({
|
|
79
|
+
* open: () => window.electronAPI.sqlite.open(),
|
|
80
|
+
* execute: (request) => window.electronAPI.sqlite.execute(request),
|
|
81
|
+
* close: () => window.electronAPI.sqlite.close(),
|
|
82
|
+
* });
|
|
83
|
+
*/
|
|
84
|
+
export declare function createElectronSqliteDb<T>(options: ElectronSqliteOptions): Kysely<T>;
|
|
85
|
+
/**
|
|
86
|
+
* Create the Electron IPC SQLite dialect directly (without SerializePlugin).
|
|
87
|
+
*/
|
|
88
|
+
export declare function createElectronSqliteDialect(options: ElectronSqliteOptions): ElectronSqliteDialect;
|
|
89
|
+
/**
|
|
90
|
+
* Create a Kysely instance using `window.electronAPI[bridgeKey]`.
|
|
91
|
+
*
|
|
92
|
+
* `bridgeKey` defaults to `sqlite`.
|
|
93
|
+
*/
|
|
94
|
+
export declare function createElectronSqliteDbFromWindow<T>(options?: ElectronSqliteWindowOptions): Kysely<T>;
|
|
95
|
+
/**
|
|
96
|
+
* Create the Electron dialect using `window.electronAPI[bridgeKey]`.
|
|
97
|
+
*
|
|
98
|
+
* `bridgeKey` defaults to `sqlite`.
|
|
99
|
+
*/
|
|
100
|
+
export declare function createElectronSqliteDialectFromWindow(options?: ElectronSqliteWindowOptions): ElectronSqliteDialect;
|
|
101
|
+
/**
|
|
102
|
+
* Build an Electron SQLite bridge from `ipcRenderer.invoke(...)`.
|
|
103
|
+
*
|
|
104
|
+
* `executeChannel` defaults to `sqlite:execute`.
|
|
105
|
+
*/
|
|
106
|
+
export declare function createElectronSqliteBridgeFromIpc(options: ElectronSqliteBridgeFromIpcOptions): ElectronSqliteBridge;
|
|
107
|
+
/**
|
|
108
|
+
* Build an Electron SQLite bridge from a Kysely dialect in main process.
|
|
109
|
+
*
|
|
110
|
+
* This allows renderer IPC queries to reuse existing SQLite dialects such as:
|
|
111
|
+
* - `@syncular/dialect-better-sqlite3`
|
|
112
|
+
* - `@syncular/dialect-sqlite3`
|
|
113
|
+
* - `@syncular/dialect-libsql`
|
|
114
|
+
*
|
|
115
|
+
* The bridge keeps a single acquired connection for its lifetime so
|
|
116
|
+
* transaction statements (`BEGIN` / `COMMIT` / `ROLLBACK`) stay on the same
|
|
117
|
+
* connection.
|
|
118
|
+
*/
|
|
119
|
+
export declare function createElectronSqliteBridgeFromDialect(options: ElectronSqliteBridgeFromDialectOptions): ElectronSqliteBridge;
|
|
120
|
+
/**
|
|
121
|
+
* Register standard Electron IPC handlers for a SQLite bridge.
|
|
122
|
+
*
|
|
123
|
+
* This helper enables a pluggable main-process backend: any adapter that
|
|
124
|
+
* implements `open/execute/close` can be exposed to renderer code through one
|
|
125
|
+
* channel contract.
|
|
126
|
+
*/
|
|
127
|
+
export declare function registerElectronSqliteIpc(options: RegisterElectronSqliteIpcOptions): ElectronSqliteIpcChannels;
|
|
128
|
+
export declare function createSerializePlugin(): SerializePlugin;
|
|
129
|
+
declare class ElectronSqliteDialect implements Dialect {
|
|
130
|
+
#private;
|
|
131
|
+
constructor(options: ElectronSqliteOptions);
|
|
132
|
+
createAdapter(): DialectAdapter;
|
|
133
|
+
createDriver(): Driver;
|
|
134
|
+
createQueryCompiler(): QueryCompiler;
|
|
135
|
+
createIntrospector(db: Kysely<unknown>): DatabaseIntrospector;
|
|
136
|
+
}
|
|
137
|
+
declare global {
|
|
138
|
+
interface Window extends ElectronSqliteWindowLike {
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export {};
|
|
142
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/dialect-electron-sqlite - Electron IPC SQLite dialect for sync
|
|
3
|
+
*
|
|
4
|
+
* Provides a Kysely SQLite dialect for Electron renderer processes that
|
|
5
|
+
* execute SQL through an IPC bridge exposed by preload.
|
|
6
|
+
*
|
|
7
|
+
* This keeps database access in the Electron main process while preserving a
|
|
8
|
+
* standard Kysely API in renderer code.
|
|
9
|
+
*/
|
|
10
|
+
import { SerializePlugin } from '@syncular/core';
|
|
11
|
+
import { CompiledQuery, Kysely, SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler, } from 'kysely';
|
|
12
|
+
const DEFAULT_WINDOW_BRIDGE_KEY = 'sqlite';
|
|
13
|
+
const DEFAULT_ELECTRON_SQLITE_CHANNELS = {
|
|
14
|
+
open: 'sqlite:open',
|
|
15
|
+
execute: 'sqlite:execute',
|
|
16
|
+
close: 'sqlite:close',
|
|
17
|
+
};
|
|
18
|
+
const INTEGER_PATTERN = /^-?\d+$/;
|
|
19
|
+
/**
|
|
20
|
+
* Create a Kysely instance with Electron IPC SQLite dialect and SerializePlugin.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* const db = createElectronSqliteDb<MyDb>({
|
|
24
|
+
* open: () => window.electronAPI.sqlite.open(),
|
|
25
|
+
* execute: (request) => window.electronAPI.sqlite.execute(request),
|
|
26
|
+
* close: () => window.electronAPI.sqlite.close(),
|
|
27
|
+
* });
|
|
28
|
+
*/
|
|
29
|
+
export function createElectronSqliteDb(options) {
|
|
30
|
+
return new Kysely({
|
|
31
|
+
dialect: createElectronSqliteDialect(options),
|
|
32
|
+
plugins: [new SerializePlugin()],
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create the Electron IPC SQLite dialect directly (without SerializePlugin).
|
|
37
|
+
*/
|
|
38
|
+
export function createElectronSqliteDialect(options) {
|
|
39
|
+
return new ElectronSqliteDialect(options);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create a Kysely instance using `window.electronAPI[bridgeKey]`.
|
|
43
|
+
*
|
|
44
|
+
* `bridgeKey` defaults to `sqlite`.
|
|
45
|
+
*/
|
|
46
|
+
export function createElectronSqliteDbFromWindow(options = {}) {
|
|
47
|
+
return createElectronSqliteDb(resolveWindowBridge(options));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create the Electron dialect using `window.electronAPI[bridgeKey]`.
|
|
51
|
+
*
|
|
52
|
+
* `bridgeKey` defaults to `sqlite`.
|
|
53
|
+
*/
|
|
54
|
+
export function createElectronSqliteDialectFromWindow(options = {}) {
|
|
55
|
+
return createElectronSqliteDialect(resolveWindowBridge(options));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Build an Electron SQLite bridge from `ipcRenderer.invoke(...)`.
|
|
59
|
+
*
|
|
60
|
+
* `executeChannel` defaults to `sqlite:execute`.
|
|
61
|
+
*/
|
|
62
|
+
export function createElectronSqliteBridgeFromIpc(options) {
|
|
63
|
+
const { ipcRenderer, executeChannel = DEFAULT_ELECTRON_SQLITE_CHANNELS.execute, openChannel, closeChannel, } = options;
|
|
64
|
+
const bridge = {
|
|
65
|
+
execute: (request) => ipcRenderer.invoke(executeChannel, request),
|
|
66
|
+
};
|
|
67
|
+
if (openChannel) {
|
|
68
|
+
bridge.open = () => ipcRenderer.invoke(openChannel);
|
|
69
|
+
}
|
|
70
|
+
if (closeChannel) {
|
|
71
|
+
bridge.close = async () => {
|
|
72
|
+
await ipcRenderer.invoke(closeChannel);
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return bridge;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Build an Electron SQLite bridge from a Kysely dialect in main process.
|
|
79
|
+
*
|
|
80
|
+
* This allows renderer IPC queries to reuse existing SQLite dialects such as:
|
|
81
|
+
* - `@syncular/dialect-better-sqlite3`
|
|
82
|
+
* - `@syncular/dialect-sqlite3`
|
|
83
|
+
* - `@syncular/dialect-libsql`
|
|
84
|
+
*
|
|
85
|
+
* The bridge keeps a single acquired connection for its lifetime so
|
|
86
|
+
* transaction statements (`BEGIN` / `COMMIT` / `ROLLBACK`) stay on the same
|
|
87
|
+
* connection.
|
|
88
|
+
*/
|
|
89
|
+
export function createElectronSqliteBridgeFromDialect(options) {
|
|
90
|
+
return new DialectBackedElectronSqliteBridge(options);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Register standard Electron IPC handlers for a SQLite bridge.
|
|
94
|
+
*
|
|
95
|
+
* This helper enables a pluggable main-process backend: any adapter that
|
|
96
|
+
* implements `open/execute/close` can be exposed to renderer code through one
|
|
97
|
+
* channel contract.
|
|
98
|
+
*/
|
|
99
|
+
export function registerElectronSqliteIpc(options) {
|
|
100
|
+
const channels = {
|
|
101
|
+
...DEFAULT_ELECTRON_SQLITE_CHANNELS,
|
|
102
|
+
...options.channels,
|
|
103
|
+
};
|
|
104
|
+
const autoOpen = options.autoOpen ?? true;
|
|
105
|
+
let isOpen = false;
|
|
106
|
+
const open = async () => {
|
|
107
|
+
if (isOpen) {
|
|
108
|
+
return { open: true };
|
|
109
|
+
}
|
|
110
|
+
if (!options.bridge.open) {
|
|
111
|
+
isOpen = true;
|
|
112
|
+
return { open: true };
|
|
113
|
+
}
|
|
114
|
+
const result = await options.bridge.open();
|
|
115
|
+
isOpen = true;
|
|
116
|
+
return result;
|
|
117
|
+
};
|
|
118
|
+
options.ipcMain.handle(channels.open, async () => open());
|
|
119
|
+
options.ipcMain.handle(channels.execute, async (_event, request) => {
|
|
120
|
+
if (autoOpen && !isOpen) {
|
|
121
|
+
await open();
|
|
122
|
+
}
|
|
123
|
+
return options.bridge.execute(request);
|
|
124
|
+
});
|
|
125
|
+
options.ipcMain.handle(channels.close, async () => {
|
|
126
|
+
if (options.bridge.close) {
|
|
127
|
+
await options.bridge.close();
|
|
128
|
+
}
|
|
129
|
+
isOpen = false;
|
|
130
|
+
return true;
|
|
131
|
+
});
|
|
132
|
+
if (options.app) {
|
|
133
|
+
options.app.on('will-quit', () => {
|
|
134
|
+
if (!options.bridge.close) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
Promise.resolve(options.bridge.close()).catch(() => undefined);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return channels;
|
|
141
|
+
}
|
|
142
|
+
export function createSerializePlugin() {
|
|
143
|
+
return new SerializePlugin();
|
|
144
|
+
}
|
|
145
|
+
class DialectBackedElectronSqliteBridge {
|
|
146
|
+
#dialect;
|
|
147
|
+
#openResult;
|
|
148
|
+
#mutex = new ConnectionMutex();
|
|
149
|
+
#driver;
|
|
150
|
+
#connection;
|
|
151
|
+
#opened = false;
|
|
152
|
+
constructor(options) {
|
|
153
|
+
this.#dialect = options.dialect;
|
|
154
|
+
this.#openResult = options.openResult ?? { open: true };
|
|
155
|
+
}
|
|
156
|
+
async open() {
|
|
157
|
+
await this.#mutex.lock();
|
|
158
|
+
try {
|
|
159
|
+
await this.#ensureOpenLocked();
|
|
160
|
+
return this.#openResult;
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
this.#mutex.unlock();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async execute(request) {
|
|
167
|
+
await this.#mutex.lock();
|
|
168
|
+
try {
|
|
169
|
+
await this.#ensureOpenLocked();
|
|
170
|
+
const connection = this.#connection;
|
|
171
|
+
if (!connection) {
|
|
172
|
+
throw new Error('SQLite connection was not initialized');
|
|
173
|
+
}
|
|
174
|
+
const result = await connection.executeQuery(CompiledQuery.raw(request.sql, [...request.parameters]));
|
|
175
|
+
const numAffectedRows = toWireInteger(result.numAffectedRows);
|
|
176
|
+
const insertId = toWireInteger(result.insertId);
|
|
177
|
+
return {
|
|
178
|
+
rows: result.rows,
|
|
179
|
+
...(numAffectedRows === undefined ? {} : { numAffectedRows }),
|
|
180
|
+
...(insertId === undefined ? {} : { insertId }),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
this.#mutex.unlock();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async close() {
|
|
188
|
+
await this.#mutex.lock();
|
|
189
|
+
try {
|
|
190
|
+
if (!this.#opened) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const connection = this.#connection;
|
|
194
|
+
const driver = this.#driver;
|
|
195
|
+
this.#connection = undefined;
|
|
196
|
+
this.#driver = undefined;
|
|
197
|
+
this.#opened = false;
|
|
198
|
+
if (driver && connection) {
|
|
199
|
+
await driver.releaseConnection(connection);
|
|
200
|
+
}
|
|
201
|
+
if (driver) {
|
|
202
|
+
await driver.destroy();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
this.#mutex.unlock();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async #ensureOpenLocked() {
|
|
210
|
+
if (this.#opened) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const driver = this.#dialect.createDriver();
|
|
214
|
+
try {
|
|
215
|
+
await driver.init();
|
|
216
|
+
const connection = await driver.acquireConnection();
|
|
217
|
+
this.#driver = driver;
|
|
218
|
+
this.#connection = connection;
|
|
219
|
+
this.#opened = true;
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
await driver.destroy().catch(() => undefined);
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// ---------------------------------------------------------------------------
|
|
228
|
+
// Kysely Dialect implementation for Electron IPC SQLite
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
class ElectronSqliteDialect {
|
|
231
|
+
#options;
|
|
232
|
+
constructor(options) {
|
|
233
|
+
this.#options = options;
|
|
234
|
+
}
|
|
235
|
+
createAdapter() {
|
|
236
|
+
return new SqliteAdapter();
|
|
237
|
+
}
|
|
238
|
+
createDriver() {
|
|
239
|
+
return new ElectronSqliteDriver(this.#options);
|
|
240
|
+
}
|
|
241
|
+
createQueryCompiler() {
|
|
242
|
+
return new SqliteQueryCompiler();
|
|
243
|
+
}
|
|
244
|
+
createIntrospector(db) {
|
|
245
|
+
return new SqliteIntrospector(db);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
class ElectronSqliteDriver {
|
|
249
|
+
#bridge;
|
|
250
|
+
#connectionMutex = new ConnectionMutex();
|
|
251
|
+
#connection;
|
|
252
|
+
#opened = false;
|
|
253
|
+
constructor(bridge) {
|
|
254
|
+
this.#bridge = bridge;
|
|
255
|
+
this.#connection = new ElectronSqliteConnection(bridge.execute);
|
|
256
|
+
}
|
|
257
|
+
async init() {
|
|
258
|
+
await this.#ensureOpen();
|
|
259
|
+
}
|
|
260
|
+
async acquireConnection() {
|
|
261
|
+
await this.#connectionMutex.lock();
|
|
262
|
+
return this.#connection;
|
|
263
|
+
}
|
|
264
|
+
async beginTransaction(connection, _settings) {
|
|
265
|
+
await connection.executeQuery(CompiledQuery.raw('begin'));
|
|
266
|
+
}
|
|
267
|
+
async commitTransaction(connection) {
|
|
268
|
+
await connection.executeQuery(CompiledQuery.raw('commit'));
|
|
269
|
+
}
|
|
270
|
+
async rollbackTransaction(connection) {
|
|
271
|
+
await connection.executeQuery(CompiledQuery.raw('rollback'));
|
|
272
|
+
}
|
|
273
|
+
async releaseConnection(_connection) {
|
|
274
|
+
this.#connectionMutex.unlock();
|
|
275
|
+
}
|
|
276
|
+
async destroy() {
|
|
277
|
+
if (this.#bridge.close) {
|
|
278
|
+
await this.#bridge.close();
|
|
279
|
+
}
|
|
280
|
+
this.#opened = false;
|
|
281
|
+
}
|
|
282
|
+
async #ensureOpen() {
|
|
283
|
+
if (this.#opened) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
if (this.#bridge.open) {
|
|
287
|
+
await this.#bridge.open();
|
|
288
|
+
}
|
|
289
|
+
this.#opened = true;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
class ElectronSqliteConnection {
|
|
293
|
+
#execute;
|
|
294
|
+
constructor(execute) {
|
|
295
|
+
this.#execute = execute;
|
|
296
|
+
}
|
|
297
|
+
async executeQuery(compiledQuery) {
|
|
298
|
+
const response = await this.#execute({
|
|
299
|
+
sql: compiledQuery.sql,
|
|
300
|
+
parameters: compiledQuery.parameters,
|
|
301
|
+
});
|
|
302
|
+
const hasReturning = /\breturning\b/i.test(compiledQuery.sql);
|
|
303
|
+
const numAffectedRows = toBigInt(response.numAffectedRows ??
|
|
304
|
+
(hasReturning ? response.rows.length : undefined));
|
|
305
|
+
const insertId = toBigInt(response.insertId);
|
|
306
|
+
return {
|
|
307
|
+
rows: response.rows,
|
|
308
|
+
...(numAffectedRows === undefined ? {} : { numAffectedRows }),
|
|
309
|
+
...(insertId === undefined ? {} : { insertId }),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
async *streamQuery(compiledQuery, _chunkSize) {
|
|
313
|
+
yield await this.executeQuery(compiledQuery);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
class ConnectionMutex {
|
|
317
|
+
#promise;
|
|
318
|
+
#resolve;
|
|
319
|
+
async lock() {
|
|
320
|
+
while (this.#promise) {
|
|
321
|
+
await this.#promise;
|
|
322
|
+
}
|
|
323
|
+
this.#promise = new Promise((resolve) => {
|
|
324
|
+
this.#resolve = resolve;
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
unlock() {
|
|
328
|
+
const resolve = this.#resolve;
|
|
329
|
+
this.#promise = undefined;
|
|
330
|
+
this.#resolve = undefined;
|
|
331
|
+
resolve?.();
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function toBigInt(value) {
|
|
335
|
+
if (value == null) {
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
338
|
+
if (typeof value === 'bigint') {
|
|
339
|
+
return value;
|
|
340
|
+
}
|
|
341
|
+
if (typeof value === 'number') {
|
|
342
|
+
if (!Number.isInteger(value)) {
|
|
343
|
+
throw new Error(`Expected integer number but received: ${value}`);
|
|
344
|
+
}
|
|
345
|
+
return BigInt(value);
|
|
346
|
+
}
|
|
347
|
+
if (!INTEGER_PATTERN.test(value)) {
|
|
348
|
+
throw new Error(`Expected integer string but received: ${value}`);
|
|
349
|
+
}
|
|
350
|
+
return BigInt(value);
|
|
351
|
+
}
|
|
352
|
+
function toWireInteger(value) {
|
|
353
|
+
if (value === undefined) {
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
356
|
+
const asNumber = Number(value);
|
|
357
|
+
if (Number.isSafeInteger(asNumber)) {
|
|
358
|
+
return asNumber;
|
|
359
|
+
}
|
|
360
|
+
return value.toString();
|
|
361
|
+
}
|
|
362
|
+
function resolveWindowBridge(options) {
|
|
363
|
+
const bridgeKey = options.bridgeKey ?? DEFAULT_WINDOW_BRIDGE_KEY;
|
|
364
|
+
const windowRef = resolveWindowRef(options.window);
|
|
365
|
+
const bridge = windowRef.electronAPI?.[bridgeKey];
|
|
366
|
+
if (!bridge) {
|
|
367
|
+
throw new Error(`Electron sqlite API not available at window.electronAPI.${bridgeKey}`);
|
|
368
|
+
}
|
|
369
|
+
return bridge;
|
|
370
|
+
}
|
|
371
|
+
function resolveWindowRef(explicitWindow) {
|
|
372
|
+
if (explicitWindow) {
|
|
373
|
+
return explicitWindow;
|
|
374
|
+
}
|
|
375
|
+
if (typeof window === 'undefined') {
|
|
376
|
+
throw new Error('window is not available. Pass options.window explicitly in non-renderer environments.');
|
|
377
|
+
}
|
|
378
|
+
return window;
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@syncular/dialect-electron-sqlite",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Electron IPC SQLite dialect for the Syncular client",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Benjamin Kniffler",
|
|
7
|
+
"homepage": "https://syncular.dev",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/syncular/syncular.git",
|
|
11
|
+
"directory": "packages/dialect-electron-sqlite"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/syncular/syncular/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"sync",
|
|
18
|
+
"offline-first",
|
|
19
|
+
"realtime",
|
|
20
|
+
"database",
|
|
21
|
+
"typescript",
|
|
22
|
+
"electron",
|
|
23
|
+
"sqlite",
|
|
24
|
+
"ipc"
|
|
25
|
+
],
|
|
26
|
+
"private": false,
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"type": "module",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"bun": "./src/index.ts",
|
|
34
|
+
"import": {
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"default": "./dist/index.js"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"tsgo": "tsgo --noEmit",
|
|
42
|
+
"build": "tsgo",
|
|
43
|
+
"release": "bunx syncular-publish"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@syncular/core": "0.0.1"
|
|
47
|
+
},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"kysely": "^0.28.0"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@syncular/config": "0.0.0",
|
|
53
|
+
"kysely": "*"
|
|
54
|
+
},
|
|
55
|
+
"files": [
|
|
56
|
+
"dist",
|
|
57
|
+
"src"
|
|
58
|
+
]
|
|
59
|
+
}
|