@framers/sql-storage-adapter 0.7.2 → 0.7.4

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 (194) hide show
  1. package/README.md +41 -0
  2. package/dist/adapters/electron/preload.cjs +289 -0
  3. package/dist/adapters/electron/renderer.d.ts +9 -0
  4. package/dist/adapters/electron/renderer.d.ts.map +1 -0
  5. package/dist/adapters/electron/renderer.js +8 -0
  6. package/dist/adapters/electron/renderer.js.map +1 -0
  7. package/dist/cjs/adapters/__tests__/indexedDbAdapter.spec.d.ts +2 -0
  8. package/dist/cjs/adapters/__tests__/indexedDbAdapter.spec.js +133 -0
  9. package/dist/cjs/adapters/baseStorageAdapter.d.ts +368 -0
  10. package/dist/cjs/adapters/baseStorageAdapter.js +744 -0
  11. package/dist/cjs/adapters/betterSqliteAdapter.d.ts +124 -0
  12. package/dist/cjs/adapters/betterSqliteAdapter.js +334 -0
  13. package/dist/cjs/adapters/capacitorSqliteAdapter.d.ts +83 -0
  14. package/dist/cjs/adapters/capacitorSqliteAdapter.js +250 -0
  15. package/dist/cjs/adapters/electron/electronMainAdapter.d.ts +251 -0
  16. package/dist/cjs/adapters/electron/electronMainAdapter.js +392 -0
  17. package/dist/cjs/adapters/electron/electronRendererAdapter.d.ts +177 -0
  18. package/dist/cjs/adapters/electron/electronRendererAdapter.js +283 -0
  19. package/dist/cjs/adapters/electron/index.d.ts +74 -0
  20. package/dist/cjs/adapters/electron/index.js +86 -0
  21. package/dist/cjs/adapters/electron/ipc/channels.d.ts +196 -0
  22. package/dist/cjs/adapters/electron/ipc/channels.js +127 -0
  23. package/dist/cjs/adapters/electron/ipc/index.d.ts +11 -0
  24. package/dist/cjs/adapters/electron/ipc/index.js +38 -0
  25. package/dist/cjs/adapters/electron/ipc/protocol.d.ts +78 -0
  26. package/dist/cjs/adapters/electron/ipc/protocol.js +341 -0
  27. package/dist/cjs/adapters/electron/ipc/types.d.ts +248 -0
  28. package/dist/cjs/adapters/electron/ipc/types.js +15 -0
  29. package/dist/cjs/adapters/electron/migration/autoMigrator.d.ts +184 -0
  30. package/dist/cjs/adapters/electron/migration/autoMigrator.js +441 -0
  31. package/dist/cjs/adapters/electron/migration/index.d.ts +9 -0
  32. package/dist/cjs/adapters/electron/migration/index.js +29 -0
  33. package/dist/cjs/adapters/electron/preload.d.ts +126 -0
  34. package/dist/cjs/adapters/electron/preload.js +233 -0
  35. package/dist/cjs/adapters/electron/recovery/corruptionDetector.d.ts +214 -0
  36. package/dist/cjs/adapters/electron/recovery/corruptionDetector.js +359 -0
  37. package/dist/cjs/adapters/electron/recovery/index.d.ts +11 -0
  38. package/dist/cjs/adapters/electron/recovery/index.js +34 -0
  39. package/dist/cjs/adapters/electron/recovery/walCheckpoint.d.ts +186 -0
  40. package/dist/cjs/adapters/electron/recovery/walCheckpoint.js +263 -0
  41. package/dist/cjs/adapters/electron/renderer.d.ts +9 -0
  42. package/dist/cjs/adapters/electron/renderer.js +33 -0
  43. package/dist/cjs/adapters/electron/window/index.d.ts +9 -0
  44. package/dist/cjs/adapters/electron/window/index.js +29 -0
  45. package/dist/cjs/adapters/electron/window/windowManager.d.ts +190 -0
  46. package/dist/cjs/adapters/electron/window/windowManager.js +321 -0
  47. package/dist/cjs/adapters/indexedDbAdapter.d.ts +490 -0
  48. package/dist/cjs/adapters/indexedDbAdapter.js +993 -0
  49. package/dist/cjs/adapters/postgresAdapter.d.ts +424 -0
  50. package/dist/cjs/adapters/postgresAdapter.js +889 -0
  51. package/dist/cjs/adapters/sqlJsAdapter.d.ts +64 -0
  52. package/dist/cjs/adapters/sqlJsAdapter.js +268 -0
  53. package/dist/cjs/adapters/supabase.d.ts +58 -0
  54. package/dist/cjs/adapters/supabase.js +401 -0
  55. package/dist/cjs/codecs/BrowserBlobCodec.d.ts +14 -0
  56. package/dist/cjs/codecs/BrowserBlobCodec.js +57 -0
  57. package/dist/cjs/codecs/NodeBlobCodec.d.ts +14 -0
  58. package/dist/cjs/codecs/NodeBlobCodec.js +59 -0
  59. package/dist/cjs/core/contracts/blobCodec.d.ts +15 -0
  60. package/dist/cjs/core/contracts/blobCodec.js +15 -0
  61. package/dist/cjs/core/contracts/context.d.ts +221 -0
  62. package/dist/cjs/core/contracts/context.js +15 -0
  63. package/dist/cjs/core/contracts/dialect.d.ts +154 -0
  64. package/dist/cjs/core/contracts/dialect.js +15 -0
  65. package/dist/cjs/core/contracts/events.d.ts +225 -0
  66. package/dist/cjs/core/contracts/events.js +15 -0
  67. package/dist/cjs/core/contracts/exporter.d.ts +13 -0
  68. package/dist/cjs/core/contracts/exporter.js +15 -0
  69. package/dist/cjs/core/contracts/extensions.d.ts +73 -0
  70. package/dist/cjs/core/contracts/extensions.js +15 -0
  71. package/dist/cjs/core/contracts/features.d.ts +25 -0
  72. package/dist/cjs/core/contracts/features.js +61 -0
  73. package/dist/cjs/core/contracts/fts.d.ts +66 -0
  74. package/dist/cjs/core/contracts/fts.js +15 -0
  75. package/dist/cjs/core/contracts/hooks.d.ts +481 -0
  76. package/dist/cjs/core/contracts/hooks.js +140 -0
  77. package/dist/cjs/core/contracts/index.d.ts +260 -0
  78. package/dist/cjs/core/contracts/index.js +41 -0
  79. package/dist/cjs/core/contracts/limitations.d.ts +46 -0
  80. package/dist/cjs/core/contracts/limitations.js +218 -0
  81. package/dist/cjs/core/contracts/performance.d.ts +308 -0
  82. package/dist/cjs/core/contracts/performance.js +144 -0
  83. package/dist/cjs/core/database.d.ts +220 -0
  84. package/dist/cjs/core/database.js +136 -0
  85. package/dist/cjs/core/portable.d.ts +24 -0
  86. package/dist/cjs/core/portable.js +68 -0
  87. package/dist/cjs/core/resolver.d.ts +77 -0
  88. package/dist/cjs/core/resolver.js +235 -0
  89. package/dist/cjs/dialects/PostgresDialect.d.ts +35 -0
  90. package/dist/cjs/dialects/PostgresDialect.js +143 -0
  91. package/dist/cjs/dialects/SqliteDialect.d.ts +35 -0
  92. package/dist/cjs/dialects/SqliteDialect.js +142 -0
  93. package/dist/cjs/dialects/shared.d.ts +17 -0
  94. package/dist/cjs/dialects/shared.js +90 -0
  95. package/dist/cjs/exporters/PostgresExporter.d.ts +14 -0
  96. package/dist/cjs/exporters/PostgresExporter.js +61 -0
  97. package/dist/cjs/exporters/SqliteFileExporter.d.ts +16 -0
  98. package/dist/cjs/exporters/SqliteFileExporter.js +43 -0
  99. package/dist/cjs/features/auth/authJsAdapter.d.ts +110 -0
  100. package/dist/cjs/features/auth/authJsAdapter.js +251 -0
  101. package/dist/cjs/features/backup/cloudBackup.d.ts +219 -0
  102. package/dist/cjs/features/backup/cloudBackup.js +209 -0
  103. package/dist/cjs/features/kv/idb.d.ts +79 -0
  104. package/dist/cjs/features/kv/idb.js +32 -0
  105. package/dist/cjs/features/kv/index.d.ts +14 -0
  106. package/dist/cjs/features/kv/index.js +40 -0
  107. package/dist/cjs/features/kv/indexedDbKeyValueStore.d.ts +77 -0
  108. package/dist/cjs/features/kv/indexedDbKeyValueStore.js +116 -0
  109. package/dist/cjs/features/kv/keyValueStore.d.ts +48 -0
  110. package/dist/cjs/features/kv/keyValueStore.js +67 -0
  111. package/dist/cjs/features/kv/sqlKeyValueStore.d.ts +34 -0
  112. package/dist/cjs/features/kv/sqlKeyValueStore.js +81 -0
  113. package/dist/cjs/features/kv/valueCodec.d.ts +35 -0
  114. package/dist/cjs/features/kv/valueCodec.js +426 -0
  115. package/dist/cjs/features/migrations/dataExport.d.ts +77 -0
  116. package/dist/cjs/features/migrations/dataExport.js +194 -0
  117. package/dist/cjs/features/migrations/dataImport.d.ts +54 -0
  118. package/dist/cjs/features/migrations/dataImport.js +300 -0
  119. package/dist/cjs/features/migrations/migration.d.ts +89 -0
  120. package/dist/cjs/features/migrations/migration.js +187 -0
  121. package/dist/cjs/features/migrations/schemaMigrations.d.ts +93 -0
  122. package/dist/cjs/features/migrations/schemaMigrations.js +220 -0
  123. package/dist/cjs/features/sync/conflicts/conflictResolver.d.ts +222 -0
  124. package/dist/cjs/features/sync/conflicts/conflictResolver.js +366 -0
  125. package/dist/cjs/features/sync/conflicts/index.d.ts +9 -0
  126. package/dist/cjs/features/sync/conflicts/index.js +21 -0
  127. package/dist/cjs/features/sync/crossPlatformSync.d.ts +281 -0
  128. package/dist/cjs/features/sync/crossPlatformSync.js +551 -0
  129. package/dist/cjs/features/sync/devices/deviceManager.d.ts +243 -0
  130. package/dist/cjs/features/sync/devices/deviceManager.js +450 -0
  131. package/dist/cjs/features/sync/devices/index.d.ts +10 -0
  132. package/dist/cjs/features/sync/devices/index.js +21 -0
  133. package/dist/cjs/features/sync/index.d.ts +37 -0
  134. package/dist/cjs/features/sync/index.js +111 -0
  135. package/dist/cjs/features/sync/protocol/index.d.ts +11 -0
  136. package/dist/cjs/features/sync/protocol/index.js +23 -0
  137. package/dist/cjs/features/sync/protocol/messages.d.ts +348 -0
  138. package/dist/cjs/features/sync/protocol/messages.js +215 -0
  139. package/dist/cjs/features/sync/protocol/vectorClock.d.ts +164 -0
  140. package/dist/cjs/features/sync/protocol/vectorClock.js +256 -0
  141. package/dist/cjs/features/sync/syncManager.d.ts +348 -0
  142. package/dist/cjs/features/sync/syncManager.js +455 -0
  143. package/dist/cjs/features/sync/tables/index.d.ts +10 -0
  144. package/dist/cjs/features/sync/tables/index.js +21 -0
  145. package/dist/cjs/features/sync/tables/syncLogManager.d.ts +216 -0
  146. package/dist/cjs/features/sync/tables/syncLogManager.js +423 -0
  147. package/dist/cjs/features/sync/transport/httpTransport.d.ts +123 -0
  148. package/dist/cjs/features/sync/transport/httpTransport.js +346 -0
  149. package/dist/cjs/features/sync/transport/index.d.ts +12 -0
  150. package/dist/cjs/features/sync/transport/index.js +25 -0
  151. package/dist/cjs/features/sync/transport/transport.d.ts +259 -0
  152. package/dist/cjs/features/sync/transport/transport.js +163 -0
  153. package/dist/cjs/features/sync/transport/websocketTransport.d.ts +126 -0
  154. package/dist/cjs/features/sync/transport/websocketTransport.js +342 -0
  155. package/dist/cjs/fts/PostgresFts.d.ts +29 -0
  156. package/dist/cjs/fts/PostgresFts.js +77 -0
  157. package/dist/cjs/fts/SqliteFts5.d.ts +22 -0
  158. package/dist/cjs/fts/SqliteFts5.js +58 -0
  159. package/dist/cjs/index.d.ts +31 -0
  160. package/dist/cjs/index.js +103 -0
  161. package/dist/cjs/package.json +3 -0
  162. package/dist/cjs/shared/connectionGate.d.ts +94 -0
  163. package/dist/cjs/shared/connectionGate.js +77 -0
  164. package/dist/cjs/shared/errors.d.ts +23 -0
  165. package/dist/cjs/shared/errors.js +45 -0
  166. package/dist/cjs/shared/logger.d.ts +26 -0
  167. package/dist/cjs/shared/logger.js +40 -0
  168. package/dist/cjs/shared/parameterUtils.d.ts +16 -0
  169. package/dist/cjs/shared/parameterUtils.js +59 -0
  170. package/dist/cjs/shared/postgresTarget.d.ts +11 -0
  171. package/dist/cjs/shared/postgresTarget.js +30 -0
  172. package/dist/cjs/shared/segment.d.ts +43 -0
  173. package/dist/cjs/shared/segment.js +63 -0
  174. package/dist/cjs/shared/serializedTransaction.d.ts +14 -0
  175. package/dist/cjs/shared/serializedTransaction.js +74 -0
  176. package/dist/cjs/shared/splitSqlStatements.d.ts +27 -0
  177. package/dist/cjs/shared/splitSqlStatements.js +163 -0
  178. package/dist/cjs/shared/sqlPlaceholders.d.ts +48 -0
  179. package/dist/cjs/shared/sqlPlaceholders.js +263 -0
  180. package/dist/cjs/types/index.d.ts +29 -0
  181. package/dist/cjs/types/index.js +33 -0
  182. package/dist/core/portable.d.ts +24 -0
  183. package/dist/core/portable.d.ts.map +1 -0
  184. package/dist/core/portable.js +24 -0
  185. package/dist/core/portable.js.map +1 -0
  186. package/dist/features/auth/authJsAdapter.d.ts +110 -0
  187. package/dist/features/auth/authJsAdapter.d.ts.map +1 -0
  188. package/dist/features/auth/authJsAdapter.js +248 -0
  189. package/dist/features/auth/authJsAdapter.js.map +1 -0
  190. package/dist/index.d.ts +1 -0
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.js +1 -0
  193. package/dist/index.js.map +1 -1
  194. package/package.json +149 -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