cojson-storage-sqlite 0.10.8 → 0.10.15
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +8 -0
- package/dist/sqliteClient.js +10 -9
- package/dist/sqliteClient.js.map +1 -1
- package/dist/sqliteNode.js +7 -7
- package/dist/sqliteNode.js.map +1 -1
- package/package.json +3 -3
- package/src/sqliteClient.ts +19 -17
- package/src/sqliteNode.ts +12 -12
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
package/dist/sqliteClient.js
CHANGED
|
@@ -9,7 +9,7 @@ export class SQLiteClient {
|
|
|
9
9
|
}
|
|
10
10
|
getCoValue(coValueId) {
|
|
11
11
|
const coValueRow = this.db
|
|
12
|
-
.prepare(
|
|
12
|
+
.prepare("SELECT * FROM coValues WHERE id = ?")
|
|
13
13
|
.get(coValueId);
|
|
14
14
|
if (!coValueRow)
|
|
15
15
|
return;
|
|
@@ -23,7 +23,7 @@ export class SQLiteClient {
|
|
|
23
23
|
}
|
|
24
24
|
catch (e) {
|
|
25
25
|
const headerValue = coValueRow?.header ?? "";
|
|
26
|
-
logger.warn(
|
|
26
|
+
logger.warn(`Invalid JSON in header: ${headerValue}`, {
|
|
27
27
|
id: coValueId,
|
|
28
28
|
});
|
|
29
29
|
return;
|
|
@@ -31,17 +31,17 @@ export class SQLiteClient {
|
|
|
31
31
|
}
|
|
32
32
|
getCoValueSessions(coValueRowId) {
|
|
33
33
|
return this.db
|
|
34
|
-
.prepare(
|
|
34
|
+
.prepare("SELECT * FROM sessions WHERE coValue = ?")
|
|
35
35
|
.all(coValueRowId);
|
|
36
36
|
}
|
|
37
37
|
getSingleCoValueSession(coValueRowId, sessionID) {
|
|
38
38
|
return this.db
|
|
39
|
-
.prepare(
|
|
39
|
+
.prepare("SELECT * FROM sessions WHERE coValue = ? AND sessionID = ?")
|
|
40
40
|
.get(coValueRowId, sessionID);
|
|
41
41
|
}
|
|
42
42
|
getNewTransactionInSession(sessionRowId, firstNewTxIdx) {
|
|
43
43
|
const txs = this.db
|
|
44
|
-
.prepare(
|
|
44
|
+
.prepare("SELECT * FROM transactions WHERE ses = ? AND idx >= ?")
|
|
45
45
|
.all(sessionRowId, firstNewTxIdx);
|
|
46
46
|
try {
|
|
47
47
|
return txs.map((transactionRow) => ({
|
|
@@ -56,12 +56,12 @@ export class SQLiteClient {
|
|
|
56
56
|
}
|
|
57
57
|
getSignatures(sessionRowId, firstNewTxIdx) {
|
|
58
58
|
return this.db
|
|
59
|
-
.prepare(
|
|
59
|
+
.prepare("SELECT * FROM signatureAfter WHERE ses = ? AND idx >= ?")
|
|
60
60
|
.all(sessionRowId, firstNewTxIdx);
|
|
61
61
|
}
|
|
62
62
|
addCoValue(msg) {
|
|
63
63
|
return this.db
|
|
64
|
-
.prepare(
|
|
64
|
+
.prepare("INSERT INTO coValues (id, header) VALUES (?, ?)")
|
|
65
65
|
.run(msg.id, JSON.stringify(msg.header)).lastInsertRowid;
|
|
66
66
|
}
|
|
67
67
|
addSessionUpdate({ sessionUpdate, sessionRow, }) {
|
|
@@ -73,16 +73,17 @@ export class SQLiteClient {
|
|
|
73
73
|
}
|
|
74
74
|
addTransaction(sessionRowID, nextIdx, newTransaction) {
|
|
75
75
|
this.db
|
|
76
|
-
.prepare(
|
|
76
|
+
.prepare("INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)")
|
|
77
77
|
.run(sessionRowID, nextIdx, JSON.stringify(newTransaction));
|
|
78
78
|
}
|
|
79
79
|
addSignatureAfter({ sessionRowID, idx, signature, }) {
|
|
80
80
|
this.db
|
|
81
|
-
.prepare(
|
|
81
|
+
.prepare("INSERT INTO signatureAfter (ses, idx, signature) VALUES (?, ?, ?)")
|
|
82
82
|
.run(sessionRowID, idx, signature);
|
|
83
83
|
}
|
|
84
84
|
transaction(operationsCallback) {
|
|
85
85
|
this.db.transaction(operationsCallback)();
|
|
86
|
+
return undefined;
|
|
86
87
|
}
|
|
87
88
|
}
|
|
88
89
|
//# sourceMappingURL=sqliteClient.js.map
|
package/dist/sqliteClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteClient.js","sourceRoot":"","sources":["../src/sqliteClient.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,MAAM,GACP,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"sqliteClient.js","sourceRoot":"","sources":["../src/sqliteClient.ts"],"names":[],"mappings":"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"}
|
package/dist/sqliteNode.js
CHANGED
|
@@ -25,7 +25,7 @@ export class SQLiteNode {
|
|
|
25
25
|
}
|
|
26
26
|
catch (e) {
|
|
27
27
|
logger.error(`Error reading from localNode, handling msg\n\n${JSON.stringify(msg, (k, v) => k === "changes" || k === "encryptedChanges"
|
|
28
|
-
? v.slice(0, 20)
|
|
28
|
+
? `${v.slice(0, 20)}...`
|
|
29
29
|
: v)}`);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -56,24 +56,24 @@ export class SQLiteNode {
|
|
|
56
56
|
lastSignature TEXT,
|
|
57
57
|
UNIQUE (sessionID, coValue)
|
|
58
58
|
);`).run();
|
|
59
|
-
db.prepare(
|
|
59
|
+
db.prepare("CREATE INDEX IF NOT EXISTS sessionsByCoValue ON sessions (coValue);").run();
|
|
60
60
|
db.prepare(`CREATE TABLE IF NOT EXISTS coValues (
|
|
61
61
|
rowID INTEGER PRIMARY KEY,
|
|
62
62
|
id TEXT NOT NULL UNIQUE,
|
|
63
63
|
header TEXT NOT NULL UNIQUE
|
|
64
64
|
);`).run();
|
|
65
|
-
db.prepare(
|
|
65
|
+
db.prepare("CREATE INDEX IF NOT EXISTS coValuesByID ON coValues (id);").run();
|
|
66
66
|
db.pragma("user_version = 1");
|
|
67
67
|
}
|
|
68
68
|
if (oldVersion <= 1) {
|
|
69
69
|
// fix embarrassing off-by-one error for transaction indices
|
|
70
70
|
const txs = db
|
|
71
|
-
.prepare(
|
|
71
|
+
.prepare("SELECT * FROM transactions")
|
|
72
72
|
.all();
|
|
73
73
|
for (const tx of txs) {
|
|
74
|
-
db.prepare(
|
|
74
|
+
db.prepare("DELETE FROM transactions WHERE ses = ? AND idx = ?").run(tx.ses, tx.idx);
|
|
75
75
|
tx.idx -= 1;
|
|
76
|
-
db.prepare(
|
|
76
|
+
db.prepare("INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)").run(tx.ses, tx.idx, tx.tx);
|
|
77
77
|
}
|
|
78
78
|
db.pragma("user_version = 2");
|
|
79
79
|
}
|
|
@@ -84,7 +84,7 @@ export class SQLiteNode {
|
|
|
84
84
|
signature TEXT NOT NULL,
|
|
85
85
|
PRIMARY KEY (ses, idx)
|
|
86
86
|
) WITHOUT ROWID;`).run();
|
|
87
|
-
db.prepare(
|
|
87
|
+
db.prepare("ALTER TABLE sessions ADD COLUMN bytesSinceLastSignature INTEGER;").run();
|
|
88
88
|
db.pragma("user_version = 3");
|
|
89
89
|
}
|
|
90
90
|
return new SQLiteNode(db, fromLocalNode, toLocalNode);
|
package/dist/sqliteNode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteNode.js","sourceRoot":"","sources":["../src/sqliteNode.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"sqliteNode.js","sourceRoot":"","sources":["../src/sqliteNode.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cojson-storage-sqlite",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.10.
|
|
4
|
+
"version": "0.10.15",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "src/index.ts",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"better-sqlite3": "^11.7.0",
|
|
10
|
-
"cojson": "0.10.
|
|
11
|
-
"cojson-storage": "0.10.
|
|
10
|
+
"cojson": "0.10.15",
|
|
11
|
+
"cojson-storage": "0.10.15"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"@types/better-sqlite3": "^7.6.12",
|
package/src/sqliteClient.ts
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import { Database as DatabaseT } from "better-sqlite3";
|
|
1
|
+
import type { Database as DatabaseT } from "better-sqlite3";
|
|
2
2
|
import {
|
|
3
|
-
CojsonInternalTypes,
|
|
4
|
-
OutgoingSyncQueue,
|
|
5
|
-
SessionID,
|
|
3
|
+
type CojsonInternalTypes,
|
|
4
|
+
type OutgoingSyncQueue,
|
|
5
|
+
type SessionID,
|
|
6
6
|
logger,
|
|
7
7
|
} from "cojson";
|
|
8
|
-
import
|
|
9
|
-
import Signature = CojsonInternalTypes.Signature;
|
|
10
|
-
import Transaction = CojsonInternalTypes.Transaction;
|
|
11
|
-
import {
|
|
8
|
+
import type {
|
|
12
9
|
DBClientInterface,
|
|
13
10
|
SessionRow,
|
|
14
11
|
SignatureAfterRow,
|
|
@@ -17,6 +14,10 @@ import {
|
|
|
17
14
|
TransactionRow,
|
|
18
15
|
} from "cojson-storage";
|
|
19
16
|
|
|
17
|
+
type RawCoID = CojsonInternalTypes.RawCoID;
|
|
18
|
+
type Signature = CojsonInternalTypes.Signature;
|
|
19
|
+
type Transaction = CojsonInternalTypes.Transaction;
|
|
20
|
+
|
|
20
21
|
export type RawCoValueRow = {
|
|
21
22
|
id: CojsonInternalTypes.RawCoID;
|
|
22
23
|
header: string;
|
|
@@ -43,7 +44,7 @@ export class SQLiteClient implements DBClientInterface {
|
|
|
43
44
|
|
|
44
45
|
getCoValue(coValueId: RawCoID): StoredCoValueRow | undefined {
|
|
45
46
|
const coValueRow = this.db
|
|
46
|
-
.prepare(
|
|
47
|
+
.prepare("SELECT * FROM coValues WHERE id = ?")
|
|
47
48
|
.get(coValueId) as RawCoValueRow & { rowID: number };
|
|
48
49
|
|
|
49
50
|
if (!coValueRow) return;
|
|
@@ -58,7 +59,7 @@ export class SQLiteClient implements DBClientInterface {
|
|
|
58
59
|
};
|
|
59
60
|
} catch (e) {
|
|
60
61
|
const headerValue = coValueRow?.header ?? "";
|
|
61
|
-
logger.warn(
|
|
62
|
+
logger.warn(`Invalid JSON in header: ${headerValue}`, {
|
|
62
63
|
id: coValueId,
|
|
63
64
|
});
|
|
64
65
|
return;
|
|
@@ -67,7 +68,7 @@ export class SQLiteClient implements DBClientInterface {
|
|
|
67
68
|
|
|
68
69
|
getCoValueSessions(coValueRowId: number): StoredSessionRow[] {
|
|
69
70
|
return this.db
|
|
70
|
-
.prepare<number>(
|
|
71
|
+
.prepare<number>("SELECT * FROM sessions WHERE coValue = ?")
|
|
71
72
|
.all(coValueRowId) as StoredSessionRow[];
|
|
72
73
|
}
|
|
73
74
|
|
|
@@ -77,7 +78,7 @@ export class SQLiteClient implements DBClientInterface {
|
|
|
77
78
|
): StoredSessionRow | undefined {
|
|
78
79
|
return this.db
|
|
79
80
|
.prepare<[number, string]>(
|
|
80
|
-
|
|
81
|
+
"SELECT * FROM sessions WHERE coValue = ? AND sessionID = ?",
|
|
81
82
|
)
|
|
82
83
|
.get(coValueRowId, sessionID) as StoredSessionRow | undefined;
|
|
83
84
|
}
|
|
@@ -88,7 +89,7 @@ export class SQLiteClient implements DBClientInterface {
|
|
|
88
89
|
): TransactionRow[] {
|
|
89
90
|
const txs = this.db
|
|
90
91
|
.prepare<[number, number]>(
|
|
91
|
-
|
|
92
|
+
"SELECT * FROM transactions WHERE ses = ? AND idx >= ?",
|
|
92
93
|
)
|
|
93
94
|
.all(sessionRowId, firstNewTxIdx) as RawTransactionRow[];
|
|
94
95
|
|
|
@@ -109,7 +110,7 @@ export class SQLiteClient implements DBClientInterface {
|
|
|
109
110
|
): SignatureAfterRow[] {
|
|
110
111
|
return this.db
|
|
111
112
|
.prepare<[number, number]>(
|
|
112
|
-
|
|
113
|
+
"SELECT * FROM signatureAfter WHERE ses = ? AND idx >= ?",
|
|
113
114
|
)
|
|
114
115
|
.all(sessionRowId, firstNewTxIdx) as SignatureAfterRow[];
|
|
115
116
|
}
|
|
@@ -117,7 +118,7 @@ export class SQLiteClient implements DBClientInterface {
|
|
|
117
118
|
addCoValue(msg: CojsonInternalTypes.NewContentMessage): number {
|
|
118
119
|
return this.db
|
|
119
120
|
.prepare<[CojsonInternalTypes.RawCoID, string]>(
|
|
120
|
-
|
|
121
|
+
"INSERT INTO coValues (id, header) VALUES (?, ?)",
|
|
121
122
|
)
|
|
122
123
|
.run(msg.id, JSON.stringify(msg.header)).lastInsertRowid as number;
|
|
123
124
|
}
|
|
@@ -153,7 +154,7 @@ export class SQLiteClient implements DBClientInterface {
|
|
|
153
154
|
) {
|
|
154
155
|
this.db
|
|
155
156
|
.prepare<[number, number, string]>(
|
|
156
|
-
|
|
157
|
+
"INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)",
|
|
157
158
|
)
|
|
158
159
|
.run(sessionRowID, nextIdx, JSON.stringify(newTransaction));
|
|
159
160
|
}
|
|
@@ -165,12 +166,13 @@ export class SQLiteClient implements DBClientInterface {
|
|
|
165
166
|
}: { sessionRowID: number; idx: number; signature: Signature }) {
|
|
166
167
|
this.db
|
|
167
168
|
.prepare<[number, number, string]>(
|
|
168
|
-
|
|
169
|
+
"INSERT INTO signatureAfter (ses, idx, signature) VALUES (?, ?, ?)",
|
|
169
170
|
)
|
|
170
171
|
.run(sessionRowID, idx, signature);
|
|
171
172
|
}
|
|
172
173
|
|
|
173
174
|
transaction(operationsCallback: () => unknown) {
|
|
174
175
|
this.db.transaction(operationsCallback)();
|
|
176
|
+
return undefined;
|
|
175
177
|
}
|
|
176
178
|
}
|
package/src/sqliteNode.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import Database, { Database as DatabaseT } from "better-sqlite3";
|
|
1
|
+
import Database, { type Database as DatabaseT } from "better-sqlite3";
|
|
2
2
|
import {
|
|
3
|
-
IncomingSyncStream,
|
|
4
|
-
OutgoingSyncQueue,
|
|
5
|
-
Peer,
|
|
3
|
+
type IncomingSyncStream,
|
|
4
|
+
type OutgoingSyncQueue,
|
|
5
|
+
type Peer,
|
|
6
6
|
cojsonInternals,
|
|
7
7
|
logger,
|
|
8
8
|
} from "cojson";
|
|
9
|
-
import { SyncManager, TransactionRow } from "cojson-storage";
|
|
9
|
+
import { SyncManager, type TransactionRow } from "cojson-storage";
|
|
10
10
|
import { SQLiteClient } from "./sqliteClient.js";
|
|
11
11
|
|
|
12
12
|
export class SQLiteNode {
|
|
@@ -46,7 +46,7 @@ export class SQLiteNode {
|
|
|
46
46
|
msg,
|
|
47
47
|
(k, v) =>
|
|
48
48
|
k === "changes" || k === "encryptedChanges"
|
|
49
|
-
? v.slice(0, 20)
|
|
49
|
+
? `${v.slice(0, 20)}...`
|
|
50
50
|
: v,
|
|
51
51
|
)}`,
|
|
52
52
|
);
|
|
@@ -117,7 +117,7 @@ export class SQLiteNode {
|
|
|
117
117
|
).run();
|
|
118
118
|
|
|
119
119
|
db.prepare(
|
|
120
|
-
|
|
120
|
+
"CREATE INDEX IF NOT EXISTS sessionsByCoValue ON sessions (coValue);",
|
|
121
121
|
).run();
|
|
122
122
|
|
|
123
123
|
db.prepare(
|
|
@@ -129,7 +129,7 @@ export class SQLiteNode {
|
|
|
129
129
|
).run();
|
|
130
130
|
|
|
131
131
|
db.prepare(
|
|
132
|
-
|
|
132
|
+
"CREATE INDEX IF NOT EXISTS coValuesByID ON coValues (id);",
|
|
133
133
|
).run();
|
|
134
134
|
|
|
135
135
|
db.pragma("user_version = 1");
|
|
@@ -138,17 +138,17 @@ export class SQLiteNode {
|
|
|
138
138
|
if (oldVersion <= 1) {
|
|
139
139
|
// fix embarrassing off-by-one error for transaction indices
|
|
140
140
|
const txs = db
|
|
141
|
-
.prepare(
|
|
141
|
+
.prepare("SELECT * FROM transactions")
|
|
142
142
|
.all() as TransactionRow[];
|
|
143
143
|
|
|
144
144
|
for (const tx of txs) {
|
|
145
|
-
db.prepare(
|
|
145
|
+
db.prepare("DELETE FROM transactions WHERE ses = ? AND idx = ?").run(
|
|
146
146
|
tx.ses,
|
|
147
147
|
tx.idx,
|
|
148
148
|
);
|
|
149
149
|
tx.idx -= 1;
|
|
150
150
|
db.prepare(
|
|
151
|
-
|
|
151
|
+
"INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)",
|
|
152
152
|
).run(tx.ses, tx.idx, tx.tx);
|
|
153
153
|
}
|
|
154
154
|
|
|
@@ -166,7 +166,7 @@ export class SQLiteNode {
|
|
|
166
166
|
).run();
|
|
167
167
|
|
|
168
168
|
db.prepare(
|
|
169
|
-
|
|
169
|
+
"ALTER TABLE sessions ADD COLUMN bytesSinceLastSignature INTEGER;",
|
|
170
170
|
).run();
|
|
171
171
|
|
|
172
172
|
db.pragma("user_version = 3");
|