@fluid-internal/presence-runtime 2.101.1 → 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 +0,0 @@
1
- {"version":3,"file":"batching.spec.js","sourceRoot":"","sources":["../../../src/states/test/batching.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport type {\n\tNotificationsWorkspace,\n\tPresenceWithNotifications,\n} from \"@fluid-internal/presence-definitions\";\nimport { EventAndErrorTrackingLogger } from \"@fluidframework/test-utils/internal\";\nimport { describe, it, after, afterEach, before, beforeEach } from \"mocha\";\nimport { useFakeTimers, type SinonFakeTimers } from \"sinon\";\n\nimport { Notifications, StateFactory } from \"@fluid-internal/presence-runtime/states\";\nimport { toOpaqueJson } from \"@fluid-internal/presence-runtime/utils\";\n\nimport { MockEphemeralRuntime } from \"./mockEphemeralRuntime.js\";\nimport {\n\tassertFinalExpectations,\n\tinitialLocalClientConnectionId,\n\tprepareConnectedPresence,\n\tlocalAttendeeId,\n} from \"./testUtils.js\";\n\ndescribe(\"Presence/States\", () => {\n\tdescribe(\"batching\", () => {\n\t\tlet runtime: MockEphemeralRuntime;\n\t\tlet logger: EventAndErrorTrackingLogger;\n\t\tconst initialTime = 500;\n\t\tconst testStartTime = 1010;\n\t\tlet clock: SinonFakeTimers;\n\t\tlet presence: PresenceWithNotifications;\n\n\t\tbefore(async () => {\n\t\t\tclock = useFakeTimers();\n\t\t});\n\n\t\tbeforeEach(() => {\n\t\t\tlogger = new EventAndErrorTrackingLogger();\n\t\t\truntime = new MockEphemeralRuntime(logger);\n\n\t\t\tclock.setSystemTime(initialTime);\n\n\t\t\t// Set up the presence connection.\n\t\t\tpresence = prepareConnectedPresence(\n\t\t\t\truntime,\n\t\t\t\tlocalAttendeeId,\n\t\t\t\tinitialLocalClientConnectionId,\n\t\t\t\tclock,\n\t\t\t\tlogger,\n\t\t\t).presence;\n\n\t\t\t// Note that while the initialTime was set to 500, the prepareConnectedPresence call advances\n\t\t\t// it. Set a consistent start time for all tests.\n\t\t\tconst deltaToStart = testStartTime - clock.now;\n\t\t\tassert(deltaToStart >= 0);\n\t\t\tclock.tick(deltaToStart);\n\t\t});\n\n\t\tafterEach(() => {\n\t\t\t// Tick the clock forward by a large amount before resetting it\n\t\t\t// in case there are lingering queued signals or timers\n\t\t\tclock.tick(1000);\n\t\t\tclock.reset();\n\t\t});\n\n\t\tafter(() => {\n\t\t\tclock.restore();\n\t\t});\n\n\t\tdescribe(\"Latest\", () => {\n\t\t\tit(\"sends signal immediately when allowable latency is 0\", async () => {\n\t\t\t\truntime.signalsExpected.push(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1010,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1010,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1020,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1020,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 42,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1020,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 2,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1020,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 84,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t);\n\n\t\t\t\t// Configure a state workspace\n\t\t\t\t// SIGNAL #1 - intial data is sent immediately\n\t\t\t\tconst stateWorkspace = presence.states.getWorkspace(\"name:testStateWorkspace\", {\n\t\t\t\t\tcount: StateFactory.latest({\n\t\t\t\t\t\tlocal: { num: 0 },\n\t\t\t\t\t\tsettings: { allowableUpdateLatencyMs: 0 },\n\t\t\t\t\t}),\n\t\t\t\t});\n\n\t\t\t\tconst { count } = stateWorkspace.states;\n\n\t\t\t\tclock.tick(10); // Time is now 1020\n\n\t\t\t\t// SIGNAL #2\n\t\t\t\tcount.local = { num: 42 };\n\n\t\t\t\t// SIGNAL #3\n\t\t\t\tcount.local = { num: 84 };\n\n\t\t\t\tassertFinalExpectations(runtime, logger);\n\t\t\t});\n\n\t\t\tit(\"sets timer for default allowableUpdateLatencyMs\", async () => {\n\t\t\t\truntime.signalsExpected.push([\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"sendTimestamp\": 1070,\n\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1010,\n\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 0,\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\t// Configure a state workspace\n\t\t\t\tpresence.states.getWorkspace(\"name:testStateWorkspace\", {\n\t\t\t\t\tcount: StateFactory.latest({\n\t\t\t\t\t\tlocal: { num: 0 } /* default allowableUpdateLatencyMs = 60 */,\n\t\t\t\t\t}),\n\t\t\t\t}); // will be queued; deadline is now 1070\n\n\t\t\t\t// SIGNAL #1\n\t\t\t\t// The deadline timer will fire at time 1070 and send a single\n\t\t\t\t// signal with the value from the last signal (num=0).\n\n\t\t\t\tclock.tick(100); // Time is now 1110\n\t\t\t});\n\n\t\t\tit(\"batches signals sent within default allowableUpdateLatencyMs\", async () => {\n\t\t\t\truntime.signalsExpected.push(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1070,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 3,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1060,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 22,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1150,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 6,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1140,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 90,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t);\n\n\t\t\t\t// Configure a state workspace\n\t\t\t\tconst stateWorkspace = presence.states.getWorkspace(\"name:testStateWorkspace\", {\n\t\t\t\t\tcount: StateFactory.latest({\n\t\t\t\t\t\tlocal: { num: 0 } /* default allowableUpdateLatencyMs = 60 */,\n\t\t\t\t\t}),\n\t\t\t\t}); // will be queued; deadline is now 1070\n\n\t\t\t\tconst { count } = stateWorkspace.states;\n\n\t\t\t\tclock.tick(10); // Time is now 1020\n\t\t\t\tcount.local = { num: 12 }; // will be queued; deadline remains 1070\n\n\t\t\t\tclock.tick(10); // Time is now 1030\n\t\t\t\tcount.local = { num: 34 }; // will be queued; deadline remains 1070\n\n\t\t\t\tclock.tick(30); // Time is now 1060\n\t\t\t\tcount.local = { num: 22 }; // will be queued; deadline remains 1070\n\n\t\t\t\t// SIGNAL #1\n\t\t\t\t// The deadline timer will fire at time 1070 and send a single\n\t\t\t\t// signal with the value from the last signal (num=22).\n\n\t\t\t\t// It's necessary to tick the timer beyond the deadline so the timer will fire.\n\t\t\t\tclock.tick(20); // Time is now 1080\n\n\t\t\t\tclock.tick(10); // Time is now 1090\n\t\t\t\tcount.local = { num: 56 }; // will be queued; deadline is set to 1150\n\n\t\t\t\tclock.tick(40); // Time is now 1130\n\t\t\t\tcount.local = { num: 78 }; // will be queued; deadline remains 1150\n\n\t\t\t\tclock.tick(10); // Time is now 1140\n\t\t\t\tcount.local = { num: 90 }; // will be queued; deadline remains 1150\n\n\t\t\t\t// SIGNAL #2\n\t\t\t\t// The deadline timer will fire at time 1150 and send a single\n\t\t\t\t// signal with the value from the last signal (num=90).\n\n\t\t\t\t// It's necessary to tick the timer beyond the deadline so the timer will fire.\n\t\t\t\tclock.tick(30); // Time is now 1180\n\t\t\t});\n\n\t\t\tit(\"batches signals sent within a specified allowableUpdateLatencyMs\", async () => {\n\t\t\t\truntime.signalsExpected.push(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1110,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 2,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1100,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 34,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1240,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 5,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1220,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 90,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t);\n\n\t\t\t\t// Configure a state workspace\n\t\t\t\tconst stateWorkspace = presence.states.getWorkspace(\"name:testStateWorkspace\", {\n\t\t\t\t\tcount: StateFactory.latest({\n\t\t\t\t\t\tlocal: { num: 0 },\n\t\t\t\t\t\tsettings: { allowableUpdateLatencyMs: 100 },\n\t\t\t\t\t}),\n\t\t\t\t});\n\n\t\t\t\tconst { count } = stateWorkspace.states;\n\n\t\t\t\tclock.tick(10); // Time is now 1020\n\t\t\t\tcount.local = { num: 12 }; // will be queued; deadline is set to 1120\n\n\t\t\t\tclock.tick(80); // Time is now 1100\n\t\t\t\tcount.local = { num: 34 }; // will be queued; deadline remains 1120\n\n\t\t\t\t// SIGNAL #1\n\t\t\t\t// The deadline timer will fire at time 1120 and send a single\n\t\t\t\t// signal with the value from the last signal (num=34).\n\n\t\t\t\t// It's necessary to tick the timer beyond the deadline so the timer will fire.\n\t\t\t\tclock.tick(30); // Time is now 1130\n\n\t\t\t\tclock.tick(10); // Time is now 1140\n\t\t\t\tcount.local = { num: 56 }; // will be queued; deadline is set to 1240\n\n\t\t\t\tclock.tick(40); // Time is now 1180\n\t\t\t\tcount.local = { num: 78 }; // will be queued; deadline remains 1240\n\n\t\t\t\tclock.tick(40); // Time is now 1220\n\t\t\t\tcount.local = { num: 90 }; // will be queued; deadline remains 1240\n\n\t\t\t\t// SIGNAL #2\n\t\t\t\t// The deadline timer will fire at time 1240 and send a single\n\t\t\t\t// signal with the value from the last signal (num=90).\n\n\t\t\t\t// It's necessary to tick the timer beyond the deadline so the timer will fire.\n\t\t\t\tclock.tick(30); // Time is now 1250\n\t\t\t});\n\n\t\t\tit(\"queued signal is sent immediately with immediate update message\", async () => {\n\t\t\t\truntime.signalsExpected.push(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1010,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1010,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\"immediateUpdate\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1010,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1110,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 2,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1100,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 34,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\"immediateUpdate\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1110,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 56,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t);\n\n\t\t\t\t// Configure a state workspace\n\t\t\t\t// SIGNAL #1 - this signal is not queued because it contains a State object with a latency of 0,\n\t\t\t\t// so the initial data will be sent immediately.\n\t\t\t\tconst stateWorkspace = presence.states.getWorkspace(\"name:testStateWorkspace\", {\n\t\t\t\t\tcount: StateFactory.latest({\n\t\t\t\t\t\tlocal: { num: 0 },\n\t\t\t\t\t\tsettings: { allowableUpdateLatencyMs: 100 },\n\t\t\t\t\t}),\n\t\t\t\t\timmediateUpdate: StateFactory.latest({\n\t\t\t\t\t\tlocal: { num: 0 },\n\t\t\t\t\t\tsettings: { allowableUpdateLatencyMs: 0 },\n\t\t\t\t\t}),\n\t\t\t\t});\n\n\t\t\t\tconst { count, immediateUpdate } = stateWorkspace.states;\n\n\t\t\t\tclock.tick(10); // Time is now 1020\n\t\t\t\tcount.local = { num: 12 }; // will be queued; deadline is set to 1120\n\n\t\t\t\tclock.tick(80); // Time is now 1100\n\t\t\t\tcount.local = { num: 34 }; // will be queued; deadline remains 1120\n\n\t\t\t\tclock.tick(10); // Time is now 1110\n\n\t\t\t\t// SIGNAL #2\n\t\t\t\t// The following update should cause the queued signals to be merged with this immediately-sent\n\t\t\t\t// signal with the value from the last signal (num=34).\n\t\t\t\timmediateUpdate.local = { num: 56 };\n\t\t\t});\n\n\t\t\tit(\"batches signals with different allowed latencies\", async () => {\n\t\t\t\truntime.signalsExpected.push(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1060,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 2,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1050,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 34,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\"note\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1020,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"message\": \"will be queued\",\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1110,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"note\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 2,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1060,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({ \"message\": \"final message\" }),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t);\n\n\t\t\t\t// Configure a state workspace\n\t\t\t\tconst stateWorkspace = presence.states.getWorkspace(\"name:testStateWorkspace\", {\n\t\t\t\t\tcount: StateFactory.latest({\n\t\t\t\t\t\tlocal: { num: 0 },\n\t\t\t\t\t\tsettings: { allowableUpdateLatencyMs: 100 },\n\t\t\t\t\t}),\n\t\t\t\t\tnote: StateFactory.latest({\n\t\t\t\t\t\tlocal: { message: \"\" },\n\t\t\t\t\t\tsettings: { allowableUpdateLatencyMs: 50 },\n\t\t\t\t\t}),\n\t\t\t\t}); // will be queued, deadline is set to 1060\n\n\t\t\t\tconst { count, note } = stateWorkspace.states;\n\n\t\t\t\tclock.tick(10); // Time is now 1020\n\t\t\t\tnote.local = { message: \"will be queued\" }; // will be queued, deadline remains 1060\n\t\t\t\tcount.local = { num: 12 }; // will be queued; deadline remains 1060\n\n\t\t\t\tclock.tick(30); // Time is now 1050\n\t\t\t\tcount.local = { num: 34 }; // will be queued; deadline remains 1060\n\n\t\t\t\t// SIGNAL #1\n\t\t\t\t// At time 1060, the deadline timer will fire and send a single signal with the value\n\t\t\t\t// from both workspaces (num=34, message=\"will be queued\").\n\n\t\t\t\tclock.tick(10); // Time is now 1060\n\t\t\t\tnote.local = { message: \"final message\" }; // will be queued; deadline is 1110\n\n\t\t\t\t// SIGNAL #2\n\t\t\t\t// At time 1110, the deadline timer will fire and send a single signal with the value\n\t\t\t\t// from the note workspace (message=\"final message\").\n\n\t\t\t\t// It's necessary to tick the timer beyond the deadline so the timer will fire.\n\t\t\t\tclock.tick(100); // Time is now 1160\n\t\t\t});\n\n\t\t\tit(\"batches signals from multiple workspaces\", async () => {\n\t\t\t\truntime.signalsExpected.push([\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"sendTimestamp\": 1070,\n\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\"rev\": 2,\n\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1050,\n\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 34,\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace2\": {\n\t\t\t\t\t\t\t\t\t\"note\": {\n\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\"rev\": 2,\n\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1060,\n\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\"message\": \"final message\",\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\t// Configure two state workspaces\n\t\t\t\tconst stateWorkspace = presence.states.getWorkspace(\"name:testStateWorkspace\", {\n\t\t\t\t\tcount: StateFactory.latest({\n\t\t\t\t\t\tlocal: { num: 0 },\n\t\t\t\t\t\tsettings: { allowableUpdateLatencyMs: 100 },\n\t\t\t\t\t}),\n\t\t\t\t}); // will be queued, deadline is 1110\n\n\t\t\t\tconst stateWorkspace2 = presence.states.getWorkspace(\"name:testStateWorkspace2\", {\n\t\t\t\t\tnote: StateFactory.latest({\n\t\t\t\t\t\tlocal: { message: \"\" },\n\t\t\t\t\t\tsettings: { allowableUpdateLatencyMs: 60 },\n\t\t\t\t\t}),\n\t\t\t\t}); // will be queued, deadline is 1070\n\n\t\t\t\tconst { count } = stateWorkspace.states;\n\t\t\t\tconst { note } = stateWorkspace2.states;\n\n\t\t\t\tclock.tick(10); // Time is now 1020\n\t\t\t\tnote.local = { message: \"will be queued\" }; // will be queued, deadline is 1070\n\t\t\t\tcount.local = { num: 12 }; // will be queued; deadline remains 1070\n\n\t\t\t\tclock.tick(30); // Time is now 1050\n\t\t\t\tcount.local = { num: 34 }; // will be queued; deadline remains 1070\n\n\t\t\t\tclock.tick(10); // Time is now 1060\n\t\t\t\tnote.local = { message: \"final message\" }; // will be queued; deadline remains 1070\n\n\t\t\t\t// SIGNAL #1\n\t\t\t\t// The deadline timer will fire at time 1070 and send a single\n\t\t\t\t// signal with the values from the most recent workspace updates (num=34, message=\"final message\").\n\n\t\t\t\t// It's necessary to tick the timer beyond the deadline so the timer will fire.\n\t\t\t\tclock.tick(30); // Time is now 1090\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"NotificationsManager\", () => {\n\t\t\tit(\"notification signals are sent immediately\", async () => {\n\t\t\t\truntime.signalsExpected.push(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1050,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"n:name:testNotificationWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"testEvents\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({ \"name\": \"newId\", \"args\": [77] }),\n\t\t\t\t\t\t\t\t\t\t\t\t\"ignoreUnmonitored\": true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1060,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"n:name:testNotificationWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"testEvents\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({ \"name\": \"newId\", \"args\": [88] }),\n\t\t\t\t\t\t\t\t\t\t\t\t\"ignoreUnmonitored\": true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t);\n\n\t\t\t\t// Configure a notifications workspace\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-empty-object-type\n\t\t\t\tconst notificationsWorkspace: NotificationsWorkspace<{}> =\n\t\t\t\t\tpresence.notifications.getWorkspace(\"name:testNotificationWorkspace\", {});\n\n\t\t\t\tnotificationsWorkspace.add(\n\t\t\t\t\t\"testEvents\",\n\t\t\t\t\tNotifications<\n\t\t\t\t\t\t// Below explicit generic specification should not be required.\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnewId: (id: number) => void;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"testEvents\"\n\t\t\t\t\t>(\n\t\t\t\t\t\t// A default handler is not required\n\t\t\t\t\t\t{},\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tconst { testEvents } = notificationsWorkspace.notifications;\n\n\t\t\t\tclock.tick(40); // Time is now 1050\n\n\t\t\t\t// SIGNAL #1\n\t\t\t\ttestEvents.emit.broadcast(\"newId\", 77);\n\n\t\t\t\tclock.tick(10); // Time is now 1060\n\n\t\t\t\t// SIGNAL #2\n\t\t\t\ttestEvents.emit.broadcast(\"newId\", 88);\n\t\t\t});\n\n\t\t\tit(\"notification signals cause queued messages to be sent immediately\", async () => {\n\t\t\t\truntime.signalsExpected.push(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1060,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 3,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 1040,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"num\": 56,\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"n:name:testNotificationWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"testEvents\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"newId\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"args\": [99],\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t\t\"ignoreUnmonitored\": true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:DatastoreUpdate\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"sendTimestamp\": 1090,\n\t\t\t\t\t\t\t\t\"avgLatency\": 10,\n\t\t\t\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\t\t\t\"system:presence\": {\n\t\t\t\t\t\t\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\t\t\t\t\t\t[initialLocalClientConnectionId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": initialTime,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": localAttendeeId,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"n:name:testNotificationWorkspace\": {\n\t\t\t\t\t\t\t\t\t\t\"testEvents\": {\n\t\t\t\t\t\t\t\t\t\t\t[localAttendeeId]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"timestamp\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"newId\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"args\": [111],\n\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t\t\"ignoreUnmonitored\": true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t);\n\n\t\t\t\t// Configure a state workspace\n\t\t\t\tconst stateWorkspace = presence.states.getWorkspace(\"name:testStateWorkspace\", {\n\t\t\t\t\tcount: StateFactory.latest({\n\t\t\t\t\t\tlocal: { num: 0 },\n\t\t\t\t\t\tsettings: { allowableUpdateLatencyMs: 100 },\n\t\t\t\t\t}),\n\t\t\t\t}); // will be queued, deadline is 1110\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-empty-object-type\n\t\t\t\tconst notificationsWorkspace: NotificationsWorkspace<{}> =\n\t\t\t\t\tpresence.notifications.getWorkspace(\"name:testNotificationWorkspace\", {});\n\n\t\t\t\tnotificationsWorkspace.add(\n\t\t\t\t\t\"testEvents\",\n\t\t\t\t\tNotifications<\n\t\t\t\t\t\t// Below explicit generic specification should not be required.\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnewId: (id: number) => void;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"testEvents\"\n\t\t\t\t\t>(\n\t\t\t\t\t\t// A default handler is not required\n\t\t\t\t\t\t{},\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tconst { count } = stateWorkspace.states;\n\t\t\t\tconst { testEvents } = notificationsWorkspace.notifications;\n\n\t\t\t\ttestEvents.notifications.on(\"newId\", (attendee, newId) => {\n\t\t\t\t\t// do nothing\n\t\t\t\t});\n\n\t\t\t\tclock.tick(10); // Time is now 1020\n\t\t\t\tcount.local = { num: 12 }; // will be queued, deadline remains 1110\n\n\t\t\t\tclock.tick(10); // Time is now 1030\n\t\t\t\tcount.local = { num: 34 }; // will be queued, deadline remains 1110\n\n\t\t\t\tclock.tick(10); // Time is now 1040\n\t\t\t\tcount.local = { num: 56 }; // will be queued, deadline remains 1110\n\n\t\t\t\tclock.tick(20); // Time is now 1060\n\n\t\t\t\t// SIGNAL #1\n\t\t\t\t// The notification below will cause an immediate broadcast of the queued signal\n\t\t\t\t// along with the notification signal.\n\t\t\t\ttestEvents.emit.broadcast(\"newId\", 99);\n\n\t\t\t\tclock.tick(30); // Time is now 1090\n\n\t\t\t\t// SIGNAL #2\n\t\t\t\t// Immediate broadcast of the notification signal.\n\t\t\t\ttestEvents.emit.broadcast(\"newId\", 111);\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
@@ -1,56 +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 { createPresenceManager } from "@fluid-internal/presence-runtime/internal/test";
7
- import { MockEphemeralRuntime } from "./mockEphemeralRuntime.js";
8
- const testDefaultAllowableUpdateLatencyMs = 100;
9
- /**
10
- * Adds set of test for common {@link BroadcastControls} implementations.
11
- *
12
- * @param createControls - Function to create the `controls` provider object
13
- */
14
- export function addControlsTests(createControls) {
15
- describe("controls allowableUpdateLatencyMs", () => {
16
- it("can be specified during create", () => {
17
- // Setup
18
- const presence = createPresenceManager(new MockEphemeralRuntime());
19
- // Act
20
- const controlsProvider = createControls(presence, {
21
- allowableUpdateLatencyMs: testDefaultAllowableUpdateLatencyMs,
22
- });
23
- // Verify
24
- assert.equal(controlsProvider.controls.allowableUpdateLatencyMs, testDefaultAllowableUpdateLatencyMs);
25
- });
26
- it("can be changed", () => {
27
- // Setup
28
- const presence = createPresenceManager(new MockEphemeralRuntime());
29
- const controlsProvider = createControls(presence, {
30
- allowableUpdateLatencyMs: testDefaultAllowableUpdateLatencyMs,
31
- });
32
- // Act
33
- controlsProvider.controls.allowableUpdateLatencyMs = 200;
34
- // Verify
35
- assert.equal(controlsProvider.controls.allowableUpdateLatencyMs, 200);
36
- });
37
- it("can be reset to system default", () => {
38
- // Setup
39
- // First read value of system default from init without any settings
40
- let presence = createPresenceManager(new MockEphemeralRuntime());
41
- let controlsProvider = createControls(presence, undefined);
42
- const systemDefault = controlsProvider.controls.allowableUpdateLatencyMs;
43
- assert.notEqual(testDefaultAllowableUpdateLatencyMs, systemDefault, "test internal error: Test value matches system default value");
44
- // Recreate controls with custom settings specified
45
- presence = createPresenceManager(new MockEphemeralRuntime());
46
- controlsProvider = createControls(presence, {
47
- allowableUpdateLatencyMs: testDefaultAllowableUpdateLatencyMs,
48
- });
49
- // Act
50
- controlsProvider.controls.allowableUpdateLatencyMs = undefined;
51
- // Verify
52
- assert.equal(controlsProvider.controls.allowableUpdateLatencyMs, systemDefault);
53
- });
54
- });
55
- }
56
- //# sourceMappingURL=broadcastControlsTests.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"broadcastControlsTests.js","sourceRoot":"","sources":["../../../src/states/test/broadcastControlsTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAQ/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAC;AAEvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,mCAAmC,GAAG,GAAG,CAAC;AAEhD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC/B,cAGoC;IAEpC,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACzC,QAAQ;YACR,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;YAEnE,MAAM;YACN,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,EAAE;gBACjD,wBAAwB,EAAE,mCAAmC;aAC7D,CAAC,CAAC;YAEH,SAAS;YACT,MAAM,CAAC,KAAK,CACX,gBAAgB,CAAC,QAAQ,CAAC,wBAAwB,EAClD,mCAAmC,CACnC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACzB,QAAQ;YACR,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;YACnE,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,EAAE;gBACjD,wBAAwB,EAAE,mCAAmC;aAC7D,CAAC,CAAC;YAEH,MAAM;YACN,gBAAgB,CAAC,QAAQ,CAAC,wBAAwB,GAAG,GAAG,CAAC;YAEzD,SAAS;YACT,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACzC,QAAQ;YACR,oEAAoE;YACpE,IAAI,QAAQ,GAAG,qBAAqB,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;YACjE,IAAI,gBAAgB,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACzE,MAAM,CAAC,QAAQ,CACd,mCAAmC,EACnC,aAAa,EACb,8DAA8D,CAC9D,CAAC;YAEF,mDAAmD;YACnD,QAAQ,GAAG,qBAAqB,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;YAC7D,gBAAgB,GAAG,cAAc,CAAC,QAAQ,EAAE;gBAC3C,wBAAwB,EAAE,mCAAmC;aAC7D,CAAC,CAAC;YAEH,MAAM;YACN,gBAAgB,CAAC,QAAQ,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAE/D,SAAS;YACT,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport type {\n\tBroadcastControls,\n\tBroadcastControlSettings,\n\tPresence,\n} from \"@fluid-internal/presence-definitions\";\n\nimport { createPresenceManager } from \"@fluid-internal/presence-runtime/internal/test\";\n\nimport { MockEphemeralRuntime } from \"./mockEphemeralRuntime.js\";\n\nconst testDefaultAllowableUpdateLatencyMs = 100;\n\n/**\n * Adds set of test for common {@link BroadcastControls} implementations.\n *\n * @param createControls - Function to create the `controls` provider object\n */\nexport function addControlsTests(\n\tcreateControls: (\n\t\tpresence: Presence,\n\t\tcontrolSettings?: BroadcastControlSettings,\n\t) => { controls: BroadcastControls },\n): void {\n\tdescribe(\"controls allowableUpdateLatencyMs\", () => {\n\t\tit(\"can be specified during create\", () => {\n\t\t\t// Setup\n\t\t\tconst presence = createPresenceManager(new MockEphemeralRuntime());\n\n\t\t\t// Act\n\t\t\tconst controlsProvider = createControls(presence, {\n\t\t\t\tallowableUpdateLatencyMs: testDefaultAllowableUpdateLatencyMs,\n\t\t\t});\n\n\t\t\t// Verify\n\t\t\tassert.equal(\n\t\t\t\tcontrolsProvider.controls.allowableUpdateLatencyMs,\n\t\t\t\ttestDefaultAllowableUpdateLatencyMs,\n\t\t\t);\n\t\t});\n\n\t\tit(\"can be changed\", () => {\n\t\t\t// Setup\n\t\t\tconst presence = createPresenceManager(new MockEphemeralRuntime());\n\t\t\tconst controlsProvider = createControls(presence, {\n\t\t\t\tallowableUpdateLatencyMs: testDefaultAllowableUpdateLatencyMs,\n\t\t\t});\n\n\t\t\t// Act\n\t\t\tcontrolsProvider.controls.allowableUpdateLatencyMs = 200;\n\n\t\t\t// Verify\n\t\t\tassert.equal(controlsProvider.controls.allowableUpdateLatencyMs, 200);\n\t\t});\n\n\t\tit(\"can be reset to system default\", () => {\n\t\t\t// Setup\n\t\t\t// First read value of system default from init without any settings\n\t\t\tlet presence = createPresenceManager(new MockEphemeralRuntime());\n\t\t\tlet controlsProvider = createControls(presence, undefined);\n\t\t\tconst systemDefault = controlsProvider.controls.allowableUpdateLatencyMs;\n\t\t\tassert.notEqual(\n\t\t\t\ttestDefaultAllowableUpdateLatencyMs,\n\t\t\t\tsystemDefault,\n\t\t\t\t\"test internal error: Test value matches system default value\",\n\t\t\t);\n\n\t\t\t// Recreate controls with custom settings specified\n\t\t\tpresence = createPresenceManager(new MockEphemeralRuntime());\n\t\t\tcontrolsProvider = createControls(presence, {\n\t\t\t\tallowableUpdateLatencyMs: testDefaultAllowableUpdateLatencyMs,\n\t\t\t});\n\n\t\t\t// Act\n\t\t\tcontrolsProvider.controls.allowableUpdateLatencyMs = undefined;\n\n\t\t\t// Verify\n\t\t\tassert.equal(controlsProvider.controls.allowableUpdateLatencyMs, systemDefault);\n\t\t});\n\t});\n}\n"]}