@fluid-internal/presence-runtime 2.102.0 → 2.103.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.
Files changed (85) hide show
  1. package/dist/packageVersion.d.ts +1 -1
  2. package/dist/packageVersion.js +1 -1
  3. package/dist/packageVersion.js.map +1 -1
  4. package/dist/runtime/extension/containerPresence.d.ts +1 -1
  5. package/dist/runtime/presenceDatastoreManager.d.ts +2 -2
  6. package/dist/runtime/presenceDatastoreManager.d.ts.map +1 -1
  7. package/dist/runtime/presenceDatastoreManager.js.map +1 -1
  8. package/dist/runtime/presenceManager.js.map +1 -1
  9. package/lib/packageVersion.d.ts +1 -1
  10. package/lib/packageVersion.js +1 -1
  11. package/lib/packageVersion.js.map +1 -1
  12. package/lib/runtime/extension/containerPresence.d.ts +1 -1
  13. package/lib/runtime/presenceDatastoreManager.d.ts +2 -2
  14. package/lib/runtime/presenceDatastoreManager.d.ts.map +1 -1
  15. package/lib/runtime/presenceDatastoreManager.js.map +1 -1
  16. package/lib/runtime/presenceManager.js.map +1 -1
  17. package/package.json +14 -14
  18. package/dist/runtime/test/presenceDatastoreManager.spec.js +0 -618
  19. package/dist/runtime/test/presenceDatastoreManager.spec.js.map +0 -1
  20. package/dist/runtime/test/presenceManager.spec.js +0 -651
  21. package/dist/runtime/test/presenceManager.spec.js.map +0 -1
  22. package/dist/states/test/batching.spec.js +0 -843
  23. package/dist/states/test/batching.spec.js.map +0 -1
  24. package/dist/states/test/broadcastControlsTests.js +0 -60
  25. package/dist/states/test/broadcastControlsTests.js.map +0 -1
  26. package/dist/states/test/eventing.spec.js +0 -576
  27. package/dist/states/test/eventing.spec.js.map +0 -1
  28. package/dist/states/test/latestMapValueManager.spec.js +0 -210
  29. package/dist/states/test/latestMapValueManager.spec.js.map +0 -1
  30. package/dist/states/test/latestValueManager.spec.js +0 -193
  31. package/dist/states/test/latestValueManager.spec.js.map +0 -1
  32. package/dist/states/test/mockEphemeralRuntime.js +0 -11
  33. package/dist/states/test/mockEphemeralRuntime.js.map +0 -1
  34. package/dist/states/test/notificationsManager.spec.js +0 -460
  35. package/dist/states/test/notificationsManager.spec.js.map +0 -1
  36. package/dist/states/test/presenceStates.spec.js +0 -73
  37. package/dist/states/test/presenceStates.spec.js.map +0 -1
  38. package/dist/states/test/schemaValidation/protocol.spec.js +0 -246
  39. package/dist/states/test/schemaValidation/protocol.spec.js.map +0 -1
  40. package/dist/states/test/schemaValidation/valueManagers.spec.js +0 -784
  41. package/dist/states/test/schemaValidation/valueManagers.spec.js.map +0 -1
  42. package/dist/states/test/testUtils.js +0 -21
  43. package/dist/states/test/testUtils.js.map +0 -1
  44. package/dist/test/mockEphemeralRuntime.js +0 -175
  45. package/dist/test/mockEphemeralRuntime.js.map +0 -1
  46. package/dist/test/testUtils.js +0 -262
  47. package/dist/test/testUtils.js.map +0 -1
  48. package/dist/test/utils/index.js +0 -27
  49. package/dist/test/utils/index.js.map +0 -1
  50. package/dist/utils/test/timerManager.spec.js +0 -93
  51. package/dist/utils/test/timerManager.spec.js.map +0 -1
  52. package/lib/runtime/test/presenceDatastoreManager.spec.js +0 -616
  53. package/lib/runtime/test/presenceDatastoreManager.spec.js.map +0 -1
  54. package/lib/runtime/test/presenceManager.spec.js +0 -649
  55. package/lib/runtime/test/presenceManager.spec.js.map +0 -1
  56. package/lib/states/test/batching.spec.js +0 -841
  57. package/lib/states/test/batching.spec.js.map +0 -1
  58. package/lib/states/test/broadcastControlsTests.js +0 -56
  59. package/lib/states/test/broadcastControlsTests.js.map +0 -1
  60. package/lib/states/test/eventing.spec.js +0 -574
  61. package/lib/states/test/eventing.spec.js.map +0 -1
  62. package/lib/states/test/latestMapValueManager.spec.js +0 -206
  63. package/lib/states/test/latestMapValueManager.spec.js.map +0 -1
  64. package/lib/states/test/latestValueManager.spec.js +0 -189
  65. package/lib/states/test/latestValueManager.spec.js.map +0 -1
  66. package/lib/states/test/mockEphemeralRuntime.js +0 -6
  67. package/lib/states/test/mockEphemeralRuntime.js.map +0 -1
  68. package/lib/states/test/notificationsManager.spec.js +0 -456
  69. package/lib/states/test/notificationsManager.spec.js.map +0 -1
  70. package/lib/states/test/presenceStates.spec.js +0 -69
  71. package/lib/states/test/presenceStates.spec.js.map +0 -1
  72. package/lib/states/test/schemaValidation/protocol.spec.js +0 -244
  73. package/lib/states/test/schemaValidation/protocol.spec.js.map +0 -1
  74. package/lib/states/test/schemaValidation/valueManagers.spec.js +0 -782
  75. package/lib/states/test/schemaValidation/valueManagers.spec.js.map +0 -1
  76. package/lib/states/test/testUtils.js +0 -6
  77. package/lib/states/test/testUtils.js.map +0 -1
  78. package/lib/test/mockEphemeralRuntime.js +0 -171
  79. package/lib/test/mockEphemeralRuntime.js.map +0 -1
  80. package/lib/test/testUtils.js +0 -251
  81. package/lib/test/testUtils.js.map +0 -1
  82. package/lib/test/utils/index.js +0 -8
  83. package/lib/test/utils/index.js.map +0 -1
  84. package/lib/utils/test/timerManager.spec.js +0 -91
  85. package/lib/utils/test/timerManager.spec.js.map +0 -1
