@verdant-web/server 3.3.4-alpha.0 → 3.3.4-alpha.2
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/dist/esm/ServerLibrary.d.ts +6 -0
- package/dist/esm/ServerLibrary.js +48 -14
- package/dist/esm/ServerLibrary.js.map +1 -1
- package/dist/esm/storage/Storage.d.ts +1 -1
- package/dist/esm/storage/sql/SqlOperations.d.ts +1 -1
- package/dist/esm/storage/sql/SqlOperations.js +17 -5
- package/dist/esm/storage/sql/SqlOperations.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlOperations.d.ts +1 -1
- package/dist/esm/storage/sqlShard/SqlOperations.js +23 -8
- package/dist/esm/storage/sqlShard/SqlOperations.js.map +1 -1
- package/package.json +4 -4
- package/src/ServerLibrary.ts +93 -22
- package/src/storage/Storage.ts +1 -1
- package/src/storage/sql/SqlOperations.ts +17 -8
- package/src/storage/sqlShard/SqlOperations.ts +31 -24
|
@@ -34,6 +34,12 @@ export declare class ServerLibrary extends EventSubscriber<ServerLibraryEvents>
|
|
|
34
34
|
receive: (message: ClientMessage, clientKey: string, info: TokenInfo) => Promise<void>;
|
|
35
35
|
remove: (libraryId: string, replicaId: string) => void;
|
|
36
36
|
private handleOperation;
|
|
37
|
+
/**
|
|
38
|
+
* If a replica inserts operations when it's already
|
|
39
|
+
* up to date, we can preemptively update its ackedServerOrder
|
|
40
|
+
* to avoid a round trip.
|
|
41
|
+
*/
|
|
42
|
+
private preemptiveUpdateServerOrder;
|
|
37
43
|
private rebroadcastOperations;
|
|
38
44
|
private handleSync;
|
|
39
45
|
private createAckNonce;
|
|
@@ -69,9 +69,14 @@ export class ServerLibrary extends EventSubscriber {
|
|
|
69
69
|
}
|
|
70
70
|
// rebroadcast to whole library except the sender
|
|
71
71
|
this.rebroadcastOperations(info.libraryId, clientKey, message.replicaId, message.operations);
|
|
72
|
-
// TODO: can we defer this and rebroadcast in parallel?
|
|
73
72
|
// insert patches into history
|
|
74
|
-
|
|
73
|
+
// first, record the replica's serverOrder before insertion.
|
|
74
|
+
const replicaInfo = await this.storage.replicas.getOrCreate(info.libraryId, message.replicaId, {
|
|
75
|
+
userId: info.userId,
|
|
76
|
+
type: info.type,
|
|
77
|
+
});
|
|
78
|
+
const newServerOrder = await this.storage.operations.insertAll(info.libraryId, message.replicaId, message.operations);
|
|
79
|
+
this.preemptiveUpdateServerOrder(replicaInfo.replicaInfo, newServerOrder, message.operations.length);
|
|
75
80
|
this.enqueueRebase(info.libraryId);
|
|
76
81
|
// tell sender we got and processed their operation
|
|
77
82
|
this.sender.send(info.libraryId, clientKey, {
|
|
@@ -81,6 +86,18 @@ export class ServerLibrary extends EventSubscriber {
|
|
|
81
86
|
await this.updateHighwater(message.replicaId, message.operations[message.operations.length - 1].timestamp, info);
|
|
82
87
|
this.emit(`changes`, info, message.operations, []);
|
|
83
88
|
};
|
|
89
|
+
/**
|
|
90
|
+
* If a replica inserts operations when it's already
|
|
91
|
+
* up to date, we can preemptively update its ackedServerOrder
|
|
92
|
+
* to avoid a round trip.
|
|
93
|
+
*/
|
|
94
|
+
this.preemptiveUpdateServerOrder = async (replicaInfo, newServerOrder, insertedOperationsCount) => {
|
|
95
|
+
if (newServerOrder - replicaInfo.ackedServerOrder ===
|
|
96
|
+
insertedOperationsCount) {
|
|
97
|
+
await this.storage.replicas.updateAckedServerOrder(replicaInfo.libraryId, replicaInfo.id, newServerOrder);
|
|
98
|
+
this.log('debug', 'Preemptively updated ackedServerOrder for', replicaInfo.id, 'to', newServerOrder);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
84
101
|
this.rebroadcastOperations = async (libraryId, clientKey, replicaId, ops, baselines) => {
|
|
85
102
|
var _a, _b;
|
|
86
103
|
if (ops.length === 0 && !(baselines === null || baselines === void 0 ? void 0 : baselines.length))
|
|
@@ -112,14 +129,23 @@ export class ServerLibrary extends EventSubscriber {
|
|
|
112
129
|
await this.storage.replicas.delete(info.libraryId, replicaId);
|
|
113
130
|
}
|
|
114
131
|
const { status, replicaInfo: clientReplicaInfo } = await this.storage.replicas.getOrCreate(info.libraryId, replicaId, info);
|
|
115
|
-
|
|
116
|
-
|
|
132
|
+
this.log('info', `Sync from ${replicaId} (user: ${info.userId}) [ackedServerOrder: ${clientReplicaInfo.ackedServerOrder}, status: ${status}}]`);
|
|
133
|
+
// for truant replicas -- if their ackedServerOrder is up-to-date, that's fine,
|
|
134
|
+
// restore them.
|
|
135
|
+
let overrideTruant = false;
|
|
136
|
+
if (status === 'truant') {
|
|
137
|
+
const latestServerOrder = await this.storage.operations.getLatestServerOrder(info.libraryId);
|
|
138
|
+
if (clientReplicaInfo.ackedServerOrder >= latestServerOrder) {
|
|
139
|
+
overrideTruant = true;
|
|
140
|
+
this.log('debug', 'Overriding truant reset; truant replica has up-to-date server order');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
117
143
|
// lookup operations after the last ack the client gave us
|
|
118
144
|
const ops = await this.storage.operations.getAfterServerOrder(info.libraryId, clientReplicaInfo.ackedServerOrder);
|
|
119
145
|
// new, unseen replicas should reset their existing storage
|
|
120
146
|
// to that of the server when joining a library.
|
|
121
147
|
// truant replicas should also reset their storage.
|
|
122
|
-
const replicaShouldReset = !!message.resyncAll || status !== 'existing';
|
|
148
|
+
const replicaShouldReset = !!message.resyncAll || (!overrideTruant && status !== 'existing');
|
|
123
149
|
// only new replicas need baselines. by definition, a rebase only
|
|
124
150
|
// happens when all active replicas agree on history. every client
|
|
125
151
|
// replica will generate the same baseline locally, so it
|
|
@@ -129,13 +155,15 @@ export class ServerLibrary extends EventSubscriber {
|
|
|
129
155
|
: [];
|
|
130
156
|
// We detect that a library is new by checking if it has any history.
|
|
131
157
|
// If there are no existing operations or baselines (and the requested
|
|
132
|
-
// history timerange was "everything", i.e. "from
|
|
158
|
+
// history timerange was "everything", i.e. "from server order 0"), then this is
|
|
133
159
|
// a fresh library which should receive the first client's history as its
|
|
134
160
|
// own. Otherwise, if the client requested a reset, we should send them
|
|
135
161
|
// the full history of the library.
|
|
136
162
|
// the definition of this field could be improved to be more explicit
|
|
137
163
|
// and not rely on seemingly unrelated data.
|
|
138
|
-
const isEmptyLibrary =
|
|
164
|
+
const isEmptyLibrary = clientReplicaInfo.ackedServerOrder === 0 &&
|
|
165
|
+
ops.length === 0 &&
|
|
166
|
+
baselines.length === 0;
|
|
139
167
|
if (isEmptyLibrary) {
|
|
140
168
|
this.log('info', 'Received sync from new library', replicaId);
|
|
141
169
|
// when initializing a new library, rewrite authz subjects to
|
|
@@ -146,10 +174,12 @@ export class ServerLibrary extends EventSubscriber {
|
|
|
146
174
|
}
|
|
147
175
|
// don't reset replica if library is empty...
|
|
148
176
|
let overwriteReplicaData = replicaShouldReset && !isEmptyLibrary;
|
|
177
|
+
// EARLY RETURN --
|
|
149
178
|
// if the local library is empty and the replica is new to us,
|
|
150
179
|
// but the replica is providing a "since" timestamp, this
|
|
151
180
|
// suggests the local data is incomplete or gone. we request
|
|
152
|
-
// this replica should respond with a full history.
|
|
181
|
+
// this replica should respond with a full history. We will retry
|
|
182
|
+
// sync after replica has updated us with full history.
|
|
153
183
|
if (isEmptyLibrary && status === 'new' && message.since !== null) {
|
|
154
184
|
this.log('info', 'Detected local data is incomplete, requesting full history from replica', replicaId);
|
|
155
185
|
this.sender.send(info.libraryId, clientKey, {
|
|
@@ -174,7 +204,8 @@ export class ServerLibrary extends EventSubscriber {
|
|
|
174
204
|
// store all incoming operations and baselines
|
|
175
205
|
await this.storage.baselines.insertAll(info.libraryId, message.baselines);
|
|
176
206
|
this.log('debug', 'Storing', message.baselines.length, 'baselines and', message.operations.length, 'operations');
|
|
177
|
-
await this.storage.operations.insertAll(info.libraryId, replicaId, message.operations);
|
|
207
|
+
const newServerOrder = await this.storage.operations.insertAll(info.libraryId, replicaId, message.operations);
|
|
208
|
+
this.preemptiveUpdateServerOrder(clientReplicaInfo, newServerOrder, message.operations.length);
|
|
178
209
|
await this.storage.replicas.updateAcknowledgedLogicalTime(info.libraryId, replicaId, message.timestamp);
|
|
179
210
|
// will include the new global ack
|
|
180
211
|
this.rebroadcastOperations(info.libraryId, clientKey, message.replicaId, message.operations,
|
|
@@ -191,7 +222,12 @@ export class ServerLibrary extends EventSubscriber {
|
|
|
191
222
|
this.log('info', 'A truant replica has reconnected', replicaId);
|
|
192
223
|
}
|
|
193
224
|
// create the nonce by encoding the server order of the last operation
|
|
194
|
-
const
|
|
225
|
+
const serverOrderToAck = ops.length
|
|
226
|
+
? ops[ops.length - 1].serverOrder
|
|
227
|
+
: undefined;
|
|
228
|
+
const ackThisNonce = serverOrderToAck !== undefined
|
|
229
|
+
? this.createAckNonce(serverOrderToAck)
|
|
230
|
+
: undefined;
|
|
195
231
|
// respond to client
|
|
196
232
|
this.log('info', 'Sending sync response with', ops.length, 'operations and', baselines.length, 'baselines');
|
|
197
233
|
// mutating baselines/operations to remove extra data -
|
|
@@ -210,10 +246,8 @@ export class ServerLibrary extends EventSubscriber {
|
|
|
210
246
|
ackThisNonce,
|
|
211
247
|
});
|
|
212
248
|
};
|
|
213
|
-
this.createAckNonce = (
|
|
214
|
-
return
|
|
215
|
-
? Buffer.from(JSON.stringify(ops[ops.length - 1].serverOrder)).toString('base64')
|
|
216
|
-
: undefined;
|
|
249
|
+
this.createAckNonce = (serverOrder) => {
|
|
250
|
+
return Buffer.from(JSON.stringify(serverOrder)).toString('base64');
|
|
217
251
|
};
|
|
218
252
|
this.handleAck = async (message, clientKey, info) => {
|
|
219
253
|
if (message.nonce) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerLibrary.js","sourceRoot":"","sources":["../../src/ServerLibrary.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ServerLibrary.js","sourceRoot":"","sources":["../../src/ServerLibrary.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ export interface OperationStorage {
|
|
|
30
30
|
getAfterServerOrder(libraryId: string, afterServerOrder: number): Promise<StoredOperation[]>;
|
|
31
31
|
getLatestServerOrder(libraryId: string): Promise<number>;
|
|
32
32
|
getCount(libraryId: string): Promise<number>;
|
|
33
|
-
insertAll(libraryId: string, replicaId: string, operations: Operation[]): Promise<
|
|
33
|
+
insertAll(libraryId: string, replicaId: string, operations: Operation[]): Promise<number>;
|
|
34
34
|
deleteAll(libraryId: string): Promise<void>;
|
|
35
35
|
delete(libraryId: string, operations: Operation[]): Promise<void>;
|
|
36
36
|
}
|
|
@@ -13,7 +13,7 @@ export declare class SqlOperations implements OperationStorage {
|
|
|
13
13
|
getAfterServerOrder: (libraryId: string, afterServerOrder: number) => Promise<StoredOperation[]>;
|
|
14
14
|
getLatestServerOrder: (libraryId: string) => Promise<number>;
|
|
15
15
|
getCount: (libraryId: string) => Promise<number>;
|
|
16
|
-
insertAll: (libraryId: string, replicaId: string, operations: Operation[]) => Promise<
|
|
16
|
+
insertAll: (libraryId: string, replicaId: string, operations: Operation[]) => Promise<number>;
|
|
17
17
|
deleteAll: (libraryId: string) => Promise<void>;
|
|
18
18
|
delete: (libraryId: string, operations: Operation[]) => Promise<void>;
|
|
19
19
|
}
|
|
@@ -60,16 +60,19 @@ export class SqlOperations {
|
|
|
60
60
|
this.insertAll = async (libraryId, replicaId, operations) => {
|
|
61
61
|
// inserts all operations and updates server order
|
|
62
62
|
// FIXME: this whole thing is kinda sus
|
|
63
|
-
await this.db.transaction().execute(async (tx) => {
|
|
63
|
+
return await this.db.transaction().execute(async (tx) => {
|
|
64
64
|
var _a;
|
|
65
65
|
let orderResult = await tx
|
|
66
66
|
.selectFrom('OperationHistory')
|
|
67
|
-
.select(
|
|
67
|
+
.select('serverOrder')
|
|
68
68
|
.where('libraryId', '=', libraryId)
|
|
69
|
+
.orderBy('serverOrder', 'desc')
|
|
70
|
+
.limit(1)
|
|
69
71
|
.executeTakeFirst();
|
|
70
72
|
let currentServerOrder = (_a = orderResult === null || orderResult === void 0 ? void 0 : orderResult.serverOrder) !== null && _a !== void 0 ? _a : 0;
|
|
71
73
|
for (const item of operations) {
|
|
72
|
-
|
|
74
|
+
// utilizing returned serverOrder accommodates for conflicts
|
|
75
|
+
const result = await tx
|
|
73
76
|
.insertInto('OperationHistory')
|
|
74
77
|
.values({
|
|
75
78
|
libraryId,
|
|
@@ -77,14 +80,23 @@ export class SqlOperations {
|
|
|
77
80
|
data: JSON.stringify(item.data),
|
|
78
81
|
timestamp: item.timestamp,
|
|
79
82
|
replicaId,
|
|
80
|
-
serverOrder:
|
|
83
|
+
serverOrder: currentServerOrder + 1,
|
|
81
84
|
authz: item.authz,
|
|
82
85
|
})
|
|
83
86
|
.onConflict((cb) => cb
|
|
84
87
|
.columns(['libraryId', 'replicaId', 'oid', 'timestamp'])
|
|
85
88
|
.doNothing())
|
|
86
|
-
.
|
|
89
|
+
.returning('serverOrder')
|
|
90
|
+
.executeTakeFirst();
|
|
91
|
+
if (result) {
|
|
92
|
+
currentServerOrder = result.serverOrder;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// on conflict, nothing is returned.
|
|
96
|
+
// this would mean an operation was synced twice
|
|
97
|
+
}
|
|
87
98
|
}
|
|
99
|
+
return currentServerOrder;
|
|
88
100
|
});
|
|
89
101
|
};
|
|
90
102
|
this.deleteAll = async (libraryId) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqlOperations.js","sourceRoot":"","sources":["../../../../src/storage/sql/SqlOperations.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SqlOperations.js","sourceRoot":"","sources":["../../../../src/storage/sql/SqlOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ export declare class SqlOperations implements OperationStorage {
|
|
|
12
12
|
getAfterServerOrder: (libraryId: string, afterServerOrder: number) => Promise<StoredOperation[]>;
|
|
13
13
|
getLatestServerOrder: (libraryId: string) => Promise<number>;
|
|
14
14
|
getCount: (libraryId: string) => Promise<number>;
|
|
15
|
-
insertAll: (libraryId: string, replicaId: string, operations: Operation[]) => Promise<
|
|
15
|
+
insertAll: (libraryId: string, replicaId: string, operations: Operation[]) => Promise<number>;
|
|
16
16
|
deleteAll: (libraryId: string) => Promise<void>;
|
|
17
17
|
delete: (libraryId: string, operations: Operation[]) => Promise<void>;
|
|
18
18
|
}
|
|
@@ -40,14 +40,17 @@ export class SqlOperations {
|
|
|
40
40
|
return raw;
|
|
41
41
|
};
|
|
42
42
|
this.getLatestServerOrder = async (libraryId) => {
|
|
43
|
-
var _a, _b;
|
|
44
43
|
const db = await this.dbs.get(libraryId);
|
|
45
|
-
|
|
44
|
+
const result = await db
|
|
46
45
|
.selectFrom('OperationHistory')
|
|
47
46
|
.orderBy('serverOrder', 'desc')
|
|
48
47
|
.select('serverOrder')
|
|
49
48
|
.limit(1)
|
|
50
|
-
.executeTakeFirst()
|
|
49
|
+
.executeTakeFirst();
|
|
50
|
+
if (result) {
|
|
51
|
+
return result.serverOrder;
|
|
52
|
+
}
|
|
53
|
+
return 0;
|
|
51
54
|
};
|
|
52
55
|
this.getCount = async (libraryId) => {
|
|
53
56
|
var _a, _b;
|
|
@@ -61,27 +64,39 @@ export class SqlOperations {
|
|
|
61
64
|
const db = await this.dbs.get(libraryId);
|
|
62
65
|
// inserts all operations and updates server order
|
|
63
66
|
// FIXME: this whole thing is kinda sus
|
|
64
|
-
await db.transaction().execute(async (tx) => {
|
|
67
|
+
return await db.transaction().execute(async (tx) => {
|
|
65
68
|
var _a;
|
|
66
69
|
let orderResult = await tx
|
|
67
70
|
.selectFrom('OperationHistory')
|
|
68
|
-
.select(
|
|
71
|
+
.select('serverOrder')
|
|
72
|
+
.orderBy('serverOrder', 'desc')
|
|
73
|
+
.limit(1)
|
|
69
74
|
.executeTakeFirst();
|
|
70
75
|
let currentServerOrder = (_a = orderResult === null || orderResult === void 0 ? void 0 : orderResult.serverOrder) !== null && _a !== void 0 ? _a : 0;
|
|
71
76
|
for (const item of operations) {
|
|
72
|
-
|
|
77
|
+
// utilizing returned serverOrder accommodates for conflicts
|
|
78
|
+
const result = await tx
|
|
73
79
|
.insertInto('OperationHistory')
|
|
74
80
|
.values({
|
|
75
81
|
oid: item.oid,
|
|
76
82
|
data: JSON.stringify(item.data),
|
|
77
83
|
timestamp: item.timestamp,
|
|
78
84
|
replicaId,
|
|
79
|
-
serverOrder:
|
|
85
|
+
serverOrder: currentServerOrder + 1,
|
|
80
86
|
authz: item.authz,
|
|
81
87
|
})
|
|
82
88
|
.onConflict((cb) => cb.columns(['replicaId', 'oid', 'timestamp']).doNothing())
|
|
83
|
-
.
|
|
89
|
+
.returning('serverOrder')
|
|
90
|
+
.executeTakeFirst();
|
|
91
|
+
if (result) {
|
|
92
|
+
currentServerOrder = result.serverOrder;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// on conflict, nothing is returned.
|
|
96
|
+
// this would mean an operation was synced twice.
|
|
97
|
+
}
|
|
84
98
|
}
|
|
99
|
+
return currentServerOrder;
|
|
85
100
|
});
|
|
86
101
|
};
|
|
87
102
|
this.deleteAll = async (libraryId) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqlOperations.js","sourceRoot":"","sources":["../../../../src/storage/sqlShard/SqlOperations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SqlOperations.js","sourceRoot":"","sources":["../../../../src/storage/sqlShard/SqlOperations.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdant-web/server",
|
|
3
|
-
"version": "3.3.4-alpha.
|
|
3
|
+
"version": "3.3.4-alpha.2",
|
|
4
4
|
"access": "public",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -25,12 +25,12 @@
|
|
|
25
25
|
"bin/"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@a-type/kysely": "^1.0.
|
|
28
|
+
"@a-type/kysely": "^1.0.2",
|
|
29
29
|
"async-lock": "^1.4.0",
|
|
30
|
-
"better-sqlite3": "^7.
|
|
30
|
+
"better-sqlite3": "^11.7.0",
|
|
31
31
|
"busboy": "^1.6.0",
|
|
32
32
|
"jsonwebtoken": "^8.5.1",
|
|
33
|
-
"kysely": "0.27.
|
|
33
|
+
"kysely": "0.27.5",
|
|
34
34
|
"kysely-plugin-serialize": "^0.5.7",
|
|
35
35
|
"minimist": "^1.2.8",
|
|
36
36
|
"ws": "^8.9.0",
|
package/src/ServerLibrary.ts
CHANGED
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
applyOperations,
|
|
14
14
|
isFileRef,
|
|
15
15
|
isObjectRef,
|
|
16
|
-
omit,
|
|
17
16
|
rewriteAuthzOriginator,
|
|
18
17
|
} from '@verdant-web/common';
|
|
19
18
|
import { MessageSender } from './MessageSender.js';
|
|
@@ -26,6 +25,7 @@ import {
|
|
|
26
25
|
LibraryInfo,
|
|
27
26
|
StoredDocumentBaseline,
|
|
28
27
|
StoredOperation,
|
|
28
|
+
StoredReplicaInfo,
|
|
29
29
|
} from './types.js';
|
|
30
30
|
|
|
31
31
|
export type ServerLibraryEvents = {
|
|
@@ -171,13 +171,27 @@ export class ServerLibrary extends EventSubscriber<ServerLibraryEvents> {
|
|
|
171
171
|
message.operations,
|
|
172
172
|
);
|
|
173
173
|
|
|
174
|
-
// TODO: can we defer this and rebroadcast in parallel?
|
|
175
174
|
// insert patches into history
|
|
176
|
-
|
|
175
|
+
|
|
176
|
+
// first, record the replica's serverOrder before insertion.
|
|
177
|
+
const replicaInfo = await this.storage.replicas.getOrCreate(
|
|
178
|
+
info.libraryId,
|
|
179
|
+
message.replicaId,
|
|
180
|
+
{
|
|
181
|
+
userId: info.userId,
|
|
182
|
+
type: info.type,
|
|
183
|
+
},
|
|
184
|
+
);
|
|
185
|
+
const newServerOrder = await this.storage.operations.insertAll(
|
|
177
186
|
info.libraryId,
|
|
178
187
|
message.replicaId,
|
|
179
188
|
message.operations,
|
|
180
189
|
);
|
|
190
|
+
this.preemptiveUpdateServerOrder(
|
|
191
|
+
replicaInfo.replicaInfo,
|
|
192
|
+
newServerOrder,
|
|
193
|
+
message.operations.length,
|
|
194
|
+
);
|
|
181
195
|
|
|
182
196
|
this.enqueueRebase(info.libraryId);
|
|
183
197
|
|
|
@@ -196,6 +210,35 @@ export class ServerLibrary extends EventSubscriber<ServerLibraryEvents> {
|
|
|
196
210
|
this.emit(`changes`, info, message.operations, []);
|
|
197
211
|
};
|
|
198
212
|
|
|
213
|
+
/**
|
|
214
|
+
* If a replica inserts operations when it's already
|
|
215
|
+
* up to date, we can preemptively update its ackedServerOrder
|
|
216
|
+
* to avoid a round trip.
|
|
217
|
+
*/
|
|
218
|
+
private preemptiveUpdateServerOrder = async (
|
|
219
|
+
replicaInfo: StoredReplicaInfo,
|
|
220
|
+
newServerOrder: number,
|
|
221
|
+
insertedOperationsCount: number,
|
|
222
|
+
) => {
|
|
223
|
+
if (
|
|
224
|
+
newServerOrder - replicaInfo.ackedServerOrder ===
|
|
225
|
+
insertedOperationsCount
|
|
226
|
+
) {
|
|
227
|
+
await this.storage.replicas.updateAckedServerOrder(
|
|
228
|
+
replicaInfo.libraryId,
|
|
229
|
+
replicaInfo.id,
|
|
230
|
+
newServerOrder,
|
|
231
|
+
);
|
|
232
|
+
this.log(
|
|
233
|
+
'debug',
|
|
234
|
+
'Preemptively updated ackedServerOrder for',
|
|
235
|
+
replicaInfo.id,
|
|
236
|
+
'to',
|
|
237
|
+
newServerOrder,
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
|
|
199
242
|
private rebroadcastOperations = async (
|
|
200
243
|
libraryId: string,
|
|
201
244
|
clientKey: string,
|
|
@@ -256,13 +299,26 @@ export class ServerLibrary extends EventSubscriber<ServerLibraryEvents> {
|
|
|
256
299
|
const { status, replicaInfo: clientReplicaInfo } =
|
|
257
300
|
await this.storage.replicas.getOrCreate(info.libraryId, replicaId, info);
|
|
258
301
|
|
|
259
|
-
const changesSince =
|
|
260
|
-
status === 'existing' ? clientReplicaInfo.ackedLogicalTime : null;
|
|
261
302
|
this.log(
|
|
262
303
|
'info',
|
|
263
|
-
`Sync from ${replicaId} (user: ${info.userId}) [
|
|
304
|
+
`Sync from ${replicaId} (user: ${info.userId}) [ackedServerOrder: ${clientReplicaInfo.ackedServerOrder}, status: ${status}}]`,
|
|
264
305
|
);
|
|
265
306
|
|
|
307
|
+
// for truant replicas -- if their ackedServerOrder is up-to-date, that's fine,
|
|
308
|
+
// restore them.
|
|
309
|
+
let overrideTruant = false;
|
|
310
|
+
if (status === 'truant') {
|
|
311
|
+
const latestServerOrder =
|
|
312
|
+
await this.storage.operations.getLatestServerOrder(info.libraryId);
|
|
313
|
+
if (clientReplicaInfo.ackedServerOrder >= latestServerOrder) {
|
|
314
|
+
overrideTruant = true;
|
|
315
|
+
this.log(
|
|
316
|
+
'debug',
|
|
317
|
+
'Overriding truant reset; truant replica has up-to-date server order',
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
266
322
|
// lookup operations after the last ack the client gave us
|
|
267
323
|
const ops = await this.storage.operations.getAfterServerOrder(
|
|
268
324
|
info.libraryId,
|
|
@@ -272,7 +328,8 @@ export class ServerLibrary extends EventSubscriber<ServerLibraryEvents> {
|
|
|
272
328
|
// new, unseen replicas should reset their existing storage
|
|
273
329
|
// to that of the server when joining a library.
|
|
274
330
|
// truant replicas should also reset their storage.
|
|
275
|
-
const replicaShouldReset =
|
|
331
|
+
const replicaShouldReset =
|
|
332
|
+
!!message.resyncAll || (!overrideTruant && status !== 'existing');
|
|
276
333
|
|
|
277
334
|
// only new replicas need baselines. by definition, a rebase only
|
|
278
335
|
// happens when all active replicas agree on history. every client
|
|
@@ -284,14 +341,17 @@ export class ServerLibrary extends EventSubscriber<ServerLibraryEvents> {
|
|
|
284
341
|
|
|
285
342
|
// We detect that a library is new by checking if it has any history.
|
|
286
343
|
// If there are no existing operations or baselines (and the requested
|
|
287
|
-
// history timerange was "everything", i.e. "from
|
|
344
|
+
// history timerange was "everything", i.e. "from server order 0"), then this is
|
|
288
345
|
// a fresh library which should receive the first client's history as its
|
|
289
346
|
// own. Otherwise, if the client requested a reset, we should send them
|
|
290
347
|
// the full history of the library.
|
|
291
348
|
// the definition of this field could be improved to be more explicit
|
|
292
349
|
// and not rely on seemingly unrelated data.
|
|
293
350
|
const isEmptyLibrary =
|
|
294
|
-
|
|
351
|
+
clientReplicaInfo.ackedServerOrder === 0 &&
|
|
352
|
+
ops.length === 0 &&
|
|
353
|
+
baselines.length === 0;
|
|
354
|
+
|
|
295
355
|
if (isEmptyLibrary) {
|
|
296
356
|
this.log('info', 'Received sync from new library', replicaId);
|
|
297
357
|
|
|
@@ -305,10 +365,12 @@ export class ServerLibrary extends EventSubscriber<ServerLibraryEvents> {
|
|
|
305
365
|
// don't reset replica if library is empty...
|
|
306
366
|
let overwriteReplicaData = replicaShouldReset && !isEmptyLibrary;
|
|
307
367
|
|
|
368
|
+
// EARLY RETURN --
|
|
308
369
|
// if the local library is empty and the replica is new to us,
|
|
309
370
|
// but the replica is providing a "since" timestamp, this
|
|
310
371
|
// suggests the local data is incomplete or gone. we request
|
|
311
|
-
// this replica should respond with a full history.
|
|
372
|
+
// this replica should respond with a full history. We will retry
|
|
373
|
+
// sync after replica has updated us with full history.
|
|
312
374
|
if (isEmptyLibrary && status === 'new' && message.since !== null) {
|
|
313
375
|
this.log(
|
|
314
376
|
'info',
|
|
@@ -360,11 +422,16 @@ export class ServerLibrary extends EventSubscriber<ServerLibraryEvents> {
|
|
|
360
422
|
message.operations.length,
|
|
361
423
|
'operations',
|
|
362
424
|
);
|
|
363
|
-
await this.storage.operations.insertAll(
|
|
425
|
+
const newServerOrder = await this.storage.operations.insertAll(
|
|
364
426
|
info.libraryId,
|
|
365
427
|
replicaId,
|
|
366
428
|
message.operations,
|
|
367
429
|
);
|
|
430
|
+
this.preemptiveUpdateServerOrder(
|
|
431
|
+
clientReplicaInfo,
|
|
432
|
+
newServerOrder,
|
|
433
|
+
message.operations.length,
|
|
434
|
+
);
|
|
368
435
|
await this.storage.replicas.updateAcknowledgedLogicalTime(
|
|
369
436
|
info.libraryId,
|
|
370
437
|
replicaId,
|
|
@@ -392,7 +459,13 @@ export class ServerLibrary extends EventSubscriber<ServerLibraryEvents> {
|
|
|
392
459
|
}
|
|
393
460
|
|
|
394
461
|
// create the nonce by encoding the server order of the last operation
|
|
395
|
-
const
|
|
462
|
+
const serverOrderToAck = ops.length
|
|
463
|
+
? ops[ops.length - 1].serverOrder
|
|
464
|
+
: undefined;
|
|
465
|
+
const ackThisNonce =
|
|
466
|
+
serverOrderToAck !== undefined
|
|
467
|
+
? this.createAckNonce(serverOrderToAck)
|
|
468
|
+
: undefined;
|
|
396
469
|
|
|
397
470
|
// respond to client
|
|
398
471
|
|
|
@@ -424,12 +497,8 @@ export class ServerLibrary extends EventSubscriber<ServerLibraryEvents> {
|
|
|
424
497
|
});
|
|
425
498
|
};
|
|
426
499
|
|
|
427
|
-
private createAckNonce = (
|
|
428
|
-
return
|
|
429
|
-
? Buffer.from(JSON.stringify(ops[ops.length - 1].serverOrder)).toString(
|
|
430
|
-
'base64',
|
|
431
|
-
)
|
|
432
|
-
: undefined;
|
|
500
|
+
private createAckNonce = (serverOrder: number): string | undefined => {
|
|
501
|
+
return Buffer.from(JSON.stringify(serverOrder)).toString('base64');
|
|
433
502
|
};
|
|
434
503
|
|
|
435
504
|
private handleAck = async (
|
|
@@ -656,8 +725,9 @@ export class ServerLibrary extends EventSubscriber<ServerLibraryEvents> {
|
|
|
656
725
|
this.log('debug', 'Database not open, skipping cleanup');
|
|
657
726
|
return;
|
|
658
727
|
}
|
|
659
|
-
const pendingDelete =
|
|
660
|
-
|
|
728
|
+
const pendingDelete = await this.storage.fileMetadata.getPendingDelete(
|
|
729
|
+
libraryId,
|
|
730
|
+
);
|
|
661
731
|
if (pendingDelete.length > 0) {
|
|
662
732
|
if (!this.fileStorage) {
|
|
663
733
|
throw new Error('File storage not configured, cannot delete files');
|
|
@@ -742,8 +812,9 @@ export class ServerLibrary extends EventSubscriber<ServerLibraryEvents> {
|
|
|
742
812
|
const data = {
|
|
743
813
|
id: libraryId,
|
|
744
814
|
replicas,
|
|
745
|
-
latestServerOrder:
|
|
746
|
-
|
|
815
|
+
latestServerOrder: await this.storage.operations.getLatestServerOrder(
|
|
816
|
+
libraryId,
|
|
817
|
+
),
|
|
747
818
|
operationsCount: await this.storage.operations.getCount(libraryId),
|
|
748
819
|
baselinesCount: await this.storage.baselines.getCount(libraryId),
|
|
749
820
|
globalAck: (await this.storage.replicas.getGlobalAck(libraryId)) ?? null,
|
package/src/storage/Storage.ts
CHANGED
|
@@ -69,7 +69,7 @@ export interface OperationStorage {
|
|
|
69
69
|
libraryId: string,
|
|
70
70
|
replicaId: string,
|
|
71
71
|
operations: Operation[],
|
|
72
|
-
): Promise<
|
|
72
|
+
): Promise<number>;
|
|
73
73
|
deleteAll(libraryId: string): Promise<void>;
|
|
74
74
|
delete(libraryId: string, operations: Operation[]): Promise<void>;
|
|
75
75
|
}
|
|
@@ -93,20 +93,21 @@ export class SqlOperations implements OperationStorage {
|
|
|
93
93
|
libraryId: string,
|
|
94
94
|
replicaId: string,
|
|
95
95
|
operations: Operation[],
|
|
96
|
-
): Promise<
|
|
96
|
+
): Promise<number> => {
|
|
97
97
|
// inserts all operations and updates server order
|
|
98
98
|
// FIXME: this whole thing is kinda sus
|
|
99
|
-
await this.db.transaction().execute(async (tx): Promise<
|
|
99
|
+
return await this.db.transaction().execute(async (tx): Promise<number> => {
|
|
100
100
|
let orderResult = await tx
|
|
101
101
|
.selectFrom('OperationHistory')
|
|
102
|
-
.select(
|
|
103
|
-
fn.coalesce(fn.max<number>('serverOrder'), val(0)).as('serverOrder'),
|
|
104
|
-
)
|
|
102
|
+
.select('serverOrder')
|
|
105
103
|
.where('libraryId', '=', libraryId)
|
|
104
|
+
.orderBy('serverOrder', 'desc')
|
|
105
|
+
.limit(1)
|
|
106
106
|
.executeTakeFirst();
|
|
107
107
|
let currentServerOrder = orderResult?.serverOrder ?? 0;
|
|
108
108
|
for (const item of operations) {
|
|
109
|
-
|
|
109
|
+
// utilizing returned serverOrder accommodates for conflicts
|
|
110
|
+
const result = await tx
|
|
110
111
|
.insertInto('OperationHistory')
|
|
111
112
|
.values({
|
|
112
113
|
libraryId,
|
|
@@ -114,7 +115,7 @@ export class SqlOperations implements OperationStorage {
|
|
|
114
115
|
data: JSON.stringify(item.data),
|
|
115
116
|
timestamp: item.timestamp,
|
|
116
117
|
replicaId,
|
|
117
|
-
serverOrder:
|
|
118
|
+
serverOrder: currentServerOrder + 1,
|
|
118
119
|
authz: item.authz,
|
|
119
120
|
})
|
|
120
121
|
.onConflict((cb) =>
|
|
@@ -122,8 +123,16 @@ export class SqlOperations implements OperationStorage {
|
|
|
122
123
|
.columns(['libraryId', 'replicaId', 'oid', 'timestamp'])
|
|
123
124
|
.doNothing(),
|
|
124
125
|
)
|
|
125
|
-
.
|
|
126
|
+
.returning('serverOrder')
|
|
127
|
+
.executeTakeFirst();
|
|
128
|
+
if (result) {
|
|
129
|
+
currentServerOrder = result.serverOrder;
|
|
130
|
+
} else {
|
|
131
|
+
// on conflict, nothing is returned.
|
|
132
|
+
// this would mean an operation was synced twice
|
|
133
|
+
}
|
|
126
134
|
}
|
|
135
|
+
return currentServerOrder;
|
|
127
136
|
});
|
|
128
137
|
};
|
|
129
138
|
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import { Operation } from '@verdant-web/common';
|
|
2
2
|
import { StoredOperation } from '../../types.js';
|
|
3
3
|
import { OperationStorage } from '../Storage.js';
|
|
4
|
-
import {
|
|
5
|
-
import { Database, OperationHistoryRow } from './tables.js';
|
|
4
|
+
import { OperationHistoryRow } from './tables.js';
|
|
6
5
|
import { Databases } from './Databases.js';
|
|
7
6
|
|
|
8
7
|
export class SqlOperations implements OperationStorage {
|
|
9
|
-
constructor(
|
|
10
|
-
private dbs: Databases,
|
|
11
|
-
private dialect: 'postgres' | 'sqlite',
|
|
12
|
-
) {}
|
|
8
|
+
constructor(private dbs: Databases, private dialect: 'postgres' | 'sqlite') {}
|
|
13
9
|
|
|
14
10
|
private hydrate = (row: OperationHistoryRow) => {
|
|
15
11
|
// avoiding extra allocation from .map by type-asserting here
|
|
@@ -66,16 +62,17 @@ export class SqlOperations implements OperationStorage {
|
|
|
66
62
|
|
|
67
63
|
getLatestServerOrder = async (libraryId: string): Promise<number> => {
|
|
68
64
|
const db = await this.dbs.get(libraryId);
|
|
69
|
-
|
|
70
|
-
(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
65
|
+
const result = await db
|
|
66
|
+
.selectFrom('OperationHistory')
|
|
67
|
+
.orderBy('serverOrder', 'desc')
|
|
68
|
+
.select('serverOrder')
|
|
69
|
+
.limit(1)
|
|
70
|
+
.executeTakeFirst();
|
|
71
|
+
if (result) {
|
|
72
|
+
return result.serverOrder;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return 0;
|
|
79
76
|
};
|
|
80
77
|
|
|
81
78
|
getCount = async (libraryId: string): Promise<number> => {
|
|
@@ -94,34 +91,44 @@ export class SqlOperations implements OperationStorage {
|
|
|
94
91
|
libraryId: string,
|
|
95
92
|
replicaId: string,
|
|
96
93
|
operations: Operation[],
|
|
97
|
-
): Promise<
|
|
94
|
+
): Promise<number> => {
|
|
98
95
|
const db = await this.dbs.get(libraryId);
|
|
99
96
|
// inserts all operations and updates server order
|
|
100
97
|
// FIXME: this whole thing is kinda sus
|
|
101
|
-
await db.transaction().execute(async (tx): Promise<
|
|
98
|
+
return await db.transaction().execute(async (tx): Promise<number> => {
|
|
102
99
|
let orderResult = await tx
|
|
103
100
|
.selectFrom('OperationHistory')
|
|
104
|
-
.select(
|
|
105
|
-
|
|
106
|
-
)
|
|
101
|
+
.select('serverOrder')
|
|
102
|
+
.orderBy('serverOrder', 'desc')
|
|
103
|
+
.limit(1)
|
|
107
104
|
.executeTakeFirst();
|
|
108
105
|
let currentServerOrder = orderResult?.serverOrder ?? 0;
|
|
109
106
|
for (const item of operations) {
|
|
110
|
-
|
|
107
|
+
// utilizing returned serverOrder accommodates for conflicts
|
|
108
|
+
const result = await tx
|
|
111
109
|
.insertInto('OperationHistory')
|
|
112
110
|
.values({
|
|
113
111
|
oid: item.oid,
|
|
114
112
|
data: JSON.stringify(item.data),
|
|
115
113
|
timestamp: item.timestamp,
|
|
116
114
|
replicaId,
|
|
117
|
-
serverOrder:
|
|
115
|
+
serverOrder: currentServerOrder + 1,
|
|
118
116
|
authz: item.authz,
|
|
119
117
|
})
|
|
120
118
|
.onConflict((cb) =>
|
|
121
119
|
cb.columns(['replicaId', 'oid', 'timestamp']).doNothing(),
|
|
122
120
|
)
|
|
123
|
-
.
|
|
121
|
+
.returning('serverOrder')
|
|
122
|
+
.executeTakeFirst();
|
|
123
|
+
if (result) {
|
|
124
|
+
currentServerOrder = result.serverOrder;
|
|
125
|
+
} else {
|
|
126
|
+
// on conflict, nothing is returned.
|
|
127
|
+
// this would mean an operation was synced twice.
|
|
128
|
+
}
|
|
124
129
|
}
|
|
130
|
+
|
|
131
|
+
return currentServerOrder;
|
|
125
132
|
});
|
|
126
133
|
};
|
|
127
134
|
|