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