@tanstack/electron-db-sqlite-persistence 0.2.9 → 0.2.11

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 CHANGED
@@ -113,7 +113,7 @@ unknown initial route or any leader/term change rejects the direct RPC with
113
113
  wrapper can certify the original transaction ID through the replacement leader
114
114
  and the main-process SQLite adapter. Application-issued mutations still need
115
115
  caller reconciliation. Main and renderer must use matching persistence protocol
116
- v4 peers for this IPC operation. A main-process adapter used by an
116
+ v5 peers for this IPC operation. A main-process adapter used by an
117
117
  `ElectronCollectionCoordinator` must implement `reserveLeadershipTerm` so each
118
118
  election reserves a durable term before publishing a route. An adapter without
119
119
  that capability can still serve single-renderer persistence through
@@ -143,6 +143,14 @@ idempotent.
143
143
  ## Notes
144
144
 
145
145
  - The renderer API mirrors other runtimes: one shared `create...Persistence`.
146
+ - IPC protocol v6 forwards explicit eager or managed storage targets,
147
+ on-demand cache claims, rotation, renewal, release, claim checks on SQLite
148
+ reads and writes, exact transaction-ID
149
+ reconciliation, and claim-scoped leadership-term reservation. Upgrade main
150
+ and renderer together.
151
+ If a custom main-process adapter does not implement these operations, pass
152
+ `managedCacheGenerations: false` to `createElectronSQLitePersistence` to keep
153
+ the full-shape recovery fallback.
146
154
  - Collection mode (`sync-present` vs `sync-absent`) and `schemaVersion` are
147
155
  resolved per collection and forwarded across IPC automatically.
148
156
  - Without an `ElectronCollectionCoordinator`, single-renderer mode uses
package/dist/cjs/main.cjs CHANGED
@@ -49,11 +49,25 @@ function assertValidRequest(request) {
49
49
  );
50
50
  }
51
51
  }
