cojson-storage-sqlite 0.13.17 → 0.13.20
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 +23 -0
- package/dist/sqliteNode.d.ts +1 -2
- package/dist/sqliteNode.d.ts.map +1 -1
- package/dist/sqliteNode.js +2 -2
- package/dist/sqliteNode.js.map +1 -1
- package/dist/tests/sqlite.test.js +65 -8
- package/dist/tests/sqlite.test.js.map +1 -1
- package/package.json +3 -3
- package/src/sqliteNode.ts +1 -3
- package/src/tests/sqlite.test.ts +96 -9
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# cojson-storage-sqlite
|
|
2
2
|
|
|
3
|
+
## 0.13.20
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [adfc9a6]
|
|
8
|
+
- Updated dependencies [1389207]
|
|
9
|
+
- Updated dependencies [d6e143e]
|
|
10
|
+
- Updated dependencies [3e6229d]
|
|
11
|
+
- cojson-storage@0.13.20
|
|
12
|
+
- cojson@0.13.20
|
|
13
|
+
|
|
14
|
+
## 0.13.18
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- Updated dependencies [9089252]
|
|
19
|
+
- Updated dependencies [b470f63]
|
|
20
|
+
- Updated dependencies [8b2df0e]
|
|
21
|
+
- Updated dependencies [66373ba]
|
|
22
|
+
- Updated dependencies [f24cad1]
|
|
23
|
+
- cojson@0.13.18
|
|
24
|
+
- cojson-storage@0.13.18
|
|
25
|
+
|
|
3
26
|
## 0.13.17
|
|
4
27
|
|
|
5
28
|
### Patch Changes
|
package/dist/sqliteNode.d.ts
CHANGED
|
@@ -4,9 +4,8 @@ export declare class SQLiteNode {
|
|
|
4
4
|
private readonly syncManager;
|
|
5
5
|
private readonly dbClient;
|
|
6
6
|
constructor(db: DatabaseT, fromLocalNode: IncomingSyncStream, toLocalNode: OutgoingSyncQueue);
|
|
7
|
-
static asPeer({ filename,
|
|
7
|
+
static asPeer({ filename, localNodeName, }: {
|
|
8
8
|
filename: string;
|
|
9
|
-
trace?: boolean;
|
|
10
9
|
localNodeName?: string;
|
|
11
10
|
}): Promise<Peer>;
|
|
12
11
|
static open(filename: string, fromLocalNode: IncomingSyncStream, toLocalNode: OutgoingSyncQueue): Promise<SQLiteNode>;
|
package/dist/sqliteNode.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteNode.d.ts","sourceRoot":"","sources":["../src/sqliteNode.ts"],"names":[],"mappings":"AAAA,OAAiB,EAAE,KAAK,QAAQ,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,IAAI,EAGV,MAAM,QAAQ,CAAC;AAIhB,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;gBAGtC,EAAE,EAAE,SAAS,EACb,aAAa,EAAE,kBAAkB,EACjC,WAAW,EAAE,iBAAiB;WAsCnB,MAAM,CAAC,EAClB,QAAQ,EACR,
|
|
1
|
+
{"version":3,"file":"sqliteNode.d.ts","sourceRoot":"","sources":["../src/sqliteNode.ts"],"names":[],"mappings":"AAAA,OAAiB,EAAE,KAAK,QAAQ,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,IAAI,EAGV,MAAM,QAAQ,CAAC;AAIhB,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;gBAGtC,EAAE,EAAE,SAAS,EACb,aAAa,EAAE,kBAAkB,EACjC,WAAW,EAAE,iBAAiB;WAsCnB,MAAM,CAAC,EAClB,QAAQ,EACR,aAAuB,GACxB,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,CAAC;WAgBJ,IAAI,CACf,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,kBAAkB,EACjC,WAAW,EAAE,iBAAiB;CAwFjC"}
|
package/dist/sqliteNode.js
CHANGED
|
@@ -33,8 +33,8 @@ export class SQLiteNode {
|
|
|
33
33
|
};
|
|
34
34
|
processMessages().catch((e) => logger.error("Error in processMessages in sqlite", { err: e }));
|
|
35
35
|
}
|
|
36
|
-
static async asPeer({ filename,
|
|
37
|
-
const [localNodeAsPeer, storageAsPeer] = cojsonInternals.connectedPeers(localNodeName, "storage", { peer1role: "client", peer2role: "storage",
|
|
36
|
+
static async asPeer({ filename, localNodeName = "local", }) {
|
|
37
|
+
const [localNodeAsPeer, storageAsPeer] = cojsonInternals.connectedPeers(localNodeName, "storage", { peer1role: "client", peer2role: "storage", crashOnClose: true });
|
|
38
38
|
await SQLiteNode.open(filename, localNodeAsPeer.incoming, localNodeAsPeer.outgoing);
|
|
39
39
|
return { ...storageAsPeer, priority: 100 };
|
|
40
40
|
}
|
package/dist/sqliteNode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteNode.js","sourceRoot":"","sources":["../src/sqliteNode.ts"],"names":[],"mappings":"AAAA,OAAO,QAAwC,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAIL,eAAe,EACf,MAAM,GACP,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,WAAW,EAAuB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,OAAO,UAAU;IAIrB,YACE,EAAa,EACb,aAAiC,EACjC,WAA8B;QAE9B,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE/D,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;YACjC,IAAI,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAElC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;gBACtC,IAAI,CAAC;oBACH,IAAI,GAAG,KAAK,cAAc,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;wBACpD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;oBACrD,CAAC;oBACD,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;oBAE9C,4DAA4D;oBAC5D,+DAA+D;oBAC/D,qDAAqD;oBAErD,uFAAuF;oBACvF,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC;wBACxC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;wBAC9B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;oBACzD,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE;wBACzD,GAAG;wBACH,GAAG,EAAE,CAAC;qBACP,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5B,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAClB,QAAQ,EACR,
|
|
1
|
+
{"version":3,"file":"sqliteNode.js","sourceRoot":"","sources":["../src/sqliteNode.ts"],"names":[],"mappings":"AAAA,OAAO,QAAwC,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAIL,eAAe,EACf,MAAM,GACP,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,WAAW,EAAuB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,OAAO,UAAU;IAIrB,YACE,EAAa,EACb,aAAiC,EACjC,WAA8B;QAE9B,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE/D,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;YACjC,IAAI,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAElC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;gBACtC,IAAI,CAAC;oBACH,IAAI,GAAG,KAAK,cAAc,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;wBACpD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;oBACrD,CAAC;oBACD,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;oBAE9C,4DAA4D;oBAC5D,+DAA+D;oBAC/D,qDAAqD;oBAErD,uFAAuF;oBACvF,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC;wBACxC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;wBAC9B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;oBACzD,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE;wBACzD,GAAG;wBACH,GAAG,EAAE,CAAC;qBACP,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5B,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAClB,QAAQ,EACR,aAAa,GAAG,OAAO,GAIxB;QACC,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,eAAe,CAAC,cAAc,CACrE,aAAa,EACb,SAAS,EACT,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,CAClE,CAAC;QAEF,MAAM,UAAU,CAAC,IAAI,CACnB,QAAQ,EACR,eAAe,CAAC,QAAQ,EACxB,eAAe,CAAC,QAAQ,CACzB,CAAC;QAEF,OAAO,EAAE,GAAG,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CACf,QAAgB,EAChB,aAAiC,EACjC,WAA8B;QAE9B,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAEhC,MAAM,UAAU,GACd,EAAE,CAAC,MAAM,CAAC,cAAc,CACzB,CAAC,CAAC,CAAC,CAAC,YAAsB,CAAC;QAE5B,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,EAAE,CAAC,OAAO,CACR;;;;;iCAKyB,CAC1B,CAAC,GAAG,EAAE,CAAC;YAER,EAAE,CAAC,OAAO,CACR;;;;;;;mBAOW,CACZ,CAAC,GAAG,EAAE,CAAC;YAER,EAAE,CAAC,OAAO,CACR,qEAAqE,CACtE,CAAC,GAAG,EAAE,CAAC;YAER,EAAE,CAAC,OAAO,CACR;;;;mBAIW,CACZ,CAAC,GAAG,EAAE,CAAC;YAER,EAAE,CAAC,OAAO,CACR,2DAA2D,CAC5D,CAAC,GAAG,EAAE,CAAC;YAER,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,4DAA4D;YAC5D,MAAM,GAAG,GAAG,EAAE;iBACX,OAAO,CAAC,4BAA4B,CAAC;iBACrC,GAAG,EAAsB,CAAC;YAE7B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;gBACrB,EAAE,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,CAClE,EAAE,CAAC,GAAG,EACN,EAAE,CAAC,GAAG,CACP,CAAC;gBACF,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBACZ,EAAE,CAAC,OAAO,CACR,0DAA0D,CAC3D,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/B,CAAC;YAED,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,EAAE,CAAC,OAAO,CACR;;;;;iCAKyB,CAC1B,CAAC,GAAG,EAAE,CAAC;YAER,EAAE,CAAC,OAAO,CACR,kEAAkE,CACnE,CAAC,GAAG,EAAE,CAAC;YAER,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,IAAI,UAAU,CAAC,EAAE,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;CACF"}
|
|
@@ -2,7 +2,7 @@ import { randomUUID } from "node:crypto";
|
|
|
2
2
|
import { unlinkSync } from "node:fs";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
import {
|
|
5
|
+
import { LocalNode } from "cojson";
|
|
6
6
|
import { SyncManager } from "cojson-storage";
|
|
7
7
|
import { WasmCrypto } from "cojson/crypto/WasmCrypto";
|
|
8
8
|
import { expect, onTestFinished, test, vi } from "vitest";
|
|
@@ -26,14 +26,14 @@ async function createSQLiteStorage(defaultDbPath) {
|
|
|
26
26
|
}
|
|
27
27
|
test("Should be able to initialize and load from empty DB", async () => {
|
|
28
28
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
29
|
-
const node = new LocalNode(
|
|
29
|
+
const node = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
30
30
|
node.syncManager.addPeer((await createSQLiteStorage()).peer);
|
|
31
31
|
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
32
32
|
expect(node.syncManager.peers.storage).toBeDefined();
|
|
33
33
|
});
|
|
34
34
|
test("should sync and load data from storage", async () => {
|
|
35
35
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
36
|
-
const node1 = new LocalNode(
|
|
36
|
+
const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
37
37
|
const node1Sync = trackMessages(node1);
|
|
38
38
|
const { peer, dbPath } = await createSQLiteStorage();
|
|
39
39
|
node1.syncManager.addPeer(peer);
|
|
@@ -47,11 +47,13 @@ test("should sync and load data from storage", async () => {
|
|
|
47
47
|
}, node1Sync.messages)).toMatchInlineSnapshot(`
|
|
48
48
|
[
|
|
49
49
|
"client -> CONTENT Group header: true new: After: 0 New: 3",
|
|
50
|
+
"storage -> KNOWN Group sessions: header/3",
|
|
50
51
|
"client -> CONTENT Map header: true new: After: 0 New: 1",
|
|
52
|
+
"storage -> KNOWN Map sessions: header/1",
|
|
51
53
|
]
|
|
52
54
|
`);
|
|
53
55
|
node1Sync.restore();
|
|
54
|
-
const node2 = new LocalNode(
|
|
56
|
+
const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
55
57
|
const node2Sync = trackMessages(node2);
|
|
56
58
|
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
57
59
|
node2.syncManager.addPeer(peer2);
|
|
@@ -77,7 +79,7 @@ test("should sync and load data from storage", async () => {
|
|
|
77
79
|
});
|
|
78
80
|
test("should load dependencies correctly (group inheritance)", async () => {
|
|
79
81
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
80
|
-
const node1 = new LocalNode(
|
|
82
|
+
const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
81
83
|
const node1Sync = trackMessages(node1);
|
|
82
84
|
const { peer, dbPath } = await createSQLiteStorage();
|
|
83
85
|
node1.syncManager.addPeer(peer);
|
|
@@ -94,23 +96,70 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
94
96
|
}, node1Sync.messages)).toMatchInlineSnapshot(`
|
|
95
97
|
[
|
|
96
98
|
"client -> CONTENT ParentGroup header: true new: After: 0 New: 4",
|
|
99
|
+
"storage -> KNOWN ParentGroup sessions: header/4",
|
|
97
100
|
"client -> CONTENT Group header: true new: After: 0 New: 5",
|
|
101
|
+
"storage -> KNOWN Group sessions: header/5",
|
|
98
102
|
"client -> CONTENT Map header: true new: After: 0 New: 1",
|
|
103
|
+
"storage -> KNOWN Map sessions: header/1",
|
|
104
|
+
]
|
|
105
|
+
`);
|
|
106
|
+
node1Sync.restore();
|
|
107
|
+
const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
108
|
+
const node2Sync = trackMessages(node2);
|
|
109
|
+
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
110
|
+
node2.syncManager.addPeer(peer2);
|
|
111
|
+
await node2.load(map.id);
|
|
112
|
+
expect(node2.expectCoValueLoaded(map.id)).toBeTruthy();
|
|
113
|
+
expect(node2.expectCoValueLoaded(group.id)).toBeTruthy();
|
|
114
|
+
expect(node2.expectCoValueLoaded(parentGroup.id)).toBeTruthy();
|
|
115
|
+
expect(toSimplifiedMessages({
|
|
116
|
+
Map: map.core,
|
|
117
|
+
Group: group.core,
|
|
118
|
+
ParentGroup: parentGroup.core,
|
|
119
|
+
}, node2Sync.messages)).toMatchInlineSnapshot(`
|
|
120
|
+
[
|
|
121
|
+
"client -> LOAD Map sessions: empty",
|
|
122
|
+
"storage -> KNOWN ParentGroup sessions: header/4",
|
|
123
|
+
"storage -> CONTENT ParentGroup header: true new: After: 0 New: 4",
|
|
124
|
+
"storage -> KNOWN Group sessions: header/5",
|
|
125
|
+
"storage -> CONTENT Group header: true new: After: 0 New: 5",
|
|
126
|
+
"client -> KNOWN ParentGroup sessions: header/4",
|
|
127
|
+
"storage -> KNOWN Map sessions: header/1",
|
|
128
|
+
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
129
|
+
"client -> KNOWN Group sessions: header/5",
|
|
99
130
|
]
|
|
100
131
|
`);
|
|
132
|
+
});
|
|
133
|
+
test("should not send the same dependency value twice", async () => {
|
|
134
|
+
const agentSecret = Crypto.newRandomAgentSecret();
|
|
135
|
+
const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
136
|
+
const node1Sync = trackMessages(node1);
|
|
137
|
+
const { peer, dbPath } = await createSQLiteStorage();
|
|
138
|
+
node1.syncManager.addPeer(peer);
|
|
139
|
+
const group = node1.createGroup();
|
|
140
|
+
const parentGroup = node1.createGroup();
|
|
141
|
+
group.extend(parentGroup);
|
|
142
|
+
const mapFromParent = parentGroup.createMap();
|
|
143
|
+
const map = group.createMap();
|
|
144
|
+
map.set("hello", "world");
|
|
145
|
+
mapFromParent.set("hello", "world");
|
|
146
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
101
147
|
node1Sync.restore();
|
|
102
|
-
const node2 = new LocalNode(
|
|
148
|
+
const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
103
149
|
const node2Sync = trackMessages(node2);
|
|
104
150
|
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
105
151
|
node2.syncManager.addPeer(peer2);
|
|
106
152
|
await node2.load(map.id);
|
|
153
|
+
await node2.load(mapFromParent.id);
|
|
107
154
|
expect(node2.expectCoValueLoaded(map.id)).toBeTruthy();
|
|
155
|
+
expect(node2.expectCoValueLoaded(mapFromParent.id)).toBeTruthy();
|
|
108
156
|
expect(node2.expectCoValueLoaded(group.id)).toBeTruthy();
|
|
109
157
|
expect(node2.expectCoValueLoaded(parentGroup.id)).toBeTruthy();
|
|
110
158
|
expect(toSimplifiedMessages({
|
|
111
159
|
Map: map.core,
|
|
112
160
|
Group: group.core,
|
|
113
161
|
ParentGroup: parentGroup.core,
|
|
162
|
+
MapFromParent: mapFromParent.core,
|
|
114
163
|
}, node2Sync.messages)).toMatchInlineSnapshot(`
|
|
115
164
|
[
|
|
116
165
|
"client -> LOAD Map sessions: empty",
|
|
@@ -122,12 +171,17 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
122
171
|
"storage -> KNOWN Map sessions: header/1",
|
|
123
172
|
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
124
173
|
"client -> KNOWN Group sessions: header/5",
|
|
174
|
+
"client -> KNOWN Map sessions: header/1",
|
|
175
|
+
"client -> LOAD MapFromParent sessions: empty",
|
|
176
|
+
"storage -> KNOWN MapFromParent sessions: header/1",
|
|
177
|
+
"storage -> CONTENT MapFromParent header: true new: After: 0 New: 1",
|
|
178
|
+
"client -> KNOWN MapFromParent sessions: header/1",
|
|
125
179
|
]
|
|
126
180
|
`);
|
|
127
181
|
});
|
|
128
182
|
test("should recover from data loss", async () => {
|
|
129
183
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
130
|
-
const node1 = new LocalNode(
|
|
184
|
+
const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
131
185
|
const node1Sync = trackMessages(node1);
|
|
132
186
|
const { peer, dbPath } = await createSQLiteStorage();
|
|
133
187
|
node1.syncManager.addPeer(peer);
|
|
@@ -150,14 +204,17 @@ test("should recover from data loss", async () => {
|
|
|
150
204
|
}, node1Sync.messages)).toMatchInlineSnapshot(`
|
|
151
205
|
[
|
|
152
206
|
"client -> CONTENT Group header: true new: After: 0 New: 3",
|
|
207
|
+
"storage -> KNOWN Group sessions: header/3",
|
|
153
208
|
"client -> CONTENT Map header: true new: After: 0 New: 1",
|
|
209
|
+
"storage -> KNOWN Map sessions: header/1",
|
|
154
210
|
"client -> CONTENT Map header: false new: After: 3 New: 1",
|
|
155
211
|
"storage -> KNOWN CORRECTION Map sessions: header/1",
|
|
156
212
|
"client -> CONTENT Map header: false new: After: 1 New: 3",
|
|
213
|
+
"storage -> KNOWN Map sessions: header/4",
|
|
157
214
|
]
|
|
158
215
|
`);
|
|
159
216
|
node1Sync.restore();
|
|
160
|
-
const node2 = new LocalNode(
|
|
217
|
+
const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
161
218
|
const node2Sync = trackMessages(node2);
|
|
162
219
|
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
163
220
|
node2.syncManager.addPeer(peer2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.test.js","sourceRoot":"","sources":["../../src/tests/sqlite.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sqlite.test.js","sourceRoot":"","sources":["../../src/tests/sqlite.test.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.13.
|
|
4
|
+
"version": "0.13.20",
|
|
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.20",
|
|
11
|
+
"cojson-storage": "0.13.20"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"@types/better-sqlite3": "^7.6.12",
|
package/src/sqliteNode.ts
CHANGED
|
@@ -56,17 +56,15 @@ export class SQLiteNode {
|
|
|
56
56
|
|
|
57
57
|
static async asPeer({
|
|
58
58
|
filename,
|
|
59
|
-
trace,
|
|
60
59
|
localNodeName = "local",
|
|
61
60
|
}: {
|
|
62
61
|
filename: string;
|
|
63
|
-
trace?: boolean;
|
|
64
62
|
localNodeName?: string;
|
|
65
63
|
}): Promise<Peer> {
|
|
66
64
|
const [localNodeAsPeer, storageAsPeer] = cojsonInternals.connectedPeers(
|
|
67
65
|
localNodeName,
|
|
68
66
|
"storage",
|
|
69
|
-
{ peer1role: "client", peer2role: "storage",
|
|
67
|
+
{ peer1role: "client", peer2role: "storage", crashOnClose: true },
|
|
70
68
|
);
|
|
71
69
|
|
|
72
70
|
await SQLiteNode.open(
|
package/src/tests/sqlite.test.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { assert } from "node:console";
|
|
2
1
|
import { randomUUID } from "node:crypto";
|
|
3
2
|
import { unlinkSync } from "node:fs";
|
|
4
3
|
import { tmpdir } from "node:os";
|
|
5
4
|
import { join } from "node:path";
|
|
6
|
-
import {
|
|
5
|
+
import { LocalNode } from "cojson";
|
|
7
6
|
import { SyncManager } from "cojson-storage";
|
|
8
7
|
import { WasmCrypto } from "cojson/crypto/WasmCrypto";
|
|
9
8
|
import { expect, onTestFinished, test, vi } from "vitest";
|
|
@@ -34,7 +33,7 @@ test("Should be able to initialize and load from empty DB", async () => {
|
|
|
34
33
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
35
34
|
|
|
36
35
|
const node = new LocalNode(
|
|
37
|
-
|
|
36
|
+
agentSecret,
|
|
38
37
|
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
39
38
|
Crypto,
|
|
40
39
|
);
|
|
@@ -50,7 +49,7 @@ test("should sync and load data from storage", async () => {
|
|
|
50
49
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
51
50
|
|
|
52
51
|
const node1 = new LocalNode(
|
|
53
|
-
|
|
52
|
+
agentSecret,
|
|
54
53
|
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
55
54
|
Crypto,
|
|
56
55
|
);
|
|
@@ -80,14 +79,16 @@ test("should sync and load data from storage", async () => {
|
|
|
80
79
|
).toMatchInlineSnapshot(`
|
|
81
80
|
[
|
|
82
81
|
"client -> CONTENT Group header: true new: After: 0 New: 3",
|
|
82
|
+
"storage -> KNOWN Group sessions: header/3",
|
|
83
83
|
"client -> CONTENT Map header: true new: After: 0 New: 1",
|
|
84
|
+
"storage -> KNOWN Map sessions: header/1",
|
|
84
85
|
]
|
|
85
86
|
`);
|
|
86
87
|
|
|
87
88
|
node1Sync.restore();
|
|
88
89
|
|
|
89
90
|
const node2 = new LocalNode(
|
|
90
|
-
|
|
91
|
+
agentSecret,
|
|
91
92
|
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
92
93
|
Crypto,
|
|
93
94
|
);
|
|
@@ -131,7 +132,7 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
131
132
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
132
133
|
|
|
133
134
|
const node1 = new LocalNode(
|
|
134
|
-
|
|
135
|
+
agentSecret,
|
|
135
136
|
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
136
137
|
Crypto,
|
|
137
138
|
);
|
|
@@ -165,15 +166,18 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
165
166
|
).toMatchInlineSnapshot(`
|
|
166
167
|
[
|
|
167
168
|
"client -> CONTENT ParentGroup header: true new: After: 0 New: 4",
|
|
169
|
+
"storage -> KNOWN ParentGroup sessions: header/4",
|
|
168
170
|
"client -> CONTENT Group header: true new: After: 0 New: 5",
|
|
171
|
+
"storage -> KNOWN Group sessions: header/5",
|
|
169
172
|
"client -> CONTENT Map header: true new: After: 0 New: 1",
|
|
173
|
+
"storage -> KNOWN Map sessions: header/1",
|
|
170
174
|
]
|
|
171
175
|
`);
|
|
172
176
|
|
|
173
177
|
node1Sync.restore();
|
|
174
178
|
|
|
175
179
|
const node2 = new LocalNode(
|
|
176
|
-
|
|
180
|
+
agentSecret,
|
|
177
181
|
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
178
182
|
Crypto,
|
|
179
183
|
);
|
|
@@ -214,11 +218,91 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
214
218
|
`);
|
|
215
219
|
});
|
|
216
220
|
|
|
221
|
+
test("should not send the same dependency value twice", async () => {
|
|
222
|
+
const agentSecret = Crypto.newRandomAgentSecret();
|
|
223
|
+
|
|
224
|
+
const node1 = new LocalNode(
|
|
225
|
+
agentSecret,
|
|
226
|
+
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
227
|
+
Crypto,
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
const node1Sync = trackMessages(node1);
|
|
231
|
+
|
|
232
|
+
const { peer, dbPath } = await createSQLiteStorage();
|
|
233
|
+
|
|
234
|
+
node1.syncManager.addPeer(peer);
|
|
235
|
+
|
|
236
|
+
const group = node1.createGroup();
|
|
237
|
+
const parentGroup = node1.createGroup();
|
|
238
|
+
|
|
239
|
+
group.extend(parentGroup);
|
|
240
|
+
|
|
241
|
+
const mapFromParent = parentGroup.createMap();
|
|
242
|
+
const map = group.createMap();
|
|
243
|
+
|
|
244
|
+
map.set("hello", "world");
|
|
245
|
+
mapFromParent.set("hello", "world");
|
|
246
|
+
|
|
247
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
248
|
+
|
|
249
|
+
node1Sync.restore();
|
|
250
|
+
|
|
251
|
+
const node2 = new LocalNode(
|
|
252
|
+
agentSecret,
|
|
253
|
+
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
254
|
+
Crypto,
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
const node2Sync = trackMessages(node2);
|
|
258
|
+
|
|
259
|
+
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
260
|
+
|
|
261
|
+
node2.syncManager.addPeer(peer2);
|
|
262
|
+
|
|
263
|
+
await node2.load(map.id);
|
|
264
|
+
await node2.load(mapFromParent.id);
|
|
265
|
+
|
|
266
|
+
expect(node2.expectCoValueLoaded(map.id)).toBeTruthy();
|
|
267
|
+
expect(node2.expectCoValueLoaded(mapFromParent.id)).toBeTruthy();
|
|
268
|
+
expect(node2.expectCoValueLoaded(group.id)).toBeTruthy();
|
|
269
|
+
expect(node2.expectCoValueLoaded(parentGroup.id)).toBeTruthy();
|
|
270
|
+
|
|
271
|
+
expect(
|
|
272
|
+
toSimplifiedMessages(
|
|
273
|
+
{
|
|
274
|
+
Map: map.core,
|
|
275
|
+
Group: group.core,
|
|
276
|
+
ParentGroup: parentGroup.core,
|
|
277
|
+
MapFromParent: mapFromParent.core,
|
|
278
|
+
},
|
|
279
|
+
node2Sync.messages,
|
|
280
|
+
),
|
|
281
|
+
).toMatchInlineSnapshot(`
|
|
282
|
+
[
|
|
283
|
+
"client -> LOAD Map sessions: empty",
|
|
284
|
+
"storage -> KNOWN ParentGroup sessions: header/4",
|
|
285
|
+
"storage -> CONTENT ParentGroup header: true new: After: 0 New: 4",
|
|
286
|
+
"storage -> KNOWN Group sessions: header/5",
|
|
287
|
+
"storage -> CONTENT Group header: true new: After: 0 New: 5",
|
|
288
|
+
"client -> KNOWN ParentGroup sessions: header/4",
|
|
289
|
+
"storage -> KNOWN Map sessions: header/1",
|
|
290
|
+
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
291
|
+
"client -> KNOWN Group sessions: header/5",
|
|
292
|
+
"client -> KNOWN Map sessions: header/1",
|
|
293
|
+
"client -> LOAD MapFromParent sessions: empty",
|
|
294
|
+
"storage -> KNOWN MapFromParent sessions: header/1",
|
|
295
|
+
"storage -> CONTENT MapFromParent header: true new: After: 0 New: 1",
|
|
296
|
+
"client -> KNOWN MapFromParent sessions: header/1",
|
|
297
|
+
]
|
|
298
|
+
`);
|
|
299
|
+
});
|
|
300
|
+
|
|
217
301
|
test("should recover from data loss", async () => {
|
|
218
302
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
219
303
|
|
|
220
304
|
const node1 = new LocalNode(
|
|
221
|
-
|
|
305
|
+
agentSecret,
|
|
222
306
|
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
223
307
|
Crypto,
|
|
224
308
|
);
|
|
@@ -263,17 +347,20 @@ test("should recover from data loss", async () => {
|
|
|
263
347
|
).toMatchInlineSnapshot(`
|
|
264
348
|
[
|
|
265
349
|
"client -> CONTENT Group header: true new: After: 0 New: 3",
|
|
350
|
+
"storage -> KNOWN Group sessions: header/3",
|
|
266
351
|
"client -> CONTENT Map header: true new: After: 0 New: 1",
|
|
352
|
+
"storage -> KNOWN Map sessions: header/1",
|
|
267
353
|
"client -> CONTENT Map header: false new: After: 3 New: 1",
|
|
268
354
|
"storage -> KNOWN CORRECTION Map sessions: header/1",
|
|
269
355
|
"client -> CONTENT Map header: false new: After: 1 New: 3",
|
|
356
|
+
"storage -> KNOWN Map sessions: header/4",
|
|
270
357
|
]
|
|
271
358
|
`);
|
|
272
359
|
|
|
273
360
|
node1Sync.restore();
|
|
274
361
|
|
|
275
362
|
const node2 = new LocalNode(
|
|
276
|
-
|
|
363
|
+
agentSecret,
|
|
277
364
|
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
278
365
|
Crypto,
|
|
279
366
|
);
|