cojson-storage-sqlite 0.8.35 → 0.8.37
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/CHANGELOG.md +18 -0
- package/dist/index.js +1 -349
- package/dist/index.js.map +1 -1
- package/dist/sqliteClient.js +76 -0
- package/dist/sqliteClient.js.map +1 -0
- package/dist/sqliteNode.js +91 -0
- package/dist/sqliteNode.js.map +1 -0
- package/package.json +4 -3
- package/src/index.ts +1 -609
- package/src/sqliteClient.ts +153 -0
- package/src/sqliteNode.ts +181 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# cojson-storage-sqlite
|
|
2
2
|
|
|
3
|
+
## 0.8.37
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [3d9f12e]
|
|
8
|
+
- cojson@0.8.37
|
|
9
|
+
- cojson-storage@0.8.37
|
|
10
|
+
|
|
11
|
+
## 0.8.36
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- 1afbd2c: Refactor the SQLite and IndexedDB storage packages to extract common synchronization functionality into newly created cojson-storage package.
|
|
16
|
+
- Updated dependencies [441fe27]
|
|
17
|
+
- Updated dependencies [1afbd2c]
|
|
18
|
+
- cojson@0.8.36
|
|
19
|
+
- cojson-storage@0.8.36
|
|
20
|
+
|
|
3
21
|
## 0.8.35
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -1,350 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import Database from "better-sqlite3";
|
|
3
|
-
export class SQLiteStorage {
|
|
4
|
-
constructor(db, fromLocalNode, toLocalNode) {
|
|
5
|
-
this.db = db;
|
|
6
|
-
this.toLocalNode = toLocalNode;
|
|
7
|
-
const processMessages = async () => {
|
|
8
|
-
for await (const msg of fromLocalNode) {
|
|
9
|
-
try {
|
|
10
|
-
if (msg === "Disconnected" || msg === "PingTimeout") {
|
|
11
|
-
throw new Error("Unexpected Disconnected message");
|
|
12
|
-
}
|
|
13
|
-
await this.handleSyncMessage(msg);
|
|
14
|
-
}
|
|
15
|
-
catch (e) {
|
|
16
|
-
console.error(new Error(`Error reading from localNode, handling msg\n\n${JSON.stringify(msg, (k, v) => k === "changes" || k === "encryptedChanges"
|
|
17
|
-
? v.slice(0, 20) + "..."
|
|
18
|
-
: v)}`, { cause: e }));
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
processMessages().catch((e) => console.error("Error in processMessages in sqlite", e));
|
|
23
|
-
}
|
|
24
|
-
static async asPeer({ filename, trace, localNodeName = "local", }) {
|
|
25
|
-
const [localNodeAsPeer, storageAsPeer] = cojsonInternals.connectedPeers(localNodeName, "storage", { peer1role: "client", peer2role: "storage", trace, crashOnClose: true });
|
|
26
|
-
await SQLiteStorage.open(filename, localNodeAsPeer.incoming, localNodeAsPeer.outgoing);
|
|
27
|
-
return { ...storageAsPeer, priority: 100 };
|
|
28
|
-
}
|
|
29
|
-
static async open(filename, fromLocalNode, toLocalNode) {
|
|
30
|
-
const db = Database(filename);
|
|
31
|
-
db.pragma("journal_mode = WAL");
|
|
32
|
-
const oldVersion = db.pragma("user_version")[0].user_version;
|
|
33
|
-
console.log("DB version", oldVersion);
|
|
34
|
-
if (oldVersion === 0) {
|
|
35
|
-
console.log("Migration 0 -> 1: Basic schema");
|
|
36
|
-
db.prepare(`CREATE TABLE IF NOT EXISTS transactions (
|
|
37
|
-
ses INTEGER,
|
|
38
|
-
idx INTEGER,
|
|
39
|
-
tx TEXT NOT NULL,
|
|
40
|
-
PRIMARY KEY (ses, idx)
|
|
41
|
-
) WITHOUT ROWID;`).run();
|
|
42
|
-
db.prepare(`CREATE TABLE IF NOT EXISTS sessions (
|
|
43
|
-
rowID INTEGER PRIMARY KEY,
|
|
44
|
-
coValue INTEGER NOT NULL,
|
|
45
|
-
sessionID TEXT NOT NULL,
|
|
46
|
-
lastIdx INTEGER,
|
|
47
|
-
lastSignature TEXT,
|
|
48
|
-
UNIQUE (sessionID, coValue)
|
|
49
|
-
);`).run();
|
|
50
|
-
db.prepare(`CREATE INDEX IF NOT EXISTS sessionsByCoValue ON sessions (coValue);`).run();
|
|
51
|
-
db.prepare(`CREATE TABLE IF NOT EXISTS coValues (
|
|
52
|
-
rowID INTEGER PRIMARY KEY,
|
|
53
|
-
id TEXT NOT NULL UNIQUE,
|
|
54
|
-
header TEXT NOT NULL UNIQUE
|
|
55
|
-
);`).run();
|
|
56
|
-
db.prepare(`CREATE INDEX IF NOT EXISTS coValuesByID ON coValues (id);`).run();
|
|
57
|
-
db.pragma("user_version = 1");
|
|
58
|
-
console.log("Migration 0 -> 1: Basic schema - done");
|
|
59
|
-
}
|
|
60
|
-
if (oldVersion <= 1) {
|
|
61
|
-
// fix embarrassing off-by-one error for transaction indices
|
|
62
|
-
console.log("Migration 1 -> 2: Fix off-by-one error for transaction indices");
|
|
63
|
-
const txs = db
|
|
64
|
-
.prepare(`SELECT * FROM transactions`)
|
|
65
|
-
.all();
|
|
66
|
-
for (const tx of txs) {
|
|
67
|
-
db.prepare(`DELETE FROM transactions WHERE ses = ? AND idx = ?`).run(tx.ses, tx.idx);
|
|
68
|
-
tx.idx -= 1;
|
|
69
|
-
db.prepare(`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`).run(tx.ses, tx.idx, tx.tx);
|
|
70
|
-
}
|
|
71
|
-
db.pragma("user_version = 2");
|
|
72
|
-
console.log("Migration 1 -> 2: Fix off-by-one error for transaction indices - done");
|
|
73
|
-
}
|
|
74
|
-
if (oldVersion <= 2) {
|
|
75
|
-
console.log("Migration 2 -> 3: Add signatureAfter");
|
|
76
|
-
db.prepare(`CREATE TABLE IF NOT EXISTS signatureAfter (
|
|
77
|
-
ses INTEGER,
|
|
78
|
-
idx INTEGER,
|
|
79
|
-
signature TEXT NOT NULL,
|
|
80
|
-
PRIMARY KEY (ses, idx)
|
|
81
|
-
) WITHOUT ROWID;`).run();
|
|
82
|
-
db.prepare(`ALTER TABLE sessions ADD COLUMN bytesSinceLastSignature INTEGER;`).run();
|
|
83
|
-
db.pragma("user_version = 3");
|
|
84
|
-
console.log("Migration 2 -> 3: Add signatureAfter - done");
|
|
85
|
-
}
|
|
86
|
-
return new SQLiteStorage(db, fromLocalNode, toLocalNode);
|
|
87
|
-
}
|
|
88
|
-
async handleSyncMessage(msg) {
|
|
89
|
-
switch (msg.action) {
|
|
90
|
-
case "load":
|
|
91
|
-
await this.handleLoad(msg);
|
|
92
|
-
break;
|
|
93
|
-
case "content":
|
|
94
|
-
await this.handleContent(msg);
|
|
95
|
-
break;
|
|
96
|
-
case "known":
|
|
97
|
-
await this.handleKnown(msg);
|
|
98
|
-
break;
|
|
99
|
-
case "done":
|
|
100
|
-
await this.handleDone(msg);
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
async sendNewContentAfter(theirKnown, asDependencyOf) {
|
|
105
|
-
const coValueRow = (await this.db
|
|
106
|
-
.prepare(`SELECT * FROM coValues WHERE id = ?`)
|
|
107
|
-
.get(theirKnown.id));
|
|
108
|
-
const allOurSessions = coValueRow
|
|
109
|
-
? this.db
|
|
110
|
-
.prepare(`SELECT * FROM sessions WHERE coValue = ?`)
|
|
111
|
-
.all(coValueRow.rowID)
|
|
112
|
-
: [];
|
|
113
|
-
const ourKnown = {
|
|
114
|
-
id: theirKnown.id,
|
|
115
|
-
header: !!coValueRow,
|
|
116
|
-
sessions: {},
|
|
117
|
-
};
|
|
118
|
-
let parsedHeader;
|
|
119
|
-
try {
|
|
120
|
-
parsedHeader = (coValueRow?.header && JSON.parse(coValueRow.header));
|
|
121
|
-
}
|
|
122
|
-
catch (e) {
|
|
123
|
-
console.warn(theirKnown.id, "Invalid JSON in header", e, coValueRow?.header);
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
const priority = cojsonInternals.getPriorityFromHeader(parsedHeader);
|
|
127
|
-
const newContentPieces = [
|
|
128
|
-
{
|
|
129
|
-
action: "content",
|
|
130
|
-
id: theirKnown.id,
|
|
131
|
-
header: theirKnown.header ? undefined : parsedHeader,
|
|
132
|
-
new: {},
|
|
133
|
-
priority,
|
|
134
|
-
},
|
|
135
|
-
];
|
|
136
|
-
for (const sessionRow of allOurSessions) {
|
|
137
|
-
ourKnown.sessions[sessionRow.sessionID] = sessionRow.lastIdx;
|
|
138
|
-
if (sessionRow.lastIdx > (theirKnown.sessions[sessionRow.sessionID] || 0)) {
|
|
139
|
-
const firstNewTxIdx = theirKnown.sessions[sessionRow.sessionID] || 0;
|
|
140
|
-
const signaturesAndIdxs = this.db
|
|
141
|
-
.prepare(`SELECT * FROM signatureAfter WHERE ses = ? AND idx >= ?`)
|
|
142
|
-
.all(sessionRow.rowID, firstNewTxIdx);
|
|
143
|
-
// console.log(
|
|
144
|
-
// theirKnown.id,
|
|
145
|
-
// "signaturesAndIdxs",
|
|
146
|
-
// JSON.stringify(signaturesAndIdxs)
|
|
147
|
-
// );
|
|
148
|
-
const newTxInSession = this.db
|
|
149
|
-
.prepare(`SELECT * FROM transactions WHERE ses = ? AND idx >= ?`)
|
|
150
|
-
.all(sessionRow.rowID, firstNewTxIdx);
|
|
151
|
-
let idx = firstNewTxIdx;
|
|
152
|
-
// console.log(
|
|
153
|
-
// theirKnown.id,
|
|
154
|
-
// "newTxInSession",
|
|
155
|
-
// newTxInSession.length
|
|
156
|
-
// );
|
|
157
|
-
for (const tx of newTxInSession) {
|
|
158
|
-
let sessionEntry = newContentPieces[newContentPieces.length - 1].new[sessionRow.sessionID];
|
|
159
|
-
if (!sessionEntry) {
|
|
160
|
-
sessionEntry = {
|
|
161
|
-
after: idx,
|
|
162
|
-
lastSignature: "WILL_BE_REPLACED",
|
|
163
|
-
newTransactions: [],
|
|
164
|
-
};
|
|
165
|
-
newContentPieces[newContentPieces.length - 1].new[sessionRow.sessionID] = sessionEntry;
|
|
166
|
-
}
|
|
167
|
-
let parsedTx;
|
|
168
|
-
try {
|
|
169
|
-
parsedTx = JSON.parse(tx.tx);
|
|
170
|
-
}
|
|
171
|
-
catch (e) {
|
|
172
|
-
console.warn(theirKnown.id, "Invalid JSON in transaction", e, tx.tx);
|
|
173
|
-
break;
|
|
174
|
-
}
|
|
175
|
-
sessionEntry.newTransactions.push(parsedTx);
|
|
176
|
-
if (signaturesAndIdxs[0] && idx === signaturesAndIdxs[0].idx) {
|
|
177
|
-
sessionEntry.lastSignature = signaturesAndIdxs[0].signature;
|
|
178
|
-
signaturesAndIdxs.shift();
|
|
179
|
-
newContentPieces.push({
|
|
180
|
-
action: "content",
|
|
181
|
-
id: theirKnown.id,
|
|
182
|
-
new: {},
|
|
183
|
-
priority,
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
else if (idx === firstNewTxIdx + newTxInSession.length - 1) {
|
|
187
|
-
sessionEntry.lastSignature = sessionRow.lastSignature;
|
|
188
|
-
}
|
|
189
|
-
idx += 1;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
const dependedOnCoValues = parsedHeader?.ruleset.type === "group"
|
|
194
|
-
? newContentPieces
|
|
195
|
-
.flatMap((piece) => Object.values(piece.new))
|
|
196
|
-
.flatMap((sessionEntry) => sessionEntry.newTransactions.flatMap((tx) => {
|
|
197
|
-
if (tx.privacy !== "trusting")
|
|
198
|
-
return [];
|
|
199
|
-
// TODO: avoid parsing here?
|
|
200
|
-
let parsedChanges;
|
|
201
|
-
try {
|
|
202
|
-
parsedChanges = cojsonInternals.parseJSON(tx.changes);
|
|
203
|
-
}
|
|
204
|
-
catch (e) {
|
|
205
|
-
console.warn(theirKnown.id, "Invalid JSON in transaction", e, tx.changes);
|
|
206
|
-
return [];
|
|
207
|
-
}
|
|
208
|
-
return cojsonInternals.getGroupDependentKeyList(parsedChanges.map((change) => change &&
|
|
209
|
-
typeof change === "object" &&
|
|
210
|
-
"op" in change &&
|
|
211
|
-
change.op === "set" &&
|
|
212
|
-
"key" in change &&
|
|
213
|
-
change.key));
|
|
214
|
-
}))
|
|
215
|
-
: parsedHeader?.ruleset.type === "ownedByGroup"
|
|
216
|
-
? [
|
|
217
|
-
parsedHeader?.ruleset.group,
|
|
218
|
-
...new Set(newContentPieces.flatMap((piece) => Object.keys(piece.new)
|
|
219
|
-
.map((sessionID) => cojsonInternals.accountOrAgentIDfromSessionID(sessionID))
|
|
220
|
-
.filter((accountID) => cojsonInternals.isAccountID(accountID) &&
|
|
221
|
-
accountID !== theirKnown.id))),
|
|
222
|
-
]
|
|
223
|
-
: [];
|
|
224
|
-
for (const dependedOnCoValue of dependedOnCoValues) {
|
|
225
|
-
await this.sendNewContentAfter({ id: dependedOnCoValue, header: false, sessions: {} }, asDependencyOf || theirKnown.id);
|
|
226
|
-
}
|
|
227
|
-
this.toLocalNode
|
|
228
|
-
.push({
|
|
229
|
-
action: "known",
|
|
230
|
-
...ourKnown,
|
|
231
|
-
asDependencyOf,
|
|
232
|
-
})
|
|
233
|
-
.catch((e) => console.error("Error while pushing known", e));
|
|
234
|
-
const nonEmptyNewContentPieces = newContentPieces.filter((piece) => piece.header || Object.keys(piece.new).length > 0);
|
|
235
|
-
// console.log(theirKnown.id, nonEmptyNewContentPieces);
|
|
236
|
-
for (const piece of nonEmptyNewContentPieces) {
|
|
237
|
-
this.toLocalNode
|
|
238
|
-
.push(piece)
|
|
239
|
-
.catch((e) => console.error("Error while pushing content piece", e));
|
|
240
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
handleLoad(msg) {
|
|
244
|
-
return this.sendNewContentAfter(msg);
|
|
245
|
-
}
|
|
246
|
-
async handleContent(msg) {
|
|
247
|
-
let storedCoValueRowID = this.db
|
|
248
|
-
.prepare(`SELECT rowID FROM coValues WHERE id = ?`)
|
|
249
|
-
.get(msg.id)?.rowID;
|
|
250
|
-
if (storedCoValueRowID === undefined) {
|
|
251
|
-
const header = msg.header;
|
|
252
|
-
if (!header) {
|
|
253
|
-
console.error("Expected to be sent header first");
|
|
254
|
-
this.toLocalNode
|
|
255
|
-
.push({
|
|
256
|
-
action: "known",
|
|
257
|
-
id: msg.id,
|
|
258
|
-
header: false,
|
|
259
|
-
sessions: {},
|
|
260
|
-
isCorrection: true,
|
|
261
|
-
})
|
|
262
|
-
.catch((e) => console.error("Error while pushing known", e));
|
|
263
|
-
return;
|
|
264
|
-
}
|
|
265
|
-
storedCoValueRowID = this.db
|
|
266
|
-
.prepare(`INSERT INTO coValues (id, header) VALUES (?, ?)`)
|
|
267
|
-
.run(msg.id, JSON.stringify(header)).lastInsertRowid;
|
|
268
|
-
}
|
|
269
|
-
const ourKnown = {
|
|
270
|
-
id: msg.id,
|
|
271
|
-
header: true,
|
|
272
|
-
sessions: {},
|
|
273
|
-
};
|
|
274
|
-
let invalidAssumptions = false;
|
|
275
|
-
this.db.transaction(() => {
|
|
276
|
-
const allOurSessions = this.db
|
|
277
|
-
.prepare(`SELECT * FROM sessions WHERE coValue = ?`)
|
|
278
|
-
.all(storedCoValueRowID).reduce((acc, row) => {
|
|
279
|
-
acc[row.sessionID] = row;
|
|
280
|
-
return acc;
|
|
281
|
-
}, {});
|
|
282
|
-
for (const sessionID of Object.keys(msg.new)) {
|
|
283
|
-
const sessionRow = allOurSessions[sessionID];
|
|
284
|
-
if (sessionRow) {
|
|
285
|
-
ourKnown.sessions[sessionRow.sessionID] = sessionRow.lastIdx;
|
|
286
|
-
}
|
|
287
|
-
if ((sessionRow?.lastIdx || 0) < (msg.new[sessionID]?.after || 0)) {
|
|
288
|
-
invalidAssumptions = true;
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
const newTransactions = msg.new[sessionID]?.newTransactions || [];
|
|
292
|
-
const actuallyNewOffset = (sessionRow?.lastIdx || 0) - (msg.new[sessionID]?.after || 0);
|
|
293
|
-
const actuallyNewTransactions = newTransactions.slice(actuallyNewOffset);
|
|
294
|
-
let newBytesSinceLastSignature = (sessionRow?.bytesSinceLastSignature || 0) +
|
|
295
|
-
actuallyNewTransactions.reduce((sum, tx) => sum +
|
|
296
|
-
(tx.privacy === "private"
|
|
297
|
-
? tx.encryptedChanges.length
|
|
298
|
-
: tx.changes.length), 0);
|
|
299
|
-
const newLastIdx = (sessionRow?.lastIdx || 0) + actuallyNewTransactions.length;
|
|
300
|
-
let shouldWriteSignature = false;
|
|
301
|
-
if (newBytesSinceLastSignature > MAX_RECOMMENDED_TX_SIZE) {
|
|
302
|
-
shouldWriteSignature = true;
|
|
303
|
-
newBytesSinceLastSignature = 0;
|
|
304
|
-
}
|
|
305
|
-
let nextIdx = sessionRow?.lastIdx || 0;
|
|
306
|
-
const sessionUpdate = {
|
|
307
|
-
coValue: storedCoValueRowID,
|
|
308
|
-
sessionID: sessionID,
|
|
309
|
-
lastIdx: newLastIdx,
|
|
310
|
-
lastSignature: msg.new[sessionID].lastSignature,
|
|
311
|
-
bytesSinceLastSignature: newBytesSinceLastSignature,
|
|
312
|
-
};
|
|
313
|
-
const upsertedSession = this.db
|
|
314
|
-
.prepare(`INSERT INTO sessions (coValue, sessionID, lastIdx, lastSignature, bytesSinceLastSignature) VALUES (?, ?, ?, ?, ?)
|
|
315
|
-
ON CONFLICT(coValue, sessionID) DO UPDATE SET lastIdx=excluded.lastIdx, lastSignature=excluded.lastSignature, bytesSinceLastSignature=excluded.bytesSinceLastSignature
|
|
316
|
-
RETURNING rowID`)
|
|
317
|
-
.get(sessionUpdate.coValue, sessionUpdate.sessionID, sessionUpdate.lastIdx, sessionUpdate.lastSignature, sessionUpdate.bytesSinceLastSignature);
|
|
318
|
-
const sessionRowID = upsertedSession.rowID;
|
|
319
|
-
if (shouldWriteSignature) {
|
|
320
|
-
this.db
|
|
321
|
-
.prepare(`INSERT INTO signatureAfter (ses, idx, signature) VALUES (?, ?, ?)`)
|
|
322
|
-
.run(sessionRowID,
|
|
323
|
-
// TODO: newLastIdx is a misnomer, it's actually more like nextIdx or length
|
|
324
|
-
newLastIdx - 1, msg.new[sessionID].lastSignature);
|
|
325
|
-
}
|
|
326
|
-
for (const newTransaction of actuallyNewTransactions) {
|
|
327
|
-
this.db
|
|
328
|
-
.prepare(`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`)
|
|
329
|
-
.run(sessionRowID, nextIdx, JSON.stringify(newTransaction));
|
|
330
|
-
nextIdx++;
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
})();
|
|
335
|
-
if (invalidAssumptions) {
|
|
336
|
-
this.toLocalNode
|
|
337
|
-
.push({
|
|
338
|
-
action: "known",
|
|
339
|
-
...ourKnown,
|
|
340
|
-
isCorrection: invalidAssumptions,
|
|
341
|
-
})
|
|
342
|
-
.catch((e) => console.error("Error while pushing known", e));
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
handleKnown(msg) {
|
|
346
|
-
return this.sendNewContentAfter(msg);
|
|
347
|
-
}
|
|
348
|
-
handleDone(_msg) { }
|
|
349
|
-
}
|
|
1
|
+
export { SQLiteNode, SQLiteNode as SQLiteStorage } from "./sqliteNode.js";
|
|
350
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export class SQLiteClient {
|
|
2
|
+
constructor(db, toLocalNode) {
|
|
3
|
+
this.db = db;
|
|
4
|
+
this.toLocalNode = toLocalNode;
|
|
5
|
+
}
|
|
6
|
+
getCoValue(coValueId) {
|
|
7
|
+
const coValueRow = this.db
|
|
8
|
+
.prepare(`SELECT * FROM coValues WHERE id = ?`)
|
|
9
|
+
.get(coValueId);
|
|
10
|
+
if (!coValueRow)
|
|
11
|
+
return;
|
|
12
|
+
try {
|
|
13
|
+
const parsedHeader = (coValueRow?.header &&
|
|
14
|
+
JSON.parse(coValueRow.header));
|
|
15
|
+
return {
|
|
16
|
+
...coValueRow,
|
|
17
|
+
header: parsedHeader,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
console.warn(coValueId, "Invalid JSON in header", e, coValueRow?.header);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
getCoValueSessions(coValueRowId) {
|
|
26
|
+
return this.db
|
|
27
|
+
.prepare(`SELECT * FROM sessions WHERE coValue = ?`)
|
|
28
|
+
.all(coValueRowId);
|
|
29
|
+
}
|
|
30
|
+
getNewTransactionInSession(sessionRowId, firstNewTxIdx) {
|
|
31
|
+
const txs = this.db
|
|
32
|
+
.prepare(`SELECT * FROM transactions WHERE ses = ? AND idx >= ?`)
|
|
33
|
+
.all(sessionRowId, firstNewTxIdx);
|
|
34
|
+
try {
|
|
35
|
+
return txs.map((transactionRow) => ({
|
|
36
|
+
...transactionRow,
|
|
37
|
+
tx: JSON.parse(transactionRow.tx),
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
console.warn("Invalid JSON in transaction", e);
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
getSignatures(sessionRowId, firstNewTxIdx) {
|
|
46
|
+
return this.db
|
|
47
|
+
.prepare(`SELECT * FROM signatureAfter WHERE ses = ? AND idx >= ?`)
|
|
48
|
+
.all(sessionRowId, firstNewTxIdx);
|
|
49
|
+
}
|
|
50
|
+
addCoValue(msg) {
|
|
51
|
+
return this.db
|
|
52
|
+
.prepare(`INSERT INTO coValues (id, header) VALUES (?, ?)`)
|
|
53
|
+
.run(msg.id, JSON.stringify(msg.header)).lastInsertRowid;
|
|
54
|
+
}
|
|
55
|
+
addSessionUpdate({ sessionUpdate, sessionRow, }) {
|
|
56
|
+
return this.db
|
|
57
|
+
.prepare(`INSERT INTO sessions (coValue, sessionID, lastIdx, lastSignature, bytesSinceLastSignature) VALUES (?, ?, ?, ?, ?)
|
|
58
|
+
ON CONFLICT(coValue, sessionID) DO UPDATE SET lastIdx=excluded.lastIdx, lastSignature=excluded.lastSignature, bytesSinceLastSignature=excluded.bytesSinceLastSignature
|
|
59
|
+
RETURNING rowID`)
|
|
60
|
+
.get(sessionUpdate.coValue, sessionUpdate.sessionID, sessionUpdate.lastIdx, sessionUpdate.lastSignature, sessionUpdate.bytesSinceLastSignature).rowID;
|
|
61
|
+
}
|
|
62
|
+
addTransaction(sessionRowID, nextIdx, newTransaction) {
|
|
63
|
+
this.db
|
|
64
|
+
.prepare(`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`)
|
|
65
|
+
.run(sessionRowID, nextIdx, JSON.stringify(newTransaction));
|
|
66
|
+
}
|
|
67
|
+
addSignatureAfter({ sessionRowID, idx, signature, }) {
|
|
68
|
+
this.db
|
|
69
|
+
.prepare(`INSERT INTO signatureAfter (ses, idx, signature) VALUES (?, ?, ?)`)
|
|
70
|
+
.run(sessionRowID, idx, signature);
|
|
71
|
+
}
|
|
72
|
+
unitOfWork(operationsCallback) {
|
|
73
|
+
this.db.transaction(operationsCallback)();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=sqliteClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqliteClient.js","sourceRoot":"","sources":["../src/sqliteClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import { cojsonInternals, } from "cojson";
|
|
3
|
+
import { SyncManager } from "cojson-storage";
|
|
4
|
+
import { SQLiteClient } from "./sqliteClient.js";
|
|
5
|
+
export class SQLiteNode {
|
|
6
|
+
constructor(db, fromLocalNode, toLocalNode) {
|
|
7
|
+
this.dbClient = new SQLiteClient(db, toLocalNode);
|
|
8
|
+
this.syncManager = new SyncManager(this.dbClient, toLocalNode);
|
|
9
|
+
const processMessages = async () => {
|
|
10
|
+
for await (const msg of fromLocalNode) {
|
|
11
|
+
try {
|
|
12
|
+
if (msg === "Disconnected" || msg === "PingTimeout") {
|
|
13
|
+
throw new Error("Unexpected Disconnected message");
|
|
14
|
+
}
|
|
15
|
+
await this.syncManager.handleSyncMessage(msg);
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
console.error(new Error(`Error reading from localNode, handling msg\n\n${JSON.stringify(msg, (k, v) => k === "changes" || k === "encryptedChanges"
|
|
19
|
+
? v.slice(0, 20) + "..."
|
|
20
|
+
: v)}`, { cause: e }));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
processMessages().catch((e) => console.error("Error in processMessages in sqlite", e));
|
|
25
|
+
}
|
|
26
|
+
static async asPeer({ filename, trace, localNodeName = "local", }) {
|
|
27
|
+
const [localNodeAsPeer, storageAsPeer] = cojsonInternals.connectedPeers(localNodeName, "storage", { peer1role: "client", peer2role: "storage", trace, crashOnClose: true });
|
|
28
|
+
await SQLiteNode.open(filename, localNodeAsPeer.incoming, localNodeAsPeer.outgoing);
|
|
29
|
+
return { ...storageAsPeer, priority: 100 };
|
|
30
|
+
}
|
|
31
|
+
static async open(filename, fromLocalNode, toLocalNode) {
|
|
32
|
+
const db = Database(filename);
|
|
33
|
+
db.pragma("journal_mode = WAL");
|
|
34
|
+
const oldVersion = db.pragma("user_version")[0].user_version;
|
|
35
|
+
console.log("DB version", oldVersion);
|
|
36
|
+
if (oldVersion === 0) {
|
|
37
|
+
console.log("Migration 0 -> 1: Basic schema");
|
|
38
|
+
db.prepare(`CREATE TABLE IF NOT EXISTS transactions (
|
|
39
|
+
ses INTEGER,
|
|
40
|
+
idx INTEGER,
|
|
41
|
+
tx TEXT NOT NULL,
|
|
42
|
+
PRIMARY KEY (ses, idx)
|
|
43
|
+
) WITHOUT ROWID;`).run();
|
|
44
|
+
db.prepare(`CREATE TABLE IF NOT EXISTS sessions (
|
|
45
|
+
rowID INTEGER PRIMARY KEY,
|
|
46
|
+
coValue INTEGER NOT NULL,
|
|
47
|
+
sessionID TEXT NOT NULL,
|
|
48
|
+
lastIdx INTEGER,
|
|
49
|
+
lastSignature TEXT,
|
|
50
|
+
UNIQUE (sessionID, coValue)
|
|
51
|
+
);`).run();
|
|
52
|
+
db.prepare(`CREATE INDEX IF NOT EXISTS sessionsByCoValue ON sessions (coValue);`).run();
|
|
53
|
+
db.prepare(`CREATE TABLE IF NOT EXISTS coValues (
|
|
54
|
+
rowID INTEGER PRIMARY KEY,
|
|
55
|
+
id TEXT NOT NULL UNIQUE,
|
|
56
|
+
header TEXT NOT NULL UNIQUE
|
|
57
|
+
);`).run();
|
|
58
|
+
db.prepare(`CREATE INDEX IF NOT EXISTS coValuesByID ON coValues (id);`).run();
|
|
59
|
+
db.pragma("user_version = 1");
|
|
60
|
+
console.log("Migration 0 -> 1: Basic schema - done");
|
|
61
|
+
}
|
|
62
|
+
if (oldVersion <= 1) {
|
|
63
|
+
// fix embarrassing off-by-one error for transaction indices
|
|
64
|
+
console.log("Migration 1 -> 2: Fix off-by-one error for transaction indices");
|
|
65
|
+
const txs = db
|
|
66
|
+
.prepare(`SELECT * FROM transactions`)
|
|
67
|
+
.all();
|
|
68
|
+
for (const tx of txs) {
|
|
69
|
+
db.prepare(`DELETE FROM transactions WHERE ses = ? AND idx = ?`).run(tx.ses, tx.idx);
|
|
70
|
+
tx.idx -= 1;
|
|
71
|
+
db.prepare(`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`).run(tx.ses, tx.idx, tx.tx);
|
|
72
|
+
}
|
|
73
|
+
db.pragma("user_version = 2");
|
|
74
|
+
console.log("Migration 1 -> 2: Fix off-by-one error for transaction indices - done");
|
|
75
|
+
}
|
|
76
|
+
if (oldVersion <= 2) {
|
|
77
|
+
console.log("Migration 2 -> 3: Add signatureAfter");
|
|
78
|
+
db.prepare(`CREATE TABLE IF NOT EXISTS signatureAfter (
|
|
79
|
+
ses INTEGER,
|
|
80
|
+
idx INTEGER,
|
|
81
|
+
signature TEXT NOT NULL,
|
|
82
|
+
PRIMARY KEY (ses, idx)
|
|
83
|
+
) WITHOUT ROWID;`).run();
|
|
84
|
+
db.prepare(`ALTER TABLE sessions ADD COLUMN bytesSinceLastSignature INTEGER;`).run();
|
|
85
|
+
db.pragma("user_version = 3");
|
|
86
|
+
console.log("Migration 2 -> 3: Add signatureAfter - done!!");
|
|
87
|
+
}
|
|
88
|
+
return new SQLiteNode(db, fromLocalNode, toLocalNode);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=sqliteNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqliteNode.js","sourceRoot":"","sources":["../src/sqliteNode.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cojson-storage-sqlite",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.37",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "src/index.ts",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"better-sqlite3": "^8.5.2",
|
|
10
|
-
"cojson": "0.8.
|
|
11
|
-
"
|
|
10
|
+
"cojson": "0.8.37",
|
|
11
|
+
"cojson-storage": "0.8.37"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
|
+
"typescript": "^5.3.3",
|
|
14
15
|
"@types/better-sqlite3": "^7.6.4"
|
|
15
16
|
},
|
|
16
17
|
"gitHead": "33c27053293b4801b968c61d5c4c989f93a67d13",
|