@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,843 +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 mocha_1 = require("mocha");
10
- const sinon_1 = require("sinon");
11
- const states_1 = require("@fluid-internal/presence-runtime/states");
12
- const utils_1 = require("@fluid-internal/presence-runtime/utils");
13
- const mockEphemeralRuntime_js_1 = require("./mockEphemeralRuntime.js");
14
- const testUtils_js_1 = require("./testUtils.js");
15
- (0, mocha_1.describe)("Presence/States", () => {
16
- (0, mocha_1.describe)("batching", () => {
17
- let runtime;
18
- let logger;
19
- const initialTime = 500;
20
- const testStartTime = 1010;
21
- let clock;
22
- let presence;
23
- (0, mocha_1.before)(async () => {
24
- clock = (0, sinon_1.useFakeTimers)();
25
- });
26
- (0, mocha_1.beforeEach)(() => {
27
- logger = new internal_1.EventAndErrorTrackingLogger();
28
- runtime = new mockEphemeralRuntime_js_1.MockEphemeralRuntime(logger);
29
- clock.setSystemTime(initialTime);
30
- // Set up the presence connection.
31
- presence = (0, testUtils_js_1.prepareConnectedPresence)(runtime, testUtils_js_1.localAttendeeId, testUtils_js_1.initialLocalClientConnectionId, clock, logger).presence;
32
- // Note that while the initialTime was set to 500, the prepareConnectedPresence call advances
33
- // it. Set a consistent start time for all tests.
34
- const deltaToStart = testStartTime - clock.now;
35
- (0, node_assert_1.strict)(deltaToStart >= 0);
36
- clock.tick(deltaToStart);
37
- });
38
- (0, mocha_1.afterEach)(() => {
39
- // Tick the clock forward by a large amount before resetting it
40
- // in case there are lingering queued signals or timers
41
- clock.tick(1000);
42
- clock.reset();
43
- });
44
- (0, mocha_1.after)(() => {
45
- clock.restore();
46
- });
47
- (0, mocha_1.describe)("Latest", () => {
48
- (0, mocha_1.it)("sends signal immediately when allowable latency is 0", async () => {
49
- runtime.signalsExpected.push([
50
- {
51
- type: "Pres:DatastoreUpdate",
52
- content: {
53
- "sendTimestamp": 1010,
54
- "avgLatency": 10,
55
- "data": {
56
- "system:presence": {
57
- "clientToSessionId": {
58
- [testUtils_js_1.initialLocalClientConnectionId]: {
59
- "rev": 0,
60
- "timestamp": initialTime,
61
- "value": testUtils_js_1.localAttendeeId,
62
- },
63
- },
64
- },
65
- "s:name:testStateWorkspace": {
66
- "count": {
67
- [testUtils_js_1.localAttendeeId]: {
68
- "rev": 0,
69
- "timestamp": 1010,
70
- "value": (0, utils_1.toOpaqueJson)({
71
- "num": 0,
72
- }),
73
- },
74
- },
75
- },
76
- },
77
- },
78
- },
79
- ], [
80
- {
81
- type: "Pres:DatastoreUpdate",
82
- content: {
83
- "sendTimestamp": 1020,
84
- "avgLatency": 10,
85
- "data": {
86
- "system:presence": {
87
- "clientToSessionId": {
88
- [testUtils_js_1.initialLocalClientConnectionId]: {
89
- "rev": 0,
90
- "timestamp": initialTime,
91
- "value": testUtils_js_1.localAttendeeId,
92
- },
93
- },
94
- },
95
- "s:name:testStateWorkspace": {
96
- "count": {
97
- [testUtils_js_1.localAttendeeId]: {
98
- "rev": 1,
99
- "timestamp": 1020,
100
- "value": (0, utils_1.toOpaqueJson)({
101
- "num": 42,
102
- }),
103
- },
104
- },
105
- },
106
- },
107
- },
108
- },
109
- ], [
110
- {
111
- type: "Pres:DatastoreUpdate",
112
- content: {
113
- "sendTimestamp": 1020,
114
- "avgLatency": 10,
115
- "data": {
116
- "system:presence": {
117
- "clientToSessionId": {
118
- [testUtils_js_1.initialLocalClientConnectionId]: {
119
- "rev": 0,
120
- "timestamp": initialTime,
121
- "value": testUtils_js_1.localAttendeeId,
122
- },
123
- },
124
- },
125
- "s:name:testStateWorkspace": {
126
- "count": {
127
- [testUtils_js_1.localAttendeeId]: {
128
- "rev": 2,
129
- "timestamp": 1020,
130
- "value": (0, utils_1.toOpaqueJson)({
131
- "num": 84,
132
- }),
133
- },
134
- },
135
- },
136
- },
137
- },
138
- },
139
- ]);
140
- // Configure a state workspace
141
- // SIGNAL #1 - intial data is sent immediately
142
- const stateWorkspace = presence.states.getWorkspace("name:testStateWorkspace", {
143
- count: states_1.StateFactory.latest({
144
- local: { num: 0 },
145
- settings: { allowableUpdateLatencyMs: 0 },
146
- }),
147
- });
148
- const { count } = stateWorkspace.states;
149
- clock.tick(10); // Time is now 1020
150
- // SIGNAL #2
151
- count.local = { num: 42 };
152
- // SIGNAL #3
153
- count.local = { num: 84 };
154
- (0, testUtils_js_1.assertFinalExpectations)(runtime, logger);
155
- });
156
- (0, mocha_1.it)("sets timer for default allowableUpdateLatencyMs", async () => {
157
- runtime.signalsExpected.push([
158
- {
159
- type: "Pres:DatastoreUpdate",
160
- content: {
161
- "sendTimestamp": 1070,
162
- "avgLatency": 10,
163
- "data": {
164
- "system:presence": {
165
- "clientToSessionId": {
166
- [testUtils_js_1.initialLocalClientConnectionId]: {
167
- "rev": 0,
168
- "timestamp": initialTime,
169
- "value": testUtils_js_1.localAttendeeId,
170
- },
171
- },
172
- },
173
- "s:name:testStateWorkspace": {
174
- "count": {
175
- [testUtils_js_1.localAttendeeId]: {
176
- "rev": 0,
177
- "timestamp": 1010,
178
- "value": (0, utils_1.toOpaqueJson)({
179
- "num": 0,
180
- }),
181
- },
182
- },
183
- },
184
- },
185
- },
186
- },
187
- ]);
188
- // Configure a state workspace
189
- presence.states.getWorkspace("name:testStateWorkspace", {
190
- count: states_1.StateFactory.latest({
191
- local: { num: 0 } /* default allowableUpdateLatencyMs = 60 */,
192
- }),
193
- }); // will be queued; deadline is now 1070
194
- // SIGNAL #1
195
- // The deadline timer will fire at time 1070 and send a single
196
- // signal with the value from the last signal (num=0).
197
- clock.tick(100); // Time is now 1110
198
- });
199
- (0, mocha_1.it)("batches signals sent within default allowableUpdateLatencyMs", async () => {
200
- runtime.signalsExpected.push([
201
- {
202
- type: "Pres:DatastoreUpdate",
203
- content: {
204
- "sendTimestamp": 1070,
205
- "avgLatency": 10,
206
- "data": {
207
- "system:presence": {
208
- "clientToSessionId": {
209
- [testUtils_js_1.initialLocalClientConnectionId]: {
210
- "rev": 0,
211
- "timestamp": initialTime,
212
- "value": testUtils_js_1.localAttendeeId,
213
- },
214
- },
215
- },
216
- "s:name:testStateWorkspace": {
217
- "count": {
218
- [testUtils_js_1.localAttendeeId]: {
219
- "rev": 3,
220
- "timestamp": 1060,
221
- "value": (0, utils_1.toOpaqueJson)({
222
- "num": 22,
223
- }),
224
- },
225
- },
226
- },
227
- },
228
- },
229
- },
230
- ], [
231
- {
232
- type: "Pres:DatastoreUpdate",
233
- content: {
234
- "sendTimestamp": 1150,
235
- "avgLatency": 10,
236
- "data": {
237
- "system:presence": {
238
- "clientToSessionId": {
239
- [testUtils_js_1.initialLocalClientConnectionId]: {
240
- "rev": 0,
241
- "timestamp": initialTime,
242
- "value": testUtils_js_1.localAttendeeId,
243
- },
244
- },
245
- },
246
- "s:name:testStateWorkspace": {
247
- "count": {
248
- [testUtils_js_1.localAttendeeId]: {
249
- "rev": 6,
250
- "timestamp": 1140,
251
- "value": (0, utils_1.toOpaqueJson)({
252
- "num": 90,
253
- }),
254
- },
255
- },
256
- },
257
- },
258
- },
259
- },
260
- ]);
261
- // Configure a state workspace
262
- const stateWorkspace = presence.states.getWorkspace("name:testStateWorkspace", {
263
- count: states_1.StateFactory.latest({
264
- local: { num: 0 } /* default allowableUpdateLatencyMs = 60 */,
265
- }),
266
- }); // will be queued; deadline is now 1070
267
- const { count } = stateWorkspace.states;
268
- clock.tick(10); // Time is now 1020
269
- count.local = { num: 12 }; // will be queued; deadline remains 1070
270
- clock.tick(10); // Time is now 1030
271
- count.local = { num: 34 }; // will be queued; deadline remains 1070
272
- clock.tick(30); // Time is now 1060
273
- count.local = { num: 22 }; // will be queued; deadline remains 1070
274
- // SIGNAL #1
275
- // The deadline timer will fire at time 1070 and send a single
276
- // signal with the value from the last signal (num=22).
277
- // It's necessary to tick the timer beyond the deadline so the timer will fire.
278
- clock.tick(20); // Time is now 1080
279
- clock.tick(10); // Time is now 1090
280
- count.local = { num: 56 }; // will be queued; deadline is set to 1150
281
- clock.tick(40); // Time is now 1130
282
- count.local = { num: 78 }; // will be queued; deadline remains 1150
283
- clock.tick(10); // Time is now 1140
284
- count.local = { num: 90 }; // will be queued; deadline remains 1150
285
- // SIGNAL #2
286
- // The deadline timer will fire at time 1150 and send a single
287
- // signal with the value from the last signal (num=90).
288
- // It's necessary to tick the timer beyond the deadline so the timer will fire.
289
- clock.tick(30); // Time is now 1180
290
- });
291
- (0, mocha_1.it)("batches signals sent within a specified allowableUpdateLatencyMs", async () => {
292
- runtime.signalsExpected.push([
293
- {
294
- type: "Pres:DatastoreUpdate",
295
- content: {
296
- "sendTimestamp": 1110,
297
- "avgLatency": 10,
298
- "data": {
299
- "system:presence": {
300
- "clientToSessionId": {
301
- [testUtils_js_1.initialLocalClientConnectionId]: {
302
- "rev": 0,
303
- "timestamp": initialTime,
304
- "value": testUtils_js_1.localAttendeeId,
305
- },
306
- },
307
- },
308
- "s:name:testStateWorkspace": {
309
- "count": {
310
- [testUtils_js_1.localAttendeeId]: {
311
- "rev": 2,
312
- "timestamp": 1100,
313
- "value": (0, utils_1.toOpaqueJson)({
314
- "num": 34,
315
- }),
316
- },
317
- },
318
- },
319
- },
320
- },
321
- },
322
- ], [
323
- {
324
- type: "Pres:DatastoreUpdate",
325
- content: {
326
- "sendTimestamp": 1240,
327
- "avgLatency": 10,
328
- "data": {
329
- "system:presence": {
330
- "clientToSessionId": {
331
- [testUtils_js_1.initialLocalClientConnectionId]: {
332
- "rev": 0,
333
- "timestamp": initialTime,
334
- "value": testUtils_js_1.localAttendeeId,
335
- },
336
- },
337
- },
338
- "s:name:testStateWorkspace": {
339
- "count": {
340
- [testUtils_js_1.localAttendeeId]: {
341
- "rev": 5,
342
- "timestamp": 1220,
343
- "value": (0, utils_1.toOpaqueJson)({
344
- "num": 90,
345
- }),
346
- },
347
- },
348
- },
349
- },
350
- },
351
- },
352
- ]);
353
- // Configure a state workspace
354
- const stateWorkspace = presence.states.getWorkspace("name:testStateWorkspace", {
355
- count: states_1.StateFactory.latest({
356
- local: { num: 0 },
357
- settings: { allowableUpdateLatencyMs: 100 },
358
- }),
359
- });
360
- const { count } = stateWorkspace.states;
361
- clock.tick(10); // Time is now 1020
362
- count.local = { num: 12 }; // will be queued; deadline is set to 1120
363
- clock.tick(80); // Time is now 1100
364
- count.local = { num: 34 }; // will be queued; deadline remains 1120
365
- // SIGNAL #1
366
- // The deadline timer will fire at time 1120 and send a single
367
- // signal with the value from the last signal (num=34).
368
- // It's necessary to tick the timer beyond the deadline so the timer will fire.
369
- clock.tick(30); // Time is now 1130
370
- clock.tick(10); // Time is now 1140
371
- count.local = { num: 56 }; // will be queued; deadline is set to 1240
372
- clock.tick(40); // Time is now 1180
373
- count.local = { num: 78 }; // will be queued; deadline remains 1240
374
- clock.tick(40); // Time is now 1220
375
- count.local = { num: 90 }; // will be queued; deadline remains 1240
376
- // SIGNAL #2
377
- // The deadline timer will fire at time 1240 and send a single
378
- // signal with the value from the last signal (num=90).
379
- // It's necessary to tick the timer beyond the deadline so the timer will fire.
380
- clock.tick(30); // Time is now 1250
381
- });
382
- (0, mocha_1.it)("queued signal is sent immediately with immediate update message", async () => {
383
- runtime.signalsExpected.push([
384
- {
385
- type: "Pres:DatastoreUpdate",
386
- content: {
387
- "sendTimestamp": 1010,
388
- "avgLatency": 10,
389
- "data": {
390
- "system:presence": {
391
- "clientToSessionId": {
392
- [testUtils_js_1.initialLocalClientConnectionId]: {
393
- "rev": 0,
394
- "timestamp": initialTime,
395
- "value": testUtils_js_1.localAttendeeId,
396
- },
397
- },
398
- },
399
- "s:name:testStateWorkspace": {
400
- "count": {
401
- [testUtils_js_1.localAttendeeId]: {
402
- "rev": 0,
403
- "timestamp": 1010,
404
- "value": (0, utils_1.toOpaqueJson)({
405
- "num": 0,
406
- }),
407
- },
408
- },
409
- "immediateUpdate": {
410
- [testUtils_js_1.localAttendeeId]: {
411
- "rev": 0,
412
- "timestamp": 1010,
413
- "value": (0, utils_1.toOpaqueJson)({
414
- "num": 0,
415
- }),
416
- },
417
- },
418
- },
419
- },
420
- },
421
- },
422
- ], [
423
- {
424
- type: "Pres:DatastoreUpdate",
425
- content: {
426
- "sendTimestamp": 1110,
427
- "avgLatency": 10,
428
- "data": {
429
- "system:presence": {
430
- "clientToSessionId": {
431
- [testUtils_js_1.initialLocalClientConnectionId]: {
432
- "rev": 0,
433
- "timestamp": initialTime,
434
- "value": testUtils_js_1.localAttendeeId,
435
- },
436
- },
437
- },
438
- "s:name:testStateWorkspace": {
439
- "count": {
440
- [testUtils_js_1.localAttendeeId]: {
441
- "rev": 2,
442
- "timestamp": 1100,
443
- "value": (0, utils_1.toOpaqueJson)({
444
- "num": 34,
445
- }),
446
- },
447
- },
448
- "immediateUpdate": {
449
- [testUtils_js_1.localAttendeeId]: {
450
- "rev": 1,
451
- "timestamp": 1110,
452
- "value": (0, utils_1.toOpaqueJson)({
453
- "num": 56,
454
- }),
455
- },
456
- },
457
- },
458
- },
459
- },
460
- },
461
- ]);
462
- // Configure a state workspace
463
- // SIGNAL #1 - this signal is not queued because it contains a State object with a latency of 0,
464
- // so the initial data will be sent immediately.
465
- const stateWorkspace = presence.states.getWorkspace("name:testStateWorkspace", {
466
- count: states_1.StateFactory.latest({
467
- local: { num: 0 },
468
- settings: { allowableUpdateLatencyMs: 100 },
469
- }),
470
- immediateUpdate: states_1.StateFactory.latest({
471
- local: { num: 0 },
472
- settings: { allowableUpdateLatencyMs: 0 },
473
- }),
474
- });
475
- const { count, immediateUpdate } = stateWorkspace.states;
476
- clock.tick(10); // Time is now 1020
477
- count.local = { num: 12 }; // will be queued; deadline is set to 1120
478
- clock.tick(80); // Time is now 1100
479
- count.local = { num: 34 }; // will be queued; deadline remains 1120
480
- clock.tick(10); // Time is now 1110
481
- // SIGNAL #2
482
- // The following update should cause the queued signals to be merged with this immediately-sent
483
- // signal with the value from the last signal (num=34).
484
- immediateUpdate.local = { num: 56 };
485
- });
486
- (0, mocha_1.it)("batches signals with different allowed latencies", async () => {
487
- runtime.signalsExpected.push([
488
- {
489
- type: "Pres:DatastoreUpdate",
490
- content: {
491
- "sendTimestamp": 1060,
492
- "avgLatency": 10,
493
- "data": {
494
- "system:presence": {
495
- "clientToSessionId": {
496
- [testUtils_js_1.initialLocalClientConnectionId]: {
497
- "rev": 0,
498
- "timestamp": initialTime,
499
- "value": testUtils_js_1.localAttendeeId,
500
- },
501
- },
502
- },
503
- "s:name:testStateWorkspace": {
504
- "count": {
505
- [testUtils_js_1.localAttendeeId]: {
506
- "rev": 2,
507
- "timestamp": 1050,
508
- "value": (0, utils_1.toOpaqueJson)({
509
- "num": 34,
510
- }),
511
- },
512
- },
513
- "note": {
514
- [testUtils_js_1.localAttendeeId]: {
515
- "rev": 1,
516
- "timestamp": 1020,
517
- "value": (0, utils_1.toOpaqueJson)({
518
- "message": "will be queued",
519
- }),
520
- },
521
- },
522
- },
523
- },
524
- },
525
- },
526
- ], [
527
- {
528
- type: "Pres:DatastoreUpdate",
529
- content: {
530
- "sendTimestamp": 1110,
531
- "avgLatency": 10,
532
- "data": {
533
- "system:presence": {
534
- "clientToSessionId": {
535
- [testUtils_js_1.initialLocalClientConnectionId]: {
536
- "rev": 0,
537
- "timestamp": initialTime,
538
- "value": testUtils_js_1.localAttendeeId,
539
- },
540
- },
541
- },
542
- "s:name:testStateWorkspace": {
543
- "note": {
544
- [testUtils_js_1.localAttendeeId]: {
545
- "rev": 2,
546
- "timestamp": 1060,
547
- "value": (0, utils_1.toOpaqueJson)({ "message": "final message" }),
548
- },
549
- },
550
- },
551
- },
552
- },
553
- },
554
- ]);
555
- // Configure a state workspace
556
- const stateWorkspace = presence.states.getWorkspace("name:testStateWorkspace", {
557
- count: states_1.StateFactory.latest({
558
- local: { num: 0 },
559
- settings: { allowableUpdateLatencyMs: 100 },
560
- }),
561
- note: states_1.StateFactory.latest({
562
- local: { message: "" },
563
- settings: { allowableUpdateLatencyMs: 50 },
564
- }),
565
- }); // will be queued, deadline is set to 1060
566
- const { count, note } = stateWorkspace.states;
567
- clock.tick(10); // Time is now 1020
568
- note.local = { message: "will be queued" }; // will be queued, deadline remains 1060
569
- count.local = { num: 12 }; // will be queued; deadline remains 1060
570
- clock.tick(30); // Time is now 1050
571
- count.local = { num: 34 }; // will be queued; deadline remains 1060
572
- // SIGNAL #1
573
- // At time 1060, the deadline timer will fire and send a single signal with the value
574
- // from both workspaces (num=34, message="will be queued").
575
- clock.tick(10); // Time is now 1060
576
- note.local = { message: "final message" }; // will be queued; deadline is 1110
577
- // SIGNAL #2
578
- // At time 1110, the deadline timer will fire and send a single signal with the value
579
- // from the note workspace (message="final message").
580
- // It's necessary to tick the timer beyond the deadline so the timer will fire.
581
- clock.tick(100); // Time is now 1160
582
- });
583
- (0, mocha_1.it)("batches signals from multiple workspaces", async () => {
584
- runtime.signalsExpected.push([
585
- {
586
- type: "Pres:DatastoreUpdate",
587
- content: {
588
- "sendTimestamp": 1070,
589
- "avgLatency": 10,
590
- "data": {
591
- "system:presence": {
592
- "clientToSessionId": {
593
- [testUtils_js_1.initialLocalClientConnectionId]: {
594
- "rev": 0,
595
- "timestamp": initialTime,
596
- "value": testUtils_js_1.localAttendeeId,
597
- },
598
- },
599
- },
600
- "s:name:testStateWorkspace": {
601
- "count": {
602
- [testUtils_js_1.localAttendeeId]: {
603
- "rev": 2,
604
- "timestamp": 1050,
605
- "value": (0, utils_1.toOpaqueJson)({
606
- "num": 34,
607
- }),
608
- },
609
- },
610
- },
611
- "s:name:testStateWorkspace2": {
612
- "note": {
613
- [testUtils_js_1.localAttendeeId]: {
614
- "rev": 2,
615
- "timestamp": 1060,
616
- "value": (0, utils_1.toOpaqueJson)({
617
- "message": "final message",
618
- }),
619
- },
620
- },
621
- },
622
- },
623
- },
624
- },
625
- ]);
626
- // Configure two state workspaces
627
- const stateWorkspace = presence.states.getWorkspace("name:testStateWorkspace", {
628
- count: states_1.StateFactory.latest({
629
- local: { num: 0 },
630
- settings: { allowableUpdateLatencyMs: 100 },
631
- }),
632
- }); // will be queued, deadline is 1110
633
- const stateWorkspace2 = presence.states.getWorkspace("name:testStateWorkspace2", {
634
- note: states_1.StateFactory.latest({
635
- local: { message: "" },
636
- settings: { allowableUpdateLatencyMs: 60 },
637
- }),
638
- }); // will be queued, deadline is 1070
639
- const { count } = stateWorkspace.states;
640
- const { note } = stateWorkspace2.states;
641
- clock.tick(10); // Time is now 1020
642
- note.local = { message: "will be queued" }; // will be queued, deadline is 1070
643
- count.local = { num: 12 }; // will be queued; deadline remains 1070
644
- clock.tick(30); // Time is now 1050
645
- count.local = { num: 34 }; // will be queued; deadline remains 1070
646
- clock.tick(10); // Time is now 1060
647
- note.local = { message: "final message" }; // will be queued; deadline remains 1070
648
- // SIGNAL #1
649
- // The deadline timer will fire at time 1070 and send a single
650
- // signal with the values from the most recent workspace updates (num=34, message="final message").
651
- // It's necessary to tick the timer beyond the deadline so the timer will fire.
652
- clock.tick(30); // Time is now 1090
653
- });
654
- });
655
- (0, mocha_1.describe)("NotificationsManager", () => {
656
- (0, mocha_1.it)("notification signals are sent immediately", async () => {
657
- runtime.signalsExpected.push([
658
- {
659
- type: "Pres:DatastoreUpdate",
660
- content: {
661
- "sendTimestamp": 1050,
662
- "avgLatency": 10,
663
- "data": {
664
- "system:presence": {
665
- "clientToSessionId": {
666
- [testUtils_js_1.initialLocalClientConnectionId]: {
667
- "rev": 0,
668
- "timestamp": initialTime,
669
- "value": testUtils_js_1.localAttendeeId,
670
- },
671
- },
672
- },
673
- "n:name:testNotificationWorkspace": {
674
- "testEvents": {
675
- [testUtils_js_1.localAttendeeId]: {
676
- "rev": 0,
677
- "timestamp": 0,
678
- "value": (0, utils_1.toOpaqueJson)({ "name": "newId", "args": [77] }),
679
- "ignoreUnmonitored": true,
680
- },
681
- },
682
- },
683
- },
684
- },
685
- },
686
- ], [
687
- {
688
- type: "Pres:DatastoreUpdate",
689
- content: {
690
- "sendTimestamp": 1060,
691
- "avgLatency": 10,
692
- "data": {
693
- "system:presence": {
694
- "clientToSessionId": {
695
- [testUtils_js_1.initialLocalClientConnectionId]: {
696
- "rev": 0,
697
- "timestamp": initialTime,
698
- "value": testUtils_js_1.localAttendeeId,
699
- },
700
- },
701
- },
702
- "n:name:testNotificationWorkspace": {
703
- "testEvents": {
704
- [testUtils_js_1.localAttendeeId]: {
705
- "rev": 0,
706
- "timestamp": 0,
707
- "value": (0, utils_1.toOpaqueJson)({ "name": "newId", "args": [88] }),
708
- "ignoreUnmonitored": true,
709
- },
710
- },
711
- },
712
- },
713
- },
714
- },
715
- ]);
716
- // Configure a notifications workspace
717
- // eslint-disable-next-line @typescript-eslint/no-empty-object-type
718
- const notificationsWorkspace = presence.notifications.getWorkspace("name:testNotificationWorkspace", {});
719
- notificationsWorkspace.add("testEvents", (0, states_1.Notifications)(
720
- // A default handler is not required
721
- {}));
722
- const { testEvents } = notificationsWorkspace.notifications;
723
- clock.tick(40); // Time is now 1050
724
- // SIGNAL #1
725
- testEvents.emit.broadcast("newId", 77);
726
- clock.tick(10); // Time is now 1060
727
- // SIGNAL #2
728
- testEvents.emit.broadcast("newId", 88);
729
- });
730
- (0, mocha_1.it)("notification signals cause queued messages to be sent immediately", async () => {
731
- runtime.signalsExpected.push([
732
- {
733
- type: "Pres:DatastoreUpdate",
734
- content: {
735
- "sendTimestamp": 1060,
736
- "avgLatency": 10,
737
- "data": {
738
- "system:presence": {
739
- "clientToSessionId": {
740
- [testUtils_js_1.initialLocalClientConnectionId]: {
741
- "rev": 0,
742
- "timestamp": initialTime,
743
- "value": testUtils_js_1.localAttendeeId,
744
- },
745
- },
746
- },
747
- "s:name:testStateWorkspace": {
748
- "count": {
749
- [testUtils_js_1.localAttendeeId]: {
750
- "rev": 3,
751
- "timestamp": 1040,
752
- "value": (0, utils_1.toOpaqueJson)({
753
- "num": 56,
754
- }),
755
- },
756
- },
757
- },
758
- "n:name:testNotificationWorkspace": {
759
- "testEvents": {
760
- [testUtils_js_1.localAttendeeId]: {
761
- "rev": 0,
762
- "timestamp": 0,
763
- "value": (0, utils_1.toOpaqueJson)({
764
- "name": "newId",
765
- "args": [99],
766
- }),
767
- "ignoreUnmonitored": true,
768
- },
769
- },
770
- },
771
- },
772
- },
773
- },
774
- ], [
775
- {
776
- type: "Pres:DatastoreUpdate",
777
- content: {
778
- "sendTimestamp": 1090,
779
- "avgLatency": 10,
780
- "data": {
781
- "system:presence": {
782
- "clientToSessionId": {
783
- [testUtils_js_1.initialLocalClientConnectionId]: {
784
- "rev": 0,
785
- "timestamp": initialTime,
786
- "value": testUtils_js_1.localAttendeeId,
787
- },
788
- },
789
- },
790
- "n:name:testNotificationWorkspace": {
791
- "testEvents": {
792
- [testUtils_js_1.localAttendeeId]: {
793
- "rev": 0,
794
- "timestamp": 0,
795
- "value": (0, utils_1.toOpaqueJson)({
796
- "name": "newId",
797
- "args": [111],
798
- }),
799
- "ignoreUnmonitored": true,
800
- },
801
- },
802
- },
803
- },
804
- },
805
- },
806
- ]);
807
- // Configure a state workspace
808
- const stateWorkspace = presence.states.getWorkspace("name:testStateWorkspace", {
809
- count: states_1.StateFactory.latest({
810
- local: { num: 0 },
811
- settings: { allowableUpdateLatencyMs: 100 },
812
- }),
813
- }); // will be queued, deadline is 1110
814
- // eslint-disable-next-line @typescript-eslint/no-empty-object-type
815
- const notificationsWorkspace = presence.notifications.getWorkspace("name:testNotificationWorkspace", {});
816
- notificationsWorkspace.add("testEvents", (0, states_1.Notifications)(
817
- // A default handler is not required
818
- {}));
819
- const { count } = stateWorkspace.states;
820
- const { testEvents } = notificationsWorkspace.notifications;
821
- testEvents.notifications.on("newId", (attendee, newId) => {
822
- // do nothing
823
- });
824
- clock.tick(10); // Time is now 1020
825
- count.local = { num: 12 }; // will be queued, deadline remains 1110
826
- clock.tick(10); // Time is now 1030
827
- count.local = { num: 34 }; // will be queued, deadline remains 1110
828
- clock.tick(10); // Time is now 1040
829
- count.local = { num: 56 }; // will be queued, deadline remains 1110
830
- clock.tick(20); // Time is now 1060
831
- // SIGNAL #1
832
- // The notification below will cause an immediate broadcast of the queued signal
833
- // along with the notification signal.
834
- testEvents.emit.broadcast("newId", 99);
835
- clock.tick(30); // Time is now 1090
836
- // SIGNAL #2
837
- // Immediate broadcast of the notification signal.
838
- testEvents.emit.broadcast("newId", 111);
839
- });
840
- });
841
- });
842
- });
843
- //# sourceMappingURL=batching.spec.js.map