@framers/sql-storage-adapter 0.4.2 → 0.5.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.
Files changed (135) hide show
  1. package/README.md +94 -2
  2. package/dist/adapters/electron/electronMainAdapter.d.ts +241 -0
  3. package/dist/adapters/electron/electronMainAdapter.d.ts.map +1 -0
  4. package/dist/adapters/electron/electronMainAdapter.js +442 -0
  5. package/dist/adapters/electron/electronMainAdapter.js.map +1 -0
  6. package/dist/adapters/electron/electronRendererAdapter.d.ts +177 -0
  7. package/dist/adapters/electron/electronRendererAdapter.d.ts.map +1 -0
  8. package/dist/adapters/electron/electronRendererAdapter.js +339 -0
  9. package/dist/adapters/electron/electronRendererAdapter.js.map +1 -0
  10. package/dist/adapters/electron/index.d.ts +74 -0
  11. package/dist/adapters/electron/index.d.ts.map +1 -0
  12. package/dist/adapters/electron/index.js +96 -0
  13. package/dist/adapters/electron/index.js.map +1 -0
  14. package/dist/adapters/electron/ipc/channels.d.ts +196 -0
  15. package/dist/adapters/electron/ipc/channels.d.ts.map +1 -0
  16. package/dist/adapters/electron/ipc/channels.js +121 -0
  17. package/dist/adapters/electron/ipc/channels.js.map +1 -0
  18. package/dist/adapters/electron/ipc/index.d.ts +11 -0
  19. package/dist/adapters/electron/ipc/index.d.ts.map +1 -0
  20. package/dist/adapters/electron/ipc/index.js +11 -0
  21. package/dist/adapters/electron/ipc/index.js.map +1 -0
  22. package/dist/adapters/electron/ipc/protocol.d.ts +78 -0
  23. package/dist/adapters/electron/ipc/protocol.d.ts.map +1 -0
  24. package/dist/adapters/electron/ipc/protocol.js +347 -0
  25. package/dist/adapters/electron/ipc/protocol.js.map +1 -0
  26. package/dist/adapters/electron/ipc/types.d.ts +248 -0
  27. package/dist/adapters/electron/ipc/types.d.ts.map +1 -0
  28. package/dist/adapters/electron/ipc/types.js +8 -0
  29. package/dist/adapters/electron/ipc/types.js.map +1 -0
  30. package/dist/adapters/electron/migration/autoMigrator.d.ts +184 -0
  31. package/dist/adapters/electron/migration/autoMigrator.d.ts.map +1 -0
  32. package/dist/adapters/electron/migration/autoMigrator.js +478 -0
  33. package/dist/adapters/electron/migration/autoMigrator.js.map +1 -0
  34. package/dist/adapters/electron/migration/index.d.ts +9 -0
  35. package/dist/adapters/electron/migration/index.d.ts.map +1 -0
  36. package/dist/adapters/electron/migration/index.js +9 -0
  37. package/dist/adapters/electron/migration/index.js.map +1 -0
  38. package/dist/adapters/electron/preload.d.ts +126 -0
  39. package/dist/adapters/electron/preload.d.ts.map +1 -0
  40. package/dist/adapters/electron/preload.js +254 -0
  41. package/dist/adapters/electron/preload.js.map +1 -0
  42. package/dist/adapters/electron/recovery/corruptionDetector.d.ts +214 -0
  43. package/dist/adapters/electron/recovery/corruptionDetector.d.ts.map +1 -0
  44. package/dist/adapters/electron/recovery/corruptionDetector.js +410 -0
  45. package/dist/adapters/electron/recovery/corruptionDetector.js.map +1 -0
  46. package/dist/adapters/electron/recovery/index.d.ts +11 -0
  47. package/dist/adapters/electron/recovery/index.d.ts.map +1 -0
  48. package/dist/adapters/electron/recovery/index.js +11 -0
  49. package/dist/adapters/electron/recovery/index.js.map +1 -0
  50. package/dist/adapters/electron/recovery/walCheckpoint.d.ts +186 -0
  51. package/dist/adapters/electron/recovery/walCheckpoint.d.ts.map +1 -0
  52. package/dist/adapters/electron/recovery/walCheckpoint.js +302 -0
  53. package/dist/adapters/electron/recovery/walCheckpoint.js.map +1 -0
  54. package/dist/adapters/electron/window/index.d.ts +9 -0
  55. package/dist/adapters/electron/window/index.d.ts.map +1 -0
  56. package/dist/adapters/electron/window/index.js +9 -0
  57. package/dist/adapters/electron/window/index.js.map +1 -0
  58. package/dist/adapters/electron/window/windowManager.d.ts +190 -0
  59. package/dist/adapters/electron/window/windowManager.d.ts.map +1 -0
  60. package/dist/adapters/electron/window/windowManager.js +358 -0
  61. package/dist/adapters/electron/window/windowManager.js.map +1 -0
  62. package/dist/core/contracts/context.d.ts +2 -2
  63. package/dist/core/contracts/context.d.ts.map +1 -1
  64. package/dist/core/database.d.ts +19 -0
  65. package/dist/core/database.d.ts.map +1 -1
  66. package/dist/core/database.js +4 -0
  67. package/dist/core/database.js.map +1 -1
  68. package/dist/core/resolver.d.ts +3 -0
  69. package/dist/core/resolver.d.ts.map +1 -1
  70. package/dist/core/resolver.js +39 -3
  71. package/dist/core/resolver.js.map +1 -1
  72. package/dist/features/sync/conflicts/conflictResolver.d.ts +222 -0
  73. package/dist/features/sync/conflicts/conflictResolver.d.ts.map +1 -0
  74. package/dist/features/sync/conflicts/conflictResolver.js +396 -0
  75. package/dist/features/sync/conflicts/conflictResolver.js.map +1 -0
  76. package/dist/features/sync/conflicts/index.d.ts +9 -0
  77. package/dist/features/sync/conflicts/index.d.ts.map +1 -0
  78. package/dist/features/sync/conflicts/index.js +9 -0
  79. package/dist/features/sync/conflicts/index.js.map +1 -0
  80. package/dist/features/sync/crossPlatformSync.d.ts +281 -0
  81. package/dist/features/sync/crossPlatformSync.d.ts.map +1 -0
  82. package/dist/features/sync/crossPlatformSync.js +623 -0
  83. package/dist/features/sync/crossPlatformSync.js.map +1 -0
  84. package/dist/features/sync/devices/deviceManager.d.ts +243 -0
  85. package/dist/features/sync/devices/deviceManager.d.ts.map +1 -0
  86. package/dist/features/sync/devices/deviceManager.js +494 -0
  87. package/dist/features/sync/devices/deviceManager.js.map +1 -0
  88. package/dist/features/sync/devices/index.d.ts +10 -0
  89. package/dist/features/sync/devices/index.d.ts.map +1 -0
  90. package/dist/features/sync/devices/index.js +10 -0
  91. package/dist/features/sync/devices/index.js.map +1 -0
  92. package/dist/features/sync/index.d.ts +37 -0
  93. package/dist/features/sync/index.d.ts.map +1 -0
  94. package/dist/features/sync/index.js +47 -0
  95. package/dist/features/sync/index.js.map +1 -0
  96. package/dist/features/sync/protocol/index.d.ts +11 -0
  97. package/dist/features/sync/protocol/index.d.ts.map +1 -0
  98. package/dist/features/sync/protocol/index.js +11 -0
  99. package/dist/features/sync/protocol/index.js.map +1 -0
  100. package/dist/features/sync/protocol/messages.d.ts +348 -0
  101. package/dist/features/sync/protocol/messages.d.ts.map +1 -0
  102. package/dist/features/sync/protocol/messages.js +216 -0
  103. package/dist/features/sync/protocol/messages.js.map +1 -0
  104. package/dist/features/sync/protocol/vectorClock.d.ts +164 -0
  105. package/dist/features/sync/protocol/vectorClock.d.ts.map +1 -0
  106. package/dist/features/sync/protocol/vectorClock.js +286 -0
  107. package/dist/features/sync/protocol/vectorClock.js.map +1 -0
  108. package/dist/features/sync/tables/index.d.ts +10 -0
  109. package/dist/features/sync/tables/index.d.ts.map +1 -0
  110. package/dist/features/sync/tables/index.js +10 -0
  111. package/dist/features/sync/tables/index.js.map +1 -0
  112. package/dist/features/sync/tables/syncLogManager.d.ts +216 -0
  113. package/dist/features/sync/tables/syncLogManager.d.ts.map +1 -0
  114. package/dist/features/sync/tables/syncLogManager.js +456 -0
  115. package/dist/features/sync/tables/syncLogManager.js.map +1 -0
  116. package/dist/features/sync/transport/httpTransport.d.ts +123 -0
  117. package/dist/features/sync/transport/httpTransport.d.ts.map +1 -0
  118. package/dist/features/sync/transport/httpTransport.js +380 -0
  119. package/dist/features/sync/transport/httpTransport.js.map +1 -0
  120. package/dist/features/sync/transport/index.d.ts +12 -0
  121. package/dist/features/sync/transport/index.d.ts.map +1 -0
  122. package/dist/features/sync/transport/index.js +12 -0
  123. package/dist/features/sync/transport/index.js.map +1 -0
  124. package/dist/features/sync/transport/transport.d.ts +259 -0
  125. package/dist/features/sync/transport/transport.d.ts.map +1 -0
  126. package/dist/features/sync/transport/transport.js +153 -0
  127. package/dist/features/sync/transport/transport.js.map +1 -0
  128. package/dist/features/sync/transport/websocketTransport.d.ts +126 -0
  129. package/dist/features/sync/transport/websocketTransport.d.ts.map +1 -0
  130. package/dist/features/sync/transport/websocketTransport.js +374 -0
  131. package/dist/features/sync/transport/websocketTransport.js.map +1 -0
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +6 -0
  134. package/dist/index.js.map +1 -1
  135. package/package.json +21 -1
