@fluidframework/container-loader 0.59.2000-61729 → 0.59.2000-63294
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/dist/connectionManager.js.map +1 -1
- package/dist/containerContext.d.ts.map +1 -1
- package/dist/containerContext.js +4 -0
- package/dist/containerContext.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/lib/connectionManager.js.map +1 -1
- package/lib/containerContext.d.ts.map +1 -1
- package/lib/containerContext.js +4 -0
- package/lib/containerContext.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/package.json +23 -26
- package/src/connectionManager.ts +1 -1
- package/src/containerContext.ts +7 -2
- package/src/packageVersion.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectionManager.js","sourceRoot":"","sources":["../src/connectionManager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAOH,+DAAsF;AAOtF,qEAEyC;AAMzC,+DASsC;AACtC,+EAe8C;AAC9C,qEAGyC;AACzC,2CAIqB;AACrB,6CAA0C;AAE1C,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnC,MAAM,qBAAqB,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;AAE1D,SAAS,oBAAoB,CAAC,WAAyB;IACnD,MAAM,OAAO,GAAG,SAAS,WAAW,CAAC,IAAI,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;IACrE,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,KAAK,GAAG,CAAC;IAC1C,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACtG,OAAO,wCAAyB,CAC5B,OAAO,EACP,EAAE,QAAQ,EAAE,YAAY,EAAE,EAC1B,EAAE,UAAU,EAAE,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,aACF,SAAQ,gCAAiD;IAD7D;;QAII,aAAQ,GAAW,qBAAqB,CAAC;QACzC,WAAM,GAAiB;YACnB,MAAM,EAAE,CAAC,gCAAS,CAAC,OAAO,CAAC;SACvB,CAAC;QACT,SAAI,GAAmB,MAAM,CAAC;QAC9B,aAAQ,GAAY,IAAI,CAAC;QACzB,mBAAc,GAAW,CAAC,CAAC;QAC3B,YAAO,GAAW,EAAE,CAAC;QACrB,oBAAe,GAAgC,EAAE,CAAC;QAClD,mBAAc,GAAqB,EAAE,CAAC;QACtC,mBAAc,GAAoB,EAAE,CAAC;QACrC,yBAAoB,GAAyB;YACzC,cAAc,EAAE,CAAC;YACjB,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,SAAgB;SAC5B,CAAC;QACF,6BAAwB,GAAwB,SAAS,CAAC;QAgBlD,cAAS,GAAG,KAAK,CAAC;IAG9B,CAAC;IAlBG,MAAM,CAAC,QAA4B;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YACxD,OAAO;gBACH,SAAS;gBACT,OAAO,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,IAAI,EAAE,GAAG,EAAE;aAChF,CAAC;QACN,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;IACD,YAAY,CAAC,OAAY;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE;YAC7B,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,EAAE,OAAO,EAAE,mDAAmD,EAAE,IAAI,EAAE,GAAG,EAAE;SACvF,CAAC,CAAC;IACP,CAAC;IAGD,IAAW,QAAQ,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACzC,OAAO,KAAK,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC;CAC9C;AAED;;;;GAIG;AACH,MAAa,iBAAiB;IAqJ1B,YACqB,eAAmD,EAC5D,MAAe,EACvB,gBAAyB,EACR,MAAwB,EACxB,KAAoC;QAJpC,oBAAe,GAAf,eAAe,CAAoC;QAC5D,WAAM,GAAN,MAAM,CAAS;QAEN,WAAM,GAAN,MAAM,CAAkB;QACxB,UAAK,GAAL,KAAK,CAA+B;QAtJjD,sBAAiB,GAAG,KAAK,CAAC;QAMlC,4CAA4C;QACpC,mBAAc,GAAG,KAAK,CAAC;QAO/B,2EAA2E;QACnE,qBAAgB,GAAG,KAAK,CAAC;QAEzB,yBAAoB,GAAG,CAAC,CAAC;QACzB,iCAA4B,GAAG,CAAC,CAAC;QACzC,4EAA4E;QACpE,sBAAiB,GAAG,CAAC,CAAC;QAKtB,2BAAsB,GAAG,IAAI,CAAC;QAE9B,4BAAuB,GAAoC,EAAE,CAAC;QAE9D,qBAAgB,GAAyB,EAAE,CAAC;QAE5C,WAAM,GAAG,KAAK,CAAC;QAirBN,cAAS,GAAG,CAAC,UAAkB,EAAE,WAAwC,EAAE,EAAE;YAC1F,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACxD,CAAC,CAAC;QAEF,qDAAqD;QACpC,gBAAW,GAAG,CAAC,UAAkB,EAAE,QAAiB,EAAE,EAAE;YACrE,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,oBAAoB,KAAK,IAAI,EAAE;gBACpC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,+BAAgB,CAAC,yBAAyB,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;gBACnG,OAAO;aACV;YAED,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE5D,2EAA2E;YAC3E,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;gBACzB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;gBACvC,OAAO;aACV;YAED,IAAI,CAAC,gBAAgB,CACjB,OAAO,EACP,aAAa,CAChB,CAAC;QACN,CAAC,CAAC;QAEF,uFAAuF;QACtE,8BAAyB,GAAG,CAAC,gBAAiC,EAAE,EAAE;YAC/E,gGAAgG;YAChG,iEAAiE;YACjE,IAAI,CAAC,gBAAgB,CACjB,IAAI,CAAC,uBAAuB,EAC5B,gBAAgB,CACnB,CAAC;QACN,CAAC,CAAC;QAEe,iBAAY,GAAG,CAAC,KAAsB,EAAE,EAAE;YACvD,IAAI,CAAC,gBAAgB,CACjB,IAAI,CAAC,uBAAuB,EAC5B,KAAK,CACR,CAAC;QACN,CAAC,CAAC;QAlmBE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACzC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAChD,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,yBAAa,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAa,CAAC,KAAK,CAAC;QAErF,yGAAyG;QACzG,sGAAsG;QACtG,IAAI,CAAC,SAAS,GAAG,IAAI,uBAAU,CAC3B,CAAC,QAAQ,EAAE,EAAE;YACT,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;gBAC/B,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;aACjF;YACD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEP,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gCAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC;IAtID,IAAW,sBAAsB,KAAK,OAAO,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAI5E;;OAEG;IACF,IAAW,cAAc;;QACtB,mBAAO,IAAI,CAAC,UAAU,0CAAE,IAAI,mCAAI,MAAM,CAAC;IAC3C,CAAC;IAED,IAAW,SAAS,KAAK,OAAO,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC;IAEhE,IAAW,QAAQ,aAAK,aAAO,IAAI,CAAC,UAAU,0CAAE,QAAQ,CAAC,CAAC,CAAC;IAC3D;;;OAGG;IACF,IAAW,aAAa;QACrB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,IAAW,cAAc;;QACrB,yBAAO,IAAI,CAAC,UAAU,0CAAE,oBAAoB,0CAAE,cAAc,mCACrD,gBAAgB,CAAC;IAC5B,CAAC;IAED,IAAW,OAAO;QACd,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;YAC/B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;SAChE;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;IACnC,CAAC;IAED,IAAW,oBAAoB;;QAC3B,aAAO,IAAI,CAAC,UAAU,0CAAE,oBAAoB,CAAC;IACjD,CAAC;IAED,IAAW,MAAM;;QACb,aAAO,IAAI,CAAC,UAAU,0CAAE,MAAM,CAAC,MAAM,CAAC;IAC1C,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED;;;MAGE;IACD,IAAW,eAAe;QACvB,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;YAC/B,OAAO,IAAI,CAAC,gBAAgB,CAAC;SAChC;aAAM;YACH,uCACO,IAAI,CAAC,gBAAgB;gBACxB,oEAAoE;gBACpE,OAAO,EAAE,IAAI,CAAC,oBAAoB,IACpC;SACL;IACL,CAAC;IAEM,eAAe;QAClB,sEAAsE;QACtE,OAAO,IAAI,CAAC,4BAA4B,GAAG,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACpG,CAAC;IAED;;;;;;;;OAQG;IACH,IAAY,QAAQ;QAChB,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,OAAO,IAAI,CAAC;SACf;QACD,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED,IAAW,YAAY;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,YAAY,aAAa,CAAC;QAC9F,IAAI,WAAW,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,oBAAoB,KAAK,IAAI,EAAE;YAC1E,OAAO;gBACH,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI,CAAC,cAAc;gBAC3B,WAAW,EAAE,IAAI,CAAC,oBAAoB;gBACtC,WAAW;aACd,CAAC;SACL;QAED,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACnD,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,UAAoC;QACrE,OAAO;YACH,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,wBAAwB,EAAE,UAAU,CAAC,wBAAwB;YAC7D,IAAI,cAAc,KAAK,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;YAC1D,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,oBAAoB,EAAE,UAAU,CAAC,oBAAoB;YACrD,OAAO,EAAE,UAAU,CAAC,OAAO;SAC9B,CAAC;IACN,CAAC;IA4BM,OAAO,CAAC,KAA+B;QAC1C,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,OAAO;SACV;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAE/B,8DAA8D;QAC9D,IAAI,CAAC,cAAc,GAAG,yBAAa,CAAC,KAAK,CAAC;QAE1C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAEvB,MAAM,gBAAgB,GAAG,KAAK,KAAK,SAAS;YACxC,CAAC,CAAC,yBAAyB,KAAK,CAAC,OAAO,GAAG;YAC3C,CAAC,CAAC,sBAAsB,CAAC;QAE7B,+DAA+D;QAC/D,IAAI,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;QAEjD,6CAA6C;QAC7C,6DAA6D;QAC7D,wDAAwD;QACxD,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED;;;MAGE;IACK,gBAAgB,CAAC,IAAmB;QACvC,qBAAM,CAAC,IAAI,KAAK,yBAAa,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,KAAK,yBAAa,CAAC,KAAK,EAC9E,KAAK,CAAC,mEAAmE,CAAC,CAAC;QAE/E,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAE3B,IAAI,IAAI,KAAK,yBAAa,CAAC,OAAO,EAAE;YAChC,kFAAkF;YAClF,IAAI,CAAC,yBAAyB,CAAC,kBAAkB,CAAC,CAAC;SACtD;IACL,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACK,aAAa,CAAC,QAAiB;QACnC,IAAI,QAAQ,KAAK,IAAI,CAAC,cAAc,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;gBAC3B,SAAS,EAAE,eAAe;gBAC1B,KAAK,EAAE,QAAQ;aAClB,CAAC,CAAC;SACN;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QAE/B,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE;YAC5B,qBAAM,CAAC,IAAI,CAAC,cAAc,KAAK,yBAAa,CAAC,KAAK,EAC9C,KAAK,CAAC,mEAAmE,CAAC,CAAC;YAE/E,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE;gBACxB,uEAAuE;gBACvE,wEAAwE;gBACxE,mCAAmC;gBAEnC,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;oBACxB,4EAA4E;oBAC5E,oBAAoB;oBACpB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,6BAA6B,EAAE,CAAC,CAAC;iBAC5E;gBAED,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;aAChE;YACD,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,SAAS,EAAE;gBACX,4CAA4C;gBAC5C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;aAC/B;SACJ;IACL,CAAC;IAEO,uBAAuB,CAAC,QAAiB;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;QACrC,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACnD;IACL,CAAC;IAEM,OAAO,CAAC,cAA+B;QAC1C,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAC7C,MAAM,eAAe,GAAG,gCAAc,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;YAChF,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,cAA+B;;QACrD,qBAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAE/C,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACzD,OAAO;SACV;QAED,IAAI,aAAa,GAAG,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,IAAI,CAAC,uBAAuB,CAAC;QAEnE,2EAA2E;QAC3E,kFAAkF;QAClF,wFAAwF;QACxF,6FAA6F;QAC7F,+GAA+G;QAC/G,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YACxB,aAAa,GAAG,OAAO,CAAC;SAC3B;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,qBAAM,CAAC,UAAU,KAAK,SAAS,EAAE,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAE1E,IAAI,UAAgD,CAAC;QAErD,IAAI,OAAA,UAAU,CAAC,QAAQ,0CAAE,WAAW,MAAK,IAAI,EAAE;YAC3C,UAAU,GAAG,IAAI,aAAa,EAAE,CAAC;YACjC,6CAA6C;YAC7C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,IAAI,CAAC,4BAA4B,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACtD,qBAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAC3D,OAAO;SACV;QAED,kGAAkG;QAClG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAE9B,IAAI,OAAO,GAAG,yBAAyB,CAAC;QACxC,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAC3B,MAAM,gBAAgB,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC;QAC3C,IAAI,SAAc,CAAC;QAEnB,+FAA+F;QAC/F,OAAO,UAAU,KAAK,SAAS,EAAE;YAC7B,IAAI,IAAI,CAAC,MAAM,EAAE;gBACb,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;aAClE;YACD,kBAAkB,EAAE,CAAC;YAErB,IAAI;gBACA,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,aAAa,CAAC;gBACjC,UAAU,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAEhE,IAAI,UAAU,CAAC,QAAQ,EAAE;oBACrB,sEAAsE;oBACtE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAAC,CAAC;oBAC1E,UAAU,GAAG,SAAS,CAAC;iBAC1B;aACJ;YAAC,OAAO,SAAS,EAAE;gBAChB,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI;oBACnD,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,MAAK,kDAAmC,CAAC,SAAS,EAAE;oBACxE,UAAU,GAAG,IAAI,aAAa,EAAE,CAAC;oBACjC,aAAa,GAAG,MAAM,CAAC;oBACvB,MAAM;iBACT;gBAED,gFAAgF;gBAChF,IAAI,CAAC,8BAAe,CAAC,SAAS,CAAC,EAAE;oBAC7B,MAAM,KAAK,GAAG,gCAAc,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;oBAC1E,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;oBAC/B,MAAM,KAAK,CAAC;iBACf;gBAED,oEAAoE;gBACpE,gCAAiB,CACb,IAAI,CAAC,MAAM,EACX;oBACI,QAAQ,EAAE,kBAAkB;oBAC5B,KAAK,EAAE,OAAO;oBACd,SAAS,EAAE,iCAAiC;oBAC5C,QAAQ,EAAE,iCAAe,CAAC,UAAU,CAAC,0BAAW,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC;iBAC7E,EACD,SAAS,CAAC,CAAC;gBAEf,SAAS,GAAG,SAAS,CAAC;gBAEtB,MAAM,mBAAmB,GAAG,qCAAsB,CAAC,SAAS,CAAC,CAAC;gBAC9D,OAAO,GAAG,mBAAmB,aAAnB,mBAAmB,cAAnB,mBAAmB,GAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,qBAAqB,CAAC,CAAC;gBAE9E,IAAI,mBAAmB,KAAK,SAAS,EAAE;oBACnC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;iBACvE;gBACD,MAAM,oCAAqB,CAAC,OAAO,CAAC,CAAC;aACxC;SACJ;QAED,uGAAuG;QACvG,IAAI,kBAAkB,GAAG,CAAC,EAAE;YACxB,gCAAiB,CACb,IAAI,CAAC,MAAM,EACX;gBACI,SAAS,EAAE,iCAAiC;gBAC5C,QAAQ,EAAE,kBAAkB;gBAC5B,QAAQ,EAAE,iCAAe,CAAC,UAAU,CAAC,0BAAW,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC;aAC7E,EACD,SAAS,CACZ,CAAC;SACL;QAED,IAAI,CAAC,4BAA4B,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACjE,CAAC;IAED;;;;OAIG;IACM,cAAc,CAAC,cAA8B;QAClD,qBAAM,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,aAAa,KAAK,yBAAa,CAAC,OAAO,EAAE;YAC9C,OAAO;SACV;QACD,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACM,yBAAyB,CAAC,MAAc;QAC7C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAE9B,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;YAC/B,OAAO,KAAK,CAAC;SAChB;QAED,qBAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAE3F,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,iDAAiD;QACjD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAE5B,sGAAsG;QACtG,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACnD,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC7D,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE/C,mEAAmE;QACnE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAErC,UAAU,CAAC,OAAO,EAAE,CAAC;QAErB,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC;QAElC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACM,4BAA4B,CAAC,UAAoC,EAAE,aAA6B;QACrG,2EAA2E;QAC3E,qBAAM,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACnG,qBAAM,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAE7F,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;SAClC;aAAM;YACH,qBAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,mDAAmD,CAAC,CAAC;SAClF;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAE7B,6CAA6C;QAC7C,iEAAiE;QACjE,sDAAsD;QACtD,MAAM,QAAQ,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAS,CAAC,QAAQ,CAAC,CAAC;QAExE,yGAAyG;QACzG,oEAAoE;QACpE,qBAAM,CAAC,aAAa,KAAK,MAAM,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,MAAM,CAAC,EAC5E,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAClD,qBAAM,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,KAAK,MAAM,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAEvG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAEvC,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,iEAAiE;YACjE,IAAI,CAAC,yBAAyB,CAAC,kCAAkC,CAAC,CAAC;YACnE,OAAO;SACV;QAED,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QAExB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC5D,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE9C,gHAAgH;QAChH,6GAA6G;QAC7G,+GAA+G;QAC/G,iBAAiB;QACjB,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;QAEvG,2FAA2F;QAC3F,IAAI,wBAAwB,GAAG,UAAU,CAAC,wBAAwB,CAAC;QAEnE,IAAI,CAAC,uBAAuB,GAAG;YAC3B,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,IAAI,EAAE,UAAU,CAAC,IAAI;SACxB,CAAC;QAEF,yBAAyB;QACzB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAE3B,IAAI,UAAU,CAAC,iBAAiB,KAAK,SAAS,EAAE;YAC5C,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAC;YAC9E,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAC;SAC1E;QACD,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;QACtE,IAAI,CAAC,gBAAgB,CAAC,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC;QAEvD,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;QACd,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,uBAAuB,CAAC,wBAAwB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;YAC1F,IAAI,GAAG,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;YAClE,IAAI,CAAC,uBAAuB,CAAC,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC;YAC/D,4EAA4E;YAC5E,wGAAwG;YACxG,4CAA4C;YAC5C,IAAI,wBAAwB,KAAK,SAAS,IAAI,wBAAwB,GAAG,IAAI,EAAE;gBAC3E,wBAAwB,GAAG,IAAI,CAAC;aACnC;SACJ;QAED,IAAI,CAAC,KAAK,CAAC,iBAAiB,CACxB,eAAe,EACf,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAEjE,IAAI,UAAU,CAAC,cAAc,KAAK,SAAS,EAAE;YACzC,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,cAAc,EAAE;gBAC5C,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;aACpC;SACJ;QAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QACpE,OAAO,CAAC,wBAAwB,GAAG,wBAAwB,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAEnC,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACxC,CAAC;IAED;;;;;;OAMG;IACM,gBAAgB,CACrB,aAA6B,EAC7B,KAAsB;QAEtB,IAAI,CAAC,SAAS,CACV,aAAa,EACb,KAAK,CAAC,OAAO,EACb,KAAK,CAAC;aACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,SAAS,CACnB,aAA6B,EAC7B,iBAAyB,EACzB,KAAuB;QAEvB,8EAA8E;QAC9E,qDAAqD;QACrD,uFAAuF;QACvF,qBAAM,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAEtF,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,CAAC;QAElD,+DAA+D;QAC/D,uFAAuF;QACvF,0EAA0E;QAC1E,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACxC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;gBAC3B,SAAS,EAAE,+BAA+B;gBAC1C,aAAa,EAAE,IAAI,CAAC,aAAa;aACnC,EAAE,KAAK,CAAC,CAAC;SACd;QAED,IAAI,IAAI,CAAC,aAAa,KAAK,yBAAa,CAAC,KAAK,EAAE;YAC5C,kFAAkF;YAClF,+EAA+E;YAC/E,yEAAyE;YACzE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;SAC7B;QAED,oCAAoC;QACpC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,KAAK,yBAAa,CAAC,OAAO,EAAE;YAC7D,OAAO;SACV;QAED,MAAM,OAAO,GAAG,qCAAsB,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE;YAC9C,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,oCAAqB,CAAC,OAAO,CAAC,CAAC;SACxC;QAED,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC;IAEM,oBAAoB,CAAC,OAAuD;;QAC/E,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE;YACxB,qBAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,KAAK,IAAI,EAAE,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC3F,MAAM,KAAK,GAAG,IAAI,8BAAY,CAAC,4BAA4B,EAAE,SAAS,CAAC,WAAW,EAAE;gBAChF,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ;gBACpC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;gBACxC,mBAAmB,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW;gBAClD,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW;aAC7C,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,SAAS,CAAC;SACpB;QAED,2DAA2D;QAC3D,oGAAoG;QACpG,sCAAsC;QACtC,qBAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,qBAAqB,YAAK,IAAI,CAAC,UAAU,0CAAE,QAAQ,CAAA,EAAE;YAC1D,IAAI,CAAC,qBAAqB,SAAG,IAAI,CAAC,UAAU,0CAAE,QAAQ,CAAC;YACvD,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,4BAA4B,GAAG,CAAC,CAAC;SACzC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,kCAAW,CAAC,IAAI,EAAE;YACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC5B;aAAM;YACH,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;SAC9B;QAED,uCACO,OAAO,KACV,oBAAoB,EAAE,EAAE,IAAI,CAAC,oBAAoB,IACnD;IACN,CAAC;IAEM,YAAY,CAAC,OAAY;QAC5B,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;YAC/B,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SACzC;aAAM;YACH,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAAC,CAAC;SACzE;IACL,CAAC;IAEM,YAAY,CAAC,QAA4B;QAC5C,qBAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAEpE,oFAAoF;QACpF,oEAAoE;QACpE,qCAAqC;QACrC,mFAAmF;QACnF,wFAAwF;QACxF,6DAA6D;QAC7D,IAAI,IAAI,CAAC,cAAc,KAAK,MAAM,EAAE;YAChC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBACxB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC7B,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;oBAC9B,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,eAAe;wBACxC,MAAM,IAAI,CAAC,SAAS,CAChB,OAAO,EAAE,iBAAiB;wBAC1B,iBAAiB,CACpB,CAAC;qBACL;gBACL,CAAC,CAAC;qBACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;aACpB;YACD,OAAO;SACV;QAED,qBAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAE1D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAEM,0BAA0B,CAAC,OAAkC;QAChE,iFAAiF;QACjF,qBAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,qBAAqB,KAAK,OAAO,CAAC,QAAQ,EACxF,KAAK,CAAC,+CAA+C,CACxD,CAAC;QAEF,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS,IAAI,IAAI,CAAC,qBAAqB,KAAK,OAAO,CAAC,QAAQ,EAAE;YAC7F,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAE1D,qBAAM,CAAC,IAAI,CAAC,4BAA4B,GAAG,oBAAoB,EAAE,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACxG,qBAAM,CAAC,oBAAoB,IAAI,IAAI,CAAC,oBAAoB,EACpD,KAAK,CAAC,6DAA6D,CAAC,CAAC;YAEzE,IAAI,CAAC,4BAA4B,GAAG,oBAAoB,CAAC;SAC5D;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,kCAAW,CAAC,WAAW,EAAE;YAC1C,MAAM,kBAAkB,GAAG,OAA0C,CAAC;YACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAW,CAAC;YAC/D,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE;gBAC5B,sCAAsC;gBACtC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBAE5E,gGAAgG;gBAChG,qGAAqG;gBACrG,mGAAmG;gBACnG,mGAAmG;gBACnG,uFAAuF;gBACvF,mCAAmC;gBACnC,IAAI,CAAC,SAAS,CACV,MAAM,EAAE,iBAAiB;gBACzB,gBAAgB,CACnB,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBACd,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,wBAAwB,EAAC,EAAE,KAAK,CAAC,CAAC;gBAC9E,CAAC,CAAC,CAAC;aACN;SACJ;IACL,CAAC;CA6CJ;AA/vBD,8CA+vBC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n IDisposable,\n ITelemetryLogger,\n ITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport { assert, performance, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport {\n IDeltaQueue,\n ReadOnlyInfo,\n IConnectionDetails,\n ICriticalContainerError,\n} from \"@fluidframework/container-definitions\";\nimport {\n GenericError,\n} from \"@fluidframework/container-utils\";\nimport {\n IDocumentService,\n IDocumentDeltaConnection,\n IDocumentDeltaConnectionEvents,\n} from \"@fluidframework/driver-definitions\";\nimport {\n canRetryOnError,\n createWriteError,\n createGenericNetworkError,\n getRetryDelayFromError,\n IAnyDriverError,\n waitForConnectedState,\n DeltaStreamConnectionForbiddenError,\n logNetworkFailure,\n} from \"@fluidframework/driver-utils\";\nimport {\n ConnectionMode,\n IClient,\n IClientConfiguration,\n IClientDetails,\n IDocumentMessage,\n INack,\n INackContent,\n ISequencedDocumentMessage,\n ISignalClient,\n ISignalMessage,\n ITokenClaims,\n MessageType,\n ScopeType,\n ISequencedDocumentSystemMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n TelemetryLogger,\n normalizeError,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n ReconnectMode,\n IConnectionManager,\n IConnectionManagerFactoryArgs,\n} from \"./contracts\";\nimport { DeltaQueue } from \"./deltaQueue\";\n\nconst MaxReconnectDelayInMs = 8000;\nconst InitialReconnectDelayInMs = 1000;\nconst DefaultChunkSize = 16 * 1024;\n\nconst fatalConnectErrorProp = { fatalConnectError: true };\n\nfunction getNackReconnectInfo(nackContent: INackContent) {\n const message = `Nack (${nackContent.type}): ${nackContent.message}`;\n const canRetry = nackContent.code !== 403;\n const retryAfterMs = nackContent.retryAfter !== undefined ? nackContent.retryAfter * 1000 : undefined;\n return createGenericNetworkError(\n message,\n { canRetry, retryAfterMs },\n { statusCode: nackContent.code, driverVersion: undefined });\n}\n\n/**\n * Implementation of IDocumentDeltaConnection that does not support submitting\n * or receiving ops. Used in storage-only mode.\n */\nclass NoDeltaStream\n extends TypedEventEmitter<IDocumentDeltaConnectionEvents>\n implements IDocumentDeltaConnection, IDisposable\n{\n clientId: string = \"storage-only client\";\n claims: ITokenClaims = {\n scopes: [ScopeType.DocRead],\n } as any;\n mode: ConnectionMode = \"read\";\n existing: boolean = true;\n maxMessageSize: number = 0;\n version: string = \"\";\n initialMessages: ISequencedDocumentMessage[] = [];\n initialSignals: ISignalMessage[] = [];\n initialClients: ISignalClient[] = [];\n serviceConfiguration: IClientConfiguration = {\n maxMessageSize: 0,\n blockSize: 0,\n summary: undefined as any,\n };\n checkpointSequenceNumber?: number | undefined = undefined;\n submit(messages: IDocumentMessage[]): void {\n this.emit(\"nack\", this.clientId, messages.map((operation) => {\n return {\n operation,\n content: { message: \"Cannot submit with storage-only connection\", code: 403 },\n };\n }));\n }\n submitSignal(message: any): void {\n this.emit(\"nack\", this.clientId, {\n operation: message,\n content: { message: \"Cannot submit signal with storage-only connection\", code: 403 },\n });\n }\n\n private _disposed = false;\n public get disposed() { return this._disposed; }\n public dispose() { this._disposed = true; }\n}\n\n/**\n * Implementation of IConnectionManager, used by Container class\n * Implements constant connectivity to relay service, by reconnecting in case of loast connection or error.\n * Exposes various controls to influecen this process, including manual reconnects, forced read-only mode, etc.\n */\nexport class ConnectionManager implements IConnectionManager {\n /** Connection mode used when reconnecting on error or disconnect. */\n private readonly defaultReconnectionMode: ConnectionMode;\n\n private pendingConnection = false;\n private connection: IDocumentDeltaConnection | undefined;\n\n /** file ACL - whether user has only read-only access to a file */\n private _readonlyPermissions: boolean | undefined;\n\n /** tracks host requiring read-only mode. */\n private _forceReadonly = false;\n\n /**\n * Controls whether the DeltaManager will automatically reconnect to the delta stream after receiving a disconnect.\n */\n private _reconnectMode: ReconnectMode;\n\n /** True if there is pending (async) reconnection from \"read\" to \"write\" */\n private pendingReconnect = false;\n\n private clientSequenceNumber = 0;\n private clientSequenceNumberObserved = 0;\n /** Counts the number of noops sent by the client which may not be acked. */\n private trailingNoopCount = 0;\n\n /** track clientId used last time when we sent any ops */\n private lastSubmittedClientId: string | undefined;\n\n private connectFirstConnection = true;\n\n private _connectionVerboseProps: Record<string, string | number> = {};\n\n private _connectionProps: ITelemetryProperties = {};\n\n private closed = false;\n\n private readonly _outbound: DeltaQueue<IDocumentMessage[]>;\n\n public get connectionVerboseProps() { return this._connectionVerboseProps; }\n\n public readonly clientDetails: IClientDetails;\n\n /**\n * The current connection mode, initially read.\n */\n public get connectionMode(): ConnectionMode {\n return this.connection?.mode ?? \"read\";\n }\n\n public get connected() { return this.connection !== undefined; }\n\n public get clientId() { return this.connection?.clientId; }\n /**\n * Automatic reconnecting enabled or disabled.\n * If set to Never, then reconnecting will never be allowed.\n */\n public get reconnectMode(): ReconnectMode {\n return this._reconnectMode;\n }\n\n public get maxMessageSize(): number {\n return this.connection?.serviceConfiguration?.maxMessageSize\n ?? DefaultChunkSize;\n }\n\n public get version(): string {\n if (this.connection === undefined) {\n throw new Error(\"Cannot check version without a connection\");\n }\n return this.connection.version;\n }\n\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this.connection?.serviceConfiguration;\n }\n\n public get scopes(): string[] | undefined {\n return this.connection?.claims.scopes;\n }\n\n public get outbound(): IDeltaQueue<IDocumentMessage[]> {\n return this._outbound;\n }\n\n /**\n * Returns set of props that can be logged in telemetry that provide some insights / statistics\n * about current or last connection (if there is no connection at the moment)\n */\n public get connectionProps(): ITelemetryProperties {\n if (this.connection !== undefined) {\n return this._connectionProps;\n } else {\n return {\n ...this._connectionProps,\n // Report how many ops this client sent in last disconnected session\n sentOps: this.clientSequenceNumber,\n };\n }\n }\n\n public shouldJoinWrite(): boolean {\n // We don't have to wait for ack for topmost NoOps. So subtract those.\n return this.clientSequenceNumberObserved < (this.clientSequenceNumber - this.trailingNoopCount);\n }\n\n /**\n * Tells if container is in read-only mode.\n * Data stores should listen for \"readonly\" notifications and disallow user\n * making changes to data stores.\n * Readonly state can be because of no storage write permission,\n * or due to host forcing readonly mode for container.\n * It is undefined if we have not yet established websocket connection\n * and do not know if user has write access to a file.\n */\n private get readonly() {\n if (this._forceReadonly) {\n return true;\n }\n return this._readonlyPermissions;\n }\n\n public get readOnlyInfo(): ReadOnlyInfo {\n const storageOnly = this.connection !== undefined && this.connection instanceof NoDeltaStream;\n if (storageOnly || this._forceReadonly || this._readonlyPermissions === true) {\n return {\n readonly: true,\n forced: this._forceReadonly,\n permissions: this._readonlyPermissions,\n storageOnly,\n };\n }\n\n return { readonly: this._readonlyPermissions };\n }\n\n private static detailsFromConnection(connection: IDocumentDeltaConnection): IConnectionDetails {\n return {\n claims: connection.claims,\n clientId: connection.clientId,\n existing: connection.existing,\n checkpointSequenceNumber: connection.checkpointSequenceNumber,\n get initialClients() { return connection.initialClients; },\n mode: connection.mode,\n serviceConfiguration: connection.serviceConfiguration,\n version: connection.version,\n };\n }\n\n constructor(\n private readonly serviceProvider: () => IDocumentService | undefined,\n private client: IClient,\n reconnectAllowed: boolean,\n private readonly logger: ITelemetryLogger,\n private readonly props: IConnectionManagerFactoryArgs,\n ) {\n this.clientDetails = this.client.details;\n this.defaultReconnectionMode = this.client.mode;\n this._reconnectMode = reconnectAllowed ? ReconnectMode.Enabled : ReconnectMode.Never;\n\n // Outbound message queue. The outbound queue is represented as a queue of an array of ops. Ops contained\n // within an array *must* fit within the maxMessageSize and are guaranteed to be ordered sequentially.\n this._outbound = new DeltaQueue<IDocumentMessage[]>(\n (messages) => {\n if (this.connection === undefined) {\n throw new Error(\"Attempted to submit an outbound message without connection\");\n }\n this.connection.submit(messages);\n });\n\n this._outbound.on(\"error\", (error) => {\n this.props.closeHandler(normalizeError(error));\n });\n }\n\n public dispose(error?: ICriticalContainerError) {\n if (this.closed) {\n return;\n }\n this.closed = true;\n\n this.pendingConnection = false;\n\n // Ensure that things like triggerConnect() will short circuit\n this._reconnectMode = ReconnectMode.Never;\n\n this._outbound.clear();\n\n const disconnectReason = error !== undefined\n ? `Closing DeltaManager (${error.message})`\n : \"Closing DeltaManager\";\n\n // This raises \"disconnect\" event if we have active connection.\n this.disconnectFromDeltaStream(disconnectReason);\n\n // Notify everyone we are in read-only state.\n // Useful for data stores in case we hit some critical error,\n // to switch to a mode where user edits are not accepted\n this.set_readonlyPermissions(true);\n }\n\n /**\n * Enables or disables automatic reconnecting.\n * Will throw an error if reconnectMode set to Never.\n */\n public setAutoReconnect(mode: ReconnectMode): void {\n assert(mode !== ReconnectMode.Never && this._reconnectMode !== ReconnectMode.Never,\n 0x278 /* \"API is not supported for non-connecting or closed container\" */);\n\n this._reconnectMode = mode;\n\n if (mode !== ReconnectMode.Enabled) {\n // immediately disconnect - do not rely on service eventually dropping connection.\n this.disconnectFromDeltaStream(\"setAutoReconnect\");\n }\n }\n\n /**\n * Sends signal to runtime (and data stores) to be read-only.\n * Hosts may have read only views, indicating to data stores that no edits are allowed.\n * This is independent from this._readonlyPermissions (permissions) and this.connectionMode\n * (server can return \"write\" mode even when asked for \"read\")\n * Leveraging same \"readonly\" event as runtime & data stores should behave the same in such case\n * as in read-only permissions.\n * But this.active can be used by some DDSes to figure out if ops can be sent\n * (for example, read-only view still participates in code proposals / upgrades decisions)\n *\n * Forcing Readonly does not prevent DDS from generating ops. It is up to user code to honour\n * the readonly flag. If ops are generated, they will accumulate locally and not be sent. If\n * there are pending in the outbound queue, it will stop sending until force readonly is\n * cleared.\n *\n * @param readonly - set or clear force readonly.\n */\n public forceReadonly(readonly: boolean) {\n if (readonly !== this._forceReadonly) {\n this.logger.sendTelemetryEvent({\n eventName: \"ForceReadOnly\",\n value: readonly,\n });\n }\n const oldValue = this.readonly;\n this._forceReadonly = readonly;\n\n if (oldValue !== this.readonly) {\n assert(this._reconnectMode !== ReconnectMode.Never,\n 0x279 /* \"API is not supported for non-connecting or closed container\" */);\n\n let reconnect = false;\n if (this.readonly === true) {\n // If we switch to readonly while connected, we should disconnect first\n // See comment in the \"readonly\" event handler to deltaManager set up by\n // the ContainerRuntime constructor\n\n if (this.shouldJoinWrite()) {\n // If we have pending changes, then we will never send them - it smells like\n // host logic error.\n this.logger.sendErrorEvent({ eventName: \"ForceReadonlyPendingChanged\" });\n }\n\n reconnect = this.disconnectFromDeltaStream(\"Force readonly\");\n }\n this.props.readonlyChangeHandler(this.readonly);\n if (reconnect) {\n // reconnect if we disconnected from before.\n this.triggerConnect(\"read\");\n }\n }\n }\n\n private set_readonlyPermissions(readonly: boolean) {\n const oldValue = this.readonly;\n this._readonlyPermissions = readonly;\n if (oldValue !== this.readonly) {\n this.props.readonlyChangeHandler(this.readonly);\n }\n }\n\n public connect(connectionMode?: ConnectionMode) {\n this.connectCore(connectionMode).catch((error) => {\n const normalizedError = normalizeError(error, { props: fatalConnectErrorProp });\n this.props.closeHandler(normalizedError);\n });\n }\n\n private async connectCore(connectionMode?: ConnectionMode): Promise<void> {\n assert(!this.closed, 0x26a /* \"not closed\" */);\n\n if (this.connection !== undefined || this.pendingConnection) {\n return;\n }\n\n let requestedMode = connectionMode ?? this.defaultReconnectionMode;\n\n // if we have any non-acked ops from last connection, reconnect as \"write\".\n // without that we would connect in view-only mode, which will result in immediate\n // firing of \"connected\" event from Container and switch of current clientId (as tracked\n // by all DDSes). This will make it impossible to figure out if ops actually made it through,\n // so DDSes will immediately resubmit all pending ops, and some of them will be duplicates, corrupting document\n if (this.shouldJoinWrite()) {\n requestedMode = \"write\";\n }\n\n const docService = this.serviceProvider();\n assert(docService !== undefined, 0x2a7 /* \"Container is not attached\" */);\n\n let connection: IDocumentDeltaConnection | undefined;\n\n if (docService.policies?.storageOnly === true) {\n connection = new NoDeltaStream();\n // to keep setupNewSuccessfulConnection happy\n this.pendingConnection = true;\n this.setupNewSuccessfulConnection(connection, \"read\");\n assert(!this.pendingConnection, 0x2b3 /* \"logic error\" */);\n return;\n }\n\n // this.pendingConnection resets to false as soon as we know the outcome of the connection attempt\n this.pendingConnection = true;\n\n let delayMs = InitialReconnectDelayInMs;\n let connectRepeatCount = 0;\n const connectStartTime = performance.now();\n let lastError: any;\n\n // This loop will keep trying to connect until successful, with a delay between each iteration.\n while (connection === undefined) {\n if (this.closed) {\n throw new Error(\"Attempting to connect a closed DeltaManager\");\n }\n connectRepeatCount++;\n\n try {\n this.client.mode = requestedMode;\n connection = await docService.connectToDeltaStream(this.client);\n\n if (connection.disposed) {\n // Nobody observed this connection, so drop it on the floor and retry.\n this.logger.sendTelemetryEvent({ eventName: \"ReceivedClosedConnection\" });\n connection = undefined;\n }\n } catch (origError) {\n if (typeof origError === \"object\" && origError !== null &&\n origError?.errorType === DeltaStreamConnectionForbiddenError.errorType) {\n connection = new NoDeltaStream();\n requestedMode = \"read\";\n break;\n }\n\n // Socket.io error when we connect to wrong socket, or hit some multiplexing bug\n if (!canRetryOnError(origError)) {\n const error = normalizeError(origError, { props: fatalConnectErrorProp });\n this.props.closeHandler(error);\n throw error;\n }\n\n // Since the error is retryable this will not log to the error table\n logNetworkFailure(\n this.logger,\n {\n attempts: connectRepeatCount,\n delay: delayMs, // milliseconds\n eventName: \"DeltaConnectionFailureToConnect\",\n duration: TelemetryLogger.formatTick(performance.now() - connectStartTime),\n },\n origError);\n\n lastError = origError;\n\n const retryDelayFromError = getRetryDelayFromError(origError);\n delayMs = retryDelayFromError ?? Math.min(delayMs * 2, MaxReconnectDelayInMs);\n\n if (retryDelayFromError !== undefined) {\n this.props.reconnectionDelayHandler(retryDelayFromError, origError);\n }\n await waitForConnectedState(delayMs);\n }\n }\n\n // If we retried more than once, log an event about how long it took (this will not log to error table)\n if (connectRepeatCount > 1) {\n logNetworkFailure(\n this.logger,\n {\n eventName: \"MultipleDeltaConnectionFailures\",\n attempts: connectRepeatCount,\n duration: TelemetryLogger.formatTick(performance.now() - connectStartTime),\n },\n lastError,\n );\n }\n\n this.setupNewSuccessfulConnection(connection, requestedMode);\n }\n\n /**\n * Start the connection. Any error should result in container being close.\n * And report the error if it excape for any reason.\n * @param args - The connection arguments\n */\n private triggerConnect(connectionMode: ConnectionMode) {\n assert(this.connection === undefined, 0x239 /* \"called only in disconnected state\" */);\n if (this.reconnectMode !== ReconnectMode.Enabled) {\n return;\n }\n this.connect(connectionMode);\n }\n\n /**\n * Disconnect the current connection.\n * @param reason - Text description of disconnect reason to emit with disconnect event\n */\n private disconnectFromDeltaStream(reason: string): boolean {\n this.pendingReconnect = false;\n\n if (this.connection === undefined) {\n return false;\n }\n\n assert(!this.pendingConnection, 0x27b /* \"reentrancy may result in incorrect behavior\" */);\n\n const connection = this.connection;\n // Avoid any re-entrancy - clear object reference\n this.connection = undefined;\n\n // Remove listeners first so we don't try to retrigger this flow accidentally through reconnectOnError\n connection.off(\"op\", this.opHandler);\n connection.off(\"signal\", this.props.signalHandler);\n connection.off(\"nack\", this.nackHandler);\n connection.off(\"disconnect\", this.disconnectHandlerInternal);\n connection.off(\"error\", this.errorHandler);\n connection.off(\"pong\", this.props.pongHandler);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._outbound.pause();\n this._outbound.clear();\n this.props.disconnectHandler(reason);\n\n connection.dispose();\n\n this._connectionVerboseProps = {};\n\n return true;\n }\n\n /**\n * Once we've successfully gotten a connection, we need to set up state, attach event listeners, and process\n * initial messages.\n * @param connection - The newly established connection\n */\n private setupNewSuccessfulConnection(connection: IDocumentDeltaConnection, requestedMode: ConnectionMode) {\n // Old connection should have been cleaned up before establishing a new one\n assert(this.connection === undefined, 0x0e6 /* \"old connection exists on new connection setup\" */);\n assert(!connection.disposed, 0x28a /* \"can't be disposed - Callers need to ensure that!\" */);\n\n if (this.pendingConnection) {\n this.pendingConnection = false;\n } else {\n assert(this.closed, 0x27f /* \"reentrancy may result in incorrect behavior\" */);\n }\n this.connection = connection;\n\n // Does information in scopes & mode matches?\n // If we asked for \"write\" and got \"read\", then file is read-only\n // But if we ask read, server can still give us write.\n const readonly = !connection.claims.scopes.includes(ScopeType.DocWrite);\n\n // This connection mode validation logic is moving to the driver layer in 0.44. These two asserts can be\n // removed after those packages have released and become ubiquitous.\n assert(requestedMode === \"read\" || readonly === (this.connectionMode === \"read\"),\n 0x0e7 /* \"claims/connectionMode mismatch\" */);\n assert(!readonly || this.connectionMode === \"read\", 0x0e8 /* \"readonly perf with write connection\" */);\n\n this.set_readonlyPermissions(readonly);\n\n if (this.closed) {\n // Raise proper events, Log telemetry event and close connection.\n this.disconnectFromDeltaStream(\"ConnectionManager already closed\");\n return;\n }\n\n this._outbound.resume();\n\n connection.on(\"op\", this.opHandler);\n connection.on(\"signal\", this.props.signalHandler);\n connection.on(\"nack\", this.nackHandler);\n connection.on(\"disconnect\", this.disconnectHandlerInternal);\n connection.on(\"error\", this.errorHandler);\n connection.on(\"pong\", this.props.pongHandler);\n\n // Initial messages are always sorted. However, due to early op handler installed by drivers and appending those\n // ops to initialMessages, resulting set is no longer sorted, which would result in client hitting storage to\n // fill in gap. We will recover by cancelling this request once we process remaining ops, but it's a waste that\n // we could avoid\n const initialMessages = connection.initialMessages.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\n // Some storages may provide checkpointSequenceNumber to identify how far client is behind.\n let checkpointSequenceNumber = connection.checkpointSequenceNumber;\n\n this._connectionVerboseProps = {\n clientId: connection.clientId,\n mode: connection.mode,\n };\n\n // reset connection props\n this._connectionProps = {};\n\n if (connection.relayServiceAgent !== undefined) {\n this._connectionVerboseProps.relayServiceAgent = connection.relayServiceAgent;\n this._connectionProps.relayServiceAgent = connection.relayServiceAgent;\n }\n this._connectionProps.socketDocumentId = connection.claims.documentId;\n this._connectionProps.connectionMode = connection.mode;\n\n let last = -1;\n if (initialMessages.length !== 0) {\n this._connectionVerboseProps.connectionInitialOpsFrom = initialMessages[0].sequenceNumber;\n last = initialMessages[initialMessages.length - 1].sequenceNumber;\n this._connectionVerboseProps.connectionInitialOpsTo = last + 1;\n // Update knowledge of how far we are behind, before raising \"connect\" event\n // This is duplication of what incomingOpHandler() does, but we have to raise event before we get there,\n // so duplicating update logic here as well.\n if (checkpointSequenceNumber === undefined || checkpointSequenceNumber < last) {\n checkpointSequenceNumber = last;\n }\n }\n\n this.props.incomingOpHandler(\n initialMessages,\n this.connectFirstConnection ? \"InitialOps\" : \"ReconnectOps\");\n\n if (connection.initialSignals !== undefined) {\n for (const signal of connection.initialSignals) {\n this.props.signalHandler(signal);\n }\n }\n\n const details = ConnectionManager.detailsFromConnection(connection);\n details.checkpointSequenceNumber = checkpointSequenceNumber;\n this.props.connectHandler(details);\n\n this.connectFirstConnection = false;\n }\n\n /**\n * Disconnect the current connection and reconnect. Closes the container if it fails.\n * @param connection - The connection that wants to reconnect - no-op if it's different from this.connection\n * @param requestedMode - Read or write\n * @param error - Error reconnect information including whether or not to reconnect\n * @returns A promise that resolves when the connection is reestablished or we stop trying\n */\n private reconnectOnError(\n requestedMode: ConnectionMode,\n error: IAnyDriverError,\n ) {\n this.reconnect(\n requestedMode,\n error.message,\n error)\n .catch(this.props.closeHandler);\n }\n\n /**\n * Disconnect the current connection and reconnect.\n * @param connection - The connection that wants to reconnect - no-op if it's different from this.connection\n * @param requestedMode - Read or write\n * @param error - Error reconnect information including whether or not to reconnect\n * @returns A promise that resolves when the connection is reestablished or we stop trying\n */\n private async reconnect(\n requestedMode: ConnectionMode,\n disconnectMessage: string,\n error?: IAnyDriverError,\n ) {\n // We quite often get protocol errors before / after observing nack/disconnect\n // we do not want to run through same sequence twice.\n // If we're already disconnected/disconnecting it's not appropriate to call this again.\n assert(this.connection !== undefined, 0x0eb /* \"Missing connection for reconnect\" */);\n\n this.disconnectFromDeltaStream(disconnectMessage);\n\n // We will always trigger reconnect, even if canRetry is false.\n // Any truly fatal error state will result in container close upon attempted reconnect,\n // which is a preferable to closing abruptly when a live connection fails.\n if (error !== undefined && !error.canRetry) {\n this.logger.sendTelemetryEvent({\n eventName: \"reconnectingDespiteFatalError\",\n reconnectMode: this.reconnectMode,\n }, error);\n }\n\n if (this.reconnectMode === ReconnectMode.Never) {\n // Do not raise container error if we are closing just because we lost connection.\n // Those errors (like IdleDisconnect) would show up in telemetry dashboards and\n // are very misleading, as first initial reaction - some logic is broken.\n this.props.closeHandler();\n }\n\n // If closed then we can't reconnect\n if (this.closed || this.reconnectMode !== ReconnectMode.Enabled) {\n return;\n }\n\n const delayMs = getRetryDelayFromError(error);\n if (error !== undefined && delayMs !== undefined) {\n this.props.reconnectionDelayHandler(delayMs, error);\n await waitForConnectedState(delayMs);\n }\n\n this.triggerConnect(requestedMode);\n }\n\n public prepareMessageToSend(message: Omit<IDocumentMessage, \"clientSequenceNumber\">): IDocumentMessage | undefined {\n if (this.readonly === true) {\n assert(this.readOnlyInfo.readonly === true, 0x1f0 /* \"Unexpected mismatch in readonly\" */);\n const error = new GenericError(\"deltaManagerReadonlySubmit\", undefined /* error */, {\n readonly: this.readOnlyInfo.readonly,\n forcedReadonly: this.readOnlyInfo.forced,\n readonlyPermissions: this.readOnlyInfo.permissions,\n storageOnly: this.readOnlyInfo.storageOnly,\n });\n this.props.closeHandler(error);\n return undefined;\n }\n\n // reset clientSequenceNumber if we are using new clientId.\n // we keep info about old connection as long as possible to be able to account for all non-acked ops\n // that we pick up on next connection.\n assert(!!this.connection, 0x0e4 /* \"Lost old connection!\" */);\n if (this.lastSubmittedClientId !== this.connection?.clientId) {\n this.lastSubmittedClientId = this.connection?.clientId;\n this.clientSequenceNumber = 0;\n this.clientSequenceNumberObserved = 0;\n }\n\n if (message.type === MessageType.NoOp) {\n this.trailingNoopCount++;\n } else {\n this.trailingNoopCount = 0;\n }\n\n return {\n ...message,\n clientSequenceNumber: ++this.clientSequenceNumber,\n };\n }\n\n public submitSignal(content: any) {\n if (this.connection !== undefined) {\n this.connection.submitSignal(content);\n } else {\n this.logger.sendErrorEvent({ eventName: \"submitSignalDisconnected\" });\n }\n }\n\n public sendMessages(messages: IDocumentMessage[]) {\n assert(this.connected, 0x2b4 /* \"not connected on sending ops!\" */);\n\n // If connection is \"read\" or implicit \"read\" (got leave op for \"write\" connection),\n // then op can't make it through - we will get a nack if op is sent.\n // We can short-circuit this process.\n // Note that we also want nacks to be rare and be treated as catastrophic failures.\n // Be careful with reentrancy though - disconnected event should not be be raised in the\n // middle of the current workflow, but rather on clean stack!\n if (this.connectionMode === \"read\") {\n if (!this.pendingReconnect) {\n this.pendingReconnect = true;\n Promise.resolve().then(async () => {\n if (this.pendingReconnect) { // still valid?\n await this.reconnect(\n \"write\", // connectionMode\n \"Switch to write\", // message\n );\n }\n })\n .catch(() => {});\n }\n return;\n }\n\n assert(!this.pendingReconnect, 0x2b5 /* \"logic error\" */);\n\n this._outbound.push(messages);\n }\n\n public beforeProcessingIncomingOp(message: ISequencedDocumentMessage) {\n // if we have connection, and message is local, then we better treat is as local!\n assert(this.clientId !== message.clientId || this.lastSubmittedClientId === message.clientId,\n 0x0ee /* \"Not accounting local messages correctly\" */,\n );\n\n if (this.lastSubmittedClientId !== undefined && this.lastSubmittedClientId === message.clientId) {\n const clientSequenceNumber = message.clientSequenceNumber;\n\n assert(this.clientSequenceNumberObserved < clientSequenceNumber, 0x0ef /* \"client seq# not growing\" */);\n assert(clientSequenceNumber <= this.clientSequenceNumber,\n 0x0f0 /* \"Incoming local client seq# > generated by this client\" */);\n\n this.clientSequenceNumberObserved = clientSequenceNumber;\n }\n\n if (message.type === MessageType.ClientLeave) {\n const systemLeaveMessage = message as ISequencedDocumentSystemMessage;\n const clientId = JSON.parse(systemLeaveMessage.data) as string;\n if (clientId === this.clientId) {\n // We have been kicked out from quorum\n this.logger.sendPerformanceEvent({ eventName: \"ReadConnectionTransition\" });\n\n // Please see #8483 for more details on why maintaining connection further as is would not work.\n // Short story - connection properties are immutable, and many processes (consensus DDSs, summarizer)\n // assume that connection stays \"write\" connection until disconnect, and act accordingly, which may\n // not work well with de-facto \"read\" connection we are in after receiving own leave op on timeout.\n // Clients need to be able to transition to \"read\" state after some time of inactivity!\n // Note - this may close container!\n this.reconnect(\n \"read\", // connectionMode\n \"Switch to read\", // message\n ).catch((error) => {\n this.logger.sendErrorEvent({ eventName: \"SwitchToReadConnection\"}, error);\n });\n }\n }\n }\n\n private readonly opHandler = (documentId: string, messagesArg: ISequencedDocumentMessage[]) => {\n const messages = Array.isArray(messagesArg) ? messagesArg : [messagesArg];\n this.props.incomingOpHandler(messages, \"opHandler\");\n };\n\n // Always connect in write mode after getting nacked.\n private readonly nackHandler = (documentId: string, messages: INack[]) => {\n const message = messages[0];\n if (this._readonlyPermissions === true) {\n this.props.closeHandler(createWriteError(\"writeOnReadOnlyDocument\", { driverVersion: undefined }));\n return;\n }\n\n const reconnectInfo = getNackReconnectInfo(message.content);\n\n // If the nack indicates we cannot retry, then close the container outright\n if (!reconnectInfo.canRetry) {\n this.props.closeHandler(reconnectInfo);\n return;\n }\n\n this.reconnectOnError(\n \"write\",\n reconnectInfo,\n );\n };\n\n // Connection mode is always read on disconnect/error unless the system mode was write.\n private readonly disconnectHandlerInternal = (disconnectReason: IAnyDriverError) => {\n // Note: we might get multiple disconnect calls on same socket, as early disconnect notification\n // (\"server_disconnect\", ODSP-specific) is mapped to \"disconnect\"\n this.reconnectOnError(\n this.defaultReconnectionMode,\n disconnectReason,\n );\n };\n\n private readonly errorHandler = (error: IAnyDriverError) => {\n this.reconnectOnError(\n this.defaultReconnectionMode,\n error,\n );\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"connectionManager.js","sourceRoot":"","sources":["../src/connectionManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n IDisposable,\n ITelemetryLogger,\n ITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport { assert, performance, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport {\n IDeltaQueue,\n ReadOnlyInfo,\n IConnectionDetails,\n ICriticalContainerError,\n} from \"@fluidframework/container-definitions\";\nimport {\n GenericError,\n} from \"@fluidframework/container-utils\";\nimport {\n IDocumentService,\n IDocumentDeltaConnection,\n IDocumentDeltaConnectionEvents,\n} from \"@fluidframework/driver-definitions\";\nimport {\n canRetryOnError,\n createWriteError,\n createGenericNetworkError,\n getRetryDelayFromError,\n IAnyDriverError,\n waitForConnectedState,\n DeltaStreamConnectionForbiddenError,\n logNetworkFailure,\n} from \"@fluidframework/driver-utils\";\nimport {\n ConnectionMode,\n IClient,\n IClientConfiguration,\n IClientDetails,\n IDocumentMessage,\n INack,\n INackContent,\n ISequencedDocumentMessage,\n ISignalClient,\n ISignalMessage,\n ITokenClaims,\n MessageType,\n ScopeType,\n ISequencedDocumentSystemMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n TelemetryLogger,\n normalizeError,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n ReconnectMode,\n IConnectionManager,\n IConnectionManagerFactoryArgs,\n} from \"./contracts\";\nimport { DeltaQueue } from \"./deltaQueue\";\n\nconst MaxReconnectDelayInMs = 8000;\nconst InitialReconnectDelayInMs = 1000;\nconst DefaultChunkSize = 16 * 1024;\n\nconst fatalConnectErrorProp = { fatalConnectError: true };\n\nfunction getNackReconnectInfo(nackContent: INackContent) {\n const message = `Nack (${nackContent.type}): ${nackContent.message}`;\n const canRetry = nackContent.code !== 403;\n const retryAfterMs = nackContent.retryAfter !== undefined ? nackContent.retryAfter * 1000 : undefined;\n return createGenericNetworkError(\n message,\n { canRetry, retryAfterMs },\n { statusCode: nackContent.code, driverVersion: undefined });\n}\n\n/**\n * Implementation of IDocumentDeltaConnection that does not support submitting\n * or receiving ops. Used in storage-only mode.\n */\nclass NoDeltaStream\n extends TypedEventEmitter<IDocumentDeltaConnectionEvents>\n implements IDocumentDeltaConnection, IDisposable\n{\n clientId: string = \"storage-only client\";\n claims: ITokenClaims = {\n scopes: [ScopeType.DocRead],\n } as any;\n mode: ConnectionMode = \"read\";\n existing: boolean = true;\n maxMessageSize: number = 0;\n version: string = \"\";\n initialMessages: ISequencedDocumentMessage[] = [];\n initialSignals: ISignalMessage[] = [];\n initialClients: ISignalClient[] = [];\n serviceConfiguration: IClientConfiguration = {\n maxMessageSize: 0,\n blockSize: 0,\n summary: undefined as any,\n };\n checkpointSequenceNumber?: number | undefined = undefined;\n submit(messages: IDocumentMessage[]): void {\n this.emit(\"nack\", this.clientId, messages.map((operation) => {\n return {\n operation,\n content: { message: \"Cannot submit with storage-only connection\", code: 403 },\n };\n }));\n }\n submitSignal(message: any): void {\n this.emit(\"nack\", this.clientId, {\n operation: message,\n content: { message: \"Cannot submit signal with storage-only connection\", code: 403 },\n });\n }\n\n private _disposed = false;\n public get disposed() { return this._disposed; }\n public dispose() { this._disposed = true; }\n}\n\n/**\n * Implementation of IConnectionManager, used by Container class\n * Implements constant connectivity to relay service, by reconnecting in case of loast connection or error.\n * Exposes various controls to influecen this process, including manual reconnects, forced read-only mode, etc.\n */\nexport class ConnectionManager implements IConnectionManager {\n /** Connection mode used when reconnecting on error or disconnect. */\n private readonly defaultReconnectionMode: ConnectionMode;\n\n private pendingConnection = false;\n private connection: IDocumentDeltaConnection | undefined;\n\n /** file ACL - whether user has only read-only access to a file */\n private _readonlyPermissions: boolean | undefined;\n\n /** tracks host requiring read-only mode. */\n private _forceReadonly = false;\n\n /**\n * Controls whether the DeltaManager will automatically reconnect to the delta stream after receiving a disconnect.\n */\n private _reconnectMode: ReconnectMode;\n\n /** True if there is pending (async) reconnection from \"read\" to \"write\" */\n private pendingReconnect = false;\n\n private clientSequenceNumber = 0;\n private clientSequenceNumberObserved = 0;\n /** Counts the number of noops sent by the client which may not be acked. */\n private trailingNoopCount = 0;\n\n /** track clientId used last time when we sent any ops */\n private lastSubmittedClientId: string | undefined;\n\n private connectFirstConnection = true;\n\n private _connectionVerboseProps: Record<string, string | number> = {};\n\n private _connectionProps: ITelemetryProperties = {};\n\n private closed = false;\n\n private readonly _outbound: DeltaQueue<IDocumentMessage[]>;\n\n public get connectionVerboseProps() { return this._connectionVerboseProps; }\n\n public readonly clientDetails: IClientDetails;\n\n /**\n * The current connection mode, initially read.\n */\n public get connectionMode(): ConnectionMode {\n return this.connection?.mode ?? \"read\";\n }\n\n public get connected() { return this.connection !== undefined; }\n\n public get clientId() { return this.connection?.clientId; }\n /**\n * Automatic reconnecting enabled or disabled.\n * If set to Never, then reconnecting will never be allowed.\n */\n public get reconnectMode(): ReconnectMode {\n return this._reconnectMode;\n }\n\n public get maxMessageSize(): number {\n return this.connection?.serviceConfiguration?.maxMessageSize\n ?? DefaultChunkSize;\n }\n\n public get version(): string {\n if (this.connection === undefined) {\n throw new Error(\"Cannot check version without a connection\");\n }\n return this.connection.version;\n }\n\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this.connection?.serviceConfiguration;\n }\n\n public get scopes(): string[] | undefined {\n return this.connection?.claims.scopes;\n }\n\n public get outbound(): IDeltaQueue<IDocumentMessage[]> {\n return this._outbound;\n }\n\n /**\n * Returns set of props that can be logged in telemetry that provide some insights / statistics\n * about current or last connection (if there is no connection at the moment)\n */\n public get connectionProps(): ITelemetryProperties {\n if (this.connection !== undefined) {\n return this._connectionProps;\n } else {\n return {\n ...this._connectionProps,\n // Report how many ops this client sent in last disconnected session\n sentOps: this.clientSequenceNumber,\n };\n }\n }\n\n public shouldJoinWrite(): boolean {\n // We don't have to wait for ack for topmost NoOps. So subtract those.\n return this.clientSequenceNumberObserved < (this.clientSequenceNumber - this.trailingNoopCount);\n }\n\n /**\n * Tells if container is in read-only mode.\n * Data stores should listen for \"readonly\" notifications and disallow user\n * making changes to data stores.\n * Readonly state can be because of no storage write permission,\n * or due to host forcing readonly mode for container.\n * It is undefined if we have not yet established websocket connection\n * and do not know if user has write access to a file.\n */\n private get readonly() {\n if (this._forceReadonly) {\n return true;\n }\n return this._readonlyPermissions;\n }\n\n public get readOnlyInfo(): ReadOnlyInfo {\n const storageOnly = this.connection !== undefined && this.connection instanceof NoDeltaStream;\n if (storageOnly || this._forceReadonly || this._readonlyPermissions === true) {\n return {\n readonly: true,\n forced: this._forceReadonly,\n permissions: this._readonlyPermissions,\n storageOnly,\n };\n }\n\n return { readonly: this._readonlyPermissions };\n }\n\n private static detailsFromConnection(connection: IDocumentDeltaConnection): IConnectionDetails {\n return {\n claims: connection.claims,\n clientId: connection.clientId,\n existing: connection.existing,\n checkpointSequenceNumber: connection.checkpointSequenceNumber,\n get initialClients() { return connection.initialClients; },\n mode: connection.mode,\n serviceConfiguration: connection.serviceConfiguration,\n version: connection.version,\n };\n }\n\n constructor(\n private readonly serviceProvider: () => IDocumentService | undefined,\n private client: IClient,\n reconnectAllowed: boolean,\n private readonly logger: ITelemetryLogger,\n private readonly props: IConnectionManagerFactoryArgs,\n ) {\n this.clientDetails = this.client.details;\n this.defaultReconnectionMode = this.client.mode;\n this._reconnectMode = reconnectAllowed ? ReconnectMode.Enabled : ReconnectMode.Never;\n\n // Outbound message queue. The outbound queue is represented as a queue of an array of ops. Ops contained\n // within an array *must* fit within the maxMessageSize and are guaranteed to be ordered sequentially.\n this._outbound = new DeltaQueue<IDocumentMessage[]>(\n (messages) => {\n if (this.connection === undefined) {\n throw new Error(\"Attempted to submit an outbound message without connection\");\n }\n this.connection.submit(messages);\n });\n\n this._outbound.on(\"error\", (error) => {\n this.props.closeHandler(normalizeError(error));\n });\n }\n\n public dispose(error?: ICriticalContainerError) {\n if (this.closed) {\n return;\n }\n this.closed = true;\n\n this.pendingConnection = false;\n\n // Ensure that things like triggerConnect() will short circuit\n this._reconnectMode = ReconnectMode.Never;\n\n this._outbound.clear();\n\n const disconnectReason = error !== undefined\n ? `Closing DeltaManager (${error.message})`\n : \"Closing DeltaManager\";\n\n // This raises \"disconnect\" event if we have active connection.\n this.disconnectFromDeltaStream(disconnectReason);\n\n // Notify everyone we are in read-only state.\n // Useful for data stores in case we hit some critical error,\n // to switch to a mode where user edits are not accepted\n this.set_readonlyPermissions(true);\n }\n\n /**\n * Enables or disables automatic reconnecting.\n * Will throw an error if reconnectMode set to Never.\n */\n public setAutoReconnect(mode: ReconnectMode): void {\n assert(mode !== ReconnectMode.Never && this._reconnectMode !== ReconnectMode.Never,\n 0x278 /* \"API is not supported for non-connecting or closed container\" */);\n\n this._reconnectMode = mode;\n\n if (mode !== ReconnectMode.Enabled) {\n // immediately disconnect - do not rely on service eventually dropping connection.\n this.disconnectFromDeltaStream(\"setAutoReconnect\");\n }\n }\n\n /**\n * Sends signal to runtime (and data stores) to be read-only.\n * Hosts may have read only views, indicating to data stores that no edits are allowed.\n * This is independent from this._readonlyPermissions (permissions) and this.connectionMode\n * (server can return \"write\" mode even when asked for \"read\")\n * Leveraging same \"readonly\" event as runtime & data stores should behave the same in such case\n * as in read-only permissions.\n * But this.active can be used by some DDSes to figure out if ops can be sent\n * (for example, read-only view still participates in code proposals / upgrades decisions)\n *\n * Forcing Readonly does not prevent DDS from generating ops. It is up to user code to honour\n * the readonly flag. If ops are generated, they will accumulate locally and not be sent. If\n * there are pending in the outbound queue, it will stop sending until force readonly is\n * cleared.\n *\n * @param readonly - set or clear force readonly.\n */\n public forceReadonly(readonly: boolean) {\n if (readonly !== this._forceReadonly) {\n this.logger.sendTelemetryEvent({\n eventName: \"ForceReadOnly\",\n value: readonly,\n });\n }\n const oldValue = this.readonly;\n this._forceReadonly = readonly;\n\n if (oldValue !== this.readonly) {\n assert(this._reconnectMode !== ReconnectMode.Never,\n 0x279 /* \"API is not supported for non-connecting or closed container\" */);\n\n let reconnect = false;\n if (this.readonly === true) {\n // If we switch to readonly while connected, we should disconnect first\n // See comment in the \"readonly\" event handler to deltaManager set up by\n // the ContainerRuntime constructor\n\n if (this.shouldJoinWrite()) {\n // If we have pending changes, then we will never send them - it smells like\n // host logic error.\n this.logger.sendErrorEvent({ eventName: \"ForceReadonlyPendingChanged\" });\n }\n\n reconnect = this.disconnectFromDeltaStream(\"Force readonly\");\n }\n this.props.readonlyChangeHandler(this.readonly);\n if (reconnect) {\n // reconnect if we disconnected from before.\n this.triggerConnect(\"read\");\n }\n }\n }\n\n private set_readonlyPermissions(readonly: boolean) {\n const oldValue = this.readonly;\n this._readonlyPermissions = readonly;\n if (oldValue !== this.readonly) {\n this.props.readonlyChangeHandler(this.readonly);\n }\n }\n\n public connect(connectionMode?: ConnectionMode) {\n this.connectCore(connectionMode).catch((error) => {\n const normalizedError = normalizeError(error, { props: fatalConnectErrorProp });\n this.props.closeHandler(normalizedError);\n });\n }\n\n private async connectCore(connectionMode?: ConnectionMode): Promise<void> {\n assert(!this.closed, 0x26a /* \"not closed\" */);\n\n if (this.connection !== undefined || this.pendingConnection) {\n return;\n }\n\n let requestedMode = connectionMode ?? this.defaultReconnectionMode;\n\n // if we have any non-acked ops from last connection, reconnect as \"write\".\n // without that we would connect in view-only mode, which will result in immediate\n // firing of \"connected\" event from Container and switch of current clientId (as tracked\n // by all DDSes). This will make it impossible to figure out if ops actually made it through,\n // so DDSes will immediately resubmit all pending ops, and some of them will be duplicates, corrupting document\n if (this.shouldJoinWrite()) {\n requestedMode = \"write\";\n }\n\n const docService = this.serviceProvider();\n assert(docService !== undefined, 0x2a7 /* \"Container is not attached\" */);\n\n let connection: IDocumentDeltaConnection | undefined;\n\n if (docService.policies?.storageOnly === true) {\n connection = new NoDeltaStream();\n // to keep setupNewSuccessfulConnection happy\n this.pendingConnection = true;\n this.setupNewSuccessfulConnection(connection, \"read\");\n assert(!this.pendingConnection, 0x2b3 /* \"logic error\" */);\n return;\n }\n\n // this.pendingConnection resets to false as soon as we know the outcome of the connection attempt\n this.pendingConnection = true;\n\n let delayMs = InitialReconnectDelayInMs;\n let connectRepeatCount = 0;\n const connectStartTime = performance.now();\n let lastError: any;\n\n // This loop will keep trying to connect until successful, with a delay between each iteration.\n while (connection === undefined) {\n if (this.closed) {\n throw new Error(\"Attempting to connect a closed DeltaManager\");\n }\n connectRepeatCount++;\n\n try {\n this.client.mode = requestedMode;\n connection = await docService.connectToDeltaStream(this.client);\n\n if (connection.disposed) {\n // Nobody observed this connection, so drop it on the floor and retry.\n this.logger.sendTelemetryEvent({ eventName: \"ReceivedClosedConnection\" });\n connection = undefined;\n }\n } catch (origError: any) {\n if (typeof origError === \"object\" && origError !== null &&\n origError?.errorType === DeltaStreamConnectionForbiddenError.errorType) {\n connection = new NoDeltaStream();\n requestedMode = \"read\";\n break;\n }\n\n // Socket.io error when we connect to wrong socket, or hit some multiplexing bug\n if (!canRetryOnError(origError)) {\n const error = normalizeError(origError, { props: fatalConnectErrorProp });\n this.props.closeHandler(error);\n throw error;\n }\n\n // Since the error is retryable this will not log to the error table\n logNetworkFailure(\n this.logger,\n {\n attempts: connectRepeatCount,\n delay: delayMs, // milliseconds\n eventName: \"DeltaConnectionFailureToConnect\",\n duration: TelemetryLogger.formatTick(performance.now() - connectStartTime),\n },\n origError);\n\n lastError = origError;\n\n const retryDelayFromError = getRetryDelayFromError(origError);\n delayMs = retryDelayFromError ?? Math.min(delayMs * 2, MaxReconnectDelayInMs);\n\n if (retryDelayFromError !== undefined) {\n this.props.reconnectionDelayHandler(retryDelayFromError, origError);\n }\n await waitForConnectedState(delayMs);\n }\n }\n\n // If we retried more than once, log an event about how long it took (this will not log to error table)\n if (connectRepeatCount > 1) {\n logNetworkFailure(\n this.logger,\n {\n eventName: \"MultipleDeltaConnectionFailures\",\n attempts: connectRepeatCount,\n duration: TelemetryLogger.formatTick(performance.now() - connectStartTime),\n },\n lastError,\n );\n }\n\n this.setupNewSuccessfulConnection(connection, requestedMode);\n }\n\n /**\n * Start the connection. Any error should result in container being close.\n * And report the error if it excape for any reason.\n * @param args - The connection arguments\n */\n private triggerConnect(connectionMode: ConnectionMode) {\n assert(this.connection === undefined, 0x239 /* \"called only in disconnected state\" */);\n if (this.reconnectMode !== ReconnectMode.Enabled) {\n return;\n }\n this.connect(connectionMode);\n }\n\n /**\n * Disconnect the current connection.\n * @param reason - Text description of disconnect reason to emit with disconnect event\n */\n private disconnectFromDeltaStream(reason: string): boolean {\n this.pendingReconnect = false;\n\n if (this.connection === undefined) {\n return false;\n }\n\n assert(!this.pendingConnection, 0x27b /* \"reentrancy may result in incorrect behavior\" */);\n\n const connection = this.connection;\n // Avoid any re-entrancy - clear object reference\n this.connection = undefined;\n\n // Remove listeners first so we don't try to retrigger this flow accidentally through reconnectOnError\n connection.off(\"op\", this.opHandler);\n connection.off(\"signal\", this.props.signalHandler);\n connection.off(\"nack\", this.nackHandler);\n connection.off(\"disconnect\", this.disconnectHandlerInternal);\n connection.off(\"error\", this.errorHandler);\n connection.off(\"pong\", this.props.pongHandler);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._outbound.pause();\n this._outbound.clear();\n this.props.disconnectHandler(reason);\n\n connection.dispose();\n\n this._connectionVerboseProps = {};\n\n return true;\n }\n\n /**\n * Once we've successfully gotten a connection, we need to set up state, attach event listeners, and process\n * initial messages.\n * @param connection - The newly established connection\n */\n private setupNewSuccessfulConnection(connection: IDocumentDeltaConnection, requestedMode: ConnectionMode) {\n // Old connection should have been cleaned up before establishing a new one\n assert(this.connection === undefined, 0x0e6 /* \"old connection exists on new connection setup\" */);\n assert(!connection.disposed, 0x28a /* \"can't be disposed - Callers need to ensure that!\" */);\n\n if (this.pendingConnection) {\n this.pendingConnection = false;\n } else {\n assert(this.closed, 0x27f /* \"reentrancy may result in incorrect behavior\" */);\n }\n this.connection = connection;\n\n // Does information in scopes & mode matches?\n // If we asked for \"write\" and got \"read\", then file is read-only\n // But if we ask read, server can still give us write.\n const readonly = !connection.claims.scopes.includes(ScopeType.DocWrite);\n\n // This connection mode validation logic is moving to the driver layer in 0.44. These two asserts can be\n // removed after those packages have released and become ubiquitous.\n assert(requestedMode === \"read\" || readonly === (this.connectionMode === \"read\"),\n 0x0e7 /* \"claims/connectionMode mismatch\" */);\n assert(!readonly || this.connectionMode === \"read\", 0x0e8 /* \"readonly perf with write connection\" */);\n\n this.set_readonlyPermissions(readonly);\n\n if (this.closed) {\n // Raise proper events, Log telemetry event and close connection.\n this.disconnectFromDeltaStream(\"ConnectionManager already closed\");\n return;\n }\n\n this._outbound.resume();\n\n connection.on(\"op\", this.opHandler);\n connection.on(\"signal\", this.props.signalHandler);\n connection.on(\"nack\", this.nackHandler);\n connection.on(\"disconnect\", this.disconnectHandlerInternal);\n connection.on(\"error\", this.errorHandler);\n connection.on(\"pong\", this.props.pongHandler);\n\n // Initial messages are always sorted. However, due to early op handler installed by drivers and appending those\n // ops to initialMessages, resulting set is no longer sorted, which would result in client hitting storage to\n // fill in gap. We will recover by cancelling this request once we process remaining ops, but it's a waste that\n // we could avoid\n const initialMessages = connection.initialMessages.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\n // Some storages may provide checkpointSequenceNumber to identify how far client is behind.\n let checkpointSequenceNumber = connection.checkpointSequenceNumber;\n\n this._connectionVerboseProps = {\n clientId: connection.clientId,\n mode: connection.mode,\n };\n\n // reset connection props\n this._connectionProps = {};\n\n if (connection.relayServiceAgent !== undefined) {\n this._connectionVerboseProps.relayServiceAgent = connection.relayServiceAgent;\n this._connectionProps.relayServiceAgent = connection.relayServiceAgent;\n }\n this._connectionProps.socketDocumentId = connection.claims.documentId;\n this._connectionProps.connectionMode = connection.mode;\n\n let last = -1;\n if (initialMessages.length !== 0) {\n this._connectionVerboseProps.connectionInitialOpsFrom = initialMessages[0].sequenceNumber;\n last = initialMessages[initialMessages.length - 1].sequenceNumber;\n this._connectionVerboseProps.connectionInitialOpsTo = last + 1;\n // Update knowledge of how far we are behind, before raising \"connect\" event\n // This is duplication of what incomingOpHandler() does, but we have to raise event before we get there,\n // so duplicating update logic here as well.\n if (checkpointSequenceNumber === undefined || checkpointSequenceNumber < last) {\n checkpointSequenceNumber = last;\n }\n }\n\n this.props.incomingOpHandler(\n initialMessages,\n this.connectFirstConnection ? \"InitialOps\" : \"ReconnectOps\");\n\n if (connection.initialSignals !== undefined) {\n for (const signal of connection.initialSignals) {\n this.props.signalHandler(signal);\n }\n }\n\n const details = ConnectionManager.detailsFromConnection(connection);\n details.checkpointSequenceNumber = checkpointSequenceNumber;\n this.props.connectHandler(details);\n\n this.connectFirstConnection = false;\n }\n\n /**\n * Disconnect the current connection and reconnect. Closes the container if it fails.\n * @param connection - The connection that wants to reconnect - no-op if it's different from this.connection\n * @param requestedMode - Read or write\n * @param error - Error reconnect information including whether or not to reconnect\n * @returns A promise that resolves when the connection is reestablished or we stop trying\n */\n private reconnectOnError(\n requestedMode: ConnectionMode,\n error: IAnyDriverError,\n ) {\n this.reconnect(\n requestedMode,\n error.message,\n error)\n .catch(this.props.closeHandler);\n }\n\n /**\n * Disconnect the current connection and reconnect.\n * @param connection - The connection that wants to reconnect - no-op if it's different from this.connection\n * @param requestedMode - Read or write\n * @param error - Error reconnect information including whether or not to reconnect\n * @returns A promise that resolves when the connection is reestablished or we stop trying\n */\n private async reconnect(\n requestedMode: ConnectionMode,\n disconnectMessage: string,\n error?: IAnyDriverError,\n ) {\n // We quite often get protocol errors before / after observing nack/disconnect\n // we do not want to run through same sequence twice.\n // If we're already disconnected/disconnecting it's not appropriate to call this again.\n assert(this.connection !== undefined, 0x0eb /* \"Missing connection for reconnect\" */);\n\n this.disconnectFromDeltaStream(disconnectMessage);\n\n // We will always trigger reconnect, even if canRetry is false.\n // Any truly fatal error state will result in container close upon attempted reconnect,\n // which is a preferable to closing abruptly when a live connection fails.\n if (error !== undefined && !error.canRetry) {\n this.logger.sendTelemetryEvent({\n eventName: \"reconnectingDespiteFatalError\",\n reconnectMode: this.reconnectMode,\n }, error);\n }\n\n if (this.reconnectMode === ReconnectMode.Never) {\n // Do not raise container error if we are closing just because we lost connection.\n // Those errors (like IdleDisconnect) would show up in telemetry dashboards and\n // are very misleading, as first initial reaction - some logic is broken.\n this.props.closeHandler();\n }\n\n // If closed then we can't reconnect\n if (this.closed || this.reconnectMode !== ReconnectMode.Enabled) {\n return;\n }\n\n const delayMs = getRetryDelayFromError(error);\n if (error !== undefined && delayMs !== undefined) {\n this.props.reconnectionDelayHandler(delayMs, error);\n await waitForConnectedState(delayMs);\n }\n\n this.triggerConnect(requestedMode);\n }\n\n public prepareMessageToSend(message: Omit<IDocumentMessage, \"clientSequenceNumber\">): IDocumentMessage | undefined {\n if (this.readonly === true) {\n assert(this.readOnlyInfo.readonly === true, 0x1f0 /* \"Unexpected mismatch in readonly\" */);\n const error = new GenericError(\"deltaManagerReadonlySubmit\", undefined /* error */, {\n readonly: this.readOnlyInfo.readonly,\n forcedReadonly: this.readOnlyInfo.forced,\n readonlyPermissions: this.readOnlyInfo.permissions,\n storageOnly: this.readOnlyInfo.storageOnly,\n });\n this.props.closeHandler(error);\n return undefined;\n }\n\n // reset clientSequenceNumber if we are using new clientId.\n // we keep info about old connection as long as possible to be able to account for all non-acked ops\n // that we pick up on next connection.\n assert(!!this.connection, 0x0e4 /* \"Lost old connection!\" */);\n if (this.lastSubmittedClientId !== this.connection?.clientId) {\n this.lastSubmittedClientId = this.connection?.clientId;\n this.clientSequenceNumber = 0;\n this.clientSequenceNumberObserved = 0;\n }\n\n if (message.type === MessageType.NoOp) {\n this.trailingNoopCount++;\n } else {\n this.trailingNoopCount = 0;\n }\n\n return {\n ...message,\n clientSequenceNumber: ++this.clientSequenceNumber,\n };\n }\n\n public submitSignal(content: any) {\n if (this.connection !== undefined) {\n this.connection.submitSignal(content);\n } else {\n this.logger.sendErrorEvent({ eventName: \"submitSignalDisconnected\" });\n }\n }\n\n public sendMessages(messages: IDocumentMessage[]) {\n assert(this.connected, 0x2b4 /* \"not connected on sending ops!\" */);\n\n // If connection is \"read\" or implicit \"read\" (got leave op for \"write\" connection),\n // then op can't make it through - we will get a nack if op is sent.\n // We can short-circuit this process.\n // Note that we also want nacks to be rare and be treated as catastrophic failures.\n // Be careful with reentrancy though - disconnected event should not be be raised in the\n // middle of the current workflow, but rather on clean stack!\n if (this.connectionMode === \"read\") {\n if (!this.pendingReconnect) {\n this.pendingReconnect = true;\n Promise.resolve().then(async () => {\n if (this.pendingReconnect) { // still valid?\n await this.reconnect(\n \"write\", // connectionMode\n \"Switch to write\", // message\n );\n }\n })\n .catch(() => {});\n }\n return;\n }\n\n assert(!this.pendingReconnect, 0x2b5 /* \"logic error\" */);\n\n this._outbound.push(messages);\n }\n\n public beforeProcessingIncomingOp(message: ISequencedDocumentMessage) {\n // if we have connection, and message is local, then we better treat is as local!\n assert(this.clientId !== message.clientId || this.lastSubmittedClientId === message.clientId,\n 0x0ee /* \"Not accounting local messages correctly\" */,\n );\n\n if (this.lastSubmittedClientId !== undefined && this.lastSubmittedClientId === message.clientId) {\n const clientSequenceNumber = message.clientSequenceNumber;\n\n assert(this.clientSequenceNumberObserved < clientSequenceNumber, 0x0ef /* \"client seq# not growing\" */);\n assert(clientSequenceNumber <= this.clientSequenceNumber,\n 0x0f0 /* \"Incoming local client seq# > generated by this client\" */);\n\n this.clientSequenceNumberObserved = clientSequenceNumber;\n }\n\n if (message.type === MessageType.ClientLeave) {\n const systemLeaveMessage = message as ISequencedDocumentSystemMessage;\n const clientId = JSON.parse(systemLeaveMessage.data) as string;\n if (clientId === this.clientId) {\n // We have been kicked out from quorum\n this.logger.sendPerformanceEvent({ eventName: \"ReadConnectionTransition\" });\n\n // Please see #8483 for more details on why maintaining connection further as is would not work.\n // Short story - connection properties are immutable, and many processes (consensus DDSs, summarizer)\n // assume that connection stays \"write\" connection until disconnect, and act accordingly, which may\n // not work well with de-facto \"read\" connection we are in after receiving own leave op on timeout.\n // Clients need to be able to transition to \"read\" state after some time of inactivity!\n // Note - this may close container!\n this.reconnect(\n \"read\", // connectionMode\n \"Switch to read\", // message\n ).catch((error) => {\n this.logger.sendErrorEvent({ eventName: \"SwitchToReadConnection\"}, error);\n });\n }\n }\n }\n\n private readonly opHandler = (documentId: string, messagesArg: ISequencedDocumentMessage[]) => {\n const messages = Array.isArray(messagesArg) ? messagesArg : [messagesArg];\n this.props.incomingOpHandler(messages, \"opHandler\");\n };\n\n // Always connect in write mode after getting nacked.\n private readonly nackHandler = (documentId: string, messages: INack[]) => {\n const message = messages[0];\n if (this._readonlyPermissions === true) {\n this.props.closeHandler(createWriteError(\"writeOnReadOnlyDocument\", { driverVersion: undefined }));\n return;\n }\n\n const reconnectInfo = getNackReconnectInfo(message.content);\n\n // If the nack indicates we cannot retry, then close the container outright\n if (!reconnectInfo.canRetry) {\n this.props.closeHandler(reconnectInfo);\n return;\n }\n\n this.reconnectOnError(\n \"write\",\n reconnectInfo,\n );\n };\n\n // Connection mode is always read on disconnect/error unless the system mode was write.\n private readonly disconnectHandlerInternal = (disconnectReason: IAnyDriverError) => {\n // Note: we might get multiple disconnect calls on same socket, as early disconnect notification\n // (\"server_disconnect\", ODSP-specific) is mapped to \"disconnect\"\n this.reconnectOnError(\n this.defaultReconnectionMode,\n disconnectReason,\n );\n };\n\n private readonly errorHandler = (error: IAnyDriverError) => {\n this.reconnectOnError(\n this.defaultReconnectionMode,\n error,\n );\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerContext.d.ts","sourceRoot":"","sources":["../src/containerContext.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EACH,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,OAAO,EAEP,uBAAuB,EACvB,WAAW,EACX,cAAc,EAGd,iBAAiB,EAGjB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"containerContext.d.ts","sourceRoot":"","sources":["../src/containerContext.ts"],"names":[],"mappings":"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"}
|
package/dist/containerContext.js
CHANGED
|
@@ -192,6 +192,10 @@ class ContainerContext {
|
|
|
192
192
|
});
|
|
193
193
|
}
|
|
194
194
|
async loadCodeModule(codeDetails) {
|
|
195
|
+
// load may actually produce a IFluidModule if using a legacy ICodeLoader.
|
|
196
|
+
// Because the type system currently does not capture this in load,
|
|
197
|
+
// explicitly declare the type here to support both cases.
|
|
198
|
+
// See also comment about this below.
|
|
195
199
|
const loadCodeResult = await telemetry_utils_1.PerformanceEvent.timedExecAsync(this.taggedLogger, { eventName: "CodeLoad" }, async () => this.codeLoader.load(codeDetails));
|
|
196
200
|
if ("module" in loadCodeResult) {
|
|
197
201
|
const { module, details } = loadCodeResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerContext.js","sourceRoot":"","sources":["../src/containerContext.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, LazyPromise } from \"@fluidframework/common-utils\";\nimport {\n IAudience,\n IContainerContext,\n IDeltaManager,\n ILoader,\n IRuntime,\n ICriticalContainerError,\n AttachState,\n ILoaderOptions,\n IRuntimeFactory,\n IProvideRuntimeFactory,\n IFluidCodeDetails,\n IFluidCodeDetailsComparer,\n IProvideFluidCodeDetailsComparer,\n ICodeDetailsLoader,\n IFluidModuleWithDetails,\n} from \"@fluidframework/container-definitions\";\nimport {\n IRequest,\n IResponse,\n FluidObject,\n} from \"@fluidframework/core-interfaces\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { isFluidResolvedUrl } from \"@fluidframework/driver-utils\";\nimport {\n IClientConfiguration,\n IClientDetails,\n IDocumentMessage,\n IQuorum,\n IQuorumClients,\n ISequencedDocumentMessage,\n ISignalMessage,\n ISnapshotTree,\n ISummaryTree,\n IVersion,\n MessageType,\n} from \"@fluidframework/protocol-definitions\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { Container } from \"./container\";\n\nconst PackageNotFactoryError = \"Code package does not implement IRuntimeFactory\";\n\nexport class ContainerContext implements IContainerContext {\n public static async createOrLoad(\n container: Container,\n scope: FluidObject,\n codeLoader: ICodeDetailsLoader,\n codeDetails: IFluidCodeDetails,\n baseSnapshot: ISnapshotTree | undefined,\n deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n quorum: IQuorum,\n loader: ILoader,\n submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number,\n submitSignalFn: (contents: any) => void,\n closeFn: (error?: ICriticalContainerError) => void,\n version: string,\n updateDirtyContainerState: (dirty: boolean) => void,\n existing: boolean,\n pendingLocalState?: unknown,\n ): Promise<ContainerContext> {\n const context = new ContainerContext(\n container,\n scope,\n codeLoader,\n codeDetails,\n baseSnapshot,\n deltaManager,\n quorum,\n loader,\n submitFn,\n submitSignalFn,\n closeFn,\n version,\n updateDirtyContainerState,\n existing,\n pendingLocalState);\n await context.instantiateRuntime(existing);\n return context;\n }\n\n public readonly taggedLogger: ITelemetryLogger;\n\n public get clientId(): string | undefined {\n return this.container.clientId;\n }\n\n /** @deprecated Added back to unblock 0.56 integration */\n public get id(): string {\n const resolvedUrl = this.container.resolvedUrl;\n if (isFluidResolvedUrl(resolvedUrl)) {\n return resolvedUrl.id;\n }\n return \"\";\n }\n\n public get clientDetails(): IClientDetails {\n return this.container.clientDetails;\n }\n\n public get connected(): boolean {\n return this.container.connected;\n }\n\n public get canSummarize(): boolean {\n return \"summarize\" in this.runtime;\n }\n\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this.container.serviceConfiguration;\n }\n\n public get audience(): IAudience {\n return this.container.audience;\n }\n\n public get options(): ILoaderOptions {\n return this.container.options;\n }\n\n public get baseSnapshot() {\n return this._baseSnapshot;\n }\n\n public get storage(): IDocumentStorageService {\n return this.container.storage;\n }\n\n private _runtime: IRuntime | undefined;\n private get runtime() {\n if (this._runtime === undefined) {\n throw new Error(\"Attempted to access runtime before it was defined\");\n }\n return this._runtime;\n }\n\n private _disposed = false;\n\n public get disposed() {\n return this._disposed;\n }\n\n public get codeDetails() { return this._codeDetails; }\n\n private readonly _quorum: IQuorum;\n public get quorum(): IQuorumClients { return this._quorum; }\n\n private readonly _fluidModuleP: Promise<IFluidModuleWithDetails>;\n\n constructor(\n private readonly container: Container,\n public readonly scope: FluidObject,\n private readonly codeLoader: ICodeDetailsLoader,\n private readonly _codeDetails: IFluidCodeDetails,\n private readonly _baseSnapshot: ISnapshotTree | undefined,\n public readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n quorum: IQuorum,\n public readonly loader: ILoader,\n public readonly submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number,\n public readonly submitSignalFn: (contents: any) => void,\n public readonly closeFn: (error?: ICriticalContainerError) => void,\n public readonly version: string,\n public readonly updateDirtyContainerState: (dirty: boolean) => void,\n public readonly existing: boolean,\n public readonly pendingLocalState?: unknown,\n\n ) {\n this._quorum = quorum;\n this.taggedLogger = container.subLogger;\n this._fluidModuleP = new LazyPromise<IFluidModuleWithDetails>(\n async () => this.loadCodeModule(_codeDetails),\n );\n this.attachListener();\n }\n\n /**\n * @deprecated - Temporary migratory API, to be removed when customers no longer need it. When removed,\n * ContainerContext should only take an IQuorumClients rather than an IQuorum. See IContainerContext for more\n * details.\n */\n public getSpecifiedCodeDetails(): IFluidCodeDetails | undefined {\n return (this._quorum.get(\"code\") ?? this._quorum.get(\"code2\")) as IFluidCodeDetails | undefined;\n }\n\n public dispose(error?: Error): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n\n this.runtime.dispose(error);\n this._quorum.dispose();\n this.deltaManager.dispose();\n }\n\n public getLoadedFromVersion(): IVersion | undefined {\n return this.container.loadedFromVersion;\n }\n\n public get attachState(): AttachState {\n return this.container.attachState;\n }\n\n /**\n * Create a summary. Used when attaching or serializing a detached container.\n *\n * @param blobRedirectTable - A table passed during the attach process. While detached, blob upload is supported\n * using IDs generated locally. After attach, these IDs cannot be used, so this table maps the old local IDs to the\n * new storage IDs so requests can be redirected.\n */\n public createSummary(blobRedirectTable?: Map<string, string>): ISummaryTree {\n return this.runtime.createSummary(blobRedirectTable);\n }\n\n public setConnectionState(connected: boolean, clientId?: string) {\n const runtime = this.runtime;\n\n assert(connected === this.connected, 0x0de /* \"Mismatch in connection state while setting\" */);\n\n runtime.setConnectionState(connected, clientId);\n }\n\n public process(message: ISequencedDocumentMessage, local: boolean, context: any) {\n this.runtime.process(message, local, context);\n }\n\n public processSignal(message: ISignalMessage, local: boolean) {\n this.runtime.processSignal(message, local);\n }\n\n public async request(path: IRequest): Promise<IResponse> {\n return this.runtime.request(path);\n }\n\n public async getAbsoluteUrl(relativeUrl: string): Promise<string | undefined> {\n return this.container.getAbsoluteUrl(relativeUrl);\n }\n\n public getPendingLocalState(): unknown {\n return this.runtime.getPendingLocalState();\n }\n\n /**\n * Determines if the current code details of the context\n * satisfy the incoming constraint code details\n */\n public async satisfies(constraintCodeDetails: IFluidCodeDetails) {\n const comparers: IFluidCodeDetailsComparer[] = [];\n\n const maybeCompareCodeLoader = this.codeLoader;\n if (maybeCompareCodeLoader.IFluidCodeDetailsComparer !== undefined) {\n comparers.push(maybeCompareCodeLoader.IFluidCodeDetailsComparer);\n }\n\n const moduleWithDetails = await this._fluidModuleP;\n const maybeCompareExport: Partial<IProvideFluidCodeDetailsComparer> | undefined =\n moduleWithDetails.module?.fluidExport;\n if (maybeCompareExport?.IFluidCodeDetailsComparer !== undefined) {\n comparers.push(maybeCompareExport.IFluidCodeDetailsComparer);\n }\n\n // if there are not comparers it is not possible to know\n // if the current satisfy the incoming, so return false,\n // as assuming they do not satisfy is safer .e.g we will\n // reload, rather than potentially running with\n // incompatible code\n if (comparers.length === 0) {\n return false;\n }\n\n for (const comparer of comparers) {\n const satisfies = await comparer.satisfies(\n moduleWithDetails.details,\n constraintCodeDetails,\n );\n if (satisfies === false) {\n return false;\n }\n }\n return true;\n }\n\n public notifyAttaching() {\n this.runtime.setAttachState(AttachState.Attaching);\n }\n\n // #region private\n\n private async getRuntimeFactory(): Promise<IRuntimeFactory> {\n const fluidExport: FluidObject<IProvideRuntimeFactory> | undefined =\n (await this._fluidModuleP).module?.fluidExport;\n const runtimeFactory = fluidExport?.IRuntimeFactory;\n if (runtimeFactory === undefined) {\n throw new Error(PackageNotFactoryError);\n }\n\n return runtimeFactory;\n }\n\n private async instantiateRuntime(existing: boolean) {\n const runtimeFactory = await this.getRuntimeFactory();\n this._runtime = await runtimeFactory.instantiateRuntime(this, existing);\n }\n\n private attachListener() {\n this.container.once(\"attached\", () => {\n this.runtime.setAttachState(AttachState.Attached);\n });\n }\n\n private async loadCodeModule(codeDetails: IFluidCodeDetails) {\n const loadCodeResult = await PerformanceEvent.timedExecAsync(\n this.taggedLogger,\n { eventName: \"CodeLoad\" },\n async () => this.codeLoader.load(codeDetails),\n );\n\n if (\"module\" in loadCodeResult) {\n const { module, details } = loadCodeResult;\n return {\n module,\n details: details ?? codeDetails,\n };\n } else {\n // If \"module\" is not in the result, we are using a legacy ICodeLoader. Fix the result up with details.\n // Once usage drops to 0 we can remove this compat path.\n this.taggedLogger.sendTelemetryEvent({ eventName: \"LegacyCodeLoader\" });\n return { module: loadCodeResult, details: codeDetails };\n }\n }\n // #endregion\n}\n"]}
|
|
1
|
+
{"version":3,"file":"containerContext.js","sourceRoot":"","sources":["../src/containerContext.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, LazyPromise } from \"@fluidframework/common-utils\";\nimport {\n IAudience,\n IContainerContext,\n IDeltaManager,\n ILoader,\n IRuntime,\n ICriticalContainerError,\n AttachState,\n ILoaderOptions,\n IRuntimeFactory,\n IProvideRuntimeFactory,\n IFluidCodeDetails,\n IFluidCodeDetailsComparer,\n IProvideFluidCodeDetailsComparer,\n ICodeDetailsLoader,\n IFluidModuleWithDetails,\n IFluidModule,\n} from \"@fluidframework/container-definitions\";\nimport {\n IRequest,\n IResponse,\n FluidObject,\n} from \"@fluidframework/core-interfaces\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { isFluidResolvedUrl } from \"@fluidframework/driver-utils\";\nimport {\n IClientConfiguration,\n IClientDetails,\n IDocumentMessage,\n IQuorum,\n IQuorumClients,\n ISequencedDocumentMessage,\n ISignalMessage,\n ISnapshotTree,\n ISummaryTree,\n IVersion,\n MessageType,\n} from \"@fluidframework/protocol-definitions\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { Container } from \"./container\";\n\nconst PackageNotFactoryError = \"Code package does not implement IRuntimeFactory\";\n\nexport class ContainerContext implements IContainerContext {\n public static async createOrLoad(\n container: Container,\n scope: FluidObject,\n codeLoader: ICodeDetailsLoader,\n codeDetails: IFluidCodeDetails,\n baseSnapshot: ISnapshotTree | undefined,\n deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n quorum: IQuorum,\n loader: ILoader,\n submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number,\n submitSignalFn: (contents: any) => void,\n closeFn: (error?: ICriticalContainerError) => void,\n version: string,\n updateDirtyContainerState: (dirty: boolean) => void,\n existing: boolean,\n pendingLocalState?: unknown,\n ): Promise<ContainerContext> {\n const context = new ContainerContext(\n container,\n scope,\n codeLoader,\n codeDetails,\n baseSnapshot,\n deltaManager,\n quorum,\n loader,\n submitFn,\n submitSignalFn,\n closeFn,\n version,\n updateDirtyContainerState,\n existing,\n pendingLocalState);\n await context.instantiateRuntime(existing);\n return context;\n }\n\n public readonly taggedLogger: ITelemetryLogger;\n\n public get clientId(): string | undefined {\n return this.container.clientId;\n }\n\n /** @deprecated Added back to unblock 0.56 integration */\n public get id(): string {\n const resolvedUrl = this.container.resolvedUrl;\n if (isFluidResolvedUrl(resolvedUrl)) {\n return resolvedUrl.id;\n }\n return \"\";\n }\n\n public get clientDetails(): IClientDetails {\n return this.container.clientDetails;\n }\n\n public get connected(): boolean {\n return this.container.connected;\n }\n\n public get canSummarize(): boolean {\n return \"summarize\" in this.runtime;\n }\n\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this.container.serviceConfiguration;\n }\n\n public get audience(): IAudience {\n return this.container.audience;\n }\n\n public get options(): ILoaderOptions {\n return this.container.options;\n }\n\n public get baseSnapshot() {\n return this._baseSnapshot;\n }\n\n public get storage(): IDocumentStorageService {\n return this.container.storage;\n }\n\n private _runtime: IRuntime | undefined;\n private get runtime() {\n if (this._runtime === undefined) {\n throw new Error(\"Attempted to access runtime before it was defined\");\n }\n return this._runtime;\n }\n\n private _disposed = false;\n\n public get disposed() {\n return this._disposed;\n }\n\n public get codeDetails() { return this._codeDetails; }\n\n private readonly _quorum: IQuorum;\n public get quorum(): IQuorumClients { return this._quorum; }\n\n private readonly _fluidModuleP: Promise<IFluidModuleWithDetails>;\n\n constructor(\n private readonly container: Container,\n public readonly scope: FluidObject,\n private readonly codeLoader: ICodeDetailsLoader,\n private readonly _codeDetails: IFluidCodeDetails,\n private readonly _baseSnapshot: ISnapshotTree | undefined,\n public readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n quorum: IQuorum,\n public readonly loader: ILoader,\n public readonly submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number,\n public readonly submitSignalFn: (contents: any) => void,\n public readonly closeFn: (error?: ICriticalContainerError) => void,\n public readonly version: string,\n public readonly updateDirtyContainerState: (dirty: boolean) => void,\n public readonly existing: boolean,\n public readonly pendingLocalState?: unknown,\n\n ) {\n this._quorum = quorum;\n this.taggedLogger = container.subLogger;\n this._fluidModuleP = new LazyPromise<IFluidModuleWithDetails>(\n async () => this.loadCodeModule(_codeDetails),\n );\n this.attachListener();\n }\n\n /**\n * @deprecated - Temporary migratory API, to be removed when customers no longer need it. When removed,\n * ContainerContext should only take an IQuorumClients rather than an IQuorum. See IContainerContext for more\n * details.\n */\n public getSpecifiedCodeDetails(): IFluidCodeDetails | undefined {\n return (this._quorum.get(\"code\") ?? this._quorum.get(\"code2\")) as IFluidCodeDetails | undefined;\n }\n\n public dispose(error?: Error): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n\n this.runtime.dispose(error);\n this._quorum.dispose();\n this.deltaManager.dispose();\n }\n\n public getLoadedFromVersion(): IVersion | undefined {\n return this.container.loadedFromVersion;\n }\n\n public get attachState(): AttachState {\n return this.container.attachState;\n }\n\n /**\n * Create a summary. Used when attaching or serializing a detached container.\n *\n * @param blobRedirectTable - A table passed during the attach process. While detached, blob upload is supported\n * using IDs generated locally. After attach, these IDs cannot be used, so this table maps the old local IDs to the\n * new storage IDs so requests can be redirected.\n */\n public createSummary(blobRedirectTable?: Map<string, string>): ISummaryTree {\n return this.runtime.createSummary(blobRedirectTable);\n }\n\n public setConnectionState(connected: boolean, clientId?: string) {\n const runtime = this.runtime;\n\n assert(connected === this.connected, 0x0de /* \"Mismatch in connection state while setting\" */);\n\n runtime.setConnectionState(connected, clientId);\n }\n\n public process(message: ISequencedDocumentMessage, local: boolean, context: any) {\n this.runtime.process(message, local, context);\n }\n\n public processSignal(message: ISignalMessage, local: boolean) {\n this.runtime.processSignal(message, local);\n }\n\n public async request(path: IRequest): Promise<IResponse> {\n return this.runtime.request(path);\n }\n\n public async getAbsoluteUrl(relativeUrl: string): Promise<string | undefined> {\n return this.container.getAbsoluteUrl(relativeUrl);\n }\n\n public getPendingLocalState(): unknown {\n return this.runtime.getPendingLocalState();\n }\n\n /**\n * Determines if the current code details of the context\n * satisfy the incoming constraint code details\n */\n public async satisfies(constraintCodeDetails: IFluidCodeDetails) {\n const comparers: IFluidCodeDetailsComparer[] = [];\n\n const maybeCompareCodeLoader = this.codeLoader;\n if (maybeCompareCodeLoader.IFluidCodeDetailsComparer !== undefined) {\n comparers.push(maybeCompareCodeLoader.IFluidCodeDetailsComparer);\n }\n\n const moduleWithDetails = await this._fluidModuleP;\n const maybeCompareExport: Partial<IProvideFluidCodeDetailsComparer> | undefined =\n moduleWithDetails.module?.fluidExport;\n if (maybeCompareExport?.IFluidCodeDetailsComparer !== undefined) {\n comparers.push(maybeCompareExport.IFluidCodeDetailsComparer);\n }\n\n // if there are not comparers it is not possible to know\n // if the current satisfy the incoming, so return false,\n // as assuming they do not satisfy is safer .e.g we will\n // reload, rather than potentially running with\n // incompatible code\n if (comparers.length === 0) {\n return false;\n }\n\n for (const comparer of comparers) {\n const satisfies = await comparer.satisfies(\n moduleWithDetails.details,\n constraintCodeDetails,\n );\n if (satisfies === false) {\n return false;\n }\n }\n return true;\n }\n\n public notifyAttaching() {\n this.runtime.setAttachState(AttachState.Attaching);\n }\n\n // #region private\n\n private async getRuntimeFactory(): Promise<IRuntimeFactory> {\n const fluidExport: FluidObject<IProvideRuntimeFactory> | undefined =\n (await this._fluidModuleP).module?.fluidExport;\n const runtimeFactory = fluidExport?.IRuntimeFactory;\n if (runtimeFactory === undefined) {\n throw new Error(PackageNotFactoryError);\n }\n\n return runtimeFactory;\n }\n\n private async instantiateRuntime(existing: boolean) {\n const runtimeFactory = await this.getRuntimeFactory();\n this._runtime = await runtimeFactory.instantiateRuntime(this, existing);\n }\n\n private attachListener() {\n this.container.once(\"attached\", () => {\n this.runtime.setAttachState(AttachState.Attached);\n });\n }\n\n private async loadCodeModule(codeDetails: IFluidCodeDetails): Promise<IFluidModuleWithDetails> {\n // load may actually produce a IFluidModule if using a legacy ICodeLoader.\n // Because the type system currently does not capture this in load,\n // explicitly declare the type here to support both cases.\n // See also comment about this below.\n const loadCodeResult: IFluidModuleWithDetails | IFluidModule = await PerformanceEvent.timedExecAsync(\n this.taggedLogger,\n { eventName: \"CodeLoad\" },\n async () => this.codeLoader.load(codeDetails),\n );\n\n if (\"module\" in loadCodeResult) {\n const { module, details } = loadCodeResult;\n return {\n module,\n details: details ?? codeDetails,\n };\n } else {\n // If \"module\" is not in the result, we are using a legacy ICodeLoader. Fix the result up with details.\n // Once usage drops to 0 we can remove this compat path.\n this.taggedLogger.sendTelemetryEvent({ eventName: \"LegacyCodeLoader\" });\n return { module: loadCodeResult, details: codeDetails };\n }\n }\n // #endregion\n}\n"]}
|
package/dist/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/container-loader";
|
|
8
|
-
export declare const pkgVersion = "0.59.2000-
|
|
8
|
+
export declare const pkgVersion = "0.59.2000-63294";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/dist/packageVersion.js
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/container-loader";
|
|
11
|
-
exports.pkgVersion = "0.59.2000-
|
|
11
|
+
exports.pkgVersion = "0.59.2000-63294";
|
|
12
12
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,kCAAkC,CAAC;AAC7C,QAAA,UAAU,GAAG,iBAAiB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-loader\";\nexport const pkgVersion = \"0.59.2000-
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,kCAAkC,CAAC;AAC7C,QAAA,UAAU,GAAG,iBAAiB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-loader\";\nexport const pkgVersion = \"0.59.2000-63294\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectionManager.js","sourceRoot":"","sources":["../src/connectionManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n IDisposable,\n ITelemetryLogger,\n ITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport { assert, performance, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport {\n IDeltaQueue,\n ReadOnlyInfo,\n IConnectionDetails,\n ICriticalContainerError,\n} from \"@fluidframework/container-definitions\";\nimport {\n GenericError,\n} from \"@fluidframework/container-utils\";\nimport {\n IDocumentService,\n IDocumentDeltaConnection,\n IDocumentDeltaConnectionEvents,\n} from \"@fluidframework/driver-definitions\";\nimport {\n canRetryOnError,\n createWriteError,\n createGenericNetworkError,\n getRetryDelayFromError,\n IAnyDriverError,\n waitForConnectedState,\n DeltaStreamConnectionForbiddenError,\n logNetworkFailure,\n} from \"@fluidframework/driver-utils\";\nimport {\n ConnectionMode,\n IClient,\n IClientConfiguration,\n IClientDetails,\n IDocumentMessage,\n INack,\n INackContent,\n ISequencedDocumentMessage,\n ISignalClient,\n ISignalMessage,\n ITokenClaims,\n MessageType,\n ScopeType,\n ISequencedDocumentSystemMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n TelemetryLogger,\n normalizeError,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n ReconnectMode,\n IConnectionManager,\n IConnectionManagerFactoryArgs,\n} from \"./contracts\";\nimport { DeltaQueue } from \"./deltaQueue\";\n\nconst MaxReconnectDelayInMs = 8000;\nconst InitialReconnectDelayInMs = 1000;\nconst DefaultChunkSize = 16 * 1024;\n\nconst fatalConnectErrorProp = { fatalConnectError: true };\n\nfunction getNackReconnectInfo(nackContent: INackContent) {\n const message = `Nack (${nackContent.type}): ${nackContent.message}`;\n const canRetry = nackContent.code !== 403;\n const retryAfterMs = nackContent.retryAfter !== undefined ? nackContent.retryAfter * 1000 : undefined;\n return createGenericNetworkError(\n message,\n { canRetry, retryAfterMs },\n { statusCode: nackContent.code, driverVersion: undefined });\n}\n\n/**\n * Implementation of IDocumentDeltaConnection that does not support submitting\n * or receiving ops. Used in storage-only mode.\n */\nclass NoDeltaStream\n extends TypedEventEmitter<IDocumentDeltaConnectionEvents>\n implements IDocumentDeltaConnection, IDisposable\n{\n clientId: string = \"storage-only client\";\n claims: ITokenClaims = {\n scopes: [ScopeType.DocRead],\n } as any;\n mode: ConnectionMode = \"read\";\n existing: boolean = true;\n maxMessageSize: number = 0;\n version: string = \"\";\n initialMessages: ISequencedDocumentMessage[] = [];\n initialSignals: ISignalMessage[] = [];\n initialClients: ISignalClient[] = [];\n serviceConfiguration: IClientConfiguration = {\n maxMessageSize: 0,\n blockSize: 0,\n summary: undefined as any,\n };\n checkpointSequenceNumber?: number | undefined = undefined;\n submit(messages: IDocumentMessage[]): void {\n this.emit(\"nack\", this.clientId, messages.map((operation) => {\n return {\n operation,\n content: { message: \"Cannot submit with storage-only connection\", code: 403 },\n };\n }));\n }\n submitSignal(message: any): void {\n this.emit(\"nack\", this.clientId, {\n operation: message,\n content: { message: \"Cannot submit signal with storage-only connection\", code: 403 },\n });\n }\n\n private _disposed = false;\n public get disposed() { return this._disposed; }\n public dispose() { this._disposed = true; }\n}\n\n/**\n * Implementation of IConnectionManager, used by Container class\n * Implements constant connectivity to relay service, by reconnecting in case of loast connection or error.\n * Exposes various controls to influecen this process, including manual reconnects, forced read-only mode, etc.\n */\nexport class ConnectionManager implements IConnectionManager {\n /** Connection mode used when reconnecting on error or disconnect. */\n private readonly defaultReconnectionMode: ConnectionMode;\n\n private pendingConnection = false;\n private connection: IDocumentDeltaConnection | undefined;\n\n /** file ACL - whether user has only read-only access to a file */\n private _readonlyPermissions: boolean | undefined;\n\n /** tracks host requiring read-only mode. */\n private _forceReadonly = false;\n\n /**\n * Controls whether the DeltaManager will automatically reconnect to the delta stream after receiving a disconnect.\n */\n private _reconnectMode: ReconnectMode;\n\n /** True if there is pending (async) reconnection from \"read\" to \"write\" */\n private pendingReconnect = false;\n\n private clientSequenceNumber = 0;\n private clientSequenceNumberObserved = 0;\n /** Counts the number of noops sent by the client which may not be acked. */\n private trailingNoopCount = 0;\n\n /** track clientId used last time when we sent any ops */\n private lastSubmittedClientId: string | undefined;\n\n private connectFirstConnection = true;\n\n private _connectionVerboseProps: Record<string, string | number> = {};\n\n private _connectionProps: ITelemetryProperties = {};\n\n private closed = false;\n\n private readonly _outbound: DeltaQueue<IDocumentMessage[]>;\n\n public get connectionVerboseProps() { return this._connectionVerboseProps; }\n\n public readonly clientDetails: IClientDetails;\n\n /**\n * The current connection mode, initially read.\n */\n public get connectionMode(): ConnectionMode {\n return this.connection?.mode ?? \"read\";\n }\n\n public get connected() { return this.connection !== undefined; }\n\n public get clientId() { return this.connection?.clientId; }\n /**\n * Automatic reconnecting enabled or disabled.\n * If set to Never, then reconnecting will never be allowed.\n */\n public get reconnectMode(): ReconnectMode {\n return this._reconnectMode;\n }\n\n public get maxMessageSize(): number {\n return this.connection?.serviceConfiguration?.maxMessageSize\n ?? DefaultChunkSize;\n }\n\n public get version(): string {\n if (this.connection === undefined) {\n throw new Error(\"Cannot check version without a connection\");\n }\n return this.connection.version;\n }\n\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this.connection?.serviceConfiguration;\n }\n\n public get scopes(): string[] | undefined {\n return this.connection?.claims.scopes;\n }\n\n public get outbound(): IDeltaQueue<IDocumentMessage[]> {\n return this._outbound;\n }\n\n /**\n * Returns set of props that can be logged in telemetry that provide some insights / statistics\n * about current or last connection (if there is no connection at the moment)\n */\n public get connectionProps(): ITelemetryProperties {\n if (this.connection !== undefined) {\n return this._connectionProps;\n } else {\n return {\n ...this._connectionProps,\n // Report how many ops this client sent in last disconnected session\n sentOps: this.clientSequenceNumber,\n };\n }\n }\n\n public shouldJoinWrite(): boolean {\n // We don't have to wait for ack for topmost NoOps. So subtract those.\n return this.clientSequenceNumberObserved < (this.clientSequenceNumber - this.trailingNoopCount);\n }\n\n /**\n * Tells if container is in read-only mode.\n * Data stores should listen for \"readonly\" notifications and disallow user\n * making changes to data stores.\n * Readonly state can be because of no storage write permission,\n * or due to host forcing readonly mode for container.\n * It is undefined if we have not yet established websocket connection\n * and do not know if user has write access to a file.\n */\n private get readonly() {\n if (this._forceReadonly) {\n return true;\n }\n return this._readonlyPermissions;\n }\n\n public get readOnlyInfo(): ReadOnlyInfo {\n const storageOnly = this.connection !== undefined && this.connection instanceof NoDeltaStream;\n if (storageOnly || this._forceReadonly || this._readonlyPermissions === true) {\n return {\n readonly: true,\n forced: this._forceReadonly,\n permissions: this._readonlyPermissions,\n storageOnly,\n };\n }\n\n return { readonly: this._readonlyPermissions };\n }\n\n private static detailsFromConnection(connection: IDocumentDeltaConnection): IConnectionDetails {\n return {\n claims: connection.claims,\n clientId: connection.clientId,\n existing: connection.existing,\n checkpointSequenceNumber: connection.checkpointSequenceNumber,\n get initialClients() { return connection.initialClients; },\n mode: connection.mode,\n serviceConfiguration: connection.serviceConfiguration,\n version: connection.version,\n };\n }\n\n constructor(\n private readonly serviceProvider: () => IDocumentService | undefined,\n private client: IClient,\n reconnectAllowed: boolean,\n private readonly logger: ITelemetryLogger,\n private readonly props: IConnectionManagerFactoryArgs,\n ) {\n this.clientDetails = this.client.details;\n this.defaultReconnectionMode = this.client.mode;\n this._reconnectMode = reconnectAllowed ? ReconnectMode.Enabled : ReconnectMode.Never;\n\n // Outbound message queue. The outbound queue is represented as a queue of an array of ops. Ops contained\n // within an array *must* fit within the maxMessageSize and are guaranteed to be ordered sequentially.\n this._outbound = new DeltaQueue<IDocumentMessage[]>(\n (messages) => {\n if (this.connection === undefined) {\n throw new Error(\"Attempted to submit an outbound message without connection\");\n }\n this.connection.submit(messages);\n });\n\n this._outbound.on(\"error\", (error) => {\n this.props.closeHandler(normalizeError(error));\n });\n }\n\n public dispose(error?: ICriticalContainerError) {\n if (this.closed) {\n return;\n }\n this.closed = true;\n\n this.pendingConnection = false;\n\n // Ensure that things like triggerConnect() will short circuit\n this._reconnectMode = ReconnectMode.Never;\n\n this._outbound.clear();\n\n const disconnectReason = error !== undefined\n ? `Closing DeltaManager (${error.message})`\n : \"Closing DeltaManager\";\n\n // This raises \"disconnect\" event if we have active connection.\n this.disconnectFromDeltaStream(disconnectReason);\n\n // Notify everyone we are in read-only state.\n // Useful for data stores in case we hit some critical error,\n // to switch to a mode where user edits are not accepted\n this.set_readonlyPermissions(true);\n }\n\n /**\n * Enables or disables automatic reconnecting.\n * Will throw an error if reconnectMode set to Never.\n */\n public setAutoReconnect(mode: ReconnectMode): void {\n assert(mode !== ReconnectMode.Never && this._reconnectMode !== ReconnectMode.Never,\n 0x278 /* \"API is not supported for non-connecting or closed container\" */);\n\n this._reconnectMode = mode;\n\n if (mode !== ReconnectMode.Enabled) {\n // immediately disconnect - do not rely on service eventually dropping connection.\n this.disconnectFromDeltaStream(\"setAutoReconnect\");\n }\n }\n\n /**\n * Sends signal to runtime (and data stores) to be read-only.\n * Hosts may have read only views, indicating to data stores that no edits are allowed.\n * This is independent from this._readonlyPermissions (permissions) and this.connectionMode\n * (server can return \"write\" mode even when asked for \"read\")\n * Leveraging same \"readonly\" event as runtime & data stores should behave the same in such case\n * as in read-only permissions.\n * But this.active can be used by some DDSes to figure out if ops can be sent\n * (for example, read-only view still participates in code proposals / upgrades decisions)\n *\n * Forcing Readonly does not prevent DDS from generating ops. It is up to user code to honour\n * the readonly flag. If ops are generated, they will accumulate locally and not be sent. If\n * there are pending in the outbound queue, it will stop sending until force readonly is\n * cleared.\n *\n * @param readonly - set or clear force readonly.\n */\n public forceReadonly(readonly: boolean) {\n if (readonly !== this._forceReadonly) {\n this.logger.sendTelemetryEvent({\n eventName: \"ForceReadOnly\",\n value: readonly,\n });\n }\n const oldValue = this.readonly;\n this._forceReadonly = readonly;\n\n if (oldValue !== this.readonly) {\n assert(this._reconnectMode !== ReconnectMode.Never,\n 0x279 /* \"API is not supported for non-connecting or closed container\" */);\n\n let reconnect = false;\n if (this.readonly === true) {\n // If we switch to readonly while connected, we should disconnect first\n // See comment in the \"readonly\" event handler to deltaManager set up by\n // the ContainerRuntime constructor\n\n if (this.shouldJoinWrite()) {\n // If we have pending changes, then we will never send them - it smells like\n // host logic error.\n this.logger.sendErrorEvent({ eventName: \"ForceReadonlyPendingChanged\" });\n }\n\n reconnect = this.disconnectFromDeltaStream(\"Force readonly\");\n }\n this.props.readonlyChangeHandler(this.readonly);\n if (reconnect) {\n // reconnect if we disconnected from before.\n this.triggerConnect(\"read\");\n }\n }\n }\n\n private set_readonlyPermissions(readonly: boolean) {\n const oldValue = this.readonly;\n this._readonlyPermissions = readonly;\n if (oldValue !== this.readonly) {\n this.props.readonlyChangeHandler(this.readonly);\n }\n }\n\n public connect(connectionMode?: ConnectionMode) {\n this.connectCore(connectionMode).catch((error) => {\n const normalizedError = normalizeError(error, { props: fatalConnectErrorProp });\n this.props.closeHandler(normalizedError);\n });\n }\n\n private async connectCore(connectionMode?: ConnectionMode): Promise<void> {\n assert(!this.closed, 0x26a /* \"not closed\" */);\n\n if (this.connection !== undefined || this.pendingConnection) {\n return;\n }\n\n let requestedMode = connectionMode ?? this.defaultReconnectionMode;\n\n // if we have any non-acked ops from last connection, reconnect as \"write\".\n // without that we would connect in view-only mode, which will result in immediate\n // firing of \"connected\" event from Container and switch of current clientId (as tracked\n // by all DDSes). This will make it impossible to figure out if ops actually made it through,\n // so DDSes will immediately resubmit all pending ops, and some of them will be duplicates, corrupting document\n if (this.shouldJoinWrite()) {\n requestedMode = \"write\";\n }\n\n const docService = this.serviceProvider();\n assert(docService !== undefined, 0x2a7 /* \"Container is not attached\" */);\n\n let connection: IDocumentDeltaConnection | undefined;\n\n if (docService.policies?.storageOnly === true) {\n connection = new NoDeltaStream();\n // to keep setupNewSuccessfulConnection happy\n this.pendingConnection = true;\n this.setupNewSuccessfulConnection(connection, \"read\");\n assert(!this.pendingConnection, 0x2b3 /* \"logic error\" */);\n return;\n }\n\n // this.pendingConnection resets to false as soon as we know the outcome of the connection attempt\n this.pendingConnection = true;\n\n let delayMs = InitialReconnectDelayInMs;\n let connectRepeatCount = 0;\n const connectStartTime = performance.now();\n let lastError: any;\n\n // This loop will keep trying to connect until successful, with a delay between each iteration.\n while (connection === undefined) {\n if (this.closed) {\n throw new Error(\"Attempting to connect a closed DeltaManager\");\n }\n connectRepeatCount++;\n\n try {\n this.client.mode = requestedMode;\n connection = await docService.connectToDeltaStream(this.client);\n\n if (connection.disposed) {\n // Nobody observed this connection, so drop it on the floor and retry.\n this.logger.sendTelemetryEvent({ eventName: \"ReceivedClosedConnection\" });\n connection = undefined;\n }\n } catch (origError) {\n if (typeof origError === \"object\" && origError !== null &&\n origError?.errorType === DeltaStreamConnectionForbiddenError.errorType) {\n connection = new NoDeltaStream();\n requestedMode = \"read\";\n break;\n }\n\n // Socket.io error when we connect to wrong socket, or hit some multiplexing bug\n if (!canRetryOnError(origError)) {\n const error = normalizeError(origError, { props: fatalConnectErrorProp });\n this.props.closeHandler(error);\n throw error;\n }\n\n // Since the error is retryable this will not log to the error table\n logNetworkFailure(\n this.logger,\n {\n attempts: connectRepeatCount,\n delay: delayMs, // milliseconds\n eventName: \"DeltaConnectionFailureToConnect\",\n duration: TelemetryLogger.formatTick(performance.now() - connectStartTime),\n },\n origError);\n\n lastError = origError;\n\n const retryDelayFromError = getRetryDelayFromError(origError);\n delayMs = retryDelayFromError ?? Math.min(delayMs * 2, MaxReconnectDelayInMs);\n\n if (retryDelayFromError !== undefined) {\n this.props.reconnectionDelayHandler(retryDelayFromError, origError);\n }\n await waitForConnectedState(delayMs);\n }\n }\n\n // If we retried more than once, log an event about how long it took (this will not log to error table)\n if (connectRepeatCount > 1) {\n logNetworkFailure(\n this.logger,\n {\n eventName: \"MultipleDeltaConnectionFailures\",\n attempts: connectRepeatCount,\n duration: TelemetryLogger.formatTick(performance.now() - connectStartTime),\n },\n lastError,\n );\n }\n\n this.setupNewSuccessfulConnection(connection, requestedMode);\n }\n\n /**\n * Start the connection. Any error should result in container being close.\n * And report the error if it excape for any reason.\n * @param args - The connection arguments\n */\n private triggerConnect(connectionMode: ConnectionMode) {\n assert(this.connection === undefined, 0x239 /* \"called only in disconnected state\" */);\n if (this.reconnectMode !== ReconnectMode.Enabled) {\n return;\n }\n this.connect(connectionMode);\n }\n\n /**\n * Disconnect the current connection.\n * @param reason - Text description of disconnect reason to emit with disconnect event\n */\n private disconnectFromDeltaStream(reason: string): boolean {\n this.pendingReconnect = false;\n\n if (this.connection === undefined) {\n return false;\n }\n\n assert(!this.pendingConnection, 0x27b /* \"reentrancy may result in incorrect behavior\" */);\n\n const connection = this.connection;\n // Avoid any re-entrancy - clear object reference\n this.connection = undefined;\n\n // Remove listeners first so we don't try to retrigger this flow accidentally through reconnectOnError\n connection.off(\"op\", this.opHandler);\n connection.off(\"signal\", this.props.signalHandler);\n connection.off(\"nack\", this.nackHandler);\n connection.off(\"disconnect\", this.disconnectHandlerInternal);\n connection.off(\"error\", this.errorHandler);\n connection.off(\"pong\", this.props.pongHandler);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._outbound.pause();\n this._outbound.clear();\n this.props.disconnectHandler(reason);\n\n connection.dispose();\n\n this._connectionVerboseProps = {};\n\n return true;\n }\n\n /**\n * Once we've successfully gotten a connection, we need to set up state, attach event listeners, and process\n * initial messages.\n * @param connection - The newly established connection\n */\n private setupNewSuccessfulConnection(connection: IDocumentDeltaConnection, requestedMode: ConnectionMode) {\n // Old connection should have been cleaned up before establishing a new one\n assert(this.connection === undefined, 0x0e6 /* \"old connection exists on new connection setup\" */);\n assert(!connection.disposed, 0x28a /* \"can't be disposed - Callers need to ensure that!\" */);\n\n if (this.pendingConnection) {\n this.pendingConnection = false;\n } else {\n assert(this.closed, 0x27f /* \"reentrancy may result in incorrect behavior\" */);\n }\n this.connection = connection;\n\n // Does information in scopes & mode matches?\n // If we asked for \"write\" and got \"read\", then file is read-only\n // But if we ask read, server can still give us write.\n const readonly = !connection.claims.scopes.includes(ScopeType.DocWrite);\n\n // This connection mode validation logic is moving to the driver layer in 0.44. These two asserts can be\n // removed after those packages have released and become ubiquitous.\n assert(requestedMode === \"read\" || readonly === (this.connectionMode === \"read\"),\n 0x0e7 /* \"claims/connectionMode mismatch\" */);\n assert(!readonly || this.connectionMode === \"read\", 0x0e8 /* \"readonly perf with write connection\" */);\n\n this.set_readonlyPermissions(readonly);\n\n if (this.closed) {\n // Raise proper events, Log telemetry event and close connection.\n this.disconnectFromDeltaStream(\"ConnectionManager already closed\");\n return;\n }\n\n this._outbound.resume();\n\n connection.on(\"op\", this.opHandler);\n connection.on(\"signal\", this.props.signalHandler);\n connection.on(\"nack\", this.nackHandler);\n connection.on(\"disconnect\", this.disconnectHandlerInternal);\n connection.on(\"error\", this.errorHandler);\n connection.on(\"pong\", this.props.pongHandler);\n\n // Initial messages are always sorted. However, due to early op handler installed by drivers and appending those\n // ops to initialMessages, resulting set is no longer sorted, which would result in client hitting storage to\n // fill in gap. We will recover by cancelling this request once we process remaining ops, but it's a waste that\n // we could avoid\n const initialMessages = connection.initialMessages.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\n // Some storages may provide checkpointSequenceNumber to identify how far client is behind.\n let checkpointSequenceNumber = connection.checkpointSequenceNumber;\n\n this._connectionVerboseProps = {\n clientId: connection.clientId,\n mode: connection.mode,\n };\n\n // reset connection props\n this._connectionProps = {};\n\n if (connection.relayServiceAgent !== undefined) {\n this._connectionVerboseProps.relayServiceAgent = connection.relayServiceAgent;\n this._connectionProps.relayServiceAgent = connection.relayServiceAgent;\n }\n this._connectionProps.socketDocumentId = connection.claims.documentId;\n this._connectionProps.connectionMode = connection.mode;\n\n let last = -1;\n if (initialMessages.length !== 0) {\n this._connectionVerboseProps.connectionInitialOpsFrom = initialMessages[0].sequenceNumber;\n last = initialMessages[initialMessages.length - 1].sequenceNumber;\n this._connectionVerboseProps.connectionInitialOpsTo = last + 1;\n // Update knowledge of how far we are behind, before raising \"connect\" event\n // This is duplication of what incomingOpHandler() does, but we have to raise event before we get there,\n // so duplicating update logic here as well.\n if (checkpointSequenceNumber === undefined || checkpointSequenceNumber < last) {\n checkpointSequenceNumber = last;\n }\n }\n\n this.props.incomingOpHandler(\n initialMessages,\n this.connectFirstConnection ? \"InitialOps\" : \"ReconnectOps\");\n\n if (connection.initialSignals !== undefined) {\n for (const signal of connection.initialSignals) {\n this.props.signalHandler(signal);\n }\n }\n\n const details = ConnectionManager.detailsFromConnection(connection);\n details.checkpointSequenceNumber = checkpointSequenceNumber;\n this.props.connectHandler(details);\n\n this.connectFirstConnection = false;\n }\n\n /**\n * Disconnect the current connection and reconnect. Closes the container if it fails.\n * @param connection - The connection that wants to reconnect - no-op if it's different from this.connection\n * @param requestedMode - Read or write\n * @param error - Error reconnect information including whether or not to reconnect\n * @returns A promise that resolves when the connection is reestablished or we stop trying\n */\n private reconnectOnError(\n requestedMode: ConnectionMode,\n error: IAnyDriverError,\n ) {\n this.reconnect(\n requestedMode,\n error.message,\n error)\n .catch(this.props.closeHandler);\n }\n\n /**\n * Disconnect the current connection and reconnect.\n * @param connection - The connection that wants to reconnect - no-op if it's different from this.connection\n * @param requestedMode - Read or write\n * @param error - Error reconnect information including whether or not to reconnect\n * @returns A promise that resolves when the connection is reestablished or we stop trying\n */\n private async reconnect(\n requestedMode: ConnectionMode,\n disconnectMessage: string,\n error?: IAnyDriverError,\n ) {\n // We quite often get protocol errors before / after observing nack/disconnect\n // we do not want to run through same sequence twice.\n // If we're already disconnected/disconnecting it's not appropriate to call this again.\n assert(this.connection !== undefined, 0x0eb /* \"Missing connection for reconnect\" */);\n\n this.disconnectFromDeltaStream(disconnectMessage);\n\n // We will always trigger reconnect, even if canRetry is false.\n // Any truly fatal error state will result in container close upon attempted reconnect,\n // which is a preferable to closing abruptly when a live connection fails.\n if (error !== undefined && !error.canRetry) {\n this.logger.sendTelemetryEvent({\n eventName: \"reconnectingDespiteFatalError\",\n reconnectMode: this.reconnectMode,\n }, error);\n }\n\n if (this.reconnectMode === ReconnectMode.Never) {\n // Do not raise container error if we are closing just because we lost connection.\n // Those errors (like IdleDisconnect) would show up in telemetry dashboards and\n // are very misleading, as first initial reaction - some logic is broken.\n this.props.closeHandler();\n }\n\n // If closed then we can't reconnect\n if (this.closed || this.reconnectMode !== ReconnectMode.Enabled) {\n return;\n }\n\n const delayMs = getRetryDelayFromError(error);\n if (error !== undefined && delayMs !== undefined) {\n this.props.reconnectionDelayHandler(delayMs, error);\n await waitForConnectedState(delayMs);\n }\n\n this.triggerConnect(requestedMode);\n }\n\n public prepareMessageToSend(message: Omit<IDocumentMessage, \"clientSequenceNumber\">): IDocumentMessage | undefined {\n if (this.readonly === true) {\n assert(this.readOnlyInfo.readonly === true, 0x1f0 /* \"Unexpected mismatch in readonly\" */);\n const error = new GenericError(\"deltaManagerReadonlySubmit\", undefined /* error */, {\n readonly: this.readOnlyInfo.readonly,\n forcedReadonly: this.readOnlyInfo.forced,\n readonlyPermissions: this.readOnlyInfo.permissions,\n storageOnly: this.readOnlyInfo.storageOnly,\n });\n this.props.closeHandler(error);\n return undefined;\n }\n\n // reset clientSequenceNumber if we are using new clientId.\n // we keep info about old connection as long as possible to be able to account for all non-acked ops\n // that we pick up on next connection.\n assert(!!this.connection, 0x0e4 /* \"Lost old connection!\" */);\n if (this.lastSubmittedClientId !== this.connection?.clientId) {\n this.lastSubmittedClientId = this.connection?.clientId;\n this.clientSequenceNumber = 0;\n this.clientSequenceNumberObserved = 0;\n }\n\n if (message.type === MessageType.NoOp) {\n this.trailingNoopCount++;\n } else {\n this.trailingNoopCount = 0;\n }\n\n return {\n ...message,\n clientSequenceNumber: ++this.clientSequenceNumber,\n };\n }\n\n public submitSignal(content: any) {\n if (this.connection !== undefined) {\n this.connection.submitSignal(content);\n } else {\n this.logger.sendErrorEvent({ eventName: \"submitSignalDisconnected\" });\n }\n }\n\n public sendMessages(messages: IDocumentMessage[]) {\n assert(this.connected, 0x2b4 /* \"not connected on sending ops!\" */);\n\n // If connection is \"read\" or implicit \"read\" (got leave op for \"write\" connection),\n // then op can't make it through - we will get a nack if op is sent.\n // We can short-circuit this process.\n // Note that we also want nacks to be rare and be treated as catastrophic failures.\n // Be careful with reentrancy though - disconnected event should not be be raised in the\n // middle of the current workflow, but rather on clean stack!\n if (this.connectionMode === \"read\") {\n if (!this.pendingReconnect) {\n this.pendingReconnect = true;\n Promise.resolve().then(async () => {\n if (this.pendingReconnect) { // still valid?\n await this.reconnect(\n \"write\", // connectionMode\n \"Switch to write\", // message\n );\n }\n })\n .catch(() => {});\n }\n return;\n }\n\n assert(!this.pendingReconnect, 0x2b5 /* \"logic error\" */);\n\n this._outbound.push(messages);\n }\n\n public beforeProcessingIncomingOp(message: ISequencedDocumentMessage) {\n // if we have connection, and message is local, then we better treat is as local!\n assert(this.clientId !== message.clientId || this.lastSubmittedClientId === message.clientId,\n 0x0ee /* \"Not accounting local messages correctly\" */,\n );\n\n if (this.lastSubmittedClientId !== undefined && this.lastSubmittedClientId === message.clientId) {\n const clientSequenceNumber = message.clientSequenceNumber;\n\n assert(this.clientSequenceNumberObserved < clientSequenceNumber, 0x0ef /* \"client seq# not growing\" */);\n assert(clientSequenceNumber <= this.clientSequenceNumber,\n 0x0f0 /* \"Incoming local client seq# > generated by this client\" */);\n\n this.clientSequenceNumberObserved = clientSequenceNumber;\n }\n\n if (message.type === MessageType.ClientLeave) {\n const systemLeaveMessage = message as ISequencedDocumentSystemMessage;\n const clientId = JSON.parse(systemLeaveMessage.data) as string;\n if (clientId === this.clientId) {\n // We have been kicked out from quorum\n this.logger.sendPerformanceEvent({ eventName: \"ReadConnectionTransition\" });\n\n // Please see #8483 for more details on why maintaining connection further as is would not work.\n // Short story - connection properties are immutable, and many processes (consensus DDSs, summarizer)\n // assume that connection stays \"write\" connection until disconnect, and act accordingly, which may\n // not work well with de-facto \"read\" connection we are in after receiving own leave op on timeout.\n // Clients need to be able to transition to \"read\" state after some time of inactivity!\n // Note - this may close container!\n this.reconnect(\n \"read\", // connectionMode\n \"Switch to read\", // message\n ).catch((error) => {\n this.logger.sendErrorEvent({ eventName: \"SwitchToReadConnection\"}, error);\n });\n }\n }\n }\n\n private readonly opHandler = (documentId: string, messagesArg: ISequencedDocumentMessage[]) => {\n const messages = Array.isArray(messagesArg) ? messagesArg : [messagesArg];\n this.props.incomingOpHandler(messages, \"opHandler\");\n };\n\n // Always connect in write mode after getting nacked.\n private readonly nackHandler = (documentId: string, messages: INack[]) => {\n const message = messages[0];\n if (this._readonlyPermissions === true) {\n this.props.closeHandler(createWriteError(\"writeOnReadOnlyDocument\", { driverVersion: undefined }));\n return;\n }\n\n const reconnectInfo = getNackReconnectInfo(message.content);\n\n // If the nack indicates we cannot retry, then close the container outright\n if (!reconnectInfo.canRetry) {\n this.props.closeHandler(reconnectInfo);\n return;\n }\n\n this.reconnectOnError(\n \"write\",\n reconnectInfo,\n );\n };\n\n // Connection mode is always read on disconnect/error unless the system mode was write.\n private readonly disconnectHandlerInternal = (disconnectReason: IAnyDriverError) => {\n // Note: we might get multiple disconnect calls on same socket, as early disconnect notification\n // (\"server_disconnect\", ODSP-specific) is mapped to \"disconnect\"\n this.reconnectOnError(\n this.defaultReconnectionMode,\n disconnectReason,\n );\n };\n\n private readonly errorHandler = (error: IAnyDriverError) => {\n this.reconnectOnError(\n this.defaultReconnectionMode,\n error,\n );\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"connectionManager.js","sourceRoot":"","sources":["../src/connectionManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n IDisposable,\n ITelemetryLogger,\n ITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport { assert, performance, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport {\n IDeltaQueue,\n ReadOnlyInfo,\n IConnectionDetails,\n ICriticalContainerError,\n} from \"@fluidframework/container-definitions\";\nimport {\n GenericError,\n} from \"@fluidframework/container-utils\";\nimport {\n IDocumentService,\n IDocumentDeltaConnection,\n IDocumentDeltaConnectionEvents,\n} from \"@fluidframework/driver-definitions\";\nimport {\n canRetryOnError,\n createWriteError,\n createGenericNetworkError,\n getRetryDelayFromError,\n IAnyDriverError,\n waitForConnectedState,\n DeltaStreamConnectionForbiddenError,\n logNetworkFailure,\n} from \"@fluidframework/driver-utils\";\nimport {\n ConnectionMode,\n IClient,\n IClientConfiguration,\n IClientDetails,\n IDocumentMessage,\n INack,\n INackContent,\n ISequencedDocumentMessage,\n ISignalClient,\n ISignalMessage,\n ITokenClaims,\n MessageType,\n ScopeType,\n ISequencedDocumentSystemMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n TelemetryLogger,\n normalizeError,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n ReconnectMode,\n IConnectionManager,\n IConnectionManagerFactoryArgs,\n} from \"./contracts\";\nimport { DeltaQueue } from \"./deltaQueue\";\n\nconst MaxReconnectDelayInMs = 8000;\nconst InitialReconnectDelayInMs = 1000;\nconst DefaultChunkSize = 16 * 1024;\n\nconst fatalConnectErrorProp = { fatalConnectError: true };\n\nfunction getNackReconnectInfo(nackContent: INackContent) {\n const message = `Nack (${nackContent.type}): ${nackContent.message}`;\n const canRetry = nackContent.code !== 403;\n const retryAfterMs = nackContent.retryAfter !== undefined ? nackContent.retryAfter * 1000 : undefined;\n return createGenericNetworkError(\n message,\n { canRetry, retryAfterMs },\n { statusCode: nackContent.code, driverVersion: undefined });\n}\n\n/**\n * Implementation of IDocumentDeltaConnection that does not support submitting\n * or receiving ops. Used in storage-only mode.\n */\nclass NoDeltaStream\n extends TypedEventEmitter<IDocumentDeltaConnectionEvents>\n implements IDocumentDeltaConnection, IDisposable\n{\n clientId: string = \"storage-only client\";\n claims: ITokenClaims = {\n scopes: [ScopeType.DocRead],\n } as any;\n mode: ConnectionMode = \"read\";\n existing: boolean = true;\n maxMessageSize: number = 0;\n version: string = \"\";\n initialMessages: ISequencedDocumentMessage[] = [];\n initialSignals: ISignalMessage[] = [];\n initialClients: ISignalClient[] = [];\n serviceConfiguration: IClientConfiguration = {\n maxMessageSize: 0,\n blockSize: 0,\n summary: undefined as any,\n };\n checkpointSequenceNumber?: number | undefined = undefined;\n submit(messages: IDocumentMessage[]): void {\n this.emit(\"nack\", this.clientId, messages.map((operation) => {\n return {\n operation,\n content: { message: \"Cannot submit with storage-only connection\", code: 403 },\n };\n }));\n }\n submitSignal(message: any): void {\n this.emit(\"nack\", this.clientId, {\n operation: message,\n content: { message: \"Cannot submit signal with storage-only connection\", code: 403 },\n });\n }\n\n private _disposed = false;\n public get disposed() { return this._disposed; }\n public dispose() { this._disposed = true; }\n}\n\n/**\n * Implementation of IConnectionManager, used by Container class\n * Implements constant connectivity to relay service, by reconnecting in case of loast connection or error.\n * Exposes various controls to influecen this process, including manual reconnects, forced read-only mode, etc.\n */\nexport class ConnectionManager implements IConnectionManager {\n /** Connection mode used when reconnecting on error or disconnect. */\n private readonly defaultReconnectionMode: ConnectionMode;\n\n private pendingConnection = false;\n private connection: IDocumentDeltaConnection | undefined;\n\n /** file ACL - whether user has only read-only access to a file */\n private _readonlyPermissions: boolean | undefined;\n\n /** tracks host requiring read-only mode. */\n private _forceReadonly = false;\n\n /**\n * Controls whether the DeltaManager will automatically reconnect to the delta stream after receiving a disconnect.\n */\n private _reconnectMode: ReconnectMode;\n\n /** True if there is pending (async) reconnection from \"read\" to \"write\" */\n private pendingReconnect = false;\n\n private clientSequenceNumber = 0;\n private clientSequenceNumberObserved = 0;\n /** Counts the number of noops sent by the client which may not be acked. */\n private trailingNoopCount = 0;\n\n /** track clientId used last time when we sent any ops */\n private lastSubmittedClientId: string | undefined;\n\n private connectFirstConnection = true;\n\n private _connectionVerboseProps: Record<string, string | number> = {};\n\n private _connectionProps: ITelemetryProperties = {};\n\n private closed = false;\n\n private readonly _outbound: DeltaQueue<IDocumentMessage[]>;\n\n public get connectionVerboseProps() { return this._connectionVerboseProps; }\n\n public readonly clientDetails: IClientDetails;\n\n /**\n * The current connection mode, initially read.\n */\n public get connectionMode(): ConnectionMode {\n return this.connection?.mode ?? \"read\";\n }\n\n public get connected() { return this.connection !== undefined; }\n\n public get clientId() { return this.connection?.clientId; }\n /**\n * Automatic reconnecting enabled or disabled.\n * If set to Never, then reconnecting will never be allowed.\n */\n public get reconnectMode(): ReconnectMode {\n return this._reconnectMode;\n }\n\n public get maxMessageSize(): number {\n return this.connection?.serviceConfiguration?.maxMessageSize\n ?? DefaultChunkSize;\n }\n\n public get version(): string {\n if (this.connection === undefined) {\n throw new Error(\"Cannot check version without a connection\");\n }\n return this.connection.version;\n }\n\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this.connection?.serviceConfiguration;\n }\n\n public get scopes(): string[] | undefined {\n return this.connection?.claims.scopes;\n }\n\n public get outbound(): IDeltaQueue<IDocumentMessage[]> {\n return this._outbound;\n }\n\n /**\n * Returns set of props that can be logged in telemetry that provide some insights / statistics\n * about current or last connection (if there is no connection at the moment)\n */\n public get connectionProps(): ITelemetryProperties {\n if (this.connection !== undefined) {\n return this._connectionProps;\n } else {\n return {\n ...this._connectionProps,\n // Report how many ops this client sent in last disconnected session\n sentOps: this.clientSequenceNumber,\n };\n }\n }\n\n public shouldJoinWrite(): boolean {\n // We don't have to wait for ack for topmost NoOps. So subtract those.\n return this.clientSequenceNumberObserved < (this.clientSequenceNumber - this.trailingNoopCount);\n }\n\n /**\n * Tells if container is in read-only mode.\n * Data stores should listen for \"readonly\" notifications and disallow user\n * making changes to data stores.\n * Readonly state can be because of no storage write permission,\n * or due to host forcing readonly mode for container.\n * It is undefined if we have not yet established websocket connection\n * and do not know if user has write access to a file.\n */\n private get readonly() {\n if (this._forceReadonly) {\n return true;\n }\n return this._readonlyPermissions;\n }\n\n public get readOnlyInfo(): ReadOnlyInfo {\n const storageOnly = this.connection !== undefined && this.connection instanceof NoDeltaStream;\n if (storageOnly || this._forceReadonly || this._readonlyPermissions === true) {\n return {\n readonly: true,\n forced: this._forceReadonly,\n permissions: this._readonlyPermissions,\n storageOnly,\n };\n }\n\n return { readonly: this._readonlyPermissions };\n }\n\n private static detailsFromConnection(connection: IDocumentDeltaConnection): IConnectionDetails {\n return {\n claims: connection.claims,\n clientId: connection.clientId,\n existing: connection.existing,\n checkpointSequenceNumber: connection.checkpointSequenceNumber,\n get initialClients() { return connection.initialClients; },\n mode: connection.mode,\n serviceConfiguration: connection.serviceConfiguration,\n version: connection.version,\n };\n }\n\n constructor(\n private readonly serviceProvider: () => IDocumentService | undefined,\n private client: IClient,\n reconnectAllowed: boolean,\n private readonly logger: ITelemetryLogger,\n private readonly props: IConnectionManagerFactoryArgs,\n ) {\n this.clientDetails = this.client.details;\n this.defaultReconnectionMode = this.client.mode;\n this._reconnectMode = reconnectAllowed ? ReconnectMode.Enabled : ReconnectMode.Never;\n\n // Outbound message queue. The outbound queue is represented as a queue of an array of ops. Ops contained\n // within an array *must* fit within the maxMessageSize and are guaranteed to be ordered sequentially.\n this._outbound = new DeltaQueue<IDocumentMessage[]>(\n (messages) => {\n if (this.connection === undefined) {\n throw new Error(\"Attempted to submit an outbound message without connection\");\n }\n this.connection.submit(messages);\n });\n\n this._outbound.on(\"error\", (error) => {\n this.props.closeHandler(normalizeError(error));\n });\n }\n\n public dispose(error?: ICriticalContainerError) {\n if (this.closed) {\n return;\n }\n this.closed = true;\n\n this.pendingConnection = false;\n\n // Ensure that things like triggerConnect() will short circuit\n this._reconnectMode = ReconnectMode.Never;\n\n this._outbound.clear();\n\n const disconnectReason = error !== undefined\n ? `Closing DeltaManager (${error.message})`\n : \"Closing DeltaManager\";\n\n // This raises \"disconnect\" event if we have active connection.\n this.disconnectFromDeltaStream(disconnectReason);\n\n // Notify everyone we are in read-only state.\n // Useful for data stores in case we hit some critical error,\n // to switch to a mode where user edits are not accepted\n this.set_readonlyPermissions(true);\n }\n\n /**\n * Enables or disables automatic reconnecting.\n * Will throw an error if reconnectMode set to Never.\n */\n public setAutoReconnect(mode: ReconnectMode): void {\n assert(mode !== ReconnectMode.Never && this._reconnectMode !== ReconnectMode.Never,\n 0x278 /* \"API is not supported for non-connecting or closed container\" */);\n\n this._reconnectMode = mode;\n\n if (mode !== ReconnectMode.Enabled) {\n // immediately disconnect - do not rely on service eventually dropping connection.\n this.disconnectFromDeltaStream(\"setAutoReconnect\");\n }\n }\n\n /**\n * Sends signal to runtime (and data stores) to be read-only.\n * Hosts may have read only views, indicating to data stores that no edits are allowed.\n * This is independent from this._readonlyPermissions (permissions) and this.connectionMode\n * (server can return \"write\" mode even when asked for \"read\")\n * Leveraging same \"readonly\" event as runtime & data stores should behave the same in such case\n * as in read-only permissions.\n * But this.active can be used by some DDSes to figure out if ops can be sent\n * (for example, read-only view still participates in code proposals / upgrades decisions)\n *\n * Forcing Readonly does not prevent DDS from generating ops. It is up to user code to honour\n * the readonly flag. If ops are generated, they will accumulate locally and not be sent. If\n * there are pending in the outbound queue, it will stop sending until force readonly is\n * cleared.\n *\n * @param readonly - set or clear force readonly.\n */\n public forceReadonly(readonly: boolean) {\n if (readonly !== this._forceReadonly) {\n this.logger.sendTelemetryEvent({\n eventName: \"ForceReadOnly\",\n value: readonly,\n });\n }\n const oldValue = this.readonly;\n this._forceReadonly = readonly;\n\n if (oldValue !== this.readonly) {\n assert(this._reconnectMode !== ReconnectMode.Never,\n 0x279 /* \"API is not supported for non-connecting or closed container\" */);\n\n let reconnect = false;\n if (this.readonly === true) {\n // If we switch to readonly while connected, we should disconnect first\n // See comment in the \"readonly\" event handler to deltaManager set up by\n // the ContainerRuntime constructor\n\n if (this.shouldJoinWrite()) {\n // If we have pending changes, then we will never send them - it smells like\n // host logic error.\n this.logger.sendErrorEvent({ eventName: \"ForceReadonlyPendingChanged\" });\n }\n\n reconnect = this.disconnectFromDeltaStream(\"Force readonly\");\n }\n this.props.readonlyChangeHandler(this.readonly);\n if (reconnect) {\n // reconnect if we disconnected from before.\n this.triggerConnect(\"read\");\n }\n }\n }\n\n private set_readonlyPermissions(readonly: boolean) {\n const oldValue = this.readonly;\n this._readonlyPermissions = readonly;\n if (oldValue !== this.readonly) {\n this.props.readonlyChangeHandler(this.readonly);\n }\n }\n\n public connect(connectionMode?: ConnectionMode) {\n this.connectCore(connectionMode).catch((error) => {\n const normalizedError = normalizeError(error, { props: fatalConnectErrorProp });\n this.props.closeHandler(normalizedError);\n });\n }\n\n private async connectCore(connectionMode?: ConnectionMode): Promise<void> {\n assert(!this.closed, 0x26a /* \"not closed\" */);\n\n if (this.connection !== undefined || this.pendingConnection) {\n return;\n }\n\n let requestedMode = connectionMode ?? this.defaultReconnectionMode;\n\n // if we have any non-acked ops from last connection, reconnect as \"write\".\n // without that we would connect in view-only mode, which will result in immediate\n // firing of \"connected\" event from Container and switch of current clientId (as tracked\n // by all DDSes). This will make it impossible to figure out if ops actually made it through,\n // so DDSes will immediately resubmit all pending ops, and some of them will be duplicates, corrupting document\n if (this.shouldJoinWrite()) {\n requestedMode = \"write\";\n }\n\n const docService = this.serviceProvider();\n assert(docService !== undefined, 0x2a7 /* \"Container is not attached\" */);\n\n let connection: IDocumentDeltaConnection | undefined;\n\n if (docService.policies?.storageOnly === true) {\n connection = new NoDeltaStream();\n // to keep setupNewSuccessfulConnection happy\n this.pendingConnection = true;\n this.setupNewSuccessfulConnection(connection, \"read\");\n assert(!this.pendingConnection, 0x2b3 /* \"logic error\" */);\n return;\n }\n\n // this.pendingConnection resets to false as soon as we know the outcome of the connection attempt\n this.pendingConnection = true;\n\n let delayMs = InitialReconnectDelayInMs;\n let connectRepeatCount = 0;\n const connectStartTime = performance.now();\n let lastError: any;\n\n // This loop will keep trying to connect until successful, with a delay between each iteration.\n while (connection === undefined) {\n if (this.closed) {\n throw new Error(\"Attempting to connect a closed DeltaManager\");\n }\n connectRepeatCount++;\n\n try {\n this.client.mode = requestedMode;\n connection = await docService.connectToDeltaStream(this.client);\n\n if (connection.disposed) {\n // Nobody observed this connection, so drop it on the floor and retry.\n this.logger.sendTelemetryEvent({ eventName: \"ReceivedClosedConnection\" });\n connection = undefined;\n }\n } catch (origError: any) {\n if (typeof origError === \"object\" && origError !== null &&\n origError?.errorType === DeltaStreamConnectionForbiddenError.errorType) {\n connection = new NoDeltaStream();\n requestedMode = \"read\";\n break;\n }\n\n // Socket.io error when we connect to wrong socket, or hit some multiplexing bug\n if (!canRetryOnError(origError)) {\n const error = normalizeError(origError, { props: fatalConnectErrorProp });\n this.props.closeHandler(error);\n throw error;\n }\n\n // Since the error is retryable this will not log to the error table\n logNetworkFailure(\n this.logger,\n {\n attempts: connectRepeatCount,\n delay: delayMs, // milliseconds\n eventName: \"DeltaConnectionFailureToConnect\",\n duration: TelemetryLogger.formatTick(performance.now() - connectStartTime),\n },\n origError);\n\n lastError = origError;\n\n const retryDelayFromError = getRetryDelayFromError(origError);\n delayMs = retryDelayFromError ?? Math.min(delayMs * 2, MaxReconnectDelayInMs);\n\n if (retryDelayFromError !== undefined) {\n this.props.reconnectionDelayHandler(retryDelayFromError, origError);\n }\n await waitForConnectedState(delayMs);\n }\n }\n\n // If we retried more than once, log an event about how long it took (this will not log to error table)\n if (connectRepeatCount > 1) {\n logNetworkFailure(\n this.logger,\n {\n eventName: \"MultipleDeltaConnectionFailures\",\n attempts: connectRepeatCount,\n duration: TelemetryLogger.formatTick(performance.now() - connectStartTime),\n },\n lastError,\n );\n }\n\n this.setupNewSuccessfulConnection(connection, requestedMode);\n }\n\n /**\n * Start the connection. Any error should result in container being close.\n * And report the error if it excape for any reason.\n * @param args - The connection arguments\n */\n private triggerConnect(connectionMode: ConnectionMode) {\n assert(this.connection === undefined, 0x239 /* \"called only in disconnected state\" */);\n if (this.reconnectMode !== ReconnectMode.Enabled) {\n return;\n }\n this.connect(connectionMode);\n }\n\n /**\n * Disconnect the current connection.\n * @param reason - Text description of disconnect reason to emit with disconnect event\n */\n private disconnectFromDeltaStream(reason: string): boolean {\n this.pendingReconnect = false;\n\n if (this.connection === undefined) {\n return false;\n }\n\n assert(!this.pendingConnection, 0x27b /* \"reentrancy may result in incorrect behavior\" */);\n\n const connection = this.connection;\n // Avoid any re-entrancy - clear object reference\n this.connection = undefined;\n\n // Remove listeners first so we don't try to retrigger this flow accidentally through reconnectOnError\n connection.off(\"op\", this.opHandler);\n connection.off(\"signal\", this.props.signalHandler);\n connection.off(\"nack\", this.nackHandler);\n connection.off(\"disconnect\", this.disconnectHandlerInternal);\n connection.off(\"error\", this.errorHandler);\n connection.off(\"pong\", this.props.pongHandler);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._outbound.pause();\n this._outbound.clear();\n this.props.disconnectHandler(reason);\n\n connection.dispose();\n\n this._connectionVerboseProps = {};\n\n return true;\n }\n\n /**\n * Once we've successfully gotten a connection, we need to set up state, attach event listeners, and process\n * initial messages.\n * @param connection - The newly established connection\n */\n private setupNewSuccessfulConnection(connection: IDocumentDeltaConnection, requestedMode: ConnectionMode) {\n // Old connection should have been cleaned up before establishing a new one\n assert(this.connection === undefined, 0x0e6 /* \"old connection exists on new connection setup\" */);\n assert(!connection.disposed, 0x28a /* \"can't be disposed - Callers need to ensure that!\" */);\n\n if (this.pendingConnection) {\n this.pendingConnection = false;\n } else {\n assert(this.closed, 0x27f /* \"reentrancy may result in incorrect behavior\" */);\n }\n this.connection = connection;\n\n // Does information in scopes & mode matches?\n // If we asked for \"write\" and got \"read\", then file is read-only\n // But if we ask read, server can still give us write.\n const readonly = !connection.claims.scopes.includes(ScopeType.DocWrite);\n\n // This connection mode validation logic is moving to the driver layer in 0.44. These two asserts can be\n // removed after those packages have released and become ubiquitous.\n assert(requestedMode === \"read\" || readonly === (this.connectionMode === \"read\"),\n 0x0e7 /* \"claims/connectionMode mismatch\" */);\n assert(!readonly || this.connectionMode === \"read\", 0x0e8 /* \"readonly perf with write connection\" */);\n\n this.set_readonlyPermissions(readonly);\n\n if (this.closed) {\n // Raise proper events, Log telemetry event and close connection.\n this.disconnectFromDeltaStream(\"ConnectionManager already closed\");\n return;\n }\n\n this._outbound.resume();\n\n connection.on(\"op\", this.opHandler);\n connection.on(\"signal\", this.props.signalHandler);\n connection.on(\"nack\", this.nackHandler);\n connection.on(\"disconnect\", this.disconnectHandlerInternal);\n connection.on(\"error\", this.errorHandler);\n connection.on(\"pong\", this.props.pongHandler);\n\n // Initial messages are always sorted. However, due to early op handler installed by drivers and appending those\n // ops to initialMessages, resulting set is no longer sorted, which would result in client hitting storage to\n // fill in gap. We will recover by cancelling this request once we process remaining ops, but it's a waste that\n // we could avoid\n const initialMessages = connection.initialMessages.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\n // Some storages may provide checkpointSequenceNumber to identify how far client is behind.\n let checkpointSequenceNumber = connection.checkpointSequenceNumber;\n\n this._connectionVerboseProps = {\n clientId: connection.clientId,\n mode: connection.mode,\n };\n\n // reset connection props\n this._connectionProps = {};\n\n if (connection.relayServiceAgent !== undefined) {\n this._connectionVerboseProps.relayServiceAgent = connection.relayServiceAgent;\n this._connectionProps.relayServiceAgent = connection.relayServiceAgent;\n }\n this._connectionProps.socketDocumentId = connection.claims.documentId;\n this._connectionProps.connectionMode = connection.mode;\n\n let last = -1;\n if (initialMessages.length !== 0) {\n this._connectionVerboseProps.connectionInitialOpsFrom = initialMessages[0].sequenceNumber;\n last = initialMessages[initialMessages.length - 1].sequenceNumber;\n this._connectionVerboseProps.connectionInitialOpsTo = last + 1;\n // Update knowledge of how far we are behind, before raising \"connect\" event\n // This is duplication of what incomingOpHandler() does, but we have to raise event before we get there,\n // so duplicating update logic here as well.\n if (checkpointSequenceNumber === undefined || checkpointSequenceNumber < last) {\n checkpointSequenceNumber = last;\n }\n }\n\n this.props.incomingOpHandler(\n initialMessages,\n this.connectFirstConnection ? \"InitialOps\" : \"ReconnectOps\");\n\n if (connection.initialSignals !== undefined) {\n for (const signal of connection.initialSignals) {\n this.props.signalHandler(signal);\n }\n }\n\n const details = ConnectionManager.detailsFromConnection(connection);\n details.checkpointSequenceNumber = checkpointSequenceNumber;\n this.props.connectHandler(details);\n\n this.connectFirstConnection = false;\n }\n\n /**\n * Disconnect the current connection and reconnect. Closes the container if it fails.\n * @param connection - The connection that wants to reconnect - no-op if it's different from this.connection\n * @param requestedMode - Read or write\n * @param error - Error reconnect information including whether or not to reconnect\n * @returns A promise that resolves when the connection is reestablished or we stop trying\n */\n private reconnectOnError(\n requestedMode: ConnectionMode,\n error: IAnyDriverError,\n ) {\n this.reconnect(\n requestedMode,\n error.message,\n error)\n .catch(this.props.closeHandler);\n }\n\n /**\n * Disconnect the current connection and reconnect.\n * @param connection - The connection that wants to reconnect - no-op if it's different from this.connection\n * @param requestedMode - Read or write\n * @param error - Error reconnect information including whether or not to reconnect\n * @returns A promise that resolves when the connection is reestablished or we stop trying\n */\n private async reconnect(\n requestedMode: ConnectionMode,\n disconnectMessage: string,\n error?: IAnyDriverError,\n ) {\n // We quite often get protocol errors before / after observing nack/disconnect\n // we do not want to run through same sequence twice.\n // If we're already disconnected/disconnecting it's not appropriate to call this again.\n assert(this.connection !== undefined, 0x0eb /* \"Missing connection for reconnect\" */);\n\n this.disconnectFromDeltaStream(disconnectMessage);\n\n // We will always trigger reconnect, even if canRetry is false.\n // Any truly fatal error state will result in container close upon attempted reconnect,\n // which is a preferable to closing abruptly when a live connection fails.\n if (error !== undefined && !error.canRetry) {\n this.logger.sendTelemetryEvent({\n eventName: \"reconnectingDespiteFatalError\",\n reconnectMode: this.reconnectMode,\n }, error);\n }\n\n if (this.reconnectMode === ReconnectMode.Never) {\n // Do not raise container error if we are closing just because we lost connection.\n // Those errors (like IdleDisconnect) would show up in telemetry dashboards and\n // are very misleading, as first initial reaction - some logic is broken.\n this.props.closeHandler();\n }\n\n // If closed then we can't reconnect\n if (this.closed || this.reconnectMode !== ReconnectMode.Enabled) {\n return;\n }\n\n const delayMs = getRetryDelayFromError(error);\n if (error !== undefined && delayMs !== undefined) {\n this.props.reconnectionDelayHandler(delayMs, error);\n await waitForConnectedState(delayMs);\n }\n\n this.triggerConnect(requestedMode);\n }\n\n public prepareMessageToSend(message: Omit<IDocumentMessage, \"clientSequenceNumber\">): IDocumentMessage | undefined {\n if (this.readonly === true) {\n assert(this.readOnlyInfo.readonly === true, 0x1f0 /* \"Unexpected mismatch in readonly\" */);\n const error = new GenericError(\"deltaManagerReadonlySubmit\", undefined /* error */, {\n readonly: this.readOnlyInfo.readonly,\n forcedReadonly: this.readOnlyInfo.forced,\n readonlyPermissions: this.readOnlyInfo.permissions,\n storageOnly: this.readOnlyInfo.storageOnly,\n });\n this.props.closeHandler(error);\n return undefined;\n }\n\n // reset clientSequenceNumber if we are using new clientId.\n // we keep info about old connection as long as possible to be able to account for all non-acked ops\n // that we pick up on next connection.\n assert(!!this.connection, 0x0e4 /* \"Lost old connection!\" */);\n if (this.lastSubmittedClientId !== this.connection?.clientId) {\n this.lastSubmittedClientId = this.connection?.clientId;\n this.clientSequenceNumber = 0;\n this.clientSequenceNumberObserved = 0;\n }\n\n if (message.type === MessageType.NoOp) {\n this.trailingNoopCount++;\n } else {\n this.trailingNoopCount = 0;\n }\n\n return {\n ...message,\n clientSequenceNumber: ++this.clientSequenceNumber,\n };\n }\n\n public submitSignal(content: any) {\n if (this.connection !== undefined) {\n this.connection.submitSignal(content);\n } else {\n this.logger.sendErrorEvent({ eventName: \"submitSignalDisconnected\" });\n }\n }\n\n public sendMessages(messages: IDocumentMessage[]) {\n assert(this.connected, 0x2b4 /* \"not connected on sending ops!\" */);\n\n // If connection is \"read\" or implicit \"read\" (got leave op for \"write\" connection),\n // then op can't make it through - we will get a nack if op is sent.\n // We can short-circuit this process.\n // Note that we also want nacks to be rare and be treated as catastrophic failures.\n // Be careful with reentrancy though - disconnected event should not be be raised in the\n // middle of the current workflow, but rather on clean stack!\n if (this.connectionMode === \"read\") {\n if (!this.pendingReconnect) {\n this.pendingReconnect = true;\n Promise.resolve().then(async () => {\n if (this.pendingReconnect) { // still valid?\n await this.reconnect(\n \"write\", // connectionMode\n \"Switch to write\", // message\n );\n }\n })\n .catch(() => {});\n }\n return;\n }\n\n assert(!this.pendingReconnect, 0x2b5 /* \"logic error\" */);\n\n this._outbound.push(messages);\n }\n\n public beforeProcessingIncomingOp(message: ISequencedDocumentMessage) {\n // if we have connection, and message is local, then we better treat is as local!\n assert(this.clientId !== message.clientId || this.lastSubmittedClientId === message.clientId,\n 0x0ee /* \"Not accounting local messages correctly\" */,\n );\n\n if (this.lastSubmittedClientId !== undefined && this.lastSubmittedClientId === message.clientId) {\n const clientSequenceNumber = message.clientSequenceNumber;\n\n assert(this.clientSequenceNumberObserved < clientSequenceNumber, 0x0ef /* \"client seq# not growing\" */);\n assert(clientSequenceNumber <= this.clientSequenceNumber,\n 0x0f0 /* \"Incoming local client seq# > generated by this client\" */);\n\n this.clientSequenceNumberObserved = clientSequenceNumber;\n }\n\n if (message.type === MessageType.ClientLeave) {\n const systemLeaveMessage = message as ISequencedDocumentSystemMessage;\n const clientId = JSON.parse(systemLeaveMessage.data) as string;\n if (clientId === this.clientId) {\n // We have been kicked out from quorum\n this.logger.sendPerformanceEvent({ eventName: \"ReadConnectionTransition\" });\n\n // Please see #8483 for more details on why maintaining connection further as is would not work.\n // Short story - connection properties are immutable, and many processes (consensus DDSs, summarizer)\n // assume that connection stays \"write\" connection until disconnect, and act accordingly, which may\n // not work well with de-facto \"read\" connection we are in after receiving own leave op on timeout.\n // Clients need to be able to transition to \"read\" state after some time of inactivity!\n // Note - this may close container!\n this.reconnect(\n \"read\", // connectionMode\n \"Switch to read\", // message\n ).catch((error) => {\n this.logger.sendErrorEvent({ eventName: \"SwitchToReadConnection\"}, error);\n });\n }\n }\n }\n\n private readonly opHandler = (documentId: string, messagesArg: ISequencedDocumentMessage[]) => {\n const messages = Array.isArray(messagesArg) ? messagesArg : [messagesArg];\n this.props.incomingOpHandler(messages, \"opHandler\");\n };\n\n // Always connect in write mode after getting nacked.\n private readonly nackHandler = (documentId: string, messages: INack[]) => {\n const message = messages[0];\n if (this._readonlyPermissions === true) {\n this.props.closeHandler(createWriteError(\"writeOnReadOnlyDocument\", { driverVersion: undefined }));\n return;\n }\n\n const reconnectInfo = getNackReconnectInfo(message.content);\n\n // If the nack indicates we cannot retry, then close the container outright\n if (!reconnectInfo.canRetry) {\n this.props.closeHandler(reconnectInfo);\n return;\n }\n\n this.reconnectOnError(\n \"write\",\n reconnectInfo,\n );\n };\n\n // Connection mode is always read on disconnect/error unless the system mode was write.\n private readonly disconnectHandlerInternal = (disconnectReason: IAnyDriverError) => {\n // Note: we might get multiple disconnect calls on same socket, as early disconnect notification\n // (\"server_disconnect\", ODSP-specific) is mapped to \"disconnect\"\n this.reconnectOnError(\n this.defaultReconnectionMode,\n disconnectReason,\n );\n };\n\n private readonly errorHandler = (error: IAnyDriverError) => {\n this.reconnectOnError(\n this.defaultReconnectionMode,\n error,\n );\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerContext.d.ts","sourceRoot":"","sources":["../src/containerContext.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EACH,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,OAAO,EAEP,uBAAuB,EACvB,WAAW,EACX,cAAc,EAGd,iBAAiB,EAGjB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"containerContext.d.ts","sourceRoot":"","sources":["../src/containerContext.ts"],"names":[],"mappings":"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"}
|
package/lib/containerContext.js
CHANGED
|
@@ -189,6 +189,10 @@ export class ContainerContext {
|
|
|
189
189
|
});
|
|
190
190
|
}
|
|
191
191
|
async loadCodeModule(codeDetails) {
|
|
192
|
+
// load may actually produce a IFluidModule if using a legacy ICodeLoader.
|
|
193
|
+
// Because the type system currently does not capture this in load,
|
|
194
|
+
// explicitly declare the type here to support both cases.
|
|
195
|
+
// See also comment about this below.
|
|
192
196
|
const loadCodeResult = await PerformanceEvent.timedExecAsync(this.taggedLogger, { eventName: "CodeLoad" }, async () => this.codeLoader.load(codeDetails));
|
|
193
197
|
if ("module" in loadCodeResult) {
|
|
194
198
|
const { module, details } = loadCodeResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerContext.js","sourceRoot":"","sources":["../src/containerContext.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, LazyPromise } from \"@fluidframework/common-utils\";\nimport {\n IAudience,\n IContainerContext,\n IDeltaManager,\n ILoader,\n IRuntime,\n ICriticalContainerError,\n AttachState,\n ILoaderOptions,\n IRuntimeFactory,\n IProvideRuntimeFactory,\n IFluidCodeDetails,\n IFluidCodeDetailsComparer,\n IProvideFluidCodeDetailsComparer,\n ICodeDetailsLoader,\n IFluidModuleWithDetails,\n} from \"@fluidframework/container-definitions\";\nimport {\n IRequest,\n IResponse,\n FluidObject,\n} from \"@fluidframework/core-interfaces\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { isFluidResolvedUrl } from \"@fluidframework/driver-utils\";\nimport {\n IClientConfiguration,\n IClientDetails,\n IDocumentMessage,\n IQuorum,\n IQuorumClients,\n ISequencedDocumentMessage,\n ISignalMessage,\n ISnapshotTree,\n ISummaryTree,\n IVersion,\n MessageType,\n} from \"@fluidframework/protocol-definitions\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { Container } from \"./container\";\n\nconst PackageNotFactoryError = \"Code package does not implement IRuntimeFactory\";\n\nexport class ContainerContext implements IContainerContext {\n public static async createOrLoad(\n container: Container,\n scope: FluidObject,\n codeLoader: ICodeDetailsLoader,\n codeDetails: IFluidCodeDetails,\n baseSnapshot: ISnapshotTree | undefined,\n deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n quorum: IQuorum,\n loader: ILoader,\n submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number,\n submitSignalFn: (contents: any) => void,\n closeFn: (error?: ICriticalContainerError) => void,\n version: string,\n updateDirtyContainerState: (dirty: boolean) => void,\n existing: boolean,\n pendingLocalState?: unknown,\n ): Promise<ContainerContext> {\n const context = new ContainerContext(\n container,\n scope,\n codeLoader,\n codeDetails,\n baseSnapshot,\n deltaManager,\n quorum,\n loader,\n submitFn,\n submitSignalFn,\n closeFn,\n version,\n updateDirtyContainerState,\n existing,\n pendingLocalState);\n await context.instantiateRuntime(existing);\n return context;\n }\n\n public readonly taggedLogger: ITelemetryLogger;\n\n public get clientId(): string | undefined {\n return this.container.clientId;\n }\n\n /** @deprecated Added back to unblock 0.56 integration */\n public get id(): string {\n const resolvedUrl = this.container.resolvedUrl;\n if (isFluidResolvedUrl(resolvedUrl)) {\n return resolvedUrl.id;\n }\n return \"\";\n }\n\n public get clientDetails(): IClientDetails {\n return this.container.clientDetails;\n }\n\n public get connected(): boolean {\n return this.container.connected;\n }\n\n public get canSummarize(): boolean {\n return \"summarize\" in this.runtime;\n }\n\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this.container.serviceConfiguration;\n }\n\n public get audience(): IAudience {\n return this.container.audience;\n }\n\n public get options(): ILoaderOptions {\n return this.container.options;\n }\n\n public get baseSnapshot() {\n return this._baseSnapshot;\n }\n\n public get storage(): IDocumentStorageService {\n return this.container.storage;\n }\n\n private _runtime: IRuntime | undefined;\n private get runtime() {\n if (this._runtime === undefined) {\n throw new Error(\"Attempted to access runtime before it was defined\");\n }\n return this._runtime;\n }\n\n private _disposed = false;\n\n public get disposed() {\n return this._disposed;\n }\n\n public get codeDetails() { return this._codeDetails; }\n\n private readonly _quorum: IQuorum;\n public get quorum(): IQuorumClients { return this._quorum; }\n\n private readonly _fluidModuleP: Promise<IFluidModuleWithDetails>;\n\n constructor(\n private readonly container: Container,\n public readonly scope: FluidObject,\n private readonly codeLoader: ICodeDetailsLoader,\n private readonly _codeDetails: IFluidCodeDetails,\n private readonly _baseSnapshot: ISnapshotTree | undefined,\n public readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n quorum: IQuorum,\n public readonly loader: ILoader,\n public readonly submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number,\n public readonly submitSignalFn: (contents: any) => void,\n public readonly closeFn: (error?: ICriticalContainerError) => void,\n public readonly version: string,\n public readonly updateDirtyContainerState: (dirty: boolean) => void,\n public readonly existing: boolean,\n public readonly pendingLocalState?: unknown,\n\n ) {\n this._quorum = quorum;\n this.taggedLogger = container.subLogger;\n this._fluidModuleP = new LazyPromise<IFluidModuleWithDetails>(\n async () => this.loadCodeModule(_codeDetails),\n );\n this.attachListener();\n }\n\n /**\n * @deprecated - Temporary migratory API, to be removed when customers no longer need it. When removed,\n * ContainerContext should only take an IQuorumClients rather than an IQuorum. See IContainerContext for more\n * details.\n */\n public getSpecifiedCodeDetails(): IFluidCodeDetails | undefined {\n return (this._quorum.get(\"code\") ?? this._quorum.get(\"code2\")) as IFluidCodeDetails | undefined;\n }\n\n public dispose(error?: Error): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n\n this.runtime.dispose(error);\n this._quorum.dispose();\n this.deltaManager.dispose();\n }\n\n public getLoadedFromVersion(): IVersion | undefined {\n return this.container.loadedFromVersion;\n }\n\n public get attachState(): AttachState {\n return this.container.attachState;\n }\n\n /**\n * Create a summary. Used when attaching or serializing a detached container.\n *\n * @param blobRedirectTable - A table passed during the attach process. While detached, blob upload is supported\n * using IDs generated locally. After attach, these IDs cannot be used, so this table maps the old local IDs to the\n * new storage IDs so requests can be redirected.\n */\n public createSummary(blobRedirectTable?: Map<string, string>): ISummaryTree {\n return this.runtime.createSummary(blobRedirectTable);\n }\n\n public setConnectionState(connected: boolean, clientId?: string) {\n const runtime = this.runtime;\n\n assert(connected === this.connected, 0x0de /* \"Mismatch in connection state while setting\" */);\n\n runtime.setConnectionState(connected, clientId);\n }\n\n public process(message: ISequencedDocumentMessage, local: boolean, context: any) {\n this.runtime.process(message, local, context);\n }\n\n public processSignal(message: ISignalMessage, local: boolean) {\n this.runtime.processSignal(message, local);\n }\n\n public async request(path: IRequest): Promise<IResponse> {\n return this.runtime.request(path);\n }\n\n public async getAbsoluteUrl(relativeUrl: string): Promise<string | undefined> {\n return this.container.getAbsoluteUrl(relativeUrl);\n }\n\n public getPendingLocalState(): unknown {\n return this.runtime.getPendingLocalState();\n }\n\n /**\n * Determines if the current code details of the context\n * satisfy the incoming constraint code details\n */\n public async satisfies(constraintCodeDetails: IFluidCodeDetails) {\n const comparers: IFluidCodeDetailsComparer[] = [];\n\n const maybeCompareCodeLoader = this.codeLoader;\n if (maybeCompareCodeLoader.IFluidCodeDetailsComparer !== undefined) {\n comparers.push(maybeCompareCodeLoader.IFluidCodeDetailsComparer);\n }\n\n const moduleWithDetails = await this._fluidModuleP;\n const maybeCompareExport: Partial<IProvideFluidCodeDetailsComparer> | undefined =\n moduleWithDetails.module?.fluidExport;\n if (maybeCompareExport?.IFluidCodeDetailsComparer !== undefined) {\n comparers.push(maybeCompareExport.IFluidCodeDetailsComparer);\n }\n\n // if there are not comparers it is not possible to know\n // if the current satisfy the incoming, so return false,\n // as assuming they do not satisfy is safer .e.g we will\n // reload, rather than potentially running with\n // incompatible code\n if (comparers.length === 0) {\n return false;\n }\n\n for (const comparer of comparers) {\n const satisfies = await comparer.satisfies(\n moduleWithDetails.details,\n constraintCodeDetails,\n );\n if (satisfies === false) {\n return false;\n }\n }\n return true;\n }\n\n public notifyAttaching() {\n this.runtime.setAttachState(AttachState.Attaching);\n }\n\n // #region private\n\n private async getRuntimeFactory(): Promise<IRuntimeFactory> {\n const fluidExport: FluidObject<IProvideRuntimeFactory> | undefined =\n (await this._fluidModuleP).module?.fluidExport;\n const runtimeFactory = fluidExport?.IRuntimeFactory;\n if (runtimeFactory === undefined) {\n throw new Error(PackageNotFactoryError);\n }\n\n return runtimeFactory;\n }\n\n private async instantiateRuntime(existing: boolean) {\n const runtimeFactory = await this.getRuntimeFactory();\n this._runtime = await runtimeFactory.instantiateRuntime(this, existing);\n }\n\n private attachListener() {\n this.container.once(\"attached\", () => {\n this.runtime.setAttachState(AttachState.Attached);\n });\n }\n\n private async loadCodeModule(codeDetails: IFluidCodeDetails) {\n const loadCodeResult = await PerformanceEvent.timedExecAsync(\n this.taggedLogger,\n { eventName: \"CodeLoad\" },\n async () => this.codeLoader.load(codeDetails),\n );\n\n if (\"module\" in loadCodeResult) {\n const { module, details } = loadCodeResult;\n return {\n module,\n details: details ?? codeDetails,\n };\n } else {\n // If \"module\" is not in the result, we are using a legacy ICodeLoader. Fix the result up with details.\n // Once usage drops to 0 we can remove this compat path.\n this.taggedLogger.sendTelemetryEvent({ eventName: \"LegacyCodeLoader\" });\n return { module: loadCodeResult, details: codeDetails };\n }\n }\n // #endregion\n}\n"]}
|
|
1
|
+
{"version":3,"file":"containerContext.js","sourceRoot":"","sources":["../src/containerContext.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, LazyPromise } from \"@fluidframework/common-utils\";\nimport {\n IAudience,\n IContainerContext,\n IDeltaManager,\n ILoader,\n IRuntime,\n ICriticalContainerError,\n AttachState,\n ILoaderOptions,\n IRuntimeFactory,\n IProvideRuntimeFactory,\n IFluidCodeDetails,\n IFluidCodeDetailsComparer,\n IProvideFluidCodeDetailsComparer,\n ICodeDetailsLoader,\n IFluidModuleWithDetails,\n IFluidModule,\n} from \"@fluidframework/container-definitions\";\nimport {\n IRequest,\n IResponse,\n FluidObject,\n} from \"@fluidframework/core-interfaces\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { isFluidResolvedUrl } from \"@fluidframework/driver-utils\";\nimport {\n IClientConfiguration,\n IClientDetails,\n IDocumentMessage,\n IQuorum,\n IQuorumClients,\n ISequencedDocumentMessage,\n ISignalMessage,\n ISnapshotTree,\n ISummaryTree,\n IVersion,\n MessageType,\n} from \"@fluidframework/protocol-definitions\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { Container } from \"./container\";\n\nconst PackageNotFactoryError = \"Code package does not implement IRuntimeFactory\";\n\nexport class ContainerContext implements IContainerContext {\n public static async createOrLoad(\n container: Container,\n scope: FluidObject,\n codeLoader: ICodeDetailsLoader,\n codeDetails: IFluidCodeDetails,\n baseSnapshot: ISnapshotTree | undefined,\n deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n quorum: IQuorum,\n loader: ILoader,\n submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number,\n submitSignalFn: (contents: any) => void,\n closeFn: (error?: ICriticalContainerError) => void,\n version: string,\n updateDirtyContainerState: (dirty: boolean) => void,\n existing: boolean,\n pendingLocalState?: unknown,\n ): Promise<ContainerContext> {\n const context = new ContainerContext(\n container,\n scope,\n codeLoader,\n codeDetails,\n baseSnapshot,\n deltaManager,\n quorum,\n loader,\n submitFn,\n submitSignalFn,\n closeFn,\n version,\n updateDirtyContainerState,\n existing,\n pendingLocalState);\n await context.instantiateRuntime(existing);\n return context;\n }\n\n public readonly taggedLogger: ITelemetryLogger;\n\n public get clientId(): string | undefined {\n return this.container.clientId;\n }\n\n /** @deprecated Added back to unblock 0.56 integration */\n public get id(): string {\n const resolvedUrl = this.container.resolvedUrl;\n if (isFluidResolvedUrl(resolvedUrl)) {\n return resolvedUrl.id;\n }\n return \"\";\n }\n\n public get clientDetails(): IClientDetails {\n return this.container.clientDetails;\n }\n\n public get connected(): boolean {\n return this.container.connected;\n }\n\n public get canSummarize(): boolean {\n return \"summarize\" in this.runtime;\n }\n\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this.container.serviceConfiguration;\n }\n\n public get audience(): IAudience {\n return this.container.audience;\n }\n\n public get options(): ILoaderOptions {\n return this.container.options;\n }\n\n public get baseSnapshot() {\n return this._baseSnapshot;\n }\n\n public get storage(): IDocumentStorageService {\n return this.container.storage;\n }\n\n private _runtime: IRuntime | undefined;\n private get runtime() {\n if (this._runtime === undefined) {\n throw new Error(\"Attempted to access runtime before it was defined\");\n }\n return this._runtime;\n }\n\n private _disposed = false;\n\n public get disposed() {\n return this._disposed;\n }\n\n public get codeDetails() { return this._codeDetails; }\n\n private readonly _quorum: IQuorum;\n public get quorum(): IQuorumClients { return this._quorum; }\n\n private readonly _fluidModuleP: Promise<IFluidModuleWithDetails>;\n\n constructor(\n private readonly container: Container,\n public readonly scope: FluidObject,\n private readonly codeLoader: ICodeDetailsLoader,\n private readonly _codeDetails: IFluidCodeDetails,\n private readonly _baseSnapshot: ISnapshotTree | undefined,\n public readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n quorum: IQuorum,\n public readonly loader: ILoader,\n public readonly submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number,\n public readonly submitSignalFn: (contents: any) => void,\n public readonly closeFn: (error?: ICriticalContainerError) => void,\n public readonly version: string,\n public readonly updateDirtyContainerState: (dirty: boolean) => void,\n public readonly existing: boolean,\n public readonly pendingLocalState?: unknown,\n\n ) {\n this._quorum = quorum;\n this.taggedLogger = container.subLogger;\n this._fluidModuleP = new LazyPromise<IFluidModuleWithDetails>(\n async () => this.loadCodeModule(_codeDetails),\n );\n this.attachListener();\n }\n\n /**\n * @deprecated - Temporary migratory API, to be removed when customers no longer need it. When removed,\n * ContainerContext should only take an IQuorumClients rather than an IQuorum. See IContainerContext for more\n * details.\n */\n public getSpecifiedCodeDetails(): IFluidCodeDetails | undefined {\n return (this._quorum.get(\"code\") ?? this._quorum.get(\"code2\")) as IFluidCodeDetails | undefined;\n }\n\n public dispose(error?: Error): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n\n this.runtime.dispose(error);\n this._quorum.dispose();\n this.deltaManager.dispose();\n }\n\n public getLoadedFromVersion(): IVersion | undefined {\n return this.container.loadedFromVersion;\n }\n\n public get attachState(): AttachState {\n return this.container.attachState;\n }\n\n /**\n * Create a summary. Used when attaching or serializing a detached container.\n *\n * @param blobRedirectTable - A table passed during the attach process. While detached, blob upload is supported\n * using IDs generated locally. After attach, these IDs cannot be used, so this table maps the old local IDs to the\n * new storage IDs so requests can be redirected.\n */\n public createSummary(blobRedirectTable?: Map<string, string>): ISummaryTree {\n return this.runtime.createSummary(blobRedirectTable);\n }\n\n public setConnectionState(connected: boolean, clientId?: string) {\n const runtime = this.runtime;\n\n assert(connected === this.connected, 0x0de /* \"Mismatch in connection state while setting\" */);\n\n runtime.setConnectionState(connected, clientId);\n }\n\n public process(message: ISequencedDocumentMessage, local: boolean, context: any) {\n this.runtime.process(message, local, context);\n }\n\n public processSignal(message: ISignalMessage, local: boolean) {\n this.runtime.processSignal(message, local);\n }\n\n public async request(path: IRequest): Promise<IResponse> {\n return this.runtime.request(path);\n }\n\n public async getAbsoluteUrl(relativeUrl: string): Promise<string | undefined> {\n return this.container.getAbsoluteUrl(relativeUrl);\n }\n\n public getPendingLocalState(): unknown {\n return this.runtime.getPendingLocalState();\n }\n\n /**\n * Determines if the current code details of the context\n * satisfy the incoming constraint code details\n */\n public async satisfies(constraintCodeDetails: IFluidCodeDetails) {\n const comparers: IFluidCodeDetailsComparer[] = [];\n\n const maybeCompareCodeLoader = this.codeLoader;\n if (maybeCompareCodeLoader.IFluidCodeDetailsComparer !== undefined) {\n comparers.push(maybeCompareCodeLoader.IFluidCodeDetailsComparer);\n }\n\n const moduleWithDetails = await this._fluidModuleP;\n const maybeCompareExport: Partial<IProvideFluidCodeDetailsComparer> | undefined =\n moduleWithDetails.module?.fluidExport;\n if (maybeCompareExport?.IFluidCodeDetailsComparer !== undefined) {\n comparers.push(maybeCompareExport.IFluidCodeDetailsComparer);\n }\n\n // if there are not comparers it is not possible to know\n // if the current satisfy the incoming, so return false,\n // as assuming they do not satisfy is safer .e.g we will\n // reload, rather than potentially running with\n // incompatible code\n if (comparers.length === 0) {\n return false;\n }\n\n for (const comparer of comparers) {\n const satisfies = await comparer.satisfies(\n moduleWithDetails.details,\n constraintCodeDetails,\n );\n if (satisfies === false) {\n return false;\n }\n }\n return true;\n }\n\n public notifyAttaching() {\n this.runtime.setAttachState(AttachState.Attaching);\n }\n\n // #region private\n\n private async getRuntimeFactory(): Promise<IRuntimeFactory> {\n const fluidExport: FluidObject<IProvideRuntimeFactory> | undefined =\n (await this._fluidModuleP).module?.fluidExport;\n const runtimeFactory = fluidExport?.IRuntimeFactory;\n if (runtimeFactory === undefined) {\n throw new Error(PackageNotFactoryError);\n }\n\n return runtimeFactory;\n }\n\n private async instantiateRuntime(existing: boolean) {\n const runtimeFactory = await this.getRuntimeFactory();\n this._runtime = await runtimeFactory.instantiateRuntime(this, existing);\n }\n\n private attachListener() {\n this.container.once(\"attached\", () => {\n this.runtime.setAttachState(AttachState.Attached);\n });\n }\n\n private async loadCodeModule(codeDetails: IFluidCodeDetails): Promise<IFluidModuleWithDetails> {\n // load may actually produce a IFluidModule if using a legacy ICodeLoader.\n // Because the type system currently does not capture this in load,\n // explicitly declare the type here to support both cases.\n // See also comment about this below.\n const loadCodeResult: IFluidModuleWithDetails | IFluidModule = await PerformanceEvent.timedExecAsync(\n this.taggedLogger,\n { eventName: \"CodeLoad\" },\n async () => this.codeLoader.load(codeDetails),\n );\n\n if (\"module\" in loadCodeResult) {\n const { module, details } = loadCodeResult;\n return {\n module,\n details: details ?? codeDetails,\n };\n } else {\n // If \"module\" is not in the result, we are using a legacy ICodeLoader. Fix the result up with details.\n // Once usage drops to 0 we can remove this compat path.\n this.taggedLogger.sendTelemetryEvent({ eventName: \"LegacyCodeLoader\" });\n return { module: loadCodeResult, details: codeDetails };\n }\n }\n // #endregion\n}\n"]}
|
package/lib/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/container-loader";
|
|
8
|
-
export declare const pkgVersion = "0.59.2000-
|
|
8
|
+
export declare const pkgVersion = "0.59.2000-63294";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/lib/packageVersion.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,kCAAkC,CAAC;AAC1D,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-loader\";\nexport const pkgVersion = \"0.59.2000-
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,kCAAkC,CAAC;AAC1D,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-loader\";\nexport const pkgVersion = \"0.59.2000-63294\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/container-loader",
|
|
3
|
-
"version": "0.59.2000-
|
|
3
|
+
"version": "0.59.2000-63294",
|
|
4
4
|
"description": "Fluid container loader",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"types": "dist/index.d.ts",
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "npm run build:genver && concurrently npm:build:compile npm:lint && npm run build:docs",
|
|
19
|
-
"build:commonjs": "npm run tsc && npm run build:test",
|
|
19
|
+
"build:commonjs": "npm run tsc && npm run typetests:gen && npm run build:test",
|
|
20
20
|
"build:compile": "concurrently npm:build:commonjs npm:build:esnext",
|
|
21
21
|
"build:docs": "api-extractor run --local --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/",
|
|
22
22
|
"build:esnext": "tsc --project ./tsconfig.esnext.json",
|
|
@@ -37,7 +37,8 @@
|
|
|
37
37
|
"tsc": "tsc",
|
|
38
38
|
"tsc:watch": "tsc --watch",
|
|
39
39
|
"tsfmt": "tsfmt --verify",
|
|
40
|
-
"tsfmt:fix": "tsfmt --replace"
|
|
40
|
+
"tsfmt:fix": "tsfmt --replace",
|
|
41
|
+
"typetests:gen": "fluid-type-validator -g -d ."
|
|
41
42
|
},
|
|
42
43
|
"nyc": {
|
|
43
44
|
"all": true,
|
|
@@ -62,14 +63,14 @@
|
|
|
62
63
|
"dependencies": {
|
|
63
64
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
64
65
|
"@fluidframework/common-utils": "^0.32.1",
|
|
65
|
-
"@fluidframework/container-definitions": "^0.48.1000
|
|
66
|
-
"@fluidframework/container-utils": "0.59.2000-
|
|
67
|
-
"@fluidframework/core-interfaces": "^0.43.1000
|
|
68
|
-
"@fluidframework/driver-definitions": "^0.46.1000
|
|
69
|
-
"@fluidframework/driver-utils": "0.59.2000-
|
|
70
|
-
"@fluidframework/protocol-base": "^0.1036.1000
|
|
71
|
-
"@fluidframework/protocol-definitions": "^0.1028.1000
|
|
72
|
-
"@fluidframework/telemetry-utils": "0.59.2000-
|
|
66
|
+
"@fluidframework/container-definitions": "^0.48.1000",
|
|
67
|
+
"@fluidframework/container-utils": "0.59.2000-63294",
|
|
68
|
+
"@fluidframework/core-interfaces": "^0.43.1000",
|
|
69
|
+
"@fluidframework/driver-definitions": "^0.46.1000",
|
|
70
|
+
"@fluidframework/driver-utils": "0.59.2000-63294",
|
|
71
|
+
"@fluidframework/protocol-base": "^0.1036.1000",
|
|
72
|
+
"@fluidframework/protocol-definitions": "^0.1028.1000",
|
|
73
|
+
"@fluidframework/telemetry-utils": "0.59.2000-63294",
|
|
73
74
|
"abort-controller": "^3.0.0",
|
|
74
75
|
"double-ended-queue": "^2.1.0-0",
|
|
75
76
|
"lodash": "^4.17.21",
|
|
@@ -77,11 +78,11 @@
|
|
|
77
78
|
},
|
|
78
79
|
"devDependencies": {
|
|
79
80
|
"@fluidframework/build-common": "^0.23.0",
|
|
80
|
-
"@fluidframework/container-loader-previous": "npm:@fluidframework/container-loader
|
|
81
|
-
"@fluidframework/eslint-config-fluid": "^0.28.1000
|
|
82
|
-
"@fluidframework/mocha-test-setup": "0.59.2000-
|
|
83
|
-
"@fluidframework/test-loader-utils": "0.59.2000-
|
|
84
|
-
"@microsoft/api-extractor": "^7.
|
|
81
|
+
"@fluidframework/container-loader-previous": "npm:@fluidframework/container-loader@0.59.1000",
|
|
82
|
+
"@fluidframework/eslint-config-fluid": "^0.28.1000",
|
|
83
|
+
"@fluidframework/mocha-test-setup": "0.59.2000-63294",
|
|
84
|
+
"@fluidframework/test-loader-utils": "0.59.2000-63294",
|
|
85
|
+
"@microsoft/api-extractor": "^7.22.2",
|
|
85
86
|
"@rushstack/eslint-config": "^2.5.1",
|
|
86
87
|
"@types/double-ended-queue": "^2.1.0",
|
|
87
88
|
"@types/lodash": "^4.14.118",
|
|
@@ -97,8 +98,11 @@
|
|
|
97
98
|
"eslint-plugin-editorconfig": "~3.2.0",
|
|
98
99
|
"eslint-plugin-eslint-comments": "~3.2.0",
|
|
99
100
|
"eslint-plugin-import": "~2.25.4",
|
|
100
|
-
"eslint-plugin-
|
|
101
|
+
"eslint-plugin-jest": "~26.1.3",
|
|
102
|
+
"eslint-plugin-mocha": "~10.0.3",
|
|
103
|
+
"eslint-plugin-promise": "~6.0.0",
|
|
101
104
|
"eslint-plugin-react": "~7.28.0",
|
|
105
|
+
"eslint-plugin-tsdoc": "~0.2.14",
|
|
102
106
|
"eslint-plugin-unicorn": "~40.0.0",
|
|
103
107
|
"mocha": "^8.4.0",
|
|
104
108
|
"nyc": "^15.0.0",
|
|
@@ -108,14 +112,7 @@
|
|
|
108
112
|
"typescript-formatter": "7.1.0"
|
|
109
113
|
},
|
|
110
114
|
"typeValidation": {
|
|
111
|
-
"version": "0.59.
|
|
112
|
-
"broken": {
|
|
113
|
-
"0.58.2002": {
|
|
114
|
-
"ClassDeclaration_Container": {
|
|
115
|
-
"forwardCompat": false,
|
|
116
|
-
"backCompat": false
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
115
|
+
"version": "0.59.2000",
|
|
116
|
+
"broken": {}
|
|
120
117
|
}
|
|
121
118
|
}
|
package/src/connectionManager.ts
CHANGED
|
@@ -467,7 +467,7 @@ export class ConnectionManager implements IConnectionManager {
|
|
|
467
467
|
this.logger.sendTelemetryEvent({ eventName: "ReceivedClosedConnection" });
|
|
468
468
|
connection = undefined;
|
|
469
469
|
}
|
|
470
|
-
} catch (origError) {
|
|
470
|
+
} catch (origError: any) {
|
|
471
471
|
if (typeof origError === "object" && origError !== null &&
|
|
472
472
|
origError?.errorType === DeltaStreamConnectionForbiddenError.errorType) {
|
|
473
473
|
connection = new NoDeltaStream();
|
package/src/containerContext.ts
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
IProvideFluidCodeDetailsComparer,
|
|
22
22
|
ICodeDetailsLoader,
|
|
23
23
|
IFluidModuleWithDetails,
|
|
24
|
+
IFluidModule,
|
|
24
25
|
} from "@fluidframework/container-definitions";
|
|
25
26
|
import {
|
|
26
27
|
IRequest,
|
|
@@ -314,8 +315,12 @@ export class ContainerContext implements IContainerContext {
|
|
|
314
315
|
});
|
|
315
316
|
}
|
|
316
317
|
|
|
317
|
-
private async loadCodeModule(codeDetails: IFluidCodeDetails) {
|
|
318
|
-
|
|
318
|
+
private async loadCodeModule(codeDetails: IFluidCodeDetails): Promise<IFluidModuleWithDetails> {
|
|
319
|
+
// load may actually produce a IFluidModule if using a legacy ICodeLoader.
|
|
320
|
+
// Because the type system currently does not capture this in load,
|
|
321
|
+
// explicitly declare the type here to support both cases.
|
|
322
|
+
// See also comment about this below.
|
|
323
|
+
const loadCodeResult: IFluidModuleWithDetails | IFluidModule = await PerformanceEvent.timedExecAsync(
|
|
319
324
|
this.taggedLogger,
|
|
320
325
|
{ eventName: "CodeLoad" },
|
|
321
326
|
async () => this.codeLoader.load(codeDetails),
|
package/src/packageVersion.ts
CHANGED