cojson-storage-sqlite 0.13.30 → 0.13.32
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 +16 -0
- package/dist/sqliteClient.d.ts +1 -1
- package/dist/sqliteClient.d.ts.map +1 -1
- package/dist/sqliteClient.js +3 -3
- package/dist/sqliteClient.js.map +1 -1
- package/dist/tests/storage.sqlite.test.d.ts +2 -0
- package/dist/tests/storage.sqlite.test.d.ts.map +1 -0
- package/dist/tests/{sqlite.test.js → storage.sqlite.test.js} +134 -13
- package/dist/tests/storage.sqlite.test.js.map +1 -0
- package/dist/tests/testUtils.d.ts +1 -0
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +24 -0
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +3 -3
- package/src/sqliteClient.ts +5 -4
- package/src/tests/{sqlite.test.ts → storage.sqlite.test.ts} +242 -12
- package/src/tests/testUtils.ts +29 -0
- package/dist/tests/sqlite.test.d.ts +0 -2
- package/dist/tests/sqlite.test.d.ts.map +0 -1
- package/dist/tests/sqlite.test.js.map +0 -1
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# cojson-storage-sqlite
|
|
2
2
|
|
|
3
|
+
## 0.13.32
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [2bf9743]
|
|
8
|
+
- cojson-storage@0.13.32
|
|
9
|
+
|
|
10
|
+
## 0.13.31
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- Updated dependencies [d63716a]
|
|
15
|
+
- Updated dependencies [d5edad7]
|
|
16
|
+
- cojson@0.13.31
|
|
17
|
+
- cojson-storage@0.13.31
|
|
18
|
+
|
|
3
19
|
## 0.13.30
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
package/dist/sqliteClient.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ export declare class SQLiteClient implements DBClientInterfaceSync {
|
|
|
21
21
|
getCoValue(coValueId: RawCoID): StoredCoValueRow | undefined;
|
|
22
22
|
getCoValueSessions(coValueRowId: number): StoredSessionRow[];
|
|
23
23
|
getSingleCoValueSession(coValueRowId: number, sessionID: SessionID): StoredSessionRow | undefined;
|
|
24
|
-
getNewTransactionInSession(sessionRowId: number,
|
|
24
|
+
getNewTransactionInSession(sessionRowId: number, fromIdx: number, toIdx: number): TransactionRow[];
|
|
25
25
|
getSignatures(sessionRowId: number, firstNewTxIdx: number): SignatureAfterRow[];
|
|
26
26
|
addCoValue(msg: CojsonInternalTypes.NewContentMessage): number;
|
|
27
27
|
addSessionUpdate({ sessionUpdate, sessionRow, }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteClient.d.ts","sourceRoot":"","sources":["../src/sqliteClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EAEf,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EACV,qBAAqB,EACrB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACf,MAAM,gBAAgB,CAAC;AAExB,KAAK,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC;AAC3C,KAAK,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC;AAC/C,KAAK,WAAW,GAAG,mBAAmB,CAAC,WAAW,CAAC;AAEnD,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,mBAAmB,CAAC,OAAO,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,UAE7C;AAED,qBAAa,YAAa,YAAW,qBAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;gBAEpC,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB;IAKzD,UAAU,CAAC,SAAS,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS;IAyB5D,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAM5D,uBAAuB,CACrB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,SAAS,GACnB,gBAAgB,GAAG,SAAS;IAQ/B,0BAA0B,CACxB,YAAY,EAAE,MAAM,EACpB,
|
|
1
|
+
{"version":3,"file":"sqliteClient.d.ts","sourceRoot":"","sources":["../src/sqliteClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EAEf,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EACV,qBAAqB,EACrB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACf,MAAM,gBAAgB,CAAC;AAExB,KAAK,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC;AAC3C,KAAK,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC;AAC/C,KAAK,WAAW,GAAG,mBAAmB,CAAC,WAAW,CAAC;AAEnD,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,mBAAmB,CAAC,OAAO,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,UAE7C;AAED,qBAAa,YAAa,YAAW,qBAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;gBAEpC,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB;IAKzD,UAAU,CAAC,SAAS,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS;IAyB5D,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAM5D,uBAAuB,CACrB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,SAAS,GACnB,gBAAgB,GAAG,SAAS;IAQ/B,0BAA0B,CACxB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,cAAc,EAAE;IAkBnB,aAAa,CACX,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,iBAAiB,EAAE;IAQtB,UAAU,CAAC,GAAG,EAAE,mBAAmB,CAAC,iBAAiB,GAAG,MAAM;IAQ9D,gBAAgB,CAAC,EACf,aAAa,EACb,UAAU,GACX,EAAE;QACD,aAAa,EAAE,UAAU,CAAC;QAC1B,UAAU,CAAC,EAAE,gBAAgB,CAAC;KAC/B,GAAG,MAAM;IAkBV,cAAc,CACZ,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,WAAW;IAS7B,iBAAiB,CAAC,EAChB,YAAY,EACZ,GAAG,EACH,SAAS,GACV,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAA;KAAE;IAQ9D,WAAW,CAAC,kBAAkB,EAAE,MAAM,OAAO;CAI9C"}
|
package/dist/sqliteClient.js
CHANGED
|
@@ -40,10 +40,10 @@ export class SQLiteClient {
|
|
|
40
40
|
.prepare("SELECT * FROM sessions WHERE coValue = ? AND sessionID = ?")
|
|
41
41
|
.get(coValueRowId, sessionID);
|
|
42
42
|
}
|
|
43
|
-
getNewTransactionInSession(sessionRowId,
|
|
43
|
+
getNewTransactionInSession(sessionRowId, fromIdx, toIdx) {
|
|
44
44
|
const txs = this.db
|
|
45
|
-
.prepare("SELECT * FROM transactions WHERE ses = ? AND idx >= ?")
|
|
46
|
-
.all(sessionRowId,
|
|
45
|
+
.prepare("SELECT * FROM transactions WHERE ses = ? AND idx >= ? AND idx <= ?")
|
|
46
|
+
.all(sessionRowId, fromIdx, toIdx);
|
|
47
47
|
try {
|
|
48
48
|
return txs.map((transactionRow) => ({
|
|
49
49
|
...transactionRow,
|
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;AAyBhB,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;AAClE,CAAC;AAED,MAAM,OAAO,YAAY;IAIvB,YAAY,EAAa,EAAE,WAA8B;QACvD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,UAAU,CAAC,SAAkB;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE;aACvB,OAAO,CAAC,qCAAqC,CAAC;aAC9C,GAAG,CAAC,SAAS,CAAsC,CAAC;QAEvD,IAAI,CAAC,UAAU;YAAE,OAAO;QAExB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,MAAM;gBACtC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAsC,CAAC;YAEtE,OAAO;gBACL,GAAG,UAAU;gBACb,MAAM,EAAE,YAAY;aACrB,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,WAAW,GAAG,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,2BAA2B,WAAW,EAAE,EAAE;gBACpD,EAAE,EAAE,SAAS;gBACb,GAAG,EAAE,CAAC;aACP,CAAC,CAAC;YACH,OAAO;QACT,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,YAAoB;QACrC,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CAAS,0CAA0C,CAAC;aAC3D,GAAG,CAAC,YAAY,CAAuB,CAAC;IAC7C,CAAC;IAED,uBAAuB,CACrB,YAAoB,EACpB,SAAoB;QAEpB,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CACN,4DAA4D,CAC7D;aACA,GAAG,CAAC,YAAY,EAAE,SAAS,CAAiC,CAAC;IAClE,CAAC;IAED,0BAA0B,CACxB,YAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"sqliteClient.js","sourceRoot":"","sources":["../src/sqliteClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.sqlite.test.d.ts","sourceRoot":"","sources":["../../src/tests/storage.sqlite.test.ts"],"names":[],"mappings":""}
|
|
@@ -8,7 +8,7 @@ import { WasmCrypto } from "cojson/crypto/WasmCrypto";
|
|
|
8
8
|
import { expect, onTestFinished, test, vi } from "vitest";
|
|
9
9
|
import { SQLiteNode } from "../index.js";
|
|
10
10
|
import { toSimplifiedMessages } from "./messagesTestUtils.js";
|
|
11
|
-
import { trackMessages } from "./testUtils.js";
|
|
11
|
+
import { trackMessages, waitFor } from "./testUtils.js";
|
|
12
12
|
const Crypto = await WasmCrypto.create();
|
|
13
13
|
async function createSQLiteStorage(defaultDbPath) {
|
|
14
14
|
const dbPath = defaultDbPath ?? join(tmpdir(), `test-${randomUUID()}.db`);
|
|
@@ -68,16 +68,57 @@ test("should sync and load data from storage", async () => {
|
|
|
68
68
|
}, node2Sync.messages)).toMatchInlineSnapshot(`
|
|
69
69
|
[
|
|
70
70
|
"client -> LOAD Map sessions: empty",
|
|
71
|
-
"storage -> KNOWN Group sessions: header/3",
|
|
72
71
|
"storage -> CONTENT Group header: true new: After: 0 New: 3",
|
|
73
72
|
"client -> KNOWN Group sessions: header/3",
|
|
74
|
-
"storage -> KNOWN Map sessions: header/1",
|
|
75
73
|
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
76
74
|
"client -> KNOWN Map sessions: header/1",
|
|
77
75
|
]
|
|
78
76
|
`);
|
|
79
77
|
node2Sync.restore();
|
|
80
78
|
});
|
|
79
|
+
test("should send an empty content message if there is no content", async () => {
|
|
80
|
+
const agentSecret = Crypto.newRandomAgentSecret();
|
|
81
|
+
const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
82
|
+
const node1Sync = trackMessages(node1);
|
|
83
|
+
const { peer, dbPath } = await createSQLiteStorage();
|
|
84
|
+
node1.syncManager.addPeer(peer);
|
|
85
|
+
const group = node1.createGroup();
|
|
86
|
+
const map = group.createMap();
|
|
87
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
88
|
+
expect(toSimplifiedMessages({
|
|
89
|
+
Map: map.core,
|
|
90
|
+
Group: group.core,
|
|
91
|
+
}, node1Sync.messages)).toMatchInlineSnapshot(`
|
|
92
|
+
[
|
|
93
|
+
"client -> CONTENT Group header: true new: After: 0 New: 3",
|
|
94
|
+
"storage -> KNOWN Group sessions: header/3",
|
|
95
|
+
"client -> CONTENT Map header: true new: ",
|
|
96
|
+
"storage -> KNOWN Map sessions: header/0",
|
|
97
|
+
]
|
|
98
|
+
`);
|
|
99
|
+
node1Sync.restore();
|
|
100
|
+
const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
101
|
+
const node2Sync = trackMessages(node2);
|
|
102
|
+
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
103
|
+
node2.syncManager.addPeer(peer2);
|
|
104
|
+
const map2 = await node2.load(map.id);
|
|
105
|
+
if (map2 === "unavailable") {
|
|
106
|
+
throw new Error("Map is unavailable");
|
|
107
|
+
}
|
|
108
|
+
expect(toSimplifiedMessages({
|
|
109
|
+
Map: map.core,
|
|
110
|
+
Group: group.core,
|
|
111
|
+
}, node2Sync.messages)).toMatchInlineSnapshot(`
|
|
112
|
+
[
|
|
113
|
+
"client -> LOAD Map sessions: empty",
|
|
114
|
+
"storage -> CONTENT Group header: true new: After: 0 New: 3",
|
|
115
|
+
"client -> KNOWN Group sessions: header/3",
|
|
116
|
+
"storage -> CONTENT Map header: true new: ",
|
|
117
|
+
"client -> KNOWN Map sessions: header/0",
|
|
118
|
+
]
|
|
119
|
+
`);
|
|
120
|
+
node2Sync.restore();
|
|
121
|
+
});
|
|
81
122
|
test("should load dependencies correctly (group inheritance)", async () => {
|
|
82
123
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
83
124
|
const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
@@ -120,13 +161,10 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
120
161
|
}, node2Sync.messages)).toMatchInlineSnapshot(`
|
|
121
162
|
[
|
|
122
163
|
"client -> LOAD Map sessions: empty",
|
|
123
|
-
"storage -> KNOWN ParentGroup sessions: header/4",
|
|
124
164
|
"storage -> CONTENT ParentGroup header: true new: After: 0 New: 4",
|
|
125
165
|
"client -> KNOWN ParentGroup sessions: header/4",
|
|
126
|
-
"storage -> KNOWN Group sessions: header/5",
|
|
127
166
|
"storage -> CONTENT Group header: true new: After: 0 New: 5",
|
|
128
167
|
"client -> KNOWN Group sessions: header/5",
|
|
129
|
-
"storage -> KNOWN Map sessions: header/1",
|
|
130
168
|
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
131
169
|
"client -> KNOWN Map sessions: header/1",
|
|
132
170
|
]
|
|
@@ -165,17 +203,13 @@ test("should not send the same dependency value twice", async () => {
|
|
|
165
203
|
}, node2Sync.messages)).toMatchInlineSnapshot(`
|
|
166
204
|
[
|
|
167
205
|
"client -> LOAD Map sessions: empty",
|
|
168
|
-
"storage -> KNOWN ParentGroup sessions: header/4",
|
|
169
206
|
"storage -> CONTENT ParentGroup header: true new: After: 0 New: 4",
|
|
170
207
|
"client -> KNOWN ParentGroup sessions: header/4",
|
|
171
|
-
"storage -> KNOWN Group sessions: header/5",
|
|
172
208
|
"storage -> CONTENT Group header: true new: After: 0 New: 5",
|
|
173
209
|
"client -> KNOWN Group sessions: header/5",
|
|
174
|
-
"storage -> KNOWN Map sessions: header/1",
|
|
175
210
|
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
176
211
|
"client -> KNOWN Map sessions: header/1",
|
|
177
212
|
"client -> LOAD MapFromParent sessions: empty",
|
|
178
|
-
"storage -> KNOWN MapFromParent sessions: header/1",
|
|
179
213
|
"storage -> CONTENT MapFromParent header: true new: After: 0 New: 1",
|
|
180
214
|
"client -> KNOWN MapFromParent sessions: header/1",
|
|
181
215
|
]
|
|
@@ -236,10 +270,8 @@ test("should recover from data loss", async () => {
|
|
|
236
270
|
}, node2Sync.messages)).toMatchInlineSnapshot(`
|
|
237
271
|
[
|
|
238
272
|
"client -> LOAD Map sessions: empty",
|
|
239
|
-
"storage -> KNOWN Group sessions: header/3",
|
|
240
273
|
"storage -> CONTENT Group header: true new: After: 0 New: 3",
|
|
241
274
|
"client -> KNOWN Group sessions: header/3",
|
|
242
|
-
"storage -> KNOWN Map sessions: header/4",
|
|
243
275
|
"storage -> CONTENT Map header: true new: After: 0 New: 4",
|
|
244
276
|
"client -> KNOWN Map sessions: header/4",
|
|
245
277
|
]
|
|
@@ -293,4 +325,93 @@ test("should recover missing dependencies from storage", async () => {
|
|
|
293
325
|
"0": 0,
|
|
294
326
|
});
|
|
295
327
|
});
|
|
296
|
-
|
|
328
|
+
test("should sync multiple sessions in a single content message", async () => {
|
|
329
|
+
const agentSecret = Crypto.newRandomAgentSecret();
|
|
330
|
+
const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
331
|
+
const { peer, dbPath } = await createSQLiteStorage();
|
|
332
|
+
node1.syncManager.addPeer(peer);
|
|
333
|
+
const group = node1.createGroup();
|
|
334
|
+
const map = group.createMap();
|
|
335
|
+
map.set("hello", "world");
|
|
336
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
337
|
+
node1.gracefulShutdown();
|
|
338
|
+
const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
339
|
+
node2.syncManager.addPeer((await createSQLiteStorage(dbPath)).peer);
|
|
340
|
+
const map2 = await node2.load(map.id);
|
|
341
|
+
if (map2 === "unavailable") {
|
|
342
|
+
throw new Error("Map is unavailable");
|
|
343
|
+
}
|
|
344
|
+
expect(map2.get("hello")).toBe("world");
|
|
345
|
+
map2.set("hello", "world2");
|
|
346
|
+
await map2.core.waitForSync();
|
|
347
|
+
node2.gracefulShutdown();
|
|
348
|
+
const node3 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
349
|
+
const node3Sync = trackMessages(node3);
|
|
350
|
+
node3.syncManager.addPeer((await createSQLiteStorage(dbPath)).peer);
|
|
351
|
+
const map3 = await node3.load(map.id);
|
|
352
|
+
if (map3 === "unavailable") {
|
|
353
|
+
throw new Error("Map is unavailable");
|
|
354
|
+
}
|
|
355
|
+
expect(map3.get("hello")).toBe("world2");
|
|
356
|
+
expect(toSimplifiedMessages({
|
|
357
|
+
Map: map.core,
|
|
358
|
+
Group: group.core,
|
|
359
|
+
}, node3Sync.messages)).toMatchInlineSnapshot(`
|
|
360
|
+
[
|
|
361
|
+
"client -> LOAD Map sessions: empty",
|
|
362
|
+
"storage -> CONTENT Group header: true new: After: 0 New: 3",
|
|
363
|
+
"client -> KNOWN Group sessions: header/3",
|
|
364
|
+
"storage -> CONTENT Map header: true new: After: 0 New: 1 | After: 0 New: 1",
|
|
365
|
+
"client -> KNOWN Map sessions: header/2",
|
|
366
|
+
]
|
|
367
|
+
`);
|
|
368
|
+
node3Sync.restore();
|
|
369
|
+
});
|
|
370
|
+
test("large coValue upload streaming", async () => {
|
|
371
|
+
const agentSecret = Crypto.newRandomAgentSecret();
|
|
372
|
+
const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
373
|
+
const { peer, dbPath } = await createSQLiteStorage();
|
|
374
|
+
node1.syncManager.addPeer(peer);
|
|
375
|
+
const group = node1.createGroup();
|
|
376
|
+
const largeMap = group.createMap();
|
|
377
|
+
const dataSize = 1 * 1024 * 200;
|
|
378
|
+
const chunkSize = 1024; // 1KB chunks
|
|
379
|
+
const chunks = dataSize / chunkSize;
|
|
380
|
+
const value = "a".repeat(chunkSize);
|
|
381
|
+
for (let i = 0; i < chunks; i++) {
|
|
382
|
+
const key = `key${i}`;
|
|
383
|
+
largeMap.set(key, value, "trusting");
|
|
384
|
+
}
|
|
385
|
+
await largeMap.core.waitForSync();
|
|
386
|
+
node1.gracefulShutdown();
|
|
387
|
+
const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
388
|
+
const node2Sync = trackMessages(node2);
|
|
389
|
+
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
390
|
+
node2.syncManager.addPeer(peer2);
|
|
391
|
+
const largeMapOnNode2 = await node2.load(largeMap.id);
|
|
392
|
+
if (largeMapOnNode2 === "unavailable") {
|
|
393
|
+
throw new Error("Map is unavailable");
|
|
394
|
+
}
|
|
395
|
+
await waitFor(() => {
|
|
396
|
+
expect(largeMapOnNode2.core.knownState()).toEqual(largeMap.core.knownState());
|
|
397
|
+
return true;
|
|
398
|
+
});
|
|
399
|
+
expect(toSimplifiedMessages({
|
|
400
|
+
Map: largeMap.core,
|
|
401
|
+
Group: group.core,
|
|
402
|
+
}, node2Sync.messages)).toMatchInlineSnapshot(`
|
|
403
|
+
[
|
|
404
|
+
"client -> LOAD Map sessions: empty",
|
|
405
|
+
"storage -> KNOWN Map sessions: header/200",
|
|
406
|
+
"storage -> CONTENT Group header: true new: After: 0 New: 3",
|
|
407
|
+
"client -> KNOWN Group sessions: header/3",
|
|
408
|
+
"storage -> CONTENT Map header: true new: After: 0 New: 97",
|
|
409
|
+
"client -> KNOWN Map sessions: header/97",
|
|
410
|
+
"storage -> CONTENT Map header: true new: After: 97 New: 97",
|
|
411
|
+
"client -> KNOWN Map sessions: header/194",
|
|
412
|
+
"storage -> CONTENT Map header: true new: After: 194 New: 6",
|
|
413
|
+
"client -> KNOWN Map sessions: header/200",
|
|
414
|
+
]
|
|
415
|
+
`);
|
|
416
|
+
});
|
|
417
|
+
//# sourceMappingURL=storage.sqlite.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.sqlite.test.js","sourceRoot":"","sources":["../../src/tests/storage.sqlite.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../src/tests/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAIrD,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS;;cAEnC,QAAQ,GAAG,QAAQ,GAAG,SAAS;aAChC,WAAW;;;EAoCnB"}
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../src/tests/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAIrD,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS;;cAEnC,QAAQ,GAAG,QAAQ,GAAG,SAAS;aAChC,WAAW;;;EAoCnB;AACD,wBAAgB,OAAO,CACrB,QAAQ,EAAE,MAAM,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,iBA2BnE"}
|
package/dist/tests/testUtils.js
CHANGED
|
@@ -30,4 +30,28 @@ export function trackMessages(node) {
|
|
|
30
30
|
restore,
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
|
+
export function waitFor(callback) {
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
const checkPassed = async () => {
|
|
36
|
+
try {
|
|
37
|
+
return { ok: await callback(), error: null };
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
return { ok: false, error };
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
let retries = 0;
|
|
44
|
+
const interval = setInterval(async () => {
|
|
45
|
+
const { ok, error } = await checkPassed();
|
|
46
|
+
if (ok !== false) {
|
|
47
|
+
clearInterval(interval);
|
|
48
|
+
resolve();
|
|
49
|
+
}
|
|
50
|
+
if (++retries > 10) {
|
|
51
|
+
clearInterval(interval);
|
|
52
|
+
reject(error);
|
|
53
|
+
}
|
|
54
|
+
}, 100);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
33
57
|
//# sourceMappingURL=testUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../src/tests/testUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,UAAU,aAAa,CAAC,IAAe;IAC3C,MAAM,QAAQ,GAGR,EAAE,CAAC;IAET,MAAM,yBAAyB,GAC7B,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,CAAC;IACjD,MAAM,uBAAuB,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC;IAEnE,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,GAAG,KAAK,WAAW,GAAG;QAClE,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,GAAG;SACJ,CAAC,CAAC;QACH,OAAO,yBAAyB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC;IAEF,IAAI,CAAC,WAAW,CAAC,iBAAiB,GAAG,KAAK,WAAW,GAAG,EAAE,IAAI;QAC5D,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,SAAS;YACf,GAAG;SACJ,CAAC,CAAC;QACH,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,GAAG,yBAAyB,CAAC;QAC3E,IAAI,CAAC,WAAW,CAAC,iBAAiB,GAAG,uBAAuB,CAAC;IAC/D,CAAC,CAAC;IAEF,cAAc,CAAC,GAAG,EAAE;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ;QACR,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../src/tests/testUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,UAAU,aAAa,CAAC,IAAe;IAC3C,MAAM,QAAQ,GAGR,EAAE,CAAC;IAET,MAAM,yBAAyB,GAC7B,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,CAAC;IACjD,MAAM,uBAAuB,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC;IAEnE,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,GAAG,KAAK,WAAW,GAAG;QAClE,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,GAAG;SACJ,CAAC,CAAC;QACH,OAAO,yBAAyB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC;IAEF,IAAI,CAAC,WAAW,CAAC,iBAAiB,GAAG,KAAK,WAAW,GAAG,EAAE,IAAI;QAC5D,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,SAAS;YACf,GAAG;SACJ,CAAC,CAAC;QACH,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,GAAG,yBAAyB,CAAC;QAC3E,IAAI,CAAC,WAAW,CAAC,iBAAiB,GAAG,uBAAuB,CAAC;IAC/D,CAAC,CAAC;IAEF,cAAc,CAAC,GAAG,EAAE;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ;QACR,OAAO;KACR,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,OAAO,CACrB,QAAkE;IAElE,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;YAC7B,IAAI,CAAC;gBACH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC/C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACtC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;YAE1C,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;gBACjB,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE,CAAC;gBACnB,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cojson-storage-sqlite",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.13.
|
|
4
|
+
"version": "0.13.32",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"better-sqlite3": "^11.7.0",
|
|
10
|
-
"cojson": "0.13.
|
|
11
|
-
"cojson-storage": "0.13.
|
|
10
|
+
"cojson": "0.13.31",
|
|
11
|
+
"cojson-storage": "0.13.32"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"@types/better-sqlite3": "^7.6.12",
|
package/src/sqliteClient.ts
CHANGED
|
@@ -86,13 +86,14 @@ export class SQLiteClient implements DBClientInterfaceSync {
|
|
|
86
86
|
|
|
87
87
|
getNewTransactionInSession(
|
|
88
88
|
sessionRowId: number,
|
|
89
|
-
|
|
89
|
+
fromIdx: number,
|
|
90
|
+
toIdx: number,
|
|
90
91
|
): TransactionRow[] {
|
|
91
92
|
const txs = this.db
|
|
92
|
-
.prepare<[number, number]>(
|
|
93
|
-
"SELECT * FROM transactions WHERE ses = ? AND idx >= ?",
|
|
93
|
+
.prepare<[number, number, number]>(
|
|
94
|
+
"SELECT * FROM transactions WHERE ses = ? AND idx >= ? AND idx <= ?",
|
|
94
95
|
)
|
|
95
|
-
.all(sessionRowId,
|
|
96
|
+
.all(sessionRowId, fromIdx, toIdx) as RawTransactionRow[];
|
|
96
97
|
|
|
97
98
|
try {
|
|
98
99
|
return txs.map((transactionRow) => ({
|
|
@@ -8,7 +8,7 @@ import { WasmCrypto } from "cojson/crypto/WasmCrypto";
|
|
|
8
8
|
import { expect, onTestFinished, test, vi } from "vitest";
|
|
9
9
|
import { SQLiteNode } from "../index.js";
|
|
10
10
|
import { toSimplifiedMessages } from "./messagesTestUtils.js";
|
|
11
|
-
import { trackMessages } from "./testUtils.js";
|
|
11
|
+
import { trackMessages, waitFor } from "./testUtils.js";
|
|
12
12
|
|
|
13
13
|
const Crypto = await WasmCrypto.create();
|
|
14
14
|
|
|
@@ -117,10 +117,8 @@ test("should sync and load data from storage", async () => {
|
|
|
117
117
|
).toMatchInlineSnapshot(`
|
|
118
118
|
[
|
|
119
119
|
"client -> LOAD Map sessions: empty",
|
|
120
|
-
"storage -> KNOWN Group sessions: header/3",
|
|
121
120
|
"storage -> CONTENT Group header: true new: After: 0 New: 3",
|
|
122
121
|
"client -> KNOWN Group sessions: header/3",
|
|
123
|
-
"storage -> KNOWN Map sessions: header/1",
|
|
124
122
|
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
125
123
|
"client -> KNOWN Map sessions: header/1",
|
|
126
124
|
]
|
|
@@ -129,6 +127,84 @@ test("should sync and load data from storage", async () => {
|
|
|
129
127
|
node2Sync.restore();
|
|
130
128
|
});
|
|
131
129
|
|
|
130
|
+
test("should send an empty content message if there is no content", async () => {
|
|
131
|
+
const agentSecret = Crypto.newRandomAgentSecret();
|
|
132
|
+
|
|
133
|
+
const node1 = new LocalNode(
|
|
134
|
+
agentSecret,
|
|
135
|
+
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
136
|
+
Crypto,
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
const node1Sync = trackMessages(node1);
|
|
140
|
+
|
|
141
|
+
const { peer, dbPath } = await createSQLiteStorage();
|
|
142
|
+
|
|
143
|
+
node1.syncManager.addPeer(peer);
|
|
144
|
+
|
|
145
|
+
const group = node1.createGroup();
|
|
146
|
+
|
|
147
|
+
const map = group.createMap();
|
|
148
|
+
|
|
149
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
150
|
+
|
|
151
|
+
expect(
|
|
152
|
+
toSimplifiedMessages(
|
|
153
|
+
{
|
|
154
|
+
Map: map.core,
|
|
155
|
+
Group: group.core,
|
|
156
|
+
},
|
|
157
|
+
node1Sync.messages,
|
|
158
|
+
),
|
|
159
|
+
).toMatchInlineSnapshot(`
|
|
160
|
+
[
|
|
161
|
+
"client -> CONTENT Group header: true new: After: 0 New: 3",
|
|
162
|
+
"storage -> KNOWN Group sessions: header/3",
|
|
163
|
+
"client -> CONTENT Map header: true new: ",
|
|
164
|
+
"storage -> KNOWN Map sessions: header/0",
|
|
165
|
+
]
|
|
166
|
+
`);
|
|
167
|
+
|
|
168
|
+
node1Sync.restore();
|
|
169
|
+
|
|
170
|
+
const node2 = new LocalNode(
|
|
171
|
+
agentSecret,
|
|
172
|
+
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
173
|
+
Crypto,
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
const node2Sync = trackMessages(node2);
|
|
177
|
+
|
|
178
|
+
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
179
|
+
|
|
180
|
+
node2.syncManager.addPeer(peer2);
|
|
181
|
+
|
|
182
|
+
const map2 = await node2.load(map.id);
|
|
183
|
+
if (map2 === "unavailable") {
|
|
184
|
+
throw new Error("Map is unavailable");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
expect(
|
|
188
|
+
toSimplifiedMessages(
|
|
189
|
+
{
|
|
190
|
+
Map: map.core,
|
|
191
|
+
Group: group.core,
|
|
192
|
+
},
|
|
193
|
+
node2Sync.messages,
|
|
194
|
+
),
|
|
195
|
+
).toMatchInlineSnapshot(`
|
|
196
|
+
[
|
|
197
|
+
"client -> LOAD Map sessions: empty",
|
|
198
|
+
"storage -> CONTENT Group header: true new: After: 0 New: 3",
|
|
199
|
+
"client -> KNOWN Group sessions: header/3",
|
|
200
|
+
"storage -> CONTENT Map header: true new: ",
|
|
201
|
+
"client -> KNOWN Map sessions: header/0",
|
|
202
|
+
]
|
|
203
|
+
`);
|
|
204
|
+
|
|
205
|
+
node2Sync.restore();
|
|
206
|
+
});
|
|
207
|
+
|
|
132
208
|
test("should load dependencies correctly (group inheritance)", async () => {
|
|
133
209
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
134
210
|
|
|
@@ -207,13 +283,10 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
207
283
|
).toMatchInlineSnapshot(`
|
|
208
284
|
[
|
|
209
285
|
"client -> LOAD Map sessions: empty",
|
|
210
|
-
"storage -> KNOWN ParentGroup sessions: header/4",
|
|
211
286
|
"storage -> CONTENT ParentGroup header: true new: After: 0 New: 4",
|
|
212
287
|
"client -> KNOWN ParentGroup sessions: header/4",
|
|
213
|
-
"storage -> KNOWN Group sessions: header/5",
|
|
214
288
|
"storage -> CONTENT Group header: true new: After: 0 New: 5",
|
|
215
289
|
"client -> KNOWN Group sessions: header/5",
|
|
216
|
-
"storage -> KNOWN Map sessions: header/1",
|
|
217
290
|
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
218
291
|
"client -> KNOWN Map sessions: header/1",
|
|
219
292
|
]
|
|
@@ -283,17 +356,13 @@ test("should not send the same dependency value twice", async () => {
|
|
|
283
356
|
).toMatchInlineSnapshot(`
|
|
284
357
|
[
|
|
285
358
|
"client -> LOAD Map sessions: empty",
|
|
286
|
-
"storage -> KNOWN ParentGroup sessions: header/4",
|
|
287
359
|
"storage -> CONTENT ParentGroup header: true new: After: 0 New: 4",
|
|
288
360
|
"client -> KNOWN ParentGroup sessions: header/4",
|
|
289
|
-
"storage -> KNOWN Group sessions: header/5",
|
|
290
361
|
"storage -> CONTENT Group header: true new: After: 0 New: 5",
|
|
291
362
|
"client -> KNOWN Group sessions: header/5",
|
|
292
|
-
"storage -> KNOWN Map sessions: header/1",
|
|
293
363
|
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
294
364
|
"client -> KNOWN Map sessions: header/1",
|
|
295
365
|
"client -> LOAD MapFromParent sessions: empty",
|
|
296
|
-
"storage -> KNOWN MapFromParent sessions: header/1",
|
|
297
366
|
"storage -> CONTENT MapFromParent header: true new: After: 0 New: 1",
|
|
298
367
|
"client -> KNOWN MapFromParent sessions: header/1",
|
|
299
368
|
]
|
|
@@ -397,10 +466,8 @@ test("should recover from data loss", async () => {
|
|
|
397
466
|
).toMatchInlineSnapshot(`
|
|
398
467
|
[
|
|
399
468
|
"client -> LOAD Map sessions: empty",
|
|
400
|
-
"storage -> KNOWN Group sessions: header/3",
|
|
401
469
|
"storage -> CONTENT Group header: true new: After: 0 New: 3",
|
|
402
470
|
"client -> KNOWN Group sessions: header/3",
|
|
403
|
-
"storage -> KNOWN Map sessions: header/4",
|
|
404
471
|
"storage -> CONTENT Map header: true new: After: 0 New: 4",
|
|
405
472
|
"client -> KNOWN Map sessions: header/4",
|
|
406
473
|
]
|
|
@@ -495,3 +562,166 @@ test("should recover missing dependencies from storage", async () => {
|
|
|
495
562
|
"0": 0,
|
|
496
563
|
});
|
|
497
564
|
});
|
|
565
|
+
|
|
566
|
+
test("should sync multiple sessions in a single content message", async () => {
|
|
567
|
+
const agentSecret = Crypto.newRandomAgentSecret();
|
|
568
|
+
|
|
569
|
+
const node1 = new LocalNode(
|
|
570
|
+
agentSecret,
|
|
571
|
+
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
572
|
+
Crypto,
|
|
573
|
+
);
|
|
574
|
+
|
|
575
|
+
const { peer, dbPath } = await createSQLiteStorage();
|
|
576
|
+
|
|
577
|
+
node1.syncManager.addPeer(peer);
|
|
578
|
+
|
|
579
|
+
const group = node1.createGroup();
|
|
580
|
+
|
|
581
|
+
const map = group.createMap();
|
|
582
|
+
|
|
583
|
+
map.set("hello", "world");
|
|
584
|
+
|
|
585
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
586
|
+
|
|
587
|
+
node1.gracefulShutdown();
|
|
588
|
+
|
|
589
|
+
const node2 = new LocalNode(
|
|
590
|
+
agentSecret,
|
|
591
|
+
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
592
|
+
Crypto,
|
|
593
|
+
);
|
|
594
|
+
|
|
595
|
+
node2.syncManager.addPeer((await createSQLiteStorage(dbPath)).peer);
|
|
596
|
+
|
|
597
|
+
const map2 = await node2.load(map.id);
|
|
598
|
+
if (map2 === "unavailable") {
|
|
599
|
+
throw new Error("Map is unavailable");
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
expect(map2.get("hello")).toBe("world");
|
|
603
|
+
|
|
604
|
+
map2.set("hello", "world2");
|
|
605
|
+
|
|
606
|
+
await map2.core.waitForSync();
|
|
607
|
+
|
|
608
|
+
node2.gracefulShutdown();
|
|
609
|
+
|
|
610
|
+
const node3 = new LocalNode(
|
|
611
|
+
agentSecret,
|
|
612
|
+
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
613
|
+
Crypto,
|
|
614
|
+
);
|
|
615
|
+
|
|
616
|
+
const node3Sync = trackMessages(node3);
|
|
617
|
+
|
|
618
|
+
node3.syncManager.addPeer((await createSQLiteStorage(dbPath)).peer);
|
|
619
|
+
|
|
620
|
+
const map3 = await node3.load(map.id);
|
|
621
|
+
if (map3 === "unavailable") {
|
|
622
|
+
throw new Error("Map is unavailable");
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
expect(map3.get("hello")).toBe("world2");
|
|
626
|
+
|
|
627
|
+
expect(
|
|
628
|
+
toSimplifiedMessages(
|
|
629
|
+
{
|
|
630
|
+
Map: map.core,
|
|
631
|
+
Group: group.core,
|
|
632
|
+
},
|
|
633
|
+
node3Sync.messages,
|
|
634
|
+
),
|
|
635
|
+
).toMatchInlineSnapshot(`
|
|
636
|
+
[
|
|
637
|
+
"client -> LOAD Map sessions: empty",
|
|
638
|
+
"storage -> CONTENT Group header: true new: After: 0 New: 3",
|
|
639
|
+
"client -> KNOWN Group sessions: header/3",
|
|
640
|
+
"storage -> CONTENT Map header: true new: After: 0 New: 1 | After: 0 New: 1",
|
|
641
|
+
"client -> KNOWN Map sessions: header/2",
|
|
642
|
+
]
|
|
643
|
+
`);
|
|
644
|
+
|
|
645
|
+
node3Sync.restore();
|
|
646
|
+
});
|
|
647
|
+
|
|
648
|
+
test("large coValue upload streaming", async () => {
|
|
649
|
+
const agentSecret = Crypto.newRandomAgentSecret();
|
|
650
|
+
|
|
651
|
+
const node1 = new LocalNode(
|
|
652
|
+
agentSecret,
|
|
653
|
+
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
654
|
+
Crypto,
|
|
655
|
+
);
|
|
656
|
+
|
|
657
|
+
const { peer, dbPath } = await createSQLiteStorage();
|
|
658
|
+
|
|
659
|
+
node1.syncManager.addPeer(peer);
|
|
660
|
+
|
|
661
|
+
const group = node1.createGroup();
|
|
662
|
+
const largeMap = group.createMap();
|
|
663
|
+
|
|
664
|
+
const dataSize = 1 * 1024 * 200;
|
|
665
|
+
const chunkSize = 1024; // 1KB chunks
|
|
666
|
+
const chunks = dataSize / chunkSize;
|
|
667
|
+
|
|
668
|
+
const value = "a".repeat(chunkSize);
|
|
669
|
+
|
|
670
|
+
for (let i = 0; i < chunks; i++) {
|
|
671
|
+
const key = `key${i}`;
|
|
672
|
+
largeMap.set(key, value, "trusting");
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
await largeMap.core.waitForSync();
|
|
676
|
+
|
|
677
|
+
node1.gracefulShutdown();
|
|
678
|
+
|
|
679
|
+
const node2 = new LocalNode(
|
|
680
|
+
agentSecret,
|
|
681
|
+
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
682
|
+
Crypto,
|
|
683
|
+
);
|
|
684
|
+
|
|
685
|
+
const node2Sync = trackMessages(node2);
|
|
686
|
+
|
|
687
|
+
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
688
|
+
|
|
689
|
+
node2.syncManager.addPeer(peer2);
|
|
690
|
+
|
|
691
|
+
const largeMapOnNode2 = await node2.load(largeMap.id);
|
|
692
|
+
|
|
693
|
+
if (largeMapOnNode2 === "unavailable") {
|
|
694
|
+
throw new Error("Map is unavailable");
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
await waitFor(() => {
|
|
698
|
+
expect(largeMapOnNode2.core.knownState()).toEqual(
|
|
699
|
+
largeMap.core.knownState(),
|
|
700
|
+
);
|
|
701
|
+
|
|
702
|
+
return true;
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
expect(
|
|
706
|
+
toSimplifiedMessages(
|
|
707
|
+
{
|
|
708
|
+
Map: largeMap.core,
|
|
709
|
+
Group: group.core,
|
|
710
|
+
},
|
|
711
|
+
node2Sync.messages,
|
|
712
|
+
),
|
|
713
|
+
).toMatchInlineSnapshot(`
|
|
714
|
+
[
|
|
715
|
+
"client -> LOAD Map sessions: empty",
|
|
716
|
+
"storage -> KNOWN Map sessions: header/200",
|
|
717
|
+
"storage -> CONTENT Group header: true new: After: 0 New: 3",
|
|
718
|
+
"client -> KNOWN Group sessions: header/3",
|
|
719
|
+
"storage -> CONTENT Map header: true new: After: 0 New: 97",
|
|
720
|
+
"client -> KNOWN Map sessions: header/97",
|
|
721
|
+
"storage -> CONTENT Map header: true new: After: 97 New: 97",
|
|
722
|
+
"client -> KNOWN Map sessions: header/194",
|
|
723
|
+
"storage -> CONTENT Map header: true new: After: 194 New: 6",
|
|
724
|
+
"client -> KNOWN Map sessions: header/200",
|
|
725
|
+
]
|
|
726
|
+
`);
|
|
727
|
+
});
|
package/src/tests/testUtils.ts
CHANGED
|
@@ -42,3 +42,32 @@ export function trackMessages(node: LocalNode) {
|
|
|
42
42
|
restore,
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
|
+
export function waitFor(
|
|
46
|
+
callback: () => boolean | undefined | Promise<boolean | undefined>,
|
|
47
|
+
) {
|
|
48
|
+
return new Promise<void>((resolve, reject) => {
|
|
49
|
+
const checkPassed = async () => {
|
|
50
|
+
try {
|
|
51
|
+
return { ok: await callback(), error: null };
|
|
52
|
+
} catch (error) {
|
|
53
|
+
return { ok: false, error };
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
let retries = 0;
|
|
58
|
+
|
|
59
|
+
const interval = setInterval(async () => {
|
|
60
|
+
const { ok, error } = await checkPassed();
|
|
61
|
+
|
|
62
|
+
if (ok !== false) {
|
|
63
|
+
clearInterval(interval);
|
|
64
|
+
resolve();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (++retries > 10) {
|
|
68
|
+
clearInterval(interval);
|
|
69
|
+
reject(error);
|
|
70
|
+
}
|
|
71
|
+
}, 100);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.test.d.ts","sourceRoot":"","sources":["../../src/tests/sqlite.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.test.js","sourceRoot":"","sources":["../../src/tests/sqlite.test.ts"],"names":[],"mappings":"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"}
|