cojson-storage-sqlite 0.2.3 → 0.2.5
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/dist/index.js +98 -25
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +174 -38
package/dist/index.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import { cojsonInternals,
|
|
2
|
-
// CojsonInternalTypes,
|
|
3
|
-
// SessionID,
|
|
4
|
-
} from "cojson";
|
|
1
|
+
import { cojsonInternals, MAX_RECOMMENDED_TX_SIZE, } from "cojson";
|
|
5
2
|
import Database from "better-sqlite3";
|
|
6
3
|
export class SQLiteStorage {
|
|
7
4
|
constructor(db, fromLocalNode, toLocalNode) {
|
|
@@ -34,7 +31,7 @@ export class SQLiteStorage {
|
|
|
34
31
|
db.prepare(`CREATE TABLE IF NOT EXISTS transactions (
|
|
35
32
|
ses INTEGER,
|
|
36
33
|
idx INTEGER,
|
|
37
|
-
tx TEXT NOT NULL
|
|
34
|
+
tx TEXT NOT NULL,
|
|
38
35
|
PRIMARY KEY (ses, idx)
|
|
39
36
|
) WITHOUT ROWID;`).run();
|
|
40
37
|
db.prepare(`CREATE TABLE IF NOT EXISTS sessions (
|
|
@@ -58,7 +55,9 @@ export class SQLiteStorage {
|
|
|
58
55
|
if (oldVersion <= 1) {
|
|
59
56
|
// fix embarrassing off-by-one error for transaction indices
|
|
60
57
|
console.log("Migration 1 -> 2: Fix off-by-one error for transaction indices");
|
|
61
|
-
const txs = db
|
|
58
|
+
const txs = db
|
|
59
|
+
.prepare(`SELECT * FROM transactions`)
|
|
60
|
+
.all();
|
|
62
61
|
for (const tx of txs) {
|
|
63
62
|
db.prepare(`DELETE FROM transactions WHERE ses = ? AND idx = ?`).run(tx.ses, tx.idx);
|
|
64
63
|
tx.idx -= 1;
|
|
@@ -67,6 +66,18 @@ export class SQLiteStorage {
|
|
|
67
66
|
db.pragma("user_version = 2");
|
|
68
67
|
console.log("Migration 1 -> 2: Fix off-by-one error for transaction indices - done");
|
|
69
68
|
}
|
|
69
|
+
if (oldVersion <= 2) {
|
|
70
|
+
console.log("Migration 2 -> 3: Add signatureAfter");
|
|
71
|
+
db.prepare(`CREATE TABLE IF NOT EXISTS signatureAfter (
|
|
72
|
+
ses INTEGER,
|
|
73
|
+
idx INTEGER,
|
|
74
|
+
signature TEXT NOT NULL,
|
|
75
|
+
PRIMARY KEY (ses, idx)
|
|
76
|
+
) WITHOUT ROWID;`).run();
|
|
77
|
+
db.prepare(`ALTER TABLE sessions ADD COLUMN bytesSinceLastSignature INTEGER;`).run();
|
|
78
|
+
db.pragma("user_version = 3");
|
|
79
|
+
console.log("Migration 2 -> 3: Add signatureAfter - done");
|
|
80
|
+
}
|
|
70
81
|
return new SQLiteStorage(db, fromLocalNode, toLocalNode);
|
|
71
82
|
}
|
|
72
83
|
async handleSyncMessage(msg) {
|
|
@@ -101,29 +112,69 @@ export class SQLiteStorage {
|
|
|
101
112
|
};
|
|
102
113
|
const parsedHeader = (coValueRow?.header &&
|
|
103
114
|
JSON.parse(coValueRow.header));
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
115
|
+
const newContentPieces = [
|
|
116
|
+
{
|
|
117
|
+
action: "content",
|
|
118
|
+
id: theirKnown.id,
|
|
119
|
+
header: theirKnown.header ? undefined : parsedHeader,
|
|
120
|
+
new: {},
|
|
121
|
+
},
|
|
122
|
+
];
|
|
110
123
|
for (const sessionRow of allOurSessions) {
|
|
111
124
|
ourKnown.sessions[sessionRow.sessionID] = sessionRow.lastIdx;
|
|
112
125
|
if (sessionRow.lastIdx >
|
|
113
126
|
(theirKnown.sessions[sessionRow.sessionID] || 0)) {
|
|
114
127
|
const firstNewTxIdx = theirKnown.sessions[sessionRow.sessionID] || 0;
|
|
128
|
+
const signaturesAndIdxs = this.db
|
|
129
|
+
.prepare(`SELECT * FROM signatureAfter WHERE ses = ? AND idx >= ?`)
|
|
130
|
+
.all(sessionRow.rowID, firstNewTxIdx);
|
|
131
|
+
// console.log(
|
|
132
|
+
// theirKnown.id,
|
|
133
|
+
// "signaturesAndIdxs",
|
|
134
|
+
// JSON.stringify(signaturesAndIdxs)
|
|
135
|
+
// );
|
|
115
136
|
const newTxInSession = this.db
|
|
116
137
|
.prepare(`SELECT * FROM transactions WHERE ses = ? AND idx >= ?`)
|
|
117
138
|
.all(sessionRow.rowID, firstNewTxIdx);
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
139
|
+
let idx = firstNewTxIdx;
|
|
140
|
+
// console.log(
|
|
141
|
+
// theirKnown.id,
|
|
142
|
+
// "newTxInSession",
|
|
143
|
+
// newTxInSession.length
|
|
144
|
+
// );
|
|
145
|
+
for (const tx of newTxInSession) {
|
|
146
|
+
let sessionEntry = newContentPieces[newContentPieces.length - 1].new[sessionRow.sessionID];
|
|
147
|
+
if (!sessionEntry) {
|
|
148
|
+
sessionEntry = {
|
|
149
|
+
after: idx,
|
|
150
|
+
lastSignature: "WILL_BE_REPLACED",
|
|
151
|
+
newTransactions: [],
|
|
152
|
+
};
|
|
153
|
+
newContentPieces[newContentPieces.length - 1].new[sessionRow.sessionID] = sessionEntry;
|
|
154
|
+
}
|
|
155
|
+
sessionEntry.newTransactions.push(JSON.parse(tx.tx));
|
|
156
|
+
if (signaturesAndIdxs[0] &&
|
|
157
|
+
idx === signaturesAndIdxs[0].idx) {
|
|
158
|
+
sessionEntry.lastSignature =
|
|
159
|
+
signaturesAndIdxs[0].signature;
|
|
160
|
+
signaturesAndIdxs.shift();
|
|
161
|
+
newContentPieces.push({
|
|
162
|
+
action: "content",
|
|
163
|
+
id: theirKnown.id,
|
|
164
|
+
new: {},
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
else if (idx ===
|
|
168
|
+
firstNewTxIdx + newTxInSession.length - 1) {
|
|
169
|
+
sessionEntry.lastSignature = sessionRow.lastSignature;
|
|
170
|
+
}
|
|
171
|
+
idx += 1;
|
|
172
|
+
}
|
|
123
173
|
}
|
|
124
174
|
}
|
|
125
175
|
const dependedOnCoValues = parsedHeader?.ruleset.type === "group"
|
|
126
|
-
?
|
|
176
|
+
? newContentPieces
|
|
177
|
+
.flatMap((piece) => Object.values(piece.new)).flatMap((sessionEntry) => sessionEntry.newTransactions.flatMap((tx) => {
|
|
127
178
|
if (tx.privacy !== "trusting")
|
|
128
179
|
return [];
|
|
129
180
|
// TODO: avoid parsing here?
|
|
@@ -149,8 +200,11 @@ export class SQLiteStorage {
|
|
|
149
200
|
...ourKnown,
|
|
150
201
|
asDependencyOf,
|
|
151
202
|
});
|
|
152
|
-
|
|
153
|
-
|
|
203
|
+
const nonEmptyNewContentPieces = newContentPieces.filter((piece) => piece.header || Object.keys(piece.new).length > 0);
|
|
204
|
+
// console.log(theirKnown.id, nonEmptyNewContentPieces);
|
|
205
|
+
for (const piece of nonEmptyNewContentPieces) {
|
|
206
|
+
await this.toLocalNode.write(piece);
|
|
207
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
154
208
|
}
|
|
155
209
|
}
|
|
156
210
|
handleLoad(msg) {
|
|
@@ -205,20 +259,39 @@ export class SQLiteStorage {
|
|
|
205
259
|
const actuallyNewOffset = (sessionRow?.lastIdx || 0) -
|
|
206
260
|
(msg.new[sessionID]?.after || 0);
|
|
207
261
|
const actuallyNewTransactions = newTransactions.slice(actuallyNewOffset);
|
|
262
|
+
let newBytesSinceLastSignature = (sessionRow?.bytesSinceLastSignature || 0) +
|
|
263
|
+
actuallyNewTransactions.reduce((sum, tx) => sum +
|
|
264
|
+
(tx.privacy === "private"
|
|
265
|
+
? tx.encryptedChanges.length
|
|
266
|
+
: tx.changes.length), 0);
|
|
267
|
+
const newLastIdx = (sessionRow?.lastIdx || 0) +
|
|
268
|
+
actuallyNewTransactions.length;
|
|
269
|
+
let shouldWriteSignature = false;
|
|
270
|
+
if (newBytesSinceLastSignature > MAX_RECOMMENDED_TX_SIZE) {
|
|
271
|
+
shouldWriteSignature = true;
|
|
272
|
+
newBytesSinceLastSignature = 0;
|
|
273
|
+
}
|
|
208
274
|
let nextIdx = sessionRow?.lastIdx || 0;
|
|
209
275
|
const sessionUpdate = {
|
|
210
276
|
coValue: storedCoValueRowID,
|
|
211
277
|
sessionID: sessionID,
|
|
212
|
-
lastIdx:
|
|
213
|
-
actuallyNewTransactions.length,
|
|
278
|
+
lastIdx: newLastIdx,
|
|
214
279
|
lastSignature: msg.new[sessionID].lastSignature,
|
|
280
|
+
bytesSinceLastSignature: newBytesSinceLastSignature,
|
|
215
281
|
};
|
|
216
282
|
const upsertedSession = this.db
|
|
217
|
-
.prepare(`INSERT INTO sessions (coValue, sessionID, lastIdx, lastSignature) VALUES (?, ?, ?, ?)
|
|
218
|
-
ON CONFLICT(coValue, sessionID) DO UPDATE SET lastIdx=excluded.lastIdx, lastSignature=excluded.lastSignature
|
|
283
|
+
.prepare(`INSERT INTO sessions (coValue, sessionID, lastIdx, lastSignature, bytesSinceLastSignature) VALUES (?, ?, ?, ?, ?)
|
|
284
|
+
ON CONFLICT(coValue, sessionID) DO UPDATE SET lastIdx=excluded.lastIdx, lastSignature=excluded.lastSignature, bytesSinceLastSignature=excluded.bytesSinceLastSignature
|
|
219
285
|
RETURNING rowID`)
|
|
220
|
-
.get(sessionUpdate.coValue, sessionUpdate.sessionID, sessionUpdate.lastIdx, sessionUpdate.lastSignature);
|
|
286
|
+
.get(sessionUpdate.coValue, sessionUpdate.sessionID, sessionUpdate.lastIdx, sessionUpdate.lastSignature, sessionUpdate.bytesSinceLastSignature);
|
|
221
287
|
const sessionRowID = upsertedSession.rowID;
|
|
288
|
+
if (shouldWriteSignature) {
|
|
289
|
+
this.db
|
|
290
|
+
.prepare(`INSERT INTO signatureAfter (ses, idx, signature) VALUES (?, ?, ?)`)
|
|
291
|
+
.run(sessionRowID,
|
|
292
|
+
// TODO: newLastIdx is a misnomer, it's actually more like nextIdx or length
|
|
293
|
+
newLastIdx - 1, msg.new[sessionID].lastSignature);
|
|
294
|
+
}
|
|
222
295
|
for (const newTransaction of actuallyNewTransactions) {
|
|
223
296
|
this.db
|
|
224
297
|
.prepare(`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`)
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cojson-storage-sqlite",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.5",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"better-sqlite3": "^8.5.2",
|
|
10
|
-
"cojson": "^0.2.
|
|
10
|
+
"cojson": "^0.2.2",
|
|
11
11
|
"typescript": "^5.1.6"
|
|
12
12
|
},
|
|
13
13
|
"scripts": {
|
|
@@ -18,5 +18,5 @@
|
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/better-sqlite3": "^7.6.4"
|
|
20
20
|
},
|
|
21
|
-
"gitHead": "
|
|
21
|
+
"gitHead": "6720c192335d1c12c6bb50b7c52ff0d9ed1d5396"
|
|
22
22
|
}
|
package/src/index.ts
CHANGED
|
@@ -4,8 +4,7 @@ import {
|
|
|
4
4
|
Peer,
|
|
5
5
|
CojsonInternalTypes,
|
|
6
6
|
SessionID,
|
|
7
|
-
|
|
8
|
-
// SessionID,
|
|
7
|
+
MAX_RECOMMENDED_TX_SIZE,
|
|
9
8
|
} from "cojson";
|
|
10
9
|
import {
|
|
11
10
|
ReadableStream,
|
|
@@ -15,7 +14,6 @@ import {
|
|
|
15
14
|
} from "isomorphic-streams";
|
|
16
15
|
|
|
17
16
|
import Database, { Database as DatabaseT } from "better-sqlite3";
|
|
18
|
-
import { RawCoID } from "cojson/dist/ids";
|
|
19
17
|
|
|
20
18
|
type CoValueRow = {
|
|
21
19
|
id: CojsonInternalTypes.RawCoID;
|
|
@@ -29,6 +27,7 @@ type SessionRow = {
|
|
|
29
27
|
sessionID: SessionID;
|
|
30
28
|
lastIdx: number;
|
|
31
29
|
lastSignature: CojsonInternalTypes.Signature;
|
|
30
|
+
bytesSinceLastSignature?: number;
|
|
32
31
|
};
|
|
33
32
|
|
|
34
33
|
type StoredSessionRow = SessionRow & { rowID: number };
|
|
@@ -39,6 +38,12 @@ type TransactionRow = {
|
|
|
39
38
|
tx: string;
|
|
40
39
|
};
|
|
41
40
|
|
|
41
|
+
type SignatureAfterRow = {
|
|
42
|
+
ses: number;
|
|
43
|
+
idx: number;
|
|
44
|
+
signature: CojsonInternalTypes.Signature;
|
|
45
|
+
};
|
|
46
|
+
|
|
42
47
|
export class SQLiteStorage {
|
|
43
48
|
fromLocalNode!: ReadableStreamDefaultReader<SyncMessage>;
|
|
44
49
|
toLocalNode: WritableStreamDefaultWriter<SyncMessage>;
|
|
@@ -98,7 +103,9 @@ export class SQLiteStorage {
|
|
|
98
103
|
const db = Database(filename);
|
|
99
104
|
db.pragma("journal_mode = WAL");
|
|
100
105
|
|
|
101
|
-
const oldVersion = (
|
|
106
|
+
const oldVersion = (
|
|
107
|
+
db.pragma("user_version") as [{ user_version: number }]
|
|
108
|
+
)[0].user_version as number;
|
|
102
109
|
|
|
103
110
|
console.log("DB version", oldVersion);
|
|
104
111
|
|
|
@@ -108,7 +115,7 @@ export class SQLiteStorage {
|
|
|
108
115
|
`CREATE TABLE IF NOT EXISTS transactions (
|
|
109
116
|
ses INTEGER,
|
|
110
117
|
idx INTEGER,
|
|
111
|
-
tx TEXT NOT NULL
|
|
118
|
+
tx TEXT NOT NULL,
|
|
112
119
|
PRIMARY KEY (ses, idx)
|
|
113
120
|
) WITHOUT ROWID;`
|
|
114
121
|
).run();
|
|
@@ -146,18 +153,48 @@ export class SQLiteStorage {
|
|
|
146
153
|
|
|
147
154
|
if (oldVersion <= 1) {
|
|
148
155
|
// fix embarrassing off-by-one error for transaction indices
|
|
149
|
-
console.log(
|
|
156
|
+
console.log(
|
|
157
|
+
"Migration 1 -> 2: Fix off-by-one error for transaction indices"
|
|
158
|
+
);
|
|
150
159
|
|
|
151
|
-
const txs = db
|
|
160
|
+
const txs = db
|
|
161
|
+
.prepare(`SELECT * FROM transactions`)
|
|
162
|
+
.all() as TransactionRow[];
|
|
152
163
|
|
|
153
164
|
for (const tx of txs) {
|
|
154
|
-
db.prepare(
|
|
165
|
+
db.prepare(
|
|
166
|
+
`DELETE FROM transactions WHERE ses = ? AND idx = ?`
|
|
167
|
+
).run(tx.ses, tx.idx);
|
|
155
168
|
tx.idx -= 1;
|
|
156
|
-
db.prepare(
|
|
169
|
+
db.prepare(
|
|
170
|
+
`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`
|
|
171
|
+
).run(tx.ses, tx.idx, tx.tx);
|
|
157
172
|
}
|
|
158
173
|
|
|
159
174
|
db.pragma("user_version = 2");
|
|
160
|
-
console.log(
|
|
175
|
+
console.log(
|
|
176
|
+
"Migration 1 -> 2: Fix off-by-one error for transaction indices - done"
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (oldVersion <= 2) {
|
|
181
|
+
console.log("Migration 2 -> 3: Add signatureAfter");
|
|
182
|
+
|
|
183
|
+
db.prepare(
|
|
184
|
+
`CREATE TABLE IF NOT EXISTS signatureAfter (
|
|
185
|
+
ses INTEGER,
|
|
186
|
+
idx INTEGER,
|
|
187
|
+
signature TEXT NOT NULL,
|
|
188
|
+
PRIMARY KEY (ses, idx)
|
|
189
|
+
) WITHOUT ROWID;`
|
|
190
|
+
).run();
|
|
191
|
+
|
|
192
|
+
db.prepare(
|
|
193
|
+
`ALTER TABLE sessions ADD COLUMN bytesSinceLastSignature INTEGER;`
|
|
194
|
+
).run();
|
|
195
|
+
|
|
196
|
+
db.pragma("user_version = 3");
|
|
197
|
+
console.log("Migration 2 -> 3: Add signatureAfter - done");
|
|
161
198
|
}
|
|
162
199
|
|
|
163
200
|
return new SQLiteStorage(db, fromLocalNode, toLocalNode);
|
|
@@ -205,12 +242,14 @@ export class SQLiteStorage {
|
|
|
205
242
|
| CojsonInternalTypes.CoValueHeader
|
|
206
243
|
| undefined;
|
|
207
244
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
245
|
+
const newContentPieces: CojsonInternalTypes.NewContentMessage[] = [
|
|
246
|
+
{
|
|
247
|
+
action: "content",
|
|
248
|
+
id: theirKnown.id,
|
|
249
|
+
header: theirKnown.header ? undefined : parsedHeader,
|
|
250
|
+
new: {},
|
|
251
|
+
},
|
|
252
|
+
];
|
|
214
253
|
|
|
215
254
|
for (const sessionRow of allOurSessions) {
|
|
216
255
|
ourKnown.sessions[sessionRow.sessionID] = sessionRow.lastIdx;
|
|
@@ -222,25 +261,77 @@ export class SQLiteStorage {
|
|
|
222
261
|
const firstNewTxIdx =
|
|
223
262
|
theirKnown.sessions[sessionRow.sessionID] || 0;
|
|
224
263
|
|
|
264
|
+
const signaturesAndIdxs = this.db
|
|
265
|
+
.prepare<[number, number]>(
|
|
266
|
+
`SELECT * FROM signatureAfter WHERE ses = ? AND idx >= ?`
|
|
267
|
+
)
|
|
268
|
+
.all(sessionRow.rowID, firstNewTxIdx) as SignatureAfterRow[];
|
|
269
|
+
|
|
270
|
+
// console.log(
|
|
271
|
+
// theirKnown.id,
|
|
272
|
+
// "signaturesAndIdxs",
|
|
273
|
+
// JSON.stringify(signaturesAndIdxs)
|
|
274
|
+
// );
|
|
275
|
+
|
|
225
276
|
const newTxInSession = this.db
|
|
226
277
|
.prepare<[number, number]>(
|
|
227
278
|
`SELECT * FROM transactions WHERE ses = ? AND idx >= ?`
|
|
228
279
|
)
|
|
229
280
|
.all(sessionRow.rowID, firstNewTxIdx) as TransactionRow[];
|
|
230
281
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
282
|
+
let idx = firstNewTxIdx;
|
|
283
|
+
|
|
284
|
+
// console.log(
|
|
285
|
+
// theirKnown.id,
|
|
286
|
+
// "newTxInSession",
|
|
287
|
+
// newTxInSession.length
|
|
288
|
+
// );
|
|
289
|
+
|
|
290
|
+
for (const tx of newTxInSession) {
|
|
291
|
+
let sessionEntry =
|
|
292
|
+
newContentPieces[newContentPieces.length - 1]!.new[
|
|
293
|
+
sessionRow.sessionID
|
|
294
|
+
];
|
|
295
|
+
if (!sessionEntry) {
|
|
296
|
+
sessionEntry = {
|
|
297
|
+
after: idx,
|
|
298
|
+
lastSignature: "WILL_BE_REPLACED" as CojsonInternalTypes.Signature,
|
|
299
|
+
newTransactions: [],
|
|
300
|
+
};
|
|
301
|
+
newContentPieces[newContentPieces.length - 1]!.new[
|
|
302
|
+
sessionRow.sessionID
|
|
303
|
+
] = sessionEntry;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
sessionEntry.newTransactions.push(JSON.parse(tx.tx));
|
|
307
|
+
|
|
308
|
+
if (
|
|
309
|
+
signaturesAndIdxs[0] &&
|
|
310
|
+
idx === signaturesAndIdxs[0].idx
|
|
311
|
+
) {
|
|
312
|
+
sessionEntry.lastSignature =
|
|
313
|
+
signaturesAndIdxs[0].signature;
|
|
314
|
+
signaturesAndIdxs.shift();
|
|
315
|
+
newContentPieces.push({
|
|
316
|
+
action: "content",
|
|
317
|
+
id: theirKnown.id,
|
|
318
|
+
new: {},
|
|
319
|
+
});
|
|
320
|
+
} else if (
|
|
321
|
+
idx ===
|
|
322
|
+
firstNewTxIdx + newTxInSession.length - 1
|
|
323
|
+
) {
|
|
324
|
+
sessionEntry.lastSignature = sessionRow.lastSignature;
|
|
325
|
+
}
|
|
326
|
+
idx += 1;
|
|
327
|
+
}
|
|
238
328
|
}
|
|
239
329
|
}
|
|
240
330
|
|
|
241
331
|
const dependedOnCoValues =
|
|
242
332
|
parsedHeader?.ruleset.type === "group"
|
|
243
|
-
?
|
|
333
|
+
? newContentPieces
|
|
334
|
+
.flatMap((piece) => Object.values(piece.new)).flatMap((sessionEntry) =>
|
|
244
335
|
sessionEntry.newTransactions.flatMap((tx) => {
|
|
245
336
|
if (tx.privacy !== "trusting") return [];
|
|
246
337
|
// TODO: avoid parsing here?
|
|
@@ -279,8 +370,15 @@ export class SQLiteStorage {
|
|
|
279
370
|
asDependencyOf,
|
|
280
371
|
});
|
|
281
372
|
|
|
282
|
-
|
|
283
|
-
|
|
373
|
+
const nonEmptyNewContentPieces = newContentPieces.filter(
|
|
374
|
+
(piece) => piece.header || Object.keys(piece.new).length > 0
|
|
375
|
+
);
|
|
376
|
+
|
|
377
|
+
// console.log(theirKnown.id, nonEmptyNewContentPieces);
|
|
378
|
+
|
|
379
|
+
for (const piece of nonEmptyNewContentPieces) {
|
|
380
|
+
await this.toLocalNode.write(piece);
|
|
381
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
284
382
|
}
|
|
285
383
|
}
|
|
286
384
|
|
|
@@ -291,7 +389,9 @@ export class SQLiteStorage {
|
|
|
291
389
|
async handleContent(msg: CojsonInternalTypes.NewContentMessage) {
|
|
292
390
|
let storedCoValueRowID = (
|
|
293
391
|
this.db
|
|
294
|
-
.prepare<RawCoID>(
|
|
392
|
+
.prepare<CojsonInternalTypes.RawCoID>(
|
|
393
|
+
`SELECT rowID FROM coValues WHERE id = ?`
|
|
394
|
+
)
|
|
295
395
|
.get(msg.id) as StoredCoValueRow | undefined
|
|
296
396
|
)?.rowID;
|
|
297
397
|
|
|
@@ -310,7 +410,7 @@ export class SQLiteStorage {
|
|
|
310
410
|
}
|
|
311
411
|
|
|
312
412
|
storedCoValueRowID = this.db
|
|
313
|
-
.prepare<[RawCoID, string]>(
|
|
413
|
+
.prepare<[CojsonInternalTypes.RawCoID, string]>(
|
|
314
414
|
`INSERT INTO coValues (id, header) VALUES (?, ?)`
|
|
315
415
|
)
|
|
316
416
|
.run(msg.id, JSON.stringify(header)).lastInsertRowid as number;
|
|
@@ -352,45 +452,81 @@ export class SQLiteStorage {
|
|
|
352
452
|
const actuallyNewOffset =
|
|
353
453
|
(sessionRow?.lastIdx || 0) -
|
|
354
454
|
(msg.new[sessionID]?.after || 0);
|
|
455
|
+
|
|
355
456
|
const actuallyNewTransactions =
|
|
356
457
|
newTransactions.slice(actuallyNewOffset);
|
|
357
458
|
|
|
459
|
+
let newBytesSinceLastSignature =
|
|
460
|
+
(sessionRow?.bytesSinceLastSignature || 0) +
|
|
461
|
+
actuallyNewTransactions.reduce(
|
|
462
|
+
(sum, tx) =>
|
|
463
|
+
sum +
|
|
464
|
+
(tx.privacy === "private"
|
|
465
|
+
? tx.encryptedChanges.length
|
|
466
|
+
: tx.changes.length),
|
|
467
|
+
0
|
|
468
|
+
);
|
|
469
|
+
|
|
470
|
+
const newLastIdx =
|
|
471
|
+
(sessionRow?.lastIdx || 0) +
|
|
472
|
+
actuallyNewTransactions.length;
|
|
473
|
+
|
|
474
|
+
let shouldWriteSignature = false;
|
|
475
|
+
|
|
476
|
+
if (newBytesSinceLastSignature > MAX_RECOMMENDED_TX_SIZE) {
|
|
477
|
+
shouldWriteSignature = true;
|
|
478
|
+
newBytesSinceLastSignature = 0;
|
|
479
|
+
}
|
|
480
|
+
|
|
358
481
|
let nextIdx = sessionRow?.lastIdx || 0;
|
|
359
482
|
|
|
360
483
|
const sessionUpdate = {
|
|
361
484
|
coValue: storedCoValueRowID!,
|
|
362
485
|
sessionID: sessionID,
|
|
363
|
-
lastIdx:
|
|
364
|
-
(sessionRow?.lastIdx || 0) +
|
|
365
|
-
actuallyNewTransactions.length,
|
|
486
|
+
lastIdx: newLastIdx,
|
|
366
487
|
lastSignature: msg.new[sessionID]!.lastSignature,
|
|
488
|
+
bytesSinceLastSignature: newBytesSinceLastSignature,
|
|
367
489
|
};
|
|
368
490
|
|
|
369
491
|
const upsertedSession = this.db
|
|
370
|
-
.prepare<[number, string, number, string]>(
|
|
371
|
-
`INSERT INTO sessions (coValue, sessionID, lastIdx, lastSignature) VALUES (?, ?, ?, ?)
|
|
372
|
-
ON CONFLICT(coValue, sessionID) DO UPDATE SET lastIdx=excluded.lastIdx, lastSignature=excluded.lastSignature
|
|
492
|
+
.prepare<[number, string, number, string, number]>(
|
|
493
|
+
`INSERT INTO sessions (coValue, sessionID, lastIdx, lastSignature, bytesSinceLastSignature) VALUES (?, ?, ?, ?, ?)
|
|
494
|
+
ON CONFLICT(coValue, sessionID) DO UPDATE SET lastIdx=excluded.lastIdx, lastSignature=excluded.lastSignature, bytesSinceLastSignature=excluded.bytesSinceLastSignature
|
|
373
495
|
RETURNING rowID`
|
|
374
496
|
)
|
|
375
497
|
.get(
|
|
376
498
|
sessionUpdate.coValue,
|
|
377
499
|
sessionUpdate.sessionID,
|
|
378
500
|
sessionUpdate.lastIdx,
|
|
379
|
-
sessionUpdate.lastSignature
|
|
501
|
+
sessionUpdate.lastSignature,
|
|
502
|
+
sessionUpdate.bytesSinceLastSignature,
|
|
380
503
|
) as { rowID: number };
|
|
381
504
|
|
|
382
505
|
const sessionRowID = upsertedSession.rowID;
|
|
383
506
|
|
|
507
|
+
if (shouldWriteSignature) {
|
|
508
|
+
this.db
|
|
509
|
+
.prepare<[number, number, string]>(
|
|
510
|
+
`INSERT INTO signatureAfter (ses, idx, signature) VALUES (?, ?, ?)`
|
|
511
|
+
)
|
|
512
|
+
.run(
|
|
513
|
+
sessionRowID,
|
|
514
|
+
// TODO: newLastIdx is a misnomer, it's actually more like nextIdx or length
|
|
515
|
+
newLastIdx - 1,
|
|
516
|
+
msg.new[sessionID]!.lastSignature
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
|
|
384
520
|
for (const newTransaction of actuallyNewTransactions) {
|
|
385
521
|
this.db
|
|
386
|
-
|
|
387
|
-
|
|
522
|
+
.prepare<[number, number, string]>(
|
|
523
|
+
`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`
|
|
388
524
|
)
|
|
389
525
|
.run(
|
|
390
526
|
sessionRowID,
|
|
391
527
|
nextIdx,
|
|
392
528
|
JSON.stringify(newTransaction)
|
|
393
|
-
|
|
529
|
+
);
|
|
394
530
|
nextIdx++;
|
|
395
531
|
}
|
|
396
532
|
}
|