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 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.prepare(`SELECT * FROM transactions`).all();
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 newContent = {
105
- action: "content",
106
- id: theirKnown.id,
107
- header: theirKnown.header ? undefined : parsedHeader,
108
- new: {},
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
- newContent.new[sessionRow.sessionID] = {
119
- after: firstNewTxIdx,
120
- lastSignature: sessionRow.lastSignature,
121
- newTransactions: newTxInSession.map((row) => JSON.parse(row.tx)),
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
- ? Object.values(newContent.new).flatMap((sessionEntry) => sessionEntry.newTransactions.flatMap((tx) => {
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
- if (newContent.header || Object.keys(newContent.new).length > 0) {
153
- await this.toLocalNode.write(newContent);
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: (sessionRow?.lastIdx || 0) +
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.3",
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.1",
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": "79353a1d97bc3a40b340fb8c3f8a998211426360"
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
- // CojsonInternalTypes,
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 = (db.pragma("user_version") as [{user_version: number}])[0].user_version as number;
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("Migration 1 -> 2: Fix off-by-one error for transaction indices");
156
+ console.log(
157
+ "Migration 1 -> 2: Fix off-by-one error for transaction indices"
158
+ );
150
159
 
151
- const txs = db.prepare(`SELECT * FROM transactions`).all() as TransactionRow[];
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(`DELETE FROM transactions WHERE ses = ? AND idx = ?`).run(tx.ses, tx.idx);
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(`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`).run(tx.ses, tx.idx, tx.tx);
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("Migration 1 -> 2: Fix off-by-one error for transaction indices - done");
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
- const newContent: CojsonInternalTypes.NewContentMessage = {
209
- action: "content",
210
- id: theirKnown.id,
211
- header: theirKnown.header ? undefined : parsedHeader,
212
- new: {},
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
- newContent.new[sessionRow.sessionID] = {
232
- after: firstNewTxIdx,
233
- lastSignature: sessionRow.lastSignature,
234
- newTransactions: newTxInSession.map((row) =>
235
- JSON.parse(row.tx)
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
- ? Object.values(newContent.new).flatMap((sessionEntry) =>
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
- if (newContent.header || Object.keys(newContent.new).length > 0) {
283
- await this.toLocalNode.write(newContent);
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>(`SELECT rowID FROM coValues WHERE id = ?`)
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
- .prepare<[number, number, string]>(
387
- `INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)`
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
  }