@@ -1,574 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "node:assert";
6
- import { EventAndErrorTrackingLogger } from "@fluidframework/test-utils/internal";
7
- import { useFakeTimers, spy } from "sinon";
8
- import { Notifications, StateFactory } from "@fluid-internal/presence-runtime/states";
9
- import { toOpaqueJson } from "@fluid-internal/presence-runtime/utils";
10
- import { MockEphemeralRuntime } from "./mockEphemeralRuntime.js";
11
- import { assertFinalExpectations, prepareConnectedPresence, attendeeId1, localAttendeeId, initialLocalClientConnectionId, } from "./testUtils.js";
12
- const datastoreUpdateType = "Pres:DatastoreUpdate";
13
- /**
14
- * Workspace updates
15
- */
16
- const attendeeUpdate = {
17
- "clientToSessionId": {
18
- "client1": {
19
- "rev": 0,
20
- "timestamp": 0,
21
- "value": attendeeId1,
22
- },
23
- },
24
- };
25
- const latestUpdate = {
26
- "latest": {
27
- [attendeeId1]: {
28
- "rev": 1,
29
- "timestamp": 0,
30
- "value": toOpaqueJson({ x: 1, y: 1, z: 1 }),
31
- },
32
- },
33
- };
34
- const latestMapUpdate = {
35
- "latestMap": {
36
- [attendeeId1]: {
37
- "rev": 1,
38
- "items": {
39
- "key1": {
40
- "rev": 1,
41
- "timestamp": 0,
42
- "value": toOpaqueJson({ a: 1, b: 1 }),
43
- },
44
- "key2": {
45
- "rev": 1,
46
- "timestamp": 0,
47
- "value": toOpaqueJson({ c: 1, d: 1 }),
48
- },
49
- },
50
- },
51
- },
52
- };
53
- const latestUpdateRev2 = {
54
- "latest": {
55
- [attendeeId1]: {
56
- "rev": 2,
57
- "timestamp": 50,
58
- "value": toOpaqueJson({ x: 2, y: 2, z: 2 }),
59
- },
60
- },
61
- };
62
- const itemRemovedMapUpdate = {
63
- "latestMap": {
64
- [attendeeId1]: {
65
- "rev": 2,
66
- "items": {
67
- "key2": {
68
- "rev": 2,
69
- "timestamp": 50,
70
- },
71
- },
72
- },
73
- },
74
- };
75
- const itemRemovedAndItemUpdatedMapUpdate = {
76
- "latestMap": {
77
- [attendeeId1]: {
78
- "rev": 2,
79
- "items": {
80
- "key2": {
81
- "rev": 2,
82
- "timestamp": 50,
83
- },
84
- "key1": {
85
- "rev": 2,
86
- "timestamp": 50,
87
- "value": toOpaqueJson({ a: 2, b: 2 }),
88
- },
89
- },
90
- },
91
- },
92
- };
93
- const itemUpdatedAndItemRemovedMapUpdate = {
94
- "latestMap": {
95
- [attendeeId1]: {
96
- "rev": 2,
97
- "items": {
98
- "key1": {
99
- "rev": 2,
100
- "timestamp": 50,
101
- "value": toOpaqueJson({ a: 2, b: 2 }),
102
- },
103
- "key2": {
104
- "rev": 2,
105
- "timestamp": 50,
106
- },
107
- },
108
- },
109
- },
110
- };
111
- const notificationsUpdate = {
112
- "testEvents": {
113
- [attendeeId1]: {
114
- "rev": 0,
115
- "timestamp": 0,
116
- "value": toOpaqueJson({ "name": "newId", "args": [42] }),
117
- "ignoreUnmonitored": true,
118
- },
119
- },
120
- };
121
- describe("Presence/States", () => {
122
- describe("events are fired with consistent and final state when", () => {
123
- let runtime;
124
- let logger;
125
- let clock;
126
- let presence;
127
- let processSignal;
128
- let latest;
129
- let latestMap;
130
- let notificationManager;
131
- function verifyState(attendee, verifications) {
132
- assert(attendee !== undefined, "Eventing does not reflect new attendee");
133
- assert.strictEqual(attendee.attendeeId, "attendeeId-1", "Eventing does not reflect new attendee's attendeeId");
134
- assert.strictEqual(attendee.getConnectionId(), "client1", "Eventing does not reflect new attendee's connection id");
135
- for (const { manager, expectedValue } of verifications) {
136
- switch (manager) {
137
- case "latest": {
138
- assert.deepEqual(latest.getRemote(attendee).value, expectedValue, "Eventing does not reflect latest value");
139
- break;
140
- }
141
- case "latestMap": {
142
- assert.deepEqual(latestMap.getRemote(attendee).get("key1")?.value, expectedValue.key1, "Eventing does not reflect latest map value");
143
- assert.deepEqual(latestMap.getRemote(attendee).get("key2")?.value, expectedValue.key2, "Eventing does not reflect latest map value");
144
- break;
145
- }
146
- default: {
147
- break;
148
- }
149
- }
150
- }
151
- }
152
- before(() => {
153
- clock = useFakeTimers();
154
- });
155
- beforeEach(() => {
156
- logger = new EventAndErrorTrackingLogger();
157
- runtime = new MockEphemeralRuntime(logger);
158
- ({ presence, processSignal } = prepareConnectedPresence(runtime, localAttendeeId, initialLocalClientConnectionId, clock, logger));
159
- });
160
- afterEach(function (done) {
161
- clock.reset();
162
- if (this.currentTest?.state === "passed") {
163
- assertFinalExpectations(runtime, logger);
164
- }
165
- done();
166
- });
167
- after(() => {
168
- clock.restore();
169
- });
170
- function setupSharedStatesWorkspace({ notifications, } = {}) {
171
- const statesWorkspace = presence.states.getWorkspace("name:testWorkspace", {
172
- latest: StateFactory.latest({ local: { x: 0, y: 0, z: 0 } }),
173
- latestMap: StateFactory.latestMap({
174
- local: { key1: { a: 0, b: 0 }, key2: { c: 0, d: 0 } },
175
- }),
176
- });
177
- latest = statesWorkspace.states.latest;
178
- latestMap = statesWorkspace.states.latestMap;
179
- if (notifications) {
180
- const workspace = statesWorkspace;
181
- workspace.add("testEvents", Notifications({
182
- newId: (_attendee, _id) => { },
183
- }));
184
- notificationManager = workspace.states.testEvents;
185
- }
186
- }
187
- function setupMultipleStatesWorkspaces() {
188
- const latestsStates = presence.states.getWorkspace("name:testWorkspace1", {
189
- latest: StateFactory.latest({ local: { x: 0, y: 0, z: 0 } }),
190
- });
191
- const latesetMapStates = presence.states.getWorkspace("name:testWorkspace2", {
192
- latestMap: StateFactory.latestMap({
193
- local: { key1: { a: 0, b: 0 }, key2: { c: 0, d: 0 } },
194
- }),
195
- });
196
- latest = latestsStates.states.latest;
197
- latestMap = latesetMapStates.states.latestMap;
198
- }
199
- function setupNotificationsWorkspace() {
200
- const notificationsWorkspace = presence.notifications.getWorkspace("name:testWorkspace", {
201
- testEvents: Notifications({
202
- newId: (_attendee, _id) => { },
203
- }),
204
- });
205
- notificationManager = notificationsWorkspace.notifications.testEvents;
206
- }
207
- function processUpdates(valueManagerUpdates) {
208
- const updates = { "system:presence": attendeeUpdate, ...valueManagerUpdates };
209
- processSignal([], {
210
- type: datastoreUpdateType,
211
- content: {
212
- sendTimestamp: clock.now - 10,
213
- avgLatency: 20,
214
- data: updates,
215
- },
216
- clientId: "client1",
217
- }, false);
218
- }
219
- function getTestAttendee() {
220
- return presence.attendees.getAttendee("attendeeId-1");
221
- }
222
- describe("states workspace", () => {
223
- let latestUpdatedEventSpy;
224
- let latestMapUpdatedEventSpy;
225
- let itemUpdatedEventSpy;
226
- describe("value is updated where", () => {
227
- let atteendeeEventSpy;
228
- function verify() {
229
- verifyState(getTestAttendee(), [
230
- { manager: "latest", expectedValue: { x: 1, y: 1, z: 1 } },
231
- {
232
- manager: "latestMap",
233
- expectedValue: { key1: { a: 1, b: 1 }, key2: { c: 1, d: 1 } },
234
- },
235
- ]);
236
- }
237
- function assertSpies() {
238
- assert.ok(atteendeeEventSpy.calledOnce, "attendee event not fired exactly once");
239
- assert.ok(latestUpdatedEventSpy.calledOnce, "latest update event not fired exactly once");
240
- assert.ok(latestMapUpdatedEventSpy.calledOnce, "latestMap update event not fired exactly once");
241
- assert.ok(itemUpdatedEventSpy.calledTwice, "latestMap item update event not fired exactly twice");
242
- }
243
- function setupSpiesAndListeners() {
244
- latestUpdatedEventSpy = spy(verify);
245
- latestMapUpdatedEventSpy = spy(verify);
246
- itemUpdatedEventSpy = spy(verify);
247
- atteendeeEventSpy = spy(verify);
248
- latest.events.on("remoteUpdated", latestUpdatedEventSpy);
249
- latestMap.events.on("remoteUpdated", latestMapUpdatedEventSpy);
250
- latestMap.events.on("remoteItemUpdated", itemUpdatedEventSpy);
251
- presence.attendees.events.on("attendeeConnected", atteendeeEventSpy);
252
- }
253
- it("'latest' update comes before 'latestMap' update in single workspace", async () => {
254
- // Setup
255
- setupSharedStatesWorkspace();
256
- setupSpiesAndListeners();
257
- const workspace = {
258
- "s:name:testWorkspace": { ...latestUpdate, ...latestMapUpdate },
259
- };
260
- // Act
261
- processUpdates(workspace);
262
- // Verify
263
- assertSpies();
264
- });
265
- it("'latestMap' update comes before 'latest' update in single workspace", async () => {
266
- // Setup
267
- setupSharedStatesWorkspace();
268
- setupSpiesAndListeners();
269
- const workspace = {
270
- "s:name:testWorkspace": { ...latestMapUpdate, ...latestUpdate },
271
- };
272
- // Act
273
- processUpdates(workspace);
274
- // Verify
275
- assertSpies();
276
- });
277
- it("workspace 1 update comes before workspace 2 update in multiple workspaces", async () => {
278
- // Setup
279
- setupMultipleStatesWorkspaces();
280
- setupSpiesAndListeners();
281
- const workspace = {
282
- "s:name:testWorkspace1": latestUpdate,
283
- "s:name:testWorkspace2": latestMapUpdate,
284
- };
285
- // Act
286
- processUpdates(workspace);
287
- // Verify
288
- assertSpies();
289
- });
290
- it("workspace 2 update comes before workspace 1 update in multiple workspaces", async () => {
291
- // Setup
292
- setupMultipleStatesWorkspaces();
293
- setupSpiesAndListeners();
294
- const workspace = {
295
- "s:name:testWorkspace2": latestMapUpdate,
296
- "s:name:testWorkspace1": latestUpdate,
297
- };
298
- // Act
299
- processUpdates(workspace);
300
- // Verify
301
- assertSpies();
302
- });
303
- });
304
- describe("map item is removed", () => {
305
- let itemRemovedEventSpy;
306
- describe("and 'latest' value updated", () => {
307
- function verify() {
308
- verifyState(getTestAttendee(), [
309
- { manager: "latest", expectedValue: { x: 2, y: 2, z: 2 } },
310
- {
311
- manager: "latestMap",
312
- expectedValue: { key1: { a: 1, b: 1 }, key2: undefined },
313
- },
314
- ]);
315
- }
316
- function setupSpiesAndListeners() {
317
- itemRemovedEventSpy = spy(verify);
318
- latestUpdatedEventSpy = spy(verify);
319
- latestMapUpdatedEventSpy = spy(verify);
320
- latest.events.on("remoteUpdated", latestUpdatedEventSpy);
321
- latestMap.events.on("remoteUpdated", latestMapUpdatedEventSpy);
322
- latestMap.events.on("remoteItemRemoved", itemRemovedEventSpy);
323
- }
324
- function assertSpies() {
325
- assert.ok(latestUpdatedEventSpy.calledOnce, `latest update event not fired exactly once`);
326
- assert.ok(latestMapUpdatedEventSpy.calledOnce, "latestMap update event not fired exactly once");
327
- assert.ok(itemRemovedEventSpy.calledOnce, "latestMap item remove event not fired exactly once");
328
- }
329
- it("in a single workspace", async () => {
330
- // Setup
331
- setupSharedStatesWorkspace();
332
- const workspace = {
333
- "s:name:testWorkspace": { ...latestMapUpdate, ...latestUpdate },
334
- };
335
- processUpdates(workspace);
336
- setupSpiesAndListeners();
337
- const itemRemovedUpdate = {
338
- "s:name:testWorkspace": { ...latestUpdateRev2, ...itemRemovedMapUpdate },
339
- };
340
- // Act
341
- processUpdates(itemRemovedUpdate);
342
- // Verify
343
- assertSpies();
344
- });
345
- it("in multiple workspaces", async () => {
346
- // Setup
347
- setupMultipleStatesWorkspaces();
348
- const workspace = {
349
- "s:name:testWorkspace2": latestMapUpdate,
350
- "s:name:testWorkspace1": latestUpdate,
351
- };
352
- processUpdates(workspace);
353
- setupSpiesAndListeners();
354
- const itemRemovedUpdate = {
355
- "s:name:testWorkspace1": latestUpdateRev2,
356
- "s:name:testWorkspace2": itemRemovedMapUpdate,
357
- };
358
- // Act
359
- processUpdates(itemRemovedUpdate);
360
- // Verify
361
- assertSpies();
362
- });
363
- });
364
- describe("and map item is updated", () => {
365
- function verify() {
366
- verifyState(getTestAttendee(), [
367
- {
368
- manager: "latestMap",
369
- expectedValue: { key1: { a: 2, b: 2 }, key2: undefined },
370
- },
371
- ]);
372
- }
373
- function setupSpiesAndListeners() {
374
- itemRemovedEventSpy = spy(verify);
375
- latestMapUpdatedEventSpy = spy(verify);
376
- itemUpdatedEventSpy = spy(verify);
377
- latestMap.events.on("remoteUpdated", latestMapUpdatedEventSpy);
378
- latestMap.events.on("remoteItemUpdated", itemUpdatedEventSpy);
379
- latestMap.events.on("remoteItemRemoved", itemRemovedEventSpy);
380
- }
381
- function assertSpies() {
382
- assert.ok(itemUpdatedEventSpy.calledOnce, `latest update event not fired exactly once`);
383
- assert.ok(latestMapUpdatedEventSpy.calledOnce, "latestMap update event not fired exactly once");
384
- assert.ok(itemRemovedEventSpy.calledOnce, "latestMap item remove event not fired exactly once");
385
- }
386
- it("with removal first", () => {
387
- // Setup
388
- setupSharedStatesWorkspace();
389
- const workspace = {
390
- "s:name:testWorkspace": latestMapUpdate,
391
- };
392
- processUpdates(workspace);
393
- setupSpiesAndListeners();
394
- const itemRemovedAndItemUpdatedUpdate = {
395
- "s:name:testWorkspace": itemRemovedAndItemUpdatedMapUpdate,
396
- };
397
- // Act
398
- processUpdates(itemRemovedAndItemUpdatedUpdate);
399
- // Verify
400
- assertSpies();
401
- });
402
- it("with update first", () => {
403
- // Setup
404
- setupSharedStatesWorkspace();
405
- const workspace = {
406
- "s:name:testWorkspace": latestMapUpdate,
407
- };
408
- processUpdates(workspace);
409
- setupSpiesAndListeners();
410
- const itemUpdatedAndItemRemovedUpdate = {
411
- "s:name:testWorkspace": itemUpdatedAndItemRemovedMapUpdate,
412
- };
413
- // Act
414
- processUpdates(itemUpdatedAndItemRemovedUpdate);
415
- // Verify
416
- assertSpies();
417
- });
418
- });
419
- });
420
- });
421
- describe("Notifications update", () => {
422
- let notificationSpy;
423
- let latestSpy;
424
- let attendeeSpy;
425
- let latestMapSpy;
426
- function verify() {
427
- verifyState(getTestAttendee(), [
428
- { manager: "latest", expectedValue: { x: 1, y: 1, z: 1 } },
429
- {
430
- manager: "latestMap",
431
- expectedValue: { key1: { a: 1, b: 1 }, key2: { c: 1, d: 1 } },
432
- },
433
- ]);
434
- }
435
- function setupSpiesAndListeners() {
436
- notificationSpy = spy(verify);
437
- latestSpy = spy(verify);
438
- attendeeSpy = spy(verify);
439
- latestMapSpy = spy(verify);
440
- notificationManager.notifications.on("newId", notificationSpy);
441
- latest.events.on("remoteUpdated", latestSpy);
442
- latestMap.events.on("remoteUpdated", latestMapSpy);
443
- presence.attendees.events.on("attendeeConnected", attendeeSpy);
444
- }
445
- function assertSpies() {
446
- assert.ok(notificationSpy.calledOnce, "notification event not fired exactly once");
447
- assert.ok(latestMapSpy.calledOnce, "latestMap update event not fired exactly once");
448
- assert.ok(latestSpy.calledOnce, "latest update event not fired exactly once");
449
- assert.ok(attendeeSpy.calledOnce, "attendee event not fired exactly once");
450
- }
451
- it("comes before states workspace update", async () => {
452
- // Setup
453
- setupSharedStatesWorkspace();
454
- setupNotificationsWorkspace();
455
- setupSpiesAndListeners();
456
- const workspace = {
457
- "n:name:testWorkspace": notificationsUpdate,
458
- "s:name:testWorkspace": { ...latestUpdate, ...latestMapUpdate },
459
- };
460
- // Act
461
- processUpdates(workspace);
462
- // Verify
463
- assertSpies();
464
- });
465
- it("comes after states workspace update", async () => {
466
- // Setup
467
- setupSharedStatesWorkspace();
468
- setupNotificationsWorkspace();
469
- setupSpiesAndListeners();
470
- const workspace = {
471
- "s:name:testWorkspace": { ...latestUpdate, ...latestMapUpdate },
472
- "n:name:testWorkspace": notificationsUpdate,
473
- };
474
- // Act
475
- processUpdates(workspace);
476
- // Verify
477
- assertSpies();
478
- });
479
- it("comes in between states workspaces", async () => {
480
- // Setup
481
- setupMultipleStatesWorkspaces();
482
- setupNotificationsWorkspace();
483
- setupSpiesAndListeners();
484
- const workspace = {
485
- "s:name:testWorkspace1": latestUpdate,
486
- "n:name:testWorkspace": notificationsUpdate,
487
- "s:name:testWorkspace2": latestMapUpdate,
488
- };
489
- // Act
490
- processUpdates(workspace);
491
- // Verify
492
- assertSpies();
493
- });
494
- it("within a states workspace", async () => {
495
- // Setup
496
- setupSharedStatesWorkspace({ notifications: true });
497
- setupSpiesAndListeners();
498
- const workspace = {
499
- "s:name:testWorkspace": {
500
- ...latestUpdate,
501
- ...notificationsUpdate,
502
- ...latestMapUpdate,
503
- },
504
- };
505
- // Act
506
- processUpdates(workspace);
507
- // Verify
508
- assertSpies();
509
- });
510
- it("from unregistered workspace triggers 'workspaceActivated' event", async () => {
511
- // Setup
512
- notificationSpy = spy();
513
- const workspaceActivatedEventSpy = spy((workspaceAddress) => {
514
- // Once activated, register the notifications workspace and listener for it's event
515
- const notificationsWorkspace = presence.notifications.getWorkspace(workspaceAddress, {
516
- testEvents: Notifications({
517
- newId: (_attendee, _id) => { },
518
- }),
519
- });
520
- notificationsWorkspace.notifications.testEvents.notifications.on("newId", notificationSpy);
521
- });
522
- presence.events.on("workspaceActivated", (workspaceAddress, type) => {
523
- if (workspaceAddress === "name:testWorkspace" && type === "Notifications") {
524
- workspaceActivatedEventSpy(workspaceAddress);
525
- }
526
- });
527
- const workspace = {
528
- "n:name:testWorkspace": notificationsUpdate,
529
- };
530
- // Act
531
- processUpdates(workspace);
532
- // Verify
533
- assert.ok(workspaceActivatedEventSpy.calledOnce, "workspace activated event not fired");
534
- assert.ok(notificationSpy.calledOnce, `notification event not fired exactly once ${notificationSpy.callCount}`);
535
- });
536
- it("from an unregistered workspace arrives with state updates", async () => {
537
- setupMultipleStatesWorkspaces();
538
- const initialWorkspaceUpdate = {
539
- "s:name:testWorkspace1": latestUpdate,
540
- "s:name:testWorkspace2": latestMapUpdate,
541
- };
542
- const secondWorkspaceUpdate = {
543
- "s:name:testWorkspace1": latestUpdateRev2,
544
- "n:name:testWorkspace": notificationsUpdate,
545
- "s:name:testWorkspace2": itemUpdatedAndItemRemovedMapUpdate,
546
- };
547
- presence.events.on("workspaceActivated", (_, type) => {
548
- if (type === "Notifications") {
549
- // Verify initial state maintains consistency
550
- verifyState(getTestAttendee(), [
551
- { manager: "latest", expectedValue: { x: 1, y: 1, z: 1 } },
552
- {
553
- manager: "latestMap",
554
- expectedValue: { key1: { a: 1, b: 1 }, key2: { c: 1, d: 1 } },
555
- },
556
- ]);
557
- }
558
- });
559
- // Act
560
- processUpdates(initialWorkspaceUpdate);
561
- processUpdates(secondWorkspaceUpdate);
562
- // Verify
563
- verifyState(getTestAttendee(), [
564
- { manager: "latest", expectedValue: { x: 2, y: 2, z: 2 } },
565
- {
566
- manager: "latestMap",
567
- expectedValue: { key1: { a: 2, b: 2 }, key2: undefined },
568
- },
569
- ]);
570
- });
571
- });
572
- });
573
- });
574
- //# sourceMappingURL=eventing.spec.js.map