@tanstack/electron-db-sqlite-persistence 0.1.2
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 +71 -0
- package/dist/cjs/electron-coordinator.cjs +541 -0
- package/dist/cjs/electron-coordinator.cjs.map +1 -0
- package/dist/cjs/electron-coordinator.d.cts +67 -0
- package/dist/cjs/errors.d.cts +33 -0
- package/dist/cjs/index.cjs +14 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/index.d.cts +8 -0
- package/dist/cjs/main.cjs +213 -0
- package/dist/cjs/main.cjs.map +1 -0
- package/dist/cjs/main.d.cts +12 -0
- package/dist/cjs/protocol.cjs +7 -0
- package/dist/cjs/protocol.cjs.map +1 -0
- package/dist/cjs/protocol.d.cts +104 -0
- package/dist/cjs/renderer.cjs +221 -0
- package/dist/cjs/renderer.cjs.map +1 -0
- package/dist/cjs/renderer.d.cts +13 -0
- package/dist/esm/electron-coordinator.d.ts +67 -0
- package/dist/esm/electron-coordinator.js +541 -0
- package/dist/esm/electron-coordinator.js.map +1 -0
- package/dist/esm/errors.d.ts +33 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +11 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/main.d.ts +12 -0
- package/dist/esm/main.js +213 -0
- package/dist/esm/main.js.map +1 -0
- package/dist/esm/protocol.d.ts +104 -0
- package/dist/esm/protocol.js +7 -0
- package/dist/esm/protocol.js.map +1 -0
- package/dist/esm/renderer.d.ts +13 -0
- package/dist/esm/renderer.js +221 -0
- package/dist/esm/renderer.js.map +1 -0
- package/package.json +80 -0
- package/src/electron-coordinator.ts +842 -0
- package/src/errors.ts +110 -0
- package/src/index.ts +17 -0
- package/src/main.ts +315 -0
- package/src/protocol.ts +137 -0
- package/src/renderer.ts +391 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { ApplyLocalMutationsResponse, PersistedCollectionCoordinator, PersistedIndexSpec, PersistedMutationEnvelope, PersistenceAdapter, ProtocolEnvelope, PullSinceResponse } from '@tanstack/db-sqlite-persistence-core';
|
|
2
|
+
import { LoadSubsetOptions } from '@tanstack/db';
|
|
3
|
+
type AdapterWithPullSince = PersistenceAdapter<Record<string, unknown>, string | number> & {
|
|
4
|
+
pullSince?: (collectionId: string, fromRowVersion: number) => Promise<{
|
|
5
|
+
latestRowVersion: number;
|
|
6
|
+
requiresFullReload: true;
|
|
7
|
+
} | {
|
|
8
|
+
latestRowVersion: number;
|
|
9
|
+
requiresFullReload: false;
|
|
10
|
+
changedKeys: Array<string | number>;
|
|
11
|
+
deletedKeys: Array<string | number>;
|
|
12
|
+
}>;
|
|
13
|
+
getStreamPosition?: (collectionId: string) => Promise<{
|
|
14
|
+
latestTerm: number;
|
|
15
|
+
latestSeq: number;
|
|
16
|
+
latestRowVersion: number;
|
|
17
|
+
}>;
|
|
18
|
+
};
|
|
19
|
+
export type ElectronCollectionCoordinatorOptions = {
|
|
20
|
+
dbName: string;
|
|
21
|
+
adapter?: AdapterWithPullSince;
|
|
22
|
+
};
|
|
23
|
+
export declare class ElectronCollectionCoordinator implements PersistedCollectionCoordinator {
|
|
24
|
+
private readonly nodeId;
|
|
25
|
+
private readonly dbName;
|
|
26
|
+
private adapter;
|
|
27
|
+
private readonly channel;
|
|
28
|
+
private readonly collections;
|
|
29
|
+
private readonly pendingRPCs;
|
|
30
|
+
private readonly appliedEnvelopeIds;
|
|
31
|
+
private disposed;
|
|
32
|
+
/** Method indirection to prevent TypeScript from narrowing `disposed` across awaits */
|
|
33
|
+
private isDisposed;
|
|
34
|
+
private requireAdapter;
|
|
35
|
+
constructor(options: ElectronCollectionCoordinatorOptions);
|
|
36
|
+
/**
|
|
37
|
+
* Set or replace the persistence adapter used for leader-side RPC handling.
|
|
38
|
+
* Called by `createElectronSQLitePersistence` to wire the internally-created
|
|
39
|
+
* adapter into the coordinator.
|
|
40
|
+
*/
|
|
41
|
+
setAdapter(adapter: AdapterWithPullSince): void;
|
|
42
|
+
getNodeId(): string;
|
|
43
|
+
subscribe(collectionId: string, onMessage: (message: ProtocolEnvelope<unknown>) => void): () => void;
|
|
44
|
+
publish(_collectionId: string, message: ProtocolEnvelope<unknown>): void;
|
|
45
|
+
isLeader(collectionId: string): boolean;
|
|
46
|
+
ensureLeadership(collectionId: string): Promise<void>;
|
|
47
|
+
requestEnsureRemoteSubset(collectionId: string, options: LoadSubsetOptions): Promise<void>;
|
|
48
|
+
requestEnsurePersistedIndex(collectionId: string, signature: string, spec: PersistedIndexSpec): Promise<void>;
|
|
49
|
+
requestApplyLocalMutations(collectionId: string, mutations: Array<PersistedMutationEnvelope>): Promise<ApplyLocalMutationsResponse>;
|
|
50
|
+
pullSince(collectionId: string, fromRowVersion: number): Promise<PullSinceResponse>;
|
|
51
|
+
dispose(): void;
|
|
52
|
+
private ensureCollectionState;
|
|
53
|
+
private acquireLeadership;
|
|
54
|
+
private releaseLeadership;
|
|
55
|
+
private emitHeartbeat;
|
|
56
|
+
private onChannelMessage;
|
|
57
|
+
private sendRPC;
|
|
58
|
+
private sendRPCOnce;
|
|
59
|
+
private handleRPCRequest;
|
|
60
|
+
private handleEnsureRemoteSubset;
|
|
61
|
+
private handleEnsurePersistedIndex;
|
|
62
|
+
private handleApplyLocalMutations;
|
|
63
|
+
private handlePullSince;
|
|
64
|
+
private withWriterLock;
|
|
65
|
+
private pruneAppliedEnvelopeIds;
|
|
66
|
+
}
|
|
67
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ElectronPersistenceMethod, ElectronSerializedError } from './protocol.cjs';
|
|
2
|
+
type ElectronPersistenceErrorOptions = {
|
|
3
|
+
code?: string;
|
|
4
|
+
cause?: unknown;
|
|
5
|
+
};
|
|
6
|
+
export declare class ElectronPersistenceError extends Error {
|
|
7
|
+
readonly code: string | undefined;
|
|
8
|
+
constructor(message: string, options?: ElectronPersistenceErrorOptions);
|
|
9
|
+
}
|
|
10
|
+
export declare class UnknownElectronPersistenceCollectionError extends ElectronPersistenceError {
|
|
11
|
+
readonly collectionId: string;
|
|
12
|
+
constructor(collectionId: string);
|
|
13
|
+
}
|
|
14
|
+
export declare class UnsupportedElectronPersistenceMethodError extends ElectronPersistenceError {
|
|
15
|
+
readonly method: ElectronPersistenceMethod;
|
|
16
|
+
readonly collectionId: string;
|
|
17
|
+
constructor(method: ElectronPersistenceMethod, collectionId: string);
|
|
18
|
+
}
|
|
19
|
+
export declare class ElectronPersistenceProtocolError extends ElectronPersistenceError {
|
|
20
|
+
constructor(message: string, options?: ElectronPersistenceErrorOptions);
|
|
21
|
+
}
|
|
22
|
+
export declare class ElectronPersistenceTimeoutError extends ElectronPersistenceError {
|
|
23
|
+
constructor(message: string);
|
|
24
|
+
}
|
|
25
|
+
export declare class ElectronPersistenceRpcError extends ElectronPersistenceError {
|
|
26
|
+
readonly method: ElectronPersistenceMethod;
|
|
27
|
+
readonly collectionId: string;
|
|
28
|
+
readonly requestId: string;
|
|
29
|
+
readonly remoteName: string;
|
|
30
|
+
constructor(method: ElectronPersistenceMethod, collectionId: string, requestId: string, serializedError: ElectronSerializedError);
|
|
31
|
+
static fromSerialized(method: ElectronPersistenceMethod, collectionId: string, requestId: string, serializedError: ElectronSerializedError): ElectronPersistenceRpcError;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const main = require("./main.cjs");
|
|
4
|
+
const renderer = require("./renderer.cjs");
|
|
5
|
+
const electronCoordinator = require("./electron-coordinator.cjs");
|
|
6
|
+
const dbSqlitePersistenceCore = require("@tanstack/db-sqlite-persistence-core");
|
|
7
|
+
exports.exposeElectronSQLitePersistence = main.exposeElectronSQLitePersistence;
|
|
8
|
+
exports.createElectronSQLitePersistence = renderer.createElectronSQLitePersistence;
|
|
9
|
+
exports.ElectronCollectionCoordinator = electronCoordinator.ElectronCollectionCoordinator;
|
|
10
|
+
Object.defineProperty(exports, "persistedCollectionOptions", {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: () => dbSqlitePersistenceCore.persistedCollectionOptions
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { exposeElectronSQLitePersistence } from './main.cjs';
|
|
2
|
+
export type { ElectronIpcMainLike, ElectronSQLiteMainProcessOptions, } from './main.cjs';
|
|
3
|
+
export { createElectronSQLitePersistence } from './renderer.cjs';
|
|
4
|
+
export type { ElectronIpcRendererLike, ElectronSQLitePersistenceOptions, } from './renderer.cjs';
|
|
5
|
+
export { ElectronCollectionCoordinator } from './electron-coordinator.cjs';
|
|
6
|
+
export type { ElectronCollectionCoordinatorOptions } from './electron-coordinator.cjs';
|
|
7
|
+
export { persistedCollectionOptions } from '@tanstack/db-sqlite-persistence-core';
|
|
8
|
+
export type { PersistedCollectionCoordinator, PersistedCollectionPersistence, } from '@tanstack/db-sqlite-persistence-core';
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const dbSqlitePersistenceCore = require("@tanstack/db-sqlite-persistence-core");
|
|
4
|
+
const protocol = require("./protocol.cjs");
|
|
5
|
+
function serializeError(error) {
|
|
6
|
+
const fallbackMessage = `Unknown electron persistence error`;
|
|
7
|
+
if (!(error instanceof Error)) {
|
|
8
|
+
return {
|
|
9
|
+
name: `Error`,
|
|
10
|
+
message: fallbackMessage,
|
|
11
|
+
code: void 0
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const codedError = error;
|
|
15
|
+
return {
|
|
16
|
+
name: error.name || `Error`,
|
|
17
|
+
message: error.message || fallbackMessage,
|
|
18
|
+
stack: error.stack,
|
|
19
|
+
code: typeof codedError.code === `string` ? codedError.code : void 0
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function createErrorResponse(request, error) {
|
|
23
|
+
return {
|
|
24
|
+
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
25
|
+
requestId: request.requestId,
|
|
26
|
+
method: request.method,
|
|
27
|
+
ok: false,
|
|
28
|
+
error: serializeError(error)
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function assertValidRequest(request) {
|
|
32
|
+
if (request.v !== protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION) {
|
|
33
|
+
throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
|
|
34
|
+
`Unsupported electron persistence protocol version "${request.v}"`
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
if (typeof request.requestId !== `string` || request.requestId.trim().length === 0) {
|
|
38
|
+
throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
|
|
39
|
+
`Electron persistence requestId cannot be empty`
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
if (typeof request.collectionId !== `string` || request.collectionId.trim().length === 0) {
|
|
43
|
+
throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
|
|
44
|
+
`Electron persistence collectionId cannot be empty`
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function executeRequestAgainstAdapter(request, adapter) {
|
|
49
|
+
switch (request.method) {
|
|
50
|
+
case `loadSubset`: {
|
|
51
|
+
const result = await adapter.loadSubset(
|
|
52
|
+
request.collectionId,
|
|
53
|
+
request.payload.options,
|
|
54
|
+
request.payload.ctx
|
|
55
|
+
);
|
|
56
|
+
return {
|
|
57
|
+
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
58
|
+
requestId: request.requestId,
|
|
59
|
+
method: request.method,
|
|
60
|
+
ok: true,
|
|
61
|
+
result
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
case `loadCollectionMetadata`: {
|
|
65
|
+
if (!adapter.loadCollectionMetadata) {
|
|
66
|
+
throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
|
|
67
|
+
`loadCollectionMetadata is not supported by the configured electron persistence adapter`
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
const result = await adapter.loadCollectionMetadata(request.collectionId);
|
|
71
|
+
return {
|
|
72
|
+
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
73
|
+
requestId: request.requestId,
|
|
74
|
+
method: request.method,
|
|
75
|
+
ok: true,
|
|
76
|
+
result
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
case `scanRows`: {
|
|
80
|
+
if (!adapter.scanRows) {
|
|
81
|
+
throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
|
|
82
|
+
`scanRows is not supported by the configured electron persistence adapter`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
const result = await adapter.scanRows(
|
|
86
|
+
request.collectionId,
|
|
87
|
+
request.payload.options
|
|
88
|
+
);
|
|
89
|
+
return {
|
|
90
|
+
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
91
|
+
requestId: request.requestId,
|
|
92
|
+
method: request.method,
|
|
93
|
+
ok: true,
|
|
94
|
+
result
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
case `applyCommittedTx`: {
|
|
98
|
+
await adapter.applyCommittedTx(request.collectionId, request.payload.tx);
|
|
99
|
+
return {
|
|
100
|
+
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
101
|
+
requestId: request.requestId,
|
|
102
|
+
method: request.method,
|
|
103
|
+
ok: true,
|
|
104
|
+
result: null
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
case `ensureIndex`: {
|
|
108
|
+
await adapter.ensureIndex(
|
|
109
|
+
request.collectionId,
|
|
110
|
+
request.payload.signature,
|
|
111
|
+
request.payload.spec
|
|
112
|
+
);
|
|
113
|
+
return {
|
|
114
|
+
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
115
|
+
requestId: request.requestId,
|
|
116
|
+
method: request.method,
|
|
117
|
+
ok: true,
|
|
118
|
+
result: null
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
case `markIndexRemoved`: {
|
|
122
|
+
if (!adapter.markIndexRemoved) {
|
|
123
|
+
throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
|
|
124
|
+
`markIndexRemoved is not supported by the configured electron persistence adapter`
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
await adapter.markIndexRemoved(
|
|
128
|
+
request.collectionId,
|
|
129
|
+
request.payload.signature
|
|
130
|
+
);
|
|
131
|
+
return {
|
|
132
|
+
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
133
|
+
requestId: request.requestId,
|
|
134
|
+
method: request.method,
|
|
135
|
+
ok: true,
|
|
136
|
+
result: null
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
case `pullSince`: {
|
|
140
|
+
if (!adapter.pullSince) {
|
|
141
|
+
throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
|
|
142
|
+
`pullSince is not supported by the configured electron persistence adapter`
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
const result = await adapter.pullSince(
|
|
146
|
+
request.collectionId,
|
|
147
|
+
request.payload.fromRowVersion
|
|
148
|
+
);
|
|
149
|
+
return {
|
|
150
|
+
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
151
|
+
requestId: request.requestId,
|
|
152
|
+
method: request.method,
|
|
153
|
+
ok: true,
|
|
154
|
+
result
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
case `getStreamPosition`: {
|
|
158
|
+
if (!adapter.getStreamPosition) {
|
|
159
|
+
throw new dbSqlitePersistenceCore.InvalidPersistedCollectionConfigError(
|
|
160
|
+
`getStreamPosition is not supported by the configured electron persistence adapter`
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
const position = await adapter.getStreamPosition(request.collectionId);
|
|
164
|
+
return {
|
|
165
|
+
v: protocol.ELECTRON_PERSISTENCE_PROTOCOL_VERSION,
|
|
166
|
+
requestId: request.requestId,
|
|
167
|
+
method: request.method,
|
|
168
|
+
ok: true,
|
|
169
|
+
result: position
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function resolveModeAwarePersistence(persistence, request) {
|
|
175
|
+
const mode = request.resolution?.mode ?? `sync-absent`;
|
|
176
|
+
const schemaVersion = request.resolution?.schemaVersion;
|
|
177
|
+
const collectionAwarePersistence = persistence.resolvePersistenceForCollection?.({
|
|
178
|
+
collectionId: request.collectionId,
|
|
179
|
+
mode,
|
|
180
|
+
schemaVersion
|
|
181
|
+
});
|
|
182
|
+
if (collectionAwarePersistence) {
|
|
183
|
+
return collectionAwarePersistence;
|
|
184
|
+
}
|
|
185
|
+
const modeAwarePersistence = persistence.resolvePersistenceForMode?.(mode);
|
|
186
|
+
return modeAwarePersistence ?? persistence;
|
|
187
|
+
}
|
|
188
|
+
function exposeElectronSQLitePersistence(options) {
|
|
189
|
+
const channel = options.channel ?? protocol.DEFAULT_ELECTRON_PERSISTENCE_CHANNEL;
|
|
190
|
+
options.ipcMain.handle(
|
|
191
|
+
channel,
|
|
192
|
+
async (_event, request) => {
|
|
193
|
+
try {
|
|
194
|
+
assertValidRequest(request);
|
|
195
|
+
const modeAwarePersistence = resolveModeAwarePersistence(
|
|
196
|
+
options.persistence,
|
|
197
|
+
request
|
|
198
|
+
);
|
|
199
|
+
return await executeRequestAgainstAdapter(
|
|
200
|
+
request,
|
|
201
|
+
modeAwarePersistence.adapter
|
|
202
|
+
);
|
|
203
|
+
} catch (error) {
|
|
204
|
+
return createErrorResponse(request, error);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
);
|
|
208
|
+
return () => {
|
|
209
|
+
options.ipcMain.removeHandler?.(channel);
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
exports.exposeElectronSQLitePersistence = exposeElectronSQLitePersistence;
|
|
213
|
+
//# sourceMappingURL=main.cjs.map
|
|
@@ -0,0 +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 ElectronPersistedRow,\n ElectronPersistedKey\n> & {\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 `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 ElectronPersistedRow,\n ElectronPersistedKey\n >,\n request: ElectronPersistenceRequestEnvelope,\n): PersistedCollectionPersistence<ElectronPersistedRow, ElectronPersistedKey> {\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 ElectronPersistedRow,\n ElectronPersistedKey\n >\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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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PersistedCollectionPersistence } from '@tanstack/db-sqlite-persistence-core';
|
|
2
|
+
import { ElectronPersistedKey, ElectronPersistedRow, ElectronPersistenceRequestEnvelope, ElectronPersistenceResponseEnvelope } from './protocol.cjs';
|
|
3
|
+
export type ElectronIpcMainLike = {
|
|
4
|
+
handle: (channel: string, listener: (event: unknown, request: ElectronPersistenceRequestEnvelope) => Promise<ElectronPersistenceResponseEnvelope>) => void;
|
|
5
|
+
removeHandler?: (channel: string) => void;
|
|
6
|
+
};
|
|
7
|
+
export type ElectronSQLiteMainProcessOptions = {
|
|
8
|
+
persistence: PersistedCollectionPersistence<ElectronPersistedRow, ElectronPersistedKey>;
|
|
9
|
+
ipcMain: ElectronIpcMainLike;
|
|
10
|
+
channel?: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function exposeElectronSQLitePersistence(options: ElectronSQLiteMainProcessOptions): () => void;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const ELECTRON_PERSISTENCE_PROTOCOL_VERSION = 1;
|
|
4
|
+
const DEFAULT_ELECTRON_PERSISTENCE_CHANNEL = `tanstack-db:sqlite-persistence`;
|
|
5
|
+
exports.DEFAULT_ELECTRON_PERSISTENCE_CHANNEL = DEFAULT_ELECTRON_PERSISTENCE_CHANNEL;
|
|
6
|
+
exports.ELECTRON_PERSISTENCE_PROTOCOL_VERSION = ELECTRON_PERSISTENCE_PROTOCOL_VERSION;
|
|
7
|
+
//# sourceMappingURL=protocol.cjs.map
|
|
@@ -0,0 +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 PersistedTx,\n SQLitePullSinceResult,\n} from '@tanstack/db-sqlite-persistence-core'\n\nexport const ELECTRON_PERSISTENCE_PROTOCOL_VERSION = 1 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 | `loadCollectionMetadata`\n | `scanRows`\n | `applyCommittedTx`\n | `ensureIndex`\n | `markIndexRemoved`\n | `pullSince`\n | `getStreamPosition`\n\nexport type ElectronPersistencePayloadMap = {\n loadSubset: {\n options: LoadSubsetOptions\n ctx?: { requiredIndexSignatures?: ReadonlyArray<string> }\n }\n loadCollectionMetadata: {}\n scanRows: {\n options?: {\n metadataOnly?: boolean\n }\n }\n applyCommittedTx: {\n tx: PersistedTx<ElectronPersistedRow, ElectronPersistedKey>\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}\n\nexport type ElectronPersistenceResultMap = {\n loadSubset: Array<{ key: ElectronPersistedKey; value: ElectronPersistedRow }>\n loadCollectionMetadata: Array<{ key: string; value: unknown }>\n scanRows: Array<{\n key: ElectronPersistedKey\n value: ElectronPersistedRow\n metadata?: unknown\n }>\n applyCommittedTx: null\n ensureIndex: null\n markIndexRemoved: null\n pullSince: SQLitePullSinceResult<ElectronPersistedKey>\n getStreamPosition: {\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\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":";;AAQO,MAAM,wCAAwC;AAC9C,MAAM,uCAAuC;;;"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { LoadSubsetOptions } from '@tanstack/db';
|
|
2
|
+
import { PersistedCollectionMode, PersistedIndexSpec, PersistedTx, SQLitePullSinceResult } from '@tanstack/db-sqlite-persistence-core';
|
|
3
|
+
export declare const ELECTRON_PERSISTENCE_PROTOCOL_VERSION: 1;
|
|
4
|
+
export declare const DEFAULT_ELECTRON_PERSISTENCE_CHANNEL = "tanstack-db:sqlite-persistence";
|
|
5
|
+
export type ElectronPersistedRow = Record<string, unknown>;
|
|
6
|
+
export type ElectronPersistedKey = string | number;
|
|
7
|
+
export type ElectronPersistenceResolution = {
|
|
8
|
+
mode: PersistedCollectionMode;
|
|
9
|
+
schemaVersion?: number;
|
|
10
|
+
};
|
|
11
|
+
export type ElectronPersistenceMethod = `loadSubset` | `loadCollectionMetadata` | `scanRows` | `applyCommittedTx` | `ensureIndex` | `markIndexRemoved` | `pullSince` | `getStreamPosition`;
|
|
12
|
+
export type ElectronPersistencePayloadMap = {
|
|
13
|
+
loadSubset: {
|
|
14
|
+
options: LoadSubsetOptions;
|
|
15
|
+
ctx?: {
|
|
16
|
+
requiredIndexSignatures?: ReadonlyArray<string>;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
loadCollectionMetadata: {};
|
|
20
|
+
scanRows: {
|
|
21
|
+
options?: {
|
|
22
|
+
metadataOnly?: boolean;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
applyCommittedTx: {
|
|
26
|
+
tx: PersistedTx<ElectronPersistedRow, ElectronPersistedKey>;
|
|
27
|
+
};
|
|
28
|
+
ensureIndex: {
|
|
29
|
+
signature: string;
|
|
30
|
+
spec: PersistedIndexSpec;
|
|
31
|
+
};
|
|
32
|
+
markIndexRemoved: {
|
|
33
|
+
signature: string;
|
|
34
|
+
};
|
|
35
|
+
pullSince: {
|
|
36
|
+
fromRowVersion: number;
|
|
37
|
+
};
|
|
38
|
+
getStreamPosition: {};
|
|
39
|
+
};
|
|
40
|
+
export type ElectronPersistenceResultMap = {
|
|
41
|
+
loadSubset: Array<{
|
|
42
|
+
key: ElectronPersistedKey;
|
|
43
|
+
value: ElectronPersistedRow;
|
|
44
|
+
}>;
|
|
45
|
+
loadCollectionMetadata: Array<{
|
|
46
|
+
key: string;
|
|
47
|
+
value: unknown;
|
|
48
|
+
}>;
|
|
49
|
+
scanRows: Array<{
|
|
50
|
+
key: ElectronPersistedKey;
|
|
51
|
+
value: ElectronPersistedRow;
|
|
52
|
+
metadata?: unknown;
|
|
53
|
+
}>;
|
|
54
|
+
applyCommittedTx: null;
|
|
55
|
+
ensureIndex: null;
|
|
56
|
+
markIndexRemoved: null;
|
|
57
|
+
pullSince: SQLitePullSinceResult<ElectronPersistedKey>;
|
|
58
|
+
getStreamPosition: {
|
|
59
|
+
latestTerm: number;
|
|
60
|
+
latestSeq: number;
|
|
61
|
+
latestRowVersion: number;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
export type ElectronSerializedError = {
|
|
65
|
+
name: string;
|
|
66
|
+
message: string;
|
|
67
|
+
stack?: string;
|
|
68
|
+
code?: string;
|
|
69
|
+
};
|
|
70
|
+
export type ElectronPersistenceRequestByMethod = {
|
|
71
|
+
[Method in ElectronPersistenceMethod]: {
|
|
72
|
+
v: number;
|
|
73
|
+
requestId: string;
|
|
74
|
+
collectionId: string;
|
|
75
|
+
resolution?: ElectronPersistenceResolution;
|
|
76
|
+
method: Method;
|
|
77
|
+
payload: ElectronPersistencePayloadMap[Method];
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
export type ElectronPersistenceRequest<TMethod extends ElectronPersistenceMethod = ElectronPersistenceMethod> = ElectronPersistenceRequestByMethod[TMethod];
|
|
81
|
+
export type ElectronPersistenceRequestEnvelope = ElectronPersistenceRequestByMethod[ElectronPersistenceMethod];
|
|
82
|
+
type ElectronPersistenceSuccessResponseByMethod = {
|
|
83
|
+
[Method in ElectronPersistenceMethod]: {
|
|
84
|
+
v: number;
|
|
85
|
+
requestId: string;
|
|
86
|
+
method: Method;
|
|
87
|
+
ok: true;
|
|
88
|
+
result: ElectronPersistenceResultMap[Method];
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
type ElectronPersistenceErrorResponseByMethod = {
|
|
92
|
+
[Method in ElectronPersistenceMethod]: {
|
|
93
|
+
v: number;
|
|
94
|
+
requestId: string;
|
|
95
|
+
method: Method;
|
|
96
|
+
ok: false;
|
|
97
|
+
error: ElectronSerializedError;
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
export type ElectronPersistenceResponse<TMethod extends ElectronPersistenceMethod = ElectronPersistenceMethod> = ElectronPersistenceSuccessResponseByMethod[TMethod] | ElectronPersistenceErrorResponseByMethod[TMethod];
|
|
101
|
+
export type ElectronPersistenceResponseEnvelope = ElectronPersistenceResponse<ElectronPersistenceMethod>;
|
|
102
|
+
export type ElectronPersistenceRequestHandler = (request: ElectronPersistenceRequestEnvelope) => Promise<ElectronPersistenceResponseEnvelope>;
|
|
103
|
+
export type ElectronPersistenceInvoke = (channel: string, request: ElectronPersistenceRequestEnvelope) => Promise<ElectronPersistenceResponseEnvelope>;
|
|
104
|
+
export {};
|