@fluid-internal/presence-runtime 2.93.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 (264) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +72 -0
  3. package/dist/package.json +4 -0
  4. package/dist/packageVersion.d.ts +9 -0
  5. package/dist/packageVersion.d.ts.map +1 -0
  6. package/dist/packageVersion.js +12 -0
  7. package/dist/packageVersion.js.map +1 -0
  8. package/dist/runtime/extension/containerPresence.d.ts +53 -0
  9. package/dist/runtime/extension/containerPresence.d.ts.map +1 -0
  10. package/dist/runtime/extension/containerPresence.js +90 -0
  11. package/dist/runtime/extension/containerPresence.js.map +1 -0
  12. package/dist/runtime/extension/index.d.ts +6 -0
  13. package/dist/runtime/extension/index.d.ts.map +1 -0
  14. package/dist/runtime/extension/index.js +11 -0
  15. package/dist/runtime/extension/index.js.map +1 -0
  16. package/dist/runtime/presenceDatastoreManager.d.ts +146 -0
  17. package/dist/runtime/presenceDatastoreManager.d.ts.map +1 -0
  18. package/dist/runtime/presenceDatastoreManager.js +666 -0
  19. package/dist/runtime/presenceDatastoreManager.js.map +1 -0
  20. package/dist/runtime/presenceManager.d.ts +16 -0
  21. package/dist/runtime/presenceManager.d.ts.map +1 -0
  22. package/dist/runtime/presenceManager.js +140 -0
  23. package/dist/runtime/presenceManager.js.map +1 -0
  24. package/dist/runtime/protocol.d.ts +126 -0
  25. package/dist/runtime/protocol.d.ts.map +1 -0
  26. package/dist/runtime/protocol.js +20 -0
  27. package/dist/runtime/protocol.js.map +1 -0
  28. package/dist/runtime/runtimeTypes.d.ts +26 -0
  29. package/dist/runtime/runtimeTypes.d.ts.map +1 -0
  30. package/dist/runtime/runtimeTypes.js +7 -0
  31. package/dist/runtime/runtimeTypes.js.map +1 -0
  32. package/dist/runtime/systemWorkspace.d.ts +39 -0
  33. package/dist/runtime/systemWorkspace.d.ts.map +1 -0
  34. package/dist/runtime/systemWorkspace.js +264 -0
  35. package/dist/runtime/systemWorkspace.js.map +1 -0
  36. package/dist/runtime/test/presenceDatastoreManager.spec.js +618 -0
  37. package/dist/runtime/test/presenceDatastoreManager.spec.js.map +1 -0
  38. package/dist/runtime/test/presenceManager.spec.js +651 -0
  39. package/dist/runtime/test/presenceManager.spec.js.map +1 -0
  40. package/dist/runtime/test.d.ts +12 -0
  41. package/dist/runtime/test.d.ts.map +1 -0
  42. package/dist/runtime/test.js +15 -0
  43. package/dist/runtime/test.js.map +1 -0
  44. package/dist/states/index.d.ts +7 -0
  45. package/dist/states/index.d.ts.map +1 -0
  46. package/dist/states/index.js +12 -0
  47. package/dist/states/index.js.map +1 -0
  48. package/dist/states/latestMapValueManager.d.ts +10 -0
  49. package/dist/states/latestMapValueManager.d.ts.map +1 -0
  50. package/dist/states/latestMapValueManager.js +248 -0
  51. package/dist/states/latestMapValueManager.js.map +1 -0
  52. package/dist/states/latestValueManager.d.ts +10 -0
  53. package/dist/states/latestValueManager.d.ts.map +1 -0
  54. package/dist/states/latestValueManager.js +115 -0
  55. package/dist/states/latestValueManager.js.map +1 -0
  56. package/dist/states/notificationsManager.d.ts +26 -0
  57. package/dist/states/notificationsManager.d.ts.map +1 -0
  58. package/dist/states/notificationsManager.js +97 -0
  59. package/dist/states/notificationsManager.js.map +1 -0
  60. package/dist/states/presence.d.ts +11 -0
  61. package/dist/states/presence.d.ts.map +1 -0
  62. package/dist/states/presence.js +7 -0
  63. package/dist/states/presence.js.map +1 -0
  64. package/dist/states/stateFactory.d.ts +18 -0
  65. package/dist/states/stateFactory.d.ts.map +1 -0
  66. package/dist/states/stateFactory.js +23 -0
  67. package/dist/states/stateFactory.js.map +1 -0
  68. package/dist/states/test/batching.spec.js +843 -0
  69. package/dist/states/test/batching.spec.js.map +1 -0
  70. package/dist/states/test/broadcastControlsTests.js +60 -0
  71. package/dist/states/test/broadcastControlsTests.js.map +1 -0
  72. package/dist/states/test/eventing.spec.js +576 -0
  73. package/dist/states/test/eventing.spec.js.map +1 -0
  74. package/dist/states/test/latestMapValueManager.spec.js +210 -0
  75. package/dist/states/test/latestMapValueManager.spec.js.map +1 -0
  76. package/dist/states/test/latestValueManager.spec.js +193 -0
  77. package/dist/states/test/latestValueManager.spec.js.map +1 -0
  78. package/dist/states/test/mockEphemeralRuntime.js +11 -0
  79. package/dist/states/test/mockEphemeralRuntime.js.map +1 -0
  80. package/dist/states/test/notificationsManager.spec.js +460 -0
  81. package/dist/states/test/notificationsManager.spec.js.map +1 -0
  82. package/dist/states/test/presenceStates.spec.js +73 -0
  83. package/dist/states/test/presenceStates.spec.js.map +1 -0
  84. package/dist/states/test/schemaValidation/protocol.spec.js +246 -0
  85. package/dist/states/test/schemaValidation/protocol.spec.js.map +1 -0
  86. package/dist/states/test/schemaValidation/valueManagers.spec.js +784 -0
  87. package/dist/states/test/schemaValidation/valueManagers.spec.js.map +1 -0
  88. package/dist/states/test/testUtils.js +21 -0
  89. package/dist/states/test/testUtils.js.map +1 -0
  90. package/dist/states/validatedGetter.d.ts +18 -0
  91. package/dist/states/validatedGetter.d.ts.map +1 -0
  92. package/dist/states/validatedGetter.js +43 -0
  93. package/dist/states/validatedGetter.js.map +1 -0
  94. package/dist/test/mockEphemeralRuntime.js +175 -0
  95. package/dist/test/mockEphemeralRuntime.js.map +1 -0
  96. package/dist/test/testUtils.js +262 -0
  97. package/dist/test/testUtils.js.map +1 -0
  98. package/dist/test/utils/index.js +27 -0
  99. package/dist/test/utils/index.js.map +1 -0
  100. package/dist/utils/broadcastControls.d.ts +37 -0
  101. package/dist/utils/broadcastControls.d.ts.map +1 -0
  102. package/dist/utils/broadcastControls.js +60 -0
  103. package/dist/utils/broadcastControls.js.map +1 -0
  104. package/dist/utils/index.d.ts +9 -0
  105. package/dist/utils/index.d.ts.map +1 -0
  106. package/dist/utils/index.js +26 -0
  107. package/dist/utils/index.js.map +1 -0
  108. package/dist/utils/internalUtils.d.ts +125 -0
  109. package/dist/utils/internalUtils.d.ts.map +1 -0
  110. package/dist/utils/internalUtils.js +99 -0
  111. package/dist/utils/internalUtils.js.map +1 -0
  112. package/dist/utils/test/timerManager.spec.js +93 -0
  113. package/dist/utils/test/timerManager.spec.js.map +1 -0
  114. package/dist/utils/timerManager.d.ts +37 -0
  115. package/dist/utils/timerManager.d.ts.map +1 -0
  116. package/dist/utils/timerManager.js +65 -0
  117. package/dist/utils/timerManager.js.map +1 -0
  118. package/dist/utils/valueManager.d.ts +14 -0
  119. package/dist/utils/valueManager.d.ts.map +1 -0
  120. package/dist/utils/valueManager.js +22 -0
  121. package/dist/utils/valueManager.js.map +1 -0
  122. package/dist/workspace/index.d.ts +7 -0
  123. package/dist/workspace/index.d.ts.map +1 -0
  124. package/dist/workspace/index.js +14 -0
  125. package/dist/workspace/index.js.map +1 -0
  126. package/dist/workspace/presenceStates.d.ts +61 -0
  127. package/dist/workspace/presenceStates.d.ts.map +1 -0
  128. package/dist/workspace/presenceStates.js +235 -0
  129. package/dist/workspace/presenceStates.js.map +1 -0
  130. package/dist/workspace/stateDatastore.d.ts +17 -0
  131. package/dist/workspace/stateDatastore.d.ts.map +1 -0
  132. package/dist/workspace/stateDatastore.js +24 -0
  133. package/dist/workspace/stateDatastore.js.map +1 -0
  134. package/lib/packageVersion.d.ts +9 -0
  135. package/lib/packageVersion.d.ts.map +1 -0
  136. package/lib/packageVersion.js +9 -0
  137. package/lib/packageVersion.js.map +1 -0
  138. package/lib/runtime/extension/containerPresence.d.ts +53 -0
  139. package/lib/runtime/extension/containerPresence.d.ts.map +1 -0
  140. package/lib/runtime/extension/containerPresence.js +87 -0
  141. package/lib/runtime/extension/containerPresence.js.map +1 -0
  142. package/lib/runtime/extension/index.d.ts +6 -0
  143. package/lib/runtime/extension/index.d.ts.map +1 -0
  144. package/lib/runtime/extension/index.js +6 -0
  145. package/lib/runtime/extension/index.js.map +1 -0
  146. package/lib/runtime/presenceDatastoreManager.d.ts +146 -0
  147. package/lib/runtime/presenceDatastoreManager.d.ts.map +1 -0
  148. package/lib/runtime/presenceDatastoreManager.js +662 -0
  149. package/lib/runtime/presenceDatastoreManager.js.map +1 -0
  150. package/lib/runtime/presenceManager.d.ts +16 -0
  151. package/lib/runtime/presenceManager.d.ts.map +1 -0
  152. package/lib/runtime/presenceManager.js +136 -0
  153. package/lib/runtime/presenceManager.js.map +1 -0
  154. package/lib/runtime/protocol.d.ts +126 -0
  155. package/lib/runtime/protocol.d.ts.map +1 -0
  156. package/lib/runtime/protocol.js +17 -0
  157. package/lib/runtime/protocol.js.map +1 -0
  158. package/lib/runtime/runtimeTypes.d.ts +26 -0
  159. package/lib/runtime/runtimeTypes.d.ts.map +1 -0
  160. package/lib/runtime/runtimeTypes.js +6 -0
  161. package/lib/runtime/runtimeTypes.js.map +1 -0
  162. package/lib/runtime/systemWorkspace.d.ts +39 -0
  163. package/lib/runtime/systemWorkspace.d.ts.map +1 -0
  164. package/lib/runtime/systemWorkspace.js +260 -0
  165. package/lib/runtime/systemWorkspace.js.map +1 -0
  166. package/lib/runtime/test/presenceDatastoreManager.spec.js +616 -0
  167. package/lib/runtime/test/presenceDatastoreManager.spec.js.map +1 -0
  168. package/lib/runtime/test/presenceManager.spec.js +649 -0
  169. package/lib/runtime/test/presenceManager.spec.js.map +1 -0
  170. package/lib/runtime/test.d.ts +12 -0
  171. package/lib/runtime/test.d.ts.map +1 -0
  172. package/lib/runtime/test.js +10 -0
  173. package/lib/runtime/test.js.map +1 -0
  174. package/lib/states/index.d.ts +7 -0
  175. package/lib/states/index.d.ts.map +1 -0
  176. package/lib/states/index.js +7 -0
  177. package/lib/states/index.js.map +1 -0
  178. package/lib/states/latestMapValueManager.d.ts +10 -0
  179. package/lib/states/latestMapValueManager.d.ts.map +1 -0
  180. package/lib/states/latestMapValueManager.js +244 -0
  181. package/lib/states/latestMapValueManager.js.map +1 -0
  182. package/lib/states/latestValueManager.d.ts +10 -0
  183. package/lib/states/latestValueManager.d.ts.map +1 -0
  184. package/lib/states/latestValueManager.js +111 -0
  185. package/lib/states/latestValueManager.js.map +1 -0
  186. package/lib/states/notificationsManager.d.ts +26 -0
  187. package/lib/states/notificationsManager.d.ts.map +1 -0
  188. package/lib/states/notificationsManager.js +93 -0
  189. package/lib/states/notificationsManager.js.map +1 -0
  190. package/lib/states/presence.d.ts +11 -0
  191. package/lib/states/presence.d.ts.map +1 -0
  192. package/lib/states/presence.js +6 -0
  193. package/lib/states/presence.js.map +1 -0
  194. package/lib/states/stateFactory.d.ts +18 -0
  195. package/lib/states/stateFactory.d.ts.map +1 -0
  196. package/lib/states/stateFactory.js +20 -0
  197. package/lib/states/stateFactory.js.map +1 -0
  198. package/lib/states/test/batching.spec.js +841 -0
  199. package/lib/states/test/batching.spec.js.map +1 -0
  200. package/lib/states/test/broadcastControlsTests.js +56 -0
  201. package/lib/states/test/broadcastControlsTests.js.map +1 -0
  202. package/lib/states/test/eventing.spec.js +574 -0
  203. package/lib/states/test/eventing.spec.js.map +1 -0
  204. package/lib/states/test/latestMapValueManager.spec.js +206 -0
  205. package/lib/states/test/latestMapValueManager.spec.js.map +1 -0
  206. package/lib/states/test/latestValueManager.spec.js +189 -0
  207. package/lib/states/test/latestValueManager.spec.js.map +1 -0
  208. package/lib/states/test/mockEphemeralRuntime.js +6 -0
  209. package/lib/states/test/mockEphemeralRuntime.js.map +1 -0
  210. package/lib/states/test/notificationsManager.spec.js +456 -0
  211. package/lib/states/test/notificationsManager.spec.js.map +1 -0
  212. package/lib/states/test/presenceStates.spec.js +69 -0
  213. package/lib/states/test/presenceStates.spec.js.map +1 -0
  214. package/lib/states/test/schemaValidation/protocol.spec.js +244 -0
  215. package/lib/states/test/schemaValidation/protocol.spec.js.map +1 -0
  216. package/lib/states/test/schemaValidation/valueManagers.spec.js +782 -0
  217. package/lib/states/test/schemaValidation/valueManagers.spec.js.map +1 -0
  218. package/lib/states/test/testUtils.js +6 -0
  219. package/lib/states/test/testUtils.js.map +1 -0
  220. package/lib/states/validatedGetter.d.ts +18 -0
  221. package/lib/states/validatedGetter.d.ts.map +1 -0
  222. package/lib/states/validatedGetter.js +39 -0
  223. package/lib/states/validatedGetter.js.map +1 -0
  224. package/lib/test/mockEphemeralRuntime.js +171 -0
  225. package/lib/test/mockEphemeralRuntime.js.map +1 -0
  226. package/lib/test/testUtils.js +251 -0
  227. package/lib/test/testUtils.js.map +1 -0
  228. package/lib/test/utils/index.js +8 -0
  229. package/lib/test/utils/index.js.map +1 -0
  230. package/lib/utils/broadcastControls.d.ts +37 -0
  231. package/lib/utils/broadcastControls.d.ts.map +1 -0
  232. package/lib/utils/broadcastControls.js +55 -0
  233. package/lib/utils/broadcastControls.js.map +1 -0
  234. package/lib/utils/index.d.ts +9 -0
  235. package/lib/utils/index.d.ts.map +1 -0
  236. package/lib/utils/index.js +9 -0
  237. package/lib/utils/index.js.map +1 -0
  238. package/lib/utils/internalUtils.d.ts +125 -0
  239. package/lib/utils/internalUtils.d.ts.map +1 -0
  240. package/lib/utils/internalUtils.js +90 -0
  241. package/lib/utils/internalUtils.js.map +1 -0
  242. package/lib/utils/test/timerManager.spec.js +91 -0
  243. package/lib/utils/test/timerManager.spec.js.map +1 -0
  244. package/lib/utils/timerManager.d.ts +37 -0
  245. package/lib/utils/timerManager.d.ts.map +1 -0
  246. package/lib/utils/timerManager.js +61 -0
  247. package/lib/utils/timerManager.js.map +1 -0
  248. package/lib/utils/valueManager.d.ts +14 -0
  249. package/lib/utils/valueManager.d.ts.map +1 -0
  250. package/lib/utils/valueManager.js +17 -0
  251. package/lib/utils/valueManager.js.map +1 -0
  252. package/lib/workspace/index.d.ts +7 -0
  253. package/lib/workspace/index.d.ts.map +1 -0
  254. package/lib/workspace/index.js +7 -0
  255. package/lib/workspace/index.js.map +1 -0
  256. package/lib/workspace/presenceStates.d.ts +61 -0
  257. package/lib/workspace/presenceStates.d.ts.map +1 -0
  258. package/lib/workspace/presenceStates.js +229 -0
  259. package/lib/workspace/presenceStates.js.map +1 -0
  260. package/lib/workspace/stateDatastore.d.ts +17 -0
  261. package/lib/workspace/stateDatastore.d.ts.map +1 -0
  262. package/lib/workspace/stateDatastore.js +19 -0
  263. package/lib/workspace/stateDatastore.js.map +1 -0
  264. package/package.json +158 -0
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,60 @@
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
+ exports.addControlsTests = void 0;
8
+ const node_assert_1 = require("node:assert");
9
+ const test_1 = require("@fluid-internal/presence-runtime/internal/test");
10
+ const mockEphemeralRuntime_js_1 = require("./mockEphemeralRuntime.js");
11
+ const testDefaultAllowableUpdateLatencyMs = 100;
12
+ /**
13
+ * Adds set of test for common {@link BroadcastControls} implementations.
14
+ *
15
+ * @param createControls - Function to create the `controls` provider object
16
+ */
17
+ function addControlsTests(createControls) {
18
+ describe("controls allowableUpdateLatencyMs", () => {
19
+ it("can be specified during create", () => {
20
+ // Setup
21
+ const presence = (0, test_1.createPresenceManager)(new mockEphemeralRuntime_js_1.MockEphemeralRuntime());
22
+ // Act
23
+ const controlsProvider = createControls(presence, {
24
+ allowableUpdateLatencyMs: testDefaultAllowableUpdateLatencyMs,
25
+ });
26
+ // Verify
27
+ node_assert_1.strict.equal(controlsProvider.controls.allowableUpdateLatencyMs, testDefaultAllowableUpdateLatencyMs);
28
+ });
29
+ it("can be changed", () => {
30
+ // Setup
31
+ const presence = (0, test_1.createPresenceManager)(new mockEphemeralRuntime_js_1.MockEphemeralRuntime());
32
+ const controlsProvider = createControls(presence, {
33
+ allowableUpdateLatencyMs: testDefaultAllowableUpdateLatencyMs,
34
+ });
35
+ // Act
36
+ controlsProvider.controls.allowableUpdateLatencyMs = 200;
37
+ // Verify
38
+ node_assert_1.strict.equal(controlsProvider.controls.allowableUpdateLatencyMs, 200);
39
+ });
40
+ it("can be reset to system default", () => {
41
+ // Setup
42
+ // First read value of system default from init without any settings
43
+ let presence = (0, test_1.createPresenceManager)(new mockEphemeralRuntime_js_1.MockEphemeralRuntime());
44
+ let controlsProvider = createControls(presence, undefined);
45
+ const systemDefault = controlsProvider.controls.allowableUpdateLatencyMs;
46
+ node_assert_1.strict.notEqual(testDefaultAllowableUpdateLatencyMs, systemDefault, "test internal error: Test value matches system default value");
47
+ // Recreate controls with custom settings specified
48
+ presence = (0, test_1.createPresenceManager)(new mockEphemeralRuntime_js_1.MockEphemeralRuntime());
49
+ controlsProvider = createControls(presence, {
50
+ allowableUpdateLatencyMs: testDefaultAllowableUpdateLatencyMs,
51
+ });
52
+ // Act
53
+ controlsProvider.controls.allowableUpdateLatencyMs = undefined;
54
+ // Verify
55
+ node_assert_1.strict.equal(controlsProvider.controls.allowableUpdateLatencyMs, systemDefault);
56
+ });
57
+ });
58
+ }
59
+ exports.addControlsTests = addControlsTests;
60
+ //# sourceMappingURL=broadcastControlsTests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcastControlsTests.js","sourceRoot":"","sources":["../../../src/states/test/broadcastControlsTests.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6CAA+C;AAQ/C,yEAAuF;AAEvF,uEAAiE;AAEjE,MAAM,mCAAmC,GAAG,GAAG,CAAC;AAEhD;;;;GAIG;AACH,SAAgB,gBAAgB,CAC/B,cAGoC;IAEpC,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACzC,QAAQ;YACR,MAAM,QAAQ,GAAG,IAAA,4BAAqB,EAAC,IAAI,8CAAoB,EAAE,CAAC,CAAC;YAEnE,MAAM;YACN,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,EAAE;gBACjD,wBAAwB,EAAE,mCAAmC;aAC7D,CAAC,CAAC;YAEH,SAAS;YACT,oBAAM,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,IAAA,4BAAqB,EAAC,IAAI,8CAAoB,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,oBAAM,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,IAAA,4BAAqB,EAAC,IAAI,8CAAoB,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,oBAAM,CAAC,QAAQ,CACd,mCAAmC,EACnC,aAAa,EACb,8DAA8D,CAC9D,CAAC;YAEF,mDAAmD;YACnD,QAAQ,GAAG,IAAA,4BAAqB,EAAC,IAAI,8CAAoB,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,oBAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AA9DD,4CA8DC","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"]}