@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.
- package/LICENSE +21 -0
- package/README.md +72 -0
- package/dist/package.json +4 -0
- package/dist/packageVersion.d.ts +9 -0
- package/dist/packageVersion.d.ts.map +1 -0
- package/dist/packageVersion.js +12 -0
- package/dist/packageVersion.js.map +1 -0
- package/dist/runtime/extension/containerPresence.d.ts +53 -0
- package/dist/runtime/extension/containerPresence.d.ts.map +1 -0
- package/dist/runtime/extension/containerPresence.js +90 -0
- package/dist/runtime/extension/containerPresence.js.map +1 -0
- package/dist/runtime/extension/index.d.ts +6 -0
- package/dist/runtime/extension/index.d.ts.map +1 -0
- package/dist/runtime/extension/index.js +11 -0
- package/dist/runtime/extension/index.js.map +1 -0
- package/dist/runtime/presenceDatastoreManager.d.ts +146 -0
- package/dist/runtime/presenceDatastoreManager.d.ts.map +1 -0
- package/dist/runtime/presenceDatastoreManager.js +666 -0
- package/dist/runtime/presenceDatastoreManager.js.map +1 -0
- package/dist/runtime/presenceManager.d.ts +16 -0
- package/dist/runtime/presenceManager.d.ts.map +1 -0
- package/dist/runtime/presenceManager.js +140 -0
- package/dist/runtime/presenceManager.js.map +1 -0
- package/dist/runtime/protocol.d.ts +126 -0
- package/dist/runtime/protocol.d.ts.map +1 -0
- package/dist/runtime/protocol.js +20 -0
- package/dist/runtime/protocol.js.map +1 -0
- package/dist/runtime/runtimeTypes.d.ts +26 -0
- package/dist/runtime/runtimeTypes.d.ts.map +1 -0
- package/dist/runtime/runtimeTypes.js +7 -0
- package/dist/runtime/runtimeTypes.js.map +1 -0
- package/dist/runtime/systemWorkspace.d.ts +39 -0
- package/dist/runtime/systemWorkspace.d.ts.map +1 -0
- package/dist/runtime/systemWorkspace.js +264 -0
- package/dist/runtime/systemWorkspace.js.map +1 -0
- package/dist/runtime/test/presenceDatastoreManager.spec.js +618 -0
- package/dist/runtime/test/presenceDatastoreManager.spec.js.map +1 -0
- package/dist/runtime/test/presenceManager.spec.js +651 -0
- package/dist/runtime/test/presenceManager.spec.js.map +1 -0
- package/dist/runtime/test.d.ts +12 -0
- package/dist/runtime/test.d.ts.map +1 -0
- package/dist/runtime/test.js +15 -0
- package/dist/runtime/test.js.map +1 -0
- package/dist/states/index.d.ts +7 -0
- package/dist/states/index.d.ts.map +1 -0
- package/dist/states/index.js +12 -0
- package/dist/states/index.js.map +1 -0
- package/dist/states/latestMapValueManager.d.ts +10 -0
- package/dist/states/latestMapValueManager.d.ts.map +1 -0
- package/dist/states/latestMapValueManager.js +248 -0
- package/dist/states/latestMapValueManager.js.map +1 -0
- package/dist/states/latestValueManager.d.ts +10 -0
- package/dist/states/latestValueManager.d.ts.map +1 -0
- package/dist/states/latestValueManager.js +115 -0
- package/dist/states/latestValueManager.js.map +1 -0
- package/dist/states/notificationsManager.d.ts +26 -0
- package/dist/states/notificationsManager.d.ts.map +1 -0
- package/dist/states/notificationsManager.js +97 -0
- package/dist/states/notificationsManager.js.map +1 -0
- package/dist/states/presence.d.ts +11 -0
- package/dist/states/presence.d.ts.map +1 -0
- package/dist/states/presence.js +7 -0
- package/dist/states/presence.js.map +1 -0
- package/dist/states/stateFactory.d.ts +18 -0
- package/dist/states/stateFactory.d.ts.map +1 -0
- package/dist/states/stateFactory.js +23 -0
- package/dist/states/stateFactory.js.map +1 -0
- package/dist/states/test/batching.spec.js +843 -0
- package/dist/states/test/batching.spec.js.map +1 -0
- package/dist/states/test/broadcastControlsTests.js +60 -0
- package/dist/states/test/broadcastControlsTests.js.map +1 -0
- package/dist/states/test/eventing.spec.js +576 -0
- package/dist/states/test/eventing.spec.js.map +1 -0
- package/dist/states/test/latestMapValueManager.spec.js +210 -0
- package/dist/states/test/latestMapValueManager.spec.js.map +1 -0
- package/dist/states/test/latestValueManager.spec.js +193 -0
- package/dist/states/test/latestValueManager.spec.js.map +1 -0
- package/dist/states/test/mockEphemeralRuntime.js +11 -0
- package/dist/states/test/mockEphemeralRuntime.js.map +1 -0
- package/dist/states/test/notificationsManager.spec.js +460 -0
- package/dist/states/test/notificationsManager.spec.js.map +1 -0
- package/dist/states/test/presenceStates.spec.js +73 -0
- package/dist/states/test/presenceStates.spec.js.map +1 -0
- package/dist/states/test/schemaValidation/protocol.spec.js +246 -0
- package/dist/states/test/schemaValidation/protocol.spec.js.map +1 -0
- package/dist/states/test/schemaValidation/valueManagers.spec.js +784 -0
- package/dist/states/test/schemaValidation/valueManagers.spec.js.map +1 -0
- package/dist/states/test/testUtils.js +21 -0
- package/dist/states/test/testUtils.js.map +1 -0
- package/dist/states/validatedGetter.d.ts +18 -0
- package/dist/states/validatedGetter.d.ts.map +1 -0
- package/dist/states/validatedGetter.js +43 -0
- package/dist/states/validatedGetter.js.map +1 -0
- package/dist/test/mockEphemeralRuntime.js +175 -0
- package/dist/test/mockEphemeralRuntime.js.map +1 -0
- package/dist/test/testUtils.js +262 -0
- package/dist/test/testUtils.js.map +1 -0
- package/dist/test/utils/index.js +27 -0
- package/dist/test/utils/index.js.map +1 -0
- package/dist/utils/broadcastControls.d.ts +37 -0
- package/dist/utils/broadcastControls.d.ts.map +1 -0
- package/dist/utils/broadcastControls.js +60 -0
- package/dist/utils/broadcastControls.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +26 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/internalUtils.d.ts +125 -0
- package/dist/utils/internalUtils.d.ts.map +1 -0
- package/dist/utils/internalUtils.js +99 -0
- package/dist/utils/internalUtils.js.map +1 -0
- package/dist/utils/test/timerManager.spec.js +93 -0
- package/dist/utils/test/timerManager.spec.js.map +1 -0
- package/dist/utils/timerManager.d.ts +37 -0
- package/dist/utils/timerManager.d.ts.map +1 -0
- package/dist/utils/timerManager.js +65 -0
- package/dist/utils/timerManager.js.map +1 -0
- package/dist/utils/valueManager.d.ts +14 -0
- package/dist/utils/valueManager.d.ts.map +1 -0
- package/dist/utils/valueManager.js +22 -0
- package/dist/utils/valueManager.js.map +1 -0
- package/dist/workspace/index.d.ts +7 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +14 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/presenceStates.d.ts +61 -0
- package/dist/workspace/presenceStates.d.ts.map +1 -0
- package/dist/workspace/presenceStates.js +235 -0
- package/dist/workspace/presenceStates.js.map +1 -0
- package/dist/workspace/stateDatastore.d.ts +17 -0
- package/dist/workspace/stateDatastore.d.ts.map +1 -0
- package/dist/workspace/stateDatastore.js +24 -0
- package/dist/workspace/stateDatastore.js.map +1 -0
- package/lib/packageVersion.d.ts +9 -0
- package/lib/packageVersion.d.ts.map +1 -0
- package/lib/packageVersion.js +9 -0
- package/lib/packageVersion.js.map +1 -0
- package/lib/runtime/extension/containerPresence.d.ts +53 -0
- package/lib/runtime/extension/containerPresence.d.ts.map +1 -0
- package/lib/runtime/extension/containerPresence.js +87 -0
- package/lib/runtime/extension/containerPresence.js.map +1 -0
- package/lib/runtime/extension/index.d.ts +6 -0
- package/lib/runtime/extension/index.d.ts.map +1 -0
- package/lib/runtime/extension/index.js +6 -0
- package/lib/runtime/extension/index.js.map +1 -0
- package/lib/runtime/presenceDatastoreManager.d.ts +146 -0
- package/lib/runtime/presenceDatastoreManager.d.ts.map +1 -0
- package/lib/runtime/presenceDatastoreManager.js +662 -0
- package/lib/runtime/presenceDatastoreManager.js.map +1 -0
- package/lib/runtime/presenceManager.d.ts +16 -0
- package/lib/runtime/presenceManager.d.ts.map +1 -0
- package/lib/runtime/presenceManager.js +136 -0
- package/lib/runtime/presenceManager.js.map +1 -0
- package/lib/runtime/protocol.d.ts +126 -0
- package/lib/runtime/protocol.d.ts.map +1 -0
- package/lib/runtime/protocol.js +17 -0
- package/lib/runtime/protocol.js.map +1 -0
- package/lib/runtime/runtimeTypes.d.ts +26 -0
- package/lib/runtime/runtimeTypes.d.ts.map +1 -0
- package/lib/runtime/runtimeTypes.js +6 -0
- package/lib/runtime/runtimeTypes.js.map +1 -0
- package/lib/runtime/systemWorkspace.d.ts +39 -0
- package/lib/runtime/systemWorkspace.d.ts.map +1 -0
- package/lib/runtime/systemWorkspace.js +260 -0
- package/lib/runtime/systemWorkspace.js.map +1 -0
- package/lib/runtime/test/presenceDatastoreManager.spec.js +616 -0
- package/lib/runtime/test/presenceDatastoreManager.spec.js.map +1 -0
- package/lib/runtime/test/presenceManager.spec.js +649 -0
- package/lib/runtime/test/presenceManager.spec.js.map +1 -0
- package/lib/runtime/test.d.ts +12 -0
- package/lib/runtime/test.d.ts.map +1 -0
- package/lib/runtime/test.js +10 -0
- package/lib/runtime/test.js.map +1 -0
- package/lib/states/index.d.ts +7 -0
- package/lib/states/index.d.ts.map +1 -0
- package/lib/states/index.js +7 -0
- package/lib/states/index.js.map +1 -0
- package/lib/states/latestMapValueManager.d.ts +10 -0
- package/lib/states/latestMapValueManager.d.ts.map +1 -0
- package/lib/states/latestMapValueManager.js +244 -0
- package/lib/states/latestMapValueManager.js.map +1 -0
- package/lib/states/latestValueManager.d.ts +10 -0
- package/lib/states/latestValueManager.d.ts.map +1 -0
- package/lib/states/latestValueManager.js +111 -0
- package/lib/states/latestValueManager.js.map +1 -0
- package/lib/states/notificationsManager.d.ts +26 -0
- package/lib/states/notificationsManager.d.ts.map +1 -0
- package/lib/states/notificationsManager.js +93 -0
- package/lib/states/notificationsManager.js.map +1 -0
- package/lib/states/presence.d.ts +11 -0
- package/lib/states/presence.d.ts.map +1 -0
- package/lib/states/presence.js +6 -0
- package/lib/states/presence.js.map +1 -0
- package/lib/states/stateFactory.d.ts +18 -0
- package/lib/states/stateFactory.d.ts.map +1 -0
- package/lib/states/stateFactory.js +20 -0
- package/lib/states/stateFactory.js.map +1 -0
- package/lib/states/test/batching.spec.js +841 -0
- package/lib/states/test/batching.spec.js.map +1 -0
- package/lib/states/test/broadcastControlsTests.js +56 -0
- package/lib/states/test/broadcastControlsTests.js.map +1 -0
- package/lib/states/test/eventing.spec.js +574 -0
- package/lib/states/test/eventing.spec.js.map +1 -0
- package/lib/states/test/latestMapValueManager.spec.js +206 -0
- package/lib/states/test/latestMapValueManager.spec.js.map +1 -0
- package/lib/states/test/latestValueManager.spec.js +189 -0
- package/lib/states/test/latestValueManager.spec.js.map +1 -0
- package/lib/states/test/mockEphemeralRuntime.js +6 -0
- package/lib/states/test/mockEphemeralRuntime.js.map +1 -0
- package/lib/states/test/notificationsManager.spec.js +456 -0
- package/lib/states/test/notificationsManager.spec.js.map +1 -0
- package/lib/states/test/presenceStates.spec.js +69 -0
- package/lib/states/test/presenceStates.spec.js.map +1 -0
- package/lib/states/test/schemaValidation/protocol.spec.js +244 -0
- package/lib/states/test/schemaValidation/protocol.spec.js.map +1 -0
- package/lib/states/test/schemaValidation/valueManagers.spec.js +782 -0
- package/lib/states/test/schemaValidation/valueManagers.spec.js.map +1 -0
- package/lib/states/test/testUtils.js +6 -0
- package/lib/states/test/testUtils.js.map +1 -0
- package/lib/states/validatedGetter.d.ts +18 -0
- package/lib/states/validatedGetter.d.ts.map +1 -0
- package/lib/states/validatedGetter.js +39 -0
- package/lib/states/validatedGetter.js.map +1 -0
- package/lib/test/mockEphemeralRuntime.js +171 -0
- package/lib/test/mockEphemeralRuntime.js.map +1 -0
- package/lib/test/testUtils.js +251 -0
- package/lib/test/testUtils.js.map +1 -0
- package/lib/test/utils/index.js +8 -0
- package/lib/test/utils/index.js.map +1 -0
- package/lib/utils/broadcastControls.d.ts +37 -0
- package/lib/utils/broadcastControls.d.ts.map +1 -0
- package/lib/utils/broadcastControls.js +55 -0
- package/lib/utils/broadcastControls.js.map +1 -0
- package/lib/utils/index.d.ts +9 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +9 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/internalUtils.d.ts +125 -0
- package/lib/utils/internalUtils.d.ts.map +1 -0
- package/lib/utils/internalUtils.js +90 -0
- package/lib/utils/internalUtils.js.map +1 -0
- package/lib/utils/test/timerManager.spec.js +91 -0
- package/lib/utils/test/timerManager.spec.js.map +1 -0
- package/lib/utils/timerManager.d.ts +37 -0
- package/lib/utils/timerManager.d.ts.map +1 -0
- package/lib/utils/timerManager.js +61 -0
- package/lib/utils/timerManager.js.map +1 -0
- package/lib/utils/valueManager.d.ts +14 -0
- package/lib/utils/valueManager.d.ts.map +1 -0
- package/lib/utils/valueManager.js +17 -0
- package/lib/utils/valueManager.js.map +1 -0
- package/lib/workspace/index.d.ts +7 -0
- package/lib/workspace/index.d.ts.map +1 -0
- package/lib/workspace/index.js +7 -0
- package/lib/workspace/index.js.map +1 -0
- package/lib/workspace/presenceStates.d.ts +61 -0
- package/lib/workspace/presenceStates.d.ts.map +1 -0
- package/lib/workspace/presenceStates.js +229 -0
- package/lib/workspace/presenceStates.js.map +1 -0
- package/lib/workspace/stateDatastore.d.ts +17 -0
- package/lib/workspace/stateDatastore.d.ts.map +1 -0
- package/lib/workspace/stateDatastore.js +19 -0
- package/lib/workspace/stateDatastore.js.map +1 -0
- 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,56 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|