@fluidframework/azure-end-to-end-tests 2.101.0 → 2.102.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 (35) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/eslint.config.mts +4 -0
  3. package/lib/packageVersion.js +9 -0
  4. package/lib/packageVersion.js.map +1 -0
  5. package/lib/test/AzureClientFactory.js.map +1 -1
  6. package/lib/test/audience.spec.js +16 -16
  7. package/lib/test/audience.spec.js.map +1 -1
  8. package/lib/test/containerCreate.spec.js +27 -24
  9. package/lib/test/containerCreate.spec.js.map +1 -1
  10. package/lib/test/ddsTests.spec.js +17 -17
  11. package/lib/test/ddsTests.spec.js.map +1 -1
  12. package/lib/test/multiprocess/childClient.tool.js +3 -2
  13. package/lib/test/multiprocess/childClient.tool.js.map +1 -1
  14. package/lib/test/signals.spec.js +4 -4
  15. package/lib/test/signals.spec.js.map +1 -1
  16. package/lib/test/tree.spec.js +8 -8
  17. package/lib/test/tree.spec.js.map +1 -1
  18. package/lib/test/utils.js +3 -0
  19. package/lib/test/utils.js.map +1 -1
  20. package/lib/test/viewContainerVersion.spec.js +9 -9
  21. package/lib/test/viewContainerVersion.spec.js.map +1 -1
  22. package/package.json +29 -27
  23. package/src/packageVersion.ts +9 -0
  24. package/src/test/.mocharc.js +15 -0
  25. package/src/test/AzureClientFactory.ts +4 -3
  26. package/src/test/audience.spec.ts +36 -16
  27. package/src/test/containerCreate.spec.ts +31 -24
  28. package/src/test/ddsTests.spec.ts +29 -17
  29. package/src/test/multiprocess/childClient.tool.ts +7 -2
  30. package/src/test/signals.spec.ts +12 -4
  31. package/src/test/tree.spec.ts +8 -8
  32. package/src/test/tsconfig.json +6 -3
  33. package/src/test/utils.ts +4 -0
  34. package/src/test/viewContainerVersion.spec.ts +9 -9
  35. package/src/test/.mocharc.cjs +0 -11
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # @fluidframework/azure-end-to-end-tests
2
2
 
3
+ ## 2.102.0
4
+
5
+ Dependency updates only.
6
+
3
7
  ## 2.101.0
4
8
 
5
9
  Dependency updates only.
package/eslint.config.mts CHANGED
@@ -8,6 +8,10 @@ import { recommended } from "@fluidframework/eslint-config-fluid/flat.mts";
8
8
 
