cojson 0.20.18 → 0.20.19
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 +13 -0
- package/dist/exports.d.ts +2 -2
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js.map +1 -1
- package/dist/localNode.d.ts +7 -3
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +11 -4
- package/dist/localNode.js.map +1 -1
- package/dist/queue/StoreQueue.d.ts +3 -2
- package/dist/queue/StoreQueue.d.ts.map +1 -1
- package/dist/queue/StoreQueue.js +4 -4
- package/dist/queue/StoreQueue.js.map +1 -1
- package/dist/storage/sqliteAsync/client.d.ts.map +1 -1
- package/dist/storage/sqliteAsync/client.js +17 -2
- package/dist/storage/sqliteAsync/client.js.map +1 -1
- package/dist/storage/storageAsync.d.ts +1 -1
- package/dist/storage/storageAsync.d.ts.map +1 -1
- package/dist/storage/storageAsync.js +8 -4
- package/dist/storage/storageAsync.js.map +1 -1
- package/dist/storage/storageSync.d.ts +1 -1
- package/dist/storage/storageSync.d.ts.map +1 -1
- package/dist/storage/storageSync.js +6 -2
- package/dist/storage/storageSync.js.map +1 -1
- package/dist/storage/types.d.ts +9 -1
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/sync.d.ts +21 -0
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +41 -3
- package/dist/sync.js.map +1 -1
- package/dist/tests/SQLiteClientAsync.test.js +43 -8
- package/dist/tests/SQLiteClientAsync.test.js.map +1 -1
- package/dist/tests/StoreQueue.test.js +16 -3
- package/dist/tests/StoreQueue.test.js.map +1 -1
- package/dist/tests/sync.localStoreDurability.test.d.ts +2 -0
- package/dist/tests/sync.localStoreDurability.test.d.ts.map +1 -0
- package/dist/tests/sync.localStoreDurability.test.js +257 -0
- package/dist/tests/sync.localStoreDurability.test.js.map +1 -0
- package/dist/tests/testStorage.js +2 -2
- package/dist/tests/testStorage.js.map +1 -1
- package/package.json +4 -4
- package/src/exports.ts +7 -1
- package/src/localNode.ts +24 -3
- package/src/queue/StoreQueue.ts +12 -4
- package/src/storage/sqliteAsync/client.ts +17 -2
- package/src/storage/storageAsync.ts +14 -4
- package/src/storage/storageSync.ts +12 -2
- package/src/storage/types.ts +13 -1
- package/src/sync.ts +87 -17
- package/src/tests/SQLiteClientAsync.test.ts +55 -10
- package/src/tests/StoreQueue.test.ts +20 -0
- package/src/tests/sync.localStoreDurability.test.ts +357 -0
- package/src/tests/testStorage.ts +29 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StoreQueue.test.js","sourceRoot":"","sources":["../../src/tests/StoreQueue.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"StoreQueue.test.js","sourceRoot":"","sources":["../../src/tests/StoreQueue.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.localStoreDurability.test.d.ts","sourceRoot":"","sources":["../../src/tests/sync.localStoreDurability.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test, vi } from "vitest";
|
|
2
|
+
import { WasmCrypto } from "../crypto/WasmCrypto.js";
|
|
3
|
+
import { LocalNode } from "../localNode";
|
|
4
|
+
import { SyncMessagesLog, getSyncServerConnectedPeer, loadCoValueOrFail, setupTestNode, waitFor, } from "./testUtils";
|
|
5
|
+
import { getDbPath, registerStorageCleanupRunner } from "./testStorage";
|
|
6
|
+
const Crypto = await WasmCrypto.create();
|
|
7
|
+
let jazzCloud;
|
|
8
|
+
beforeEach(async () => {
|
|
9
|
+
registerStorageCleanupRunner();
|
|
10
|
+
SyncMessagesLog.clear();
|
|
11
|
+
jazzCloud = setupTestNode({ isSyncServer: true });
|
|
12
|
+
});
|
|
13
|
+
describe("StorageAPI.store done callback", () => {
|
|
14
|
+
test("async storage invokes done after the write completes", async () => {
|
|
15
|
+
const client = setupTestNode();
|
|
16
|
+
const group = client.node.createGroup();
|
|
17
|
+
// Attach storage after creating the group so our manual store is the only write
|
|
18
|
+
const { storage } = await client.addAsyncStorage();
|
|
19
|
+
const content = group.core.newContentSince(undefined);
|
|
20
|
+
const done = vi.fn();
|
|
21
|
+
storage.store(content[0], () => undefined, done);
|
|
22
|
+
expect(done).not.toHaveBeenCalled();
|
|
23
|
+
await waitFor(() => expect(done).toHaveBeenCalledTimes(1));
|
|
24
|
+
});
|
|
25
|
+
test("sync storage invokes done synchronously", async () => {
|
|
26
|
+
const client = setupTestNode();
|
|
27
|
+
const group = client.node.createGroup();
|
|
28
|
+
const { storage } = client.addStorage();
|
|
29
|
+
const content = group.core.newContentSince(undefined);
|
|
30
|
+
const done = vi.fn();
|
|
31
|
+
storage.store(content[0], () => undefined, done);
|
|
32
|
+
expect(done).toHaveBeenCalledTimes(1);
|
|
33
|
+
});
|
|
34
|
+
test("async storage invokes done after a successful correction round-trip", async () => {
|
|
35
|
+
const client = setupTestNode();
|
|
36
|
+
const group = client.node.createGroup();
|
|
37
|
+
const map = group.createMap();
|
|
38
|
+
map.set("a", 1, "trusting");
|
|
39
|
+
const { storage } = await client.addAsyncStorage();
|
|
40
|
+
const fullContent = map.core.newContentSince(undefined);
|
|
41
|
+
// Content without the header, stored into empty storage → triggers a correction
|
|
42
|
+
const withoutHeader = map.core.newContentSince({
|
|
43
|
+
id: map.id,
|
|
44
|
+
header: true,
|
|
45
|
+
sessions: {},
|
|
46
|
+
});
|
|
47
|
+
const done = vi.fn();
|
|
48
|
+
storage.store(withoutHeader[0], () => fullContent, done);
|
|
49
|
+
await waitFor(() => expect(done).toHaveBeenCalledTimes(1));
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("local store durability window", () => {
|
|
53
|
+
test("opens before the first peer send and closes when async storage drains", async () => {
|
|
54
|
+
const client = setupTestNode();
|
|
55
|
+
await client.addAsyncStorage();
|
|
56
|
+
const { peerState } = client.connectToSyncServer();
|
|
57
|
+
// Instrument the actual outgoing push: the window must open before any
|
|
58
|
+
// content message physically leaves the node
|
|
59
|
+
let contentSent = false;
|
|
60
|
+
const originalPush = peerState.pushOutgoingMessage.bind(peerState);
|
|
61
|
+
vi.spyOn(peerState, "pushOutgoingMessage").mockImplementation((msg) => {
|
|
62
|
+
if (msg.action === "content") {
|
|
63
|
+
contentSent = true;
|
|
64
|
+
}
|
|
65
|
+
return originalPush(msg);
|
|
66
|
+
});
|
|
67
|
+
const events = [];
|
|
68
|
+
client.node.syncManager.onLocalStoreDurabilityChange = (hasPending) => {
|
|
69
|
+
events.push({ hasPending, contentSentAlready: contentSent });
|
|
70
|
+
};
|
|
71
|
+
const group = client.node.createGroup();
|
|
72
|
+
const map = group.createMap();
|
|
73
|
+
map.set("hello", "world", "trusting");
|
|
74
|
+
await waitFor(() => expect(events.some((e) => !e.hasPending)).toBe(true));
|
|
75
|
+
// The window opened BEFORE any content was sent to a peer
|
|
76
|
+
expect(events[0]).toEqual({ hasPending: true, contentSentAlready: false });
|
|
77
|
+
// ...and eventually closed once storage drained
|
|
78
|
+
expect(events.at(-1).hasPending).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
test("reopens for a new local edit after the previous window closed", async () => {
|
|
81
|
+
const client = setupTestNode();
|
|
82
|
+
await client.addAsyncStorage();
|
|
83
|
+
client.connectToSyncServer();
|
|
84
|
+
const events = [];
|
|
85
|
+
client.node.syncManager.onLocalStoreDurabilityChange = (hasPending) => {
|
|
86
|
+
events.push(hasPending);
|
|
87
|
+
};
|
|
88
|
+
const group = client.node.createGroup();
|
|
89
|
+
const map = group.createMap();
|
|
90
|
+
map.set("hello", "world", "trusting");
|
|
91
|
+
// First window: opened and closed once storage drained
|
|
92
|
+
await waitFor(() => expect(events).toEqual([true, false]));
|
|
93
|
+
// A second local edit reopens the window and it closes again on drain
|
|
94
|
+
map.set("second", "batch", "trusting");
|
|
95
|
+
await waitFor(() => expect(events).toEqual([true, false, true, false]));
|
|
96
|
+
});
|
|
97
|
+
test("reports the node's current session ID", async () => {
|
|
98
|
+
const client = setupTestNode();
|
|
99
|
+
await client.addAsyncStorage();
|
|
100
|
+
client.connectToSyncServer();
|
|
101
|
+
const sessions = [];
|
|
102
|
+
client.node.syncManager.onLocalStoreDurabilityChange = (_hasPending, sessionID) => {
|
|
103
|
+
sessions.push(sessionID);
|
|
104
|
+
};
|
|
105
|
+
const group = client.node.createGroup();
|
|
106
|
+
group.createMap().set("hello", "world", "trusting");
|
|
107
|
+
await waitFor(() => expect(sessions.length).toBeGreaterThan(0));
|
|
108
|
+
expect(sessions.every((s) => s === client.node.currentSessionID)).toBe(true);
|
|
109
|
+
});
|
|
110
|
+
test("does not fire with synchronous storage", async () => {
|
|
111
|
+
const client = setupTestNode();
|
|
112
|
+
client.addStorage();
|
|
113
|
+
client.connectToSyncServer();
|
|
114
|
+
const listener = vi.fn();
|
|
115
|
+
client.node.syncManager.onLocalStoreDurabilityChange = listener;
|
|
116
|
+
const group = client.node.createGroup();
|
|
117
|
+
const map = group.createMap();
|
|
118
|
+
map.set("hello", "world", "trusting");
|
|
119
|
+
await map.core.waitForSync();
|
|
120
|
+
expect(listener).not.toHaveBeenCalled();
|
|
121
|
+
});
|
|
122
|
+
test("does not fire when there are no peers to send to", async () => {
|
|
123
|
+
const client = setupTestNode(); // not connected
|
|
124
|
+
await client.addAsyncStorage();
|
|
125
|
+
const listener = vi.fn();
|
|
126
|
+
client.node.syncManager.onLocalStoreDurabilityChange = listener;
|
|
127
|
+
const group = client.node.createGroup();
|
|
128
|
+
const map = group.createMap();
|
|
129
|
+
map.set("hello", "world", "trusting");
|
|
130
|
+
await client.node.syncManager.waitForStorageSync(map.id);
|
|
131
|
+
expect(listener).not.toHaveBeenCalled();
|
|
132
|
+
});
|
|
133
|
+
test("remote content does not open the window on the receiving node", async () => {
|
|
134
|
+
const server = setupTestNode({ isSyncServer: true });
|
|
135
|
+
await server.addAsyncStorage({ ourName: "server" });
|
|
136
|
+
const listener = vi.fn();
|
|
137
|
+
server.node.syncManager.onLocalStoreDurabilityChange = listener;
|
|
138
|
+
const client = setupTestNode({ connected: true });
|
|
139
|
+
const group = client.node.createGroup();
|
|
140
|
+
const map = group.createMap();
|
|
141
|
+
map.set("hello", "world", "trusting");
|
|
142
|
+
await map.core.waitForSync();
|
|
143
|
+
expect(listener).not.toHaveBeenCalled();
|
|
144
|
+
});
|
|
145
|
+
test("window stays open when storage writes never complete (crash window)", async () => {
|
|
146
|
+
const client = setupTestNode();
|
|
147
|
+
const { storage } = await client.addAsyncStorage();
|
|
148
|
+
const { peerState } = client.connectToSyncServer();
|
|
149
|
+
// Simulate the crash window: storage accepts writes but never completes them
|
|
150
|
+
storage.store = async () => { };
|
|
151
|
+
const events = [];
|
|
152
|
+
client.node.syncManager.onLocalStoreDurabilityChange = (hasPending) => events.push(hasPending);
|
|
153
|
+
const group = client.node.createGroup();
|
|
154
|
+
const map = group.createMap();
|
|
155
|
+
map.set("hello", "world", "trusting");
|
|
156
|
+
// Wait for the content to reach the server (peer sync only) — storage sync
|
|
157
|
+
// never resolves in this scenario since store() is stubbed to a no-op, so
|
|
158
|
+
// we can't use map.core.waitForSync() here, which also waits on storage.
|
|
159
|
+
await client.node.syncManager.waitForSyncWithPeer(peerState.id, map.id, 5000);
|
|
160
|
+
expect(events).toEqual([true]); // opened, never closed
|
|
161
|
+
});
|
|
162
|
+
test("opens when pending content is sent through reconnection reconciliation", async () => {
|
|
163
|
+
const client = setupTestNode();
|
|
164
|
+
const { storage } = await client.addAsyncStorage();
|
|
165
|
+
// Writes never complete: the local edit below stays pending forever
|
|
166
|
+
storage.store = async () => { };
|
|
167
|
+
const events = [];
|
|
168
|
+
client.node.syncManager.onLocalStoreDurabilityChange = (hasPending) => events.push(hasPending);
|
|
169
|
+
const group = client.node.createGroup();
|
|
170
|
+
const map = group.createMap();
|
|
171
|
+
map.set("hello", "world", "trusting");
|
|
172
|
+
// Not connected yet: nothing was sent, so the window must not be open
|
|
173
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
174
|
+
expect(events).toEqual([]);
|
|
175
|
+
// Connecting sends the pending content through reconciliation
|
|
176
|
+
// (sendNewContent), not through syncContent — the window must still open
|
|
177
|
+
const { peerState } = client.connectToSyncServer();
|
|
178
|
+
await client.node.syncManager.waitForSyncWithPeer(peerState.id, map.id, 5000);
|
|
179
|
+
expect(events).toEqual([true]);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe("LocalNode creation options", () => {
|
|
183
|
+
test("withNewlyCreatedAccount wires onLocalStoreDurabilityChange into the node's syncManager", async () => {
|
|
184
|
+
const listener = vi.fn();
|
|
185
|
+
const { node } = await LocalNode.withNewlyCreatedAccount({
|
|
186
|
+
creationProps: { name: "test" },
|
|
187
|
+
crypto: Crypto,
|
|
188
|
+
peers: [],
|
|
189
|
+
onLocalStoreDurabilityChange: listener,
|
|
190
|
+
});
|
|
191
|
+
expect(node.syncManager.onLocalStoreDurabilityChange).toBe(listener);
|
|
192
|
+
await node.gracefulShutdown();
|
|
193
|
+
});
|
|
194
|
+
test("withLoadedAccount wires onLocalStoreDurabilityChange", async () => {
|
|
195
|
+
const listener = vi.fn();
|
|
196
|
+
const created = await LocalNode.withNewlyCreatedAccount({
|
|
197
|
+
creationProps: { name: "test" },
|
|
198
|
+
crypto: Crypto,
|
|
199
|
+
peers: [],
|
|
200
|
+
});
|
|
201
|
+
const { peer } = getSyncServerConnectedPeer({
|
|
202
|
+
peerId: created.accountID,
|
|
203
|
+
});
|
|
204
|
+
// Sync the account to the server so it can be loaded
|
|
205
|
+
created.node.syncManager.addPeer(peer);
|
|
206
|
+
await created.node.syncManager.waitForAllCoValuesSync();
|
|
207
|
+
const { peer: peer2 } = getSyncServerConnectedPeer({
|
|
208
|
+
peerId: "loadingNode",
|
|
209
|
+
});
|
|
210
|
+
const node = await LocalNode.withLoadedAccount({
|
|
211
|
+
accountID: created.accountID,
|
|
212
|
+
accountSecret: created.accountSecret,
|
|
213
|
+
sessionID: undefined,
|
|
214
|
+
peers: [peer2],
|
|
215
|
+
crypto: Crypto,
|
|
216
|
+
onLocalStoreDurabilityChange: listener,
|
|
217
|
+
});
|
|
218
|
+
expect(node.syncManager.onLocalStoreDurabilityChange).toBe(listener);
|
|
219
|
+
await node.gracefulShutdown();
|
|
220
|
+
await created.node.gracefulShutdown();
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
describe("crash recovery with a fresh session", () => {
|
|
224
|
+
test("restarting with a new session over the same storage recovers and syncs cleanly", async () => {
|
|
225
|
+
const client = setupTestNode();
|
|
226
|
+
const dbPath = getDbPath();
|
|
227
|
+
const { storage } = await client.addAsyncStorage({ filename: dbPath });
|
|
228
|
+
const { peerState } = client.connectToSyncServer();
|
|
229
|
+
const group = client.node.createGroup();
|
|
230
|
+
const map = group.createMap();
|
|
231
|
+
map.set("hello", "world", "trusting");
|
|
232
|
+
await map.core.waitForSync();
|
|
233
|
+
// Enter the crash window: further writes reach the server but not storage
|
|
234
|
+
storage.store = async () => { };
|
|
235
|
+
map.set("crashed", "yes", "trusting");
|
|
236
|
+
await client.node.syncManager.waitForSyncWithPeer(peerState.id, map.id, 5000);
|
|
237
|
+
// "Crash": abandon the node without flushing (no graceful shutdown), then
|
|
238
|
+
// restart with the SAME agent, SAME storage file, but a NEW session — which
|
|
239
|
+
// is exactly what the session providers do when the durability marker is set.
|
|
240
|
+
client.disconnect();
|
|
241
|
+
const restarted = setupTestNode({ secret: client.node.agentSecret });
|
|
242
|
+
await restarted.addAsyncStorage({ filename: dbPath });
|
|
243
|
+
restarted.connectToSyncServer();
|
|
244
|
+
// The fresh session is load-bearing: reusing the crashed session could fork its hash chain
|
|
245
|
+
expect(restarted.node.currentSessionID).not.toBe(client.node.currentSessionID);
|
|
246
|
+
// The crashed transaction comes back down from the server
|
|
247
|
+
const mapOnRestart = await loadCoValueOrFail(restarted.node, map.id);
|
|
248
|
+
await waitFor(() => expect(mapOnRestart.get("crashed")).toEqual("yes"));
|
|
249
|
+
// New writes from the fresh session sync cleanly — no signature rejection
|
|
250
|
+
mapOnRestart.set("recovered", "yes", "trusting");
|
|
251
|
+
await mapOnRestart.core.waitForSync();
|
|
252
|
+
const mapOnServer = await loadCoValueOrFail(jazzCloud.node, map.id);
|
|
253
|
+
expect(mapOnServer.get("recovered")).toEqual("yes");
|
|
254
|
+
expect(mapOnServer.get("crashed")).toEqual("yes");
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
//# sourceMappingURL=sync.localStoreDurability.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.localStoreDurability.test.js","sourceRoot":"","sources":["../../src/tests/sync.localStoreDurability.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -175,7 +175,7 @@ function trackStorageMessages(storage, nodeName, storageName) {
|
|
|
175
175
|
return callback(knownState);
|
|
176
176
|
});
|
|
177
177
|
};
|
|
178
|
-
storage.store = function (data, correctionCallback) {
|
|
178
|
+
storage.store = function (data, correctionCallback, done) {
|
|
179
179
|
SyncMessagesLog.add({
|
|
180
180
|
from: nodeName,
|
|
181
181
|
to: storageName,
|
|
@@ -202,7 +202,7 @@ function trackStorageMessages(storage, nodeName, storageName) {
|
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
204
|
return correctionMessages;
|
|
205
|
-
});
|
|
205
|
+
}, done);
|
|
206
206
|
};
|
|
207
207
|
storage.load = function (id, callback, done) {
|
|
208
208
|
SyncMessagesLog.add({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testStorage.js","sourceRoot":"","sources":["../../src/tests/testStorage.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"testStorage.js","sourceRoot":"","sources":["../../src/tests/testStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,QAAwC,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAGxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAEL,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,uBAAuB;IAG3B,YAAY,QAAgB;QAC1B,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,MAAiB;QACtC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,KAAK,CAAI,GAAW,EAAE,MAAiB;QAC3C,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAQ,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,MAAiB;QACzC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAkB,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAkD;QAClE,MAAM,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF;AAED,MAAM,sBAAsB;IAG1B,YAAY,QAAgB;QAC1B,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,UAAU;QACR,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,MAAiB;QAChC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAI,GAAW,EAAE,MAAiB;QACrC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAQ,CAAC;IACjD,CAAC;IAED,GAAG,CAAI,GAAW,EAAE,MAAiB;QACnC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAkB,CAAC;IAC3D,CAAC;IAED,WAAW,CAAC,QAAuB;QACjC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAElC,IAAI,CAAC;YACH,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF;AAED,uIAAuI;AACvI,MAAM,iBAAiB,GAAsC,EAAE,CAAC;AAEhE,SAAS,sBAAsB,CAAC,EAA8B;IAC5D,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,4BAA4B;IAC1C,6CAA6C;IAC7C,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,cAAc,CAAC,KAAK,IAAI,EAAE;QACxB,KAAK,MAAM,EAAE,IAAI,iBAAiB,EAAE,CAAC;YACnC,MAAM,EAAE,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,cAAc,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;IAChC,cAAc,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,QAAQ,EACR,QAAQ,GAAG,QAAQ,EACnB,WAAW,GAAG,SAAS,GAKxB;IACC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,OAAO,GAAG,MAAM,qBAAqB,CACzC,IAAI,uBAAuB,CAAC,MAAM,CAAC,CACpC,CAAC;IAEF,sBAAsB,CAAC,KAAK,IAAI,EAAE;QAChC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,oBAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAErD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAChC,QAAQ,EACR,QAAQ,GAAG,QAAQ,EACnB,WAAW,GAAG,SAAS,GAKxB;IACC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,OAAO,GAAG,gBAAgB,CAC9B,IAAI,sBAAsB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAChD,CAAC;IAEF,sBAAsB,CAAC,GAAG,EAAE;QAC1B,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,oBAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAErD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,OAAmB;IAEnB,yCAAyC;IACzC,OAAO,OAAO,CAAC,QAAQ,CAAC,8BAA8B,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAmB,EACnB,EAAW;IAEX,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,EAAE;QAC1C,OAAO,CAAC,IAAI,CACV,EAAE,EACF,CAAC,OAAO,EAAE,EAAE;YACV,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBACtB,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAgB,CACpE,CAAC;YACJ,CAAC;QACH,CAAC,EACD,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,aAAsB;IAC9C,OAAO,aAAa,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,UAAU,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAAmB,EACnB,QAAgB,EAChB,WAAmB;IAEnB,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;IACpC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAClC,MAAM,sBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC;IAEtD,OAAO,CAAC,cAAc,GAAG,UAAU,EAAE,EAAE,QAAQ;QAC7C,eAAe,CAAC,GAAG,CAAC;YAClB,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,WAAW;YACf,GAAG,EAAE;gBACH,MAAM,EAAE,UAAU;gBAClB,EAAE,EAAE,EAAa;aAClB;SACF,CAAC,CAAC;QAEH,OAAO,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE;YAC7D,IAAI,UAAU,EAAE,CAAC;gBACf,eAAe,CAAC,GAAG,CAAC;oBAClB,IAAI,EAAE,WAAW;oBACjB,EAAE,EAAE,QAAQ;oBACZ,GAAG,EAAE;wBACH,MAAM,EAAE,gBAAgB;wBACxB,GAAG,UAAU;qBACd;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,eAAe,CAAC,GAAG,CAAC;oBAClB,IAAI,EAAE,WAAW;oBACjB,EAAE,EAAE,QAAQ;oBACZ,GAAG,EAAE;wBACH,MAAM,EAAE,gBAAgB;wBACxB,EAAE,EAAE,EAAa;wBACjB,MAAM,EAAE,KAAK;wBACb,QAAQ,EAAE,EAAE;qBACb;iBACF,CAAC,CAAC;YACL,CAAC;YAED,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CAAC,KAAK,GAAG,UAAU,IAAI,EAAE,kBAAkB,EAAE,IAAI;QACtD,eAAe,CAAC,GAAG,CAAC;YAClB,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,WAAW;YACf,GAAG,EAAE,IAAI;SACV,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC,IAAI,CACvB,OAAO,EACP,IAAI,EACJ,CAAC,UAAU,EAAE,EAAE;YACb,eAAe,CAAC,GAAG,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,EAAE,EAAE,QAAQ;gBACZ,GAAG,EAAE;oBACH,MAAM,EAAE,OAAO;oBACf,YAAY,EAAE,IAAI;oBAClB,GAAG,UAAU;iBACd;aACF,CAAC,CAAC;YAEH,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAE1D,IAAI,kBAAkB,EAAE,CAAC;gBACvB,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;oBACrC,eAAe,CAAC,GAAG,CAAC;wBAClB,IAAI,EAAE,QAAQ;wBACd,EAAE,EAAE,WAAW;wBACf,GAAG;qBACJ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,kBAAkB,CAAC;QAC5B,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,CAAC,IAAI,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI;QACzC,eAAe,CAAC,GAAG,CAAC;YAClB,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,WAAW;YACf,GAAG,EAAE;gBACH,MAAM,EAAE,MAAM;gBACd,EAAE,EAAE,EAAa;gBACjB,QAAQ,EAAE,EAAE;gBACZ,MAAM,EAAE,KAAK;aACd;SACF,CAAC,CAAC;QAEH,OAAO,YAAY,CAAC,IAAI,CACtB,OAAO,EACP,EAAE,EACF,CAAC,GAAG,EAAE,EAAE;YACN,eAAe,CAAC,GAAG,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,EAAE,EAAE,QAAQ;gBACZ,GAAG;aACJ,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,eAAe,CAAC,GAAG,CAAC;oBAClB,IAAI,EAAE,WAAW;oBACjB,EAAE,EAAE,QAAQ;oBACZ,GAAG,EAAE;wBACH,MAAM,EAAE,OAAO;wBACf,EAAE,EAAE,EAAa;wBACjB,QAAQ,EAAE,EAAE;wBACZ,MAAM,EAAE,KAAK;qBACd;iBACF,CAAC,CAAC;YACL,CAAC;YAED,OAAO,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
"type": "module",
|
|
31
31
|
"license": "MIT",
|
|
32
|
-
"version": "0.20.
|
|
32
|
+
"version": "0.20.19",
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@opentelemetry/sdk-metrics": "^2.0.0",
|
|
35
35
|
"libsql": "^0.5.13",
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"@opentelemetry/api": "^1.9.0",
|
|
43
43
|
"@scure/base": "1.2.1",
|
|
44
44
|
"unicode-segmenter": "^0.12.0",
|
|
45
|
-
"cojson-core-wasm": "0.20.
|
|
46
|
-
"cojson-core-napi": "0.20.
|
|
47
|
-
"cojson-core-rn": "0.20.
|
|
45
|
+
"cojson-core-wasm": "0.20.19",
|
|
46
|
+
"cojson-core-napi": "0.20.19",
|
|
47
|
+
"cojson-core-rn": "0.20.19"
|
|
48
48
|
},
|
|
49
49
|
"gitHead": "33c27053293b4801b968c61d5c4c989f93a67d13",
|
|
50
50
|
"scripts": {
|
package/src/exports.ts
CHANGED
|
@@ -68,7 +68,12 @@ import type { AgentID, RawCoID, SessionID } from "./ids.js";
|
|
|
68
68
|
import type { JsonObject, JsonValue } from "./jsonValue.js";
|
|
69
69
|
import type * as Media from "./media.js";
|
|
70
70
|
import { isAccountRole } from "./permissions.js";
|
|
71
|
-
import type {
|
|
71
|
+
import type {
|
|
72
|
+
LocalStoreDurabilityListener,
|
|
73
|
+
Peer,
|
|
74
|
+
SyncMessage,
|
|
75
|
+
SyncWhen,
|
|
76
|
+
} from "./sync.js";
|
|
72
77
|
import {
|
|
73
78
|
DisconnectedError,
|
|
74
79
|
SyncManager,
|
|
@@ -217,6 +222,7 @@ export type {
|
|
|
217
222
|
AvailableCoValueCore,
|
|
218
223
|
PeerState,
|
|
219
224
|
SyncWhen,
|
|
225
|
+
LocalStoreDurabilityListener,
|
|
220
226
|
CoValueHeader,
|
|
221
227
|
CoValueFrontier,
|
|
222
228
|
RawCoValueCursor,
|
package/src/localNode.ts
CHANGED
|
@@ -36,7 +36,13 @@ import { AgentSecret, CryptoProvider } from "./crypto/crypto.js";
|
|
|
36
36
|
import { AgentID, RawCoID, SessionID, isAgentID, isRawCoID } from "./ids.js";
|
|
37
37
|
import { logger } from "./logger.js";
|
|
38
38
|
import { StorageAPI } from "./storage/index.js";
|
|
39
|
-
import {
|
|
39
|
+
import {
|
|
40
|
+
Peer,
|
|
41
|
+
PeerID,
|
|
42
|
+
SyncManager,
|
|
43
|
+
type LocalStoreDurabilityListener,
|
|
44
|
+
type SyncWhen,
|
|
45
|
+
} from "./sync.js";
|
|
40
46
|
import { accountOrAgentIDfromSessionID } from "./typeUtils/accountOrAgentIDfromSessionID.js";
|
|
41
47
|
import { expectGroup } from "./typeUtils/expectGroup.js";
|
|
42
48
|
import { canBeBranched } from "./coValueCore/branching.js";
|
|
@@ -82,7 +88,10 @@ export class LocalNode {
|
|
|
82
88
|
crypto: CryptoProvider,
|
|
83
89
|
public readonly syncWhen?: SyncWhen,
|
|
84
90
|
enableFullStorageReconciliation?: boolean,
|
|
85
|
-
options?: {
|
|
91
|
+
options?: {
|
|
92
|
+
experimental_clockSyncFromServerPings?: boolean;
|
|
93
|
+
onLocalStoreDurabilityChange?: LocalStoreDurabilityListener;
|
|
94
|
+
},
|
|
86
95
|
) {
|
|
87
96
|
this.agentSecret = agentSecret;
|
|
88
97
|
this.currentSessionID = currentSessionID;
|
|
@@ -92,6 +101,8 @@ export class LocalNode {
|
|
|
92
101
|
}
|
|
93
102
|
this.#clockSyncEnabled =
|
|
94
103
|
options?.experimental_clockSyncFromServerPings ?? false;
|
|
104
|
+
this.syncManager.onLocalStoreDurabilityChange =
|
|
105
|
+
options?.onLocalStoreDurabilityChange;
|
|
95
106
|
}
|
|
96
107
|
|
|
97
108
|
stampNow(): number {
|
|
@@ -288,6 +299,7 @@ export class LocalNode {
|
|
|
288
299
|
storage?: StorageAPI;
|
|
289
300
|
enableFullStorageReconciliation?: boolean;
|
|
290
301
|
experimental_clockSyncFromServerPings?: boolean;
|
|
302
|
+
onLocalStoreDurabilityChange?: LocalStoreDurabilityListener;
|
|
291
303
|
}): RawAccount {
|
|
292
304
|
const {
|
|
293
305
|
crypto,
|
|
@@ -310,6 +322,7 @@ export class LocalNode {
|
|
|
310
322
|
{
|
|
311
323
|
experimental_clockSyncFromServerPings:
|
|
312
324
|
opts.experimental_clockSyncFromServerPings,
|
|
325
|
+
onLocalStoreDurabilityChange: opts.onLocalStoreDurabilityChange,
|
|
313
326
|
},
|
|
314
327
|
);
|
|
315
328
|
|
|
@@ -359,6 +372,7 @@ export class LocalNode {
|
|
|
359
372
|
storage,
|
|
360
373
|
enableFullStorageReconciliation,
|
|
361
374
|
experimental_clockSyncFromServerPings,
|
|
375
|
+
onLocalStoreDurabilityChange,
|
|
362
376
|
}: {
|
|
363
377
|
creationProps: { name: string };
|
|
364
378
|
peers?: Peer[];
|
|
@@ -369,6 +383,7 @@ export class LocalNode {
|
|
|
369
383
|
storage?: StorageAPI;
|
|
370
384
|
enableFullStorageReconciliation?: boolean;
|
|
371
385
|
experimental_clockSyncFromServerPings?: boolean;
|
|
386
|
+
onLocalStoreDurabilityChange?: LocalStoreDurabilityListener;
|
|
372
387
|
}): Promise<{
|
|
373
388
|
node: LocalNode;
|
|
374
389
|
accountID: RawAccountID;
|
|
@@ -383,6 +398,7 @@ export class LocalNode {
|
|
|
383
398
|
storage,
|
|
384
399
|
enableFullStorageReconciliation,
|
|
385
400
|
experimental_clockSyncFromServerPings,
|
|
401
|
+
onLocalStoreDurabilityChange,
|
|
386
402
|
});
|
|
387
403
|
const node = account.core.node;
|
|
388
404
|
|
|
@@ -430,6 +446,7 @@ export class LocalNode {
|
|
|
430
446
|
storage,
|
|
431
447
|
enableFullStorageReconciliation,
|
|
432
448
|
experimental_clockSyncFromServerPings,
|
|
449
|
+
onLocalStoreDurabilityChange,
|
|
433
450
|
}: {
|
|
434
451
|
accountID: RawAccountID;
|
|
435
452
|
accountSecret: AgentSecret;
|
|
@@ -441,6 +458,7 @@ export class LocalNode {
|
|
|
441
458
|
storage?: StorageAPI;
|
|
442
459
|
enableFullStorageReconciliation?: boolean;
|
|
443
460
|
experimental_clockSyncFromServerPings?: boolean;
|
|
461
|
+
onLocalStoreDurabilityChange?: LocalStoreDurabilityListener;
|
|
444
462
|
}): Promise<LocalNode> {
|
|
445
463
|
try {
|
|
446
464
|
const expectedAgentID = crypto.getAgentID(accountSecret);
|
|
@@ -451,7 +469,10 @@ export class LocalNode {
|
|
|
451
469
|
crypto,
|
|
452
470
|
syncWhen,
|
|
453
471
|
enableFullStorageReconciliation,
|
|
454
|
-
{
|
|
472
|
+
{
|
|
473
|
+
experimental_clockSyncFromServerPings,
|
|
474
|
+
onLocalStoreDurabilityChange,
|
|
475
|
+
},
|
|
455
476
|
);
|
|
456
477
|
|
|
457
478
|
if (storage) {
|
package/src/queue/StoreQueue.ts
CHANGED
|
@@ -6,6 +6,9 @@ import { LinkedList } from "./LinkedList.js";
|
|
|
6
6
|
type StoreQueueEntry = {
|
|
7
7
|
data: NewContentMessage;
|
|
8
8
|
correctionCallback: CorrectionCallback;
|
|
9
|
+
// Pass-through only: the queue never invokes this itself, it's forwarded
|
|
10
|
+
// to the processing callback which decides when (and whether) to call it.
|
|
11
|
+
done?: () => void;
|
|
9
12
|
};
|
|
10
13
|
|
|
11
14
|
class StoreQueueManager {
|
|
@@ -43,12 +46,16 @@ export class StoreQueue {
|
|
|
43
46
|
private queue = new LinkedList<StoreQueueEntry>();
|
|
44
47
|
closed = false;
|
|
45
48
|
|
|
46
|
-
public push(
|
|
49
|
+
public push(
|
|
50
|
+
data: NewContentMessage,
|
|
51
|
+
correctionCallback: CorrectionCallback,
|
|
52
|
+
done?: () => void,
|
|
53
|
+
) {
|
|
47
54
|
if (this.closed) {
|
|
48
55
|
return;
|
|
49
56
|
}
|
|
50
57
|
|
|
51
|
-
this.queue.push({ data, correctionCallback });
|
|
58
|
+
this.queue.push({ data, correctionCallback, done });
|
|
52
59
|
}
|
|
53
60
|
|
|
54
61
|
public pull() {
|
|
@@ -62,6 +69,7 @@ export class StoreQueue {
|
|
|
62
69
|
callback: (
|
|
63
70
|
data: NewContentMessage,
|
|
64
71
|
correctionCallback: CorrectionCallback,
|
|
72
|
+
done?: () => void,
|
|
65
73
|
) => Promise<unknown>,
|
|
66
74
|
) {
|
|
67
75
|
if (this.processing) {
|
|
@@ -74,10 +82,10 @@ export class StoreQueue {
|
|
|
74
82
|
let entry: StoreQueueEntry | undefined;
|
|
75
83
|
|
|
76
84
|
while ((entry = this.pull())) {
|
|
77
|
-
const { data, correctionCallback } = entry;
|
|
85
|
+
const { data, correctionCallback, done } = entry;
|
|
78
86
|
|
|
79
87
|
try {
|
|
80
|
-
this.lastCallback = callback(data, correctionCallback);
|
|
88
|
+
this.lastCallback = callback(data, correctionCallback, done);
|
|
81
89
|
await this.lastCallback;
|
|
82
90
|
} catch (err) {
|
|
83
91
|
logger.error("Error processing message in store queue", { err });
|
|
@@ -95,8 +95,16 @@ export class SQLiteTransactionAsync implements DBTransactionInterfaceAsync {
|
|
|
95
95
|
nextIdx: number,
|
|
96
96
|
newTransaction: Transaction,
|
|
97
97
|
): Promise<void> {
|
|
98
|
+
// An interrupted write transaction (e.g. a concurrent ROLLBACK on a shared
|
|
99
|
+
// connection) can leave orphan rows at idx >= the session's lastIdx, which
|
|
100
|
+
// would otherwise block the session on this primary key forever.
|
|
101
|
+
// Overwriting is safe: writes always start at the committed lastIdx (see
|
|
102
|
+
// putNewTxs), so a conflicting row is never covered by any stored
|
|
103
|
+
// signature, and the verified replacement commits atomically with the
|
|
104
|
+
// session row and signature that cover it.
|
|
98
105
|
await this.tx.run(
|
|
99
|
-
|
|
106
|
+
`INSERT INTO transactions (ses, idx, tx) VALUES (?, ?, ?)
|
|
107
|
+
ON CONFLICT(ses, idx) DO UPDATE SET tx=excluded.tx`,
|
|
100
108
|
[sessionRowID, nextIdx, JSON.stringify(newTransaction)],
|
|
101
109
|
);
|
|
102
110
|
}
|
|
@@ -110,8 +118,15 @@ export class SQLiteTransactionAsync implements DBTransactionInterfaceAsync {
|
|
|
110
118
|
idx: number;
|
|
111
119
|
signature: Signature;
|
|
112
120
|
}): Promise<void> {
|
|
121
|
+
// Same recovery rationale as addTransaction: a conflict can only be an
|
|
122
|
+
// orphan row left by an interrupted write transaction, and the verified
|
|
123
|
+
// replacement commits atomically with the matching session update.
|
|
124
|
+
// Orphan signature rows are worse than orphan transactions: loadCoValue
|
|
125
|
+
// reads all signatureAfter rows unbounded by lastIdx, so an orphan here
|
|
126
|
+
// is served to readers until it is overwritten.
|
|
113
127
|
await this.tx.run(
|
|
114
|
-
|
|
128
|
+
`INSERT INTO signatureAfter (ses, idx, signature) VALUES (?, ?, ?)
|
|
129
|
+
ON CONFLICT(ses, idx) DO UPDATE SET signature=excluded.signature`,
|
|
115
130
|
[sessionRowID, idx, signature],
|
|
116
131
|
);
|
|
117
132
|
}
|
|
@@ -267,16 +267,26 @@ export class StorageApiAsync implements StorageAPI {
|
|
|
267
267
|
|
|
268
268
|
storeQueue = new StoreQueue();
|
|
269
269
|
|
|
270
|
-
async store(
|
|
270
|
+
async store(
|
|
271
|
+
msg: NewContentMessage,
|
|
272
|
+
correctionCallback: CorrectionCallback,
|
|
273
|
+
done?: () => void,
|
|
274
|
+
) {
|
|
271
275
|
/**
|
|
272
276
|
* The store operations must be done one by one, because we can't start a new transaction when there
|
|
273
277
|
* is already a transaction open.
|
|
274
278
|
*/
|
|
275
|
-
this.storeQueue.push(msg, correctionCallback);
|
|
279
|
+
this.storeQueue.push(msg, correctionCallback, done);
|
|
276
280
|
|
|
277
|
-
this.storeQueue.processQueue(async (data, correctionCallback) => {
|
|
281
|
+
this.storeQueue.processQueue(async (data, correctionCallback, done) => {
|
|
278
282
|
this.interruptEraser("store");
|
|
279
|
-
|
|
283
|
+
const success = await this.storeSingle(data, correctionCallback);
|
|
284
|
+
|
|
285
|
+
if (success) {
|
|
286
|
+
done?.();
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return success;
|
|
280
290
|
});
|
|
281
291
|
}
|
|
282
292
|
|