cojson-storage-sqlite 0.13.16 → 0.13.18
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 +21 -0
- package/dist/tests/sqlite.test.js +56 -10
- package/dist/tests/sqlite.test.js.map +1 -1
- package/package.json +3 -3
- package/src/tests/sqlite.test.ts +87 -11
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# cojson-storage-sqlite
|
|
2
2
|
|
|
3
|
+
## 0.13.18
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [9089252]
|
|
8
|
+
- Updated dependencies [b470f63]
|
|
9
|
+
- Updated dependencies [8b2df0e]
|
|
10
|
+
- Updated dependencies [66373ba]
|
|
11
|
+
- Updated dependencies [f24cad1]
|
|
12
|
+
- cojson@0.13.18
|
|
13
|
+
- cojson-storage@0.13.18
|
|
14
|
+
|
|
15
|
+
## 0.13.17
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Updated dependencies [9fb98e2]
|
|
20
|
+
- Updated dependencies [0b89fad]
|
|
21
|
+
- cojson@0.13.17
|
|
22
|
+
- cojson-storage@0.13.17
|
|
23
|
+
|
|
3
24
|
## 0.13.16
|
|
4
25
|
|
|
5
26
|
### Patch Changes
|
|
@@ -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);
|
|
@@ -51,7 +51,7 @@ test("should sync and load data from storage", async () => {
|
|
|
51
51
|
]
|
|
52
52
|
`);
|
|
53
53
|
node1Sync.restore();
|
|
54
|
-
const node2 = new LocalNode(
|
|
54
|
+
const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
55
55
|
const node2Sync = trackMessages(node2);
|
|
56
56
|
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
57
57
|
node2.syncManager.addPeer(peer2);
|
|
@@ -71,14 +71,13 @@ test("should sync and load data from storage", async () => {
|
|
|
71
71
|
"storage -> KNOWN Map sessions: header/1",
|
|
72
72
|
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
73
73
|
"client -> KNOWN Group sessions: header/3",
|
|
74
|
-
"client -> KNOWN Map sessions: header/1",
|
|
75
74
|
]
|
|
76
75
|
`);
|
|
77
76
|
node2Sync.restore();
|
|
78
77
|
});
|
|
79
78
|
test("should load dependencies correctly (group inheritance)", async () => {
|
|
80
79
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
81
|
-
const node1 = new LocalNode(
|
|
80
|
+
const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
82
81
|
const node1Sync = trackMessages(node1);
|
|
83
82
|
const { peer, dbPath } = await createSQLiteStorage();
|
|
84
83
|
node1.syncManager.addPeer(peer);
|
|
@@ -100,18 +99,62 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
100
99
|
]
|
|
101
100
|
`);
|
|
102
101
|
node1Sync.restore();
|
|
103
|
-
const node2 = new LocalNode(
|
|
102
|
+
const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
103
|
+
const node2Sync = trackMessages(node2);
|
|
104
|
+
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
105
|
+
node2.syncManager.addPeer(peer2);
|
|
106
|
+
await node2.load(map.id);
|
|
107
|
+
expect(node2.expectCoValueLoaded(map.id)).toBeTruthy();
|
|
108
|
+
expect(node2.expectCoValueLoaded(group.id)).toBeTruthy();
|
|
109
|
+
expect(node2.expectCoValueLoaded(parentGroup.id)).toBeTruthy();
|
|
110
|
+
expect(toSimplifiedMessages({
|
|
111
|
+
Map: map.core,
|
|
112
|
+
Group: group.core,
|
|
113
|
+
ParentGroup: parentGroup.core,
|
|
114
|
+
}, node2Sync.messages)).toMatchInlineSnapshot(`
|
|
115
|
+
[
|
|
116
|
+
"client -> LOAD Map sessions: empty",
|
|
117
|
+
"storage -> KNOWN ParentGroup sessions: header/4",
|
|
118
|
+
"storage -> CONTENT ParentGroup header: true new: After: 0 New: 4",
|
|
119
|
+
"storage -> KNOWN Group sessions: header/5",
|
|
120
|
+
"storage -> CONTENT Group header: true new: After: 0 New: 5",
|
|
121
|
+
"client -> KNOWN ParentGroup sessions: header/4",
|
|
122
|
+
"storage -> KNOWN Map sessions: header/1",
|
|
123
|
+
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
124
|
+
"client -> KNOWN Group sessions: header/5",
|
|
125
|
+
]
|
|
126
|
+
`);
|
|
127
|
+
});
|
|
128
|
+
test("should not send the same dependency value twice", async () => {
|
|
129
|
+
const agentSecret = Crypto.newRandomAgentSecret();
|
|
130
|
+
const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
131
|
+
const node1Sync = trackMessages(node1);
|
|
132
|
+
const { peer, dbPath } = await createSQLiteStorage();
|
|
133
|
+
node1.syncManager.addPeer(peer);
|
|
134
|
+
const group = node1.createGroup();
|
|
135
|
+
const parentGroup = node1.createGroup();
|
|
136
|
+
group.extend(parentGroup);
|
|
137
|
+
const mapFromParent = parentGroup.createMap();
|
|
138
|
+
const map = group.createMap();
|
|
139
|
+
map.set("hello", "world");
|
|
140
|
+
mapFromParent.set("hello", "world");
|
|
141
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
142
|
+
node1Sync.restore();
|
|
143
|
+
const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
104
144
|
const node2Sync = trackMessages(node2);
|
|
105
145
|
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
106
146
|
node2.syncManager.addPeer(peer2);
|
|
107
147
|
await node2.load(map.id);
|
|
148
|
+
await node2.load(mapFromParent.id);
|
|
108
149
|
expect(node2.expectCoValueLoaded(map.id)).toBeTruthy();
|
|
150
|
+
expect(node2.expectCoValueLoaded(mapFromParent.id)).toBeTruthy();
|
|
109
151
|
expect(node2.expectCoValueLoaded(group.id)).toBeTruthy();
|
|
110
152
|
expect(node2.expectCoValueLoaded(parentGroup.id)).toBeTruthy();
|
|
111
153
|
expect(toSimplifiedMessages({
|
|
112
154
|
Map: map.core,
|
|
113
155
|
Group: group.core,
|
|
114
156
|
ParentGroup: parentGroup.core,
|
|
157
|
+
MapFromParent: mapFromParent.core,
|
|
115
158
|
}, node2Sync.messages)).toMatchInlineSnapshot(`
|
|
116
159
|
[
|
|
117
160
|
"client -> LOAD Map sessions: empty",
|
|
@@ -124,12 +167,16 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
124
167
|
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
125
168
|
"client -> KNOWN Group sessions: header/5",
|
|
126
169
|
"client -> KNOWN Map sessions: header/1",
|
|
170
|
+
"client -> LOAD MapFromParent sessions: empty",
|
|
171
|
+
"storage -> KNOWN MapFromParent sessions: header/1",
|
|
172
|
+
"storage -> CONTENT MapFromParent header: true new: After: 0 New: 1",
|
|
173
|
+
"client -> KNOWN MapFromParent sessions: header/1",
|
|
127
174
|
]
|
|
128
175
|
`);
|
|
129
176
|
});
|
|
130
177
|
test("should recover from data loss", async () => {
|
|
131
178
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
132
|
-
const node1 = new LocalNode(
|
|
179
|
+
const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
133
180
|
const node1Sync = trackMessages(node1);
|
|
134
181
|
const { peer, dbPath } = await createSQLiteStorage();
|
|
135
182
|
node1.syncManager.addPeer(peer);
|
|
@@ -159,7 +206,7 @@ test("should recover from data loss", async () => {
|
|
|
159
206
|
]
|
|
160
207
|
`);
|
|
161
208
|
node1Sync.restore();
|
|
162
|
-
const node2 = new LocalNode(
|
|
209
|
+
const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
|
|
163
210
|
const node2Sync = trackMessages(node2);
|
|
164
211
|
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
165
212
|
node2.syncManager.addPeer(peer2);
|
|
@@ -184,7 +231,6 @@ test("should recover from data loss", async () => {
|
|
|
184
231
|
"storage -> KNOWN Map sessions: header/4",
|
|
185
232
|
"storage -> CONTENT Map header: true new: After: 0 New: 4",
|
|
186
233
|
"client -> KNOWN Group sessions: header/3",
|
|
187
|
-
"client -> KNOWN Map sessions: header/4",
|
|
188
234
|
]
|
|
189
235
|
`);
|
|
190
236
|
});
|
|
@@ -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.18",
|
|
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.18",
|
|
11
|
+
"cojson-storage": "0.13.18"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"@types/better-sqlite3": "^7.6.12",
|
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
|
);
|
|
@@ -87,7 +86,7 @@ test("should sync and load data from storage", async () => {
|
|
|
87
86
|
node1Sync.restore();
|
|
88
87
|
|
|
89
88
|
const node2 = new LocalNode(
|
|
90
|
-
|
|
89
|
+
agentSecret,
|
|
91
90
|
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
92
91
|
Crypto,
|
|
93
92
|
);
|
|
@@ -121,7 +120,6 @@ test("should sync and load data from storage", async () => {
|
|
|
121
120
|
"storage -> KNOWN Map sessions: header/1",
|
|
122
121
|
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
123
122
|
"client -> KNOWN Group sessions: header/3",
|
|
124
|
-
"client -> KNOWN Map sessions: header/1",
|
|
125
123
|
]
|
|
126
124
|
`);
|
|
127
125
|
|
|
@@ -132,7 +130,7 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
132
130
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
133
131
|
|
|
134
132
|
const node1 = new LocalNode(
|
|
135
|
-
|
|
133
|
+
agentSecret,
|
|
136
134
|
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
137
135
|
Crypto,
|
|
138
136
|
);
|
|
@@ -174,7 +172,79 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
174
172
|
node1Sync.restore();
|
|
175
173
|
|
|
176
174
|
const node2 = new LocalNode(
|
|
177
|
-
|
|
175
|
+
agentSecret,
|
|
176
|
+
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
177
|
+
Crypto,
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
const node2Sync = trackMessages(node2);
|
|
181
|
+
|
|
182
|
+
const { peer: peer2 } = await createSQLiteStorage(dbPath);
|
|
183
|
+
|
|
184
|
+
node2.syncManager.addPeer(peer2);
|
|
185
|
+
|
|
186
|
+
await node2.load(map.id);
|
|
187
|
+
|
|
188
|
+
expect(node2.expectCoValueLoaded(map.id)).toBeTruthy();
|
|
189
|
+
expect(node2.expectCoValueLoaded(group.id)).toBeTruthy();
|
|
190
|
+
expect(node2.expectCoValueLoaded(parentGroup.id)).toBeTruthy();
|
|
191
|
+
|
|
192
|
+
expect(
|
|
193
|
+
toSimplifiedMessages(
|
|
194
|
+
{
|
|
195
|
+
Map: map.core,
|
|
196
|
+
Group: group.core,
|
|
197
|
+
ParentGroup: parentGroup.core,
|
|
198
|
+
},
|
|
199
|
+
node2Sync.messages,
|
|
200
|
+
),
|
|
201
|
+
).toMatchInlineSnapshot(`
|
|
202
|
+
[
|
|
203
|
+
"client -> LOAD Map sessions: empty",
|
|
204
|
+
"storage -> KNOWN ParentGroup sessions: header/4",
|
|
205
|
+
"storage -> CONTENT ParentGroup header: true new: After: 0 New: 4",
|
|
206
|
+
"storage -> KNOWN Group sessions: header/5",
|
|
207
|
+
"storage -> CONTENT Group header: true new: After: 0 New: 5",
|
|
208
|
+
"client -> KNOWN ParentGroup sessions: header/4",
|
|
209
|
+
"storage -> KNOWN Map sessions: header/1",
|
|
210
|
+
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
211
|
+
"client -> KNOWN Group sessions: header/5",
|
|
212
|
+
]
|
|
213
|
+
`);
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
test("should not send the same dependency value twice", async () => {
|
|
217
|
+
const agentSecret = Crypto.newRandomAgentSecret();
|
|
218
|
+
|
|
219
|
+
const node1 = new LocalNode(
|
|
220
|
+
agentSecret,
|
|
221
|
+
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
222
|
+
Crypto,
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
const node1Sync = trackMessages(node1);
|
|
226
|
+
|
|
227
|
+
const { peer, dbPath } = await createSQLiteStorage();
|
|
228
|
+
|
|
229
|
+
node1.syncManager.addPeer(peer);
|
|
230
|
+
|
|
231
|
+
const group = node1.createGroup();
|
|
232
|
+
const parentGroup = node1.createGroup();
|
|
233
|
+
|
|
234
|
+
group.extend(parentGroup);
|
|
235
|
+
|
|
236
|
+
const mapFromParent = parentGroup.createMap();
|
|
237
|
+
const map = group.createMap();
|
|
238
|
+
|
|
239
|
+
map.set("hello", "world");
|
|
240
|
+
mapFromParent.set("hello", "world");
|
|
241
|
+
|
|
242
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
243
|
+
|
|
244
|
+
node1Sync.restore();
|
|
245
|
+
|
|
246
|
+
const node2 = new LocalNode(
|
|
247
|
+
agentSecret,
|
|
178
248
|
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
179
249
|
Crypto,
|
|
180
250
|
);
|
|
@@ -186,8 +256,10 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
186
256
|
node2.syncManager.addPeer(peer2);
|
|
187
257
|
|
|
188
258
|
await node2.load(map.id);
|
|
259
|
+
await node2.load(mapFromParent.id);
|
|
189
260
|
|
|
190
261
|
expect(node2.expectCoValueLoaded(map.id)).toBeTruthy();
|
|
262
|
+
expect(node2.expectCoValueLoaded(mapFromParent.id)).toBeTruthy();
|
|
191
263
|
expect(node2.expectCoValueLoaded(group.id)).toBeTruthy();
|
|
192
264
|
expect(node2.expectCoValueLoaded(parentGroup.id)).toBeTruthy();
|
|
193
265
|
|
|
@@ -197,6 +269,7 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
197
269
|
Map: map.core,
|
|
198
270
|
Group: group.core,
|
|
199
271
|
ParentGroup: parentGroup.core,
|
|
272
|
+
MapFromParent: mapFromParent.core,
|
|
200
273
|
},
|
|
201
274
|
node2Sync.messages,
|
|
202
275
|
),
|
|
@@ -212,6 +285,10 @@ test("should load dependencies correctly (group inheritance)", async () => {
|
|
|
212
285
|
"storage -> CONTENT Map header: true new: After: 0 New: 1",
|
|
213
286
|
"client -> KNOWN Group sessions: header/5",
|
|
214
287
|
"client -> KNOWN Map sessions: header/1",
|
|
288
|
+
"client -> LOAD MapFromParent sessions: empty",
|
|
289
|
+
"storage -> KNOWN MapFromParent sessions: header/1",
|
|
290
|
+
"storage -> CONTENT MapFromParent header: true new: After: 0 New: 1",
|
|
291
|
+
"client -> KNOWN MapFromParent sessions: header/1",
|
|
215
292
|
]
|
|
216
293
|
`);
|
|
217
294
|
});
|
|
@@ -220,7 +297,7 @@ test("should recover from data loss", async () => {
|
|
|
220
297
|
const agentSecret = Crypto.newRandomAgentSecret();
|
|
221
298
|
|
|
222
299
|
const node1 = new LocalNode(
|
|
223
|
-
|
|
300
|
+
agentSecret,
|
|
224
301
|
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
225
302
|
Crypto,
|
|
226
303
|
);
|
|
@@ -275,7 +352,7 @@ test("should recover from data loss", async () => {
|
|
|
275
352
|
node1Sync.restore();
|
|
276
353
|
|
|
277
354
|
const node2 = new LocalNode(
|
|
278
|
-
|
|
355
|
+
agentSecret,
|
|
279
356
|
Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)),
|
|
280
357
|
Crypto,
|
|
281
358
|
);
|
|
@@ -315,7 +392,6 @@ test("should recover from data loss", async () => {
|
|
|
315
392
|
"storage -> KNOWN Map sessions: header/4",
|
|
316
393
|
"storage -> CONTENT Map header: true new: After: 0 New: 4",
|
|
317
394
|
"client -> KNOWN Group sessions: header/3",
|
|
318
|
-
"client -> KNOWN Map sessions: header/4",
|
|
319
395
|
]
|
|
320
396
|
`);
|
|
321
397
|
});
|