52
+ function requireStorageTarget(request) {
53
+ const target = request.storageTarget;
54
+ if (!target) {
55
+ throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
56
+ `Electron persistence data request requires an explicit storage target`
57
+ );
58
+ }
59
+ if (dbSqlitePersistenceCore.resolvePersistedStorageTarget(target).collectionId !== request.collectionId) {
60
+ throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
61
+ `Electron persistence storage target does not match its collectionId`
62
+ );
63
+ }
64
+ return target;
65
+ }
52
66
  async function executeRequestAgainstAdapter(request, adapter) {
53
67
  switch (request.method) {
54
68
  case `loadSubset`: {
55
69
  const result = await adapter.loadSubset(
56
- request.collectionId,
70
+ requireStorageTarget(request),
57
71
  request.payload.options,
58
72
  request.payload.ctx
59
73
  );
@@ -67,7 +81,7 @@ async function executeRequestAgainstAdapter(request, adapter) {
67
81
  }
68
82
  case `loadResumeSnapshot`: {
69
83
  const result = await adapter.loadResumeSnapshot(
70
- request.collectionId,
84
+ requireStorageTarget(request),
71
85
  request.payload.ctx
72
86
  );
73
87
  return {
@@ -84,7 +98,10 @@ async function executeRequestAgainstAdapter(request, adapter) {
84
98
  `loadCollectionMetadata is not supported by the configured electron persistence adapter`
85
99
  );
86
100
  }
87
- const result = await adapter.loadCollectionMetadata(request.collectionId);
101
+ const result = await adapter.loadCollectionMetadata(
102
+ requireStorageTarget(request),
103
+ request.payload.ctx
104
+ );
88
105
  return {
89
106
  v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
90
107
  requestId: request.requestId,
@@ -100,8 +117,9 @@ async function executeRequestAgainstAdapter(request, adapter) {
100
117
  );
101
118
  }
102
119
  const result = await adapter.scanRows(
103
- request.collectionId,
104
- request.payload.options
120
+ requireStorageTarget(request),
121
+ request.payload.options,
122
+ request.payload.ctx
105
123
  );
106
124
  return {
107
125
  v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
@@ -112,7 +130,10 @@ async function executeRequestAgainstAdapter(request, adapter) {
112
130
  };
113
131
  }
114
132
  case `applyCommittedTx`: {
115
- await adapter.applyCommittedTx(request.collectionId, request.payload.tx);
133
+ await adapter.applyCommittedTx(
134
+ requireStorageTarget(request),
135
+ request.payload.tx
136
+ );
116
137
  return {
117
138
  v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
118
139
  requestId: request.requestId,
@@ -123,7 +144,7 @@ async function executeRequestAgainstAdapter(request, adapter) {
123
144
  }
124
145
  case `reconcileCommittedTx`: {
125
146
  const result = adapter.reconcileCommittedTx ? await adapter.reconcileCommittedTx(
126
- request.collectionId,
147
+ requireStorageTarget(request),
127
148
  request.payload.tx,
128
149
  request.payload.anchor
129
150
  ) : { kind: `unknown` };
@@ -137,9 +158,10 @@ async function executeRequestAgainstAdapter(request, adapter) {
137
158
  }
138
159
  case `ensureIndex`: {
139
160
  await adapter.ensureIndex(
140
- request.collectionId,
161
+ requireStorageTarget(request),
141
162
  request.payload.signature,
142
- request.payload.spec
163
+ request.payload.spec,
164
+ request.payload.ctx
143
165
  );
144
166
  return {
145
167
  v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
@@ -156,8 +178,9 @@ async function executeRequestAgainstAdapter(request, adapter) {
156
178
  );
157
179
  }
158
180
  await adapter.markIndexRemoved(
159
- request.collectionId,
160
- request.payload.signature
181
+ requireStorageTarget(request),
182
+ request.payload.signature,
183
+ request.payload.ctx
161
184
  );
162
185
  return {
163
186
  v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
@@ -174,8 +197,9 @@ async function executeRequestAgainstAdapter(request, adapter) {
174
197
  );
175
198
  }
176
199
  const result = await adapter.pullSince(
177
- request.collectionId,
178
- request.payload.fromRowVersion
200
+ requireStorageTarget(request),
201
+ request.payload.fromRowVersion,
202
+ request.payload.ctx
179
203
  );
180
204
  return {
181
205
  v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
@@ -192,8 +216,9 @@ async function executeRequestAgainstAdapter(request, adapter) {
192
216
  );
193
217
  }
194
218
  const position = await adapter.reserveLeadershipTerm(
195
- request.collectionId,
196
- request.payload.observedTerm
219
+ requireStorageTarget(request),
220
+ request.payload.observedTerm,
221
+ request.payload.ctx
197
222
  );
198
223
  return {
199
224
  v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
@@ -209,7 +234,10 @@ async function executeRequestAgainstAdapter(request, adapter) {
209
234
  `getStreamPosition is not supported by the configured electron persistence adapter`
210
235
  );
211
236
  }
212
- const position = await adapter.getStreamPosition(request.collectionId);
237
+ const position = await adapter.getStreamPosition(
238
+ requireStorageTarget(request),
239
+ request.payload.ctx
240
+ );
213
241
  return {
214
242
  v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
215
243
  requestId: request.requestId,
@@ -218,13 +246,86 @@ async function executeRequestAgainstAdapter(request, adapter) {
218
246
  result: position
219
247
  };
220
248
  }
249
+ case `claimCacheGeneration`: {
250
+ if (!adapter.claimCacheGeneration) {
251
+ throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
252
+ `claimCacheGeneration is not supported by the configured electron persistence adapter`
253
+ );
254
+ }
255
+ const result = await adapter.claimCacheGeneration(request.collectionId);
256
+ return {
257
+ v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
258
+ requestId: request.requestId,
259
+ method: request.method,
260
+ ok: true,
261
+ result
262
+ };
263
+ }
264
+ case `rotateCacheGeneration`: {
265
+ if (!adapter.rotateCacheGeneration) {
266
+ throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
267
+ `rotateCacheGeneration is not supported by the configured electron persistence adapter`
268
+ );
269
+ }
270
+ const result = await adapter.rotateCacheGeneration(
271
+ request.collectionId,
272
+ request.payload.claimId,
273
+ request.payload.resetMetadata,
274
+ request.payload.expectedStorageCollectionId
275
+ );
276
+ return {
277
+ v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
278
+ requestId: request.requestId,
279
+ method: request.method,
280
+ ok: true,
281
+ result
282
+ };
283
+ }
284
+ case `renewCacheGenerationClaim`: {
285
+ if (!adapter.renewCacheGenerationClaim) {
286
+ throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
287
+ `renewCacheGenerationClaim is not supported by the configured electron persistence adapter`
288
+ );
289
+ }
290
+ const result = await adapter.renewCacheGenerationClaim(
291
+ request.payload.storageCollectionId,
292
+ request.payload.claimId
293
+ );
294
+ return {
295
+ v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
296
+ requestId: request.requestId,
297
+ method: request.method,
298
+ ok: true,
299
+ result
300
+ };
301
+ }
302
+ case `releaseCacheGenerationClaim`: {
303
+ if (!adapter.releaseCacheGenerationClaim) {
304
+ throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
305
+ `releaseCacheGenerationClaim is not supported by the configured electron persistence adapter`
306
+ );
307
+ }
308
+ await adapter.releaseCacheGenerationClaim(request.payload.claimId);
309
+ return {
310
+ v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
311
+ requestId: request.requestId,
312
+ method: request.method,
313
+ ok: true,
314
+ result: null
315
+ };
316
+ }
221
317
  }
222
318
  }
223
319
  function resolveModeAwarePersistence(persistence, request) {
320
+ if (request.storageTarget?.kind === `managed` && !request.resolution?.logicalCollectionId) {
321
+ throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
322
+ `Electron managed cache request requires a logical Collection ID`
323
+ );
324
+ }
224
325
  const mode = request.resolution?.mode ?? `sync-absent`;
225
326
  const schemaVersion = request.resolution?.schemaVersion;
226
327
  const collectionAwarePersistence = persistence.resolvePersistenceForCollection?.({
227
- collectionId: request.collectionId,
328
+ collectionId: request.resolution?.logicalCollectionId ?? request.collectionId,
228
329
  mode,
229
330
  schemaVersion
230
331
  });
@@ -1 +1 @@
1
- {"version":3,"file":"main.cjs","sources":["../../src/main.ts"],"sourcesContent":["import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core'\nimport {\n DEFAULT_ELECTRON_PERSISTENCE_CHANNEL,\n ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n} from './protocol'\nimport type {\n PersistedCollectionPersistence,\n PersistenceAdapter,\n SQLitePullSinceResult,\n} from '@tanstack/db-sqlite-persistence-core'\nimport type {\n ElectronPersistedKey,\n ElectronPersistedRow,\n ElectronPersistenceRequestEnvelope,\n ElectronPersistenceResponseEnvelope,\n ElectronSerializedError,\n} from './protocol'\n\ntype ElectronMainPersistenceAdapter = PersistenceAdapter & {\n loadCollectionMetadata?: (\n collectionId: string,\n ) => Promise<Array<{ key: string; value: unknown }>>\n scanRows?: (\n collectionId: string,\n options?: { metadataOnly?: boolean },\n ) => Promise<\n Array<{\n key: ElectronPersistedKey\n value: ElectronPersistedRow\n metadata?: unknown\n }>\n >\n pullSince?: (\n collectionId: string,\n fromRowVersion: number,\n ) => Promise<SQLitePullSinceResult<ElectronPersistedKey>>\n getStreamPosition?: (collectionId: string) => Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }>\n}\n\nfunction serializeError(error: unknown): ElectronSerializedError {\n const fallbackMessage = `Unknown electron persistence error`\n\n if (!(error instanceof Error)) {\n return {\n name: `Error`,\n message: fallbackMessage,\n code: undefined,\n }\n }\n\n const detailedError = error as Error & { code?: unknown; path?: unknown }\n const path = detailedError.path\n return {\n name: error.name || `Error`,\n message: error.message || fallbackMessage,\n stack: error.stack,\n code:\n typeof detailedError.code === `string` ||\n typeof detailedError.code === `number`\n ? detailedError.code\n : undefined,\n path:\n typeof path === `string` ||\n (Array.isArray(path) &&\n path.every(\n (segment: unknown) =>\n typeof segment === `string` || typeof segment === `number`,\n ))\n ? (path as string | ReadonlyArray<string | number>)\n : undefined,\n }\n}\n\nfunction createErrorResponse(\n request: ElectronPersistenceRequestEnvelope,\n error: unknown,\n): ElectronPersistenceResponseEnvelope {\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: false,\n error: serializeError(error),\n }\n}\n\nfunction assertValidRequest(request: ElectronPersistenceRequestEnvelope): void {\n if (request.v !== ELECTRON_PERSISTENCE_PROTOCOL_VERSION) {\n throw new InvalidPersistedCollectionConfigError(\n `Unsupported electron persistence protocol version \"${request.v}\"`,\n )\n }\n\n if (\n typeof request.requestId !== `string` ||\n request.requestId.trim().length === 0\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `Electron persistence requestId cannot be empty`,\n )\n }\n\n if (\n typeof request.collectionId !== `string` ||\n request.collectionId.trim().length === 0\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `Electron persistence collectionId cannot be empty`,\n )\n }\n}\n\nasync function executeRequestAgainstAdapter(\n request: ElectronPersistenceRequestEnvelope,\n adapter: ElectronMainPersistenceAdapter,\n): Promise<ElectronPersistenceResponseEnvelope> {\n switch (request.method) {\n case `loadSubset`: {\n const result = await adapter.loadSubset(\n request.collectionId,\n request.payload.options,\n request.payload.ctx,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `loadResumeSnapshot`: {\n const result = await adapter.loadResumeSnapshot(\n request.collectionId,\n request.payload.ctx,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `loadCollectionMetadata`: {\n if (!adapter.loadCollectionMetadata) {\n throw new InvalidPersistedCollectionConfigError(\n `loadCollectionMetadata is not supported by the configured electron persistence adapter`,\n )\n }\n const result = await adapter.loadCollectionMetadata(request.collectionId)\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `scanRows`: {\n if (!adapter.scanRows) {\n throw new InvalidPersistedCollectionConfigError(\n `scanRows is not supported by the configured electron persistence adapter`,\n )\n }\n const result = await adapter.scanRows(\n request.collectionId,\n request.payload.options,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `applyCommittedTx`: {\n await adapter.applyCommittedTx(request.collectionId, request.payload.tx)\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result: null,\n }\n }\n\n case `reconcileCommittedTx`: {\n const result = adapter.reconcileCommittedTx\n ? await adapter.reconcileCommittedTx(\n request.collectionId,\n request.payload.tx,\n request.payload.anchor,\n )\n : { kind: `unknown` as const }\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `ensureIndex`: {\n await adapter.ensureIndex(\n request.collectionId,\n request.payload.signature,\n request.payload.spec,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result: null,\n }\n }\n\n case `markIndexRemoved`: {\n if (!adapter.markIndexRemoved) {\n throw new InvalidPersistedCollectionConfigError(\n `markIndexRemoved is not supported by the configured electron persistence adapter`,\n )\n }\n await adapter.markIndexRemoved(\n request.collectionId,\n request.payload.signature,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result: null,\n }\n }\n\n case `pullSince`: {\n if (!adapter.pullSince) {\n throw new InvalidPersistedCollectionConfigError(\n `pullSince is not supported by the configured electron persistence adapter`,\n )\n }\n const result = await adapter.pullSince(\n request.collectionId,\n request.payload.fromRowVersion,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `reserveLeadershipTerm`: {\n if (!adapter.reserveLeadershipTerm) {\n throw new InvalidPersistedCollectionConfigError(\n `reserveLeadershipTerm is not supported by the configured electron persistence adapter`,\n )\n }\n const position = await adapter.reserveLeadershipTerm(\n request.collectionId,\n request.payload.observedTerm,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result: position,\n }\n }\n\n case `getStreamPosition`: {\n if (!adapter.getStreamPosition) {\n throw new InvalidPersistedCollectionConfigError(\n `getStreamPosition is not supported by the configured electron persistence adapter`,\n )\n }\n const position = await adapter.getStreamPosition(request.collectionId)\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result: position,\n }\n }\n }\n}\n\nfunction resolveModeAwarePersistence(\n persistence: PersistedCollectionPersistence,\n request: ElectronPersistenceRequestEnvelope,\n): PersistedCollectionPersistence {\n const mode = request.resolution?.mode ?? `sync-absent`\n const schemaVersion = request.resolution?.schemaVersion\n const collectionAwarePersistence =\n persistence.resolvePersistenceForCollection?.({\n collectionId: request.collectionId,\n mode,\n schemaVersion,\n })\n if (collectionAwarePersistence) {\n return collectionAwarePersistence\n }\n\n const modeAwarePersistence = persistence.resolvePersistenceForMode?.(mode)\n return modeAwarePersistence ?? persistence\n}\n\nexport type ElectronIpcMainLike = {\n handle: (\n channel: string,\n listener: (\n event: unknown,\n request: ElectronPersistenceRequestEnvelope,\n ) => Promise<ElectronPersistenceResponseEnvelope>,\n ) => void\n removeHandler?: (channel: string) => void\n}\n\nexport type ElectronSQLiteMainProcessOptions = {\n persistence: PersistedCollectionPersistence\n ipcMain: ElectronIpcMainLike\n channel?: string\n}\n\nexport function exposeElectronSQLitePersistence(\n options: ElectronSQLiteMainProcessOptions,\n): () => void {\n const channel = options.channel ?? DEFAULT_ELECTRON_PERSISTENCE_CHANNEL\n options.ipcMain.handle(\n channel,\n async (\n _event,\n request: ElectronPersistenceRequestEnvelope,\n ): Promise<ElectronPersistenceResponseEnvelope> => {\n try {\n assertValidRequest(request)\n const modeAwarePersistence = resolveModeAwarePersistence(\n options.persistence,\n request,\n )\n return await executeRequestAgainstAdapter(\n request,\n modeAwarePersistence.adapter,\n )\n } catch (error) {\n return createErrorResponse(request, error)\n }\n },\n )\n\n return () => {\n options.ipcMain.removeHandler?.(channel)\n }\n}\n"],"names":["ELECTRON_PERSISTENCE_PROTOCOL_VERSION","InvalidPersistedCollectionConfigError","DEFAULT_ELECTRON_PERSISTENCE_CHANNEL"],"mappings":"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"}
1
+ {"version":3,"file":"main.cjs","sources":["../../src/main.ts"],"sourcesContent":["import {\n InvalidPersistedCollectionConfigError,\n resolvePersistedStorageTarget,\n} from '@tanstack/db-sqlite-persistence-core'\nimport {\n DEFAULT_ELECTRON_PERSISTENCE_CHANNEL,\n ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n} from './protocol'\nimport type {\n PersistedCollectionPersistence,\n PersistedStorageTarget,\n PersistenceAdapter,\n SQLitePullSinceResult,\n} from '@tanstack/db-sqlite-persistence-core'\nimport type {\n ElectronPersistedKey,\n ElectronPersistedRow,\n ElectronPersistenceRequestEnvelope,\n ElectronPersistenceResponseEnvelope,\n ElectronSerializedError,\n} from './protocol'\n\ntype ElectronMainPersistenceAdapter = PersistenceAdapter & {\n loadCollectionMetadata?: (\n target: PersistedStorageTarget,\n ctx?: { cacheGenerationClaimId?: string },\n ) => Promise<Array<{ key: string; value: unknown }>>\n scanRows?: (\n target: PersistedStorageTarget,\n options?: { metadataOnly?: boolean },\n ctx?: { cacheGenerationClaimId?: string },\n ) => Promise<\n Array<{\n key: ElectronPersistedKey\n value: ElectronPersistedRow\n metadata?: unknown\n }>\n >\n pullSince?: (\n target: PersistedStorageTarget,\n fromRowVersion: number,\n ctx?: { cacheGenerationClaimId?: string },\n ) => Promise<SQLitePullSinceResult<ElectronPersistedKey>>\n getStreamPosition?: (\n target: PersistedStorageTarget,\n ctx?: { cacheGenerationClaimId?: string },\n ) => Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }>\n}\n\nfunction serializeError(error: unknown): ElectronSerializedError {\n const fallbackMessage = `Unknown electron persistence error`\n\n if (!(error instanceof Error)) {\n return {\n name: `Error`,\n message: fallbackMessage,\n code: undefined,\n }\n }\n\n const detailedError = error as Error & { code?: unknown; path?: unknown }\n const path = detailedError.path\n return {\n name: error.name || `Error`,\n message: error.message || fallbackMessage,\n stack: error.stack,\n code:\n typeof detailedError.code === `string` ||\n typeof detailedError.code === `number`\n ? detailedError.code\n : undefined,\n path:\n typeof path === `string` ||\n (Array.isArray(path) &&\n path.every(\n (segment: unknown) =>\n typeof segment === `string` || typeof segment === `number`,\n ))\n ? (path as string | ReadonlyArray<string | number>)\n : undefined,\n }\n}\n\nfunction createErrorResponse(\n request: ElectronPersistenceRequestEnvelope,\n error: unknown,\n): ElectronPersistenceResponseEnvelope {\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: false,\n error: serializeError(error),\n }\n}\n\nfunction assertValidRequest(request: ElectronPersistenceRequestEnvelope): void {\n if (request.v !== ELECTRON_PERSISTENCE_PROTOCOL_VERSION) {\n throw new InvalidPersistedCollectionConfigError(\n `Unsupported electron persistence protocol version \"${request.v}\"`,\n )\n }\n\n if (\n typeof request.requestId !== `string` ||\n request.requestId.trim().length === 0\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `Electron persistence requestId cannot be empty`,\n )\n }\n\n if (\n typeof request.collectionId !== `string` ||\n request.collectionId.trim().length === 0\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `Electron persistence collectionId cannot be empty`,\n )\n }\n}\n\nfunction requireStorageTarget(\n request: ElectronPersistenceRequestEnvelope,\n): PersistedStorageTarget {\n const target = request.storageTarget\n if (!target) {\n throw new InvalidPersistedCollectionConfigError(\n `Electron persistence data request requires an explicit storage target`,\n )\n }\n if (\n resolvePersistedStorageTarget(target).collectionId !== request.collectionId\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `Electron persistence storage target does not match its collectionId`,\n )\n }\n return target\n}\n\nasync function executeRequestAgainstAdapter(\n request: ElectronPersistenceRequestEnvelope,\n adapter: ElectronMainPersistenceAdapter,\n): Promise<ElectronPersistenceResponseEnvelope> {\n switch (request.method) {\n case `loadSubset`: {\n const result = await adapter.loadSubset(\n requireStorageTarget(request),\n request.payload.options,\n request.payload.ctx,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `loadResumeSnapshot`: {\n const result = await adapter.loadResumeSnapshot(\n requireStorageTarget(request),\n request.payload.ctx,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `loadCollectionMetadata`: {\n if (!adapter.loadCollectionMetadata) {\n throw new InvalidPersistedCollectionConfigError(\n `loadCollectionMetadata is not supported by the configured electron persistence adapter`,\n )\n }\n const result = await adapter.loadCollectionMetadata(\n requireStorageTarget(request),\n request.payload.ctx,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `scanRows`: {\n if (!adapter.scanRows) {\n throw new InvalidPersistedCollectionConfigError(\n `scanRows is not supported by the configured electron persistence adapter`,\n )\n }\n const result = await adapter.scanRows(\n requireStorageTarget(request),\n request.payload.options,\n request.payload.ctx,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `applyCommittedTx`: {\n await adapter.applyCommittedTx(\n requireStorageTarget(request),\n request.payload.tx,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result: null,\n }\n }\n\n case `reconcileCommittedTx`: {\n const result = adapter.reconcileCommittedTx\n ? await adapter.reconcileCommittedTx(\n requireStorageTarget(request),\n request.payload.tx,\n request.payload.anchor,\n )\n : { kind: `unknown` as const }\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `ensureIndex`: {\n await adapter.ensureIndex(\n requireStorageTarget(request),\n request.payload.signature,\n request.payload.spec,\n request.payload.ctx,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result: null,\n }\n }\n\n case `markIndexRemoved`: {\n if (!adapter.markIndexRemoved) {\n throw new InvalidPersistedCollectionConfigError(\n `markIndexRemoved is not supported by the configured electron persistence adapter`,\n )\n }\n await adapter.markIndexRemoved(\n requireStorageTarget(request),\n request.payload.signature,\n request.payload.ctx,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result: null,\n }\n }\n\n case `pullSince`: {\n if (!adapter.pullSince) {\n throw new InvalidPersistedCollectionConfigError(\n `pullSince is not supported by the configured electron persistence adapter`,\n )\n }\n const result = await adapter.pullSince(\n requireStorageTarget(request),\n request.payload.fromRowVersion,\n request.payload.ctx,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `reserveLeadershipTerm`: {\n if (!adapter.reserveLeadershipTerm) {\n throw new InvalidPersistedCollectionConfigError(\n `reserveLeadershipTerm is not supported by the configured electron persistence adapter`,\n )\n }\n const position = await adapter.reserveLeadershipTerm(\n requireStorageTarget(request),\n request.payload.observedTerm,\n request.payload.ctx,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result: position,\n }\n }\n\n case `getStreamPosition`: {\n if (!adapter.getStreamPosition) {\n throw new InvalidPersistedCollectionConfigError(\n `getStreamPosition is not supported by the configured electron persistence adapter`,\n )\n }\n const position = await adapter.getStreamPosition(\n requireStorageTarget(request),\n request.payload.ctx,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result: position,\n }\n }\n\n case `claimCacheGeneration`: {\n if (!adapter.claimCacheGeneration) {\n throw new InvalidPersistedCollectionConfigError(\n `claimCacheGeneration is not supported by the configured electron persistence adapter`,\n )\n }\n const result = await adapter.claimCacheGeneration(request.collectionId)\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `rotateCacheGeneration`: {\n if (!adapter.rotateCacheGeneration) {\n throw new InvalidPersistedCollectionConfigError(\n `rotateCacheGeneration is not supported by the configured electron persistence adapter`,\n )\n }\n const result = await adapter.rotateCacheGeneration(\n request.collectionId,\n request.payload.claimId,\n request.payload.resetMetadata,\n request.payload.expectedStorageCollectionId,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `renewCacheGenerationClaim`: {\n if (!adapter.renewCacheGenerationClaim) {\n throw new InvalidPersistedCollectionConfigError(\n `renewCacheGenerationClaim is not supported by the configured electron persistence adapter`,\n )\n }\n const result = await adapter.renewCacheGenerationClaim(\n request.payload.storageCollectionId,\n request.payload.claimId,\n )\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result,\n }\n }\n\n case `releaseCacheGenerationClaim`: {\n if (!adapter.releaseCacheGenerationClaim) {\n throw new InvalidPersistedCollectionConfigError(\n `releaseCacheGenerationClaim is not supported by the configured electron persistence adapter`,\n )\n }\n await adapter.releaseCacheGenerationClaim(request.payload.claimId)\n return {\n v: ELECTRON_PERSISTENCE_PROTOCOL_VERSION,\n requestId: request.requestId,\n method: request.method,\n ok: true,\n result: null,\n }\n }\n }\n}\n\nfunction resolveModeAwarePersistence(\n persistence: PersistedCollectionPersistence,\n request: ElectronPersistenceRequestEnvelope,\n): PersistedCollectionPersistence {\n if (\n request.storageTarget?.kind === `managed` &&\n !request.resolution?.logicalCollectionId\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `Electron managed cache request requires a logical Collection ID`,\n )\n }\n const mode = request.resolution?.mode ?? `sync-absent`\n const schemaVersion = request.resolution?.schemaVersion\n const collectionAwarePersistence =\n persistence.resolvePersistenceForCollection?.({\n collectionId:\n request.resolution?.logicalCollectionId ?? request.collectionId,\n mode,\n schemaVersion,\n })\n if (collectionAwarePersistence) {\n return collectionAwarePersistence\n }\n\n const modeAwarePersistence = persistence.resolvePersistenceForMode?.(mode)\n return modeAwarePersistence ?? persistence\n}\n\nexport type ElectronIpcMainLike = {\n handle: (\n channel: string,\n listener: (\n event: unknown,\n request: ElectronPersistenceRequestEnvelope,\n ) => Promise<ElectronPersistenceResponseEnvelope>,\n ) => void\n removeHandler?: (channel: string) => void\n}\n\nexport type ElectronSQLiteMainProcessOptions = {\n persistence: PersistedCollectionPersistence\n ipcMain: ElectronIpcMainLike\n channel?: string\n}\n\nexport function exposeElectronSQLitePersistence(\n options: ElectronSQLiteMainProcessOptions,\n): () => void {\n const channel = options.channel ?? DEFAULT_ELECTRON_PERSISTENCE_CHANNEL\n options.ipcMain.handle(\n channel,\n async (\n _event,\n request: ElectronPersistenceRequestEnvelope,\n ): Promise<ElectronPersistenceResponseEnvelope> => {\n try {\n assertValidRequest(request)\n const modeAwarePersistence = resolveModeAwarePersistence(\n options.persistence,\n request,\n )\n return await executeRequestAgainstAdapter(\n request,\n modeAwarePersistence.adapter,\n )\n } catch (error) {\n return createErrorResponse(request, error)\n }\n },\n )\n\n return () => {\n options.ipcMain.removeHandler?.(channel)\n }\n}\n"],"names":["ELECTRON_PERSISTENCE_PROTOCOL_VERSION","InvalidPersistedCollectionConfigError","resolvePersistedStorageTarget","DEFAULT_ELECTRON_PERSISTENCE_CHANNEL"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const ELECTRON_PERSISTENCE_PROTOCOL_VERSION = 4;
3
+ const ELECTRON_PERSISTENCE_PROTOCOL_VERSION = 6;
4
4
  const DEFAULT_ELECTRON_PERSISTENCE_CHANNEL = `tanstack-db:sqlite-persistence`;
5
5
  exports.DEFAULT_ELECTRON_PERSISTENCE_CHANNEL = DEFAULT_ELECTRON_PERSISTENCE_CHANNEL;
6
6
  exports.ELECTRON_PERSISTENCE_PROTOCOL_VERSION = ELECTRON_PERSISTENCE_PROTOCOL_VERSION;
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.cjs","sources":["../../src/protocol.ts"],"sourcesContent":["import type { LoadSubsetOptions } from '@tanstack/db'\nimport type {\n CommittedTxAnchor,\n PersistedCollectionMode,\n PersistedIndexSpec,\n PersistedKeySetEvidence,\n PersistedTx,\n ReconciledCommittedTx,\n SQLitePullSinceResult,\n} from '@tanstack/db-sqlite-persistence-core'\n\nexport const ELECTRON_PERSISTENCE_PROTOCOL_VERSION = 4 as const\nexport const DEFAULT_ELECTRON_PERSISTENCE_CHANNEL = `tanstack-db:sqlite-persistence`\n\nexport type ElectronPersistedRow = Record<string, unknown>\nexport type ElectronPersistedKey = string | number\n\nexport type ElectronPersistenceResolution = {\n mode: PersistedCollectionMode\n schemaVersion?: number\n}\n\nexport type ElectronPersistenceMethod =\n | `loadSubset`\n | `loadResumeSnapshot`\n | `loadCollectionMetadata`\n | `scanRows`\n | `applyCommittedTx`\n | `reconcileCommittedTx`\n | `ensureIndex`\n | `markIndexRemoved`\n | `pullSince`\n | `getStreamPosition`\n | `reserveLeadershipTerm`\n\nexport type ElectronPersistencePayloadMap = {\n loadSubset: {\n options: LoadSubsetOptions\n ctx?: { requiredIndexSignatures?: ReadonlyArray<string> }\n }\n loadResumeSnapshot: {\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n includeRows?: boolean\n }\n }\n loadCollectionMetadata: {}\n scanRows: {\n options?: {\n metadataOnly?: boolean\n }\n }\n applyCommittedTx: {\n tx: PersistedTx<ElectronPersistedRow, ElectronPersistedKey>\n }\n reconcileCommittedTx: {\n tx: PersistedTx<ElectronPersistedRow, ElectronPersistedKey>\n anchor: CommittedTxAnchor\n }\n ensureIndex: {\n signature: string\n spec: PersistedIndexSpec\n }\n markIndexRemoved: {\n signature: string\n }\n pullSince: {\n fromRowVersion: number\n }\n getStreamPosition: {}\n reserveLeadershipTerm: { observedTerm: number }\n}\n\nexport type ElectronPersistenceResultMap = {\n loadSubset: Array<{ key: ElectronPersistedKey; value: ElectronPersistedRow }>\n loadResumeSnapshot: {\n rows: Array<{\n key: ElectronPersistedKey\n value: ElectronPersistedRow\n metadata?: unknown\n }>\n keySet?: PersistedKeySetEvidence\n collectionMetadata: Array<{ key: string; value: unknown }>\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }\n loadCollectionMetadata: Array<{ key: string; value: unknown }>\n scanRows: Array<{\n key: ElectronPersistedKey\n value: ElectronPersistedRow\n metadata?: unknown\n }>\n applyCommittedTx: null\n reconcileCommittedTx: ReconciledCommittedTx\n ensureIndex: null\n markIndexRemoved: null\n pullSince: SQLitePullSinceResult<ElectronPersistedKey>\n getStreamPosition: {\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }\n reserveLeadershipTerm: {\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }\n}\n\nexport type ElectronSerializedError = {\n name: string\n message: string\n stack?: string\n code?: string | number\n path?: string | ReadonlyArray<string | number>\n}\n\nexport type ElectronPersistenceRequestByMethod = {\n [Method in ElectronPersistenceMethod]: {\n v: number\n requestId: string\n collectionId: string\n resolution?: ElectronPersistenceResolution\n method: Method\n payload: ElectronPersistencePayloadMap[Method]\n }\n}\n\nexport type ElectronPersistenceRequest<\n TMethod extends ElectronPersistenceMethod = ElectronPersistenceMethod,\n> = ElectronPersistenceRequestByMethod[TMethod]\n\nexport type ElectronPersistenceRequestEnvelope =\n ElectronPersistenceRequestByMethod[ElectronPersistenceMethod]\n\ntype ElectronPersistenceSuccessResponseByMethod = {\n [Method in ElectronPersistenceMethod]: {\n v: number\n requestId: string\n method: Method\n ok: true\n result: ElectronPersistenceResultMap[Method]\n }\n}\n\ntype ElectronPersistenceErrorResponseByMethod = {\n [Method in ElectronPersistenceMethod]: {\n v: number\n requestId: string\n method: Method\n ok: false\n error: ElectronSerializedError\n }\n}\n\nexport type ElectronPersistenceResponse<\n TMethod extends ElectronPersistenceMethod = ElectronPersistenceMethod,\n> =\n | ElectronPersistenceSuccessResponseByMethod[TMethod]\n | ElectronPersistenceErrorResponseByMethod[TMethod]\n\nexport type ElectronPersistenceResponseEnvelope =\n ElectronPersistenceResponse<ElectronPersistenceMethod>\n\nexport type ElectronPersistenceRequestHandler = (\n request: ElectronPersistenceRequestEnvelope,\n) => Promise<ElectronPersistenceResponseEnvelope>\n\nexport type ElectronPersistenceInvoke = (\n channel: string,\n request: ElectronPersistenceRequestEnvelope,\n) => Promise<ElectronPersistenceResponseEnvelope>\n"],"names":[],"mappings":";;AAWO,MAAM,wCAAwC;AAC9C,MAAM,uCAAuC;;;"}
1
+ {"version":3,"file":"protocol.cjs","sources":["../../src/protocol.ts"],"sourcesContent":["import type { LoadSubsetOptions } from '@tanstack/db'\nimport type {\n CommittedTxAnchor,\n PersistedCacheGenerationClaim,\n PersistedCollectionMode,\n PersistedIndexSpec,\n PersistedKeySetEvidence,\n PersistedStorageTarget,\n PersistedTx,\n ReconciledCommittedTx,\n SQLitePullSinceResult,\n} from '@tanstack/db-sqlite-persistence-core'\n\nexport const ELECTRON_PERSISTENCE_PROTOCOL_VERSION = 6 as const\nexport const DEFAULT_ELECTRON_PERSISTENCE_CHANNEL = `tanstack-db:sqlite-persistence`\n\nexport type ElectronPersistedRow = Record<string, unknown>\nexport type ElectronPersistedKey = string | number\n\nexport type ElectronPersistenceResolution = {\n mode: PersistedCollectionMode\n schemaVersion?: number\n logicalCollectionId?: string\n}\n\nexport type ElectronPersistenceMethod =\n | `loadSubset`\n | `loadResumeSnapshot`\n | `loadCollectionMetadata`\n | `scanRows`\n | `applyCommittedTx`\n | `reconcileCommittedTx`\n | `ensureIndex`\n | `markIndexRemoved`\n | `pullSince`\n | `getStreamPosition`\n | `claimCacheGeneration`\n | `rotateCacheGeneration`\n | `renewCacheGenerationClaim`\n | `releaseCacheGenerationClaim`\n | `reserveLeadershipTerm`\n\nexport type ElectronPersistencePayloadMap = {\n loadSubset: {\n options: LoadSubsetOptions\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n cacheGenerationClaimId?: string\n }\n }\n loadResumeSnapshot: {\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n includeRows?: boolean\n cacheGenerationClaimId?: string\n }\n }\n loadCollectionMetadata: { ctx?: { cacheGenerationClaimId?: string } }\n scanRows: {\n options?: {\n metadataOnly?: boolean\n }\n ctx?: { cacheGenerationClaimId?: string }\n }\n applyCommittedTx: {\n tx: PersistedTx<ElectronPersistedRow, ElectronPersistedKey>\n }\n reconcileCommittedTx: {\n tx: PersistedTx<ElectronPersistedRow, ElectronPersistedKey>\n anchor: CommittedTxAnchor\n }\n ensureIndex: {\n signature: string\n spec: PersistedIndexSpec\n ctx?: { cacheGenerationClaimId?: string }\n }\n markIndexRemoved: {\n signature: string\n ctx?: { cacheGenerationClaimId?: string }\n }\n pullSince: {\n fromRowVersion: number\n ctx?: { cacheGenerationClaimId?: string }\n }\n getStreamPosition: { ctx?: { cacheGenerationClaimId?: string } }\n claimCacheGeneration: {}\n rotateCacheGeneration: {\n claimId: string\n resetMetadata?: { key: string; value: unknown }\n expectedStorageCollectionId?: string\n }\n renewCacheGenerationClaim: {\n storageCollectionId: string\n claimId: string\n }\n releaseCacheGenerationClaim: { claimId: string }\n reserveLeadershipTerm: {\n observedTerm: number\n ctx?: { cacheGenerationClaimId?: string }\n }\n}\n\nexport type ElectronPersistenceResultMap = {\n loadSubset: Array<{ key: ElectronPersistedKey; value: ElectronPersistedRow }>\n loadResumeSnapshot: {\n rows: Array<{\n key: ElectronPersistedKey\n value: ElectronPersistedRow\n metadata?: unknown\n }>\n keySet?: PersistedKeySetEvidence\n collectionMetadata: Array<{ key: string; value: unknown }>\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }\n loadCollectionMetadata: Array<{ key: string; value: unknown }>\n scanRows: Array<{\n key: ElectronPersistedKey\n value: ElectronPersistedRow\n metadata?: unknown\n }>\n applyCommittedTx: null\n reconcileCommittedTx: ReconciledCommittedTx\n ensureIndex: null\n markIndexRemoved: null\n pullSince: SQLitePullSinceResult<ElectronPersistedKey>\n getStreamPosition: {\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }\n claimCacheGeneration: PersistedCacheGenerationClaim\n rotateCacheGeneration: PersistedCacheGenerationClaim\n renewCacheGenerationClaim: number | undefined\n releaseCacheGenerationClaim: null\n reserveLeadershipTerm: {\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }\n}\n\nexport type ElectronSerializedError = {\n name: string\n message: string\n stack?: string\n code?: string | number\n path?: string | ReadonlyArray<string | number>\n}\n\nexport type ElectronPersistenceRequestByMethod = {\n [Method in ElectronPersistenceMethod]: {\n v: number\n requestId: string\n collectionId: string\n /** Required for data operations; preserves eager or managed identity across IPC. */\n storageTarget?: PersistedStorageTarget\n resolution?: ElectronPersistenceResolution\n method: Method\n payload: ElectronPersistencePayloadMap[Method]\n }\n}\n\nexport type ElectronPersistenceRequest<\n TMethod extends ElectronPersistenceMethod = ElectronPersistenceMethod,\n> = ElectronPersistenceRequestByMethod[TMethod]\n\nexport type ElectronPersistenceRequestEnvelope =\n ElectronPersistenceRequestByMethod[ElectronPersistenceMethod]\n\ntype ElectronPersistenceSuccessResponseByMethod = {\n [Method in ElectronPersistenceMethod]: {\n v: number\n requestId: string\n method: Method\n ok: true\n result: ElectronPersistenceResultMap[Method]\n }\n}\n\ntype ElectronPersistenceErrorResponseByMethod = {\n [Method in ElectronPersistenceMethod]: {\n v: number\n requestId: string\n method: Method\n ok: false\n error: ElectronSerializedError\n }\n}\n\nexport type ElectronPersistenceResponse<\n TMethod extends ElectronPersistenceMethod = ElectronPersistenceMethod,\n> =\n | ElectronPersistenceSuccessResponseByMethod[TMethod]\n | ElectronPersistenceErrorResponseByMethod[TMethod]\n\nexport type ElectronPersistenceResponseEnvelope =\n ElectronPersistenceResponse<ElectronPersistenceMethod>\n\nexport type ElectronPersistenceRequestHandler = (\n request: ElectronPersistenceRequestEnvelope,\n) => Promise<ElectronPersistenceResponseEnvelope>\n\nexport type ElectronPersistenceInvoke = (\n channel: string,\n request: ElectronPersistenceRequestEnvelope,\n) => Promise<ElectronPersistenceResponseEnvelope>\n"],"names":[],"mappings":";;AAaO,MAAM,wCAAwC;AAC9C,MAAM,uCAAuC;;;"}
@@ -1,32 +1,42 @@
1
1
  import { LoadSubsetOptions } from '@tanstack/db';
2
- import { CommittedTxAnchor, PersistedCollectionMode, PersistedIndexSpec, PersistedKeySetEvidence, PersistedTx, ReconciledCommittedTx, SQLitePullSinceResult } from '@tanstack/db-sqlite-persistence-core';
3
- export declare const ELECTRON_PERSISTENCE_PROTOCOL_VERSION: 4;
2
+ import { CommittedTxAnchor, PersistedCacheGenerationClaim, PersistedCollectionMode, PersistedIndexSpec, PersistedKeySetEvidence, PersistedStorageTarget, PersistedTx, ReconciledCommittedTx, SQLitePullSinceResult } from '@tanstack/db-sqlite-persistence-core';
3
+ export declare const ELECTRON_PERSISTENCE_PROTOCOL_VERSION: 6;
4
4
  export declare const DEFAULT_ELECTRON_PERSISTENCE_CHANNEL = "tanstack-db:sqlite-persistence";
5
5
  export type ElectronPersistedRow = Record<string, unknown>;
6
6
  export type ElectronPersistedKey = string | number;
7
7
  export type ElectronPersistenceResolution = {
8
8
  mode: PersistedCollectionMode;
9
9
  schemaVersion?: number;
10
+ logicalCollectionId?: string;
10
11
  };
11
- export type ElectronPersistenceMethod = `loadSubset` | `loadResumeSnapshot` | `loadCollectionMetadata` | `scanRows` | `applyCommittedTx` | `reconcileCommittedTx` | `ensureIndex` | `markIndexRemoved` | `pullSince` | `getStreamPosition` | `reserveLeadershipTerm`;
12
+ export type ElectronPersistenceMethod = `loadSubset` | `loadResumeSnapshot` | `loadCollectionMetadata` | `scanRows` | `applyCommittedTx` | `reconcileCommittedTx` | `ensureIndex` | `markIndexRemoved` | `pullSince` | `getStreamPosition` | `claimCacheGeneration` | `rotateCacheGeneration` | `renewCacheGenerationClaim` | `releaseCacheGenerationClaim` | `reserveLeadershipTerm`;
12
13
  export type ElectronPersistencePayloadMap = {
13
14
  loadSubset: {
14
15
  options: LoadSubsetOptions;
15
16
  ctx?: {
16
17
  requiredIndexSignatures?: ReadonlyArray<string>;
18
+ cacheGenerationClaimId?: string;
17
19
  };
18
20
  };
19
21
  loadResumeSnapshot: {
20
22
  ctx?: {
21
23
  requiredIndexSignatures?: ReadonlyArray<string>;
22
24
  includeRows?: boolean;
25
+ cacheGenerationClaimId?: string;
26
+ };
27
+ };
28
+ loadCollectionMetadata: {
29
+ ctx?: {
30
+ cacheGenerationClaimId?: string;
23
31
  };
24
32
  };
25
- loadCollectionMetadata: {};
26
33
  scanRows: {
27
34
  options?: {
28
35
  metadataOnly?: boolean;
29
36
  };
37
+ ctx?: {
38
+ cacheGenerationClaimId?: string;
39
+ };
30
40
  };
31
41
  applyCommittedTx: {
32
42
  tx: PersistedTx<ElectronPersistedRow, ElectronPersistedKey>;
@@ -38,16 +48,48 @@ export type ElectronPersistencePayloadMap = {
38
48
  ensureIndex: {
39
49
  signature: string;
40
50
  spec: PersistedIndexSpec;
51
+ ctx?: {
52
+ cacheGenerationClaimId?: string;
53
+ };
41
54
  };
42
55
  markIndexRemoved: {
43
56
  signature: string;
57
+ ctx?: {
58
+ cacheGenerationClaimId?: string;
59
+ };
44
60
  };
45
61
  pullSince: {
46
62
  fromRowVersion: number;
63
+ ctx?: {
64
+ cacheGenerationClaimId?: string;
65
+ };
66
+ };
67
+ getStreamPosition: {
68
+ ctx?: {
69
+ cacheGenerationClaimId?: string;
70
+ };
71
+ };
72
+ claimCacheGeneration: {};
73
+ rotateCacheGeneration: {
74
+ claimId: string;
75
+ resetMetadata?: {
76
+ key: string;
77
+ value: unknown;
78
+ };
79
+ expectedStorageCollectionId?: string;
80
+ };
81
+ renewCacheGenerationClaim: {
82
+ storageCollectionId: string;
83
+ claimId: string;
84
+ };
85
+ releaseCacheGenerationClaim: {
86
+ claimId: string;
47
87
  };
48
- getStreamPosition: {};
49
88
  reserveLeadershipTerm: {
50
89
  observedTerm: number;
90
+ ctx?: {
91
+ cacheGenerationClaimId?: string;
92
+ };
51
93
  };
52
94
  };
53
95
  export type ElectronPersistenceResultMap = {
@@ -90,6 +132,10 @@ export type ElectronPersistenceResultMap = {
90
132
  latestSeq: number;
91
133
  latestRowVersion: number;
92
134
  };
135
+ claimCacheGeneration: PersistedCacheGenerationClaim;
136
+ rotateCacheGeneration: PersistedCacheGenerationClaim;
137
+ renewCacheGenerationClaim: number | undefined;
138
+ releaseCacheGenerationClaim: null;
93
139
  reserveLeadershipTerm: {
94
140
  latestTerm: number;
95
141
  latestSeq: number;
@@ -108,6 +154,8 @@ export type ElectronPersistenceRequestByMethod = {
108
154
  v: number;
109
155
  requestId: string;
110
156
  collectionId: string;
157
+ /** Required for data operations; preserves eager or managed identity across IPC. */
158
+ storageTarget?: PersistedStorageTarget;
111
159
  resolution?: ElectronPersistenceResolution;
112
160
  method: Method;
113
161
  payload: ElectronPersistencePayloadMap[Method];