@fluid-internal/presence-runtime 2.102.0 → 2.103.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/packageVersion.d.ts +1 -1
  2. package/dist/packageVersion.js +1 -1
  3. package/dist/packageVersion.js.map +1 -1
  4. package/dist/runtime/extension/containerPresence.d.ts +1 -1
  5. package/dist/runtime/presenceDatastoreManager.d.ts +2 -2
  6. package/dist/runtime/presenceDatastoreManager.d.ts.map +1 -1
  7. package/dist/runtime/presenceDatastoreManager.js.map +1 -1
  8. package/dist/runtime/presenceManager.js.map +1 -1
  9. package/lib/packageVersion.d.ts +1 -1
  10. package/lib/packageVersion.js +1 -1
  11. package/lib/packageVersion.js.map +1 -1
  12. package/lib/runtime/extension/containerPresence.d.ts +1 -1
  13. package/lib/runtime/presenceDatastoreManager.d.ts +2 -2
  14. package/lib/runtime/presenceDatastoreManager.d.ts.map +1 -1
  15. package/lib/runtime/presenceDatastoreManager.js.map +1 -1
  16. package/lib/runtime/presenceManager.js.map +1 -1
  17. package/package.json +14 -14
  18. package/dist/runtime/test/presenceDatastoreManager.spec.js +0 -618
  19. package/dist/runtime/test/presenceDatastoreManager.spec.js.map +0 -1
  20. package/dist/runtime/test/presenceManager.spec.js +0 -651
  21. package/dist/runtime/test/presenceManager.spec.js.map +0 -1
  22. package/dist/states/test/batching.spec.js +0 -843
  23. package/dist/states/test/batching.spec.js.map +0 -1
  24. package/dist/states/test/broadcastControlsTests.js +0 -60
  25. package/dist/states/test/broadcastControlsTests.js.map +0 -1
  26. package/dist/states/test/eventing.spec.js +0 -576
  27. package/dist/states/test/eventing.spec.js.map +0 -1
  28. package/dist/states/test/latestMapValueManager.spec.js +0 -210
  29. package/dist/states/test/latestMapValueManager.spec.js.map +0 -1
  30. package/dist/states/test/latestValueManager.spec.js +0 -193
  31. package/dist/states/test/latestValueManager.spec.js.map +0 -1
  32. package/dist/states/test/mockEphemeralRuntime.js +0 -11
  33. package/dist/states/test/mockEphemeralRuntime.js.map +0 -1
  34. package/dist/states/test/notificationsManager.spec.js +0 -460
  35. package/dist/states/test/notificationsManager.spec.js.map +0 -1
  36. package/dist/states/test/presenceStates.spec.js +0 -73
  37. package/dist/states/test/presenceStates.spec.js.map +0 -1
  38. package/dist/states/test/schemaValidation/protocol.spec.js +0 -246
  39. package/dist/states/test/schemaValidation/protocol.spec.js.map +0 -1
  40. package/dist/states/test/schemaValidation/valueManagers.spec.js +0 -784
  41. package/dist/states/test/schemaValidation/valueManagers.spec.js.map +0 -1
  42. package/dist/states/test/testUtils.js +0 -21
  43. package/dist/states/test/testUtils.js.map +0 -1
  44. package/dist/test/mockEphemeralRuntime.js +0 -175
  45. package/dist/test/mockEphemeralRuntime.js.map +0 -1
  46. package/dist/test/testUtils.js +0 -262
  47. package/dist/test/testUtils.js.map +0 -1
  48. package/dist/test/utils/index.js +0 -27
  49. package/dist/test/utils/index.js.map +0 -1
  50. package/dist/utils/test/timerManager.spec.js +0 -93
  51. package/dist/utils/test/timerManager.spec.js.map +0 -1
  52. package/lib/runtime/test/presenceDatastoreManager.spec.js +0 -616
  53. package/lib/runtime/test/presenceDatastoreManager.spec.js.map +0 -1
  54. package/lib/runtime/test/presenceManager.spec.js +0 -649
  55. package/lib/runtime/test/presenceManager.spec.js.map +0 -1
  56. package/lib/states/test/batching.spec.js +0 -841
  57. package/lib/states/test/batching.spec.js.map +0 -1
  58. package/lib/states/test/broadcastControlsTests.js +0 -56
  59. package/lib/states/test/broadcastControlsTests.js.map +0 -1
  60. package/lib/states/test/eventing.spec.js +0 -574
  61. package/lib/states/test/eventing.spec.js.map +0 -1
  62. package/lib/states/test/latestMapValueManager.spec.js +0 -206
  63. package/lib/states/test/latestMapValueManager.spec.js.map +0 -1
  64. package/lib/states/test/latestValueManager.spec.js +0 -189
  65. package/lib/states/test/latestValueManager.spec.js.map +0 -1
  66. package/lib/states/test/mockEphemeralRuntime.js +0 -6
  67. package/lib/states/test/mockEphemeralRuntime.js.map +0 -1
  68. package/lib/states/test/notificationsManager.spec.js +0 -456
  69. package/lib/states/test/notificationsManager.spec.js.map +0 -1
  70. package/lib/states/test/presenceStates.spec.js +0 -69
  71. package/lib/states/test/presenceStates.spec.js.map +0 -1
  72. package/lib/states/test/schemaValidation/protocol.spec.js +0 -244
  73. package/lib/states/test/schemaValidation/protocol.spec.js.map +0 -1
  74. package/lib/states/test/schemaValidation/valueManagers.spec.js +0 -782
  75. package/lib/states/test/schemaValidation/valueManagers.spec.js.map +0 -1
  76. package/lib/states/test/testUtils.js +0 -6
  77. package/lib/states/test/testUtils.js.map +0 -1
  78. package/lib/test/mockEphemeralRuntime.js +0 -171
  79. package/lib/test/mockEphemeralRuntime.js.map +0 -1
  80. package/lib/test/testUtils.js +0 -251
  81. package/lib/test/testUtils.js.map +0 -1
  82. package/lib/test/utils/index.js +0 -8
  83. package/lib/test/utils/index.js.map +0 -1
  84. package/lib/utils/test/timerManager.spec.js +0 -91
  85. package/lib/utils/test/timerManager.spec.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"presenceDatastoreManager.spec.js","sourceRoot":"","sources":["../../../src/runtime/test/presenceDatastoreManager.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\tClientConnectionId,\n\tPresenceWithNotifications,\n} from \"@fluid-internal/presence-definitions\";\nimport type {\n\tInboundExtensionMessage,\n\tRawInboundExtensionMessage,\n} from \"@fluidframework/container-runtime-definitions/internal\";\nimport type { JsonSerializable, TypedMessage } from \"@fluidframework/core-interfaces/internal\";\nimport { validateAssertionError } from \"@fluidframework/test-runtime-utils/internal\";\nimport { EventAndErrorTrackingLogger } from \"@fluidframework/test-utils/internal\";\nimport type { SinonFakeTimers } from \"sinon\";\nimport { useFakeTimers, spy } from \"sinon\";\n\nimport type { ProcessSignalFunction } from \"@fluid-internal/presence-runtime/internal/test-utils\";\nimport {\n\tassertFinalExpectations,\n\tattendeeId1,\n\tinitialLocalClientConnectionId,\n\tlocalAttendeeId,\n\tcreateSpecificAttendeeId,\n\tMockEphemeralRuntime,\n\tprepareConnectedPresence,\n} from \"@fluid-internal/presence-runtime/internal/test-utils\";\nimport { toOpaqueJson } from \"@fluid-internal/presence-runtime/utils\";\n\nimport { broadcastJoinResponseDelaysMs } from \"../presenceDatastoreManager.js\";\nimport { createPresenceManager } from \"../presenceManager.js\";\nimport type {\n\tInternalWorkspaceAddress,\n\tSignalMessages,\n\tSystemWorkspaceDatastore,\n} from \"../protocol.js\";\n\nconst attendee0SystemWorkspaceDatastore = {\n\t\"clientToSessionId\": {\n\t\t[\"client0\"]: {\n\t\t\t\"rev\": 0,\n\t\t\t\"timestamp\": 0,\n\t\t\t\"value\": createSpecificAttendeeId(\"attendeeId-0\"),\n\t\t},\n\t},\n} as const satisfies SystemWorkspaceDatastore;\n\nconst attendee4SystemWorkspaceDatastore = {\n\t\"clientToSessionId\": {\n\t\t[\"client4\"]: {\n\t\t\t\"rev\": 0,\n\t\t\t\"timestamp\": 700,\n\t\t\t\"value\": createSpecificAttendeeId(\"attendeeId-4\"),\n\t\t},\n\t},\n} as const satisfies SystemWorkspaceDatastore;\n\nconst attendee5SystemWorkspaceDatastore = {\n\t\"clientToSessionId\": {\n\t\t[\"client5\"]: {\n\t\t\t\"rev\": 0,\n\t\t\t\"timestamp\": 800,\n\t\t\t\"value\": createSpecificAttendeeId(\"attendeeId-5\"),\n\t\t},\n\t},\n} as const satisfies SystemWorkspaceDatastore;\n\ndescribe(\"Presence/Runtime\", () => {\n\tdescribe(\"protocol handling\", () => {\n\t\tlet runtime: MockEphemeralRuntime;\n\t\tlet logger: EventAndErrorTrackingLogger;\n\t\tconst initialTime = 1000;\n\t\tlet clock: SinonFakeTimers;\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\t\t\tclock.setSystemTime(initialTime);\n\t\t});\n\n\t\tafterEach(function (done: Mocha.Done) {\n\t\t\tclock.reset();\n\n\t\t\t// If the test passed so far, check final expectations.\n\t\t\tif (this.currentTest?.state === \"passed\") {\n\t\t\t\tassertFinalExpectations(runtime, logger);\n\t\t\t}\n\t\t\tdone();\n\t\t});\n\n\t\tafter(() => {\n\t\t\tclock.restore();\n\t\t});\n\n\t\tit(\"does not signal when disconnected during initialization\", () => {\n\t\t\t// Act & Verify\n\t\t\tcreatePresenceManager(runtime);\n\t\t});\n\n\t\tit(\"sends join when connected during initialization\", () => {\n\t\t\t// Setup, Act (call to createPresenceManager), & Verify (post createPresenceManager call)\n\t\t\tprepareConnectedPresence(\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);\n\t\t});\n\n\t\tdescribe(\"handles ClientJoin\", () => {\n\t\t\tlet processSignal: ProcessSignalFunction;\n\n\t\t\tbeforeEach(() => {\n\t\t\t\t({ processSignal } = prepareConnectedPresence(\n\t\t\t\t\truntime,\n\t\t\t\t\tlocalAttendeeId,\n\t\t\t\t\tinitialLocalClientConnectionId,\n\t\t\t\t\tclock,\n\t\t\t\t\tlogger,\n\t\t\t\t));\n\n\t\t\t\t// Pass a little time (to mimic reality)\n\t\t\t\tclock.tick(10);\n\t\t\t});\n\n\t\t\tfunction joinClients(\n\t\t\t\tupdateProviders: ClientConnectionId[],\n\t\t\t\tdelayToJoinClient5: number | undefined,\n\t\t\t): void {\n\t\t\t\t// Join client4\n\t\t\t\tprocessSignal(\n\t\t\t\t\t[],\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"Pres:ClientJoin\",\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\tsendTimestamp: clock.now - 50,\n\t\t\t\t\t\t\tavgLatency: 50,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\"system:presence\": attendee4SystemWorkspaceDatastore,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tupdateProviders,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclientId: \"client4\",\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\n\t\t\t\tif (delayToJoinClient5 !== undefined) {\n\t\t\t\t\t// Advance clock to delay joining client5\n\t\t\t\t\tclock.tick(delayToJoinClient5);\n\n\t\t\t\t\t// Join client5\n\t\t\t\t\tprocessSignal(\n\t\t\t\t\t\t[],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"Pres:ClientJoin\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\tsendTimestamp: clock.now - 50,\n\t\t\t\t\t\t\t\tavgLatency: 50,\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\"system:presence\": attendee5SystemWorkspaceDatastore,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tupdateProviders,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tclientId: \"client5\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction processClient0ResponseForClient4(): void {\n\t\t\t\t// Setup\n\t\t\t\t// client 0 handles client 4 join\n\t\t\t\tprocessSignal(\n\t\t\t\t\t[],\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\"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...attendee0SystemWorkspaceDatastore.clientToSessionId,\n\t\t\t\t\t\t\t\t\t\t...attendee4SystemWorkspaceDatastore.clientToSessionId,\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\t\"isComplete\": true,\n\t\t\t\t\t\t\t\"joinResponseFor\": [\"client4\"],\n\t\t\t\t\t\t\t\"sendTimestamp\": clock.now - 10,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclientId: \"client0\",\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tit(`when preferred responder ... with broadcast after ${broadcastJoinResponseDelaysMs.namedResponder}ms`, () => {\n\t\t\t\t// Setup\n\t\t\t\tconst updateTime = clock.now + broadcastJoinResponseDelaysMs.namedResponder;\n\n\t\t\t\t// #region Part 1 (no response)\n\t\t\t\t// Act\n\t\t\t\t// join clients 4 and 5\n\t\t\t\tjoinClients(\n\t\t\t\t\t[initialLocalClientConnectionId],\n\t\t\t\t\tbroadcastJoinResponseDelaysMs.namedResponder / 2,\n\t\t\t\t);\n\n\t\t\t\t// Advance to one tick before expected response time\n\t\t\t\tclock.tick(updateTime - 1 - clock.now);\n\t\t\t\t// #endregion\n\n\t\t\t\t// #region Part 2 (response after delay)\n\t\t\t\t// Setup\n\t\t\t\tlogger.registerExpectedEvent({\n\t\t\t\t\teventName: \"Presence:JoinResponse\",\n\t\t\t\t\tdetails: JSON.stringify({\n\t\t\t\t\t\ttype: \"broadcastAll\",\n\t\t\t\t\t\tattendeeId: localAttendeeId,\n\t\t\t\t\t\tconnectionId: initialLocalClientConnectionId,\n\t\t\t\t\t\tprimaryResponses: JSON.stringify([\"client4\", \"client5\"]),\n\t\t\t\t\t\tsecondaryResponses: JSON.stringify([]),\n\t\t\t\t\t}),\n\t\t\t\t});\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\"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...attendee4SystemWorkspaceDatastore.clientToSessionId,\n\t\t\t\t\t\t\t\t\t\t...attendee5SystemWorkspaceDatastore.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},\n\t\t\t\t\t\t\t\"isComplete\": true,\n\t\t\t\t\t\t\t\"joinResponseFor\": [\"client4\", \"client5\"],\n\t\t\t\t\t\t\t\"sendTimestamp\": clock.now + 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\t// Act\n\t\t\t\tclock.tick(1);\n\n\t\t\t\t// Verify\n\t\t\t\tassertFinalExpectations(runtime, logger);\n\t\t\t\t// #endregion\n\t\t\t});\n\n\t\t\tdescribe(\"when NOT preferred responder\", () => {\n\t\t\t\tit(\"and no other responses ... with broadcast after delay\", () => {\n\t\t\t\t\t// Setup\n\t\t\t\t\tconst responseOrder = 2;\n\t\t\t\t\t// 3 * named length (client0 and client1) + quorum sequence order (third -> 2)\n\t\t\t\t\tconst responderIndex = 3 * 2 + responseOrder;\n\t\t\t\t\tconst updateTime =\n\t\t\t\t\t\tclock.now +\n\t\t\t\t\t\tbroadcastJoinResponseDelaysMs.namedResponder +\n\t\t\t\t\t\tbroadcastJoinResponseDelaysMs.backupResponderIncrement * responderIndex;\n\n\t\t\t\t\t// #region Part 1 (no response)\n\t\t\t\t\t// Act\n\t\t\t\t\t// join client 4\n\t\t\t\t\tjoinClients([\"client0\", \"client1\"], undefined);\n\n\t\t\t\t\tclock.tick(updateTime - clock.now - 1);\n\t\t\t\t\t// #endregion\n\n\t\t\t\t\t// #region Part 2 (response after delay)\n\t\t\t\t\t// Setup\n\t\t\t\t\tlogger.registerExpectedEvent({\n\t\t\t\t\t\teventName: \"Presence:JoinResponse\",\n\t\t\t\t\t\tdetails: JSON.stringify({\n\t\t\t\t\t\t\ttype: \"broadcastAll\",\n\t\t\t\t\t\t\tattendeeId: localAttendeeId,\n\t\t\t\t\t\t\tconnectionId: initialLocalClientConnectionId,\n\t\t\t\t\t\t\tprimaryResponses: JSON.stringify([]),\n\t\t\t\t\t\t\tsecondaryResponses: JSON.stringify([[\"client4\", responseOrder]]),\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t\truntime.signalsExpected.push([\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\"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...attendee4SystemWorkspaceDatastore.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},\n\t\t\t\t\t\t\t\t\"isComplete\": true,\n\t\t\t\t\t\t\t\t\"joinResponseFor\": [\"client4\"],\n\t\t\t\t\t\t\t\t\"sendTimestamp\": clock.now + 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t]);\n\n\t\t\t\t\t// Act\n\t\t\t\t\tclock.tick(1);\n\n\t\t\t\t\t// Verify\n\t\t\t\t\tassertFinalExpectations(runtime, logger);\n\t\t\t\t\t// #endregion\n\t\t\t\t});\n\n\t\t\t\tit(\"and other has fully responded ... without broadcast\", () => {\n\t\t\t\t\t// Setup\n\t\t\t\t\t// join client 4\n\t\t\t\t\tjoinClients([\"client0\", \"client1\"], undefined);\n\n\t\t\t\t\tclock.tick(broadcastJoinResponseDelaysMs.namedResponder);\n\n\t\t\t\t\t// Act\n\t\t\t\t\t// client 0 handles client 4 join\n\t\t\t\t\tprocessClient0ResponseForClient4();\n\n\t\t\t\t\tclock.runAll();\n\n\t\t\t\t\t// Verify\n\t\t\t\t\tassertFinalExpectations(runtime, logger);\n\t\t\t\t});\n\n\t\t\t\tit(\"and other has partially responded ... with broadcast after delay\", () => {\n\t\t\t\t\t// Setup\n\t\t\t\t\tconst responseOrder = 2;\n\t\t\t\t\t// 3 * named length (client0 and client1) + quorum sequence order (third -> 2)\n\t\t\t\t\tconst responderIndex = 3 * 2 + responseOrder;\n\t\t\t\t\tconst client4ResponseDelay =\n\t\t\t\t\t\tbroadcastJoinResponseDelaysMs.namedResponder +\n\t\t\t\t\t\tbroadcastJoinResponseDelaysMs.backupResponderIncrement * responderIndex;\n\t\t\t\t\tconst client4UpdateTime = clock.now + client4ResponseDelay;\n\t\t\t\t\tconst delayToJoinClient5 = client4ResponseDelay / 2;\n\t\t\t\t\tconst client5UpdateTime = client4UpdateTime + delayToJoinClient5;\n\n\t\t\t\t\t// join clients 4 and 5\n\t\t\t\t\tjoinClients([\"client0\", \"client1\"], delayToJoinClient5);\n\n\t\t\t\t\tclock.tick(client4UpdateTime - clock.now - 1);\n\n\t\t\t\t\t// client 0 handles client 4 join\n\t\t\t\t\tprocessClient0ResponseForClient4();\n\n\t\t\t\t\tclock.tick(client5UpdateTime - clock.now - 1);\n\n\t\t\t\t\tlogger.registerExpectedEvent({\n\t\t\t\t\t\teventName: \"Presence:JoinResponse\",\n\t\t\t\t\t\tdetails: JSON.stringify({\n\t\t\t\t\t\t\ttype: \"broadcastAll\",\n\t\t\t\t\t\t\tattendeeId: localAttendeeId,\n\t\t\t\t\t\t\tconnectionId: initialLocalClientConnectionId,\n\t\t\t\t\t\t\tprimaryResponses: JSON.stringify([]),\n\t\t\t\t\t\t\tsecondaryResponses: JSON.stringify([[\"client5\", responseOrder]]),\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t\truntime.signalsExpected.push([\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\"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...attendee0SystemWorkspaceDatastore.clientToSessionId,\n\t\t\t\t\t\t\t\t\t\t\t...attendee4SystemWorkspaceDatastore.clientToSessionId,\n\t\t\t\t\t\t\t\t\t\t\t...attendee5SystemWorkspaceDatastore.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},\n\t\t\t\t\t\t\t\t\"isComplete\": true,\n\t\t\t\t\t\t\t\t// Only responding for client5 (client4 has been handled)\n\t\t\t\t\t\t\t\t\"joinResponseFor\": [\"client5\"],\n\t\t\t\t\t\t\t\t\"sendTimestamp\": clock.now + 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t]);\n\n\t\t\t\t\t// Act\n\t\t\t\t\tclock.tick(1);\n\n\t\t\t\t\t// Verify\n\t\t\t\t\tassertFinalExpectations(runtime, logger);\n\t\t\t\t\t// #endregion\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"receiving DatastoreUpdate\", () => {\n\t\t\tlet presence: PresenceWithNotifications;\n\t\t\tlet processSignal: ProcessSignalFunction;\n\n\t\t\tconst systemWorkspaceUpdate = {\n\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\"client1\": {\n\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\"timestamp\": 0,\n\t\t\t\t\t\t\"value\": attendeeId1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst statesWorkspaceUpdate = {\n\t\t\t\t\"latest\": {\n\t\t\t\t\t[attendeeId1]: {\n\t\t\t\t\t\t\"rev\": 1,\n\t\t\t\t\t\t\"timestamp\": 0,\n\t\t\t\t\t\t\"value\": toOpaqueJson({}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst notificationsWorkspaceUpdate = {\n\t\t\t\t\"testEvents\": {\n\t\t\t\t\t[attendeeId1]: {\n\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\"timestamp\": 0,\n\t\t\t\t\t\t\"value\": toOpaqueJson({}),\n\t\t\t\t\t\t\"ignoreUnmonitored\": true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t} as const;\n\n\t\t\tbeforeEach(() => {\n\t\t\t\t({ presence, processSignal } = prepareConnectedPresence(\n\t\t\t\t\truntime,\n\t\t\t\t\tlocalAttendeeId,\n\t\t\t\t\tinitialLocalClientConnectionId,\n\t\t\t\t\tclock,\n\t\t\t\t\tlogger,\n\t\t\t\t));\n\n\t\t\t\t// Pass a little time (to mimic reality)\n\t\t\t\tclock.tick(10);\n\t\t\t});\n\n\t\t\tit(\"with unregistered States workspace emits 'workspaceActivated'\", () => {\n\t\t\t\t// Setup\n\t\t\t\tconst listener = spy();\n\t\t\t\tpresence.events.on(\"workspaceActivated\", listener);\n\n\t\t\t\t// Act\n\t\t\t\tprocessSignal(\n\t\t\t\t\t[],\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\tsendTimestamp: clock.now - 10,\n\t\t\t\t\t\t\tavgLatency: 20,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\"system:presence\": systemWorkspaceUpdate,\n\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": statesWorkspaceUpdate,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclientId: \"client1\",\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\n\t\t\t\t// Verify\n\t\t\t\tassert.strictEqual(listener.calledOnce, true);\n\t\t\t\tassert.strictEqual(listener.calledWith(\"name:testStateWorkspace\", \"States\"), true);\n\t\t\t});\n\n\t\t\tit(\"with unregistered Notifications workspace 'workspaceActivated'\", () => {\n\t\t\t\t// Setup\n\t\t\t\tconst listener = spy();\n\t\t\t\tpresence.events.on(\"workspaceActivated\", listener);\n\n\t\t\t\t// Act\n\t\t\t\tprocessSignal(\n\t\t\t\t\t[],\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\tsendTimestamp: clock.now - 10,\n\t\t\t\t\t\t\tavgLatency: 20,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\"system:presence\": systemWorkspaceUpdate,\n\t\t\t\t\t\t\t\t\"n:name:testNotificationWorkspace\": notificationsWorkspaceUpdate,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclientId: \"client1\",\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\n\t\t\t\t// Verify\n\t\t\t\tassert.strictEqual(listener.calledOnce, true);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tlistener.calledWith(\"name:testNotificationWorkspace\", \"Notifications\"),\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"with unregistered workspace of unknown type emits 'workspaceActivated'\", () => {\n\t\t\t\t// Setup\n\t\t\t\tconst listener = spy();\n\t\t\t\tpresence.events.on(\"workspaceActivated\", listener);\n\n\t\t\t\t// Act\n\t\t\t\tprocessSignal(\n\t\t\t\t\t[],\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\tsendTimestamp: clock.now - 10,\n\t\t\t\t\t\t\tavgLatency: 20,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\"system:presence\": systemWorkspaceUpdate,\n\t\t\t\t\t\t\t\t[\"u:name:testUnknownWorkspace\" as InternalWorkspaceAddress]: {\n\t\t\t\t\t\t\t\t\t\"latest\": {\n\t\t\t\t\t\t\t\t\t\t[attendeeId1]: {\n\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\"timestamp\": 0,\n\t\t\t\t\t\t\t\t\t\t\t\"value\": toOpaqueJson({ x: 1, y: 1, z: 1 }),\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\tclientId: \"client1\",\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\n\t\t\t\t// Verify\n\t\t\t\tassert.strictEqual(listener.calledOnce, true);\n\t\t\t\tassert.strictEqual(listener.calledWith(\"name:testUnknownWorkspace\", \"Unknown\"), true);\n\t\t\t});\n\n\t\t\tit(\"with registered workspace does NOT emit 'workspaceActivated'\", () => {\n\t\t\t\t// Setup\n\t\t\t\tconst listener = spy();\n\t\t\t\tpresence.events.on(\"workspaceActivated\", listener);\n\t\t\t\tpresence.states.getWorkspace(\"name:testStateWorkspace\", {});\n\t\t\t\tpresence.notifications.getWorkspace(\"name:testNotificationWorkspace\", {});\n\n\t\t\t\t// Act\n\t\t\t\tprocessSignal(\n\t\t\t\t\t[],\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\tsendTimestamp: clock.now - 10,\n\t\t\t\t\t\t\tavgLatency: 20,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\"system:presence\": systemWorkspaceUpdate,\n\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": statesWorkspaceUpdate,\n\t\t\t\t\t\t\t\t\"n:name:testNotificationWorkspace\": notificationsWorkspaceUpdate,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclientId: \"client1\",\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\n\t\t\t\t// Verify\n\t\t\t\tassert.strictEqual(listener.called, false);\n\t\t\t});\n\n\t\t\tit(\"with workspace that has an unrecognized internal address does NOT emit 'workspaceActivated'\", () => {\n\t\t\t\t// Setup\n\t\t\t\tconst listener = spy();\n\t\t\t\tpresence.events.on(\"workspaceActivated\", listener);\n\n\t\t\t\t// Act\n\t\t\t\tprocessSignal(\n\t\t\t\t\t[],\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\tsendTimestamp: clock.now - 10,\n\t\t\t\t\t\t\tavgLatency: 20,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\"system:presence\": systemWorkspaceUpdate,\n\t\t\t\t\t\t\t\t// Unrecognized internal address\n\t\t\t\t\t\t\t\t[\"sn:name:testStateWorkspace\" as InternalWorkspaceAddress]:\n\t\t\t\t\t\t\t\t\tstatesWorkspaceUpdate,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclientId: \"client1\",\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\n\t\t\t\t// Verify\n\t\t\t\tassert.strictEqual(listener.called, false);\n\t\t\t});\n\n\t\t\tit(\"with workspace that has an invalid public address does NOT emit 'workspaceActivated'\", () => {\n\t\t\t\t// Setup\n\t\t\t\tconst listener = spy();\n\t\t\t\tpresence.events.on(\"workspaceActivated\", listener);\n\n\t\t\t\t// Act\n\t\t\t\tprocessSignal(\n\t\t\t\t\t[],\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\tsendTimestamp: clock.now - 10,\n\t\t\t\t\t\t\tavgLatency: 20,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\"system:presence\": systemWorkspaceUpdate,\n\t\t\t\t\t\t\t\t// Invalid public address (must be `${string}:${string}`)\n\t\t\t\t\t\t\t\t[\"s:testStateWorkspace\" as InternalWorkspaceAddress]: statesWorkspaceUpdate,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclientId: \"client1\",\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\n\t\t\t\t// Verify\n\t\t\t\tassert.strictEqual(listener.called, false);\n\t\t\t});\n\n\t\t\tit(\"with workspace that has already been seen does NOT emit 'workspaceActivated'\", () => {\n\t\t\t\t// Setup\n\t\t\t\tconst listener = spy();\n\t\t\t\tpresence.events.on(\"workspaceActivated\", listener);\n\n\t\t\t\t// Act\n\t\t\t\tprocessSignal(\n\t\t\t\t\t[],\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\tsendTimestamp: clock.now - 20,\n\t\t\t\t\t\t\tavgLatency: 20,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\"system:presence\": systemWorkspaceUpdate,\n\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": statesWorkspaceUpdate,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclientId: \"client1\",\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t\tprocessSignal(\n\t\t\t\t\t[],\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\tsendTimestamp: clock.now - 10,\n\t\t\t\t\t\t\tavgLatency: 20,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\"system:presence\": systemWorkspaceUpdate,\n\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": statesWorkspaceUpdate,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclientId: \"client1\",\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t\t// Verify\n\t\t\t\tassert.strictEqual(listener.callCount, 1);\n\t\t\t});\n\n\t\t\tit(\"with acknowledgementId sends targeted acknowledgment message back to requestor\", () => {\n\t\t\t\t// We expect to send a targeted acknowledgment back to the requestor\n\t\t\t\truntime.signalsExpected.push([\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"Pres:Ack\",\n\t\t\t\t\t\tcontent: { id: \"ackID\" },\n\t\t\t\t\t\ttargetClientId: \"client4\",\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\t// Act - send generic datastore update with acknowledgement id specified\n\t\t\t\tprocessSignal(\n\t\t\t\t\t[],\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\tsendTimestamp: clock.now - 10,\n\t\t\t\t\t\t\tavgLatency: 20,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\"system:presence\": systemWorkspaceUpdate,\n\t\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": statesWorkspaceUpdate,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tacknowledgementId: \"ackID\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclientId: \"client4\",\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\n\t\t\t\t// Verify\n\t\t\t\tassertFinalExpectations(runtime, logger);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"receiving unrecognized message\", () => {\n\t\t\tlet presence: PresenceWithNotifications;\n\t\t\tlet processSignal: ProcessSignalFunction;\n\n\t\t\tconst systemWorkspaceUpdate = {\n\t\t\t\t\"clientToSessionId\": {\n\t\t\t\t\t\"client1\": {\n\t\t\t\t\t\t\"rev\": 0,\n\t\t\t\t\t\t\"timestamp\": 0,\n\t\t\t\t\t\t\"value\": attendeeId1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst statesWorkspaceUpdate = {\n\t\t\t\t\"latest\": {\n\t\t\t\t\t[attendeeId1]: {\n\t\t\t\t\t\t\"rev\": 1,\n\t\t\t\t\t\t\"timestamp\": 0,\n\t\t\t\t\t\t\"value\": toOpaqueJson({}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tbeforeEach(() => {\n\t\t\t\t({ presence, processSignal } = prepareConnectedPresence(\n\t\t\t\t\truntime,\n\t\t\t\t\tlocalAttendeeId,\n\t\t\t\t\tinitialLocalClientConnectionId,\n\t\t\t\t\tclock,\n\t\t\t\t\tlogger,\n\t\t\t\t));\n\n\t\t\t\t// Pass a little time (to mimic reality)\n\t\t\t\tclock.tick(10);\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * Use to pretend any general inbound message is an unverified Presence message\n\t\t\t */\n\t\t\tfunction markUnverifiedIncomingMessage<T extends TypedMessage>(\n\t\t\t\t// make sure message \"was\" at least serializable\n\t\t\t\tmessage: InboundExtensionMessage<T> & JsonSerializable<T>,\n\t\t\t): RawInboundExtensionMessage<SignalMessages> {\n\t\t\t\treturn message as RawInboundExtensionMessage<SignalMessages>;\n\t\t\t}\n\n\t\t\tfunction processUnrecognizedMessage({ optional }: { optional: boolean }): void {\n\t\t\t\t// Mocked to look very much like a Presence message, but with an unrecognized type.\n\t\t\t\tconst unrecognizedMessage = {\n\t\t\t\t\ttype: \"Pres: Unrecognized Message\",\n\t\t\t\t\tcontent: {\n\t\t\t\t\t\tsendTimestamp: clock.now - 10,\n\t\t\t\t\t\tavgLatency: 20,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\"system:presence\": systemWorkspaceUpdate,\n\t\t\t\t\t\t\t\"s:name:testStateWorkspace\": statesWorkspaceUpdate,\n\t\t\t\t\t\t},\n\t\t\t\t\t} as const satisfies InboundExtensionMessage<SignalMessages>[\"content\"],\n\t\t\t\t\tclientId: \"client1\",\n\t\t\t\t} as const;\n\t\t\t\tprocessSignal(\n\t\t\t\t\toptional ? [\"?\"] : [],\n\t\t\t\t\tmarkUnverifiedIncomingMessage(unrecognizedMessage),\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tit(\"that is NOT optional, throws\", () => {\n\t\t\t\t// Setup\n\t\t\t\tconst listener = spy();\n\t\t\t\tpresence.events.on(\"workspaceActivated\", listener);\n\n\t\t\t\t// Act & Verify\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => processUnrecognizedMessage({ optional: false }),\n\t\t\t\t\tvalidateAssertionError(\"0xcbc\"),\n\t\t\t\t);\n\n\t\t\t\t// Verify\n\t\t\t\tassert.strictEqual(listener.called, false);\n\t\t\t});\n\n\t\t\tit(\"that is optional, ignores message and does NOT throw\", () => {\n\t\t\t\t// Setup\n\t\t\t\tconst listener = spy();\n\t\t\t\tpresence.events.on(\"workspaceActivated\", listener);\n\n\t\t\t\t// Act & Verify\n\t\t\t\tprocessUnrecognizedMessage({ optional: true });\n\n\t\t\t\t// Verify\n\t\t\t\tassert.strictEqual(listener.called, false);\n\t\t\t});\n\t\t});\n\t});\n});\n"]}