@@ -0,0 +1,302 @@
1
+ /**
2
+ * WAL (Write-Ahead Logging) Checkpoint Manager.
3
+ *
4
+ * Manages SQLite WAL checkpointing for optimal performance and
5
+ * data durability. Handles automatic and manual checkpointing
6
+ * with configurable strategies.
7
+ *
8
+ * ## WAL Mode Benefits
9
+ * - Better concurrency (readers don't block writers)
10
+ * - Faster write performance
11
+ * - Atomic commits
12
+ *
13
+ * ## Checkpoint Strategies
14
+ * - PASSIVE: Non-blocking, best for background checkpointing
15
+ * - FULL: Blocks until complete, ensures WAL is cleared
16
+ * - RESTART: Blocks and restarts WAL, minimizes WAL growth
17
+ * - TRUNCATE: Most aggressive, truncates WAL file
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const manager = new WalCheckpointManager(adapter, {
22
+ * checkpointInterval: 300000,
23
+ * strategy: 'PASSIVE',
24
+ * maxWalSize: 50 * 1024 * 1024, // 50MB
25
+ * });
26
+ *
27
+ * await manager.start();
28
+ * ```
29
+ */
30
+ // ============================================================================
31
+ // Default Configuration
32
+ // ============================================================================
33
+ const DEFAULT_CONFIG = {
34
+ checkpointInterval: 300000, // 5 minutes
35
+ strategy: 'PASSIVE',
36
+ maxWalSize: 50 * 1024 * 1024, // 50MB
37
+ pageSize: 4096,
38
+ autoCheckpointPages: 1000,
39
+ synchronous: 'NORMAL',
40
+ verbose: false,
41
+ };
42
+ // ============================================================================
43
+ // WAL Checkpoint Manager
44
+ // ============================================================================
45
+ /**
46
+ * WAL Checkpoint Manager.
47
+ *
48
+ * Manages automatic and manual WAL checkpointing for SQLite databases.
49
+ * Ensures optimal performance and data durability.
50
+ */
51
+ export class WalCheckpointManager {
52
+ constructor(adapter, config = {}) {
53
+ this.adapter = adapter;
54
+ this.checkpointTimer = null;
55
+ this.lastCheckpoint = null;
56
+ this.totalCheckpoints = 0;
57
+ this.isRunning = false;
58
+ this.config = { ...DEFAULT_CONFIG, ...config };
59
+ }
60
+ // ============================================================================
61
+ // Lifecycle Methods
62
+ // ============================================================================
63
+ /**
64
+ * Start the checkpoint manager.
65
+ */
66
+ async start() {
67
+ if (this.isRunning) {
68
+ this.log('Already running');
69
+ return;
70
+ }
71
+ // Configure WAL mode
72
+ await this.configureWalMode();
73
+ // Start periodic checkpointing
74
+ this.startCheckpointTimer();
75
+ this.isRunning = true;
76
+ this.log('WAL Checkpoint Manager started');
77
+ }
78
+ /**
79
+ * Stop the checkpoint manager.
80
+ */
81
+ async stop() {
82
+ if (!this.isRunning) {
83
+ return;
84
+ }
85
+ // Stop timer
86
+ this.stopCheckpointTimer();
87
+ // Final checkpoint before stopping
88
+ try {
89
+ await this.checkpoint('FULL');
90
+ }
91
+ catch (error) {
92
+ this.log(`Final checkpoint failed: ${error}`);
93
+ }
94
+ this.isRunning = false;
95
+ this.log('WAL Checkpoint Manager stopped');
96
+ }
97
+ // ============================================================================
98
+ // WAL Configuration
99
+ // ============================================================================
100
+ /**
101
+ * Configure WAL mode on the database.
102
+ */
103
+ async configureWalMode() {
104
+ const pragmas = [
105
+ 'PRAGMA journal_mode = WAL',
106
+ `PRAGMA synchronous = ${this.config.synchronous}`,
107
+ `PRAGMA wal_autocheckpoint = ${this.config.autoCheckpointPages}`,
108
+ `PRAGMA page_size = ${this.config.pageSize}`,
109
+ ];
110
+ for (const pragma of pragmas) {
111
+ await this.adapter.exec(pragma);
112
+ }
113
+ this.log('WAL mode configured');
114
+ }
115
+ /**
116
+ * Disable WAL mode and switch back to DELETE journal mode.
117
+ */
118
+ async disableWalMode() {
119
+ // First, checkpoint everything
120
+ await this.checkpoint('TRUNCATE');
121
+ // Switch to DELETE mode
122
+ await this.adapter.exec('PRAGMA journal_mode = DELETE');
123
+ this.log('WAL mode disabled');
124
+ }
125
+ // ============================================================================
126
+ // Checkpoint Operations
127
+ // ============================================================================
128
+ /**
129
+ * Perform a WAL checkpoint.
130
+ *
131
+ * @param strategy - Checkpoint strategy (defaults to config strategy)
132
+ * @returns Checkpoint result
133
+ */
134
+ async checkpoint(strategy) {
135
+ const effectiveStrategy = strategy ?? this.config.strategy;
136
+ const startTime = Date.now();
137
+ try {
138
+ // Get WAL status before checkpoint
139
+ const walBefore = await this.getWalFrameCount();
140
+ // Execute checkpoint
141
+ const result = await this.adapter.get(`PRAGMA wal_checkpoint(${effectiveStrategy})`);
142
+ // Get WAL status after checkpoint
143
+ const walAfter = await this.getWalFrameCount();
144
+ const checkpointResult = {
145
+ success: true,
146
+ strategy: effectiveStrategy,
147
+ walFramesBefore: walBefore,
148
+ walFramesAfter: walAfter,
149
+ framesCheckpointed: result?.checkpointed ?? 0,
150
+ busyFrames: result?.busy ?? 0,
151
+ durationMs: Date.now() - startTime,
152
+ timestamp: Date.now(),
153
+ };
154
+ this.lastCheckpoint = Date.now();
155
+ this.totalCheckpoints++;
156
+ this.log(`Checkpoint completed: ${checkpointResult.framesCheckpointed} frames ` +
157
+ `(${effectiveStrategy}, ${checkpointResult.durationMs}ms)`);
158
+ return checkpointResult;
159
+ }
160
+ catch (error) {
161
+ const errorMessage = error instanceof Error ? error.message : String(error);
162
+ this.log(`Checkpoint failed: ${errorMessage}`);
163
+ return {
164
+ success: false,
165
+ strategy: effectiveStrategy,
166
+ walFramesBefore: 0,
167
+ walFramesAfter: 0,
168
+ framesCheckpointed: 0,
169
+ busyFrames: 0,
170
+ durationMs: Date.now() - startTime,
171
+ timestamp: Date.now(),
172
+ error: errorMessage,
173
+ };
174
+ }
175
+ }
176
+ /**
177
+ * Force a full checkpoint that clears the WAL.
178
+ */
179
+ async forceFullCheckpoint() {
180
+ return this.checkpoint('TRUNCATE');
181
+ }
182
+ // ============================================================================
183
+ // Timer Management
184
+ // ============================================================================
185
+ /**
186
+ * Start the automatic checkpoint timer.
187
+ */
188
+ startCheckpointTimer() {
189
+ if (this.checkpointTimer) {
190
+ clearInterval(this.checkpointTimer);
191
+ }
192
+ this.checkpointTimer = setInterval(async () => {
193
+ try {
194
+ // Check if WAL has grown too large
195
+ const walSize = await this.getWalSize();
196
+ const strategy = walSize > this.config.maxWalSize ? 'FULL' : this.config.strategy;
197
+ await this.checkpoint(strategy);
198
+ }
199
+ catch (error) {
200
+ this.log(`Periodic checkpoint failed: ${error}`);
201
+ }
202
+ }, this.config.checkpointInterval);
203
+ }
204
+ /**
205
+ * Stop the automatic checkpoint timer.
206
+ */
207
+ stopCheckpointTimer() {
208
+ if (this.checkpointTimer) {
209
+ clearInterval(this.checkpointTimer);
210
+ this.checkpointTimer = null;
211
+ }
212
+ }
213
+ // ============================================================================
214
+ // Status & Monitoring
215
+ // ============================================================================
216
+ /**
217
+ * Get current WAL status.
218
+ */
219
+ async getStatus() {
220
+ const journalMode = await this.adapter.get('PRAGMA journal_mode');
221
+ const walFrames = await this.getWalFrameCount();
222
+ const autoCheckpoint = await this.adapter.get('PRAGMA wal_autocheckpoint');
223
+ return {
224
+ enabled: journalMode?.journal_mode?.toLowerCase() === 'wal',
225
+ walSize: walFrames * this.config.pageSize,
226
+ walPages: walFrames,
227
+ lastCheckpoint: this.lastCheckpoint,
228
+ totalCheckpoints: this.totalCheckpoints,
229
+ autoCheckpointThreshold: autoCheckpoint?.wal_autocheckpoint ?? this.config.autoCheckpointPages,
230
+ };
231
+ }
232
+ /**
233
+ * Get current WAL size in bytes.
234
+ */
235
+ async getWalSize() {
236
+ const frames = await this.getWalFrameCount();
237
+ return frames * this.config.pageSize;
238
+ }
239
+ /**
240
+ * Get current WAL frame count.
241
+ */
242
+ async getWalFrameCount() {
243
+ // PRAGMA wal_checkpoint returns (busy, log, checkpointed)
244
+ // log is the total number of frames in the WAL file
245
+ const result = await this.adapter.get('PRAGMA wal_checkpoint(PASSIVE)');
246
+ return result?.log ?? 0;
247
+ }
248
+ /**
249
+ * Check if WAL mode is currently enabled.
250
+ */
251
+ async isWalEnabled() {
252
+ const result = await this.adapter.get('PRAGMA journal_mode');
253
+ return result?.journal_mode?.toLowerCase() === 'wal';
254
+ }
255
+ // ============================================================================
256
+ // Utilities
257
+ // ============================================================================
258
+ /**
259
+ * Get checkpoint statistics.
260
+ */
261
+ getStats() {
262
+ return {
263
+ totalCheckpoints: this.totalCheckpoints,
264
+ lastCheckpoint: this.lastCheckpoint,
265
+ isRunning: this.isRunning,
266
+ checkpointInterval: this.config.checkpointInterval,
267
+ strategy: this.config.strategy,
268
+ };
269
+ }
270
+ /**
271
+ * Update checkpoint configuration at runtime.
272
+ */
273
+ updateConfig(newConfig) {
274
+ Object.assign(this.config, newConfig);
275
+ // Restart timer if interval changed and running
276
+ if (this.isRunning && newConfig.checkpointInterval !== undefined) {
277
+ this.startCheckpointTimer();
278
+ }
279
+ }
280
+ /**
281
+ * Log a message if verbose mode is enabled.
282
+ */
283
+ log(message) {
284
+ if (this.config.verbose) {
285
+ console.log(`[WalCheckpointManager] ${message}`);
286
+ }
287
+ }
288
+ }
289
+ // ============================================================================
290
+ // Factory Function
291
+ // ============================================================================
292
+ /**
293
+ * Create a WAL Checkpoint Manager.
294
+ *
295
+ * @param adapter - Storage adapter to manage
296
+ * @param config - Checkpoint configuration
297
+ * @returns WalCheckpointManager instance
298
+ */
299
+ export function createWalCheckpointManager(adapter, config = {}) {
300
+ return new WalCheckpointManager(adapter, config);
301
+ }
302
+ //# sourceMappingURL=walCheckpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walCheckpoint.js","sourceRoot":"","sources":["../../../../src/adapters/electron/recovery/walCheckpoint.ts"],"names":[],"mappings":"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"}
@@ -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';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapters/electron/window/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC"}
@@ -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, } from './windowManager.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapters/electron/window/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,aAAa,EACb,mBAAmB,GAIpB,MAAM,iBAAiB,CAAC"}
@@ -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';
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windowManager.d.ts","sourceRoot":"","sources":["../../../../src/adapters/electron/window/windowManager.ts"],"names":[],"mappings":"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"}