@framers/sql-storage-adapter 0.7.1 → 0.7.3
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/README.md +43 -0
- package/dist/adapters/electron/preload.cjs +289 -0
- package/dist/adapters/electron/renderer.d.ts +9 -0
- package/dist/adapters/electron/renderer.d.ts.map +1 -0
- package/dist/adapters/electron/renderer.js +8 -0
- package/dist/adapters/electron/renderer.js.map +1 -0
- package/dist/cjs/adapters/__tests__/indexedDbAdapter.spec.d.ts +2 -0
- package/dist/cjs/adapters/__tests__/indexedDbAdapter.spec.js +133 -0
- package/dist/cjs/adapters/baseStorageAdapter.d.ts +368 -0
- package/dist/cjs/adapters/baseStorageAdapter.js +744 -0
- package/dist/cjs/adapters/betterSqliteAdapter.d.ts +124 -0
- package/dist/cjs/adapters/betterSqliteAdapter.js +334 -0
- package/dist/cjs/adapters/capacitorSqliteAdapter.d.ts +83 -0
- package/dist/cjs/adapters/capacitorSqliteAdapter.js +250 -0
- package/dist/cjs/adapters/electron/electronMainAdapter.d.ts +251 -0
- package/dist/cjs/adapters/electron/electronMainAdapter.js +392 -0
- package/dist/cjs/adapters/electron/electronRendererAdapter.d.ts +177 -0
- package/dist/cjs/adapters/electron/electronRendererAdapter.js +283 -0
- package/dist/cjs/adapters/electron/index.d.ts +74 -0
- package/dist/cjs/adapters/electron/index.js +86 -0
- package/dist/cjs/adapters/electron/ipc/channels.d.ts +196 -0
- package/dist/cjs/adapters/electron/ipc/channels.js +127 -0
- package/dist/cjs/adapters/electron/ipc/index.d.ts +11 -0
- package/dist/cjs/adapters/electron/ipc/index.js +38 -0
- package/dist/cjs/adapters/electron/ipc/protocol.d.ts +78 -0
- package/dist/cjs/adapters/electron/ipc/protocol.js +341 -0
- package/dist/cjs/adapters/electron/ipc/types.d.ts +248 -0
- package/dist/cjs/adapters/electron/ipc/types.js +15 -0
- package/dist/cjs/adapters/electron/migration/autoMigrator.d.ts +184 -0
- package/dist/cjs/adapters/electron/migration/autoMigrator.js +441 -0
- package/dist/cjs/adapters/electron/migration/index.d.ts +9 -0
- package/dist/cjs/adapters/electron/migration/index.js +29 -0
- package/dist/cjs/adapters/electron/preload.d.ts +126 -0
- package/dist/cjs/adapters/electron/preload.js +233 -0
- package/dist/cjs/adapters/electron/recovery/corruptionDetector.d.ts +214 -0
- package/dist/cjs/adapters/electron/recovery/corruptionDetector.js +359 -0
- package/dist/cjs/adapters/electron/recovery/index.d.ts +11 -0
- package/dist/cjs/adapters/electron/recovery/index.js +34 -0
- package/dist/cjs/adapters/electron/recovery/walCheckpoint.d.ts +186 -0
- package/dist/cjs/adapters/electron/recovery/walCheckpoint.js +263 -0
- package/dist/cjs/adapters/electron/renderer.d.ts +9 -0
- package/dist/cjs/adapters/electron/renderer.js +33 -0
- package/dist/cjs/adapters/electron/window/index.d.ts +9 -0
- package/dist/cjs/adapters/electron/window/index.js +29 -0
- package/dist/cjs/adapters/electron/window/windowManager.d.ts +190 -0
- package/dist/cjs/adapters/electron/window/windowManager.js +321 -0
- package/dist/cjs/adapters/indexedDbAdapter.d.ts +490 -0
- package/dist/cjs/adapters/indexedDbAdapter.js +993 -0
- package/dist/cjs/adapters/postgresAdapter.d.ts +424 -0
- package/dist/cjs/adapters/postgresAdapter.js +889 -0
- package/dist/cjs/adapters/sqlJsAdapter.d.ts +64 -0
- package/dist/cjs/adapters/sqlJsAdapter.js +268 -0
- package/dist/cjs/adapters/supabase.d.ts +58 -0
- package/dist/cjs/adapters/supabase.js +401 -0
- package/dist/cjs/codecs/BrowserBlobCodec.d.ts +14 -0
- package/dist/cjs/codecs/BrowserBlobCodec.js +57 -0
- package/dist/cjs/codecs/NodeBlobCodec.d.ts +14 -0
- package/dist/cjs/codecs/NodeBlobCodec.js +59 -0
- package/dist/cjs/core/contracts/blobCodec.d.ts +15 -0
- package/dist/cjs/core/contracts/blobCodec.js +15 -0
- package/dist/cjs/core/contracts/context.d.ts +221 -0
- package/dist/cjs/core/contracts/context.js +15 -0
- package/dist/cjs/core/contracts/dialect.d.ts +154 -0
- package/dist/cjs/core/contracts/dialect.js +15 -0
- package/dist/cjs/core/contracts/events.d.ts +225 -0
- package/dist/cjs/core/contracts/events.js +15 -0
- package/dist/cjs/core/contracts/exporter.d.ts +13 -0
- package/dist/cjs/core/contracts/exporter.js +15 -0
- package/dist/cjs/core/contracts/extensions.d.ts +73 -0
- package/dist/cjs/core/contracts/extensions.js +15 -0
- package/dist/cjs/core/contracts/features.d.ts +25 -0
- package/dist/cjs/core/contracts/features.js +61 -0
- package/dist/cjs/core/contracts/fts.d.ts +66 -0
- package/dist/cjs/core/contracts/fts.js +15 -0
- package/dist/cjs/core/contracts/hooks.d.ts +481 -0
- package/dist/cjs/core/contracts/hooks.js +140 -0
- package/dist/cjs/core/contracts/index.d.ts +260 -0
- package/dist/cjs/core/contracts/index.js +41 -0
- package/dist/cjs/core/contracts/limitations.d.ts +46 -0
- package/dist/cjs/core/contracts/limitations.js +218 -0
- package/dist/cjs/core/contracts/performance.d.ts +308 -0
- package/dist/cjs/core/contracts/performance.js +144 -0
- package/dist/cjs/core/database.d.ts +220 -0
- package/dist/cjs/core/database.js +136 -0
- package/dist/cjs/core/portable.d.ts +23 -0
- package/dist/cjs/core/portable.js +66 -0
- package/dist/cjs/core/resolver.d.ts +77 -0
- package/dist/cjs/core/resolver.js +235 -0
- package/dist/cjs/dialects/PostgresDialect.d.ts +35 -0
- package/dist/cjs/dialects/PostgresDialect.js +143 -0
- package/dist/cjs/dialects/SqliteDialect.d.ts +35 -0
- package/dist/cjs/dialects/SqliteDialect.js +142 -0
- package/dist/cjs/dialects/shared.d.ts +17 -0
- package/dist/cjs/dialects/shared.js +90 -0
- package/dist/cjs/exporters/PostgresExporter.d.ts +14 -0
- package/dist/cjs/exporters/PostgresExporter.js +61 -0
- package/dist/cjs/exporters/SqliteFileExporter.d.ts +16 -0
- package/dist/cjs/exporters/SqliteFileExporter.js +43 -0
- package/dist/cjs/features/backup/cloudBackup.d.ts +219 -0
- package/dist/cjs/features/backup/cloudBackup.js +209 -0
- package/dist/cjs/features/kv/idb.d.ts +79 -0
- package/dist/cjs/features/kv/idb.js +32 -0
- package/dist/cjs/features/kv/index.d.ts +14 -0
- package/dist/cjs/features/kv/index.js +40 -0
- package/dist/cjs/features/kv/indexedDbKeyValueStore.d.ts +77 -0
- package/dist/cjs/features/kv/indexedDbKeyValueStore.js +116 -0
- package/dist/cjs/features/kv/keyValueStore.d.ts +48 -0
- package/dist/cjs/features/kv/keyValueStore.js +67 -0
- package/dist/cjs/features/kv/sqlKeyValueStore.d.ts +34 -0
- package/dist/cjs/features/kv/sqlKeyValueStore.js +81 -0
- package/dist/cjs/features/kv/valueCodec.d.ts +35 -0
- package/dist/cjs/features/kv/valueCodec.js +426 -0
- package/dist/cjs/features/migrations/dataExport.d.ts +77 -0
- package/dist/cjs/features/migrations/dataExport.js +194 -0
- package/dist/cjs/features/migrations/dataImport.d.ts +54 -0
- package/dist/cjs/features/migrations/dataImport.js +300 -0
- package/dist/cjs/features/migrations/migration.d.ts +89 -0
- package/dist/cjs/features/migrations/migration.js +187 -0
- package/dist/cjs/features/migrations/schemaMigrations.d.ts +93 -0
- package/dist/cjs/features/migrations/schemaMigrations.js +220 -0
- package/dist/cjs/features/sync/conflicts/conflictResolver.d.ts +222 -0
- package/dist/cjs/features/sync/conflicts/conflictResolver.js +366 -0
- package/dist/cjs/features/sync/conflicts/index.d.ts +9 -0
- package/dist/cjs/features/sync/conflicts/index.js +21 -0
- package/dist/cjs/features/sync/crossPlatformSync.d.ts +281 -0
- package/dist/cjs/features/sync/crossPlatformSync.js +551 -0
- package/dist/cjs/features/sync/devices/deviceManager.d.ts +243 -0
- package/dist/cjs/features/sync/devices/deviceManager.js +450 -0
- package/dist/cjs/features/sync/devices/index.d.ts +10 -0
- package/dist/cjs/features/sync/devices/index.js +21 -0
- package/dist/cjs/features/sync/index.d.ts +37 -0
- package/dist/cjs/features/sync/index.js +111 -0
- package/dist/cjs/features/sync/protocol/index.d.ts +11 -0
- package/dist/cjs/features/sync/protocol/index.js +23 -0
- package/dist/cjs/features/sync/protocol/messages.d.ts +348 -0
- package/dist/cjs/features/sync/protocol/messages.js +215 -0
- package/dist/cjs/features/sync/protocol/vectorClock.d.ts +164 -0
- package/dist/cjs/features/sync/protocol/vectorClock.js +256 -0
- package/dist/cjs/features/sync/syncManager.d.ts +348 -0
- package/dist/cjs/features/sync/syncManager.js +455 -0
- package/dist/cjs/features/sync/tables/index.d.ts +10 -0
- package/dist/cjs/features/sync/tables/index.js +21 -0
- package/dist/cjs/features/sync/tables/syncLogManager.d.ts +216 -0
- package/dist/cjs/features/sync/tables/syncLogManager.js +423 -0
- package/dist/cjs/features/sync/transport/httpTransport.d.ts +123 -0
- package/dist/cjs/features/sync/transport/httpTransport.js +346 -0
- package/dist/cjs/features/sync/transport/index.d.ts +12 -0
- package/dist/cjs/features/sync/transport/index.js +25 -0
- package/dist/cjs/features/sync/transport/transport.d.ts +259 -0
- package/dist/cjs/features/sync/transport/transport.js +163 -0
- package/dist/cjs/features/sync/transport/websocketTransport.d.ts +126 -0
- package/dist/cjs/features/sync/transport/websocketTransport.js +342 -0
- package/dist/cjs/fts/PostgresFts.d.ts +29 -0
- package/dist/cjs/fts/PostgresFts.js +77 -0
- package/dist/cjs/fts/SqliteFts5.d.ts +22 -0
- package/dist/cjs/fts/SqliteFts5.js +58 -0
- package/dist/cjs/index.d.ts +30 -0
- package/dist/cjs/index.js +101 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/shared/connectionGate.d.ts +94 -0
- package/dist/cjs/shared/connectionGate.js +77 -0
- package/dist/cjs/shared/errors.d.ts +23 -0
- package/dist/cjs/shared/errors.js +45 -0
- package/dist/cjs/shared/logger.d.ts +26 -0
- package/dist/cjs/shared/logger.js +40 -0
- package/dist/cjs/shared/parameterUtils.d.ts +16 -0
- package/dist/cjs/shared/parameterUtils.js +59 -0
- package/dist/cjs/shared/postgresTarget.d.ts +11 -0
- package/dist/cjs/shared/postgresTarget.js +30 -0
- package/dist/cjs/shared/segment.d.ts +43 -0
- package/dist/cjs/shared/segment.js +63 -0
- package/dist/cjs/shared/serializedTransaction.d.ts +14 -0
- package/dist/cjs/shared/serializedTransaction.js +74 -0
- package/dist/cjs/shared/splitSqlStatements.d.ts +27 -0
- package/dist/cjs/shared/splitSqlStatements.js +163 -0
- package/dist/cjs/shared/sqlPlaceholders.d.ts +48 -0
- package/dist/cjs/shared/sqlPlaceholders.js +263 -0
- package/dist/cjs/types/index.d.ts +29 -0
- package/dist/cjs/types/index.js +33 -0
- package/dist/core/portable.d.ts +23 -0
- package/dist/core/portable.d.ts.map +1 -0
- package/dist/core/portable.js +23 -0
- package/dist/core/portable.js.map +1 -0
- package/dist/features/migrations/schemaMigrations.d.ts +93 -0
- package/dist/features/migrations/schemaMigrations.d.ts.map +1 -0
- package/dist/features/migrations/schemaMigrations.js +216 -0
- package/dist/features/migrations/schemaMigrations.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +139 -24
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var walCheckpoint_exports = {};
|
|
19
|
+
__export(walCheckpoint_exports, {
|
|
20
|
+
WalCheckpointManager: () => WalCheckpointManager,
|
|
21
|
+
createWalCheckpointManager: () => createWalCheckpointManager
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(walCheckpoint_exports);
|
|
24
|
+
const DEFAULT_CONFIG = {
|
|
25
|
+
checkpointInterval: 3e5,
|
|
26
|
+
// 5 minutes
|
|
27
|
+
strategy: "PASSIVE",
|
|
28
|
+
maxWalSize: 50 * 1024 * 1024,
|
|
29
|
+
// 50MB
|
|
30
|
+
pageSize: 4096,
|
|
31
|
+
autoCheckpointPages: 1e3,
|
|
32
|
+
synchronous: "NORMAL",
|
|
33
|
+
verbose: false
|
|
34
|
+
};
|
|
35
|
+
class WalCheckpointManager {
|
|
36
|
+
constructor(adapter, config = {}) {
|
|
37
|
+
this.adapter = adapter;
|
|
38
|
+
this.checkpointTimer = null;
|
|
39
|
+
this.lastCheckpoint = null;
|
|
40
|
+
this.totalCheckpoints = 0;
|
|
41
|
+
this.isRunning = false;
|
|
42
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
43
|
+
}
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// Lifecycle Methods
|
|
46
|
+
// ============================================================================
|
|
47
|
+
/**
|
|
48
|
+
* Start the checkpoint manager.
|
|
49
|
+
*/
|
|
50
|
+
async start() {
|
|
51
|
+
if (this.isRunning) {
|
|
52
|
+
this.log("Already running");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
await this.configureWalMode();
|
|
56
|
+
this.startCheckpointTimer();
|
|
57
|
+
this.isRunning = true;
|
|
58
|
+
this.log("WAL Checkpoint Manager started");
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Stop the checkpoint manager.
|
|
62
|
+
*/
|
|
63
|
+
async stop() {
|
|
64
|
+
if (!this.isRunning) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.stopCheckpointTimer();
|
|
68
|
+
try {
|
|
69
|
+
await this.checkpoint("FULL");
|
|
70
|
+
} catch (error) {
|
|
71
|
+
this.log(`Final checkpoint failed: ${error}`);
|
|
72
|
+
}
|
|
73
|
+
this.isRunning = false;
|
|
74
|
+
this.log("WAL Checkpoint Manager stopped");
|
|
75
|
+
}
|
|
76
|
+
// ============================================================================
|
|
77
|
+
// WAL Configuration
|
|
78
|
+
// ============================================================================
|
|
79
|
+
/**
|
|
80
|
+
* Configure WAL mode on the database.
|
|
81
|
+
*/
|
|
82
|
+
async configureWalMode() {
|
|
83
|
+
const pragmas = [
|
|
84
|
+
"PRAGMA journal_mode = WAL",
|
|
85
|
+
`PRAGMA synchronous = ${this.config.synchronous}`,
|
|
86
|
+
`PRAGMA wal_autocheckpoint = ${this.config.autoCheckpointPages}`,
|
|
87
|
+
`PRAGMA page_size = ${this.config.pageSize}`
|
|
88
|
+
];
|
|
89
|
+
for (const pragma of pragmas) {
|
|
90
|
+
await this.adapter.exec(pragma);
|
|
91
|
+
}
|
|
92
|
+
this.log("WAL mode configured");
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Disable WAL mode and switch back to DELETE journal mode.
|
|
96
|
+
*/
|
|
97
|
+
async disableWalMode() {
|
|
98
|
+
await this.checkpoint("TRUNCATE");
|
|
99
|
+
await this.adapter.exec("PRAGMA journal_mode = DELETE");
|
|
100
|
+
this.log("WAL mode disabled");
|
|
101
|
+
}
|
|
102
|
+
// ============================================================================
|
|
103
|
+
// Checkpoint Operations
|
|
104
|
+
// ============================================================================
|
|
105
|
+
/**
|
|
106
|
+
* Perform a WAL checkpoint.
|
|
107
|
+
*
|
|
108
|
+
* @param strategy - Checkpoint strategy (defaults to config strategy)
|
|
109
|
+
* @returns Checkpoint result
|
|
110
|
+
*/
|
|
111
|
+
async checkpoint(strategy) {
|
|
112
|
+
const effectiveStrategy = strategy ?? this.config.strategy;
|
|
113
|
+
const startTime = Date.now();
|
|
114
|
+
try {
|
|
115
|
+
const walBefore = await this.getWalFrameCount();
|
|
116
|
+
const result = await this.adapter.get(`PRAGMA wal_checkpoint(${effectiveStrategy})`);
|
|
117
|
+
const walAfter = await this.getWalFrameCount();
|
|
118
|
+
const checkpointResult = {
|
|
119
|
+
success: true,
|
|
120
|
+
strategy: effectiveStrategy,
|
|
121
|
+
walFramesBefore: walBefore,
|
|
122
|
+
walFramesAfter: walAfter,
|
|
123
|
+
framesCheckpointed: result?.checkpointed ?? 0,
|
|
124
|
+
busyFrames: result?.busy ?? 0,
|
|
125
|
+
durationMs: Date.now() - startTime,
|
|
126
|
+
timestamp: Date.now()
|
|
127
|
+
};
|
|
128
|
+
this.lastCheckpoint = Date.now();
|
|
129
|
+
this.totalCheckpoints++;
|
|
130
|
+
this.log(`Checkpoint completed: ${checkpointResult.framesCheckpointed} frames (${effectiveStrategy}, ${checkpointResult.durationMs}ms)`);
|
|
131
|
+
return checkpointResult;
|
|
132
|
+
} catch (error) {
|
|
133
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
134
|
+
this.log(`Checkpoint failed: ${errorMessage}`);
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
strategy: effectiveStrategy,
|
|
138
|
+
walFramesBefore: 0,
|
|
139
|
+
walFramesAfter: 0,
|
|
140
|
+
framesCheckpointed: 0,
|
|
141
|
+
busyFrames: 0,
|
|
142
|
+
durationMs: Date.now() - startTime,
|
|
143
|
+
timestamp: Date.now(),
|
|
144
|
+
error: errorMessage
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Force a full checkpoint that clears the WAL.
|
|
150
|
+
*/
|
|
151
|
+
async forceFullCheckpoint() {
|
|
152
|
+
return this.checkpoint("TRUNCATE");
|
|
153
|
+
}
|
|
154
|
+
// ============================================================================
|
|
155
|
+
// Timer Management
|
|
156
|
+
// ============================================================================
|
|
157
|
+
/**
|
|
158
|
+
* Start the automatic checkpoint timer.
|
|
159
|
+
*/
|
|
160
|
+
startCheckpointTimer() {
|
|
161
|
+
if (this.checkpointTimer) {
|
|
162
|
+
clearInterval(this.checkpointTimer);
|
|
163
|
+
}
|
|
164
|
+
this.checkpointTimer = setInterval(async () => {
|
|
165
|
+
try {
|
|
166
|
+
const walSize = await this.getWalSize();
|
|
167
|
+
const strategy = walSize > this.config.maxWalSize ? "FULL" : this.config.strategy;
|
|
168
|
+
await this.checkpoint(strategy);
|
|
169
|
+
} catch (error) {
|
|
170
|
+
this.log(`Periodic checkpoint failed: ${error}`);
|
|
171
|
+
}
|
|
172
|
+
}, this.config.checkpointInterval);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Stop the automatic checkpoint timer.
|
|
176
|
+
*/
|
|
177
|
+
stopCheckpointTimer() {
|
|
178
|
+
if (this.checkpointTimer) {
|
|
179
|
+
clearInterval(this.checkpointTimer);
|
|
180
|
+
this.checkpointTimer = null;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// ============================================================================
|
|
184
|
+
// Status & Monitoring
|
|
185
|
+
// ============================================================================
|
|
186
|
+
/**
|
|
187
|
+
* Get current WAL status.
|
|
188
|
+
*/
|
|
189
|
+
async getStatus() {
|
|
190
|
+
const journalMode = await this.adapter.get("PRAGMA journal_mode");
|
|
191
|
+
const walFrames = await this.getWalFrameCount();
|
|
192
|
+
const autoCheckpoint = await this.adapter.get("PRAGMA wal_autocheckpoint");
|
|
193
|
+
return {
|
|
194
|
+
enabled: journalMode?.journal_mode?.toLowerCase() === "wal",
|
|
195
|
+
walSize: walFrames * this.config.pageSize,
|
|
196
|
+
walPages: walFrames,
|
|
197
|
+
lastCheckpoint: this.lastCheckpoint,
|
|
198
|
+
totalCheckpoints: this.totalCheckpoints,
|
|
199
|
+
autoCheckpointThreshold: autoCheckpoint?.wal_autocheckpoint ?? this.config.autoCheckpointPages
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get current WAL size in bytes.
|
|
204
|
+
*/
|
|
205
|
+
async getWalSize() {
|
|
206
|
+
const frames = await this.getWalFrameCount();
|
|
207
|
+
return frames * this.config.pageSize;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get current WAL frame count.
|
|
211
|
+
*/
|
|
212
|
+
async getWalFrameCount() {
|
|
213
|
+
const result = await this.adapter.get("PRAGMA wal_checkpoint(PASSIVE)");
|
|
214
|
+
return result?.log ?? 0;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Check if WAL mode is currently enabled.
|
|
218
|
+
*/
|
|
219
|
+
async isWalEnabled() {
|
|
220
|
+
const result = await this.adapter.get("PRAGMA journal_mode");
|
|
221
|
+
return result?.journal_mode?.toLowerCase() === "wal";
|
|
222
|
+
}
|
|
223
|
+
// ============================================================================
|
|
224
|
+
// Utilities
|
|
225
|
+
// ============================================================================
|
|
226
|
+
/**
|
|
227
|
+
* Get checkpoint statistics.
|
|
228
|
+
*/
|
|
229
|
+
getStats() {
|
|
230
|
+
return {
|
|
231
|
+
totalCheckpoints: this.totalCheckpoints,
|
|
232
|
+
lastCheckpoint: this.lastCheckpoint,
|
|
233
|
+
isRunning: this.isRunning,
|
|
234
|
+
checkpointInterval: this.config.checkpointInterval,
|
|
235
|
+
strategy: this.config.strategy
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Update checkpoint configuration at runtime.
|
|
240
|
+
*/
|
|
241
|
+
updateConfig(newConfig) {
|
|
242
|
+
Object.assign(this.config, newConfig);
|
|
243
|
+
if (this.isRunning && newConfig.checkpointInterval !== void 0) {
|
|
244
|
+
this.startCheckpointTimer();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Log a message if verbose mode is enabled.
|
|
249
|
+
*/
|
|
250
|
+
log(message) {
|
|
251
|
+
if (this.config.verbose) {
|
|
252
|
+
console.log(`[WalCheckpointManager] ${message}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
function createWalCheckpointManager(adapter, config = {}) {
|
|
257
|
+
return new WalCheckpointManager(adapter, config);
|
|
258
|
+
}
|
|
259
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
260
|
+
0 && (module.exports = {
|
|
261
|
+
WalCheckpointManager,
|
|
262
|
+
createWalCheckpointManager
|
|
263
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The renderer-process entry, `@framers/sql-storage-adapter/electron/renderer`: the adapter a window uses over IPC,
|
|
3
|
+
* and nothing from the main process (better-sqlite3, the window manager, recovery, migration).
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
export { ElectronRendererAdapter, createElectronRendererAdapter, isElectronRenderer, isPreloadApiAvailable, type ElectronRendererAdapterOptions, } from './electronRendererAdapter.js';
|
|
8
|
+
export type { DbChangeEvent, SyncStatus } from './ipc/types.js';
|
|
9
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var renderer_exports = {};
|
|
19
|
+
__export(renderer_exports, {
|
|
20
|
+
ElectronRendererAdapter: () => import_electronRendererAdapter.ElectronRendererAdapter,
|
|
21
|
+
createElectronRendererAdapter: () => import_electronRendererAdapter.createElectronRendererAdapter,
|
|
22
|
+
isElectronRenderer: () => import_electronRendererAdapter.isElectronRenderer,
|
|
23
|
+
isPreloadApiAvailable: () => import_electronRendererAdapter.isPreloadApiAvailable
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(renderer_exports);
|
|
26
|
+
var import_electronRendererAdapter = require("./electronRendererAdapter.js");
|
|
27
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
28
|
+
0 && (module.exports = {
|
|
29
|
+
ElectronRendererAdapter,
|
|
30
|
+
createElectronRendererAdapter,
|
|
31
|
+
isElectronRenderer,
|
|
32
|
+
isPreloadApiAvailable
|
|
33
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Window Management Module for Electron SQL Storage Adapter.
|
|
3
|
+
*
|
|
4
|
+
* Provides multi-window coordination and change broadcasting.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export { WindowManager, createWindowManager, type WindowManagerConfig, type WindowManagerCallbacks, type RegisteredWindow, } from './windowManager.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var window_exports = {};
|
|
19
|
+
__export(window_exports, {
|
|
20
|
+
WindowManager: () => import_windowManager.WindowManager,
|
|
21
|
+
createWindowManager: () => import_windowManager.createWindowManager
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(window_exports);
|
|
24
|
+
var import_windowManager = require("./windowManager.js");
|
|
25
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
26
|
+
0 && (module.exports = {
|
|
27
|
+
WindowManager,
|
|
28
|
+
createWindowManager
|
|
29
|
+
});
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Window Manager for Electron SQL Storage Adapter.
|
|
3
|
+
*
|
|
4
|
+
* Coordinates database access across multiple Electron windows.
|
|
5
|
+
* Broadcasts database changes to all windows and manages
|
|
6
|
+
* window-specific state.
|
|
7
|
+
*
|
|
8
|
+
* ## Features
|
|
9
|
+
* - Change broadcasting to all windows
|
|
10
|
+
* - Window registration and tracking
|
|
11
|
+
* - Focused window optimization
|
|
12
|
+
* - Connection state synchronization
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const manager = new WindowManager({
|
|
17
|
+
* broadcastChanges: true,
|
|
18
|
+
* trackFocusedWindow: true,
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* manager.initialize();
|
|
22
|
+
*
|
|
23
|
+
* // Register a window
|
|
24
|
+
* manager.registerWindow(mainWindow);
|
|
25
|
+
*
|
|
26
|
+
* // Broadcast a change
|
|
27
|
+
* manager.broadcastChange({
|
|
28
|
+
* type: 'insert',
|
|
29
|
+
* tables: ['users'],
|
|
30
|
+
* changes: 1,
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
import { BrowserWindow } from 'electron';
|
|
35
|
+
import type { DbChangeEvent } from '../ipc/types.js';
|
|
36
|
+
/**
|
|
37
|
+
* Window registration info.
|
|
38
|
+
*/
|
|
39
|
+
export interface RegisteredWindow {
|
|
40
|
+
/** Window ID */
|
|
41
|
+
id: number;
|
|
42
|
+
/** Window name/label */
|
|
43
|
+
name?: string;
|
|
44
|
+
/** Whether the window is currently focused */
|
|
45
|
+
isFocused: boolean;
|
|
46
|
+
/** When the window was registered */
|
|
47
|
+
registeredAt: number;
|
|
48
|
+
/** Last activity timestamp */
|
|
49
|
+
lastActivityAt: number;
|
|
50
|
+
/** Whether the window is subscribed to changes */
|
|
51
|
+
subscribedToChanges: boolean;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Window manager configuration.
|
|
55
|
+
*/
|
|
56
|
+
export interface WindowManagerConfig {
|
|
57
|
+
/** Broadcast changes to all windows (default: true) */
|
|
58
|
+
broadcastChanges?: boolean;
|
|
59
|
+
/** Track focused window for optimizations (default: true) */
|
|
60
|
+
trackFocusedWindow?: boolean;
|
|
61
|
+
/** Enable verbose logging (default: false) */
|
|
62
|
+
verbose?: boolean;
|
|
63
|
+
/** Exclude windows by name from broadcasts */
|
|
64
|
+
excludeWindows?: string[];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Window manager event callbacks.
|
|
68
|
+
*/
|
|
69
|
+
export interface WindowManagerCallbacks {
|
|
70
|
+
/** Called when a window is registered */
|
|
71
|
+
onWindowRegistered?: (window: RegisteredWindow) => void;
|
|
72
|
+
/** Called when a window is unregistered */
|
|
73
|
+
onWindowUnregistered?: (windowId: number) => void;
|
|
74
|
+
/** Called when focus changes */
|
|
75
|
+
onFocusChanged?: (windowId: number | null) => void;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Multi-Window Manager.
|
|
79
|
+
*
|
|
80
|
+
* Manages database access coordination across multiple Electron windows.
|
|
81
|
+
*/
|
|
82
|
+
export declare class WindowManager {
|
|
83
|
+
private readonly config;
|
|
84
|
+
private readonly callbacks;
|
|
85
|
+
private windows;
|
|
86
|
+
private focusedWindowId;
|
|
87
|
+
private isInitialized;
|
|
88
|
+
constructor(config?: WindowManagerConfig, callbacks?: WindowManagerCallbacks);
|
|
89
|
+
/**
|
|
90
|
+
* Initialize the window manager.
|
|
91
|
+
*/
|
|
92
|
+
initialize(): void;
|
|
93
|
+
/**
|
|
94
|
+
* Dispose the window manager.
|
|
95
|
+
*/
|
|
96
|
+
dispose(): void;
|
|
97
|
+
/**
|
|
98
|
+
* Set up focus tracking for all windows.
|
|
99
|
+
*/
|
|
100
|
+
private setupFocusTracking;
|
|
101
|
+
/**
|
|
102
|
+
* Register a window for management.
|
|
103
|
+
*/
|
|
104
|
+
registerWindow(window: BrowserWindow, name?: string): void;
|
|
105
|
+
/**
|
|
106
|
+
* Unregister a window.
|
|
107
|
+
*/
|
|
108
|
+
unregisterWindow(windowId: number): void;
|
|
109
|
+
/**
|
|
110
|
+
* Handle window focus event.
|
|
111
|
+
*/
|
|
112
|
+
private handleWindowFocus;
|
|
113
|
+
/**
|
|
114
|
+
* Handle window blur event.
|
|
115
|
+
*/
|
|
116
|
+
private handleWindowBlur;
|
|
117
|
+
/**
|
|
118
|
+
* Broadcast a database change to all windows.
|
|
119
|
+
*/
|
|
120
|
+
broadcastChange(change: Omit<DbChangeEvent, 'timestamp'>, excludeWindowId?: number): void;
|
|
121
|
+
/**
|
|
122
|
+
* Broadcast connection state change to all windows.
|
|
123
|
+
*/
|
|
124
|
+
broadcastConnectionState(state: 'open' | 'closed' | 'error', error?: Error): void;
|
|
125
|
+
/**
|
|
126
|
+
* Send a message to a specific window.
|
|
127
|
+
*/
|
|
128
|
+
sendToWindow(windowId: number, channel: string, data: unknown): boolean;
|
|
129
|
+
/**
|
|
130
|
+
* Send a message to the focused window.
|
|
131
|
+
*/
|
|
132
|
+
sendToFocusedWindow(channel: string, data: unknown): boolean;
|
|
133
|
+
/**
|
|
134
|
+
* Subscribe a window to database changes.
|
|
135
|
+
*/
|
|
136
|
+
subscribeWindow(windowId: number): void;
|
|
137
|
+
/**
|
|
138
|
+
* Unsubscribe a window from database changes.
|
|
139
|
+
*/
|
|
140
|
+
unsubscribeWindow(windowId: number): void;
|
|
141
|
+
/**
|
|
142
|
+
* Get all registered windows.
|
|
143
|
+
*/
|
|
144
|
+
getWindows(): RegisteredWindow[];
|
|
145
|
+
/**
|
|
146
|
+
* Get a specific window registration.
|
|
147
|
+
*/
|
|
148
|
+
getWindow(windowId: number): RegisteredWindow | undefined;
|
|
149
|
+
/**
|
|
150
|
+
* Get the focused window ID.
|
|
151
|
+
*/
|
|
152
|
+
getFocusedWindowId(): number | null;
|
|
153
|
+
/**
|
|
154
|
+
* Get the focused window registration.
|
|
155
|
+
*/
|
|
156
|
+
getFocusedWindow(): RegisteredWindow | undefined;
|
|
157
|
+
/**
|
|
158
|
+
* Get window count.
|
|
159
|
+
*/
|
|
160
|
+
getWindowCount(): number;
|
|
161
|
+
/**
|
|
162
|
+
* Check if a window is registered.
|
|
163
|
+
*/
|
|
164
|
+
hasWindow(windowId: number): boolean;
|
|
165
|
+
/**
|
|
166
|
+
* Update window activity timestamp.
|
|
167
|
+
*/
|
|
168
|
+
updateActivity(windowId: number): void;
|
|
169
|
+
/**
|
|
170
|
+
* Get statistics about windows.
|
|
171
|
+
*/
|
|
172
|
+
getStats(): {
|
|
173
|
+
totalWindows: number;
|
|
174
|
+
subscribedWindows: number;
|
|
175
|
+
focusedWindowId: number | null;
|
|
176
|
+
};
|
|
177
|
+
/**
|
|
178
|
+
* Log a message if verbose mode is enabled.
|
|
179
|
+
*/
|
|
180
|
+
private log;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Create a Window Manager.
|
|
184
|
+
*
|
|
185
|
+
* @param config - Manager configuration
|
|
186
|
+
* @param callbacks - Event callbacks
|
|
187
|
+
* @returns WindowManager instance
|
|
188
|
+
*/
|
|
189
|
+
export declare function createWindowManager(config?: WindowManagerConfig, callbacks?: WindowManagerCallbacks): WindowManager;
|
|
190
|
+
//# sourceMappingURL=windowManager.d.ts.map
|