@fluidframework/azure-end-to-end-tests 2.21.0 → 2.23.0-323641

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # @fluidframework/azure-end-to-end-tests
2
2
 
3
+ ## 2.22.0
4
+
5
+ Dependency updates only.
6
+
3
7
  ## 2.21.0
4
8
 
5
9
  Dependency updates only.
package/README.md CHANGED
@@ -25,6 +25,7 @@ When making such a request please include if the configuration already works (an
25
25
  ### Supported Runtimes
26
26
 
27
27
  - NodeJs ^20.10.0 except that we will drop support for it [when NodeJs 20 loses its upstream support on 2026-04-30](https://github.com/nodejs/release#release-schedule), and will support a newer LTS version of NodeJS (22) at least 1 year before 20 is end-of-life. This same policy applies to NodeJS 22 when it is end of life (2027-04-30).
28
+ - Running Fluid in a Node.js environment with the `--no-experimental-fetch` flag is not supported.
28
29
  - Modern browsers supporting the es2022 standard library: in response to asks we can add explicit support for using babel to polyfill to target specific standards or runtimes (meaning we can avoid/remove use of things that don't polyfill robustly, but otherwise target modern standards).
29
30
 
30
31
  ### Supported Tools
@@ -13,7 +13,7 @@ import { configProvider, waitForMember, getTestMatrix } from "./utils.js";
13
13
  const testMatrix = getTestMatrix();
14
14
  for (const testOpts of testMatrix) {
15
15
  describe(`Fluid audience (${testOpts.variant})`, () => {
16
- const connectTimeoutMs = 10000;
16
+ const connectTimeoutMs = 10_000;
17
17
  let client;
18
18
  let schema;
19
19
  const isEphemeral = testOpts.options.isEphemeral;
@@ -1 +1 @@
1
- {"version":3,"file":"audience.spec.js","sourceRoot":"","sources":["../../src/test/audience.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAGrE,OAAO,EACN,iBAAiB,EACjB,0BAA0B,EAC1B,iCAAiC,EACjC,SAAS,GACT,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,qBAAqB,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;AACnC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;IACnC,QAAQ,CAAC,mBAAmB,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE;QACrD,MAAM,gBAAgB,GAAG,KAAM,CAAC;QAChC,IAAI,MAAmB,CAAC;QACxB,IAAI,MAAuB,CAAC;QAC5B,MAAM,WAAW,GAAY,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;QAE1D,UAAU,CAAC,mBAAmB,EAAE,GAAG,EAAE;YACpC,MAAM,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;YACjE,MAAM,GAAG;gBACR,cAAc,EAAE;oBACf,IAAI,EAAE,SAAS;iBACf;aACD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;WAIG;QACH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACzC,IAAI,WAAmB,CAAC;YACxB,IAAI,SAA0B,CAAC;YAC/B,IAAI,QAAgC,CAAC;YACrC,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,iBAAiB,GAA8B,MAAM,0BAA0B,CACpF,qBAAqB,CAAC,kBAAkB,EACxC,gBAAgB,EAChB,kBAAkB,CAClB,CAAC;gBACF,WAAW,GAAG,iCAAiC,CAAC,iBAAiB,CAAC,CAAC;gBACnE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACP,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBACtE,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YACxC,CAAC;YAED,IAAI,SAAS,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC7D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBAC/E,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,6BAA6B;iBACvC,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,WAAW,CAAC,OAAO,WAAW,EAAE,QAAQ,EAAE,mCAAmC,CAAC,CAAC;YACtF,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,QAAQ,EACpB,kDAAkD,CAClD,CAAC;YAEF,sGAAsG;YACtG,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YACxE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,sCAAsC,CAAC,CAAC;YAEjF,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC/C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,+CAA+C,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACxC,IAAI,WAAW,GAAW,EAAE,CAAC;YAC7B,IAAI,SAA0B,CAAC;YAC/B,IAAI,QAAgC,CAAC;YACrC,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,iBAAiB,GAA8B,MAAM,0BAA0B,CACpF,qBAAqB,CAAC,iBAAiB,EACvC,gBAAgB,EAChB,kBAAkB,CAClB,CAAC;gBACF,WAAW,GAAG,iCAAiC,CAAC,iBAAiB,CAAC,CAAC;gBACnE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACP,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBACtE,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YACxC,CAAC;YAED,IAAI,SAAS,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC7D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBAC/E,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,6BAA6B;iBACvC,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,WAAW,CAAC,OAAO,WAAW,EAAE,QAAQ,EAAE,mCAAmC,CAAC,CAAC;YACtF,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,QAAQ,EACpB,kDAAkD,CAClD,CAAC;YAEF,sGAAsG;YACtG,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAC9E,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,SAAS,EAAE,sCAAsC,CAAC,CAAC;YAEvF,MAAM,OAAO,GAAG,iBAAiB,CAChC,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,cAAc,CAAC;gBACd,sCAAsC,EAAE,IAAI;aAC5C,CAAC,CACF,CAAC;YACF,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAEvF,sGAAsG;YACtG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAC5E,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,uCAAuC,CAAC,CAAC;YAEnF,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAClD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,2CAA2C,CAAC,CAAC;YAEjF,MAAM,CAAC,cAAc,CACpB,OAAO,EAAE,EAAE,EACX,YAAY,EAAE,EAAE,EAChB,4CAA4C,CAC5C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC3C,IAAI,WAAmB,CAAC;YACxB,IAAI,SAA0B,CAAC;YAC/B,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,iBAAiB,GAA8B,MAAM,0BAA0B,CACpF,qBAAqB,CAAC,oBAAoB,EAC1C,gBAAgB,EAChB,kBAAkB,CAClB,CAAC;gBACF,WAAW,GAAG,iCAAiC,CAAC,iBAAiB,CAAC,CAAC;gBACnE,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACP,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC5D,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YACxC,CAAC;YAED,IAAI,SAAS,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC7D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBAC/E,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,6BAA6B;iBACvC,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,iBAAiB,CAChC,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,cAAc,CAAC;gBACd,sCAAsC,EAAE,IAAI;aAC5C,CAAC,CACF,CAAC;YACF,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAEvF,sGAAsG;YACtG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAC5E,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,uCAAuC,CAAC,CAAC;YAEnF,IAAI,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAChD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,2CAA2C,CAAC,CAAC;YAEjF,SAAS,CAAC,UAAU,EAAE,CAAC;YAEvB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACnC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;oBAC7C,OAAO,EAAE,CAAC;gBACX,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC5C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,+CAA+C,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,EAAE,CAAC,mCAAmC,EAAE,KAAK;YAC5C,IAAI,WAAmB,CAAC;YACxB,IAAI,SAA0B,CAAC;YAC/B,IAAI,QAAgC,CAAC;YACrC,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,iBAAiB,GAA8B,MAAM,0BAA0B,CACpF,qBAAqB,CAAC,oBAAoB,EAC1C,gBAAgB,EAChB,kBAAkB,CAClB,CAAC;gBACF,WAAW,GAAG,iCAAiC,CAAC,iBAAiB,CAAC,CAAC;gBACnE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACP,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBACtE,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YACxC,CAAC;YAED,IAAI,SAAS,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC7D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBAC/E,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,6BAA6B;iBACvC,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,WAAW,CAAC,OAAO,WAAW,EAAE,QAAQ,EAAE,mCAAmC,CAAC,CAAC;YACtF,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,QAAQ,EACpB,kDAAkD,CAClD,CAAC;YAEF,sGAAsG;YACtG,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAC9E,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,SAAS,EAAE,sCAAsC,CAAC,CAAC;YAEvF,MAAM,aAAa,GAAG,iBAAiB,CACtC,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,CAAC,SAAS,CAAC,OAAO,CAAC,CACnB,CAAC;YACF,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,GAC/D,MAAM,aAAa,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAE5D,IAAI,gBAAgB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACpE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAChE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,6BAA6B;iBACvC,CACD,CAAC;YACH,CAAC;YAED,sGAAsG;YACtG,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YACpF,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,SAAS,EAAE,uCAAuC,CAAC,CAAC;YAEvF,MAAM,yBAAyB,GAAG,MAAM,aAAa,CACpD,eAAe,CAAC,QAAQ,EACxB,gBAAgB,CAChB,CAAC;YACF,MAAM,CAAC,cAAc,CACpB,yBAAyB,EACzB,SAAS,EACT,4CAA4C,CAC5C,CAAC;YACF,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC7D,MAAM,CAAC,WAAW,CACjB,cAAc,CAAC,IAAI,EACnB,CAAC,EACD,+CAA+C,CAC/C,CAAC;YAEF,MAAM,yBAAyB,GAAG,MAAM,aAAa,CACpD,QAAQ,CAAC,QAAQ,EACjB,gBAAgB,CAChB,CAAC;YACF,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YACvD,MAAM,CAAC,cAAc,CACpB,yBAAyB,EACzB,SAAS,EACT,mCAAmC,CACnC,CAAC;YACF,MAAM,CAAC,WAAW,CACjB,eAAe,CAAC,IAAI,EACpB,CAAC,EACD,gDAAgD,CAChD,CAAC;YAEF,MAAM,CAAC,cAAc,CACpB,WAAW,EAAE,EAAE,EACf,YAAY,EAAE,EAAE,EAChB,4CAA4C,CAC5C,CAAC;YACF,MAAM,CAAC,WAAW,CACjB,WAAW,EAAE,EAAE,EACf,yBAAyB,EAAE,EAAE,EAC7B,8DAA8D,CAC9D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;;;WAMG;QACH,EAAE,CAAC,0DAA0D,EAAE,KAAK;YACnE,IAAI,WAAmB,CAAC;YACxB,IAAI,SAA0B,CAAC;YAC/B,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,iBAAiB,GAA8B,MAAM,0BAA0B,CACpF,qBAAqB,CAAC,oBAAoB,EAC1C,gBAAgB,EAChB,kBAAkB,CAClB,CAAC;gBACF,WAAW,GAAG,iCAAiC,CAAC,iBAAiB,CAAC,CAAC;gBACnE,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACP,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC5D,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YACxC,CAAC;YAED,IAAI,SAAS,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC7D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBAC/E,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,qCAAqC;iBAC/C,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,aAAa,GAAG,iBAAiB,CACtC,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,CAAC,SAAS,CAAC,OAAO,CAAC,CACnB,CAAC;YACF,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,GAC/D,MAAM,aAAa,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAE5D,IAAI,gBAAgB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACpE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAChE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,qCAAqC;iBAC/C,CACD,CAAC;YACH,CAAC;YACD,sGAAsG;YACtG,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YACpF,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,SAAS,EAAE,uCAAuC,CAAC,CAAC;YAEvF,MAAM,aAAa,CAAC,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAChE,IAAI,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YACpD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,2CAA2C,CAAC,CAAC;YAEjF,MAAM,0BAA0B,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAChE,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;oBACjD,OAAO,EAAE,CAAC;gBACX,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,SAAS,CAAC,UAAU,EAAE,CAAC;YAEvB,MAAM,0BAA0B,CAAC;YAEjC,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAChD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,+CAA+C,CAAC,CAAC;YAErF,MAAM,uBAAuB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC7D,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;oBAC/C,OAAO,EAAE,CAAC;gBACX,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,cAAc,GAAG,iBAAiB,CACvC,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,CAAC,SAAS,CAAC,OAAO,CAAC,CACnB,CAAC;YACF,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GACjE,MAAM,cAAc,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAE7D,IAAI,iBAAiB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACrE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EACjE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,qCAAqC;iBAC/C,CACD,CAAC;YACH,CAAC;YAED,sGAAsG;YACtG,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YACtF,MAAM,CAAC,cAAc,CACpB,YAAY,EACZ,SAAS,EACT,qDAAqD,CACrD,CAAC;YAEF,MAAM,uBAAuB,CAAC;YAE9B,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAChD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,iDAAiD,CAAC,CAAC;YACvF,MAAM,CAAC,MAAM,CACZ,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAC7B,8DAA8D,CAC9D,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { AzureClient, type AzureContainerServices } from \"@fluidframework/azure-client\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport { ContainerSchema, type IFluidContainer } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/internal\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\nimport { AxiosResponse } from \"axios\";\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: AxiosResponse | undefined = 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: AxiosResponse | undefined = 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: AxiosResponse | undefined = 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: AxiosResponse | undefined = 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: AxiosResponse | undefined = 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 { AzureClient, type AzureContainerServices } from \"@fluidframework/azure-client\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport { ContainerSchema, type IFluidContainer } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/internal\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\nimport { AxiosResponse } from \"axios\";\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: AxiosResponse | undefined = 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: AxiosResponse | undefined = 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: AxiosResponse | undefined = 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: AxiosResponse | undefined = 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: AxiosResponse | undefined = 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"]}
@@ -20,7 +20,7 @@ const configProvider = (settings) => ({
20
20
  const testMatrix = getTestMatrix();
21
21
  for (const testOpts of testMatrix) {
22
22
  describe(`Container create scenarios (${testOpts.variant})`, () => {
23
- const connectTimeoutMs = 10000;
23
+ const connectTimeoutMs = 10_000;
24
24
  let client;
25
25
  let schema;
26
26
  const isEphemeral = testOpts.options.isEphemeral;
@@ -199,8 +199,8 @@ for (const testOpts of testMatrix) {
199
199
  * Testing scenarios for creating/loading containers with the legacy (LTS) version of AzureClient.
200
200
  */
201
201
  describe(`Container create with legacy version (${testOpts.variant})`, () => {
202
- const connectTimeoutMs = 10000;
203
- const valueSetTimoutMs = 10000;
202
+ const connectTimeoutMs = 10_000;
203
+ const valueSetTimoutMs = 10_000;
204
204
  const isEphemeral = testOpts.options.isEphemeral;
205
205
  let clientCurrent;
206
206
  let clientLegacy;
@@ -276,7 +276,7 @@ for (const testOpts of testMatrix) {
276
276
  * Testing creating/loading containers between the compatibility modes.
277
277
  */
278
278
  describe(`Container create with current version (${testOpts.variant})`, () => {
279
- const connectTimeoutMs = 10000;
279
+ const connectTimeoutMs = 10_000;
280
280
  const isEphemeral = testOpts.options.isEphemeral;
281
281
  let clientCurrent1;
282
282
  let clientCurrent2;
@@ -1 +1 @@
1
- {"version":3,"file":"containerCreate.spec.js","sourceRoot":"","sources":["../../src/test/containerCreate.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAI/C,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EACN,WAAW,GAEX,MAAM,6CAA6C,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAGrE,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,EACN,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,EAC1B,iCAAiC,GACjC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,qBAAqB,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,cAAc,GAAG,CAAC,QAAqC,EAAuB,EAAE,CAAC,CAAC;IACvF,YAAY,EAAE,CAAC,IAAY,EAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;CAC3D,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;AACnC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;IACnC,QAAQ,CAAC,+BAA+B,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE;QACjE,MAAM,gBAAgB,GAAG,KAAM,CAAC;QAChC,IAAI,MAAmB,CAAC;QACxB,IAAI,MAAuB,CAAC;QAC5B,MAAM,WAAW,GAAY,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;QAE1D,UAAU,CAAC,mBAAmB,EAAE,GAAG,EAAE;YACpC,MAAM,GAAG,iBAAiB,EAAE,CAAC;YAC7B,MAAM,GAAG;gBACR,cAAc,EAAE;oBACf,IAAI,EAAE,SAAS;iBACf;aACD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;;;WAMG;QACH,EAAE,CAAC,+BAA+B,EAAE,KAAK;YACxC,gFAAgF;YAChF,yGAAyG;YACzG,yGAAyG;YACzG,IAAI,WAAW,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,CAAC;YACD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,QAAQ,EACpB,8BAA8B,CAC9B,CAAC;YAEF,2BAA2B;YAC3B,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,OAAO,WAAW,EAAE,QAAQ,EAAE,mCAAmC,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACvC,IAAI,WAAmB,CAAC;YACxB,IAAI,SAA0B,CAAC;YAC/B,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,iBAAiB,GAA8B,MAAM,0BAA0B,CACpF,qBAAqB,CAAC,kBAAkB,EACxC,gBAAgB,EAChB,kBAAkB,CAClB,CAAC;gBACF,WAAW,GAAG,iCAAiC,CAAC,iBAAiB,CAAC,CAAC;gBACnE,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACP,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC5D,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YACxC,CAAC;YAED,IAAI,SAAS,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC7D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBAC/E,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,6BAA6B;iBACvC,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,WAAW,CAAC,OAAO,WAAW,EAAE,QAAQ,EAAE,mCAAmC,CAAC,CAAC;YACtF,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,QAAQ,EACpB,kDAAkD,CAClD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAChD,IAAI,WAAmB,CAAC;YACxB,IAAI,SAA0B,CAAC;YAC/B,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,iBAAiB,GAA8B,MAAM,0BAA0B,CACpF,qBAAqB,CAAC,0BAA0B,EAChD,gBAAgB,EAChB,kBAAkB,CAClB,CAAC;gBACF,WAAW,GAAG,iCAAiC,CAAC,iBAAiB,CAAC,CAAC;gBACnE,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACP,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC5D,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YACxC,CAAC;YAED,IAAI,SAAS,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC7D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBAC/E,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,6BAA6B;iBACvC,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,WAAW,CAAC,OAAO,WAAW,EAAE,QAAQ,EAAE,mCAAmC,CAAC,CAAC;YACtF,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,QAAQ,EACpB,8CAA8C,CAC9C,CAAC;YACF,MAAM,MAAM,CAAC,OAAO,CACnB,SAAS,CAAC,MAAM,EAAE,EAClB,GAAG,EAAE,CAAC,IAAI,EACV,mCAAmC,CACnC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC/E,IAAI,WAAmB,CAAC;YACxB,IAAI,YAA6B,CAAC;YAClC,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,iBAAiB,GAA8B,MAAM,0BAA0B,CACpF,qBAAqB,CAAC,4BAA4B,EAClD,gBAAgB,EAChB,kBAAkB,CAClB,CAAC;gBACF,WAAW,GAAG,iCAAiC,CAAC,iBAAiB,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACP,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC1E,WAAW,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC;gBAE1C,IAAI,YAAY,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;oBAChE,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;wBAClF,UAAU,EAAE,gBAAgB;wBAC5B,QAAQ,EAAE,6BAA6B;qBACvC,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAChE,MAAM,MAAM,CAAC,aAAa,CACzB,SAAS,EACT,GAAG,EAAE,CAAC,IAAI,EACV,sDAAsD,CACtD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;;;WAMG;QACH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;YAChG,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;YACrC,OAAO,CAAC,KAAK,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;YAC/B,MAAM,qBAAqB,GAAG,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAElF,MAAM,OAAO,GAAG,CAAC,KAAY,EAAW,EAAE;gBACzC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,iCAAiC,CAAC,CAAC;gBACnF,8CAA8C;gBAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;oBAC1C,MAAM,CAAC,MAAM,CACZ,WAAW,IAAI,KAAK;wBACnB,KAAK,CAAC,SAAS,KAAK,iCAAiC;wBACrD,YAAY,IAAI,KAAK;wBACrB,KAAK,CAAC,UAAU,KAAK,GAAG,EACzB,qBAAqB,KAAK,CAAC,OAAO,EAAE,CACpC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAChF,CAAC;gBACD,OAAO,IAAI,CAAC;YACb,CAAC,CAAC;YAEF,MAAM,MAAM,CAAC,OAAO,CACnB,qBAAqB,EACrB,OAAO,EACP,gDAAgD,CAChD,CAAC;YACF,kDAAkD;YAClD,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wCAAwC,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE;QAC1E,IAAI,MAAmB,CAAC;QACxB,IAAI,MAAuB,CAAC;QAC5B,IAAI,UAAsB,CAAC;QAC3B,MAAM,WAAW,GAAY,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;QAE1D,UAAU,CAAC,mBAAmB,EAAE,GAAG,EAAE;YACpC,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;YACjF,MAAM,GAAG;gBACR,cAAc,EAAE;oBACf,IAAI,EAAE,SAAS;iBACf;aACD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;WAIG;QACH,EAAE,CAAC,0CAA0C,EAAE,KAAK;YACnD,4FAA4F;YAC5F,6DAA6D;YAC7D,IAAI,WAAW,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,CAAC;YACD,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;YACxF,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,uCAAuC,CAAC,CAAC;YACrE,MAAM,YAAY,GAAG,KAAK,CAAC,YAAsB,CAAC;YAClD,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,QAAQ,CAAC,yCAAyC,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE;QAC3E,MAAM,gBAAgB,GAAG,KAAM,CAAC;QAChC,MAAM,gBAAgB,GAAG,KAAM,CAAC;QAChC,MAAM,WAAW,GAAY,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1D,IAAI,aAA0B,CAAC;QAC/B,IAAI,YAA+B,CAAC;QACpC,MAAM,aAAa,GAAG;YACrB,cAAc,EAAE;gBACf,IAAI,EAAE,SAAS;aACf;SACyB,CAAC;QAE5B,MAAM,YAAY,GAAG;YACpB,cAAc,EAAE;gBACf,IAAI,EAAE,eAAe;aACrB;SACD,CAAC;QAEF,UAAU,CAAC,oBAAoB,EAAE;YAChC,aAAa,GAAG,iBAAiB,EAAE,CAAC;YACpC,YAAY,GAAG,uBAAuB,EAAE,CAAC;YACzC,IAAI,WAAW,EAAE,CAAC;gBACjB,2DAA2D;gBAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,CAAC;QACF,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,KAAK,MAAM,iBAAiB,IAAI,CAAC,GAAG,EAAE,GAAG,CAAU,EAAE,CAAC;YACrD,EAAE,CAAC,+BAA+B,iBAAiB,iDAAiD,EAAE,KAAK,IAAI,EAAE;gBAChH,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GACnC,MAAM,YAAY,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBAClD,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,CAAC;gBAEnD,IAAI,eAAe,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;oBACnE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAC/D;wBACC,UAAU,EAAE,gBAAgB;wBAC5B,QAAQ,EAAE,mCAAmC;qBAC7C,CACD,CAAC;gBACH,CAAC;gBAED,MAAM,SAAS,GAAG,cAAc,CAC/B,CAAC,OAAO,EAAE,EAAE;oBACX,MAAM,eAAe,GAAG,GAAS,EAAE;wBAClC,IACE,eAAe,CAAC,cAAc,CAAC,IAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,OAAO,EAC9E,CAAC;4BACF,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;4BAC9C,OAAO,EAAE,CAAC;wBACX,CAAC;oBACF,CAAC,CAAC;oBACF,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;gBAC9C,CAAC,EACD;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,kBAAkB;iBAC5B,CACD,CAAC;gBACD,eAAe,CAAC,cAAc,CAAC,IAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAE7E,wFAAwF;gBACxF,MAAM,SAAS,CAAC;gBAEhB,IAAI,iBAAiB,KAAK,GAAG,EAAE,CAAC;oBAC/B,sFAAsF;oBACtF,gCAAgC;oBAChC,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC3B,CAAC;gBAED,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAC3C,WAAW,EACX,aAAa,EACb,iBAAiB,CACjB,CAAC;gBACF,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;gBAEnF,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,SAAS,CAAC;gBAExD,IAAI,gBAAgB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;oBACpE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAChE;wBACC,UAAU,EAAE,gBAAgB;wBAC5B,QAAQ,EAAE,oCAAoC;qBAC9C,CACD,CAAC;gBACH,CAAC;gBAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAS,KAAK,CAAC,CAAC;gBACvE,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,qCAAqC,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,QAAQ,CAAC,0CAA0C,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE;QAC5E,MAAM,gBAAgB,GAAG,KAAM,CAAC;QAChC,MAAM,WAAW,GAAY,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1D,IAAI,cAA2B,CAAC;QAChC,IAAI,cAA2B,CAAC;QAChC,IAAI,YAA+B,CAAC;QACpC,IAAI,OAAqB,CAAC;QAE1B,MAAM,aAAa,GAAG;YACrB,cAAc,EAAE;gBACf,IAAI,EAAE,SAAS;aACf;SACyB,CAAC;QAE5B,MAAM,YAAY,GAAG;YACpB,cAAc,EAAE;gBACf,IAAI,EAAE,eAAe;aACrB;SACD,CAAC;QAEF,MAAM,CAAC;YACN,OAAO,GAAG,aAAa,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,oBAAoB,EAAE;YAChC,cAAc,GAAG,iBAAiB,EAAE,CAAC;YACrC,cAAc,GAAG,iBAAiB,EAAE,CAAC;YACrC,YAAY,GAAG,uBAAuB,EAAE,CAAC;YACzC,IAAI,WAAW,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC;YACT,OAAO,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;YAC7F,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,cAAc,CAAC,eAAe,CAC3E,aAAa;YACb,0FAA0F;YAC1F,GAAG,CACH,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAEpD,IAAI,gBAAgB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACpE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAChE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,oCAAoC;iBAC9C,CACD,CAAC;YACH,CAAC;YAED,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAEzD,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YACvE,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;YAEnF,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,SAAS,CAAC;YACvD,IAAI,eAAe,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACnE,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBACrF,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,mCAAmC;iBAC7C,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAI,eAAe,CAAC,cAAc,CAAC,IAAwB,CAAC,GAAG,CAC1E,KAAK,CACL,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,qCAAqC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH;;;;WAIG;QACH,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;YAC1G,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,MAAM,cAAc,CAAC,eAAe,CAC5E,aAAa,EACb,GAAG,CACH,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC;YAErD,IAAI,iBAAiB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACrE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EACjE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,qCAAqC;iBAC/C,CACD,CAAC;YACH,CAAC;YAED,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAE1D,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;YAC/E,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;YAEnF,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,MAAM,SAAS,CAAC;YACzD,IAAI,iBAAiB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACrE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EACjE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,qCAAqC;iBAC/C,CACD,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAS,KAAK,CAAC,CAAC;YACxE,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,qCAAqC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH;;;;WAIG;QACH,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;YAC1G,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,MAAM,cAAc,CAAC,eAAe,CAC5E,aAAa,EACb,GAAG,CACH,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC;YAErD,IAAI,iBAAiB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACrE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EACjE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,qCAAqC;iBAC/C,CACD,CAAC;YACH,CAAC;YAED,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAE1D,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;YAC/E,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;YAEnF,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,MAAM,SAAS,CAAC;YACzD,IAAI,iBAAiB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACrE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EACjE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,qCAAqC;iBAC/C,CACD,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAS,KAAK,CAAC,CAAC;YACxE,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,qCAAqC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,cAAc,CAAC,eAAe,CACrE,aAAa,EACb,GAAG,CACH,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;YAE9C,IAAI,UAAU,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC9D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBAChF,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,6BAA6B;iBACvC,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG;YACtC,0GAA0G;YACzG,UAAkB,CAAC,SAAS,EAC7B,sBAAsB,CACtB,CAAC;YAEF,oDAAoD;YACpD,6IAA6I;YAC5I,UAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE;gBAC7D,MAAM,IAAI,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC;gBAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACjB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACjB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,YAAY,CAAC,YAAY,CACrE,WAAW,EACX,YAAY,CACZ,CAAC;YACF,IAAI,eAAe,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACnE,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBACrF,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,mCAAmC;iBAC7C,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,eAAe,CAAC,cAAc,CAAC,IAAuB,CAAC;YAEzE,iDAAiD;YACjD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAE1C,2BAA2B;YAC3B,KAAK,MAAM,IAAI,IAAI,mBAAmB,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAqC,CAAC;gBAC3D,IACC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,SAAS;oBACrC,OAAO,CAAC,QAA6B,CAAC,IAAI,KAAK,cAAc,EAC7D,CAAC;oBACF,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;gBAC9C,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,iBAAiB,IAAI,CAAC,GAAG,EAAE,GAAG,CAAU,EAAE,CAAC;YACrD,EAAE,CAAC,qDAAqD,iBAAiB,GAAG,EAAE,KAAK,IAAI,EAAE;gBACxF,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,cAAc,CAAC,eAAe,CACrE,aAAa,EACb,iBAAiB,CACjB,CAAC;gBACF,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;gBAE9C,IAAI,UAAU,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;oBAC9D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;wBAChF,UAAU,EAAE,gBAAgB;wBAC5B,QAAQ,EAAE,6BAA6B;qBACvC,CAAC,CAAC;gBACJ,CAAC;gBAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG;gBACtC,0GAA0G;gBACzG,UAAkB,CAAC,SAAS,EAC7B,sBAAsB,CACtB,CAAC;gBAEF,oDAAoD;gBACpD,6IAA6I;gBAC5I,UAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE;oBAC7D,MAAM,IAAI,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC;oBAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACjB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACjB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC;gBAEH,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,cAAc,CAAC,YAAY,CAClE,WAAW,EACX,aAAa,EACb,iBAAiB,CACjB,CAAC;gBACF,MAAM,IAAI,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC;gBAE5C,kCAAkC;gBAClC,MAAM,CAAC,WAAW,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChD,MAAM,CAAC,WAAW,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChD,MAAM,CAAC,WAAW,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAEhD,2BAA2B;gBAC3B,IAAI,iBAAiB,GAAG,CAAC,CAAC;gBAC1B,KAAK,MAAM,IAAI,IAAI,mBAAmB,CAAC,QAAQ,EAAE,EAAE,CAAC;oBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAqC,CAAC;oBAC3D,IACC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,SAAS;wBACtC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;wBACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAwB,CAAC,IAAI,KAAK,cAAc,EAC3E,CAAC;wBACF,iBAAiB,EAAE,CAAC;oBACrB,CAAC;gBACF,CAAC;gBAED,IAAI,iBAAiB,KAAK,GAAG,EAAE,CAAC;oBAC/B,MAAM,CAAC,WAAW,CACjB,iBAAiB,EACjB,CAAC,EACD,8CAA8C,CAC9C,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,MAAM,CAAC,WAAW,CACjB,iBAAiB,EACjB,CAAC,EACD,2CAA2C,CAC3C,CAAC;gBACH,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { AzureClient } from \"@fluidframework/azure-client\";\nimport { AzureClient as AzureClientLegacy } from \"@fluidframework/azure-client-legacy\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport { ConfigTypes, IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ContainerSchema, type IFluidContainer } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/internal\";\nimport { SharedMap as SharedMapLegacy } from \"@fluidframework/map-legacy\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils/internal\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\nimport { AxiosResponse } from \"axios\";\nimport type { SinonSandbox } from \"sinon\";\nimport { createSandbox } from \"sinon\";\n\nimport {\n\tcreateAzureClient,\n\tcreateAzureClientLegacy,\n\tcreateContainerFromPayload,\n\tgetContainerIdFromPayloadResponse,\n} from \"./AzureClientFactory.js\";\nimport * as ephemeralSummaryTrees from \"./ephemeralSummaryTrees.js\";\nimport { getTestMatrix, mapWait } from \"./utils.js\";\n\nconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n});\n\nconst testMatrix = getTestMatrix();\nfor (const testOpts of testMatrix) {\n\tdescribe(`Container create scenarios (${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();\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: test when an Azure Client container is created,\n\t\t * it is initially detached.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"Created container is detached\", async function () {\n\t\t\t// We currently don't have API surface to create a detached ephemeral container.\n\t\t\t// Instead, ephemeral containers are created indirectly using the test util createContainerFromPayload().\n\t\t\t// Once we add ephemeral container API surface to AzureClient, we can enable this test for ephemeral too.\n\t\t\tif (isEphemeral) {\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t\tconst { container } = await client.createContainer(schema, \"2\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Detached,\n\t\t\t\t\"Container should be detached\",\n\t\t\t);\n\n\t\t\t// Make sure we can attach.\n\t\t\tconst containerId = await container.attach();\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Test attaching a container.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"can attach a container\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.canAttachContainer,\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\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\t\t});\n\n\t\t/**\n\t\t * Scenario: Test if attaching a container twice fails.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"cannot attach a container twice\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.cannotAttachContainerTwice,\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\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 attached after attach is called\",\n\t\t\t);\n\t\t\tawait assert.rejects(\n\t\t\t\tcontainer.attach(),\n\t\t\t\t() => true,\n\t\t\t\t\"Container should not attach twice\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if Azure Client can get an existing container.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"can retrieve existing Azure Fluid Relay container successfully\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet newContainer: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.retrieveExistingAFRContainer,\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} else {\n\t\t\t\t({ container: newContainer } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await newContainer.attach();\n\n\t\t\t\tif (newContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise((resolve) => newContainer.once(\"connected\", () => resolve()), {\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\tconst resources = client.getContainer(containerId, schema, \"2\");\n\t\t\tawait assert.doesNotReject(\n\t\t\t\tresources,\n\t\t\t\t() => true,\n\t\t\t\t\"container cannot be retrieved from Azure Fluid Relay\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if Azure Client can get a non-exiting container.\n\t\t *\n\t\t * Expected behavior: an error should be thrown when trying to get a non-existent container.\n\t\t *\n\t\t * Note: This test is currently skipped because it is failing when ran against tinylicious (azure-local-service).\n\t\t */\n\t\tit(\"cannot load improperly created container (cannot load a non-existent container)\", async () => {\n\t\t\tconst consoleErrorFn = console.error;\n\t\t\tconsole.error = (): void => {};\n\t\t\tconst containerAndServicesP = client.getContainer(\"containerConfig\", schema, \"2\");\n\n\t\t\tconst errorFn = (error: Error): boolean => {\n\t\t\t\tassert.notStrictEqual(error.message, undefined, \"Azure Client error is undefined\");\n\t\t\t\t// AFR gives R11s fetch error, T9s gives 0x8e4\n\t\t\t\tif (process.env.FLUID_CLIENT === \"azure\") {\n\t\t\t\t\tassert.strict(\n\t\t\t\t\t\t\"errorType\" in error &&\n\t\t\t\t\t\t\terror.errorType === \"fileNotFoundOrAccessDeniedError\" &&\n\t\t\t\t\t\t\t\"statusCode\" in error &&\n\t\t\t\t\t\t\terror.statusCode === 404,\n\t\t\t\t\t\t`Unexpected error: ${error.message}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tassert.strict(error.message === \"0x8e4\", `Unexpected error: ${error.message}`);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\tawait assert.rejects(\n\t\t\t\tcontainerAndServicesP,\n\t\t\t\terrorFn,\n\t\t\t\t\"Azure Client can load a non-existent container\",\n\t\t\t);\n\t\t\t// eslint-disable-next-line require-atomic-updates\n\t\t\tconsole.error = consoleErrorFn;\n\t\t});\n\t});\n\n\tdescribe(`Container create with feature flags (${testOpts.variant})`, () => {\n\t\tlet client: AzureClient;\n\t\tlet schema: ContainerSchema;\n\t\tlet mockLogger: MockLogger;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\n\t\tbeforeEach(\"createAzureClient\", () => {\n\t\t\tmockLogger = new MockLogger();\n\t\t\tclient = createAzureClient(undefined, undefined, mockLogger, configProvider({}));\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: Test if AzureClient can create a container with feature gates.\n\t\t *\n\t\t * Expected behavior: An error should not be thrown and the logger should have logged the enabled feature gates.\n\t\t */\n\t\tit(\"can create containers with feature gates\", async function () {\n\t\t\t// Ephemeral containers are currently not created with the AzureClient, and therefore do not\n\t\t\t// have an attached mockLogger which is needed for this test.\n\t\t\tif (isEphemeral) {\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t\tawait client.createContainer(schema, \"2\");\n\t\t\tconst event = mockLogger.events.find((e) => e.eventName.endsWith(\"ContainerLoadStats\"));\n\t\t\tassert(event !== undefined, \"ContainerLoadStats event should exist\");\n\t\t\tconst featureGates = event.featureGates as string;\n\t\t\tassert(featureGates.length > 0);\n\t\t});\n\t});\n\n\t/**\n\t * Testing scenarios for creating/loading containers with the legacy (LTS) version of AzureClient.\n\t */\n\tdescribe(`Container create with legacy version (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tconst valueSetTimoutMs = 10_000;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\t\tlet clientCurrent: AzureClient;\n\t\tlet clientLegacy: AzureClientLegacy;\n\t\tconst schemaCurrent = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t} satisfies ContainerSchema;\n\n\t\tconst schemaLegacy = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMapLegacy,\n\t\t\t},\n\t\t};\n\n\t\tbeforeEach(\"createAzureClients\", function () {\n\t\t\tclientCurrent = createAzureClient();\n\t\t\tclientLegacy = createAzureClientLegacy();\n\t\t\tif (isEphemeral) {\n\t\t\t\t// TODO: Should we skip ephemeral tests for legacy clients?\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a current AzureClient can get a container made by a legacy AzureClient.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tfor (const compatibilityMode of [\"1\", \"2\"] as const) {\n\t\t\tit(`Current AzureClient (mode: \"${compatibilityMode}\") can get container made by legacy AzureClient`, async () => {\n\t\t\t\tconst { container: containerLegacy } =\n\t\t\t\t\tawait clientLegacy.createContainer(schemaLegacy);\n\t\t\t\tconst containerId = await containerLegacy.attach();\n\n\t\t\t\tif (containerLegacy.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t\t(resolve) => containerLegacy.once(\"connected\", () => resolve()),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\t\terrorMsg: \"containerLegacy connect() timeout\",\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst valueSetP = timeoutPromise(\n\t\t\t\t\t(resolve) => {\n\t\t\t\t\t\tconst confirmValueSet = (): void => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t(containerLegacy.initialObjects.map1 as SharedMapLegacy).get(\"key\") === \"value\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tcontainerLegacy.off(\"saved\", confirmValueSet);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcontainerLegacy.on(\"saved\", confirmValueSet);\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: valueSetTimoutMs,\n\t\t\t\t\t\terrorMsg: \"valueSet timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\t(containerLegacy.initialObjects.map1 as SharedMapLegacy).set(\"key\", \"value\");\n\n\t\t\t\t// Await the value being saved, especially important if we dispose the legacy container.\n\t\t\t\tawait valueSetP;\n\n\t\t\t\tif (compatibilityMode === \"2\") {\n\t\t\t\t\t// We don't support interop between legacy containers and \"2\" mode, dispose the legacy\n\t\t\t\t\t// container to avoid this case.\n\t\t\t\t\tcontainerLegacy.dispose();\n\t\t\t\t}\n\n\t\t\t\tconst resources = clientCurrent.getContainer(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschemaCurrent,\n\t\t\t\t\tcompatibilityMode,\n\t\t\t\t);\n\t\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\t\tconst { container: containerCurrent } = await resources;\n\n\t\t\t\tif (containerCurrent.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t\t(resolve) => containerCurrent.once(\"connected\", () => resolve()),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\t\terrorMsg: \"containerCurrent connect() timeout\",\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst result = containerCurrent.initialObjects.map1.get<string>(\"key\");\n\t\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t\t});\n\t\t}\n\t});\n\n\t/**\n\t * Testing creating/loading containers between the compatibility modes.\n\t */\n\tdescribe(`Container create with current version (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\t\tlet clientCurrent1: AzureClient;\n\t\tlet clientCurrent2: AzureClient;\n\t\tlet clientLegacy: AzureClientLegacy;\n\t\tlet sandbox: SinonSandbox;\n\n\t\tconst schemaCurrent = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t} satisfies ContainerSchema;\n\n\t\tconst schemaLegacy = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMapLegacy,\n\t\t\t},\n\t\t};\n\n\t\tbefore(function () {\n\t\t\tsandbox = createSandbox();\n\t\t});\n\n\t\tbeforeEach(\"createAzureClients\", function () {\n\t\t\tclientCurrent1 = createAzureClient();\n\t\t\tclientCurrent2 = createAzureClient();\n\t\t\tclientLegacy = createAzureClientLegacy();\n\t\t\tif (isEphemeral) {\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t});\n\n\t\tafterEach(function () {\n\t\t\tsandbox.restore();\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a legacy AzureClient can get a container made by the current AzureClient.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(`Legacy AzureClient can get container made by current AzureClient (mode: \"1\")`, async () => {\n\t\t\tconst { container: containerCurrent } = await clientCurrent1.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t// Note: Only containers created in compatibility mode \"1\" may be loaded by legacy client.\n\t\t\t\t\"1\",\n\t\t\t);\n\t\t\tconst containerId = await containerCurrent.attach();\n\n\t\t\tif (containerCurrent.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontainerCurrent.initialObjects.map1.set(\"key\", \"value\");\n\n\t\t\tconst resources = clientLegacy.getContainer(containerId, schemaLegacy);\n\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\tconst { container: containerLegacy } = await resources;\n\t\t\tif (containerLegacy.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => containerLegacy.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"containerLegacy connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result = (containerLegacy.initialObjects.map1 as SharedMapLegacy).get<string>(\n\t\t\t\t\"key\",\n\t\t\t);\n\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a current AzureClient in compatibility mode \"2\" can get a container made by the current AzureClient in mode \"1\".\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise be returned.\n\t\t */\n\t\tit(`Current AzureClient (mode: \"2\") can get container made by current AzureClient (mode: \"1\")`, async () => {\n\t\t\tconst { container: containerCurrent1 } = await clientCurrent1.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t\"1\",\n\t\t\t);\n\t\t\tconst containerId = await containerCurrent1.attach();\n\n\t\t\tif (containerCurrent1.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent1.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent1 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontainerCurrent1.initialObjects.map1.set(\"key\", \"value\");\n\n\t\t\tconst resources = clientCurrent2.getContainer(containerId, schemaCurrent, \"2\");\n\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\tconst { container: containerCurrent2 } = await resources;\n\t\t\tif (containerCurrent2.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent2.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent2 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = containerCurrent2.initialObjects.map1.get<string>(\"key\");\n\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a current AzureClient in compatibility mode \"1\" can get a container made by the current AzureClient in mode \"2\".\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise be returned.\n\t\t */\n\t\tit(`Current AzureClient (mode: \"1\") can get container made by current AzureClient (mode: \"2\")`, async () => {\n\t\t\tconst { container: containerCurrent2 } = await clientCurrent2.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t\"2\",\n\t\t\t);\n\t\t\tconst containerId = await containerCurrent2.attach();\n\n\t\t\tif (containerCurrent2.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent2.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent2 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontainerCurrent2.initialObjects.map1.set(\"key\", \"value\");\n\n\t\t\tconst resources = clientCurrent1.getContainer(containerId, schemaCurrent, \"1\");\n\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\tconst { container: containerCurrent1 } = await resources;\n\t\t\tif (containerCurrent1.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent1.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent1 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = containerCurrent1.initialObjects.map1.get<string>(\"key\");\n\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t});\n\n\t\tit(\"op grouping disabled as expected for 1.x clients\", async () => {\n\t\t\tconst { container: container1 } = await clientCurrent1.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t\"1\",\n\t\t\t);\n\t\t\tconst containerId = await container1.attach();\n\n\t\t\tif (container1.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container1.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 containerProcessSpy = sandbox.spy(\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t(container1 as any).container,\n\t\t\t\t\"processRemoteMessage\",\n\t\t\t);\n\n\t\t\t// Explicitly force ops sent to be in the same batch\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\t\t(container1 as any).container._runtime.orderSequentially(() => {\n\t\t\t\tconst map1 = container1.initialObjects.map1;\n\t\t\t\tmap1.set(\"1\", 1);\n\t\t\t\tmap1.set(\"2\", 2);\n\t\t\t\tmap1.set(\"3\", 3);\n\t\t\t});\n\n\t\t\tconst { container: containerLegacy } = await clientLegacy.getContainer(\n\t\t\t\tcontainerId,\n\t\t\t\tschemaLegacy,\n\t\t\t);\n\t\t\tif (containerLegacy.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => containerLegacy.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"containerLegacy connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst legacyMap = containerLegacy.initialObjects.map1 as SharedMapLegacy;\n\n\t\t\t// Verify ops are processed by legacy AzureClient\n\t\t\tassert.strictEqual(legacyMap.get(\"1\"), 1);\n\t\t\tassert.strictEqual(legacyMap.get(\"2\"), 2);\n\t\t\tassert.strictEqual(legacyMap.get(\"3\"), 3);\n\n\t\t\t// Inspect the incoming ops\n\t\t\tfor (const call of containerProcessSpy.getCalls()) {\n\t\t\t\tconst message = call.firstArg as ISequencedDocumentMessage;\n\t\t\t\tif (\n\t\t\t\t\tmessage.type === MessageType.Operation &&\n\t\t\t\t\t(message.contents as { type: string }).type === \"groupedBatch\"\n\t\t\t\t) {\n\t\t\t\t\tassert.fail(\"unexpected groupedBatch found\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tfor (const compatibilityMode of [\"1\", \"2\"] as const) {\n\t\t\tit(`op grouping works as expected (compatibilityMode: ${compatibilityMode})`, async () => {\n\t\t\t\tconst { container: container1 } = await clientCurrent1.createContainer(\n\t\t\t\t\tschemaCurrent,\n\t\t\t\t\tcompatibilityMode,\n\t\t\t\t);\n\t\t\t\tconst containerId = await container1.attach();\n\n\t\t\t\tif (container1.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise((resolve) => container1.once(\"connected\", () => resolve()), {\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\n\t\t\t\tconst containerProcessSpy = sandbox.spy(\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t(container1 as any).container,\n\t\t\t\t\t\"processRemoteMessage\",\n\t\t\t\t);\n\n\t\t\t\t// Explicitly force ops sent to be in the same batch\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\t\t\t(container1 as any).container._runtime.orderSequentially(() => {\n\t\t\t\t\tconst map1 = container1.initialObjects.map1;\n\t\t\t\t\tmap1.set(\"1\", 1);\n\t\t\t\t\tmap1.set(\"2\", 2);\n\t\t\t\t\tmap1.set(\"3\", 3);\n\t\t\t\t});\n\n\t\t\t\tconst { container: container2 } = await clientCurrent1.getContainer(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschemaCurrent,\n\t\t\t\t\tcompatibilityMode,\n\t\t\t\t);\n\t\t\t\tconst map2 = container2.initialObjects.map1;\n\n\t\t\t\t// Process ops coming from service\n\t\t\t\tassert.strictEqual(await mapWait(map2, \"1\"), 1);\n\t\t\t\tassert.strictEqual(await mapWait(map2, \"2\"), 2);\n\t\t\t\tassert.strictEqual(await mapWait(map2, \"3\"), 3);\n\n\t\t\t\t// Inspect the incoming ops\n\t\t\t\tlet groupedBatchCount = 0;\n\t\t\t\tfor (const call of containerProcessSpy.getCalls()) {\n\t\t\t\t\tconst message = call.firstArg as ISequencedDocumentMessage;\n\t\t\t\t\tif (\n\t\t\t\t\t\tmessage.type === MessageType.Operation &&\n\t\t\t\t\t\ttypeof message.contents === \"string\" &&\n\t\t\t\t\t\t(JSON.parse(message.contents) as { type?: unknown }).type === \"groupedBatch\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tgroupedBatchCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (compatibilityMode === \"1\") {\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tgroupedBatchCount,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"expect no op grouping in compatibilityMode 1\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tgroupedBatchCount,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"expect op grouping in compatibilityMode 2\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"file":"containerCreate.spec.js","sourceRoot":"","sources":["../../src/test/containerCreate.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 { AzureClient } from \"@fluidframework/azure-client\";\nimport { AzureClient as AzureClientLegacy } from \"@fluidframework/azure-client-legacy\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport { ConfigTypes, IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ContainerSchema, type IFluidContainer } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/internal\";\nimport { SharedMap as SharedMapLegacy } from \"@fluidframework/map-legacy\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils/internal\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\nimport { AxiosResponse } from \"axios\";\nimport type { SinonSandbox } from \"sinon\";\nimport { createSandbox } from \"sinon\";\n\nimport {\n\tcreateAzureClient,\n\tcreateAzureClientLegacy,\n\tcreateContainerFromPayload,\n\tgetContainerIdFromPayloadResponse,\n} from \"./AzureClientFactory.js\";\nimport * as ephemeralSummaryTrees from \"./ephemeralSummaryTrees.js\";\nimport { getTestMatrix, mapWait } from \"./utils.js\";\n\nconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n});\n\nconst testMatrix = getTestMatrix();\nfor (const testOpts of testMatrix) {\n\tdescribe(`Container create scenarios (${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();\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: test when an Azure Client container is created,\n\t\t * it is initially detached.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"Created container is detached\", async function () {\n\t\t\t// We currently don't have API surface to create a detached ephemeral container.\n\t\t\t// Instead, ephemeral containers are created indirectly using the test util createContainerFromPayload().\n\t\t\t// Once we add ephemeral container API surface to AzureClient, we can enable this test for ephemeral too.\n\t\t\tif (isEphemeral) {\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t\tconst { container } = await client.createContainer(schema, \"2\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Detached,\n\t\t\t\t\"Container should be detached\",\n\t\t\t);\n\n\t\t\t// Make sure we can attach.\n\t\t\tconst containerId = await container.attach();\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Test attaching a container.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"can attach a container\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.canAttachContainer,\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\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\t\t});\n\n\t\t/**\n\t\t * Scenario: Test if attaching a container twice fails.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"cannot attach a container twice\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.cannotAttachContainerTwice,\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\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 attached after attach is called\",\n\t\t\t);\n\t\t\tawait assert.rejects(\n\t\t\t\tcontainer.attach(),\n\t\t\t\t() => true,\n\t\t\t\t\"Container should not attach twice\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if Azure Client can get an existing container.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"can retrieve existing Azure Fluid Relay container successfully\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet newContainer: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.retrieveExistingAFRContainer,\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} else {\n\t\t\t\t({ container: newContainer } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await newContainer.attach();\n\n\t\t\t\tif (newContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise((resolve) => newContainer.once(\"connected\", () => resolve()), {\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\tconst resources = client.getContainer(containerId, schema, \"2\");\n\t\t\tawait assert.doesNotReject(\n\t\t\t\tresources,\n\t\t\t\t() => true,\n\t\t\t\t\"container cannot be retrieved from Azure Fluid Relay\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if Azure Client can get a non-exiting container.\n\t\t *\n\t\t * Expected behavior: an error should be thrown when trying to get a non-existent container.\n\t\t *\n\t\t * Note: This test is currently skipped because it is failing when ran against tinylicious (azure-local-service).\n\t\t */\n\t\tit(\"cannot load improperly created container (cannot load a non-existent container)\", async () => {\n\t\t\tconst consoleErrorFn = console.error;\n\t\t\tconsole.error = (): void => {};\n\t\t\tconst containerAndServicesP = client.getContainer(\"containerConfig\", schema, \"2\");\n\n\t\t\tconst errorFn = (error: Error): boolean => {\n\t\t\t\tassert.notStrictEqual(error.message, undefined, \"Azure Client error is undefined\");\n\t\t\t\t// AFR gives R11s fetch error, T9s gives 0x8e4\n\t\t\t\tif (process.env.FLUID_CLIENT === \"azure\") {\n\t\t\t\t\tassert.strict(\n\t\t\t\t\t\t\"errorType\" in error &&\n\t\t\t\t\t\t\terror.errorType === \"fileNotFoundOrAccessDeniedError\" &&\n\t\t\t\t\t\t\t\"statusCode\" in error &&\n\t\t\t\t\t\t\terror.statusCode === 404,\n\t\t\t\t\t\t`Unexpected error: ${error.message}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tassert.strict(error.message === \"0x8e4\", `Unexpected error: ${error.message}`);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\tawait assert.rejects(\n\t\t\t\tcontainerAndServicesP,\n\t\t\t\terrorFn,\n\t\t\t\t\"Azure Client can load a non-existent container\",\n\t\t\t);\n\t\t\t// eslint-disable-next-line require-atomic-updates\n\t\t\tconsole.error = consoleErrorFn;\n\t\t});\n\t});\n\n\tdescribe(`Container create with feature flags (${testOpts.variant})`, () => {\n\t\tlet client: AzureClient;\n\t\tlet schema: ContainerSchema;\n\t\tlet mockLogger: MockLogger;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\n\t\tbeforeEach(\"createAzureClient\", () => {\n\t\t\tmockLogger = new MockLogger();\n\t\t\tclient = createAzureClient(undefined, undefined, mockLogger, configProvider({}));\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: Test if AzureClient can create a container with feature gates.\n\t\t *\n\t\t * Expected behavior: An error should not be thrown and the logger should have logged the enabled feature gates.\n\t\t */\n\t\tit(\"can create containers with feature gates\", async function () {\n\t\t\t// Ephemeral containers are currently not created with the AzureClient, and therefore do not\n\t\t\t// have an attached mockLogger which is needed for this test.\n\t\t\tif (isEphemeral) {\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t\tawait client.createContainer(schema, \"2\");\n\t\t\tconst event = mockLogger.events.find((e) => e.eventName.endsWith(\"ContainerLoadStats\"));\n\t\t\tassert(event !== undefined, \"ContainerLoadStats event should exist\");\n\t\t\tconst featureGates = event.featureGates as string;\n\t\t\tassert(featureGates.length > 0);\n\t\t});\n\t});\n\n\t/**\n\t * Testing scenarios for creating/loading containers with the legacy (LTS) version of AzureClient.\n\t */\n\tdescribe(`Container create with legacy version (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tconst valueSetTimoutMs = 10_000;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\t\tlet clientCurrent: AzureClient;\n\t\tlet clientLegacy: AzureClientLegacy;\n\t\tconst schemaCurrent = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t} satisfies ContainerSchema;\n\n\t\tconst schemaLegacy = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMapLegacy,\n\t\t\t},\n\t\t};\n\n\t\tbeforeEach(\"createAzureClients\", function () {\n\t\t\tclientCurrent = createAzureClient();\n\t\t\tclientLegacy = createAzureClientLegacy();\n\t\t\tif (isEphemeral) {\n\t\t\t\t// TODO: Should we skip ephemeral tests for legacy clients?\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a current AzureClient can get a container made by a legacy AzureClient.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tfor (const compatibilityMode of [\"1\", \"2\"] as const) {\n\t\t\tit(`Current AzureClient (mode: \"${compatibilityMode}\") can get container made by legacy AzureClient`, async () => {\n\t\t\t\tconst { container: containerLegacy } =\n\t\t\t\t\tawait clientLegacy.createContainer(schemaLegacy);\n\t\t\t\tconst containerId = await containerLegacy.attach();\n\n\t\t\t\tif (containerLegacy.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t\t(resolve) => containerLegacy.once(\"connected\", () => resolve()),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\t\terrorMsg: \"containerLegacy connect() timeout\",\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst valueSetP = timeoutPromise(\n\t\t\t\t\t(resolve) => {\n\t\t\t\t\t\tconst confirmValueSet = (): void => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t(containerLegacy.initialObjects.map1 as SharedMapLegacy).get(\"key\") === \"value\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tcontainerLegacy.off(\"saved\", confirmValueSet);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcontainerLegacy.on(\"saved\", confirmValueSet);\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: valueSetTimoutMs,\n\t\t\t\t\t\terrorMsg: \"valueSet timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\t(containerLegacy.initialObjects.map1 as SharedMapLegacy).set(\"key\", \"value\");\n\n\t\t\t\t// Await the value being saved, especially important if we dispose the legacy container.\n\t\t\t\tawait valueSetP;\n\n\t\t\t\tif (compatibilityMode === \"2\") {\n\t\t\t\t\t// We don't support interop between legacy containers and \"2\" mode, dispose the legacy\n\t\t\t\t\t// container to avoid this case.\n\t\t\t\t\tcontainerLegacy.dispose();\n\t\t\t\t}\n\n\t\t\t\tconst resources = clientCurrent.getContainer(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschemaCurrent,\n\t\t\t\t\tcompatibilityMode,\n\t\t\t\t);\n\t\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\t\tconst { container: containerCurrent } = await resources;\n\n\t\t\t\tif (containerCurrent.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t\t(resolve) => containerCurrent.once(\"connected\", () => resolve()),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\t\terrorMsg: \"containerCurrent connect() timeout\",\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst result = containerCurrent.initialObjects.map1.get<string>(\"key\");\n\t\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t\t});\n\t\t}\n\t});\n\n\t/**\n\t * Testing creating/loading containers between the compatibility modes.\n\t */\n\tdescribe(`Container create with current version (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\t\tlet clientCurrent1: AzureClient;\n\t\tlet clientCurrent2: AzureClient;\n\t\tlet clientLegacy: AzureClientLegacy;\n\t\tlet sandbox: SinonSandbox;\n\n\t\tconst schemaCurrent = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t} satisfies ContainerSchema;\n\n\t\tconst schemaLegacy = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMapLegacy,\n\t\t\t},\n\t\t};\n\n\t\tbefore(function () {\n\t\t\tsandbox = createSandbox();\n\t\t});\n\n\t\tbeforeEach(\"createAzureClients\", function () {\n\t\t\tclientCurrent1 = createAzureClient();\n\t\t\tclientCurrent2 = createAzureClient();\n\t\t\tclientLegacy = createAzureClientLegacy();\n\t\t\tif (isEphemeral) {\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t});\n\n\t\tafterEach(function () {\n\t\t\tsandbox.restore();\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a legacy AzureClient can get a container made by the current AzureClient.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(`Legacy AzureClient can get container made by current AzureClient (mode: \"1\")`, async () => {\n\t\t\tconst { container: containerCurrent } = await clientCurrent1.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t// Note: Only containers created in compatibility mode \"1\" may be loaded by legacy client.\n\t\t\t\t\"1\",\n\t\t\t);\n\t\t\tconst containerId = await containerCurrent.attach();\n\n\t\t\tif (containerCurrent.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontainerCurrent.initialObjects.map1.set(\"key\", \"value\");\n\n\t\t\tconst resources = clientLegacy.getContainer(containerId, schemaLegacy);\n\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\tconst { container: containerLegacy } = await resources;\n\t\t\tif (containerLegacy.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => containerLegacy.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"containerLegacy connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result = (containerLegacy.initialObjects.map1 as SharedMapLegacy).get<string>(\n\t\t\t\t\"key\",\n\t\t\t);\n\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a current AzureClient in compatibility mode \"2\" can get a container made by the current AzureClient in mode \"1\".\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise be returned.\n\t\t */\n\t\tit(`Current AzureClient (mode: \"2\") can get container made by current AzureClient (mode: \"1\")`, async () => {\n\t\t\tconst { container: containerCurrent1 } = await clientCurrent1.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t\"1\",\n\t\t\t);\n\t\t\tconst containerId = await containerCurrent1.attach();\n\n\t\t\tif (containerCurrent1.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent1.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent1 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontainerCurrent1.initialObjects.map1.set(\"key\", \"value\");\n\n\t\t\tconst resources = clientCurrent2.getContainer(containerId, schemaCurrent, \"2\");\n\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\tconst { container: containerCurrent2 } = await resources;\n\t\t\tif (containerCurrent2.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent2.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent2 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = containerCurrent2.initialObjects.map1.get<string>(\"key\");\n\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a current AzureClient in compatibility mode \"1\" can get a container made by the current AzureClient in mode \"2\".\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise be returned.\n\t\t */\n\t\tit(`Current AzureClient (mode: \"1\") can get container made by current AzureClient (mode: \"2\")`, async () => {\n\t\t\tconst { container: containerCurrent2 } = await clientCurrent2.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t\"2\",\n\t\t\t);\n\t\t\tconst containerId = await containerCurrent2.attach();\n\n\t\t\tif (containerCurrent2.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent2.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent2 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontainerCurrent2.initialObjects.map1.set(\"key\", \"value\");\n\n\t\t\tconst resources = clientCurrent1.getContainer(containerId, schemaCurrent, \"1\");\n\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\tconst { container: containerCurrent1 } = await resources;\n\t\t\tif (containerCurrent1.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent1.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent1 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = containerCurrent1.initialObjects.map1.get<string>(\"key\");\n\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t});\n\n\t\tit(\"op grouping disabled as expected for 1.x clients\", async () => {\n\t\t\tconst { container: container1 } = await clientCurrent1.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t\"1\",\n\t\t\t);\n\t\t\tconst containerId = await container1.attach();\n\n\t\t\tif (container1.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container1.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 containerProcessSpy = sandbox.spy(\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t(container1 as any).container,\n\t\t\t\t\"processRemoteMessage\",\n\t\t\t);\n\n\t\t\t// Explicitly force ops sent to be in the same batch\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\t\t(container1 as any).container._runtime.orderSequentially(() => {\n\t\t\t\tconst map1 = container1.initialObjects.map1;\n\t\t\t\tmap1.set(\"1\", 1);\n\t\t\t\tmap1.set(\"2\", 2);\n\t\t\t\tmap1.set(\"3\", 3);\n\t\t\t});\n\n\t\t\tconst { container: containerLegacy } = await clientLegacy.getContainer(\n\t\t\t\tcontainerId,\n\t\t\t\tschemaLegacy,\n\t\t\t);\n\t\t\tif (containerLegacy.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => containerLegacy.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"containerLegacy connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst legacyMap = containerLegacy.initialObjects.map1 as SharedMapLegacy;\n\n\t\t\t// Verify ops are processed by legacy AzureClient\n\t\t\tassert.strictEqual(legacyMap.get(\"1\"), 1);\n\t\t\tassert.strictEqual(legacyMap.get(\"2\"), 2);\n\t\t\tassert.strictEqual(legacyMap.get(\"3\"), 3);\n\n\t\t\t// Inspect the incoming ops\n\t\t\tfor (const call of containerProcessSpy.getCalls()) {\n\t\t\t\tconst message = call.firstArg as ISequencedDocumentMessage;\n\t\t\t\tif (\n\t\t\t\t\tmessage.type === MessageType.Operation &&\n\t\t\t\t\t(message.contents as { type: string }).type === \"groupedBatch\"\n\t\t\t\t) {\n\t\t\t\t\tassert.fail(\"unexpected groupedBatch found\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tfor (const compatibilityMode of [\"1\", \"2\"] as const) {\n\t\t\tit(`op grouping works as expected (compatibilityMode: ${compatibilityMode})`, async () => {\n\t\t\t\tconst { container: container1 } = await clientCurrent1.createContainer(\n\t\t\t\t\tschemaCurrent,\n\t\t\t\t\tcompatibilityMode,\n\t\t\t\t);\n\t\t\t\tconst containerId = await container1.attach();\n\n\t\t\t\tif (container1.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise((resolve) => container1.once(\"connected\", () => resolve()), {\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\n\t\t\t\tconst containerProcessSpy = sandbox.spy(\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t(container1 as any).container,\n\t\t\t\t\t\"processRemoteMessage\",\n\t\t\t\t);\n\n\t\t\t\t// Explicitly force ops sent to be in the same batch\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\t\t\t(container1 as any).container._runtime.orderSequentially(() => {\n\t\t\t\t\tconst map1 = container1.initialObjects.map1;\n\t\t\t\t\tmap1.set(\"1\", 1);\n\t\t\t\t\tmap1.set(\"2\", 2);\n\t\t\t\t\tmap1.set(\"3\", 3);\n\t\t\t\t});\n\n\t\t\t\tconst { container: container2 } = await clientCurrent1.getContainer(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschemaCurrent,\n\t\t\t\t\tcompatibilityMode,\n\t\t\t\t);\n\t\t\t\tconst map2 = container2.initialObjects.map1;\n\n\t\t\t\t// Process ops coming from service\n\t\t\t\tassert.strictEqual(await mapWait(map2, \"1\"), 1);\n\t\t\t\tassert.strictEqual(await mapWait(map2, \"2\"), 2);\n\t\t\t\tassert.strictEqual(await mapWait(map2, \"3\"), 3);\n\n\t\t\t\t// Inspect the incoming ops\n\t\t\t\tlet groupedBatchCount = 0;\n\t\t\t\tfor (const call of containerProcessSpy.getCalls()) {\n\t\t\t\t\tconst message = call.firstArg as ISequencedDocumentMessage;\n\t\t\t\t\tif (\n\t\t\t\t\t\tmessage.type === MessageType.Operation &&\n\t\t\t\t\t\ttypeof message.contents === \"string\" &&\n\t\t\t\t\t\t(JSON.parse(message.contents) as { type?: unknown }).type === \"groupedBatch\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tgroupedBatchCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (compatibilityMode === \"1\") {\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tgroupedBatchCount,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"expect no op grouping in compatibilityMode 1\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tgroupedBatchCount,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"expect op grouping in compatibilityMode 2\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n}\n"]}
@@ -13,7 +13,7 @@ import { getTestMatrix, mapWait } from "./utils.js";
13
13
  const testMatrix = getTestMatrix();
14
14
  for (const testOpts of testMatrix) {
15
15
  describe(`Fluid data updates (${testOpts.variant})`, () => {
16
- const connectTimeoutMs = 10000;
16
+ const connectTimeoutMs = 10_000;
17
17
  let client;
18
18
  const schema = {
19
19
  initialObjects: {
@@ -1 +1 @@
1
- {"version":3,"file":"ddsTests.spec.js","sourceRoot":"","sources":["../../src/test/ddsTests.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 { AzureClient } from \"@fluidframework/azure-client\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { ContainerSchema, type IFluidContainer } from \"@fluidframework/fluid-static\";\nimport { type ISharedMap, SharedMap } from \"@fluidframework/map/internal\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\nimport { AxiosResponse } from \"axios\";\n\nimport {\n\tcreateAzureClient,\n\tcreateContainerFromPayload,\n\tgetContainerIdFromPayloadResponse,\n} from \"./AzureClientFactory.js\";\nimport { CounterTestDataObject, TestDataObject } from \"./TestDataObject.js\";\nimport * as ephemeralSummaryTrees from \"./ephemeralSummaryTrees.js\";\nimport { getTestMatrix, mapWait } from \"./utils.js\";\n\nconst testMatrix = getTestMatrix();\nfor (const testOpts of testMatrix) {\n\tdescribe(`Fluid data updates (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tlet client: AzureClient;\n\t\tconst schema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t} satisfies ContainerSchema;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\n\t\tbeforeEach(\"createAzureClient\", () => {\n\t\t\tclient = createAzureClient();\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test when an Azure Client container is created,\n\t\t * it can set the initial objects.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"can set DDSes as initial objects for a container\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet newContainer: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.setDDSesAsInitialObjectsForContainer,\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: newContainer } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container: newContainer } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await newContainer.attach();\n\t\t\t}\n\n\t\t\tif (newContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => newContainer.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 resources = client.getContainer(containerId, schema, \"2\");\n\t\t\tawait assert.doesNotReject(\n\t\t\t\tresources,\n\t\t\t\t() => true,\n\t\t\t\t\"container cannot be retrieved from Azure Fluid Relay\",\n\t\t\t);\n\n\t\t\tconst { container } = await resources;\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tObject.keys(container.initialObjects),\n\t\t\t\tObject.keys(schema.initialObjects),\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if initialObjects passed into the container functions correctly.\n\t\t *\n\t\t * Expected behavior: initialObjects value loaded in two different containers should mirror\n\t\t * each other after value is changed.\n\t\t */\n\t\tit(\"can change DDSes within initialObjects value\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.changeDDSesWithinInitialObjectsValue,\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 initialObjectsCreate = container.initialObjects;\n\t\t\tconst map1Create = initialObjectsCreate.map1 as SharedMap;\n\t\t\tmap1Create.set(\"new-key\", \"new-value\");\n\t\t\tconst valueCreate: string | undefined = map1Create.get(\"new-key\");\n\n\t\t\tconst { container: containerGet } = await client.getContainer(containerId, schema, \"2\");\n\t\t\tconst map1Get = containerGet.initialObjects.map1;\n\t\t\tconst valueGet: string | undefined = await mapWait(map1Get, \"new-key\");\n\t\t\tassert.strictEqual(valueGet, valueCreate, \"container can't change initial objects\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if we can create DataObjects through initialObjects schema.\n\t\t *\n\t\t * Expected behavior: DataObjects can be retrieved from the original and loaded container.\n\t\t */\n\t\tit(\"can set DataObjects as initial objects for a container\", async () => {\n\t\t\tconst doSchema: ContainerSchema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmdo1: TestDataObject,\n\t\t\t\t\tmdo2: CounterTestDataObject,\n\t\t\t\t},\n\t\t\t};\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.setDataObjectsAsInitialObjectsForContainer,\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, doSchema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(doSchema, \"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 initialObjectsCreate = container.initialObjects;\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo1 instanceof TestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo1\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo2\",\n\t\t\t);\n\n\t\t\tconst { container: containerGet } = await client.getContainer(\n\t\t\t\tcontainerId,\n\t\t\t\tdoSchema,\n\t\t\t\t\"2\",\n\t\t\t);\n\t\t\tconst initialObjectsGet = containerGet.initialObjects;\n\t\t\tassert(\n\t\t\t\tinitialObjectsGet.mdo1 instanceof TestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo1\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo2\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if we can create multiple DataObjects of the same type\n\t\t *\n\t\t * Expected behavior: DataObjects of the same type can be retrieved from the\n\t\t * original and loaded container.\n\t\t * TODO: Known bug that needs to be re-tested once fixed.\n\t\t */\n\t\tit(\"can use multiple DataObjects of the same type\", async () => {\n\t\t\tconst doSchema: ContainerSchema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmdo1: TestDataObject,\n\t\t\t\t\tmdo2: CounterTestDataObject,\n\t\t\t\t\tmdo3: CounterTestDataObject,\n\t\t\t\t},\n\t\t\t};\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.useMultipleDataObjectsOfSameType,\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, doSchema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(doSchema, \"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 initialObjectsCreate = container.initialObjects;\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo1 instanceof TestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo1\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo2\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo3 instanceof CounterTestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo3\",\n\t\t\t);\n\n\t\t\tconst { container: containerGet } = await client.getContainer(\n\t\t\t\tcontainerId,\n\t\t\t\tdoSchema,\n\t\t\t\t\"2\",\n\t\t\t);\n\t\t\tconst initialObjectsGet = containerGet.initialObjects;\n\t\t\tassert(\n\t\t\t\tinitialObjectsGet.mdo1 instanceof TestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo1\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo2\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo3 instanceof CounterTestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo3\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if we can change DataObject value contained within initialObjects\n\t\t *\n\t\t * Expected behavior: DataObject changes are correctly reflected on original and loaded containers\n\t\t */\n\t\tit(\"can change DataObjects within initialObjects value\", async () => {\n\t\t\tconst doSchema: ContainerSchema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmdo1: TestDataObject,\n\t\t\t\t\tmdo2: CounterTestDataObject,\n\t\t\t\t},\n\t\t\t};\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.changeDataObjectsWithinInitialObjectsValue,\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} else {\n\t\t\t\t({ container } = await client.createContainer(doSchema, \"2\"));\n\n\t\t\t\tconst initialObjectsCreate = container.initialObjects;\n\t\t\t\tconst mdo2 = initialObjectsCreate.mdo2 as CounterTestDataObject;\n\t\t\t\tmdo2.increment();\n\t\t\t\tmdo2.increment();\n\t\t\t\tmdo2.increment();\n\n\t\t\t\tassert.strictEqual(mdo2.value, 3);\n\n\t\t\t\tcontainerId = await container.attach();\n\n\t\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\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\tconst { container: containerGet } = await client.getContainer(\n\t\t\t\tcontainerId,\n\t\t\t\tdoSchema,\n\t\t\t\t\"2\",\n\t\t\t);\n\t\t\tconst initialObjectsGet = containerGet.initialObjects;\n\t\t\tconst mdo2get = initialObjectsGet.mdo2 as CounterTestDataObject;\n\n\t\t\tassert.strictEqual(mdo2get.value, 3);\n\n\t\t\tmdo2get.increment();\n\t\t\tmdo2get.increment();\n\t\t\tassert.strictEqual(mdo2get.value, 5);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if the optional schema parameter, dynamicObjectTypes (custom data objects),\n\t\t * can be added during runtime and be returned by the container.\n\t\t *\n\t\t * Expected behavior: added loadable object can be retrieved from the container. Loadable\n\t\t * object's id and container config ID should be identical since it's now attached to\n\t\t * the container.\n\t\t */\n\t\tit(\"can create/add loadable objects (custom data object) dynamically during runtime\", async () => {\n\t\t\tconst dynamicSchema: ContainerSchema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmap1: SharedMap,\n\t\t\t\t},\n\t\t\t\tdynamicObjectTypes: [TestDataObject],\n\t\t\t};\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.createAddLoadableObjectsDynamically,\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, dynamicSchema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(dynamicSchema, \"2\"));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tconst newDo = await container.create(TestDataObject);\n\t\t\tassert.ok(newDo?.handle);\n\n\t\t\tconst map1 = container.initialObjects.map1 as ISharedMap;\n\t\t\tmap1.set(\"new-pair-id\", newDo.handle);\n\t\t\tconst handle: IFluidHandle | undefined = await map1.get(\"new-pair-id\");\n\t\t\tconst obj: unknown = await handle?.get();\n\t\t\tassert.ok(obj, \"container added dynamic objects incorrectly\");\n\t\t});\n\t});\n}\n"]}
1
+ {"version":3,"file":"ddsTests.spec.js","sourceRoot":"","sources":["../../src/test/ddsTests.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 { AzureClient } from \"@fluidframework/azure-client\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { ContainerSchema, type IFluidContainer } from \"@fluidframework/fluid-static\";\nimport { type ISharedMap, SharedMap } from \"@fluidframework/map/internal\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\nimport { AxiosResponse } from \"axios\";\n\nimport {\n\tcreateAzureClient,\n\tcreateContainerFromPayload,\n\tgetContainerIdFromPayloadResponse,\n} from \"./AzureClientFactory.js\";\nimport { CounterTestDataObject, TestDataObject } from \"./TestDataObject.js\";\nimport * as ephemeralSummaryTrees from \"./ephemeralSummaryTrees.js\";\nimport { getTestMatrix, mapWait } from \"./utils.js\";\n\nconst testMatrix = getTestMatrix();\nfor (const testOpts of testMatrix) {\n\tdescribe(`Fluid data updates (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tlet client: AzureClient;\n\t\tconst schema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t} satisfies ContainerSchema;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\n\t\tbeforeEach(\"createAzureClient\", () => {\n\t\t\tclient = createAzureClient();\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test when an Azure Client container is created,\n\t\t * it can set the initial objects.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"can set DDSes as initial objects for a container\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet newContainer: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.setDDSesAsInitialObjectsForContainer,\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: newContainer } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container: newContainer } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await newContainer.attach();\n\t\t\t}\n\n\t\t\tif (newContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => newContainer.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 resources = client.getContainer(containerId, schema, \"2\");\n\t\t\tawait assert.doesNotReject(\n\t\t\t\tresources,\n\t\t\t\t() => true,\n\t\t\t\t\"container cannot be retrieved from Azure Fluid Relay\",\n\t\t\t);\n\n\t\t\tconst { container } = await resources;\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tObject.keys(container.initialObjects),\n\t\t\t\tObject.keys(schema.initialObjects),\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if initialObjects passed into the container functions correctly.\n\t\t *\n\t\t * Expected behavior: initialObjects value loaded in two different containers should mirror\n\t\t * each other after value is changed.\n\t\t */\n\t\tit(\"can change DDSes within initialObjects value\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.changeDDSesWithinInitialObjectsValue,\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 initialObjectsCreate = container.initialObjects;\n\t\t\tconst map1Create = initialObjectsCreate.map1 as SharedMap;\n\t\t\tmap1Create.set(\"new-key\", \"new-value\");\n\t\t\tconst valueCreate: string | undefined = map1Create.get(\"new-key\");\n\n\t\t\tconst { container: containerGet } = await client.getContainer(containerId, schema, \"2\");\n\t\t\tconst map1Get = containerGet.initialObjects.map1;\n\t\t\tconst valueGet: string | undefined = await mapWait(map1Get, \"new-key\");\n\t\t\tassert.strictEqual(valueGet, valueCreate, \"container can't change initial objects\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if we can create DataObjects through initialObjects schema.\n\t\t *\n\t\t * Expected behavior: DataObjects can be retrieved from the original and loaded container.\n\t\t */\n\t\tit(\"can set DataObjects as initial objects for a container\", async () => {\n\t\t\tconst doSchema: ContainerSchema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmdo1: TestDataObject,\n\t\t\t\t\tmdo2: CounterTestDataObject,\n\t\t\t\t},\n\t\t\t};\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.setDataObjectsAsInitialObjectsForContainer,\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, doSchema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(doSchema, \"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 initialObjectsCreate = container.initialObjects;\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo1 instanceof TestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo1\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo2\",\n\t\t\t);\n\n\t\t\tconst { container: containerGet } = await client.getContainer(\n\t\t\t\tcontainerId,\n\t\t\t\tdoSchema,\n\t\t\t\t\"2\",\n\t\t\t);\n\t\t\tconst initialObjectsGet = containerGet.initialObjects;\n\t\t\tassert(\n\t\t\t\tinitialObjectsGet.mdo1 instanceof TestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo1\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo2\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if we can create multiple DataObjects of the same type\n\t\t *\n\t\t * Expected behavior: DataObjects of the same type can be retrieved from the\n\t\t * original and loaded container.\n\t\t * TODO: Known bug that needs to be re-tested once fixed.\n\t\t */\n\t\tit(\"can use multiple DataObjects of the same type\", async () => {\n\t\t\tconst doSchema: ContainerSchema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmdo1: TestDataObject,\n\t\t\t\t\tmdo2: CounterTestDataObject,\n\t\t\t\t\tmdo3: CounterTestDataObject,\n\t\t\t\t},\n\t\t\t};\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.useMultipleDataObjectsOfSameType,\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, doSchema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(doSchema, \"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 initialObjectsCreate = container.initialObjects;\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo1 instanceof TestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo1\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo2\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo3 instanceof CounterTestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo3\",\n\t\t\t);\n\n\t\t\tconst { container: containerGet } = await client.getContainer(\n\t\t\t\tcontainerId,\n\t\t\t\tdoSchema,\n\t\t\t\t\"2\",\n\t\t\t);\n\t\t\tconst initialObjectsGet = containerGet.initialObjects;\n\t\t\tassert(\n\t\t\t\tinitialObjectsGet.mdo1 instanceof TestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo1\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo2\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tinitialObjectsCreate.mdo3 instanceof CounterTestDataObject,\n\t\t\t\t\"container returns the wrong type for mdo3\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if we can change DataObject value contained within initialObjects\n\t\t *\n\t\t * Expected behavior: DataObject changes are correctly reflected on original and loaded containers\n\t\t */\n\t\tit(\"can change DataObjects within initialObjects value\", async () => {\n\t\t\tconst doSchema: ContainerSchema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmdo1: TestDataObject,\n\t\t\t\t\tmdo2: CounterTestDataObject,\n\t\t\t\t},\n\t\t\t};\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.changeDataObjectsWithinInitialObjectsValue,\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} else {\n\t\t\t\t({ container } = await client.createContainer(doSchema, \"2\"));\n\n\t\t\t\tconst initialObjectsCreate = container.initialObjects;\n\t\t\t\tconst mdo2 = initialObjectsCreate.mdo2 as CounterTestDataObject;\n\t\t\t\tmdo2.increment();\n\t\t\t\tmdo2.increment();\n\t\t\t\tmdo2.increment();\n\n\t\t\t\tassert.strictEqual(mdo2.value, 3);\n\n\t\t\t\tcontainerId = await container.attach();\n\n\t\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\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\tconst { container: containerGet } = await client.getContainer(\n\t\t\t\tcontainerId,\n\t\t\t\tdoSchema,\n\t\t\t\t\"2\",\n\t\t\t);\n\t\t\tconst initialObjectsGet = containerGet.initialObjects;\n\t\t\tconst mdo2get = initialObjectsGet.mdo2 as CounterTestDataObject;\n\n\t\t\tassert.strictEqual(mdo2get.value, 3);\n\n\t\t\tmdo2get.increment();\n\t\t\tmdo2get.increment();\n\t\t\tassert.strictEqual(mdo2get.value, 5);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if the optional schema parameter, dynamicObjectTypes (custom data objects),\n\t\t * can be added during runtime and be returned by the container.\n\t\t *\n\t\t * Expected behavior: added loadable object can be retrieved from the container. Loadable\n\t\t * object's id and container config ID should be identical since it's now attached to\n\t\t * the container.\n\t\t */\n\t\tit(\"can create/add loadable objects (custom data object) dynamically during runtime\", async () => {\n\t\t\tconst dynamicSchema: ContainerSchema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmap1: SharedMap,\n\t\t\t\t},\n\t\t\t\tdynamicObjectTypes: [TestDataObject],\n\t\t\t};\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.createAddLoadableObjectsDynamically,\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, dynamicSchema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(dynamicSchema, \"2\"));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tconst newDo = await container.create(TestDataObject);\n\t\t\tassert.ok(newDo?.handle);\n\n\t\t\tconst map1 = container.initialObjects.map1 as ISharedMap;\n\t\t\tmap1.set(\"new-pair-id\", newDo.handle);\n\t\t\tconst handle: IFluidHandle | undefined = await map1.get(\"new-pair-id\");\n\t\t\tconst obj: unknown = await handle?.get();\n\t\t\tassert.ok(obj, \"container added dynamic objects incorrectly\");\n\t\t});\n\t});\n}\n"]}