9
9
  const config: Linter.Config[] = [
10
10
  ...recommended,
11
+ {
12
+ // eslint doesn't recognize renamed exports syntax (that is required for ESM config under v11 mocha)
13
+ ignores: ["src/test/.mocharc.js"],
14
+ },
11
15
  {
12
16
  rules: {
13
17
  "prefer-arrow-callback": "off",
@@ -0,0 +1,9 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ *
5
+ * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
+ */
7
+ export const pkgName = "@fluidframework/azure-end-to-end-tests";
8
+ export const pkgVersion = "2.102.0";
9
+ //# sourceMappingURL=packageVersion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,wCAAwC,CAAC;AAChE,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/azure-end-to-end-tests\";\nexport const pkgVersion = \"2.102.0\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AzureClientFactory.js","sourceRoot":"","sources":["../../src/test/AzureClientFactory.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 {\n\tAzureClient,\n\ttype AzureLocalConnectionConfig,\n\ttype AzureRemoteConnectionConfig,\n\ttype ITelemetryBaseLogger,\n} from \"@fluidframework/azure-client\";\n// eslint-disable-next-line import-x/no-internal-modules -- TODO consider a test exposure to avoid /internal\nimport type { AzureClientPropsInternal } from \"@fluidframework/azure-client/internal\";\nimport {\n\tAzureClient as AzureClientLegacy,\n\ttype AzureLocalConnectionConfig as AzureLocalConnectionConfigLegacy,\n\ttype AzureRemoteConnectionConfig as AzureRemoteConnectionConfigLegacy,\n\ttype ITelemetryBaseLogger as ITelemetryBaseLoggerLegacy,\n} from \"@fluidframework/azure-client-legacy\";\nimport type { IRuntimeFactory } from \"@fluidframework/container-definitions/legacy\";\nimport type { IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport { ScopeType } from \"@fluidframework/driver-definitions/legacy\";\nimport type { CompatibilityMode, ContainerSchema } from \"@fluidframework/fluid-static\";\nimport {\n\ttype MockLogger,\n\tcreateChildLogger,\n\tcreateMultiSinkLogger,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport { InsecureTokenProvider } from \"@fluidframework/test-runtime-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\n/**\n * Response type for container creation requests.\n * - Azure Fluid Relay (AFR) returns `{ id: string }` object\n * - Local Tinylicious returns the container ID as a plain string\n */\ninterface FetchResponse {\n\tstatus: number;\n\tdata: { id?: string } | string;\n}\n\nimport { createAzureTokenProvider } from \"./AzureTokenFactory.js\";\n\n// eslint-disable-next-line unicorn/prefer-export-from\nexport { ScopeType };\n\n/**\n * This function will determine if local or remote mode is required (based on FLUID_CLIENT), and return a new\n * {@link AzureClient} instance based on the mode by setting the Connection config accordingly.\n */\nexport function createAzureClient(\n\tid?: string,\n\tname?: string,\n\tlogger?: MockLogger,\n\tconfigProvider?: IConfigProviderBase,\n\tscopes?: ScopeType[],\n\tcreateContainerRuntimeFactory?: ({\n\t\tschema,\n\t\tcompatibilityMode,\n\t}: {\n\t\tschema: ContainerSchema;\n\t\tcompatibilityMode: CompatibilityMode;\n\t}) => IRuntimeFactory,\n): AzureClient {\n\tconst args = process.argv.slice(2);\n\n\tconst driverIndex = args.indexOf(\"--driver\");\n\tconst r11sEndpointNameIndex = args.indexOf(\"--r11sEndpointName\");\n\n\t// Get values associated with the flags\n\tconst driver = driverIndex === -1 ? undefined : args[driverIndex + 1];\n\tconst r11sEndpointName =\n\t\tr11sEndpointNameIndex === -1 ? undefined : args[r11sEndpointNameIndex + 1];\n\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tconst tenantId = useAzure\n\t\t? (process.env.azure__fluid__relay__service__tenantId as string)\n\t\t: \"frs-client-tenant\";\n\tconst user = {\n\t\tid: id ?? uuid(),\n\t\tname: name ?? uuid(),\n\t};\n\tconst endPoint = process.env.azure__fluid__relay__service__endpoint as string;\n\tif (useAzure && endPoint === undefined) {\n\t\tthrow new Error(\"Azure Fluid Relay service endpoint is missing\");\n\t}\n\n\t// use AzureClient remote mode will run against live Azure Fluid Relay.\n\t// Default to running Tinylicious for PR validation\n\t// and local testing so it's not hindered by service availability\n\tconst connectionProps: AzureRemoteConnectionConfig | AzureLocalConnectionConfig = useAzure\n\t\t? {\n\t\t\t\ttenantId,\n\t\t\t\ttokenProvider: createAzureTokenProvider(id ?? \"foo\", name ?? \"bar\", scopes),\n\t\t\t\tendpoint: endPoint,\n\t\t\t\ttype: \"remote\",\n\t\t\t}\n\t\t: {\n\t\t\t\ttokenProvider: new InsecureTokenProvider(\"fooBar\", user, scopes),\n\t\t\t\tendpoint: \"http://localhost:7071\", // Port for local Azure Fluid Relay (AFR) service\n\t\t\t\ttype: \"local\",\n\t\t\t};\n\tconst getLogger = (): ITelemetryBaseLogger | undefined => {\n\t\tconst testLogger = getTestLogger?.();\n\t\tif (!logger && !testLogger) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (logger && testLogger) {\n\t\t\treturn createMultiSinkLogger({ loggers: [logger, testLogger] });\n\t\t}\n\t\treturn logger ?? testLogger;\n\t};\n\n\tconst createLogger = createChildLogger({\n\t\tlogger: getLogger(),\n\t\tproperties: {\n\t\t\tall: {\n\t\t\t\tdriverType: useAzure ? r11sEndpointName : driver,\n\t\t\t\tdriverEndpointName: driver,\n\t\t\t},\n\t\t},\n\t});\n\n\tconst props: AzureClientPropsInternal = {\n\t\tconnection: connectionProps,\n\t\tlogger: createLogger,\n\t\tconfigProvider,\n\t\tcreateContainerRuntimeFactory,\n\t};\n\treturn new AzureClient(props);\n}\n\n/**\n * Copy of {@link createAzureClient} with legacy (LTS) AzureClient APIs.\n */\nexport function createAzureClientLegacy(\n\tuserID?: string,\n\tuserName?: string,\n\tlogger?: MockLogger,\n): AzureClientLegacy {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tconst tenantId = useAzure\n\t\t? (process.env.azure__fluid__relay__service__tenantId as string)\n\t\t: \"frs-client-tenant\";\n\tconst user = {\n\t\tid: userID ?? uuid(),\n\t\tname: userName ?? uuid(),\n\t};\n\tconst endPoint = process.env.azure__fluid__relay__service__endpoint as string;\n\tif (useAzure && endPoint === undefined) {\n\t\tthrow new Error(\"Azure Azure Fluid Relay service endpoint is missing\");\n\t}\n\n\t// use AzureClient remote mode will run against live Azure Fluid Relay.\n\t// Default to running Tinylicious for PR validation\n\t// and local testing so it's not hindered by service availability\n\tconst connectionProps: AzureRemoteConnectionConfigLegacy | AzureLocalConnectionConfigLegacy =\n\t\tuseAzure\n\t\t\t? {\n\t\t\t\t\ttenantId,\n\t\t\t\t\ttokenProvider: createAzureTokenProvider(userID ?? \"foo\", userName ?? \"bar\"),\n\t\t\t\t\tendpoint: endPoint,\n\t\t\t\t\ttype: \"remote\",\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\ttokenProvider: new InsecureTokenProvider(\"fooBar\", user),\n\t\t\t\t\tendpoint: \"http://localhost:7071\", // Port for local Azure Fluid Relay (AFR) service\n\t\t\t\t\ttype: \"local\",\n\t\t\t\t};\n\tconst getLogger = (): ITelemetryBaseLoggerLegacy | undefined => {\n\t\tconst testLogger = getTestLogger?.();\n\t\tif (!logger && !testLogger) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (logger && testLogger) {\n\t\t\treturn createMultiSinkLogger({ loggers: [logger, testLogger] });\n\t\t}\n\t\treturn logger ?? testLogger;\n\t};\n\treturn new AzureClientLegacy({\n\t\tconnection: connectionProps,\n\t\tlogger: getLogger(),\n\t});\n}\n\n/**\n * This function is used to create a container using any summary payload.\n * It is primary intended as a workaround to using the AzureClient, and\n * is only being used at the moment for ephemeral container E2E tests\n * since AzureClient does not currently support ephemeral containers.\n *\n * Usage of this function for anything other than ephemeral E2E tests is\n * not recommended.\n *\n * @param requestPayload - The summary payload used to create the container,\n * currently these are mainly fetched from ephemeralSummaryTrees.ts\n * @param userID - ID for the user creating the container\n * @param userName - Name for the user creating the container\n * @returns A FetchResponse containing the container ID(response.data.id)\n */\nexport async function createContainerFromPayload(\n\trequestPayload: object,\n\tuserID?: string,\n\tuserName?: string,\n): Promise<FetchResponse> {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tconst tenantId = useAzure\n\t\t? (process.env.azure__fluid__relay__service__tenantId as string)\n\t\t: \"local\";\n\tconst user = {\n\t\tid: userID ?? uuid(),\n\t\tname: userName ?? uuid(),\n\t};\n\tconst endPoint = useAzure\n\t\t? (process.env.azure__fluid__relay__service__endpoint as string)\n\t\t: \"http://localhost:7071\"; // Port for local Azure Fluid Relay (AFR) service\n\tif (useAzure && endPoint === undefined) {\n\t\tthrow new Error(\"Azure Fluid Relay service endpoint is missing\");\n\t}\n\n\tconst tokenProvider = useAzure\n\t\t? createAzureTokenProvider(userID ?? \"foo\", userName ?? \"bar\")\n\t\t: new InsecureTokenProvider(\"fooBar\", user);\n\tconst ordererToken = await tokenProvider.fetchOrdererToken(tenantId, undefined, false);\n\n\tconst headers = {\n\t\t\"Authorization\": `Basic ${ordererToken.jwt}`,\n\t\t\"Content-Type\": \"application/json\",\n\t};\n\n\tconst url = `${endPoint}/documents/${tenantId}`;\n\n\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: JSON.stringify(requestPayload),\n\t\t});\n\n\t\t// Fetch doesn't auto-throw on non-2xx responses like axios did, so check explicitly\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Error creating container. Status code: ${response.status}`);\n\t\t}\n\n\t\tif (response.status === 201) {\n\t\t\tconsole.log(\"Container created successfully\");\n\t\t}\n\n\t\tconst data: { id?: string } | string = (await response.json()) as { id?: string } | string;\n\n\t\tif (\n\t\t\tdata === undefined ||\n\t\t\t(useAzure && typeof data === \"object\" && data.id === undefined)\n\t\t) {\n\t\t\tthrow new Error(`ID of the created container is undefined`);\n\t\t}\n\n\t\treturn { status: response.status, data };\n\t} catch (error) {\n\t\tthrow new Error(`An error occurred: ${error}`);\n\t}\n}\n\n/**\n * This function takes a FetchResponse returned by the createContainerFromPayload and returns the containerId.\n * A separate function is used for this, since the data path to the containerID is not always the same.\n * (Tinylicious has the ID stored at a different path than other services)\n *\n * @param response - A container creation response returned by createContainerFromPayload\n * @returns The ID of the container that was created by createContainerFromPayload\n */\nexport function getContainerIdFromPayloadResponse(response: FetchResponse): string {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tif (useAzure) {\n\t\tif (typeof response.data === \"object\" && response.data.id !== undefined) {\n\t\t\treturn response.data.id;\n\t\t}\n\t\tthrow new Error(\"Invalid response format for Azure\");\n\t}\n\tif (typeof response.data === \"string\") {\n\t\treturn response.data;\n\t}\n\tthrow new Error(\"Invalid response format for local\");\n}\n"]}
1
+ {"version":3,"file":"AzureClientFactory.js","sourceRoot":"","sources":["../../src/test/AzureClientFactory.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 {\n\tAzureClient,\n\ttype AzureLocalConnectionConfig,\n\ttype AzureRemoteConnectionConfig,\n\ttype ITelemetryBaseLogger,\n} from \"@fluidframework/azure-client\";\n// eslint-disable-next-line import-x/no-internal-modules -- TODO consider a test exposure to avoid /internal\nimport type { AzureClientPropsInternal } from \"@fluidframework/azure-client/internal\";\nimport {\n\tAzureClient as AzureClientLegacy,\n\ttype AzureLocalConnectionConfig as AzureLocalConnectionConfigLegacy,\n\ttype AzureRemoteConnectionConfig as AzureRemoteConnectionConfigLegacy,\n\ttype ITelemetryBaseLogger as ITelemetryBaseLoggerLegacy,\n} from \"@fluidframework/azure-client-legacy\";\nimport type { IRuntimeFactory } from \"@fluidframework/container-definitions/legacy\";\nimport type { IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport { ScopeType } from \"@fluidframework/driver-definitions/legacy\";\nimport type { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport type { MinimumVersionForCollab } from \"@fluidframework/runtime-definitions\";\nimport {\n\ttype MockLogger,\n\tcreateChildLogger,\n\tcreateMultiSinkLogger,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport { InsecureTokenProvider } from \"@fluidframework/test-runtime-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\n/**\n * Response type for container creation requests.\n * - Azure Fluid Relay (AFR) returns `{ id: string }` object\n * - Local Tinylicious returns the container ID as a plain string\n */\ninterface FetchResponse {\n\tstatus: number;\n\tdata: { id?: string } | string;\n}\n\nimport { createAzureTokenProvider } from \"./AzureTokenFactory.js\";\n\n// eslint-disable-next-line unicorn/prefer-export-from\nexport { ScopeType };\n\n/**\n * This function will determine if local or remote mode is required (based on FLUID_CLIENT), and return a new\n * {@link AzureClient} instance based on the mode by setting the Connection config accordingly.\n */\nexport function createAzureClient(\n\tid?: string,\n\tname?: string,\n\tlogger?: MockLogger,\n\tconfigProvider?: IConfigProviderBase,\n\tscopes?: ScopeType[],\n\tcreateContainerRuntimeFactory?: ({\n\t\tschema,\n\t\tminVersionForCollaboration,\n\t}: {\n\t\tschema: ContainerSchema;\n\t\tminVersionForCollaboration: MinimumVersionForCollab;\n\t}) => IRuntimeFactory,\n): AzureClient {\n\tconst args = process.argv.slice(2);\n\n\tconst driverIndex = args.indexOf(\"--driver\");\n\tconst r11sEndpointNameIndex = args.indexOf(\"--r11sEndpointName\");\n\n\t// Get values associated with the flags\n\tconst driver = driverIndex === -1 ? undefined : args[driverIndex + 1];\n\tconst r11sEndpointName =\n\t\tr11sEndpointNameIndex === -1 ? undefined : args[r11sEndpointNameIndex + 1];\n\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tconst tenantId = useAzure\n\t\t? (process.env.azure__fluid__relay__service__tenantId as string)\n\t\t: \"frs-client-tenant\";\n\tconst user = {\n\t\tid: id ?? uuid(),\n\t\tname: name ?? uuid(),\n\t};\n\tconst endPoint = process.env.azure__fluid__relay__service__endpoint as string;\n\tif (useAzure && endPoint === undefined) {\n\t\tthrow new Error(\"Azure Fluid Relay service endpoint is missing\");\n\t}\n\n\t// use AzureClient remote mode will run against live Azure Fluid Relay.\n\t// Default to running Tinylicious for PR validation\n\t// and local testing so it's not hindered by service availability\n\tconst connectionProps: AzureRemoteConnectionConfig | AzureLocalConnectionConfig = useAzure\n\t\t? {\n\t\t\t\ttenantId,\n\t\t\t\ttokenProvider: createAzureTokenProvider(id ?? \"foo\", name ?? \"bar\", scopes),\n\t\t\t\tendpoint: endPoint,\n\t\t\t\ttype: \"remote\",\n\t\t\t}\n\t\t: {\n\t\t\t\ttokenProvider: new InsecureTokenProvider(\"fooBar\", user, scopes),\n\t\t\t\tendpoint: \"http://localhost:7071\", // Port for local Azure Fluid Relay (AFR) service\n\t\t\t\ttype: \"local\",\n\t\t\t};\n\tconst getLogger = (): ITelemetryBaseLogger | undefined => {\n\t\tconst testLogger = getTestLogger?.();\n\t\tif (!logger && !testLogger) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (logger && testLogger) {\n\t\t\treturn createMultiSinkLogger({ loggers: [logger, testLogger] });\n\t\t}\n\t\treturn logger ?? testLogger;\n\t};\n\n\tconst createLogger = createChildLogger({\n\t\tlogger: getLogger(),\n\t\tproperties: {\n\t\t\tall: {\n\t\t\t\tdriverType: useAzure ? r11sEndpointName : driver,\n\t\t\t\tdriverEndpointName: driver,\n\t\t\t},\n\t\t},\n\t});\n\n\tconst props: AzureClientPropsInternal = {\n\t\tconnection: connectionProps,\n\t\tlogger: createLogger,\n\t\tconfigProvider,\n\t\tcreateContainerRuntimeFactory,\n\t};\n\treturn new AzureClient(props);\n}\n\n/**\n * Copy of {@link createAzureClient} with legacy (LTS) AzureClient APIs.\n */\nexport function createAzureClientLegacy(\n\tuserID?: string,\n\tuserName?: string,\n\tlogger?: MockLogger,\n): AzureClientLegacy {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tconst tenantId = useAzure\n\t\t? (process.env.azure__fluid__relay__service__tenantId as string)\n\t\t: \"frs-client-tenant\";\n\tconst user = {\n\t\tid: userID ?? uuid(),\n\t\tname: userName ?? uuid(),\n\t};\n\tconst endPoint = process.env.azure__fluid__relay__service__endpoint as string;\n\tif (useAzure && endPoint === undefined) {\n\t\tthrow new Error(\"Azure Azure Fluid Relay service endpoint is missing\");\n\t}\n\n\t// use AzureClient remote mode will run against live Azure Fluid Relay.\n\t// Default to running Tinylicious for PR validation\n\t// and local testing so it's not hindered by service availability\n\tconst connectionProps: AzureRemoteConnectionConfigLegacy | AzureLocalConnectionConfigLegacy =\n\t\tuseAzure\n\t\t\t? {\n\t\t\t\t\ttenantId,\n\t\t\t\t\ttokenProvider: createAzureTokenProvider(userID ?? \"foo\", userName ?? \"bar\"),\n\t\t\t\t\tendpoint: endPoint,\n\t\t\t\t\ttype: \"remote\",\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\ttokenProvider: new InsecureTokenProvider(\"fooBar\", user),\n\t\t\t\t\tendpoint: \"http://localhost:7071\", // Port for local Azure Fluid Relay (AFR) service\n\t\t\t\t\ttype: \"local\",\n\t\t\t\t};\n\tconst getLogger = (): ITelemetryBaseLoggerLegacy | undefined => {\n\t\tconst testLogger = getTestLogger?.();\n\t\tif (!logger && !testLogger) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (logger && testLogger) {\n\t\t\treturn createMultiSinkLogger({ loggers: [logger, testLogger] });\n\t\t}\n\t\treturn logger ?? testLogger;\n\t};\n\treturn new AzureClientLegacy({\n\t\tconnection: connectionProps,\n\t\tlogger: getLogger(),\n\t});\n}\n\n/**\n * This function is used to create a container using any summary payload.\n * It is primary intended as a workaround to using the AzureClient, and\n * is only being used at the moment for ephemeral container E2E tests\n * since AzureClient does not currently support ephemeral containers.\n *\n * Usage of this function for anything other than ephemeral E2E tests is\n * not recommended.\n *\n * @param requestPayload - The summary payload used to create the container,\n * currently these are mainly fetched from ephemeralSummaryTrees.ts\n * @param userID - ID for the user creating the container\n * @param userName - Name for the user creating the container\n * @returns A FetchResponse containing the container ID(response.data.id)\n */\nexport async function createContainerFromPayload(\n\trequestPayload: object,\n\tuserID?: string,\n\tuserName?: string,\n): Promise<FetchResponse> {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tconst tenantId = useAzure\n\t\t? (process.env.azure__fluid__relay__service__tenantId as string)\n\t\t: \"local\";\n\tconst user = {\n\t\tid: userID ?? uuid(),\n\t\tname: userName ?? uuid(),\n\t};\n\tconst endPoint = useAzure\n\t\t? (process.env.azure__fluid__relay__service__endpoint as string)\n\t\t: \"http://localhost:7071\"; // Port for local Azure Fluid Relay (AFR) service\n\tif (useAzure && endPoint === undefined) {\n\t\tthrow new Error(\"Azure Fluid Relay service endpoint is missing\");\n\t}\n\n\tconst tokenProvider = useAzure\n\t\t? createAzureTokenProvider(userID ?? \"foo\", userName ?? \"bar\")\n\t\t: new InsecureTokenProvider(\"fooBar\", user);\n\tconst ordererToken = await tokenProvider.fetchOrdererToken(tenantId, undefined, false);\n\n\tconst headers = {\n\t\t\"Authorization\": `Basic ${ordererToken.jwt}`,\n\t\t\"Content-Type\": \"application/json\",\n\t};\n\n\tconst url = `${endPoint}/documents/${tenantId}`;\n\n\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: JSON.stringify(requestPayload),\n\t\t});\n\n\t\t// Fetch doesn't auto-throw on non-2xx responses like axios did, so check explicitly\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Error creating container. Status code: ${response.status}`);\n\t\t}\n\n\t\tif (response.status === 201) {\n\t\t\tconsole.log(\"Container created successfully\");\n\t\t}\n\n\t\tconst data: { id?: string } | string = (await response.json()) as { id?: string } | string;\n\n\t\tif (\n\t\t\tdata === undefined ||\n\t\t\t(useAzure && typeof data === \"object\" && data.id === undefined)\n\t\t) {\n\t\t\tthrow new Error(`ID of the created container is undefined`);\n\t\t}\n\n\t\treturn { status: response.status, data };\n\t} catch (error) {\n\t\tthrow new Error(`An error occurred: ${error}`);\n\t}\n}\n\n/**\n * This function takes a FetchResponse returned by the createContainerFromPayload and returns the containerId.\n * A separate function is used for this, since the data path to the containerID is not always the same.\n * (Tinylicious has the ID stored at a different path than other services)\n *\n * @param response - A container creation response returned by createContainerFromPayload\n * @returns The ID of the container that was created by createContainerFromPayload\n */\nexport function getContainerIdFromPayloadResponse(response: FetchResponse): string {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tif (useAzure) {\n\t\tif (typeof response.data === \"object\" && response.data.id !== undefined) {\n\t\t\treturn response.data.id;\n\t\t}\n\t\tthrow new Error(\"Invalid response format for Azure\");\n\t}\n\tif (typeof response.data === \"string\") {\n\t\treturn response.data;\n\t}\n\tthrow new Error(\"Invalid response format for local\");\n}\n"]}
@@ -9,7 +9,7 @@ import { SharedMap } from "@fluidframework/map/legacy";
9
9
  import { timeoutPromise } from "@fluidframework/test-utils/internal";
10
10
  import { createAzureClient, createContainerFromPayload, getContainerIdFromPayloadResponse, ScopeType, } from "./AzureClientFactory.js";
11
11
  import * as ephemeralSummaryTrees from "./ephemeralSummaryTrees.js";
12
- import { configProvider, waitForMember, getTestMatrix } from "./utils.js";
12
+ import { configProvider, waitForMember, getTestMatrix, currentVersion } from "./utils.js";
13
13
  const testMatrix = getTestMatrix();
14
14
  for (const testOpts of testMatrix) {
15
15
  describe(`Fluid audience (${testOpts.variant})`, () => {
@@ -37,10 +37,10 @@ for (const testOpts of testMatrix) {
37
37
  if (isEphemeral) {
38
38
  const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.findOriginalMember, "test-user-id-1", "test-user-name-1");
39
39
  containerId = getContainerIdFromPayloadResponse(containerResponse);
40
- ({ container, services } = await client.getContainer(containerId, schema, "2"));
40
+ ({ container, services } = await client.getContainer(containerId, schema, currentVersion));
41
41
  }
42
42
  else {
43
- ({ container, services } = await client.createContainer(schema, "2"));
43
+ ({ container, services } = await client.createContainer(schema, currentVersion));
44
44
  containerId = await container.attach();
45
45
  }
46
46
  if (container.connectionState !== ConnectionState.Connected) {
@@ -70,10 +70,10 @@ for (const testOpts of testMatrix) {
70
70
  if (isEphemeral) {
71
71
  const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.findPartnerMember, "test-user-id-1", "test-user-name-1");
72
72
  containerId = getContainerIdFromPayloadResponse(containerResponse);
73
- ({ container, services } = await client.getContainer(containerId, schema, "2"));
73
+ ({ container, services } = await client.getContainer(containerId, schema, currentVersion));
74
74
  }
75
75
  else {
76
- ({ container, services } = await client.createContainer(schema, "2"));
76
+ ({ container, services } = await client.createContainer(schema, currentVersion));
77
77
  containerId = await container.attach();
78
78
  }
79
79
  if (container.connectionState !== ConnectionState.Connected) {
@@ -90,7 +90,7 @@ for (const testOpts of testMatrix) {
90
90
  const client2 = createAzureClient("test-user-id-2", "test-user-name-2", undefined, configProvider({
91
91
  "Fluid.Container.ForceWriteConnection": true,
92
92
  }));
93
- const { services: servicesGet } = await client2.getContainer(containerId, schema, "2");
93
+ const { services: servicesGet } = await client2.getContainer(containerId, schema, currentVersion);
94
94
  /* This is a workaround for a known bug, we should have one member (self) upon container connection */
95
95
  const partner = await waitForMember(servicesGet.audience, "test-user-id-2");
96
96
  assert.notStrictEqual(partner, undefined, "We should have partner at this point.");
@@ -110,10 +110,10 @@ for (const testOpts of testMatrix) {
110
110
  if (isEphemeral) {
111
111
  const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.observeMemberLeaving, "test-user-id-1", "test-user-name-1");
112
112
  containerId = getContainerIdFromPayloadResponse(containerResponse);
113
- ({ container } = await client.getContainer(containerId, schema, "2"));
113
+ ({ container } = await client.getContainer(containerId, schema, currentVersion));
114
114
  }
115
115
  else {
116
- ({ container } = await client.createContainer(schema, "2"));
116
+ ({ container } = await client.createContainer(schema, currentVersion));
117
117
  containerId = await container.attach();
118
118
  }
119
119
  if (container.connectionState !== ConnectionState.Connected) {
@@ -125,7 +125,7 @@ for (const testOpts of testMatrix) {
125
125
  const client2 = createAzureClient("test-user-id-2", "test-user-name-2", undefined, configProvider({
126
126
  "Fluid.Container.ForceWriteConnection": true,
127
127
  }));
128
- const { services: servicesGet } = await client2.getContainer(containerId, schema, "2");
128
+ const { services: servicesGet } = await client2.getContainer(containerId, schema, currentVersion);
129
129
  /* This is a workaround for a known bug, we should have one member (self) upon container connection */
130
130
  const partner = await waitForMember(servicesGet.audience, "test-user-id-2");
131
131
  assert.notStrictEqual(partner, undefined, "We should have partner at this point.");
@@ -153,10 +153,10 @@ for (const testOpts of testMatrix) {
153
153
  if (isEphemeral) {
154
154
  const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.observeMemberLeaving, "test-user-id-1", "test-user-name-1");
155
155
  containerId = getContainerIdFromPayloadResponse(containerResponse);
156
- ({ container, services } = await client.getContainer(containerId, schema, "2"));
156
+ ({ container, services } = await client.getContainer(containerId, schema, currentVersion));
157
157
  }
158
158
  else {
159
- ({ container, services } = await client.createContainer(schema, "2"));
159
+ ({ container, services } = await client.createContainer(schema, currentVersion));
160
160
  containerId = await container.attach();
161
161
  }
162
162
  if (container.connectionState !== ConnectionState.Connected) {
@@ -171,7 +171,7 @@ for (const testOpts of testMatrix) {
171
171
  const originalSelf = await waitForMember(services.audience, "test-user-id-1");
172
172
  assert.notStrictEqual(originalSelf, undefined, "We should have myself at this point.");
173
173
  const partnerClient = createAzureClient("test-user-id-2", "test-user-name-2", undefined, undefined, [ScopeType.DocRead]);
174
- const { container: partnerContainer, services: partnerServices } = await partnerClient.getContainer(containerId, schema, "2");
174
+ const { container: partnerContainer, services: partnerServices } = await partnerClient.getContainer(containerId, schema, currentVersion);
175
175
  if (partnerContainer.connectionState !== ConnectionState.Connected) {
176
176
  await timeoutPromise((resolve) => partnerContainer.once("connected", () => resolve()), {
177
177
  durationMs: connectTimeoutMs,
@@ -205,10 +205,10 @@ for (const testOpts of testMatrix) {
205
205
  if (isEphemeral) {
206
206
  const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.observeMemberLeaving, "test-user-id-1", "test-user-name-1");
207
207
  containerId = getContainerIdFromPayloadResponse(containerResponse);
208
- ({ container } = await client.getContainer(containerId, schema, "2"));
208
+ ({ container } = await client.getContainer(containerId, schema, currentVersion));
209
209
  }
210
210
  else {
211
- ({ container } = await client.createContainer(schema, "2"));
211
+ ({ container } = await client.createContainer(schema, currentVersion));
212
212
  containerId = await container.attach();
213
213
  }
214
214
  if (container.connectionState !== ConnectionState.Connected) {
@@ -218,7 +218,7 @@ for (const testOpts of testMatrix) {
218
218
  });
219
219
  }
220
220
  const partnerClient = createAzureClient("test-user-id-2", "test-user-name-2", undefined, undefined, [ScopeType.DocRead]);
221
- const { container: partnerContainer, services: partnerServices } = await partnerClient.getContainer(containerId, schema, "2");
221
+ const { container: partnerContainer, services: partnerServices } = await partnerClient.getContainer(containerId, schema, currentVersion);
222
222
  if (partnerContainer.connectionState !== ConnectionState.Connected) {
223
223
  await timeoutPromise((resolve) => partnerContainer.once("connected", () => resolve()), {
224
224
  durationMs: connectTimeoutMs,
@@ -246,7 +246,7 @@ for (const testOpts of testMatrix) {
246
246
  });
247
247
  });
248
248
  const partnerClient2 = createAzureClient("test-user-id-3", "test-user-name-3", undefined, undefined, [ScopeType.DocRead]);
249
- const { container: partnerContainer2, services: partnerServices2 } = await partnerClient2.getContainer(containerId, schema, "2");
249
+ const { container: partnerContainer2, services: partnerServices2 } = await partnerClient2.getContainer(containerId, schema, currentVersion);
250
250
  if (partnerContainer2.connectionState !== ConnectionState.Connected) {
251
251
  await timeoutPromise((resolve) => partnerContainer2.once("connected", () => resolve()), {
252
252
  durationMs: connectTimeoutMs,
@@ -1 +1 @@
1
- {"version":3,"file":"audience.spec.js","sourceRoot":"","sources":["../../src/test/audience.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 { AzureClient, AzureContainerServices } from \"@fluidframework/azure-client\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport type { ContainerSchema, IFluidContainer } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/legacy\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\n\nimport {\n\tcreateAzureClient,\n\tcreateContainerFromPayload,\n\tgetContainerIdFromPayloadResponse,\n\tScopeType,\n} from \"./AzureClientFactory.js\";\nimport * as ephemeralSummaryTrees from \"./ephemeralSummaryTrees.js\";\nimport { configProvider, waitForMember, getTestMatrix } from \"./utils.js\";\n\nconst testMatrix = getTestMatrix();\nfor (const testOpts of testMatrix) {\n\tdescribe(`Fluid audience (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tlet client: AzureClient;\n\t\tlet schema: ContainerSchema;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\n\t\tbeforeEach(\"createAzureClient\", () => {\n\t\t\tclient = createAzureClient(\"test-user-id-1\", \"test-user-name-1\");\n\t\t\tschema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmap1: SharedMap,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Find original member/self\n\t\t *\n\t\t * Expected behavior: container should have a single member upon creation.\n\t\t */\n\t\tit(\"can find original member\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tlet services: AzureContainerServices;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.findOriginalMember,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container, services } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container, services } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Attached,\n\t\t\t\t\"Container is not attached after attach is called\",\n\t\t\t);\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst myself = await waitForMember(services.audience, \"test-user-id-1\");\n\t\t\tassert.notStrictEqual(myself, undefined, \"We should have myself at this point.\");\n\n\t\t\tconst members = services.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 1, \"We should have only one member at this point.\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Find partner member\n\t\t *\n\t\t * Expected behavior: upon resolving container, the partner member should be able\n\t\t * to resolve original member.\n\t\t */\n\t\tit(\"can find partner member\", async () => {\n\t\t\tlet containerId: string = \"\";\n\t\t\tlet container: IFluidContainer;\n\t\t\tlet services: AzureContainerServices;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.findPartnerMember,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container, services } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container, services } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Attached,\n\t\t\t\t\"Container is not attached after attach is called\",\n\t\t\t);\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst originalSelf = await waitForMember(services.audience, \"test-user-id-1\");\n\t\t\tassert.notStrictEqual(originalSelf, undefined, \"We should have myself at this point.\");\n\n\t\t\tconst client2 = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tconfigProvider({\n\t\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst { services: servicesGet } = await client2.getContainer(containerId, schema, \"2\");\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partner = await waitForMember(servicesGet.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\t\tconst members = servicesGet.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartner?.id,\n\t\t\t\toriginalSelf?.id,\n\t\t\t\t\"Self and partner should have different IDs\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Partner should be able to observe change in audience\n\t\t *\n\t\t * Expected behavior: upon 1 partner leaving, other parther should observe\n\t\t * memberRemoved event and have correct partner count.\n\t\t */\n\t\tit(\"can observe member leaving\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.observeMemberLeaving,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst client2 = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tconfigProvider({\n\t\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst { services: servicesGet } = await client2.getContainer(containerId, schema, \"2\");\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partner = await waitForMember(servicesGet.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\t\tlet members = servicesGet.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\t\tcontainer.disconnect();\n\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tservicesGet.audience.on(\"memberRemoved\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tmembers = servicesGet.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 1, \"We should have one member left at this point.\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Find read-only partner member\n\t\t *\n\t\t * Expected behavior: upon resolving container, the read-only partner member should be able\n\t\t * to resolve original member, and the original member should be able to observe the read-only member.\n\t\t */\n\t\tit(\"can find read-only partner member\", async function () {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tlet services: AzureContainerServices;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.observeMemberLeaving,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container, services } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container, services } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Attached,\n\t\t\t\t\"Container is not attached after attach is called\",\n\t\t\t);\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst originalSelf = await waitForMember(services.audience, \"test-user-id-1\");\n\t\t\tassert.notStrictEqual(originalSelf, undefined, \"We should have myself at this point.\");\n\n\t\t\tconst partnerClient = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[ScopeType.DocRead],\n\t\t\t);\n\t\t\tconst { container: partnerContainer, services: partnerServices } =\n\t\t\t\tawait partnerClient.getContainer(containerId, schema, \"2\");\n\n\t\t\tif (partnerContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => partnerContainer.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partnerSelf = await waitForMember(partnerServices.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partnerSelf, undefined, \"We should have partner at this point.\");\n\n\t\t\tconst originalSelfSeenByPartner = await waitForMember(\n\t\t\t\tpartnerServices.audience,\n\t\t\t\t\"test-user-id-1\",\n\t\t\t);\n\t\t\tassert.notStrictEqual(\n\t\t\t\toriginalSelfSeenByPartner,\n\t\t\t\tundefined,\n\t\t\t\t\"Partner should see original at this point.\",\n\t\t\t);\n\t\t\tconst partnerMembers = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(\n\t\t\t\tpartnerMembers.size,\n\t\t\t\t2,\n\t\t\t\t\"Partner should see two members at this point.\",\n\t\t\t);\n\n\t\t\tconst partnerSelfSeenByOriginal = await waitForMember(\n\t\t\t\tservices.audience,\n\t\t\t\t\"test-user-id-2\",\n\t\t\t);\n\t\t\tconst originalMembers = services.audience.getMembers();\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartnerSelfSeenByOriginal,\n\t\t\t\tundefined,\n\t\t\t\t\"Should see partner at this point.\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\toriginalMembers.size,\n\t\t\t\t2,\n\t\t\t\t\"Original should see two members at this point.\",\n\t\t\t);\n\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartnerSelf?.id,\n\t\t\t\toriginalSelf?.id,\n\t\t\t\t\"Self and partner should have different IDs\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpartnerSelf?.id,\n\t\t\t\tpartnerSelfSeenByOriginal?.id,\n\t\t\t\t\"Partner and partner-as-seen-by-original should have same IDs\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Read-only Partner should be able to observe changes in audience\n\t\t *\n\t\t * Expected behavior: upon 1 partner leaving, other read-only parther should observe\n\t\t * memberRemoved event and have correct partner count. Upon new read-only partner joining,\n\t\t * the original read-only partner should observe memberAdded event and have correct partner count.\n\t\t */\n\t\tit(\"can observe member leaving and joining in read-only mode\", async function () {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.observeMemberLeaving,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"client1 container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst partnerClient = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[ScopeType.DocRead],\n\t\t\t);\n\t\t\tconst { container: partnerContainer, services: partnerServices } =\n\t\t\t\tawait partnerClient.getContainer(containerId, schema, \"2\");\n\n\t\t\tif (partnerContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => partnerContainer.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"client2 container connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partnerSelf = await waitForMember(partnerServices.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partnerSelf, undefined, \"We should have partner at this point.\");\n\n\t\t\tawait waitForMember(partnerServices.audience, \"test-user-id-1\");\n\t\t\tlet members = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\t\tconst partnerClientMemberRemoveP = new Promise<void>((resolve) => {\n\t\t\t\tpartnerServices.audience.on(\"memberRemoved\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcontainer.disconnect();\n\n\t\t\tawait partnerClientMemberRemoveP;\n\n\t\t\tmembers = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 1, \"We should have one member left at this point.\");\n\n\t\t\tconst partnerClientMemberAddP = new Promise<void>((resolve) => {\n\t\t\t\tpartnerServices.audience.on(\"memberAdded\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst partnerClient2 = createAzureClient(\n\t\t\t\t\"test-user-id-3\",\n\t\t\t\t\"test-user-name-3\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[ScopeType.DocRead],\n\t\t\t);\n\t\t\tconst { container: partnerContainer2, services: partnerServices2 } =\n\t\t\t\tawait partnerClient2.getContainer(containerId, schema, \"2\");\n\n\t\t\tif (partnerContainer2.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => partnerContainer2.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"client3 container connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partnerSelf2 = await waitForMember(partnerServices2.audience, \"test-user-id-3\");\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartnerSelf2,\n\t\t\t\tundefined,\n\t\t\t\t\"We should have new read-only partner at this point.\",\n\t\t\t);\n\n\t\t\tawait partnerClientMemberAddP;\n\n\t\t\tmembers = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members again at this point.\");\n\t\t\tassert.strict(\n\t\t\t\tmembers.has(\"test-user-id-3\"),\n\t\t\t\t\"Original read-only partner should see new read-only partner.\",\n\t\t\t);\n\t\t});\n\t});\n}\n"]}
1
+ {"version":3,"file":"audience.spec.js","sourceRoot":"","sources":["../../src/test/audience.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 { AzureClient, AzureContainerServices } from \"@fluidframework/azure-client\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport type { ContainerSchema, IFluidContainer } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/legacy\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\n\nimport {\n\tcreateAzureClient,\n\tcreateContainerFromPayload,\n\tgetContainerIdFromPayloadResponse,\n\tScopeType,\n} from \"./AzureClientFactory.js\";\nimport * as ephemeralSummaryTrees from \"./ephemeralSummaryTrees.js\";\nimport { configProvider, waitForMember, getTestMatrix, currentVersion } from \"./utils.js\";\n\nconst testMatrix = getTestMatrix();\nfor (const testOpts of testMatrix) {\n\tdescribe(`Fluid audience (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tlet client: AzureClient;\n\t\tlet schema: ContainerSchema;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\n\t\tbeforeEach(\"createAzureClient\", () => {\n\t\t\tclient = createAzureClient(\"test-user-id-1\", \"test-user-name-1\");\n\t\t\tschema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmap1: SharedMap,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Find original member/self\n\t\t *\n\t\t * Expected behavior: container should have a single member upon creation.\n\t\t */\n\t\tit(\"can find original member\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tlet services: AzureContainerServices;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.findOriginalMember,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container, services } = await client.getContainer(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschema,\n\t\t\t\t\tcurrentVersion,\n\t\t\t\t));\n\t\t\t} else {\n\t\t\t\t({ container, services } = await client.createContainer(schema, currentVersion));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Attached,\n\t\t\t\t\"Container is not attached after attach is called\",\n\t\t\t);\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst myself = await waitForMember(services.audience, \"test-user-id-1\");\n\t\t\tassert.notStrictEqual(myself, undefined, \"We should have myself at this point.\");\n\n\t\t\tconst members = services.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 1, \"We should have only one member at this point.\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Find partner member\n\t\t *\n\t\t * Expected behavior: upon resolving container, the partner member should be able\n\t\t * to resolve original member.\n\t\t */\n\t\tit(\"can find partner member\", async () => {\n\t\t\tlet containerId: string = \"\";\n\t\t\tlet container: IFluidContainer;\n\t\t\tlet services: AzureContainerServices;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.findPartnerMember,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container, services } = await client.getContainer(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschema,\n\t\t\t\t\tcurrentVersion,\n\t\t\t\t));\n\t\t\t} else {\n\t\t\t\t({ container, services } = await client.createContainer(schema, currentVersion));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Attached,\n\t\t\t\t\"Container is not attached after attach is called\",\n\t\t\t);\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst originalSelf = await waitForMember(services.audience, \"test-user-id-1\");\n\t\t\tassert.notStrictEqual(originalSelf, undefined, \"We should have myself at this point.\");\n\n\t\t\tconst client2 = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tconfigProvider({\n\t\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst { services: servicesGet } = await client2.getContainer(\n\t\t\t\tcontainerId,\n\t\t\t\tschema,\n\t\t\t\tcurrentVersion,\n\t\t\t);\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partner = await waitForMember(servicesGet.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\t\tconst members = servicesGet.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartner?.id,\n\t\t\t\toriginalSelf?.id,\n\t\t\t\t\"Self and partner should have different IDs\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Partner should be able to observe change in audience\n\t\t *\n\t\t * Expected behavior: upon 1 partner leaving, other parther should observe\n\t\t * memberRemoved event and have correct partner count.\n\t\t */\n\t\tit(\"can observe member leaving\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.observeMemberLeaving,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container } = await client.getContainer(containerId, schema, currentVersion));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(schema, currentVersion));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst client2 = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tconfigProvider({\n\t\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst { services: servicesGet } = await client2.getContainer(\n\t\t\t\tcontainerId,\n\t\t\t\tschema,\n\t\t\t\tcurrentVersion,\n\t\t\t);\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partner = await waitForMember(servicesGet.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\t\tlet members = servicesGet.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\t\tcontainer.disconnect();\n\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tservicesGet.audience.on(\"memberRemoved\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tmembers = servicesGet.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 1, \"We should have one member left at this point.\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Find read-only partner member\n\t\t *\n\t\t * Expected behavior: upon resolving container, the read-only partner member should be able\n\t\t * to resolve original member, and the original member should be able to observe the read-only member.\n\t\t */\n\t\tit(\"can find read-only partner member\", async function () {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tlet services: AzureContainerServices;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.observeMemberLeaving,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container, services } = await client.getContainer(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschema,\n\t\t\t\t\tcurrentVersion,\n\t\t\t\t));\n\t\t\t} else {\n\t\t\t\t({ container, services } = await client.createContainer(schema, currentVersion));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Attached,\n\t\t\t\t\"Container is not attached after attach is called\",\n\t\t\t);\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst originalSelf = await waitForMember(services.audience, \"test-user-id-1\");\n\t\t\tassert.notStrictEqual(originalSelf, undefined, \"We should have myself at this point.\");\n\n\t\t\tconst partnerClient = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[ScopeType.DocRead],\n\t\t\t);\n\t\t\tconst { container: partnerContainer, services: partnerServices } =\n\t\t\t\tawait partnerClient.getContainer(containerId, schema, currentVersion);\n\n\t\t\tif (partnerContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => partnerContainer.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partnerSelf = await waitForMember(partnerServices.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partnerSelf, undefined, \"We should have partner at this point.\");\n\n\t\t\tconst originalSelfSeenByPartner = await waitForMember(\n\t\t\t\tpartnerServices.audience,\n\t\t\t\t\"test-user-id-1\",\n\t\t\t);\n\t\t\tassert.notStrictEqual(\n\t\t\t\toriginalSelfSeenByPartner,\n\t\t\t\tundefined,\n\t\t\t\t\"Partner should see original at this point.\",\n\t\t\t);\n\t\t\tconst partnerMembers = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(\n\t\t\t\tpartnerMembers.size,\n\t\t\t\t2,\n\t\t\t\t\"Partner should see two members at this point.\",\n\t\t\t);\n\n\t\t\tconst partnerSelfSeenByOriginal = await waitForMember(\n\t\t\t\tservices.audience,\n\t\t\t\t\"test-user-id-2\",\n\t\t\t);\n\t\t\tconst originalMembers = services.audience.getMembers();\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartnerSelfSeenByOriginal,\n\t\t\t\tundefined,\n\t\t\t\t\"Should see partner at this point.\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\toriginalMembers.size,\n\t\t\t\t2,\n\t\t\t\t\"Original should see two members at this point.\",\n\t\t\t);\n\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartnerSelf?.id,\n\t\t\t\toriginalSelf?.id,\n\t\t\t\t\"Self and partner should have different IDs\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpartnerSelf?.id,\n\t\t\t\tpartnerSelfSeenByOriginal?.id,\n\t\t\t\t\"Partner and partner-as-seen-by-original should have same IDs\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Read-only Partner should be able to observe changes in audience\n\t\t *\n\t\t * Expected behavior: upon 1 partner leaving, other read-only parther should observe\n\t\t * memberRemoved event and have correct partner count. Upon new read-only partner joining,\n\t\t * the original read-only partner should observe memberAdded event and have correct partner count.\n\t\t */\n\t\tit(\"can observe member leaving and joining in read-only mode\", async function () {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.observeMemberLeaving,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container } = await client.getContainer(containerId, schema, currentVersion));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(schema, currentVersion));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"client1 container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst partnerClient = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[ScopeType.DocRead],\n\t\t\t);\n\t\t\tconst { container: partnerContainer, services: partnerServices } =\n\t\t\t\tawait partnerClient.getContainer(containerId, schema, currentVersion);\n\n\t\t\tif (partnerContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => partnerContainer.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"client2 container connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partnerSelf = await waitForMember(partnerServices.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partnerSelf, undefined, \"We should have partner at this point.\");\n\n\t\t\tawait waitForMember(partnerServices.audience, \"test-user-id-1\");\n\t\t\tlet members = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\t\tconst partnerClientMemberRemoveP = new Promise<void>((resolve) => {\n\t\t\t\tpartnerServices.audience.on(\"memberRemoved\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcontainer.disconnect();\n\n\t\t\tawait partnerClientMemberRemoveP;\n\n\t\t\tmembers = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 1, \"We should have one member left at this point.\");\n\n\t\t\tconst partnerClientMemberAddP = new Promise<void>((resolve) => {\n\t\t\t\tpartnerServices.audience.on(\"memberAdded\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst partnerClient2 = createAzureClient(\n\t\t\t\t\"test-user-id-3\",\n\t\t\t\t\"test-user-name-3\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[ScopeType.DocRead],\n\t\t\t);\n\t\t\tconst { container: partnerContainer2, services: partnerServices2 } =\n\t\t\t\tawait partnerClient2.getContainer(containerId, schema, currentVersion);\n\n\t\t\tif (partnerContainer2.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => partnerContainer2.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"client3 container connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partnerSelf2 = await waitForMember(partnerServices2.audience, \"test-user-id-3\");\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartnerSelf2,\n\t\t\t\tundefined,\n\t\t\t\t\"We should have new read-only partner at this point.\",\n\t\t\t);\n\n\t\t\tawait partnerClientMemberAddP;\n\n\t\t\tmembers = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members again at this point.\");\n\t\t\tassert.strict(\n\t\t\t\tmembers.has(\"test-user-id-3\"),\n\t\t\t\t\"Original read-only partner should see new read-only partner.\",\n\t\t\t);\n\t\t});\n\t});\n}\n"]}
@@ -17,7 +17,7 @@ import { SharedTree } from "@fluidframework/tree/legacy";
17
17
  import { createSandbox } from "sinon";
18
18
  import { createAzureClient, createAzureClientLegacy, createContainerFromPayload, getContainerIdFromPayloadResponse, } from "./AzureClientFactory.js";
19
19
  import * as ephemeralSummaryTrees from "./ephemeralSummaryTrees.js";
20
- import { getTestMatrix, mapWait } from "./utils.js";
20
+ import { getTestMatrix, mapWait, currentVersion } from "./utils.js";
21
21
  const configProvider = (settings) => ({
22
22
  getRawConfig: (name) => settings[name],
23
23
  });
@@ -50,7 +50,7 @@ for (const testOpts of testMatrix) {
50
50
  if (isEphemeral) {
51
51
  this.skip();
52
52
  }
53
- const { container } = await client.createContainer(schema, "2");
53
+ const { container } = await client.createContainer(schema, currentVersion);
54
54
  assert.strictEqual(container.attachState, AttachState.Detached, "Container should be detached");
55
55
  // Make sure we can attach.
56
56
  const containerId = await container.attach();
@@ -68,10 +68,10 @@ for (const testOpts of testMatrix) {
68
68
  if (isEphemeral) {
69
69
  const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.canAttachContainer, "test-user-id-1", "test-user-name-1");
70
70
  containerId = getContainerIdFromPayloadResponse(containerResponse);
71
- ({ container } = await client.getContainer(containerId, schema, "2"));
71
+ ({ container } = await client.getContainer(containerId, schema, currentVersion));
72
72
  }
73
73
  else {
74
- ({ container } = await client.createContainer(schema, "2"));
74
+ ({ container } = await client.createContainer(schema, currentVersion));
75
75
  containerId = await container.attach();
76
76
  }
77
77
  if (container.connectionState !== ConnectionState.Connected) {
@@ -95,10 +95,10 @@ for (const testOpts of testMatrix) {
95
95
  if (isEphemeral) {
96
96
  const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.cannotAttachContainerTwice, "test-user-id-1", "test-user-name-1");
97
97
  containerId = getContainerIdFromPayloadResponse(containerResponse);
98
- ({ container } = await client.getContainer(containerId, schema, "2"));
98
+ ({ container } = await client.getContainer(containerId, schema, currentVersion));
99
99
  }
100
100
  else {
101
- ({ container } = await client.createContainer(schema, "2"));
101
+ ({ container } = await client.createContainer(schema, currentVersion));
102
102
  containerId = await container.attach();
103
103
  }
104
104
  if (container.connectionState !== ConnectionState.Connected) {
@@ -125,7 +125,7 @@ for (const testOpts of testMatrix) {
125
125
  containerId = getContainerIdFromPayloadResponse(containerResponse);
126
126
  }
127
127
  else {
128
- ({ container: newContainer } = await client.createContainer(schema, "2"));
128
+ ({ container: newContainer } = await client.createContainer(schema, currentVersion));
129
129
  containerId = await newContainer.attach();
130
130
  if (newContainer.connectionState !== ConnectionState.Connected) {
131
131
  await timeoutPromise((resolve) => newContainer.once("connected", () => resolve()), {
@@ -134,7 +134,7 @@ for (const testOpts of testMatrix) {
134
134
  });
135
135
  }
136
136
  }
137
- const resources = client.getContainer(containerId, schema, "2");
137
+ const resources = client.getContainer(containerId, schema, currentVersion);
138
138
  await assert.doesNotReject(resources, () => true, "container cannot be retrieved from Azure Fluid Relay");
139
139
  });
140
140
  /**
@@ -147,7 +147,7 @@ for (const testOpts of testMatrix) {
147
147
  it("cannot load improperly created container (cannot load a non-existent container)", async () => {
148
148
  const consoleErrorFn = console.error;
149
149
  console.error = () => { };
150
- const containerAndServicesP = client.getContainer("containerConfig", schema, "2");
150
+ const containerAndServicesP = client.getContainer("containerConfig", schema, currentVersion);
151
151
  const errorFn = (error) => {
152
152
  assert.notStrictEqual(error.message, undefined, "Azure Client error is undefined");
153
153
  // AFR gives R11s fetch error, T9s gives 0x8e4
@@ -192,7 +192,7 @@ for (const testOpts of testMatrix) {
192
192
  if (isEphemeral) {
193
193
  this.skip();
194
194
  }
195
- await client.createContainer(schema, "2");
195
+ await client.createContainer(schema, currentVersion);
196
196
  const event = mockLogger.events.find((e) => e.eventName.endsWith("ContainerLoadStats"));
197
197
  assert(event !== undefined, "ContainerLoadStats event should exist");
198
198
  const featureGates = event.featureGates;
@@ -232,7 +232,7 @@ for (const testOpts of testMatrix) {
232
232
  * Expected behavior: an error should not be thrown nor should a rejected promise
233
233
  * be returned.
234
234
  */
235
- for (const compatibilityMode of ["1", "2"]) {
235
+ for (const compatibilityMode of ["1.0.0", "2.0.0"]) {
236
236
  it(`Current AzureClient (mode: "${compatibilityMode}") can get container made by legacy AzureClient`, async () => {
237
237
  const { container: containerLegacy } = await clientLegacy.createContainer(schemaLegacy);
238
238
  const containerId = await containerLegacy.attach();
@@ -257,7 +257,7 @@ for (const testOpts of testMatrix) {
257
257
  containerLegacy.initialObjects.map1.set("key", "value");
258
258
  // Await the value being saved, especially important if we dispose the legacy container.
259
259
  await valueSetP;
260
- if (compatibilityMode === "2") {
260
+ if (compatibilityMode === "2.0.0") {
261
261
  // We don't support interop between legacy containers and "2" mode, dispose the legacy
262
262
  // container to avoid this case.
263
263
  containerLegacy.dispose();
@@ -319,7 +319,7 @@ for (const testOpts of testMatrix) {
319
319
  it(`Legacy AzureClient can get container made by current AzureClient (mode: "1")`, async () => {
320
320
  const { container: containerCurrent } = await clientCurrent1.createContainer(schemaCurrent,
321
321
  // Note: Only containers created in compatibility mode "1" may be loaded by legacy client.
322
- "1");
322
+ "1.0.0");
323
323
  const containerId = await containerCurrent.attach();
324
324
  if (containerCurrent.connectionState !== ConnectionState.Connected) {
325
325
  await timeoutPromise((resolve) => containerCurrent.once("connected", () => resolve()), {
@@ -346,7 +346,7 @@ for (const testOpts of testMatrix) {
346
346
  * Expected behavior: an error should not be thrown nor should a rejected promise be returned.
347
347
  */
348
348
  it(`Current AzureClient (mode: "2") can get container made by current AzureClient (mode: "1")`, async () => {
349
- const { container: containerCurrent1 } = await clientCurrent1.createContainer(schemaCurrent, "1");
349
+ const { container: containerCurrent1 } = await clientCurrent1.createContainer(schemaCurrent, "1.0.0");
350
350
  const containerId = await containerCurrent1.attach();
351
351
  if (containerCurrent1.connectionState !== ConnectionState.Connected) {
352
352
  await timeoutPromise((resolve) => containerCurrent1.once("connected", () => resolve()), {
@@ -355,7 +355,7 @@ for (const testOpts of testMatrix) {
355
355
  });
356
356
  }
357
357
  containerCurrent1.initialObjects.map1.set("key", "value");
358
- const resources = clientCurrent2.getContainer(containerId, schemaCurrent, "2");
358
+ const resources = clientCurrent2.getContainer(containerId, schemaCurrent, "2.0.0");
359
359
  await assert.doesNotReject(resources, () => true, "container could not be loaded");
360
360
  const { container: containerCurrent2 } = await resources;
361
361
  if (containerCurrent2.connectionState !== ConnectionState.Connected) {
@@ -373,7 +373,7 @@ for (const testOpts of testMatrix) {
373
373
  * Expected behavior: an error should not be thrown nor should a rejected promise be returned.
374
374
  */
375
375
  it(`Current AzureClient (mode: "1") can get container made by current AzureClient (mode: "2")`, async () => {
376
- const { container: containerCurrent2 } = await clientCurrent2.createContainer(schemaCurrent, "2");
376
+ const { container: containerCurrent2 } = await clientCurrent2.createContainer(schemaCurrent, "2.0.0");
377
377
  const containerId = await containerCurrent2.attach();
378
378
  if (containerCurrent2.connectionState !== ConnectionState.Connected) {
379
379
  await timeoutPromise((resolve) => containerCurrent2.once("connected", () => resolve()), {
@@ -382,7 +382,7 @@ for (const testOpts of testMatrix) {
382
382
  });
383
383
  }
384
384
  containerCurrent2.initialObjects.map1.set("key", "value");
385
- const resources = clientCurrent1.getContainer(containerId, schemaCurrent, "1");
385
+ const resources = clientCurrent1.getContainer(containerId, schemaCurrent, "1.0.0");
386
386
  await assert.doesNotReject(resources, () => true, "container could not be loaded");
387
387
  const { container: containerCurrent1 } = await resources;
388
388
  if (containerCurrent1.connectionState !== ConnectionState.Connected) {
@@ -395,7 +395,7 @@ for (const testOpts of testMatrix) {
395
395
  assert.strictEqual(result, "value", "Value not found in copied container");
396
396
  });
397
397
  it("op grouping disabled as expected for 1.x clients", async () => {
398
- const { container: container1 } = await clientCurrent1.createContainer(schemaCurrent, "1");
398
+ const { container: container1 } = await clientCurrent1.createContainer(schemaCurrent, "1.0.0");
399
399
  const containerId = await container1.attach();
400
400
  if (container1.connectionState !== ConnectionState.Connected) {
401
401
  await timeoutPromise((resolve) => container1.once("connected", () => resolve()), {
@@ -435,7 +435,7 @@ for (const testOpts of testMatrix) {
435
435
  }
436
436
  }
437
437
  });
438
- for (const compatibilityMode of ["1", "2"]) {
438
+ for (const compatibilityMode of ["1.0.0", "2.0.0"]) {
439
439
  it(`op grouping works as expected (compatibilityMode: ${compatibilityMode})`, async () => {
440
440
  const { container: container1 } = await clientCurrent1.createContainer(schemaCurrent, compatibilityMode);
441
441
  const containerId = await container1.attach();
@@ -472,7 +472,7 @@ for (const testOpts of testMatrix) {
472
472
  groupedBatchCount++;
473
473
  }
474
474
  }
475
- if (compatibilityMode === "1") {
475
+ if (compatibilityMode === "1.0.0") {
476
476
  assert.strictEqual(groupedBatchCount, 0, "expect no op grouping in compatibilityMode 1");
477
477
  }
478
478
  else {
@@ -488,11 +488,14 @@ for (const testOpts of testMatrix) {
488
488
  describe("Container create in tree-only mode", () => {
489
489
  const invalidSchemaErrorMessage = "Tree-only mode requires exactly 1 SharedTree in initialObjects.";
490
490
  function createClient() {
491
- return createAzureClient(undefined, undefined, undefined, undefined, undefined, ({ schema, compatibilityMode }) => {
491
+ return createAzureClient(undefined, undefined, undefined, undefined, undefined, ({ schema, minVersionForCollaboration }) => {
492
492
  if (!isTreeContainerSchema(schema)) {
493
493
  throw new UsageError(invalidSchemaErrorMessage);
494
494
  }
495
- return createTreeContainerRuntimeFactory({ schema, compatibilityMode });
495
+ return createTreeContainerRuntimeFactory({
496
+ schema,
497
+ minVersionForCollaboration,
498
+ });
496
499
  });
497
500
  }
498
501
  it("can create tree-based container", async function () {
@@ -502,7 +505,7 @@ describe("Container create in tree-only mode", () => {
502
505
  tree: SharedTree,
503
506
  },
504
507
  };
505
- const { container } = await client.createContainer(schema, "2");
508
+ const { container } = await client.createContainer(schema, currentVersion);
506
509
  assert(SharedTree.is(container.initialObjects.tree));
507
510
  });
508
511
  it("throws if invalid schema is encountered", async function () {
@@ -513,7 +516,7 @@ describe("Container create in tree-only mode", () => {
513
516
  map: SharedMap,
514
517
  },
515
518
  };
516
- await assert.rejects(client.createContainer(schema, "2"), (error) => {
519
+ await assert.rejects(client.createContainer(schema, currentVersion), (error) => {
517
520
  assert(error instanceof UsageError);
518
521
  assert.strictEqual(error.message, invalidSchemaErrorMessage);
519
522
  return true;