@verdant-web/server 3.3.10 → 4.0.0
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/bin/server.mjs +110 -107
- package/dist/esm/TokenVerifier.d.ts +1 -0
- package/dist/esm/TokenVerifier.js +3 -0
- package/dist/esm/TokenVerifier.js.map +1 -1
- package/dist/esm/adapters/node/errorHandler.d.ts +2 -0
- package/dist/esm/adapters/node/errorHandler.js +12 -0
- package/dist/esm/adapters/node/errorHandler.js.map +1 -0
- package/dist/esm/adapters/node/getRequestToken.d.ts +1 -0
- package/dist/esm/adapters/node/getRequestToken.js +25 -0
- package/dist/esm/adapters/node/getRequestToken.js.map +1 -0
- package/dist/esm/adapters/node/httpRouter.d.ts +47 -0
- package/dist/esm/adapters/node/httpRouter.js +88 -0
- package/dist/esm/adapters/node/httpRouter.js.map +1 -0
- package/dist/esm/adapters/node/index.d.ts +5 -0
- package/dist/esm/adapters/node/index.js +6 -0
- package/dist/esm/adapters/node/index.js.map +1 -0
- package/dist/esm/adapters/node/tokenMiddleware.d.ts +7 -0
- package/dist/esm/adapters/node/tokenMiddleware.js +22 -0
- package/dist/esm/adapters/node/tokenMiddleware.js.map +1 -0
- package/dist/esm/adapters/node/websocketHandler.d.ts +4 -0
- package/dist/esm/adapters/node/websocketHandler.js +54 -0
- package/dist/esm/adapters/node/websocketHandler.js.map +1 -0
- package/dist/esm/connections/ClientConnection.d.ts +25 -0
- package/dist/esm/{ClientConnection.js → connections/ClientConnection.js} +47 -38
- package/dist/esm/connections/ClientConnection.js.map +1 -0
- package/dist/esm/connections/MessageSender.d.ts +5 -0
- package/dist/esm/connections/MessageSender.js.map +1 -0
- package/dist/esm/connections/Presence.d.ts +23 -0
- package/dist/esm/connections/Presence.js +65 -0
- package/dist/esm/connections/Presence.js.map +1 -0
- package/dist/esm/core.d.ts +15 -0
- package/dist/esm/core.js +15 -0
- package/dist/esm/core.js.map +1 -0
- package/dist/esm/defaults.d.ts +2 -0
- package/dist/esm/defaults.js +3 -0
- package/dist/esm/defaults.js.map +1 -0
- package/dist/esm/files/FileStorage.d.ts +12 -3
- package/dist/esm/files/FileStorage.js +20 -0
- package/dist/esm/files/FileStorage.js.map +1 -1
- package/dist/esm/index.d.ts +7 -7
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internals.d.ts +14 -0
- package/dist/esm/internals.js +12 -0
- package/dist/esm/internals.js.map +1 -0
- package/dist/esm/libraries/Library.d.ts +78 -0
- package/dist/esm/{ServerLibrary.js → libraries/Library.js} +153 -144
- package/dist/esm/libraries/Library.js.map +1 -0
- package/dist/esm/{ServerLibrary.test.js → libraries/Library.test.js} +42 -33
- package/dist/esm/libraries/Library.test.js.map +1 -0
- package/dist/esm/libraries/generic.d.ts +8 -0
- package/dist/esm/libraries/generic.js +2 -0
- package/dist/esm/libraries/generic.js.map +1 -0
- package/dist/esm/libraries/singleNode.d.ts +53 -0
- package/dist/esm/libraries/singleNode.js +88 -0
- package/dist/esm/libraries/singleNode.js.map +1 -0
- package/dist/esm/logger.d.ts +1 -0
- package/dist/esm/logger.js +2 -0
- package/dist/esm/logger.js.map +1 -0
- package/dist/esm/storage/Storage.d.ts +39 -38
- package/dist/esm/storage/StorageManager.d.ts +11 -0
- package/dist/esm/storage/StorageManager.js +32 -0
- package/dist/esm/storage/StorageManager.js.map +1 -0
- package/dist/esm/storage/index.d.ts +1 -2
- package/dist/esm/storage/index.js +1 -2
- package/dist/esm/storage/index.js.map +1 -1
- package/dist/esm/storage/sqlShard/Databases.d.ts +5 -3
- package/dist/esm/storage/sqlShard/Databases.js +11 -7
- package/dist/esm/storage/sqlShard/Databases.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlBaselines.d.ts +16 -17
- package/dist/esm/storage/sqlShard/SqlBaselines.js +55 -59
- package/dist/esm/storage/sqlShard/SqlBaselines.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlFileMetadata.d.ts +13 -13
- package/dist/esm/storage/sqlShard/SqlFileMetadata.js +44 -57
- package/dist/esm/storage/sqlShard/SqlFileMetadata.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlOperations.d.ts +12 -12
- package/dist/esm/storage/sqlShard/SqlOperations.js +38 -73
- package/dist/esm/storage/sqlShard/SqlOperations.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlReplicas.d.ts +18 -17
- package/dist/esm/storage/sqlShard/SqlReplicas.js +63 -100
- package/dist/esm/storage/sqlShard/SqlReplicas.js.map +1 -1
- package/dist/esm/storage/sqlShard/database.d.ts +25 -5
- package/dist/esm/storage/sqlShard/database.js +47 -15
- package/dist/esm/storage/sqlShard/database.js.map +1 -1
- package/dist/esm/storage/sqlShard/migrations/v1.d.ts +2 -3
- package/dist/esm/storage/sqlShard/migrations/v1.js +42 -47
- package/dist/esm/storage/sqlShard/migrations/v1.js.map +1 -1
- package/dist/esm/storage/sqlShard/migrations/v2.d.ts +2 -3
- package/dist/esm/storage/sqlShard/migrations/v2.js +5 -15
- package/dist/esm/storage/sqlShard/migrations/v2.js.map +1 -1
- package/dist/esm/storage/sqlShard/migrations.d.ts +5 -7
- package/dist/esm/storage/sqlShard/migrations.js +48 -1
- package/dist/esm/storage/sqlShard/migrations.js.map +1 -1
- package/dist/esm/storage/sqlShard/sqlShardStorage.d.ts +25 -4
- package/dist/esm/storage/sqlShard/sqlShardStorage.js +43 -40
- package/dist/esm/storage/sqlShard/sqlShardStorage.js.map +1 -1
- package/dist/esm/storage/sqlShard/tables.d.ts +9 -6
- package/dist/esm/types.d.ts +1 -2
- package/package.json +24 -13
- package/src/TokenVerifier.ts +4 -0
- package/src/adapters/node/errorHandler.ts +18 -0
- package/src/adapters/node/getRequestToken.ts +34 -0
- package/src/adapters/node/httpRouter.ts +139 -0
- package/src/adapters/node/index.ts +5 -0
- package/src/adapters/node/tokenMiddleware.ts +32 -0
- package/src/adapters/node/websocketHandler.ts +79 -0
- package/src/{ClientConnection.ts → connections/ClientConnection.ts} +64 -57
- package/src/connections/MessageSender.ts +6 -0
- package/src/connections/Presence.ts +95 -0
- package/src/core.ts +36 -0
- package/src/defaults.ts +2 -0
- package/src/files/FileStorage.ts +36 -3
- package/src/index.ts +7 -7
- package/src/internals.ts +14 -0
- package/src/{ServerLibrary.test.ts → libraries/Library.test.ts} +51 -49
- package/src/{ServerLibrary.ts → libraries/Library.ts} +203 -206
- package/src/libraries/generic.ts +9 -0
- package/src/libraries/singleNode.ts +145 -0
- package/src/logger.ts +4 -0
- package/src/storage/Storage.ts +37 -66
- package/src/storage/StorageManager.ts +39 -0
- package/src/storage/index.ts +1 -2
- package/src/storage/sqlShard/Databases.ts +26 -13
- package/src/storage/sqlShard/SqlBaselines.ts +58 -67
- package/src/storage/sqlShard/SqlFileMetadata.ts +51 -72
- package/src/storage/sqlShard/SqlOperations.ts +57 -81
- package/src/storage/sqlShard/SqlReplicas.ts +80 -121
- package/src/storage/sqlShard/database.ts +82 -18
- package/src/storage/sqlShard/migrations/v1.ts +42 -52
- package/src/storage/sqlShard/migrations/v2.ts +5 -19
- package/src/storage/sqlShard/migrations.ts +66 -1
- package/src/storage/sqlShard/sqlShardStorage.ts +56 -55
- package/src/storage/sqlShard/tables.ts +6 -6
- package/src/types.ts +1 -2
- package/dist/esm/ClientConnection.d.ts +0 -19
- package/dist/esm/ClientConnection.js.map +0 -1
- package/dist/esm/MessageSender.d.ts +0 -5
- package/dist/esm/MessageSender.js.map +0 -1
- package/dist/esm/Presence.d.ts +0 -18
- package/dist/esm/Presence.js +0 -65
- package/dist/esm/Presence.js.map +0 -1
- package/dist/esm/ReplicaKeepaliveTimers.d.ts +0 -17
- package/dist/esm/ReplicaKeepaliveTimers.js +0 -27
- package/dist/esm/ReplicaKeepaliveTimers.js.map +0 -1
- package/dist/esm/Server.d.ts +0 -166
- package/dist/esm/Server.js +0 -572
- package/dist/esm/Server.js.map +0 -1
- package/dist/esm/ServerLibrary.d.ts +0 -64
- package/dist/esm/ServerLibrary.js.map +0 -1
- package/dist/esm/ServerLibrary.test.js.map +0 -1
- package/dist/esm/storage/sql/SqlBaselines.d.ts +0 -22
- package/dist/esm/storage/sql/SqlBaselines.js +0 -107
- package/dist/esm/storage/sql/SqlBaselines.js.map +0 -1
- package/dist/esm/storage/sql/SqlFileMetadata.d.ts +0 -18
- package/dist/esm/storage/sql/SqlFileMetadata.js +0 -69
- package/dist/esm/storage/sql/SqlFileMetadata.js.map +0 -1
- package/dist/esm/storage/sql/SqlOperations.d.ts +0 -19
- package/dist/esm/storage/sql/SqlOperations.js +0 -122
- package/dist/esm/storage/sql/SqlOperations.js.map +0 -1
- package/dist/esm/storage/sql/SqlReplicas.d.ts +0 -32
- package/dist/esm/storage/sql/SqlReplicas.js +0 -163
- package/dist/esm/storage/sql/SqlReplicas.js.map +0 -1
- package/dist/esm/storage/sql/database.d.ts +0 -9
- package/dist/esm/storage/sql/database.js +0 -24
- package/dist/esm/storage/sql/database.js.map +0 -1
- package/dist/esm/storage/sql/migrations/v1.d.ts +0 -3
- package/dist/esm/storage/sql/migrations/v1.js +0 -59
- package/dist/esm/storage/sql/migrations/v1.js.map +0 -1
- package/dist/esm/storage/sql/migrations/v2.d.ts +0 -3
- package/dist/esm/storage/sql/migrations/v2.js +0 -16
- package/dist/esm/storage/sql/migrations/v2.js.map +0 -1
- package/dist/esm/storage/sql/migrations.d.ts +0 -7
- package/dist/esm/storage/sql/migrations.js +0 -4
- package/dist/esm/storage/sql/migrations.js.map +0 -1
- package/dist/esm/storage/sql/sqlStorage.d.ts +0 -6
- package/dist/esm/storage/sql/sqlStorage.js +0 -35
- package/dist/esm/storage/sql/sqlStorage.js.map +0 -1
- package/dist/esm/storage/sql/tables.d.ts +0 -44
- package/dist/esm/storage/sql/tables.js +0 -2
- package/dist/esm/storage/sql/tables.js.map +0 -1
- package/dist/esm/storage/sqlShard/transfer.d.ts +0 -7
- package/dist/esm/storage/sqlShard/transfer.js +0 -90
- package/dist/esm/storage/sqlShard/transfer.js.map +0 -1
- package/dist/esm/storage/sqlShard/transfer.test.d.ts +0 -1
- package/dist/esm/storage/sqlShard/transfer.test.js +0 -109
- package/dist/esm/storage/sqlShard/transfer.test.js.map +0 -1
- package/src/MessageSender.ts +0 -10
- package/src/Presence.ts +0 -86
- package/src/ReplicaKeepaliveTimers.ts +0 -34
- package/src/Server.ts +0 -859
- package/src/storage/sql/SqlBaselines.ts +0 -147
- package/src/storage/sql/SqlFileMetadata.ts +0 -94
- package/src/storage/sql/SqlOperations.ts +0 -160
- package/src/storage/sql/SqlReplicas.ts +0 -234
- package/src/storage/sql/database.ts +0 -32
- package/src/storage/sql/migrations/v1.ts +0 -64
- package/src/storage/sql/migrations/v2.ts +0 -20
- package/src/storage/sql/migrations.ts +0 -4
- package/src/storage/sql/sqlStorage.ts +0 -57
- package/src/storage/sql/tables.ts +0 -51
- package/src/storage/sqlShard/transfer.test.ts +0 -149
- package/src/storage/sqlShard/transfer.ts +0 -123
- /package/dist/esm/{MessageSender.js → connections/MessageSender.js} +0 -0
- /package/dist/esm/{ServerLibrary.test.d.ts → libraries/Library.test.d.ts} +0 -0
package/src/internals.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { errorHandler } from './adapters/node/errorHandler.js';
|
|
2
|
+
export { createHttpRouter as createHonoRouter } from './adapters/node/httpRouter.js';
|
|
3
|
+
export { tokenMiddleware } from './adapters/node/tokenMiddleware.js';
|
|
4
|
+
export { ClientConnectionManager } from './connections/ClientConnection.js';
|
|
5
|
+
export { FileStorageLibraryDelegate } from './files/FileStorage.js';
|
|
6
|
+
export type * from './libraries/generic.js';
|
|
7
|
+
export { Library, type LibraryEvents } from './libraries/Library.js';
|
|
8
|
+
export { type Logger } from './logger.js';
|
|
9
|
+
export { UserProfileLoader } from './Profiles.js';
|
|
10
|
+
export { SqliteExecutor } from './storage/sqlShard/database.js';
|
|
11
|
+
export { migrateToLatest } from './storage/sqlShard/migrations.js';
|
|
12
|
+
export { SqlShardStorage } from './storage/sqlShard/sqlShardStorage.js';
|
|
13
|
+
export type { Database as DatabaseTypes } from './storage/sqlShard/tables.js';
|
|
14
|
+
export { TokenVerifier } from './TokenVerifier.js';
|
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { UserProfileLoader } from './Profiles.js';
|
|
3
|
-
import { sqlStorage } from './storage/index.js';
|
|
4
|
-
import { ServerLibrary } from './ServerLibrary.js';
|
|
5
1
|
import {
|
|
6
2
|
ClientMessage,
|
|
7
|
-
DocumentBaseline,
|
|
8
|
-
HybridLogicalClockTimestampProvider,
|
|
9
3
|
Operation,
|
|
10
4
|
ReplicaType,
|
|
11
5
|
ServerMessage,
|
|
12
6
|
} from '@verdant-web/common';
|
|
13
|
-
import {
|
|
14
|
-
import { MessageSender } from '
|
|
7
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
8
|
+
import { MessageSender } from '../connections/MessageSender.js';
|
|
9
|
+
import { Presence } from '../connections/Presence.js';
|
|
10
|
+
import { UserProfileLoader } from '../Profiles.js';
|
|
11
|
+
import { sqlShardStorage } from '../storage/index.js';
|
|
12
|
+
import { TokenInfo } from '../TokenVerifier.js';
|
|
13
|
+
import { Library } from './Library.js';
|
|
15
14
|
|
|
16
15
|
const profiles = new UserProfileLoader<{ id: string; name: string }>({
|
|
17
16
|
get: async (userId: string) => {
|
|
@@ -22,13 +21,21 @@ const profiles = new UserProfileLoader<{ id: string; name: string }>({
|
|
|
22
21
|
},
|
|
23
22
|
});
|
|
24
23
|
|
|
25
|
-
const baseOptions = () => ({
|
|
24
|
+
const baseOptions = async () => ({
|
|
25
|
+
id: 'library-1',
|
|
26
26
|
profiles,
|
|
27
|
-
storage:
|
|
28
|
-
|
|
29
|
-
})({
|
|
27
|
+
storage: await sqlShardStorage({
|
|
28
|
+
databasesDirectory: ':memory:',
|
|
30
29
|
fileDeleteExpirationDays: 7,
|
|
31
30
|
replicaTruancyMinutes: 60 * 24,
|
|
31
|
+
})('library-1'),
|
|
32
|
+
presence: new Presence({
|
|
33
|
+
get: async (userId: string) => {
|
|
34
|
+
return {
|
|
35
|
+
id: userId,
|
|
36
|
+
name: 'Alice',
|
|
37
|
+
};
|
|
38
|
+
},
|
|
32
39
|
}),
|
|
33
40
|
});
|
|
34
41
|
|
|
@@ -70,12 +77,12 @@ function getAllReceivedReplicaOperations(replica: TestReplica) {
|
|
|
70
77
|
return operations;
|
|
71
78
|
}
|
|
72
79
|
|
|
73
|
-
describe('
|
|
80
|
+
describe('Library', () => {
|
|
74
81
|
describe('sync handling', () => {
|
|
75
82
|
it('should initialize a new library from a replica', async () => {
|
|
76
|
-
const sender = {
|
|
83
|
+
const sender: MessageSender = {
|
|
77
84
|
broadcast: vi.fn(),
|
|
78
|
-
|
|
85
|
+
respond: vi.fn((_: string, message: ServerMessage) => {}),
|
|
79
86
|
};
|
|
80
87
|
|
|
81
88
|
const tokenInfo: TokenInfo = {
|
|
@@ -86,8 +93,8 @@ describe('ServerLibrary', () => {
|
|
|
86
93
|
userId: 'user-1',
|
|
87
94
|
};
|
|
88
95
|
|
|
89
|
-
const library = new
|
|
90
|
-
...baseOptions(),
|
|
96
|
+
const library = new Library({
|
|
97
|
+
...(await baseOptions()),
|
|
91
98
|
sender,
|
|
92
99
|
});
|
|
93
100
|
|
|
@@ -135,12 +142,11 @@ describe('ServerLibrary', () => {
|
|
|
135
142
|
|
|
136
143
|
// purposefully do not await in order - these all come at the same time
|
|
137
144
|
await Promise.all(
|
|
138
|
-
messages.map((m) => library.
|
|
145
|
+
messages.map((m) => library.handleMessage(m, 'clientKey-1', tokenInfo)),
|
|
139
146
|
);
|
|
140
147
|
|
|
141
148
|
// expect sender.broadcast for the operations, and a reply with sync response
|
|
142
149
|
expect(sender.broadcast).toHaveBeenCalledWith(
|
|
143
|
-
'library-1',
|
|
144
150
|
{
|
|
145
151
|
type: 'op-re',
|
|
146
152
|
baselines: [
|
|
@@ -181,7 +187,7 @@ describe('ServerLibrary', () => {
|
|
|
181
187
|
['clientKey-1'],
|
|
182
188
|
);
|
|
183
189
|
|
|
184
|
-
expect(sender.
|
|
190
|
+
expect(sender.respond).toHaveBeenCalledWith('clientKey-1', {
|
|
185
191
|
type: 'sync-resp',
|
|
186
192
|
operations: [],
|
|
187
193
|
baselines: [],
|
|
@@ -201,22 +207,14 @@ describe('ServerLibrary', () => {
|
|
|
201
207
|
const replicas = [replicaA, replicaB];
|
|
202
208
|
|
|
203
209
|
const sender: MessageSender = {
|
|
204
|
-
broadcast: (
|
|
205
|
-
libraryId: string,
|
|
206
|
-
message: ServerMessage,
|
|
207
|
-
omitKeys?: string[],
|
|
208
|
-
) => {
|
|
210
|
+
broadcast: (message: ServerMessage, omitKeys?: string[]) => {
|
|
209
211
|
replicas.forEach((replica) => {
|
|
210
212
|
if (!omitKeys?.includes(replica.key)) {
|
|
211
213
|
replica.messages.push(message);
|
|
212
214
|
}
|
|
213
215
|
});
|
|
214
216
|
},
|
|
215
|
-
|
|
216
|
-
libraryId: string,
|
|
217
|
-
clientKey: string,
|
|
218
|
-
message: ServerMessage,
|
|
219
|
-
) => {
|
|
217
|
+
respond: (clientKey: string, message: ServerMessage) => {
|
|
220
218
|
const replica = replicas.find((r) => r.key === clientKey);
|
|
221
219
|
if (replica) {
|
|
222
220
|
replica.messages.push(message);
|
|
@@ -224,8 +222,8 @@ describe('ServerLibrary', () => {
|
|
|
224
222
|
},
|
|
225
223
|
};
|
|
226
224
|
|
|
227
|
-
const library = new
|
|
228
|
-
...baseOptions(),
|
|
225
|
+
const library = new Library({
|
|
226
|
+
...(await baseOptions()),
|
|
229
227
|
sender,
|
|
230
228
|
});
|
|
231
229
|
|
|
@@ -258,7 +256,11 @@ describe('ServerLibrary', () => {
|
|
|
258
256
|
since: null,
|
|
259
257
|
timestamp: now(),
|
|
260
258
|
};
|
|
261
|
-
await library.
|
|
259
|
+
await library.handleMessage(
|
|
260
|
+
syncMessageA,
|
|
261
|
+
replicaA.key,
|
|
262
|
+
replicaA.tokenInfo,
|
|
263
|
+
);
|
|
262
264
|
|
|
263
265
|
// concurrently, replica B syncs, and A sends more operations
|
|
264
266
|
const syncMessageB: ClientMessage = {
|
|
@@ -288,8 +290,8 @@ describe('ServerLibrary', () => {
|
|
|
288
290
|
timestamp: now(),
|
|
289
291
|
};
|
|
290
292
|
await Promise.all([
|
|
291
|
-
library.
|
|
292
|
-
library.
|
|
293
|
+
library.handleMessage(syncMessageB, replicaB.key, replicaB.tokenInfo),
|
|
294
|
+
library.handleMessage(opMessageA, replicaA.key, replicaA.tokenInfo),
|
|
293
295
|
]);
|
|
294
296
|
|
|
295
297
|
// there are two valid scenario outcomes here:
|
|
@@ -323,7 +325,7 @@ describe('ServerLibrary', () => {
|
|
|
323
325
|
it('should reject syncs with data from read replicas', async () => {
|
|
324
326
|
const sender = {
|
|
325
327
|
broadcast: vi.fn(),
|
|
326
|
-
|
|
328
|
+
respond: vi.fn(),
|
|
327
329
|
};
|
|
328
330
|
|
|
329
331
|
const tokenInfo: TokenInfo = {
|
|
@@ -334,8 +336,8 @@ describe('ServerLibrary', () => {
|
|
|
334
336
|
userId: 'user-1',
|
|
335
337
|
};
|
|
336
338
|
|
|
337
|
-
const library = new
|
|
338
|
-
...baseOptions(),
|
|
339
|
+
const library = new Library({
|
|
340
|
+
...(await baseOptions()),
|
|
339
341
|
sender,
|
|
340
342
|
});
|
|
341
343
|
|
|
@@ -383,11 +385,11 @@ describe('ServerLibrary', () => {
|
|
|
383
385
|
|
|
384
386
|
// purposefully do not await in order - these all come at the same time
|
|
385
387
|
await Promise.all(
|
|
386
|
-
messages.map((m) => library.
|
|
388
|
+
messages.map((m) => library.handleMessage(m, 'clientKey-1', tokenInfo)),
|
|
387
389
|
);
|
|
388
390
|
|
|
389
|
-
expect(sender.
|
|
390
|
-
expect(sender.
|
|
391
|
+
expect(sender.respond).toHaveBeenCalledOnce();
|
|
392
|
+
expect(sender.respond).toHaveBeenCalledWith('clientKey-1', {
|
|
391
393
|
type: 'forbidden',
|
|
392
394
|
});
|
|
393
395
|
});
|
|
@@ -395,7 +397,7 @@ describe('ServerLibrary', () => {
|
|
|
395
397
|
it('should reject messages from a replica claimed by a user other than the one recorded on the server', async () => {
|
|
396
398
|
const sender = {
|
|
397
399
|
broadcast: vi.fn(),
|
|
398
|
-
|
|
400
|
+
respond: vi.fn((_: string, message: ServerMessage) => {}),
|
|
399
401
|
};
|
|
400
402
|
|
|
401
403
|
const tokenInfo: TokenInfo = {
|
|
@@ -406,13 +408,13 @@ describe('ServerLibrary', () => {
|
|
|
406
408
|
userId: 'user-1',
|
|
407
409
|
};
|
|
408
410
|
|
|
409
|
-
const library = new
|
|
410
|
-
...baseOptions(),
|
|
411
|
+
const library = new Library({
|
|
412
|
+
...(await baseOptions()),
|
|
411
413
|
sender,
|
|
412
414
|
});
|
|
413
415
|
|
|
414
416
|
// purposefully do not await in order - these all come at the same time
|
|
415
|
-
await library.
|
|
417
|
+
await library.handleMessage(
|
|
416
418
|
{
|
|
417
419
|
type: 'sync',
|
|
418
420
|
baselines: [],
|
|
@@ -425,7 +427,7 @@ describe('ServerLibrary', () => {
|
|
|
425
427
|
'clientKey-1',
|
|
426
428
|
tokenInfo,
|
|
427
429
|
);
|
|
428
|
-
sender.
|
|
430
|
+
sender.respond.mockReset();
|
|
429
431
|
|
|
430
432
|
// now try to send a message from a different user with the same replica
|
|
431
433
|
const tokenInfo2: TokenInfo = {
|
|
@@ -446,10 +448,10 @@ describe('ServerLibrary', () => {
|
|
|
446
448
|
timestamp: now(),
|
|
447
449
|
};
|
|
448
450
|
|
|
449
|
-
await library.
|
|
451
|
+
await library.handleMessage(message, 'clientKey-1', tokenInfo2);
|
|
450
452
|
|
|
451
|
-
expect(sender.
|
|
452
|
-
expect(sender.
|
|
453
|
+
expect(sender.respond).toHaveBeenCalledOnce();
|
|
454
|
+
expect(sender.respond).toHaveBeenCalledWith('clientKey-1', {
|
|
453
455
|
type: 'forbidden',
|
|
454
456
|
});
|
|
455
457
|
});
|