@tanstack/electron-db-sqlite-persistence 0.2.8 → 0.2.10
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 +19 -4
- package/dist/cjs/main.cjs +153 -16
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/protocol.cjs +1 -1
- package/dist/cjs/protocol.cjs.map +1 -1
- package/dist/cjs/protocol.d.cts +68 -6
- package/dist/cjs/renderer.cjs +185 -40
- package/dist/cjs/renderer.cjs.map +1 -1
- package/dist/cjs/renderer.d.cts +2 -0
- package/dist/esm/main.js +154 -17
- package/dist/esm/main.js.map +1 -1
- package/dist/esm/protocol.d.ts +68 -6
- package/dist/esm/protocol.js +1 -1
- package/dist/esm/protocol.js.map +1 -1
- package/dist/esm/renderer.d.ts +2 -0
- package/dist/esm/renderer.js +186 -41
- package/dist/esm/renderer.js.map +1 -1
- package/package.json +2 -2
- package/src/main.ts +191 -17
- package/src/protocol.ts +56 -5
- package/src/renderer.ts +262 -42
- package/dist/cjs/errors.d.cts +0 -33
- package/dist/esm/errors.d.ts +0 -33
- package/src/errors.ts +0 -110
package/README.md
CHANGED
|
@@ -108,10 +108,17 @@ publishes nor consumes a coordinator sequence.
|
|
|
108
108
|
|
|
109
109
|
If a mutating RPC loses its response, Electron coordination replays it only
|
|
110
110
|
while the requester still knows the same non-null leader id and term. An
|
|
111
|
-
unknown initial route or any leader/term change rejects with
|
|
112
|
-
`IndeterminateCommitError
|
|
113
|
-
|
|
114
|
-
|
|
111
|
+
unknown initial route or any leader/term change rejects the direct RPC with
|
|
112
|
+
`IndeterminateCommitError`. For a source-backed persisted Collection, the sync
|
|
113
|
+
wrapper can certify the original transaction ID through the replacement leader
|
|
114
|
+
and the main-process SQLite adapter. Application-issued mutations still need
|
|
115
|
+
caller reconciliation. Main and renderer must use matching persistence protocol
|
|
116
|
+
v5 peers for this IPC operation. A main-process adapter used by an
|
|
117
|
+
`ElectronCollectionCoordinator` must implement `reserveLeadershipTerm` so each
|
|
118
|
+
election reserves a durable term before publishing a route. An adapter without
|
|
119
|
+
that capability can still serve single-renderer persistence through
|
|
120
|
+
`SingleProcessCoordinator`; a coordinated election rejects it before route
|
|
121
|
+
publication.
|
|
115
122
|
|
|
116
123
|
Remote-subset requests use the same crash-only boundary. The coordinator
|
|
117
124
|
projects a live `LoadSubsetOptions` input to the exported
|
|
@@ -136,6 +143,14 @@ idempotent.
|
|
|
136
143
|
## Notes
|
|
137
144
|
|
|
138
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.
|
|
139
154
|
- Collection mode (`sync-present` vs `sync-absent`) and `schemaVersion` are
|
|
140
155
|
resolved per collection and forwarded across IPC automatically.
|
|
141
156
|
- Without an `ElectronCollectionCoordinator`, single-renderer mode uses
|
package/dist/cjs/main.cjs
CHANGED
|
@@ -11,12 +11,16 @@ function serializeError(error) {
|
|
|
11
11
|
code: void 0
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
|
-
const
|
|
14
|
+
const detailedError = error;
|
|
15
|
+
const path = detailedError.path;
|
|
15
16
|
return {
|
|
16
17
|
name: error.name || `Error`,
|
|
17
18
|
message: error.message || fallbackMessage,
|
|
18
19
|
stack: error.stack,
|
|
19
|
-
code: typeof
|
|
20
|
+
code: typeof detailedError.code === `string` || typeof detailedError.code === `number` ? detailedError.code : void 0,
|
|
21
|
+
path: typeof path === `string` || Array.isArray(path) && path.every(
|
|
22
|
+
(segment) => typeof segment === `string` || typeof segment === `number`
|
|
23
|
+
) ? path : void 0
|
|
20
24
|
};
|
|
21
25
|
}
|
|
22
26
|
function createErrorResponse(request, error) {
|
|
@@ -45,11 +49,25 @@ function assertValidRequest(request) {
|
|
|
45
49
|
);
|
|
46
50
|
}
|
|
47
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
|
+
}
|
|
48
66
|
async function executeRequestAgainstAdapter(request, adapter) {
|
|
49
67
|
switch (request.method) {
|
|
50
68
|
case `loadSubset`: {
|
|
51
69
|
const result = await adapter.loadSubset(
|
|
52
|
-
request
|
|
70
|
+
requireStorageTarget(request),
|
|
53
71
|
request.payload.options,
|
|
54
72
|
request.payload.ctx
|
|
55
73
|
);
|
|
@@ -63,7 +81,7 @@ async function executeRequestAgainstAdapter(request, adapter) {
|
|
|
63
81
|
}
|
|
64
82
|
case `loadResumeSnapshot`: {
|
|
65
83
|
const result = await adapter.loadResumeSnapshot(
|
|
66
|
-
request
|
|
84
|
+
requireStorageTarget(request),
|
|
67
85
|
request.payload.ctx
|
|
68
86
|
);
|
|
69
87
|
return {
|
|
@@ -80,7 +98,10 @@ async function executeRequestAgainstAdapter(request, adapter) {
|
|
|
80
98
|
`loadCollectionMetadata is not supported by the configured electron persistence adapter`
|
|
81
99
|
);
|
|
82
100
|
}
|
|
83
|
-
const result = await adapter.loadCollectionMetadata(
|
|
101
|
+
const result = await adapter.loadCollectionMetadata(
|
|
102
|
+
requireStorageTarget(request),
|
|
103
|
+
request.payload.ctx
|
|
104
|
+
);
|
|
84
105
|
return {
|
|
85
106
|
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
86
107
|
requestId: request.requestId,
|
|
@@ -96,8 +117,9 @@ async function executeRequestAgainstAdapter(request, adapter) {
|
|
|
96
117
|
);
|
|
97
118
|
}
|
|
98
119
|
const result = await adapter.scanRows(
|
|
99
|
-
request
|
|
100
|
-
request.payload.options
|
|
120
|
+
requireStorageTarget(request),
|
|
121
|
+
request.payload.options,
|
|
122
|
+
request.payload.ctx
|
|
101
123
|
);
|
|
102
124
|
return {
|
|
103
125
|
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
@@ -108,7 +130,10 @@ async function executeRequestAgainstAdapter(request, adapter) {
|
|
|
108
130
|
};
|
|
109
131
|
}
|
|
110
132
|
case `applyCommittedTx`: {
|
|
111
|
-
await adapter.applyCommittedTx(
|
|
133
|
+
await adapter.applyCommittedTx(
|
|
134
|
+
requireStorageTarget(request),
|
|
135
|
+
request.payload.tx
|
|
136
|
+
);
|
|
112
137
|
return {
|
|
113
138
|
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
114
139
|
requestId: request.requestId,
|
|
@@ -117,11 +142,26 @@ async function executeRequestAgainstAdapter(request, adapter) {
|
|
|
117
142
|
result: null
|
|
118
143
|
};
|
|
119
144
|
}
|
|
145
|
+
case `reconcileCommittedTx`: {
|
|
146
|
+
const result = adapter.reconcileCommittedTx ? await adapter.reconcileCommittedTx(
|
|
147
|
+
requireStorageTarget(request),
|
|
148
|
+
request.payload.tx,
|
|
149
|
+
request.payload.anchor
|
|
150
|
+
) : { kind: `unknown` };
|
|
151
|
+
return {
|
|
152
|
+
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
153
|
+
requestId: request.requestId,
|
|
154
|
+
method: request.method,
|
|
155
|
+
ok: true,
|
|
156
|
+
result
|
|
157
|
+
};
|
|
158
|
+
}
|
|
120
159
|
case `ensureIndex`: {
|
|
121
160
|
await adapter.ensureIndex(
|
|
122
|
-
request
|
|
161
|
+
requireStorageTarget(request),
|
|
123
162
|
request.payload.signature,
|
|
124
|
-
request.payload.spec
|
|
163
|
+
request.payload.spec,
|
|
164
|
+
request.payload.ctx
|
|
125
165
|
);
|
|
126
166
|
return {
|
|
127
167
|
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
@@ -138,8 +178,9 @@ async function executeRequestAgainstAdapter(request, adapter) {
|
|
|
138
178
|
);
|
|
139
179
|
}
|
|
140
180
|
await adapter.markIndexRemoved(
|
|
141
|
-
request
|
|
142
|
-
request.payload.signature
|
|
181
|
+
requireStorageTarget(request),
|
|
182
|
+
request.payload.signature,
|
|
183
|
+
request.payload.ctx
|
|
143
184
|
);
|
|
144
185
|
return {
|
|
145
186
|
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
@@ -156,8 +197,9 @@ async function executeRequestAgainstAdapter(request, adapter) {
|
|
|
156
197
|
);
|
|
157
198
|
}
|
|
158
199
|
const result = await adapter.pullSince(
|
|
159
|
-
request
|
|
160
|
-
request.payload.fromRowVersion
|
|
200
|
+
requireStorageTarget(request),
|
|
201
|
+
request.payload.fromRowVersion,
|
|
202
|
+
request.payload.ctx
|
|
161
203
|
);
|
|
162
204
|
return {
|
|
163
205
|
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
@@ -167,13 +209,35 @@ async function executeRequestAgainstAdapter(request, adapter) {
|
|
|
167
209
|
result
|
|
168
210
|
};
|
|
169
211
|
}
|
|
212
|
+
case `reserveLeadershipTerm`: {
|
|
213
|
+
if (!adapter.reserveLeadershipTerm) {
|
|
214
|
+
throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
|
|
215
|
+
`reserveLeadershipTerm is not supported by the configured electron persistence adapter`
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
const position = await adapter.reserveLeadershipTerm(
|
|
219
|
+
requireStorageTarget(request),
|
|
220
|
+
request.payload.observedTerm,
|
|
221
|
+
request.payload.ctx
|
|
222
|
+
);
|
|
223
|
+
return {
|
|
224
|
+
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
225
|
+
requestId: request.requestId,
|
|
226
|
+
method: request.method,
|
|
227
|
+
ok: true,
|
|
228
|
+
result: position
|
|
229
|
+
};
|
|
230
|
+
}
|
|
170
231
|
case `getStreamPosition`: {
|
|
171
232
|
if (!adapter.getStreamPosition) {
|
|
172
233
|
throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
|
|
173
234
|
`getStreamPosition is not supported by the configured electron persistence adapter`
|
|
174
235
|
);
|
|
175
236
|
}
|
|
176
|
-
const position = await adapter.getStreamPosition(
|
|
237
|
+
const position = await adapter.getStreamPosition(
|
|
238
|
+
requireStorageTarget(request),
|
|
239
|
+
request.payload.ctx
|
|
240
|
+
);
|
|
177
241
|
return {
|
|
178
242
|
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
179
243
|
requestId: request.requestId,
|
|
@@ -182,13 +246,86 @@ async function executeRequestAgainstAdapter(request, adapter) {
|
|
|
182
246
|
result: position
|
|
183
247
|
};
|
|
184
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
|
+
}
|
|
185
317
|
}
|
|
186
318
|
}
|
|
187
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
|
+
}
|
|
188
325
|
const mode = request.resolution?.mode ?? `sync-absent`;
|
|
189
326
|
const schemaVersion = request.resolution?.schemaVersion;
|
|
190
327
|
const collectionAwarePersistence = persistence.resolvePersistenceForCollection?.({
|
|
191
|
-
collectionId: request.collectionId,
|
|
328
|
+
collectionId: request.resolution?.logicalCollectionId ?? request.collectionId,
|
|
192
329
|
mode,
|
|
193
330
|
schemaVersion
|
|
194
331
|
});
|
package/dist/cjs/main.cjs.map
CHANGED
|
@@ -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 codedError = error as Error & { code?: unknown }\n return {\n name: error.name || `Error`,\n message: error.message || fallbackMessage,\n stack: error.stack,\n code: typeof codedError.code === `string` ? codedError.code : 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 `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 `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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"}
|
package/dist/cjs/protocol.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const ELECTRON_PERSISTENCE_PROTOCOL_VERSION =
|
|
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 PersistedCollectionMode,\n PersistedIndexSpec,\n PersistedKeySetEvidence,\n PersistedTx,\n SQLitePullSinceResult,\n} from '@tanstack/db-sqlite-persistence-core'\n\nexport const ELECTRON_PERSISTENCE_PROTOCOL_VERSION =
|
|
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;;;"}
|
package/dist/cjs/protocol.d.cts
CHANGED
|
@@ -1,47 +1,96 @@
|
|
|
1
1
|
import { LoadSubsetOptions } from '@tanstack/db';
|
|
2
|
-
import { PersistedCollectionMode, PersistedIndexSpec, PersistedKeySetEvidence, PersistedTx, SQLitePullSinceResult } from '@tanstack/db-sqlite-persistence-core';
|
|
3
|
-
export declare const ELECTRON_PERSISTENCE_PROTOCOL_VERSION:
|
|
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` | `ensureIndex` | `markIndexRemoved` | `pullSince` | `getStreamPosition`;
|
|
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>;
|
|
33
43
|
};
|
|
44
|
+
reconcileCommittedTx: {
|
|
45
|
+
tx: PersistedTx<ElectronPersistedRow, ElectronPersistedKey>;
|
|
46
|
+
anchor: CommittedTxAnchor;
|
|
47
|
+
};
|
|
34
48
|
ensureIndex: {
|
|
35
49
|
signature: string;
|
|
36
50
|
spec: PersistedIndexSpec;
|
|
51
|
+
ctx?: {
|
|
52
|
+
cacheGenerationClaimId?: string;
|
|
53
|
+
};
|
|
37
54
|
};
|
|
38
55
|
markIndexRemoved: {
|
|
39
56
|
signature: string;
|
|
57
|
+
ctx?: {
|
|
58
|
+
cacheGenerationClaimId?: string;
|
|
59
|
+
};
|
|
40
60
|
};
|
|
41
61
|
pullSince: {
|
|
42
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;
|
|
87
|
+
};
|
|
88
|
+
reserveLeadershipTerm: {
|
|
89
|
+
observedTerm: number;
|
|
90
|
+
ctx?: {
|
|
91
|
+
cacheGenerationClaimId?: string;
|
|
92
|
+
};
|
|
43
93
|
};
|
|
44
|
-
getStreamPosition: {};
|
|
45
94
|
};
|
|
46
95
|
export type ElectronPersistenceResultMap = {
|
|
47
96
|
loadSubset: Array<{
|
|
@@ -74,6 +123,7 @@ export type ElectronPersistenceResultMap = {
|
|
|
74
123
|
metadata?: unknown;
|
|
75
124
|
}>;
|
|
76
125
|
applyCommittedTx: null;
|
|
126
|
+
reconcileCommittedTx: ReconciledCommittedTx;
|
|
77
127
|
ensureIndex: null;
|
|
78
128
|
markIndexRemoved: null;
|
|
79
129
|
pullSince: SQLitePullSinceResult<ElectronPersistedKey>;
|
|
@@ -82,18 +132,30 @@ export type ElectronPersistenceResultMap = {
|
|
|
82
132
|
latestSeq: number;
|
|
83
133
|
latestRowVersion: number;
|
|
84
134
|
};
|
|
135
|
+
claimCacheGeneration: PersistedCacheGenerationClaim;
|
|
136
|
+
rotateCacheGeneration: PersistedCacheGenerationClaim;
|
|
137
|
+
renewCacheGenerationClaim: number | undefined;
|
|
138
|
+
releaseCacheGenerationClaim: null;
|
|
139
|
+
reserveLeadershipTerm: {
|
|
140
|
+
latestTerm: number;
|
|
141
|
+
latestSeq: number;
|
|
142
|
+
latestRowVersion: number;
|
|
143
|
+
};
|
|
85
144
|
};
|
|
86
145
|
export type ElectronSerializedError = {
|
|
87
146
|
name: string;
|
|
88
147
|
message: string;
|
|
89
148
|
stack?: string;
|
|
90
|
-
code?: string;
|
|
149
|
+
code?: string | number;
|
|
150
|
+
path?: string | ReadonlyArray<string | number>;
|
|
91
151
|
};
|
|
92
152
|
export type ElectronPersistenceRequestByMethod = {
|
|
93
153
|
[Method in ElectronPersistenceMethod]: {
|
|
94
154
|
v: number;
|
|
95
155
|
requestId: string;
|
|
96
156
|
collectionId: string;
|
|
157
|
+
/** Required for data operations; preserves eager or managed identity across IPC. */
|
|
158
|
+
storageTarget?: PersistedStorageTarget;
|
|
97
159
|
resolution?: ElectronPersistenceResolution;
|
|
98
160
|
method: Method;
|
|
99
161
|
payload: ElectronPersistencePayloadMap[Method];
|